From b70ad6bc86571ede77f24629accb2fd71bad4235 Mon Sep 17 00:00:00 2001 From: Andrew Novac <16753077+novatorem@users.noreply.github.com> Date: Sun, 15 Mar 2026 09:18:07 -0400 Subject: [PATCH 1/7] =?UTF-8?q?I=20know,=20I=20know,=20this=20is=20not=20h?= =?UTF-8?q?ow=20I=E2=80=99m=20supposed=20to=20do=20it,=20but=20I=20can't?= =?UTF-8?q?=20think=20of=20something=20better.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 28 + .prettierrc | 31 +- CLAUDE.md | 50 + src/app.css | 98 +- src/app.d.ts | 42 +- src/app.html | 2 + src/database.types.ts | 292 +-- src/hooks.server.ts | 262 +- src/lib/dashboard/GettingStarted.svelte | 129 + src/lib/dashboard/loader.ts | 581 ++--- src/lib/friends/api.ts | 162 +- src/lib/friends/components/DeleteModal.svelte | 79 +- src/lib/friends/components/List.svelte | 827 +++--- .../friends/components/ListSkeleton.svelte | 64 +- src/lib/friends/components/Requests.svelte | 888 ++++--- .../components/RequestsSkeleton.svelte | 58 +- src/lib/friends/order.test.ts | 222 +- src/lib/friends/order.ts | 166 +- src/lib/profile/api.ts | 50 +- src/lib/profile/validation.test.ts | 224 +- src/lib/profile/validation.ts | 98 +- src/lib/realtime/subscriptions.ts | 334 +-- src/lib/status/components/Section.svelte | 232 +- src/lib/status/components/Skeleton.svelte | 38 +- src/lib/status/formatting.test.ts | 128 +- src/lib/status/formatting.ts | 76 +- src/lib/status/quick.test.ts | 220 +- src/lib/status/quick.ts | 132 +- src/lib/status/validation.test.ts | 44 +- src/lib/status/validation.ts | 16 +- src/lib/ui/DebugPanel.svelte | 532 ++-- src/lib/ui/DotGridBackground.svelte | 165 +- src/lib/ui/Footer.svelte | 82 +- src/lib/ui/Navigation.svelte | 201 +- src/lib/ui/RelativeTime.svelte | 45 +- src/lib/ui/ThemeSelect.svelte | 200 +- src/lib/ui/Toast.svelte | 92 +- src/lib/ui/ToastContainer.svelte | 20 +- src/lib/ui/notifications.ts | 58 +- src/lib/ui/now.svelte.ts | 23 + src/lib/ui/themes.ts | 74 +- src/lib/ui/toast.ts | 82 +- src/routes/+layout.server.ts | 18 +- src/routes/+layout.svelte | 151 +- src/routes/+layout.ts | 62 +- src/routes/+page.svelte | 168 +- src/routes/auth/+layout.svelte | 17 +- src/routes/auth/+page.server.ts | 148 +- src/routes/auth/+page.svelte | 997 +++---- src/routes/auth/confirm/+server.ts | 62 +- src/routes/auth/error/+page.svelte | 168 +- src/routes/auth/logout/+server.ts | 58 +- .../auth/reset-password/+page.server.ts | 18 +- src/routes/auth/reset-password/+page.svelte | 424 +-- src/routes/dashboard/+layout.server.ts | 32 +- src/routes/dashboard/+layout.svelte | 24 +- src/routes/dashboard/+page.server.ts | 30 +- src/routes/dashboard/+page.svelte | 632 ++--- src/routes/dashboard/settings/+page.server.ts | 18 +- src/routes/dashboard/settings/+page.svelte | 2323 ++++++++--------- tsconfig.json | 38 +- vite.config.ts | 22 +- 62 files changed, 6444 insertions(+), 6113 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 CLAUDE.md create mode 100644 src/lib/dashboard/GettingStarted.svelte create mode 100644 src/lib/ui/now.svelte.ts diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..5bae4ff --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,28 @@ +{ + "permissions": { + "allow": [ + "Bash(python3:*)", + "Bash(cd \"C:/Projects/rez\" && npm run check 2>&1)", + "Bash(cd \"C:/Projects/rez\" && npx svelte-kit sync && npx svelte-check --tsconfig ./tsconfig.json 2>&1)", + "Bash(cd \"C:/Projects/rez\" && node_modules/.bin/svelte-kit sync && node_modules/.bin/svelte-check --tsconfig ./tsconfig.json 2>&1)", + "Bash(which node:*)", + "Bash(tail:*)", + "Bash(cd \"C:/Projects/rez\" && node_modules/.bin/svelte-kit sync 2>&1 && node_modules/.bin/svelte-check --tsconfig ./tsconfig.json 2>&1)", + "Bash(cd C:/Projects/rez && node_modules/.bin/svelte-kit sync && node_modules/.bin/svelte-check --tsconfig ./tsconfig.json 2>&1)", + "Bash(cd C:/Projects/rez && npx --yes npm-check-updates --upgrade 2>&1)", + "Bash(cd C:/Projects/rez && npm install 2>&1)", + "Bash(cd C:/Projects/rez && npm audit 2>&1)", + "Bash(cd C:/Projects/rez && npm run build 2>&1)", + "Bash(npm view svelte-boring-avatars versions --json 2>&1 | python3 -c \"import sys,json; vs=json.load\\(sys.stdin\\); print\\('All versions:', vs[-5:]\\)\" && npm view svelte-boring-avatars dist-tags 2>&1)", + "Bash(find /c/Projects/rez/src -type f | grep -E \"\\\\.\\(svelte|ts|tsx|js|jsx|css\\)$\" | sort)", + "Bash(find /c/Projects/rez -maxdepth 2 -type f -name \"*.md\" -o -name \"*.json\" -o -name \"*.config.*\" 2>/dev/null | head -20)", + "Bash(ls -la /c/Projects/rez/*.config.* 2>/dev/null)", + "Bash(find /c/Projects/rez -maxdepth 1 -type f -name \"*config*\" | grep -E \"\\\\.\\(ts|js|mjs|cjs\\)$\")", + "Bash(find /c/Projects/rez/src/routes -type f -name \"*.svelte\" | xargs ls -la)" + ] + }, + "enabledPlugins": { + "impeccable@impeccable": true, + "frontend-design@claude-plugins-official": true + } +} diff --git a/.prettierrc b/.prettierrc index 7ebb855..7317c54 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,15 +1,16 @@ -{ - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] -} +{ + "useTabs": false, + "tabWidth": 2, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..7375e1d --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,50 @@ +# Rez — Claude Guidelines + +## Project Overview + +**Rez (Rezonate)** is a lightweight, real-time social status app. Users post brief status messages (max 42 characters) so a small circle of close friends knows what they're up to right now. It's privacy-first (friend-only, no public feed), installable as a PWA, and supports 35 DaisyUI themes. + +## Tech Stack + +- **Framework:** SvelteKit 2 + Svelte 5 (rune-based: `$state`, `$derived`, `$effect`, `$props`, `$bindable`) +- **Styling:** Tailwind CSS v4 + DaisyUI v5 (all 35 themes enabled) +- **Backend:** Supabase (PostgreSQL, Auth, Realtime) +- **Language:** TypeScript +- **Build:** Vite 7 + +## Code Conventions + +- **Indentation:** 2 spaces (no tabs) — `.prettierrc` enforces this +- **Components:** Svelte 5 runes only (no legacy Options API / stores except `toastStore`) +- **Animations:** Centralized in `src/app.css` — easing tokens (`--ease-out-quart`, `--ease-out-expo`), keyframes, and utility classes. Do not define duplicate keyframes in component ` + + +
@{friend.username}
+ {/if} ++ {friend.status} +
+ {#if friend.status_updated_at} + + + + {#if expandedTimestampId === friend.id} ++ {formatStatusUpdatedAtTooltip(friend.status_updated_at)} +
+ {/if} + {/if} +No status
+ {/if} + {/key} +No friends yet
++ Search for friends by username in the panel below. +
++ Ask your friend for their username — they can find it in Settings. +
+ + {#if (!friendRequests || friendRequests.length === 0) && (!sentFriendRequests || sentFriendRequests.length === 0)} ++ No pending requests. Enter a username above to find someone. +
+ {/if} + + {#if friendRequests && friendRequests.length > 0} +{currentStatus}
-{currentStatus}
+Platform: {isIOS ? 'iOS' : 'Other'}
-User Agent: {navigator.userAgent}
-URL: {window.location.href}
-Cookies Enabled: {navigator.cookieEnabled ? 'Yes' : 'No'}
-- Local Storage: - {typeof Storage !== 'undefined' ? 'Available' : 'Not Available'} -
-No logs yet...
- {:else} - {#each logs as log, index (index)} -{log.message}
- {#if log.data} -{JSON.stringify(
- log.data,
- null,
- 2
- )}
- About Debug Mode:
-- When enabled, the debug panel will always be visible (even when there are no errors). - This is useful for developers or when troubleshooting issues. The setting is saved in - your browser's local storage. -
-Platform: {isIOS ? 'iOS' : 'Other'}
+User Agent: {navigator.userAgent}
+URL: {window.location.href}
+Cookies Enabled: {navigator.cookieEnabled ? 'Yes' : 'No'}
++ Local Storage: + {typeof Storage !== 'undefined' ? 'Available' : 'Not Available'} +
+No logs yet...
+ {:else} + {#each logs as log, index (index)} +{log.message}
+ {#if log.data} +{JSON.stringify(
+ log.data,
+ null,
+ 2
+ )}
+ About Debug Mode:
++ When enabled, the debug panel will always be visible (even when there are no errors). + This is useful for developers or when troubleshooting issues. The setting is saved in + your browser's local storage. +
+- Connect to people. Stay up to date. Always in the know. -
-+ Rezonate +
+ + ++ Real-time status for the people who matter. +
+ + +- New user? - -
- - {:else if view === 'signup'} -- Already have an account? - -
- - {:else if view === 'forgotPassword'} -- -
- {/if} -Rezonate
++ New to Rez? + +
+ + {:else if view === 'signup'} ++ Already have an account? + +
+ + {:else if view === 'forgotPassword'} ++ Enter your email and we'll send you a reset link. +
+ + {#if forgotPasswordSuccess} ++ +
+ {/if} + +{errorMessage}
- {/if} - {#if errorCode} -Error Code: {errorCode}
- {/if} -- There was a problem with your sign-in attempt. This could be due to: -
- -{errorMessage}
+ {/if} + {#if errorCode} +Error Code: {errorCode}
+ {/if} ++ There was a problem with your sign-in attempt. This could be due to: +
+ +- This password reset link has expired or is invalid. Please request a new one. -
- - Back to Sign In - - {:else} -- Enter your new password below. -
- - {#if error} -+ This password reset link has expired or is invalid. Please request a new one. +
+ + Back to Sign In + + {:else} ++ Enter your new password below. +
+ + {#if error} +- Manage your account preferences and application settings. -
-- Current username: {currentUsername} -
-- Current display name: {currentDisplayName} -
-- Current email: {session?.user?.email || ''} -
-- Set up to 5 pre-defined statuses for quick selection from the dashboard. -
- - {#if isLoadingData} -- This action cannot be undone. This will permanently delete your account and remove all data - from our servers. -
-+ Update your profile, security, and appearance. +
++ Current username: {currentUsername} +
++ Current display name: {currentDisplayName} +
++ Current email: {session?.user?.email || ''} +
++ Save statuses you use often — they'll appear as one-tap options on your dashboard. +
+ + {#if isLoadingData} +