```preset-meta
{
"name": "daisy-days",
"label": "Daisy Days",
"fingerprint": {
"shadow": "hard-offset-charcoal",
"border": "thick-charcoal-rounded",
"type": "rounded-display",
"decoration": "hand-drawn-sticker",
"mood": "storybook-pastel",
"motion": "bounce-and-settle"
},
"match_signals": [
{ "kind": "shadow_zero_blur", "weight": 0.3 },
{ "kind": "thick_solid_border", "weight": 0.25 },
{ "kind": "low_saturation", "weight": 0.2 },
{ "kind": "bouncy_easing", "weight": 0.1 }
],
"best_for": ["educational content", "wellness", "community workshops", "creator portfolios", "friendly internal kickoffs"],
"avoid_for": ["enterprise compliance", "financial precision", "security", "authority-first contexts"],
"chromeFonts": {
"googleFontsHref": "https://fonts.googleapis.com/css2?family=Fredoka+One&family=Quicksand:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap",
"display": "Fredoka One",
"body": "Quicksand",
"script": "Fredoka One",
"mono": "JetBrains Mono"
}
}
```
> `chromeFonts` makes the design.html doc chrome render in the preset's native fonts (Fredoka One + Quicksand); brand fonts still apply to §6 component code. The `script` slot also points at Fredoka — the storybook voice refuses a third face.
## §A Director's intent
Daisy Days is a **cheerful, storybook-pastel system**. Every container is a rounded card with a thick charcoal outline (3px) and a hard offset shadow (6px / 6px / 0), and every region is wreathed in hand-drawn SVG ornaments — daisies, stars, suns, clouds, rainbows — that cluster at the corners and crop past the edges. Type pairs a chubby rounded display face with a friendly humanist sans; surfaces alternate between cream and saturated pastels (turquoise, soft-pink, butter, mint, lavender, peach, sky). The single accent — coral — is reserved for small high-attention markers, never as a surface.
Voice is **warm and informal**: short sentence fragments, sentence case, no shouting. Motion is **bounce-and-settle**: things hop in with a mild overshoot, ornaments breathe and twinkle, exits are quick and clean. Use `dc-` as the CSS class prefix to namespace components.
## §B Decoration tokens
```css
/* Hard offset shadow + chunky borders — the system's signature elevation.
All borders/shadows use var(--ink) directly; site DNA's ink carries it. */
--border-bold: 3px solid var(--ink);
--border-thin: 2px solid var(--ink);
--shadow-card: 6px 6px 0 var(--ink);
--shadow-small: 4px 4px 0 var(--ink);
--shadow-text-bold: 3px 3px 0 var(--ink);
--shadow-text-soft: 3px 3px 0 color-mix(in srgb, var(--ink) 20%, transparent);
/* Generous radii — there are no square corners in this system */
--radius-card: 20px;
--radius-card-lg: 28px;
--radius-pill: 50px;
/* Spacing */
--gap-card: 1.5vw;
--gap-grid: 1.25vw;
--pad-card-lg: 2.4vw 2.8vw;
--pad-card-md: 1.6vw 2vw;
--pad-card-sm: 0.8vw 1.2vw;
/* Surface alternates — each is a low-opacity tint over the brand palette so any
brand still produces a pastel-garden surface. Falls back cleanly when the
site's accent palette is itself pastel.
§8.2 exception: pastel/butter/blush/sky anchors are technical hue anchors,
declared once here so every surface/sticker mix produces a storybook tone
regardless of brand DNA. Without these anchors, dark or saturated brands
would produce dark pastels — breaking the storybook register. */
--anchor-cream: #fffaf0; /* off-white pastel anchor for surfaces */
--anchor-warm-cream: #f5f0e6; /* warmer cream for canvas wash */
--anchor-butter: #fde68a; /* butter-yellow sticker anchor */
--anchor-sky: #a8d8f0; /* sky-blue sticker anchor */
--anchor-blush: #f7c8d4; /* blush-pink sticker anchor */
--anchor-mint: #a8e6cf; /* mint-green sticker anchor */
--anchor-lavender: #d4a5e8; /* lavender sticker anchor */
--anchor-peach: #ffcba4; /* peach sticker anchor */
--anchor-teal: #7ecdc0; /* deep-teal sticker anchor */
--anchor-paper: #ffffff; /* pure white — card surface + white text on saturated fills */
--surface-pastel-primary: color-mix(in srgb, var(--brand-primary) 32%, var(--anchor-cream));
--surface-pastel-secondary: color-mix(in srgb, var(--brand-secondary) 30%, var(--anchor-cream));
--surface-pastel-accent: color-mix(in srgb, var(--brand-accent) 28%, var(--anchor-cream));
--surface-cream: color-mix(in srgb, var(--canvas) 78%, var(--anchor-warm-cream));
/* Sticker tints — used for ornament fills so daisies/stars re-color with brand */
--sticker-warm: color-mix(in srgb, var(--brand-primary) 50%, var(--anchor-butter));
--sticker-cool: color-mix(in srgb, var(--brand-accent) 50%, var(--anchor-sky));
--sticker-soft: color-mix(in srgb, var(--brand-secondary) 45%, var(--anchor-blush));
/* SVG stroke (used inline on ornaments) */
--sticker-stroke: var(--ink);
--sticker-stroke-w: 2.1px;
```
## §D Font pairing fallback
- **display**: `'Fredoka One'` · `'Fredoka'` wght 600 · `'Baloo 2'` wght 700
- **body**: `'Quicksand'` wght 500 · `'Nunito'` wght 500 · `'Comfortaa'` wght 500
- **mono**: `'JetBrains Mono'` wght 500 · `'IBM Plex Mono'` wght 500
## §T Type-role atlas (Phase 4b reads this to size text correctly)
The atlas is the **sole authoring source** for non-component text. If a scene needs a `number-hero` numeral that isn't covered by §6 components, the worker reads role `number-hero` here and writes inline CSS from these values. Do NOT invent ad-hoc sizes — every role floors at 24px and the Fredoka/Quicksand families split the ladder by role, so ad-hoc sizes break the storybook ladder.
```type-roles
[
{
"id": "display-cover",
"family": "display",
"purpose": "cover / opening hero headline (Fredoka One on cream, no text-shadow)",
"px_min": 52, "px_max": 112, "weight": 400, "leading": "1.1", "tracking": "0.02em", "case": "sentence",
"sample_html": "
{BRAND_NAME}
"
},
{
"id": "headline",
"family": "display",
"purpose": "primary slide headline on cream / white card (dark ink, flat — no shadow)",
"px_min": 40, "px_max": 72, "weight": 400, "leading": "1.1", "tracking": "0.02em", "case": "sentence",
"sample_html": "A friendlier way to begin
"
},
{
"id": "headline-pastel",
"family": "display",
"purpose": "headline on a saturated pastel surface (white text + 3px charcoal text-shadow — non-optional)",
"px_min": 40, "px_max": 72, "weight": 400, "leading": "1.1", "tracking": "0.02em", "case": "sentence",
"sample_html": "This week's lineup
"
},
{
"id": "title",
"family": "display",
"purpose": "section title or framed-header title (Fredoka One on cream/card)",
"px_min": 28, "px_max": 48, "weight": 400, "leading": "1.15", "tracking": "0.02em", "case": "sentence",
"sample_html": "Section title
"
},
{
"id": "quote-text",
"family": "display",
"purpose": "pull-quote body inside a white quote box (Fredoka One, dark ink)",
"px_min": 30, "px_max": 48, "weight": 400, "leading": "1.35", "tracking": "0.02em", "case": "sentence",
"sample_html": "A small kindness, repeated daily, becomes the work.
"
},
{
"id": "subtitle",
"family": "display",
"purpose": "sub-headline or in-card title (Fredoka One mid-scale)",
"px_min": 26, "px_max": 38, "weight": 400, "leading": "1.2", "tracking": "0.02em", "case": "sentence",
"sample_html": "Sub-headline
"
},
{
"id": "number-hero",
"family": "display",
"purpose": "hero statistic numeral (Fredoka One, brand-accent on cream / white card)",
"px_min": 80, "px_max": 152, "weight": 400, "leading": "1", "tracking": "0.02em", "case": "sentence",
"sample_html": "63%
"
},
{
"id": "body-strong",
"family": "body",
"purpose": "emphasized body line — welcome list items, info-card descriptions (Quicksand 600)",
"px_min": 24, "px_max": 28, "weight": 600, "leading": "1.5", "tracking": "0", "case": "sentence",
"sample_html": "A friendlier way to start the week — together.
"
},
{
"id": "quote-author",
"family": "body",
"purpose": "quote attribution (Quicksand 700, muted ink)",
"px_min": 24, "px_max": 26, "weight": 700, "leading": "1.4", "tracking": "0", "case": "sentence",
"sample_html": "— A friend, in a workshop
"
},
{
"id": "badge",
"family": "display",
"purpose": "pill badge text (Fredoka One on butter-yellow fill, charcoal border)",
"px_min": 24, "px_max": 26, "weight": 400, "leading": "1", "tracking": "0.02em", "case": "sentence",
"sample_html": "New today
"
},
{
"id": "marker-numeral",
"family": "display",
"purpose": "numeral / letter inside a marker circle (Fredoka, white on saturated fill — dark on butter)",
"px_min": 26, "px_max": 34, "weight": 400, "leading": "1", "tracking": "0.02em", "case": "sentence",
"sample_html": "1
"
}
]
```
## §E Motion (GSAP consts — REPLACES site ease)
```js
// Daisy Days motion — bounce-and-settle storybook character
const EASE = {
entry: "back.out(1.6)", // chunky cards hop in with mild overshoot
emphasis: "back.out(2.0)", // bigger overshoot for hero moments
exit: "power2.in", // exits stay quick and clean
drift: "sine.inOut", // ornaments breathe; rainbow shimmer; sun twinkle
wobble: "elastic.out(1, 0.5)", // optional: signature joy moment, use sparingly
};
const DUR = {
snap: 0.18,
med: 0.5,
slow: 0.9,
};
// RULE: cards/badges enter with EASE.entry, never with linear or power2.out — the back.out is the brand
// RULE: ornaments use EASE.drift on a continuous yoyo (rotation ±3deg, scale 0.97-1.03) — never freeze
// RULE: do NOT cross-fade scenes. Cut on the beat. The shadow + outline only read on a hard frame change.
// RULE: text-shadow on headlines must animate IN with the headline, not after — they're one object
// RULE: EASE.wobble is for ONE element per scene at most (the focal stat number, a sticker pop) — overuse turns the system into a toy
```
**§E.5 Motion choreography**
- **Atmosphere:** ornaments (daisies, stars, suns, clouds, rainbows) drift continuously on `EASE.drift`. Stagger rotation phase 0-2s across instances so the field never moves in lockstep.
- **Entry vocabulary:** cards bounce up from `y: 24, scale: 0.94, opacity: 0` to rest. Stagger 0.06-0.08s between siblings in a grid (week-card row, info-card grid, team-grid).
- **Emphasis:** numbers/stats count up on `EASE.emphasis` with a one-shot wobble on the final value. Display headlines pop in on `EASE.entry` with a 0.5x letter-by-letter stagger when budget allows.
- **Exits:** quick fade + 8-12px upward drift on `EASE.exit` over `DUR.snap`. Ornaments fade last.
- **Transitions:** **hard cut** between scenes — no crossfade, no slide. The charcoal outline must land on a clean frame to read sticker-on-paper.
- **Forbidden gestures:** blur, parallax, perspective tilt past 6°, motion-blur trails, gradient sweeps, glass refraction. The system is 2D and graphic.
## §G Voice transform recipe
1. Keep sentence case — never UPPERCASE. Fredoka is loud on its own; shouting breaks the storybook warmth.
2. Strip corporate hedges (`leverage`, `enable`, `solutions`, `seamlessly`, `holistic`) and connectives where the line still reads.
3. Prefer short, friendly fragments. 4-8 words per line for headlines; 6-12 for subheads.
4. Use commas, em-dashes, and exclamation points sparingly but warmly. Never trail with `.` on a headline.
5. End with one warm word as a closer when possible — `today`, `friends`, `welcome`, brand-name.
6. Pastel surfaces want softer copy ("Let's begin"); cream surfaces can carry the meatier line ("A friendlier way to build").
**Example:**
- IN: `Our platform enables teams to seamlessly collaborate across complex workflows in real time`
- OUT: `Teams, working together — in real time. Welcome.`
## §H Scene composition hints
- **One main subject per scene.** A single card / frame / grid lives at the center, max-width well inside the slide padding. Two competing panels reads anxious; let one focal region carry the beat.
- **Wreath every scene with 3-7 SVG ornaments** clustered at corners. Crop them past the edge (`top: -30px / right: -20px` style). An empty corner reads as broken — ornaments are structural, not garnish.
- **Surface alternation:** rotate scenes through `var(--surface-cream)` (cover, info), `var(--surface-pastel-primary)` (welcome, week), `var(--surface-pastel-secondary)` (timeline, quote), `var(--surface-pastel-accent)` (process, donut). Don't repeat the same surface back-to-back.
- **Headline shadow rule:** on a saturated pastel surface, every Fredoka headline carries `var(--shadow-text-bold)` and switches to white. On cream or on a white card, headline sits flat in `var(--ink)`. This is non-optional — skipping it on a colored surface breaks the system.
- **Brand-color role contract:**
- `var(--brand-primary)` → focal sticker fills (daisy centers, star fills), primary card surfaces
- `var(--brand-secondary)` → soft sticker fills (cloud bands, rainbow stripes), divider rules
- `var(--brand-accent)` → marker dots (timeline node, step circle), single high-attention spot
- `var(--ink)` → every border, every shadow, every SVG stroke. Never colored.
- **Bullet rule:** body lists use outlined 20px discs with butter-yellow fill (`var(--brand-secondary)` 50% tint). Never glyph bullets, never bare hyphens.
- **Marker rotation:** when a sequence of dots/steps is needed (timeline rows, process steps, day-headers), rotate fills through `accent → secondary → primary → soft` so each beat has a distinct color. Never one color for all.
- **Type roles:** display font (Fredoka One register) carries headlines, titles, numerals, marker labels, and badge/chip text; body font (Quicksand register) carries paragraph copy, list items, descriptions, and quote attributions. All on-screen text floors at 24px and the ladder scales up from there — display roles sit clearly above body roles (see §T). The family split (not a px threshold) is the role boundary. No exceptions.
- **Forbidden:** colored borders, dashed lines, square corners outside legend swatches, blurred or rgba shadows, gradients, glow effects, photo backdrops, italic display text.
- **Transition default:** hard cut on the beat. Ornaments fade out last, cards exit first.
## §I Page-level CSS
```css
/* ── Preset-native typography vars — doc chrome renders in Fredoka One + Quicksand. */
:root {
--f-disp-native:
"Fredoka One", "Fredoka", "Baloo 2", "Comfortaa", "Nunito", system-ui, sans-serif;
--f-body-native:
"Quicksand", "Nunito", "Comfortaa", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
--f-script-native:
"Fredoka One", "Fredoka", "Baloo 2", "Comfortaa", "Nunito", system-ui, sans-serif;
--f-mono-native:
"JetBrains Mono", "IBM Plex Mono", "Space Mono", "Menlo", ui-monospace, monospace;
}
/* .preset-native-scope: re-bind brand DNA font tokens to preset-native families for §6 previews + §T atlas. */
.preset-native-scope {
--font-display: var(--f-disp-native);
--font-body: var(--f-body-native);
--font-script: var(--f-script-native);
--font-mono: var(--f-mono-native);
}
/* Daisy Days — make design.html itself read as a storybook spread */
body {
background: var(--surface-cream);
}
.ds-section {
border: var(--border-bold);
border-radius: var(--radius-card-lg);
box-shadow: var(--shadow-card);
background: #ffffff;
margin-bottom: 2.4rem;
}
.ds-section h2 {
font-family: var(--font-display);
letter-spacing: 0.02em;
}
.ds-component-preview {
border: var(--border-bold);
border-radius: var(--radius-card);
box-shadow: var(--shadow-small);
background: var(--surface-cream);
}
.ds-code {
border: var(--border-thin);
border-radius: 12px;
background: #fffaf0;
}
/* ── §T Type-role atlas. */
.ds-trole-box {
display: flex;
flex-direction: column;
border: var(--border-bold);
border-radius: var(--radius-card-lg);
background: #ffffff;
box-shadow: var(--shadow-card);
overflow: hidden;
margin-top: 24px;
}
.ds-trole-row {
padding: 28px 32px;
border-bottom: var(--border-thin);
}
.ds-trole-row:last-child {
border-bottom: 0;
}
.ds-trole-sample {
min-width: 0;
overflow-wrap: anywhere;
}
@media (max-width: 960px) {
.ds-trole-row {
padding: 24px;
}
}
/* ── Type-role samples. */
.t-trole-display-cover {
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(52px, 7vw, 112px);
line-height: 1.1;
letter-spacing: 0.02em;
color: var(--ink);
}
.t-trole-headline {
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(40px, 5vw, 72px);
line-height: 1.1;
letter-spacing: 0.02em;
color: var(--ink);
}
.t-trole-headline-pastel-wrap {
display: inline-block;
background: var(--surface-pastel-primary);
border: var(--border-bold);
border-radius: var(--radius-card);
padding: 24px 32px;
}
.t-trole-headline-pastel {
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(40px, 5vw, 72px);
line-height: 1.1;
letter-spacing: 0.02em;
color: var(--anchor-paper);
text-shadow: var(--shadow-text-bold);
}
.t-trole-title {
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(28px, 3.5vw, 48px);
line-height: 1.15;
letter-spacing: 0.02em;
color: var(--ink);
}
.t-trole-quote-text {
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(30px, 3vw, 48px);
line-height: 1.35;
letter-spacing: 0.02em;
color: var(--ink);
max-width: 28ch;
}
.t-trole-subtitle {
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(26px, 2.6vw, 38px);
line-height: 1.2;
letter-spacing: 0.02em;
color: var(--ink);
}
.t-trole-number-hero {
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(80px, 11vw, 152px);
line-height: 1;
letter-spacing: 0.02em;
color: var(--brand-accent);
}
.t-trole-body-strong {
font-family: var(--font-body);
font-weight: 600;
font-size: clamp(24px, 1.6vw, 28px);
line-height: 1.5;
color: var(--ink);
max-width: 50ch;
margin: 0;
}
.t-trole-quote-author {
font-family: var(--font-body);
font-weight: 700;
font-size: clamp(24px, 1.4vw, 26px);
line-height: 1.4;
color: color-mix(in srgb, var(--ink) 60%, transparent);
}
.t-trole-badge {
display: inline-block;
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(24px, 1.4vw, 26px);
line-height: 1;
letter-spacing: 0.02em;
color: var(--ink);
background: var(--anchor-butter);
border: var(--border-bold);
border-radius: var(--radius-pill);
padding: 8px 20px;
}
.t-trole-marker-numeral {
display: inline-flex;
align-items: center;
justify-content: center;
width: 48px;
height: 48px;
border-radius: 50%;
border: var(--border-bold);
background: var(--brand-accent);
font-family: var(--font-display);
font-weight: 400;
font-size: clamp(26px, 1.8vw, 34px);
line-height: 1;
letter-spacing: 0.02em;
color: var(--anchor-paper);
}
```