dreative 0.2.0 → 0.3.1
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.
- package/dist/shared/design.js +1 -0
- package/package.json +1 -1
- package/skill/dreative/DESIGN.md +215 -1
- package/skill/dreative/SKILL.md +13 -2
- package/skill/dreative/skills/cinematic.md +54 -0
- package/skill/dreative/skills/immersive.md +4 -1
- package/skill/dreative/skills/interaction.md +2 -0
- package/skill/dreative/skills/motion.md +85 -0
- package/skill/dreative/skills/refined.md +99 -0
package/dist/shared/design.js
CHANGED
|
@@ -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.
|
|
3
|
+
"version": "0.3.1",
|
|
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": {
|
package/skill/dreative/DESIGN.md
CHANGED
|
@@ -259,6 +259,61 @@ library (Phosphor/Radix/Tabler/HugeIcons; Lucide only on request), one strokeWid
|
|
|
259
259
|
globally. Logo walls: real SVG marks (`https://cdn.simpleicons.org/<slug>`) or
|
|
260
260
|
generated monograms — logos only, no category captions, below the hero.
|
|
261
261
|
|
|
262
|
+
### Generated media (probe your environment, then use it)
|
|
263
|
+
|
|
264
|
+
Before designing, check what media generation your environment actually offers —
|
|
265
|
+
image-gen tools, video-gen tools, or a CLI that can produce them — and treat any
|
|
266
|
+
capability found as a first-class design material, not a nice-to-have:
|
|
267
|
+
|
|
268
|
+
- **Images**: generate hero photography, product/context shots, and textures at
|
|
269
|
+
the section's exact aspect ratio, prompted for the brand's physical subject
|
|
270
|
+
and the page's light temperature so they grade into the palette. Generate the
|
|
271
|
+
grain tile and any masks/mattes too instead of hand-rolling SVG.
|
|
272
|
+
- **Video**: a generated 5–10s seamless loop is one of the biggest single UI
|
|
273
|
+
upgrades available — use it as: a hero background (muted, `autoplay loop
|
|
274
|
+
playsinline`, poster frame, `prefers-reduced-motion` swaps to the poster);
|
|
275
|
+
the budget "living surface" (a pre-rendered fluid/particle/atmosphere loop
|
|
276
|
+
instead of a GPGPU sim — cinematic.md's budget recipe); hover-preview loops
|
|
277
|
+
on work cards; or an image-sequence for scroll-scrubbed narratives (export
|
|
278
|
+
frames, scrub per motion.md).
|
|
279
|
+
- **Integrate with motion, don't just embed** — a raw `<video>`/`<img>` dropped
|
|
280
|
+
in a section is not the treatment. Generated media enters the page THROUGH the
|
|
281
|
+
motion system; pick 1–2 treatments per page from this vocabulary (or invent in
|
|
282
|
+
its spirit), matched to the register:
|
|
283
|
+
- **Pixel/dither reveal**: video or image materializes from coarse blocks —
|
|
284
|
+
a shader that lerps sample resolution from ~24px mosaic to full res (or a
|
|
285
|
+
stepped `image-rendering: pixelated` downscale swap for the budget path),
|
|
286
|
+
driven by scroll progress or hover. Reads as digital-craft; dark-tech and
|
|
287
|
+
editorial registers.
|
|
288
|
+
- **Floating media**: images hover in depth with slow damped drift (±6-10px,
|
|
289
|
+
4-8s loops, each at a different phase), subtle parallax by depth layer, and
|
|
290
|
+
a soft contact shadow — the immersive "paper sheets in space" look without
|
|
291
|
+
WebGL. Cap at 3-5 floaters per view.
|
|
292
|
+
- **Mask-shaped video**: the loop plays inside display type (`background-clip:
|
|
293
|
+
text` / SVG mask on a 10vw+ headline), an arch/circle clip-path, or the
|
|
294
|
+
brand mark — the video becomes typography/identity rather than a rectangle.
|
|
295
|
+
- **Scroll-scrubbed sequence**: generated frames scrubbed by scroll for
|
|
296
|
+
assemble/morph/rotate narratives (motion.md's canvas product story).
|
|
297
|
+
- **Velocity-touched media**: scroll/drag velocity stretches, RGB-splits, or
|
|
298
|
+
ripples the media plane for a beat, settling with damped decay
|
|
299
|
+
(cinematic.md §2) — needs the WebGL media-plane sync.
|
|
300
|
+
- **Hover-woken loops**: stills that crossfade into their video loop on
|
|
301
|
+
hover/focus (240ms), pause + rewind-to-poster on leave; works as generated
|
|
302
|
+
"living thumbnails" on work/product cards.
|
|
303
|
+
- **Curtain/split reveal**: media enters behind a 2-4 panel wipe or an
|
|
304
|
+
expanding inset clip (`clip-path: inset(40% 30%) → inset(0)`), timed with
|
|
305
|
+
the section's line-mask type reveal so image and headline arrive as one
|
|
306
|
+
choreographed beat.
|
|
307
|
+
Whatever the treatment, honor the floors: reduced-motion gets the poster
|
|
308
|
+
frame, hover treatments have focus equivalents, and the effect is justified
|
|
309
|
+
in one sentence like any other motion (§6).
|
|
310
|
+
- Discipline: same rationing as everything else — one video loop per view,
|
|
311
|
+
compress hard (H.264/AV1, ≤ 2–4MB per loop, no audio track), lazy-load below
|
|
312
|
+
the fold, and never let generated media replace REAL product screenshots or
|
|
313
|
+
the client's actual photography when those exist.
|
|
314
|
+
- If no generation capability exists, say so and fall back down the §7 priority
|
|
315
|
+
list — never fake a video with a div animation.
|
|
316
|
+
|
|
262
317
|
## 8. Content and copy
|
|
263
318
|
|
|
264
319
|
≤ 8-word section headlines, ≤ 25-word subtext, one copy register per page, quotes
|
|
@@ -323,13 +378,78 @@ recomposition → full replacement only when unsalvageable. Honor existing
|
|
|
323
378
|
accessibility wins and analytics hooks. Preserve prior element-level edits when
|
|
324
379
|
`previousFile` is set.
|
|
325
380
|
|
|
381
|
+
### The preservation contract (mandatory for ANY redesign of existing code)
|
|
382
|
+
|
|
383
|
+
Redesigns fail catastrophically in one specific way: the agent rebuilds the page
|
|
384
|
+
from its mental image of it and silently drops what it forgot — links, ids, form
|
|
385
|
+
fields, whole features. Doctrine prose does not prevent this; only a mechanical
|
|
386
|
+
before/after check does. The contract protects **content and function**, never
|
|
387
|
+
structure — a restructure/reimagine still rebuilds markup, components, and
|
|
388
|
+
routing as drastically as the rung demands.
|
|
389
|
+
|
|
390
|
+
**Step 1 — Manifest (before editing anything).** Per page/view being redesigned,
|
|
391
|
+
read the ORIGINAL source and write a manifest file (scratch or
|
|
392
|
+
`.dreative/preserve/<page>.json`) enumerating:
|
|
393
|
+
|
|
394
|
+
- **Links & routes**: every `href` / `to` / `router.push` / `navigate` target.
|
|
395
|
+
- **Interactive elements**: every button/menu/toggle/input with its handler or
|
|
396
|
+
action (name + one line of what it does), every form with its field names,
|
|
397
|
+
types, validation, and submit target.
|
|
398
|
+
- **Identity hooks**: every `id`, `data-*` attribute, `aria-*` label, analytics
|
|
399
|
+
hook, test id, and anchor target. These are external contracts — other code,
|
|
400
|
+
CSS, tests, and deep links point at them.
|
|
401
|
+
- **Visible text**: every heading, label, button caption, tooltip, empty-state,
|
|
402
|
+
and legal string (verbatim).
|
|
403
|
+
- **Data views & states**: every list/table/feed and what feeds it (API call,
|
|
404
|
+
prop, store), every conditional view — tabs, modals, auth states, wizard
|
|
405
|
+
steps, loading/empty/error branches.
|
|
406
|
+
- **Public API**: the component's exports, props, and context it consumes —
|
|
407
|
+
callers must not break.
|
|
408
|
+
|
|
409
|
+
**Step 2 — Redesign at the confirmed rung.** Every manifest entry must land
|
|
410
|
+
somewhere in the new code. Restructuring means an entry may MOVE (a tab becomes
|
|
411
|
+
a section, a sidebar item becomes a command-palette entry, a table becomes
|
|
412
|
+
cards) — moving is encouraged; vanishing is a bug. If the new design has no room
|
|
413
|
+
for something, relocate it (overflow menu, secondary view, settings page) —
|
|
414
|
+
never delete a feature to make a layout work. Rewriting copy is allowed only at
|
|
415
|
+
the reimagine rung or on explicit request, and each rewrite is logged as
|
|
416
|
+
intentional.
|
|
417
|
+
|
|
418
|
+
**Step 3 — Verify mechanically (not by vibes).** After writing the new code,
|
|
419
|
+
walk the manifest item by item and grep the new source for each link target,
|
|
420
|
+
handler/action, id/data-attribute, field name, visible string, and data view.
|
|
421
|
+
Anything unmatched is either fixed on the spot or listed as an intentional
|
|
422
|
+
change with a reason. Then report a **preservation ledger** to the user:
|
|
423
|
+
"kept 14/14 links, 9/9 actions, 6/6 form fields, all 4 tab views; moved the
|
|
424
|
+
sort dropdown into the toolbar; rewrote 2 headings (reimagine rung)". A
|
|
425
|
+
redesign without a ledger is not done.
|
|
426
|
+
|
|
427
|
+
**Step 4 — Render check.** Every data view and conditional state that rendered
|
|
428
|
+
before must render after: open (or mentally walk) each tab/modal/state, not
|
|
429
|
+
just the default view. A page that "looks designed" but shows an empty shell
|
|
430
|
+
where a table used to be is a failed redesign regardless of how good the hero
|
|
431
|
+
looks.
|
|
432
|
+
|
|
433
|
+
### Motion is a deliverable, not a garnish
|
|
434
|
+
|
|
435
|
+
When the user asked for motion/animation (explicitly, or by picking the motion /
|
|
436
|
+
interaction / immersive / cinematic skills), shipped motion is verified like a
|
|
437
|
+
feature: before declaring done, name the specific animations implemented (which
|
|
438
|
+
element, which trigger, which duration/ease) and confirm they exist in the code
|
|
439
|
+
and appear in the self-critique screenshots. "The design system implies motion"
|
|
440
|
+
does not count; entrance choreography, scroll behavior, and micro-interactions
|
|
441
|
+
must be literally present. If zero animations survive to the final code, the
|
|
442
|
+
request was not fulfilled — go back and add them before reporting done.
|
|
443
|
+
|
|
326
444
|
### The transformation-depth ladder (offer it, then execute it)
|
|
327
445
|
|
|
328
446
|
A redesign request has a depth, and styling is only the shallowest rung. When the
|
|
329
447
|
user asks for meaningful change ("redesign", "make it modern", "make it look like
|
|
330
448
|
<reference site>", "change it entirely") and the depth is ambiguous, present this
|
|
331
449
|
ladder as explicit options (one short question, plain labels) and wait for the
|
|
332
|
-
answer — do NOT silently default to the shallowest rung
|
|
450
|
+
answer — do NOT silently default to the shallowest rung. Bundle the specialist
|
|
451
|
+
skill picker (SKILL.md) into the same question so the user answers depth and
|
|
452
|
+
treatments in one pass:
|
|
333
453
|
|
|
334
454
|
1. **Restyle** — tokens only: color, type, spacing, radius, shadows, motion
|
|
335
455
|
polish. Markup and structure untouched. Right for "refresh the look".
|
|
@@ -385,3 +505,97 @@ the output is not done.
|
|
|
385
505
|
14. Every block id from the layout appears as `data-dreative-id` (design-page only).
|
|
386
506
|
15. Dark mode (when in scope): semantic-token swap, surface-lightness depth,
|
|
387
507
|
desaturated accents, tested both modes.
|
|
508
|
+
16. Redesign of existing code: preservation manifest written BEFORE editing;
|
|
509
|
+
every link, id, handler, form field, visible string, data view, and
|
|
510
|
+
conditional state verified present (or logged as intentional) in the new
|
|
511
|
+
code; preservation ledger reported. If motion skills were chosen, the
|
|
512
|
+
implemented animations are named and present in the code.
|
|
513
|
+
|
|
514
|
+
## 13. Mobile & touch adaptation (how ambitious effects degrade)
|
|
515
|
+
|
|
516
|
+
Ambitious designs die on phones first. Every effect gets an explicit mobile
|
|
517
|
+
strategy DECIDED AT DESIGN TIME, not patched after. The rule of thumb: touch
|
|
518
|
+
devices get a *different good design*, never a broken half-version of the
|
|
519
|
+
desktop one.
|
|
520
|
+
|
|
521
|
+
**Pointer effects** (cursor followers, magnetic pull, spotlight, tilt, hover
|
|
522
|
+
reveals): gate ALL of them behind `@media (hover: hover) and (pointer: fine)`.
|
|
523
|
+
On touch, whatever hover revealed must be visible by default or reachable by
|
|
524
|
+
tap — never lost. Custom cursors simply don't exist on touch; don't ship their
|
|
525
|
+
DOM/listeners there.
|
|
526
|
+
|
|
527
|
+
**Pinned/scrubbed sections**: pinning is fragile on mobile (URL-bar resize
|
|
528
|
+
fires viewport changes mid-pin; iOS momentum scroll skips scrub frames).
|
|
529
|
+
Strategies in preference order: (1) keep the pin but shorten it (≤ 1.5
|
|
530
|
+
viewports) and drive it with `position: sticky`, never JS pinning; (2) unpin —
|
|
531
|
+
the same content as stacked sections with simple in-view reveals;
|
|
532
|
+
(3) `ScrollTrigger.matchMedia()` / a `matchMedia` branch that swaps the whole
|
|
533
|
+
choreography. Never let a desktop pin length ride on a phone.
|
|
534
|
+
|
|
535
|
+
**Parallax & depth layers**: halve the differential on small screens (8-15% →
|
|
536
|
+
4-7%) or drop to zero; small viewports make parallax read as jitter. Layered
|
|
537
|
+
depth scenes collapse to 2 layers max.
|
|
538
|
+
|
|
539
|
+
**Drag-to-explore / spatial navigation**: on touch, drag conflicts with native
|
|
540
|
+
scroll. Either give the pannable surface a dedicated full-screen mode entered
|
|
541
|
+
by tap (with a visible close), or replace it with a swipeable carousel /
|
|
542
|
+
plain scrolling index. The conventional index route (immersive.md's escape
|
|
543
|
+
hatch) becomes the PRIMARY route on mobile, not the fallback.
|
|
544
|
+
|
|
545
|
+
**WebGL/canvas**: assume the phone GPU is 5-10× weaker and thermally throttled.
|
|
546
|
+
Tier at boot (`devicePixelRatio` capped at 2, sim resolution halved,
|
|
547
|
+
post-processing off) or swap the sim for a pre-rendered video loop / poster.
|
|
548
|
+
`deviceMemory`/first-dropped-frames checks pick the tier; a visible "reduce
|
|
549
|
+
effects" toggle when the brief allows.
|
|
550
|
+
|
|
551
|
+
**Layout & ergonomics floor** (extends checklist §12.12): tap targets ≥ 44px
|
|
552
|
+
with ≥ 8px gaps; primary actions in thumb reach (bottom half) on app-register
|
|
553
|
+
mobile; `100dvh` not `100vh`; no horizontal body scroll at 320px; type scale
|
|
554
|
+
clamps DOWN gracefully (hero ≥ 2rem, body stays ≥ 16px — iOS zooms inputs
|
|
555
|
+
under 16px); sticky navs shrink rather than stack; test the three widths 320 /
|
|
556
|
+
768 / 1280 mentally before responding.
|
|
557
|
+
|
|
558
|
+
**Motion budget on mobile**: entrance choreography total ≤ 600ms (vs 900ms
|
|
559
|
+
desktop), at most 1 scroll-driven sequence per page, marquees pause when
|
|
560
|
+
off-screen. Battery is a design constraint: continuous rAF loops must idle
|
|
561
|
+
when nothing animates.
|
|
562
|
+
|
|
563
|
+
## 14. Typography sourcing (kill the Inter-everywhere default)
|
|
564
|
+
|
|
565
|
+
The reflex-reject list (§3) says what NOT to reach for; this is where to reach
|
|
566
|
+
instead. All fonts below are free (Google Fonts or Fontshare/ITF). The
|
|
567
|
+
commercial fonts real award sites use — verified: unseen.co sets **Saol
|
|
568
|
+
Display Light/Italic + Neue Montreal**; unseen's Blossom lab sets **SangBleu
|
|
569
|
+
Serif + PP Neue Montreal**; capsul-in-pro sets **Messina Sans** — are the
|
|
570
|
+
targets; the pairings below are their honest free stand-ins, not lookalikes of
|
|
571
|
+
each other.
|
|
572
|
+
|
|
573
|
+
Per aesthetic register (display / body):
|
|
574
|
+
|
|
575
|
+
- **Cinematic & experimental** (unseen-like): light editorial serif with a
|
|
576
|
+
true italic for display — `Boska`, `Sentient`, or `Gelasio Light Italic` —
|
|
577
|
+
over a neutral grotesk body — `Switzer`, `Hanken Grotesk`. Mixing italic
|
|
578
|
+
serif words INTO a grotesk headline is the genre move (unseen does exactly
|
|
579
|
+
this). Mono microtype for HUD labels: `Fragment Mono` or `Martian Mono`.
|
|
580
|
+
- **Minimal / premium product**: one grotesk family carrying everything —
|
|
581
|
+
`General Sans`, `Switzer`, or `Schibsted Grotesk` in 3-4 weights. The
|
|
582
|
+
Neue Montreal / Messina Sans stand-in tier. Tight display tracking
|
|
583
|
+
(−0.02 to −0.04em), no second family.
|
|
584
|
+
- **Editorial / luxury**: `Zodiak` or `Besley` display over `Hanken Grotesk`
|
|
585
|
+
or `Switzer` body; small-caps eyebrows tracked +0.08em. (Reach here only
|
|
586
|
+
when §3's serif discipline is satisfied.)
|
|
587
|
+
- **Bold / brutalist / campaign**: `Clash Display` or `Cabinet Grotesk` (black
|
|
588
|
+
weights) display over `Switzer`/`General Sans` body; `Bricolage Grotesque`
|
|
589
|
+
when some warmth is wanted.
|
|
590
|
+
- **Playful / consumer** (lovvelavva-like DTC): `Cabinet Grotesk` or `Gambetta`
|
|
591
|
+
display, rounded moments via weight and spacing — NOT a rounded font —
|
|
592
|
+
over `Hanken Grotesk` body.
|
|
593
|
+
- **Corporate trust / clean business**: `Switzer` or system stack; Inter is
|
|
594
|
+
legitimate here (§3). Differentiate through scale contrast and spacing,
|
|
595
|
+
not font novelty.
|
|
596
|
+
|
|
597
|
+
Rules: still run §3's selection procedure — this list feeds step 3, it does
|
|
598
|
+
not replace the brand-voice reasoning. Self-host via Fontshare/google-webfonts
|
|
599
|
+
downloads (`font-display: swap`, preload the display weight only). Never ship
|
|
600
|
+
more than 2 families / ~5 weight files. If the brief names a commercial font
|
|
601
|
+
the project already licenses, use the real thing.
|
package/skill/dreative/SKILL.md
CHANGED
|
@@ -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. **Preservation contract (non-negotiable when redesigning existing code):** BEFORE editing any existing page, build the preservation manifest per DESIGN.md §11 (every link, id/data-attribute, handler, form field, visible string, data view, and conditional state — tabs, modals, auth branches); AFTER redesigning, mechanically verify each entry survives in the new code and report the preservation ledger. Restructure moves things; it never loses them. **Real motion engineering:** when motion/3d/immersive/cinematic treatments are chosen, deliver them with the proper libraries per the skill files (GSAP + ScrollTrigger, Lenis, `motion/react`, three.js/R3F) — actually add the dependencies to the project (`npm i gsap lenis` etc.), wire providers/render loops, and build the choreography. A static page with a few CSS transitions does not fulfill a motion request; the target is unseen.co-grade coordinated animation, the shipped result must clear the motion-dial inventory in `skills/motion.md` §9, and the self-critique pass must name the specific animations shipped. **Generated media:** probe your environment for image/video generation tools before designing and use them per DESIGN.md §7 — generated hero imagery, textures, and especially seamless video loops (hero backgrounds, pre-rendered living surfaces, hover previews) integrated into the motion system are among the highest-impact upgrades available. **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? (6) preservation ledger clean — every link, action, form field, text string, and tab/modal/state from the manifest present or logged as intentional? (7) if motion treatments were chosen: are the animation libraries actually installed and imported, and can you name ≥3 specific shipped animations (element + trigger + duration) visible in the running page? 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.
|
|
@@ -161,6 +170,51 @@ All of 3d.md §7 and immersive.md §6, plus:
|
|
|
161
170
|
on real DOM, click-and-hold in JS only. 70% of the mood, runs on anything —
|
|
162
171
|
the right call below motion dial 8 or on content-heavy sites.
|
|
163
172
|
|
|
173
|
+
## 6.5 The unseen.co replication blueprint (build order)
|
|
174
|
+
|
|
175
|
+
When the brief is "make it like unseen.co" (or this genre at dial 9–10), build
|
|
176
|
+
in THIS order — each layer works before the next starts. Do not attempt it as
|
|
177
|
+
one monolithic rewrite; do not stop after step 2 and call it done.
|
|
178
|
+
|
|
179
|
+
**Manifest:** `npm i gsap lenis three @react-three/fiber @react-three/drei
|
|
180
|
+
@react-three/postprocessing` (React) or `gsap lenis three` (vanilla/OGL).
|
|
181
|
+
Wire Lenis + ScrollTrigger per motion.md §8 first.
|
|
182
|
+
|
|
183
|
+
**Layer stack (bottom → top):** persistent WebGL canvas (fixed, full-viewport)
|
|
184
|
+
→ real DOM content (the accessible document) → HUD chrome (fixed corners) →
|
|
185
|
+
grain overlay → custom cursor. Each is its own component/layer mounted in the
|
|
186
|
+
root layout, outside the router swap point (immersive.md §1).
|
|
187
|
+
|
|
188
|
+
1. **Smooth scroll + type system.** Lenis running, line-mask reveals on every
|
|
189
|
+
heading (motion.md §8), the two-family type mix (grotesk + true-italic
|
|
190
|
+
serif accents in one headline), numbered HUD chrome (`01 Index`…). The page
|
|
191
|
+
should already feel 60% of the genre with zero WebGL.
|
|
192
|
+
2. **The living surface.** One canvas, one simulation family (§1). Start with
|
|
193
|
+
the highest effort/impact ratio: a shader plane with fbm + domain-warp fed
|
|
194
|
+
by palette uniforms and damped `uMouse` velocity (3d.md §4), or the
|
|
195
|
+
pre-rendered-video budget path (§6). Grain overlay goes in now — it glues
|
|
196
|
+
DOM and canvas into one graded image.
|
|
197
|
+
3. **Scroll = camera.** Tall scroll container drives a camera dolly / scene
|
|
198
|
+
progress via damped scrub (immersive.md §4). Section copy floats in at
|
|
199
|
+
progress stops. This is the "one continuous shot" that separates the genre
|
|
200
|
+
from a parallax page.
|
|
201
|
+
4. **Media through the surface.** Sync DOM image/work-card rects to texture
|
|
202
|
+
planes in the canvas (measure with `getBoundingClientRect` on resize +
|
|
203
|
+
scroll, don't guess) so hover/velocity distortion touches them; keep the
|
|
204
|
+
real DOM images underneath for a11y/fallback (§1). Velocity-reactive
|
|
205
|
+
stretch/RGB-split on scroll flicks, hard-clamped (§2).
|
|
206
|
+
5. **Gestures + cursor.** Pick 2–3 from §2 (drag-to-explore, click & hold,
|
|
207
|
+
cursor-as-instrument), each labeled, each with a keyboard/boring
|
|
208
|
+
equivalent. Custom cursor: one dot, damped follow, contextual labels.
|
|
209
|
+
6. **Doors and passages.** Preloader (real progress, choreographed reveal into
|
|
210
|
+
the idling scene — immersive.md §2), entry gate if sound ships (§3), route
|
|
211
|
+
transitions driven by the simulation (§4).
|
|
212
|
+
7. **The floor.** Reduced-motion still frame, degrade ladder, contrast scrim,
|
|
213
|
+
mobile strategy (poster or halved sim), pause on hidden (§5).
|
|
214
|
+
|
|
215
|
+
Ship checkpoint after every layer: run it, screenshot it, keep it working.
|
|
216
|
+
A failed step 4 must not take down steps 1–3.
|
|
217
|
+
|
|
164
218
|
## 7. Changing an existing site into this
|
|
165
219
|
|
|
166
220
|
Same rule as immersive.md §8: this register cannot be CSS'd onto a conventional
|
|
@@ -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
|
|
@@ -135,3 +145,78 @@ tell. Instead:
|
|
|
135
145
|
("PLAY VIDEO ⟲") slowly rotates around the pointer while it's over the media
|
|
136
146
|
region — SVG `<textPath>` on a circle, damped position follow, constant
|
|
137
147
|
rotation. Replaces the play button; fine pointers only, real button fallback.
|
|
148
|
+
|
|
149
|
+
## 8. Setup blueprints — install and WIRE the stack (do not skip)
|
|
150
|
+
|
|
151
|
+
Doctrine without dependencies ships a static page. When this skill is active,
|
|
152
|
+
actually add the libraries to the project and wire them before designing
|
|
153
|
+
sections. Pick the stack per §0, then:
|
|
154
|
+
|
|
155
|
+
**GSAP + ScrollTrigger + Lenis (brand pages, the unseen.co-family stack):**
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
npm i gsap lenis
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```js
|
|
162
|
+
// one module, imported once at app root (e.g. src/lib/motion.ts)
|
|
163
|
+
import gsap from "gsap";
|
|
164
|
+
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
|
165
|
+
import Lenis from "lenis";
|
|
166
|
+
|
|
167
|
+
gsap.registerPlugin(ScrollTrigger);
|
|
168
|
+
export const lenis = new Lenis({ lerp: 0.1, smoothWheel: true });
|
|
169
|
+
lenis.on("scroll", ScrollTrigger.update);
|
|
170
|
+
gsap.ticker.add((t) => lenis.raf(t * 1000));
|
|
171
|
+
gsap.ticker.lagSmoothing(0);
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
React: run that inside a `useEffect` in a `<SmoothScroll>` provider mounted in
|
|
175
|
+
the root layout (destroy on unmount); Next.js needs `"use client"` on it.
|
|
176
|
+
ONE Lenis instance, ONE gsap ticker — never per-component.
|
|
177
|
+
|
|
178
|
+
**motion/react (React product+brand):** `npm i motion` — import from
|
|
179
|
+
`"motion/react"`. Shared transition vocabulary in one exported object
|
|
180
|
+
(`export const spring = { type: "spring", stiffness: 300, damping: 30 }`), used
|
|
181
|
+
everywhere; `MotionConfig reducedMotion="user"` at the root.
|
|
182
|
+
|
|
183
|
+
**Easing tokens (either stack):** commit page-wide —
|
|
184
|
+
`expo.out` / `cubic-bezier(0.16, 1, 0.3, 1)` for entrances/reveals,
|
|
185
|
+
`power2.inOut` for scrubbed/camera moves, springs for interactive. Define once
|
|
186
|
+
(gsap defaults via `gsap.defaults({ ease: "expo.out" })` or CSS custom
|
|
187
|
+
property `--ease-out-expo`), reference everywhere.
|
|
188
|
+
|
|
189
|
+
**Line-mask headline reveal (the canonical premium move, copy this shape):**
|
|
190
|
+
|
|
191
|
+
```jsx
|
|
192
|
+
// each line: <div class="overflow-hidden"><div class="line">…</div></div>
|
|
193
|
+
gsap.set(".line", { yPercent: 110 });
|
|
194
|
+
gsap.to(".line", {
|
|
195
|
+
yPercent: 0, duration: 0.9, ease: "expo.out", stagger: 0.08,
|
|
196
|
+
scrollTrigger: { trigger: el, start: "top 80%", once: true },
|
|
197
|
+
});
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Use GSAP `SplitText` (free) with `type: "lines", mask: "lines"` instead of
|
|
201
|
+
hand-wrapping when available; `aria-label` the original string per §4.
|
|
202
|
+
|
|
203
|
+
## 9. Definition of done — the shipped-motion inventory
|
|
204
|
+
|
|
205
|
+
A motion request is fulfilled only if the final code contains, verifiably
|
|
206
|
+
(grep the imports, name the elements):
|
|
207
|
+
|
|
208
|
+
- **Dial 4–6 (product/calm brand):** composed hero entrance timeline (§2), the
|
|
209
|
+
three global feel constants (interaction.md §0), 1–2 `whileInView`/triggered
|
|
210
|
+
section reveals, animated states (loading/success). No smooth scroll.
|
|
211
|
+
- **Dial 7–8 (expressive brand):** all of the above PLUS Lenis smooth scroll,
|
|
212
|
+
line-mask headline reveals on hero + section headings, one scrubbed scroll
|
|
213
|
+
sequence (pin, parallax system, or progress-bound narrative), one signature
|
|
214
|
+
pointer effect (interaction.md §1), and a page/route transition treatment.
|
|
215
|
+
- **Dial 9–10 (award-site):** all of the above PLUS the immersive.md or
|
|
216
|
+
cinematic.md architecture actually built (persistent stage/canvas, preloader
|
|
217
|
+
choreography, spatial or sim-driven route transitions, custom cursor).
|
|
218
|
+
|
|
219
|
+
Before reporting done, list which inventory items shipped and where (element +
|
|
220
|
+
trigger). "The page has hover states" does not clear dial 7+. If a listed item
|
|
221
|
+
was deliberately cut, say so and why. This inventory is what the SKILL.md
|
|
222
|
+
self-critique pass checks against.
|
|
@@ -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.
|