dreative 0.5.1 → 0.5.2
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/README.md +49 -27
- package/dist/cli/audit.js +206 -0
- package/dist/cli/audit.test.js +79 -0
- package/dist/cli/docsCheck.js +163 -0
- package/dist/cli/docsCheck.test.js +8 -0
- package/dist/cli/index.js +45 -9
- package/dist/server/preview.js +73 -73
- package/dist/server/store.js +11 -0
- package/dist/shared/artifacts.js +162 -0
- package/dist/shared/design.js +42 -22
- package/dist/shared/ruleSystem.js +130 -0
- package/dist/shared/ruleSystem.test.js +187 -0
- package/dist/shared/skillSystem.js +173 -0
- package/dist/shared/skillSystem.test.js +110 -0
- package/dist/ui/assets/{index--vztc_MR.js → index-CKwmbx2j.js} +13 -13
- package/dist/ui/index.html +12 -12
- package/package.json +5 -3
- package/skill/dreative/DESIGN.md +121 -93
- package/skill/dreative/PLAN.md +229 -92
- package/skill/dreative/SKILL.md +218 -137
- package/skill/dreative/frameworks/nextjs.md +13 -0
- package/skill/dreative/frameworks/react-vite.md +12 -0
- package/skill/dreative/frameworks/styling.md +14 -0
- package/skill/dreative/frameworks/sveltekit.md +10 -0
- package/skill/dreative/frameworks/vue-nuxt.md +12 -0
- package/skill/dreative/recipes/3d-recipes.md +44 -0
- package/skill/dreative/recipes/cinematic-recipes.md +19 -0
- package/skill/dreative/recipes/immersive-recipes.md +18 -0
- package/skill/dreative/recipes/media-recipes.md +60 -0
- package/skill/dreative/recipes/motion-recipes.md +44 -0
- package/skill/dreative/references/ARTIFACTS.md +180 -0
- package/skill/dreative/references/REFLEX_FONTS.json +44 -0
- package/skill/dreative/references/RULES.json +186 -0
- package/skill/dreative/references/SKILL_CONTRACT.md +30 -0
- package/skill/dreative/references/TIERS.md +42 -0
- package/skill/dreative/schemas/plan.schema.json +241 -0
- package/skill/dreative/schemas/verify.schema.json +61 -0
- package/skill/dreative/skills/3d.md +94 -267
- package/skill/dreative/skills/cinematic.md +56 -232
- package/skill/dreative/skills/experimental.md +108 -95
- package/skill/dreative/skills/immersive.md +61 -223
- package/skill/dreative/skills/interaction.md +9 -1
- package/skill/dreative/skills/media.md +135 -564
- package/skill/dreative/skills/mobile.md +128 -117
- package/skill/dreative/skills/motion.md +89 -256
- package/skill/dreative/skills/refined.md +116 -102
- package/skill/dreative/skills/ux.md +155 -144
- package/dist/server/ai.js +0 -177
|
@@ -1,256 +1,89 @@
|
|
|
1
|
-
# Dreative Specialist Skill — Motion & Scroll Choreography
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
- **
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
##
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
fade reads as 2021 template.
|
|
91
|
-
- `aria-label` the original string on the split container; split spans get
|
|
92
|
-
`aria-hidden`. Re-splitting on resize: debounce, or use `SplitText`'s autoSplit.
|
|
93
|
-
- Counters: animate with `useSpring`/gsap `snap: 1`, `tabular-nums` mandatory,
|
|
94
|
-
duration ≤ 1.2s, trigger once in view.
|
|
95
|
-
|
|
96
|
-
## 5. Layout & presence
|
|
97
|
-
|
|
98
|
-
- Motion `layout` prop for reflow (filtering grids, expanding cards, reordering) —
|
|
99
|
-
it's FLIP under the hood, transform-only. `layoutId` for shared-element morphs
|
|
100
|
-
(card → modal). Wrap conditional trees in `AnimatePresence mode="popLayout"`.
|
|
101
|
-
- Accordion/height: `grid-template-rows: 0fr → 1fr` (CSS, cheap) or Motion
|
|
102
|
-
`height: "auto"` (it measures for you). Never `max-height: 9999px`.
|
|
103
|
-
- **View Transitions API** for page-level transitions (`document.startViewTransition`,
|
|
104
|
-
or the framework wrapper e.g. Next `<ViewTransition>`): name persistent elements
|
|
105
|
-
with `view-transition-name` so they morph across routes. Feature-gate; fall back
|
|
106
|
-
to instant navigation, not a JS fade.
|
|
107
|
-
|
|
108
|
-
## 5.5 Velocity & physical feel (what makes motion feel ALIVE, dial ≥ 6)
|
|
109
|
-
|
|
110
|
-
Static easings play back; physical motion RESPONDS. The difference between a
|
|
111
|
-
tweened page and a top-tier one is that top-tier motion carries momentum:
|
|
112
|
-
|
|
113
|
-
- **Scroll velocity as an input.** Track smoothed velocity (Lenis exposes it;
|
|
114
|
-
else lerp `(scrollY - last) / dt`) and drive secondary properties from it:
|
|
115
|
-
skew images/cards ±2-4° along the scroll axis, stretch letter-spacing or
|
|
116
|
-
scaleY on display type a few %, increase a shader's blur/chromatic-
|
|
117
|
-
aberration/RGB-split uniform with speed. Everything eases back to rest via
|
|
118
|
-
the same lerp when scrolling stops — the settle IS the effect.
|
|
119
|
-
- **Inertia and release.** Anything draggable keeps momentum on release
|
|
120
|
-
(Motion's `dragMomentum`, GSAP InertiaPlugin, or a manual velocity fling
|
|
121
|
-
with friction) and settles with an overshoot spring, never a hard stop.
|
|
122
|
-
A drag that stops dead on mouseup feels like a slideshow.
|
|
123
|
-
- **Lag as depth.** Layered elements follow the scroll/cursor with different
|
|
124
|
-
lerp factors (0.05-0.15 spread) so the composition visibly re-stacks in
|
|
125
|
-
motion — cheap, GPU-light, reads as physicality on every pointer move.
|
|
126
|
-
- **One motion signature per build.** Pick the personality once — a named
|
|
127
|
-
easing family (e.g. `expo.out` + one overshoot) OR one spring config — and
|
|
128
|
-
use it everywhere; mixed default eases read as assembled-from-snippets.
|
|
129
|
-
`linear` only for marquees/orbits; never ship a default ease unexamined.
|
|
130
|
-
|
|
131
|
-
## 6. Performance and accessibility (non-negotiable)
|
|
132
|
-
|
|
133
|
-
- Transform/opacity only in hot paths; promote animating layers sparingly
|
|
134
|
-
(`will-change` set just-in-time, removed after). > 6 simultaneously-animating
|
|
135
|
-
elements = re-choreograph.
|
|
136
|
-
- All scroll work driven by IntersectionObserver / ScrollTrigger / `useScroll`
|
|
137
|
-
(rAF-batched) — a raw `scroll` listener is a hard ban (DESIGN.md).
|
|
138
|
-
- Test the tab hidden→visible case: loops must not accumulate; `whileInView` must
|
|
139
|
-
not re-fire (`once: true`).
|
|
140
|
-
- `prefers-reduced-motion`: scrubbed narratives get a static end-state, entrances
|
|
141
|
-
become plain fades ≤ 200ms, marquees stop. In Motion use `useReducedMotion()`
|
|
142
|
-
and branch the variants — don't just shorten durations.
|
|
143
|
-
- Content exists without JS: initial styles are the VISIBLE state; animation
|
|
144
|
-
libraries then hide/offset from JS before first paint (`gsap.set`, Motion
|
|
145
|
-
`initial`). An SSR'd page must never flash-then-hide.
|
|
146
|
-
|
|
147
|
-
## 7. Recipes (copy the shape, restyle the skin)
|
|
148
|
-
|
|
149
|
-
- **Hero sequence**: nav fades in (150ms) → headline lines mask-slide up, 80ms
|
|
150
|
-
stagger → subtext + CTA fade-rise together → hero media scales 1.04→1 with 6px
|
|
151
|
-
blur→0. Total 900ms, expo-out.
|
|
152
|
-
- **Sticky product walkthrough**: `sticky` media column + scrolling step copy;
|
|
153
|
-
step index from IntersectionObserver on copy blocks; media crossfades/transforms
|
|
154
|
-
per step (springy, 300ms).
|
|
155
|
-
- **Marquee**: duplicated track, `animation: scroll Xs linear infinite`,
|
|
156
|
-
`width: max-content`, pause on hover, speed from content width (px/s constant,
|
|
157
|
-
~60-90px/s), masked edges with `mask-image: linear-gradient`.
|
|
158
|
-
- **Scrub showcase**: sticky canvas/image sequence, `useScroll` on the wrapper,
|
|
159
|
-
map progress to frame index / rotation; preload frames; ≤ 2.5 viewports tall.
|
|
160
|
-
- **Canvas product story** (capsul-in-pro.com's form): a single-product launch
|
|
161
|
-
page as one scroll-scrubbed narrative — the product renders on a full-page
|
|
162
|
-
canvas (image-sequence or WebGL) and scroll drives its assembly/rotation
|
|
163
|
-
while short copy beats fade in at fixed progress stops; the site ships as
|
|
164
|
-
one bundled app with explicit portrait/landscape variants (it gates on
|
|
165
|
-
orientation rather than half-working in both). Copy the shape: one subject,
|
|
166
|
-
one scrubbed timeline, copy anchored to progress ranges, per-orientation
|
|
167
|
-
choreography decided up front.
|
|
168
|
-
- **Text on a path** (verified on epic.net): a manifesto paragraph flows along a
|
|
169
|
-
curved SVG path (`<textPath>` or per-word transforms sampled from a curve) and
|
|
170
|
-
relaxes toward straight lines as scroll progress advances — the curve
|
|
171
|
-
amplitude is the scrubbed value. One per site; body text elsewhere stays flat.
|
|
172
|
-
- **Orbiting cursor label** (epic.net's video CTA): a circular text ring
|
|
173
|
-
("PLAY VIDEO ⟲") slowly rotates around the pointer while it's over the media
|
|
174
|
-
region — SVG `<textPath>` on a circle, damped position follow, constant
|
|
175
|
-
rotation. Replaces the play button; fine pointers only, real button fallback.
|
|
176
|
-
|
|
177
|
-
## 8. Setup blueprints — install and WIRE the stack (do not skip)
|
|
178
|
-
|
|
179
|
-
Doctrine without dependencies ships a static page. When this skill is active,
|
|
180
|
-
actually add the libraries to the project and wire them before designing
|
|
181
|
-
sections. Pick the stack per §0, then:
|
|
182
|
-
|
|
183
|
-
**GSAP + ScrollTrigger + Lenis (brand pages, the unseen.co-family stack):**
|
|
184
|
-
|
|
185
|
-
```
|
|
186
|
-
npm i gsap lenis
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
```js
|
|
190
|
-
// one module, imported once at app root (e.g. src/lib/motion.ts)
|
|
191
|
-
import gsap from "gsap";
|
|
192
|
-
import { ScrollTrigger } from "gsap/ScrollTrigger";
|
|
193
|
-
import Lenis from "lenis";
|
|
194
|
-
|
|
195
|
-
gsap.registerPlugin(ScrollTrigger);
|
|
196
|
-
export const lenis = new Lenis({ lerp: 0.1, smoothWheel: true });
|
|
197
|
-
lenis.on("scroll", ScrollTrigger.update);
|
|
198
|
-
gsap.ticker.add((t) => lenis.raf(t * 1000));
|
|
199
|
-
gsap.ticker.lagSmoothing(0);
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
React: run that inside a `useEffect` in a `<SmoothScroll>` provider mounted in
|
|
203
|
-
the root layout (destroy on unmount); Next.js needs `"use client"` on it.
|
|
204
|
-
ONE Lenis instance, ONE gsap ticker — never per-component.
|
|
205
|
-
|
|
206
|
-
**motion/react (React product+brand):** `npm i motion` — import from
|
|
207
|
-
`"motion/react"`. Shared transition vocabulary in one exported object
|
|
208
|
-
(`export const spring = { type: "spring", stiffness: 300, damping: 30 }`), used
|
|
209
|
-
everywhere; `MotionConfig reducedMotion="user"` at the root.
|
|
210
|
-
|
|
211
|
-
**Easing tokens (either stack):** commit page-wide —
|
|
212
|
-
`expo.out` / `cubic-bezier(0.16, 1, 0.3, 1)` for entrances/reveals,
|
|
213
|
-
`power2.inOut` for scrubbed/camera moves, springs for interactive. Define once
|
|
214
|
-
(gsap defaults via `gsap.defaults({ ease: "expo.out" })` or CSS custom
|
|
215
|
-
property `--ease-out-expo`), reference everywhere.
|
|
216
|
-
|
|
217
|
-
**Line-mask headline reveal (the canonical premium move, copy this shape):**
|
|
218
|
-
|
|
219
|
-
```jsx
|
|
220
|
-
// each line: <div class="overflow-hidden"><div class="line">…</div></div>
|
|
221
|
-
gsap.set(".line", { yPercent: 110 });
|
|
222
|
-
gsap.to(".line", {
|
|
223
|
-
yPercent: 0, duration: 0.9, ease: "expo.out", stagger: 0.08,
|
|
224
|
-
scrollTrigger: { trigger: el, start: "top 80%", once: true },
|
|
225
|
-
});
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
Use GSAP `SplitText` (free) with `type: "lines", mask: "lines"` instead of
|
|
229
|
-
hand-wrapping when available; `aria-label` the original string per §4.
|
|
230
|
-
|
|
231
|
-
## 9. Definition of done — the shipped-motion inventory
|
|
232
|
-
|
|
233
|
-
A motion request is fulfilled only if the final code contains, verifiably
|
|
234
|
-
(grep the imports, name the elements):
|
|
235
|
-
|
|
236
|
-
- **Dial 4–6 (product/calm brand):** composed hero entrance timeline (§2), the
|
|
237
|
-
three global feel constants (interaction.md §0), 1–2 `whileInView`/triggered
|
|
238
|
-
section reveals, animated states (loading/success). No smooth scroll.
|
|
239
|
-
- **Dial 7–8 (expressive brand):** all of the above PLUS Lenis smooth scroll,
|
|
240
|
-
line-mask headline reveals on hero + section headings, one scrubbed scroll
|
|
241
|
-
sequence (pin, parallax system, or progress-bound narrative), one signature
|
|
242
|
-
pointer effect (interaction.md §1), and a page/route transition treatment.
|
|
243
|
-
- **Dial 9–10 (award-site):** all of the above PLUS the immersive.md or
|
|
244
|
-
cinematic.md architecture actually built (persistent stage/canvas, preloader
|
|
245
|
-
choreography, spatial or sim-driven route transitions, custom cursor).
|
|
246
|
-
|
|
247
|
-
Before reporting done, list which inventory items shipped and where (element +
|
|
248
|
-
trigger). "The page has hover states" does not clear dial 7+. If a listed item
|
|
249
|
-
was deliberately cut, say so and why. This inventory is a **hard gate**, not a
|
|
250
|
-
checklist: the SKILL.md verification pass fails the task on any dial-appropriate
|
|
251
|
-
item that is neither proven running nor logged as a deliberate cut with a
|
|
252
|
-
reason — an incomplete inventory means keep building, not ship with a caveat.
|
|
253
|
-
The runtime stage must PROVE the items run (transforms changing, triggers
|
|
254
|
-
firing, console clean), not just find them in the source. On mobile, grade
|
|
255
|
-
against the shifted dial (mobile.md: desktop N ≈ mobile N−2), not the desktop
|
|
256
|
-
list.
|
|
1
|
+
# Dreative Specialist Skill — Motion & Scroll Choreography
|
|
2
|
+
|
|
3
|
+
## Contract
|
|
4
|
+
|
|
5
|
+
Follow `../references/SKILL_CONTRACT.md`. Dependencies: `ux`, `mobile`. Deliver a
|
|
6
|
+
named motion system, trigger/timing/easing inventory, cleanup strategy, mobile
|
|
7
|
+
translation, reduced-motion fallback, and sampled runtime evidence.
|
|
8
|
+
|
|
9
|
+
Load for animation, parallax, scroll stories, kinetic type, spatial transitions,
|
|
10
|
+
or a motion dial that requires more than state feedback.
|
|
11
|
+
|
|
12
|
+
## 0. Explore before recipes
|
|
13
|
+
|
|
14
|
+
Understand the content sequence, brand physics, inputs, and still layout first.
|
|
15
|
+
Record three original choreography concepts before reading
|
|
16
|
+
`../recipes/motion-recipes.md`. A recipe supplies wiring—not the story.
|
|
17
|
+
|
|
18
|
+
Name the motion signature in physical terms such as precise mechanical settle,
|
|
19
|
+
soft editorial drift, elastic play, or heavy cinematic inertia. One system owns
|
|
20
|
+
the page; independent default animations do not.
|
|
21
|
+
|
|
22
|
+
## 1. Hard gates
|
|
23
|
+
|
|
24
|
+
- Content is visible before enhancement and never depends on a JS callback to
|
|
25
|
+
appear (`content.visible`).
|
|
26
|
+
- Reduced motion removes nonessential travel, pinning, auto-looping, and
|
|
27
|
+
vestibular effects while preserving state and hierarchy
|
|
28
|
+
(`motion.reducedMotion`).
|
|
29
|
+
- Navigation, forms, keyboard, pointer targets, and focus remain functional
|
|
30
|
+
(`ux.functional`, `spatial.noOcclusion`).
|
|
31
|
+
- Timelines/listeners/observers/render loops clean up; hidden tabs and route
|
|
32
|
+
transitions do not multiply work.
|
|
33
|
+
- Heavy choreography has measured runtime and a concrete low-power/mobile/static
|
|
34
|
+
fallback (`effects.runtimeFallback`).
|
|
35
|
+
|
|
36
|
+
## 2. Motion architecture
|
|
37
|
+
|
|
38
|
+
Choose by job:
|
|
39
|
+
|
|
40
|
+
- CSS transitions/animations for local states and simple decorative loops.
|
|
41
|
+
- `motion/react` for component presence, layout, gestures, and springs.
|
|
42
|
+
- GSAP + ScrollTrigger for coordinated timelines and pinned scroll chapters.
|
|
43
|
+
- Lenis only when the concept needs a shared smooth-scroll clock.
|
|
44
|
+
- R3F/three.js render state for scene motion; synchronize with the page clock.
|
|
45
|
+
|
|
46
|
+
Use one provider/ticker/scroll owner. Define tokens for duration, spring, easing,
|
|
47
|
+
distance, stagger, and reduced-motion behavior. Interactive motion uses springs
|
|
48
|
+
or velocity-aware settling; narrative motion uses deliberate timelines.
|
|
49
|
+
|
|
50
|
+
## 3. Evidence-backed creative structure
|
|
51
|
+
|
|
52
|
+
At expressive/award, satisfy `motion.expressive.diversityOrDevelopment` through
|
|
53
|
+
one plan path:
|
|
54
|
+
|
|
55
|
+
- **Diversity:** at least four distinct mechanisms across three input drivers.
|
|
56
|
+
Reusing one mechanism more than twice is a warning that the system is shallow.
|
|
57
|
+
- **Development:** one coherent signature mechanism develops through at least
|
|
58
|
+
three materially different roles/states, supported by two quieter secondary
|
|
59
|
+
mechanisms and at least two drivers.
|
|
60
|
+
|
|
61
|
+
Development is not the same reveal with different distances. A line becoming
|
|
62
|
+
navigation, data plot, and scene boundary qualifies; fade-up repeated across
|
|
63
|
+
three sections does not.
|
|
64
|
+
|
|
65
|
+
## 4. Choreography principles
|
|
66
|
+
|
|
67
|
+
- Build a timeline for the whole journey: setup, anticipation, peak, rest,
|
|
68
|
+
transformation, resolution.
|
|
69
|
+
- Entrances orient; they are not the design. Key media and signatures respond to
|
|
70
|
+
input or develop state.
|
|
71
|
+
- Scroll links progress to meaning. Clamp/damp velocity and avoid raw scroll
|
|
72
|
+
listeners or layout work in every frame.
|
|
73
|
+
- Kinetic type remains readable DOM text; splits restore cleanly and preserve
|
|
74
|
+
accessibility.
|
|
75
|
+
- Presence/exits preserve focus, scroll position, and input continuity.
|
|
76
|
+
- Mobile shortens travel, removes long pins, lowers parallax, and preserves the
|
|
77
|
+
concept through a calmer translation rather than a cropped desktop effect.
|
|
78
|
+
|
|
79
|
+
## 5. Planning and verification
|
|
80
|
+
|
|
81
|
+
For each moment record element, trigger/driver, purpose, state range, duration or
|
|
82
|
+
spring, mobile translation, reduced-motion behavior, fallback, and evidence.
|
|
83
|
+
|
|
84
|
+
Runtime proof includes changing transforms/uniforms/state at two timestamps,
|
|
85
|
+
trigger positions, tested scroll-back, hidden-tab recovery, cleanup after route
|
|
86
|
+
changes, mobile viewport, reduced motion, console count, and frame-time sampling
|
|
87
|
+
for heavy work. A static screenshot cannot prove choreography.
|
|
88
|
+
|
|
89
|
+
Recipe reference: `../recipes/motion-recipes.md`, after concept exploration only.
|
|
@@ -1,102 +1,116 @@
|
|
|
1
|
-
# Dreative Specialist Skill — Refined Clean Business
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
##
|
|
92
|
-
|
|
93
|
-
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
-
|
|
101
|
-
|
|
102
|
-
|
|
1
|
+
# Dreative Specialist Skill — Refined Clean Business
|
|
2
|
+
|
|
3
|
+
## Contract
|
|
4
|
+
|
|
5
|
+
Follow `../references/SKILL_CONTRACT.md`. Dependencies: `ux`, `mobile`; add
|
|
6
|
+
`media` when photography is a primary material. Deliver a precise type/spacing/
|
|
7
|
+
surface system, restrained signature detail, purposeful photography, complete
|
|
8
|
+
states, and responsive proof. Do not confuse refined with generic minimalism.
|
|
9
|
+
Done means hierarchy, copy, conversion flow, polish, and calm motion hold across
|
|
10
|
+
desktop, keyboard, and phone.
|
|
11
|
+
|
|
12
|
+
Use `../references/REFLEX_FONTS.json` through DESIGN.md's font procedure. Common
|
|
13
|
+
product or editorial fonts remain valid when brand continuity, metrics, language,
|
|
14
|
+
reference, variable-font capability, or performance specifically earns them;
|
|
15
|
+
generic “clean and modern” reasoning does not.
|
|
16
|
+
|
|
17
|
+
Load this file when `plan.skills` includes `refined`, or the brief/prompt asks
|
|
18
|
+
for a "clean modern business site", premium-but-calm marketing, DTC/e-commerce
|
|
19
|
+
polish, "professional, not flashy", or names references like ch.maswitzerland.com
|
|
20
|
+
or lovvelavva.com. This is the OPPOSITE pole from immersive/cinematic: quality
|
|
21
|
+
expressed through restraint — spacing, photography, and type doing all the work,
|
|
22
|
+
with motion barely above zero. Most real client work lands here; treat it as a
|
|
23
|
+
craft discipline, not the absence of one.
|
|
24
|
+
|
|
25
|
+
It EXTENDS DESIGN.md (everything applies; this file tightens the dials). It does
|
|
26
|
+
NOT stack with `immersive`/`cinematic` — those are different registers. It pairs
|
|
27
|
+
well with a light dose of `interaction` (press states, underline draws), the
|
|
28
|
+
first tier of `motion` (one hero sequence, 2-3 in-view reveals), `ux` (this
|
|
29
|
+
register's audience punishes broken function hardest), and media.md's quiet
|
|
30
|
+
treatments only (ken-burns, curtain reveals, one hover-woken loop — imagery
|
|
31
|
+
here is generated/sourced to ONE photographic grade, media.md §4).
|
|
32
|
+
|
|
33
|
+
## 0. The register: expensive silence
|
|
34
|
+
|
|
35
|
+
What separates premium-clean from generic-clean is not any element — it's the
|
|
36
|
+
ratios:
|
|
37
|
+
|
|
38
|
+
- **Whitespace is the brand.** Section padding 96-160px desktop / 56-80px
|
|
39
|
+
mobile; content max-width 1200-1320px with WIDE outer gutters; one idea per
|
|
40
|
+
viewport. If a section feels empty, that's the look working — resist filling.
|
|
41
|
+
- **Photography carries the emotion.** Real product/lifestyle imagery, art-
|
|
42
|
+
directed to one consistent grade (one light temperature, one background
|
|
43
|
+
family). Full-bleed image sections alternate with contained text sections —
|
|
44
|
+
the rhythm image / text / image IS the page structure. Never decorate around
|
|
45
|
+
weak imagery; demand or generate better imagery instead.
|
|
46
|
+
- **Type does hierarchy, color stays out of the way.** Near-monochrome palette:
|
|
47
|
+
warm or cool neutral family + ONE accent used almost exclusively on the
|
|
48
|
+
primary CTA and links. Backgrounds shift between 2-3 tints of the neutral
|
|
49
|
+
(e.g. white / #f6f5f2 / #111) to separate sections without borders.
|
|
50
|
+
- **Motion whispers.** Motion dial effectively ≤ 4: fade-rise entrances
|
|
51
|
+
(300-400ms, once), a sticky nav that gains a hairline+blur, underline draws,
|
|
52
|
+
press states. No parallax beyond 4%, no pinning, no canvas. A single
|
|
53
|
+
restrained signature (a slow ken-burns on the hero image, or a marquee of
|
|
54
|
+
press logos) is the ceiling.
|
|
55
|
+
|
|
56
|
+
## 1. Page anatomy (marketing/DTC form)
|
|
57
|
+
|
|
58
|
+
The proven skeleton — vary the composition per DESIGN.md §5, not the order
|
|
59
|
+
logic:
|
|
60
|
+
|
|
61
|
+
1. **Hero**: one full-width image or split layout; headline ≤ 8 words stating
|
|
62
|
+
the value in plain language; one CTA. No feature bullets in the hero.
|
|
63
|
+
2. **Credibility strip**: press/client logos, real marks, grayscale or
|
|
64
|
+
single-tint (lovvelavva runs Forbes/Women's Health/Real Simple here —
|
|
65
|
+
this section converts and belongs high on DTC pages).
|
|
66
|
+
3. **Value sections** (2-4): alternating image/text, each making ONE claim
|
|
67
|
+
with 1-2 sentences of support. Icons only if custom-drawn; three-generic-
|
|
68
|
+
icon-cards is the tell this register must avoid most.
|
|
69
|
+
4. **Product/collection grid**: large images, generous gaps (24-32px), minimal
|
|
70
|
+
card chrome — image, name, price/one-liner; hover = image swap or subtle
|
|
71
|
+
zoom-crop INSIDE a fixed frame (no card growth).
|
|
72
|
+
5. **Social proof**: 1-3 real testimonials with names/photos, editorial layout
|
|
73
|
+
(big quote type), never a 3-card testimonial row.
|
|
74
|
+
6. **Closing CTA**: calm full-width section, one sentence, one button.
|
|
75
|
+
7. **Footer**: structured, generous, quiet — the footer's polish is a trust
|
|
76
|
+
signal in this register; give it real columns, legal, newsletter.
|
|
77
|
+
|
|
78
|
+
E-commerce specifics: sticky add-to-cart on product pages (mobile bottom bar),
|
|
79
|
+
price always visible, shipping/returns reassurance near the CTA, cart as a
|
|
80
|
+
slide-over drawer not a page.
|
|
81
|
+
|
|
82
|
+
## 2. The discovery-grid variant (cosmos.so-like)
|
|
83
|
+
|
|
84
|
+
For content/discovery products (galleries, moodboards, catalogs): near-zero
|
|
85
|
+
chrome around a masonry/justified image grid; dark or paper-white surface;
|
|
86
|
+
images at native aspect ratios (never uniform crops); hover = slight lift +
|
|
87
|
+
metadata fade-in on top of the image; infinite scroll with a sentinel loader;
|
|
88
|
+
the search/filter bar is the only persistent UI. The product IS the grid —
|
|
89
|
+
navigation, branding, and controls stay almost invisible until needed.
|
|
90
|
+
|
|
91
|
+
## 3. What "modern" means here (2024+, not 2016 flat)
|
|
92
|
+
|
|
93
|
+
- Hairline borders (1px, 8-12% alpha) instead of shadows for structure; the
|
|
94
|
+
2-3 stacked tinted shadows (interaction.md §3) reserved for genuinely
|
|
95
|
+
floating elements (dropdowns, drawers).
|
|
96
|
+
- Larger type than feels safe: body 17-18px on marketing pages, display
|
|
97
|
+
clamped 2.5-4.5rem, tight leading. Small timid type is the #1 dated tell.
|
|
98
|
+
- Radius system: one value family — either near-square (2-4px, editorial/
|
|
99
|
+
luxury) or soft (12-16px, DTC/consumer) — never mixed.
|
|
100
|
+
- Buttons: solid accent primary + quiet text-link secondary. Pill shape only
|
|
101
|
+
in the consumer/DTC variant. No outlined-button armies.
|
|
102
|
+
- Real `<img>`/`<picture>` with proper aspect-ratio boxes; no CSS-drawn
|
|
103
|
+
product mockups; `object-fit: cover` with art-directed focal points.
|
|
104
|
+
|
|
105
|
+
## 4. Guardrails
|
|
106
|
+
|
|
107
|
+
- If you're adding an effect to make a section interesting, the section's
|
|
108
|
+
content or imagery is the problem — fix that instead.
|
|
109
|
+
- No gradient meshes, no glassmorphism cards, no floating blob backgrounds,
|
|
110
|
+
no emoji in UI copy: all instantly cheapen this register.
|
|
111
|
+
- Accessibility floor is easy here — don't squander it: AA contrast on the
|
|
112
|
+
tinted neutrals (test the #767676-gray-on-white trap), visible focus,
|
|
113
|
+
semantic landmarks.
|
|
114
|
+
- Performance IS the aesthetic: LCP image preloaded, fonts ≤ 2 files,
|
|
115
|
+
zero animation libraries unless motion is actually used — a clean site
|
|
116
|
+
that loads instantly reads as more premium than any effect.
|