--- name: fantasia-quasar-vue description: >- Builds Vue 3 + Quasar UI for Fantasia Archive: layouts, pages, router, Pinia, and boot files. Use when editing .vue files, Quasar components, routes, or stores under src/. --- # Fantasia Archive — Quasar and Vue ## Stack - **Node.js 22.22.0+** (`package.json` `engines.node`) - **Vue 3** + **Quasar** (`quasar` v2, `@quasar/app-vite`) - **Pinia** (`src/stores/`); router `src/router/` - **TypeScript**; alias **`app/`** → project root ## Component folders (`src/components/`) - **Helper / wrapper SFCs** — five infrastructure features use **`_`** folder + file — see [AGENTS.md](../../../AGENTS.md) **Renderer components**. Not for dialog sub-panels. - **`dialogs/`** — `Dialog*` modals. Root **`q-dialog`** refs in global open coordination → **`registerComponentDialogStackGuard`** or **`registerMarkdownDialogStackGuard`** from **`dialogManagement_manager.ts`**. - **`floatingWindows/`** — `Window*` movable/resizable surfaces. **`_FaFloatingWindowBodyTeleport`**; **`useFaFloatingWindowFrame`**; **no** dialog stack guard. Z-index **`5000`–`5999`**. Playbook: [fantasia-floating-windows](../fantasia-floating-windows/SKILL.md). - **`globals/`** — chrome (`GlobalWindowButtons`, `AppControlMenus`, **`_FaUserCssInjector`**, …) - **`elements/`** — reusable widgets (`FaSelectInput`, `FaColorPickerInput`, **`FaIconPickerInput`**, **`FaLocaleTranslationsInput`**, **`FaVerticalDraggableTabList`**, **`FaDeleteConfirmButton`**, …) - **`other/`** — composites (`SocialContactButtons`) - **`foundation/`** — Storybook-only catalogues; no product routes, no Playwright - **Hierarchical trees** — **`@he-tree/vue`** only; **`QTree` forbidden** — [fantasia-he-tree](../fantasia-he-tree/SKILL.md) - **List / table reorder** — **`vue-draggable-plus`** / **`v-draggable-table`** — [fantasia-drag-drop](../fantasia-drag-drop/SKILL.md) Locale **`L_*`**: `i18n//components//` mirrors buckets (**`foundation/`** excluded). **`dialogs/`**, **`floatingWindows/`** beside **`components/`**. ## Layout and pages - Default chrome: **`MainLayout.vue`**, **`src/router/routes.ts`** - **Global keybinds**: **`MainLayout.vue`** registers **`keydown`** after **`S_FaKeybinds`** loads — [fantasia-keybinds](../fantasia-keybinds/SKILL.md) - **Playground**: **`ComponentTesting.vue`** + **`ComponentTestingLayout.vue`** - **Storybook**: `src/components/**/_tests/.stories.ts`, **`meta.title`** **`Components//`**. Layout/page stories canvas-only — [storybook-stories.mdc](../../rules/storybook-stories.mdc). Workspace: [`.storybook-workspace/`](../../../.storybook-workspace/) ## Single-file component block order (MUST) Every **`.vue`** SFC: **`