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)}
+
+
+
+ {/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;