feat: add root page design

* feat: add options/map flow, dev seed, and artwork fixes

Options page, Kakao map with florist order message, dev tooling, and
create/message dummy gating — without secrets in .env.example.

Co-authored-by: Cursor <cursoragent@cursor.com>

* with generating page + art work

* with flower images

* with route page

* route page loop

---------

Co-authored-by: 이지은 <ijieun@ijieun-ui-MacBookPro.local>
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Chaewon Lee
2026-06-14 17:16:14 +09:00
committed by GitHub
parent 10881ded29
commit 4b27c82036
10 changed files with 348 additions and 11 deletions

View File

@@ -0,0 +1,59 @@
<script>
import { onMount } from 'svelte';
import {
LANDING_CYCLE_MS,
LANDING_GROWTH_STAGES,
LANDING_STAGE_REVEAL_MS
} from '$lib/landing/landingGrowthStages.js';
let cycle = $state(0);
let reducedMotion = $state(false);
onMount(() => {
reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (reducedMotion) return;
const timer = window.setInterval(() => {
cycle += 1;
}, LANDING_CYCLE_MS);
return () => {
window.clearInterval(timer);
};
});
</script>
<div class="growth-metaphor w-full" aria-hidden="true">
<div class="flex w-full items-end justify-between gap-2 sm:gap-4">
{#each LANDING_GROWTH_STAGES as stage (`${cycle}-${stage.id}`)}
<img
src={stage.src}
alt=""
class={[
'w-auto shrink-0 object-contain object-bottom',
stage.heightClass,
reducedMotion ? 'opacity-100' : 'stage-reveal'
]}
style={`--stage-delay: ${stage.delayMs}ms; --stage-duration: ${LANDING_STAGE_REVEAL_MS}ms;`}
/>
{/each}
</div>
<div class="h-px w-full bg-ink" aria-hidden="true"></div>
</div>
<style>
.stage-reveal {
opacity: 0;
transform: translateY(0.5rem);
animation: stage-reveal var(--stage-duration, 680ms) ease-out forwards;
animation-delay: var(--stage-delay, 0ms);
}
@keyframes stage-reveal {
to {
opacity: 1;
transform: translateY(0);
}
}
</style>

View File

@@ -0,0 +1,36 @@
<script>
import { goto } from '$app/navigation';
import { resolve } from '$app/paths';
import Button from '$lib/components/ui/Button.svelte';
import GrowthMetaphorIllustration from '$lib/components/ui/landing/GrowthMetaphorIllustration.svelte';
function handleStart() {
goto(resolve('/create'));
}
</script>
<section
class="relative flex min-h-dvh flex-col bg-surface px-6 py-8 font-sans text-ink sm:px-10 sm:py-10 lg:px-14"
aria-label="Every bouquet starts with a muse — seed to bouquet growth metaphor"
>
<div class="mx-auto flex w-full max-w-6xl min-h-0 flex-1 flex-col justify-center">
<GrowthMetaphorIllustration />
<p class="mt-3 text-left text-sm tracking-[0.18em] text-muted sm:mt-4 sm:text-base">
Every Bouquet Starts with a Muse
</p>
</div>
<div class="mx-auto flex w-full max-w-6xl items-end justify-between gap-6 pb-2 pt-10">
<div class="min-w-0 text-left">
<p class="text-lg leading-none tracking-wide text-ink">AI Florist</p>
<h1 class="mt-2 text-4xl leading-none font-bold tracking-wide sm:text-5xl lg:text-6xl">
DearYou
</h1>
</div>
<div class="shrink-0 pb-1">
<Button onclick={handleStart}>start creating</Button>
</div>
</div>
</section>