@struq/skill 0.4.2 → 0.5.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.
- package/README.md +167 -59
- package/package.json +2 -2
- package/skills/struq/SKILL.md +145 -89
- package/skills/struq/blocks/CATALOG.md +74 -22
- package/skills/struq/blocks/backgrounds/background-aurora.tsx +34 -12
- package/skills/struq/blocks/backgrounds/background-facets.tsx +14 -6
- package/skills/struq/blocks/backgrounds/background-silk.tsx +40 -15
- package/skills/struq/blocks/catalog.json +697 -16
- package/skills/struq/blocks/film.json +426 -0
- package/skills/struq/blocks/footers/footer-contact.tsx +81 -55
- package/skills/struq/blocks/footers/footer-reveal.tsx +1 -1
- package/skills/struq/blocks/headers/header-bar.tsx +24 -13
- package/skills/struq/blocks/headers/menu-curtain.tsx +24 -11
- package/skills/struq/blocks/heroes/hero-framed.tsx +33 -20
- package/skills/struq/blocks/heroes/hero-index.tsx +32 -11
- package/skills/struq/blocks/heroes/hero-poster.tsx +68 -35
- package/skills/struq/blocks/heroes/hero-split.tsx +22 -9
- package/skills/struq/blocks/heroes/hero-still.tsx +80 -74
- package/skills/struq/blocks/kit/accent.ts +82 -0
- package/skills/struq/blocks/kit/blocks.css +78 -35
- package/skills/struq/blocks/kit/quiet/Close.tsx +73 -0
- package/skills/struq/blocks/kit/quiet/PhotoText.tsx +79 -0
- package/skills/struq/blocks/kit/quiet/Rows.tsx +81 -0
- package/skills/struq/blocks/kit/quiet/Statement.tsx +157 -0
- package/skills/struq/blocks/kit/quiet/index.ts +7 -0
- package/skills/struq/blocks/kit/quiet/sheet.ts +12 -0
- package/skills/struq/blocks/page-transitions/page-transition-gate.tsx +87 -36
- package/skills/struq/blocks/preloaders/preloader-gate.tsx +116 -46
- package/skills/struq/blocks/preloaders/preloader-stack.tsx +10 -7
- package/skills/struq/blocks/sections/contact-form.tsx +1 -1
- package/skills/struq/blocks/sections/cta-closing.tsx +3 -2
- package/skills/struq/blocks/sections/fanned-cards.tsx +14 -10
- package/skills/struq/blocks/sections/film-strip.tsx +18 -14
- package/skills/struq/blocks/sections/grid-assembly.tsx +16 -11
- package/skills/struq/blocks/sections/manifesto.tsx +3 -2
- package/skills/struq/blocks/sections/panel-accordion.tsx +3 -2
- package/skills/struq/blocks/sections/split-pair.tsx +4 -3
- package/skills/struq/blocks/showpieces/hero-opener.tsx +76 -17
- package/skills/struq/blocks/showpieces/wordmark-finale.tsx +3 -1
- package/skills/struq/blocks/transitions/zoom-through.tsx +9 -10
- package/skills/struq/canon/canon.json +1 -1
- package/skills/struq/references/craft.md +4 -0
- package/skills/struq/references/film.md +158 -0
- package/skills/struq/references/triage.md +3 -0
- package/skills/struq/scripts/blocks.mjs +89 -7
- package/skills/struq/scripts/canon.mjs +8 -1
- package/skills/struq/scripts/check.mjs +94 -11
- package/skills/struq/scripts/film-check.mjs +997 -0
- package/skills/struq/scripts/gate.mjs +146 -0
- package/skills/struq/scripts/packs.mjs +73 -12
package/skills/struq/SKILL.md
CHANGED
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: struq
|
|
3
|
-
description: "Award-tier studio websites for coding agents, built from Struq's catalogue of admitted blocks:
|
|
3
|
+
description: "Award-tier studio websites for coding agents, built from Struq's catalogue of admitted blocks and directed as one film: one idea, one motion language, one motif and one centerpiece, cast into a storyboard before a block is installed. Preloaders, page transitions, headers, heroes, WebGL backgrounds, showpieces, sections and footers, each with real variants, judged at FWA level and shipped as files. Struq's palettes and type pairings as one token block, art-directed CC0 photos from the Struq beeldbank, Lenis on one GSAP clock, and a self-check against the AI tells. Works offline from its own copy; uses the Struq MCP (struq_richting, struq_blokken, struq_blok, struq_controle) when connected. Use when designing, building, redesigning, animating or auditing a marketing, studio, agency or portfolio site that must feel cinematic and custom instead of templated. Stack: Next.js App Router + Tailwind v4."
|
|
4
4
|
argument-hint: "[brief] | redesign <path> | audit <path-or-url> | direct <brief>"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Struq
|
|
8
8
|
|
|
9
|
-
A site looks like a template
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
`<skill-dir>` is the folder this file is in. The catalogue is [blocks/CATALOG.md](blocks/CATALOG.md); the craft that
|
|
14
|
-
makes the blocks feel high end is [references/craft.md](references/craft.md); the tell list is
|
|
15
|
-
[references/tells.md](references/tells.md).
|
|
9
|
+
A site looks like a template when every choice is the likeliest one, and like a showreel when every slot gets the
|
|
10
|
+
loudest block. Struq casts studio blocks into one film; your job is the treatment, the copy and the seams, never a
|
|
11
|
+
rebuild of what a block does. `<skill-dir>` is this file's folder; the catalogue is [blocks/CATALOG.md](blocks/CATALOG.md),
|
|
12
|
+
a worked treatment per language [references/film.md](references/film.md), the craft [references/craft.md](references/craft.md).
|
|
16
13
|
|
|
17
14
|
| Invocation | Mode |
|
|
18
15
|
|---|---|
|
|
19
16
|
| `/struq <brief>` | **Build**: the checklist below, start to finish. |
|
|
20
|
-
| `/struq redesign <path>` | Keep the brand, copy and components ([references/triage.md](references/triage.md)); swap in blocks where the page is weakest
|
|
17
|
+
| `/struq redesign <path>` | Keep the brand, copy and components ([references/triage.md](references/triage.md)); write a treatment of the page as it will be (kept sections as own scenes) and stop once as in step 2, then swap in blocks where the page is weakest and run the checklist from step 3. |
|
|
21
18
|
| `/struq audit <path-or-url>` | Change nothing. Run `check.mjs` (and `struq_controle` when connected), report every FAIL and WARN and the three fixes with the most visual payoff. Never a numeric score. |
|
|
22
19
|
| `/struq direct <brief>` | One continuous WebGL experience across chapters: steps 1 to 4, then [cinematic/README.md](cinematic/README.md). |
|
|
23
20
|
|
|
@@ -36,8 +33,7 @@ For a dashboard or product UI keep the tokens, faces and tells; drop the preload
|
|
|
36
33
|
|
|
37
34
|
## The MCP, or the skill's own copy
|
|
38
35
|
|
|
39
|
-
|
|
40
|
-
offline column does the same from the skill's copy.
|
|
36
|
+
Same blocks, same derivation: use the MCP tool when it is connected, else the offline column from the skill's copy.
|
|
41
37
|
|
|
42
38
|
| Need | MCP connected | Offline |
|
|
43
39
|
|---|---|---|
|
|
@@ -46,8 +42,8 @@ offline column does the same from the skill's copy.
|
|
|
46
42
|
| A block as files | `struq_blok(slug, variant?)` | `blocks.mjs add <slug>` |
|
|
47
43
|
| The tell check | `struq_controle()`: run its detectors on your own files | `check.mjs` |
|
|
48
44
|
|
|
49
|
-
|
|
50
|
-
`
|
|
45
|
+
`struq_richting`'s token block replaces STRUQ TOKENS in `app/globals.css`, its font URLs go in `app/fonts.ts`;
|
|
46
|
+
`struq_blok`'s files go into `components/struq/` at their paths. Log each call:
|
|
51
47
|
`node <skill-dir>/scripts/log.mjs mcp <tool> --note "<what you took>"`. Run `check.mjs` either way.
|
|
52
48
|
|
|
53
49
|
## Build checklist
|
|
@@ -59,107 +55,168 @@ their own). `check.mjs` fails while a line is open or a ticked step has no entry
|
|
|
59
55
|
```
|
|
60
56
|
## Build checklist
|
|
61
57
|
- [ ] 1 Project: Next.js App Router + Tailwind v4; blocks.mjs init printed OK
|
|
62
|
-
- [ ] 2
|
|
58
|
+
- [ ] 2 Treatment and approval: the treatment in STRUQ.md, the plan check at PLAN: PASS; the one stop sent and answered
|
|
63
59
|
- [ ] 3 Canon: the token block and fonts written (canon.mjs palette and type, or struq_richting)
|
|
64
60
|
- [ ] 4 Images: images.mjs --brief printed OK; only photos whose alt fits the client
|
|
65
|
-
- [ ] 5
|
|
61
|
+
- [ ] 5 Scenes: frames and the centerpiece installed, every other scene built as the storyboard says, composed in app/page.tsx with real copy
|
|
66
62
|
- [ ] 6 Build: npm run build passes
|
|
67
63
|
- [ ] 7 Look: 390 and 1440 screenshots and one full scroll, fixes made (or "Verify: not seen, no browser")
|
|
68
64
|
- [ ] 8 Check: check.mjs prints RESULT: PASS
|
|
69
65
|
```
|
|
70
66
|
|
|
71
67
|
**1 Project.** Empty folder: `npx create-next-app@latest . --ts --tailwind --app --eslint --yes`, then
|
|
72
|
-
`node <skill-dir>/scripts/blocks.mjs init
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
68
|
+
`node <skill-dir>/scripts/blocks.mjs init`: the kit in `components/struq/kit/`, the layout (`sq-js` before paint,
|
|
69
|
+
font links, `data-blocks` on `<body>`, `SmoothScroll`), `globals.css` (kit import, theme names, STRUQ TOKENS),
|
|
70
|
+
`fonts.ts`, gsap, @gsap/react and lenis. It never overwrites your layout or stylesheet: merge from `recipes/app/`.
|
|
71
|
+
|
|
72
|
+
**2 Treatment and the one stop.** Pick from the canon, never invent a palette or pairing while one fits: palette by
|
|
73
|
+
mood, then sector; a "kept out" palette (blue, purple, teal) only for a brand of that colour, declared as `Cool hue:
|
|
74
|
+
declared because <brand colour>`; the brand's own colours and faces beat the canon, in the same token names. Pairing
|
|
75
|
+
by temperament: Fraunces (serif-editorial) warm and premium, Newsreader literate, Sora calm and architectural,
|
|
76
|
+
Urbanist soft and current, Bodoni Moda for fashion, Big Shoulders (condensed-poster) for a campaign at poster scale,
|
|
77
|
+
Unbounded for a wide agency voice. Pick the language (The film, below), then run
|
|
78
|
+
`node <skill-dir>/scripts/blocks.mjs arc <language>` and paste the Tone arc and Storyboard it prints into the
|
|
79
|
+
treatment at the top of STRUQ.md. Fill every `<...>`, one pick per line (`or:` lists what else fits; swap at most one
|
|
80
|
+
scene; a block the user names goes in first):
|
|
84
81
|
|
|
85
82
|
```
|
|
86
83
|
# STRUQ.md: <name>
|
|
87
84
|
Brief: <one line: what, for whom, where>
|
|
88
|
-
Idea: <
|
|
85
|
+
Idea: <a point of view in one sentence, never a description of the client: what a visitor believes when they leave>
|
|
86
|
+
Language: <weight | cut | curtain> (<the client's sector, or the brief's own words for another feel>)
|
|
87
|
+
Motif: <line | frame | aperture | cut | word | field>: <what it is in this client's world and how it changes down the page>
|
|
88
|
+
Lexicon: <three to five working words of the client's trade (a material, a part, a tool, a unit), never the brief repeated; every label, counter and caption uses these, no film or studio jargon the client does not own>
|
|
89
89
|
Palette: <id> (<mood>)
|
|
90
90
|
Type: <pairing id>: <display> + <body>
|
|
91
91
|
Images: pack <slug> (or the client's photos, then pack <slug>)
|
|
92
|
-
|
|
92
|
+
Centerpiece: <block>: <why this is this site's one moment>
|
|
93
|
+
Tone arc: <as blocks.mjs arc printed it>
|
|
94
|
+
Storyboard:
|
|
95
|
+
1. Arrival (frame) <preloader of the language> | lands on: <what>
|
|
96
|
+
2. Opening (loud) <block:variant> | on screen: <...> | enters: <...> | hands over: <...>
|
|
97
|
+
3. <scene> (quiet) <block:variant or kit scene> | on screen: <...> | enters: <...> | hands over: <...>
|
|
98
|
+
...
|
|
99
|
+
N. Close (quiet) <block or kit scene> | echoes the opening: <how> | footer: <block>
|
|
93
100
|
Assumptions: <every drafted line and every fact left out>
|
|
94
101
|
Verify: <filled in at step 7>
|
|
95
102
|
```
|
|
96
103
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
the
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
`lib/struq-images.ts` (`images.hero`,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
its props
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
you did not. Then `check.mjs`
|
|
123
|
-
|
|
124
|
-
## The
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
type
|
|
104
|
+
Run `node <skill-dir>/scripts/check.mjs --plan` and fix every FAIL and every `quiet-is-quiet`, `loud-adjacent` and
|
|
105
|
+
`quiet-share` warning until it prints `PLAN: PASS` without them. `canon.mjs` and `blocks.mjs add` refuse until the
|
|
106
|
+
plan passes and the reply is logged. Then **stop once**, in the user's language, and show the treatment, never block
|
|
107
|
+
slugs: idea, language, motif and centerpiece in plain words; the storyboard as numbered lines, one sentence each of
|
|
108
|
+
what the visitor sees; palette, type and pack on one line; then "Akkoord? Heb je een logo, foto's of echte cijfers,
|
|
109
|
+
stuur ze nu." (English: "Approve? If you have a logo, photos or real numbers, send them now."). The build request is
|
|
110
|
+
not the approval. Log the reply word for word: `log.mjs "Step 2 Approval" "Asked: ..." "Reply: \"<their words>\""`.
|
|
111
|
+
Any yes builds the treatment; what they send replaces the matching pick; a veto changes only what it names. Never
|
|
112
|
+
ask twice. No pack shows the client's product? Add: "Ik heb geen foto's van je <product>: stuur ze, dan komen ze in de hero."
|
|
113
|
+
|
|
114
|
+
**3 Canon.** `canon.mjs palette <id>` and `canon.mjs type <id>` rewrite the one STRUQ TOKENS block and `app/fonts.ts`.
|
|
115
|
+
|
|
116
|
+
**4 Images.** `node <skill-dir>/scripts/images.mjs --brief "<the brief, in the user's words>"` keeps only the pack's
|
|
117
|
+
photos whose alt fits the client, verifies them into `public/images/` and writes `lib/struq-images.ts` (`images.hero`,
|
|
118
|
+
`.band`, `.card`, `.column`, `.detail`, `.backdrop`, `imageCredit`, `imageFit`). Read the alts before you place a
|
|
119
|
+
photo; with `imageFit` "none" a background block carries the hero. Title and `lang` go in the layout.
|
|
120
|
+
|
|
121
|
+
**5 Scenes.** Install the frames and the centerpiece first (`blocks.mjs add <slug>:<variant>` or `struq_blok`), then
|
|
122
|
+
each scene as its storyboard line says, the quiet ones with the kit's four (The film, below). Read each file header
|
|
123
|
+
for its props and how it mounts; fill every label, counter and caption from the lexicon; wrap the tone arc's ink or
|
|
124
|
+
field scenes in `scene-inverse` or `scene-field` (a kit scene takes it as `className`). Glue and an own scene use
|
|
125
|
+
`Reveal`, `MediaFrame` and `SplitHeadline`, and an own scene's root carries `data-scene="<name>"`.
|
|
126
|
+
|
|
127
|
+
**6 to 8.** `npm run build` passes (fix your code; never delete a block for green). View `npx next start -p 4321` at
|
|
128
|
+
390 and 1440, scroll once: the preloader lands on the hero, every frame fills, each pin engages and lets go without a
|
|
129
|
+
jump, nothing overflows, scrolling back reverses. Never claim what you did not see. Then `check.mjs` to `RESULT: PASS`.
|
|
130
|
+
|
|
131
|
+
## The film
|
|
132
|
+
|
|
133
|
+
One film, not a showreel: every frame from one language, one arc, one centerpiece, one motif seen at the arrival,
|
|
134
|
+
the opening, the centerpiece and the close. A loud scene moves with the scroll (a pin, a scrub, a reveal to full
|
|
135
|
+
bleed); a quiet scene is type and a photo that enter once and sit still. Two tags only: `(loud)` when the block's
|
|
136
|
+
energy in the catalogue is 2 or more, `(quiet)` at 1 or less, for a kit scene or for an own scene.
|
|
137
|
+
|
|
138
|
+
| Language | For | Feel | Frames: preloader, page transition, menu | Motif |
|
|
139
|
+
|---|---|---|---|---|
|
|
140
|
+
| weight | architecture, hotels, craft, interiors | photographic and slow; a print grows into place; long holds | `preloader-stack`, `page-transition-stack`, `menu-curtain:stack` | frame |
|
|
141
|
+
| cut | fashion, agencies, portfolios, music | hard cuts, short masks, no fades, short holds | `preloader-slices`, `page-transition-slices`, `menu-curtain:slices` | cut or word |
|
|
142
|
+
| curtain | campaigns, launches, events, culture | a light line, panels part, a long hold before the reveal | `preloader-gate` or `preloader-wordmark:split`, `page-transition-gate`, `menu-curtain:gate` | line or aperture |
|
|
143
|
+
|
|
144
|
+
Pick the language by the client's sector in the For column. Another language only when the brief asks for that feel
|
|
145
|
+
in its own words; then quote those words on the `Language:` line. The idea may pick another motif of the six.
|
|
146
|
+
`preloader-gate` and `page-transition-gate` show a neutral hairline ring; the film leader (a dial counting 3, 2, 1)
|
|
147
|
+
only for a film client, through `dial="leader"` and `marks`. The header is `header-bar:quiet` or `:settle`; sections
|
|
148
|
+
say their ground with `data-bar-tone`. Each arc is loud only at the opening, the centerpiece and at most one gentle
|
|
149
|
+
scene with a quiet scene on each side. The arcs below are the printed arcs in short; the first pick is the default.
|
|
150
|
+
|
|
151
|
+
**Quiet scenes** are the kit's four, imported from `@/components/struq/kit/quiet` (props in each file's header):
|
|
152
|
+
- `Statement`: the one sentence and the page's first type moment, with an `accent` word and a margin `label` or a
|
|
153
|
+
small `image`, so it is composed, never a lone line.
|
|
154
|
+
- `PhotoText`: a photo and a short text side by side on the grid.
|
|
155
|
+
- `Rows`: three to six hairline rows, a term and one sentence each, never numbered.
|
|
156
|
+
- `Close`: the closing line and its one link, echoing the opening; `frame` when the motif is the frame.
|
|
157
|
+
- An own scene only when none of the four fits: your type beside a photo with `SplitHeadline`, `MediaFrame` and
|
|
158
|
+
`Reveal`, entering once, its root marked `data-scene="<name>"` (the check warns `own-scene-unmarked` without it).
|
|
159
|
+
|
|
160
|
+
**weight.** Paper throughout, ink at the centerpiece.
|
|
161
|
+
1. Arrival (frame): `preloader-stack`; the print lands on the hero photo.
|
|
162
|
+
2. Opening (loud, short hold): `hero-framed:wand`, `hero-framed:portret` or `hero-still:frame`; calmer, `hero-still:still` (quiet).
|
|
163
|
+
3. Statement (quiet): `Statement`.
|
|
164
|
+
4. About (loud, the gentle one): `about-studio:wandeling` or `about-studio:plaat` (a full-bleed reveal); quiet, `PhotoText`.
|
|
165
|
+
5. Approach (quiet): `approach:schuif` or `Rows`.
|
|
166
|
+
6. Centerpiece (loud, ink): `image-to-fullbleed`, `grid-assembly`, `zoom-through` or `project-stack` (real projects).
|
|
167
|
+
7. Release (quiet): `PhotoText`.
|
|
168
|
+
8. Close (quiet): `Close`, type only after a full-bleed centerpiece. Footer: `wordmark-finale`.
|
|
169
|
+
|
|
170
|
+
**cut.** Paper and ink in hard alternation, never a fade.
|
|
171
|
+
1. Arrival (frame): `preloader-slices`, its caption from the lexicon.
|
|
172
|
+
2. Opening (loud): `hero-poster`; quiet, `hero-index:lijst`, `hero-index:venster`, `hero-split:naad` or `hero-split:liggend`.
|
|
173
|
+
3. Work (quiet): `hover-list` or `image-trail`; after `hero-index`, already a list, `reveals:clip`.
|
|
174
|
+
4. Statement (quiet): `Statement`.
|
|
175
|
+
5. Centerpiece (loud, ink): `split-pair`, `panel-wipe`, `project-stack`, `fanned-cards` or `film-strip` (film clients).
|
|
176
|
+
6. Release (quiet): `fill-rows` or `Rows`.
|
|
177
|
+
7. Close (quiet): `Close`, type only, or `cta-closing:pointer`. Footer: `footer-contact`.
|
|
178
|
+
|
|
179
|
+
**curtain.** Field or ink at the opening, paper between, ink at the centerpiece.
|
|
180
|
+
1. Arrival (frame): `preloader-gate`, the ring fills and the gate parts; or `preloader-wordmark:split`.
|
|
181
|
+
2. Opening (loud): `hero-opener`, `background-aurora`, `background-silk` or `background-facets`, the line at poster scale; calmer, `hero-still:horizon` (quiet).
|
|
182
|
+
3. Statement (quiet): `Statement`.
|
|
183
|
+
4. Details (loud, the gentle one): `sticky-chapters`, or quiet `panel-accordion`: the programme, places and dates given.
|
|
184
|
+
5. Build (quiet): `PhotoText`, who makes it.
|
|
185
|
+
6. Centerpiece (loud, ink): `scrub-connector`, `zoom-through`, `manifesto-scrub` or `panel-wipe`.
|
|
186
|
+
7. Release (quiet): `PhotoText`.
|
|
187
|
+
8. Close (quiet): `cta-closing:pointer`, the line returning. Footer: `footer-reveal`, the curtain closing.
|
|
188
|
+
|
|
189
|
+
**Budgets.** Hard rules: a storyboard that breaks one is rewritten before the stop.
|
|
190
|
+
- Exactly one centerpiece; nothing pins after it. The opening holds at most 1.5 screens, all pins together about 4.5.
|
|
191
|
+
Screens pinned: `hero-opener` 1, `hero-framed` and `hero-poster` 1.5, `manifesto-scrub` 2, `image-to-fullbleed`
|
|
192
|
+
2.2, `grid-assembly` 2.5, `panel-wipe` 1.7 (2.6 when it closes), `film-strip` up to 3, `fanned-cards`, `split-pair`,
|
|
193
|
+
`zoom-through` and `scrub-connector` 3, `project-stack` 1.1 per project after the first. Pinned in one variant, so
|
|
194
|
+
never quiet: `hero-still:frame`, `hero-split:opening`, `hero-index:doorlopen`, `about-studio:doorkijk`,
|
|
195
|
+
`approach:zin`, `manifesto:writes` and `:split`.
|
|
196
|
+
- Never two loud scenes side by side. At least four in ten scenes are quiet.
|
|
197
|
+
- Every frame from the site's language. A page transition only when the site has more than one route.
|
|
198
|
+
- Install only what the storyboard names, plus the header and the language's menu.
|
|
199
|
+
- One motif on the page. At most two full-bleed photo reveals, built the same way: `hero-framed:wand` and `:portret`,
|
|
200
|
+
`hero-poster`, `hero-still:frame`, `image-to-fullbleed`, `zoom-through`, `grid-assembly`, `about-studio:plaat` and
|
|
201
|
+
`cta-closing:photo` each count one.
|
|
202
|
+
- At most one marquee (`cta-closing:marquee`, `velocity-type`) and one custom cursor. One accent word, set in the
|
|
203
|
+
accent face through the `accent` prop: in the opening's headline, in `Statement` and again in `Close`.
|
|
204
|
+
- No clock unless the lexicon is about time; then one, turned on by its prop (`clock`, `timeZone` on `wordmark-finale`).
|
|
205
|
+
- Two or three type moments at poster scale (12 to 20vw) on the page; everything else from the scale.
|
|
206
|
+
- Labels: no eyebrows above headings, no mono, no uppercase labels, no numbered steps. A small sentence-case label in
|
|
207
|
+
the body face may sit beside a headline in the margin column or under a photo, in words from the lexicon.
|
|
151
208
|
|
|
152
209
|
## What makes it feel high end
|
|
153
210
|
|
|
154
211
|
The blocks hold this already; your glue must too. Detail in [references/craft.md](references/craft.md).
|
|
155
212
|
|
|
156
|
-
- Reveals clip from numbers
|
|
157
|
-
- Photos are decoded before they show, cut or swap.
|
|
213
|
+
- Reveals clip from numbers, never scale a box; whole pixels; photos decoded before they show, cut or swap.
|
|
158
214
|
- Scroll effects are scroll-tied and reverse when the visitor scrolls back; key frames hold.
|
|
159
215
|
- The gate: `sq-js` on `<html>` before paint hides only what will animate, and shows it anyway after 3 s.
|
|
160
216
|
- Type on a photo sits on the measured calm side over the lightest flat veil that reaches 3:1.
|
|
161
|
-
- Display
|
|
162
|
-
|
|
217
|
+
- Display runs light (300, or the poster pairing's weight); fitted lines measured after `document.fonts.ready`.
|
|
218
|
+
- Never clip a descender: the kit's masks already keep them; never `overflow-hidden` on a heading of your own, and
|
|
219
|
+
look at a line with a g and a j before calling type done.
|
|
163
220
|
- Tokens only, mixes in oklab, a surface step and a hairline instead of a shadow, one accent.
|
|
164
221
|
- Icons: Struq Icons (`@struq/icons`), functional only ([references/iconography.md](references/iconography.md)).
|
|
165
222
|
|
|
@@ -167,7 +224,6 @@ The blocks hold this already; your glue must too. Detail in [references/craft.md
|
|
|
167
224
|
|
|
168
225
|
- **Nothing scrolls:** an overlay called `getLenis()?.stop()` without `start()`, or `SmoothScroll` is not mounted.
|
|
169
226
|
- **Content stays invisible for 3 s:** the block never set `data-ready`; usually it threw. Read the console.
|
|
170
|
-
- **
|
|
171
|
-
sits before the kit import in `globals.css`.
|
|
227
|
+
- **Wrong colours or faces:** `data-blocks` is missing on `<body>`, or STRUQ TOKENS sits before the kit import.
|
|
172
228
|
- **A fitted line overflows or jumps:** the face did not load (check `app/fonts.ts` and the links in the layout).
|
|
173
229
|
- **Vite:** [references/stack-targets.md](references/stack-targets.md).
|