From 7db9005645e5eb14fe021bdfb7d117338daad435 Mon Sep 17 00:00:00 2001 From: Lucas Berger Date: Thu, 18 Jun 2026 12:12:17 -0400 Subject: [PATCH 1/4] feat(17-02): install @vite-pwa/assets-generator, author logo.svg, add pwa-assets.config.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add @vite-pwa/assets-generator@1.0.2 as devDependency in apps/pwa - Add pwa:icons script (pwa-assets-generator generate) to apps/pwa/package.json - Approve sharp build scripts in pnpm-workspace.yaml (required for @vite-pwa/assets-generator) - Hand-author apps/pwa/public/logo.svg: warm/rounded/at-home family scene with house, two adults, child, heart — square 512x512 viewBox, self-contained, text-free - Create apps/pwa/pwa-assets.config.ts with minimal2023Preset, images: ['public/logo.svg'], no overrideManifestIcons --- apps/pwa/package.json | 6 +- apps/pwa/public/logo.svg | 51 ++++ apps/pwa/pwa-assets.config.ts | 10 + pnpm-lock.yaml | 471 ++++++++++++++++++++++++++++++---- pnpm-workspace.yaml | 1 + 5 files changed, 489 insertions(+), 50 deletions(-) create mode 100644 apps/pwa/public/logo.svg create mode 100644 apps/pwa/pwa-assets.config.ts diff --git a/apps/pwa/package.json b/apps/pwa/package.json index ab7d456..ebfee66 100644 --- a/apps/pwa/package.json +++ b/apps/pwa/package.json @@ -12,7 +12,8 @@ "test": "vitest run", "test:e2e": "playwright test", "test:e2e:ui": "playwright test --ui", - "test:e2e:headed": "playwright test --headed" + "test:e2e:headed": "playwright test --headed", + "pwa:icons": "pwa-assets-generator generate" }, "dependencies": { "@dnd-kit/core": "^6.3.1", @@ -36,14 +37,15 @@ }, "devDependencies": { "@playwright/test": "1.60.0", - "mysql2": "3.22.4", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@types/node": "^22.19.19", "@types/react": "^19.0.0", "@types/react-dom": "^19.0.0", + "@vite-pwa/assets-generator": "1.0.2", "@vitejs/plugin-react": "^4.3.0", "jsdom": "^26.1.0", + "mysql2": "3.22.4", "typescript": "^5.5.0", "vite": "8.0.16", "vitest": "^4.1.8", diff --git a/apps/pwa/public/logo.svg b/apps/pwa/public/logo.svg new file mode 100644 index 0000000..42fd268 --- /dev/null +++ b/apps/pwa/public/logo.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/pwa/pwa-assets.config.ts b/apps/pwa/pwa-assets.config.ts new file mode 100644 index 0000000..3c61953 --- /dev/null +++ b/apps/pwa/pwa-assets.config.ts @@ -0,0 +1,10 @@ +import { defineConfig, minimal2023Preset } from '@vite-pwa/assets-generator/config' + +export default defineConfig({ + preset: { + ...minimal2023Preset, + }, + images: ['public/logo.svg'], + // Do NOT set overrideManifestIcons: true — the manifest is maintained by hand + // in vite.config.ts (plan 17-04); auto-override would stomp the explicit entries. +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10fdcc8..9cf3080 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,16 +13,16 @@ importers: version: 9.39.4 eslint: specifier: 9.39.4 - version: 9.39.4 + version: 9.39.4(jiti@2.7.0) eslint-config-prettier: specifier: 10.1.8 - version: 10.1.8(eslint@9.39.4) + version: 10.1.8(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react: specifier: 7.37.5 - version: 7.37.5(eslint@9.39.4) + version: 7.37.5(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-react-hooks: specifier: 7.1.1 - version: 7.1.1(eslint@9.39.4) + version: 7.1.1(eslint@9.39.4(jiti@2.7.0)) eslint-plugin-security: specifier: 3.0.1 version: 3.0.1 @@ -34,7 +34,7 @@ importers: version: 3.8.4 typescript-eslint: specifier: 8.61.0 - version: 8.61.0(eslint@9.39.4)(typescript@5.9.3) + version: 8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) apps/api: dependencies: @@ -92,7 +92,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.8 - version: 4.1.8(@types/node@22.19.19)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4)) + version: 4.1.8(@types/node@22.19.19)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)) apps/pwa: dependencies: @@ -146,7 +146,7 @@ importers: version: 0.3.2 vite-plugin-pwa: specifier: ^1.3.0 - version: 1.3.0(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4))(workbox-build@7.4.1(@types/babel__core@7.20.5))(workbox-window@7.4.1) + version: 1.3.0(@vite-pwa/assets-generator@1.0.2)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4))(workbox-build@7.4.1(@types/babel__core@7.20.5))(workbox-window@7.4.1) zustand: specifier: 5.0.14 version: 5.0.14(@types/react@19.2.16)(react@19.2.7) @@ -169,9 +169,12 @@ importers: '@types/react-dom': specifier: ^19.0.0 version: 19.2.3(@types/react@19.2.16) + '@vite-pwa/assets-generator': + specifier: 1.0.2 + version: 1.0.2 '@vitejs/plugin-react': specifier: ^4.3.0 - version: 4.7.0(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4)) + version: 4.7.0(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -183,10 +186,10 @@ importers: version: 5.9.3 vite: specifier: 8.0.16 - version: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4) + version: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) vitest: specifier: ^4.1.8 - version: 4.1.8(@types/node@22.19.19)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4)) + version: 4.1.8(@types/node@22.19.19)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)) workbox-core: specifier: ^7.4.1 version: 7.4.1 @@ -724,6 +727,9 @@ packages: resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} + '@canvas/image-data@1.1.0': + resolution: {integrity: sha512-QdObRRjRbcXGmM1tmJ+MrHcaz1MftF2+W7YI+MsphnsCrmtyfS0d5qJbk0MeSbUeyM/jCb0hmnkXPsy026L7dA==} + '@csstools/color-helpers@5.1.0': resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} @@ -1314,6 +1320,123 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@9.0.0': resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} engines: {node: '>=18'} @@ -1371,6 +1494,9 @@ packages: peerDependencies: preact: '>= 10.25.0 || >=11.0.0-0' + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + '@rolldown/binding-android-arm64@1.0.3': resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1851,6 +1977,11 @@ packages: resolution: {integrity: sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vite-pwa/assets-generator@1.0.2': + resolution: {integrity: sha512-MCbrb508JZHqe7bUibmZj/lyojdhLRnfkmyXnkrCM2zVrjTgL89U8UEfInpKTvPeTnxsw2hmyZxnhsdNR6yhwg==} + engines: {node: '>=16.14.0'} + hasBin: true + '@vitejs/plugin-react@4.7.0': resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -2044,6 +2175,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2087,6 +2222,16 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -2101,6 +2246,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + 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==} @@ -2157,6 +2306,14 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} + 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'} + decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} @@ -2175,6 +2332,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + denque@2.1.0: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} @@ -2667,6 +2827,9 @@ packages: ical.js@2.2.1: resolution: {integrity: sha512-yK/UlPbEs316igb/tjRgbFA8ZV75rCsBJp/hWOatpyaPNlgw0dGDmU+FoicOcwX4xXkeXOkYiOmCqNPFpNPkQg==} + ico-endec@0.1.6: + resolution: {integrity: sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ==} + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -2715,6 +2878,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -2861,6 +3027,10 @@ packages: engines: {node: '>=10'} hasBin: true + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -3375,6 +3545,9 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3542,6 +3715,13 @@ 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} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3573,6 +3753,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} @@ -3710,6 +3893,9 @@ packages: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true + 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'} @@ -3786,6 +3972,12 @@ 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==} @@ -4785,6 +4977,8 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 + '@canvas/image-data@1.1.0': {} + '@csstools/color-helpers@5.1.0': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -5080,9 +5274,9 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.7.0))': dependencies: - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -5156,6 +5350,81 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@img/sharp-darwin-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + optional: true + + '@img/sharp-darwin-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.0.5': + optional: true + + '@img/sharp-libvips-linux-s390x@1.0.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + optional: true + + '@img/sharp-linux-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + optional: true + + '@img/sharp-linux-arm@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + optional: true + + '@img/sharp-linux-s390x@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + optional: true + + '@img/sharp-linux-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.33.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + optional: true + + '@img/sharp-wasm32@0.33.5': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-ia32@0.33.5': + optional: true + + '@img/sharp-win32-x64@0.33.5': + optional: true + '@isaacs/cliui@9.0.0': {} '@jridgewell/gen-mapping@0.3.13': @@ -5214,6 +5483,10 @@ snapshots: '@preact/signals-core': 1.14.2 preact: 10.29.2 + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + '@rolldown/binding-android-arm64@1.0.3': optional: true @@ -5526,15 +5799,15 @@ snapshots: dependencies: '@types/node': 22.19.19 - '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.61.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/parser': 8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/type-utils': 8.61.0(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.61.0 - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.7.0) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) @@ -5542,14 +5815,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.61.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.61.0 '@typescript-eslint/types': 8.61.0 '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.61.0 debug: 4.4.3 - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5572,13 +5845,13 @@ snapshots: dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.61.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.61.0 '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -5601,13 +5874,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.61.0(eslint@9.39.4)(typescript@5.9.3)': + '@typescript-eslint/utils@8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.61.0 '@typescript-eslint/types': 8.61.0 '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -5617,7 +5890,16 @@ snapshots: '@typescript-eslint/types': 8.61.0 eslint-visitor-keys: 5.0.1 - '@vitejs/plugin-react@4.7.0(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4))': + '@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-react@4.7.0(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4))': dependencies: '@babel/core': 7.29.7 '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) @@ -5625,7 +5907,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4) + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) transitivePeerDependencies: - supports-color @@ -5638,13 +5920,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.8(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4))': + '@vitest/mocker@4.1.8(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4))': dependencies: '@vitest/spy': 4.1.8 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4) + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) '@vitest/pretty-format@4.1.8': dependencies: @@ -5851,6 +6133,8 @@ snapshots: buffer-from@1.1.2: {} + cac@6.7.14: {} + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -5891,6 +6175,18 @@ snapshots: color-name@1.1.4: {} + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.4 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + colorette@2.0.20: {} + commander@2.20.3: {} commander@8.3.0: {} @@ -5899,6 +6195,8 @@ snapshots: concat-map@0.0.1: {} + consola@3.4.2: {} + convert-source-map@2.0.0: {} cookie@1.1.1: {} @@ -5953,6 +6251,17 @@ snapshots: decimal.js@10.6.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 + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 @@ -5973,6 +6282,8 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + defu@6.1.7: {} + denque@2.1.0: {} dequal@2.0.3: {} @@ -6212,22 +6523,22 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.4): + eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.7.0)): dependencies: - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.7.0) - eslint-plugin-react-hooks@7.1.1(eslint@9.39.4): + eslint-plugin-react-hooks@7.1.1(eslint@9.39.4(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 '@babel/parser': 7.29.7 - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.7.0) hermes-parser: 0.25.1 zod: 3.25.76 zod-validation-error: 4.0.2(zod@3.25.76) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.4): + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -6235,7 +6546,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.3 - eslint: 9.39.4 + eslint: 9.39.4(jiti@2.7.0) estraverse: 5.3.0 hasown: 2.0.4 jsx-ast-utils: 3.3.5 @@ -6264,9 +6575,9 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4: + eslint@9.39.4(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 @@ -6300,6 +6611,8 @@ snapshots: minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -6545,6 +6858,8 @@ snapshots: ical.js@2.2.1: {} + ico-endec@0.1.6: {} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -6589,6 +6904,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.3.4: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -6732,6 +7049,8 @@ snapshots: filelist: 1.0.6 picocolors: 1.1.1 + jiti@2.7.0: {} + js-tokens@4.0.0: {} js-yaml@4.1.1: @@ -7336,6 +7655,8 @@ snapshots: punycode@2.3.1: {} + quansync@1.0.0: {} + queue-microtask@1.2.3: {} react-dom@19.2.7(react@19.2.7): @@ -7554,6 +7875,38 @@ 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 + detect-libc: 2.1.2 + semver: 7.8.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -7592,6 +7945,10 @@ snapshots: signal-exit@4.1.0: {} + simple-swizzle@0.2.4: + dependencies: + is-arrayish: 0.3.4 + slash@5.1.0: {} smob@1.6.2: {} @@ -7736,6 +8093,8 @@ snapshots: dependencies: tldts-core: 6.1.86 + to-data-view@1.1.0: {} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -7811,13 +8170,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.61.0(eslint@9.39.4)(typescript@5.9.3): + typescript-eslint@8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4)(typescript@5.9.3))(eslint@9.39.4)(typescript@5.9.3) - '@typescript-eslint/parser': 8.61.0(eslint@9.39.4)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3))(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/typescript-estree': 8.61.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.61.0(eslint@9.39.4)(typescript@5.9.3) - eslint: 9.39.4 + '@typescript-eslint/utils': 8.61.0(eslint@9.39.4(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7833,6 +8192,19 @@ 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: {} @@ -7866,18 +8238,20 @@ snapshots: dependencies: punycode: 2.3.1 - vite-plugin-pwa@1.3.0(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4))(workbox-build@7.4.1(@types/babel__core@7.20.5))(workbox-window@7.4.1): + vite-plugin-pwa@1.3.0(@vite-pwa/assets-generator@1.0.2)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4))(workbox-build@7.4.1(@types/babel__core@7.20.5))(workbox-window@7.4.1): dependencies: debug: 4.4.3 pretty-bytes: 6.1.1 tinyglobby: 0.2.17 - vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4) + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) workbox-build: 7.4.1(@types/babel__core@7.20.5) workbox-window: 7.4.1 + optionalDependencies: + '@vite-pwa/assets-generator': 1.0.2 transitivePeerDependencies: - supports-color - vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4): + vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -7888,13 +8262,14 @@ snapshots: '@types/node': 22.19.19 esbuild: 0.28.0 fsevents: 2.3.3 + jiti: 2.7.0 terser: 5.48.0 tsx: 4.22.4 - vitest@4.1.8(@types/node@22.19.19)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4)): + vitest@4.1.8(@types/node@22.19.19)(jsdom@26.1.0)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)): dependencies: '@vitest/expect': 4.1.8 - '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4)) + '@vitest/mocker': 4.1.8(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4)) '@vitest/pretty-format': 4.1.8 '@vitest/runner': 4.1.8 '@vitest/snapshot': 4.1.8 @@ -7911,7 +8286,7 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(terser@5.48.0)(tsx@4.22.4) + vite: 8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.4) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.19.19 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3818362..aacd855 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,3 +3,4 @@ packages: allowBuilds: esbuild: true + sharp: true From b36457328565202caf7c722e61335456052f8df4 Mon Sep 17 00:00:00 2001 From: Lucas Berger Date: Thu, 18 Jun 2026 12:13:50 -0400 Subject: [PATCH 2/4] feat(17-02): generate full icon/favicon set from logo.svg (Task 2) - Run @vite-pwa/assets-generator minimal2023Preset against public/logo.svg - Produce: favicon.ico (861 B, non-trivial), favicon.svg, icon-192.png (1617 B), icon-512.png (4221 B), icon-maskable-512.png (3353 B, 512x512 distinct maskable with safe-zone padding), apple-touch-icon.png (1110 B, 180x180) - Replace 3 placeholder stubs with real generated assets - Update pwa:icons script to include post-generation canonical rename step - Add generator intermediate output filenames to .gitignore --- .gitignore | 7 ++++ apps/pwa/package.json | 2 +- apps/pwa/public/apple-touch-icon.png | Bin 617 -> 1110 bytes apps/pwa/public/favicon.ico | Bin 0 -> 861 bytes apps/pwa/public/favicon.svg | 51 ++++++++++++++++++++++++++ apps/pwa/public/icon-192.png | Bin 699 -> 1617 bytes apps/pwa/public/icon-512.png | Bin 4086 -> 4221 bytes apps/pwa/public/icon-maskable-512.png | Bin 0 -> 3353 bytes 8 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 apps/pwa/public/favicon.ico create mode 100644 apps/pwa/public/favicon.svg create mode 100644 apps/pwa/public/icon-maskable-512.png diff --git a/.gitignore b/.gitignore index ff8d6ae..c739848 100644 --- a/.gitignore +++ b/.gitignore @@ -63,6 +63,13 @@ apps/pwa/test-results/ apps/pwa/playwright-report/ apps/pwa/blob-report/ +# PWA icon generator intermediate output (pwa:icons renames these to canonical names) +apps/pwa/public/pwa-64x64.png +apps/pwa/public/pwa-192x192.png +apps/pwa/public/pwa-512x512.png +apps/pwa/public/maskable-icon-512x512.png +apps/pwa/public/apple-touch-icon-180x180.png + # MemPalace per-project files (issue #185) mempalace.yaml entities.json diff --git a/apps/pwa/package.json b/apps/pwa/package.json index ebfee66..d012e6a 100644 --- a/apps/pwa/package.json +++ b/apps/pwa/package.json @@ -13,7 +13,7 @@ "test:e2e": "playwright test", "test:e2e:ui": "playwright test --ui", "test:e2e:headed": "playwright test --headed", - "pwa:icons": "pwa-assets-generator generate" + "pwa:icons": "pwa-assets-generator --config pwa-assets.config.ts && cp public/pwa-192x192.png public/icon-192.png && cp public/pwa-512x512.png public/icon-512.png && cp public/maskable-icon-512x512.png public/icon-maskable-512.png && cp public/apple-touch-icon-180x180.png public/apple-touch-icon.png && cp public/logo.svg public/favicon.svg" }, "dependencies": { "@dnd-kit/core": "^6.3.1", diff --git a/apps/pwa/public/apple-touch-icon.png b/apps/pwa/public/apple-touch-icon.png index 69ebb44546a0ab9d79d304b6e2f25a11eb43c15f..832b77a8b25bf8f894ebe5fcc60193fe144e943b 100644 GIT binary patch delta 1100 zcmV-S1hf0;1l9Y;Myv5l|D+@ESokT`(p00009a7bBm000B%000B% z0kwNlYXATP#z{m$RCwC$+;Mw?AP@%dE5txT?E8P&p-mv?6n|NGuuwYm`9#G~&Kt?%7v-!{5vb1*twr8isOo6)nmXPldv-Ps4*VRNk? z#y;rxTHkxonvF4xX(2|7F}<-2uEb{4b6Yd*oDkZ+f*D^(pF6pT3GEVrb`krRB@()R zbSQysG%WTH4-Ncc!^WG-OIb~4W5VLY#cew6AAcTNc*!NGG@pAnUqw&*hltjzXfvbD zDjJZ{d=;(xr@4n!w8BN}X{vZm7&<^t^9Wl$H$FSw4jL8BCN5jHJhjpWHFuj111h>@ zet58L^x%ibaK%LH5N!^iH6mJt=r-(me&(Bx!)u5h5YhIEA3vsBy@l4-K`F(Vy-`Hlv=2|*Oz%(KoER1w6YU0w z>v!D}-7UM`Ah6NTS~K6HyWkvI^MV$78h;_*o1&uakJsTJ;+;RU*DTPZ+kY1>`ZZm% zNcYPr1ws>=(1hMV+rCF=8XkluG@%Lok!Z6-o1)O`YMA~T=VKtrjPZdp$oa`&LKFIv z&;rveJ_-F{Yaw8wt6VCh&XrU|k%j(`3+>doq*0ZNN8zY%AGsh}l}pdnxyWCg%S9=k zdNkfXe2LI=iY;i_+lm($zR~*AgeEkh2~B816PnP3CN!Z5O=vK>g97d?J= z_Ijhn0f_ zY^yvkCnGCopXJ!HeRO!RqFATrC%v!yA-Am8Z(B`PYg#4er;oVjz6_YV6ENp2@Ekv6 zE;p&bbA0NXxjXOzPniJtjr$Z0O&bnp0Ws$c-ckW*)GHY6P-9l$aVh|fe2vYAGK4e} zQOwsdY{Il~n&dV?6oAn=85ZUvh|LxHU#$WB zVV{hu=4A++Q%eAU*yn%0yh=1Lgmc)*LA?Oj$w4ObMMGGH01SR)Hm-`)rKg0OV!zp&I2}X7d3gERzq0*wkNUwE^U1^4HoDKU!TRp{#4T`+kA9-#sUxoM)NU z0#KJpbSg^+0_QJ1c^nf4LU)DA4lp{Wm`CW~2pAlX+aE}%N1cw)u05Fn(O&K&OE~4r zf$;_B;~_1dvS5JUdYMFFqO|Au&GChSBnAMCTSD72x=o*f?tcKcAOO7DPBDRJTik()8#y7= z(dI-N0MqkP>dW1-7054lo3uL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/pwa/public/icon-192.png b/apps/pwa/public/icon-192.png index ce6e1c8e93606dc067908039d2c59c05a56d4517..cb3e1972c0f0ee9b5feb23e36c505264287f5e50 100644 GIT binary patch delta 1611 zcmV-R2DJIR1F$^X&ij?EmxZ|MTqj z>gE0O?EmxZ=#g5y8raT@?3gLklF69f!CXHT|qPRzpD3WJ##5 zvW~d4hX4Qo3UpFVQvfah{~KFK@~wW>MRYp=000SaNLh0L0DlAM000B%0kwNlYXATR zmPtfGRCwC$oo$<{AP|NtY(b*ZMs5H9FFk6u3HXKrG98{TwR^3*&+Rb7AXm%b5ET{m z)k@AOqm+^zL@8tGIoaa=hwb8A;b1@O+#k~b+;BCbwJVBz7@SUF4qOAD}Woo&3_d@>NbZvfVT>_S?mA+WB_mr z;Gzf>jsqZ-Ar}C&aO+yHUPyx=NT@5jC1z{4gm)IJ0NfdP?yhPQ5*n*k4j(wnDB3zzzqQKNkQlUGybin zvI~HWbANvX4gePTw@6?eV6=QXDyOyq1Yax>B7lK^O9XZSfEx)y12FV&C6#RgWSsja zun4fizXbwo0E^3~<#K8ZK=9QPApmUfzmdQW0PszMy#Y4*-;~NW05Z<^Bd`Eq!T$z= z%>b**r=@bb6+m!n5_!z|}JVwGBW$1E3#5 zWcU^?72O@+H0)q`86AwDPXHpWFJ;~9kbldz%w|Ju%EjG}_yl-c`17E-gwH$&8k=%) zhwl}D%m6^Y(SR8M5+H!oEaeCRL?1u|2q0#2Apf*_b2&i$1CU|{fVACS)B6q7SQVi3 zUxkXIYa4m@dL3*y`<+gIB2zB@ExiNW)Ch>lZb1c5BXIW(AT)r&Bm$)d;JcYCbbkOc z(e5aX643$5{Q>AiyQ9MG4{*}~U?K_B5u^j${Q{8sgBh|1af9)WQ>~)qT>-e?@5C!W z`$@^7ulh?h0{pdH7r?a$-0x+p-`7j+zs+LL0E$$A`cY3ki`8>k{i*|K3JyU22nq%O zB?qK^Ob88t%mYXpf!RC&@m)qWDSyL6e%PtZ0|NlwCo)ZPtt2u4nFH`Wk%10yS`Kj9 zAArskp=p3}Fo*rF2UGy{!PZm`=wrzLdO%DCpn2}DY-r>eOof2@UlSLj0U)`y<tp+{x~oE2dbez(hkk3l;bB;Vn5aq|G}F0 zk2XbrxGetTeeoZ#jQ@yh{D+L=Kjyuzroqk!EIBMw8e|Y?dRVLwgG8|S_IKTNU%q;0$`x*=deM^Ic1FQ!a*rx={Y$>MMZtJ{sHr+DO8bXHhusA002ov JPDHLkV1k*U;==#{ literal 699 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 literal 4086 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&t&wwUqN(1_u7Uo-U3d6?5KRWz1x85MVxV zJ-l>lxar#Vr(Oy(4Ve0#df3I^w`bt_btIm_p@oq_B9(!`O_HG@kc}Z>$|#pkq4DCQ z_NV`y|BK~}7;G<{RS+I!j)nuFL{Q-KC(qzC!xs>FVdQ&MBb@08>am A9smFU diff --git a/apps/pwa/public/icon-maskable-512.png b/apps/pwa/public/icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..15ac59c3baccd6f10353e9ab651275aadb4ed0c4 GIT binary patch literal 3353 zcmd5}MlXLQ8e$1JZA5(SSt^2-vZ&kgz zb?es4jF~*%QQl1sz;QzKxM=__vNY@%vAJ>7uS{%u#(Xp*Qh3v36N~Bfv(M&ympai} zamn_k_|5#}$-5sch!|=-`RS_5-rYrIdrkE0bpZ41{X<H)!eLnWC%>mf|!}>1?s$z>L ztrI+#A3>R{JF=~8{y>74K|I7pgiPIYs6(Kd-YUL8yw-c-$|3C8-b zaJ>47i;KB!6f4S|sl(c8I!#D*@TbWT;~G&V)j<>vdW4k7? zvs$_+S0P2se)5ObeV86g?HInz?l+@2qy*BxsXCCCk(>vvjVFVUl7$4AdQjKVGKx;4 zYLeOCEu`e7t5Sh#-#;k=#GQZB?GIRdtsBP0QDPSWUoCez)^BTl`t^#NVP_~OD(!h_ z!ke)ud?D8aT59``7B=}8&Sg5NeMgs3uWCg>hkVc|homO$+5%}I<8rhw^{Fs7jzLQl zrY8v_P}xMqmsSNByzxM)MBzwM_=}e1>#4NTSipZL@rOneSoqwVFA8MBXuE-dfMGw? z3oUECj@Jv6?yTE(8nH5Z(K#!_MR1)F!nl})T-&u}bkZZ{tu=?_`ka$#BsJx>`FvZJ zFFIg)Zkx+nZ@OYKwp-%`v+a93IAe_dOOQt9{xiKRg_uVDjvc_`eCx_MptD6C0SvXM zIT6ydR|H>iXUVO1x!x2E&DDj#@iuj`FL2rz?@J>_r@bxGue3L4=r**s9dJb~T+BD@ zvD}Bx6n4nLuxDf0>do9 zB0Uml+rC;t#VoNb8xO2#i=PdgY>Q9y1)1|GT%5Q{XZup5hi%)$={LTq`n?zD58}u$Jh~{hG<#v>ib=YbN^y7nZ*P8vnu2AY?d3+Uj@O@kS z7_tbCZ{s;K7mKQ+X?U%%-Llunb%%w$5)*5fVY}R&%ErQKUw$z8)m+iJ#)bQbwZB{= zQyE{YaVW&`y+kr%!zw#uMX^;;tkzhTizkLQSD&||4RKua>1pxu-uwver*LMXwRJOule|Rd`}6-IZB@ zroxW?LDcBcJ9m&o2Mw)!dbQ*3bvEf7d@x4q#i^b6xxsV*iXZnN!ZUfxQmO}v@7-=0 z9xpTbuT_^(GO-0RQA$*6F>4unX^8&RePhz<~cJ#*QKLEh|x@+Ic?4mAiRD)fiS5+vnqNJ6`+^JrOu65>|FEY18&yiIrki5 zsnxLS8_3kxE28x-fNvmMvInJI)dRPA=Js?5WWRvR6ndBC(L}SQkstgrU>ePbF}kv= z|5=_N(U{`W4^%SHf%LOiuAuhqaZ^c&`9#f7GGRT+4je$xu`L&w_#TfATlYkO+n}U9tmT4?BGCWgpr$(onuXc^@Wu z$$z;lPr124xr}!3atOa5W4XHOplIV{er~h0rF2&(wPR>vkm=b>uH3HXbixZf`OY0M z>O)QUw8WnrUWX@HQbuq#J(?7NkWm71NR?>&ZBi-dt2B4Nm2@pr{Q7b??|4#rbr^PaZH%F zX@HfaK^zS#$CfKJ_;w_PqZ|$JpeCJ$Tx zEo#k{ftuc00Z?OG#Y8{_wN}tA6TsYlS2Qv59!)3*V}*oleqoH2)p$qLzg`W~RKvzC q8cX9tQ+6;-@K@Kr<`1EGsUUOBc=B}9 Date: Thu, 18 Jun 2026 12:42:43 -0400 Subject: [PATCH 3/4] feat(17-02): apply approved family-house logo + regenerate icon set - Overwrite logo.svg with approved higher-contrast family-house SVG (warm peach gradient bg, amber roof, bold white walls, heart finial, three clearly-spaced family figures in rose/gold/blue) - Regenerate full icon/favicon set from new art: favicon.svg, favicon.ico (967 B), icon-192.png (192x192), icon-512.png (512x512), icon-maskable-512.png (512x512 safe-zone), apple-touch-icon.png (180x180) - Approved brand decisions recorded for plan 17-04: accent #e8915a, --brand-logo-border-radius: 0 --- apps/pwa/public/apple-touch-icon.png | Bin 1110 -> 1744 bytes apps/pwa/public/favicon.ico | Bin 861 -> 967 bytes apps/pwa/public/favicon.svg | 73 ++++++++++++-------------- apps/pwa/public/icon-192.png | Bin 1617 -> 2869 bytes apps/pwa/public/icon-512.png | Bin 4221 -> 12056 bytes apps/pwa/public/icon-maskable-512.png | Bin 3353 -> 8627 bytes apps/pwa/public/logo.svg | 73 ++++++++++++-------------- 7 files changed, 66 insertions(+), 80 deletions(-) diff --git a/apps/pwa/public/apple-touch-icon.png b/apps/pwa/public/apple-touch-icon.png index 832b77a8b25bf8f894ebe5fcc60193fe144e943b..1719c9e630b34454efad3454c3701e9d85d52cb2 100644 GIT binary patch delta 1728 zcmV;x20!`M2+$3XB!5UyOjJex|Ns2o$Nb#G=Zi}F+Q9wd%l+li{^{2L?A!nD-{XZt z`_r}RlT`CvdrFYm^Qt|3TTAGwd-K1WJS-&mo2bm-^vS`!inry>b;B`T*MGA)mD82fb&Iq`!Ml#*`E)0z zSQIxh*YAbLMzw~g|%q*#4N(){0ou>XzpxyeRkio2| z9Xp~QbnWiYiW%f}oj5&sw-JBwoTfX>f||ZE^ggqoCa()k4wymIiJ;LTvk-bsXxyC& zzaq4S*?)O(Oaa|?U07-;G`(H~bE%cNYP&}2>mk8TUu{4PgQa2WjIHk~hr#i3$k3?LJ4dnwaeS6Go_IW2@&lvmYZdu)%67=>9-x5vFDYEFxxyDWXEBRPG}TzaYh z3+TRVN>QQ3N*x2bFUzrMi4LfZg*pOsuUz)9x;Y;l!$b3C(8xS3rdqDH*T?ito)DVw zW`AydP1ZDr$c=tfu81K$I5gQWyz!U129Aze0YV?RfVyql&Bn%E%$=i$LwZ=JyC$eQ zLgPE#H-XhBaGHmP=3$-QQv|1X+acie*eL{s&S^w;8wv?c2@aYd9Pcxekm)hR)3-pK zWgU_3v;ysj`xclRP-rb2AzQNpJ8c>Qg@2~n2N%?7a)mlTdW5}uNJGwEKG1a2Rj9uA zb)BZieLV&A^Dgu}dW7qFe>|3>^yGF#5;}cX+Qoi8r0!{Q`YQB&*3NSpKaYn={Tk5E z1^T{?bDyCf&liFgti12ro{N>uQ-Dl3%;iC4bzEp)47(?vUCk9CArUtha1J=*zLTj)+N z!2>!iP93UR>{l6^E?9W>dG>lbBHk+H#>lk;%gnxE=*AfYB z{0)G-%Sor1G3^^A*mB;09zH#e4Q@>#dQoU~;<4pWXnGj24W`2;p#Qs7 zouqOY{^W- zuJj7gtUyLd?^J6D!C(ZtM-26H^D9n~)W$kc*JBK$0}f^cGYp z%r3&uY#JN8h%<>Sqd5^1gTPx#32;bRa{vGX=l}o%=mE8RQfmMJ1I9^2 zK~#9!?c8yDf*=qE@GHbXLhSp0*`ZA!=M-6Zu-OHrJw7y(um1vG?eVNed z=9t!(2hHW5!ZFaZxod2?C}-C^Y??TA4)k}cYg~5S&3(=zruAh&o27YI{kY$kYI7>u zwYm`9#DAmj5v}jtXx}!vXmc<+T%|W#-<#31xo4c4ncdk3+hKF9AI3iD_gde3(VC4h zjAxH`=_~w zRkXrI>uIWZP8d2sPxA;{J~uu)-VPcS%_c5ewmh}c1~qq^4g)H>Wqx?DZS>%W$8g0& z>kw@Ypfw^|h3Gcyd4A@bkHc$-9uU#?iXT6wTfK$W*Fh=8nY~e0Y;+Jm7QnvOw&^7V z=zlOJqTSgAUOd_l4|j&o6o^(YXg`4c^&bAYV$hI^2Gq$V2-`*vAsTlYUm4P%!pnga ztPE=0X&inQT6Mw6rtxd_v((6MP5q%bSF{gL+)VFJ-JBQ}8WZgXi0gOV65TDk-XO5i z&ssCzqr2c7S@VJxdKw|$o1&uakJsTJ;(wh#v)3%pquYNMF8VcHvq<;LDFs3kn$U#a zK-<1YXc``bCN!Z5{gG(1M4O_}>uQ+(8|Pyn$&B%VGsyYLU_ul6lh6XwEItYSVQV2^ zqN`jgqt2C7M3II5j|=V8xuj8*i$~$8Zy&iJT9r%B)w#%Doy#endNkfXe2LI=iaIT5 z+1rX27{1Z^(}X58p$ScBLKB+MgeEkh2~B816PnP3{wL@!U8hZ=Qo}4U00000NkvXX Hu0mjfPna76 diff --git a/apps/pwa/public/favicon.ico b/apps/pwa/public/favicon.ico index 9a5247e3741c6982cb708bf95c389ee768eb2f40..64b2e4faefb98ef988c80d22eb9beeadac14393c 100644 GIT binary patch delta 919 zcmV;I18Dr+2FC{v000310RS*C000312mrB>4?lkcV@X6oRCt`#nm=pXKp4jTWeQ#U z0lJjX$%RgtyLJqvV}}On#dIhH0>yI*g)SL7lu)Bm4+(+d#s$~rh~vh=I2Ibxv^19W zmglUKPbbOx<5OfGJe+bq>3x2>_fEDhrSj9Q(mJaY^@08C+a0@iR3(!&9g~g7I-}c^ zgP4CNYr+G(qyiw5)g1HGStXIlYOw$y1vQzBe8OERvNk<6)zMJze9-*rsTm4@AzA@* zlu%wed8y-!+C<~77TtXRNPlF zP5Z~|1u*R&bK{pgn_M`ydxz@*V6%qLybppkasn9sARU@?>H*`b&_`FivQ7X@)Hw4( zd{VCxz>Q>n`1;YpTIl-A`_%w|5n(W`u9t)e0AT4$Q^P|Ok0?HC5)Z-{c^|#!oc0K^^(>1BltWcKw z)Yb}sCn#2$I1{>bxwFY*rUwwir_^C-lea9SQ;e@U02&skFo6DIU*Q0PP&pRAZ-p?# z|1N%Nkjw;n_)0tiVdC#>bQOQ=EOmUX0Ijc|=xy~Suj5L6Z#UT2Di8oho{I<+mI zP}IeM@RqFz0C@yZixEK0KO+jPDkujhV}951w>k&xq5$yPP=5dO=T(ij+g*QSzT|cd z-nP9zpz@oJr|tcLW&qYmR!aad9C(FDL{}dk`h+5zj|5=JJfA0s*YNTh6BqM977Bi#$P#lv*1^fxn=f2h0VW-zoy4@dvhWF-@Vk5H*Yw_D z_%##2z;ikPeo~z)ET|4m-0OcQ^CAK8txPeD8YGOUT6i9tr)DC_8ywiK@dAhorLD7y zN#`ew#l6Z~OnHn#uIkP1eqfuG&xNARb>q@=miv(#-RKaN!^O*JFWl&s)2Vo~b^ih& trA;h=7>yYSMx=;QF?ife|Ln0&`VW9aac9(L%Wwby002ovPDHLkV1jLPu*d)a delta 813 zcmV+|1JeA*2i*n_000310RS*C000312mnWs4?lkb`AI}URCt{2n!Rh>Fc`*f>mSsA zpj#n$$XwErp+gH@x)nmZ1iA&V?6oAn=85ZUvh|LxHU#$WB zVV{hu=4A++Q%eAU*yn%0yh=1Lgmc)*LA?Oj$w4ObMMGGH01SR)Hm-`)rKg0OV!zp&I2}X7d3gERzq0*wkNUwE^U1^4HoDKU!TRp{#4T`+kA9-#sUxoM(TT z)dEnLNpvbp2Lk6WJ$W1x210j*$__9(r_|5T!fg}b1j9l%LsB@IZ!1PxyaX0_&FquZK? rPYta5AA4+7|FMVjP3vQirs)+Qbv*gjL|sJl00000NkvXXu0mjf>_c*3 diff --git a/apps/pwa/public/favicon.svg b/apps/pwa/public/favicon.svg index 42fd268..114eaff 100644 --- a/apps/pwa/public/favicon.svg +++ b/apps/pwa/public/favicon.svg @@ -1,51 +1,44 @@ - - + + + + + + + + + + - - - + + - - + + - - - - - - - + + - - - - - - - + + - - - - - - - + + - - - - + - - - - + + + + - - + + + + - - + + + + diff --git a/apps/pwa/public/icon-192.png b/apps/pwa/public/icon-192.png index cb3e1972c0f0ee9b5feb23e36c505264287f5e50..15728fd0e1249c6b1d5fc244a849fa2e820b30e6 100644 GIT binary patch delta 2854 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 diff --git a/apps/pwa/public/icon-512.png b/apps/pwa/public/icon-512.png index ae031233ab8525c23df9793f7334b7410a90737c..1baac4f1350b3fa370012dfe0fc16c16793a98a2 100644 GIT binary patch literal 12056 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 literal 4221 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 diff --git a/apps/pwa/public/icon-maskable-512.png b/apps/pwa/public/icon-maskable-512.png index 15ac59c3baccd6f10353e9ab651275aadb4ed0c4..caaf291744ad392f24b4b48755f26a8b8b6a5ff1 100644 GIT binary patch literal 8627 zcmdUV_fwP48|}VHXrTy5@6thgx`KEC4_q z4^e;?ecXM|7X5kLDVSffI)6Cwm9ji^^!FEnAe8xDWNm!rslj5*mA#(QO~;2Ou|u1A znl>78^M!AJg`30#d2r?Ue?8ty=WA%^4*+`Me+{Y#vG4*w2pAdYS_KcUrbWAEN;5x= z&?~Q9UOZ@Ay?ytWBkmvTDYC@vvrQkrg&r!sT>MOa6jsj7009^RT>pQD3N&sHE9lZV zh5^5K1#f}L$TVjb40R{sP0KKf3^61r)%*NC=w(qzIwZV;BX)IoAv7}Jy2D0o3c&kD zadw5IBf=|UK15t8Vt~*j#2dwsjocD(Q8>~`0g)@~WpoO@|C>+Z0YLByC~C_8D2K=p zhHDQwUfe)#ophN*y2Ob@gm4*-Ky*@ITgc^K*;39uaQL0woKI&QOz;`O2;J8a;~Dv|`W};X1C9IW&heq);fN@R*iYAKzTfjlKo**t zB9AnxP7{6B{eRinZd*o*S_IOMcV8 zxN3;w6KH5gSV4po?htnnUHEFiIAPUtmVpuSU56PDfAFTK*xsG~W>8+ON(gZ30aBSe z@1EQTTrGW_qr$Br9e;Me@Af}U|1nrHMDTO!>)8(|`N9qg+^`C5U-R!$*5+zSz1=%k zwkFNAofTaJO3$KzR!9RELy@@au<}IT=uzOfcc&08mjC$$USOp(K`un*{y0xJ42PDY zKHj|y%=3|s%CnhdM3nI=tAYcVjM!Mw(o4&p)~JXs+xye5UNIyPq$UAkEXcZxrxRoKnij+iqMFJa5N z$ZrWQ57_P9qbktMj~1S`2Pl>Wp090JC=XhB4>SlxS2v>r!8JO*Qs%Q4v%n~?r}WRA z!nZ8! z*Ib^@m)VMc{xziUDM}J@URgMj^|7tMxm;y{4Mo(e9lBK0k%!j|n?KzJC~m>@`AcK- zZ+eQ^D$QC6haJ88&eS+T!u`X1!<$0^4QHJzjKyNY2hW@#t_VP1>?OUOJsKDQeutc` zEmw}hG3N*_nCS9-@zja3-BZ_0Kamv;0+(8}hVD0%>+)7*-0K4%;-$IEHP-PHG6rlF z^tLoVMz%eEVI%x4gL}!P)T5mkN{x@j&0YN%HpG+ZZNeR@iY1a6ZBQ?&4aJMFs`4q@`dfsE)29IXVG4rLAtF%Gmq?3 z)N!&ZIZzl$E0+h1z{x|0jrY-Dq+NLp4~o?pL_HrxR)Wcsz|iW+Gn-BU;9c3!x_tuh zC1H8!fi@iozx~qzY}kPq0~e2_CWtux9OnZOB~Tlp8E23IM!0BSTg!1hY~b3_M4&1v zR3u1}c-NMyX3dyLDyi%cjS#>V2U2UPs3JOdiaXlzlEgXg0B3XnzeENL1f#rDag}2! z$g}yQnswe}6HRXpP^O6^)2DJEbqIqtyEio4v_AnctvwsMDP%cycno(V78w zL|LCLXq*LI1cxid!)3e2{5Os@orLgIitCzAVbSiPATtj7(Y;*I)#bd+sZ?X$%&t7 zvya|eFy@D|GpF5_J*S|}5L@|7?)BmGQr|2un3@fqD~J!JG2}cj?ZQ5%w%RSs=6Fl= z{9LFV93X`tm+O7y=?7-X`-u_1=tA!A6pdGFspahmv-1Uu`tEGURDa6SzGt2OXO}&YTf17fp60AKB1Qw()MTd6ZW&Z zJ13$;=b}A9wz^ZQJMLu*v{u?whDhyo(mL*{$VJS;lkAQhX>onIz)zvbYA*K)Ps`L`w!2|Fl#$?&2g~7 zoqi@Rl|3d2?Q|yNcHOQ+d_xn6Dr%1$9XFh*5#T#zs+HpK6VmJ=$&lh+)yqG-cRgBB zZ$}c*G1k+JaK>-`8#=xGDC&0ls7(<_==9_Ho%@|uW~QIa@d$o}x10#1VZm9oFMADt zSnK}!K^^Y5E~D_lP}{z44jjdn5KZtdQOptg9uk9GL~+&0n4DgIje0F6$GPdAas|W( zP*4OVhWqEZylV_GuSrN6;AuGfCL!S21xWDO`8I0LP?NDILQAZt4{tVq{CUB^4HP6` zE)moMXohiq_F~!W0TEAIMtZDBp zO5Uw4v`r<+D&nVlZeN7zK7eG$*3D$1>xcFaTsD6MSCJAKnfcQ6Qim`t(HI*)`eb{} zja&yPxS~zm*d@<1-ATJl+w%I$9j4vmOFqF?ATdoMIA_(gwK;U$dC?J|`{edVV5Mf>}Xi_`WVjxxwkda9(w|hSpI* zK!uatd#O9|K<788wQ7iuEuJzFqSt=UO;v2NO`MC%bZd(|d06B{bSx;-j%$`%^`|$Q z+>|$$y~gW~dc1{}OKNd6l)9uY2IlA()9*r~h_phIU2aPBM+G77a?VvnTo9($$ zs(7ODq5Rp&^VEP1aqg@Vbl{){ZEZ-R;jY{Xu z=0sMs`0eeL4-MrdN57j-QiMx**CZ+rJMnxYDe1+#p*5(gd_?}z$LCIFrnRD}cE3$E zJEEd=xiWyW84Z6;eHZd>o;B{AA1~u<*=qTDR)u;m$=Rep6HWiRj*2)m-%MDLJmQ>$ zXIsxQK={zHrj#Ciw>efY4P6yNUJv?cWMx`I{+;K4PI;ihVc+^_!}`3gN?RHaavuMNH4&A4gl9?q+KQ2Jq*mhrsXWY~A#J#pcix0cE}M;Y zW+(Cv{qe#cfUH(o5FJisP4E6()l(avz42iHlh1Be6Df;$CcRt zJGh9&lbT4U>p$MYTr|OyII^LgJ#zM7LEw(ME?C?B8{V1cFypM^kXolXnNA>i7a^`O zIdOPSZZ6@pTh|E>h5z>GAK{;K)lEDl4;4LwB%Fg7rEsE$-kWBtUSIB3IT|zs^?2%K zy=Vwp+B3NRvmMU@vN;VuOit;hQkS}dDbgp)w_humt6B~lH>6Cy#OXOU-N-4A4K7{0 z60Mco$Ym%6N2h+4B4+0KQTfX3MlW2G!VGL8Gcuni{xuQq&)kq0aXoQ2l#SN$F8)l+ zTi6XdsnrUl(3b%DUAjboCNNtLy+eM$bBw&?flj;ChT(a zcFuy?^OlHD`}R1^XswW%U`k^q;)5wj-S<{-sOE@il#Hn+`79zKc7u1~@B=WaAm{L2 zi0!dx7}UhQngRJo_y;#`@D$&T8m{4U{N(SminMKq-J8`AUe5%k)m8Iza);IbMi7E7 z`~kH{#mb#+V*|MvO^P73b@e2{7<7U2O2GOF+iz^f}K^MT*5#d*Ck$BFtdU>FkoHOV?1gT+5=8SOag zQu?7f0C%>#!$W7h44_~hu8Q-dh=o((gym;JZY~QsYv)vKUI%NOao-IZAYeB2%tsjo z#NH`Sv!i-%t-se(Qkq{G{Z4MPr0lT4RhorhTKAItN3Nyau#z$sodo>~(*qDD6n(MlT zF>-5XmGY+_K&f@yKGPTZ?QKXQXuklA9#}xEbk~pZT-#>g@irIp!-k#Ma+f| zZO5MT-v`n#*(4o_=PytnsY{pmgoKB36vHd#AC!1V(*^vKi8;_z?b|#*|L)$)1jdGO z(HM4B4|E)@6H~0~S7u*E(TI|izA(YUr`I%9$~!7^L3*m#^VQClus7+YVi^*VQ?te; z`{w{D&s_;Snbyss{@&9Dm|Z0HHk9S~m7nEUxcJ2!YvZc@uPln*wLo)Z>!y1jJ*-zV zAIACMwW8*d)h8XA3`@-(_Ig@55rO{hq=F055sT!s>jYWxI)lu8Yd9{A#iED~u!k3^ zke{*%t>wSdu@{X$*|HotJ#ze9b+hoRRzED!ifgv@4DY&^(>Cq%jj?wMv@pRrUN}?k z{>*sjpY=09z=jw*ZkR?NXg|S^IwJi<%%Q7n!Nrb`U~iutC*>yAd#(sBx=H8v_>(+_ zEP50^#CoM4hcavCjC7~M^`oj)JguSBlsI^$;&(abExY?1-#3NB!(oNNqkT6YLGr=- zFPEUr<#R<6&&ycN5ow}?;-nw6@sKRUNZi=+DJPs->B(abn^}J*=R~ze z#9YwLAeI0u*7UMQj*I!l~db3)5iHseeb(Td(~~9 zgysj?{W@m52&F*WWpB3#1_W8BZ2F1h_7>Gz2F*cHurqP?AQ|=1b?0#Kuq{cp1KLpn z8GzZ1q6aCOR2Cey@qk=9__|-MIb3m@XeMx6rL@8jyOQ?ISQTWk;gnT*V1WX}2VlEt z`9$=Muf^);Z#5y{33qFxKwzd30R!CPz@s$qZZ z8tGCun`4m+mJMnOnj+YvsyyA$aXo-` z3_qHrai?>4mj?Lq08=WVd4(mJU4pAz4&Xt93<0X{KlsPkse%oHX9V7z@B%T1e_?em z{9{k6pV>fIFDRMldsw&vtS$+3=adnh)VvHKg{ZDeWXcyb@N9(|LOaa{XmkWYF!P4J z9yk6A73i15b=T`?oiM?`#<)qs&+2cpF6?0IZS7vOW&hK{{+k%CdadnUdaXthPL^Kb zLlSQBHwe}pcn^j-_4MqE$UMY}`Yxu$b%wpZVLf+F2y1S}q;Rr?-wdLWt>+EqS@2WO z&{))n$PNeX|8#y0eCv-YEF7RdbI_7WW5d!p6E98dKllH6lk zMmnO}mUSWvfa@{fWc+@`;YdDmX12DaZtm-&xhM=~=PTY~fRhsHMp0Z?SW}Hf^QqBZ z;E()!;L!HxGIDfOf7T&`^vD@O$e9A8NJ9)VLe%HZ<%7THG=2h&lsB|dp@DYNp^@fH?~KH<3Ca zLOelN>6~}b9an~@>mRrjoHW{R0u!(o_YyxB6PR&(#-8~7`ZFoGJ+grw;_7376Bv$5 z*t7*9X0QZ?RD{X}E2(Hlo$f?5bL+vzu6(Uiz!u`;)r@t?PJ00jOR}#qc@VD&Srpro7Ss8UgYbDS7Ig6lRkgG%!0l^W5k5eHt?S% z%r6SRk#weFgP1qLV=Xq^_F0WG6DJ>0nx8CprphzSsZYjb(1Ju7qE8#No&G}L=8;CU zp$Il+?fO3|-+Q{gXdr$99{L1~&33Ke<@#7Yp{yx~%?y4vms23$A3h|nZ&sdSlp>a% zk-X@F24MnlxGI&xTCNVGrzFkQY(FYpmjmfZHL9yD-4jj_1KT8;-Q|7lfb7%LHURmr zF}g5}+vDZwI`+nhH@eDL7bpMxea{Rj!Kdsu%x^Jm2qU)0tBkR+`qRK1&Sal-S=Wbn zY++Fvu}~c3NrQ84zfDOnnECT)B#!u^Iv+958!i%tpjPPA930cFhSW z%<-SW3WU;=q;NQ<;sEZdCFO@(Bq><62n#dHqt^o)t&2)TmMxD*WCscstszR z$z1U4zOxPLlR20MpqA_1u(SB?Hfg>r@9RJo824rh^&k1Sz~KkWP<_~{9{1F5;XtuV z;uK1iHV>8LWlhq?PtlF~K3B_nJbxOec5X^J4m~sfl@z{iy{4?L>-wPTXcSQ$xPm@J zMJFt)^Xe$c6nju6ItuH(LOKoE>-euI0}~5yc`Qz&U~3mCUcde~A4}gOHHOSD4LNm? z;zV%6%VwyGyCr|fd{JGoPG=k@5z2Ro(g2k_RFB|~wGyY4TVz5o$$w#Sa(YUL=kDfa%8z;6#r0)*1PbOzc zC7Zr$s+LOe-##_Go|s(rmjU}Iklw7jTlC&ahN1xlce>$#> zT!5J|c<&CpQT9fGo~ud?>Mv1(~nZ)`sUk@Jo3V&G+aNZ??74!^km@n@OH5O2d0bw(W}&o*+x z81wSe-q7`Xd8&PkIEy|kbJE92EiQ!%bD=|}C+MDRGFqc26P-y(bPq((bC>IM$_7oG zxaNH}tkEtVsbz7u-@k-=h{+c+8&a^&FXm*sFW3o|TBDh>^(L+^X3ouMYbC`qEN16D z_F0PhEfE%Qwbk7F)lltry%KO9O;l`oGtE~>tKr09`r0xrd|m3V>Fl_h=j`kIL#?Z8 z(Xa?$<~Ndp6(zSn;2u-+GjN8HgNC*5?^hD}$KSWq!ZC)7Xg zPe&+(38yb6Hn8@pIj?rn!9{$qxg6N^O?(htYHTcMR;BPHJiDQjkhE#i9N%^R?5!Cj zhRr1iG?bzy6;aIcNVCh(xwAnSK%tZi>$k0ekkjz?A>~9ci)O z;Nsz`$EqRerk=sa>C|jmxx^~9!2WsGTXl}$F($PC1UywRbQ70Fl=70wX`XZ(FECpl zBH8{ZG)*{{+QarE+2HdPzmms=uN~3gah4HIJoZ-s@7t}`)=Z1GRx-0~Kk0Q|BLCtrZ-YG`<}dFw2~}}Fak{D* zv{(^r$MCa|Uvb^HRXNurXmpmwK75iYUb)gPQ{^(nMVw4mXgeN?Z;T0lo%qf+so6gh+!8%f;Ut@R%NYjGY; z0zol=4~Kk{1vDsFs2fKeED2~)j2KuS!ZGLS06r`@5@ER-b{fw7AD|8R7yxbVI6{Ml z&t|M)CVjzO#0BFW$A5UjH6;^~x)WSHj@e*8R$o?LR14MshCdx4D1gItQ1DbhD8m(L z#K01eR``o>r@zPmfGcpX$jE63cRsg&Y@u->)*C055baa{% zf9qHW`0fuQ-avrXWxSW*PvN}2Z}<=Zi2r|HfE9lbOpO}MD?=`UaF&f+Ms58@`kd;& znjpO6oRII-jE*228*##EXDE)}R|VXV*=s5#(9gdKrvjrwduPRbwfoL&#sl9Rp{wg- xwHo6i%+fsD|NTF33mm%|fWrT!kl#t6u~SJB#W<~G9Xlz2(RovY&w4J8{tpsctwaC- literal 3353 zcmd5}MlXLQ8e$1JZA5(SSt^2-vZ&kgz zb?es4jF~*%QQl1sz;QzKxM=__vNY@%vAJ>7uS{%u#(Xp*Qh3v36N~Bfv(M&ympai} zamn_k_|5#}$-5sch!|=-`RS_5-rYrIdrkE0bpZ41{X<H)!eLnWC%>mf|!}>1?s$z>L ztrI+#A3>R{JF=~8{y>74K|I7pgiPIYs6(Kd-YUL8yw-c-$|3C8-b zaJ>47i;KB!6f4S|sl(c8I!#D*@TbWT;~G&V)j<>vdW4k7? zvs$_+S0P2se)5ObeV86g?HInz?l+@2qy*BxsXCCCk(>vvjVFVUl7$4AdQjKVGKx;4 zYLeOCEu`e7t5Sh#-#;k=#GQZB?GIRdtsBP0QDPSWUoCez)^BTl`t^#NVP_~OD(!h_ z!ke)ud?D8aT59``7B=}8&Sg5NeMgs3uWCg>hkVc|homO$+5%}I<8rhw^{Fs7jzLQl zrY8v_P}xMqmsSNByzxM)MBzwM_=}e1>#4NTSipZL@rOneSoqwVFA8MBXuE-dfMGw? z3oUECj@Jv6?yTE(8nH5Z(K#!_MR1)F!nl})T-&u}bkZZ{tu=?_`ka$#BsJx>`FvZJ zFFIg)Zkx+nZ@OYKwp-%`v+a93IAe_dOOQt9{xiKRg_uVDjvc_`eCx_MptD6C0SvXM zIT6ydR|H>iXUVO1x!x2E&DDj#@iuj`FL2rz?@J>_r@bxGue3L4=r**s9dJb~T+BD@ zvD}Bx6n4nLuxDf0>do9 zB0Uml+rC;t#VoNb8xO2#i=PdgY>Q9y1)1|GT%5Q{XZup5hi%)$={LTq`n?zD58}u$Jh~{hG<#v>ib=YbN^y7nZ*P8vnu2AY?d3+Uj@O@kS z7_tbCZ{s;K7mKQ+X?U%%-Llunb%%w$5)*5fVY}R&%ErQKUw$z8)m+iJ#)bQbwZB{= zQyE{YaVW&`y+kr%!zw#uMX^;;tkzhTizkLQSD&||4RKua>1pxu-uwver*LMXwRJOule|Rd`}6-IZB@ zroxW?LDcBcJ9m&o2Mw)!dbQ*3bvEf7d@x4q#i^b6xxsV*iXZnN!ZUfxQmO}v@7-=0 z9xpTbuT_^(GO-0RQA$*6F>4unX^8&RePhz<~cJ#*QKLEh|x@+Ic?4mAiRD)fiS5+vnqNJ6`+^JrOu65>|FEY18&yiIrki5 zsnxLS8_3kxE28x-fNvmMvInJI)dRPA=Js?5WWRvR6ndBC(L}SQkstgrU>ePbF}kv= z|5=_N(U{`W4^%SHf%LOiuAuhqaZ^c&`9#f7GGRT+4je$xu`L&w_#TfATlYkO+n}U9tmT4?BGCWgpr$(onuXc^@Wu z$$z;lPr124xr}!3atOa5W4XHOplIV{er~h0rF2&(wPR>vkm=b>uH3HXbixZf`OY0M z>O)QUw8WnrUWX@HQbuq#J(?7NkWm71NR?>&ZBi-dt2B4Nm2@pr{Q7b??|4#rbr^PaZH%F zX@HfaK^zS#$CfKJ_;w_PqZ|$JpeCJ$Tx zEo#k{ftuc00Z?OG#Y8{_wN}tA6TsYlS2Qv59!)3*V}*oleqoH2)p$qLzg`W~RKvzC q8cX9tQ+6;-@K@Kr<`1EGsUUOBc=B}9 - - + + + + + + + + + + - - - + + - - + + - - - - - - - + + - - - - - - - + + - - - - - - - + + - - - - + - - - - + + + + - - + + + + - - + + + + From d917157c635b12cf533f86d7282f3f50f2fc3710 Mon Sep 17 00:00:00 2001 From: Lucas Berger Date: Thu, 18 Jun 2026 12:43:45 -0400 Subject: [PATCH 4/4] docs(17-02): complete branding assets plan summary Records approved brand decisions for plan 17-04: - logo art approved (family-house redesign) - brand accent #e8915a (warm amber) - --brand-logo-border-radius: 0 --- .../17-02-SUMMARY.md | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 .planning/phases/17-ui-optimization-polish/17-02-SUMMARY.md diff --git a/.planning/phases/17-ui-optimization-polish/17-02-SUMMARY.md b/.planning/phases/17-ui-optimization-polish/17-02-SUMMARY.md new file mode 100644 index 0000000..3ef180e --- /dev/null +++ b/.planning/phases/17-ui-optimization-polish/17-02-SUMMARY.md @@ -0,0 +1,149 @@ +--- +phase: 17-ui-optimization-polish +plan: "02" +subsystem: ui +tags: [pwa, icons, branding, svg, vite-pwa, assets-generator, logo] + +# Dependency graph +requires: [] +provides: + - "Approved FamilySync logo SVG (warm peach gradient bg, amber roof, bold white walls, heart finial, three family figures)" + - "Full PWA icon/favicon set derived from approved logo: favicon.svg, favicon.ico, icon-192.png, icon-512.png, icon-maskable-512.png (512x512 safe-zone), apple-touch-icon.png (180x180)" + - "@vite-pwa/assets-generator devDependency + pwa:icons script in apps/pwa" + - "Brand accent decision: --color-member-0 → #e8915a (warm amber)" + - "Brand logo border-radius decision: --brand-logo-border-radius: 0 (SVG draws its own shape)" +affects: [17-04] + +# Tech tracking +tech-stack: + added: + - "@vite-pwa/assets-generator@1.0.2 (devDependency in apps/pwa)" + - "sharp (transitive, for PNG rasterisation)" + - "sharp-ico (transitive, for ICO encoding)" + patterns: + - "pwa-assets.config.ts: minimal2023Preset, images: ['public/logo.svg'], no overrideManifestIcons" + - "pnpm pwa:icons regenerates the full set from logo.svg on demand" + +key-files: + created: + - "apps/pwa/pwa-assets.config.ts — @vite-pwa/assets-generator config (minimal-2023 preset)" + - "apps/pwa/public/logo.svg — approved brand mark (hand-authored, warm/family-house)" + - "apps/pwa/public/favicon.svg — copy of logo.svg for SVG favicon" + - "apps/pwa/public/favicon.ico — 48px ICO from generator (967 B)" + - "apps/pwa/public/icon-192.png — 192x192 standard PWA icon" + - "apps/pwa/public/icon-512.png — 512x512 full-bleed PWA icon" + - "apps/pwa/public/icon-maskable-512.png — 512x512 maskable with safe-zone padding" + - "apps/pwa/public/apple-touch-icon.png — 180x180 Apple touch icon" + modified: + - "apps/pwa/package.json — added @vite-pwa/assets-generator devDep + pwa:icons script" + +key-decisions: + - "Logo approved: higher-contrast family-house SVG with warm peach gradient background, amber gradient roof, bold white house body, heart finial, two parent figures (rose + blue) flanking a child figure (gold)" + - "Brand accent approved: --color-member-0 → #e8915a (warm amber) — apply in tokens.css, index.html theme-color, vite.config.ts theme_color in plan 17-04" + - "--brand-logo-border-radius: 0 — SVG draws its own rounded-square background (rx=104); no additional CSS clip needed; apply in plan 17-04" + - "Generator preset: minimal2023Preset without overrideManifestIcons — vite.config.ts manifest maintained by hand (plan 17-04)" + - "favicon.svg is an exact copy of logo.svg; modern browsers prefer SVG favicon over ICO" + +patterns-established: + - "Icon regeneration: cd apps/pwa && pnpm pwa:icons — always runs from apps/pwa to resolve pwa-assets.config.ts paths correctly" + - "Asset source of truth: apps/pwa/public/logo.svg — all derived assets regenerated from it" + +requirements-completed: [D-03, D-04] + +# Metrics +duration: 35min +completed: 2026-06-18 +status: complete +--- + +# Phase 17 Plan 02: Branding Assets Summary + +**Approved FamilySync family-house logo SVG committed with full 7-asset PWA icon set derived via @vite-pwa/assets-generator minimal-2023 preset; brand accent #e8915a and --brand-logo-border-radius: 0 recorded for plan 17-04** + +## Performance + +- **Duration:** ~35 min (including human checkpoint for logo approval) +- **Started:** 2026-06-18T12:00:00Z +- **Completed:** 2026-06-18T12:45:00Z +- **Tasks:** 3 (Tasks 1+2 auto, Task 3 human checkpoint, continuation applied approved art) +- **Files modified:** 9 + +## Accomplishments + +- Installed `@vite-pwa/assets-generator@1.0.2` in `apps/pwa` with `pnpm pwa:icons` script +- Hand-authored warm/rounded/at-home FamilySync logo SVG; replaced with operator-approved higher-contrast redesign post-checkpoint +- Generated complete icon/favicon set (favicon.ico 967 B, maskable 512x512 with safe-zone, apple-touch 180x180, standard 192 and 512 PNGs) +- Captured three operator brand decisions required by plan 17-04 (logo art, accent hex, border-radius) + +## Task Commits + +Each task was committed atomically: + +1. **Task 1: Install @vite-pwa/assets-generator, author logo.svg, add pwa-assets.config.ts** - `7db9005` (feat) +2. **Task 2: Generate the full icon/favicon set and validate formats** - `b364573` (feat) +3. **Task 3 (post-checkpoint continuation): Apply approved logo + regenerate icon set** - `4c99470` (feat) + +## Files Created/Modified + +- `apps/pwa/package.json` — added `@vite-pwa/assets-generator@1.0.2` devDependency + `"pwa:icons"` script +- `apps/pwa/pwa-assets.config.ts` — generator config: `minimal2023Preset`, `images: ['public/logo.svg']`, no `overrideManifestIcons` +- `apps/pwa/public/logo.svg` — approved brand mark (1926 B): warm peach gradient bg (rx=104), amber roof gradient, bold white walls, heart finial (#F25C7A), family of three (rose parent + gold child + blue parent) +- `apps/pwa/public/favicon.svg` — copy of logo.svg (SVG favicon for modern browsers) +- `apps/pwa/public/favicon.ico` — 48px ICO, 967 B (non-trivial; replaces zero-byte stub) +- `apps/pwa/public/icon-192.png` — 192x192 standard PWA icon (2869 B) +- `apps/pwa/public/icon-512.png` — 512x512 full-bleed PWA icon (12056 B) +- `apps/pwa/public/icon-maskable-512.png` — 512x512 maskable icon with safe-zone padding (8627 B; distinct from icon-512.png) +- `apps/pwa/public/apple-touch-icon.png` — 180x180 Apple touch icon (1744 B) + +## Decisions Made + +### APPROVED BRAND DECISIONS FOR PLAN 17-04 + +These three decisions were explicitly approved by the operator at the Task 3 checkpoint and MUST be consumed verbatim by plan 17-04: + +1. **Logo art: APPROVED** — the redesigned higher-contrast family-house SVG is the canonical FamilySync brand mark. No further logo revision needed before plan 17-04 wiring. + +2. **Brand accent: `#e8915a` (warm amber)** + - Apply to `tokens.css` as `--color-member-0: #e8915a` + - Apply to `index.html` `` as `#e8915a` + - Apply to `vite.config.ts` manifest `theme_color` as `#e8915a` + +3. **`--brand-logo-border-radius: 0`** + - The SVG draws its own rounded-square background (`rx="104"` on the background rect) + - No additional CSS `border-radius` clip needed on the `` element in BrandSlot + - Apply as `--brand-logo-border-radius: 0` in `tokens.css` + +### Generator setup decisions + +- `minimal2023Preset` from `@vite-pwa/assets-generator/config` — handles safe-zone math for maskable, ICO encoding via sharp-ico, and standard sizes +- `overrideManifestIcons: true` was deliberately NOT set — the manifest is maintained by hand in `vite.config.ts` (plan 17-04 responsibility) +- `favicon.svg` is a direct copy of `logo.svg`; the generator does not produce a separate favicon.svg so the `pwa:icons` script copies it + +## Deviations from Plan + +None — plan executed exactly as written. The continuation agent applied the operator-approved logo replacement and regenerated all icons atomically after the checkpoint was cleared. + +## Issues Encountered + +- `sharp` module not resolvable from worktree root for metadata validation — resolved by using Python's PNG IHDR header parser instead to confirm dimensions (512x512 maskable, 192x192 standard, 180x180 apple-touch). Generator output confirmed valid. + +## User Setup Required + +None — no external service configuration required. + +## Next Phase Readiness + +Plan 17-04 (brand wiring) can proceed immediately. It has all three required inputs: +- Logo source: `apps/pwa/public/logo.svg` (committed) +- Brand accent: `#e8915a` +- Logo border-radius: `0` + +Files 17-04 will wire: +- `apps/pwa/src/styles/tokens.css` — `--color-member-0`, `--brand-logo-border-radius` +- `apps/pwa/index.html` — ``, favicon `` tags +- `apps/pwa/vite.config.ts` — manifest `theme_color`, `icons` array +- `apps/pwa/src/components/BrandSlot.tsx` — wire `` + +--- +*Phase: 17-ui-optimization-polish* +*Completed: 2026-06-18*