diff --git a/.gitignore b/.gitignore index 7ffd1aa19..9d2c982e4 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,4 @@ node_modules !.env.example public/sw.js scripts/**/*.json -public/workbox-*.js - -# Compiled translation files -/locales/*.js -!/locales/*.po \ No newline at end of file +public/workbox-*.js \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 594ad42df..2f120d380 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,12 +10,12 @@ "*.css": "tailwindcss" }, "files.readonlyInclude": { - // "locales/*.po": true, + "locales/*.po": true, "pnpm-lock.yaml": true, "**/routeTree.gen.ts": true }, "files.watcherExclude": { - // "locales/*.po": true, + "locales/*.po": true, "pnpm-lock.yaml": true, "**/routeTree.gen.ts": true }, @@ -23,7 +23,7 @@ "i18n-ally.localesPaths": ["locales"], "i18n-ally.sourceLanguage": "en-US", "search.exclude": { - // "locales/*.po": true, + "locales/*.po": true, "pnpm-lock.yaml": true, "**/routeTree.gen.ts": true }, diff --git a/package.json b/package.json index c87267cb0..7de5ad054 100644 --- a/package.json +++ b/package.json @@ -56,10 +56,10 @@ "@sindresorhus/slugify": "^3.0.0", "@t3-oss/env-core": "^0.13.10", "@tanstack/react-query": "5.90.20", - "@tanstack/react-router": "^1.157.10", - "@tanstack/react-router-ssr-query": "^1.157.10", - "@tanstack/react-start": "^1.157.10", - "@tanstack/zod-adapter": "^1.157.10", + "@tanstack/react-router": "^1.157.12", + "@tanstack/react-router-ssr-query": "^1.157.12", + "@tanstack/react-start": "^1.157.12", + "@tanstack/zod-adapter": "^1.157.12", "@tiptap/extension-highlight": "^3.17.1", "@tiptap/extension-table": "^3.17.1", "@tiptap/extension-text-align": "^3.17.1", @@ -106,6 +106,7 @@ "unique-names-generator": "^4.7.1", "usehooks-ts": "^3.1.1", "uuid": "^13.0.0", + "workbox-window": "^7.4.0", "zod": "^4.3.6", "zustand": "^5.0.10" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bee4f5d4f..4ba06c69e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -28,7 +28,7 @@ importers: version: 1.5.0-beta.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.2.0(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0) '@better-auth/passkey': specifier: 1.5.0-beta.9 - version: 1.5.0-beta.9(9a182d577759169425d4368993c12167) + version: 1.5.0-beta.9(d2aaa815dcf4593a2d520c3aba86b038) '@dnd-kit/core': specifier: ^6.3.1 version: 6.3.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -87,17 +87,17 @@ importers: specifier: 5.90.20 version: 5.90.20(react@19.2.3) '@tanstack/react-router': - specifier: ^1.157.10 - version: 1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^1.157.12 + version: 1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-router-ssr-query': - specifier: ^1.157.10 - version: 1.157.10(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.3))(@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^1.157.12 + version: 1.157.12(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.3))(@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/react-start': - specifier: ^1.157.10 - version: 1.157.10(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)) + specifier: ^1.157.12 + version: 1.157.12(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)) '@tanstack/zod-adapter': - specifier: ^1.157.10 - version: 1.157.10(@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(zod@4.3.6) + specifier: ^1.157.12 + version: 1.157.12(@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(zod@4.3.6) '@tiptap/extension-highlight': specifier: ^3.17.1 version: 3.17.1(@tiptap/core@3.17.1(@tiptap/pm@3.17.1)) @@ -127,7 +127,7 @@ importers: version: 6.0.0 better-auth: specifier: 1.5.0-beta.9 - version: 1.5.0-beta.9(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.157.10(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)))(drizzle-kit@1.0.0-beta.9-e89174b)(drizzle-orm@1.0.0-beta.9-e89174b(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@types/mssql@9.1.9)(@types/pg@8.16.0)(mssql@11.0.1)(mysql2@3.15.3)(pg@8.17.2)(postgres@3.4.7)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)))(mongodb@7.0.0(socks@2.8.7))(mysql2@3.15.3)(pg@8.17.2)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + version: 1.5.0-beta.9(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.157.12(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)))(drizzle-kit@1.0.0-beta.9-e89174b)(drizzle-orm@1.0.0-beta.9-e89174b(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@types/mssql@9.1.9)(@types/pg@8.16.0)(mssql@11.0.1)(mysql2@3.15.3)(pg@8.17.2)(postgres@3.4.7)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)))(mongodb@7.0.0(socks@2.8.7))(mysql2@3.15.3)(pg@8.17.2)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -236,6 +236,9 @@ importers: uuid: specifier: ^13.0.0 version: 13.0.0 + workbox-window: + specifier: ^7.4.0 + version: 7.4.0 zod: specifier: ^4.3.6 version: 4.3.6 @@ -3921,8 +3924,8 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-router-ssr-query@1.157.10': - resolution: {integrity: sha512-3eKyqNUSAz1Ei6HJcgg4yZHIGYeyYJTb9/yvyg5iU1HYIeb3EGOZIrZUxYHqXbobAeV82ETW7vqpLqRFcq/2Zw==} + '@tanstack/react-router-ssr-query@1.157.12': + resolution: {integrity: sha512-BdfJCvoSQEWY25tb7pKBhZYQsV4rAMGHlJzY74YbhnAFbZNr22Ja3mf3wDLAyibnWt0M0x+DdJ81wxMqgN6Pzw==} engines: {node: '>=12'} peerDependencies: '@tanstack/query-core': '>=5.90.0' @@ -3931,29 +3934,29 @@ packages: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-router@1.157.10': - resolution: {integrity: sha512-WUUSoYNXlVCz4Y6+f3lOlBZWXDEHHFawVvBIYF4O8CZ6Bn1WO4PqGA5/5zv3G2dP6EflV3mblbrScSnFxNODsA==} + '@tanstack/react-router@1.157.12': + resolution: {integrity: sha512-1Z4Wk1YUu2bgjFmTNXgX40dZzOZ47aE0x/5wcdASo8HNSNobBTCq383CL1XN7dVzKVQTZ2alpWfG8C1EuOn2uA==} engines: {node: '>=12'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-client@1.157.10': - resolution: {integrity: sha512-7H+gsTNpeXDBTBQisKNBrpoNSBvWgYilLJjbfmJ4KTejkmgFSyYES/C72hSFukoXuibZ5X1XnIdtZrIrAIoN2Q==} + '@tanstack/react-start-client@1.157.12': + resolution: {integrity: sha512-fPxXFQ+Z8fB2PhGdv5kQSFsqKlDymjLtWVYRPxDc29E6CwidCiB/Gp8NTHyR686WAPrMyezn1C8MYFkn9xIl4g==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start-server@1.157.10': - resolution: {integrity: sha512-JzgsmlLH9rQbnemRt4YnJs4ujmoAzLO8KGKnqN93+B1ajfy8AfuiR+rKMTqjiCtM2m46l8Pu60vFylG3DeldXQ==} + '@tanstack/react-start-server@1.157.12': + resolution: {integrity: sha512-qMVzxxG89woSt9Qp0v90C7Pgv8M9lKe28fhd1wth3NStKm4GUV5kVtSBV6M95KmgNPh4/fkdLZZIiKEeR+HtMQ==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' react-dom: '>=18.0.0 || >=19.0.0' - '@tanstack/react-start@1.157.10': - resolution: {integrity: sha512-FsQyfh5qDTvk7kBQAwTIxBuEv0c6sqK/jHXpPISGi3bpWXLB3N6IpIRrVTwLulI9TsHoJuBPXQ+uzGzX7Nm7vg==} + '@tanstack/react-start@1.157.12': + resolution: {integrity: sha512-W2x51f650okbBxxSdcn1lzM1faKwRjuTCg18IQkbslAGQLBHMwnzXZrWSAPz5VJD3W3I7Cfg1SATyxVqs6tCkQ==} engines: {node: '>=22.12.0'} peerDependencies: react: '>=18.0.0 || >=19.0.0' @@ -3966,20 +3969,20 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/router-core@1.157.10': - resolution: {integrity: sha512-1Wxy7UIhZErreLy/ckEbJyi/7VjYSJC310IJM0YWPBlzOJD/qD0yS0+V7Lom9UxYi3VgFsSu/is0UxEedg1B2Q==} + '@tanstack/router-core@1.157.12': + resolution: {integrity: sha512-UiqJc5LjbEO2cN8pjwh689hZ10OP22CqP+RNC0ANXamRCjZINqLeKcQOc0uCk+po3U2rZ883+O8bVMo1bg4+Rg==} engines: {node: '>=12'} - '@tanstack/router-generator@1.157.10': - resolution: {integrity: sha512-gR2j8vKHNgHfWYs82kvso9iitPhlb71d+7eBmtwqozwCSnoO/3VWUaAN/VdiriFoWOYqIMpziYPmC6DwFuUV7A==} + '@tanstack/router-generator@1.157.12': + resolution: {integrity: sha512-sJMvsUFEYkr/FfYj8Z9vocuYII+0PjN5O/zI84PUXN//GZUHyoxfh/714IzVD6L9n5OWAHsdd17N21cMZqrJpQ==} engines: {node: '>=12'} - '@tanstack/router-plugin@1.157.10': - resolution: {integrity: sha512-reXAs2ncCxfeoN3qrBithmHYPYjTZnDjOP5k0PjUlxS9+XM0EE91wKPbn7/D6ZUIqWFBheRhPhAlyfYIy0CAVA==} + '@tanstack/router-plugin@1.157.12': + resolution: {integrity: sha512-/zmFVXR6/ZWjDqGG7TUte9gkS8JM0DGXt4Cu34GKrp7LZzMSAy9ODfbYa779i0jDzxRrcUIk+6yfTKuyJpnvDw==} engines: {node: '>=12'} peerDependencies: '@rsbuild/core': '>=1.0.2' - '@tanstack/react-router': ^1.157.10 + '@tanstack/react-router': ^1.157.12 vite: '>=5.0.0 || >=6.0.0 || >=7.0.0' vite-plugin-solid: ^2.11.10 webpack: '>=5.92.0' @@ -3995,8 +3998,8 @@ packages: webpack: optional: true - '@tanstack/router-ssr-query-core@1.157.10': - resolution: {integrity: sha512-Vo0U7zbSDDZJqOTcq/J0K2tEQv6cWdPfrRx1d9N31qve4eiFCo75RRMOoRMHQMTHR7vg8TVEMrVeqV3QmYOuGA==} + '@tanstack/router-ssr-query-core@1.157.12': + resolution: {integrity: sha512-fU3Gf4Dj2M8Vs3CpvGoNOULbU7mJrJSy9SQ80f4OmUCKC8hHFsTmn/ZYnIu1sJbQ7ZBt764AQ770Yj5yrWWQNA==} engines: {node: '>=12'} peerDependencies: '@tanstack/query-core': '>=5.90.0' @@ -4006,26 +4009,26 @@ packages: resolution: {integrity: sha512-61bGx32tMKuEpVRseu2sh1KQe8CfB7793Mch/kyQt0EP3tD7X0sXmimCl3truRiDGUtI0CaSoQV1NPjAII1RBA==} engines: {node: '>=12'} - '@tanstack/start-client-core@1.157.10': - resolution: {integrity: sha512-/b8bMTdjZasf97N6qgVA7ldlVbuEUFEFmrmQOTcZdmBmNpk1AnZdJffmBZzVK5wlNG85QR+F4txcZwL56kLZrQ==} + '@tanstack/start-client-core@1.157.12': + resolution: {integrity: sha512-0LF6SA2kb96hnPg8PEUd4WkCorQC13th4nfeu2Otmg0teT8tBFtbzi59ykeQXgQSDHEWH1KZxRsC3uJui6MVWw==} engines: {node: '>=22.12.0'} '@tanstack/start-fn-stubs@1.154.7': resolution: {integrity: sha512-D69B78L6pcFN5X5PHaydv7CScQcKLzJeEYqs7jpuyyqGQHSUIZUjS955j+Sir8cHhuDIovCe2LmsYHeZfWf3dQ==} engines: {node: '>=22.12.0'} - '@tanstack/start-plugin-core@1.157.10': - resolution: {integrity: sha512-ybw/KUCAogeZDHjRJrv1FNAjd4LQNiKs7l+NfN8i66DXnFu11rPG6K00GRZCr8NXUGl3jtcDyjgrwtVxbzl0tw==} + '@tanstack/start-plugin-core@1.157.12': + resolution: {integrity: sha512-MtB/dQlkoZ5PXG8w7VzdXYFn8VQD0Ldsvi+BA7LQxkgCopmN+47iudRjaJ3Ph/OqTan3thtDQtnTnnmncU/FbQ==} engines: {node: '>=22.12.0'} peerDependencies: vite: '>=7.0.0' - '@tanstack/start-server-core@1.157.10': - resolution: {integrity: sha512-BsfMgh+Yk+uzx1C4AQNEObnv7BX2X7Qj3IkKSKNlf7SJx8o5sSRcuUiKFf3l63Ggi67Fm2cA4o4hs5wMryw8XQ==} + '@tanstack/start-server-core@1.157.12': + resolution: {integrity: sha512-qTCxc7zTqTmwX/JeXVBZj09m3P0Rk38E90XsQ/ITIRpDIOdrSvoHGIb8mriJt+XyWVnGxwB5fOrVM8g9G/CPSw==} engines: {node: '>=22.12.0'} - '@tanstack/start-storage-context@1.157.10': - resolution: {integrity: sha512-FFIQCkjs1hmAUfi7hYtRsXQ9w0JBKcSha1urVyr/3MB/AyA9lnBmabRjYHJS41LFtXOLIwC3+n4nWAHsSyzDGQ==} + '@tanstack/start-storage-context@1.157.12': + resolution: {integrity: sha512-CfYUd7601500s19Jm4hIYUD8X+NqHf9CFI9RQP+v47OtLWkw1baKSTFrewt88tQk4iibGJM38giea3APCNp0Yg==} engines: {node: '>=22.12.0'} '@tanstack/store@0.8.0': @@ -4035,8 +4038,8 @@ packages: resolution: {integrity: sha512-cHHDnewHozgjpI+MIVp9tcib6lYEQK5MyUr0ChHpHFGBl8Xei55rohFK0I0ve/GKoHeioaK42Smd8OixPp6CTg==} engines: {node: '>=12'} - '@tanstack/zod-adapter@1.157.10': - resolution: {integrity: sha512-hzjSlgjL9rMFzjsfoLo4WqXRyktDW5OCUU6mw77KiIcUp8xubhSquM1NfvCpnnhTqoHh4G6JUP+JVebSvJ1IUQ==} + '@tanstack/zod-adapter@1.157.12': + resolution: {integrity: sha512-TmNZ1Io4yCM6No9zdIl5aPWhLXIITO8Rkm+S8UvqJyc6kMjf/LmSRkEU41QEjiUN8j/CdY3MqVaLkOi1TxRmMQ==} engines: {node: '>=12'} peerDependencies: '@tanstack/react-router': '>=1.43.2' @@ -9972,14 +9975,14 @@ snapshots: '@better-auth/utils': 0.3.0 mongodb: 7.0.0(socks@2.8.7) - '@better-auth/passkey@1.5.0-beta.9(9a182d577759169425d4368993c12167)': + '@better-auth/passkey@1.5.0-beta.9(d2aaa815dcf4593a2d520c3aba86b038)': dependencies: '@better-auth/core': 1.5.0-beta.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.2.0(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0) '@better-auth/utils': 0.3.0 '@better-fetch/fetch': 1.1.21 '@simplewebauthn/browser': 13.2.2 '@simplewebauthn/server': 13.2.2 - better-auth: 1.5.0-beta.9(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.157.10(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)))(drizzle-kit@1.0.0-beta.9-e89174b)(drizzle-orm@1.0.0-beta.9-e89174b(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@types/mssql@9.1.9)(@types/pg@8.16.0)(mssql@11.0.1)(mysql2@3.15.3)(pg@8.17.2)(postgres@3.4.7)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)))(mongodb@7.0.0(socks@2.8.7))(mysql2@3.15.3)(pg@8.17.2)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + better-auth: 1.5.0-beta.9(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.157.12(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)))(drizzle-kit@1.0.0-beta.9-e89174b)(drizzle-orm@1.0.0-beta.9-e89174b(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@types/mssql@9.1.9)(@types/pg@8.16.0)(mssql@11.0.1)(mysql2@3.15.3)(pg@8.17.2)(postgres@3.4.7)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)))(mongodb@7.0.0(socks@2.8.7))(mysql2@3.15.3)(pg@8.17.2)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) better-call: 1.2.0(zod@4.3.6) nanostores: 1.1.0 zod: 4.3.6 @@ -12647,59 +12650,59 @@ snapshots: '@tanstack/query-core': 5.90.20 react: 19.2.3 - '@tanstack/react-router-ssr-query@1.157.10(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.3))(@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.10)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-router-ssr-query@1.157.12(@tanstack/query-core@5.90.20)(@tanstack/react-query@5.90.20(react@19.2.3))(@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@tanstack/router-core@1.157.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/query-core': 5.90.20 '@tanstack/react-query': 5.90.20(react@19.2.3) - '@tanstack/react-router': 1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-ssr-query-core': 1.157.10(@tanstack/query-core@5.90.20)(@tanstack/router-core@1.157.10) + '@tanstack/react-router': 1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-ssr-query-core': 1.157.12(@tanstack/query-core@5.90.20)(@tanstack/router-core@1.157.12) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - '@tanstack/router-core' - '@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/history': 1.154.14 '@tanstack/react-store': 0.8.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.157.10 + '@tanstack/router-core': 1.157.12 isbot: 5.1.33 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-client@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-client@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: - '@tanstack/react-router': 1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.157.10 - '@tanstack/start-client-core': 1.157.10 + '@tanstack/react-router': 1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.157.12 + '@tanstack/start-client-core': 1.157.12 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/react-start-server@1.157.10(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@tanstack/react-start-server@1.157.12(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@tanstack/history': 1.154.14 - '@tanstack/react-router': 1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/router-core': 1.157.10 - '@tanstack/start-client-core': 1.157.10 - '@tanstack/start-server-core': 1.157.10(crossws@0.4.3(srvx@0.10.1)) + '@tanstack/react-router': 1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/router-core': 1.157.12 + '@tanstack/start-client-core': 1.157.12 + '@tanstack/start-server-core': 1.157.12(crossws@0.4.3(srvx@0.10.1)) react: 19.2.3 react-dom: 19.2.3(react@19.2.3) transitivePeerDependencies: - crossws - '@tanstack/react-start@1.157.10(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0))': + '@tanstack/react-start@1.157.12(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0))': dependencies: - '@tanstack/react-router': 1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-client': 1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@tanstack/react-start-server': 1.157.10(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-router': 1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-client': 1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-start-server': 1.157.12(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@tanstack/router-utils': 1.154.7 - '@tanstack/start-client-core': 1.157.10 - '@tanstack/start-plugin-core': 1.157.10(@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.3(srvx@0.10.1))(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)) - '@tanstack/start-server-core': 1.157.10(crossws@0.4.3(srvx@0.10.1)) + '@tanstack/start-client-core': 1.157.12 + '@tanstack/start-plugin-core': 1.157.12(@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.3(srvx@0.10.1))(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)) + '@tanstack/start-server-core': 1.157.12(crossws@0.4.3(srvx@0.10.1)) pathe: 2.0.3 react: 19.2.3 react-dom: 19.2.3(react@19.2.3) @@ -12718,7 +12721,7 @@ snapshots: react-dom: 19.2.3(react@19.2.3) use-sync-external-store: 1.6.0(react@19.2.3) - '@tanstack/router-core@1.157.10': + '@tanstack/router-core@1.157.12': dependencies: '@tanstack/history': 1.154.14 '@tanstack/store': 0.8.0 @@ -12728,9 +12731,9 @@ snapshots: tiny-invariant: 1.3.3 tiny-warning: 1.0.3 - '@tanstack/router-generator@1.157.10': + '@tanstack/router-generator@1.157.12': dependencies: - '@tanstack/router-core': 1.157.10 + '@tanstack/router-core': 1.157.12 '@tanstack/router-utils': 1.154.7 '@tanstack/virtual-file-routes': 1.154.7 prettier: 3.8.0 @@ -12741,7 +12744,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.157.10(@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0))': + '@tanstack/router-plugin@1.157.12(@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0))': dependencies: '@babel/core': 7.28.6 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.6) @@ -12749,8 +12752,8 @@ snapshots: '@babel/template': 7.28.6 '@babel/traverse': 7.28.6 '@babel/types': 7.28.6 - '@tanstack/router-core': 1.157.10 - '@tanstack/router-generator': 1.157.10 + '@tanstack/router-core': 1.157.12 + '@tanstack/router-generator': 1.157.12 '@tanstack/router-utils': 1.154.7 '@tanstack/virtual-file-routes': 1.154.7 babel-dead-code-elimination: 1.0.12 @@ -12758,15 +12761,15 @@ snapshots: unplugin: 2.3.11 zod: 3.25.76 optionalDependencies: - '@tanstack/react-router': 1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-router': 1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) vite: rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0) transitivePeerDependencies: - supports-color - '@tanstack/router-ssr-query-core@1.157.10(@tanstack/query-core@5.90.20)(@tanstack/router-core@1.157.10)': + '@tanstack/router-ssr-query-core@1.157.12(@tanstack/query-core@5.90.20)(@tanstack/router-core@1.157.12)': dependencies: '@tanstack/query-core': 5.90.20 - '@tanstack/router-core': 1.157.10 + '@tanstack/router-core': 1.157.12 '@tanstack/router-utils@1.154.7': dependencies: @@ -12780,29 +12783,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/start-client-core@1.157.10': + '@tanstack/start-client-core@1.157.12': dependencies: - '@tanstack/router-core': 1.157.10 + '@tanstack/router-core': 1.157.12 '@tanstack/start-fn-stubs': 1.154.7 - '@tanstack/start-storage-context': 1.157.10 + '@tanstack/start-storage-context': 1.157.12 seroval: 1.4.2 tiny-invariant: 1.3.3 tiny-warning: 1.0.3 '@tanstack/start-fn-stubs@1.154.7': {} - '@tanstack/start-plugin-core@1.157.10(@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.3(srvx@0.10.1))(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0))': + '@tanstack/start-plugin-core@1.157.12(@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(crossws@0.4.3(srvx@0.10.1))(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0))': dependencies: '@babel/code-frame': 7.27.1 '@babel/core': 7.28.6 '@babel/types': 7.28.6 '@rolldown/pluginutils': 1.0.0-beta.40 - '@tanstack/router-core': 1.157.10 - '@tanstack/router-generator': 1.157.10 - '@tanstack/router-plugin': 1.157.10(@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)) + '@tanstack/router-core': 1.157.12 + '@tanstack/router-generator': 1.157.12 + '@tanstack/router-plugin': 1.157.12(@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)) '@tanstack/router-utils': 1.154.7 - '@tanstack/start-client-core': 1.157.10 - '@tanstack/start-server-core': 1.157.10(crossws@0.4.3(srvx@0.10.1)) + '@tanstack/start-client-core': 1.157.12 + '@tanstack/start-server-core': 1.157.12(crossws@0.4.3(srvx@0.10.1)) babel-dead-code-elimination: 1.0.12 cheerio: 1.1.2 exsolve: 1.0.8 @@ -12822,29 +12825,29 @@ snapshots: - vite-plugin-solid - webpack - '@tanstack/start-server-core@1.157.10(crossws@0.4.3(srvx@0.10.1))': + '@tanstack/start-server-core@1.157.12(crossws@0.4.3(srvx@0.10.1))': dependencies: '@tanstack/history': 1.154.14 - '@tanstack/router-core': 1.157.10 - '@tanstack/start-client-core': 1.157.10 - '@tanstack/start-storage-context': 1.157.10 + '@tanstack/router-core': 1.157.12 + '@tanstack/start-client-core': 1.157.12 + '@tanstack/start-storage-context': 1.157.12 h3-v2: h3@2.0.1-rc.11(crossws@0.4.3(srvx@0.10.1)) seroval: 1.4.2 tiny-invariant: 1.3.3 transitivePeerDependencies: - crossws - '@tanstack/start-storage-context@1.157.10': + '@tanstack/start-storage-context@1.157.12': dependencies: - '@tanstack/router-core': 1.157.10 + '@tanstack/router-core': 1.157.12 '@tanstack/store@0.8.0': {} '@tanstack/virtual-file-routes@1.154.7': {} - '@tanstack/zod-adapter@1.157.10(@tanstack/react-router@1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(zod@4.3.6)': + '@tanstack/zod-adapter@1.157.12(@tanstack/react-router@1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(zod@4.3.6)': dependencies: - '@tanstack/react-router': 1.157.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@tanstack/react-router': 1.157.12(react-dom@19.2.3(react@19.2.3))(react@19.2.3) zod: 4.3.6 '@tediousjs/connection-string@0.5.0': {} @@ -13390,7 +13393,7 @@ snapshots: node-addon-api: 8.5.0 node-gyp-build: 4.8.4 - better-auth@1.5.0-beta.9(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.157.10(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)))(drizzle-kit@1.0.0-beta.9-e89174b)(drizzle-orm@1.0.0-beta.9-e89174b(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@types/mssql@9.1.9)(@types/pg@8.16.0)(mssql@11.0.1)(mysql2@3.15.3)(pg@8.17.2)(postgres@3.4.7)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)))(mongodb@7.0.0(socks@2.8.7))(mysql2@3.15.3)(pg@8.17.2)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3): + better-auth@1.5.0-beta.9(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@tanstack/react-start@1.157.12(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)))(drizzle-kit@1.0.0-beta.9-e89174b)(drizzle-orm@1.0.0-beta.9-e89174b(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@types/mssql@9.1.9)(@types/pg@8.16.0)(mssql@11.0.1)(mysql2@3.15.3)(pg@8.17.2)(postgres@3.4.7)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)))(mongodb@7.0.0(socks@2.8.7))(mysql2@3.15.3)(pg@8.17.2)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@better-auth/core': 1.5.0-beta.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.2.0(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0) '@better-auth/drizzle-adapter': 1.5.0-beta.9(@better-auth/core@1.5.0-beta.9(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.2.0(zod@4.3.6))(jose@6.1.3)(kysely@0.28.10)(nanostores@1.1.0))(@better-auth/utils@0.3.0)(drizzle-orm@1.0.0-beta.9-e89174b(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@types/mssql@9.1.9)(@types/pg@8.16.0)(mssql@11.0.1)(mysql2@3.15.3)(pg@8.17.2)(postgres@3.4.7)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))) @@ -13411,7 +13414,7 @@ snapshots: zod: 4.3.6 optionalDependencies: '@prisma/client': 7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3) - '@tanstack/react-start': 1.157.10(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)) + '@tanstack/react-start': 1.157.12(crossws@0.4.3(srvx@0.10.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(rolldown-vite@7.3.1(@types/node@25.0.10)(esbuild@0.27.2)(jiti@2.6.1)(terser@5.46.0)(tsx@4.21.0)) drizzle-kit: 1.0.0-beta.9-e89174b drizzle-orm: 1.0.0-beta.9-e89174b(@electric-sql/pglite@0.3.2)(@opentelemetry/api@1.9.0)(@prisma/client@7.2.0(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(typescript@5.9.3))(@types/mssql@9.1.9)(@types/pg@8.16.0)(mssql@11.0.1)(mysql2@3.15.3)(pg@8.17.2)(postgres@3.4.7)(prisma@7.2.0(@types/react@19.2.9)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)) mongodb: 7.0.0(socks@2.8.7) diff --git a/public/screenshots/mobile/1-landing-page.webp b/public/screenshots/mobile/1-landing-page.webp index 289a162e2..996275398 100644 Binary files a/public/screenshots/mobile/1-landing-page.webp and b/public/screenshots/mobile/1-landing-page.webp differ diff --git a/public/screenshots/mobile/2-resume-dashboard.webp b/public/screenshots/mobile/2-resume-dashboard.webp new file mode 100644 index 000000000..473c78520 Binary files /dev/null and b/public/screenshots/mobile/2-resume-dashboard.webp differ diff --git a/public/screenshots/mobile/2-resumes-dashboard.webp b/public/screenshots/mobile/2-resumes-dashboard.webp deleted file mode 100644 index 9ee104a03..000000000 Binary files a/public/screenshots/mobile/2-resumes-dashboard.webp and /dev/null differ diff --git a/public/screenshots/mobile/3-builder-page.webp b/public/screenshots/mobile/3-builder-page.webp deleted file mode 100644 index 6adb02f56..000000000 Binary files a/public/screenshots/mobile/3-builder-page.webp and /dev/null differ diff --git a/public/screenshots/mobile/3-builder-screen.webp b/public/screenshots/mobile/3-builder-screen.webp new file mode 100644 index 000000000..1679bcda5 Binary files /dev/null and b/public/screenshots/mobile/3-builder-screen.webp differ diff --git a/public/screenshots/mobile/4-template-gallery.webp b/public/screenshots/mobile/4-template-gallery.webp new file mode 100644 index 000000000..8ba305bab Binary files /dev/null and b/public/screenshots/mobile/4-template-gallery.webp differ diff --git a/public/screenshots/mobile/4-template-selector.webp b/public/screenshots/mobile/4-template-selector.webp deleted file mode 100644 index 40cfbdef0..000000000 Binary files a/public/screenshots/mobile/4-template-selector.webp and /dev/null differ diff --git a/public/screenshots/web/1-landing-page.webp b/public/screenshots/web/1-landing-page.webp index 92b70041e..2d3b18d87 100644 Binary files a/public/screenshots/web/1-landing-page.webp and b/public/screenshots/web/1-landing-page.webp differ diff --git a/public/screenshots/web/2-resume-dashboard.webp b/public/screenshots/web/2-resume-dashboard.webp new file mode 100644 index 000000000..506289bd2 Binary files /dev/null and b/public/screenshots/web/2-resume-dashboard.webp differ diff --git a/public/screenshots/web/2-resumes-dashboard.webp b/public/screenshots/web/2-resumes-dashboard.webp deleted file mode 100644 index 14b965466..000000000 Binary files a/public/screenshots/web/2-resumes-dashboard.webp and /dev/null differ diff --git a/public/screenshots/web/3-builder-page.webp b/public/screenshots/web/3-builder-page.webp deleted file mode 100644 index 568c90357..000000000 Binary files a/public/screenshots/web/3-builder-page.webp and /dev/null differ diff --git a/public/screenshots/web/3-builder-screen.webp b/public/screenshots/web/3-builder-screen.webp new file mode 100644 index 000000000..cdaaf232c Binary files /dev/null and b/public/screenshots/web/3-builder-screen.webp differ diff --git a/public/screenshots/web/4-template-gallery.webp b/public/screenshots/web/4-template-gallery.webp new file mode 100644 index 000000000..35c646f2c Binary files /dev/null and b/public/screenshots/web/4-template-gallery.webp differ diff --git a/public/screenshots/web/4-template-selector.webp b/public/screenshots/web/4-template-selector.webp deleted file mode 100644 index 7bada5638..000000000 Binary files a/public/screenshots/web/4-template-selector.webp and /dev/null differ diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx index 6bb0e2c98..1eeceed2f 100644 --- a/src/components/ui/dialog.tsx +++ b/src/components/ui/dialog.tsx @@ -53,7 +53,7 @@ function DialogContent({ className, children, ...props }: DialogContentProps) { { - const resume = await context.queryClient.ensureQueryData( - orpc.resume.getBySlug.queryOptions({ input: { username, slug } }), - ); + try { + // Ignore .well-known requests + if (username === ".well-known") throw notFound(); - return { resume }; + const resume = await context.queryClient.ensureQueryData( + orpc.resume.getBySlug.queryOptions({ input: { username, slug } }), + ); + + return { resume }; + } catch { + throw notFound(); + } }, head: ({ loaderData }) => ({ meta: [{ title: loaderData ? `${loaderData.resume.name} - Reactive Resume` : "Reactive Resume" }], diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx index cc5d47e4e..1854b4284 100644 --- a/src/routes/__root.tsx +++ b/src/routes/__root.tsx @@ -48,9 +48,11 @@ export const Route = createRootRouteWithContext()({ links: [ { rel: "stylesheet", href: appCss }, // Icons - { rel: "icon", href: "/favicon.svg", type: "image/svg+xml", sizes: "any" }, - { rel: "icon", href: "/favicon.ico", type: "image/x-icon", sizes: "48x48" }, - { rel: "apple-touch-icon", href: "/apple-touch-icon-180x180.png", type: "image/png", sizes: "180x180" }, + { rel: "icon", href: "/favicon.ico", type: "image/x-icon", sizes: "128x128" }, + { rel: "icon", href: "/favicon.svg", type: "image/svg+xml", sizes: "256x256 any" }, + { rel: "apple-touch-icon", href: "/apple-touch-icon-180x180.png", type: "image/png", sizes: "180x180 any" }, + // Manifest + { rel: "manifest", href: "/manifest.webmanifest", crossOrigin: "use-credentials" }, ], meta: [ { title }, @@ -69,6 +71,18 @@ export const Route = createRootRouteWithContext()({ { property: "og:description", content: description }, { property: "og:url", content: appUrl }, ], + // Register service worker via script tag + scripts: [ + { + children: ` + if('serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker.register('/sw.js', { scope: '/' }) + }) + } + `, + }, + ], }; }, beforeLoad: async () => { diff --git a/src/utils/locale.ts b/src/utils/locale.ts index bb013f0db..9b38fca8c 100644 --- a/src/utils/locale.ts +++ b/src/utils/locale.ts @@ -1,10 +1,8 @@ import { i18n, type MessageDescriptor, type Messages } from "@lingui/core"; import { msg } from "@lingui/core/macro"; -import { useLingui } from "@lingui/react"; import { createIsomorphicFn, createServerFn } from "@tanstack/react-start"; import { getCookie, setCookie } from "@tanstack/react-start/server"; import Cookies from "js-cookie"; -import { useMemo } from "react"; import z from "zod"; const localeSchema = z.union([ @@ -146,12 +144,6 @@ export function isRTL(locale: string): boolean { return RTL_LANGUAGES.has(language); } -export function useIsRTL() { - const { i18n } = useLingui(); - - return useMemo(() => isRTL(i18n.locale), [i18n.locale]); -} - export const getLocale = createIsomorphicFn() .client(() => { const locale = Cookies.get(storageKey); diff --git a/vite.config.ts b/vite.config.ts index 68c2db1ed..a240d35f1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -70,16 +70,19 @@ const config = defineConfig({ tailwindcss(), nitro({ plugins: ["plugins/1.migrate.ts"] }), tanstackStart({ router: { semicolons: true, quoteStyle: "double" } }), - viteReact({ babel: { plugins: [["@lingui/babel-plugin-lingui-macro"]] } }), + viteReact({ babel: { plugins: ["@lingui/babel-plugin-lingui-macro"] } }), VitePWA({ outDir: "public", - registerType: "autoUpdate", + useCredentials: true, + injectRegister: false, includeAssets: ["**/*"], + registerType: "autoUpdate", workbox: { - globPatterns: ["**/*"], + skipWaiting: true, clientsClaim: true, - cleanupOutdatedCaches: true, + globPatterns: ["**/*"], maximumFileSizeToCacheInBytes: 10 * 1024 * 1024, // 10mb + navigateFallback: null, // Disable navigation fallback for SSR }, manifest: { name: "Reactive Resume", @@ -94,7 +97,7 @@ const config = defineConfig({ icons: [ { src: "favicon.ico", - sizes: "48x48", + sizes: "128x128", type: "image/x-icon", }, { @@ -123,59 +126,59 @@ const config = defineConfig({ screenshots: [ { src: "screenshots/web/1-landing-page.webp", - sizes: "any", + sizes: "1920x1080 any", type: "image/webp", form_factor: "wide", label: "Landing Page", }, { - src: "screenshots/web/2-resumes-dashboard.webp", - sizes: "any", + src: "screenshots/web/2-resume-dashboard.webp", + sizes: "1920x1080 any", type: "image/webp", form_factor: "wide", - label: "Resumes Dashboard", + label: "Resume Dashboard", }, { - src: "screenshots/web/3-builder-page.webp", - sizes: "any", + src: "screenshots/web/3-builder-screen.webp", + sizes: "1920x1080 any", type: "image/webp", form_factor: "wide", - label: "Builder Page", + label: "Builder Screen", }, { - src: "screenshots/web/4-template-selector.webp", - sizes: "any", + src: "screenshots/web/4-template-gallery.webp", + sizes: "1920x1080 any", type: "image/webp", form_factor: "wide", - label: "Template Selector", + label: "Template Gallery", }, { src: "screenshots/mobile/1-landing-page.webp", - sizes: "any", + sizes: "1284x2778 any", type: "image/webp", form_factor: "narrow", label: "Landing Page", }, { - src: "screenshots/mobile/2-resumes-dashboard.webp", - sizes: "any", + src: "screenshots/mobile/2-resume-dashboard.webp", + sizes: "1284x2778 any", type: "image/webp", form_factor: "narrow", - label: "Resumes Dashboard", + label: "Resume Dashboard", }, { - src: "screenshots/mobile/3-builder-page.webp", - sizes: "any", + src: "screenshots/mobile/3-builder-screen.webp", + sizes: "1284x2778 any", type: "image/webp", form_factor: "narrow", - label: "Builder Page", + label: "Builder Screen", }, { - src: "screenshots/mobile/4-template-selector.webp", - sizes: "any", + src: "screenshots/mobile/4-template-gallery.webp", + sizes: "1284x2778 any", type: "image/webp", form_factor: "narrow", - label: "Template Selector", + label: "Template Gallery", }, ], categories: [