@erclx/canon 4.88.1 → 4.89.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/claude/.claude-plugin/plugin.json +1 -1
- package/package.json +1 -1
- package/src/design/base.css +18 -18
- package/src/design/tokens.ts +25 -19
package/package.json
CHANGED
package/src/design/base.css
CHANGED
|
@@ -4,26 +4,26 @@
|
|
|
4
4
|
file changes freely and nothing a project wrote lives in it. */
|
|
5
5
|
|
|
6
6
|
:root {
|
|
7
|
-
--color-background: #
|
|
8
|
-
--color-surface: #
|
|
9
|
-
--color-chrome: #
|
|
10
|
-
--color-border: #
|
|
11
|
-
--color-text: #
|
|
12
|
-
--color-text-body: #
|
|
13
|
-
--color-text-secondary: #
|
|
14
|
-
--color-muted: #
|
|
15
|
-
--color-accent: #
|
|
7
|
+
--color-background: #0f0e0c;
|
|
8
|
+
--color-surface: #151412;
|
|
9
|
+
--color-chrome: #1b1a18;
|
|
10
|
+
--color-border: #2a2926;
|
|
11
|
+
--color-text: #d9d7d4;
|
|
12
|
+
--color-text-body: #aeada9;
|
|
13
|
+
--color-text-secondary: #8c8b86;
|
|
14
|
+
--color-muted: #7f7f7c;
|
|
15
|
+
--color-accent: #c76b5f;
|
|
16
16
|
--color-success: #61c454;
|
|
17
|
-
--color-light-background: #
|
|
18
|
-
--color-light-surface: #
|
|
19
|
-
--color-light-chrome: #
|
|
20
|
-
--color-light-text: #
|
|
21
|
-
--color-light-text-body: #
|
|
22
|
-
--color-light-text-secondary: #
|
|
23
|
-
--color-light-muted: #
|
|
24
|
-
--color-light-accent: #
|
|
17
|
+
--color-light-background: #fbfaf8;
|
|
18
|
+
--color-light-surface: #f1f1ee;
|
|
19
|
+
--color-light-chrome: #e9e8e5;
|
|
20
|
+
--color-light-text: #2c2c29;
|
|
21
|
+
--color-light-text-body: #4b4947;
|
|
22
|
+
--color-light-text-secondary: #666561;
|
|
23
|
+
--color-light-muted: #6e6d6c;
|
|
24
|
+
--color-light-accent: #ad4a4b;
|
|
25
25
|
--color-light-success: #2d6b22;
|
|
26
|
-
--color-light-border: #
|
|
26
|
+
--color-light-border: #d5d4d1;
|
|
27
27
|
--space-xs: 6px;
|
|
28
28
|
--space-sm: 12px;
|
|
29
29
|
--space-md: 18px;
|
package/src/design/tokens.ts
CHANGED
|
@@ -108,58 +108,64 @@ export const TOKENS: DesignTokens = {
|
|
|
108
108
|
'',
|
|
109
109
|
'Warning and error hold ANSI codes because that is what `scripts/lib/ui.sh` writes and no rendered surface implements an equivalent. Giving either a hex value would invent a mapping no file has, so they carry no contrast reading either.',
|
|
110
110
|
'',
|
|
111
|
-
'Success is the one of the three that does have a rendered equivalent, which is why it carries a hex. `assets/captures/install.html` marks every confirmed step with it, and the shell writes `ANSI 32` for the same role, so the two are one role in two registers rather than one value in two spellings. The hex is what the rendered surface picked and no reading claims the terminal renders that value. It declares `background` alone as its ground, since that is the only role it is drawn on, where every other dark text role is drawn on both.',
|
|
111
|
+
'Success is the one of the three that does have a rendered equivalent, which is why it carries a hex. `assets/captures/install.html` marks every confirmed step with it, and the shell writes `ANSI 32` for the same role, so the two are one role in two registers rather than one value in two spellings. The hex is what the rendered surface picked and no reading claims the terminal renders that value. It declares `background` alone as its ground, since that is the only role it is drawn on, where every other dark text role is drawn on both. It is the one role below that is not derived.',
|
|
112
|
+
'',
|
|
113
|
+
"Every other role is derived rather than picked, solved in OKLCH by binary search for the lightness that hits a target contrast against its ground, using this module's own anchors. Six anchors are the whole system: ground lightness 0.985 light and 0.165 dark, neutral chroma 0.003 light and 0.004 dark, neutral hue 90 both, accent hue 22 light and 28 dark, accent chroma 0.13 light and 0.12 dark for a mark and 0.095 light and 0.09 dark for a fill. Only the mark step is rendered below, in `accent`. That token already stands in for a fill in practice: `assets/captures/hero.html`'s `.cmd` rule paints its whole background with `var(--color-accent)` and sets text on top, which is a fill use rather than a mark one. The fill chroma step has no token of its own yet, so a lower-saturation `accent-fill` would recolor that button rather than introduce a new consumer. Targets, which are inputs rather than results: text 13.5, body 8.6, secondary 5.6, muted 4.6, accent 5.2. Dark is its own anchor set rather than an inversion of light, and every arm measured in the groundwork behind this landed on identical neutral ratios, which is what made the accent choice a question about hue alone.",
|
|
114
|
+
'',
|
|
115
|
+
'`muted` and `light-muted` solve against `surface` rather than `background`. Both declare two grounds and the groundwork solved its target against one, so the recorded hex cleared 4.6 against `background` and read 4.40 dark, 4.24 light against `surface`, the tighter of the two since surface sits a step closer to its text color. The values here are re-solved for the same 4.6 target read against `surface` instead, which clears both: 4.58 dark, 4.56 light against `surface`, and 4.80 dark, 4.95 light against `background`.',
|
|
116
|
+
'',
|
|
117
|
+
'The accent is a quiet red at hue 22 light, 28 dark, chosen over a vivid red that read as an error state against a page reporting success, over indigo which carries less distinctiveness at hue 280 in tooling already dominated by that hue, and over rust at hue 42, a larger temperature shift than the problem required. The debt this accepts: `error` and `warning` now share a register with the most repeated element on every rendered surface, so both need differentiating by lightness or by an icon rather than by hue, and that work is unscheduled.',
|
|
112
118
|
].join('\n'),
|
|
113
119
|
|
|
114
120
|
color: [
|
|
115
121
|
{
|
|
116
122
|
role: 'background',
|
|
117
123
|
intent: 'page canvas',
|
|
118
|
-
value: '#
|
|
124
|
+
value: '#0f0e0c',
|
|
119
125
|
},
|
|
120
126
|
{
|
|
121
127
|
role: 'surface',
|
|
122
128
|
intent: 'cards, panels, raised blocks',
|
|
123
|
-
value: '#
|
|
129
|
+
value: '#151412',
|
|
124
130
|
},
|
|
125
131
|
{
|
|
126
132
|
role: 'chrome',
|
|
127
133
|
intent: 'the window titlebar, one step above the canvas',
|
|
128
|
-
value: '#
|
|
134
|
+
value: '#1b1a18',
|
|
129
135
|
},
|
|
130
136
|
{
|
|
131
137
|
role: 'border',
|
|
132
138
|
intent: 'every rule and panel edge',
|
|
133
|
-
value: '#
|
|
139
|
+
value: '#2a2926',
|
|
134
140
|
},
|
|
135
141
|
{
|
|
136
142
|
role: 'text',
|
|
137
143
|
intent: 'headings, counts, emphasized runs',
|
|
138
|
-
value: '#
|
|
144
|
+
value: '#d9d7d4',
|
|
139
145
|
grounds: DARK_GROUNDS,
|
|
140
146
|
},
|
|
141
147
|
{
|
|
142
148
|
role: 'text-body',
|
|
143
149
|
intent: 'default body copy',
|
|
144
|
-
value: '#
|
|
150
|
+
value: '#aeada9',
|
|
145
151
|
grounds: DARK_GROUNDS,
|
|
146
152
|
},
|
|
147
153
|
{
|
|
148
154
|
role: 'text-secondary',
|
|
149
155
|
intent: 'labels, captions, supporting copy',
|
|
150
|
-
value: '#
|
|
156
|
+
value: '#8c8b86',
|
|
151
157
|
grounds: DARK_GROUNDS,
|
|
152
158
|
},
|
|
153
159
|
{
|
|
154
160
|
role: 'muted',
|
|
155
161
|
intent: 'the faintest step, trailing notes',
|
|
156
|
-
value: '#
|
|
162
|
+
value: '#7f7f7c',
|
|
157
163
|
grounds: DARK_GROUNDS,
|
|
158
164
|
},
|
|
159
165
|
{
|
|
160
166
|
role: 'accent',
|
|
161
167
|
intent: 'install command, mark, primary action',
|
|
162
|
-
value: '#
|
|
168
|
+
value: '#c76b5f',
|
|
163
169
|
grounds: DARK_GROUNDS,
|
|
164
170
|
},
|
|
165
171
|
{
|
|
@@ -173,46 +179,46 @@ export const TOKENS: DesignTokens = {
|
|
|
173
179
|
{
|
|
174
180
|
role: 'light-background',
|
|
175
181
|
intent: 'page canvas on a light ground',
|
|
176
|
-
value: '#
|
|
182
|
+
value: '#fbfaf8',
|
|
177
183
|
},
|
|
178
184
|
{
|
|
179
185
|
role: 'light-surface',
|
|
180
186
|
intent: 'cards and panels on a light ground',
|
|
181
|
-
value: '#
|
|
187
|
+
value: '#f1f1ee',
|
|
182
188
|
},
|
|
183
189
|
{
|
|
184
190
|
role: 'light-chrome',
|
|
185
191
|
intent: 'the window titlebar, one step above the canvas',
|
|
186
|
-
value: '#
|
|
192
|
+
value: '#e9e8e5',
|
|
187
193
|
},
|
|
188
194
|
{
|
|
189
195
|
role: 'light-text',
|
|
190
196
|
intent: 'primary text on a light ground',
|
|
191
|
-
value: '#
|
|
197
|
+
value: '#2c2c29',
|
|
192
198
|
grounds: LIGHT_GROUNDS,
|
|
193
199
|
},
|
|
194
200
|
{
|
|
195
201
|
role: 'light-text-body',
|
|
196
202
|
intent: 'default body copy on a light ground',
|
|
197
|
-
value: '#
|
|
203
|
+
value: '#4b4947',
|
|
198
204
|
grounds: LIGHT_GROUNDS,
|
|
199
205
|
},
|
|
200
206
|
{
|
|
201
207
|
role: 'light-text-secondary',
|
|
202
208
|
intent: 'labels, captions, supporting copy on a light ground',
|
|
203
|
-
value: '#
|
|
209
|
+
value: '#666561',
|
|
204
210
|
grounds: LIGHT_GROUNDS,
|
|
205
211
|
},
|
|
206
212
|
{
|
|
207
213
|
role: 'light-muted',
|
|
208
214
|
intent: 'secondary text on a light ground',
|
|
209
|
-
value: '#
|
|
215
|
+
value: '#6e6d6c',
|
|
210
216
|
grounds: LIGHT_GROUNDS,
|
|
211
217
|
},
|
|
212
218
|
{
|
|
213
219
|
role: 'light-accent',
|
|
214
220
|
intent: 'links and primary action on light',
|
|
215
|
-
value: '#
|
|
221
|
+
value: '#ad4a4b',
|
|
216
222
|
grounds: LIGHT_GROUNDS,
|
|
217
223
|
},
|
|
218
224
|
{
|
|
@@ -224,7 +230,7 @@ export const TOKENS: DesignTokens = {
|
|
|
224
230
|
{
|
|
225
231
|
role: 'light-border',
|
|
226
232
|
intent: 'rules and panel edges on light',
|
|
227
|
-
value: '#
|
|
233
|
+
value: '#d5d4d1',
|
|
228
234
|
verify: true,
|
|
229
235
|
},
|
|
230
236
|
],
|