anentrypoint-design 0.0.470 → 0.0.471

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "anentrypoint-design",
3
- "version": "0.0.470",
3
+ "version": "0.0.471",
4
4
  "description": "247420 design system SDK — webjsx + modified ripple-ui, single-file ESM bundle for reproducible use of the AnEntrypoint design.",
5
5
  "type": "module",
6
6
  "main": "./dist/247420.js",
@@ -1,47 +1,23 @@
1
- /* ============================================================
2
- 247420 design system — component sheet
3
- shadcn-neutral: system-font display + body + mono, no custom web fonts.
4
- Confident hierarchy, centered editorial stack, neutral grayscale accent.
5
- Indicator rails over hairlines.
6
- ============================================================ */
7
-
8
- /* ============================================================
9
- Base
10
- ============================================================ */
11
1
  * { box-sizing: border-box; }
12
2
  html, body { margin: 0; padding: 0; }
13
3
  button, input, select, textarea { font: inherit; }
14
4
 
15
- /* ============================================================
16
- Accessibility — Skip Link
17
- ============================================================ */
18
5
  .skip-link {
6
+ --skip-link-preflight-translate-clear: -100%;
19
7
  position: absolute;
20
- /* -40px alone left the 44px-tall pill (padding + min-height floor below)
21
- poking ~4px into every page pre-focus -- measured live via
22
- getBoundingClientRect(). The offset must clear the full rendered height,
23
- not a guessed constant, so translateY pushes it out by its own box. */
24
8
  top: 0;
25
9
  left: 0;
26
- transform: translateY(-100%);
10
+ transform: translateY(var(--skip-link-preflight-translate-clear));
27
11
  background: var(--accent);
28
12
  color: var(--accent-fg);
29
13
  padding: var(--space-2) var(--space-3);
30
14
  text-decoration: none;
31
- /* Must outrank every layer of chrome once focused, or the first Tab press
32
- lands on a control hidden behind the sticky header (was z-index:100,
33
- which the header alone now matches). */
34
15
  z-index: var(--z-top);
35
16
  border-radius: var(--r-pill);
36
17
  font-weight: 600;
37
18
  font-size: var(--fs-sm);
38
- /* The skip link is the first thing a keyboard or switch user reaches, so it
39
- is the last control that should be hard to hit. Its padding alone rendered
40
- it 39px tall -- measured live under coarse-pointer emulation on every kit.
41
- Floored unconditionally rather than under a pointer:coarse query, because
42
- switch and head-pointer users are not detected as coarse pointers and need
43
- the larger target just as much. */
44
- min-height: 44px;
19
+ --skip-link-min-touch-target: 44px;
20
+ min-height: var(--skip-link-min-touch-target);
45
21
  display: inline-flex;
46
22
  align-items: center;
47
23
  }
@@ -51,23 +27,6 @@ button, input, select, textarea { font: inherit; }
51
27
  outline: var(--focus-w) solid var(--focus-color);
52
28
  outline-offset: var(--focus-offset);
53
29
  }
54
- /* Visually-hidden but still in the accessibility tree. Emitted by Row() (the
55
- rail status word), FilterBar()/FileGrid() (aria-live result counts) and
56
- form-primitives' required marker — all of which shipped BEFORE this rule
57
- existed anywhere the app shell loads. The only other definitions live in
58
- app-surfaces.css (pre-scoped to `.ds-247420`, so it never reaches a kit that
59
- does not mount that root) and editor-primitives.css (a separate opt-in
60
- <link>), which left every app-shell consumer rendering screen-reader-only
61
- text VISIBLY the moment it passed `rail`/`resultCount`.
62
- Deliberately NOT `display:none` / `visibility:hidden` / `width:0`: those
63
- remove the node from the accessibility tree too, which defeats the entire
64
- purpose — the text exists only for AT. The clip + 1px box is what keeps it
65
- announced while occupying no visible area.
66
- `margin: -1px` is OFF-SCALE ON PURPOSE — it is not rhythm, it is one half of
67
- the canonical visually-hidden idiom: the negative margin cancels the 1px box
68
- so the clipped element contributes zero layout. Snapping it to a --space-*
69
- rung would reintroduce a measurable gap. `clip` is deprecated but retained
70
- alongside `clip-path` for older AT/browser pairs that ignore the latter. */
71
30
  .sr-only {
72
31
  position: absolute;
73
32
  width: 1px;
@@ -81,11 +40,6 @@ button, input, select, textarea { font: inherit; }
81
40
  border: 0;
82
41
  }
83
42
 
84
- /* .ds-aspect — generic aspect-ratio utility. Native `aspect-ratio` property
85
- (broadly supported for years) rather than the padding-bottom hack: no
86
- extra wrapper markup, no absolutely-positioned inner layer needed just to
87
- fill the box. `--aspect` defaults to 16/9; a caller overrides it inline
88
- (e.g. style="--aspect:1/1") or via a ratio-named modifier class below. */
89
43
  .ds-aspect {
90
44
  aspect-ratio: var(--aspect, 16 / 9);
91
45
  width: 100%;
@@ -105,14 +59,11 @@ body {
105
59
  -webkit-font-smoothing: antialiased;
106
60
  text-rendering: optimizeLegibility;
107
61
  }
108
- /* Light (paper, the default theme) needs a stronger accent share than dark to
109
- clear a visible selection tint against --bg-2 -- the dark-theme value (24%)
110
- read too weak on paper. Dark/ink keeps its existing 24% mix, restored below
111
- in the ink/dark + auto-dark blocks (mirrors the --danger/--flame pattern of
112
- scoping a value per theme rather than sharing one across both). */
113
- ::selection { background: color-mix(in oklab, var(--accent) 46%, var(--bg-2)); color: var(--fg); }
62
+ :root {
63
+ --selection-tint-paper-share: 46%;
64
+ }
65
+ ::selection { background: color-mix(in oklab, var(--accent) var(--selection-tint-paper-share), var(--bg-2)); color: var(--fg); }
114
66
 
115
- /* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
116
67
  .app, .ds-stage {
117
68
  container-type: inline-size;
118
69
  overflow-x: clip;
@@ -120,29 +71,16 @@ body {
120
71
  }
121
72
  .app * { min-width: 0; }
122
73
 
123
- /* Scrollbar treatment, applied once at the root rather than per-component.
124
- chat.css already styled its own thread and code blocks this way, but every
125
- other scroll container (.app-side-shell, .app-main, .ds-scroll-x,
126
- .ds-table-wrap, .ds-live-log) fell back to the UA default -- measured live,
127
- 4 of 4 containers on dashboard and 7 of 7 on gm_inspector were unstyled while
128
- chat's two were not. A default scrollbar reads as a bright seam against a
129
- near-black panel in the ink and dark themes, and inconsistently between two
130
- panels on the same page. Tokens mean the thumb follows the active theme.
131
- Inheriting from the container also covers scrollers added later. */
132
74
  .app, .ds-stage, .app *, .ds-stage * {
133
75
  scrollbar-width: thin;
134
76
  scrollbar-color: var(--bg-3) transparent;
135
77
  }
136
78
 
137
- /* ============================================================
138
- Typography
139
- ============================================================ */
140
79
  h1, .t-h1 { font-family: var(--ff-display); font-size: var(--fs-h1); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
141
80
  h2, .t-h2 { font-family: var(--ff-display); font-size: var(--fs-h2); line-height: var(--lh-snug); letter-spacing: var(--tr-tight); font-weight: 600; margin: 0; }
142
81
  h3, .t-h3 { font-family: var(--ff-display); font-size: var(--fs-h3); line-height: var(--lh-snug); letter-spacing: -0.01em; font-weight: 600; margin: 0; }
143
82
  h4, .t-h4 { font-family: var(--ff-display); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
144
83
 
145
- /* App/chrome typescale opt-in: compact heading ceiling for application UIs. */
146
84
  [data-typescale="app"] h1, [data-typescale="app"] .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
147
85
  [data-typescale="app"] h2, [data-typescale="app"] .t-h2 { font-size: var(--fs-h2-app); }
148
86
  [data-typescale="app"] h3, [data-typescale="app"] .t-h3 { font-size: var(--fs-h3-app); }
@@ -152,21 +90,9 @@ h4, .t-h4 { font-family: var(--ff-display); font-size: var(--fs-h4); line-height
152
90
  .t-mega { font-family: var(--ff-display); font-size: var(--fs-mega); line-height: 0.92; letter-spacing: var(--tr-tighter); font-weight: 700; margin: 0; }
153
91
 
154
92
  .t-display { font-family: var(--ff-display); font-weight: 600; letter-spacing: var(--tr-tight); }
155
- /* Explicit weight, not relying on inherited normal: --ff-mono's stack (Menlo,
156
- Consolas, ui-monospace) can resolve to a variable-font fallback on some
157
- platforms whose default instance isn't the 400 weight, rendering "body ·
158
- 16px regular" visibly bold despite its own label -- pin the weight so the
159
- sample matches what it claims regardless of which font in the stack loads. */
160
93
  .t-mono { font-family: var(--ff-mono); font-weight: 400; }
161
94
  .t-body { font-family: var(--ff-body); }
162
95
 
163
- /* House small-label voice, in two sizes. Every declaration here is sourced
164
- from a token, so a sheet that cannot join these selector lists (community.css
165
- and gm-prose.css ship as separate <link>-able exports and must not depend on
166
- app-shell.css being present) still composes the same voice by referencing the
167
- same four tokens — --ff-mono / --fs-* / uppercase / --tr-label. That token
168
- set, not this rule, is the single source of truth; a selector that restates a
169
- literal instead of the token is the drift this pairing exists to prevent. */
170
96
  .t-label { font-family: var(--ff-mono); font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-label); font-weight: 500; }
171
97
  .t-micro { font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: var(--tr-label); color: var(--fg-3); }
172
98
  .t-meta { font-family: var(--ff-body); font-size: var(--fs-sm); color: var(--fg-3); }
@@ -177,13 +103,6 @@ h4, .t-h4 { font-family: var(--ff-display); font-size: var(--fs-h4); line-height
177
103
  margin: 0;
178
104
  }
179
105
 
180
- /* h1/h2/h3/h4 and .lede/.t-lede are both margin:0 primitives by design (a
181
- heading used standalone must not force space its context doesn't want).
182
- But a heading immediately followed by a lede is a named pairing, not two
183
- independent primitives that happen to be adjacent -- it needs its own gap
184
- regardless of whether the surrounding shell opts into .ds-app-surface
185
- (which only adds this spacing on landing/marketing surfaces, leaving every
186
- Operate-mode kit that skips that class with a zero-gap heading+subtitle). */
187
106
  h1 + .lede, h1 + .t-lede,
188
107
  h2 + .lede, h2 + .t-lede,
189
108
  h3 + .lede, h3 + .t-lede,
@@ -191,25 +110,11 @@ h3 + .lede, h3 + .t-lede,
191
110
  margin-top: var(--space-2);
192
111
  }
193
112
 
194
- /* A lede immediately followed by the article body is a named pairing too --
195
- same rationale as the heading+lede gap above. Without this, .lede's
196
- margin:0 leaves zero space above the first paragraph while every
197
- paragraph-to-paragraph gap below it uses --space-4 (.ds-prose p), so the
198
- dek reads as glued to the body it introduces. */
199
113
  .lede + .post-body, .t-lede + .post-body,
200
114
  .lede + .ds-prose, .t-lede + .ds-prose {
201
115
  margin-top: var(--space-4);
202
116
  }
203
117
 
204
- /* Same gap-ownership problem again for .ds-section (hero-content.css):
205
- `* + .ds-section { margin-top: 0 }` deliberately relies on the PRECEDING
206
- sibling supplying the lead-in space, so two spacing primitives can
207
- coordinate into one gap instead of stacking. .lede supplies none (margin:0
208
- by design), so a lede-then-section pairing (e.g. project_page's h1 -> lede
209
- -> "install" section) collapses to a flush 0px gap instead of inheriting
210
- .ds-section's own --space-8 lead. Measured live on project_page: the
211
- "install" h3 sat ~4px from the lede above it (padding only) vs the
212
- intended --space-8/2 gap other section-adjacent siblings get. */
213
118
  .lede + .ds-section, .t-lede + .ds-section {
214
119
  margin-top: var(--space-8);
215
120
  }
@@ -223,7 +128,6 @@ h3 + .lede, h3 + .t-lede,
223
128
  color: var(--accent-ink);
224
129
  display: inline-flex; align-items: center; gap: 12px;
225
130
  }
226
- /* Editorial kicker mark — a short solid ink rule, the print-byline tell. */
227
131
  .eyebrow::before {
228
132
  content: '';
229
133
  width: 28px; height: 3px; background: currentColor;
@@ -252,21 +156,6 @@ h3 + .lede, h3 + .t-lede,
252
156
  font-family: var(--ff-body);
253
157
  }
254
158
  .ds-prose blockquote p:last-child { margin-bottom: 0; }
255
- /* Closing line of an article ("end. reply by opening a pr."), set off from the
256
- body it terminates. Quieter and smaller than the prose around it: it takes
257
- the mono face and the --fg-3 tone the house uses for ancillary voices
258
- (.t-micro, .dim), so the endnote reads as chrome around the article rather
259
- than a final paragraph of it. The --space-5 lead does the "set off" — it
260
- breaks the paragraph rhythm so the eye registers the piece has ended before
261
- reading the words; margin-bottom:0 overrides .ds-prose p's --space-4 so the
262
- article does not end on dead space.
263
- Lives here, beside the rest of the .ds-prose family, NOT in gm-prose.css:
264
- the blog kit that uses this class links only colors_and_type.css +
265
- app-shell.css, so a rule in that separately-<link>-ed export would be exactly
266
- as undefined as the class was before. Sized at --fs-xs, not the --fs-micro
267
- label rung: this is a readable sentence with a link in it, not a micro-label.
268
- The link inherits .ds-prose a's --accent-ink treatment (a readable TEXT tone;
269
- the bare --accent fill is ~1.07:1 on paper) — deliberately not re-stated. */
270
159
  .ds-prose .ds-prose-endnote,
271
160
  .ds-prose-endnote {
272
161
  margin-top: var(--space-5);
@@ -279,7 +168,6 @@ h3 + .lede, h3 + .t-lede,
279
168
 
280
169
  .dim { color: var(--fg-3); }
281
170
 
282
- /* Links */
283
171
  a { color: inherit; text-decoration: none; }
284
172
  a.ds-link-accent, .ds-prose a {
285
173
  color: var(--accent-ink);
@@ -296,15 +184,10 @@ kbd {
296
184
  background: var(--bg-2); padding: 2px 6px; border-radius: var(--r-1);
297
185
  }
298
186
 
299
- /* --bg-3 (not --bg-2): an inline code pill needs to read as a distinct
300
- surface against the page background, not just against adjacent text — at
301
- --bg-2 the pill measured 1.39:1 background-to-background contrast in dark
302
- theme (barely distinguishable from the page itself). --bg-3 is the same
303
- tier-3 surface step .chip.tone-dim already uses for the same reason,
304
- bringing the pill to 2.07:1, consistent with the rest of the tier-3 ramp. */
305
187
  code {
188
+ --code-pill-tier3-surface: var(--bg-3);
306
189
  font-family: var(--ff-mono); font-size: 0.92em;
307
- background: var(--bg-3); padding: 0.15em 0.5em; border-radius: var(--r-1);
190
+ background: var(--code-pill-tier3-surface); padding: 0.15em 0.5em; border-radius: var(--r-1);
308
191
  }
309
192
 
310
193
  pre {
@@ -1,12 +1,5 @@
1
- /* ============================================================
2
- Primitives
3
- ============================================================ */
4
1
  .btn, .btn-primary, .btn-ghost {
5
2
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
6
- /* Fixed height + horizontal-only padding: the control height is exact and
7
- alignable (flex centres the label vertically), the way webgeist snaps every
8
- control to a height ladder. Default is the --ctl-md rung; --btn-sm/--btn-lg
9
- retune height + h-padding + font per size. Density scales the ladder. */
10
3
  height: var(--ctl-md); min-height: var(--ctl-md);
11
4
  padding: 0 var(--space-2-75);
12
5
  font-family: var(--ff-body);
@@ -14,30 +7,15 @@
14
7
  text-decoration: none;
15
8
  white-space: nowrap;
16
9
  cursor: pointer;
17
- /* Rounded-rect app chrome, not a marketing-page stadium CTA.
18
- Shape vocabulary: r-1/r-2 = actionable buttons, icon-buttons, and
19
- containers; r-pill = reserved for status/input/chip/badge/progress
20
- surfaces (composer input, chips, badges, progress bars, theme-toggle
21
- segments) - never for actions. */
22
10
  border-radius: var(--r-1);
23
11
  border: var(--bw-hair) solid transparent;
24
12
  box-shadow: none;
25
- /* Restrained hover-lift: a 1px rise + hairline shadow reads as a crisp,
26
- confident affordance rather than a soft glow-card float. */
27
13
  transition: transform var(--dur-base) var(--ease-spring), background var(--dur-snap) var(--ease),
28
14
  color var(--dur-snap) var(--ease), box-shadow var(--dur-base) var(--ease-spring),
29
15
  border-color var(--dur-snap) var(--ease);
30
16
  }
31
17
  .btn { background: var(--bg-2); color: var(--fg); border-color: var(--rule); }
32
18
  .btn:hover { background: var(--bg-3); color: var(--fg); transform: translateY(-1px); box-shadow: var(--shadow-1); }
33
- /* Primary CTA — the brand green as a solid editorial block; hover inverts to
34
- an ink block with green text, a confident two-tone flip. Uses --green
35
- (the site's own #247420 identity color, dark-mode-retuned to --green's
36
- ink-safe #5CBF52 rather than --accent/--acid, which a prior contrast-driven
37
- restyle deliberately flattened to a neutral gray for --accent's OTHER
38
- consumers (nav active state, focus rings, etc) -- .btn-primary needed the
39
- brand color back for click-hierarchy without undoing that restyle
40
- elsewhere. --on-color (#fff) clears AA on both light and dark --green. */
41
19
  .btn-primary {
42
20
  background: var(--green); color: var(--on-color);
43
21
  font-weight: 700;
@@ -51,10 +29,6 @@
51
29
  outline-offset: var(--focus-offset);
52
30
  }
53
31
 
54
- /* Button size ladder — the size prop on Btn() (sm | md | lg). md is the base
55
- rule above; sm/lg retune height (off the --ctl-* ladder), horizontal padding,
56
- and font-size so a size swap is one class, never inline padding overrides
57
- (the old preview faked sizes with style=). Applies to every variant. */
58
32
  .btn-sm, .btn-sm.btn-primary, .btn-sm.btn-ghost {
59
33
  height: var(--ctl-sm); min-height: var(--ctl-sm);
60
34
  padding: 0 var(--space-2); font-size: var(--fs-tiny); gap: var(--space-1);
@@ -64,10 +38,6 @@
64
38
  padding: 0 var(--space-4); font-size: var(--fs-body); gap: var(--space-2);
65
39
  }
66
40
 
67
- /* App-mode quiet interactions — the marketing hover-lift (translateY + shadow)
68
- and the .row .meta slide read as decorative float on a dense working surface.
69
- Under [data-typescale="app"], state changes are background/border-only: crisp,
70
- no motion, no elevation. Marketing surfaces (no data-typescale) keep the lift. */
71
41
  [data-typescale="app"] .btn:hover,
72
42
  [data-typescale="app"] .btn-primary:hover,
73
43
  [data-typescale="app"] .btn-ghost:hover { transform: none; box-shadow: none; }
@@ -78,9 +48,6 @@
78
48
  [data-typescale="app"] a.row:hover .meta,
79
49
  [data-typescale="app"] .row[role="button"]:hover .meta { transform: none; }
80
50
 
81
- /* ============================================================
82
- IconButton — square icon-only button
83
- ============================================================ */
84
51
  .ds-icon-btn {
85
52
  display: inline-flex; align-items: center; justify-content: center;
86
53
  padding: 0; border: none; cursor: pointer;
@@ -97,7 +64,6 @@
97
64
  .ds-icon-btn-ghost:hover { background: var(--fg); color: var(--bg); }
98
65
  .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
99
66
  .ds-icon-btn-primary:hover { background: var(--fg); color: var(--accent-ink); }
100
- /* warn = destructive ACTION tone; flame stays exclusively error STATUS. */
101
67
  .ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
102
68
  .ds-icon-btn-danger:hover { filter: brightness(0.92); }
103
69
  .ds-icon-btn:active { transform: translateY(1px); }
@@ -105,9 +71,6 @@
105
71
  opacity: 0.5; cursor: not-allowed; pointer-events: none;
106
72
  }
107
73
 
108
- /* ============================================================
109
- Badge — small inline count/status pill
110
- ============================================================ */
111
74
  .ds-badge {
112
75
  display: inline-flex; align-items: center; justify-content: center;
113
76
  min-width: 18px; height: 18px; padding: 0 6px;
@@ -115,15 +78,8 @@
115
78
  border-radius: var(--r-pill);
116
79
  background: var(--bg-3); color: var(--fg-2);
117
80
  }
118
- /* Badge size ladder — sm for dense inline counts, lg for prominent markers.
119
- Base (above) stays the 18px default. */
120
81
  .ds-badge.ds-badge--sm { min-width: 14px; height: 14px; padding: 0 var(--space-1); font-size: 10px; }
121
82
  .ds-badge.ds-badge--lg { min-width: 22px; height: 22px; padding: 0 var(--space-2); font-size: var(--fs-tiny); }
122
- /* Canonical tone names are tone-success / tone-error / tone-neutral. Every
123
- other tone name grouped into the same rule below (tone-green/tone-live,
124
- tone-flame, tone-wip, tone-sun/tone-yellow, tone-ok/tone-miss) is a
125
- true-synonym legacy alias, kept working but sharing one declaration so the
126
- tone-family colors can't drift apart across names. */
127
83
  .ds-badge.tone-green, .ds-badge.tone-live, .ds-badge.tone-success {
128
84
  background: var(--green-tint); color: var(--green-deep);
129
85
  }
@@ -150,18 +106,12 @@
150
106
  letter-spacing: var(--tr-caps); text-transform: uppercase;
151
107
  border-radius: var(--r-pill);
152
108
  }
153
- /* Chip size ladder — sm for dense toolbars/table cells, lg for prominent
154
- status. tone-* colouring (below) is orthogonal to size. */
155
109
  .chip.chip--sm { padding: var(--space-half) var(--space-2); font-size: var(--fs-micro); gap: var(--space-1); }
156
110
  .chip.chip--lg { padding: var(--space-1-75) var(--space-2-75); font-size: var(--fs-xs); }
157
- /* Tag variant — a rectangular, sentence-case chip for dense data (table cells,
158
- inline labels) where the all-caps pill reads too shouty and space-hungry.
159
- Keeps the tone-* palette; drops the caps + pill for a tight --r-0 corner. */
160
111
  .chip.chip--tag {
161
112
  text-transform: none; letter-spacing: 0; font-weight: 500;
162
113
  border-radius: var(--r-0); padding: var(--space-half) var(--space-2);
163
114
  }
164
- /* Same canonical/legacy-alias grouping as .ds-badge above. */
165
115
  .chip.tone-green, .chip.tone-live, .chip.tone-success, .chip.tone-ok {
166
116
  background: var(--green-tint); color: var(--green-deep);
167
117
  }
@@ -171,21 +121,9 @@
171
121
  .chip.tone-wip, .chip.tone-neutral {
172
122
  background: var(--bg-3); color: var(--fg-2);
173
123
  }
174
- /* `.chip.accent` is the bare-adjective spelling of tone-accent (ui_kits/blog
175
- uses it for a "draft" chip). It had no rule anywhere, so an accented chip
176
- rendered byte-identical to a plain one. Folded into the alias grouping rather
177
- than given its own block, so the two spellings cannot drift apart. --accent
178
- is the FILL and --accent-ink the readable text tone (AGENTS.md) — the bare
179
- lead is ~1.07:1 on paper and unreadable as text. */
180
124
  .chip.accent, .chip.tone-accent {
181
125
  background: var(--accent-tint); color: var(--accent-ink);
182
126
  }
183
- /* tone-dim was applied by five kits (aicat, project_page, signin, system_primer,
184
- terminal) with no rule anywhere, so a "dim" chip rendered byte-identical to a
185
- plain one — measured at rgb(234,230,218) on rgb(31,31,38), same opacity. It is
186
- the recede-into-the-row tone: the tier-3 foreground on the same recessed
187
- surface tone-wip uses, which is quieter than the default --fg-2 without
188
- dropping to an opacity fade that would take the border and background with it. */
189
127
  .chip.tone-dim {
190
128
  background: var(--bg-3); color: var(--fg-3);
191
129
  }
@@ -199,10 +137,6 @@
199
137
  .chip.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
200
138
  .chip.tone-yellow { background: var(--sun); color: var(--ink); }
201
139
 
202
- /* Removable chip — a trailing dismiss (x) button for editable tag/filter
203
- chip lists (session tags, saved-search chips). Reuses the chip's own
204
- tone/size; the button itself stays neutral-at-rest, per the standing
205
- color-reserved-for-meaning convention, tinting only on hover/focus. */
206
140
  .chip.ds-chip-removable { padding-right: var(--space-1); }
207
141
  .ds-chip-remove-btn {
208
142
  display: inline-flex; align-items: center; justify-content: center;
@@ -218,8 +152,6 @@
218
152
  .ds-chip-remove-btn svg { width: 12px; height: 12px; }
219
153
  }
220
154
 
221
- /* ds-pill — plain neutral chip, distinct from the toned .ds-badge/.chip family
222
- (gmsniff's .pill: a bare rounded label with no semantic tone). */
223
155
  .ds-pill {
224
156
  display: inline-block;
225
157
  padding: 1px 7px;
@@ -237,16 +169,6 @@
237
169
  font-family: var(--ff-mono); font-size: var(--fs-tiny);
238
170
  opacity: 0.8;
239
171
  }
240
- /* Glyph() (src/components/shell/atoms.js) emits `glyph glyph-{size}` and an
241
- inline `font-size: var(--glyph-size-{size}, <literal>)`. The custom property
242
- is the documented theming hook — it is what lets a theme retune glyph scale
243
- without touching the component — but nothing declared it, so every glyph fell
244
- through to the hard-coded inline literal and the hook was inert. Declaring
245
- the three rungs on the scale makes the hook real; the sm/lg classes also give
246
- the box a matching footprint instead of the one-size 18px square. */
247
- /* Values mirror Glyph()'s own inline fallbacks exactly (11 / 13 / 16px), so
248
- declaring the hook changes nothing visually — it only makes the property
249
- themeable, which is what it always claimed to be. */
250
172
  .glyph { --glyph-size-sm: var(--fs-nano); --glyph-size-base: var(--fs-tiny); --glyph-size-lg: var(--fs-body); }
251
173
  .glyph-sm { width: 14px; height: 14px; }
252
174
  .glyph-lg { width: 22px; height: 22px; }
@@ -1,20 +1,8 @@
1
- // Public entry point for the flatspace-theme kit. Re-exports the shared
2
- // escaping + opt-in article-extraction utilities every known flatspace
3
- // theme.mjs (rs-codeinsight, rs-plugkit, gm) needs. Each site's own
4
- // page-composition logic (component layout, data contract) stays local to
5
- // its own site/theme.mjs -- that part legitimately differs per site (single-
6
- // page Hero/Features/Quickstart vs gm's multi-page article/landing split)
7
- // and is not force-unified here.
8
1
  export { escapeHtml, escapeJson, extractArticle, rewriteLegacyLinks } from './html-utils.js';
9
2
 
10
3
  import { createRequire } from 'node:module';
11
4
  const require = createRequire(import.meta.url);
12
5
  const { version } = require('../../../package.json');
13
6
 
14
- // Canonical unpkg URLs every theme.mjs's importmap/<link> points at, kept in
15
- // one place so a future SDK CDN path change is a single-file edit instead of
16
- // a 3-repo grep-and-replace. Pinned to the exact installed package version
17
- // (not @latest) so a consumer site's build serves what it actually built
18
- // against, immune to unpkg's alias-level cache TTL.
19
7
  export const SDK_CSS_URL = `https://unpkg.com/anentrypoint-design@${version}/dist/247420.css`;
20
8
  export const SDK_JS_URL = `https://unpkg.com/anentrypoint-design@${version}/dist/247420.js`;