anentrypoint-design 0.0.388 → 0.0.390

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/README.md CHANGED
@@ -6,7 +6,7 @@ filename `dist/247420.js`/`dist/247420.css` and in a few package.json fields;
6
6
  the published npm package name is `anentrypoint-design`. Both names refer to
7
7
  the same single system.)
8
8
 
9
- friendly rounded sans body, monospace only on real code, tonal surfaces over borders, indicator rails for color-coded separation, generous negative space, terminal-flavoured rhythm.
9
+ Acid Editorial: one electric lime lead on near-black ink or warm newsprint paper, system-font stack (no web-font request), monospace only on real code, tonal surfaces over borders, indicator rails for color-coded separation, asymmetric grid tension, print texture over glow.
10
10
 
11
11
  we fart in its general direction.
12
12
 
@@ -58,7 +58,7 @@ mount(document.getElementById('app'), () => C.AppShell({
58
58
  - **chat** — `Chat`, `ChatMessage`, `ChatComposer`, `AICat`, `AICatPortrait`
59
59
  - **multi-agent chat shell** — `WorkspaceShell`, `WorkspaceRail`, `ConversationList`, `AgentChat`, `SessionDashboard` — the flagship desktop-class chat-agent product surface (persistent rail + resizable columns + full turn/tool-call thread + live multi-session dashboard). See `COMPONENT_API.md` for the full prop contract; a runnable mock-data demo lives at `ui_kits/workspace/`; the canonical real-world wiring ships at [`agentgui`](https://github.com/AnEntrypoint/agentgui).
60
60
  - **file browser** — `FileRow`, `FileGrid`, `FileToolbar`, `FileIcon`, `DropZone`, `UploadProgress`, `EmptyState`, `BreadcrumbPath`, plus modal pieces `FileViewer`, `FilePreviewMedia`, `FilePreviewCode`, `FilePreviewText`, `ConfirmDialog`, `PromptDialog`
61
- - **ui_kits** — `homepage`, `project_page`, `docs`, `blog`, `chat`, `aicat`, `file_browser`. Each is a fully-working buildless example loading the SDK from this repo.
61
+ - **ui_kits** — 21 fully-working buildless examples loading the SDK from this repo: `homepage`, `project_page`, `docs`, `blog`, `chat`, `aicat`, `file_browser`, `dashboard`, `settings`, `search`, `terminal`, `gm_inspector`, `workspace`, `community`, `community-app`, `gallery`, `signin`, `error_404`, `slide_deck`, `system_primer`, plus `_template`. Each kit's stylesheet `<link>` set is declared in `ui_kits/kits.config.mjs` and emitted by the scaffold generator (`npm run generate:ui-kits`) — never hand-edit a kit's generated `index.html`; `npm run lint:ui-kits` checks them against generated output.
62
62
 
63
63
  The file-browser surface (rails by file type, drop-zone upload, modal preview) ships its canonical real-world wiring at [`fsbrowse`](https://github.com/AnEntrypoint/fsbrowse) — Express + busboy backend, the SDK frontend.
64
64
 
@@ -162,7 +162,7 @@ Pages: `Hero`, `WorksList`, `WritingList`, `Manifesto`, `HomeView`, `ProjectView
162
162
  Chat: `Chat`, `ChatMessage`, `ChatComposer`, `AICat`, `AICatPortrait`. Helpers: `renderInline`, `fmtBytes`.
163
163
  Files: `FileIcon`, `FileRow`, `FileGrid`, `FileToolbar`, `DropZone`, `UploadProgress`, `EmptyState`, `BreadcrumbPath`, `FileViewer` (+ `ConfirmDialog` / `PromptDialog` / `FilePreviewMedia` / `FilePreviewCode` / `FilePreviewText`). Helpers: `fileGlyph`, `fmtFileSize`.
164
164
 
165
- All factories are pure: props in, WebJSX tree out. Component source is split per group under `src/components/<shell|content|chat>.js`; `src/components.js` is a re-export barrel. The 200-line cap applies per module.
165
+ All factories are pure: props in, WebJSX tree out. Component source is split per group under `src/components/<group>.js`; `src/components.js` is a re-export barrel. A group that outgrows the 200-line-per-module cap becomes a thin barrel of its own over single-responsibility submodules in a sibling directory of the same name (`src/components/editor-primitives.js` over `src/components/editor-primitives/*.js`) — the public export surface never moves, so no consumer import changes. `COMPONENT_API.md` and `docs/component-props.md` (regenerate with `npm run docs:components`) are the generated prop reference.
166
166
 
167
167
  ## chat stack layering
168
168
 
@@ -245,7 +245,15 @@ The system runs entirely on CSS custom properties under `.ds-247420`. To rebrand
245
245
  </div>
246
246
  ```
247
247
 
248
- The full token list lives in `colors_and_type.css`. The voice rules and the storytelling pass live in `SKILL.md`.
248
+ The full token list lives in `colors_and_type.css`; `THEME.md` documents the taxonomy and the `data-theme`/`data-accent`/`data-density`/`data-typescale` attribute contract. The voice rules and the storytelling pass live in `SKILL.md`.
249
+
250
+ Layout primitives worth knowing: `.ds-app-surface` is the Operate-mode page root that switches a kit onto the app typescale (without it, page titles render at the marketing display ceiling), and `.ds-panel-trio` / `.ds-panel-duo` / `.ds-panel-flush` are panel-row grids that step down on container width.
251
+
252
+ ## lint gates
253
+
254
+ `npm run lint` runs 13 gates over 30 component sheets. Four are hard zero-tolerance — no raw color literal (`lint-tokens`), no raw `border-radius` (`lint-radius`), no raw `z-index` (`lint-zindex`), no `transition: all` (`lint-transition-all`). Three are ratchets frozen against a baseline file that may only move down — `lint-spacing`, `lint-fontsize`, `lint-important`. The rest guard decorative glyphs, unfiltered conditional children, class prefixes, inline layout styles and duplicated selectors.
255
+
256
+ The scanned set is computed, not listed: `COMPONENT_SHEETS` in `scripts/lint-tokens.mjs` names entry points and `expandSheets()` resolves each one's `@import` graph transitively, because the root `app-shell.css` is a barrel with no declarations of its own. A companion guard requires every `.css` file under `src/css/app-shell/` to appear in that expanded set, so a split sheet cannot be bundled into `dist/247420.css` while remaining invisible to both the linters and any consumer that `<link>`s `app-shell.css` directly.
249
257
 
250
258
  ## why scope-prefixed
251
259
 
package/chat.css CHANGED
@@ -428,8 +428,15 @@
428
428
  would otherwise share a hue. Mirrors the rail-tone shape differentiation. */
429
429
  /* One canonical stale tone (disc + word + rail share it) — a muted grey-warn,
430
430
  deliberately desaturated so it is NOT the saturated --amber used by
431
- connecting/connecting-stream (which would re-collide hues). */
432
- :root { --stale: color-mix(in oklab, var(--warn) 70%, var(--fg-3)); }
431
+ connecting/connecting-stream (which would re-collide hues).
432
+
433
+ The mix is grey-dominant, NOT warn-dominant: at 70% --warn this measured
434
+ 1.09:1 against --bg in dark theme (and 1.28:1 on a panel) as the `idle` word
435
+ in .ds-dash-status and .seg.is-idle — text that is present but effectively
436
+ unreadable. --fg-3 is the tier-3 TEXT tone and already carries a legible
437
+ contrast, so leading with it keeps the warn hue as a tint while restoring
438
+ readability. Measured after the change in a live browser. */
439
+ :root { --stale: color-mix(in oklab, var(--fg-3) 78%, var(--warn)); }
433
440
  /* Live: a persistent faint concentric ring (resting shape channel, independent
434
441
  of motion) with the pulse layered on top — so even at the pulse trough the
435
442
  disc reads as solid-fill + ring, never a bare solid that aliases stale. */
@@ -595,7 +602,11 @@
595
602
  .ds-dash-header .btn-primary.danger:hover {
596
603
  background: color-mix(in oklab, var(--warn) 12%, transparent); color: var(--warn);
597
604
  }
598
- .ds-dash-header .btn-primary.danger.is-armed { background: var(--warn); color: var(--paper); border-color: var(--warn); }
605
+ /* --ink, not --paper, on the armed fill: --warn (#FF5A52) is a light-ish red,
606
+ so paper-on-warn measures 2.72:1 (below the 4.5:1 floor) while ink-on-warn
607
+ measures 6.27:1. This is the same --accent/--accent-ink split the token layer
608
+ documents -- a saturated fill needs the dark text tone, not the light one. */
609
+ .ds-dash-header .btn-primary.danger.is-armed { background: var(--warn); color: var(--ink); border-color: var(--warn); }
599
610
  .ds-dash-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: var(--space-2); padding: var(--space-3); }
600
611
  @media (min-width: 1500px) { .ds-dash-grid { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); } }
601
612
  .ds-dash-card { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-2); }
@@ -422,6 +422,17 @@ select:focus-visible {
422
422
  (#E0241A / #3A6EFF) are too dark on ink; these clear AA 4.5:1 on --ink. */
423
423
  --warn: #FF5A52;
424
424
  --sky: #6E9BFF;
425
+ /* Category/heritage dark-tuned pairs (same convention as flame/amber/warn/
426
+ sky above): the :root values are the PAPER tones and go dark-on-dark here.
427
+ Measured on --ink (#0E0E12) / --bg-2 (#1F1F26): mascot-deep #B81F63 was
428
+ 3.13:1 / 2.66:1, purple-2 #7F18A4 2.36:1 / 2.00:1, green #247420 3.30:1 /
429
+ 2.80:1 — all failing AA for the text roles they carry (aicat/community
430
+ author names, kpi deltas, stamps, rails). The replacements clear 4.5:1 on
431
+ BOTH ink surfaces: #FF5C9E 6.67/5.67, #C277FF 6.77/5.75, #5CBF52 8.28/7.04.
432
+ These are text-tone retunes only — the paper values are untouched. */
433
+ --mascot-deep: #FF5C9E;
434
+ --purple-2: #C277FF;
435
+ --green: #5CBF52;
425
436
  --code-string: var(--green-2);
426
437
  --code-keyword: var(--sky);
427
438
  --code-fn: var(--flame);
@@ -470,6 +481,11 @@ select:focus-visible {
470
481
  --amber: #D9A93A;
471
482
  --warn: #FF5A52;
472
483
  --sky: #6E9BFF;
484
+ /* Mirrors the [data-theme="ink"] category retune above token-for-token —
485
+ see that block for the measured before/after ratios. */
486
+ --mascot-deep: #FF5C9E;
487
+ --purple-2: #C277FF;
488
+ --green: #5CBF52;
473
489
  --code-string: var(--green-2);
474
490
  --code-keyword: var(--sky);
475
491
  --code-fn: var(--flame);
package/dist/247420.css CHANGED
@@ -424,6 +424,17 @@
424
424
  (#E0241A / #3A6EFF) are too dark on ink; these clear AA 4.5:1 on --ink. */
425
425
  --warn: #FF5A52;
426
426
  --sky: #6E9BFF;
427
+ /* Category/heritage dark-tuned pairs (same convention as flame/amber/warn/
428
+ sky above): the :root values are the PAPER tones and go dark-on-dark here.
429
+ Measured on --ink (#0E0E12) / --bg-2 (#1F1F26): mascot-deep #B81F63 was
430
+ 3.13:1 / 2.66:1, purple-2 #7F18A4 2.36:1 / 2.00:1, green #247420 3.30:1 /
431
+ 2.80:1 — all failing AA for the text roles they carry (aicat/community
432
+ author names, kpi deltas, stamps, rails). The replacements clear 4.5:1 on
433
+ BOTH ink surfaces: #FF5C9E 6.67/5.67, #C277FF 6.77/5.75, #5CBF52 8.28/7.04.
434
+ These are text-tone retunes only — the paper values are untouched. */
435
+ --mascot-deep: #FF5C9E;
436
+ --purple-2: #C277FF;
437
+ --green: #5CBF52;
427
438
  --code-string: var(--green-2);
428
439
  --code-keyword: var(--sky);
429
440
  --code-fn: var(--flame);
@@ -472,6 +483,11 @@
472
483
  --amber: #D9A93A;
473
484
  --warn: #FF5A52;
474
485
  --sky: #6E9BFF;
486
+ /* Mirrors the [data-theme="ink"] category retune above token-for-token —
487
+ see that block for the measured before/after ratios. */
488
+ --mascot-deep: #FF5C9E;
489
+ --purple-2: #C277FF;
490
+ --green: #5CBF52;
475
491
  --code-string: var(--green-2);
476
492
  --code-keyword: var(--sky);
477
493
  --code-fn: var(--flame);
@@ -3762,10 +3778,19 @@
3762
3778
  display: inline-flex; align-items: center; justify-content: center;
3763
3779
  background: color-mix(in oklab, var(--mascot) 22%, var(--bg-2));
3764
3780
  border-radius: 50%; flex-shrink: 0;
3781
+ /* Cancels the global `pre { overflow-x: auto }`. This is a fixed 32px
3782
+ decorative chip, so the art overflowing its own box made it an
3783
+ unreachable keyboard scroll container (WCAG scrollable-region-focusable)
3784
+ rather than something a user could ever usefully scroll. */
3785
+ overflow: hidden;
3765
3786
  }
3766
3787
  .ds-247420 .aicat-meta { display: flex; flex-direction: column; font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
3788
+ /* --mascot-deep is now theme-tuned at the token layer (paper #B81F63 /
3789
+ ink #FF5C9E), so this needs no per-theme override. The previous
3790
+ [data-theme="dark"],[data-theme="ink"] override missed data-theme="auto"
3791
+ under OS-dark, which is how the kits actually render — the author name
3792
+ fell back to the paper tone at 3.13:1 on ink. */
3767
3793
  .ds-247420 .aicat-meta .name { color: var(--mascot-deep, var(--mascot)); font-weight: 600; }
3768
- .ds-247420[data-theme="dark"] .aicat-meta .name, .ds-247420[data-theme="ink"] .aicat-meta .name { color: var(--mascot); }
3769
3794
 
3770
3795
  /* ============================================================
3771
3796
  Sidebar polish: hide zero-count badges; tonal active state;
@@ -8781,8 +8806,15 @@
8781
8806
  would otherwise share a hue. Mirrors the rail-tone shape differentiation. */
8782
8807
  /* One canonical stale tone (disc + word + rail share it) — a muted grey-warn,
8783
8808
  deliberately desaturated so it is NOT the saturated --amber used by
8784
- connecting/connecting-stream (which would re-collide hues). */
8785
- .ds-247420 { --stale: color-mix(in oklab, var(--warn) 70%, var(--fg-3)); }
8809
+ connecting/connecting-stream (which would re-collide hues).
8810
+
8811
+ The mix is grey-dominant, NOT warn-dominant: at 70% --warn this measured
8812
+ 1.09:1 against --bg in dark theme (and 1.28:1 on a panel) as the `idle` word
8813
+ in .ds-dash-status and .seg.is-idle — text that is present but effectively
8814
+ unreadable. --fg-3 is the tier-3 TEXT tone and already carries a legible
8815
+ contrast, so leading with it keeps the warn hue as a tint while restoring
8816
+ readability. Measured after the change in a live browser. */
8817
+ .ds-247420 { --stale: color-mix(in oklab, var(--fg-3) 78%, var(--warn)); }
8786
8818
  /* Live: a persistent faint concentric ring (resting shape channel, independent
8787
8819
  of motion) with the pulse layered on top — so even at the pulse trough the
8788
8820
  disc reads as solid-fill + ring, never a bare solid that aliases stale. */
@@ -8948,7 +8980,11 @@
8948
8980
  .ds-247420 .ds-dash-header .btn-primary.danger:hover {
8949
8981
  background: color-mix(in oklab, var(--warn) 12%, transparent); color: var(--warn);
8950
8982
  }
8951
- .ds-247420 .ds-dash-header .btn-primary.danger.is-armed { background: var(--warn); color: var(--paper); border-color: var(--warn); }
8983
+ /* --ink, not --paper, on the armed fill: --warn (#FF5A52) is a light-ish red,
8984
+ so paper-on-warn measures 2.72:1 (below the 4.5:1 floor) while ink-on-warn
8985
+ measures 6.27:1. This is the same --accent/--accent-ink split the token layer
8986
+ documents -- a saturated fill needs the dark text tone, not the light one. */
8987
+ .ds-247420 .ds-dash-header .btn-primary.danger.is-armed { background: var(--warn); color: var(--ink); border-color: var(--warn); }
8952
8988
  .ds-247420 .ds-dash-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: var(--space-2); padding: var(--space-3); }
8953
8989
  @media (min-width: 1500px) { .ds-247420 .ds-dash-grid { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); } }
8954
8990
  .ds-247420 .ds-dash-card { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-3); background: var(--bg-2); border: var(--bw-hair) solid var(--bg-3); border-radius: var(--r-2); }