---
version: alpha
name: sunsplit-design
description: "A warm cream canvas (#fffaf0) with dark-brown ink (#2b1d0f), a bright tangerine (#ff6a1a) and a kelly lime (#37a621) as the two brand accents, each paired with a darker text-safe tier for small text and links. Fredoka carries every headline, Inter carries anything meant to be read quickly. The homepage's hero is one shaved-ice mound, actually filling, four syrup flavors pouring into it in sequence as you scroll, in their own real color."
---
## Brand Positioning
Sunsplit runs a single shave-ice cart, and it exists because most frozen-treat sites either bury a genuinely simple, fast product under a wall of "artisanal small-batch" copy, or go full theme-park mascot and forget to say what's actually in the cup. Sunsplit's bet: show the ice actually filling with real syrup, in real color, and stay plain everywhere else, a real flavor list, a real price, a real line-wait estimate. If a component performs "tropical vacation" without being tied to a real flavor, a real price, or the ice itself, it doesn't belong here.
colors:
accent: "#ff6a1a"
accent-text: "#c23e00"
accent-alt: "#37a621"
accent-alt-text: "#1f7a12"
ink: "#2b1d0f"
ink-muted: "#6b5a45"
canvas: "#fffaf0"
## Logo / Wordmark System
The mark is a single shave-ice cup in cross-section, the ice line drawn jagged (never smooth, real shaved ice is never a smooth dome), with one drip escaping the rim, the exact silhouette of the cart's own paper cup.
```svg
```
- **Lockup**: mark, then a `0.5rem` gap, then "Sunsplit" in Fredoka, mark always left of the wordmark.
- **Minimum size**: mark not smaller than `18px` tall, below that the jagged ice line and the drip both read as noise.
- **Clearspace**: empty margin equal to the mark's own height on all four sides.
- **Don't**: don't smooth the ice line into a dome, that's a snow-cone competitor's shape, not this cart's. Don't drop the drip, without it the mark is just a cup. Don't recolor the ice line itself, it's always outlined in `--ink`, never filled.
## Color System
### Roles
| Role | Token | Value | Used for |
|---|---|---|---|
| Canvas | `--bg` | `#fffaf0` | Page background |
| Surface | `--panel` | `#ffffff` | Nav, flavor cards, form fields |
| Surface raised | `--raised` | `#fff1e0` | Hover state, input focus fill |
| Border | `--border` | `#f2ddc4` | Card edges, dividers, input outlines |
| Ink | `--ink` | `#2b1d0f` | Primary text, headlines |
| Ink muted | `--dim` | `#6b5a45` | Secondary text, meta lines, placeholders |
| Tangerine | `--accent` | `#ff6a1a` | Primary button fill (ink label), the mark's drizzle, "today" status |
| Tangerine text | `--accent-text` | `#c23e00` | Links, small accent text, focus states needing text-weight contrast |
| Lime | `--accent-alt` | `#37a621` | Secondary button fill (ink label), the mark's seeds, "in stock" status |
| Lime text | `--accent-alt-text` | `#1f7a12` | Secondary links, small accent text |
**The mound's four syrup stripes are illustrative, not tokens**, the same exception every other system in this batch already establishes: real shave-ice syrup is a real flavor color, mango orange, lime green, watermelon pink, blueberry violet, not a two-token gradient wearing a cup shape. `--accent` and `--accent-alt` never appear as syrup fills in the hero, they're reserved for the interface.
### Contrast (computed from the hex values above via WCAG relative luminance)
| Pairing | Ratio | Passes |
|---|---|---|
| `--ink` on `--bg` | 15.7:1 | AAA |
| `--dim` on `--bg` | 6.36:1 | AA |
| `--accent-text` on `--bg` (links) | 5.07:1 | AA |
| `--accent-alt-text` on `--bg` (links) | 5.24:1 | AA |
| `--ink` label on `--accent` fill | 5.7:1 | AA |
| `--ink` label on `--accent-alt` fill | 5.16:1 | AA |
Both raw accents are too bright to carry white text or to pass as body-size text directly on canvas, so this system needed the same three-tier answer Pearl & Pop's palette required: a bright illustrative/fill tone plus a separate darker text-safe tone, with fills always labeled in `--ink` rather than white. Confirms this is a genuine per-palette computation, not a copy-pasted answer, since Confetti Club's rose and violet landed on white-label-on-fill with no separate text tier at all.
typography:
display:
fontFamily: Fredoka
fontWeight: 500
body:
fontFamily: Inter
fontWeight: 400
## Type Scale
| Token | Size | Weight | Family | Line-height | Letter-spacing | Used for |
|---|---|---|---|---|---|---|
| `--text-display` | `clamp(2.25rem, 5.5vw, 3.75rem)` | 600 | Fredoka | 1.1 | 0 | Homepage H1 only |
| `--text-h2` | `1.5rem` | 600 | Fredoka | 1.2 | 0 | Section headings |
| `--text-h3` | `1.1rem` | 600 | Fredoka | 1.25 | 0 | Flavor names |
| `--text-body` | `1rem` | 400 | Inter | 1.65 | 0 | Paragraph copy |
| `--text-small` | `0.85rem` | 400 | Inter | 1.5 | 0 | Nav, footer, helper text, meta lines |
| `--text-label` | `0.75rem` | 600 | Inter | 1 | 0.06em, uppercase | Kickers, badges, form labels |
Fredoka's rounded weight matches a paper cup and a plastic spoon, not a knife edge, reserved for headlines, section headings, and flavor names, the moments meant to feel handheld. Inter carries anything read as a sentence or clicked as a control, including every price and every wait-time note.
## Spacing Scale
Base unit `8px`. Tokens in use: `--space-2: 0.5rem`, `--space-3: 1rem`, `--space-4: 1.5rem`, `--space-6: 2rem`, `--space-8: 3rem`, `--space-12: 4rem`.
## Shape
`--radius: 16px` on cards, panels, and inputs. `--radius-pill: 999px` on buttons and badges. The mound itself is hand-drawn (a jagged path, not a border-radius shape), the only element in the system exempt from the two-shape scale, because shaved ice is never geometrically round.
## Iconography
No icon library. The only non-text graphics are the logo mark and the hero's own mound (hand-built SVG path). Wait-time and stock notes are plain text, not a clock or checkmark icon next to unrelated words.
## Motion Principles
Scroll pours syrup into a shave-ice mound: four flavors fill in sequence as horizontal color bands rising inside the mound's own jagged silhouette, each in its own real flavor color. The moment a band finishes rising, the flavor card it represents slides in below. One-shot reveal, nothing loops, every flavor is written out in plain markup at all times regardless of scroll or script state. Scroll trigger bounds checked to verify `0` progress at scroll position `0`. `prefers-reduced-motion: reduce` renders the mound already full and every card already visible.
## Voice & Tone
Warm, plainspoken, a little proud of how fast the line moves. In practice:
- **Button label**: "See today's flavors", not "Escape to paradise!"
- **Flavor description**: "Mango, real puree, not syrup concentrate, tastes like the fruit.", not "A TROPICAL taste sensation!"
- **Wait note**: "Line's currently about six minutes, we make each cup to order.", not "Fast service guaranteed!"
- **Empty state**: "Watermelon's out for today, back Thursday.", not "Oops, out of stock!"
## Accessibility Baseline
- Focus ring: `2px solid var(--accent-alt-text)`, `2px` offset, applied via `:focus-visible` on every interactive element.
- Reduced motion: the syrup-fill sequence and every card reveal check `prefers-reduced-motion: reduce` and render the finished state immediately.
- Minimum tap target: `44px` in the smallest dimension for every button and input.
- Color is never the only signal: a flavor's badge pairs "In stock" or "Out today" with the word, never color alone.
- Every flavor the mound can reveal is also written out in plain markup at all times, see Motion Principles.
## Components
### Navigation
Single-line bar, `64px` tall, `--panel` background with a `--border` bottom hairline, sticky to the top. Left: the mark + wordmark lockup. Right: a "Flavors" link plus one primary button ("See today's flavors").
### Buttons
Three variants, one radius (`--radius-pill`):
- **Primary**: `--accent` fill, `--ink` label, used once per view for the real action.
- **Secondary**: transparent fill, `1px solid --border`, `--ink` label.
- **Ghost**: text-only, `--dim` label, `--ink` on hover.
All variants define `:hover`, `:active` (`transform: scale(0.97)`), `:disabled` (`opacity: .45`), and `:focus-visible`.
### The mound (signature interaction)
Documented in full under Motion Principles. Structurally: one jagged SVG path used as an outer clip, four colored `` bands scroll-driven from `height: 0` to their allotted band height in sequence, real flavor colors (mango, lime, watermelon, blueberry).
### Flavor card
A flat `.panel`: `--panel` background, `1px solid --border`, `--radius`, no shadow. Holds the flavor name (Fredoka), a real ingredient note, the price, and a stock badge. Revealed by its syrup band finishing above, present in the DOM at all times.
### Badge
`--radius-pill`, `1px solid` the semantic color, semantic-color text on transparent fill: `--accent-text` for "In stock," `--dim` for "Out today." Never filled solid.
### Footer
One row: cart name/tagline on the left, real page links on the right (Flavors, back to gallery).
## Do's and Don'ts
### Do
- Let the mound's syrup be a real flavor rainbow, not a two-token gradient wearing a cup shape.
- Keep the ice line jagged, never round it into a smooth dome.
- Label any accent-filled surface in `--ink`, both accents are too bright to carry white here.
- Write every flavor the mound can reveal into plain markup at all times.
- Say the real wait time, not a vague "fast service" claim.
### Don't
- Don't use a mascot, a beach scene, or a palm-tree icon anywhere.
- Don't perform "paradise" or "escape" copy, name the actual fruit and the actual price instead.
- Don't replay the syrup fill on every scroll pass, it plays once, like a real cup being made.
- Don't invent a third accent for a flavor state, "in stock" and "out today" are the only two.
## Known Constraints
- Two routes exist (homepage, flavors). There is no checkout and no authenticated state, "See today's flavors" and the order form are not wired to anything real, this is a concept demo.
- The mound holds exactly four syrup bands because that's the current flavor lineup for a given day. A fifth flavor rotates one out, it doesn't add a fifth band.
- No responsive breakpoint table beyond a single-column mobile collapse of the mound and flavor cards.
## Process
Built through the impeccable-audited anti-slop workflow: never-list written
before any HTML, page structure derived from the signature interaction
(one real mound, actually filling) rather than a template, mechanical
detector run clean, and the scroll trigger's start/end bounds checked
to verify `0` progress at scroll position `0` before this system was
considered done.