diff --git a/frontend/src/lib/components/CheckboxGrid.svelte b/frontend/src/lib/components/CheckboxGrid.svelte new file mode 100644 index 0000000..db3322a --- /dev/null +++ b/frontend/src/lib/components/CheckboxGrid.svelte @@ -0,0 +1,217 @@ + + +
+ {#if mounted} +
+ {#each Array(gridRows()) as _, i} + {#each Array(columns) as _, j} + {@const di = i + gridStart()} + {@const cellRotation = getCellRotation(di, j)} + {@const rowOffset = getRowOffset(di)} + {@const opacity = getCellOpacity(di, j, phase)} + {@const cellTickColor = getTickColor(di, j)} + {@const cellBoxColor = getBoxColor(di, j)} + {@const boxRadius = getBoxRadius(di, j)} +
+ + + {#if opacity > 0.5} + + {/if} + +
+ {/each} + {/each} +
+ {/if} +
+ + diff --git a/frontend/src/lib/components/index.ts b/frontend/src/lib/components/index.ts index 69c0e97..8887ba6 100644 --- a/frontend/src/lib/components/index.ts +++ b/frontend/src/lib/components/index.ts @@ -12,3 +12,4 @@ export { default as Chat } from './Chat.svelte'; export { default as AuthShell } from './AuthShell.svelte'; export { default as NoticeDialog } from './NoticeDialog.svelte'; export { default as PricingPlans } from './PricingPlans.svelte'; +export { default as CheckboxGrid } from './CheckboxGrid.svelte'; diff --git a/frontend/src/routes/+page.svelte b/frontend/src/routes/+page.svelte index 060308f..76d6c75 100644 --- a/frontend/src/routes/+page.svelte +++ b/frontend/src/routes/+page.svelte @@ -4,6 +4,7 @@ import FamDone from '$lib/components/FamDone.svelte'; import { homeIcon, checkCircleIcon, chevronRightIcon } from '$lib/components/icons'; import { readShortcut, shortcutTarget, type Shortcut } from '$lib/shortcut'; + import CheckboxGrid from '$lib/components/CheckboxGrid.svelte'; let shortcut = $state<(Shortcut & { target: string }) | null>(null); @@ -30,12 +31,13 @@ {shortcut.famName} - Jump back in {@html chevronRightIcon} + Jump back in {/if}
+
The family chore app

@@ -273,6 +275,7 @@ color: #eef2ff; padding: 6rem 1.5rem; text-align: center; + clip-path: inset(0); } .hero::before, .hero::after { @@ -287,7 +290,7 @@ height: 480px; top: -180px; left: -120px; - background: rgba(67, 56, 202, 0.55); + background: midnightblue; } .hero::after { width: 420px; @@ -341,21 +344,19 @@ } .hero-cta { display: inline-block; - background: #f59e0b; + background: springgreen; color: #1e1b4b; text-decoration: none; font-weight: 700; font-size: 1rem; padding: 0.8rem 1.75rem; border-radius: 999px; - box-shadow: 0 6px 20px rgba(245, 158, 11, 0.35); transition: transform 0.15s, box-shadow 0.15s; } .hero-cta:hover { transform: translateY(-2px); - box-shadow: 0 10px 28px rgba(245, 158, 11, 0.45); } .hero-cta-ghost { display: inline-block;