dreative 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,6 +6,7 @@ const SKILL_SIGNATURES = {
6
6
  interaction: /\b(micro[- ]?interaction|hover (effect|state)s?|cursor|magnetic|tilt|spotlight|glow|ripple|tactile|interactive|draggable)\b/i,
7
7
  immersive: /\b(immersive|award[- ]?(site|winning)|awwwards|spatial( (transition|nav(igation)?))?|scene[- ]?based|world|page[- ]transitions?|camera (move|travel|path)|preloader|scroll (journey|story|as travel)|explorable|experience site|epic\.net)\b/i,
8
8
  cinematic: /\b(cinematic|experiential|unseen\.co|fluid (sim(ulation)?|distortion)|gpgpu|drag[- ]to[- ]explore|click ?(&|and) ?hold|film grain|graded|velocity[- ]reactive|sound design|ambient (audio|sound))\b/i,
9
+ refined: /\b(clean (and )?(modern|professional)|modern clean|business (site|website|use)|corporate|professional look|premium (minimal|clean)|dtc|d2c|e[- ]?commerce|ecommerce|shopify|maswitzerland|lovvelavva|not (too )?(flashy|animated)|calm|understated)\b/i,
9
10
  };
10
11
  function detectSkills(texts) {
11
12
  const hay = texts.filter(Boolean).join(" \n ");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dreative",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Layout-first visual editor skill for coding CLIs: extract your app's UI into editable wireframes, tweak with drag-drop + ref images, then the agent applies the diff back to your code.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -329,7 +329,9 @@ A redesign request has a depth, and styling is only the shallowest rung. When th
329
329
  user asks for meaningful change ("redesign", "make it modern", "make it look like
330
330
  <reference site>", "change it entirely") and the depth is ambiguous, present this
331
331
  ladder as explicit options (one short question, plain labels) and wait for the
332
- answer — do NOT silently default to the shallowest rung:
332
+ answer — do NOT silently default to the shallowest rung. Bundle the specialist
333
+ skill picker (SKILL.md) into the same question so the user answers depth and
334
+ treatments in one pass:
333
335
 
334
336
  1. **Restyle** — tokens only: color, type, spacing, radius, shadows, motion
335
337
  polish. Markup and structure untouched. Right for "refresh the look".
@@ -385,3 +387,92 @@ the output is not done.
385
387
  14. Every block id from the layout appears as `data-dreative-id` (design-page only).
386
388
  15. Dark mode (when in scope): semantic-token swap, surface-lightness depth,
387
389
  desaturated accents, tested both modes.
390
+
391
+ ## 13. Mobile & touch adaptation (how ambitious effects degrade)
392
+
393
+ Ambitious designs die on phones first. Every effect gets an explicit mobile
394
+ strategy DECIDED AT DESIGN TIME, not patched after. The rule of thumb: touch
395
+ devices get a *different good design*, never a broken half-version of the
396
+ desktop one.
397
+
398
+ **Pointer effects** (cursor followers, magnetic pull, spotlight, tilt, hover
399
+ reveals): gate ALL of them behind `@media (hover: hover) and (pointer: fine)`.
400
+ On touch, whatever hover revealed must be visible by default or reachable by
401
+ tap — never lost. Custom cursors simply don't exist on touch; don't ship their
402
+ DOM/listeners there.
403
+
404
+ **Pinned/scrubbed sections**: pinning is fragile on mobile (URL-bar resize
405
+ fires viewport changes mid-pin; iOS momentum scroll skips scrub frames).
406
+ Strategies in preference order: (1) keep the pin but shorten it (≤ 1.5
407
+ viewports) and drive it with `position: sticky`, never JS pinning; (2) unpin —
408
+ the same content as stacked sections with simple in-view reveals;
409
+ (3) `ScrollTrigger.matchMedia()` / a `matchMedia` branch that swaps the whole
410
+ choreography. Never let a desktop pin length ride on a phone.
411
+
412
+ **Parallax & depth layers**: halve the differential on small screens (8-15% →
413
+ 4-7%) or drop to zero; small viewports make parallax read as jitter. Layered
414
+ depth scenes collapse to 2 layers max.
415
+
416
+ **Drag-to-explore / spatial navigation**: on touch, drag conflicts with native
417
+ scroll. Either give the pannable surface a dedicated full-screen mode entered
418
+ by tap (with a visible close), or replace it with a swipeable carousel /
419
+ plain scrolling index. The conventional index route (immersive.md's escape
420
+ hatch) becomes the PRIMARY route on mobile, not the fallback.
421
+
422
+ **WebGL/canvas**: assume the phone GPU is 5-10× weaker and thermally throttled.
423
+ Tier at boot (`devicePixelRatio` capped at 2, sim resolution halved,
424
+ post-processing off) or swap the sim for a pre-rendered video loop / poster.
425
+ `deviceMemory`/first-dropped-frames checks pick the tier; a visible "reduce
426
+ effects" toggle when the brief allows.
427
+
428
+ **Layout & ergonomics floor** (extends checklist §12.12): tap targets ≥ 44px
429
+ with ≥ 8px gaps; primary actions in thumb reach (bottom half) on app-register
430
+ mobile; `100dvh` not `100vh`; no horizontal body scroll at 320px; type scale
431
+ clamps DOWN gracefully (hero ≥ 2rem, body stays ≥ 16px — iOS zooms inputs
432
+ under 16px); sticky navs shrink rather than stack; test the three widths 320 /
433
+ 768 / 1280 mentally before responding.
434
+
435
+ **Motion budget on mobile**: entrance choreography total ≤ 600ms (vs 900ms
436
+ desktop), at most 1 scroll-driven sequence per page, marquees pause when
437
+ off-screen. Battery is a design constraint: continuous rAF loops must idle
438
+ when nothing animates.
439
+
440
+ ## 14. Typography sourcing (kill the Inter-everywhere default)
441
+
442
+ The reflex-reject list (§3) says what NOT to reach for; this is where to reach
443
+ instead. All fonts below are free (Google Fonts or Fontshare/ITF). The
444
+ commercial fonts real award sites use — verified: unseen.co sets **Saol
445
+ Display Light/Italic + Neue Montreal**; unseen's Blossom lab sets **SangBleu
446
+ Serif + PP Neue Montreal**; capsul-in-pro sets **Messina Sans** — are the
447
+ targets; the pairings below are their honest free stand-ins, not lookalikes of
448
+ each other.
449
+
450
+ Per aesthetic register (display / body):
451
+
452
+ - **Cinematic & experimental** (unseen-like): light editorial serif with a
453
+ true italic for display — `Boska`, `Sentient`, or `Gelasio Light Italic` —
454
+ over a neutral grotesk body — `Switzer`, `Hanken Grotesk`. Mixing italic
455
+ serif words INTO a grotesk headline is the genre move (unseen does exactly
456
+ this). Mono microtype for HUD labels: `Fragment Mono` or `Martian Mono`.
457
+ - **Minimal / premium product**: one grotesk family carrying everything —
458
+ `General Sans`, `Switzer`, or `Schibsted Grotesk` in 3-4 weights. The
459
+ Neue Montreal / Messina Sans stand-in tier. Tight display tracking
460
+ (−0.02 to −0.04em), no second family.
461
+ - **Editorial / luxury**: `Zodiak` or `Besley` display over `Hanken Grotesk`
462
+ or `Switzer` body; small-caps eyebrows tracked +0.08em. (Reach here only
463
+ when §3's serif discipline is satisfied.)
464
+ - **Bold / brutalist / campaign**: `Clash Display` or `Cabinet Grotesk` (black
465
+ weights) display over `Switzer`/`General Sans` body; `Bricolage Grotesque`
466
+ when some warmth is wanted.
467
+ - **Playful / consumer** (lovvelavva-like DTC): `Cabinet Grotesk` or `Gambetta`
468
+ display, rounded moments via weight and spacing — NOT a rounded font —
469
+ over `Hanken Grotesk` body.
470
+ - **Corporate trust / clean business**: `Switzer` or system stack; Inter is
471
+ legitimate here (§3). Differentiate through scale contrast and spacing,
472
+ not font novelty.
473
+
474
+ Rules: still run §3's selection procedure — this list feeds step 3, it does
475
+ not replace the brand-voice reasoning. Self-host via Fontshare/google-webfonts
476
+ downloads (`font-display: swap`, preload the display weight only). Never ship
477
+ more than 2 families / ~5 weight files. If the brief names a commercial font
478
+ the project already licenses, use the real thing.
@@ -7,14 +7,25 @@ description: Frontend design skill + optional visual round-trip editor. Use for
7
7
 
8
8
  You (the coding agent) are the intelligence. Dreative has **two modes**:
9
9
 
10
- - **Mode A — Direct design (default).** The user asks you to design, redesign, restyle, animate, or build UI. Read `DESIGN.md` (and any specialist `skills/<name>.md` the work calls for — motion, 3d, interaction), then design/edit the real code directly. No server, no extraction, no wireframes. When you finish, add one closing note: *"Tip: run `dreative start` / say 'open dreative' if you want to tweak this visually — I'll extract the pages into an editable canvas."* That's the only place the editor should come up; never force the round-trip on a plain design request. **Depth first:** when the request implies more than a fresh coat of paint ("redesign", "change it entirely", "make it like <reference site>"), present DESIGN.md §11's transformation-depth ladder (restyle → re-layout → restructure → reimagine) as explicit options and let the user pick BEFORE designing; a confirmed restructure/reimagine means rebuilding markup, component trees, and routing for real — never just editing stylesheets on the old skeleton.
10
+ - **Mode A — Direct design (default).** The user asks you to design, redesign, restyle, animate, or build UI. Read `DESIGN.md` (and any specialist `skills/<name>.md` the work calls for — motion, 3d, interaction), then design/edit the real code directly. No server, no extraction, no wireframes. When you finish, add one closing note: *"Tip: run `dreative start` / say 'open dreative' if you want to tweak this visually — I'll extract the pages into an editable canvas."* That's the only place the editor should come up; never force the round-trip on a plain design request. **Depth first:** when the request implies more than a fresh coat of paint ("redesign", "change it entirely", "make it like <reference site>"), present DESIGN.md §11's transformation-depth ladder (restyle → re-layout → restructure → reimagine) as explicit options and let the user pick BEFORE designing; a confirmed restructure/reimagine means rebuilding markup, component trees, and routing for real — never just editing stylesheets on the old skeleton. **Skill picker:** in the same pre-design question (use the agent's structured question tool, e.g. AskUserQuestion, multi-select), offer the specialist skills with a one-line plain-language description each so the user chooses the treatments they want — recommend the ones the request obviously implies and mark them "(Recommended)":
11
+ - **motion** — scroll animations, staggered entrances, parallax, kinetic type
12
+ - **interaction** — micro-interactions: hover states, magnetic buttons, cursor effects, tactile feedback
13
+ - **3d** — WebGL / three.js scenes, shader backgrounds, 3D product showcases
14
+ - **immersive** — award-site feel: the page becomes a spatial world, scroll-as-journey, page transitions
15
+ - **cinematic** — dark, shader-graded experiential look: fluid/particle surfaces, drag-to-explore, sound
16
+ - **refined** — premium clean business look: whitespace, photography, calm minimal motion (the professional pole)
17
+ Plus a "none — plain design doctrine only" option. Skip the question only when the user already named the treatments or the request is trivially a restyle; read each chosen `skills/<name>.md` before designing.
11
18
  - **Mode B — Visual round-trip (only when asked).** The user explicitly wants the visual editor ("open dreative", "let me edit visually"). Flow: **extract → baseline → serve requests → finish → apply**. Be token-frugal at every step: read only the files you need, never re-read the whole app, and keep JSON compact.
12
19
 
13
20
  Everything below §0 describes Mode B; the design doctrine paragraphs apply to both modes.
14
21
 
15
22
  **Design quality is a hard requirement.** `DESIGN.md` (same folder as this file) is the design doctrine. Read it ONCE before servicing the first `propose-skeletons`, `propose-variants`, `design-page`, or `edit-element` request, keep it in mind for all later ones, and run its pre-flight checklist (§12) before every respond. Requests may carry a `brief` object (aesthetic preset + vibe + dials set by the user in the UI); when present it is the user's explicit direction and overrides doctrine defaults. Before writing any `design-page` code, state (to yourself, one line) the register, the design read, and the signature element — if you cannot name all three, you are about to produce the generic default; stop and commit first.
16
23
 
17
- **Specialist skills.** The `skills/` folder next to this file holds expert playbooks for advanced work: `motion.md` (animation & scroll choreography), `3d.md` (WebGL/three.js/shaders), `interaction.md` (micro-interactions & effect craft), `immersive.md` (award-site worlds, spatial page transitions, scroll-as-journey), `cinematic.md` (dark shader-graded experiential interfaces: fluid/particle surfaces, drag-to-explore, click & hold, sound design — opt-in aesthetic). All are universal: they apply directly to any codebase in Mode A; the editor is never required. When a request's `plan.skills` lists names, read each listed `skills/<name>.md` ONCE before writing code (then keep it in mind, like DESIGN.md); when `plan.sections[].skills` tags a section, that section gets that treatment (e.g. "this hero has 3d"). If the brief/prompt clearly calls for one of these but the plan missed it, read it anyway. If a listed file isn't installed, proceed on DESIGN.md alone and note it to the user (`dreative install-skill` installs all).
24
+ **Specialist skills.** The `skills/` folder next to this file holds expert playbooks for advanced work: `motion.md` (animation & scroll choreography), `3d.md` (WebGL/three.js/shaders), `interaction.md` (micro-interactions & effect craft), `immersive.md` (award-site worlds, spatial page transitions, scroll-as-journey), `cinematic.md` (dark shader-graded experiential interfaces: fluid/particle surfaces, drag-to-explore, click & hold, sound design — opt-in aesthetic), `refined.md` (premium clean business/DTC/e-commerce: restraint, photography, whitespace — the calm pole). All are universal: they apply directly to any codebase in Mode A; the editor is never required. When a request's `plan.skills` lists names, read each listed `skills/<name>.md` ONCE before writing code (then keep it in mind, like DESIGN.md); when `plan.sections[].skills` tags a section, that section gets that treatment (e.g. "this hero has 3d"). If the brief/prompt clearly calls for one of these but the plan missed it, read it anyway. If a listed file isn't installed, proceed on DESIGN.md alone and note it to the user (`dreative install-skill` installs all).
25
+
26
+ **References the user gives you.** If the user attaches screenshots/images, read them with your image tools and treat them as the visual target (extract palette, type feel, layout family, motion cues from any described behavior). If the user names reference URLs, fetch them (browser tools if available, else web fetch of the HTML — look at real script/font/class evidence, not just the text) and distill what specifically to borrow before designing; never guess at a named reference from memory alone when you can look.
27
+
28
+ **Self-critique pass (Mode A, required before declaring done).** Doctrine at write-time is weaker than judgment at review-time. After implementing a design: run the app and screenshot the result (browser tools / the project's dev server) at desktop AND ~390px mobile width, then grade the screenshots against this rubric — (1) would a stranger name the brand's register and audience from one glance? (2) does it pass DESIGN.md §2's slop tests *as rendered* (not as intended)? (3) is the signature element actually visible and working? (4) any overflow, contrast failure, unloaded font/image, or motion jank? (5) does mobile hold up per DESIGN.md §13? Fix what fails and re-check once. If you cannot screenshot (no browser available), say so explicitly and walk the rendered DOM/CSS mentally against the same rubric — never silently skip the pass.
18
29
 
19
30
  ## 0. Setup
20
31
 
@@ -150,6 +150,15 @@ All of 3d.md §7 and immersive.md §6, plus:
150
150
  Branding 5…); butterfly/petal particles drift through; HUD = wordmark
151
151
  top-left, Index/Projects/Contact top-right, globe "world" button bottom-center,
152
152
  © year bottom-right. Heavy uniform film grain glues all of it together.
153
+ - **Single-flower lab page (verified on unseen.co/labs/blossom)**: the minimal
154
+ form of the genre — one WebGL subject (a blooming particle flower) on one
155
+ canvas, Lenis smooth scroll, headlines split into `overflow-hidden` line
156
+ masks (`splittext--line`) sliding up on arrival, and a two-family type system
157
+ (light serif with true italics — SangBleu-style — mixed into a neutral
158
+ grotesk). No drag, no sound, no HUD maximalism: one subject + line-mask type
159
+ + smooth scroll already reads as the genre. Start here; add §2 gestures only
160
+ if the brief earns them. (unseen.co's own home additionally runs a
161
+ `webgl-rain` particle layer over the scene — weather as grade texture.)
153
162
  - **Particle identity page**: brand mark as 50k particles that disperse on
154
163
  pointer force and reform; sections change the formation target; scroll
155
164
  velocity agitates; reduced-motion = the formed mark as a still.
@@ -30,7 +30,10 @@ intentional. Decide up front:
30
30
  No metaphor = you'll produce disconnected effects. The metaphor decides what
31
31
  transitions, camera moves, and layout make sense — everything below serves it.
32
32
  - Immersive sites still need an **escape hatch**: visible menu with plain links,
33
- working back button, deep-linkable routes. Lost visitors close tabs.
33
+ working back button, deep-linkable routes. Lost visitors close tabs. On touch
34
+ devices the escape hatch becomes the PRIMARY route (DESIGN.md §13): drag/
35
+ spatial navigation conflicts with native scroll, so mobile gets the index-list
36
+ world view or a swipe carousel, with the full world behind an explicit tap-in.
34
37
 
35
38
  ## 1. Architecture: one persistent stage
36
39
 
@@ -5,6 +5,8 @@ for hover effects, cursor work, tilt, glow, "make it feel alive/tactile/premium"
5
5
  It EXTENDS DESIGN.md §6/§9/§10 — every ban there still stands (no hover-scale on
6
6
  `<img>`, custom cursors only on explicit request, one marquee max). This skill is
7
7
  about the last 5% of feel: small, physical, consistent responses to input.
8
+ DESIGN.md §13 governs the touch story: everything pointer-driven here is
9
+ fine-pointer-only, and whatever hover reveals must be reachable by tap.
8
10
  If an effect needs different markup (wrappers, layers, split spans), follow
9
11
  DESIGN.md §11's transformation-depth ladder — offer the restructure and, once
10
12
  confirmed, change the structure rather than approximating the effect in CSS.
@@ -5,6 +5,8 @@ animation, parallax, scroll storytelling, kinetic type, or "cinematic" feel.
5
5
  It EXTENDS DESIGN.md §6 (which still applies: 100/300/500 durations, ease-out
6
6
  exponential curves, reduced-motion fallbacks, no scroll listeners, no bounce).
7
7
  This file is about doing ambitious motion WELL, not about adding more of it.
8
+ Every effect here needs a mobile strategy per DESIGN.md §13 (shorter pins,
9
+ halved parallax, 600ms mobile entrance budget) — decide it at design time.
8
10
  If the requested motion needs structure the current markup can't express (pinned
9
11
  sections, split text, persistent stages), use DESIGN.md §11's transformation-depth
10
12
  ladder: offer restructure as an option and, once confirmed, rebuild the markup —
@@ -127,6 +129,14 @@ tell. Instead:
127
129
  ~60-90px/s), masked edges with `mask-image: linear-gradient`.
128
130
  - **Scrub showcase**: sticky canvas/image sequence, `useScroll` on the wrapper,
129
131
  map progress to frame index / rotation; preload frames; ≤ 2.5 viewports tall.
132
+ - **Canvas product story** (capsul-in-pro.com's form): a single-product launch
133
+ page as one scroll-scrubbed narrative — the product renders on a full-page
134
+ canvas (image-sequence or WebGL) and scroll drives its assembly/rotation
135
+ while short copy beats fade in at fixed progress stops; the site ships as
136
+ one bundled app with explicit portrait/landscape variants (it gates on
137
+ orientation rather than half-working in both). Copy the shape: one subject,
138
+ one scrubbed timeline, copy anchored to progress ranges, per-orientation
139
+ choreography decided up front.
130
140
  - **Text on a path** (verified on epic.net): a manifesto paragraph flows along a
131
141
  curved SVG path (`<textPath>` or per-word transforms sampled from a curve) and
132
142
  relaxes toward straight lines as scroll progress advances — the curve
@@ -0,0 +1,99 @@
1
+ # Dreative Specialist Skill — Refined Clean Business
2
+
3
+ Load this file when `plan.skills` includes `refined`, or the brief/prompt asks
4
+ for a "clean modern business site", premium-but-calm marketing, DTC/e-commerce
5
+ polish, "professional, not flashy", or names references like ch.maswitzerland.com
6
+ or lovvelavva.com. This is the OPPOSITE pole from immersive/cinematic: quality
7
+ expressed through restraint — spacing, photography, and type doing all the work,
8
+ with motion barely above zero. Most real client work lands here; treat it as a
9
+ craft discipline, not the absence of one.
10
+
11
+ It EXTENDS DESIGN.md (everything applies; this file tightens the dials). It does
12
+ NOT stack with `immersive`/`cinematic` — those are different registers. It pairs
13
+ well with a light dose of `interaction` (press states, underline draws) and the
14
+ first tier of `motion` (one hero sequence, 2-3 in-view reveals).
15
+
16
+ ## 0. The register: expensive silence
17
+
18
+ What separates premium-clean from generic-clean is not any element — it's the
19
+ ratios:
20
+
21
+ - **Whitespace is the brand.** Section padding 96-160px desktop / 56-80px
22
+ mobile; content max-width 1200-1320px with WIDE outer gutters; one idea per
23
+ viewport. If a section feels empty, that's the look working — resist filling.
24
+ - **Photography carries the emotion.** Real product/lifestyle imagery, art-
25
+ directed to one consistent grade (one light temperature, one background
26
+ family). Full-bleed image sections alternate with contained text sections —
27
+ the rhythm image / text / image IS the page structure. Never decorate around
28
+ weak imagery; demand or generate better imagery instead.
29
+ - **Type does hierarchy, color stays out of the way.** Near-monochrome palette:
30
+ warm or cool neutral family + ONE accent used almost exclusively on the
31
+ primary CTA and links. Backgrounds shift between 2-3 tints of the neutral
32
+ (e.g. white / #f6f5f2 / #111) to separate sections without borders.
33
+ - **Motion whispers.** Motion dial effectively ≤ 4: fade-rise entrances
34
+ (300-400ms, once), a sticky nav that gains a hairline+blur, underline draws,
35
+ press states. No parallax beyond 4%, no pinning, no canvas. A single
36
+ restrained signature (a slow ken-burns on the hero image, or a marquee of
37
+ press logos) is the ceiling.
38
+
39
+ ## 1. Page anatomy (marketing/DTC form)
40
+
41
+ The proven skeleton — vary the composition per DESIGN.md §5, not the order
42
+ logic:
43
+
44
+ 1. **Hero**: one full-width image or split layout; headline ≤ 8 words stating
45
+ the value in plain language; one CTA. No feature bullets in the hero.
46
+ 2. **Credibility strip**: press/client logos, real marks, grayscale or
47
+ single-tint (lovvelavva runs Forbes/Women's Health/Real Simple here —
48
+ this section converts and belongs high on DTC pages).
49
+ 3. **Value sections** (2-4): alternating image/text, each making ONE claim
50
+ with 1-2 sentences of support. Icons only if custom-drawn; three-generic-
51
+ icon-cards is the tell this register must avoid most.
52
+ 4. **Product/collection grid**: large images, generous gaps (24-32px), minimal
53
+ card chrome — image, name, price/one-liner; hover = image swap or subtle
54
+ zoom-crop INSIDE a fixed frame (no card growth).
55
+ 5. **Social proof**: 1-3 real testimonials with names/photos, editorial layout
56
+ (big quote type), never a 3-card testimonial row.
57
+ 6. **Closing CTA**: calm full-width section, one sentence, one button.
58
+ 7. **Footer**: structured, generous, quiet — the footer's polish is a trust
59
+ signal in this register; give it real columns, legal, newsletter.
60
+
61
+ E-commerce specifics: sticky add-to-cart on product pages (mobile bottom bar),
62
+ price always visible, shipping/returns reassurance near the CTA, cart as a
63
+ slide-over drawer not a page.
64
+
65
+ ## 2. The discovery-grid variant (cosmos.so-like)
66
+
67
+ For content/discovery products (galleries, moodboards, catalogs): near-zero
68
+ chrome around a masonry/justified image grid; dark or paper-white surface;
69
+ images at native aspect ratios (never uniform crops); hover = slight lift +
70
+ metadata fade-in on top of the image; infinite scroll with a sentinel loader;
71
+ the search/filter bar is the only persistent UI. The product IS the grid —
72
+ navigation, branding, and controls stay almost invisible until needed.
73
+
74
+ ## 3. What "modern" means here (2024+, not 2016 flat)
75
+
76
+ - Hairline borders (1px, 8-12% alpha) instead of shadows for structure; the
77
+ 2-3 stacked tinted shadows (interaction.md §3) reserved for genuinely
78
+ floating elements (dropdowns, drawers).
79
+ - Larger type than feels safe: body 17-18px on marketing pages, display
80
+ clamped 2.5-4.5rem, tight leading. Small timid type is the #1 dated tell.
81
+ - Radius system: one value family — either near-square (2-4px, editorial/
82
+ luxury) or soft (12-16px, DTC/consumer) — never mixed.
83
+ - Buttons: solid accent primary + quiet text-link secondary. Pill shape only
84
+ in the consumer/DTC variant. No outlined-button armies.
85
+ - Real `<img>`/`<picture>` with proper aspect-ratio boxes; no CSS-drawn
86
+ product mockups; `object-fit: cover` with art-directed focal points.
87
+
88
+ ## 4. Guardrails
89
+
90
+ - If you're adding an effect to make a section interesting, the section's
91
+ content or imagery is the problem — fix that instead.
92
+ - No gradient meshes, no glassmorphism cards, no floating blob backgrounds,
93
+ no emoji in UI copy: all instantly cheapen this register.
94
+ - Accessibility floor is easy here — don't squander it: AA contrast on the
95
+ tinted neutrals (test the #767676-gray-on-white trap), visible focus,
96
+ semantic landmarks.
97
+ - Performance IS the aesthetic: LCP image preloaded, fonts ≤ 2 files,
98
+ zero animation libraries unless motion is actually used — a clean site
99
+ that loads instantly reads as more premium than any effect.