From be54387b560d7ff31bd2cf7a287aeaa657a01bb3 Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 16:32:23 +0200 Subject: [PATCH 01/66] Add design spec for Nuxt 2 to Vue 3 SPA migration Co-Authored-By: Claude Opus 4.8 (1M context) --- ...26-07-13-nuxt2-to-vue3-migration-design.md | 202 ++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 docs/superpowers/specs/2026-07-13-nuxt2-to-vue3-migration-design.md diff --git a/docs/superpowers/specs/2026-07-13-nuxt2-to-vue3-migration-design.md b/docs/superpowers/specs/2026-07-13-nuxt2-to-vue3-migration-design.md new file mode 100644 index 0000000..65642bd --- /dev/null +++ b/docs/superpowers/specs/2026-07-13-nuxt2-to-vue3-migration-design.md @@ -0,0 +1,202 @@ +# Avior: Nuxt 2 / Vue 2 to Vue 3 SPA migration + +Date: 2026-07-13 +Status: approved design, pending implementation plan + +## Summary + +Avior is an internal admin dashboard for controlling Avior encoding daemons. It currently runs on Nuxt 2.17 with Vue 2 and Vuetify 2, served in SSR mode, with an Express + Mongoose API mounted inside Nuxt as `serverMiddleware`. + +This project migrates it to a Vue 3 single-page application built by Vite, styled with Vuetify 3, with the Express API extracted into a standalone server that also serves the built SPA. Nuxt is removed entirely. The package manager moves from npm to pnpm. Component scripts end up as ` + + +``` + +The title reproduces Nuxt's `titleTemplate: '%s - powered by Walzen Group'` with the `Avior` title. Per-page titles are not currently set by any page, so a static title is faithful. + +- [ ] Step 5: Create `vite.config.ts` + +```ts +import { fileURLToPath, URL } from 'node:url' +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vuetify from 'vite-plugin-vuetify' +import VueRouter from 'unplugin-vue-router/vite' + +export default defineConfig({ + plugins: [ + // VueRouter must come before vue() + VueRouter({ + routesFolder: 'src/pages', + dts: 'src/typed-router.d.ts', + }), + vue(), + vuetify({ autoImport: true }), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + server: { + port: 5173, + proxy: { + // Forwards app-origin API calls to the standalone Express server in dev. + // In production the same Express server serves the built SPA, so the + // relative /api path resolves without any proxy. This is why no baseURL + // is configured anywhere in the app. + '/api': { + target: 'http://localhost:10009', + changeOrigin: true, + }, + }, + }, +}) +``` + +- [ ] Step 6: Create `tsconfig.json` + +Strict mode is off for now. Components are still JavaScript until Task 14; turning strict on before they are converted produces thousands of meaningless errors. Task 14 enables it. + +```json +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "strict": false, + "jsx": "preserve", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "noEmit": true, + "allowJs": true, + "types": ["vite/client", "unplugin-vue-router/client"], + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue", "vite.config.ts"] +} +``` + +- [ ] Step 7: Create `src/plugins/vuetify.ts` + +```ts +import 'vuetify/styles' +import '@mdi/font/css/materialdesignicons.css' +import { createVuetify } from 'vuetify' +import { VTimePicker } from 'vuetify/labs/VTimePicker' + +export default createVuetify({ + // VTimePicker is still in Vuetify labs and is not auto-imported by + // vite-plugin-vuetify. globalconfig.vue needs it for the client + // availability window. + components: { VTimePicker }, + theme: { + defaultTheme: 'dark', + themes: { + dark: { + dark: true, + colors: { + primary: '#9E9E9E', + secondary: '#FF8F00', + }, + }, + }, + }, + icons: { + defaultSet: 'mdi', + }, +}) +``` + +- [ ] Step 8: Create `src/router/index.ts` + +```ts +import { createRouter, createWebHistory } from 'vue-router' +import { routes } from 'vue-router/auto-routes' + +export default createRouter({ + history: createWebHistory(), + routes, +}) +``` + +`vue-router/auto-routes` is generated by unplugin-vue-router from `src/pages/`. Filenames map to route paths exactly as they did under Nuxt, so `/jobs`, `/config`, `/globalconfig`, and `/settings` are unchanged. + +- [ ] Step 9: Create `src/api/http.ts` + +The `$http` replacement. Signatures deliberately mirror `@nuxt/http`'s `$get`/`$post`/`$put`/`$delete` so the roughly 40 call sites port one-to-one. + +```ts +async function request(url: string, init?: RequestInit): Promise { + const res = await fetch(url, { + ...init, + headers: { + 'Content-Type': 'application/json', + ...(init?.headers ?? {}), + }, + }) + + if (!res.ok) { + throw new Error(`${init?.method ?? 'GET'} ${url} failed: ${res.status} ${res.statusText}`) + } + + // Some daemon endpoints reply 204 or with an empty body. + const text = await res.text() + return (text ? JSON.parse(text) : null) as T +} + +export function get(url: string): Promise { + return request(url) +} + +export function post(url: string, body?: unknown): Promise { + return request(url, { method: 'POST', body: JSON.stringify(body) }) +} + +export function put(url: string, body?: unknown): Promise { + return request(url, { method: 'PUT', body: JSON.stringify(body) }) +} + +export function del(url: string): Promise { + return request(url, { method: 'DELETE' }) +} +``` + +`delete` is a reserved word, hence `del`. `@nuxt/http` threw on non-2xx; this does too, so existing try/catch blocks in the pages keep working. + +- [ ] Step 10: Create `src/main.ts` + +```ts +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' +import vuetify from './plugins/vuetify' + +createApp(App).use(router).use(vuetify).mount('#app') +``` + +- [ ] Step 11: Create the placeholder `src/App.vue` + +Task 4 replaces this entirely. It exists only so the scaffold boots. + +```vue + +``` + +- [ ] Step 12: Create the placeholder `src/pages/index.vue` + +```vue + +``` + +- [ ] Step 13: Add the Vite scripts + +The Nuxt scripts are renamed rather than removed, so both apps stay runnable. In `package.json`, `scripts` becomes: + +```json + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "dev:api": "node server/index.js", + "start": "node server/index.js", + "dev:nuxt": "nuxt", + "build:nuxt": "nuxt build", + "start:nuxt": "nuxt start", + "typecheck": "vue-tsc --noEmit", + "lint:js": "eslint --ext .js,.vue --ignore-path .gitignore .", + "lint": "pnpm lint:js" + }, +``` + +Note that `build` and `start` now refer to the Vue 3 app and the standalone server. The Dockerfile still calls `pnpm build` and `pnpm start`, which means the Docker image is broken between here and Task 13. That is intentional and acceptable — the branch is not deployed mid-migration — but do not "fix" it by pointing the Dockerfile back at Nuxt. + +- [ ] Step 14: Verify the scaffold boots + +```bash +pnpm dev +``` + +Expected: Vite starts on `http://localhost:5173`. Opening it shows "Scaffold OK" on a dark background. The browser console is free of errors. + +- [ ] Step 15: Verify the dev proxy reaches Express + +With `pnpm dev:api` running in another shell, and Vite still running: + +```bash +curl -s http://localhost:5173/api/clients +``` + +Expected: the same JSON array as `http://localhost:10009/api/clients`. This proves the relative-`/api` strategy works in dev, which is the mechanism replacing the old `browserBaseURL`. + +- [ ] Step 16: Verify the Nuxt app still runs + +```bash +pnpm dev:nuxt +``` + +Expected: Nuxt serves on port 3000, unchanged. Both apps now run simultaneously. This side-by-side capability is the verification strategy for every remaining port task, so do not proceed until it works. + +- [ ] Step 17: Commit + +```bash +git add -A +git commit -m "feat: scaffold Vue 3 + Vite + Vuetify 3 app alongside Nuxt + +Adds vite.config.ts, the Vuetify 3 instance (stock dark theme, primary +#9E9E9E and secondary #FF8F00), file-based routing via unplugin-vue-router, +and the native-fetch http wrapper replacing @nuxt/http. + +No baseURL is configured: relative /api paths resolve against the origin in +prod and are proxied to Express in dev. Nuxt is untouched and still runs on +port 3000." +``` + +--- + +## Task 4: Port the layout + +Stage 4 of the spec. Everything else depends on this, so it goes first and alone. + +Files: +- Modify: `src/App.vue` (replace placeholder with the port of `layouts/default.vue`) +- Create: `src/pages/[...path].vue` (catch-all, replacing `layouts/error.vue`) +- Reference (do not modify): `layouts/default.vue`, `layouts/error.vue` + +Interfaces: +- Produces: the app shell — `v-app`, `v-navigation-drawer`, `v-app-bar`, `v-main` containing ``, and `v-footer`. Every page from Task 5 onwards renders inside this. + +This is the highest-density Vuetify conversion in the project relative to its size. `layouts/default.vue` uses `app`, `fixed`, `clipped`, `clipped-left`, `mini-variant`, `v-list-item-content`, `v-list-item-action`, and a `dark` prop on `v-app` — nearly every removed API at once. Do not attempt a find-and-replace; read the Vuetify 3 docs for `v-navigation-drawer` and `v-app-bar` and rebuild the shell. + +- [ ] Step 1: Read the source + +Read `layouts/default.vue` in full (146 lines). Note the five nav items and their routes, the drawer/mini-variant/clipped toggles in the app bar, the scrollbar CSS, and the footer's commit-hash link. + +- [ ] Step 2: Port to `src/App.vue` + +Apply the conversion table. The specific changes required: + +- `` becomes `` — the theme is dark by configuration now. +- `v-navigation-drawer`: drop `fixed` and `app`; `:mini-variant="miniVariant"` becomes `:rail="miniVariant"`. +- `v-app-bar`: drop `fixed`, `app`, and `:clipped-left="clipped"`. +- `v-footer`: drop `app` and `:absolute="!fixed"`. +- The nav `v-list-item` loop: `v-list-item-action` wrapping a `v-icon` becomes ``; `v-list-item-content` wrapping `v-list-item-title` is unwrapped so the title is a direct child. +- `` inside `v-main`'s `v-container` becomes ``. +- `process.env.commitSha` becomes `import.meta.env.VITE_COMMIT_SHA`. + +The `clipped` toggle deserves a decision rather than a mechanical port: Vuetify 3 computes layout automatically and has no `clipped` concept, so the button that toggles it has nothing to toggle. Keep the button and wire it to nothing, or remove it. Remove it — a button that does nothing is worse than an absent one. Note the removal in the commit message so the user can object. + +Keep the ` diff --git a/components/VuetifyLogo.vue b/components/VuetifyLogo.vue deleted file mode 100644 index 9a60937..0000000 --- a/components/VuetifyLogo.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/pages/test.vue b/pages/test.vue deleted file mode 100644 index b5b1e6e..0000000 --- a/pages/test.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - - - \ No newline at end of file diff --git a/server/app.js b/server/app.js index a3c8003..bdea217 100644 --- a/server/app.js +++ b/server/app.js @@ -34,7 +34,9 @@ app.get('/clients', async (req, res) => { }) app.post('/clients', async (req, res) => { - const { Name, Addresses } = req.body + // Express 5 leaves req.body undefined (not {}) when no parseable body is + // sent, so destructuring it directly throws on a bodyless request. + const { Name, Addresses } = req.body || {} if (!Name || !Addresses) { res.status(400).json({ error: 'Name and Addresses are required' }) return @@ -54,7 +56,7 @@ app.post('/clients', async (req, res) => { }) app.post('/clients/delete', async (req, res) => { - const { _id } = req.body + const { _id } = req.body || {} if (!_id) { res.status(400).json({ error: '_id is required' }) return @@ -72,4 +74,14 @@ app.use((req, res) => { res.status(404).json({ error: 'not found' }) }) +// Without this, Express's default handler answers in HTML — malformed JSON +// would return an HTML 400, and any thrown error an HTML 500 with a stack +// trace. This API only ever speaks JSON. +// eslint-disable-next-line no-unused-vars +app.use((err, req, res, next) => { + console.error('unhandled api error:', err) + const status = err.status || err.statusCode || 500 + res.status(status).json({ error: status === 400 ? 'malformed request' : 'internal error' }) +}) + module.exports = app From b9eda3971eaacdff421e4c0f940f51bbf1101d7e Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 17:38:56 +0200 Subject: [PATCH 12/66] Record Task 2/2b review findings deferred to Tasks 13 and 15 Co-Authored-By: Claude Opus 4.8 (1M context) --- .superpowers/sdd/progress.md | 34 ++++++++++++++----- .../2026-07-13-nuxt2-to-vue3-migration.md | 17 ++++++++++ .../task-13.md | 17 ++++++++++ 3 files changed, 60 insertions(+), 8 deletions(-) diff --git a/.superpowers/sdd/progress.md b/.superpowers/sdd/progress.md index fcd3518..99d3349 100644 --- a/.superpowers/sdd/progress.md +++ b/.superpowers/sdd/progress.md @@ -2,12 +2,30 @@ Base: c97abfd -Task 1: complete (03b7026 + 2da0ae4 fixup) — pnpm. Review clean. +Task 1: complete (03b7026, +2da0ae4 fixup) — pnpm. Reviewed clean. + Finding: pnpm 11 ignores shamefully-hoist in .npmrc; it lives in pnpm-workspace.yaml. Task 2: complete (8f5407f) — Express API extracted from Nuxt serverMiddleware. -Task 2b: complete (3e19a49 + bufferTimeoutMS fixup) — Mongoose 9, Express 5, Node 24. - Verified: server survives unreachable Mongo (70s+); GET /api/clients 500s in 5.2s; - unknown /api path returns JSON 404; Nuxt serverMiddleware DOES consume Express 5. - UNVERIFIED: Docker build (Docker not installed here). node:24-alpine untested. - UNVERIFIED: any successful Mongo query (10.11.194.75 unreachable from this machine). -Known pre-existing: pnpm lint fails repo-wide (2136 problems) — Task 15 owns this. -Task 3: next — scaffold Vue 3 + Vite + Vuetify 4. +Task 2b: complete (3e19a49, +baff6fe, +2396919 fixups) — Mongoose 9.7.4, Express 5.2.1, Node 24. + Reviewed: SPEC PASS, quality approved with issues; Important issues all fixed. + Key finding (fixed): Express 5 leaves req.body undefined, not {} — bodyless POSTs + returned 500 HTML with a stack trace. Now 400 JSON. Added a JSON error handler. + Key finding (fixed): mongoose.connect() had no .catch() — unreachable DB killed the + process under Node 24. Now survives; queries 500 in ~5s via bufferTimeoutMS. + Confirmed: Nuxt 2 serverMiddleware DOES consume an Express 5 app (was the big unknown). + Confirmed: '/*splat' fallback does not swallow /api 404s (reviewer verified empirically). + +DEFERRED to Task 13 (recorded in the plan, do not lose): + - NODE_ENV=production in the Dockerfile, else Express leaks stack traces in prod. + - engines field in package.json (Mongoose 9 needs node >= 20.19; nothing enforces it). + - README documents mounting config.json to override the Mongo URL. That file is GONE. + An operator following it gets the DEFAULT database silently. Actively harmful. +DEFERRED to Task 15: + - pnpm lint fails repo-wide (2136 problems). server/*.js violates the repo eslint style. +MINOR, accepted: + - Missing static assets fall through to the SPA fallback and return index.html with 200. + +NEVER VERIFIED — needs a run on the real LAN before Task 13 is trusted: + - Any successful MongoDB query. 10.11.194.75:27017 is unreachable from this machine. + - Any Docker build. Docker is not installed here. node:24-alpine is untested. + +Task 3: IN PROGRESS — scaffold Vue 3 + Vite + Vuetify 4. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md index 6d4ef32..759f8ba 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md @@ -1346,6 +1346,7 @@ RUN pnpm install --frozen-lockfile --prod COPY server ./server COPY --from=build /app/dist ./dist +ENV NODE_ENV=production ENV PORT=10009 ENV MONGO_URL=mongodb://10.11.194.75/Avior EXPOSE 10009 @@ -1366,6 +1367,22 @@ Expected: the container starts, logs `avior listening on http://0.0.0.0:10009`, If Docker is not available here, say so and flag it for the user rather than marking this step done. +- [ ] Step 8b: Close the findings carried over from the Task 2/2b review + +These were deferred to this task on purpose, because this is where `server/index.js` becomes the production process. + +`NODE_ENV=production` is set in the runtime stage of the Dockerfile above. This is not cosmetic: without it Express runs in development mode and its default error handler puts stack traces with absolute filesystem paths into HTTP response bodies. Confirm it is present. + +Add an `engines` field to `package.json`, since Mongoose 9 requires Node >= 20.19 and nothing currently enforces that: + +```json + "engines": { + "node": ">=20.19" + }, +``` + +`README.md` documents mounting a `config.json` over `api/config.json` to override the Mongo URL. That file no longer exists — Task 2 moved the setting to the `MONGO_URL` environment variable. An operator following the current README would mount a file that is silently ignored and get the default database instead of theirs. Task 15 rewrites the README, but this specific instruction is actively harmful, so remove or correct it here rather than waiting. + - [ ] Step 9: Commit ```bash diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md index eae5b33..2cafc8b 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md @@ -114,6 +114,7 @@ RUN pnpm install --frozen-lockfile --prod COPY server ./server COPY --from=build /app/dist ./dist +ENV NODE_ENV=production ENV PORT=10009 ENV MONGO_URL=mongodb://10.11.194.75/Avior EXPOSE 10009 @@ -134,6 +135,22 @@ Expected: the container starts, logs `avior listening on http://0.0.0.0:10009`, If Docker is not available here, say so and flag it for the user rather than marking this step done. +- [ ] Step 8b: Close the findings carried over from the Task 2/2b review + +These were deferred to this task on purpose, because this is where `server/index.js` becomes the production process. + +`NODE_ENV=production` is set in the runtime stage of the Dockerfile above. This is not cosmetic: without it Express runs in development mode and its default error handler puts stack traces with absolute filesystem paths into HTTP response bodies. Confirm it is present. + +Add an `engines` field to `package.json`, since Mongoose 9 requires Node >= 20.19 and nothing currently enforces that: + +```json + "engines": { + "node": ">=20.19" + }, +``` + +`README.md` documents mounting a `config.json` over `api/config.json` to override the Mongo URL. That file no longer exists — Task 2 moved the setting to the `MONGO_URL` environment variable. An operator following the current README would mount a file that is silently ignored and get the default database instead of theirs. Task 15 rewrites the README, but this specific instruction is actively harmful, so remove or correct it here rather than waiting. + - [ ] Step 9: Commit ```bash From 872fe5c900d8aa60ddca36c9e68ca4faa2d2db9f Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 17:42:54 +0200 Subject: [PATCH 13/66] feat: scaffold Vue 3 + Vite + Vuetify 4 app alongside Nuxt Adds vite.config.ts, the Vuetify 4 instance (stock dark theme, primary #9E9E9E and secondary #FF8F00), file-based routing via unplugin-vue-router, and the native-fetch http wrapper replacing @nuxt/http. No baseURL is configured: relative /api paths resolve against the origin in prod and are proxied to Express in dev. The Vite dev proxy was verified to reach the standalone Express server on :10009. Resolved versions: vue 3.5.39, vue-router 4.6.4, vuetify 4.1.4, @mdi/font 7.4.47 vite 8.1.4, @vitejs/plugin-vue 6.0.7, vite-plugin-vuetify 2.1.3, unplugin-vue-router 0.19.2, typescript 7.0.2, vue-tsc 3.3.7, @types/node 26.1.1 Two deviations from the plan, both forced by the installed versions: 1. VTimePicker is no longer in Vuetify labs. In Vuetify 4 it graduated to the stable `vuetify/components` entry point, so `vuetify/labs/VTimePicker` does not resolve and broke the dev server. As a stable component it is picked up by vite-plugin-vuetify's autoImport, so the explicit registration is dropped. Verified: builds and auto-imports with no registration. 2. tsconfig.node.json is not created. The plan lists it but supplies no content and no project reference to it; the given tsconfig.json already includes vite.config.ts, so a second file would be dead. KNOWN BREAKAGE: the Nuxt app no longer boots. Installing vue@3 as a direct dependency makes root node_modules/vue resolve to 3.5.39 under the shamefullyHoist flat layout Nuxt 2 requires, and vue-server-renderer@2.7.15 hard-asserts a matching vue. `vuetify` collides the same way (nuxt.config.js imports vuetify/es5/util/colors, which Vuetify 4 does not ship). The plan assumed Vue 2 and Vue 3 could coexist as "separate packages"; they are the same package name and there is only one node_modules/vue. Side-by-side coexistence needs a design decision -- see the task report. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01GyoqQ4kmb2CrxtK8yRJ3N2 --- index.html | 13 + package.json | 27 +- pnpm-lock.yaml | 1690 ++++++++++++++++++++--- public/dryicons_love_file_icon_6200.png | Bin 0 -> 20365 bytes public/dryicons_love_file_icon_6200.svg | 1 + public/favicon.ico | Bin 0 -> 4286 bytes public/favicon_def.ico | Bin 0 -> 1393 bytes public/v.png | Bin 0 -> 5674 bytes public/vuetify-logo.svg | 1 + src/App.vue | 7 + src/api/http.ts | 33 + src/main.ts | 6 + src/pages/index.vue | 3 + src/plugins/vuetify.ts | 27 + src/router/index.ts | 7 + src/typed-router.d.ts | 64 + tsconfig.json | 21 + vite.config.ts | 35 + 18 files changed, 1710 insertions(+), 225 deletions(-) create mode 100644 index.html create mode 100644 public/dryicons_love_file_icon_6200.png create mode 100644 public/dryicons_love_file_icon_6200.svg create mode 100644 public/favicon.ico create mode 100644 public/favicon_def.ico create mode 100644 public/v.png create mode 100644 public/vuetify-logo.svg create mode 100644 src/App.vue create mode 100644 src/api/http.ts create mode 100644 src/main.ts create mode 100644 src/pages/index.vue create mode 100644 src/plugins/vuetify.ts create mode 100644 src/router/index.ts create mode 100644 src/typed-router.d.ts create mode 100644 tsconfig.json create mode 100644 vite.config.ts diff --git a/index.html b/index.html new file mode 100644 index 0000000..dc24eaa --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Avior - powered by Walzen Group + + +
+ + + diff --git a/package.json b/package.json index a195a37..7be0b50 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,20 @@ "private": true, "packageManager": "pnpm@11.12.0", "scripts": { - "dev": "nuxt", + "dev": "vite", + "build": "vite build", + "preview": "vite preview", "dev:api": "node server/index.js", - "build": "nuxt build", - "start": "nuxt start", - "generate": "nuxt generate", + "start": "node server/index.js", + "dev:nuxt": "nuxt", + "build:nuxt": "nuxt build", + "start:nuxt": "nuxt start", + "typecheck": "vue-tsc --noEmit", "lint:js": "eslint --ext .js,.vue --ignore-path .gitignore .", "lint": "pnpm lint:js" }, "dependencies": { + "@mdi/font": "^7.4.47", "@nuxt/http": "^0.5.13", "@nuxtjs/axios": "^5.13.6", "@nuxtjs/proxy": "^2.1.0", @@ -22,14 +27,24 @@ "mongoose": "^9.7.4", "nuxt": "^2.17.2", "promise.any": "^2.0.6", - "request": "^2.88.2" + "request": "^2.88.2", + "vue": "^3.5.39", + "vue-router": "^4.6.4", + "vuetify": "^4.1.4" }, "devDependencies": { "@nuxtjs/eslint-config": "^3.1.0", "@nuxtjs/eslint-module": "^2.0.0", "@nuxtjs/vuetify": "^1.12.3", + "@types/node": "^26.1.1", + "@vitejs/plugin-vue": "^6.0.7", "babel-eslint": "^10.1.0", "eslint": "^7.32.0", - "eslint-plugin-nuxt": "^1.0.0" + "eslint-plugin-nuxt": "^1.0.0", + "typescript": "^7.0.2", + "unplugin-vue-router": "^0.19.2", + "vite": "^8.1.4", + "vite-plugin-vuetify": "^2.1.3", + "vue-tsc": "^3.3.7" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e62b55..a4e22d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,9 @@ importers: .: dependencies: + '@mdi/font': + specifier: ^7.4.47 + version: 7.4.47 '@nuxt/http': specifier: ^0.5.13 version: 0.5.13 @@ -31,23 +34,38 @@ importers: version: 9.7.4 nuxt: specifier: ^2.17.2 - version: 2.17.2(consola@3.2.3)(typescript@5.3.2)(vue@2.7.15) + version: 2.17.2(@vue/compiler-sfc@3.5.39)(consola@3.2.3)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)) promise.any: specifier: ^2.0.6 version: 2.0.6 request: specifier: ^2.88.2 version: 2.88.2 + vue: + specifier: ^3.5.39 + version: 3.5.39(typescript@7.0.2) + vue-router: + specifier: ^4.6.4 + version: 4.6.4(vue@3.5.39(typescript@7.0.2)) + vuetify: + specifier: ^4.1.4 + version: 4.1.4(typescript@7.0.2)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@7.0.2)) devDependencies: '@nuxtjs/eslint-config': specifier: ^3.1.0 - version: 3.1.0(eslint@7.32.0)(typescript@5.3.2) + version: 3.1.0(eslint@7.32.0)(typescript@7.0.2) '@nuxtjs/eslint-module': specifier: ^2.0.0 version: 2.0.0(eslint@7.32.0)(webpack@4.47.0) '@nuxtjs/vuetify': specifier: ^1.12.3 - version: 1.12.3(vue@2.7.15)(webpack@4.47.0) + version: 1.12.3(vue@3.5.39(typescript@7.0.2))(webpack@4.47.0) + '@types/node': + specifier: ^26.1.1 + version: 26.1.1 + '@vitejs/plugin-vue': + specifier: ^6.0.7 + version: 6.0.7(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2)) babel-eslint: specifier: ^10.1.0 version: 10.1.0(eslint@7.32.0) @@ -57,6 +75,21 @@ importers: eslint-plugin-nuxt: specifier: ^1.0.0 version: 1.0.0(eslint@7.32.0) + typescript: + specifier: ^7.0.2 + version: 7.0.2 + unplugin-vue-router: + specifier: ^0.19.2 + version: 0.19.2(@vue/compiler-sfc@3.5.39)(vue-router@4.6.4(vue@3.5.39(typescript@7.0.2)))(vue@3.5.39(typescript@7.0.2)) + vite: + specifier: ^8.1.4 + version: 8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0) + vite-plugin-vuetify: + specifier: ^2.1.3 + version: 2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4) + vue-tsc: + specifier: ^3.3.7 + version: 3.3.7(typescript@7.0.2) packages: @@ -94,6 +127,10 @@ packages: resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.29.7': + resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.22.5': resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -185,10 +222,18 @@ packages: resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.23.5': resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} engines: {node: '>=6.9.0'} @@ -210,6 +255,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.29.7': + resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3': resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} engines: {node: '>=6.9.0'} @@ -707,6 +757,10 @@ packages: resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} engines: {node: '>=6.9.0'} + '@babel/types@7.29.7': + resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} + engines: {node: '>=6.9.0'} + '@csstools/cascade-layer-name-parser@1.0.5': resolution: {integrity: sha512-v/5ODKNBMfBl0us/WQjlfsvSlYxfZLhNMVIsuCPib2ulTwGKYbKJbwqw671+qH9Y4wvWVnu7LBChvml/wBKjFg==} engines: {node: ^14 || ^16 || >=18} @@ -927,6 +981,15 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@eslint/eslintrc@0.4.3': resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -943,10 +1006,16 @@ packages: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} deprecated: Use @eslint/object-schema instead + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.3': resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.1': resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} @@ -958,15 +1027,27 @@ packages: '@jridgewell/source-map@0.3.5': resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} '@jridgewell/trace-mapping@0.3.20': resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mdi/font@7.4.47': + resolution: {integrity: sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==} + '@mongodb-js/saslprep@1.4.12': resolution: {integrity: sha512-QAfAMwNgnYxZ2C6D1HgeP7Gc4i/uvJRim415PCIL9ptRxWMNbWeLBYb2/9R4pGKny/s1FVu2JA2cxCUBUOggrA==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -1086,9 +1167,110 @@ packages: '@nuxtjs/youch@4.2.3': resolution: {integrity: sha512-XiTWdadTwtmL/IGkNqbVe+dOlT+IMvcBu7TvKI7plWhVQeBCQ9iKhk3jgvVWFyiwL2yHJDlEwOM5v9oVES5Xmw==} + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} + '@polka/url@1.0.0-next.23': resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -1096,6 +1278,9 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/html-minifier-terser@5.1.2': resolution: {integrity: sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==} @@ -1108,8 +1293,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@20.10.1': - resolution: {integrity: sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==} + '@types/node@26.1.1': + resolution: {integrity: sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1153,6 +1338,151 @@ packages: typescript: optional: true + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + + '@vitejs/plugin-vue@6.0.7': + resolution: {integrity: sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.28': + resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} + + '@volar/source-map@2.4.28': + resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} + + '@volar/typescript@2.4.28': + resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==} + + '@vue-macros/common@3.1.2': + resolution: {integrity: sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==} + engines: {node: '>=20.19.0'} + peerDependencies: + vue: ^2.7.0 || ^3.2.25 + peerDependenciesMeta: + vue: + optional: true + '@vue/babel-helper-vue-jsx-merge-props@1.4.0': resolution: {integrity: sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==} @@ -1200,12 +1530,53 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@vue/compiler-core@3.5.39': + resolution: {integrity: sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==} + + '@vue/compiler-dom@3.5.39': + resolution: {integrity: sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==} + '@vue/compiler-sfc@2.7.15': resolution: {integrity: sha512-FCvIEevPmgCgqFBH7wD+3B97y7u7oj/Wr69zADBf403Tui377bThTjBvekaZvlRr4IwUAu3M6hYZeULZFJbdYg==} + '@vue/compiler-sfc@3.5.39': + resolution: {integrity: sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==} + + '@vue/compiler-ssr@3.5.39': + resolution: {integrity: sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==} + '@vue/component-compiler-utils@3.3.0': resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==} + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/language-core@3.3.7': + resolution: {integrity: sha512-LzmkKinXAMMoh8Jfi/jMUSDUjuPdv8mynH5WJGKfXyZtDw3hQ6GBaoI6Bcnl/Xqlu32q/0Z6i/trp4VXykzyLw==} + + '@vue/reactivity@3.5.39': + resolution: {integrity: sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==} + + '@vue/runtime-core@3.5.39': + resolution: {integrity: sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==} + + '@vue/runtime-dom@3.5.39': + resolution: {integrity: sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==} + + '@vue/server-renderer@3.5.39': + resolution: {integrity: sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==} + peerDependencies: + vue: 3.5.39 + + '@vue/shared@3.5.39': + resolution: {integrity: sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==} + + '@vuetify/loader-shared@2.1.2': + resolution: {integrity: sha512-X+1jBLmXHkpQEnC0vyOb4rtX2QSkBiFhaFXz8yhQqN2A4vQ6k2nChxN4Ol7VAY5KoqMdFoRMnmNdp/1qYXDQig==} + peerDependencies: + vue: ^3.0.0 + vuetify: '>=3' + '@webassemblyjs/ast@1.9.0': resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} @@ -1302,6 +1673,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} @@ -1335,6 +1711,9 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + alien-signals@3.2.1: + resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -1443,6 +1822,14 @@ packages: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + + ast-walker-scope@0.8.3: + resolution: {integrity: sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==} + engines: {node: '>=20.19.0'} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -1701,6 +2088,10 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -1809,6 +2200,12 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + connect@3.7.0: resolution: {integrity: sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==} engines: {node: '>= 0.10.0'} @@ -2186,6 +2583,9 @@ packages: csstype@3.1.2: resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cuint@0.2.2: resolution: {integrity: sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==} @@ -2301,6 +2701,10 @@ packages: resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} engines: {node: '>=4'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devalue@2.0.1: resolution: {integrity: sha512-I2TiqT5iWBEyB8GRfTDP0hiLZ0YeDJZ+upDxjBfOC2lebO5LezQMv7QvIUTzdb64jQyAKLf1AHADtGN+jw6v8Q==} @@ -2415,6 +2819,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + errno@0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true @@ -2634,6 +3042,9 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2675,6 +3086,9 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} + exsolve@1.1.0: + resolution: {integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==} + extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -2720,6 +3134,15 @@ packages: fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figgy-pudding@3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} deprecated: This module is no longer supported. @@ -3424,6 +3847,11 @@ packages: engines: {node: '>=4'} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -3507,6 +3935,80 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -3534,6 +4036,10 @@ packages: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -3600,6 +4106,13 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + magic-string-ast@1.0.3: + resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==} + engines: {node: '>=20.19.0'} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} engines: {node: '>=4'} @@ -3770,6 +4283,9 @@ packages: engines: {node: '>=10'} hasBin: true + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mongodb-connection-string-url@7.0.1: resolution: {integrity: sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==} engines: {node: '>=20.19.0'} @@ -3830,6 +4346,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + multimap@1.1.0: resolution: {integrity: sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==} @@ -3844,6 +4363,11 @@ packages: nan@2.18.0: resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4112,6 +4636,9 @@ packages: path-browserify@0.0.1: resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-dirname@1.0.2: resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} @@ -4145,6 +4672,9 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} @@ -4155,13 +4685,17 @@ packages: picocolors@0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -4186,6 +4720,12 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -4735,6 +5275,10 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.17: + resolution: {integrity: sha512-J7EF+8X+CzRPaJPOv9Ck2wNWJvGnnl3PcNPAdGg6GTLjyVpyQ0yATMSXRFRV01BviT/9Gwuc3rjEyJbDJG9a4w==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -4828,6 +5372,9 @@ packages: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} engines: {node: '>=0.6'} + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + query-string@4.3.4: resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} engines: {node: '>=0.10.0'} @@ -4890,6 +5437,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + regenerate-unicode-properties@10.1.1: resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} engines: {node: '>=4'} @@ -5001,6 +5552,11 @@ packages: ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} @@ -5081,6 +5637,9 @@ packages: scule@0.2.1: resolution: {integrity: sha512-M9gnWtn3J0W+UhJOHmBxBTwv8mZCan5i1Himp60t6vvZcor0wr+IM0URKmIglsWJ7bRujNAVVN77fp+uZaWoKg==} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -5222,8 +5781,8 @@ packages: source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} - source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-resolve@0.5.3: @@ -5475,6 +6034,10 @@ packages: resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==} engines: {node: '>=0.6.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -5596,9 +6159,9 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@5.3.2: - resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} - engines: {node: '>=14.17'} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} hasBin: true ua-parser-js@1.0.37: @@ -5607,6 +6170,9 @@ packages: ufo@1.3.2: resolution: {integrity: sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + uglify-js@3.17.4: resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} @@ -5615,8 +6181,8 @@ packages: unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} unfetch@5.0.0: resolution: {integrity: sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==} @@ -5659,6 +6225,24 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin-utils@0.3.2: + resolution: {integrity: sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==} + engines: {node: '>=20.19.0'} + + unplugin-vue-router@0.19.2: + resolution: {integrity: sha512-u5dgLBarxE5cyDK/hzJGfpCTLIAyiTXGlo85COuD4Nssj6G7NxS+i9mhCWz/1p/ud1eMwdcUbTXehQe41jYZUA==} + deprecated: 'Merged into vuejs/router. Migrate: https://router.vuejs.org/guide/migration/v4-to-v5.html' + peerDependencies: + '@vue/compiler-sfc': ^3.5.17 + vue-router: ^4.6.0 + peerDependenciesMeta: + vue-router: + optional: true + + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} @@ -5742,9 +6326,63 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} + vite-plugin-vuetify@2.1.3: + resolution: {integrity: sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: '>=5' + vue: ^3.0.0 + vuetify: '>=3' + + vite@8.1.4: + resolution: {integrity: sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.3.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vue-client-only@2.1.0: resolution: {integrity: sha512-vKl1skEKn8EK9f8P2ZzhRnuaRHLHrlt1sbRmazlvsx6EiC3A8oWF8YCBrMJzoN+W3OnElwIGbVjsx6/xelY1AA==} @@ -5787,6 +6425,11 @@ packages: peerDependencies: vue: ^2 + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + vue-server-renderer@2.7.15: resolution: {integrity: sha512-5Wy6ls7ErawmgxlogoScTDOQzqBp4+B9CKV1Dl4280xVPBs1+iHpghW1nlKNd1JWKI3O2s4X4vwmg1C7Rvy7oA==} @@ -5799,10 +6442,24 @@ packages: vue-template-es2015-compiler@1.9.1: resolution: {integrity: sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==} + vue-tsc@3.3.7: + resolution: {integrity: sha512-+C+rgD49wAQ5bUTl2sp5a8Bzg4YoldMNXM+g7CFe604MYcQ8PrZPMQhIjJSzKXtPBCa+C5ayMipqjbA7splekQ==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + vue@2.7.15: resolution: {integrity: sha512-a29fsXd2G0KMRqIFTpRgpSbWaNBK3lpCTOLuGLEDnlHWdjB8fwl6zyYZ8xCrqkJdatwZb4mGHiEfJjnw0Q6AwQ==} deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details. + vue@3.5.39: + resolution: {integrity: sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + vuetify-loader@1.9.2: resolution: {integrity: sha512-8PP2w7aAs/rjA+Izec6qY7sHVb75MNrGQrDOTZJ5IEnvl+NiFhVpU2iWdRDZ3eMS842cWxSWStvkr+KJJKy+Iw==} peerDependencies: @@ -5826,6 +6483,21 @@ packages: peerDependencies: vue: ^2.6.4 + vuetify@4.1.4: + resolution: {integrity: sha512-8/H0Yl6h9t07/ExuyZFIRJqAenpKeCiVaRJzbHGfTtuZRZIs5EbtjdFYikPIu6h9thBJAx15PrU4ofa4LvdJag==} + peerDependencies: + typescript: '>=4.7' + vite-plugin-vuetify: '>=2.1.0' + vue: ^3.5.0 + webpack-plugin-vuetify: '>=3.1.0' + peerDependenciesMeta: + typescript: + optional: true + vite-plugin-vuetify: + optional: true + webpack-plugin-vuetify: + optional: true + vuex@3.6.2: resolution: {integrity: sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==} peerDependencies: @@ -5873,6 +6545,9 @@ packages: webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@4.47.0: resolution: {integrity: sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==} engines: {node: '>=6.11.5'} @@ -5967,6 +6642,11 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -5999,12 +6679,12 @@ snapshots: '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) '@babel/helpers': 7.23.5 - '@babel/parser': 7.23.5 + '@babel/parser': 7.29.7 '@babel/template': 7.22.15 '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 convert-source-map: 2.0.0 - debug: 4.3.4 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -6021,18 +6701,26 @@ snapshots: '@babel/generator@7.23.5': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 + '@babel/generator@7.29.7': + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.22.5': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-compilation-targets@7.22.15': dependencies: @@ -6067,7 +6755,7 @@ snapshots: '@babel/core': 7.23.5 '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4 + debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -6078,19 +6766,19 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.22.15 - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-hoist-variables@7.22.5': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-member-expression-to-functions@7.23.0': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-module-imports@7.22.15': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5)': dependencies: @@ -6103,7 +6791,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.22.5': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-plugin-utils@7.22.5': {} @@ -6123,33 +6811,37 @@ snapshots: '@babel/helper-simple-access@7.22.5': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-split-export-declaration@7.22.6': dependencies: - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helper-string-parser@7.23.4': {} + '@babel/helper-string-parser@7.29.7': {} + '@babel/helper-validator-identifier@7.22.20': {} + '@babel/helper-validator-identifier@7.29.7': {} + '@babel/helper-validator-option@7.23.5': {} '@babel/helper-wrap-function@7.22.20': dependencies: '@babel/helper-function-name': 7.23.0 '@babel/template': 7.22.15 - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 '@babel/helpers@7.23.5': dependencies: '@babel/template': 7.22.15 '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 transitivePeerDependencies: - supports-color @@ -6163,6 +6855,10 @@ snapshots: dependencies: '@babel/types': 7.23.5 + '@babel/parser@7.29.7': + dependencies: + '@babel/types': 7.29.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.5)': dependencies: '@babel/core': 7.23.5 @@ -6722,7 +7418,7 @@ snapshots: dependencies: '@babel/core': 7.23.5 '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.5 + '@babel/types': 7.29.7 esutils: 2.0.3 '@babel/regjsgen@0.8.0': {} @@ -6734,8 +7430,8 @@ snapshots: '@babel/template@7.22.15': dependencies: '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 '@babel/traverse@7.23.5': dependencies: @@ -6758,6 +7454,11 @@ snapshots: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + '@babel/types@7.29.7': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@csstools/cascade-layer-name-parser@1.0.5(@csstools/css-parser-algorithms@2.3.2(@csstools/css-tokenizer@2.2.1))(@csstools/css-tokenizer@2.2.1)': dependencies: '@csstools/css-parser-algorithms': 2.3.2(@csstools/css-tokenizer@2.2.1) @@ -6963,6 +7664,22 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.6.2 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.6.2 + optional: true + + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.6.2 + optional: true + '@eslint/eslintrc@0.4.3': dependencies: ajv: 6.12.6 @@ -6989,12 +7706,22 @@ snapshots: '@humanwhocodes/object-schema@1.2.1': {} + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/resolve-uri@3.1.1': {} '@jridgewell/set-array@1.1.2': {} @@ -7004,17 +7731,31 @@ snapshots: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 - '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.20': dependencies: '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mdi/font@7.4.47': {} '@mongodb-js/saslprep@1.4.12': dependencies: sparse-bitfield: 3.0.3 + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -7041,7 +7782,7 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@nuxt/babel-preset-app@2.17.2(vue@2.7.15)': + '@nuxt/babel-preset-app@2.17.2(vue@3.5.39(typescript@7.0.2))': dependencies: '@babel/compat-data': 7.23.5 '@babel/core': 7.23.5 @@ -7056,7 +7797,7 @@ snapshots: '@babel/plugin-transform-runtime': 7.23.4(@babel/core@7.23.5) '@babel/preset-env': 7.23.5(@babel/core@7.23.5) '@babel/runtime': 7.23.5 - '@vue/babel-preset-jsx': 1.4.0(@babel/core@7.23.5)(vue@2.7.15) + '@vue/babel-preset-jsx': 1.4.0(@babel/core@7.23.5)(vue@3.5.39(typescript@7.0.2)) core-js: 3.33.3 core-js-compat: 3.33.3 regenerator-runtime: 0.14.0 @@ -7064,12 +7805,12 @@ snapshots: - supports-color - vue - '@nuxt/builder@2.17.2(typescript@5.3.2)(vue@2.7.15)': + '@nuxt/builder@2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2))': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/utils': 2.17.2 '@nuxt/vue-app': 2.17.2 - '@nuxt/webpack': 2.17.2(typescript@5.3.2)(vue@2.7.15) + '@nuxt/webpack': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)) chalk: 4.1.2 chokidar: 3.5.3 consola: 3.2.3 @@ -7351,10 +8092,10 @@ snapshots: vue-meta: 2.4.0 vue-server-renderer: 2.7.15 - '@nuxt/webpack@2.17.2(typescript@5.3.2)(vue@2.7.15)': + '@nuxt/webpack@2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2))': dependencies: '@babel/core': 7.23.5 - '@nuxt/babel-preset-app': 2.17.2(vue@2.7.15) + '@nuxt/babel-preset-app': 2.17.2(vue@3.5.39(typescript@7.0.2)) '@nuxt/friendly-errors-webpack-plugin': 2.6.0(webpack@4.47.0) '@nuxt/utils': 2.17.2 babel-loader: 8.3.0(@babel/core@7.23.5)(webpack@4.47.0) @@ -7374,7 +8115,7 @@ snapshots: memory-fs: 0.5.0 optimize-css-assets-webpack-plugin: 6.0.1(webpack@4.47.0) pify: 5.0.0 - pnp-webpack-plugin: 1.7.0(typescript@5.3.2) + pnp-webpack-plugin: 1.7.0(typescript@7.0.2) postcss: 8.4.31 postcss-import: 15.1.0(postcss@8.4.31) postcss-import-resolver: 2.0.0 @@ -7390,7 +8131,7 @@ snapshots: ufo: 1.3.2 upath: 2.0.1 url-loader: 4.1.1(file-loader@6.2.0(webpack@4.47.0))(webpack@4.47.0) - vue-loader: 15.11.1(cache-loader@4.1.0(webpack@4.47.0))(css-loader@5.2.7(webpack@4.47.0))(lodash@4.17.21)(vue-template-compiler@2.7.15)(webpack@4.47.0) + vue-loader: 15.11.1(@vue/compiler-sfc@3.5.39)(cache-loader@4.1.0(webpack@4.47.0))(css-loader@5.2.7(webpack@4.47.0))(lodash@4.17.21)(vue-template-compiler@2.7.15)(webpack@4.47.0) vue-style-loader: 4.1.3 vue-template-compiler: 2.7.15 watchpack: 2.4.0 @@ -7474,12 +8215,12 @@ snapshots: transitivePeerDependencies: - debug - '@nuxtjs/eslint-config@3.1.0(eslint@7.32.0)(typescript@5.3.2)': + '@nuxtjs/eslint-config@3.1.0(eslint@7.32.0)(typescript@7.0.2)': dependencies: eslint: 7.32.0 eslint-config-standard: 14.1.1(eslint-plugin-import@2.22.0(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@4.3.1)(eslint-plugin-standard@4.1.0(eslint@7.32.0))(eslint@7.32.0) eslint-plugin-import: 2.22.0(eslint@7.32.0) - eslint-plugin-jest: 23.20.0(eslint@7.32.0)(typescript@5.3.2) + eslint-plugin-jest: 23.20.0(eslint@7.32.0)(typescript@7.0.2) eslint-plugin-node: 11.1.0(eslint@7.32.0) eslint-plugin-promise: 4.3.1 eslint-plugin-standard: 4.1.0(eslint@7.32.0) @@ -7506,13 +8247,13 @@ snapshots: transitivePeerDependencies: - debug - '@nuxtjs/vuetify@1.12.3(vue@2.7.15)(webpack@4.47.0)': + '@nuxtjs/vuetify@1.12.3(vue@3.5.39(typescript@7.0.2))(webpack@4.47.0)': dependencies: deepmerge: 4.3.1 sass: 1.32.13 sass-loader: 10.4.1(sass@1.32.13)(webpack@4.47.0) - vuetify: 2.7.1(vue@2.7.15) - vuetify-loader: 1.9.2(vue@2.7.15)(vuetify@2.7.1(vue@2.7.15))(webpack@4.47.0) + vuetify: 2.7.1(vue@3.5.39(typescript@7.0.2)) + vuetify-loader: 1.9.2(vue@3.5.39(typescript@7.0.2))(vuetify@2.7.1(vue@3.5.39(typescript@7.0.2)))(webpack@4.47.0) transitivePeerDependencies: - fibers - gm @@ -7528,25 +8269,83 @@ snapshots: mustache: 2.3.2 stack-trace: 0.0.10 + '@oxc-project/types@0.139.0': {} + '@polka/url@1.0.0-next.23': {} + '@rolldown/binding-android-arm64@1.1.5': + optional: true + + '@rolldown/binding-darwin-arm64@1.1.5': + optional: true + + '@rolldown/binding-darwin-x64@1.1.5': + optional: true + + '@rolldown/binding-freebsd-x64@1.1.5': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.1.5': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.1.5': + optional: true + + '@rolldown/binding-linux-x64-musl@1.1.5': + optional: true + + '@rolldown/binding-openharmony-arm64@1.1.5': + optional: true + + '@rolldown/binding-wasm32-wasi@1.1.5': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.1.5': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.1.5': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + '@standard-schema/spec@1.1.0': {} '@trysound/sax@0.2.0': {} + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.6.2 + optional: true + '@types/html-minifier-terser@5.1.2': {} '@types/http-proxy@1.17.14': dependencies: - '@types/node': 20.10.1 + '@types/node': 26.1.1 '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/node@20.10.1': + '@types/node@26.1.1': dependencies: - undici-types: 5.26.5 + undici-types: 8.3.0 '@types/normalize-package-data@2.4.4': {} @@ -7564,13 +8363,13 @@ snapshots: '@types/webpack-sources@3.2.3': dependencies: - '@types/node': 20.10.1 + '@types/node': 26.1.1 '@types/source-list-map': 0.1.6 source-map: 0.7.4 '@types/webpack@4.41.38': dependencies: - '@types/node': 20.10.1 + '@types/node': 26.1.1 '@types/tapable': 1.0.12 '@types/uglify-js': 3.17.4 '@types/webpack-sources': 3.2.3 @@ -7581,10 +8380,10 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/experimental-utils@2.34.0(eslint@7.32.0)(typescript@5.3.2)': + '@typescript-eslint/experimental-utils@2.34.0(eslint@7.32.0)(typescript@7.0.2)': dependencies: '@types/json-schema': 7.0.15 - '@typescript-eslint/typescript-estree': 2.34.0(typescript@5.3.2) + '@typescript-eslint/typescript-estree': 2.34.0(typescript@7.0.2) eslint: 7.32.0 eslint-scope: 5.1.1 eslint-utils: 2.1.0 @@ -7592,20 +8391,108 @@ snapshots: - supports-color - typescript - '@typescript-eslint/typescript-estree@2.34.0(typescript@5.3.2)': + '@typescript-eslint/typescript-estree@2.34.0(typescript@7.0.2)': dependencies: - debug: 4.3.4 + debug: 4.4.3 eslint-visitor-keys: 1.3.0 glob: 7.2.3 is-glob: 4.0.3 lodash: 4.17.21 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.3.2) + tsutils: 3.21.0(typescript@7.0.2) optionalDependencies: - typescript: 5.3.2 + typescript: 7.0.2 transitivePeerDependencies: - supports-color + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + + '@vitejs/plugin-vue@6.0.7(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2))': + dependencies: + '@rolldown/pluginutils': 1.0.1 + vite: 8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0) + vue: 3.5.39(typescript@7.0.2) + + '@volar/language-core@2.4.28': + dependencies: + '@volar/source-map': 2.4.28 + + '@volar/source-map@2.4.28': {} + + '@volar/typescript@2.4.28': + dependencies: + '@volar/language-core': 2.4.28 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vue-macros/common@3.1.2(vue@3.5.39(typescript@7.0.2))': + dependencies: + '@vue/compiler-sfc': 3.5.39 + ast-kit: 2.2.0 + local-pkg: 1.2.1 + magic-string-ast: 1.0.3 + unplugin-utils: 0.3.2 + optionalDependencies: + vue: 3.5.39(typescript@7.0.2) + '@vue/babel-helper-vue-jsx-merge-props@1.4.0': {} '@vue/babel-plugin-transform-vue-jsx@1.4.0(@babel/core@7.23.5)': @@ -7618,7 +8505,7 @@ snapshots: lodash.kebabcase: 4.1.1 svg-tags: 1.0.0 - '@vue/babel-preset-jsx@1.4.0(@babel/core@7.23.5)(vue@2.7.15)': + '@vue/babel-preset-jsx@1.4.0(@babel/core@7.23.5)(vue@3.5.39(typescript@7.0.2))': dependencies: '@babel/core': 7.23.5 '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 @@ -7630,7 +8517,7 @@ snapshots: '@vue/babel-sugar-v-model': 1.4.0(@babel/core@7.23.5) '@vue/babel-sugar-v-on': 1.4.0(@babel/core@7.23.5) optionalDependencies: - vue: 2.7.15 + vue: 3.5.39(typescript@7.0.2) '@vue/babel-sugar-composition-api-inject-h@1.4.0(@babel/core@7.23.5)': dependencies: @@ -7669,12 +8556,42 @@ snapshots: '@vue/babel-plugin-transform-vue-jsx': 1.4.0(@babel/core@7.23.5) camelcase: 5.3.1 + '@vue/compiler-core@3.5.39': + dependencies: + '@babel/parser': 7.29.7 + '@vue/shared': 3.5.39 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.39': + dependencies: + '@vue/compiler-core': 3.5.39 + '@vue/shared': 3.5.39 + '@vue/compiler-sfc@2.7.15': dependencies: - '@babel/parser': 7.23.5 - postcss: 8.4.31 + '@babel/parser': 7.29.7 + postcss: 8.5.17 source-map: 0.6.1 + '@vue/compiler-sfc@3.5.39': + dependencies: + '@babel/parser': 7.29.7 + '@vue/compiler-core': 3.5.39 + '@vue/compiler-dom': 3.5.39 + '@vue/compiler-ssr': 3.5.39 + '@vue/shared': 3.5.39 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.17 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.39': + dependencies: + '@vue/compiler-dom': 3.5.39 + '@vue/shared': 3.5.39 + '@vue/component-compiler-utils@3.3.0(lodash@4.17.21)': dependencies: consolidate: 0.15.1(lodash@4.17.21) @@ -7742,6 +8659,48 @@ snapshots: - walrus - whiskers + '@vue/devtools-api@6.6.4': {} + + '@vue/language-core@3.3.7': + dependencies: + '@volar/language-core': 2.4.28 + '@vue/compiler-dom': 3.5.39 + '@vue/shared': 3.5.39 + alien-signals: 3.2.1 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + picomatch: 4.0.5 + + '@vue/reactivity@3.5.39': + dependencies: + '@vue/shared': 3.5.39 + + '@vue/runtime-core@3.5.39': + dependencies: + '@vue/reactivity': 3.5.39 + '@vue/shared': 3.5.39 + + '@vue/runtime-dom@3.5.39': + dependencies: + '@vue/reactivity': 3.5.39 + '@vue/runtime-core': 3.5.39 + '@vue/shared': 3.5.39 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.39(vue@3.5.39(typescript@7.0.2))': + dependencies: + '@vue/compiler-ssr': 3.5.39 + '@vue/shared': 3.5.39 + vue: 3.5.39(typescript@7.0.2) + + '@vue/shared@3.5.39': {} + + '@vuetify/loader-shared@2.1.2(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4)': + dependencies: + upath: 2.0.1 + vue: 3.5.39(typescript@7.0.2) + vuetify: 4.1.4(typescript@7.0.2)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@7.0.2)) + '@webassemblyjs/ast@1.9.0': dependencies: '@webassemblyjs/helper-module-context': 1.9.0 @@ -7863,6 +8822,8 @@ snapshots: acorn@8.11.2: {} + acorn@8.17.0: {} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 @@ -7899,6 +8860,8 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + alien-signals@3.2.1: {} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -8020,6 +8983,16 @@ snapshots: assign-symbols@1.0.0: {} + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.29.7 + pathe: 2.0.3 + + ast-walker-scope@0.8.3: + dependencies: + '@babel/parser': 7.29.7 + ast-kit: 2.2.0 + astral-regex@2.0.0: {} async-each@1.0.6: @@ -8035,7 +9008,7 @@ snapshots: caniuse-lite: 1.0.30001565 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 + picocolors: 1.1.1 postcss: 8.4.31 postcss-value-parser: 4.2.0 @@ -8416,6 +9389,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + chownr@1.1.4: {} chownr@2.0.0: {} @@ -8516,6 +9493,10 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 + confbox@0.1.8: {} + + confbox@0.2.4: {} + connect@3.7.0: dependencies: debug: 2.6.9 @@ -8644,6 +9625,10 @@ snapshots: dependencies: postcss: 8.4.31 + css-declaration-sorter@6.4.1(postcss@8.5.17): + dependencies: + postcss: 8.5.17 + css-has-pseudo@6.0.0(postcss@8.4.31): dependencies: '@csstools/selector-specificity': 3.0.0(postcss-selector-parser@6.0.13) @@ -8653,13 +9638,13 @@ snapshots: css-loader@5.2.7(webpack@4.47.0): dependencies: - icss-utils: 5.1.0(postcss@8.4.31) + icss-utils: 5.1.0(postcss@8.5.17) loader-utils: 2.0.4 - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) - postcss-modules-scope: 3.0.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) + postcss: 8.5.17 + postcss-modules-extract-imports: 3.0.0(postcss@8.5.17) + postcss-modules-local-by-default: 4.0.3(postcss@8.5.17) + postcss-modules-scope: 3.0.0(postcss@8.5.17) + postcss-modules-values: 4.0.0(postcss@8.5.17) postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.5.4 @@ -8693,12 +9678,12 @@ snapshots: css-tree@2.2.1: dependencies: mdn-data: 2.0.28 - source-map-js: 1.0.2 + source-map-js: 1.2.1 css-tree@2.3.1: dependencies: mdn-data: 2.0.30 - source-map-js: 1.0.2 + source-map-js: 1.2.1 css-what@6.1.0: {} @@ -8706,38 +9691,38 @@ snapshots: cssesc@3.0.0: {} - cssnano-preset-default@5.2.14(postcss@8.4.31): - dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.31) - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-calc: 8.2.4(postcss@8.4.31) - postcss-colormin: 5.3.1(postcss@8.4.31) - postcss-convert-values: 5.1.3(postcss@8.4.31) - postcss-discard-comments: 5.1.2(postcss@8.4.31) - postcss-discard-duplicates: 5.1.0(postcss@8.4.31) - postcss-discard-empty: 5.1.1(postcss@8.4.31) - postcss-discard-overridden: 5.1.0(postcss@8.4.31) - postcss-merge-longhand: 5.1.7(postcss@8.4.31) - postcss-merge-rules: 5.1.4(postcss@8.4.31) - postcss-minify-font-values: 5.1.0(postcss@8.4.31) - postcss-minify-gradients: 5.1.1(postcss@8.4.31) - postcss-minify-params: 5.1.4(postcss@8.4.31) - postcss-minify-selectors: 5.2.1(postcss@8.4.31) - postcss-normalize-charset: 5.1.0(postcss@8.4.31) - postcss-normalize-display-values: 5.1.0(postcss@8.4.31) - postcss-normalize-positions: 5.1.1(postcss@8.4.31) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.31) - postcss-normalize-string: 5.1.0(postcss@8.4.31) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.31) - postcss-normalize-unicode: 5.1.1(postcss@8.4.31) - postcss-normalize-url: 5.1.0(postcss@8.4.31) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.31) - postcss-ordered-values: 5.1.3(postcss@8.4.31) - postcss-reduce-initial: 5.1.2(postcss@8.4.31) - postcss-reduce-transforms: 5.1.0(postcss@8.4.31) - postcss-svgo: 5.1.0(postcss@8.4.31) - postcss-unique-selectors: 5.1.1(postcss@8.4.31) + cssnano-preset-default@5.2.14(postcss@8.5.17): + dependencies: + css-declaration-sorter: 6.4.1(postcss@8.5.17) + cssnano-utils: 3.1.0(postcss@8.5.17) + postcss: 8.5.17 + postcss-calc: 8.2.4(postcss@8.5.17) + postcss-colormin: 5.3.1(postcss@8.5.17) + postcss-convert-values: 5.1.3(postcss@8.5.17) + postcss-discard-comments: 5.1.2(postcss@8.5.17) + postcss-discard-duplicates: 5.1.0(postcss@8.5.17) + postcss-discard-empty: 5.1.1(postcss@8.5.17) + postcss-discard-overridden: 5.1.0(postcss@8.5.17) + postcss-merge-longhand: 5.1.7(postcss@8.5.17) + postcss-merge-rules: 5.1.4(postcss@8.5.17) + postcss-minify-font-values: 5.1.0(postcss@8.5.17) + postcss-minify-gradients: 5.1.1(postcss@8.5.17) + postcss-minify-params: 5.1.4(postcss@8.5.17) + postcss-minify-selectors: 5.2.1(postcss@8.5.17) + postcss-normalize-charset: 5.1.0(postcss@8.5.17) + postcss-normalize-display-values: 5.1.0(postcss@8.5.17) + postcss-normalize-positions: 5.1.1(postcss@8.5.17) + postcss-normalize-repeat-style: 5.1.1(postcss@8.5.17) + postcss-normalize-string: 5.1.0(postcss@8.5.17) + postcss-normalize-timing-functions: 5.1.0(postcss@8.5.17) + postcss-normalize-unicode: 5.1.1(postcss@8.5.17) + postcss-normalize-url: 5.1.0(postcss@8.5.17) + postcss-normalize-whitespace: 5.1.1(postcss@8.5.17) + postcss-ordered-values: 5.1.3(postcss@8.5.17) + postcss-reduce-initial: 5.1.2(postcss@8.5.17) + postcss-reduce-transforms: 5.1.0(postcss@8.5.17) + postcss-svgo: 5.1.0(postcss@8.5.17) + postcss-unique-selectors: 5.1.1(postcss@8.5.17) cssnano-preset-default@6.0.1(postcss@8.4.31): dependencies: @@ -8772,19 +9757,19 @@ snapshots: postcss-svgo: 6.0.0(postcss@8.4.31) postcss-unique-selectors: 6.0.0(postcss@8.4.31) - cssnano-utils@3.1.0(postcss@8.4.31): + cssnano-utils@3.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 cssnano-utils@4.0.0(postcss@8.4.31): dependencies: postcss: 8.4.31 - cssnano@5.1.15(postcss@8.4.31): + cssnano@5.1.15(postcss@8.5.17): dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.31) + cssnano-preset-default: 5.2.14(postcss@8.5.17) lilconfig: 2.1.0 - postcss: 8.4.31 + postcss: 8.5.17 yaml: 1.10.2 cssnano@6.0.1(postcss@8.4.31): @@ -8803,6 +9788,8 @@ snapshots: csstype@3.1.2: {} + csstype@3.2.3: {} + cuint@0.2.2: {} cyclist@1.0.2: {} @@ -8887,6 +9874,8 @@ snapshots: detect-indent@5.0.0: {} + detect-libc@2.1.2: {} + devalue@2.0.1: {} diffie-hellman@5.0.3: @@ -9018,6 +10007,8 @@ snapshots: entities@4.5.0: {} + entities@7.0.1: {} + errno@0.1.8: dependencies: prr: 1.0.1 @@ -9196,9 +10187,9 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@23.20.0(eslint@7.32.0)(typescript@5.3.2): + eslint-plugin-jest@23.20.0(eslint@7.32.0)(typescript@7.0.2): dependencies: - '@typescript-eslint/experimental-utils': 2.34.0(eslint@7.32.0)(typescript@5.3.2) + '@typescript-eslint/experimental-utils': 2.34.0(eslint@7.32.0)(typescript@7.0.2) eslint: 7.32.0 transitivePeerDependencies: - supports-color @@ -9357,6 +10348,8 @@ snapshots: estraverse@5.3.0: {} + estree-walker@2.0.2: {} + esutils@2.0.3: {} etag@1.8.1: {} @@ -9433,6 +10426,8 @@ snapshots: transitivePeerDependencies: - supports-color + exsolve@1.1.0: {} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 @@ -9491,6 +10486,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + figgy-pudding@3.5.2: {} figures@3.2.0: @@ -9981,9 +10980,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.4.31): + icss-utils@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 ieee754@1.2.1: {} @@ -10213,7 +11212,7 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 20.10.1 + '@types/node': 26.1.1 merge-stream: 2.0.0 supports-color: 7.2.0 @@ -10232,6 +11231,8 @@ snapshots: jsesc@2.5.2: {} + jsesc@3.1.0: {} + json-buffer@3.0.1: {} json-parse-better-errors@1.0.2: {} @@ -10302,7 +11303,7 @@ snapshots: launch-editor@2.6.1: dependencies: - picocolors: 1.0.0 + picocolors: 1.1.1 shell-quote: 1.8.1 levn@0.4.1: @@ -10310,6 +11311,55 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + lilconfig@2.1.0: {} lines-and-columns@1.2.4: {} @@ -10337,6 +11387,12 @@ snapshots: emojis-list: 3.0.0 json5: 2.2.3 + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 + locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -10399,6 +11455,14 @@ snapshots: dependencies: yallist: 4.0.0 + magic-string-ast@1.0.3: + dependencies: + magic-string: 0.30.21 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@1.3.0: dependencies: pify: 3.0.0 @@ -10571,6 +11635,13 @@ snapshots: mkdirp@1.0.4: {} + mlly@1.8.2: + dependencies: + acorn: 8.17.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + mongodb-connection-string-url@7.0.1: dependencies: '@types/whatwg-url': 13.0.0 @@ -10621,6 +11692,8 @@ snapshots: ms@2.1.3: {} + muggle-string@0.4.1: {} + multimap@1.1.0: {} mustache@2.3.2: {} @@ -10630,6 +11703,8 @@ snapshots: nan@2.18.0: optional: true + nanoid@3.3.16: {} + nanoid@3.3.7: {} nanomatch@1.2.13: @@ -10747,10 +11822,10 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@2.17.2(consola@3.2.3)(typescript@5.3.2)(vue@2.7.15): + nuxt@2.17.2(@vue/compiler-sfc@3.5.39)(consola@3.2.3)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)): dependencies: - '@nuxt/babel-preset-app': 2.17.2(vue@2.7.15) - '@nuxt/builder': 2.17.2(typescript@5.3.2)(vue@2.7.15) + '@nuxt/babel-preset-app': 2.17.2(vue@3.5.39(typescript@7.0.2)) + '@nuxt/builder': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)) '@nuxt/cli': 2.17.2 '@nuxt/components': 2.2.1(consola@3.2.3) '@nuxt/config': 2.17.2 @@ -10763,7 +11838,7 @@ snapshots: '@nuxt/utils': 2.17.2 '@nuxt/vue-app': 2.17.2 '@nuxt/vue-renderer': 2.17.2 - '@nuxt/webpack': 2.17.2(typescript@5.3.2)(vue@2.7.15) + '@nuxt/webpack': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)) transitivePeerDependencies: - '@vue/compiler-sfc' - arc-templates @@ -10900,9 +11975,9 @@ snapshots: optimize-css-assets-webpack-plugin@6.0.1(webpack@4.47.0): dependencies: - cssnano: 5.1.15(postcss@8.4.31) + cssnano: 5.1.15(postcss@8.5.17) last-call-webpack-plugin: 3.0.0 - postcss: 8.4.31 + postcss: 8.5.17 webpack: 4.47.0 optionator@0.9.3: @@ -11019,6 +12094,8 @@ snapshots: path-browserify@0.0.1: {} + path-browserify@1.0.1: {} + path-dirname@1.0.2: optional: true @@ -11040,6 +12117,8 @@ snapshots: path-type@4.0.0: {} + pathe@2.0.3: {} + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 @@ -11052,10 +12131,12 @@ snapshots: picocolors@0.2.1: {} - picocolors@1.0.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.5: {} + pify@2.3.0: {} pify@3.0.0: {} @@ -11072,11 +12153,23 @@ snapshots: dependencies: find-up: 4.1.0 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.1.0 + pathe: 2.0.3 + pluralize@8.0.0: {} - pnp-webpack-plugin@1.7.0(typescript@5.3.2): + pnp-webpack-plugin@1.7.0(typescript@7.0.2): dependencies: - ts-pnp: 1.2.0(typescript@5.3.2) + ts-pnp: 1.2.0(typescript@7.0.2) transitivePeerDependencies: - typescript @@ -11087,9 +12180,9 @@ snapshots: postcss: 8.4.31 postcss-selector-parser: 6.0.13 - postcss-calc@8.2.4(postcss@8.4.31): + postcss-calc@8.2.4(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 @@ -11120,12 +12213,12 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-colormin@5.3.1(postcss@8.4.31): + postcss-colormin@5.3.1(postcss@8.5.17): dependencies: browserslist: 4.22.1 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-colormin@6.0.0(postcss@8.4.31): @@ -11136,10 +12229,10 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-convert-values@5.1.3(postcss@8.4.31): + postcss-convert-values@5.1.3(postcss@8.5.17): dependencies: browserslist: 4.22.1 - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-convert-values@6.0.0(postcss@8.4.31): @@ -11177,33 +12270,33 @@ snapshots: postcss: 8.4.31 postcss-selector-parser: 6.0.13 - postcss-discard-comments@5.1.2(postcss@8.4.31): + postcss-discard-comments@5.1.2(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-discard-comments@6.0.0(postcss@8.4.31): dependencies: postcss: 8.4.31 - postcss-discard-duplicates@5.1.0(postcss@8.4.31): + postcss-discard-duplicates@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-discard-duplicates@6.0.0(postcss@8.4.31): dependencies: postcss: 8.4.31 - postcss-discard-empty@5.1.1(postcss@8.4.31): + postcss-discard-empty@5.1.1(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-discard-empty@6.0.0(postcss@8.4.31): dependencies: postcss: 8.4.31 - postcss-discard-overridden@5.1.0(postcss@8.4.31): + postcss-discard-overridden@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-discard-overridden@6.0.0(postcss@8.4.31): dependencies: @@ -11272,11 +12365,11 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-merge-longhand@5.1.7(postcss@8.4.31): + postcss-merge-longhand@5.1.7(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.31) + stylehacks: 5.1.1(postcss@8.5.17) postcss-merge-longhand@6.0.0(postcss@8.4.31): dependencies: @@ -11284,12 +12377,12 @@ snapshots: postcss-value-parser: 4.2.0 stylehacks: 6.0.0(postcss@8.4.31) - postcss-merge-rules@5.1.4(postcss@8.4.31): + postcss-merge-rules@5.1.4(postcss@8.5.17): dependencies: browserslist: 4.22.1 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.5.17) + postcss: 8.5.17 postcss-selector-parser: 6.0.13 postcss-merge-rules@6.0.1(postcss@8.4.31): @@ -11300,9 +12393,9 @@ snapshots: postcss: 8.4.31 postcss-selector-parser: 6.0.13 - postcss-minify-font-values@5.1.0(postcss@8.4.31): + postcss-minify-font-values@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-minify-font-values@6.0.0(postcss@8.4.31): @@ -11310,11 +12403,11 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-minify-gradients@5.1.1(postcss@8.4.31): + postcss-minify-gradients@5.1.1(postcss@8.5.17): dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.5.17) + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-minify-gradients@6.0.0(postcss@8.4.31): @@ -11324,11 +12417,11 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-minify-params@5.1.4(postcss@8.4.31): + postcss-minify-params@5.1.4(postcss@8.5.17): dependencies: browserslist: 4.22.1 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.5.17) + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-minify-params@6.0.0(postcss@8.4.31): @@ -11338,9 +12431,9 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-minify-selectors@5.2.1(postcss@8.4.31): + postcss-minify-selectors@5.2.1(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-selector-parser: 6.0.13 postcss-minify-selectors@6.0.0(postcss@8.4.31): @@ -11348,26 +12441,26 @@ snapshots: postcss: 8.4.31 postcss-selector-parser: 6.0.13 - postcss-modules-extract-imports@3.0.0(postcss@8.4.31): + postcss-modules-extract-imports@3.0.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 - postcss-modules-local-by-default@4.0.3(postcss@8.4.31): + postcss-modules-local-by-default@4.0.3(postcss@8.5.17): dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.5.17) + postcss: 8.5.17 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.0.0(postcss@8.4.31): + postcss-modules-scope@3.0.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-selector-parser: 6.0.13 - postcss-modules-values@4.0.0(postcss@8.4.31): + postcss-modules-values@4.0.0(postcss@8.5.17): dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.5.17) + postcss: 8.5.17 postcss-nesting@12.0.1(postcss@8.4.31): dependencies: @@ -11375,17 +12468,17 @@ snapshots: postcss: 8.4.31 postcss-selector-parser: 6.0.13 - postcss-normalize-charset@5.1.0(postcss@8.4.31): + postcss-normalize-charset@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-normalize-charset@6.0.0(postcss@8.4.31): dependencies: postcss: 8.4.31 - postcss-normalize-display-values@5.1.0(postcss@8.4.31): + postcss-normalize-display-values@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-normalize-display-values@6.0.0(postcss@8.4.31): @@ -11393,9 +12486,9 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-normalize-positions@5.1.1(postcss@8.4.31): + postcss-normalize-positions@5.1.1(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-normalize-positions@6.0.0(postcss@8.4.31): @@ -11403,9 +12496,9 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@5.1.1(postcss@8.4.31): + postcss-normalize-repeat-style@5.1.1(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-normalize-repeat-style@6.0.0(postcss@8.4.31): @@ -11413,9 +12506,9 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-normalize-string@5.1.0(postcss@8.4.31): + postcss-normalize-string@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-normalize-string@6.0.0(postcss@8.4.31): @@ -11423,9 +12516,9 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@5.1.0(postcss@8.4.31): + postcss-normalize-timing-functions@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-normalize-timing-functions@6.0.0(postcss@8.4.31): @@ -11433,10 +12526,10 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@5.1.1(postcss@8.4.31): + postcss-normalize-unicode@5.1.1(postcss@8.5.17): dependencies: browserslist: 4.22.1 - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-normalize-unicode@6.0.0(postcss@8.4.31): @@ -11445,10 +12538,10 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-normalize-url@5.1.0(postcss@8.4.31): + postcss-normalize-url@5.1.0(postcss@8.5.17): dependencies: normalize-url: 6.1.0 - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-normalize-url@6.0.0(postcss@8.4.31): @@ -11456,9 +12549,9 @@ snapshots: postcss: 8.4.31 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@5.1.1(postcss@8.4.31): + postcss-normalize-whitespace@5.1.1(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-normalize-whitespace@6.0.0(postcss@8.4.31): @@ -11470,10 +12563,10 @@ snapshots: dependencies: postcss: 8.4.31 - postcss-ordered-values@5.1.3(postcss@8.4.31): + postcss-ordered-values@5.1.3(postcss@8.5.17): dependencies: - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.5.17) + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-ordered-values@6.0.0(postcss@8.4.31): @@ -11565,11 +12658,11 @@ snapshots: postcss: 8.4.31 postcss-selector-parser: 6.0.13 - postcss-reduce-initial@5.1.2(postcss@8.4.31): + postcss-reduce-initial@5.1.2(postcss@8.5.17): dependencies: browserslist: 4.22.1 caniuse-api: 3.0.0 - postcss: 8.4.31 + postcss: 8.5.17 postcss-reduce-initial@6.0.0(postcss@8.4.31): dependencies: @@ -11577,9 +12670,9 @@ snapshots: caniuse-api: 3.0.0 postcss: 8.4.31 - postcss-reduce-transforms@5.1.0(postcss@8.4.31): + postcss-reduce-transforms@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 postcss-reduce-transforms@6.0.0(postcss@8.4.31): @@ -11601,9 +12694,9 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-svgo@5.1.0(postcss@8.4.31): + postcss-svgo@5.1.0(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-value-parser: 4.2.0 svgo: 2.8.0 @@ -11613,9 +12706,9 @@ snapshots: postcss-value-parser: 4.2.0 svgo: 3.0.4 - postcss-unique-selectors@5.1.1(postcss@8.4.31): + postcss-unique-selectors@5.1.1(postcss@8.5.17): dependencies: - postcss: 8.4.31 + postcss: 8.5.17 postcss-selector-parser: 6.0.13 postcss-unique-selectors@6.0.0(postcss@8.4.31): @@ -11640,9 +12733,15 @@ snapshots: postcss@8.4.31: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + postcss@8.5.17: + dependencies: + nanoid: 3.3.16 + picocolors: 1.1.1 + source-map-js: 1.2.1 prelude-ls@1.2.1: {} @@ -11735,6 +12834,8 @@ snapshots: qs@6.5.3: {} + quansync@0.2.11: {} + query-string@4.3.4: dependencies: object-assign: 4.1.1 @@ -11825,6 +12926,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@5.0.0: {} + regenerate-unicode-properties@10.1.1: dependencies: regenerate: 1.4.2 @@ -11945,6 +13048,27 @@ snapshots: hash-base: 3.1.0 inherits: 2.0.4 + rolldown@1.1.5: + dependencies: + '@oxc-project/types': 0.139.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 + router@2.2.0: dependencies: debug: 4.4.3 @@ -12038,6 +13162,8 @@ snapshots: scule@0.2.1: {} + scule@1.3.0: {} + semver@5.7.2: {} semver@6.3.1: {} @@ -12240,7 +13366,7 @@ snapshots: source-list-map@2.0.1: {} - source-map-js@1.0.2: {} + source-map-js@1.2.1: {} source-map-resolve@0.5.3: dependencies: @@ -12404,10 +13530,10 @@ snapshots: tslib: 2.6.2 webpack: 4.47.0 - stylehacks@5.1.1(postcss@8.4.31): + stylehacks@5.1.1(postcss@8.5.17): dependencies: browserslist: 4.22.1 - postcss: 8.4.31 + postcss: 8.5.17 postcss-selector-parser: 6.0.13 stylehacks@6.0.0(postcss@8.4.31): @@ -12435,7 +13561,7 @@ snapshots: css-select: 4.3.0 css-tree: 1.1.3 csso: 4.2.0 - picocolors: 1.0.0 + picocolors: 1.1.1 stable: 0.1.8 svgo@3.0.4: @@ -12446,7 +13572,7 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.0.0 + picocolors: 1.1.1 table@6.8.1: dependencies: @@ -12535,6 +13661,11 @@ snapshots: dependencies: setimmediate: 1.0.5 + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -12578,9 +13709,9 @@ snapshots: dependencies: punycode: 2.3.1 - ts-pnp@1.2.0(typescript@5.3.2): + ts-pnp@1.2.0(typescript@7.0.2): optionalDependencies: - typescript: 5.3.2 + typescript: 7.0.2 tsconfig-paths@3.14.2: dependencies: @@ -12593,10 +13724,10 @@ snapshots: tslib@2.6.2: {} - tsutils@3.21.0(typescript@5.3.2): + tsutils@3.21.0(typescript@7.0.2): dependencies: tslib: 1.14.1 - typescript: 5.3.2 + typescript: 7.0.2 tty-browserify@0.0.0: {} @@ -12653,12 +13784,35 @@ snapshots: typedarray@0.0.6: {} - typescript@5.3.2: {} + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 ua-parser-js@1.0.37: {} ufo@1.3.2: {} + ufo@1.6.4: {} + uglify-js@3.17.4: {} unbox-primitive@1.0.2: @@ -12668,7 +13822,7 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - undici-types@5.26.5: {} + undici-types@8.3.0: {} unfetch@5.0.0: {} @@ -12704,6 +13858,43 @@ snapshots: unpipe@1.0.0: {} + unplugin-utils@0.3.2: + dependencies: + pathe: 2.0.3 + picomatch: 4.0.5 + + unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.39)(vue-router@4.6.4(vue@3.5.39(typescript@7.0.2)))(vue@3.5.39(typescript@7.0.2)): + dependencies: + '@babel/generator': 7.29.7 + '@vue-macros/common': 3.1.2(vue@3.5.39(typescript@7.0.2)) + '@vue/compiler-sfc': 3.5.39 + '@vue/language-core': 3.3.7 + ast-walker-scope: 0.8.3 + chokidar: 5.0.0 + json5: 2.2.3 + local-pkg: 1.2.1 + magic-string: 0.30.21 + mlly: 1.8.2 + muggle-string: 0.4.1 + pathe: 2.0.3 + picomatch: 4.0.5 + scule: 1.3.0 + tinyglobby: 0.2.17 + unplugin: 2.3.11 + unplugin-utils: 0.3.2 + yaml: 2.9.0 + optionalDependencies: + vue-router: 4.6.4(vue@3.5.39(typescript@7.0.2)) + transitivePeerDependencies: + - vue + + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.17.0 + picomatch: 4.0.5 + webpack-virtual-modules: 0.6.2 + unset-value@1.0.0: dependencies: has-value: 0.3.1 @@ -12718,7 +13909,7 @@ snapshots: dependencies: browserslist: 4.22.1 escalade: 3.1.1 - picocolors: 1.0.0 + picocolors: 1.1.1 upper-case@1.1.3: {} @@ -12780,8 +13971,36 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 + vite-plugin-vuetify@2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4): + dependencies: + '@vuetify/loader-shared': 2.1.2(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4) + debug: 4.4.3 + upath: 2.0.1 + vite: 8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0) + vue: 3.5.39(typescript@7.0.2) + vuetify: 4.1.4(typescript@7.0.2)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@7.0.2)) + transitivePeerDependencies: + - supports-color + + vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0): + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.5 + postcss: 8.5.17 + rolldown: 1.1.5 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 26.1.1 + fsevents: 2.3.3 + jiti: 1.21.0 + sass: 1.32.13 + terser: 5.24.0 + yaml: 2.9.0 + vm-browserify@1.1.2: {} + vscode-uri@3.1.0: {} + vue-client-only@2.1.0: {} vue-eslint-parser@7.11.0(eslint@7.32.0): @@ -12799,7 +14018,7 @@ snapshots: vue-hot-reload-api@2.3.4: {} - vue-loader@15.11.1(cache-loader@4.1.0(webpack@4.47.0))(css-loader@5.2.7(webpack@4.47.0))(lodash@4.17.21)(vue-template-compiler@2.7.15)(webpack@4.47.0): + vue-loader@15.11.1(@vue/compiler-sfc@3.5.39)(cache-loader@4.1.0(webpack@4.47.0))(css-loader@5.2.7(webpack@4.47.0))(lodash@4.17.21)(vue-template-compiler@2.7.15)(webpack@4.47.0): dependencies: '@vue/component-compiler-utils': 3.3.0(lodash@4.17.21) css-loader: 5.2.7(webpack@4.47.0) @@ -12809,6 +14028,7 @@ snapshots: vue-style-loader: 4.1.3 webpack: 4.47.0 optionalDependencies: + '@vue/compiler-sfc': 3.5.39 cache-loader: 4.1.0(webpack@4.47.0) vue-template-compiler: 2.7.15 transitivePeerDependencies: @@ -12876,6 +14096,11 @@ snapshots: dependencies: vue: 2.7.15 + vue-router@4.6.4(vue@3.5.39(typescript@7.0.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.39(typescript@7.0.2) + vue-server-renderer@2.7.15: dependencies: chalk: 4.1.2 @@ -12899,25 +14124,48 @@ snapshots: vue-template-es2015-compiler@1.9.1: {} + vue-tsc@3.3.7(typescript@7.0.2): + dependencies: + '@volar/typescript': 2.4.28 + '@vue/language-core': 3.3.7 + typescript: 7.0.2 + vue@2.7.15: dependencies: '@vue/compiler-sfc': 2.7.15 csstype: 3.1.2 - vuetify-loader@1.9.2(vue@2.7.15)(vuetify@2.7.1(vue@2.7.15))(webpack@4.47.0): + vue@3.5.39(typescript@7.0.2): + dependencies: + '@vue/compiler-dom': 3.5.39 + '@vue/compiler-sfc': 3.5.39 + '@vue/runtime-dom': 3.5.39 + '@vue/server-renderer': 3.5.39(vue@3.5.39(typescript@7.0.2)) + '@vue/shared': 3.5.39 + optionalDependencies: + typescript: 7.0.2 + + vuetify-loader@1.9.2(vue@3.5.39(typescript@7.0.2))(vuetify@2.7.1(vue@3.5.39(typescript@7.0.2)))(webpack@4.47.0): dependencies: acorn: 8.11.2 acorn-walk: 8.3.0 decache: 4.6.2 file-loader: 6.2.0(webpack@4.47.0) loader-utils: 2.0.4 - vue: 2.7.15 - vuetify: 2.7.1(vue@2.7.15) + vue: 3.5.39(typescript@7.0.2) + vuetify: 2.7.1(vue@3.5.39(typescript@7.0.2)) webpack: 4.47.0 - vuetify@2.7.1(vue@2.7.15): + vuetify@2.7.1(vue@3.5.39(typescript@7.0.2)): dependencies: - vue: 2.7.15 + vue: 3.5.39(typescript@7.0.2) + + vuetify@4.1.4(typescript@7.0.2)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@7.0.2)): + dependencies: + vue: 3.5.39(typescript@7.0.2) + optionalDependencies: + typescript: 7.0.2 + vite-plugin-vuetify: 2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4) vuex@3.6.2(vue@2.7.15): dependencies: @@ -12963,7 +14211,7 @@ snapshots: html-escaper: 2.0.2 is-plain-object: 5.0.0 opener: 1.5.2 - picocolors: 1.0.0 + picocolors: 1.1.1 sirv: 2.0.3 ws: 7.5.9 transitivePeerDependencies: @@ -12992,6 +14240,8 @@ snapshots: source-list-map: 2.0.1 source-map: 0.6.1 + webpack-virtual-modules@0.6.2: {} + webpack@4.47.0: dependencies: '@webassemblyjs/ast': 1.9.0 @@ -13107,4 +14357,6 @@ snapshots: yaml@1.10.2: {} + yaml@2.9.0: {} + yocto-queue@0.1.0: {} diff --git a/public/dryicons_love_file_icon_6200.png b/public/dryicons_love_file_icon_6200.png new file mode 100644 index 0000000000000000000000000000000000000000..5b7176a47906fe800a9cd03b56da2f1b936f52ca GIT binary patch literal 20365 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 i^uqBev)_%l7yk#wJ_DSuFO2B`0000document-heart-filled \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..61ee90176ff9de0b9ff63b468cc436724986d9ee GIT binary patch literal 4286 zcmd^?Yfw~W9LA5?jC~VC0u|T=K~zXIf!*b@uuHJ0K-pyEpowXk(1_Y(FwQ8Vl8{Xe z(#38FI^{4!(@Z((m70QZ+c zKI6c6m_sro4?SduP9(p%{(C$bwE$5;s|R>XeuK@{154NeB*Zl%amiikcb*qW4(^a` z9f>bKNlr#nFMlJyz20_Ft-ElYKdh!QBv|XoDrCI9=yN9Gt+lMf6Nn6q7JePs-XrlF zeyqZ&&yS6&>Jt@czgh>W{cpee45^kd7<^{JpbvzBb;w*(?8VuEv_&uH68n{u^x?4i zztPcz?2W4sIolKFfSC>z&AGTBJ-#R}QR5_WIA3!L?-cAr{`O63FGTy#5N0`jE~N6v zG*SS%rNspfb(nJ>zxM_%HPom%kn3(T4w938_H*U&a>UG;#dx@F65h}c z$A2im%l)8x zPU>u^v}?5Ec>I@q7U%CkdXfceldbpkTuPi87wI*Py$ab&h-BT)-=2vm zK0~LdJ6U4l=K?BgC_(Wq>(g?2f7{*A`Jcb*8R8aF*N>5=}D+4+lv*kV`C5U zoqGS!_!9rLgfKkKd=JL_zWml=z!*98{w1~F$o!`mg1MJ>(`s!@>_Pvf2Az8Ud}Tu# zEc4VJlm2$tW16qS9eJJboqPZGa+S5^59&o~*!~`lX+M^$C{w8^9Ggr{qK1BCOr&#C UF}!XU1>T05Oie+qGL_QdALNiJUH||9 literal 0 HcmV?d00001 diff --git a/public/favicon_def.ico b/public/favicon_def.ico new file mode 100644 index 0000000000000000000000000000000000000000..3632d0c89129045dc4103e84e59e426c57b8f51a GIT binary patch literal 1393 zcmV-%1&;cOP)Px)D@jB_R9Fe^ReNldMG&9eyIx;VxmMIdgjhwCKeVN$X=xNR5F_{iAD9pW6t#*F zgsb$5TDXc(+R_KbHns{HwTUSSMxqkbMAXm+Qmqd}qLq*w23kw2)Y7}&?)uyB`r&ui zgSLtP7@6d5XJ%(+e>;!;h%VEAG6Suz+(=E0vHu2kKIR~YDr+g=KThO5N?%t`9J7Cz z!`J{cS7sBbmBg4LMc2`Q*c=vb%;M+)D8)#rilGypCSqLx@dPzj-aO`0Ee@jx&{DMo z2WG&xg=Vd*Cq_lch7F)fE%7L^BtJ8$xL~eTcPV~!0CdAiRcr*Z+1D9sR%#uxa2%lS zMHc30U1D*;LsF_{LE;nVHg~>ZH^SfO0I1*c5a(Lr^e$ztX)$85I|Ia7@DN4Y6RSN5 zisVjYMleQy5y_2LmgG+w;e3P~i4NCXgH*d=HbBx*5MrLSb{`J>9A!vneqSRxGno<9 zE23>mQG7tr%OUm=gpmORdJXM@drwr%R(lc%Hl26;kf|LIe!i@Uup z*Llp$^8n6C$?f4TR{7EZgs8wRV8aUOrpM1&9Zf!U!LkK0XZn-1d__lJO8SGj2H%rk z@(%pkpq}e2T|eKn4__}1pt<5c)b=i<{s+pMyer&M%jvnfQA(ANZUt|F4GdoFEX4rC-M{KbO^D{(o%D)QCbo>s)CXAnlwG$1v zG;RKh+q6M%LCF^=-+R!_`1Hh)C$%n|A_Hh?Ux_qOl*A&ww!d(JcrU;Vzm zBG@?@XRm(q{u@8){e>ARy8+@`9F{%vo}5Rut}DOnXHL8pwpR&B8???!!vXa93sL(d z7}ev^F#=m1G@tfB&J5T*g`4%n#MuEhNFI+z66b5RB$+6gvwV4s=Hnc(FX2KxVAtV= zoT7Cmg#u`*xdEwPjlh3UtnETz)7V_4UsRy3cBH?kdC#u1re3e@AG~=G{(JEdP3`SM z|A4$M&soglW;|3e0KQf0ObP`+zET)O5%DcFb4{0NWL@>xLB1RP@zaEilp5=v$vc>R zJ#Os7gltH=e}(ZJCtn{ATlR}$Y6*J5Xi{ze4}hlX*{IVZpg%zqd9@kLx?0B$wa+`~ z@dT{8k1qE3ZMq>boI;T?y4pSnK!58AkB&jyP1Dx+f_&(| z@D4l!jWKpe^+%z*p;ELnVGFW!2Bo?%mfh~sy^PqGXwo~9O7a(Kk05}S%B4vCOgJ2( zS!?%%h6+l?*b!|q$1akMRcDMPsTZLO8B1irg)A#%p)|d&4pVxhE)Ffb6^8??E%{@J9`p7P#__uNTS#9TpzPzVuwC5DwQPdixgxK z$6~Dd^w&+2dJAv+m`Oz2ol=McA&%%hWCL`l@?rdE;fE27OwMDy=O^#?a$EmkbYzQ* zYh|omoW8~B2*hv;bbiiZi+cUyUYB?NFB$k7NQU1u0aJ3K00000NkvXXu0mjfj6#%2 literal 0 HcmV?d00001 diff --git a/public/v.png b/public/v.png new file mode 100644 index 0000000000000000000000000000000000000000..a2ce2353f273cbda4cc6de145f86062ff039a1d2 GIT binary patch literal 5674 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 P6963zeMGIAUBv$Y4kLO$ literal 0 HcmV?d00001 diff --git a/public/vuetify-logo.svg b/public/vuetify-logo.svg new file mode 100644 index 0000000..145b6d1 --- /dev/null +++ b/public/vuetify-logo.svg @@ -0,0 +1 @@ +Artboard 46 diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..518be91 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,7 @@ + diff --git a/src/api/http.ts b/src/api/http.ts new file mode 100644 index 0000000..87de2c1 --- /dev/null +++ b/src/api/http.ts @@ -0,0 +1,33 @@ +async function request(url: string, init?: RequestInit): Promise { + const res = await fetch(url, { + ...init, + headers: { + 'Content-Type': 'application/json', + ...(init?.headers ?? {}), + }, + }) + + if (!res.ok) { + throw new Error(`${init?.method ?? 'GET'} ${url} failed: ${res.status} ${res.statusText}`) + } + + // Some daemon endpoints reply 204 or with an empty body. + const text = await res.text() + return (text ? JSON.parse(text) : null) as T +} + +export function get(url: string): Promise { + return request(url) +} + +export function post(url: string, body?: unknown): Promise { + return request(url, { method: 'POST', body: JSON.stringify(body) }) +} + +export function put(url: string, body?: unknown): Promise { + return request(url, { method: 'PUT', body: JSON.stringify(body) }) +} + +export function del(url: string): Promise { + return request(url, { method: 'DELETE' }) +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..404617e --- /dev/null +++ b/src/main.ts @@ -0,0 +1,6 @@ +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' +import vuetify from './plugins/vuetify' + +createApp(App).use(router).use(vuetify).mount('#app') diff --git a/src/pages/index.vue b/src/pages/index.vue new file mode 100644 index 0000000..95568c9 --- /dev/null +++ b/src/pages/index.vue @@ -0,0 +1,3 @@ + diff --git a/src/plugins/vuetify.ts b/src/plugins/vuetify.ts new file mode 100644 index 0000000..4a87f84 --- /dev/null +++ b/src/plugins/vuetify.ts @@ -0,0 +1,27 @@ +import 'vuetify/styles' +import '@mdi/font/css/materialdesignicons.css' +import { createVuetify } from 'vuetify' + +// NOTE: the plan called for registering VTimePicker from `vuetify/labs/VTimePicker`, +// which is where it lived in Vuetify 3. In Vuetify 4 it has graduated out of labs +// into the stable `vuetify/components` entry point, so that path no longer exists +// and importing it breaks the dev server. As a stable component it is picked up by +// vite-plugin-vuetify's autoImport, so globalconfig.vue can use +// with no explicit registration here. +export default createVuetify({ + theme: { + defaultTheme: 'dark', + themes: { + dark: { + dark: true, + colors: { + primary: '#9E9E9E', + secondary: '#FF8F00', + }, + }, + }, + }, + icons: { + defaultSet: 'mdi', + }, +}) diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..bab6142 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,7 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { routes } from 'vue-router/auto-routes' + +export default createRouter({ + history: createWebHistory(), + routes, +}) diff --git a/src/typed-router.d.ts b/src/typed-router.d.ts new file mode 100644 index 0000000..40c54ec --- /dev/null +++ b/src/typed-router.d.ts @@ -0,0 +1,64 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection ES6UnusedImports +// Generated by unplugin-vue-router. !! DO NOT MODIFY THIS FILE !! +// It's recommended to commit this file. +// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry. + +declare module 'vue-router/auto-resolver' { + export type ParamParserCustom = never +} + +declare module 'vue-router/auto-routes' { + import type { + RouteRecordInfo, + ParamValue, + ParamValueOneOrMore, + ParamValueZeroOrMore, + ParamValueZeroOrOne, + } from 'vue-router' + + /** + * Route name map generated by unplugin-vue-router + */ + export interface RouteNamedMap { + '/': RouteRecordInfo< + '/', + '/', + Record, + Record, + | never + >, + } + + /** + * Route file to route info map by unplugin-vue-router. + * Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`. + * + * Each key is a file path relative to the project root with 2 properties: + * - routes: union of route names of the possible routes when in this page (passed to useRoute<...>()) + * - views: names of nested views (can be passed to ) + * + * @internal + */ + export interface _RouteFileInfoMap { + 'src/pages/index.vue': { + routes: + | '/' + views: + | never + } + } + + /** + * Get a union of possible route names in a certain route component file. + * Used by the \`sfc-typed-router\` Volar plugin to automatically type \`useRoute()\`. + * + * @internal + */ + export type _RouteNamesForFilePath = + _RouteFileInfoMap extends Record + ? Info['routes'] + : keyof RouteNamedMap +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..413e33e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "bundler", + "lib": ["ESNext", "DOM", "DOM.Iterable"], + "strict": false, + "jsx": "preserve", + "resolveJsonModule": true, + "esModuleInterop": true, + "skipLibCheck": true, + "noEmit": true, + "allowJs": true, + "types": ["vite/client", "unplugin-vue-router/client"], + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.vue", "vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..aac9941 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,35 @@ +import { fileURLToPath, URL } from 'node:url' +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vuetify from 'vite-plugin-vuetify' +import VueRouter from 'unplugin-vue-router/vite' + +export default defineConfig({ + plugins: [ + // VueRouter must come before vue() + VueRouter({ + routesFolder: 'src/pages', + dts: 'src/typed-router.d.ts', + }), + vue(), + vuetify({ autoImport: true }), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + server: { + port: 5173, + proxy: { + // Forwards app-origin API calls to the standalone Express server in dev. + // In production the same Express server serves the built SPA, so the + // relative /api path resolves without any proxy. This is why no baseURL + // is configured anywhere in the app. + '/api': { + target: 'http://localhost:10009', + changeOrigin: true, + }, + }, + }, +}) From 89d4701f213e87f0b97b47da080aa3933bf4f723 Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 17:55:41 +0200 Subject: [PATCH 14/66] fix: run the old Nuxt app from a reference worktree, pin TypeScript 5 Nuxt 2 and Vue 3 cannot coexist in one node_modules: 'vue' is one package name at two versions, and shamefullyHoist (which Nuxt 2 itself requires) forces the collision. Vuetify 2 and 4 collide the same way. The plan's claim that they were "separate packages in the tree" was wrong, and Task 3 killed the Nuxt app. Side-by-side comparison is the entire verification strategy for Tasks 4-12, so the old app now runs from ../avior-nuxt-reference, a git worktree pinned to baff6fe with its own node_modules. Verified: compiles with zero errors, boots. The dead dev:nuxt / build:nuxt / start:nuxt scripts are removed. Also: - typescript pinned to ^5. vue-tsc peers on ">=5.0.0", which TypeScript 7 satisfies while being wholly incompatible: pnpm typecheck died with ERR_PACKAGE_PATH_NOT_EXPORTED. Now 5.9.3 and typecheck passes. - VTimePicker is stable in Vuetify 4, not labs. Plan corrected; this removes the risk flagged as Task 12's likeliest blocker. Co-Authored-By: Claude Opus 4.8 (1M context) --- .superpowers/sdd/progress.md | 55 +-- .../2026-07-13-nuxt2-to-vue3-migration.md | 29 +- .../task-01.md | 3 +- .../task-02.md | 3 +- .../task-03.md | 15 +- .../task-04.md | 15 +- .../task-05.md | 15 +- .../task-06.md | 15 +- .../task-07.md | 15 +- .../task-08.md | 15 +- .../task-09.md | 15 +- .../task-10.md | 15 +- .../task-11.md | 15 +- .../task-12.md | 17 +- .../task-13.md | 3 +- .../task-14.md | 3 +- .../task-15.md | 3 +- package.json | 5 +- pnpm-lock.yaml | 367 ++++-------------- 19 files changed, 261 insertions(+), 362 deletions(-) diff --git a/.superpowers/sdd/progress.md b/.superpowers/sdd/progress.md index 99d3349..98a513f 100644 --- a/.superpowers/sdd/progress.md +++ b/.superpowers/sdd/progress.md @@ -1,31 +1,38 @@ # Migration progress ledger Base: c97abfd +Reference worktree: ../avior-nuxt-reference @ baff6fe (last commit where Nuxt runs). + This is the visual reference for Tasks 4-12. `cd ../avior-nuxt-reference && pnpm dev`. -Task 1: complete (03b7026, +2da0ae4 fixup) — pnpm. Reviewed clean. - Finding: pnpm 11 ignores shamefully-hoist in .npmrc; it lives in pnpm-workspace.yaml. -Task 2: complete (8f5407f) — Express API extracted from Nuxt serverMiddleware. -Task 2b: complete (3e19a49, +baff6fe, +2396919 fixups) — Mongoose 9.7.4, Express 5.2.1, Node 24. - Reviewed: SPEC PASS, quality approved with issues; Important issues all fixed. - Key finding (fixed): Express 5 leaves req.body undefined, not {} — bodyless POSTs - returned 500 HTML with a stack trace. Now 400 JSON. Added a JSON error handler. - Key finding (fixed): mongoose.connect() had no .catch() — unreachable DB killed the - process under Node 24. Now survives; queries 500 in ~5s via bufferTimeoutMS. - Confirmed: Nuxt 2 serverMiddleware DOES consume an Express 5 app (was the big unknown). - Confirmed: '/*splat' fallback does not swallow /api 404s (reviewer verified empirically). +Task 1: complete (03b7026, +2da0ae4) — pnpm. Reviewed clean. +Task 2: complete (8f5407f) — Express API extracted from Nuxt serverMiddleware. +Task 2b: complete (3e19a49, +baff6fe, +2396919) — Mongoose 9.7.4, Express 5.2.1, Node 24. + Reviewed: SPEC PASS. All Important issues fixed. +Task 3: complete (872fe5c, + follow-up) — Vue 3.5.39 / Vuetify 4.1.4 / vue-router 4.6.4 / + Vite 8.1.4 scaffold. Vite proxy -> Express verified (500 JSON, not 404/HTML). +Task 4: NEXT — port the layout. Opus. Everything downstream depends on it. -DEFERRED to Task 13 (recorded in the plan, do not lose): - - NODE_ENV=production in the Dockerfile, else Express leaks stack traces in prod. - - engines field in package.json (Mongoose 9 needs node >= 20.19; nothing enforces it). - - README documents mounting config.json to override the Mongo URL. That file is GONE. - An operator following it gets the DEFAULT database silently. Actively harmful. -DEFERRED to Task 15: - - pnpm lint fails repo-wide (2136 problems). server/*.js violates the repo eslint style. -MINOR, accepted: - - Missing static assets fall through to the SPA fallback and return index.html with 200. +KEY FINDINGS (do not re-learn these): + - Nuxt 2 and Vue 3 CANNOT coexist in one node_modules. Same package name, two versions, + and shamefullyHoist (which Nuxt 2 needs) forces the collision. Vuetify 2/4 same. + Hence the reference worktree. The plan's original "run both apps in one tree" was WRONG. + - VTimePicker is STABLE in Vuetify 4 (was labs in v3). No labs import. The biggest + flagged risk for Task 12 has evaporated. + - vue-tsc CANNOT use TypeScript 7 despite peering on ">=5.0.0". Pinned to 5.9.3. + - Express 5 leaves req.body undefined, not {}. Guarded. + - assets/variables.scss was NOT imported by any component; the @import was injected by + @nuxtjs/vuetify's customVariables option. Deleting it is correct for the Vite app. + - pnpm 11 ignores shamefully-hoist in .npmrc; it lives in pnpm-workspace.yaml. -NEVER VERIFIED — needs a run on the real LAN before Task 13 is trusted: - - Any successful MongoDB query. 10.11.194.75:27017 is unreachable from this machine. - - Any Docker build. Docker is not installed here. node:24-alpine is untested. +PROCESS: do NOT run `git commit` while a subagent is live — it takes the whole index and + swallows their staged files. This happened twice (Task 1, Task 3). -Task 3: IN PROGRESS — scaffold Vue 3 + Vite + Vuetify 4. +DEFERRED to Task 13: NODE_ENV=production in Dockerfile; engines field; README's config.json + volume-mount instruction is now actively harmful (silently reverts MONGO_URL to default). +DEFERRED to Task 15: pnpm lint fails repo-wide (2136 problems); server/*.js style. + +NEVER VERIFIED — needs the real LAN / a Docker host: + - Any successful MongoDB query (10.11.194.75 unreachable from this machine). + - Any Docker build (Docker not installed here). node:24-alpine untested. + - Any actual rendered page in a browser (no browser in this environment). All frontend + verification so far is HTTP/compile-level only. THIS IS A REAL GAP for Tasks 4-12. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md index 759f8ba..b1c27f8 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md @@ -23,7 +23,8 @@ Design spec: `docs/superpowers/specs/2026-07-13-nuxt2-to-vue3-migration-design.m - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -53,7 +54,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -96,7 +97,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. @@ -489,7 +498,7 @@ These are added alongside the Nuxt dependencies. The two dependency trees coexis ```bash pnpm add vue@^3.5 vue-router@^4.6 vuetify@^4.1 @mdi/font -pnpm add -D vite @vitejs/plugin-vue vite-plugin-vuetify@^2.1 unplugin-vue-router typescript vue-tsc @types/node +pnpm add -D vite @vitejs/plugin-vue vite-plugin-vuetify@^2.1 unplugin-vue-router typescript@^5 vue-tsc @types/node ``` Two of these pins are deliberate and must not be "upgraded": @@ -498,6 +507,8 @@ Two of these pins are deliberate and must not be "upgraded": `vue-router@^4.6` — vue-router 5 exists, but `unplugin-vue-router@0.19.2` (the newest) declares `vue-router: ^4.6.0` as its peer. Since this project uses file-based routing, vue-router 4.6.x is required. Installing vue-router 5 will break routing. If a future unplugin-vue-router supports v5, that is a separate change, not this task. +`typescript@^5` — TypeScript 7 exists, and `vue-tsc` declares its peer as `typescript: >=5.0.0`, which TS 7 satisfies semantically. It does not work: `vue-tsc` 3.x cannot consume TS 7 and `pnpm typecheck` dies with `ERR_PACKAGE_PATH_NOT_EXPORTED`. The peer range is a lie; pin to 5.x. + Record the resolved versions from the pnpm output in the commit message. - [ ] Step 2: Delete the dead files @@ -619,13 +630,11 @@ Strict mode is off for now. Components are still JavaScript until Task 14; turni import 'vuetify/styles' import '@mdi/font/css/materialdesignicons.css' import { createVuetify } from 'vuetify' -import { VTimePicker } from 'vuetify/labs/VTimePicker' +// VTimePicker graduated out of labs in Vuetify 4 and lives in the stable +// entry point, so vite-plugin-vuetify auto-imports it. Importing it from +// vuetify/labs/VTimePicker (its Vuetify 3 location) breaks the dev server. export default createVuetify({ - // VTimePicker is still in Vuetify labs and is not auto-imported by - // vite-plugin-vuetify. globalconfig.vue needs it for the client - // availability window. - components: { VTimePicker }, theme: { defaultTheme: 'dark', themes: { @@ -1233,7 +1242,7 @@ The `async fetch()` at line 278 becomes `refresh()` from `mounted()`. The many ` - [ ] Step 3: Verify the time picker specifically -`VTimePicker` is registered from `vuetify/labs/VTimePicker` in Task 3. If it fails to render, the labs import is the first thing to check. Being in labs, its props may differ from the Vuetify 2 component — read the labs docs rather than assuming. +`VTimePicker` is STABLE in Vuetify 4 (it was in labs in Vuetify 3), so it is auto-imported and needs no registration. This was the component flagged as the likeliest blocker in this migration; that risk has evaporated. Its props may still differ from the Vuetify 2 component — check them rather than assuming. The availability window (`client.AvailabilityStart` / `client.AvailabilityEnd`) is what it drives. Set a start and end time, save, reload, and confirm the values persist and display identically to the old app. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md index 784396d..2979f6b 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md index 136705c..a4a7575 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md index e8e3d14..e4e1e83 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -56,7 +57,7 @@ These are added alongside the Nuxt dependencies. The two dependency trees coexis ```bash pnpm add vue@^3.5 vue-router@^4.6 vuetify@^4.1 @mdi/font -pnpm add -D vite @vitejs/plugin-vue vite-plugin-vuetify@^2.1 unplugin-vue-router typescript vue-tsc @types/node +pnpm add -D vite @vitejs/plugin-vue vite-plugin-vuetify@^2.1 unplugin-vue-router typescript@^5 vue-tsc @types/node ``` Two of these pins are deliberate and must not be "upgraded": @@ -65,6 +66,8 @@ Two of these pins are deliberate and must not be "upgraded": `vue-router@^4.6` — vue-router 5 exists, but `unplugin-vue-router@0.19.2` (the newest) declares `vue-router: ^4.6.0` as its peer. Since this project uses file-based routing, vue-router 4.6.x is required. Installing vue-router 5 will break routing. If a future unplugin-vue-router supports v5, that is a separate change, not this task. +`typescript@^5` — TypeScript 7 exists, and `vue-tsc` declares its peer as `typescript: >=5.0.0`, which TS 7 satisfies semantically. It does not work: `vue-tsc` 3.x cannot consume TS 7 and `pnpm typecheck` dies with `ERR_PACKAGE_PATH_NOT_EXPORTED`. The peer range is a lie; pin to 5.x. + Record the resolved versions from the pnpm output in the commit message. - [ ] Step 2: Delete the dead files @@ -186,13 +189,11 @@ Strict mode is off for now. Components are still JavaScript until Task 14; turni import 'vuetify/styles' import '@mdi/font/css/materialdesignicons.css' import { createVuetify } from 'vuetify' -import { VTimePicker } from 'vuetify/labs/VTimePicker' +// VTimePicker graduated out of labs in Vuetify 4 and lives in the stable +// entry point, so vite-plugin-vuetify auto-imports it. Importing it from +// vuetify/labs/VTimePicker (its Vuetify 3 location) breaks the dev server. export default createVuetify({ - // VTimePicker is still in Vuetify labs and is not auto-imported by - // vite-plugin-vuetify. globalconfig.vue needs it for the client - // availability window. - components: { VTimePicker }, theme: { defaultTheme: 'dark', themes: { diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md index 4f63994..5b670aa 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md index 25ad89b..4597b4c 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md index 4e1cd2d..dab518e 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md index 7bcc372..9572f83 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md index 17645e8..503c46a 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md index 200e356..2e90f3a 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md index b451f58..560eadc 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md index b3e7657..3970cc3 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md index fa44de7..d01a6d1 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. @@ -50,7 +51,7 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | | `v-data-table` slot `#item.foo` | `#item.foo` still, but `foo` now matches the header `key` | | `v-data-table` `:items-per-page` etc. | unchanged, but check the component renders before assuming | -| `` | still in Vuetify labs — needs an explicit labs import (see Task 3) | +| `` | exists and is STABLE in Vuetify 4 (it was in labs in Vuetify 3). No labs import, no manual registration — `vite-plugin-vuetify` auto-imports it. | ### Template: additional Vuetify 4 changes @@ -93,7 +94,15 @@ There is no test suite. Verification means: 1. `pnpm dev` (Vite, port 5173) and `pnpm dev:api` (Express, port 10009) both running. 2. Open the ported page in the browser. -3. Open the old Nuxt app (`pnpm dev:nuxt`, port 3000) at the same page, side by side. +3. Open the OLD Nuxt app at the same page, side by side. It runs from a separate git worktree, NOT from this one: + +```bash +cd ../avior-nuxt-reference && pnpm dev +``` + +The reference worktree is pinned to commit `baff6fe`, the last commit where Nuxt still worked, and has its own isolated `node_modules`. It must exist; if it does not, recreate it with `git worktree add ../avior-nuxt-reference baff6fe --detach && cd ../avior-nuxt-reference && pnpm install`. It prints the port it chose — read it from the output rather than assuming. + +Nuxt CANNOT run from the main working tree any more, and `pnpm dev:nuxt` no longer exists. Vue 2 and Vue 3 are the same package name at two versions, so they cannot both occupy `node_modules/vue` — and `shamefullyHoist: true` (which Nuxt 2 itself requires) forces exactly that collision. Vuetify 2 and 4 collide the same way. This is not a bug to fix; it is why the reference lives in its own worktree. 4. Compare them, applying the right standard. What must match: every element is present, the hierarchy and grouping are the same, every interaction works, and the same data appears. What will NOT match, by design, because Vuetify 4 is Material Design 3: font sizes and weights, shadow depths, button label casing, exact spacing and breakpoints. Do not chase those. If you cannot tell whether a difference is intentional MD3 or a real regression, say so in your report rather than guessing — a wrong guess in either direction is worse than an open question. 5. Check the browser console. Zero errors and zero Vue warnings. Vuetify warns loudly about removed props, so a clean console is a real signal here — this, rather than pixel comparison, is now the sharpest tool for catching a bad port. @@ -131,7 +140,7 @@ The `async fetch()` at line 278 becomes `refresh()` from `mounted()`. The many ` - [ ] Step 3: Verify the time picker specifically -`VTimePicker` is registered from `vuetify/labs/VTimePicker` in Task 3. If it fails to render, the labs import is the first thing to check. Being in labs, its props may differ from the Vuetify 2 component — read the labs docs rather than assuming. +`VTimePicker` is STABLE in Vuetify 4 (it was in labs in Vuetify 3), so it is auto-imported and needs no registration. This was the component flagged as the likeliest blocker in this migration; that risk has evaporated. Its props may still differ from the Vuetify 2 component — check them rather than assuming. The availability window (`client.AvailabilityStart` / `client.AvailabilityEnd`) is what it drives. Set a start and end time, save, reload, and confirm the values persist and display identically to the old app. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md index 2cafc8b..9ba1f85 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md index 4996c1e..583813c 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md index 3abe3d3..4191f02 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md @@ -20,7 +20,8 @@ Read the constraints below before starting; they are not optional. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. - Every task ends with the app in a runnable state and a commit. -- Ports during coexistence: Nuxt dev on 3000, Vite dev on 5173, Express standalone on 10009. These must not collide. +- The old Nuxt app CANNOT run from this working tree once Task 3 lands. Vue 2 and Vue 3 are the same package name at two versions and cannot both occupy `node_modules/vue`, and `shamefullyHoist: true` (required by Nuxt 2) forces the collision; Vuetify 2 and 4 collide identically. The old app runs from a separate git worktree at `../avior-nuxt-reference`, pinned to commit `baff6fe`, with its own `node_modules`. That worktree is the visual reference for every port task. +- Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. - MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. diff --git a/package.json b/package.json index 7be0b50..b9bd7d9 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,6 @@ "preview": "vite preview", "dev:api": "node server/index.js", "start": "node server/index.js", - "dev:nuxt": "nuxt", - "build:nuxt": "nuxt build", - "start:nuxt": "nuxt start", "typecheck": "vue-tsc --noEmit", "lint:js": "eslint --ext .js,.vue --ignore-path .gitignore .", "lint": "pnpm lint:js" @@ -41,7 +38,7 @@ "babel-eslint": "^10.1.0", "eslint": "^7.32.0", "eslint-plugin-nuxt": "^1.0.0", - "typescript": "^7.0.2", + "typescript": "^5.9.3", "unplugin-vue-router": "^0.19.2", "vite": "^8.1.4", "vite-plugin-vuetify": "^2.1.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4e22d2..de827dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,7 +34,7 @@ importers: version: 9.7.4 nuxt: specifier: ^2.17.2 - version: 2.17.2(@vue/compiler-sfc@3.5.39)(consola@3.2.3)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)) + version: 2.17.2(@vue/compiler-sfc@3.5.39)(consola@3.2.3)(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)) promise.any: specifier: ^2.0.6 version: 2.0.6 @@ -43,29 +43,29 @@ importers: version: 2.88.2 vue: specifier: ^3.5.39 - version: 3.5.39(typescript@7.0.2) + version: 3.5.39(typescript@5.9.3) vue-router: specifier: ^4.6.4 - version: 4.6.4(vue@3.5.39(typescript@7.0.2)) + version: 4.6.4(vue@3.5.39(typescript@5.9.3)) vuetify: specifier: ^4.1.4 - version: 4.1.4(typescript@7.0.2)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@7.0.2)) + version: 4.1.4(typescript@5.9.3)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@5.9.3)) devDependencies: '@nuxtjs/eslint-config': specifier: ^3.1.0 - version: 3.1.0(eslint@7.32.0)(typescript@7.0.2) + version: 3.1.0(eslint@7.32.0)(typescript@5.9.3) '@nuxtjs/eslint-module': specifier: ^2.0.0 version: 2.0.0(eslint@7.32.0)(webpack@4.47.0) '@nuxtjs/vuetify': specifier: ^1.12.3 - version: 1.12.3(vue@3.5.39(typescript@7.0.2))(webpack@4.47.0) + version: 1.12.3(vue@3.5.39(typescript@5.9.3))(webpack@4.47.0) '@types/node': specifier: ^26.1.1 version: 26.1.1 '@vitejs/plugin-vue': specifier: ^6.0.7 - version: 6.0.7(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2)) + version: 6.0.7(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@5.9.3)) babel-eslint: specifier: ^10.1.0 version: 10.1.0(eslint@7.32.0) @@ -76,20 +76,20 @@ importers: specifier: ^1.0.0 version: 1.0.0(eslint@7.32.0) typescript: - specifier: ^7.0.2 - version: 7.0.2 + specifier: ^5.9.3 + version: 5.9.3 unplugin-vue-router: specifier: ^0.19.2 - version: 0.19.2(@vue/compiler-sfc@3.5.39)(vue-router@4.6.4(vue@3.5.39(typescript@7.0.2)))(vue@3.5.39(typescript@7.0.2)) + version: 0.19.2(@vue/compiler-sfc@3.5.39)(vue-router@4.6.4(vue@3.5.39(typescript@5.9.3)))(vue@3.5.39(typescript@5.9.3)) vite: specifier: ^8.1.4 version: 8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0) vite-plugin-vuetify: specifier: ^2.1.3 - version: 2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4) + version: 2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@5.9.3))(vuetify@4.1.4) vue-tsc: specifier: ^3.3.7 - version: 3.3.7(typescript@7.0.2) + version: 3.3.7(typescript@5.9.3) packages: @@ -1338,126 +1338,6 @@ packages: typescript: optional: true - '@typescript/typescript-aix-ppc64@7.0.2': - resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} - engines: {node: '>=16.20.0'} - cpu: [ppc64] - os: [aix] - - '@typescript/typescript-darwin-arm64@7.0.2': - resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [darwin] - - '@typescript/typescript-darwin-x64@7.0.2': - resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [darwin] - - '@typescript/typescript-freebsd-arm64@7.0.2': - resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [freebsd] - - '@typescript/typescript-freebsd-x64@7.0.2': - resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [freebsd] - - '@typescript/typescript-linux-arm64@7.0.2': - resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [linux] - - '@typescript/typescript-linux-arm@7.0.2': - resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} - engines: {node: '>=16.20.0'} - cpu: [arm] - os: [linux] - - '@typescript/typescript-linux-loong64@7.0.2': - resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} - engines: {node: '>=16.20.0'} - cpu: [loong64] - os: [linux] - - '@typescript/typescript-linux-mips64el@7.0.2': - resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} - engines: {node: '>=16.20.0'} - cpu: [mips64el] - os: [linux] - - '@typescript/typescript-linux-ppc64@7.0.2': - resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} - engines: {node: '>=16.20.0'} - cpu: [ppc64] - os: [linux] - - '@typescript/typescript-linux-riscv64@7.0.2': - resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} - engines: {node: '>=16.20.0'} - cpu: [riscv64] - os: [linux] - - '@typescript/typescript-linux-s390x@7.0.2': - resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} - engines: {node: '>=16.20.0'} - cpu: [s390x] - os: [linux] - - '@typescript/typescript-linux-x64@7.0.2': - resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [linux] - - '@typescript/typescript-netbsd-arm64@7.0.2': - resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [netbsd] - - '@typescript/typescript-netbsd-x64@7.0.2': - resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [netbsd] - - '@typescript/typescript-openbsd-arm64@7.0.2': - resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [openbsd] - - '@typescript/typescript-openbsd-x64@7.0.2': - resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [openbsd] - - '@typescript/typescript-sunos-x64@7.0.2': - resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [sunos] - - '@typescript/typescript-win32-arm64@7.0.2': - resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} - engines: {node: '>=16.20.0'} - cpu: [arm64] - os: [win32] - - '@typescript/typescript-win32-x64@7.0.2': - resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} - engines: {node: '>=16.20.0'} - cpu: [x64] - os: [win32] - '@vitejs/plugin-vue@6.0.7': resolution: {integrity: sha512-km+p+XdSz9Sxm5rqUbqcSfZYaAniKxWBj1KURl+Jr7UaPvvX7BmaWMdP69I5rrFDeQGyxAG7NXdc57vz+snhWg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6159,9 +6039,9 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript@7.0.2: - resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} - engines: {node: '>=16.20.0'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true ua-parser-js@1.0.37: @@ -7728,8 +7608,8 @@ snapshots: '@jridgewell/source-map@0.3.5': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/sourcemap-codec@1.5.5': {} @@ -7782,7 +7662,7 @@ snapshots: mkdirp: 1.0.4 rimraf: 3.0.2 - '@nuxt/babel-preset-app@2.17.2(vue@3.5.39(typescript@7.0.2))': + '@nuxt/babel-preset-app@2.17.2(vue@3.5.39(typescript@5.9.3))': dependencies: '@babel/compat-data': 7.23.5 '@babel/core': 7.23.5 @@ -7797,7 +7677,7 @@ snapshots: '@babel/plugin-transform-runtime': 7.23.4(@babel/core@7.23.5) '@babel/preset-env': 7.23.5(@babel/core@7.23.5) '@babel/runtime': 7.23.5 - '@vue/babel-preset-jsx': 1.4.0(@babel/core@7.23.5)(vue@3.5.39(typescript@7.0.2)) + '@vue/babel-preset-jsx': 1.4.0(@babel/core@7.23.5)(vue@3.5.39(typescript@5.9.3)) core-js: 3.33.3 core-js-compat: 3.33.3 regenerator-runtime: 0.14.0 @@ -7805,12 +7685,12 @@ snapshots: - supports-color - vue - '@nuxt/builder@2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2))': + '@nuxt/builder@2.17.2(@vue/compiler-sfc@3.5.39)(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))': dependencies: '@nuxt/devalue': 2.0.2 '@nuxt/utils': 2.17.2 '@nuxt/vue-app': 2.17.2 - '@nuxt/webpack': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)) + '@nuxt/webpack': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)) chalk: 4.1.2 chokidar: 3.5.3 consola: 3.2.3 @@ -8092,10 +7972,10 @@ snapshots: vue-meta: 2.4.0 vue-server-renderer: 2.7.15 - '@nuxt/webpack@2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2))': + '@nuxt/webpack@2.17.2(@vue/compiler-sfc@3.5.39)(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3))': dependencies: '@babel/core': 7.23.5 - '@nuxt/babel-preset-app': 2.17.2(vue@3.5.39(typescript@7.0.2)) + '@nuxt/babel-preset-app': 2.17.2(vue@3.5.39(typescript@5.9.3)) '@nuxt/friendly-errors-webpack-plugin': 2.6.0(webpack@4.47.0) '@nuxt/utils': 2.17.2 babel-loader: 8.3.0(@babel/core@7.23.5)(webpack@4.47.0) @@ -8115,7 +7995,7 @@ snapshots: memory-fs: 0.5.0 optimize-css-assets-webpack-plugin: 6.0.1(webpack@4.47.0) pify: 5.0.0 - pnp-webpack-plugin: 1.7.0(typescript@7.0.2) + pnp-webpack-plugin: 1.7.0(typescript@5.9.3) postcss: 8.4.31 postcss-import: 15.1.0(postcss@8.4.31) postcss-import-resolver: 2.0.0 @@ -8215,12 +8095,12 @@ snapshots: transitivePeerDependencies: - debug - '@nuxtjs/eslint-config@3.1.0(eslint@7.32.0)(typescript@7.0.2)': + '@nuxtjs/eslint-config@3.1.0(eslint@7.32.0)(typescript@5.9.3)': dependencies: eslint: 7.32.0 eslint-config-standard: 14.1.1(eslint-plugin-import@2.22.0(eslint@7.32.0))(eslint-plugin-node@11.1.0(eslint@7.32.0))(eslint-plugin-promise@4.3.1)(eslint-plugin-standard@4.1.0(eslint@7.32.0))(eslint@7.32.0) eslint-plugin-import: 2.22.0(eslint@7.32.0) - eslint-plugin-jest: 23.20.0(eslint@7.32.0)(typescript@7.0.2) + eslint-plugin-jest: 23.20.0(eslint@7.32.0)(typescript@5.9.3) eslint-plugin-node: 11.1.0(eslint@7.32.0) eslint-plugin-promise: 4.3.1 eslint-plugin-standard: 4.1.0(eslint@7.32.0) @@ -8247,13 +8127,13 @@ snapshots: transitivePeerDependencies: - debug - '@nuxtjs/vuetify@1.12.3(vue@3.5.39(typescript@7.0.2))(webpack@4.47.0)': + '@nuxtjs/vuetify@1.12.3(vue@3.5.39(typescript@5.9.3))(webpack@4.47.0)': dependencies: deepmerge: 4.3.1 sass: 1.32.13 sass-loader: 10.4.1(sass@1.32.13)(webpack@4.47.0) - vuetify: 2.7.1(vue@3.5.39(typescript@7.0.2)) - vuetify-loader: 1.9.2(vue@3.5.39(typescript@7.0.2))(vuetify@2.7.1(vue@3.5.39(typescript@7.0.2)))(webpack@4.47.0) + vuetify: 2.7.1(vue@3.5.39(typescript@5.9.3)) + vuetify-loader: 1.9.2(vue@3.5.39(typescript@5.9.3))(vuetify@2.7.1(vue@3.5.39(typescript@5.9.3)))(webpack@4.47.0) transitivePeerDependencies: - fibers - gm @@ -8380,10 +8260,10 @@ snapshots: dependencies: '@types/webidl-conversions': 7.0.3 - '@typescript-eslint/experimental-utils@2.34.0(eslint@7.32.0)(typescript@7.0.2)': + '@typescript-eslint/experimental-utils@2.34.0(eslint@7.32.0)(typescript@5.9.3)': dependencies: '@types/json-schema': 7.0.15 - '@typescript-eslint/typescript-estree': 2.34.0(typescript@7.0.2) + '@typescript-eslint/typescript-estree': 2.34.0(typescript@5.9.3) eslint: 7.32.0 eslint-scope: 5.1.1 eslint-utils: 2.1.0 @@ -8391,7 +8271,7 @@ snapshots: - supports-color - typescript - '@typescript-eslint/typescript-estree@2.34.0(typescript@7.0.2)': + '@typescript-eslint/typescript-estree@2.34.0(typescript@5.9.3)': dependencies: debug: 4.4.3 eslint-visitor-keys: 1.3.0 @@ -8399,77 +8279,17 @@ snapshots: is-glob: 4.0.3 lodash: 4.17.21 semver: 7.5.4 - tsutils: 3.21.0(typescript@7.0.2) + tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: - typescript: 7.0.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript/typescript-aix-ppc64@7.0.2': - optional: true - - '@typescript/typescript-darwin-arm64@7.0.2': - optional: true - - '@typescript/typescript-darwin-x64@7.0.2': - optional: true - - '@typescript/typescript-freebsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-freebsd-x64@7.0.2': - optional: true - - '@typescript/typescript-linux-arm64@7.0.2': - optional: true - - '@typescript/typescript-linux-arm@7.0.2': - optional: true - - '@typescript/typescript-linux-loong64@7.0.2': - optional: true - - '@typescript/typescript-linux-mips64el@7.0.2': - optional: true - - '@typescript/typescript-linux-ppc64@7.0.2': - optional: true - - '@typescript/typescript-linux-riscv64@7.0.2': - optional: true - - '@typescript/typescript-linux-s390x@7.0.2': - optional: true - - '@typescript/typescript-linux-x64@7.0.2': - optional: true - - '@typescript/typescript-netbsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-netbsd-x64@7.0.2': - optional: true - - '@typescript/typescript-openbsd-arm64@7.0.2': - optional: true - - '@typescript/typescript-openbsd-x64@7.0.2': - optional: true - - '@typescript/typescript-sunos-x64@7.0.2': - optional: true - - '@typescript/typescript-win32-arm64@7.0.2': - optional: true - - '@typescript/typescript-win32-x64@7.0.2': - optional: true - - '@vitejs/plugin-vue@6.0.7(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2))': + '@vitejs/plugin-vue@6.0.7(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@5.9.3))': dependencies: '@rolldown/pluginutils': 1.0.1 vite: 8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0) - vue: 3.5.39(typescript@7.0.2) + vue: 3.5.39(typescript@5.9.3) '@volar/language-core@2.4.28': dependencies: @@ -8483,7 +8303,7 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@vue-macros/common@3.1.2(vue@3.5.39(typescript@7.0.2))': + '@vue-macros/common@3.1.2(vue@3.5.39(typescript@5.9.3))': dependencies: '@vue/compiler-sfc': 3.5.39 ast-kit: 2.2.0 @@ -8491,7 +8311,7 @@ snapshots: magic-string-ast: 1.0.3 unplugin-utils: 0.3.2 optionalDependencies: - vue: 3.5.39(typescript@7.0.2) + vue: 3.5.39(typescript@5.9.3) '@vue/babel-helper-vue-jsx-merge-props@1.4.0': {} @@ -8505,7 +8325,7 @@ snapshots: lodash.kebabcase: 4.1.1 svg-tags: 1.0.0 - '@vue/babel-preset-jsx@1.4.0(@babel/core@7.23.5)(vue@3.5.39(typescript@7.0.2))': + '@vue/babel-preset-jsx@1.4.0(@babel/core@7.23.5)(vue@3.5.39(typescript@5.9.3))': dependencies: '@babel/core': 7.23.5 '@vue/babel-helper-vue-jsx-merge-props': 1.4.0 @@ -8517,7 +8337,7 @@ snapshots: '@vue/babel-sugar-v-model': 1.4.0(@babel/core@7.23.5) '@vue/babel-sugar-v-on': 1.4.0(@babel/core@7.23.5) optionalDependencies: - vue: 3.5.39(typescript@7.0.2) + vue: 3.5.39(typescript@5.9.3) '@vue/babel-sugar-composition-api-inject-h@1.4.0(@babel/core@7.23.5)': dependencies: @@ -8687,19 +8507,19 @@ snapshots: '@vue/shared': 3.5.39 csstype: 3.2.3 - '@vue/server-renderer@3.5.39(vue@3.5.39(typescript@7.0.2))': + '@vue/server-renderer@3.5.39(vue@3.5.39(typescript@5.9.3))': dependencies: '@vue/compiler-ssr': 3.5.39 '@vue/shared': 3.5.39 - vue: 3.5.39(typescript@7.0.2) + vue: 3.5.39(typescript@5.9.3) '@vue/shared@3.5.39': {} - '@vuetify/loader-shared@2.1.2(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4)': + '@vuetify/loader-shared@2.1.2(vue@3.5.39(typescript@5.9.3))(vuetify@4.1.4)': dependencies: upath: 2.0.1 - vue: 3.5.39(typescript@7.0.2) - vuetify: 4.1.4(typescript@7.0.2)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@7.0.2)) + vue: 3.5.39(typescript@5.9.3) + vuetify: 4.1.4(typescript@5.9.3)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@5.9.3)) '@webassemblyjs/ast@1.9.0': dependencies: @@ -10187,9 +10007,9 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@23.20.0(eslint@7.32.0)(typescript@7.0.2): + eslint-plugin-jest@23.20.0(eslint@7.32.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/experimental-utils': 2.34.0(eslint@7.32.0)(typescript@7.0.2) + '@typescript-eslint/experimental-utils': 2.34.0(eslint@7.32.0)(typescript@5.9.3) eslint: 7.32.0 transitivePeerDependencies: - supports-color @@ -11822,10 +11642,10 @@ snapshots: dependencies: boolbase: 1.0.0 - nuxt@2.17.2(@vue/compiler-sfc@3.5.39)(consola@3.2.3)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)): + nuxt@2.17.2(@vue/compiler-sfc@3.5.39)(consola@3.2.3)(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)): dependencies: - '@nuxt/babel-preset-app': 2.17.2(vue@3.5.39(typescript@7.0.2)) - '@nuxt/builder': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)) + '@nuxt/babel-preset-app': 2.17.2(vue@3.5.39(typescript@5.9.3)) + '@nuxt/builder': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)) '@nuxt/cli': 2.17.2 '@nuxt/components': 2.2.1(consola@3.2.3) '@nuxt/config': 2.17.2 @@ -11838,7 +11658,7 @@ snapshots: '@nuxt/utils': 2.17.2 '@nuxt/vue-app': 2.17.2 '@nuxt/vue-renderer': 2.17.2 - '@nuxt/webpack': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@7.0.2)(vue@3.5.39(typescript@7.0.2)) + '@nuxt/webpack': 2.17.2(@vue/compiler-sfc@3.5.39)(typescript@5.9.3)(vue@3.5.39(typescript@5.9.3)) transitivePeerDependencies: - '@vue/compiler-sfc' - arc-templates @@ -12167,9 +11987,9 @@ snapshots: pluralize@8.0.0: {} - pnp-webpack-plugin@1.7.0(typescript@7.0.2): + pnp-webpack-plugin@1.7.0(typescript@5.9.3): dependencies: - ts-pnp: 1.2.0(typescript@7.0.2) + ts-pnp: 1.2.0(typescript@5.9.3) transitivePeerDependencies: - typescript @@ -13623,7 +13443,7 @@ snapshots: terser@4.8.1: dependencies: - acorn: 8.11.2 + acorn: 8.17.0 commander: 2.20.3 source-map: 0.6.1 source-map-support: 0.5.21 @@ -13631,7 +13451,7 @@ snapshots: terser@5.24.0: dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.11.2 + acorn: 8.17.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -13709,9 +13529,9 @@ snapshots: dependencies: punycode: 2.3.1 - ts-pnp@1.2.0(typescript@7.0.2): + ts-pnp@1.2.0(typescript@5.9.3): optionalDependencies: - typescript: 7.0.2 + typescript: 5.9.3 tsconfig-paths@3.14.2: dependencies: @@ -13724,10 +13544,10 @@ snapshots: tslib@2.6.2: {} - tsutils@3.21.0(typescript@7.0.2): + tsutils@3.21.0(typescript@5.9.3): dependencies: tslib: 1.14.1 - typescript: 7.0.2 + typescript: 5.9.3 tty-browserify@0.0.0: {} @@ -13784,28 +13604,7 @@ snapshots: typedarray@0.0.6: {} - typescript@7.0.2: - optionalDependencies: - '@typescript/typescript-aix-ppc64': 7.0.2 - '@typescript/typescript-darwin-arm64': 7.0.2 - '@typescript/typescript-darwin-x64': 7.0.2 - '@typescript/typescript-freebsd-arm64': 7.0.2 - '@typescript/typescript-freebsd-x64': 7.0.2 - '@typescript/typescript-linux-arm': 7.0.2 - '@typescript/typescript-linux-arm64': 7.0.2 - '@typescript/typescript-linux-loong64': 7.0.2 - '@typescript/typescript-linux-mips64el': 7.0.2 - '@typescript/typescript-linux-ppc64': 7.0.2 - '@typescript/typescript-linux-riscv64': 7.0.2 - '@typescript/typescript-linux-s390x': 7.0.2 - '@typescript/typescript-linux-x64': 7.0.2 - '@typescript/typescript-netbsd-arm64': 7.0.2 - '@typescript/typescript-netbsd-x64': 7.0.2 - '@typescript/typescript-openbsd-arm64': 7.0.2 - '@typescript/typescript-openbsd-x64': 7.0.2 - '@typescript/typescript-sunos-x64': 7.0.2 - '@typescript/typescript-win32-arm64': 7.0.2 - '@typescript/typescript-win32-x64': 7.0.2 + typescript@5.9.3: {} ua-parser-js@1.0.37: {} @@ -13863,10 +13662,10 @@ snapshots: pathe: 2.0.3 picomatch: 4.0.5 - unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.39)(vue-router@4.6.4(vue@3.5.39(typescript@7.0.2)))(vue@3.5.39(typescript@7.0.2)): + unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.39)(vue-router@4.6.4(vue@3.5.39(typescript@5.9.3)))(vue@3.5.39(typescript@5.9.3)): dependencies: '@babel/generator': 7.29.7 - '@vue-macros/common': 3.1.2(vue@3.5.39(typescript@7.0.2)) + '@vue-macros/common': 3.1.2(vue@3.5.39(typescript@5.9.3)) '@vue/compiler-sfc': 3.5.39 '@vue/language-core': 3.3.7 ast-walker-scope: 0.8.3 @@ -13884,7 +13683,7 @@ snapshots: unplugin-utils: 0.3.2 yaml: 2.9.0 optionalDependencies: - vue-router: 4.6.4(vue@3.5.39(typescript@7.0.2)) + vue-router: 4.6.4(vue@3.5.39(typescript@5.9.3)) transitivePeerDependencies: - vue @@ -13971,14 +13770,14 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vite-plugin-vuetify@2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4): + vite-plugin-vuetify@2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@5.9.3))(vuetify@4.1.4): dependencies: - '@vuetify/loader-shared': 2.1.2(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4) + '@vuetify/loader-shared': 2.1.2(vue@3.5.39(typescript@5.9.3))(vuetify@4.1.4) debug: 4.4.3 upath: 2.0.1 vite: 8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0) - vue: 3.5.39(typescript@7.0.2) - vuetify: 4.1.4(typescript@7.0.2)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@7.0.2)) + vue: 3.5.39(typescript@5.9.3) + vuetify: 4.1.4(typescript@5.9.3)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@5.9.3)) transitivePeerDependencies: - supports-color @@ -14096,10 +13895,10 @@ snapshots: dependencies: vue: 2.7.15 - vue-router@4.6.4(vue@3.5.39(typescript@7.0.2)): + vue-router@4.6.4(vue@3.5.39(typescript@5.9.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.39(typescript@7.0.2) + vue: 3.5.39(typescript@5.9.3) vue-server-renderer@2.7.15: dependencies: @@ -14124,48 +13923,48 @@ snapshots: vue-template-es2015-compiler@1.9.1: {} - vue-tsc@3.3.7(typescript@7.0.2): + vue-tsc@3.3.7(typescript@5.9.3): dependencies: '@volar/typescript': 2.4.28 '@vue/language-core': 3.3.7 - typescript: 7.0.2 + typescript: 5.9.3 vue@2.7.15: dependencies: '@vue/compiler-sfc': 2.7.15 csstype: 3.1.2 - vue@3.5.39(typescript@7.0.2): + vue@3.5.39(typescript@5.9.3): dependencies: '@vue/compiler-dom': 3.5.39 '@vue/compiler-sfc': 3.5.39 '@vue/runtime-dom': 3.5.39 - '@vue/server-renderer': 3.5.39(vue@3.5.39(typescript@7.0.2)) + '@vue/server-renderer': 3.5.39(vue@3.5.39(typescript@5.9.3)) '@vue/shared': 3.5.39 optionalDependencies: - typescript: 7.0.2 + typescript: 5.9.3 - vuetify-loader@1.9.2(vue@3.5.39(typescript@7.0.2))(vuetify@2.7.1(vue@3.5.39(typescript@7.0.2)))(webpack@4.47.0): + vuetify-loader@1.9.2(vue@3.5.39(typescript@5.9.3))(vuetify@2.7.1(vue@3.5.39(typescript@5.9.3)))(webpack@4.47.0): dependencies: acorn: 8.11.2 acorn-walk: 8.3.0 decache: 4.6.2 file-loader: 6.2.0(webpack@4.47.0) loader-utils: 2.0.4 - vue: 3.5.39(typescript@7.0.2) - vuetify: 2.7.1(vue@3.5.39(typescript@7.0.2)) + vue: 3.5.39(typescript@5.9.3) + vuetify: 2.7.1(vue@3.5.39(typescript@5.9.3)) webpack: 4.47.0 - vuetify@2.7.1(vue@3.5.39(typescript@7.0.2)): + vuetify@2.7.1(vue@3.5.39(typescript@5.9.3)): dependencies: - vue: 3.5.39(typescript@7.0.2) + vue: 3.5.39(typescript@5.9.3) - vuetify@4.1.4(typescript@7.0.2)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@7.0.2)): + vuetify@4.1.4(typescript@5.9.3)(vite-plugin-vuetify@2.1.3)(vue@3.5.39(typescript@5.9.3)): dependencies: - vue: 3.5.39(typescript@7.0.2) + vue: 3.5.39(typescript@5.9.3) optionalDependencies: - typescript: 7.0.2 - vite-plugin-vuetify: 2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@7.0.2))(vuetify@4.1.4) + typescript: 5.9.3 + vite-plugin-vuetify: 2.1.3(vite@8.1.4(@types/node@26.1.1)(jiti@1.21.0)(sass@1.32.13)(terser@5.24.0)(yaml@2.9.0))(vue@3.5.39(typescript@5.9.3))(vuetify@4.1.4) vuex@3.6.2(vue@2.7.15): dependencies: From 9e138d6654bfd466d0919d488059c8b2c8db013b Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 18:10:28 +0200 Subject: [PATCH 15/66] =?UTF-8?q?feat:=20add=20scripts/inspect-page.mjs=20?= =?UTF-8?q?=E2=80=94=20headless=20eyes=20for=20the=20port=20tasks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subagents have no browser, so they could not see the pages they port. Tasks 4-12 are UI ports whose acceptance criterion is "same components, same places, same interactions" — unverifiable by compiling alone. inspect-page.mjs loads a page in headless chromium and writes console.txt, structure.txt and screenshot.png. structure.txt is a SEMANTIC dump (headings, nav items, tabs, buttons, input labels, table columns, rendered Vuetify components), not a DOM diff: Vuetify 2 and 4 emit different class names for the same component, so comparing markup would be all noise. Commits baselines for all five pages, captured from the real Nuxt app in the reference worktree. Each port task diffs its output against these. KNOWN GAP, documented in the plan: Mongo and the daemons are unreachable from this machine, so both apps render their empty state. The baselines cover the shell, nav and static controls — NOT populated tables or client cards. Data- dependent behaviour still needs verifying on the real network. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/superpowers/baselines/config.txt | 67 +++++++ docs/superpowers/baselines/globalconfig.txt | 61 +++++++ docs/superpowers/baselines/index.txt | 62 +++++++ docs/superpowers/baselines/jobs.txt | 60 +++++++ docs/superpowers/baselines/settings.txt | 71 ++++++++ .../2026-07-13-nuxt2-to-vue3-migration.md | 29 +++- .../task-01.md | 1 - .../task-02.md | 1 - .../task-03.md | 1 - .../task-04.md | 30 ++-- .../task-05.md | 30 ++-- .../task-06.md | 30 ++-- .../task-07.md | 30 ++-- .../task-08.md | 30 ++-- .../task-09.md | 30 ++-- .../task-10.md | 30 ++-- .../task-11.md | 30 ++-- .../task-12.md | 30 ++-- .../task-13.md | 1 - .../task-14.md | 1 - .../task-15.md | 1 - package.json | 1 + pnpm-lock.yaml | 29 ++++ scripts/inspect-page.mjs | 163 ++++++++++++++++++ 24 files changed, 714 insertions(+), 105 deletions(-) create mode 100644 docs/superpowers/baselines/config.txt create mode 100644 docs/superpowers/baselines/globalconfig.txt create mode 100644 docs/superpowers/baselines/index.txt create mode 100644 docs/superpowers/baselines/jobs.txt create mode 100644 docs/superpowers/baselines/settings.txt create mode 100644 scripts/inspect-page.mjs diff --git a/docs/superpowers/baselines/config.txt b/docs/superpowers/baselines/config.txt new file mode 100644 index 0000000..3d1a911 --- /dev/null +++ b/docs/superpowers/baselines/config.txt @@ -0,0 +1,67 @@ +# http://100.64.124.194:8453/config + +title: Avior - powered by Walzen Group + +body text length: 124 + +table rows: 0 + +## headings (0) + (none) + +## nav items (5) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + +## tabs (0) + (none) + +## buttons (4) + - + - + - + - ​ Client + +## links (7) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + - Icon -> https://dryicons.com/icon/love-file-icon-6200 + - dev -> https://github.com/spiritreader/avior-nuxt/commit/dev + +## inputs (1) + - input[text] Client + +## table columns (0) + (none) + +## list items (5) + - Overview + - Job Manager + - Client Configuration + - Global Configuration + - Frontend Settings + +## vuetify components rendered (17) + - v-app-bar + - v-application + - v-btn + - v-footer + - v-icon + - v-input + - v-label + - v-list + - v-list-item + - v-main + - v-messages + - v-navigation-drawer + - v-progress-circular + - v-select + - v-sheet + - v-text-field + - v-toolbar \ No newline at end of file diff --git a/docs/superpowers/baselines/globalconfig.txt b/docs/superpowers/baselines/globalconfig.txt new file mode 100644 index 0000000..ac00d1d --- /dev/null +++ b/docs/superpowers/baselines/globalconfig.txt @@ -0,0 +1,61 @@ +# http://100.64.124.194:8453/globalconfig + +title: Avior - powered by Walzen Group + +body text length: 168 + +table rows: 0 + +## headings (0) + (none) + +## nav items (5) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + +## tabs (0) + (none) + +## buttons (3) + - + - + - + +## links (7) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + - Icon -> https://dryicons.com/icon/love-file-icon-6200 + - dev -> https://github.com/spiritreader/avior-nuxt/commit/dev + +## inputs (0) + (none) + +## table columns (0) + (none) + +## list items (5) + - Overview + - Job Manager + - Client Configuration + - Global Configuration + - Frontend Settings + +## vuetify components rendered (12) + - v-app-bar + - v-application + - v-btn + - v-footer + - v-icon + - v-list + - v-list-item + - v-main + - v-navigation-drawer + - v-overlay + - v-sheet + - v-toolbar \ No newline at end of file diff --git a/docs/superpowers/baselines/index.txt b/docs/superpowers/baselines/index.txt new file mode 100644 index 0000000..f350923 --- /dev/null +++ b/docs/superpowers/baselines/index.txt @@ -0,0 +1,62 @@ +# http://100.64.124.194:8453/ + +title: Avior - powered by Walzen Group + +body text length: 128 + +table rows: 0 + +## headings (0) + (none) + +## nav items (5) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + +## tabs (0) + (none) + +## buttons (5) + - + - + - + - + - PING OFFLINE + +## links (7) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + - Icon -> https://dryicons.com/icon/love-file-icon-6200 + - dev -> https://github.com/spiritreader/avior-nuxt/commit/dev + +## inputs (0) + (none) + +## table columns (0) + (none) + +## list items (5) + - Overview + - Job Manager + - Client Configuration + - Global Configuration + - Frontend Settings + +## vuetify components rendered (11) + - v-app-bar + - v-application + - v-btn + - v-footer + - v-icon + - v-list + - v-list-item + - v-main + - v-navigation-drawer + - v-sheet + - v-toolbar \ No newline at end of file diff --git a/docs/superpowers/baselines/jobs.txt b/docs/superpowers/baselines/jobs.txt new file mode 100644 index 0000000..6c5dc4f --- /dev/null +++ b/docs/superpowers/baselines/jobs.txt @@ -0,0 +1,60 @@ +# http://100.64.124.194:8453/jobs + +title: Avior - powered by Walzen Group + +body text length: 168 + +table rows: 0 + +## headings (0) + (none) + +## nav items (5) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + +## tabs (0) + (none) + +## buttons (3) + - + - + - + +## links (7) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + - Icon -> https://dryicons.com/icon/love-file-icon-6200 + - dev -> https://github.com/spiritreader/avior-nuxt/commit/dev + +## inputs (0) + (none) + +## table columns (0) + (none) + +## list items (5) + - Overview + - Job Manager + - Client Configuration + - Global Configuration + - Frontend Settings + +## vuetify components rendered (11) + - v-app-bar + - v-application + - v-btn + - v-footer + - v-icon + - v-list + - v-list-item + - v-main + - v-navigation-drawer + - v-sheet + - v-toolbar \ No newline at end of file diff --git a/docs/superpowers/baselines/settings.txt b/docs/superpowers/baselines/settings.txt new file mode 100644 index 0000000..5b550af --- /dev/null +++ b/docs/superpowers/baselines/settings.txt @@ -0,0 +1,71 @@ +# http://100.64.124.194:8453/settings + +title: Avior - powered by Walzen Group + +body text length: 185 + +table rows: 0 + +## headings (1) + - Settings + +## nav items (5) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + +## tabs (0) + (none) + +## buttons (4) + - + - + - + - SUBMIT + +## links (7) + - Overview -> / + - Job Manager -> /jobs + - Client Configuration -> /config + - Global Configuration -> /globalconfig + - Frontend Settings -> /settings + - Icon -> https://dryicons.com/icon/love-file-icon-6200 + - dev -> https://github.com/spiritreader/avior-nuxt/commit/dev + +## inputs (2) + - input[text] Client Name + - input[text] Add Address + +## table columns (0) + (none) + +## list items (6) + - Overview + - Job Manager + - Client Configuration + - Global Configuration + - Frontend Settings + - Add Address + +## vuetify components rendered (19) + - v-app-bar + - v-application + - v-btn + - v-card + - v-counter + - v-divider + - v-footer + - v-form + - v-icon + - v-input + - v-label + - v-list + - v-list-item + - v-main + - v-messages + - v-navigation-drawer + - v-sheet + - v-text-field + - v-toolbar \ No newline at end of file diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md index b1c27f8..2b5c6d1 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md @@ -93,21 +93,32 @@ Do not convert scripts to ` + diff --git a/src/pages/[...path].vue b/src/pages/[...path].vue new file mode 100644 index 0000000..6286086 --- /dev/null +++ b/src/pages/[...path].vue @@ -0,0 +1,22 @@ + + + + + diff --git a/src/typed-router.d.ts b/src/typed-router.d.ts index 40c54ec..4f53052 100644 --- a/src/typed-router.d.ts +++ b/src/typed-router.d.ts @@ -30,6 +30,13 @@ declare module 'vue-router/auto-routes' { Record, | never >, + '/[...path]': RouteRecordInfo< + '/[...path]', + '/:path(.*)', + { path: ParamValue }, + { path: ParamValue }, + | never + >, } /** @@ -49,6 +56,12 @@ declare module 'vue-router/auto-routes' { views: | never } + 'src/pages/[...path].vue': { + routes: + | '/[...path]' + views: + | never + } } /** From 1e9849abe6d8fc9a0c4d9720fb87ba36121703d9 Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 18:24:00 +0200 Subject: [PATCH 17/66] fix: correct the Mongo address, recapture baselines with real data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The MONGO_URL default (10.11.194.75, inherited from the committed api/config.json) was stale. The database is at 192.168.178.75:27017 and is reachable: it connects in 0.2s and returns five real clients. This also closes the last unverified piece of Task 2b — Mongoose 9 does talk to the upgraded MongoDB server. Baselines recaptured against live data (index 33 -> 57 elements, globalconfig 32 -> 69), so client-registry-driven UI is now genuinely covered by the port tasks' verification rather than compared empty-to-empty. Also corrects two things Task 4 found the hard way, both now in the conversion table: - VFooter KEEPS its `app` prop in Vuetify 4, unlike v-app-bar and v-navigation-drawer. Dropping it makes the footer a flex child that stretches to 320px and shoves content up. It emits NO warning — only the screenshot caught it. The plan told agents to remove it; that was wrong. - color="grey lighten-1" must become "grey-lighten-1"; the v2 space-separated form silently emits a broken class in v4. Daemons remain unreachable: 192.168.178.61 pings in 1ms but TCP 10000-10002 refuse connections, so daemon-dependent UI still renders its offline state. Co-Authored-By: Claude Opus 4.8 (1M context) --- Dockerfile | 2 +- docs/superpowers/baselines/config.txt | 2 +- docs/superpowers/baselines/globalconfig.txt | 54 +++++++++++++++---- docs/superpowers/baselines/index.txt | 32 +++++++++-- docs/superpowers/baselines/jobs.txt | 31 +++++++++-- docs/superpowers/baselines/settings.txt | 2 +- .../2026-07-13-nuxt2-to-vue3-migration.md | 16 +++--- .../task-01.md | 2 +- .../task-02.md | 8 +-- .../task-03.md | 2 +- .../task-04.md | 8 +-- .../task-05.md | 8 +-- .../task-06.md | 8 +-- .../task-07.md | 8 +-- .../task-08.md | 8 +-- .../task-09.md | 8 +-- .../task-10.md | 8 +-- .../task-11.md | 8 +-- .../task-12.md | 8 +-- .../task-13.md | 4 +- .../task-14.md | 2 +- .../task-15.md | 2 +- server/app.js | 2 +- 23 files changed, 167 insertions(+), 66 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1e88fff..f1f0ac1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN corepack enable && corepack prepare pnpm@11.12.0 --activate COPY . /app ENV NUXT_ENV_CURRENT_GIT_SHA=${COMMIT} -ENV MONGO_URL=mongodb://10.11.194.75/Avior +ENV MONGO_URL=mongodb://192.168.178.75:27017/Avior RUN pnpm install --frozen-lockfile RUN pnpm build diff --git a/docs/superpowers/baselines/config.txt b/docs/superpowers/baselines/config.txt index 3d1a911..2a5ac47 100644 --- a/docs/superpowers/baselines/config.txt +++ b/docs/superpowers/baselines/config.txt @@ -1,4 +1,4 @@ -# http://100.64.124.194:8453/config +# http://100.64.124.194:4169/config title: Avior - powered by Walzen Group diff --git a/docs/superpowers/baselines/globalconfig.txt b/docs/superpowers/baselines/globalconfig.txt index ac00d1d..dd91603 100644 --- a/docs/superpowers/baselines/globalconfig.txt +++ b/docs/superpowers/baselines/globalconfig.txt @@ -1,8 +1,8 @@ -# http://100.64.124.194:8453/globalconfig +# http://100.64.124.194:4169/globalconfig title: Avior - powered by Walzen Group -body text length: 168 +body text length: 220 table rows: 0 @@ -16,20 +16,37 @@ table rows: 0 - Global Configuration -> /globalconfig - Frontend Settings -> /settings -## tabs (0) - (none) +## tabs (5) + - CLIENTS + - NAME EXCLUDE + - SUB EXCLUDE + - LOG INCLUDE + - LOG EXCLUDE -## buttons (3) +## buttons (11) - - - + - NEW + - VDR-U + - VDR-U-1 + - PHOENIX + - VAVA + - VDR-U-2 + - MMDG + - VDR -## links (7) +## links (12) - Overview -> / - Job Manager -> /jobs - Client Configuration -> /config - Global Configuration -> /globalconfig - Frontend Settings -> /settings + - CLIENTS -> #tab-1 + - NAME EXCLUDE -> #tab-2 + - SUB EXCLUDE -> #tab-3 + - LOG INCLUDE -> #tab-4 + - LOG EXCLUDE -> #tab-5 - Icon -> https://dryicons.com/icon/love-file-icon-6200 - dev -> https://github.com/spiritreader/avior-nuxt/commit/dev @@ -39,23 +56,42 @@ table rows: 0 ## table columns (0) (none) -## list items (5) +## list items (12) - Overview - Job Manager - Client Configuration - Global Configuration - Frontend Settings + - VDR-U + - VDR-U-1 + - PHOENIX + - VAVA + - VDR-U-2 + - MMDG + - VDR -## vuetify components rendered (12) +## vuetify components rendered (24) - v-app-bar - v-application - v-btn + - v-card - v-footer - v-icon + - v-item-group - v-list + - v-list-group - v-list-item - v-main - v-navigation-drawer - v-overlay - v-sheet - - v-toolbar \ No newline at end of file + - v-slide-group + - v-tab + - v-tabs + - v-tabs-bar + - v-tabs-items + - v-tabs-slider + - v-tabs-slider-wrapper + - v-toolbar + - v-window + - v-window-item \ No newline at end of file diff --git a/docs/superpowers/baselines/index.txt b/docs/superpowers/baselines/index.txt index f350923..781146a 100644 --- a/docs/superpowers/baselines/index.txt +++ b/docs/superpowers/baselines/index.txt @@ -1,8 +1,8 @@ -# http://100.64.124.194:8453/ +# http://100.64.124.194:4169/ title: Avior - powered by Walzen Group -body text length: 128 +body text length: 263 table rows: 0 @@ -19,7 +19,28 @@ table rows: 0 ## tabs (0) (none) -## buttons (5) +## buttons (26) + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - @@ -48,12 +69,15 @@ table rows: 0 - Global Configuration - Frontend Settings -## vuetify components rendered (11) +## vuetify components rendered (14) - v-app-bar - v-application - v-btn + - v-btn-toggle + - v-card - v-footer - v-icon + - v-item-group - v-list - v-list-item - v-main diff --git a/docs/superpowers/baselines/jobs.txt b/docs/superpowers/baselines/jobs.txt index 6c5dc4f..b101817 100644 --- a/docs/superpowers/baselines/jobs.txt +++ b/docs/superpowers/baselines/jobs.txt @@ -1,8 +1,8 @@ -# http://100.64.124.194:8453/jobs +# http://100.64.124.194:4169/jobs title: Avior - powered by Walzen Group -body text length: 168 +body text length: 293 table rows: 0 @@ -19,10 +19,20 @@ table rows: 0 ## tabs (0) (none) -## buttons (3) +## buttons (13) - - - + - NEW + - REASSIGN + - DELETE + - VDR-U 31 assigned + - VDR-U-1 32 assigned + - PHOENIX 0 assigned + - VAVA 0 assigned + - VDR-U-2 0 assigned + - MMDG 0 assigned + - VDR 0 assigned ## links (7) - Overview -> / @@ -39,22 +49,33 @@ table rows: 0 ## table columns (0) (none) -## list items (5) +## list items (13) - Overview - Job Manager - Client Configuration - Global Configuration - Frontend Settings + - NEW REASSIGN DELETE + - VDR-U 31 assigned + - VDR-U-1 32 assigned + - PHOENIX 0 assigned + - VAVA 0 assigned + - VDR-U-2 0 assigned + - MMDG 0 assigned + - VDR 0 assigned -## vuetify components rendered (11) +## vuetify components rendered (14) - v-app-bar - v-application - v-btn + - v-card - v-footer - v-icon - v-list + - v-list-group - v-list-item - v-main - v-navigation-drawer - v-sheet + - v-system-bar - v-toolbar \ No newline at end of file diff --git a/docs/superpowers/baselines/settings.txt b/docs/superpowers/baselines/settings.txt index 5b550af..185a07e 100644 --- a/docs/superpowers/baselines/settings.txt +++ b/docs/superpowers/baselines/settings.txt @@ -1,4 +1,4 @@ -# http://100.64.124.194:8453/settings +# http://100.64.124.194:4169/settings title: Avior - powered by Walzen Group diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md index 2b5c6d1..6b436fe 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md @@ -27,7 +27,7 @@ Design spec: `docs/superpowers/specs/2026-07-13-nuxt2-to-vue3-migration-design.m - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -48,7 +48,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -116,7 +118,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. @@ -278,7 +280,7 @@ Files: Interfaces: - Produces: `server/app.js` default-exports a configured Express `app` with routes `GET /clients`, `POST /clients`, `POST /clients/delete` mounted at the app root (Nuxt mounts it under `/api`; the standalone server mounts it under `/api` too, so the browser-facing paths are identical either way). - Produces: `server/index.js`, runnable via `node server/index.js`, listening on `process.env.PORT || 10009`. -- Produces: `MONGO_URL` environment variable, defaulting to `mongodb://10.11.194.75/Avior`. +- Produces: `MONGO_URL` environment variable, defaulting to `mongodb://192.168.178.75:27017/Avior`. - [ ] Step 1: Move the Mongoose schema @@ -299,7 +301,7 @@ const cors = require('cors') const mongoose = require('mongoose') const Client = require('./schema.js') -const MONGO_URL = process.env.MONGO_URL || 'mongodb://10.11.194.75/Avior' +const MONGO_URL = process.env.MONGO_URL || 'mongodb://192.168.178.75:27017/Avior' // serverSelectionTimeoutMS bounds the initial connect. bufferTimeoutMS bounds // queries issued while disconnected: Mongoose buffers those, so they never @@ -432,7 +434,7 @@ In `package.json`, add to `scripts`: In `Dockerfile`, add below the `NUXT_ENV_CURRENT_GIT_SHA` line: ```dockerfile -ENV MONGO_URL=mongodb://10.11.194.75/Avior +ENV MONGO_URL=mongodb://192.168.178.75:27017/Avior ``` - [ ] Step 8: Verify the Nuxt-hosted path still works @@ -1368,7 +1370,7 @@ COPY --from=build /app/dist ./dist ENV NODE_ENV=production ENV PORT=10009 -ENV MONGO_URL=mongodb://10.11.194.75/Avior +ENV MONGO_URL=mongodb://192.168.178.75:27017/Avior EXPOSE 10009 CMD ["node", "server/index.js"] diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md index d2ab732..7179bf7 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. --- diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md index dced8a7..114687f 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. --- @@ -43,7 +43,7 @@ Files: Interfaces: - Produces: `server/app.js` default-exports a configured Express `app` with routes `GET /clients`, `POST /clients`, `POST /clients/delete` mounted at the app root (Nuxt mounts it under `/api`; the standalone server mounts it under `/api` too, so the browser-facing paths are identical either way). - Produces: `server/index.js`, runnable via `node server/index.js`, listening on `process.env.PORT || 10009`. -- Produces: `MONGO_URL` environment variable, defaulting to `mongodb://10.11.194.75/Avior`. +- Produces: `MONGO_URL` environment variable, defaulting to `mongodb://192.168.178.75:27017/Avior`. - [ ] Step 1: Move the Mongoose schema @@ -64,7 +64,7 @@ const cors = require('cors') const mongoose = require('mongoose') const Client = require('./schema.js') -const MONGO_URL = process.env.MONGO_URL || 'mongodb://10.11.194.75/Avior' +const MONGO_URL = process.env.MONGO_URL || 'mongodb://192.168.178.75:27017/Avior' // serverSelectionTimeoutMS bounds the initial connect. bufferTimeoutMS bounds // queries issued while disconnected: Mongoose buffers those, so they never @@ -197,7 +197,7 @@ In `package.json`, add to `scripts`: In `Dockerfile`, add below the `NUXT_ENV_CURRENT_GIT_SHA` line: ```dockerfile -ENV MONGO_URL=mongodb://10.11.194.75/Avior +ENV MONGO_URL=mongodb://192.168.178.75:27017/Avior ``` - [ ] Step 8: Verify the Nuxt-hosted path still works diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md index e057e30..eb80ef8 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. --- diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md index fa2532b..33ce5fd 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md index 50f195b..9512b65 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md index 5db1c77..f548103 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md index cb2e3ba..e132d64 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md index 223a685..ddd72d0 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md index 3e23d11..81077db 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md index 530af92..8ffd4ba 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md index 504d7c6..f009077 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md index 35e9558..0a94713 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. ## Ported-file conventions @@ -44,7 +44,9 @@ Tasks 4 through 12 all port Vue 2 + Vuetify 2 SFCs to Vue 3 + Vuetify 4. Every o | `` | removed — no replacement tag; slider is styled via props on `v-tabs` | | `` | `` | | `` / `` | `` / `` | -| `app`, `fixed`, `clipped`, `clipped-left` props on `v-app-bar` / `v-navigation-drawer` / `v-footer` / `v-main` | all removed — Vuetify 4 computes layout geometry itself | +| `app`, `clipped`, `clipped-left`, `fixed` props on `v-app-bar` / `v-navigation-drawer` | removed — Vuetify 4 computes layout geometry itself | +| `app` on `v-footer` | KEPT in Vuetify 4. `VFooter` is an opt-in layout item: without `app` it becomes an ordinary flex child, stretches to fill (measured: 320px tall), and shoves the page content up. It emits NO warning, so only a screenshot catches this. Use ``. | +| `color="grey lighten-1"` (space-separated) | `color="grey-lighten-1"` (hyphenated). The v2 space form silently emits a broken class in v4. | | `dark` prop on any component | removed — the theme handles it; simply delete the attribute | | `:mini-variant="x"` on `v-navigation-drawer` | `:rail="x"` | | `v-data-table` `headers: [{ text, value }]` | `headers: [{ title, key }]` | @@ -112,7 +114,7 @@ diff docs/superpowers/baselines/.txt /tmp/insp/new-/structure.txt 5. `console.txt` must contain zero `[error]` and zero `[pageerror]` lines from your page. Vuetify warns loudly about removed props, so a clean console is the sharpest automatic signal that a port is correct. Note the reference app itself logs `Request timed out` errors because the database and daemons are unreachable from this machine — those are environmental and expected in both apps. 6. Look at `screenshot.png`. Report anything structurally wrong. -KNOWN GAP, do not paper over it: MongoDB (10.11.194.75) and the Avior daemons are unreachable from this machine, so both the reference and the new app render their EMPTY state. The baselines therefore capture the page shell, navigation, and static controls — but NOT populated data tables, client cards, or anything that requires a successful fetch. A `v-data-table` that renders zero rows in both apps proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Data-dependent behaviour must be checked by the user on the real network. +KNOWN GAP, do not paper over it: MongoDB is reachable and the baselines contain its five real clients, so anything driven by the client registry — the `/settings` list, the client selectors, the client cards — IS covered. The Avior DAEMONS are not reachable (connection refused), so anything requiring a live daemon is not: job tables, per-client configs, encoder settings, and log views all render their empty or offline state in both apps. A `v-data-table` showing zero job rows in both proves nothing about its column mapping. Say so in your report rather than claiming a page is fully verified. Daemon-dependent behaviour must be checked by the user on the real network. To regenerate a baseline (only if asked): run the reference worktree (`cd ../avior-nuxt-reference && pnpm dev`, note the port it prints) and point the inspector at it. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md index e8856c7..cd0fedf 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. --- @@ -116,7 +116,7 @@ COPY --from=build /app/dist ./dist ENV NODE_ENV=production ENV PORT=10009 -ENV MONGO_URL=mongodb://10.11.194.75/Avior +ENV MONGO_URL=mongodb://192.168.178.75:27017/Avior EXPOSE 10009 CMD ["node", "server/index.js"] diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md index 721a820..e1e6d7a 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. --- diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md index 45fdc9a..8e79e09 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md @@ -23,7 +23,7 @@ Read the constraints below before starting; they are not optional. - Ports: Vite dev on 5173, Express standalone on 10009. The reference worktree's Nuxt picks its own port and prints it. - `Jenkinsfile` is legacy and out of scope. Do not modify it. CI that matters is `.github/workflows/main.yml`, which only calls `docker build`. - Server stack is Mongoose 9, Express 5, Node 24 (Task 2b). The upstream MongoDB was upgraded, and Mongoose 9 requires Node >= 20.19. Express 5 rejects a bare `'*'` path — the SPA fallback is `'/*splat'`. Do not reintroduce `body-parser`; Express has the parsers built in. -- MongoDB at 10.11.194.75 is NOT reachable from the development machine. A hanging or 500-ing `/api/clients` locally is the environment, not a bug. Never claim a successful query. +- MongoDB IS reachable at `mongodb://192.168.178.75:27017/Avior` and returns five real clients. The Avior daemons are NOT reachable (connection refused), so pages will load the real client list from Mongo and then show every client as offline. That is the environment, not a bug. --- diff --git a/server/app.js b/server/app.js index bdea217..1045f9f 100644 --- a/server/app.js +++ b/server/app.js @@ -3,7 +3,7 @@ const cors = require('cors') const mongoose = require('mongoose') const Client = require('./schema.js') -const MONGO_URL = process.env.MONGO_URL || 'mongodb://10.11.194.75/Avior' +const MONGO_URL = process.env.MONGO_URL || 'mongodb://192.168.178.75:27017/Avior' // serverSelectionTimeoutMS bounds the initial connect. bufferTimeoutMS bounds // queries issued while disconnected: Mongoose buffers those, so they never From 4baa68c0d1ec894e0190be3464f78eef9484e22b Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 18:27:05 +0200 Subject: [PATCH 18/66] fix: nav drawer must default open, and needs `exact` (Task 4 review) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two regressions the structure dump missed and the screenshot caught. The drawer. layouts/default.vue says `drawer: false`, and the port reproduced that faithfully — but Vuetify 2's `v-navigation-drawer app` auto-opened on desktop regardless of the initial v-model, so the REAL app ships with the drawer open. Vuetify 4 honours v-model literally, so a faithful port produced a closed drawer. Reproducing the observable behaviour means `drawer: true`. The `exact` prop was dropped in the port. Without it, vue-router prefix-matches, so `to="/"` is active on every route and Overview stays highlighted everywhere. Also closes the hole in inspect-page.mjs that hid the first bug: a closed Vuetify drawer is translated off-screen, not hidden, and keeps its dimensions — so the visibility check counted its items as rendered. It now rejects elements outside the viewport bounds. Verified: drawer open with 5 items, Overview highlighted, nav identical to the baseline, console clean. Co-Authored-By: Claude Opus 4.8 (1M context) --- scripts/inspect-page.mjs | 7 ++++++- src/App.vue | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/scripts/inspect-page.mjs b/scripts/inspect-page.mjs index d9e45fc..c06ea0a 100644 --- a/scripts/inspect-page.mjs +++ b/scripts/inspect-page.mjs @@ -72,7 +72,12 @@ const structure = crashed const s = getComputedStyle(el) if (s.display === 'none' || s.visibility === 'hidden' || s.opacity === '0') return false const r = el.getBoundingClientRect() - return r.width > 0 && r.height > 0 + if (r.width === 0 || r.height === 0) return false + // A closed Vuetify navigation drawer is translated off-screen, not + // hidden — it keeps its dimensions. Without this bounds check it counts + // as visible and a drawer that should be open silently looks fine. + if (r.right <= 0 || r.bottom <= 0 || r.left >= innerWidth) return false + return true } const text = el => (el.innerText || el.textContent || '').trim().replace(/\s+/g, ' ') const collect = (selector, fn) => diff --git a/src/App.vue b/src/App.vue index 6804044..483030d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,7 +2,14 @@ - + + @@ -68,7 +75,11 @@ export default { data() { return { commitSha: import.meta.env.VITE_COMMIT_SHA, - drawer: false, + // The source says `drawer: false`, but Vuetify 2's `v-navigation-drawer + // app` auto-opened on desktop regardless of that initial value, so the + // real app ships with the drawer OPEN. Vuetify 4 honours v-model + // literally, so reproducing the observable behaviour means `true`. + drawer: true, items: [ { icon: "mdi-eye-settings-outline", From 203e70db657254b8b8acf03ae86cb2f975408c7e Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 18:27:35 +0200 Subject: [PATCH 19/66] Update progress ledger through Task 4 Co-Authored-By: Claude Opus 4.8 (1M context) --- .superpowers/sdd/progress.md | 65 +++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/.superpowers/sdd/progress.md b/.superpowers/sdd/progress.md index 98a513f..46a861f 100644 --- a/.superpowers/sdd/progress.md +++ b/.superpowers/sdd/progress.md @@ -1,38 +1,43 @@ # Migration progress ledger Base: c97abfd -Reference worktree: ../avior-nuxt-reference @ baff6fe (last commit where Nuxt runs). - This is the visual reference for Tasks 4-12. `cd ../avior-nuxt-reference && pnpm dev`. +Reference worktree: ../avior-nuxt-reference @ baff6fe. `cd there && pnpm dev`, note the port it prints. +Baselines: docs/superpowers/baselines/*.txt — semantic dumps of the REAL Nuxt app, WITH live data. +Inspector: node scripts/inspect-page.mjs -> console.txt, structure.txt, screenshot.png -Task 1: complete (03b7026, +2da0ae4) — pnpm. Reviewed clean. -Task 2: complete (8f5407f) — Express API extracted from Nuxt serverMiddleware. -Task 2b: complete (3e19a49, +baff6fe, +2396919) — Mongoose 9.7.4, Express 5.2.1, Node 24. - Reviewed: SPEC PASS. All Important issues fixed. -Task 3: complete (872fe5c, + follow-up) — Vue 3.5.39 / Vuetify 4.1.4 / vue-router 4.6.4 / - Vite 8.1.4 scaffold. Vite proxy -> Express verified (500 JSON, not 404/HTML). -Task 4: NEXT — port the layout. Opus. Everything downstream depends on it. +ENVIRONMENT (verified, do not re-derive): + - MongoDB: mongodb://192.168.178.75:27017/Avior REACHABLE. 5 clients. (10.11.194.75 was stale.) + - Daemons: reachable ONLY via the WAN hostname, e.g. http://vdr-u.wan.walzen.org:10000. + The LAN IPs (192.168.178.61:10000-2, 10.11.194.x) refuse connections. The app races all + three addresses per client, so it works — but a direct curl to a LAN IP will fail. + - Docker: NOT installed. No image has ever been built. node:24-alpine untested. -KEY FINDINGS (do not re-learn these): - - Nuxt 2 and Vue 3 CANNOT coexist in one node_modules. Same package name, two versions, - and shamefullyHoist (which Nuxt 2 needs) forces the collision. Vuetify 2/4 same. - Hence the reference worktree. The plan's original "run both apps in one tree" was WRONG. - - VTimePicker is STABLE in Vuetify 4 (was labs in v3). No labs import. The biggest - flagged risk for Task 12 has evaporated. - - vue-tsc CANNOT use TypeScript 7 despite peering on ">=5.0.0". Pinned to 5.9.3. - - Express 5 leaves req.body undefined, not {}. Guarded. - - assets/variables.scss was NOT imported by any component; the @import was injected by - @nuxtjs/vuetify's customVariables option. Deleting it is correct for the Vite app. - - pnpm 11 ignores shamefully-hoist in .npmrc; it lives in pnpm-workspace.yaml. +Task 1: complete (03b7026, 2da0ae4) — pnpm. Reviewed clean. +Task 2: complete (8f5407f) — Express API extracted from Nuxt. +Task 2b: complete (3e19a49, baff6fe, 2396919) — Mongoose 9.7.4, Express 5.2.1, Node 24. + Reviewed: SPEC PASS. Mongoose 9 <-> upgraded MongoDB now CONFIRMED working. +Task 3: complete (872fe5c, 89d4701) — Vue 3.5.39 / Vuetify 4.1.4 / vue-router 4.6.4 / Vite 8.1.4. +Task 4: complete (cef9226, 4baa68c) — layout. Nav identical to baseline, console clean, verified + by screenshot against the real app. +Task 5: NEXT — settings.vue + SimpleList.vue. Fully verifiable: settings is Mongo-only. -PROCESS: do NOT run `git commit` while a subagent is live — it takes the whole index and - swallows their staged files. This happened twice (Task 1, Task 3). +KEY FINDINGS (do not re-learn): + - Nuxt 2 and Vue 3 CANNOT coexist in one node_modules. Hence the reference worktree. + - VFooter KEEPS `app` in Vuetify 4 (unlike v-app-bar / v-navigation-drawer). Without it the + footer stretches to 320px. Emits NO warning — only a screenshot catches it. + - v-navigation-drawer: Vuetify 2 `app` auto-opened on desktop regardless of v-model. Vuetify 4 + honours v-model literally. Faithful code != faithful behaviour. Drawer must default OPEN. + - v-list-item needs `exact`, else to="/" prefix-matches every route. + - color="grey lighten-1" -> "grey-lighten-1" (space form silently breaks in v4). + - VTimePicker is STABLE in Vuetify 4, not labs. + - vue-tsc cannot use TypeScript 7 despite peering ">=5.0.0". Pinned to 5.9.3. + - Express 5 leaves req.body undefined, not {}. + - LESSON: the semantic structure dump is necessary but NOT sufficient. It missed the closed + drawer (translated off-screen, kept its dimensions). ALWAYS look at the screenshot. -DEFERRED to Task 13: NODE_ENV=production in Dockerfile; engines field; README's config.json - volume-mount instruction is now actively harmful (silently reverts MONGO_URL to default). -DEFERRED to Task 15: pnpm lint fails repo-wide (2136 problems); server/*.js style. +PROCESS: never `git commit` while a subagent is live — it takes the whole index and swallows + their staged files. Happened twice (Tasks 1, 3). -NEVER VERIFIED — needs the real LAN / a Docker host: - - Any successful MongoDB query (10.11.194.75 unreachable from this machine). - - Any Docker build (Docker not installed here). node:24-alpine untested. - - Any actual rendered page in a browser (no browser in this environment). All frontend - verification so far is HTTP/compile-level only. THIS IS A REAL GAP for Tasks 4-12. +DEFERRED to Task 13: NODE_ENV=production; engines field; README's config.json volume-mount + instruction is now actively harmful (silently reverts MONGO_URL to the default). +DEFERRED to Task 15: pnpm lint fails repo-wide (2136 problems). From f5a826d4b18388ed300ece7fb78bdcaaa59be1d1 Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 18:37:23 +0200 Subject: [PATCH 20/66] feat: port settings page and SimpleList to Vue 3 + Vuetify 4 First page on the new stack. Proves the browser -> Express -> Mongoose path. Nuxt's fetch() hook becomes refresh() called from mounted(); $http becomes the native-fetch wrapper. Drops dead commented-out localhost:3000 fetch calls. SimpleList's v-list-item-group was already commented out and its model never declared, so no selection state is ported. Adds persistent-counter to the client name field: Vuetify 2 always showed the counter, Vuetify 4 only shows it on focus, and the reference app shows it permanently. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01GyoqQ4kmb2CrxtK8yRJ3N2 --- src/components/SimpleList.vue | 80 ++++++++++++++++++++ src/pages/settings.vue | 136 ++++++++++++++++++++++++++++++++++ src/typed-router.d.ts | 13 ++++ 3 files changed, 229 insertions(+) create mode 100644 src/components/SimpleList.vue create mode 100644 src/pages/settings.vue diff --git a/src/components/SimpleList.vue b/src/components/SimpleList.vue new file mode 100644 index 0000000..6bdccdd --- /dev/null +++ b/src/components/SimpleList.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/pages/settings.vue b/src/pages/settings.vue new file mode 100644 index 0000000..b6abece --- /dev/null +++ b/src/pages/settings.vue @@ -0,0 +1,136 @@ + + + diff --git a/src/typed-router.d.ts b/src/typed-router.d.ts index 4f53052..cea62ac 100644 --- a/src/typed-router.d.ts +++ b/src/typed-router.d.ts @@ -37,6 +37,13 @@ declare module 'vue-router/auto-routes' { { path: ParamValue }, | never >, + '/settings': RouteRecordInfo< + '/settings', + '/settings', + Record, + Record, + | never + >, } /** @@ -62,6 +69,12 @@ declare module 'vue-router/auto-routes' { views: | never } + 'src/pages/settings.vue': { + routes: + | '/settings' + views: + | never + } } /** From 4ca3e4a3f7a23e5bd073678a6fe7ea10dc506b98 Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 18:52:46 +0200 Subject: [PATCH 21/66] fix: recapture baselines against a fully-working reference app MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous baselines were captured while the environment was half-broken and were actively misleading — settings.txt recorded an EMPTY client list, so a correct port showing 5 clients would have looked like a regression. Three separate causes, all now fixed: - The daemons were unreachable (the client machine's network adapter was on Windows' Public profile). Now reachable; VDR-U/-1/-2 answer 200. - The reference app's own MONGO_URL was the stale 10.11.194.75. - The reference Nuxt ran on a random port, so under SSR @nuxt/http fell back to localhost:3000, could not reach itself, and its fetch() timed out. Pinned to 3300 with a matching baseURL. This is precisely the SSR base-URL bug the SPA migration eliminates — reproduced live. Baselines now contain real data: settings lists all 5 clients with addresses, index/jobs/config/globalconfig carry live daemon state. Task 5's port verified against the corrected baseline: list items byte-identical (5 clients, same addresses, same order), inputs identical, 0 errors, 0 warnings. Co-Authored-By: Claude Opus 4.8 (1M context) --- docs/superpowers/baselines/config.txt | 5 ++--- docs/superpowers/baselines/globalconfig.txt | 2 +- docs/superpowers/baselines/index.txt | 2 +- docs/superpowers/baselines/jobs.txt | 6 +++--- docs/superpowers/baselines/settings.txt | 18 ++++++++++++++---- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/docs/superpowers/baselines/config.txt b/docs/superpowers/baselines/config.txt index 2a5ac47..01a03c4 100644 --- a/docs/superpowers/baselines/config.txt +++ b/docs/superpowers/baselines/config.txt @@ -1,4 +1,4 @@ -# http://100.64.124.194:4169/config +# http://localhost:3300/config title: Avior - powered by Walzen Group @@ -47,7 +47,7 @@ table rows: 0 - Global Configuration - Frontend Settings -## vuetify components rendered (17) +## vuetify components rendered (16) - v-app-bar - v-application - v-btn @@ -60,7 +60,6 @@ table rows: 0 - v-main - v-messages - v-navigation-drawer - - v-progress-circular - v-select - v-sheet - v-text-field diff --git a/docs/superpowers/baselines/globalconfig.txt b/docs/superpowers/baselines/globalconfig.txt index dd91603..00ff848 100644 --- a/docs/superpowers/baselines/globalconfig.txt +++ b/docs/superpowers/baselines/globalconfig.txt @@ -1,4 +1,4 @@ -# http://100.64.124.194:4169/globalconfig +# http://localhost:3300/globalconfig title: Avior - powered by Walzen Group diff --git a/docs/superpowers/baselines/index.txt b/docs/superpowers/baselines/index.txt index 781146a..80c323d 100644 --- a/docs/superpowers/baselines/index.txt +++ b/docs/superpowers/baselines/index.txt @@ -1,4 +1,4 @@ -# http://100.64.124.194:4169/ +# http://localhost:3300/ title: Avior - powered by Walzen Group diff --git a/docs/superpowers/baselines/jobs.txt b/docs/superpowers/baselines/jobs.txt index b101817..c1ee15e 100644 --- a/docs/superpowers/baselines/jobs.txt +++ b/docs/superpowers/baselines/jobs.txt @@ -1,4 +1,4 @@ -# http://100.64.124.194:4169/jobs +# http://localhost:3300/jobs title: Avior - powered by Walzen Group @@ -26,7 +26,7 @@ table rows: 0 - NEW - REASSIGN - DELETE - - VDR-U 31 assigned + - VDR-U 32 assigned - VDR-U-1 32 assigned - PHOENIX 0 assigned - VAVA 0 assigned @@ -56,7 +56,7 @@ table rows: 0 - Global Configuration - Frontend Settings - NEW REASSIGN DELETE - - VDR-U 31 assigned + - VDR-U 32 assigned - VDR-U-1 32 assigned - PHOENIX 0 assigned - VAVA 0 assigned diff --git a/docs/superpowers/baselines/settings.txt b/docs/superpowers/baselines/settings.txt index 185a07e..3ad7f62 100644 --- a/docs/superpowers/baselines/settings.txt +++ b/docs/superpowers/baselines/settings.txt @@ -1,8 +1,8 @@ -# http://100.64.124.194:4169/settings +# http://localhost:3300/settings title: Avior - powered by Walzen Group -body text length: 185 +body text length: 624 table rows: 0 @@ -19,11 +19,16 @@ table rows: 0 ## tabs (0) (none) -## buttons (4) +## buttons (9) - - - - SUBMIT + - + - + - + - + - ## links (7) - Overview -> / @@ -41,13 +46,18 @@ table rows: 0 ## table columns (0) (none) -## list items (6) +## list items (11) - Overview - Job Manager - Client Configuration - Global Configuration - Frontend Settings - Add Address + - Phoenix http://192.168.178.60:10000, http://10.10.10.85:10000, http://172.31.0.85:10000 + - VAVA http://10.11.194.2:10000, http://192.168.178.51:10000 + - VDR-U http://192.168.178.61:10000, http://vdr-u.wan.walzen.org:10000, http://10.11.194.61:10000 + - VDR-U-1 http://192.168.178.61:10001, http://vdr-u.wan.walzen.org:10001, http://10.11.194.61:10001 + - VDR-U-2 http://192.168.178.61:10002, http://vdr-u.wan.walzen.org:10002, http://10.11.194.61:10002 ## vuetify components rendered (19) - v-app-bar From 2bbf4ab568a66bd0a667e2227ee800a73adccc78 Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 19:25:12 +0200 Subject: [PATCH 22/66] Relax porting guidance: lean on Vuetify 4 defaults, log deviations, drop Docker Co-Authored-By: Claude Opus 4.8 (1M context) --- .../superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md | 6 +++++- .../plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md | 6 +++++- 16 files changed, 80 insertions(+), 16 deletions(-) diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md index 6b436fe..de24e0f 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md @@ -18,7 +18,11 @@ Design spec: `docs/superpowers/specs/2026-07-13-nuxt2-to-vue3-migration-design.m - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md index 7179bf7..d297b97 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-01.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md index 114687f..d6ae6f1 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-02.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md index eb80ef8..a8417b8 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-03.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md index 33ce5fd..d7f73ca 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md index 9512b65..66821ff 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md index f548103..e2d96ca 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md index e132d64..c797c96 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md index ddd72d0..efcda9f 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md index 81077db..ecb10c0 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md index 8ffd4ba..5d861a5 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md index f009077..eb683fa 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md index 0a94713..5ae33d5 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md index cd0fedf..6d4b005 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-13.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md index e1e6d7a..bffa2e4 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-14.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md index 8e79e09..85c8829 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-15.md @@ -14,7 +14,11 @@ Read the constraints below before starting; they are not optional. - The browser calls the Avior encoding daemons directly at their absolute LAN addresses. Do not introduce a proxy for them. Only MongoDB stays behind Express. - App-origin API calls use relative paths (`/api/...`) in both dev and prod. No `baseURL` is configured anywhere. This is deliberate: a configured base URL is what broke before. - Vuetify 4 (currently 4.1.4), not Vuetify 3. Vuetify 4 is still a Vue 3 library — the major bump is not about Vue 4. It requires `vue: ^3.5.0`, which we have. -- Vuetify 4 uses Material Design 3. Typography, elevation (25 levels down to 6), default breakpoints, `VContainer` max-widths, and button casing (no more uppercase default) all differ from Vuetify 2 by design. These visual differences are EXPECTED and are not migration bugs. Do not "fix" them back. What must match the old app is structure and behaviour: the same elements, the same hierarchy, the same interactions, the same data. Exact pixels, font sizes, and shadows will not match, and that is correct. +- LEAN ON VUETIFY 4'S DEFAULTS. Do not add props, CSS, or shims to reproduce Vuetify 2's look or behaviour. Vuetify 4 is Material Design 3: typography, elevation (25 levels down to 6), breakpoints, `VContainer` max-widths and button casing all differ by design. Cosmetic and minor behavioural deviations from the old app are ACCEPTED and will be reviewed later — the user has said so explicitly. Do not fight the framework. +- What DOES have to match: structure and data. The same components, in the same places, in the same hierarchy, with the same labels, showing the same data, and the same interactions working. Fonts, shadows, casing, spacing, counters, transitions: let them differ. +- The exception is when a Vuetify 4 default produces something plainly BROKEN rather than merely different — e.g. a footer that stretches to 320px and shoves content off the page. Fix breakage; do not fix difference. If you are unsure which one you are looking at, leave it and report it. +- List every deviation you leave in place in your report, so it can be reviewed as a batch. +- Docker is out of scope. Do not build or verify images. - Theme: Vuetify 4 stock dark theme, with exactly two color overrides — `primary: #9E9E9E`, `secondary: #FF8F00`. Do not port the old accent/info/warning/error/success entries. Set `defaultTheme: 'dark'` explicitly: Vuetify 4 changed the default to follow system preference, which would otherwise give a light app. - Our own components are imported explicitly. Vuetify's components are auto-imported by `vite-plugin-vuetify`. Do not add `unplugin-vue-components` for our components. - There is no test suite, by the user's explicit choice. Every task's verification step is a manual observation against the running app. Never claim a task works without having actually run the stated command and seen the stated result. From 9a605c93d48ec02c60acdda4834c4ca4801b6b9e Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 19:38:50 +0200 Subject: [PATCH 23/66] feat: port Client.vue to Vue 3 + Vuetify 4 Largest and most carefully tuned component in the project (879 lines). Behaviour preserved exactly. v-tooltip's activator slot API changed (on/attrs -> props); v-skeleton-loader, v-virtual-scroll and v-btn-toggle props checked individually against Vuetify 4. Daemon log calls remain absolute URLs straight from the browser, not proxied. Three changes go beyond a mechanical rewrite; all three fix real breakage: - VCard's `progress` slot is `loader` in Vuetify 4, and its LoaderSlot renders the slot content unconditionally (passing `isActive`) where Vuetify 2 rendered it only while `loading` was truthy. Left as-is the progress bars would show on idle cards, and an offline client -- which has no Encoder object at all -- would throw on `client.Encoder.OfSlices`. The content is now gated on `isLoading`, the exact expression Vuetify 2 passed to `loading`. - src/api/http.ts `get()` did an unconditional JSON.parse. Nuxt's $http used destr(): JSON when the body parses as JSON, the raw string otherwise. The daemons serve everything as text/plain and /logs/{main,err,processed,skipped} are plain log text, so every log fetch would have thrown. get() now follows destr's rule. - The style block declared lang="scss" but contains no SCSS syntax. The only sass in node_modules is a stale 1.32 transitive leftover that Vite 8 cannot drive, so it is plain CSS now: identical output, no new dependency. Pre-existing quirks preserved, NOT fixed: - getSkippedLog() sets showProcessedLog = false twice and never clears showErrorLog, so opening Skipped Log leaves Error Log open. - Line 37's `v-else-if="isActive"` references the method without calling it, so it is always truthy. Preserved verbatim. - `:v-show="!determineIndeterminate()"` on both progress bars binds a prop literally named "v-show" and has never done anything. Preserved verbatim. - bufferValue returns undefined when no process is active. --- src/api/http.ts | 12 +- src/components/Client.vue | 874 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 885 insertions(+), 1 deletion(-) create mode 100644 src/components/Client.vue diff --git a/src/api/http.ts b/src/api/http.ts index 87de2c1..728270f 100644 --- a/src/api/http.ts +++ b/src/api/http.ts @@ -13,7 +13,17 @@ async function request(url: string, init?: RequestInit): Promise { // Some daemon endpoints reply 204 or with an empty body. const text = await res.text() - return (text ? JSON.parse(text) : null) as T + if (!text) return null as T + + // Nuxt's $http returned destr(body): JSON when the body parses as JSON, the + // raw string otherwise. The daemons serve their whole API as text/plain -- + // the status objects happen to be JSON, but /logs/{main,err,processed,skipped} + // are plain log text that JSON.parse would throw on. Preserve destr's rule. + try { + return JSON.parse(text) as T + } catch { + return text as unknown as T + } } export function get(url: string): Promise { diff --git a/src/components/Client.vue b/src/components/Client.vue new file mode 100644 index 0000000..774130a --- /dev/null +++ b/src/components/Client.vue @@ -0,0 +1,874 @@ + + + + + From 6c312b62a4c467c81317eb0578e8c90dd04d0985 Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 19:45:31 +0200 Subject: [PATCH 24/66] feat: port Overview page to Vue 3 + Vuetify 4 Nuxt's fetch() hook becomes refresh() from mounted(); $fetchState.pending and $fetchState.error become plain `loading` and `fetchError` data properties. $http.$get becomes get() from @/api/http, this.$set becomes direct assignment, and the promise.any polyfill import is dropped in favour of the native Promise.any (the dependency stays in package.json until Task 14). Fixes a latent bug: the client registry was fetched from the relative path 'api/clients' rather than '/api/clients', which only worked because this page is mounted at the root and would have broken on any nested route. Address-resolution logic remains duplicated here; it is extracted into a composable in the TypeScript pass. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01GyoqQ4kmb2CrxtK8yRJ3N2 --- src/pages/index.vue | 258 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 257 insertions(+), 1 deletion(-) diff --git a/src/pages/index.vue b/src/pages/index.vue index 95568c9..1a4b6a9 100644 --- a/src/pages/index.vue +++ b/src/pages/index.vue @@ -1,3 +1,259 @@ + + + + From f0ff08cbee44c43385c2c5bf9755992d4f9f154a Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 19:47:33 +0200 Subject: [PATCH 25/66] Correct the Vuetify conversion table: VRow props kept, add 5 silent traps The ten parallel Modules ports all made the SAME four mistakes, because they all validated against the same incomplete table. vue-tsc catches none of them: an unknown attribute on a Vue component falls through to $attrs with no type error, so every agent reported 'typechecks: true' in good faith. Verified against the shipped Vuetify 4.1.4 typings: - VRow STILL has dense/align/justify/no-gutters. My table said they were removed. - 'outlined' is NOT a VTextField prop, only a variant value. Bare 'outlined' silently renders the default filled variant. - color='red darken-3' (v2 space syntax) is not a valid v4 colour; falls back. - v-slider: ticks='always' moved to show-ticks; tick-labels does not exist. - v-slider #thumb-label slot arg renamed value -> modelValue. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../2026-07-13-nuxt2-to-vue3-migration.md | 22 +++++++++++++++---- .../task-04.md | 22 +++++++++++++++---- .../task-05.md | 22 +++++++++++++++---- .../task-06.md | 22 +++++++++++++++---- .../task-07.md | 22 +++++++++++++++---- .../task-08.md | 22 +++++++++++++++---- .../task-09.md | 22 +++++++++++++++---- .../task-10.md | 22 +++++++++++++++---- .../task-11.md | 22 +++++++++++++++---- .../task-12.md | 22 +++++++++++++++---- 10 files changed, 180 insertions(+), 40 deletions(-) diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md index de24e0f..0680e4f 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration.md @@ -68,16 +68,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md index d7f73ca..1fb624d 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-04.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md index 66821ff..6cf8fd2 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-05.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md index e2d96ca..396fb66 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-06.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md index c797c96..0eb3f52 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-07.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md index efcda9f..77a599c 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-08.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md index ecb10c0..171dde7 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-09.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md index 5d861a5..3e8aa73 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-10.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md index eb683fa..e4e8d4a 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-11.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. diff --git a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md index 5ae33d5..4eaf035 100644 --- a/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md +++ b/docs/superpowers/plans/2026-07-13-nuxt2-to-vue3-migration/task-12.md @@ -64,16 +64,30 @@ The table above covers what Vuetify 3 removed. Vuetify 4 changes more on top of | Vuetify 3 | Vuetify 4 | |---|---| -| `` | `` (or `gap="8"`) | -| `` / `justify="..."` / `align-content="..."` | props removed — use the equivalent utility class on the row (`align-center`, `justify-center`, …), including the responsive variants (`align-sm`, `order-md`, …) | -| `` / `align-self="..."` | props removed — use utility classes | +| `` / `align` / `justify` / `no-gutters` | STILL PRESENT in Vuetify 4.1.4 — verified against `VRow.d.ts`. Leave them alone. (The upgrade guide describes a future direction; the shipped component still accepts them.) | | `v-select` / `v-combobox` / `v-autocomplete` slot `#item` | renamed `#internalItem`. `item` survives as an alias for `internalItem.raw`, so read the slot body before changing it | | `v-container fill-height` centering | no longer centers vertically — add `d-flex align-center flex-wrap` if the centering was load-bearing | | `elevation-8` and similar, up to 24 | elevation is now 0-5 only. Map anything above 5 down; a codemod exists | | `text-h1` … `text-caption` typography classes | renamed to the MD3 scale (`text-display-large`, `text-headline-small`, `text-body-medium`, …). A codemod exists | | `v-btn` uppercase by default | no longer uppercase. If a specific button's casing matters, set it explicitly | -The grid is the one to be careful with: Vuetify 4 rebuilt `v-row`/`v-col` on CSS `gap` instead of negative margins. Read what a row is actually doing before converting it. +### Silent traps: wrong in Vuetify 4, but NOT caught by vue-tsc + +These are the dangerous ones. An unknown attribute on a Vue component falls through to `$attrs` with no type error, so `pnpm typecheck` passes and the component silently renders wrong. All four were found only by reading the shipped Vuetify typings. Check every one of them in every file you port. + +| Vuetify 2 | Vuetify 4 | What happens if you leave it | +|---|---|---| +| `` (also `v-textarea`, `v-select`) | `variant="outlined"` | `outlined` is NOT a prop in v4 — it is only a value of `variant`. The attribute lands on the DOM node and the field renders as the default `filled` variant. Visibly wrong, no warning. | +| `color="red darken-3"` (space-separated) | `color="red-darken-3"` (hyphenated) | The v2 colour-helper syntax is not a valid v4 colour. The component falls back to its default colour. No warning. | +| `` | `show-ticks="always"` | In v4 `ticks` takes `number[]` or `Record`; the `"always"` value moved to the separate `show-ticks` prop. Ticks silently vanish. | +| `` | `:ticks="record"` where record is `Record` | `tickLabels` does not exist in v4 at all. Labels silently vanish. | +| `v-slider` `#thumb-label` slot arg `{ value }` | `{ modelValue }` | The slot arg was renamed. `props.value` is `undefined`. | + +Verify any prop you are unsure about against the shipped typings rather than the docs or memory: + +```bash +grep -n "propName" node_modules/vuetify/lib/components/VComponent/VComponent.d.ts +``` The current codebase is Vuetify 2, so it does not use the MD3 typography or elevation class names anywhere — those rows matter only if a port introduces them. Do not introduce them. From c56a386798c4b83b32078588226208d57a22e205 Mon Sep 17 00:00:00 2001 From: bmaeofu Date: Mon, 13 Jul 2026 19:50:15 +0200 Subject: [PATCH 26/66] feat: port the ten Modules/*Settings components to Vuetify 4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ported in parallel by ten agents, then fixed as a batch. A consistency reviewer reading all ten together caught four errors that every agent made identically, because they all validated against the same incomplete conversion table — and that vue-tsc cannot catch, since unknown attributes on a Vue component fall through to $attrs with no type error: - bare `outlined` on v-text-field: not a prop in Vuetify 4, only a variant value. Silently rendered the default FILLED variant. Now variant="outlined". - color="red darken-3": the v2 space-separated helper is not a valid v4 colour; components silently fell back to their default. Now "red-darken-3". - v-slider ticks="always": the "always" value moved to a separate show-ticks prop; ticks now takes number[] | Record. - v-slider tick-labels: does not exist in v4 at all. Labels now come from `ticks` as a Record — added a computed to build it from the existing array. Left deliberately alone: the #thumb-label slot arg rename (value -> modelValue). Neither slider sets thumb-label, so the slot never renders in either version. Dead code stays dead. Also reverts a justify="start" -> utility-class change in index.vue: VRow in 4.1.4 still has dense/align/justify/no-gutters, contrary to what the table said. Scripts untouched: all ten remain Options API JavaScript, props and the `newdata` event byte-identical, so config.vue and Module.vue port against the original contract. NOT visually verified — these render inside config.vue, which is Task 10. Typecheck and build pass. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/components/Modules/AgeSettings.vue | 61 ++++++++ src/components/Modules/AudioSettings.vue | 102 +++++++++++++ .../Modules/DuplicateLengthCheckSettings.vue | 72 +++++++++ .../Modules/ErrorReplaceSettings.vue | 66 +++++++++ src/components/Modules/ErrorSkipSettings.vue | 61 ++++++++ src/components/Modules/LengthSettings.vue | 72 +++++++++ src/components/Modules/LogMatchSettings.vue | 99 +++++++++++++ src/components/Modules/MaxSizeSettings.vue | 61 ++++++++ src/components/Modules/ResolutionSettings.vue | 76 ++++++++++ src/components/Modules/SizeApproxSettings.vue | 140 ++++++++++++++++++ src/pages/index.vue | 2 +- 11 files changed, 811 insertions(+), 1 deletion(-) create mode 100644 src/components/Modules/AgeSettings.vue create mode 100644 src/components/Modules/AudioSettings.vue create mode 100644 src/components/Modules/DuplicateLengthCheckSettings.vue create mode 100644 src/components/Modules/ErrorReplaceSettings.vue create mode 100644 src/components/Modules/ErrorSkipSettings.vue create mode 100644 src/components/Modules/LengthSettings.vue create mode 100644 src/components/Modules/LogMatchSettings.vue create mode 100644 src/components/Modules/MaxSizeSettings.vue create mode 100644 src/components/Modules/ResolutionSettings.vue create mode 100644 src/components/Modules/SizeApproxSettings.vue diff --git a/src/components/Modules/AgeSettings.vue b/src/components/Modules/AgeSettings.vue new file mode 100644 index 0000000..a7ac164 --- /dev/null +++ b/src/components/Modules/AgeSettings.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/Modules/AudioSettings.vue b/src/components/Modules/AudioSettings.vue new file mode 100644 index 0000000..fd7e922 --- /dev/null +++ b/src/components/Modules/AudioSettings.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/src/components/Modules/DuplicateLengthCheckSettings.vue b/src/components/Modules/DuplicateLengthCheckSettings.vue new file mode 100644 index 0000000..44d10f7 --- /dev/null +++ b/src/components/Modules/DuplicateLengthCheckSettings.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/Modules/ErrorReplaceSettings.vue b/src/components/Modules/ErrorReplaceSettings.vue new file mode 100644 index 0000000..7d225b1 --- /dev/null +++ b/src/components/Modules/ErrorReplaceSettings.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/src/components/Modules/ErrorSkipSettings.vue b/src/components/Modules/ErrorSkipSettings.vue new file mode 100644 index 0000000..2a42ce5 --- /dev/null +++ b/src/components/Modules/ErrorSkipSettings.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/Modules/LengthSettings.vue b/src/components/Modules/LengthSettings.vue new file mode 100644 index 0000000..c2aede8 --- /dev/null +++ b/src/components/Modules/LengthSettings.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/Modules/LogMatchSettings.vue b/src/components/Modules/LogMatchSettings.vue new file mode 100644 index 0000000..a5c865b --- /dev/null +++ b/src/components/Modules/LogMatchSettings.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/components/Modules/MaxSizeSettings.vue b/src/components/Modules/MaxSizeSettings.vue new file mode 100644 index 0000000..06e7b0b --- /dev/null +++ b/src/components/Modules/MaxSizeSettings.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/Modules/ResolutionSettings.vue b/src/components/Modules/ResolutionSettings.vue new file mode 100644 index 0000000..59978f6 --- /dev/null +++ b/src/components/Modules/ResolutionSettings.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/components/Modules/SizeApproxSettings.vue b/src/components/Modules/SizeApproxSettings.vue new file mode 100644 index 0000000..ea45613 --- /dev/null +++ b/src/components/Modules/SizeApproxSettings.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/src/pages/index.vue b/src/pages/index.vue index 1a4b6a9..3f4c510 100644 --- a/src/pages/index.vue +++ b/src/pages/index.vue @@ -1,6 +1,6 @@