+
+
+
+
+
+
+
+
+
+
+ {{ t('statistic.locked.title') }}
+
+
+ {{ t('statistic.locked.description') }}
+
+
+
+ {{ t('statistic.locked.upgrade') }}
+
+
+ {{ t('statistic.locked.later') }}
+
-
-
-
-
- {{ statistics.totalPhrases }}
-
-
- {{ t('statistic.quick-states.total-phrases') }}
-
+
+
+
+
+
+
+ {{ t('statistic.empty.chart.cta') }}
+
+
+
+
+
+
+
+
+
+ {{ t('statistic.chart.title') }}
+
+
+ {{ t('statistic.chart.subtitle') }}
+
+
+ {{ t('statistic.chart.delta', { delta: formattedDelta }) }}
+
-
-
-
-
-
-
-
- {{ t('statistic.recent') }}
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('statistic.bundles.title') }}
+
+
+ {{ seeAllLabel }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/tailwind.config.cjs b/frontend/tailwind.config.cjs
index 1c3b9a8c..8e4b31a0 100644
--- a/frontend/tailwind.config.cjs
+++ b/frontend/tailwind.config.cjs
@@ -2,15 +2,20 @@
const {
addIconSelectors
} = require('@iconify/tailwind');
+// Design-system tokens under an additive `st-` namespace (bg-st-card, text-st-strong,
+// rounded-st-lg, ...). They resolve to the CSS custom properties in subturtle-ui/style.css,
+// so page markup and the library's components read from the same source of truth.
+// The blue/purple scales below are the pre-redesign admin-template palette; they stay until
+// the last pilotui page is migrated.
+const stTokens = require('subturtle-ui/tailwind-tokens');
module.exports = {
content: [
'./components/**/*.{js,vue,ts}',
'./layouts/**/*.vue',
'./pages/**/*.vue',
'./plugins/**/*.{js,ts}',
+ './composables/**/*.{js,ts}',
'./nuxt.config.{js,ts}',
- './app.vue',
- './error.vue',
],
darkMode: 'class',
theme: {
@@ -18,7 +23,9 @@ module.exports = {
center: true,
},
extend: {
+ ...stTokens,
colors: {
+ ...stTokens.colors,
primary: {
DEFAULT: '#4361ee',
light: '#eaf1ff',
@@ -66,12 +73,14 @@ module.exports = {
},
},
fontFamily: {
+ ...stTokens.fontFamily,
nunito: ['Nunito', 'sans-serif'],
},
spacing: {
4.5: '18px',
},
boxShadow: {
+ ...stTokens.boxShadow,
'3xl': '0 2px 2px rgb(224 230 237 / 46%), 1px 6px 7px rgb(224 230 237 / 46%)',
},
typography: ({
diff --git a/frontend/tests/e2e/specs/subscription-ui.spec.ts b/frontend/tests/e2e/specs/subscription-ui.spec.ts
index 47a7c8ce..0250ab14 100644
--- a/frontend/tests/e2e/specs/subscription-ui.spec.ts
+++ b/frontend/tests/e2e/specs/subscription-ui.spec.ts
@@ -234,8 +234,10 @@ test.describe('Subscription UI — free/Starter surfaces (§7)', () => {
test('/statistic shows the weekly_insights lock panel, and the global modal defers to it', async ({ page }) => {
await page.goto('/#/statistic');
- // Shared in-page FeatureLocked panel (S15) — replaces the empty-charts pattern.
- await expect(page.getByText('Weekly progress insights is part of Learner.')).toBeVisible();
+ // The redesign gives /statistic its own locked panel in place of the shared
+ // FeatureLocked one, with the design's copy. /sessions still uses the shared panel
+ // ("… is part of Learner."), so the two read differently until that screen migrates.
+ await expect(page.getByText('Weekly insights are a Learner feature')).toBeVisible();
// The page owns the upsell inline (useInlineFeatureLock), so the global
// tier-limit modal suppresses itself — no double surfacing of the same lock.
diff --git a/frontend/utils/language.ts b/frontend/utils/language.ts
new file mode 100644
index 00000000..bb3d8fbc
--- /dev/null
+++ b/frontend/utils/language.ts
@@ -0,0 +1,34 @@
+/**
+ * Language values reach the client in two shapes: phrases saved by the extension store a
+ * display name ("Spanish") in `language_info` / `translation_language`, while some paths
+ * store an ISO code. Normalise both to the 2-letter code the UI shows on bundle covers, and
+ * return undefined when neither matches rather than guessing — a wrong flag is worse than none.
+ */
+const NAME_TO_CODE: Record
= {
+ chinese: 'zh',
+ danish: 'da',
+ english: 'en',
+ french: 'fr',
+ german: 'de',
+ greek: 'el',
+ hungarian: 'hu',
+ italian: 'it',
+ japanese: 'ja',
+ polish: 'pl',
+ portuguese: 'pt',
+ russian: 'ru',
+ spanish: 'es',
+ swedish: 'sv',
+ turkish: 'tr',
+ arabic: 'ae',
+};
+
+export function toLanguageCode(value?: string): string | undefined {
+ if (!value) return undefined;
+
+ const trimmed = value.trim().toLowerCase();
+ if (NAME_TO_CODE[trimmed]) return NAME_TO_CODE[trimmed].toUpperCase();
+ if (/^[a-z]{2}$/.test(trimmed)) return trimmed.toUpperCase();
+
+ return undefined;
+}
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index d9ee1e4e..32b76673 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -9662,6 +9662,10 @@ stylehacks@^7.0.4:
browserslist "^4.23.3"
postcss-selector-parser "^6.1.2"
+"subturtle-ui@link:../ui":
+ version "0.0.0"
+ uid ""
+
sucrase@^3.35.0:
version "3.35.0"
resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz"
diff --git a/ui/.gitignore b/ui/.gitignore
new file mode 100644
index 00000000..06e60381
--- /dev/null
+++ b/ui/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+dist
+*.tsbuildinfo
diff --git a/ui/README.md b/ui/README.md
new file mode 100644
index 00000000..9f45d85f
--- /dev/null
+++ b/ui/README.md
@@ -0,0 +1,137 @@
+# subturtle-ui
+
+The Subturtle design system as Vue 3 components. Built to be consumed by **both** the dashboard
+(`frontend/`) and **subturtle-extension-apps**, which is why it carries no framework coupling
+beyond Vue and ships its CSS pre-compiled.
+
+It replaces `pilotui`, a generic admin-template library whose palette (blue `#4361ee`) was never
+Subturtle's. This one is built on the real brand: rose `#f91e5a`, a jade "grow" green, Nunito, and
+warm off-white surfaces.
+
+## Using it
+
+```jsonc
+// consumer package.json — while developing locally
+"subturtle-ui": "link:../ui"
+```
+
+```ts
+import { StAppShell, StButton, StCard } from 'subturtle-ui';
+import 'subturtle-ui/style.css'; // required — tokens + all component CSS
+```
+
+The stylesheet is the only side effect. Import it once, at app entry (in Nuxt: the `css` array).
+
+### Writing page markup in the same language
+
+The library's own components are pre-compiled, so a consumer needs nothing from Tailwind to use
+them. But pages generally want the same tokens for their own layout, and the app's Tailwind knows
+nothing about them. Spread the exported fragment into `theme.extend` for an additive `st-`
+namespace:
+
+```js
+// tailwind.config.cjs
+const stTokens = require('subturtle-ui/tailwind-tokens');
+module.exports = { theme: { extend: { ...stTokens } } };
+```
+
+```html
+
+```
+
+Merge, don't overwrite, any key the app already defines (`colors`, `fontFamily`, `boxShadow`) —
+a later literal key would replace the spread wholesale. See `frontend/tailwind.config.cjs`.
+
+Two helper classes ship in the stylesheet for consumers: `.st-overline` (the rose eyebrow label
+above page titles) and `.st-focus-ring` (the shared `:focus-visible` treatment).
+
+## How it is put together
+
+### Class prefix — the one constraint you cannot relax
+
+`tailwind.config.cjs` sets `prefix: 'st-'` and `corePlugins.preflight: false`.
+
+The compiled `dist/style.css` loads in the same document as the consumer's own Tailwind build.
+Without the prefix, identical class names carrying different values (`.rounded-lg`, `.bg-primary`,
+`.text-lg`, `.shadow-md`) would collide and load order would silently decide app-wide styling.
+The prefix costs verbosity when authoring (`class="st-flex st-items-center"`) and buys complete
+isolation: the library's Tailwind config never has to agree with anyone else's.
+
+Preflight is off for the same reason — a component library has no business resetting a host
+page's elements. The single exception is `box-sizing: border-box`, which every component's layout
+math assumes; see the comment in `src/styles/index.css`.
+
+### Tokens
+
+`src/styles/tokens.css` holds ~95 custom properties ported from the Claude Design system, with
+**names kept byte-identical to the design source** so this file and the `.dc.html` screens can be
+read side by side.
+
+Colors are stored as space-separated RGB channels (`--rose-500: 249 30 90`), not hex, and Tailwind
+composes them as `rgb(var(--token) /
)`. That is what makes opacity modifiers work
+(`st-bg-primary/5`, the ambient background blobs) and what a dark theme will hook into. Write raw
+CSS against them as `rgb(var(--rose-500))`.
+
+`:root.dark` is scaffolded and empty. The design system ships light values only, and the product
+keeps its theme switcher, so dark currently leaves anything built on this library in its light
+palette. Adding dark means redefining the semantic aliases there — no component should change.
+
+### Icons
+
+`src/icon/icons.generated.ts` is generated by `scripts/build-icons.mjs` from `@iconify/json` for an
+explicit allowlist, and `StIcon` renders the SVG inline.
+
+The two obvious alternatives both fail a requirement: Tailwind's `@iconify/tailwind` selectors
+cannot be generated for names only known at runtime (the design calls icons by name), and the
+design's `` web component fetches from a CDN, which is a non-starter inside the
+extension's content scripts. To add an icon, put its name in `ICONS` and run `yarn icons`.
+
+### Build
+
+Vite lib mode, single ESM+CJS entry plus `dist/style.css`, `vue` external, real `.d.ts` via
+`vite-plugin-dts`. Output is **not** minified — that is the convention for libraries (the consumer's
+bundler minifies), and esbuild's identifier mangling collided across the concatenated SFC modules
+here in a way Rollup rejected downstream.
+
+```bash
+yarn build # icons -> typecheck -> bundle
+yarn dev # rebuild on change, for a linked consumer
+```
+
+## Components
+
+| Group | |
+| --- | --- |
+| Shell | `StAppShell`, `StSidebarNav` |
+| Elements | `StButton`, `StIconButton`, `StCard`, `StBadge`, `StAvatar`, `StEmptyState`, `StSkeleton`, `StIcon` |
+| Brand | `StStatTile`, `StBundleCard` |
+
+This is the set the app shell and the Progress screen need. The rest of the design system
+(`Input`, `Tag`, `Switch`, `ProgressBar`, `SegmentedControl`, `Tabs`, `Modal`, `Toast`,
+`PhraseCard`, `Flashcard`, `LevelPip`, `PlanCard`) lands as each remaining screen is migrated.
+
+Three things were deliberately added rather than ported, because the source components are React
+files styled entirely with inline style objects and cannot express them: nav-item hover states,
+`:focus-visible` rings on every control, and the collapsible sidebar rail (which lived in the
+design project's page-level script, not in `AppShell`).
+
+### `StAppShell`
+
+The frame every dashboard screen starts from: sidebar, topbar, and a scrolling content column.
+
+| Prop | |
+| --- | --- |
+| `nav` | `StNavGroup[]` — `{ section?, items: [{ id, label, icon?, badge? }] }` |
+| `active` | id of the current item; fully controlled, the shell keeps no selection state |
+| `collapsed` | `v-model:collapsed`; persistence is the app's job |
+| `collapsible` | show the rail toggle (default true) |
+| `productName`, `logoSrc`, `maxWidth`, `ambient` | |
+
+Emits `navigate(id)` and `update:collapsed(boolean)`. Slots: `title`, `header-right`,
+`sidebar-footer`, default.
+
+Collapsed, the rail is 76px and nav labels stay in the DOM — they are each button's accessible
+name, and the stylesheet turns them into hover/focus tooltips.
+
+`StAppShell` fills its container and scrolls internally, so give it a container that is exactly
+the viewport (`h-[100dvh]`).
diff --git a/ui/package.json b/ui/package.json
new file mode 100644
index 00000000..0beb87ef
--- /dev/null
+++ b/ui/package.json
@@ -0,0 +1,49 @@
+{
+ "name": "subturtle-ui",
+ "version": "0.1.0",
+ "description": "Subturtle design system \u2014 Vue 3 component library shared by the dashboard and the browser extension.",
+ "license": "MIT",
+ "private": true,
+ "type": "module",
+ "files": [
+ "dist",
+ "tailwind-tokens.cjs"
+ ],
+ "main": "./dist/index.cjs",
+ "module": "./dist/index.js",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "import": "./dist/index.js",
+ "require": "./dist/index.cjs"
+ },
+ "./style.css": "./dist/style.css",
+ "./tailwind-tokens": "./tailwind-tokens.cjs"
+ },
+ "sideEffects": [
+ "*.css"
+ ],
+ "scripts": {
+ "icons": "node scripts/build-icons.mjs",
+ "build": "vue-tsc --noEmit -p tsconfig.build.json && vite build",
+ "dev": "vite build --watch",
+ "typecheck": "vue-tsc --noEmit -p tsconfig.build.json"
+ },
+ "peerDependencies": {
+ "vue": "^3.4.0"
+ },
+ "devDependencies": {
+ "@iconify/json": "^2.2.319",
+ "@types/node": "^26.4.0",
+ "@vitejs/plugin-vue": "^5.2.1",
+ "autoprefixer": "^10.4.20",
+ "postcss": "^8.4.49",
+ "tailwindcss": "^3.4.17",
+ "typescript": "^5.6.3",
+ "vite": "^5.4.11",
+ "vite-plugin-dts": "^4.3.0",
+ "vue": "^3.5.12",
+ "vue-tsc": "^2.1.10"
+ }
+}
diff --git a/ui/postcss.config.cjs b/ui/postcss.config.cjs
new file mode 100644
index 00000000..67cdf1a5
--- /dev/null
+++ b/ui/postcss.config.cjs
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/ui/scripts/build-icons.mjs b/ui/scripts/build-icons.mjs
new file mode 100644
index 00000000..3957701e
--- /dev/null
+++ b/ui/scripts/build-icons.mjs
@@ -0,0 +1,109 @@
+/**
+ * Generates src/icon/icons.generated.ts from @iconify/json.
+ *
+ * Why not the usual routes:
+ * - The design calls icons by runtime name (`solar:fire-bold-duotone`), so Tailwind's
+ * @iconify/tailwind selectors can't be statically generated for them.
+ * - The design files use the web component, which fetches from a CDN. That is
+ * a non-starter for the browser extension's content scripts.
+ * So we inline the SVG bodies for an explicit allowlist at build time: offline, no network,
+ * and unused icons are still in one module (see the note on tree-shaking below).
+ *
+ * To add an icon: put its name in ICONS, run `yarn icons`, use it as .
+ */
+import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
+import { dirname, resolve } from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const here = dirname(fileURLToPath(import.meta.url));
+const root = resolve(here, '..');
+
+/** Every icon the shell and the Progress screen use. Keep sorted by set, then name. */
+const ICONS = [
+ 'solar:add-circle-bold',
+ 'solar:alt-arrow-left-linear',
+ 'solar:alt-arrow-right-linear',
+ 'solar:arrow-down-bold',
+ 'solar:arrow-right-linear',
+ 'solar:arrow-up-bold',
+ 'solar:bookmark-bold-duotone',
+ 'solar:chart-2-bold-duotone',
+ 'solar:crown-bold',
+ 'solar:crown-bold-duotone',
+ 'solar:documents-bold-duotone',
+ 'solar:download-minimalistic-bold',
+ 'solar:fire-bold',
+ 'solar:fire-bold-duotone',
+ 'solar:hamburger-menu-linear',
+ 'solar:history-2-bold-duotone',
+ 'solar:layers-minimalistic-bold-duotone',
+ 'solar:lock-keyhole-minimalistic-bold-duotone',
+ 'solar:microphone-3-bold-duotone',
+ 'solar:notebook-bold-duotone',
+ 'solar:play-bold',
+ 'solar:rocket-2-bold-duotone',
+ 'solar:settings-bold-duotone',
+];
+
+const setCache = new Map();
+function loadSet(prefix) {
+ if (!setCache.has(prefix)) {
+ const path = resolve(root, 'node_modules/@iconify/json/json', `${prefix}.json`);
+ setCache.set(prefix, JSON.parse(readFileSync(path, 'utf8')));
+ }
+ return setCache.get(prefix);
+}
+
+/** Follows one level of alias indirection, which is all the Solar set uses. */
+function resolveIcon(set, name) {
+ if (set.icons?.[name]) return { ...set.icons[name] };
+ const alias = set.aliases?.[name];
+ if (!alias) return null;
+ const base = resolveIcon(set, alias.parent);
+ return base ? { ...base, ...alias } : null;
+}
+
+const entries = [];
+const missing = [];
+
+for (const full of ICONS) {
+ const [prefix, name] = full.split(':');
+ const set = loadSet(prefix);
+ const icon = resolveIcon(set, name);
+ if (!icon) {
+ missing.push(full);
+ continue;
+ }
+ entries.push({
+ name: full,
+ body: icon.body,
+ width: icon.width ?? set.width ?? 24,
+ height: icon.height ?? set.height ?? 24,
+ });
+}
+
+if (missing.length) {
+ console.error(`build-icons: not found in @iconify/json:\n ${missing.join('\n ')}`);
+ process.exit(1);
+}
+
+const out = `/* eslint-disable */
+// GENERATED by scripts/build-icons.mjs — do not edit. Add names to that script's ICONS list.
+export interface IconDef {
+ body: string;
+ width: number;
+ height: number;
+}
+
+export const icons: Record = {
+${entries
+ .map((e) => ` ${JSON.stringify(e.name)}: { body: ${JSON.stringify(e.body)}, width: ${e.width}, height: ${e.height} },`)
+ .join('\n')}
+};
+
+export type IconName = keyof typeof icons;
+`;
+
+mkdirSync(resolve(root, 'src/icon'), { recursive: true });
+writeFileSync(resolve(root, 'src/icon/icons.generated.ts'), out);
+console.log(`build-icons: wrote ${entries.length} icons`);
diff --git a/ui/src/brand/StBundleCard.vue b/ui/src/brand/StBundleCard.vue
new file mode 100644
index 00000000..7327c2f7
--- /dev/null
+++ b/ui/src/brand/StBundleCard.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+ {{ countLabel }}
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/brand/StStatTile.vue b/ui/src/brand/StStatTile.vue
new file mode 100644
index 00000000..9c50c20a
--- /dev/null
+++ b/ui/src/brand/StStatTile.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+ {{ value }}
+
+
+
+
{{ label }}
+
+
+
+
+
+
+
diff --git a/ui/src/elements/StAvatar.vue b/ui/src/elements/StAvatar.vue
new file mode 100644
index 00000000..6a689f0c
--- /dev/null
+++ b/ui/src/elements/StAvatar.vue
@@ -0,0 +1,46 @@
+
+
+
+
+ {{ initials }}
+
+
+
+
+
+
diff --git a/ui/src/elements/StBadge.vue b/ui/src/elements/StBadge.vue
new file mode 100644
index 00000000..49b7c8f3
--- /dev/null
+++ b/ui/src/elements/StBadge.vue
@@ -0,0 +1,46 @@
+
+
+
+
+
diff --git a/ui/src/elements/StButton.vue b/ui/src/elements/StButton.vue
new file mode 100644
index 00000000..87877566
--- /dev/null
+++ b/ui/src/elements/StButton.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
diff --git a/ui/src/elements/StCard.vue b/ui/src/elements/StCard.vue
new file mode 100644
index 00000000..7f3b78bb
--- /dev/null
+++ b/ui/src/elements/StCard.vue
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
diff --git a/ui/src/elements/StEmptyState.vue b/ui/src/elements/StEmptyState.vue
new file mode 100644
index 00000000..c3bc16fb
--- /dev/null
+++ b/ui/src/elements/StEmptyState.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+ {{ title }}
+
+
+ {{ description }}
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/elements/StIconButton.vue b/ui/src/elements/StIconButton.vue
new file mode 100644
index 00000000..42ee1207
--- /dev/null
+++ b/ui/src/elements/StIconButton.vue
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
diff --git a/ui/src/elements/StSkeleton.vue b/ui/src/elements/StSkeleton.vue
new file mode 100644
index 00000000..f8b9f4ef
--- /dev/null
+++ b/ui/src/elements/StSkeleton.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
diff --git a/ui/src/env.d.ts b/ui/src/env.d.ts
new file mode 100644
index 00000000..a699b8a2
--- /dev/null
+++ b/ui/src/env.d.ts
@@ -0,0 +1,7 @@
+///
+
+declare module '*.vue' {
+ import type { DefineComponent } from 'vue';
+ const component: DefineComponent<{}, {}, any>;
+ export default component;
+}
diff --git a/ui/src/icon/StIcon.vue b/ui/src/icon/StIcon.vue
new file mode 100644
index 00000000..f2dd87d9
--- /dev/null
+++ b/ui/src/icon/StIcon.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
diff --git a/ui/src/icon/icons.generated.ts b/ui/src/icon/icons.generated.ts
new file mode 100644
index 00000000..180d8990
--- /dev/null
+++ b/ui/src/icon/icons.generated.ts
@@ -0,0 +1,35 @@
+/* eslint-disable */
+// GENERATED by scripts/build-icons.mjs — do not edit. Add names to that script's ICONS list.
+export interface IconDef {
+ body: string;
+ width: number;
+ height: number;
+}
+
+export const icons: Record = {
+ "solar:add-circle-bold": { body: "", width: 24, height: 24 },
+ "solar:alt-arrow-left-linear": { body: " ", width: 24, height: 24 },
+ "solar:alt-arrow-right-linear": { body: " ", width: 24, height: 24 },
+ "solar:arrow-down-bold": { body: " ", width: 24, height: 24 },
+ "solar:arrow-right-linear": { body: " ", width: 24, height: 24 },
+ "solar:arrow-up-bold": { body: " ", width: 24, height: 24 },
+ "solar:bookmark-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:chart-2-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:crown-bold": { body: " ", width: 24, height: 24 },
+ "solar:crown-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:documents-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:download-minimalistic-bold": { body: " ", width: 24, height: 24 },
+ "solar:fire-bold": { body: " ", width: 24, height: 24 },
+ "solar:fire-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:hamburger-menu-linear": { body: " ", width: 24, height: 24 },
+ "solar:history-2-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:layers-minimalistic-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:lock-keyhole-minimalistic-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:microphone-3-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:notebook-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:play-bold": { body: " ", width: 24, height: 24 },
+ "solar:rocket-2-bold-duotone": { body: " ", width: 24, height: 24 },
+ "solar:settings-bold-duotone": { body: " ", width: 24, height: 24 },
+};
+
+export type IconName = keyof typeof icons;
diff --git a/ui/src/index.ts b/ui/src/index.ts
new file mode 100644
index 00000000..f387d183
--- /dev/null
+++ b/ui/src/index.ts
@@ -0,0 +1,31 @@
+/**
+ * subturtle-ui — the Subturtle design system as Vue 3 components.
+ *
+ * Consumers must also import the stylesheet once:
+ * import 'subturtle-ui/style.css';
+ * It carries the design tokens and every component's compiled CSS. All emitted classes are
+ * prefixed `st-`, so it cannot collide with the host application's own Tailwind build.
+ */
+import './styles/index.css';
+
+// Icon
+export { default as StIcon } from './icon/StIcon.vue';
+
+// Elements
+export { default as StAvatar } from './elements/StAvatar.vue';
+export { default as StBadge } from './elements/StBadge.vue';
+export { default as StButton } from './elements/StButton.vue';
+export { default as StCard } from './elements/StCard.vue';
+export { default as StEmptyState } from './elements/StEmptyState.vue';
+export { default as StIconButton } from './elements/StIconButton.vue';
+export { default as StSkeleton } from './elements/StSkeleton.vue';
+
+// Brand
+export { default as StBundleCard } from './brand/StBundleCard.vue';
+export { default as StStatTile } from './brand/StStatTile.vue';
+
+// Shell
+export { default as StAppShell } from './shell/StAppShell.vue';
+export { default as StSidebarNav } from './shell/StSidebarNav.vue';
+
+export type { StNavGroup, StNavItem, StTone, StSize, StPadding, StElevation } from './types';
diff --git a/ui/src/shell/StAppShell.vue b/ui/src/shell/StAppShell.vue
new file mode 100644
index 00000000..3a3abc43
--- /dev/null
+++ b/ui/src/shell/StAppShell.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ui/src/shell/StSidebarNav.vue b/ui/src/shell/StSidebarNav.vue
new file mode 100644
index 00000000..7ab7f8d5
--- /dev/null
+++ b/ui/src/shell/StSidebarNav.vue
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
diff --git a/ui/src/styles/index.css b/ui/src/styles/index.css
new file mode 100644
index 00000000..f6749103
--- /dev/null
+++ b/ui/src/styles/index.css
@@ -0,0 +1,57 @@
+/* Google Fonts must be the first statement in the file, or browsers drop it. */
+@import url('https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,600&family=JetBrains+Mono:wght@400;500;600&display=swap');
+@import './tokens.css';
+
+@tailwind base;
+@tailwind components;
+
+/*
+ * Deliberately NOT a reset. Preflight is off (see tailwind.config.cjs) so the library never
+ * restyles a host page's elements. This one rule is the exception: every component's layout
+ * math assumes border-box. Both current consumers already set it via their own preflight —
+ * it is repeated so the library also works in a page with no reset at all, such as an
+ * extension content script.
+ */
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+/*
+ * Helper classes for CONSUMERS, written as plain CSS rather than inside `@layer components`.
+ * Tailwind purges its own layers against this package's `content` globs, which only cover
+ * src/ — a class used solely in a consuming app would be stripped from the shipped stylesheet.
+ * They sit before `@tailwind utilities` so utility classes still override them.
+ */
+
+/* The rose eyebrow label that sits above page and section titles across the product. */
+.st-overline {
+ display: inline-flex;
+ align-items: center;
+ gap: 7px;
+ font-size: var(--text-2xs);
+ font-weight: 800;
+ letter-spacing: var(--tracking-caps);
+ text-transform: uppercase;
+ color: rgb(var(--color-primary));
+}
+
+.st-overline::before {
+ content: '';
+ width: 7px;
+ height: 7px;
+ border-radius: 50%;
+ background: rgb(var(--color-primary));
+}
+
+/*
+ * Shared focus ring. The design system has no focus treatment at all — every control in this
+ * library opts into this one so the components are keyboard-usable.
+ */
+.st-focus-ring:focus-visible {
+ outline: none;
+ box-shadow: 0 0 0 3px var(--ring-focus);
+}
+
+@tailwind utilities;
diff --git a/ui/src/styles/tokens.css b/ui/src/styles/tokens.css
new file mode 100644
index 00000000..d0818c0b
--- /dev/null
+++ b/ui/src/styles/tokens.css
@@ -0,0 +1,196 @@
+/* ============================================================
+ Subturtle design tokens.
+
+ Ported from the Claude Design system
+ (_ds/subturtle-design-system-main-…/tokens/*.css). Token NAMES are kept byte-identical to
+ the design source so this file and the .dc.html screens can be read side by side.
+
+ One deliberate difference: colors are stored as space-separated RGB channels rather than
+ hex, so Tailwind can compose them as `rgb(var(--token) / )`. That is what
+ makes opacity modifiers (`st-bg-primary/5`, the ambient blobs) work, and it is the hook a
+ dark theme will use — a dark palette is then a pure-CSS override of this block, with no
+ component changes. Write raw CSS against them as `rgb(var(--rose-500))`.
+ ============================================================ */
+
+:root {
+ /* ---- Brand: Rose (primary) ---------------------------- */
+ --rose-50: 255 241 245;
+ --rose-100: 255 227 236;
+ --rose-200: 254 205 218;
+ --rose-300: 253 164 189;
+ --rose-400: 251 111 150;
+ --rose-500: 249 30 90; /* #f91e5a — the brand mark */
+ --rose-600: 227 11 75;
+ --rose-700: 189 8 64;
+ --rose-800: 156 10 58;
+ --rose-900: 132 13 54;
+
+ /* ---- Grow: Jade (secondary / progress) ---------------- */
+ --jade-50: 236 253 246;
+ --jade-100: 210 249 232;
+ --jade-200: 168 240 211;
+ --jade-300: 110 226 185;
+ --jade-400: 52 205 156;
+ --jade-500: 20 180 133; /* #14b485 */
+ --jade-600: 10 145 108;
+ --jade-700: 9 116 88;
+ --jade-800: 10 92 71;
+ --jade-900: 9 76 60;
+
+ /* ---- Neutrals: warm mauve-gray ------------------------ */
+ --ink-950: 27 22 32;
+ --ink-900: 39 31 45;
+ --ink-800: 56 47 63;
+ --ink-700: 77 68 85;
+ --ink-600: 102 92 110;
+ --ink-500: 133 122 141;
+ --ink-400: 165 157 172;
+ --ink-300: 201 194 207;
+ --ink-200: 230 224 234;
+ --ink-150: 238 233 241;
+ --ink-100: 244 240 246;
+ --ink-50: 250 248 251;
+ --paper: 248 245 247;
+ --white: 255 255 255;
+
+ /* ---- Semantic hues ------------------------------------ */
+ --amber-100: 254 240 211;
+ --amber-500: 245 165 36;
+ --amber-600: 212 134 11;
+ --red-100: 255 226 226;
+ --red-500: 239 68 68;
+ --red-600: 217 45 45;
+ --sky-100: 220 241 254;
+ --sky-500: 31 156 240;
+ --sky-600: 13 127 205;
+
+ /* ---- Semantic aliases — reference these in product UI -- */
+ --color-primary: var(--rose-500);
+ --color-primary-hover: var(--rose-600);
+ --color-primary-press: var(--rose-700);
+ --color-primary-soft: var(--rose-100);
+ --color-primary-tint: var(--rose-50);
+ --color-on-primary: var(--white);
+
+ --color-accent: var(--jade-500);
+ --color-accent-hover: var(--jade-600);
+ --color-accent-soft: var(--jade-100);
+ --color-accent-tint: var(--jade-50);
+ --color-on-accent: var(--white);
+
+ --text-strong: var(--ink-950);
+ --text-body: var(--ink-800);
+ --text-muted: var(--ink-500);
+ --text-faint: var(--ink-400);
+ --text-on-dark: var(--white);
+ --text-link: var(--rose-600);
+
+ --surface-page: var(--paper);
+ --surface-card: var(--white);
+ --surface-sunken: var(--ink-100);
+ --surface-raised: var(--white);
+ --surface-inverse: var(--ink-950);
+ /* Channels, so callers pick their own alpha: rgb(var(--surface-overlay) / 0.45) */
+ --surface-overlay: var(--ink-950);
+
+ --border-subtle: var(--ink-200);
+ --border-default: var(--ink-300);
+ --border-strong: var(--ink-400);
+ /* A finished color, not channels — it is dropped straight into box-shadow. */
+ --ring-focus: rgb(249 30 90 / 0.35);
+
+ --color-success: var(--jade-500);
+ --color-success-soft: var(--jade-100);
+ --color-warning: var(--amber-500);
+ --color-warning-soft: var(--amber-100);
+ --color-danger: var(--red-500);
+ --color-danger-soft: var(--red-100);
+ --color-info: var(--sky-500);
+ --color-info-soft: var(--sky-100);
+
+ /* ---- Typography --------------------------------------- */
+ --font-sans: 'Nunito', ui-rounded, 'Segoe UI', system-ui, -apple-system, sans-serif;
+ --font-display: 'Nunito', ui-rounded, system-ui, sans-serif;
+ --font-mono: 'JetBrains Mono', ui-monospace, 'SFMono-Regular', Menlo, monospace;
+
+ --text-2xs: 0.6875rem; /* 11px — counters, micro-labels */
+ --text-xs: 0.75rem; /* 12px — captions, meta */
+ --text-sm: 0.875rem; /* 14px — secondary UI */
+ --text-base: 1rem; /* 16px — body */
+ --text-md: 1.125rem; /* 18px — lead body / card titles */
+ --text-lg: 1.375rem; /* 22px — section titles */
+ --text-xl: 1.75rem; /* 28px — page titles */
+ --text-2xl: 2.25rem; /* 36px — display */
+ --text-3xl: 3rem; /* 48px — hero */
+ --text-4xl: 3.75rem; /* 60px — big stats */
+
+ --leading-tight: 1.1;
+ --leading-snug: 1.25;
+ --leading-normal: 1.5;
+ --leading-relaxed: 1.65;
+
+ --tracking-tight: -0.02em;
+ --tracking-normal: 0;
+ --tracking-wide: 0.04em;
+ --tracking-caps: 0.12em; /* overlines / eyebrow labels */
+
+ /* ---- Spacing & layout (4px base grid) ----------------- */
+ --control-h-sm: 2rem; /* 32 */
+ --control-h-md: 2.5rem; /* 40 */
+ --control-h-lg: 3rem; /* 48 */
+ --card-pad: 1.5rem;
+ --card-pad-lg: 2rem;
+
+ --container-max: 80rem; /* 1280 */
+ --content-max: 44rem;
+ --sidebar-w: 17rem; /* 272 — StAppShell overrides this inline when collapsed */
+ --gutter: 1.5rem;
+ --gutter-lg: 2.5rem;
+
+ /* ---- Radius ------------------------------------------- */
+ --radius-xs: 6px;
+ --radius-sm: 10px;
+ --radius-md: 14px; /* inputs / small cards */
+ --radius-lg: 20px; /* cards */
+ --radius-xl: 28px; /* feature panels */
+ --radius-2xl: 36px; /* hero surfaces */
+ --radius-pill: 999px;
+ --radius-circle: 50%;
+
+ /* ---- Shadows (warm, soft, layered — never pure black) - */
+ --shadow-xs: 0 1px 2px rgb(39 31 45 / 0.06);
+ --shadow-sm: 0 1px 3px rgb(39 31 45 / 0.07), 0 1px 2px rgb(39 31 45 / 0.05);
+ --shadow-md: 0 4px 14px rgb(39 31 45 / 0.08), 0 2px 4px rgb(39 31 45 / 0.05);
+ --shadow-lg: 0 12px 30px rgb(39 31 45 / 0.1), 0 4px 10px rgb(39 31 45 / 0.05);
+ --shadow-xl: 0 24px 50px rgb(39 31 45 / 0.14), 0 8px 18px rgb(39 31 45 / 0.06);
+ --shadow-primary: 0 8px 22px rgb(249 30 90 / 0.3);
+ --shadow-accent: 0 8px 22px rgb(20 180 133 / 0.28);
+ --shadow-inset: inset 0 1px 2px rgb(39 31 45 / 0.08);
+
+ /* ---- Motion ------------------------------------------- */
+ --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
+ --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
+ --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
+ --dur-fast: 120ms;
+ --dur-base: 200ms;
+ --dur-slow: 360ms;
+
+ /* ---- Z-index ------------------------------------------ */
+ --z-sticky: 100;
+ --z-overlay: 200;
+ --z-modal: 300;
+ --z-toast: 400;
+ --z-tooltip: 500;
+}
+
+/*
+ * Dark theme — intentionally empty for now.
+ *
+ * The design system ships light values only, and the product keeps its theme switcher, so
+ * toggling dark currently leaves anything built on this library in its light palette. When
+ * dark lands, redefine the semantic aliases here (--text-*, --surface-*, --border-*, and the
+ * --color-* pairs); no component should need to change.
+ */
+:root.dark {
+ /* TODO: dark palette. */
+}
diff --git a/ui/src/types/index.ts b/ui/src/types/index.ts
new file mode 100644
index 00000000..d331aa2a
--- /dev/null
+++ b/ui/src/types/index.ts
@@ -0,0 +1,20 @@
+/** A single entry in the sidebar. `id` is what `@navigate` emits and what `active` matches. */
+export interface StNavItem {
+ id: string;
+ label: string;
+ /** Iconify name, e.g. 'solar:chart-2-bold-duotone'. Must be in the generated icon set. */
+ icon?: string;
+ /** Rendered when not null/undefined — `0` is shown, matching the design. */
+ badge?: string | number | null;
+}
+
+export interface StNavGroup {
+ /** Uppercase eyebrow above the group. Omit for an unlabelled group. */
+ section?: string;
+ items: StNavItem[];
+}
+
+export type StTone = 'primary' | 'accent' | 'neutral' | 'danger';
+export type StSize = 'sm' | 'md' | 'lg';
+export type StPadding = 'none' | 'sm' | 'md' | 'lg';
+export type StElevation = 'none' | 'sm' | 'md' | 'lg';
diff --git a/ui/tailwind-tokens.cjs b/ui/tailwind-tokens.cjs
new file mode 100644
index 00000000..20407589
--- /dev/null
+++ b/ui/tailwind-tokens.cjs
@@ -0,0 +1,103 @@
+/**
+ * Design tokens exposed to a CONSUMING app's Tailwind config.
+ *
+ * The library's own components compile against tailwind.config.cjs and ship as static CSS, so
+ * they need none of this. But an app also writes page-level markup in the design system's
+ * language, and its Tailwind knows nothing about our tokens. Spread this into `theme.extend`
+ * to get an `st-` namespace beside the app's existing scales:
+ *
+ * // tailwind.config.cjs
+ * const stTokens = require('subturtle-ui/tailwind-tokens');
+ * theme: { extend: { ...stTokens } }
+ *
+ *
+ *
+ * Everything resolves to the CSS custom properties in dist/style.css, so values have exactly
+ * one source of truth (src/styles/tokens.css) and a future dark theme reaches app markup too.
+ * Names are additive — no existing app color, radius or size is touched.
+ */
+const c = (token) => `rgb(var(${token}) /
)`;
+
+module.exports = {
+ colors: {
+ st: {
+ primary: c('--color-primary'),
+ 'primary-hover': c('--color-primary-hover'),
+ 'primary-soft': c('--color-primary-soft'),
+ 'primary-tint': c('--color-primary-tint'),
+ accent: c('--color-accent'),
+ 'accent-soft': c('--color-accent-soft'),
+
+ strong: c('--text-strong'),
+ body: c('--text-body'),
+ muted: c('--text-muted'),
+ faint: c('--text-faint'),
+ link: c('--text-link'),
+
+ page: c('--surface-page'),
+ card: c('--surface-card'),
+ sunken: c('--surface-sunken'),
+ inverse: c('--surface-inverse'),
+ line: c('--border-subtle'),
+
+ success: c('--color-success'),
+ 'success-soft': c('--color-success-soft'),
+ warning: c('--color-warning'),
+ 'warning-soft': c('--color-warning-soft'),
+ danger: c('--color-danger'),
+ 'danger-soft': c('--color-danger-soft'),
+ info: c('--color-info'),
+ 'info-soft': c('--color-info-soft'),
+
+ 'rose-400': c('--rose-400'),
+ 'rose-600': c('--rose-600'),
+ 'rose-700': c('--rose-700'),
+ 'jade-600': c('--jade-600'),
+ 'jade-700': c('--jade-700'),
+ 'amber-600': c('--amber-600'),
+ 'sky-600': c('--sky-600'),
+ 'ink-100': c('--ink-100'),
+ 'ink-150': c('--ink-150'),
+ 'ink-300': c('--ink-300'),
+ 'ink-800': c('--ink-800'),
+ 'ink-950': c('--ink-950'),
+ },
+ },
+ fontFamily: {
+ 'st-display': 'var(--font-display)',
+ 'st-sans': 'var(--font-sans)',
+ },
+ fontSize: {
+ 'st-2xs': 'var(--text-2xs)',
+ 'st-xs': 'var(--text-xs)',
+ 'st-sm': 'var(--text-sm)',
+ 'st-base': 'var(--text-base)',
+ 'st-md': 'var(--text-md)',
+ 'st-lg': 'var(--text-lg)',
+ 'st-xl': 'var(--text-xl)',
+ 'st-2xl': 'var(--text-2xl)',
+ 'st-3xl': 'var(--text-3xl)',
+ },
+ letterSpacing: {
+ 'st-tight': 'var(--tracking-tight)',
+ 'st-caps': 'var(--tracking-caps)',
+ },
+ borderRadius: {
+ 'st-sm': 'var(--radius-sm)',
+ 'st-md': 'var(--radius-md)',
+ 'st-lg': 'var(--radius-lg)',
+ 'st-xl': 'var(--radius-xl)',
+ 'st-pill': 'var(--radius-pill)',
+ },
+ boxShadow: {
+ 'st-xs': 'var(--shadow-xs)',
+ 'st-sm': 'var(--shadow-sm)',
+ 'st-md': 'var(--shadow-md)',
+ 'st-lg': 'var(--shadow-lg)',
+ 'st-primary': 'var(--shadow-primary)',
+ },
+ maxWidth: {
+ 'st-container': 'var(--container-max)',
+ 'st-content': 'var(--content-max)',
+ },
+};
diff --git a/ui/tailwind.config.cjs b/ui/tailwind.config.cjs
new file mode 100644
index 00000000..ec14a96b
--- /dev/null
+++ b/ui/tailwind.config.cjs
@@ -0,0 +1,158 @@
+/**
+ * Library-private Tailwind config.
+ *
+ * Two properties matter and must not be changed casually:
+ * - `prefix: 'st-'` keeps every emitted class out of the host app's namespace. The compiled
+ * dist/style.css loads alongside the consumer's own Tailwind build, so an unprefixed
+ * `.rounded-lg` or `.bg-primary` would silently fight it and load order would decide.
+ * - preflight is off, so the library never injects a global reset into a host page.
+ *
+ * Because of those two, this config never has to agree with any consumer's Tailwind config.
+ * Colors resolve through CSS custom properties (space-separated RGB channels) so opacity
+ * modifiers work and a future dark theme is a pure-CSS change. See src/styles/tokens.css.
+ */
+const c = (token) => `rgb(var(${token}) / )`;
+
+const scale = (name, steps) => Object.fromEntries(steps.map((s) => [String(s), c(`--${name}-${s}`)]));
+
+module.exports = {
+ prefix: 'st-',
+ darkMode: 'class',
+ content: ['./src/**/*.{vue,ts}'],
+ corePlugins: { preflight: false },
+ theme: {
+ colors: {
+ transparent: 'transparent',
+ current: 'currentColor',
+ inherit: 'inherit',
+ white: c('--white'),
+ paper: c('--paper'),
+ rose: scale('rose', [50, 100, 200, 300, 400, 500, 600, 700, 800, 900]),
+ jade: scale('jade', [50, 100, 200, 300, 400, 500, 600, 700, 800, 900]),
+ ink: scale('ink', [50, 100, 150, 200, 300, 400, 500, 600, 700, 800, 900, 950]),
+ amber: scale('amber', [100, 500, 600]),
+ red: scale('red', [100, 500, 600]),
+ sky: scale('sky', [100, 500, 600]),
+
+ primary: {
+ DEFAULT: c('--color-primary'),
+ hover: c('--color-primary-hover'),
+ press: c('--color-primary-press'),
+ soft: c('--color-primary-soft'),
+ tint: c('--color-primary-tint'),
+ on: c('--color-on-primary'),
+ },
+ accent: {
+ DEFAULT: c('--color-accent'),
+ hover: c('--color-accent-hover'),
+ soft: c('--color-accent-soft'),
+ tint: c('--color-accent-tint'),
+ on: c('--color-on-accent'),
+ },
+ success: { DEFAULT: c('--color-success'), soft: c('--color-success-soft') },
+ warning: { DEFAULT: c('--color-warning'), soft: c('--color-warning-soft') },
+ danger: { DEFAULT: c('--color-danger'), soft: c('--color-danger-soft') },
+ info: { DEFAULT: c('--color-info'), soft: c('--color-info-soft') },
+ },
+ extend: {
+ textColor: {
+ strong: c('--text-strong'),
+ body: c('--text-body'),
+ muted: c('--text-muted'),
+ faint: c('--text-faint'),
+ link: c('--text-link'),
+ 'on-dark': c('--text-on-dark'),
+ },
+ backgroundColor: {
+ page: c('--surface-page'),
+ card: c('--surface-card'),
+ sunken: c('--surface-sunken'),
+ raised: c('--surface-raised'),
+ inverse: c('--surface-inverse'),
+ },
+ borderColor: {
+ DEFAULT: c('--border-subtle'),
+ subtle: c('--border-subtle'),
+ strong: c('--border-strong'),
+ },
+ fontFamily: {
+ sans: 'var(--font-sans)',
+ display: 'var(--font-display)',
+ mono: 'var(--font-mono)',
+ },
+ fontSize: {
+ '2xs': 'var(--text-2xs)',
+ xs: 'var(--text-xs)',
+ sm: 'var(--text-sm)',
+ base: 'var(--text-base)',
+ md: 'var(--text-md)',
+ lg: 'var(--text-lg)',
+ xl: 'var(--text-xl)',
+ '2xl': 'var(--text-2xl)',
+ '3xl': 'var(--text-3xl)',
+ '4xl': 'var(--text-4xl)',
+ },
+ lineHeight: {
+ tight: 'var(--leading-tight)',
+ snug: 'var(--leading-snug)',
+ normal: 'var(--leading-normal)',
+ relaxed: 'var(--leading-relaxed)',
+ },
+ letterSpacing: {
+ tight: 'var(--tracking-tight)',
+ normal: 'var(--tracking-normal)',
+ wide: 'var(--tracking-wide)',
+ caps: 'var(--tracking-caps)',
+ },
+ borderRadius: {
+ none: '0',
+ xs: 'var(--radius-xs)',
+ sm: 'var(--radius-sm)',
+ md: 'var(--radius-md)',
+ lg: 'var(--radius-lg)',
+ xl: 'var(--radius-xl)',
+ '2xl': 'var(--radius-2xl)',
+ pill: 'var(--radius-pill)',
+ circle: 'var(--radius-circle)',
+ full: '9999px',
+ },
+ boxShadow: {
+ xs: 'var(--shadow-xs)',
+ sm: 'var(--shadow-sm)',
+ md: 'var(--shadow-md)',
+ lg: 'var(--shadow-lg)',
+ xl: 'var(--shadow-xl)',
+ primary: 'var(--shadow-primary)',
+ accent: 'var(--shadow-accent)',
+ inset: 'var(--shadow-inset)',
+ none: 'none',
+ },
+ transitionDuration: {
+ fast: 'var(--dur-fast)',
+ base: 'var(--dur-base)',
+ slow: 'var(--dur-slow)',
+ },
+ transitionTimingFunction: {
+ out: 'var(--ease-out)',
+ 'in-out': 'var(--ease-in-out)',
+ spring: 'var(--ease-spring)',
+ },
+ width: { sidebar: 'var(--sidebar-w)' },
+ maxWidth: { container: 'var(--container-max)', content: 'var(--content-max)' },
+ height: {
+ 'control-sm': 'var(--control-h-sm)',
+ 'control-md': 'var(--control-h-md)',
+ 'control-lg': 'var(--control-h-lg)',
+ },
+ padding: { card: 'var(--card-pad)', 'card-lg': 'var(--card-pad-lg)' },
+ zIndex: {
+ sticky: 'var(--z-sticky)',
+ overlay: 'var(--z-overlay)',
+ modal: 'var(--z-modal)',
+ toast: 'var(--z-toast)',
+ tooltip: 'var(--z-tooltip)',
+ },
+ },
+ },
+ plugins: [],
+};
diff --git a/ui/tsconfig.build.json b/ui/tsconfig.build.json
new file mode 100644
index 00000000..05861b52
--- /dev/null
+++ b/ui/tsconfig.build.json
@@ -0,0 +1,5 @@
+{
+ "extends": "./tsconfig.json",
+ "include": ["src/**/*.ts", "src/**/*.vue"],
+ "exclude": ["src/**/*.spec.ts", "src/**/*.test.ts"]
+}
diff --git a/ui/tsconfig.json b/ui/tsconfig.json
new file mode 100644
index 00000000..724e45f7
--- /dev/null
+++ b/ui/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "target": "ES2020",
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "strict": true,
+ "noUnusedLocals": true,
+ "jsx": "preserve",
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "declaration": true,
+ "emitDeclarationOnly": true,
+ "outDir": "dist",
+ "types": ["node"]
+ },
+ "include": ["src/**/*.ts", "src/**/*.vue", "vite.config.ts", "scripts/**/*.mjs"]
+}
diff --git a/ui/vite.config.ts b/ui/vite.config.ts
new file mode 100644
index 00000000..5b628d3a
--- /dev/null
+++ b/ui/vite.config.ts
@@ -0,0 +1,31 @@
+import { defineConfig } from 'vite';
+import vue from '@vitejs/plugin-vue';
+import dts from 'vite-plugin-dts';
+import { resolve } from 'node:path';
+
+export default defineConfig({
+ plugins: [
+ vue(),
+ // Emit real .d.ts instead of shipping src/ and pointing `types` at .ts files —
+ // that shortcut is why consuming pilotui needs a `// @ts-ignore` on its import.
+ dts({ tsconfigPath: './tsconfig.build.json', insertTypesEntry: true, rollupTypes: false }),
+ ],
+ build: {
+ lib: {
+ entry: resolve(__dirname, 'src/index.ts'),
+ formats: ['es', 'cjs'],
+ fileName: (format) => (format === 'es' ? 'index.js' : 'index.cjs'),
+ },
+ rollupOptions: {
+ external: ['vue'],
+ output: { globals: { vue: 'Vue' }, assetFileNames: 'style.css' },
+ },
+ cssCodeSplit: false,
+ sourcemap: true,
+ // Ship readable output and let each consumer's bundler minify. Beyond being the
+ // convention for libraries, esbuild's identifier mangling collided across the
+ // concatenated SFC modules here and produced a duplicate top-level binding that
+ // Rollup rejected downstream.
+ minify: false,
+ },
+});
diff --git a/ui/yarn.lock b/ui/yarn.lock
new file mode 100644
index 00000000..0bc9aef4
--- /dev/null
+++ b/ui/yarn.lock
@@ -0,0 +1,1549 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@alloc/quick-lru@^5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
+ integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==
+
+"@babel/helper-string-parser@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f"
+ integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==
+
+"@babel/helper-validator-identifier@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2"
+ integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==
+
+"@babel/parser@^7.29.8":
+ version "7.29.8"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.8.tgz#9653716a2f10c677b98fbc63d4bfb000c302cf17"
+ integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==
+ dependencies:
+ "@babel/types" "^7.29.8"
+
+"@babel/types@^7.29.8":
+ version "7.29.8"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.8.tgz#1229eef31d85156d70fa3f4cd859376d0eaf6863"
+ integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.29.7"
+ "@babel/helper-validator-identifier" "^7.29.7"
+
+"@esbuild/aix-ppc64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
+ integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
+
+"@esbuild/android-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
+ integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
+
+"@esbuild/android-arm@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
+ integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
+
+"@esbuild/android-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
+ integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
+
+"@esbuild/darwin-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
+ integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
+
+"@esbuild/darwin-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
+ integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
+
+"@esbuild/freebsd-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
+ integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
+
+"@esbuild/freebsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
+ integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
+
+"@esbuild/linux-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
+ integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
+
+"@esbuild/linux-arm@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
+ integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
+
+"@esbuild/linux-ia32@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
+ integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
+
+"@esbuild/linux-loong64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
+ integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
+
+"@esbuild/linux-mips64el@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
+ integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
+
+"@esbuild/linux-ppc64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
+ integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
+
+"@esbuild/linux-riscv64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
+ integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
+
+"@esbuild/linux-s390x@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
+ integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
+
+"@esbuild/linux-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
+ integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
+
+"@esbuild/netbsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
+ integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
+
+"@esbuild/openbsd-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
+ integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
+
+"@esbuild/sunos-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
+ integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
+
+"@esbuild/win32-arm64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
+ integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
+
+"@esbuild/win32-ia32@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
+ integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
+
+"@esbuild/win32-x64@0.21.5":
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
+ integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
+
+"@iconify/json@^2.2.319":
+ version "2.2.521"
+ resolved "https://registry.yarnpkg.com/@iconify/json/-/json-2.2.521.tgz#3ee4818f17be600fa979086124e50beda5af52da"
+ integrity sha512-A28AxL35ElpaZg1vk6tPf4/nJ/6KX+HGYVznyzaNYip0as9KTPfdqKxDI7A5mN4RXedxVOOugHN+nofxkUoEEQ==
+ dependencies:
+ "@iconify/types" "*"
+ pathe "^2.0.3"
+
+"@iconify/types@*":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57"
+ integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==
+
+"@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f"
+ integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5":
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
+ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
+
+"@jridgewell/trace-mapping@^0.3.24":
+ version "0.3.31"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0"
+ integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@microsoft/api-extractor-model@7.33.11":
+ version "7.33.11"
+ resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.33.11.tgz#bd0176a07f6aaa02da10c12283347ef7ad890a28"
+ integrity sha512-iDu1AtuRC2Z8XVs2SieZieVavF1FXPBX1C9pMexJh8Dx/Dd/3ZZ4nRQp/PU2Vk2rUHWuBz1wOyL4DcuhVnBXwg==
+ dependencies:
+ "@microsoft/tsdoc" "~0.16.0"
+ "@microsoft/tsdoc-config" "~0.18.1"
+ "@rushstack/node-core-library" "5.24.0"
+
+"@microsoft/api-extractor@^7.50.1":
+ version "7.59.0"
+ resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.59.0.tgz#a34506bcea6f2bd7c09c0f6c83589070291f1634"
+ integrity sha512-KDYV8kSVjmG8JJWVg1f1aKxteNG1IQ44D07Rjhlcci8wlqrSFNhUfgv7dJhwT0W2h3NDIL5Vz2f+/DfO4OpDHw==
+ dependencies:
+ "@microsoft/api-extractor-model" "7.33.11"
+ "@microsoft/tsdoc" "~0.16.0"
+ "@microsoft/tsdoc-config" "~0.18.1"
+ "@rushstack/node-core-library" "5.24.0"
+ "@rushstack/rig-package" "0.7.3"
+ "@rushstack/terminal" "0.24.3"
+ "@rushstack/ts-command-line" "5.3.13"
+ diff "~8.0.2"
+ minimatch "10.2.3"
+ resolve "~1.22.1"
+ semver "~7.7.4"
+ source-map "~0.6.1"
+ typescript "5.9.3"
+
+"@microsoft/tsdoc-config@~0.18.1":
+ version "0.18.1"
+ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.18.1.tgz#7c560bce62abb5f9681e4d231b9ac35553b7e86b"
+ integrity sha512-9brPoVdfN9k9g0dcWkFeA7IH9bbcttzDJlXvkf8b2OBzd5MueR1V2wkKBL0abn0otvmkHJC6aapBOTJDDeMCZg==
+ dependencies:
+ "@microsoft/tsdoc" "0.16.0"
+ ajv "~8.18.0"
+ jju "~1.4.0"
+ resolve "~1.22.2"
+
+"@microsoft/tsdoc@0.16.0", "@microsoft/tsdoc@~0.16.0":
+ version "0.16.0"
+ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.16.0.tgz#2249090633e04063176863a050c8f0808d2b6d2b"
+ integrity sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==
+
+"@napi-rs/lzma-linux-x64-gnu@1.5.1":
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz#e57d4306966078662038094fb38eb9146dc3aea9"
+ integrity sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@rollup/pluginutils@^5.1.4":
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.4.0.tgz#ac23a29ced0247060a210815fca39c17de4d2f26"
+ integrity sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==
+ dependencies:
+ "@types/estree" "^1.0.0"
+ estree-walker "^2.0.2"
+ picomatch "^4.0.2"
+
+"@rollup/rollup-android-arm-eabi@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.0.tgz#a85e4755658a6ab0ec48b41fdbc99375079755e1"
+ integrity sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA==
+
+"@rollup/rollup-android-arm64@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.0.tgz#b386ce4a3e6ea13c584e80eda2d8b6ae37006a5d"
+ integrity sha512-YC86tYIHK6M1IV+wbzO+Bxk8RCBr6ZyWYgWxUCzaZD8mc8rrFoIJDNzDrkHBYRc/wKdrsIXmm6/F7NzrAO+OrA==
+
+"@rollup/rollup-darwin-arm64@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.0.tgz#7da6d7ff7a21d38dca15c28507a0120e508a42d0"
+ integrity sha512-oI+ECtUcli0y0fi4xpW82GdPIXdTkI8G8DSjG2LRuw09fPAGykaWYH/hXxiKuTxiAjiPSTIIuYUqof5Z2hShWw==
+
+"@rollup/rollup-darwin-x64@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.0.tgz#00986c8203efeada43f44801f4a6c7e646e560e4"
+ integrity sha512-NwV+1s7TiKrMe4owHyKB/dTLD7ZJD0YEBEhIz+hvav1Cu1GReJjF+rsdNwjzENQeIAbE/CoNiaAc5Vz2h5DPAA==
+
+"@rollup/rollup-freebsd-arm64@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.0.tgz#25d2a948024bd551ed4ad1faa8e4e25b89ada7bb"
+ integrity sha512-tWtHBTu5gOPK4u4Urtk4qAHW3zZ9rQAmbssO8gp7ELvGTGI3aCiq6NqyTQ0PCIg7KbHJF2UkGDDs77YZGxfjCA==
+
+"@rollup/rollup-freebsd-x64@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.0.tgz#a7448db8a4d07097f5b727e2359632a2041a514b"
+ integrity sha512-2qPoJiwTvtHQ27NnYvTnsgk8laXWYuVmNESG8WFZBcEPKLfZ3I27qBJarjVRQtwGeYyRfq5ZowHXih9lm2BItw==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.0.tgz#850cf21fc8ea7ceb22d9781049ea066bb2cad0d1"
+ integrity sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w==
+
+"@rollup/rollup-linux-arm-musleabihf@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.0.tgz#48275b693ad399b9321fcc11884436c3eecb735c"
+ integrity sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw==
+
+"@rollup/rollup-linux-arm64-gnu@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.0.tgz#2614ef8601b783d2a1a985afb98e96386908b6a1"
+ integrity sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q==
+
+"@rollup/rollup-linux-arm64-musl@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.0.tgz#a1b95051d08bb14140bd235969405b4fc6be4603"
+ integrity sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA==
+
+"@rollup/rollup-linux-loong64-gnu@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.0.tgz#0214c140ddef6e6bb8aa77695e9fc5dce23be59f"
+ integrity sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg==
+
+"@rollup/rollup-linux-loong64-musl@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.0.tgz#d7a86499ce332a6e6c0383a65c43268bfae1cd7a"
+ integrity sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ==
+
+"@rollup/rollup-linux-ppc64-gnu@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.0.tgz#1f8a5d547b939116992b95b6add8bf58cfe10044"
+ integrity sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw==
+
+"@rollup/rollup-linux-ppc64-musl@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.0.tgz#1da3aabff9c28f904feda2fa5de2df3c8cbb0d63"
+ integrity sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA==
+
+"@rollup/rollup-linux-riscv64-gnu@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.0.tgz#9d72f4b78fc8207b9e6992fa9709c5811864887d"
+ integrity sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA==
+
+"@rollup/rollup-linux-riscv64-musl@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.0.tgz#8c46c680896832a4bff3b6f8fcc29608c1198bac"
+ integrity sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ==
+
+"@rollup/rollup-linux-s390x-gnu@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.0.tgz#aedd6de425fd7f985719a89f4505d279115fc322"
+ integrity sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ==
+
+"@rollup/rollup-linux-x64-gnu@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.0.tgz#395bdd1c0573a9df6adea131fd8946d5c2ba2e1a"
+ integrity sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A==
+
+"@rollup/rollup-linux-x64-musl@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.0.tgz#3350c151d4035083ccd224348c0bdcc389725f73"
+ integrity sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw==
+
+"@rollup/rollup-openbsd-x64@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.0.tgz#5b477381b7d012c35f0aa5e4c7e9417b53e55e27"
+ integrity sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA==
+
+"@rollup/rollup-openharmony-arm64@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.0.tgz#5df574fd964511133c700f0e4525fb50866a4bce"
+ integrity sha512-XvRb5vfW3wAZQ+ZUG21AnHHDKtNcw99eigzEhjr//NZ3u7SoBaPP0seSc7FgP7p1epAEdAoZckMW9WY/+4w70w==
+
+"@rollup/rollup-win32-arm64-msvc@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.0.tgz#e47eb3cdf12a7b1b380083031d90325469d022f3"
+ integrity sha512-iZPmniy4kNBf5yo2RezbkYNNK5HPbXE9+g+twnbqSng7dtLEJy1SKoxiE/ni4FDacjyuZpEeb9U054N4EoKHYw==
+
+"@rollup/rollup-win32-ia32-msvc@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.0.tgz#ea3b85d79b84ea5d07277e5abb4f48842fe41837"
+ integrity sha512-mFBBd+LF37fnE8JnYUOH+imj0aPFPK30vpar4ehJkgnLj9sZn8ZxiRENmLtgIwxK7TC8klF6N57fxdNBwQoqOA==
+
+"@rollup/rollup-win32-x64-gnu@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.0.tgz#19e613c75237f09bdd744955549e785ef767836a"
+ integrity sha512-ujeqEY3B+zbGn3Z4Q03cUBG/LGWnBJncVT36WER31LcOsQk9+1dmINKKtvmmfChUvRbK1G0R8OhMWFgHgaZtAw==
+
+"@rollup/rollup-win32-x64-msvc@4.63.0":
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.0.tgz#2cfd1741b6693f78debdde1a5d4faa05bb75a349"
+ integrity sha512-hncn90N4sOky0L2LKE5oESKLbxCPeVo4eLA2LSMoDzM+879ml4WSr+Rr4DWknNIVVvS1Hirkc9hx02W6YxS8rQ==
+
+"@rushstack/node-core-library@5.24.0":
+ version "5.24.0"
+ resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-5.24.0.tgz#036c5cfc3b61ed6f5d7f02bfa0a4c6998c88b75c"
+ integrity sha512-g/Z47ZwARn/VkTnHcyJslrR26erRf1G5JbqPlfGZGBCrOcrEt8fTQXXDVhUDDNl/g/v3TXI1dNiAAT5FEks8BA==
+ dependencies:
+ ajv "~8.20.0"
+ ajv-draft-04 "~1.0.0"
+ ajv-formats "~3.0.1"
+ fs-extra "~11.3.0"
+ import-lazy "~4.0.0"
+ jju "~1.4.0"
+ resolve "~1.22.1"
+ semver "~7.7.4"
+
+"@rushstack/problem-matcher@0.2.1":
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/@rushstack/problem-matcher/-/problem-matcher-0.2.1.tgz#e9f6cac2dd6a882d60e76a8d4462b7d24b4f17e5"
+ integrity sha512-gulfhBs6n+I5b7DvjKRfhMGyUejtSgOHTclF/eONr8hcgF1APEDjhxIsfdUYYMzC3rvLwGluqLjbwCFZ8nxrog==
+
+"@rushstack/rig-package@0.7.3":
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.7.3.tgz#d28a5440b1e9f43046727ba7009d18d99314f251"
+ integrity sha512-aAA518n6wxxjCfnTAOjQnm7ngNE0FVHxHAw2pxKlIhxrMn0XQjGcXKF0oKWpjBgJOmsaJpVob/v+zr3zxgPWuA==
+ dependencies:
+ jju "~1.4.0"
+ resolve "~1.22.1"
+
+"@rushstack/terminal@0.24.3":
+ version "0.24.3"
+ resolved "https://registry.yarnpkg.com/@rushstack/terminal/-/terminal-0.24.3.tgz#008e35748d892789caadb67b0201ec22433df6b1"
+ integrity sha512-KxphDhPGC4xDrKg8O4yrWCEpPMi87aJc1iycXqMVh1dLgV0M34hiH9ZTgWjBRmcrT/OIHoOeWf48npcQFzgp+g==
+ dependencies:
+ "@rushstack/node-core-library" "5.24.0"
+ "@rushstack/problem-matcher" "0.2.1"
+ supports-color "~8.1.1"
+
+"@rushstack/ts-command-line@5.3.13":
+ version "5.3.13"
+ resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-5.3.13.tgz#9fef63098215bb6490ede5bde5345df5d3cc8038"
+ integrity sha512-+jNbxhh8CkrZYxMk9X3GRYM2+Myr1xCCj+eHbJ9Vp+PCdNHS0TUl5QQFT6UbM/aTFRCzs5jiBTKYzBRpe5uYbQ==
+ dependencies:
+ "@rushstack/terminal" "0.24.3"
+ "@types/argparse" "1.0.38"
+ argparse "~1.0.9"
+ string-argv "~0.3.1"
+
+"@types/argparse@1.0.38":
+ version "1.0.38"
+ resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9"
+ integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==
+
+"@types/estree@1.0.9", "@types/estree@^1.0.0":
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24"
+ integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==
+
+"@types/node@^26.4.0":
+ version "26.4.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-26.4.0.tgz#4c4ca071c42241fe602741d02999f16b4e64c468"
+ integrity sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==
+ dependencies:
+ undici-types "~8.3.0"
+
+"@vitejs/plugin-vue@^5.2.1":
+ version "5.2.4"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz#9e8a512eb174bfc2a333ba959bbf9de428d89ad8"
+ integrity sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==
+
+"@volar/language-core@2.4.15":
+ version "2.4.15"
+ resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.15.tgz#759d04cb4eab9920560b8bcfa4515d5b08a1b7ce"
+ integrity sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==
+ dependencies:
+ "@volar/source-map" "2.4.15"
+
+"@volar/language-core@2.4.28", "@volar/language-core@~2.4.11":
+ version "2.4.28"
+ resolved "https://registry.yarnpkg.com/@volar/language-core/-/language-core-2.4.28.tgz#c21f365a91c1dffe8bd7264fd491770c8d74fef3"
+ integrity sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==
+ dependencies:
+ "@volar/source-map" "2.4.28"
+
+"@volar/source-map@2.4.15":
+ version "2.4.15"
+ resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.15.tgz#18aba09994c0268e59a418f9d738e4a85302781d"
+ integrity sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==
+
+"@volar/source-map@2.4.28":
+ version "2.4.28"
+ resolved "https://registry.yarnpkg.com/@volar/source-map/-/source-map-2.4.28.tgz#b40254e8c96199e5f1e0796777c593c617ad270e"
+ integrity sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==
+
+"@volar/typescript@2.4.15":
+ version "2.4.15"
+ resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.15.tgz#1445d23f8e4f9ad821b6bfa58cf4a2b980dc5f97"
+ integrity sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==
+ dependencies:
+ "@volar/language-core" "2.4.15"
+ path-browserify "^1.0.1"
+ vscode-uri "^3.0.8"
+
+"@volar/typescript@^2.4.11":
+ version "2.4.28"
+ resolved "https://registry.yarnpkg.com/@volar/typescript/-/typescript-2.4.28.tgz#83f86356e84eb101b8081a44c104f2f2ced8411f"
+ integrity sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==
+ dependencies:
+ "@volar/language-core" "2.4.28"
+ path-browserify "^1.0.1"
+ vscode-uri "^3.0.8"
+
+"@vue/compiler-core@3.5.42":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.42.tgz#9d159ca5b1e7d792a42e9b1ddf2fc31edc9333dc"
+ integrity sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==
+ dependencies:
+ "@babel/parser" "^7.29.8"
+ "@vue/shared" "3.5.42"
+ entities "^7.0.1"
+ estree-walker "^2.0.2"
+ source-map-js "^1.2.1"
+
+"@vue/compiler-dom@3.5.42", "@vue/compiler-dom@^3.5.0":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz#2ac9570010bbffb7c08d8a904a956ecbabcdf6c6"
+ integrity sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==
+ dependencies:
+ "@vue/compiler-core" "3.5.42"
+ "@vue/shared" "3.5.42"
+
+"@vue/compiler-sfc@3.5.42":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.42.tgz#502c50e7864a980b7f147b78974e3b49fefcc16d"
+ integrity sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==
+ dependencies:
+ "@babel/parser" "^7.29.8"
+ "@vue/compiler-core" "3.5.42"
+ "@vue/compiler-dom" "3.5.42"
+ "@vue/compiler-ssr" "3.5.42"
+ "@vue/shared" "3.5.42"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.21"
+ postcss "^8.5.19"
+ source-map-js "^1.2.1"
+
+"@vue/compiler-ssr@3.5.42":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.42.tgz#a3121ad517e9062121762e452f125674cc6162fa"
+ integrity sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==
+ dependencies:
+ "@vue/compiler-dom" "3.5.42"
+ "@vue/shared" "3.5.42"
+
+"@vue/compiler-vue2@^2.7.16":
+ version "2.7.16"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz#2ba837cbd3f1b33c2bc865fbe1a3b53fb611e249"
+ integrity sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==
+ dependencies:
+ de-indent "^1.0.2"
+ he "^1.2.0"
+
+"@vue/language-core@2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.2.0.tgz#e48c54584f889f78b120ce10a050dfb316c7fcdf"
+ integrity sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==
+ dependencies:
+ "@volar/language-core" "~2.4.11"
+ "@vue/compiler-dom" "^3.5.0"
+ "@vue/compiler-vue2" "^2.7.16"
+ "@vue/shared" "^3.5.0"
+ alien-signals "^0.4.9"
+ minimatch "^9.0.3"
+ muggle-string "^0.4.1"
+ path-browserify "^1.0.1"
+
+"@vue/language-core@2.2.12":
+ version "2.2.12"
+ resolved "https://registry.yarnpkg.com/@vue/language-core/-/language-core-2.2.12.tgz#d01f7e865f593f968cb65c12a13d8337e65641f0"
+ integrity sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==
+ dependencies:
+ "@volar/language-core" "2.4.15"
+ "@vue/compiler-dom" "^3.5.0"
+ "@vue/compiler-vue2" "^2.7.16"
+ "@vue/shared" "^3.5.0"
+ alien-signals "^1.0.3"
+ minimatch "^9.0.3"
+ muggle-string "^0.4.1"
+ path-browserify "^1.0.1"
+
+"@vue/reactivity@3.5.42":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.42.tgz#800220f023d36fd04d94460c7c7ab5808f8ae75f"
+ integrity sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==
+ dependencies:
+ "@vue/shared" "3.5.42"
+
+"@vue/runtime-core@3.5.42":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.42.tgz#a8af85746d6f9a9f1f8e4626be24eb0b8c9a1e72"
+ integrity sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==
+ dependencies:
+ "@vue/reactivity" "3.5.42"
+ "@vue/shared" "3.5.42"
+
+"@vue/runtime-dom@3.5.42":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.42.tgz#c7b487a92b2c381db547c1aa5040bd7febb40448"
+ integrity sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==
+ dependencies:
+ "@vue/reactivity" "3.5.42"
+ "@vue/runtime-core" "3.5.42"
+ "@vue/shared" "3.5.42"
+ csstype "^3.2.3"
+
+"@vue/server-renderer@3.5.42":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.42.tgz#27c3d4743273bf7e839fc5a5e2f7db25e8d779e8"
+ integrity sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==
+ dependencies:
+ "@vue/compiler-ssr" "3.5.42"
+ "@vue/runtime-dom" "3.5.42"
+ "@vue/shared" "3.5.42"
+
+"@vue/shared@3.5.42", "@vue/shared@^3.5.0":
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.42.tgz#a413cf21262502662354cda3b65ab31bca979202"
+ integrity sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==
+
+acorn@^8.16.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940"
+ integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==
+
+ajv-draft-04@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz#3b64761b268ba0b9e668f0b41ba53fce0ad77fc8"
+ integrity sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==
+
+ajv-formats@~3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578"
+ integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==
+ dependencies:
+ ajv "^8.0.0"
+
+ajv@^8.0.0, ajv@~8.20.0:
+ version "8.20.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9"
+ integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
+ajv@~8.18.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc"
+ integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
+alien-signals@^0.4.9:
+ version "0.4.14"
+ resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-0.4.14.tgz#9ff8f72a272300a51692f54bd9bbbada78fbf539"
+ integrity sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==
+
+alien-signals@^1.0.3:
+ version "1.0.13"
+ resolved "https://registry.yarnpkg.com/alien-signals/-/alien-signals-1.0.13.tgz#8d6db73462f742ee6b89671fbd8c37d0b1727a7e"
+ integrity sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==
+
+any-promise@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+ integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==
+
+anymatch@~3.1.2:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
+ integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==
+
+argparse@~1.0.9:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+autoprefixer@^10.4.20:
+ version "10.5.4"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.5.4.tgz#3b7dd848b4155514a95ad1f6ce598844bea09697"
+ integrity sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==
+ dependencies:
+ browserslist "^4.28.6"
+ caniuse-lite "^1.0.30001806"
+ fraction.js "^5.3.4"
+ picocolors "^1.1.1"
+ postcss-value-parser "^4.2.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+balanced-match@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a"
+ integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==
+
+baseline-browser-mapping@^2.11.12:
+ version "2.11.19"
+ resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.19.tgz#4711abac48b88ccb56b5817e86f1b3a9a0764276"
+ integrity sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw==
+
+binary-extensions@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522"
+ integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
+
+brace-expansion@^2.0.2:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.4.tgz#589dab11c0018d0366be64cd8bf12c8dbecc8326"
+ integrity sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==
+ dependencies:
+ balanced-match "^1.0.0"
+
+brace-expansion@^5.0.2:
+ version "5.0.9"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.9.tgz#7c72438809b5fa5babf54199a1f1c281a6984fcf"
+ integrity sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==
+ dependencies:
+ balanced-match "^4.0.2"
+
+braces@^3.0.3, braces@~3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+browserslist@^4.28.6:
+ version "4.28.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.8.tgz#a3c79ceb70028527e5da7dafc887f3200b5168c0"
+ integrity sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==
+ dependencies:
+ baseline-browser-mapping "^2.11.12"
+ caniuse-lite "^1.0.30001809"
+ electron-to-chromium "^1.5.402"
+ node-releases "^2.0.53"
+ update-browserslist-db "^1.3.0"
+
+camelcase-css@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5"
+ integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==
+
+caniuse-lite@^1.0.30001806, caniuse-lite@^1.0.30001809:
+ version "1.0.30001810"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz#4970b477dea3278374de9bc43aa8f5d39fc3cda2"
+ integrity sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==
+
+chokidar@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
+ integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+commander@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+ integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
+compare-versions@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-6.1.1.tgz#7af3cc1099ba37d244b3145a9af5201b629148a9"
+ integrity sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==
+
+confbox@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.8.tgz#820d73d3b3c82d9bd910652c5d4d599ef8ff8b06"
+ integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==
+
+confbox@^0.2.4:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.2.4.tgz#592e7be71f882a4a874e3c88f0ac1ef6f7da1ce5"
+ integrity sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+csstype@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a"
+ integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
+
+de-indent@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+ integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
+
+debug@^4.4.0:
+ version "4.4.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
+ dependencies:
+ ms "^2.1.3"
+
+didyoumean@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
+ integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
+
+diff@~8.0.2:
+ version "8.0.4"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-8.0.4.tgz#4f5baf3188b9b2431117b962eb20ba330fadf696"
+ integrity sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==
+
+dlv@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
+ integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
+
+electron-to-chromium@^1.5.402:
+ version "1.5.415"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.415.tgz#edd7356bfb4752a12c8293f8e38a00778b13bbb4"
+ integrity sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==
+
+entities@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b"
+ integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+esbuild@^0.21.3:
+ version "0.21.5"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
+ integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.21.5"
+ "@esbuild/android-arm" "0.21.5"
+ "@esbuild/android-arm64" "0.21.5"
+ "@esbuild/android-x64" "0.21.5"
+ "@esbuild/darwin-arm64" "0.21.5"
+ "@esbuild/darwin-x64" "0.21.5"
+ "@esbuild/freebsd-arm64" "0.21.5"
+ "@esbuild/freebsd-x64" "0.21.5"
+ "@esbuild/linux-arm" "0.21.5"
+ "@esbuild/linux-arm64" "0.21.5"
+ "@esbuild/linux-ia32" "0.21.5"
+ "@esbuild/linux-loong64" "0.21.5"
+ "@esbuild/linux-mips64el" "0.21.5"
+ "@esbuild/linux-ppc64" "0.21.5"
+ "@esbuild/linux-riscv64" "0.21.5"
+ "@esbuild/linux-s390x" "0.21.5"
+ "@esbuild/linux-x64" "0.21.5"
+ "@esbuild/netbsd-x64" "0.21.5"
+ "@esbuild/openbsd-x64" "0.21.5"
+ "@esbuild/sunos-x64" "0.21.5"
+ "@esbuild/win32-arm64" "0.21.5"
+ "@esbuild/win32-ia32" "0.21.5"
+ "@esbuild/win32-x64" "0.21.5"
+
+escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+estree-walker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+exsolve@^1.0.8:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/exsolve/-/exsolve-1.1.1.tgz#c055418255459b6ecde4e59de0060a3e97bc7572"
+ integrity sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==
+
+fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.3.2:
+ version "3.3.3"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
+ integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.8"
+
+fast-uri@^3.0.1:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.6.tgz#bfdd308ef763f835fed059f3c6c925f708e33e3a"
+ integrity sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==
+
+fastq@^1.6.0:
+ version "1.20.1"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675"
+ integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==
+ dependencies:
+ reusify "^1.0.4"
+
+fdir@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350"
+ integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+fraction.js@^5.3.4:
+ version "5.3.4"
+ resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-5.3.4.tgz#8c0fcc6a9908262df4ed197427bdeef563e0699a"
+ integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==
+
+fs-extra@~11.3.0:
+ version "11.3.6"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.6.tgz#f7cb80e9df550cd1db6f537fa5cdd568d3e70d10"
+ integrity sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+hasown@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003"
+ integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==
+ dependencies:
+ function-bind "^1.1.2"
+
+he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+import-lazy@~4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
+ integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-core-module@^2.16.1:
+ version "2.16.2"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082"
+ integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==
+ dependencies:
+ hasown "^2.0.3"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+jiti@^1.21.7:
+ version "1.21.7"
+ resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9"
+ integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==
+
+jju@~1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a"
+ integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+jsonfile@^6.0.1:
+ version "6.2.1"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.1.tgz#b6e31717f22cc37330b081ce0051ed5de53af2f6"
+ integrity sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+kolorist@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/kolorist/-/kolorist-1.8.0.tgz#edddbbbc7894bc13302cdf740af6374d4a04743c"
+ integrity sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==
+
+lilconfig@^3.1.1, lilconfig@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4"
+ integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+local-pkg@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/local-pkg/-/local-pkg-1.2.1.tgz#9628389399851d78f3b50c9236eddb02f0c31b2b"
+ integrity sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==
+ dependencies:
+ mlly "^1.7.4"
+ pkg-types "^2.3.0"
+ quansync "^0.2.11"
+
+magic-string@^0.30.17, magic-string@^0.30.21:
+ version "0.30.21"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91"
+ integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.5"
+
+merge2@^1.3.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+minimatch@10.2.3:
+ version "10.2.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.3.tgz#c0ef582f21071b0123a5bbf275252ebda921fbf6"
+ integrity sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==
+ dependencies:
+ brace-expansion "^5.0.2"
+
+minimatch@^9.0.3:
+ version "9.0.9"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e"
+ integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==
+ dependencies:
+ brace-expansion "^2.0.2"
+
+mlly@^1.7.4:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.8.2.tgz#e7f7919a82d13b174405613117249a3f449d78bb"
+ integrity sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==
+ dependencies:
+ acorn "^8.16.0"
+ pathe "^2.0.3"
+ pkg-types "^1.3.1"
+ ufo "^1.6.3"
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+muggle-string@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328"
+ integrity sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==
+
+mz@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+ integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+ dependencies:
+ any-promise "^1.0.0"
+ object-assign "^4.0.1"
+ thenify-all "^1.0.0"
+
+nanoid@^3.3.17:
+ version "3.3.18"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.18.tgz#f66a2de1199ffde0fcf21c8a5f13106b1c081913"
+ integrity sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==
+
+node-releases@^2.0.53:
+ version "2.0.53"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.53.tgz#0fe5ad8a7935e075172f574e56f0c20f07fa41af"
+ integrity sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+object-assign@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-hash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9"
+ integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==
+
+path-browserify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
+ integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+pathe@^2.0.1, pathe@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/pathe/-/pathe-2.0.3.tgz#3ecbec55421685b70a9da872b2cff3e1cbed1716"
+ integrity sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==
+
+picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601"
+ integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==
+
+picomatch@^4.0.2, picomatch@^4.0.4:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.7.tgz#6313360034ccb36b3dc61ecbdff78121f90fe21f"
+ integrity sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==
+
+pirates@^4.0.1:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22"
+ integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==
+
+pkg-types@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.3.1.tgz#bd7cc70881192777eef5326c19deb46e890917df"
+ integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==
+ dependencies:
+ confbox "^0.1.8"
+ mlly "^1.7.4"
+ pathe "^2.0.1"
+
+pkg-types@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-2.3.1.tgz#fa27ed0940efcf40bba453b0e5cab41217b0d442"
+ integrity sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==
+ dependencies:
+ confbox "^0.2.4"
+ exsolve "^1.0.8"
+ pathe "^2.0.3"
+
+postcss-import@^15.1.0:
+ version "15.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70"
+ integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==
+ dependencies:
+ postcss-value-parser "^4.0.0"
+ read-cache "^1.0.0"
+ resolve "^1.1.7"
+
+postcss-js@^4.0.1:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.1.0.tgz#003b63c6edde948766e40f3daf7e997ae43a5ce6"
+ integrity sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==
+ dependencies:
+ camelcase-css "^2.0.1"
+
+"postcss-load-config@^4.0.2 || ^5.0 || ^6.0":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096"
+ integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==
+ dependencies:
+ lilconfig "^3.1.1"
+
+postcss-nested@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131"
+ integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==
+ dependencies:
+ postcss-selector-parser "^6.1.1"
+
+postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2:
+ version "6.1.4"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz#fdec4ca80f5781bd216ca9bf89a2a0fccfffa5f0"
+ integrity sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
+postcss@^8.4.43, postcss@^8.4.47, postcss@^8.4.49, postcss@^8.5.19:
+ version "8.5.26"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.26.tgz#6e75135780c7e10df3433bf2266c552d35c8c620"
+ integrity sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==
+ dependencies:
+ nanoid "^3.3.17"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
+
+quansync@^0.2.11:
+ version "0.2.11"
+ resolved "https://registry.yarnpkg.com/quansync/-/quansync-0.2.11.tgz#f9c3adda2e1272e4f8cf3f1457b04cbdb4ee692a"
+ integrity sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+read-cache@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.2.tgz#3bfa40e27574216bd893276ced75d81e6649ca52"
+ integrity sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+resolve@^1.1.7, resolve@^1.22.8, resolve@~1.22.1, resolve@~1.22.2:
+ version "1.22.12"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f"
+ integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==
+ dependencies:
+ es-errors "^1.3.0"
+ is-core-module "^2.16.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f"
+ integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
+
+rollup@^4.20.0:
+ version "4.63.0"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.63.0.tgz#55798a9834a55957544a971acc0f8365ca265b87"
+ integrity sha512-T5vnZ2y4QqC3/4P+w2+JO+Q/OVdnPsv4XcSYJYMEn0R9/jjl5AgLwO9LAZMzP2lN71O6pypn91rB7lDstUkfrQ==
+ dependencies:
+ "@types/estree" "1.0.9"
+ optionalDependencies:
+ "@napi-rs/lzma-linux-x64-gnu" "1.5.1"
+ "@rollup/rollup-android-arm-eabi" "4.63.0"
+ "@rollup/rollup-android-arm64" "4.63.0"
+ "@rollup/rollup-darwin-arm64" "4.63.0"
+ "@rollup/rollup-darwin-x64" "4.63.0"
+ "@rollup/rollup-freebsd-arm64" "4.63.0"
+ "@rollup/rollup-freebsd-x64" "4.63.0"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.63.0"
+ "@rollup/rollup-linux-arm-musleabihf" "4.63.0"
+ "@rollup/rollup-linux-arm64-gnu" "4.63.0"
+ "@rollup/rollup-linux-arm64-musl" "4.63.0"
+ "@rollup/rollup-linux-loong64-gnu" "4.63.0"
+ "@rollup/rollup-linux-loong64-musl" "4.63.0"
+ "@rollup/rollup-linux-ppc64-gnu" "4.63.0"
+ "@rollup/rollup-linux-ppc64-musl" "4.63.0"
+ "@rollup/rollup-linux-riscv64-gnu" "4.63.0"
+ "@rollup/rollup-linux-riscv64-musl" "4.63.0"
+ "@rollup/rollup-linux-s390x-gnu" "4.63.0"
+ "@rollup/rollup-linux-x64-gnu" "4.63.0"
+ "@rollup/rollup-linux-x64-musl" "4.63.0"
+ "@rollup/rollup-openbsd-x64" "4.63.0"
+ "@rollup/rollup-openharmony-arm64" "4.63.0"
+ "@rollup/rollup-win32-arm64-msvc" "4.63.0"
+ "@rollup/rollup-win32-ia32-msvc" "4.63.0"
+ "@rollup/rollup-win32-x64-gnu" "4.63.0"
+ "@rollup/rollup-win32-x64-msvc" "4.63.0"
+ fsevents "~2.3.2"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+semver@~7.7.4:
+ version "7.7.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a"
+ integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==
+
+source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+string-argv@~0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6"
+ integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==
+
+sucrase@^3.35.0:
+ version "3.35.1"
+ resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1"
+ integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.2"
+ commander "^4.0.0"
+ lines-and-columns "^1.1.6"
+ mz "^2.7.0"
+ pirates "^4.0.1"
+ tinyglobby "^0.2.11"
+ ts-interface-checker "^0.1.9"
+
+supports-color@~8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+tailwindcss@^3.4.17:
+ version "3.4.19"
+ resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.19.tgz#af2a0a4ae302d52ebe078b6775e799e132500ee2"
+ integrity sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==
+ dependencies:
+ "@alloc/quick-lru" "^5.2.0"
+ arg "^5.0.2"
+ chokidar "^3.6.0"
+ didyoumean "^1.2.2"
+ dlv "^1.1.3"
+ fast-glob "^3.3.2"
+ glob-parent "^6.0.2"
+ is-glob "^4.0.3"
+ jiti "^1.21.7"
+ lilconfig "^3.1.3"
+ micromatch "^4.0.8"
+ normalize-path "^3.0.0"
+ object-hash "^3.0.0"
+ picocolors "^1.1.1"
+ postcss "^8.4.47"
+ postcss-import "^15.1.0"
+ postcss-js "^4.0.1"
+ postcss-load-config "^4.0.2 || ^5.0 || ^6.0"
+ postcss-nested "^6.2.0"
+ postcss-selector-parser "^6.1.2"
+ resolve "^1.22.8"
+ sucrase "^3.35.0"
+
+thenify-all@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+ integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==
+ dependencies:
+ thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
+ integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+ dependencies:
+ any-promise "^1.0.0"
+
+tinyglobby@^0.2.11:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631"
+ integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==
+ dependencies:
+ fdir "^6.5.0"
+ picomatch "^4.0.4"
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+ts-interface-checker@^0.1.9:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
+ integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
+
+typescript@5.9.3, typescript@^5.6.3:
+ version "5.9.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
+ integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
+
+ufo@^1.6.3:
+ version "1.6.4"
+ resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.6.4.tgz#7a8fb875fcc6382d2c7d0b3692738b0500a92467"
+ integrity sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==
+
+undici-types@~8.3.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809"
+ integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+update-browserslist-db@^1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz#a71c28dd22f505481dbc4689087b18d933e90afd"
+ integrity sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.1"
+
+util-deprecate@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+vite-plugin-dts@^4.3.0:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz#51b60aaaa760d9cf5c2bb3676c69d81910d6b08c"
+ integrity sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==
+ dependencies:
+ "@microsoft/api-extractor" "^7.50.1"
+ "@rollup/pluginutils" "^5.1.4"
+ "@volar/typescript" "^2.4.11"
+ "@vue/language-core" "2.2.0"
+ compare-versions "^6.1.1"
+ debug "^4.4.0"
+ kolorist "^1.8.0"
+ local-pkg "^1.0.0"
+ magic-string "^0.30.17"
+
+vite@^5.4.11:
+ version "5.4.21"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.21.tgz#84a4f7c5d860b071676d39ba513c0d598fdc7027"
+ integrity sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==
+ dependencies:
+ esbuild "^0.21.3"
+ postcss "^8.4.43"
+ rollup "^4.20.0"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+vscode-uri@^3.0.8:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.2.0.tgz#1cb1fd3cee7426b66732afc3fb86343d596d5fb4"
+ integrity sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==
+
+vue-tsc@^2.1.10:
+ version "2.2.12"
+ resolved "https://registry.yarnpkg.com/vue-tsc/-/vue-tsc-2.2.12.tgz#5f719b08ef7390a763c1a20169ca5c9d09d55688"
+ integrity sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==
+ dependencies:
+ "@volar/typescript" "2.4.15"
+ "@vue/language-core" "2.2.12"
+
+vue@^3.5.12:
+ version "3.5.42"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.42.tgz#6099e750a19c68a5c09f785808d5abb01558a3c1"
+ integrity sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==
+ dependencies:
+ "@vue/compiler-dom" "3.5.42"
+ "@vue/compiler-sfc" "3.5.42"
+ "@vue/runtime-dom" "3.5.42"
+ "@vue/server-renderer" "3.5.42"
+ "@vue/shared" "3.5.42"