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:
@@ -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>
|
||||
36
src/lib/components/ui/landing/LandingHero.svelte
Normal file
36
src/lib/components/ui/landing/LandingHero.svelte
Normal 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>
|
||||
Reference in New Issue
Block a user