diff --git a/.gitignore b/.gitignore index 57b10a5..6d1f429 100644 --- a/.gitignore +++ b/.gitignore @@ -29,7 +29,6 @@ dist.tar.gz # auto-generated build file for PWA dev-dist/sw.js -public/icons/ aio-shadcn-vite.code-workspace dev-dist .specstory/history diff --git a/CLAUDE.md b/CLAUDE.md index 1ab8ab6..5b890de 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -712,63 +712,8 @@ VITE_ADMIN_PUBKEYS='["pubkey1","pubkey2"]' # Optional: Disable WebSocket if needed VITE_WEBSOCKET_ENABLED=true - -# Brand kit override (defaults to ./branding/default) -BRAND_DIR=branding/cfaun - -# Per-standalone brand override (set by build pipeline, not directly) -BRAND_APP=events ``` -## Brand kit (white-label PWA branding) - -The webapp ships a brand kit architecture so the hub + every standalone -(events, wallet, chat, market, …) can be rebranded per deployment without -forking the codebase. See `branding/README.md` for the deployer contract. - -**Single source of truth:** `branding//` holds `logo.{svg,png}` + -`brand.json`. `vite-branding.ts` reads brand.json and exposes a `@brand` -import alias. `pwa-assets.config.ts` + `@vite-pwa/assets-generator` derive -the full PWA icon set from the single logo source. - -**brand.json schema:** `{ name, shortName?, themeColor?, backgroundColor? }` -— `name` drives the manifest. `themeColor`/`backgroundColor` are optional -chrome overrides; when unset, each standalone's per-app accent applies. - -**In-app logo:** components reference `@brand/logo.png`. Active consumers: -`Login.vue`, `LoginDemo.vue`, `AppSidebar.vue`, `MobileDrawer.vue`. The -Vite alias resolves to the active brand dir at build time. - -**Generated icons:** `public/icons/` is gitignored. `brandAssetsPlugin()` -(registered first in every `vite.*.config.ts`'s plugins[]) runs the -generator once per build/dev start via `buildStart`. Outputs match the -existing filename convention (`icon-192.png`, `icon-maskable-512.png`, -…) so HTML `` hrefs and VitePWA `manifest.icons` reference -`/icons/` consistently across all 9 configs. - -**Per-standalone override:** `branding//icons//logo.{svg,png}` -is checked before the brand's primary logo. The standalone build sets -`BRAND_APP`; deployers just put files in the right place. - -**Switching brands:** -```bash -BRAND_DIR=branding/cfaun pnpm build:events -``` - -**Adding a new in-app logo consumer:** use `` -instead of `@/assets/logo.png`. The latter still works for non-brand -assets (`@/assets/bitcoin.svg`, etc.) — it's only the logo that moved. - -**NixOS deployment:** `flake.nix` exposes -`lib.mkWebapp { pkgs, brandDir ? ./branding/default, app ? "main" }`. -Server-deploy hosts call it from their `services/webapp.nix`: -`inputs.webapp.lib.mkWebapp { inherit pkgs; brandDir = ./../branding; app = "events"; }`. -Builder pins `pkgs.pnpm_10` regardless of consumer's nixpkgs (keeps -pnpmDeps hash stable downstream), uses `autoPatchelfHook` to handle -prebuilt sharp binaries, and sets `CI=true` to bypass pnpm's -interactive modules-purge prompt. Per-host migration tracked in -aiolabs/server-deploy#8. - ## Payment Rails Pattern Shared primitives for modules that mix Lightning + fiat (and, future, diff --git a/branding/README.md b/branding/README.md deleted file mode 100644 index 00aac49..0000000 --- a/branding/README.md +++ /dev/null @@ -1,172 +0,0 @@ -# Brand kit - -This directory holds the **white-label brand kit** that drives the PWA's icons, manifest name/colors, and in-app `` logo across the hub and every standalone (events, wallet, chat, market, …). - -The committed `default/` is aiolabs's brand and is what unparameterized builds use. Downstream deployers add a sibling directory (e.g. `branding/cfaun/`) and point `BRAND_DIR` at it to ship a fully rebranded build with no fork required. - -## Directory layout - -``` -branding/ - README.md - default/ # aiolabs default, committed - logo.svg # preferred source (sharp at every size) - logo.png # fallback source (≥ 1024×1024 if PNG-only) - brand.json # { name, shortName?, themeColor?, backgroundColor? } - icons/ # optional per-standalone overrides - events/logo.svg - wallet/logo.png - cfaun/ # downstream deployer's brand (gitignored or in deploy repo) - logo.svg - brand.json -``` - -aiolabs's `default/` currently ships PNG-only (1024×1024). Replace with `logo.svg` when a vector source becomes available — produces sharper icons at every size and unlocks `favicon.svg`. - -## Source formats - -**SVG strongly preferred:** - -- Crisp at every output size (192 / 512 maskable / 180 apple / 48 favicon) -- Enables sharp `favicon.svg` for modern browsers -- The in-app `@brand/logo` reference can be tinted via CSS (`currentColor`, filters) - -**PNG accepted with constraints:** - -- **≥ 1024×1024** — smaller sources produce blurry icons on high-DPI Android install screens -- **Square aspect ratio** — PWA icon canvas is square -- **Transparent background** — the generator applies maskable/apple background colors itself -- PNG-source deployments lose the `favicon.svg` benefit and the recolorable in-app logo - -When both `logo.svg` and `logo.png` are present, SVG wins. - -## brand.json schema - -```jsonc -{ - "name": "AIO", // required — drives PWA manifest name - "shortName": "AIO", // optional — PWA home-screen label; defaults to `name` - "themeColor": "#1f2937", // optional — PWA chrome color override (otherwise each standalone keeps its accent) - "backgroundColor": "#fff", // optional — PWA splash background - "theme": "light", // optional — default in-app mode: light | dark | system - "palette": "darkmatter" // optional — default in-app palette (see PALETTES) -} -``` - -`themeColor` and `backgroundColor` are *overrides*, not defaults. When unset, each standalone's own accent applies (wallet yellow `#eab308`, chat green `#16a34a`, …) — so the default brand kit preserves the per-app visual identity, and a deployer who wants unified chrome adds the override. - -`theme` and `palette` set the **in-app** color scheme — distinct from `themeColor` (which is only the PWA chrome / status-bar color). They define the *initial* default a fresh visitor sees; once a user picks a theme in-app it's stored in `localStorage` and always wins. `palette` must be one of the names in `src/components/theme-provider` (`PALETTES`): `catppuccin` (the built-in default), `countrysidecastle`, `darkmatter`, `emeraldforest`, `lightgreen`, `neobrut`, `starrynight`. Each palette has both a light and a dark variant, so e.g. "darkmatter light" is `{ "theme": "light", "palette": "darkmatter" }`. Unset → the app's built-ins (`dark` + `catppuccin`). Applies app-wide (hub + every standalone). - -## Per-standalone overrides - -Place a logo at `branding//icons//logo.{svg,png}` to override the brand's primary logo for a single standalone build. - -Resolution at build time: - -1. `branding//icons//logo.svg` -2. `branding//icons//logo.png` -3. `branding//logo.svg` -4. `branding//logo.png` -5. Build fails with a clear error pointing here. - -`` is set via `BRAND_APP` env var (the standalone build script sets this; deployers don't touch it directly). - -## Optional banner (logo + wordmark lockup) - -A brand may ship a **banner** — a single wide image combining the logo and the wordmark — that replaces the logo + app-name pair in a standalone's header (currently the events page header). Banners are optional: brands without one keep the default logo + name rendering. - -``` -branding// - banner.svg # preferred — crisp at any size, recolorable - banner.png # fallback (wide, transparent background) - icons/ - events/banner.svg # optional per-standalone override -``` - -Resolution mirrors the logo chain (`resolveAppBanner` in `vite-branding.ts`): - -1. `branding//icons//banner.svg` -2. `branding//icons//banner.png` -3. `branding//banner.svg` -4. `branding//banner.png` -5. No banner → header falls back to logo + name (no error). - -SVG is strongly preferred — a banner is wide and rasterizes poorly when scaled. Components reference it via the build-time `@brand-app-banner` alias; whether it renders is driven by the `VITE_APP_BANNER` flag, so the component stays brand-agnostic. - -> **⚠️ Outline text to paths in any SVG you ship.** The browser only has -> web-safe fonts — if a banner/logo SVG keeps live `` elements that -> reference a designer font (e.g. a decorative display face), the browser -> substitutes a default font and the glyphs render wrong (we hit this with -> a mangled `!` in the "Oyez!" banner). In Inkscape: **Edit → Select All in -> All Layers (Ctrl+Alt+A)** — plain Select All only covers the current -> layer — then **Path → Object to Path (Shift+Ctrl+C)**, and save. Verify -> with `grep -c '` alias. -3. `brandAssetsPlugin()` (registered in every `vite.*.config.ts`) runs `scripts/generate-pwa-assets.mjs` once per build via `buildStart`. -4. The script stages the source logo into `public/icons/.brand-source.{svg,png}`, runs `pwa-assets-generator`, then deletes the staged source. -5. Vite copies `public/icons/` into `dist/icons/`. Manifest references `icons/.png`. HTML `` tags reference `/icons/.{ico,png}`. - -## Integration with NixOS deployment - -`flake.nix` exposes `lib.mkWebapp { pkgs, brandDir ? ./branding/default, app ? "main" }` for downstream consumers. Per-host wiring in `deploy/server-deploy/hosts//services/webapp.nix` looks like: - -```nix -{ inputs, pkgs, ... }: -{ - services.webapp.apps = { - main = inputs.webapp.lib.mkWebapp { inherit pkgs; brandDir = ./../branding; }; - events = inputs.webapp.lib.mkWebapp { inherit pkgs; brandDir = ./../branding; app = "events"; }; - wallet = inputs.webapp.lib.mkWebapp { inherit pkgs; brandDir = ./../branding; app = "wallet"; }; - }; -} -``` - -`brandDir` is either a path inside this flake (`./branding/`) or an external path (e.g. `./../branding` from server-deploy). Either way Nix copies it into the build sandbox. - -Builder details: -- Uses `pkgs.pnpm_10` regardless of consumer's nixpkgs, so the pnpmDeps hash stays stable across downstream nixpkgs versions. -- `pkgs.autoPatchelfHook` + `stdenv.cc.cc.lib` patch the prebuilt `@img/sharp-libvips-linux-*` binaries. -- `CI=true` bypasses pnpm 10's interactive modules-purge prompt in the sandbox. - -The architectural payoff: brand and code become independent axes. Logo changes ship via server-deploy commits + redeploys — no webapp release, no `flake.lock` bump. - -For local sanity: - -```bash -nix build .#main # hub with aiolabs default brand -nix build .#events # events standalone with aiolabs default -# events with a custom brand (the impure way, ad-hoc): -nix build --impure --expr 'let pkgs = import {}; flake = builtins.getFlake (toString ./.); in flake.lib.mkWebapp { inherit pkgs; brandDir = /path/to/brand; app = "events"; }' -``` diff --git a/branding/default/brand.json b/branding/default/brand.json deleted file mode 100644 index 2fc12c4..0000000 --- a/branding/default/brand.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "AIO", - "shortName": "AIO" -} diff --git a/branding/default/logo.png b/branding/default/logo.png deleted file mode 100644 index becf3b5..0000000 Binary files a/branding/default/logo.png and /dev/null differ diff --git a/chat.html b/chat.html index 1f0bdfd..fb83dee 100644 --- a/chat.html +++ b/chat.html @@ -6,8 +6,9 @@ - - + + + Chat — Encrypted diff --git a/docs/nostr-patterns/replaceable-events.md b/docs/nostr-patterns/replaceable-events.md index f02158b..0cad379 100644 --- a/docs/nostr-patterns/replaceable-events.md +++ b/docs/nostr-patterns/replaceable-events.md @@ -7,19 +7,15 @@ in this file follows from that single fact. ## Strictly-monotonic `created_at` per coord -**Canonical helper:** `src/lib/nostr/timestamp.ts` — -`monotonicCreatedAt(lastCreatedAt, now?)` returns `max(now, last + 1)`. -Use it for **every** replaceable-event publish; track the last -`created_at` per coord (a `Map` when one composable -publishes many coords like `useRSVP.ts`, or a single field when there's -one coord per user like `useBookmarks.ts`' kind-10003 list). +**Canonical:** `src/modules/events/composables/useRSVP.ts` — +`lastPublishAt` map + the `Math.max(now, previous + 1)` line. ```ts -import { monotonicCreatedAt } from '@/lib/nostr/timestamp' - const lastPublishAt = new Map() -const createdAt = monotonicCreatedAt(lastPublishAt.get(coord)) +const now = Math.floor(Date.now() / 1000) +const previous = lastPublishAt.get(coord) ?? 0 +const createdAt = Math.max(now, previous + 1) … lastPublishAt.set(coord, signedEvent.created_at) // only after publish success ``` diff --git a/events.html b/events.html index 801e609..ef24349 100644 --- a/events.html +++ b/events.html @@ -6,8 +6,9 @@ - - + + + %VITE_APP_NAME% diff --git a/flake.lock b/flake.lock deleted file mode 100644 index 8f6b10e..0000000 --- a/flake.lock +++ /dev/null @@ -1,61 +0,0 @@ -{ - "nodes": { - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1780749050, - "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "root": { - "inputs": { - "flake-utils": "flake-utils", - "nixpkgs": "nixpkgs" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix deleted file mode 100644 index 1fb7ba1..0000000 --- a/flake.nix +++ /dev/null @@ -1,114 +0,0 @@ -{ - description = "AIO webapp — modular Vue 3 + Vite shell with Lightning + Nostr standalones"; - - inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; - flake-utils.url = "github:numtide/flake-utils"; - }; - - outputs = { self, nixpkgs, flake-utils }: - let - apps = [ "main" "events" "wallet" "chat" "market" "forum" "tasks" "restaurant" "libra" ]; - - # Use this flake's pinned nixpkgs for the build, regardless of which - # nixpkgs the consumer's `pkgs` is from. Without this, the pnpmDeps - # hash drifts as soon as a consumer's nixpkgs has a different - # pnpm_10 minor version (snapshots are byte-for-byte different per - # pnpm version). Only `pkgs`'s system attribute is honored. - flakePkgsFor = pkgs: import nixpkgs { - inherit (pkgs.stdenv.hostPlatform) system; - }; - - mkWebapp = { pkgs, brandDir ? ./branding/default, app ? "main", extraEnv ? {} }: - let - buildScript = if app == "main" then "build" else "build:${app}"; - outDir = if app == "main" then "dist" else "dist-${app}"; - flakePkgs = flakePkgsFor pkgs; - in - flakePkgs.stdenv.mkDerivation (finalAttrs: { - pname = "aio-webapp-${app}"; - version = "0.0.0"; - - src = ./.; - - # pnpm comes from THIS flake's pinned nixpkgs (via flakePkgs), - # never the consumer's, so the pnpmDeps snapshot is stable. - pnpm = flakePkgs.pnpm_10; - - pnpmDeps = flakePkgs.fetchPnpmDeps { - inherit (finalAttrs) pname version src; - inherit (finalAttrs) pnpm; - fetcherVersion = 3; - hash = "sha256-2azTpxT+zZqNYNbwC7mj187Tn68p4T0626NotPDGuSU="; - }; - - nativeBuildInputs = [ - flakePkgs.nodejs - finalAttrs.pnpm - flakePkgs.pnpmConfigHook - flakePkgs.autoPatchelfHook - ]; - - # sharp's prebuilt libvips binaries (under @img/sharp-libvips-*) - # are dynamically linked; autoPatchelfHook needs the runtime libs. - buildInputs = [ - flakePkgs.stdenv.cc.cc.lib - ]; - - # Brand kit env knobs read by vite-branding.ts and - # pwa-assets.config.ts. brandDir is either ./branding/default - # (a path inside this flake's source) or an external path that - # nix has copied into the build sandbox. - # - # `extraEnv` flows in VITE_* and any other build-time env vars - # the caller wants to bake into the bundle (e.g. webapp-module - # passes VITE_NOSTR_RELAYS / VITE_LNBITS_BASE_URL / …; the - # server-deploy standalones module passes VITE_BASE_PATH + - # VITE_APP_NAME for per-app path mounts). - env = { - BRAND_DIR = "${brandDir}"; - BRAND_APP = if app == "main" then "" else app; - # Avoid pnpm 10's interactive modules-purge prompt in the - # sandbox (ERR_PNPM_ABORTED_REMOVE_MODULES_DIR_NO_TTY). - CI = "true"; - } // extraEnv; - - buildPhase = '' - runHook preBuild - pnpm run ${buildScript} - runHook postBuild - ''; - - installPhase = '' - runHook preInstall - mkdir -p $out - cp -r ${outDir} $out/ - runHook postInstall - ''; - - meta = with flakePkgs.lib; { - description = "AIO webapp${if app == "main" then "" else " (${app} standalone)"}"; - homepage = "https://git.atitlan.io/aiolabs/webapp"; - license = licenses.mit; - platforms = platforms.linux; - }; - }); - in - { - # System-agnostic builder. Downstream NixOS hosts call this from - # their services/webapp.nix with their own brandDir. - lib.mkWebapp = mkWebapp; - } - // flake-utils.lib.eachDefaultSystem (system: - let - pkgs = import nixpkgs { inherit system; }; - # One package per standalone, all using the aiolabs default brand. - # `nix build .#` exercises the builder for sanity / CI. - appPackages = pkgs.lib.genAttrs apps (app: mkWebapp { inherit pkgs app; }); - in - { - packages = appPackages // { - default = appPackages.main; - }; - }); -} diff --git a/forum.html b/forum.html index 8d81ea2..8646936 100644 --- a/forum.html +++ b/forum.html @@ -6,8 +6,9 @@ - - + + + Forum — Discussions diff --git a/index.html b/index.html index 6198b69..76e7922 100644 --- a/index.html +++ b/index.html @@ -7,8 +7,9 @@ - - + + + %VITE_APP_NAME% Hub diff --git a/libra.html b/libra.html index 88a9248..58927c4 100644 --- a/libra.html +++ b/libra.html @@ -6,8 +6,9 @@ - - + + + Libra — Accounting diff --git a/market.html b/market.html index 321435a..3fc32d5 100644 --- a/market.html +++ b/market.html @@ -6,8 +6,9 @@ - - + + + Market — Nostr diff --git a/package.json b/package.json index d40f262..4fea5ac 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,10 @@ "type": "module", "main": "electron/main.cjs", "scripts": { - "generate-pwa-assets": "node scripts/generate-pwa-assets.mjs", "dev": "vite --host", "build": "vue-tsc -b && vite build", "preview": "vite preview --host", "analyze": "vite build --mode analyze", - "test": "vitest run", - "test:watch": "vitest", "dev:events": "vite --host --config vite.events.config.ts", "build:events": "vue-tsc -b && vite build --config vite.events.config.ts", "preview:events": "vite preview --host --config vite.events.config.ts", @@ -95,7 +92,6 @@ "@types/node": "^22.18.1", "@types/qrcode": "^1.5.5", "@types/rollup-plugin-visualizer": "^4.2.3", - "@vite-pwa/assets-generator": "^1.0.2", "@vitejs/plugin-vue": "^5.2.1", "@vue/tsconfig": "^0.7.0", "concurrently": "^8.2.2", @@ -109,7 +105,6 @@ "vite-plugin-image-optimizer": "^1.1.7", "vite-plugin-inspect": "^0.8.3", "vite-plugin-pwa": "^0.21.1", - "vitest": "^4.1.9", "vue-tsc": "^2.2.0", "web-push": "^3.6.7", "workbox-window": "^7.3.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f531eb5..d1a8b7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -150,9 +150,6 @@ importers: '@types/rollup-plugin-visualizer': specifier: ^4.2.3 version: 4.2.4 - '@vite-pwa/assets-generator': - specifier: ^1.0.2 - version: 1.0.2 '@vitejs/plugin-vue': specifier: ^5.2.1 version: 5.2.4(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0))(vue@3.5.34(typescript@5.6.3)) @@ -191,10 +188,7 @@ importers: version: 0.8.9(rollup@4.60.4)(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)) vite-plugin-pwa: specifier: ^0.21.1 - version: 0.21.2(@vite-pwa/assets-generator@1.0.2)(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0))(workbox-build@7.4.1)(workbox-window@7.4.1) - vitest: - specifier: ^4.1.9 - version: 4.1.9(@types/node@22.19.19)(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)) + version: 0.21.2(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0))(workbox-build@7.4.1)(workbox-window@7.4.1) vue-tsc: specifier: ^2.2.0 version: 2.2.12(typescript@5.6.3) @@ -717,9 +711,6 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@canvas/image-data@1.1.0': - resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==} - '@electron-forge/cli@7.11.2': resolution: {integrity: sha512-c+C4ndLfHbxwZuCn9G8iT9wD/woLdaVkoSVjAIbj+0nJhi8UmiVsz/+Gxlj4cvhMRTzBMBxudstLU7RocMikfg==} engines: {node: '>= 16.4.0'} @@ -1292,9 +1283,6 @@ packages: '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@quansync/fs@1.0.0': - resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - '@rollup/plugin-babel@6.1.0': resolution: {integrity: sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==} engines: {node: '>=14.0.0'} @@ -1498,9 +1486,6 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@swc/helpers@0.5.21': resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} @@ -1641,12 +1626,6 @@ packages: '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1718,11 +1697,6 @@ packages: peerDependencies: zod: ^3.24.0 - '@vite-pwa/assets-generator@1.0.2': - resolution: {integrity: sha512-MCbrb508JZHqe7bUibmZj/lyojdhLRnfkmyXnkrCM2zVrjTgL89U8UEfInpKTvPeTnxsw2hmyZxnhsdNR6yhwg==} - engines: {node: '>=16.14.0'} - hasBin: true - '@vitejs/plugin-vue@5.2.4': resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -1730,35 +1704,6 @@ packages: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vitest/expect@4.1.9': - resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} - - '@vitest/mocker@4.1.9': - resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} - peerDependencies: - msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@4.1.9': - resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} - - '@vitest/runner@4.1.9': - resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} - - '@vitest/snapshot@4.1.9': - resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} - - '@vitest/spy@4.1.9': - resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} - - '@vitest/utils@4.1.9': - resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} - '@volar/language-core@2.4.15': resolution: {integrity: sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==} @@ -2070,10 +2015,6 @@ packages: asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - async-function@1.0.0: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} @@ -2180,10 +2121,6 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - cacache@16.1.3: resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -2215,10 +2152,6 @@ packages: caniuse-lite@1.0.30001793: resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} - chai@6.2.2: - resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} - engines: {node: '>=18'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2334,10 +2267,6 @@ packages: engines: {node: ^14.13.0 || >=16.0.0} hasBin: true - consola@3.4.2: - resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} - engines: {node: ^14.18.0 || >=16.10.0} - convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -2437,14 +2366,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decode-bmp@0.2.1: - resolution: {integrity: sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==} - engines: {node: '>=8.6.0'} - - decode-ico@0.4.1: - resolution: {integrity: sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==} - engines: {node: '>=8.6'} - decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -2662,9 +2583,6 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2688,10 +2606,6 @@ packages: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} engines: {node: '>=6'} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} - engines: {node: '>=12.0.0'} - exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} @@ -2976,9 +2890,6 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - ico-endec@0.1.6: - resolution: {integrity: sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -3652,10 +3563,6 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - obug@2.1.3: - resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} - engines: {node: '>=12.20.0'} - ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} @@ -3786,9 +3693,6 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pe-library@1.0.1: resolution: {integrity: sha512-nh39Mo1eGWmZS7y+mK/dQIqg7S1lp38DpRxkyoHf0ZcUs/HDc+yyTjuOtTvSMZHmfSLuSQaX945u05Y2Q6UWZg==} engines: {node: '>=14', npm: '>=7'} @@ -3896,9 +3800,6 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - quansync@1.0.0: - resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4119,9 +4020,6 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - sharp-ico@0.1.5: - resolution: {integrity: sha512-a3jODQl82NPp1d5OYb0wY+oFaPk7AvyxipIowCHk7pBsZCWgbe0yAkU2OOXdoH0ENyANhyOQbs9xkAiRHcF02Q==} - sharp@0.33.5: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -4162,9 +4060,6 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -4245,12 +4140,6 @@ packages: resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -4418,21 +4307,10 @@ packages: tiny-each-async@2.0.3: resolution: {integrity: sha512-5ROII7nElnAirvFn8g7H7MtpfV1daMcyfTGQwsn/x2VtyV+VPiO5CjReCJtWLvoKTDEDmZocf3cNPraiMnBXLA==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@1.2.4: - resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} - engines: {node: '>=18'} - tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} - engines: {node: '>=14.0.0'} - tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -4444,9 +4322,6 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} - to-data-view@1.1.0: - resolution: {integrity: sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4522,12 +4397,6 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - unconfig-core@7.5.0: - resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} - - unconfig@7.5.0: - resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -4667,47 +4536,6 @@ packages: yaml: optional: true - vitest@4.1.9: - resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.9 - '@vitest/browser-preview': 4.1.9 - '@vitest/browser-webdriverio': 4.1.9 - '@vitest/coverage-istanbul': 4.1.9 - '@vitest/coverage-v8': 4.1.9 - '@vitest/ui': 4.1.9 - happy-dom: '*' - jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/coverage-istanbul': - optional: true - '@vitest/coverage-v8': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} @@ -4828,11 +4656,6 @@ packages: engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} - hasBin: true - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -5633,8 +5456,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@canvas/image-data@1.1.0': {} - '@electron-forge/cli@7.11.2(encoding@0.1.13)(lightningcss@1.32.0)': dependencies: '@electron-forge/core': 7.11.2(encoding@0.1.13)(lightningcss@1.32.0) @@ -6413,10 +6234,6 @@ snapshots: '@polka/url@1.0.0-next.29': {} - '@quansync/fs@1.0.0': - dependencies: - quansync: 1.0.0 - '@rollup/plugin-babel@6.1.0(@babel/core@7.29.0)(rollup@4.60.4)': dependencies: '@babel/core': 7.29.0 @@ -6552,8 +6369,6 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@standard-schema/spec@1.1.0': {} - '@swc/helpers@0.5.21': dependencies: tslib: 2.8.1 @@ -6670,13 +6485,6 @@ snapshots: '@types/node': 22.19.19 '@types/responselike': 1.0.3 - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 - - '@types/deep-eql@4.0.2': {} - '@types/estree@1.0.8': {} '@types/estree@1.0.9': {} @@ -6751,61 +6559,11 @@ snapshots: transitivePeerDependencies: - vue - '@vite-pwa/assets-generator@1.0.2': - dependencies: - cac: 6.7.14 - colorette: 2.0.20 - consola: 3.4.2 - sharp: 0.33.5 - sharp-ico: 0.1.5 - unconfig: 7.5.0 - '@vitejs/plugin-vue@5.2.4(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0))(vue@3.5.34(typescript@5.6.3))': dependencies: vite: 6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0) vue: 3.5.34(typescript@5.6.3) - '@vitest/expect@4.1.9': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - chai: 6.2.2 - tinyrainbow: 3.1.0 - - '@vitest/mocker@4.1.9(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0))': - dependencies: - '@vitest/spy': 4.1.9 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0) - - '@vitest/pretty-format@4.1.9': - dependencies: - tinyrainbow: 3.1.0 - - '@vitest/runner@4.1.9': - dependencies: - '@vitest/utils': 4.1.9 - pathe: 2.0.3 - - '@vitest/snapshot@4.1.9': - dependencies: - '@vitest/pretty-format': 4.1.9 - '@vitest/utils': 4.1.9 - magic-string: 0.30.21 - pathe: 2.0.3 - - '@vitest/spy@4.1.9': {} - - '@vitest/utils@4.1.9': - dependencies: - '@vitest/pretty-format': 4.1.9 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 - '@volar/language-core@2.4.15': dependencies: '@volar/source-map': 2.4.15 @@ -7167,8 +6925,6 @@ snapshots: minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 - assertion-error@2.0.1: {} - async-function@1.0.0: {} async@3.2.6: {} @@ -7274,8 +7030,6 @@ snapshots: dependencies: run-applescript: 7.1.0 - cac@6.7.14: {} - cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 @@ -7332,8 +7086,6 @@ snapshots: caniuse-lite@1.0.30001793: {} - chai@6.2.2: {} - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -7441,8 +7193,6 @@ snapshots: tree-kill: 1.2.2 yargs: 17.7.2 - consola@3.4.2: {} - convert-source-map@2.0.0: {} copy-anything@4.0.5: @@ -7537,17 +7287,6 @@ snapshots: decamelize@1.2.0: {} - decode-bmp@0.2.1: - dependencies: - '@canvas/image-data': 1.1.0 - to-data-view: 1.1.0 - - decode-ico@0.4.1: - dependencies: - '@canvas/image-data': 1.1.0 - decode-bmp: 0.2.1 - to-data-view: 1.1.0 - decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -7870,10 +7609,6 @@ snapshots: estree-walker@2.0.2: {} - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.9 - esutils@2.0.3: {} eta@3.5.0: {} @@ -7894,8 +7629,6 @@ snapshots: signal-exit: 3.0.7 strip-eof: 1.0.0 - expect-type@1.3.0: {} - exponential-backoff@3.1.3: {} external-editor@3.1.0: @@ -8240,8 +7973,6 @@ snapshots: dependencies: ms: 2.1.3 - ico-endec@0.1.6: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -8837,8 +8568,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - obug@2.1.3: {} - ohash@2.0.11: {} once@1.4.0: @@ -8957,8 +8686,6 @@ snapshots: pathe@1.1.2: {} - pathe@2.0.3: {} - pe-library@1.0.1: {} pend@1.2.0: {} @@ -9042,8 +8769,6 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - quansync@1.0.0: {} - queue-microtask@1.2.3: {} quick-lru@5.1.1: {} @@ -9333,12 +9058,6 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.2 - sharp-ico@0.1.5: - dependencies: - decode-ico: 0.4.1 - ico-endec: 0.1.6 - sharp: 0.33.5 - sharp@0.33.5: dependencies: color: 4.2.3 @@ -9407,8 +9126,6 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} - signal-exit@3.0.7: {} signal-exit@4.1.0: {} @@ -9485,10 +9202,6 @@ snapshots: dependencies: minipass: 3.3.6 - stackback@0.0.2: {} - - std-env@4.1.0: {} - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -9657,17 +9370,11 @@ snapshots: tiny-each-async@2.0.3: optional: true - tinybench@2.9.0: {} - - tinyexec@1.2.4: {} - tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinyrainbow@3.1.0: {} - tmp-promise@3.0.3: dependencies: tmp: 0.2.5 @@ -9680,8 +9387,6 @@ snapshots: tmp@0.2.5: optional: true - to-data-view@1.1.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -9757,19 +9462,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - unconfig-core@7.5.0: - dependencies: - '@quansync/fs': 1.0.0 - quansync: 1.0.0 - - unconfig@7.5.0: - dependencies: - '@quansync/fs': 1.0.0 - defu: 6.1.7 - jiti: 2.7.0 - quansync: 1.0.0 - unconfig-core: 7.5.0 - undici-types@6.21.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -9851,7 +9543,7 @@ snapshots: - rollup - supports-color - vite-plugin-pwa@0.21.2(@vite-pwa/assets-generator@1.0.2)(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0))(workbox-build@7.4.1)(workbox-window@7.4.1): + vite-plugin-pwa@0.21.2(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0))(workbox-build@7.4.1)(workbox-window@7.4.1): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 @@ -9859,8 +9551,6 @@ snapshots: vite: 6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0) workbox-build: 7.4.1 workbox-window: 7.4.1 - optionalDependencies: - '@vite-pwa/assets-generator': 1.0.2 transitivePeerDependencies: - supports-color @@ -9879,33 +9569,6 @@ snapshots: lightningcss: 1.32.0 terser: 5.48.0 - vitest@4.1.9(@types/node@22.19.19)(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)): - dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 - es-module-lexer: 2.1.0 - expect-type: 1.3.0 - magic-string: 0.30.21 - obug: 2.1.3 - pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 - tinybench: 2.9.0 - tinyexec: 1.2.4 - tinyglobby: 0.2.16 - tinyrainbow: 3.1.0 - vite: 6.4.2(@types/node@22.19.19)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.48.0) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.19.19 - transitivePeerDependencies: - - msw - vscode-uri@3.1.0: {} vue-demi@0.14.10(vue@3.5.34(typescript@5.6.3)): @@ -10068,11 +9731,6 @@ snapshots: dependencies: isexe: 2.0.0 - why-is-node-running@2.3.0: - dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 - word-wrap@1.2.5: optional: true diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..1f8c550 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..9fef45b Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/icon-192.png b/public/icon-192.png new file mode 100644 index 0000000..e77168a Binary files /dev/null and b/public/icon-192.png differ diff --git a/public/icon-512.png b/public/icon-512.png new file mode 100644 index 0000000..550b306 Binary files /dev/null and b/public/icon-512.png differ diff --git a/public/icon-maskable-192.png b/public/icon-maskable-192.png new file mode 100644 index 0000000..0f2053d Binary files /dev/null and b/public/icon-maskable-192.png differ diff --git a/public/icon-maskable-512.png b/public/icon-maskable-512.png new file mode 100644 index 0000000..0926f7a Binary files /dev/null and b/public/icon-maskable-512.png differ diff --git a/public/mask-icon.svg b/public/mask-icon.svg new file mode 100644 index 0000000..6bcfe91 --- /dev/null +++ b/public/mask-icon.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/pwa-assets.config.ts b/pwa-assets.config.ts deleted file mode 100644 index 93fee71..0000000 --- a/pwa-assets.config.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { defineConfig } from '@vite-pwa/assets-generator/config' -import { copyFileSync, existsSync, mkdirSync } from 'node:fs' -import { join, resolve } from 'node:path' - -const BRAND_DIR = process.env.BRAND_DIR ?? './branding/default' -const BRAND_APP = process.env.BRAND_APP ?? '' - -const candidates: string[] = [] -if (BRAND_APP) { - candidates.push( - join(BRAND_DIR, 'icons', BRAND_APP, 'logo.svg'), - join(BRAND_DIR, 'icons', BRAND_APP, 'logo.png'), - ) -} -candidates.push( - join(BRAND_DIR, 'logo.svg'), - join(BRAND_DIR, 'logo.png'), -) - -const source = candidates.find((p) => existsSync(p)) -if (!source) { - throw new Error( - `No brand logo found. Tried:\n ${candidates.join('\n ')}\n` + - `See branding/README.md for the brand kit contract.`, - ) -} - -// The CLI emits next to the source. Stage into public/icons/ so generated -// PNGs are served at /icons/.png and a single .gitignore line covers -// the whole tree. -const stagingDir = resolve('public/icons') -mkdirSync(stagingDir, { recursive: true }) -const sourceExt = source.toLowerCase().endsWith('.svg') ? '.svg' : '.png' -const stagedSource = join(stagingDir, `.brand-source${sourceExt}`) -copyFileSync(source, stagedSource) - -export default defineConfig({ - headLinkOptions: { preset: '2023' }, - preset: { - transparent: { - sizes: [192, 512], - favicons: [[48, 'favicon.ico']], - }, - maskable: { sizes: [192, 512] }, - apple: { sizes: [180] }, - assetName: (type, size) => { - if (type === 'transparent') return `icon-${size.width}.png` - if (type === 'maskable') return `icon-maskable-${size.width}.png` - if (type === 'apple') return 'apple-touch-icon.png' - throw new Error(`Unknown asset type: ${type}`) - }, - }, - images: [stagedSource], -}) diff --git a/restaurant.html b/restaurant.html index 950aa6d..e910921 100644 --- a/restaurant.html +++ b/restaurant.html @@ -6,8 +6,9 @@ - - + + + Restaurant — Order diff --git a/scripts/generate-pwa-assets.mjs b/scripts/generate-pwa-assets.mjs deleted file mode 100644 index e6cfa01..0000000 --- a/scripts/generate-pwa-assets.mjs +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env node -// Wraps pwa-assets-generator and removes the staged brand source after -// generation. pwa-assets.config.ts copies $BRAND_DIR/logo.{svg,png} -// into public/icons/.brand-source.* because the CLI emits next to the -// source. Without this cleanup the full-resolution source ships in -// dist/icons/ and is publicly served. -import { spawnSync } from 'node:child_process' -import { existsSync, rmSync } from 'node:fs' -import { resolve } from 'node:path' - -const cli = resolve('node_modules/.bin/pwa-assets-generator') -const { status } = spawnSync(cli, process.argv.slice(2), { stdio: 'inherit' }) -if (status !== 0) process.exit(status ?? 1) - -const stagingDir = resolve('public/icons') -for (const ext of ['svg', 'png']) { - const staged = resolve(stagingDir, `.brand-source.${ext}`) - if (existsSync(staged)) rmSync(staged) -} diff --git a/src/accounting-app/views/AddIncome.vue b/src/accounting-app/views/AddIncome.vue index e4b5954..a0dabf2 100644 --- a/src/accounting-app/views/AddIncome.vue +++ b/src/accounting-app/views/AddIncome.vue @@ -78,12 +78,8 @@
-

- {{ t('libra.income.selectAccount') }} - - - {{ t('libra.income.otherAccountHint') }} - +

+ {{ t('libra.income.selectAccount') }}

Description *