メインコンテンツまでスキップ

Vue

@tremolo-ui/vue には @tremolo-ui/react と同じコンポーネントがあり、props・data-* 属性・テーマも同じです。各コンポーネントのページでは、Vue タブに Vue 版の例を載せています。このページでは、書き方が違うところをまとめます。

Vue 3.5 以降が必要です。

npm install @tremolo-ui/vue

コンポーネント​

パーツはそれぞれ名前を持ち、Root はコンポーネント名そのものです。グローバル登録・Nuxt の auto-import・DOM に直接書くテンプレートのどれでも使えるようにするためです。

<script setup lang="ts">
import { ref } from 'vue'
import {
Knob,
KnobActiveLine,
KnobInactiveLine,
KnobSVGRoot,
KnobThumb,
} from '@tremolo-ui/vue'

const value = ref(50)
</script>

<template>
<Knob v-model="value" :min="0" :max="100">
<KnobSVGRoot>
<KnobInactiveLine />
<KnobActiveLine />
<KnobThumb />
</KnobSVGRoot>
</Knob>
</template>
ReactVue
Knob.Root、Knob.Thumb などKnob、KnobThumb など
NumberInput.InputFieldNumberInputField
value + onChangev-model
onChangeStart、onPlayNote など@change-start、@play-note など
classNameclass
readOnlyreadonly
actionsRef のメソッド(focus、playNote など)コンポーネントへのテンプレート参照
関数で渡す中身(Piano の label)スロット(#label="{ note, state }")
useKnobContext(selector)useKnobContext()。各フィールドが値に追従する

PointsEditor の選択は v-model:selection で受けます。

composables​

要素にインタラクションを付ける React の hooks と MIDI の hooks には、同じ名前の composables があります。要素を ref(または getter)で、オプションを @tremolo-ui/dom の対応する関数と同じ形で受け取ります。オプションを変えてもドラッグの途中で切れません。

<script setup lang="ts">
import { ref, useTemplateRef } from 'vue'
import { relativeMapping } from '@tremolo-ui/dom'
import { useDragValue } from '@tremolo-ui/vue'

const value = ref(50)
const el = useTemplateRef<HTMLDivElement>('el')

useDragValue(el, () => ({
axis: { min: 0, max: 100 },
mapping: relativeMapping({ pixelRange: 200 }),
getValue: () => [value.value, value.value],
onChange: ([x]) => (value.value = x),
}))
</script>

<template>
<div ref="el">{{ value }}</div>
</template>

useMIDIAccess は状態を ref で返し、useMIDIInput はアクセスを ref か getter で受け取ります。

const midi = useMIDIAccess(false)
useMIDIInput(
() => midi.state.value.midiAccess,
() => ({ onNoteOnEvent: (note, velocity) => play(note, velocity) }),
)
// <button @click="midi.request()">MIDI に接続</button>

Storybook​

Vue のコンポーネントには専用の Storybookがあります。