@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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "canon",
3
3
  "description": "Automated governance, versioning, and discovery tools for Claude Code.",
4
- "version": "4.88.1",
4
+ "version": "4.89.0",
5
5
  "author": {
6
6
  "name": "Eric Le",
7
7
  "url": "https://github.com/erclx"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@erclx/canon",
3
3
  "type": "module",
4
- "version": "4.88.1",
4
+ "version": "4.89.0",
5
5
  "description": "Infrastructure and quality tooling for developer workflows",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -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: #191512;
8
- --color-surface: #211c19;
9
- --color-chrome: #241e1a;
10
- --color-border: #2f2823;
11
- --color-text: #f4efe9;
12
- --color-text-body: #c9c0b7;
13
- --color-text-secondary: #a79d94;
14
- --color-muted: #948a81;
15
- --color-accent: #e0724b;
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: #faf7f2;
18
- --color-light-surface: #f4efe6;
19
- --color-light-chrome: #ede4d6;
20
- --color-light-text: #1a1815;
21
- --color-light-text-body: #3d3630;
22
- --color-light-text-secondary: #5c544b;
23
- --color-light-muted: #726b62;
24
- --color-light-accent: #a4471c;
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: #e4dcd0;
26
+ --color-light-border: #d5d4d1;
27
27
  --space-xs: 6px;
28
28
  --space-sm: 12px;
29
29
  --space-md: 18px;
@@ -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: '#191512',
124
+ value: '#0f0e0c',
119
125
  },
120
126
  {
121
127
  role: 'surface',
122
128
  intent: 'cards, panels, raised blocks',
123
- value: '#211c19',
129
+ value: '#151412',
124
130
  },
125
131
  {
126
132
  role: 'chrome',
127
133
  intent: 'the window titlebar, one step above the canvas',
128
- value: '#241e1a',
134
+ value: '#1b1a18',
129
135
  },
130
136
  {
131
137
  role: 'border',
132
138
  intent: 'every rule and panel edge',
133
- value: '#2f2823',
139
+ value: '#2a2926',
134
140
  },
135
141
  {
136
142
  role: 'text',
137
143
  intent: 'headings, counts, emphasized runs',
138
- value: '#f4efe9',
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: '#c9c0b7',
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: '#a79d94',
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: '#948a81',
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: '#e0724b',
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: '#faf7f2',
182
+ value: '#fbfaf8',
177
183
  },
178
184
  {
179
185
  role: 'light-surface',
180
186
  intent: 'cards and panels on a light ground',
181
- value: '#f4efe6',
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: '#ede4d6',
192
+ value: '#e9e8e5',
187
193
  },
188
194
  {
189
195
  role: 'light-text',
190
196
  intent: 'primary text on a light ground',
191
- value: '#1a1815',
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: '#3d3630',
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: '#5c544b',
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: '#726b62',
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: '#a4471c',
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: '#e4dcd0',
233
+ value: '#d5d4d1',
228
234
  verify: true,
229
235
  },
230
236
  ],