jig-ui 0.16.1 → 0.17.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/CHANGELOG.md +47 -0
- package/README.md +7 -6
- package/dist/index.js +630 -160
- package/examples/A-01.html +7 -0
- package/examples/A-02.html +7 -0
- package/examples/A-03.html +7 -0
- package/examples/A-04.html +7 -0
- package/examples/A-05.html +7 -0
- package/examples/A-06.html +7 -0
- package/examples/A-07.html +7 -0
- package/examples/A-08.html +7 -0
- package/examples/A-09.html +7 -0
- package/examples/A-10.html +7 -0
- package/examples/A-135.html +7 -0
- package/examples/A-136.html +7 -0
- package/examples/A-137.html +7 -0
- package/examples/A-138.html +7 -0
- package/examples/A-139.html +7 -0
- package/examples/A-140.html +7 -0
- package/examples/A-141.html +7 -0
- package/examples/A-142.html +7 -0
- package/examples/A-143.html +7 -0
- package/examples/A-144.html +7 -0
- package/examples/A-146.html +7 -0
- package/examples/A-58.html +7 -0
- package/examples/A-59.html +7 -0
- package/examples/A-60.html +7 -0
- package/examples/A-67.html +7 -0
- package/examples/B-105.html +7 -0
- package/examples/B-106.html +7 -0
- package/examples/B-11.html +7 -0
- package/examples/B-12.html +7 -0
- package/examples/B-13.html +7 -0
- package/examples/B-14.html +7 -0
- package/examples/B-15.html +7 -0
- package/examples/B-16.html +7 -0
- package/examples/B-17.html +7 -0
- package/examples/B-75.html +7 -0
- package/examples/B-76.html +7 -0
- package/examples/B-77.html +7 -0
- package/examples/B-78.html +7 -0
- package/examples/C-18.html +7 -0
- package/examples/C-19.html +7 -0
- package/examples/C-20.html +7 -0
- package/examples/C-21.html +7 -0
- package/examples/C-22.html +11 -0
- package/examples/C-49.html +7 -0
- package/examples/C-50.html +7 -0
- package/examples/C-66.html +7 -0
- package/examples/C-68.html +7 -0
- package/examples/D-111.html +7 -0
- package/examples/D-112.html +7 -0
- package/examples/D-114.html +7 -0
- package/examples/D-115.html +7 -0
- package/examples/D-23.html +11 -0
- package/examples/D-24.html +7 -0
- package/examples/D-25.html +7 -0
- package/examples/D-26.html +7 -0
- package/examples/D-27.html +7 -0
- package/examples/D-69.html +7 -0
- package/examples/D-70.html +7 -0
- package/examples/D-71.html +7 -0
- package/examples/D-72.html +7 -0
- package/examples/D-96.html +7 -0
- package/examples/E-116.html +7 -0
- package/examples/E-28.html +7 -0
- package/examples/E-29.html +7 -0
- package/examples/E-30.html +7 -0
- package/examples/E-31.html +7 -0
- package/examples/E-32.html +7 -0
- package/examples/E-33.html +11 -0
- package/examples/E-34.html +7 -0
- package/examples/E-35.html +7 -0
- package/examples/E-51.html +7 -0
- package/examples/E-52.html +7 -0
- package/examples/E-61.html +7 -0
- package/examples/E-62.html +7 -0
- package/examples/E-63.html +7 -0
- package/examples/E-64.html +7 -0
- package/examples/E-65.html +7 -0
- package/examples/E-73.html +7 -0
- package/examples/E-74.html +7 -0
- package/examples/E-91.html +7 -0
- package/examples/E-92.html +7 -0
- package/examples/E-93.html +7 -0
- package/examples/E-94.html +7 -0
- package/examples/E-95.html +7 -0
- package/examples/F-100.html +7 -0
- package/examples/F-101.html +7 -0
- package/examples/F-102.html +7 -0
- package/examples/F-103.html +7 -0
- package/examples/F-104.html +7 -0
- package/examples/F-113.html +7 -0
- package/examples/F-147.html +7 -0
- package/examples/F-36.html +7 -0
- package/examples/F-37.html +7 -0
- package/examples/F-38.html +7 -0
- package/examples/F-39.html +7 -0
- package/examples/F-40.html +7 -0
- package/examples/F-41.html +11 -0
- package/examples/F-97.html +7 -0
- package/examples/F-98.html +7 -0
- package/examples/F-99.html +7 -0
- package/examples/G-145.html +7 -0
- package/examples/G-42.html +7 -0
- package/examples/G-43.html +10 -0
- package/examples/G-44.html +7 -0
- package/examples/H-117.html +11 -0
- package/examples/H-119.html +13 -0
- package/examples/H-45.html +13 -0
- package/examples/H-46.html +10 -0
- package/examples/H-47.html +15 -0
- package/examples/H-48.html +8 -0
- package/examples/I-118.html +7 -0
- package/examples/I-53.html +7 -0
- package/examples/I-54.html +7 -0
- package/examples/I-55.html +7 -0
- package/examples/I-56.html +7 -0
- package/examples/I-57.html +7 -0
- package/examples/I-79.html +7 -0
- package/examples/I-80.html +7 -0
- package/examples/I-81.html +7 -0
- package/examples/I-82.html +7 -0
- package/examples/I-83.html +7 -0
- package/examples/I-84.html +7 -0
- package/examples/I-85.html +7 -0
- package/examples/I-86.html +7 -0
- package/examples/I-87.html +7 -0
- package/examples/I-88.html +7 -0
- package/examples/I-89.html +7 -0
- package/examples/I-90.html +7 -0
- package/examples/J-120.html +7 -0
- package/examples/J-121.html +7 -0
- package/examples/J-122.html +7 -0
- package/examples/J-123.html +7 -0
- package/examples/J-124.html +8 -0
- package/examples/J-125.html +10 -0
- package/examples/J-126.html +9 -0
- package/examples/J-127.html +10 -0
- package/examples/K-128.html +9 -0
- package/examples/K-129.html +7 -0
- package/examples/K-130.html +7 -0
- package/examples/K-131.html +11 -0
- package/examples/K-132.html +7 -0
- package/examples/K-133.html +8 -0
- package/examples/K-134.html +9 -0
- package/examples/README.md +44 -0
- package/package.json +3 -2
- package/rules/00-anti-patterns.md +67 -0
- package/rules/01-modes.md +1 -1
- package/rules/05-copy.md +2 -0
- package/rules.index.json +101 -0
- package/templates/COMMAND.md.tmpl +10 -3
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
One file per rule, `<ID>.html`, showing what the rule forbids and what it asks for
|
|
4
|
+
instead. A rule describes a failure in words; a reader recognises it by sight, and
|
|
5
|
+
most of these failures are things people have seen a hundred times without a name
|
|
6
|
+
for them. The example is the picture beside the name.
|
|
7
|
+
|
|
8
|
+
## Shape
|
|
9
|
+
|
|
10
|
+
```html
|
|
11
|
+
<!-- A-58 · Decorative styling that implies meaning -->
|
|
12
|
+
<figure data-example="dont">
|
|
13
|
+
…the failure, as small as it can be and still be recognised…
|
|
14
|
+
</figure>
|
|
15
|
+
<figure data-example="do">
|
|
16
|
+
…the same content, done the way the rule asks…
|
|
17
|
+
</figure>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
- **Exactly one `dont` and one `do`.** The `do` shows the same content, not a
|
|
21
|
+
different, easier one. A fix that changes the content proves nothing.
|
|
22
|
+
- **Self-contained.** Styles are `style` attributes on the elements. No `<style>`,
|
|
23
|
+
`<script>`, `<link>`, event handler, or external URL. A consumer renders a figure
|
|
24
|
+
in a sandboxed frame or an inert box, and it has to look the same in both.
|
|
25
|
+
- **Small.** A figure is drawn for a box about 320 by 180 pixels. It exaggerates
|
|
26
|
+
just enough to be recognised, and no more.
|
|
27
|
+
- **Raw values are fine here.** An example has to show violet, a glow, a 44px
|
|
28
|
+
radius. It is a specimen of the failure, not a component, so the token rule
|
|
29
|
+
that governs a real page does not apply inside it.
|
|
30
|
+
- **The `do` follows every rule**, not only its own. A fix that commits a
|
|
31
|
+
different failure teaches the second one.
|
|
32
|
+
|
|
33
|
+
## Not for everything visible
|
|
34
|
+
|
|
35
|
+
Some rules are about code, metadata or behaviour and have no look. Their example
|
|
36
|
+
shows what a person meets because of it: the search result a missing description
|
|
37
|
+
produces, the tab a link hands over, the field a password manager cannot fill.
|
|
38
|
+
Where even that is impossible, the figure shows the code, set as code.
|
|
39
|
+
|
|
40
|
+
## Checked
|
|
41
|
+
|
|
42
|
+
`packages/cli/test/examples.test.ts` fails when a rule has no example, when a file
|
|
43
|
+
has other than one `dont` and one `do`, or when a figure carries anything that
|
|
44
|
+
would not render the same in a sandbox.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jig-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "A design system for coding agents.
|
|
3
|
+
"version": "0.17.0",
|
|
4
|
+
"description": "A design system for coding agents. 143 numbered UI rules, brand x mode design tokens, and an installer for Claude Code, Codex, Cursor and opencode.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"files": [
|
|
11
11
|
"dist",
|
|
12
12
|
"rules",
|
|
13
|
+
"examples",
|
|
13
14
|
"tokens",
|
|
14
15
|
"templates",
|
|
15
16
|
"references",
|
|
@@ -39,6 +39,7 @@ These are the strongest defaults in a model's training data and the fastest way
|
|
|
39
39
|
✅ Opaque `--color-bg-raised` with a `--color-stroke-weak` edge. Use translucency only over media, and only when legibility is verified against the worst frame.
|
|
40
40
|
Both styles make sufficient contrast and clear hierarchy structurally difficult — neumorphism in particular defines every element with shadow alone, which fails at 3:1 almost by construction. Trend styles also age badly: the more of them a product carries, the more precisely it is dated. Minimal styling that foregrounds content lasts longer.
|
|
41
41
|
Experiment freely — but not where it costs legibility or excludes people.
|
|
42
|
+
**Everywhere is its own failure.** A frosted panel over a video is a layering decision; frosted cards, a frosted nav, frosted buttons and glowing glass borders on a flat page are decoration applied to everything, and they solve no layering problem at all.
|
|
42
43
|
|
|
43
44
|
### A-58 Decorative styling that implies meaning
|
|
44
45
|
❌ List items in assorted colours chosen for variety; a decorative icon beside a heading that looks pressable; a heading coloured and underlined though it is not a link
|
|
@@ -66,6 +67,7 @@ Where several already apply — a table's rows are aligned, alike, and close —
|
|
|
66
67
|
### A-06 The three-column feature grid reflex
|
|
67
68
|
❌ Icon-in-rounded-square + heading + two lines, three across, for any set of three things
|
|
68
69
|
✅ Let the content pick the layout. Three items of unequal weight are a list, not a grid.
|
|
70
|
+
**The same reflex at any count.** Six or nine cards, each an icon, a title and a line, identical in size and shape, give every point the same weight whether it deserves it or not, and make the titles the only thing a reader can tell apart, so they skim all of them and remember none. When one point matters most, make it bigger, put it first, or give it the space the others do not get. Group related ones; drop the ones that are filler.
|
|
69
71
|
|
|
70
72
|
### A-07 Oversized radius everywhere
|
|
71
73
|
❌ One radius applied to cards, buttons, inputs and badges alike, regardless of element size
|
|
@@ -84,6 +86,61 @@ In `operator`, `--radius-surface` also selects `sm`, so cards, buttons and input
|
|
|
84
86
|
❌ Lorem ipsum, "Acme Inc", `https://example.com`, stock avatars left in
|
|
85
87
|
✅ Real content, or clearly marked `TODO:` that fails a build check. Placeholder text that survives to review costs a reviewer more than it saved you.
|
|
86
88
|
|
|
89
|
+
### A-135 A kicker above every heading
|
|
90
|
+
❌ A small uppercase, letter-spaced line over each section heading: "FEATURES" over "What you get", "HOW IT WORKS" over "Three steps to launch"
|
|
91
|
+
✅ One heading that says it. If the kicker repeats the heading, delete it; if it adds something, work those words into the heading or the line under it.
|
|
92
|
+
A kicker is one more line to read before the one that matters, and on every section it stops marking anything. It survives from print, where a section label helped a reader flip to a page. On a screen the heading is already the label.
|
|
93
|
+
|
|
94
|
+
### A-136 An eyebrow chip over the headline
|
|
95
|
+
❌ A rounded pill above the hero headline: "✦ Introducing v2", "New: AI-powered", with a border or tint that makes it look pressable
|
|
96
|
+
✅ Put the news in the headline or the line under it. If the chip links somewhere, make it a link that reads as one.
|
|
97
|
+
A pill is the shape of a control and of a filter, so people try to press it. When it does nothing, the page has taught them its shapes lie; when it does something, the most important action on the page is dressed as a label.
|
|
98
|
+
|
|
99
|
+
### A-137 Cream and beige by reflex
|
|
100
|
+
❌ A warm off-white page (`#f5f0e8`, `#faf7f2`), beige cards and a brown-grey text colour, chosen because the brief said "warm", "editorial" or nothing at all
|
|
101
|
+
✅ The brand file's neutrals, or a decision recorded in `DECISIONS.md`. Cream is a fine answer to a question someone asked; it is a default when nobody did.
|
|
102
|
+
Cream replaced violet (`A-01`) as the colour a model reaches for when asked to look tasteful. The failure is the same one: a palette nobody chose, which makes unrelated products look alike and dates every page that carries it.
|
|
103
|
+
|
|
104
|
+
### A-138 An italic serif display headline
|
|
105
|
+
❌ An oversized headline set in an italic serif, often with one word picked out: "Beautifully *crafted*", "Work, *reimagined*"
|
|
106
|
+
✅ Type chosen for this product's voice (`DECISIONS.md`), set upright unless the italic means something. Emphasis comes from the words.
|
|
107
|
+
It is the shortcut to an editorial look, and it has been taken so often that it now reads as the absence of a type decision rather than the presence of one.
|
|
108
|
+
|
|
109
|
+
### A-139 A side-tab accent border
|
|
110
|
+
❌ A thick coloured stripe down one side of an ordinary card, list item or panel
|
|
111
|
+
✅ No stripe. Where the stripe would mean something, a status, a warning, the current item, say it with a label or an icon and text, and keep the stripe only as a second signal.
|
|
112
|
+
A coloured edge on one side is the shape of an alert. Put on a card with nothing to announce, it makes the card look like a warning, and a page of them makes a real warning impossible to see.
|
|
113
|
+
|
|
114
|
+
### A-140 A thick coloured border on a rounded element
|
|
115
|
+
❌ A 2px or wider coloured outline around a card or button with a large radius
|
|
116
|
+
✅ A hairline in `--color-stroke-weak`, or no border and a surface step. If the element must stand out, change its surface, not its outline.
|
|
117
|
+
A heavy outline on a curve becomes the most visible shape in the element, and the eye traces it instead of reading what is inside.
|
|
118
|
+
|
|
119
|
+
### A-141 Cards inside cards
|
|
120
|
+
❌ A card holding a panel holding a card, each with its own border, padding and background
|
|
121
|
+
✅ One container at most, and the groups inside it made with space, type and a divider (`A-67`).
|
|
122
|
+
Every layer adds padding and an edge around the same content, and takes width from it. Three layers deep, the content has the least room on the page and the chrome has the most.
|
|
123
|
+
|
|
124
|
+
### A-142 The soft rounded card
|
|
125
|
+
❌ A 1px hairline and a wide soft shadow on the same card, a large radius, a pale tint: the card that holds every section of a generated page
|
|
126
|
+
✅ Choose one edge: a hairline, or a surface step (`A-08`). Keep the radius to the element's size (`A-07`).
|
|
127
|
+
An edge and a shadow both draw the same boundary, so the card has two outlines. Repeated down the page, the cards stop grouping anything and become the page's texture.
|
|
128
|
+
|
|
129
|
+
### A-143 A decorative grid or stripe background
|
|
130
|
+
❌ Faint grid lines, dot grids or repeating diagonal stripes filling the space behind content
|
|
131
|
+
✅ A plain surface. Keep grids for what is measured or placed on them: a canvas, a map, a chart.
|
|
132
|
+
A grid says "this is a workspace". Behind a paragraph it is noise at the one contrast level that makes text harder to read without being visible enough to mean anything.
|
|
133
|
+
|
|
134
|
+
### A-144 Dark mode with glowing accents
|
|
135
|
+
❌ Coloured glows on borders, buttons and headings of a dark page: `box-shadow: 0 0 24px #22d3ee`, neon outlines, a halo behind the hero
|
|
136
|
+
✅ Dark mode from the token ramp (`C-21`, `C-66`), with the brand colour spent where it means something (`I-56`).
|
|
137
|
+
Glow is contrast added without meaning. On a dark page everything that glows competes to be first, and the one element that needs attention looks like all the rest.
|
|
138
|
+
|
|
139
|
+
### A-146 Numbered section labels
|
|
140
|
+
❌ "01", "02", "03" in small type beside section headings that are not a sequence
|
|
141
|
+
✅ Number only a real order: steps to follow, a ranking, a procedure. Anything else keeps its heading and no number.
|
|
142
|
+
A number promises an order. A reader told there are three steps looks for what comes after the third, and a page that numbers its sections only because they are sections has promised something it does not deliver.
|
|
143
|
+
|
|
87
144
|
---
|
|
88
145
|
|
|
89
146
|
## B. Typography
|
|
@@ -503,6 +560,11 @@ Where people must *browse* to decide, split the list into two dependent fields
|
|
|
503
560
|
iOS Safari zooms the whole page when a field whose text is below 16px takes focus, and it does not zoom back out when the field loses it. The reader is left with a form wider than the screen, scrolling sideways to find the next field (`D-115`).
|
|
504
561
|
Setting `maximum-scale=1` on the viewport to stop it is not the fix. That disables pinch zoom for everyone, which is an accessibility failure in its own right.
|
|
505
562
|
|
|
563
|
+
### F-147 Asking for more than the task needs
|
|
564
|
+
❌ A sign-up that asks for a phone number, company size, job title and "how did you hear about us" before the person can try anything
|
|
565
|
+
✅ Ask for what this step needs to work. Every other field is optional and says so, or it moves to the moment it becomes useful.
|
|
566
|
+
Each field is a question someone has to answer and a reason to leave. The ones the product does not need yet are also the ones people fill with nonsense, so the data they were meant to collect is worse than none.
|
|
567
|
+
|
|
506
568
|
## G. Motion
|
|
507
569
|
|
|
508
570
|
### G-42 Entrance animation on everything
|
|
@@ -517,6 +579,11 @@ Setting `maximum-scale=1` on the viewport to stop it is not the fix. That disabl
|
|
|
517
579
|
|
|
518
580
|
**A consequence worth stating: motion is never the sole signal, for the same reason colour is not (`C-20`).** Honouring the reduced-motion path removes the animation, so any state that was communicated by movement alone is communicated to that user by nothing at all. A field that only shakes on a bad password has no error state under reduced motion. Pair the motion with text, an icon, or a colour change that survives without it.
|
|
519
581
|
|
|
582
|
+
### G-145 A pulsing status dot
|
|
583
|
+
❌ A green dot that pulses or pings beside "All systems operational", "Live", "Online"
|
|
584
|
+
✅ A still dot and the word. Motion is for a state that is changing now: a sync in progress, a recording under way.
|
|
585
|
+
A pulse says "look here, something is happening". On a status that has not changed in a week it is a false alarm on a loop, and it trains people to ignore the one indicator whose job is to be noticed when it matters (`G-43` applies too: under reduced motion it must still read).
|
|
586
|
+
|
|
520
587
|
### G-44 Durations too long
|
|
521
588
|
❌ 500ms+ on UI feedback
|
|
522
589
|
✅ 100–200ms for state change, up to 300ms for larger transitions. If it can be perceived as waiting, it is too slow.
|
package/rules/01-modes.md
CHANGED
|
@@ -190,7 +190,7 @@ Attempting to vary these by mode is a category error:
|
|
|
190
190
|
- **Accessibility floors.** Contrast, focus indication, target size, semantic markup. Identical in all three. `operator` being dense does not license a 24px tap target or a 3:1 body contrast.
|
|
191
191
|
- **Brand identity.** Palette, typeface, logo, voice.
|
|
192
192
|
- **State completeness.** Every mode renders loading, empty, error and disabled.
|
|
193
|
-
- **The anti-pattern file.** All
|
|
193
|
+
- **The anti-pattern file.** All 125 rules in it apply everywhere.
|
|
194
194
|
|
|
195
195
|
---
|
|
196
196
|
|
package/rules/05-copy.md
CHANGED
|
@@ -54,6 +54,7 @@ Someone who reads only the heading still gets the point. Someone who needs the d
|
|
|
54
54
|
✅ "Beautiful waterfront location", "Fast check-in experience", "Free secure parking"
|
|
55
55
|
A heading must carry its own meaning. People scan headings and skip the supporting text, and screen reader users routinely pull up a list of every heading on a page to navigate — a list of one-word labels tells them nothing.
|
|
56
56
|
Break long passages into groups with a descriptive heading each, rather than one unbroken block.
|
|
57
|
+
**The same holds for a page's headline.** "Build the future of work", "Your all-in-one platform", "Where ideas come to life" could sit above any product, which means they say nothing about this one. A headline names what the product does and for whom: "Search your logs by asking in plain English". If it would still be true after swapping in a competitor's name, rewrite it.
|
|
57
58
|
|
|
58
59
|
### I-82 Uneven text length across parallel elements
|
|
59
60
|
❌ Three feature columns of two, four and three lines
|
|
@@ -112,6 +113,7 @@ Users assume different words mean different things, because in a well-built inte
|
|
|
112
113
|
Screen reader users pull up a list of every link on a page; a list of "learn more" is useless. Sighted users scanning have to read the surrounding text to work out where each one goes. Three identical links also imply one destination.
|
|
113
114
|
"Click here" is worse still: it explains a mechanism people already understand, and it is wrong for anyone on touch, keyboard or voice.
|
|
114
115
|
Often the cleanest fix is to drop the link and make the **heading** the link.
|
|
116
|
+
**Buttons too.** "Get started", "Learn more", "Try it free" on every call to action say that something happens, not what. Name the outcome: "Create a workspace", "Search your first log file", "Book a 20-minute demo". A button whose label would fit any product is a button the reader has to decode.
|
|
115
117
|
|
|
116
118
|
### I-57 Actions and text centred by default
|
|
117
119
|
❌ Centred buttons and centred body text as a general habit
|
package/rules.index.json
CHANGED
|
@@ -912,5 +912,106 @@
|
|
|
912
912
|
"severity": "note",
|
|
913
913
|
"since": "0.14.0",
|
|
914
914
|
"pass": "code"
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
"id": "A-135",
|
|
918
|
+
"bucket": "hybrid",
|
|
919
|
+
"severity": "warning",
|
|
920
|
+
"since": "0.17.0",
|
|
921
|
+
"detector": "heading-kicker",
|
|
922
|
+
"pass": "code"
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
"id": "A-136",
|
|
926
|
+
"bucket": "hybrid",
|
|
927
|
+
"severity": "warning",
|
|
928
|
+
"since": "0.17.0",
|
|
929
|
+
"detector": "eyebrow-chip",
|
|
930
|
+
"pass": "code"
|
|
931
|
+
},
|
|
932
|
+
{
|
|
933
|
+
"id": "A-137",
|
|
934
|
+
"bucket": "hybrid",
|
|
935
|
+
"severity": "warning",
|
|
936
|
+
"since": "0.17.0",
|
|
937
|
+
"detector": "cream-palette",
|
|
938
|
+
"pass": "code"
|
|
939
|
+
},
|
|
940
|
+
{
|
|
941
|
+
"id": "A-138",
|
|
942
|
+
"bucket": "hybrid",
|
|
943
|
+
"severity": "warning",
|
|
944
|
+
"since": "0.17.0",
|
|
945
|
+
"detector": "italic-serif-display",
|
|
946
|
+
"pass": "code"
|
|
947
|
+
},
|
|
948
|
+
{
|
|
949
|
+
"id": "A-139",
|
|
950
|
+
"bucket": "hybrid",
|
|
951
|
+
"severity": "warning",
|
|
952
|
+
"since": "0.17.0",
|
|
953
|
+
"detector": "side-tab-border",
|
|
954
|
+
"pass": "code"
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"id": "A-140",
|
|
958
|
+
"bucket": "hybrid",
|
|
959
|
+
"severity": "warning",
|
|
960
|
+
"since": "0.17.0",
|
|
961
|
+
"detector": "rounded-accent-border",
|
|
962
|
+
"pass": "code"
|
|
963
|
+
},
|
|
964
|
+
{
|
|
965
|
+
"id": "A-141",
|
|
966
|
+
"bucket": "judgment",
|
|
967
|
+
"severity": "warning",
|
|
968
|
+
"since": "0.17.0",
|
|
969
|
+
"pass": "screen"
|
|
970
|
+
},
|
|
971
|
+
{
|
|
972
|
+
"id": "A-142",
|
|
973
|
+
"bucket": "judgment",
|
|
974
|
+
"severity": "warning",
|
|
975
|
+
"since": "0.17.0",
|
|
976
|
+
"pass": "screen"
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
"id": "A-143",
|
|
980
|
+
"bucket": "hybrid",
|
|
981
|
+
"severity": "warning",
|
|
982
|
+
"since": "0.17.0",
|
|
983
|
+
"detector": "decorative-grid-background",
|
|
984
|
+
"pass": "code"
|
|
985
|
+
},
|
|
986
|
+
{
|
|
987
|
+
"id": "A-144",
|
|
988
|
+
"bucket": "hybrid",
|
|
989
|
+
"severity": "warning",
|
|
990
|
+
"since": "0.17.0",
|
|
991
|
+
"detector": "glow-accent",
|
|
992
|
+
"pass": "code"
|
|
993
|
+
},
|
|
994
|
+
{
|
|
995
|
+
"id": "G-145",
|
|
996
|
+
"bucket": "hybrid",
|
|
997
|
+
"severity": "warning",
|
|
998
|
+
"since": "0.17.0",
|
|
999
|
+
"detector": "pulsing-dot",
|
|
1000
|
+
"pass": "code"
|
|
1001
|
+
},
|
|
1002
|
+
{
|
|
1003
|
+
"id": "A-146",
|
|
1004
|
+
"bucket": "hybrid",
|
|
1005
|
+
"severity": "warning",
|
|
1006
|
+
"since": "0.17.0",
|
|
1007
|
+
"detector": "numbered-section-labels",
|
|
1008
|
+
"pass": "code"
|
|
1009
|
+
},
|
|
1010
|
+
{
|
|
1011
|
+
"id": "F-147",
|
|
1012
|
+
"bucket": "judgment",
|
|
1013
|
+
"severity": "warning",
|
|
1014
|
+
"since": "0.17.0",
|
|
1015
|
+
"pass": "screen"
|
|
915
1016
|
}
|
|
916
1017
|
]
|
|
@@ -965,9 +965,13 @@ every rule.
|
|
|
965
965
|
probe in the browser and save what it returns beside the verdicts:
|
|
966
966
|
|
|
967
967
|
```
|
|
968
|
-
# If a browser is on this machine, one command renders and records
|
|
968
|
+
# If a browser is on this machine, one command renders and records every width:
|
|
969
969
|
{{scripts_path}} probe --run <page> --save <surface>
|
|
970
970
|
|
|
971
|
+
# A built site that links its styles from the site root (/assets/site.css) must be
|
|
972
|
+
# served, or nothing loads. Name the build directory and the CLI serves it:
|
|
973
|
+
{{scripts_path}} probe --run dist/pricing/index.html --serve dist --save <surface>
|
|
974
|
+
|
|
971
975
|
# Otherwise, at each width: open the page in whatever browser you have, evaluate
|
|
972
976
|
# what `{{scripts_path}} probe` prints, and pipe exactly what it returned into:
|
|
973
977
|
{{scripts_path}} probe --save <surface>
|
|
@@ -976,7 +980,8 @@ probe in the browser and save what it returns beside the verdicts:
|
|
|
976
980
|
`--run` drives a headless Chrome, Chromium or Edge it finds for itself — a
|
|
977
981
|
project with Playwright or Puppeteer already has one — and needs nothing
|
|
978
982
|
installed. The Stop hook runs it too, before it judges a review, so a render is
|
|
979
|
-
not a step anyone can forget.
|
|
983
|
+
not a step anyone can forget. Do not copy the build and rewrite its links to make
|
|
984
|
+
a file load: `--serve` shows the page a browser actually gets.
|
|
980
985
|
|
|
981
986
|
**The CLI writes the probe file, you do not.** `--save` reads the probe's output,
|
|
982
987
|
stamps it with the page's checksum, and stores it. That is what makes the file a
|
|
@@ -1182,7 +1187,9 @@ Not a command to run. In Claude Code, `install` adds a Stop hook that runs
|
|
|
1182
1187
|
`check` error or warning, or a critique's verdict files fail `verdicts`, it refuses
|
|
1183
1188
|
to let you stop and hands you the failures as the reason. **Fix what it names.** Do
|
|
1184
1189
|
not edit verdict files to satisfy it, and do not report the work as done while it is
|
|
1185
|
-
blocking.
|
|
1190
|
+
blocking. It also refuses when a critique's verdict files changed after `critique`
|
|
1191
|
+
wrote them, in a session that did not run `critique`: a fix is judged by the next
|
|
1192
|
+
review, never by the builder editing the last one.
|
|
1186
1193
|
|
|
1187
1194
|
A warning you are sure is right as it stands, because the detector guessed and the
|
|
1188
1195
|
guess is wrong here, is waived on its own line or the line above, in the file's
|