diff --git a/package.json b/package.json index 17870f9..fbc20b7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ruwio", "private": true, - "version": "1.2.8", + "version": "1.2.9", "type": "module", "scripts": { "dev": "vite", diff --git a/src/App.vue b/src/App.vue index 451598e..044bf82 100644 --- a/src/App.vue +++ b/src/App.vue @@ -44,6 +44,7 @@ import { useHistory } from './composables/useHistory' import { useAudioRuntime } from './composables/useAudioRuntime' import { useDocumentDrawer } from './composables/useDocumentDrawer' import { usePlaybackLoop } from './composables/usePlaybackLoop' +import { useTimeFormat } from './composables/useTimeFormat' import { useProjectName } from './composables/useProjectName' import { shouldChromeClickDeselect } from './lib/chromeClick' import { renderSceneToStillImage } from './lib/stillImageExport' @@ -165,6 +166,7 @@ const isDirty = ref(false) usePlaybackLoop() useAudioRuntime() const store = useSceneStore() +const { formatTime } = useTimeFormat() const clipart = useClipartStore() const history = useHistory() const deselectAll = useDeselectAll() @@ -631,7 +633,7 @@ onBeforeUnmount(() => { :title="t('app.stop')" @click="stop" /> - {{ store.playhead.toFixed(2) }}s / {{ store.scene.duration.toFixed(2) }}s + {{ formatTime(store.playhead) }} / {{ formatTime(store.scene.duration) }}
diff --git a/src/components/ActionEditor.vue b/src/components/ActionEditor.vue index 939eccd..20e32a7 100644 --- a/src/components/ActionEditor.vue +++ b/src/components/ActionEditor.vue @@ -9,6 +9,9 @@ import { import { useSceneStore } from '@/stores/scene' import { t } from '@/i18n' import type { Action } from '@/types/scene' +import { useTimeFormat } from '@/composables/useTimeFormat' + +const { timeToInputValue, inputValueToSeconds, inputStep, unitLabel } = useTimeFormat() const props = defineProps<{ actions: Action[] }>() const emit = defineEmits<{ 'update:actions': [value: Action[]] }>() @@ -154,13 +157,13 @@ function onTypeChange(index: number, newType: Action['type']) {
@@ -363,6 +366,11 @@ function onTypeChange(index: number, newType: Action['type']) { font-family: inherit; } +.params input[type='number'] { + width: 96px; + font-variant-numeric: tabular-nums; +} + .params textarea { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; diff --git a/src/components/AssetSidebar.vue b/src/components/AssetSidebar.vue index 69760b9..216c5e4 100644 --- a/src/components/AssetSidebar.vue +++ b/src/components/AssetSidebar.vue @@ -21,6 +21,7 @@ import { } from '@phosphor-icons/vue' import { useSceneStore } from '@/stores/scene' import { useAssetThumbsPref } from '@/composables/useAssetThumbsPref' +import { useTimeFormat } from '@/composables/useTimeFormat' import { importAudioFile, importImageFile, isAudioFile } from '@/lib/fileLoader' import { clearAudioDragSource, @@ -42,6 +43,7 @@ const fileInput = ref(null) const uploadError = ref(null) const { enabled: showThumbs } = useAssetThumbsPref() +const { formatTime } = useTimeFormat() /** Per-section collapsed state, persisted so the user's layout * survives reloads. Each key is false (expanded) by default — @@ -782,7 +784,7 @@ function onAssetDragStart(e: DragEvent, asset: ImageOrSvgAsset) {
{{ clip.name }} - {{ t('sidebar.clipLayerCount', { n: clip.layers.length }) }} · {{ clip.duration.toFixed(1) }}s + {{ t('sidebar.clipLayerCount', { n: clip.layers.length }) }} · {{ formatTime(clip.duration, { short: true, decimals: 1 }) }}
@@ -882,7 +884,7 @@ function onAssetDragStart(e: DragEvent, asset: ImageOrSvgAsset) {
{{ asset.name }} - {{ asset.duration.toFixed(2) }}s + {{ formatTime(asset.duration) }}