This design system blends what's documented in the CPFS brief with proposed direction from Savage AdFox drawn from the brief's strategic positioning and the benchmark sites CPFS named (shopufs.com, cookmunitybyajinomoto.com, sanmiguelmart.ph).
Documented: Brand colours (from the new Food Solutions identity), sitemap, page templates (Home, PDP, Recipe), product detail requirements (case config, yield, dilution, shelf life), audience, strategic pillars (ELEVATE / SCALE UP / INCREASE REACH), funnel model.
Proposed (pending validation): Voice and tone direction, copy examples, photography style. These need a quick review with CPFS before locking as v1.0. Technical specs (typography scale, motion, accessibility, structure) are industry-standard build conventions.
rgba(255,255,255,0.75) for body. Gold for eyebrows. Never use grey on navy.| Token | Value | Usage |
|---|---|---|
| --color-background | #FBFAF6 | Page background |
| --color-foreground | #1A1A1A | Body text |
| --color-brand | #0F8C8C | Primary CTAs, eyebrows, links |
| --color-brand-dark | #0A6E6E | Hover, pressed states |
| --color-brand-soft | #E1F2F2 | Soft tinted surfaces |
| --color-deep | #0E2A3C | Headings, dark sections |
| --color-accent | #C9A961 | Accents on dark surfaces |
| --color-danger | #D93B3B | System alerts only |
| --color-surface | #FFFFFF | Card fills |
| --color-border | rgba(14,42,60,0.08) | Card borders |
with Century Tuna
clamp() in custom Liquid sections where supported.| Element | Weight | Desktop | Tablet | Mobile | Tracking |
|---|---|---|---|---|---|
| H1 / Hero | 700 | 56px | 44px | 36px | -0.02em |
| H2 / Section | 700 | 40px | 34px | 28px | -0.02em |
| H3 / Card title | 600 | 24px | 22px | 20px | -0.01em |
| H4 / Sub-card | 600 | 18px | 17px | 16px | 0 |
| Body large | 400 | 17px | 16px | 16px | 0 |
| Body | 400 | 15px | 15px | 14px | 0 |
| Small / caption | 400 | 13px | 13px | 12px | 0 |
| Eyebrow / nav | 600 | 12px | 12px | 11px | 0.12em |
<span class="material-symbols-outlined">shopping_cart</span>
aria-hidden="true" when text label exists.aria-label describing the action. Minimum tappable area 44×44px even if icon is smaller./* Full viewport width. Handles background, padding-block, padding-inline */
<div class="container">
/* max-width: 1280px. margin-inline: auto. No padding. */
/* Grid or Flexbox layout applied here */
<div class="section__content">
/* Text group with flex-direction: column and gap */
</div>
</div>
</section>
| What | How | Why |
|---|---|---|
| Between sections | Section's padding-block | No margins between sections. Each owns its spacing. |
| Horizontal gutter | Section's padding-inline | Safety net for small screens. |
| Content width | Inner container max-width | Readability constraint (1280px). |
| Between text elements | Gap on flex parent | Consistent, predictable, no margin collapse. |
| Accent to heading | Tight gap (nested group) | They are semantically linked. |
| CTA separation | Slight margin-top | Exception to gap rule for emphasis. |
| Between grid items | Gap on grid parent | Consistent grid gutters. |
<div class="title-group">
<span class="accent">ACCENT</span>
<h2>Heading</h2>
</div>
<p>Description text</p>
<a class="cta">View recipe</a>
</div>
sections/<name>.liquid). Full-width. Background colour/image set via section schema. Vertical padding set on the outer wrapper..container div with max-width: 1280px and margin-inline: auto. No padding. Grid or flexbox layout applied here.gap for spacing. Nested tighter stack for accent + heading pairs.prefers-reduced-motion: reduce. Disable transforms and complex animations for users who need them off.transform and opacity only. Never animate width, height, or top/left — they trigger layout thrash.| Curve | Value | Use for |
|---|---|---|
| Standard | cubic-bezier(0.4, 0, 0.2, 1) | Default for most UI transitions |
| Ease out | cubic-bezier(0, 0, 0.2, 1) | Elements entering the screen |
| Ease in | cubic-bezier(0.4, 0, 1, 1) | Elements leaving the screen |
| Spring (soft) | cubic-bezier(0.34, 1.56, 0.64, 1) | Playful confirmations (cart added) |
| Linear | linear | Loading indicators only |
.card { transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1); }
/* User prefers reduced motion */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
outline: none without replacement). Skip-to-content link at page top.nav, main, article, button). ARIA labels on icon-only buttons. Alt text on every meaningful image.prefers-reduced-motion. No auto-playing video. No flashing content exceeding 3 flashes per second.Body text / dark sections
Body copy on light bg
Links and eyebrows
CTA buttons
Avoid — fails AA for body
Avoid for body — use only for captions ≥14px
<label>alt attributes<button>, not <div><a> with hrefaria-label| Asset | Format | Max size | Dimensions |
|---|---|---|---|
| Hero banners | WebP / JPEG | 250 KB | 1920 × 800px |
| Product images | WebP / PNG | 120 KB | 1200 × 1200px |
| Recipe hero | WebP / JPEG | 180 KB | 1600 × 1200px |
| Recipe card | WebP / JPEG | 80 KB | 800 × 600px |
| Blog thumbnail | WebP / JPEG | 60 KB | 800 × 500px |
| Brand logos | SVG | 20 KB | Vector |
alt="".