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/dist/247420.css +24 -301
- package/dist/247420.js +24 -24
- package/package.json +1 -1
- package/src/css/app-shell/base.css +10 -127
- package/src/css/app-shell/primitives.css +0 -78
- package/src/kits/flatspace-theme/index.js +0 -12
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "anentrypoint-design",
|
|
3
|
-
"version": "0.0.
|
|
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(-
|
|
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
|
-
|
|
39
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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(--
|
|
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`;
|