anentrypoint-design 0.0.322 → 0.0.324

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.
Files changed (45) hide show
  1. package/README.md +22 -2
  2. package/app-shell.css +24 -4782
  3. package/colors_and_type.css +43 -0
  4. package/dist/247420.css +74 -3
  5. package/dist/247420.js +16 -16
  6. package/package.json +14 -8
  7. package/src/bootstrap.js +10 -1
  8. package/src/components/chat-message-parts.js +355 -0
  9. package/src/components/chat.js +23 -320
  10. package/src/components/data-density.js +15 -10
  11. package/src/components/files-modals.js +14 -2
  12. package/src/components/files.js +5 -1
  13. package/src/components/freddie/helpers.js +46 -8
  14. package/src/css/app-shell/base.css +157 -0
  15. package/src/css/app-shell/catalog-theme.css +144 -0
  16. package/src/css/app-shell/chat-basic.css +12 -0
  17. package/src/css/app-shell/chat-polish.css +459 -0
  18. package/src/css/app-shell/data-density.css +150 -0
  19. package/src/css/app-shell/files.css +709 -0
  20. package/src/css/app-shell/hero-content.css +407 -0
  21. package/src/css/app-shell/kits-appended.css +361 -0
  22. package/src/css/app-shell/loading-alerts.css +120 -0
  23. package/src/css/app-shell/panel-row.css +177 -0
  24. package/src/css/app-shell/primitives.css +197 -0
  25. package/src/css/app-shell/responsive.css +266 -0
  26. package/src/css/app-shell/responsive2-workspace.css +465 -0
  27. package/src/css/app-shell/row-print.css +75 -0
  28. package/src/css/app-shell/sidebar-misc.css +79 -0
  29. package/src/css/app-shell/states-interactions.css +696 -0
  30. package/src/css/app-shell/topbar.css +319 -0
  31. package/src/deck-stage.js +6 -4
  32. package/src/highlight.js +20 -4
  33. package/src/index.js +15 -5
  34. package/src/kits/os/freddie/pages-chat.js +1 -1
  35. package/src/kits/os/freddie/pages-core.js +1 -1
  36. package/src/kits/os/freddie/pages-os.js +1 -1
  37. package/src/kits/os/freddie/pages-tools.js +1 -1
  38. package/src/kits/os/wm.js +38 -0
  39. package/src/kits/slides/deck-stage-overlay.js +68 -0
  40. package/src/kits/slides/deck-stage-state.js +81 -0
  41. package/src/kits/slides/deck-stage-style.js +117 -0
  42. package/src/kits/slides/deck-stage.js +167 -0
  43. package/src/kits/slides/index.js +5 -0
  44. package/src/markdown.js +89 -11
  45. package/src/kits/os/freddie/helpers.js +0 -33
@@ -0,0 +1,407 @@
1
+ /* ============================================================
2
+ Hero
3
+ ============================================================ */
4
+ /* Signature hero — asymmetric editorial header. Title spans wide; the body +
5
+ actions sit offset in a narrower right column on desktop, stacked on mobile.
6
+ No centered stack. */
7
+ .ds-hero {
8
+ padding: var(--space-9) 0 var(--space-8);
9
+ display: grid; gap: var(--space-5) var(--space-5);
10
+ grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
11
+ grid-template-areas: 'title title' 'body aside';
12
+ align-items: start;
13
+ max-width: var(--measure-wide);
14
+ position: relative; isolation: isolate;
15
+ }
16
+ .ds-hero-head { grid-area: title; display: grid; gap: var(--space-3); }
17
+ .ds-hero-body { grid-area: body; }
18
+ /* The right column carries its own visual weight — a spined, halftone-
19
+ textured card holding the badge/stat cluster and the CTAs — so the
20
+ asymmetric grid reads as a deliberate composition, not leftover space
21
+ beside the narrow body copy. Stretches to the body column's height. */
22
+ .ds-hero-aside {
23
+ grid-area: aside; position: relative; isolation: isolate;
24
+ align-self: stretch; display: flex; flex-direction: column;
25
+ justify-content: space-between; gap: var(--space-5);
26
+ background: var(--bg-2);
27
+ border-radius: 0 var(--r-2) var(--r-2) 0;
28
+ padding: var(--space-5) var(--space-5) var(--space-5) calc(var(--space-4) + var(--bw-chunk));
29
+ }
30
+ .ds-hero-aside::before {
31
+ content: ''; position: absolute; left: 0; top: 0; bottom: 0;
32
+ width: var(--bw-chunk); background: var(--accent);
33
+ border-radius: var(--bw-chunk) 0 0 var(--bw-chunk);
34
+ }
35
+ .ds-hero-stats { display: flex; flex-direction: column; gap: var(--space-2); }
36
+ .ds-hero-stat {
37
+ font-family: var(--ff-mono); font-size: var(--fs-sm);
38
+ color: var(--fg-2); letter-spacing: var(--tr-tight);
39
+ padding-bottom: var(--space-2); border-bottom: var(--bw-hair) solid var(--bg-3);
40
+ }
41
+ .ds-hero-stat:last-child { border-bottom: 0; padding-bottom: 0; }
42
+ .ds-hero-title {
43
+ font-family: var(--ff-display); font-weight: 700;
44
+ font-size: clamp(40px, 9cqi, 116px);
45
+ line-height: 0.96; letter-spacing: var(--tr-tighter);
46
+ margin: 0; max-width: 16ch; text-wrap: balance;
47
+ }
48
+ .ds-hero-body {
49
+ font-family: var(--ff-body); font-size: var(--fs-xl);
50
+ line-height: 1.45; margin: 0; max-width: 46ch;
51
+ color: var(--fg-2);
52
+ }
53
+ /* The lead phrase in the title — printed in the electric lead, not glowing. */
54
+ .ds-hero-accent { color: var(--accent-ink); font-weight: 700; }
55
+ .ds-hero-actions {
56
+ display: flex; gap: var(--space-2, 10px); flex-wrap: wrap;
57
+ align-self: start; margin-top: var(--space-hair, 4px);
58
+ }
59
+ /* Container-queried (the whole shell is; a 500px pane on a wide viewport
60
+ would keep the two-column grid under a width @media). Left-aligned stack —
61
+ no centering — preserving the asymmetric intent. */
62
+ @container (max-width: 900px) {
63
+ .ds-hero {
64
+ grid-template-columns: minmax(0, 1fr);
65
+ grid-template-areas: 'title' 'body' 'aside';
66
+ align-items: start;
67
+ padding: var(--space-7) 0 var(--space-6);
68
+ }
69
+ .ds-hero-aside {
70
+ border-radius: var(--r-2); flex-direction: row; flex-wrap: wrap;
71
+ justify-content: flex-start; align-items: center;
72
+ }
73
+ .ds-hero-stats { flex-direction: row; flex-wrap: wrap; }
74
+ .ds-hero-stat { border-bottom: 0; padding-bottom: 0; }
75
+ }
76
+ .ds-chat-title { margin: 0; font-size: inherit; }
77
+
78
+ /* ============================================================
79
+ Section grouping
80
+ ============================================================ */
81
+ .ds-section { margin: var(--space-8) 0; }
82
+ /* Compact section (e.g. a PageHeader used as a page's first element): no large
83
+ leading margin, modest trailing margin — top-aligns without consumer overrides. */
84
+ .ds-section-compact { margin-top: 0; margin-bottom: var(--space-4); }
85
+ .ds-section > h3 {
86
+ font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-h3);
87
+ margin: 0 0 var(--space-5);
88
+ letter-spacing: -0.01em;
89
+ }
90
+
91
+ @media (max-width: 900px) {
92
+ .ds-section { margin: var(--space-4) 0; }
93
+ }
94
+
95
+ /* ============================================================
96
+ Print texture — the signature surface treatment. Opt-in overlay that
97
+ reads as risograph/newsprint grain, layered above the surface fill but
98
+ below content. Faint by default so type stays crisp; reduced-data and
99
+ reduced-motion are unaffected (texture is static).
100
+ ============================================================ */
101
+ .ds-grain { position: relative; isolation: isolate; }
102
+ .ds-grain::after {
103
+ content: ''; position: absolute; inset: 0; z-index: -1;
104
+ pointer-events: none;
105
+ background-image: var(--grain);
106
+ background-size: 160px 160px;
107
+ opacity: var(--grain-opacity);
108
+ mix-blend-mode: var(--grain-blend);
109
+ }
110
+ /* ============================================================
111
+ Marquee / ticker — brand kinetic device ("always open 24/7"). The track
112
+ holds two identical runs so the loop is seamless; reduced-motion freezes it
113
+ to a single static run. Editorial, not a decorative flourish.
114
+ ============================================================ */
115
+ .ds-marquee {
116
+ overflow: hidden; width: 100%;
117
+ border-block: var(--bw-rule) solid var(--fg);
118
+ padding: var(--space-2) 0;
119
+ font-family: var(--ff-display); font-weight: 600;
120
+ text-transform: uppercase; letter-spacing: var(--tr-caps);
121
+ }
122
+ .ds-marquee-track {
123
+ display: inline-flex; gap: var(--space-5);
124
+ white-space: nowrap; will-change: transform;
125
+ animation: ds-marquee-run 28s linear infinite;
126
+ }
127
+ .ds-marquee-item { display: inline-flex; align-items: center; gap: var(--space-5); }
128
+ .ds-marquee-sep { color: var(--accent-ink); }
129
+ .ds-marquee:hover .ds-marquee-track,
130
+ .ds-marquee:focus-within .ds-marquee-track,
131
+ .ds-marquee:active .ds-marquee-track { animation-play-state: paused; }
132
+ @keyframes ds-marquee-run {
133
+ from { transform: translateX(0); }
134
+ to { transform: translateX(-50%); }
135
+ }
136
+ /* Touch has no hover-pause; slow the ticker so it burns less attention. */
137
+ @media (hover: none), (pointer: coarse) {
138
+ .ds-marquee-track { animation-duration: 40s; }
139
+ }
140
+ @media (prefers-reduced-motion: reduce) {
141
+ /* Static: wrap to a readable strip instead of a frozen half-offscreen run. */
142
+ .ds-marquee-track { animation: none; flex-wrap: wrap; white-space: normal; }
143
+ .ds-marquee-run-b { display: none; }
144
+ }
145
+
146
+ /* ============================================================
147
+ Install — single CLI command card
148
+ ============================================================ */
149
+ .cli {
150
+ display: flex; align-items: center; gap: 14px;
151
+ overflow-x: auto;
152
+ padding: 20px 24px;
153
+ background: var(--ink); color: var(--paper);
154
+ border-radius: var(--r-3);
155
+ font-family: var(--ff-mono); font-size: var(--fs-lg);
156
+ }
157
+ .cli .prompt { color: var(--green-2); }
158
+ .cli .cmd { flex: 1; min-width: 0; overflow-x: auto; white-space: nowrap; color: var(--paper); }
159
+ .cli .copy {
160
+ padding: 8px 16px; background: transparent; color: var(--paper);
161
+ font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-caps);
162
+ cursor: pointer; box-shadow: inset 0 0 0 1px var(--rule-strong);
163
+ border-radius: var(--r-pill);
164
+ }
165
+ .cli .copy:hover { background: var(--fg-3); }
166
+
167
+ /* Multi-line CLI block: when .cli holds .ds-cli-row / .ds-cli-comment children
168
+ (quickstart scripts, multi-command snippets — see CliBlock in
169
+ src/components/content.js) it stacks as a column instead of the
170
+ single-line install row. */
171
+ .cli:has(.ds-cli-row),
172
+ .cli:has(.ds-cli-comment) {
173
+ flex-direction: column; align-items: stretch; gap: 0;
174
+ font-size: var(--fs-sm); line-height: 1.6;
175
+ }
176
+ .ds-cli-row {
177
+ display: flex; gap: 10px;
178
+ font-family: var(--ff-mono); font-size: 13px; line-height: 1.6;
179
+ padding: 3px 0;
180
+ }
181
+ .ds-cli-row .prompt { color: var(--green-2); flex: 0 0 auto; user-select: none; }
182
+ .ds-cli-row .cmd { flex: 1 1 auto; white-space: pre-wrap; word-break: break-word; color: var(--paper); }
183
+ .ds-cli-comment {
184
+ color: var(--fg-3);
185
+ font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.6;
186
+ padding: 3px 0; white-space: pre-wrap; word-break: break-word;
187
+ }
188
+
189
+ /* ============================================================
190
+ Receipt — key/value table
191
+ ============================================================ */
192
+ table.kv { width: 100%; border-collapse: collapse; }
193
+ table.kv td {
194
+ padding: 8px 0;
195
+ font-family: var(--ff-body); font-size: var(--fs-sm);
196
+ }
197
+ table.kv tr + tr td { border-top: 1px solid var(--rule); }
198
+ table.kv td:first-child {
199
+ color: var(--fg-3);
200
+ font-size: var(--fs-xs);
201
+ text-transform: uppercase; letter-spacing: var(--tr-caps);
202
+ width: 14ch;
203
+ }
204
+ table.kv td:last-child {
205
+ font-weight: 600;
206
+ overflow-wrap: anywhere; min-width: 0;
207
+ }
208
+ /* Tiny screens: stack the key over the value instead of squeezing a 14ch
209
+ label column beside long unbroken values (URLs, hashes). */
210
+ @media (max-width: 400px) {
211
+ table.kv td { display: block; width: auto; padding: 4px 0; }
212
+ table.kv td:first-child { padding-top: 8px; }
213
+ table.kv tr + tr td { border-top: 0; }
214
+ table.kv tr + tr td:first-child { border-top: 1px solid var(--rule); }
215
+ }
216
+
217
+ /* ============================================================
218
+ Generic table
219
+ ============================================================ */
220
+ table {
221
+ width: 100%; border-collapse: collapse;
222
+ font-family: var(--ff-body); font-size: var(--fs-sm);
223
+ /* A data grid, not a card: a tight --r-0 corner (was --r-3/22px, which read
224
+ as a rounded card). Cells drop to 8px 12px for a dense, scannable row
225
+ (was 12/14 x 16 => ~43px rows). Density scales the vertical padding. */
226
+ border-radius: var(--r-0); overflow: hidden;
227
+ }
228
+ table th {
229
+ text-align: left;
230
+ padding: calc(var(--space-2) * var(--density)) var(--space-2-75);
231
+ font-size: var(--fs-tiny); font-weight: 600;
232
+ color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-caps);
233
+ background: var(--bg-2);
234
+ }
235
+ table td { padding: calc(var(--space-2) * var(--density)) var(--space-2-75); border-top: 1px solid var(--rule); }
236
+ table tr.clickable { cursor: pointer; }
237
+ table tr.clickable:hover td { background: var(--bg-2); }
238
+ table tr.clickable:focus-visible {
239
+ outline: var(--focus-w) solid var(--focus-color);
240
+ outline-offset: -2px;
241
+ }
242
+ table tr.clickable:focus-visible td { background: var(--bg-2); }
243
+
244
+ /* Table() striped/compact opt-in density modifiers (webgeist g-table parity).
245
+ Scoped under .ds-table-wrap so they never leak onto an unrelated bare
246
+ <table> a consumer hand-rolls outside this component. */
247
+ .ds-table-wrap.is-striped table tr:nth-child(even) td { background: var(--bg-2); }
248
+ .ds-table-wrap.is-striped table tr.clickable:nth-child(even):hover td,
249
+ .ds-table-wrap.is-striped table tr.clickable:nth-child(even):focus-visible td { background: var(--bg-3, var(--bg-2)); }
250
+ .ds-table-wrap.is-compact table th { padding: var(--space-1-5, 5px) var(--space-2, 8px); }
251
+ .ds-table-wrap.is-compact table td { padding: var(--space-1-5, 5px) var(--space-2, 8px); }
252
+
253
+ /* ============================================================
254
+ Changelog
255
+ ============================================================ */
256
+ .ds-changelog-row {
257
+ grid-template-columns: minmax(110px, 14ch) minmax(60px, 9ch) minmax(0, 1fr) !important;
258
+ }
259
+ .ds-changelog-ver {
260
+ font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-sm);
261
+ }
262
+
263
+ /* ============================================================
264
+ Works
265
+ ============================================================ */
266
+ .work-detail {
267
+ padding: var(--space-4) var(--space-5) var(--space-5);
268
+ margin: 4px 0 var(--space-2);
269
+ background: var(--bg-2);
270
+ border-radius: var(--r-3);
271
+ display: flex; flex-direction: column; gap: var(--space-3);
272
+ }
273
+ .ds-work-body { margin: 0; max-width: 60ch; }
274
+ .ds-work-actions { display: flex; gap: 10px; flex-wrap: wrap; }
275
+
276
+ /* ============================================================
277
+ Manifesto / pull moment
278
+ ============================================================ */
279
+ .ds-manifesto { max-width: 60ch; }
280
+ .ds-manifesto-para {
281
+ font-family: var(--ff-body); font-size: var(--fs-lg);
282
+ line-height: var(--lh-long); margin: 0 0 var(--space-3);
283
+ }
284
+ .ds-manifesto-para.dim { color: var(--fg-3); }
285
+
286
+ /* ============================================================
287
+ Currently shipping dots
288
+ ============================================================ */
289
+ .ds-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: currentColor; flex-shrink: 0; vertical-align: middle; }
290
+ .ds-dot-on { color: var(--green-2); }
291
+ .ds-dot-off { color: var(--fg-3); }
292
+ .ds-dot-live { color: var(--green-2); }
293
+ .ds-dot-idle { color: var(--fg-3); }
294
+
295
+ /* ============================================================
296
+ KPI
297
+ ============================================================ */
298
+ .kpi {
299
+ display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
300
+ gap: var(--space-2);
301
+ }
302
+ .kpi-card {
303
+ /* Was --space-5 (32px) pad + --r-3 (22px) — four cards ate a full fold. A
304
+ 16px pad on a --r-1 corner keeps them prominent but dense; the number drops
305
+ from a 48px marketing display to a 32px app-scale figure. */
306
+ padding: var(--space-3);
307
+ background: var(--bg-2);
308
+ border-radius: var(--r-1);
309
+ }
310
+ .kpi-card .num {
311
+ font-family: var(--ff-body); font-weight: 600;
312
+ font-size: clamp(22px, 3cqi, 32px); line-height: 1;
313
+ letter-spacing: var(--tr-tight);
314
+ }
315
+ .kpi-card .lbl {
316
+ font-size: var(--fs-xs); color: var(--fg-3);
317
+ font-weight: 600; margin-top: 8px;
318
+ letter-spacing: var(--tr-caps); text-transform: uppercase;
319
+ }
320
+ .kpi-foot {
321
+ display: flex; align-items: center; justify-content: space-between;
322
+ margin-top: var(--space-2);
323
+ }
324
+ .kpi-delta {
325
+ display: inline-flex; align-items: center; gap: var(--space-hair);
326
+ font-size: var(--fs-xs); font-weight: 600;
327
+ }
328
+ .kpi-delta-up { color: var(--green); }
329
+ .kpi-delta-down { color: var(--danger); }
330
+ .ds-sparkline path { stroke: currentColor; }
331
+ .ds-sparkline-up { color: var(--success); }
332
+ .ds-sparkline-down { color: var(--danger); }
333
+
334
+ /* ============================================================
335
+ BarChart
336
+ ============================================================ */
337
+ .ds-barchart { display: flex; flex-direction: column; gap: var(--space-2); }
338
+ .ds-barchart-row {
339
+ display: grid; grid-template-columns: minmax(90px, 25%) 1fr auto;
340
+ align-items: center; gap: var(--space-2);
341
+ }
342
+ .ds-barchart-label { font-size: var(--fs-sm); color: var(--fg-2); }
343
+ .ds-barchart-track {
344
+ /* 6px unifies with the system's other bar tracks (.ds-upload-bar,
345
+ .ds-bar-bg); was --space-2 (8px), the lone thicker slab in the bar family. */
346
+ height: var(--space-1-75); border-radius: var(--r-pill);
347
+ background: var(--bg-3); overflow: hidden;
348
+ }
349
+ .ds-barchart-fill {
350
+ height: 100%; width: var(--bar-pct, 0%);
351
+ background: var(--fg-3); border-radius: var(--r-pill);
352
+ }
353
+ .ds-barchart-fill.is-active { background: var(--accent); }
354
+ .ds-barchart-value {
355
+ font-size: var(--fs-xs); font-weight: 600; color: var(--fg-3);
356
+ font-variant-numeric: tabular-nums;
357
+ }
358
+
359
+ /* ============================================================
360
+ Empty state
361
+ ============================================================ */
362
+ .empty {
363
+ /* Was --space-8 (96px) — an empty list spent 192px of vertical space on
364
+ nothing. --space-6 (48px) still centres a message with air, without the
365
+ empty state dominating the fold. Mobile drops it further (below). */
366
+ padding: var(--space-6);
367
+ text-align: center;
368
+ color: var(--fg-3);
369
+ background: var(--bg-2);
370
+ border-radius: var(--r-1);
371
+ font-size: var(--fs-sm);
372
+ }
373
+
374
+ /* ============================================================
375
+ Form
376
+ ============================================================ */
377
+ .row-form {
378
+ display: grid; gap: 12px;
379
+ padding: var(--space-5);
380
+ background: var(--bg-2);
381
+ border-radius: var(--r-3);
382
+ }
383
+ .row-form input,
384
+ .row-form textarea {
385
+ font-family: inherit; font-size: var(--fs-sm);
386
+ padding: 12px 16px;
387
+ background: var(--bg); color: var(--fg);
388
+ border: 0; border-radius: var(--r-2);
389
+ box-shadow: inset 0 0 0 1px var(--rule);
390
+ }
391
+ .row-form input:focus-visible,
392
+ .row-form textarea:focus-visible { box-shadow: var(--focus-ring-inset); }
393
+
394
+ /* Field char counter (TextField maxLength) */
395
+ .ds-field-count {
396
+ font-size: var(--fs-tiny, 13px);
397
+ color: var(--fg-3, var(--fg-2));
398
+ text-align: right;
399
+ }
400
+
401
+ /* Multi-column form layout (Form columns prop) */
402
+ .row-form[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
403
+ .row-form[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
404
+ @media (max-width: 600px) {
405
+ .row-form[data-columns="2"],
406
+ .row-form[data-columns="3"] { grid-template-columns: 1fr; }
407
+ }