style(stage-web,stage-tamagotchi): improved model settings page, use standard components (#278)

This commit is contained in:
Neko
2025-07-16 21:03:17 +08:00
committed by GitHub
parent 6afbeebf59
commit e69297ec86
18 changed files with 275 additions and 77 deletions
+1
View File
@@ -50,6 +50,7 @@
"@xsai/shared-chat": "catalog:",
"@xsai/stream-text": "catalog:",
"@xsai/utils-chat": "catalog:",
"colorjs.io": "^0.5.2",
"culori": "^4.0.2",
"drizzle-kit": "^0.31.4",
"drizzle-orm": "^0.44.2",
@@ -1,22 +0,0 @@
<script setup lang="ts">
import { useLive2d } from '@proj-airi/stage-ui/stores'
defineEmits<{
(e: 'click'): void
}>()
const live2d = useLive2d()
</script>
<template>
<button
:disabled="live2d.loadingModel"
bg="neutral-100 dark:neutral-800"
hover="bg-neutral-200 dark:bg-neutral-700"
transition="all ease-in-out duration-250"
rounded
@click="$emit('click')"
>
<slot />
</button>
</template>
@@ -0,0 +1,46 @@
import Color from 'colorjs.io'
import { withRetry } from '@moeru/std'
import { useDark } from '@vueuse/core'
export function themeColorFromPropertyOf(colorFromClass: string, property: string): () => Promise<string> {
return async () => {
const fetchUntilWidgetMounted = withRetry(() => {
const widgets = document.querySelector(colorFromClass) as HTMLDivElement | undefined
if (!widgets)
throw new Error('Widgets element not found')
return widgets
}, { retry: 10, retryDelay: 1000 })
const widgets = await fetchUntilWidgetMounted()
return window.getComputedStyle(widgets).getPropertyValue(property)
}
}
export function themeColorFromValue(value: string | { light: string, dark: string }): () => Promise<string> {
return async () => {
if (typeof value === 'string') {
return value
}
else {
const dark = useDark()
return dark.value ? value.dark : value.light
}
}
}
export function useThemeColor(colorFrom: () => string | Promise<string>) {
async function updateThemeColor() {
if (!('document' in globalThis && globalThis.document != null))
return
if (!('window' in globalThis && globalThis.window != null))
return
document.querySelector('meta[name="theme-color"]')?.setAttribute('content', new Color(await colorFrom()).to('srgb').toString({ format: 'hex' }))
}
return {
updateThemeColor,
}
}
+10 -1
View File
@@ -1,14 +1,18 @@
<script setup lang="ts">
import { PageHeader } from '@proj-airi/stage-ui/components'
import { useProvidersStore } from '@proj-airi/stage-ui/stores'
import { useDark } from '@vueuse/core'
import { storeToRefs } from 'pinia'
import { computed } from 'vue'
import { computed, onMounted, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { RouterView, useRoute } from 'vue-router'
import WindowTitleBar from '../components/Window/TitleBar.vue'
import { themeColorFromValue, useThemeColor } from '../composables/theme-color'
const route = useRoute()
const dark = useDark()
const { t } = useI18n()
const providersStore = useProvidersStore()
const { allProvidersMetadata } = storeToRefs(providersStore)
@@ -120,6 +124,11 @@ const routeHeaderMetadataMap = computed(() => {
const routeHeaderMetadata = computed(() => {
return routeHeaderMetadataMap.value[route.path] || routeHeaderMetadataMap.value[`${route.path}/`]
})
const { updateThemeColor } = useThemeColor(themeColorFromValue({ light: 'rgb(255 255 255)', dark: 'rgb(18 18 18)' }))
watch(dark, () => updateThemeColor(), { immediate: true })
watch(route, () => updateThemeColor(), { immediate: true })
onMounted(() => updateThemeColor())
</script>
<template>
@@ -50,8 +50,8 @@ const positionCursor = useMouse()
</script>
<template>
<div flex class="h-[calc(100dvh-8rem)] flex-col-reverse sm:flex-row">
<div ref="live2dContainerRef" w="100% sm:50%" h="50% sm:80%">
<div flex class="relative h-[calc(100dvh-8rem)] flex-col-reverse md:flex-row">
<div ref="live2dContainerRef" w="100%" h="100%">
<Live2DCanvas
v-slot="{ app }"
ref="live2dCanvasRef"
@@ -76,7 +76,7 @@ const positionCursor = useMouse()
/>
</Live2DCanvas>
</div>
<Live2DSettings w="100% sm:50%" h="50% sm:80%" overflow-y-scroll :palette="palette" @extract-colors-from-model="extractColorsFromModel" />
<Live2DSettings w="100% md:30%" h-fit overflow-y-scroll class="absolute bottom-0 right-0 top-0" :palette="palette" @extract-colors-from-model="extractColorsFromModel" />
</div>
<IconAnimation
+2 -1
View File
@@ -127,6 +127,7 @@ onMounted(() => updateThemeColor())
paddingRight: 'env(safe-area-inset-right, 0px)',
paddingLeft: 'env(safe-area-inset-left, 0px)',
}"
h-full w-full
>
<!-- Header -->
<div
@@ -137,7 +138,7 @@ onMounted(() => updateThemeColor())
<HeaderLink />
</div>
<!-- Content -->
<div class="px-3 py-0 md:px-5 md:py-5" flex="~ col" mx-auto max-w-screen-xl>
<div class="h-full px-3 py-0 sm:h-[calc(100%-4rem)] md:py-0 xl:px-0" flex="~ col" mx-auto max-w-screen-xl>
<PageHeader
:title="routeHeaderMetadata?.title"
:subtitle="routeHeaderMetadata?.subtitle"
@@ -1,6 +1,6 @@
<script setup lang="ts">
import { Live2DCanvas, Live2DModel } from '@proj-airi/stage-ui/components/scenes'
import { Live2DSettings } from '@proj-airi/stage-ui/components'
import { Live2DCanvas, Live2DModel } from '@proj-airi/stage-ui/components/scenes'
import { useLive2d } from '@proj-airi/stage-ui/stores'
import { useElementBounding, useMouse } from '@vueuse/core'
import { Vibrant } from 'node-vibrant/browser'
@@ -50,8 +50,8 @@ const positionCursor = useMouse()
</script>
<template>
<div flex class="h-[calc(100dvh-8rem)] flex-col-reverse sm:flex-row">
<div ref="live2dContainerRef" w="100% sm:50%" h="50% sm:80%">
<div flex class="relative h-full flex-col-reverse md:flex-row">
<div ref="live2dContainerRef" w="100%" h="100%">
<Live2DCanvas
v-slot="{ app }"
ref="live2dCanvasRef"
@@ -76,7 +76,7 @@ const positionCursor = useMouse()
/>
</Live2DCanvas>
</div>
<Live2DSettings w="100% sm:50%" h="50% sm:80%" overflow-y-scroll :palette="palette" @extract-colors-from-model="extractColorsFromModel" />
<Live2DSettings w="100% md:30%" h-fit overflow-y-scroll class="absolute bottom-0 right-0 top-0" :palette="palette" @extract-colors-from-model="extractColorsFromModel" />
</div>
<IconAnimation
+1
View File
@@ -103,6 +103,7 @@ words:
- iconify
- intlify
- jlumbroso
- jszip
- Kawaii
- kebabcase
- Keyyable
+1
View File
@@ -15,6 +15,7 @@ export default await antfu(
'**/.astro/**',
],
rules: {
'vue/prefer-separate-static-class': 'off',
'yaml/plain-scalar': 'off',
'import/order': 'off',
'antfu/import-dedupe': 'error',
@@ -55,6 +55,10 @@ live2d:
scale: Scale
x: X
'y': 'Y'
theme-color-from-model:
title: Extract colors from model
button-extract:
title: Extract
microphone: Microphone
models: Model
pages:
@@ -51,6 +51,9 @@ live2d:
scale: 缩放
x: X
'y': 'Y'
theme-color-from-model:
button-extract:
title: 提取
microphone: 麦克风
models: 模型
pages:
@@ -1,7 +1,7 @@
<script setup lang="ts">
import { ref } from 'vue'
import Collapsable from '../Misc/Collapsable.vue'
import Collapsable from '../../Misc/Collapsable.vue'
const props = defineProps<{
title?: string
@@ -1,11 +1,11 @@
<script setup lang="ts">
import type { VoiceInfo } from '../../stores'
import type { VoiceInfo } from '../../../stores'
import { FieldCheckbox } from '@proj-airi/ui'
import { onUnmounted, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import { TestDummyMarker } from '../index'
import { TestDummyMarker } from '../../Gadgets'
const props = defineProps<{
// Input fields
@@ -10,14 +10,14 @@ import { useRouter } from 'vue-router'
import ProviderSettingsLayout2 from './ProviderSettingsLayout2.vue'
import { useProvidersStore, useSpeechStore } from '../../stores'
import {
ProviderAdvancedSettings,
ProviderApiKeyInput,
ProviderBaseUrlInput,
ProviderBasicSettings,
ProviderSettingsContainer,
} from '../index'
} from '.'
import { useProvidersStore, useSpeechStore } from '../../../stores'
const props = defineProps<{
providerId: string
@@ -2,17 +2,16 @@
import JSZip from 'jszip'
import localforage from 'localforage'
import { Emotion, EmotionNeutralMotionName } from '@proj-airi/stage-ui/constants'
import { useLive2d } from '@proj-airi/stage-ui/stores'
import { FieldRange } from '@proj-airi/ui'
import { FieldRange, Input } from '@proj-airi/ui'
import { useFileDialog, useObjectUrl } from '@vueuse/core'
import { storeToRefs } from 'pinia'
import { ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
import Section from '../../Layouts/Section.vue'
import Button from '../../Misc/Button.vue'
import { Emotion, EmotionNeutralMotionName } from '../../../constants'
import { useLive2d } from '../../../stores'
import { Section } from '../../Layouts'
import { Button } from '../../Misc'
import { ColorPalette } from '../../Widgets'
defineProps<{
@@ -122,32 +121,55 @@ const exportObjectUrl = useObjectUrl(modelFile)
<template>
<div flex="~ col gap-2">
<Section :title="t('settings.live2d.change-model.title')" icon="i-solar:magic-stick-3-bold-duotone" inner-class="text-sm">
<Section
:title="t('settings.live2d.change-model.title')"
icon="i-solar:magic-stick-3-bold-duotone"
inner-class="text-sm"
:class="[
'rounded-xl',
'bg-white/80 dark:bg-black/75',
'backdrop-blur-lg',
]"
>
<Button variant="secondary" @click="modelFileDialog.open()">
{{ t('settings.live2d.change-model.from-file') }}...
</Button>
<div flex items-center gap-2>
<input
<Input
v-model="localModelUrl"
:disabled="loadingModel"
class="form-control flex-1"
border="neutral-300 dark:neutral-800 solid 1 focus:neutral-400 dark:focus:neutral-600"
transition="border duration-250 ease-in-out"
class="flex-1"
:placeholder="t('settings.live2d.change-model.from-url-placeholder')"
>
<Button class="form-control" size="sm" @click="modelUrl = localModelUrl">
/>
<Button size="sm" variant="secondary" @click="modelUrl = localModelUrl">
{{ t('settings.live2d.change-model.from-url') }}
</Button>
</div>
<Button class="form-control place-self-end" size="sm" @click="modelFileDialog.open()">
{{ t('settings.live2d.change-model.from-file') }}...
</Section>
<Section
:title="t('settings.live2d.theme-color-from-model.title')"
icon="i-solar:magic-stick-3-bold-duotone"
inner-class="text-sm"
:class="[
'rounded-xl',
'bg-white/80 dark:bg-black/75',
'backdrop-blur-lg',
]"
>
<ColorPalette class="mb-4 mt-2" :colors="palette.map(hex => ({ hex, name: hex }))" mx-auto />
<Button variant="secondary" @click="$emit('extractColorsFromModel')">
{{ t('settings.live2d.theme-color-from-model.button-extract.title') }}
</Button>
<Button class="form-control" size="sm" @click="$emit('extractColorsFromModel')">
Extract colors from model
</Button>
<ColorPalette :colors="palette.map(hex => ({ hex, name: hex }))" />
</Section>
<Section
v-if="loadSource === 'file'"
:title="t('settings.live2d.edit-motion-map.title')"
icon="i-solar:face-scan-circle-bold-duotone"
:class="[
'rounded-xl',
'bg-white/80 dark:bg-black/75',
'backdrop-blur-lg',
]"
>
<div v-for="motion in availableMotions" :key="motion.fileName" flex items-center justify-between text-sm>
<span font-medium font-mono>{{ motion.fileName }}</span>
@@ -160,7 +182,6 @@ const exportObjectUrl = useObjectUrl(modelFile)
</select>
<Button
size="sm"
class="form-control"
@click="currentMotion = { group: motion.motionName, index: motion.motionIndex }"
>
@@ -168,26 +189,55 @@ const exportObjectUrl = useObjectUrl(modelFile)
</Button>
</div>
</div>
<Button size="sm" @click="saveMotionMap">
<Button @click="saveMotionMap">
Save and patch
</Button>
<a
mt-2 block :href="exportObjectUrl"
:download="`${modelFile?.name || 'live2d'}-motion-edited.zip`"
>
<Button w-full size="sm">Export</button>
<Button w-full>Export</button>
</a>
</Section>
<Section :title="t('settings.live2d.scale-and-position.title')" icon="i-solar:scale-bold-duotone">
<FieldRange v-model="scale" :min="0.5" :max="2" :step="0.01" :label="t('settings.live2d.scale-and-position.scale')" />
<FieldRange v-model="position.x" :min="-100" :max="100" :step="1" :label="t('settings.live2d.scale-and-position.x')" />
<FieldRange v-model="position.y" :min="-100" :max="100" :step="1" :label="t('settings.live2d.scale-and-position.y')" />
<Section
:title="t('settings.live2d.scale-and-position.title')"
icon="i-solar:scale-bold-duotone"
:class="[
'rounded-xl',
'bg-white/80 dark:bg-black/75',
'backdrop-blur-lg',
]"
>
<FieldRange v-model="scale" as="div" :min="0.5" :max="2" :step="0.01" :label="t('settings.live2d.scale-and-position.scale')">
<template #label>
<div flex items-center>
<div>{{ t('settings.live2d.scale-and-position.scale') }}</div>
<button px-2 text-xs outline-none title="Reset value to default" @click="() => scale = 1">
<div i-solar:forward-linear transform-scale-x--100 text="neutral-500 dark:neutral-400" />
</button>
</div>
</template>
</FieldRange>
<FieldRange v-model="position.x" as="div" :min="-100" :max="100" :step="1" :label="t('settings.live2d.scale-and-position.x')">
<template #label>
<div flex items-center>
<div>{{ t('settings.live2d.scale-and-position.x') }}</div>
<button px-2 text-xs outline-none title="Reset value to default" @click="() => position.x = 0">
<div i-solar:forward-linear transform-scale-x--100 text="neutral-500 dark:neutral-400" />
</button>
</div>
</template>
</FieldRange>
<FieldRange v-model="position.y" as="div" :min="-100" :max="100" :step="1" :label="t('settings.live2d.scale-and-position.y')">
<template #label>
<div flex items-center>
<div>{{ t('settings.live2d.scale-and-position.y') }}</div>
<button px-2 text-xs outline-none title="Reset value to default" @click="() => position.y = 0">
<div i-solar:forward-linear transform-scale-x--100 text="neutral-500 dark:neutral-400" />
</button>
</div>
</template>
</FieldRange>
</Section>
</div>
</template>
<style scoped>
.form-control {
--at-apply: rounded px-2 py-1 outline-none;
}
</style>
@@ -20,7 +20,7 @@ const settings = useSettings()
<TooltipRoot>
<TooltipTrigger
transition="all ease-in-out duration-250"
size-6 cursor-pointer rounded-full bg-primary-500
size-8 cursor-pointer rounded-full bg-primary-500
:style="hex ? { background: hex } : { '--chromatic-hue': DEFAULT_THEME_COLORS_HUE }"
:class="settings.isColorSelectedForPrimary(hex) ? 'scale-150 mx-1' : 'hover:scale-110'"
@click="settings.applyPrimaryColorFrom(hex)"
@@ -11,7 +11,7 @@ import onboardingLogo from '../../../../assets/onboarding.png'
import { Callout } from '../../../Layouts'
import { RadioCardDetail } from '../../../Menu'
import { Button } from '../../../Misc'
import { ProviderAccountIdInput } from '../../../Providers'
import { ProviderAccountIdInput } from '../../../Scenarios/Providers'
interface Emits {
(e: 'configured'): void
+111 -7
View File
@@ -372,6 +372,9 @@ importers:
'@xsai/utils-chat':
specifier: 'catalog:'
version: 0.3.0-beta.8
colorjs.io:
specifier: ^0.5.2
version: 0.5.2
culori:
specifier: ^4.0.2
version: 4.0.2
@@ -1010,7 +1013,7 @@ importers:
version: 0.1.3
unplugin-yaml:
specifier: ^3.0.1
version: 3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(encoding@0.1.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
version: 3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
vitepress:
specifier: ^2.0.0-alpha.8
version: 2.0.0-alpha.8(@algolia/client-search@5.32.0)(@types/node@24.0.13)(change-case@5.4.4)(fuse.js@7.1.0)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(nprogress@0.2.0)(postcss@8.5.6)(react@18.3.1)(search-insights@2.17.3)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
@@ -1056,7 +1059,7 @@ importers:
devDependencies:
unplugin-yaml:
specifier: ^3.0.1
version: 3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(encoding@0.1.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
version: 3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
packages/memory-pgvector:
dependencies:
@@ -1412,7 +1415,7 @@ importers:
version: 66.3.3(postcss@8.5.6)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))
unplugin-yaml:
specifier: ^3.0.1
version: 3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(encoding@0.1.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
version: 3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
vite:
specifier: ^6.3.5
version: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)
@@ -18135,6 +18138,107 @@ snapshots:
- yaml
optional: true
astro@5.10.1(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0):
dependencies:
'@astrojs/compiler': 2.12.2
'@astrojs/internal-helpers': 0.6.1
'@astrojs/markdown-remark': 6.3.2
'@astrojs/telemetry': 3.3.0
'@capsizecss/unpack': 2.4.0(encoding@0.1.13)
'@oslojs/encoding': 1.1.0
'@rollup/pluginutils': 5.2.0(rollup@4.44.2)
acorn: 8.15.0
aria-query: 5.3.2
axobject-query: 4.1.0
boxen: 8.0.1
ci-info: 4.2.0
clsx: 2.1.1
common-ancestor-path: 1.0.1
cookie: 1.0.2
cssesc: 3.0.0
debug: 4.4.1
deterministic-object-hash: 2.0.2
devalue: 5.1.1
diff: 5.2.0
dlv: 1.1.3
dset: 3.1.4
es-module-lexer: 1.7.0
esbuild: 0.25.5
estree-walker: 3.0.3
flattie: 1.1.1
fontace: 0.3.0
github-slugger: 2.0.0
html-escaper: 3.0.3
http-cache-semantics: 4.2.0
import-meta-resolve: 4.1.0
js-yaml: 4.1.0
kleur: 4.1.5
magic-string: 0.30.17
magicast: 0.3.5
mrmime: 2.0.1
neotraverse: 0.6.18
p-limit: 6.2.0
p-queue: 8.1.0
package-manager-detector: 1.3.0
picomatch: 4.0.2
prompts: 2.4.2
rehype: 13.0.2
semver: 7.7.2
shiki: 3.7.0
tinyexec: 0.3.2
tinyglobby: 0.2.14
tsconfck: 3.1.6(typescript@5.8.3)
ultrahtml: 1.6.0
unifont: 0.5.2
unist-util-visit: 5.0.0
unstorage: 1.16.0
vfile: 6.0.3
vite: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)
vitefu: 1.0.7(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))
xxhash-wasm: 1.1.0
yargs-parser: 21.1.1
yocto-spinner: 0.2.3
zod: 3.25.74
zod-to-json-schema: 3.24.6(zod@3.25.74)
zod-to-ts: 1.2.0(typescript@5.8.3)(zod@3.25.74)
optionalDependencies:
sharp: 0.33.5
transitivePeerDependencies:
- '@azure/app-configuration'
- '@azure/cosmos'
- '@azure/data-tables'
- '@azure/identity'
- '@azure/keyvault-secrets'
- '@azure/storage-blob'
- '@capacitor/preferences'
- '@deno/kv'
- '@netlify/blobs'
- '@planetscale/database'
- '@types/node'
- '@upstash/redis'
- '@vercel/blob'
- '@vercel/kv'
- aws4fetch
- db0
- encoding
- idb-keyval
- ioredis
- jiti
- less
- lightningcss
- rollup
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- typescript
- uploadthing
- yaml
optional: true
async-mutex@0.3.2:
dependencies:
tslib: 2.8.1
@@ -24540,7 +24644,7 @@ snapshots:
rollup: 4.44.2
vite: rolldown-vite@7.0.9(@types/node@24.0.13)(esbuild@0.25.5)(jiti@2.4.2)(less@4.3.0)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)
unplugin-yaml@3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(encoding@0.1.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)):
unplugin-yaml@3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.44.2)
unplugin: 2.3.5
@@ -24548,13 +24652,13 @@ snapshots:
optionalDependencies:
'@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.44.2)
'@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.44.2)
astro: 5.10.1(@types/node@24.0.13)(encoding@0.1.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
astro: 5.10.1(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
esbuild: 0.25.5
rolldown: 1.0.0-beta.20
rollup: 4.44.2
vite: 6.3.5(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)
unplugin-yaml@3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(encoding@0.1.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)):
unplugin-yaml@3.0.1(@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(@nuxt/schema@3.14.1592(magicast@0.3.5)(rollup@4.44.2))(astro@5.10.1(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0))(esbuild@0.25.5)(rolldown@1.0.0-beta.20)(rollup@4.44.2)(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)):
dependencies:
'@rollup/pluginutils': 5.2.0(rollup@4.44.2)
unplugin: 2.3.5
@@ -24562,7 +24666,7 @@ snapshots:
optionalDependencies:
'@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.44.2)
'@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.44.2)
astro: 5.10.1(@types/node@24.0.13)(encoding@0.1.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
astro: 5.10.1(@types/node@24.0.13)(jiti@2.4.2)(less@4.3.0)(lightningcss@1.30.1)(rollup@4.44.2)(terser@5.43.1)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
esbuild: 0.25.5
rolldown: 1.0.0-beta.20
rollup: 4.44.2