anentrypoint-design 0.0.463 → 0.0.465

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 CHANGED
@@ -959,7 +959,12 @@
959
959
  .ds-247420 .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; }
960
960
 
961
961
  .ds-247420 .t-display { font-family: var(--ff-display); font-weight: 600; letter-spacing: var(--tr-tight); }
962
- .ds-247420 .t-mono { font-family: var(--ff-mono); }
962
+ /* Explicit weight, not relying on inherited normal: --ff-mono's stack (Menlo,
963
+ Consolas, ui-monospace) can resolve to a variable-font fallback on some
964
+ platforms whose default instance isn't the 400 weight, rendering "body ·
965
+ 16px regular" visibly bold despite its own label -- pin the weight so the
966
+ sample matches what it claims regardless of which font in the stack loads. */
967
+ .ds-247420 .t-mono { font-family: var(--ff-mono); font-weight: 400; }
963
968
  .ds-247420 .t-body { font-family: var(--ff-body); }
964
969
 
965
970
  /* House small-label voice, in two sizes. Every declaration here is sourced
@@ -990,6 +995,28 @@
990
995
  margin-top: var(--space-2);
991
996
  }
992
997
 
998
+ /* A lede immediately followed by the article body is a named pairing too --
999
+ same rationale as the heading+lede gap above. Without this, .lede's
1000
+ margin:0 leaves zero space above the first paragraph while every
1001
+ paragraph-to-paragraph gap below it uses --space-4 (.ds-prose p), so the
1002
+ dek reads as glued to the body it introduces. */
1003
+ .ds-247420 .lede + .post-body, .ds-247420 .t-lede + .post-body, .ds-247420 .lede + .ds-prose, .ds-247420 .t-lede + .ds-prose {
1004
+ margin-top: var(--space-4);
1005
+ }
1006
+
1007
+ /* Same gap-ownership problem again for .ds-section (hero-content.css):
1008
+ `* + .ds-section { margin-top: 0 }` deliberately relies on the PRECEDING
1009
+ sibling supplying the lead-in space, so two spacing primitives can
1010
+ coordinate into one gap instead of stacking. .lede supplies none (margin:0
1011
+ by design), so a lede-then-section pairing (e.g. project_page's h1 -> lede
1012
+ -> "install" section) collapses to a flush 0px gap instead of inheriting
1013
+ .ds-section's own --space-8 lead. Measured live on project_page: the
1014
+ "install" h3 sat ~4px from the lede above it (padding only) vs the
1015
+ intended --space-8/2 gap other section-adjacent siblings get. */
1016
+ .ds-247420 .lede + .ds-section, .ds-247420 .t-lede + .ds-section {
1017
+ margin-top: var(--space-8);
1018
+ }
1019
+
993
1020
  .ds-247420 .eyebrow {
994
1021
  font-family: var(--ff-mono);
995
1022
  font-size: var(--fs-tiny);
@@ -1255,7 +1282,20 @@
1255
1282
  `minmax(0, 1fr)` — a real height the sidebar can overflow once bins +
1256
1283
  labels + more exceed it. Without this the extra rows were silently chopped
1257
1284
  at the viewport edge with no way to reach them. */
1258
- .ds-247420 .app-side-shell { background: var(--bg); overflow-y: auto; min-height: 0; }
1285
+ /* .app-side-shell and .app-main (below) are two INDEPENDENT scroll regions
1286
+ side by side -- correct by design (a sidebar nav and a main panel each own
1287
+ their own overflow), but with default invisible/overlay OS scrollbars a
1288
+ user hovering the boundary has no visual cue which region the wheel will
1289
+ scroll, or that there even are two scrollable zones rather than one page
1290
+ scroll. Thin always-visible scrollbar tracks make each region's own scroll
1291
+ ownership legible without changing the (correct) two-region architecture. */
1292
+ .ds-247420 .app-side-shell {
1293
+ background: var(--bg); overflow-y: auto; min-height: 0;
1294
+ scrollbar-width: thin; scrollbar-color: var(--rule-strong) transparent;
1295
+ }
1296
+ .ds-247420 .app-side-shell::-webkit-scrollbar { width: 8px; }
1297
+ .ds-247420 .app-side-shell::-webkit-scrollbar-thumb { background: var(--rule-strong); border-radius: var(--r-pill, 999px); }
1298
+ .ds-247420 .app-side-shell::-webkit-scrollbar-track { background: transparent; }
1259
1299
  .ds-247420 .app-body { display: grid; grid-template-columns: var(--sidebar-width) minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); align-items: stretch; align-content: stretch; flex: 1; min-height: 0; }
1260
1300
  .ds-247420 .app-body.no-side { grid-template-columns: minmax(0, 1fr); }
1261
1301
  /* When there is no sidebar, the empty side-shell must not occupy a grid row,
@@ -1363,6 +1403,15 @@
1363
1403
  /* Reserve the scrollbar track so routes with/without overflow don't shift
1364
1404
  the layout horizontally when the bar appears. */
1365
1405
  .ds-247420 .app-main { scrollbar-gutter: stable; }
1406
+ /* Same visible-scroll-ownership rationale as .app-side-shell above -- makes
1407
+ this the visually distinct SECOND independent scroll region rather than
1408
+ an invisible-scrollbar mystery next to the sidebar. */
1409
+ .ds-247420 .app-main {
1410
+ scrollbar-width: thin; scrollbar-color: var(--rule-strong) transparent;
1411
+ }
1412
+ .ds-247420 .app-main::-webkit-scrollbar { width: 8px; }
1413
+ .ds-247420 .app-main::-webkit-scrollbar-thumb { background: var(--rule-strong); border-radius: var(--r-pill, 999px); }
1414
+ .ds-247420 .app-main::-webkit-scrollbar-track { background: transparent; }
1366
1415
  /* Jump-target anchors clear the inner-scroll top edge (no chrome overlap,
1367
1416
  but a little breathing room when deep-linked within .app-main). */
1368
1417
  .ds-247420 .app-main [id] { scroll-margin-top: var(--space-4); }
@@ -1453,7 +1502,18 @@
1453
1502
  color: var(--fg-3);
1454
1503
  }
1455
1504
  .ds-247420 .dateline span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
1456
- .ds-247420 .dateline .spread { flex: 1 1 auto; min-width: var(--space-3); }
1505
+ /* The spreader itself only ever set flex-basis -- an empty div with no
1506
+ background renders as blank space, not the "dotted spreader" the preview
1507
+ page's own caption describes. border-bottom (not background-image) keeps
1508
+ the dots crisp at 1px without a repeating-gradient banding artifact. */
1509
+ .ds-247420 .dateline .spread {
1510
+ flex: 1 1 auto; min-width: var(--space-3); align-self: stretch;
1511
+ display: flex; align-items: center;
1512
+ }
1513
+ .ds-247420 .dateline .spread::after {
1514
+ content: ''; flex: 1 1 auto;
1515
+ border-bottom: var(--bw-hair, 1px) dotted var(--rule-strong);
1516
+ }
1457
1517
 
1458
1518
  /* ============================================================
1459
1519
  Primitives
@@ -1487,13 +1547,19 @@
1487
1547
  }
1488
1548
  .ds-247420 .btn { background: var(--bg-2); color: var(--fg); border-color: var(--rule); }
1489
1549
  .ds-247420 .btn:hover { background: var(--bg-3); color: var(--fg); transform: translateY(-1px); box-shadow: var(--shadow-1); }
1490
- /* Primary CTA — the electric lead as a solid editorial block; hover inverts to
1491
- an ink block with the lead as text, a confident two-tone flip. */
1550
+ /* Primary CTA — the brand green as a solid editorial block; hover inverts to
1551
+ an ink block with green text, a confident two-tone flip. Uses --green
1552
+ (the site's own #247420 identity color, dark-mode-retuned to --green's
1553
+ ink-safe #5CBF52 rather than --accent/--acid, which a prior contrast-driven
1554
+ restyle deliberately flattened to a neutral gray for --accent's OTHER
1555
+ consumers (nav active state, focus rings, etc) -- .btn-primary needed the
1556
+ brand color back for click-hierarchy without undoing that restyle
1557
+ elsewhere. --on-color (#fff) clears AA on both light and dark --green. */
1492
1558
  .ds-247420 .btn-primary {
1493
- background: var(--accent); color: var(--accent-fg);
1559
+ background: var(--green); color: var(--on-color);
1494
1560
  font-weight: 700;
1495
1561
  }
1496
- .ds-247420 .btn-primary:hover { background: var(--fg); color: var(--accent-ink); transform: translateY(-1px); box-shadow: var(--shadow-2); }
1562
+ .ds-247420 .btn-primary:hover { background: var(--fg); color: var(--green); transform: translateY(-1px); box-shadow: var(--shadow-2); }
1497
1563
  .ds-247420 .btn-ghost { background: transparent; color: var(--fg); box-shadow: inset 0 0 0 2px var(--fg); }
1498
1564
  .ds-247420 .btn-ghost:hover { background: var(--fg); color: var(--bg); transform: translateY(-1px); }
1499
1565
  .ds-247420 .btn:active, .ds-247420 .btn-primary:active, .ds-247420 .btn-ghost:active { transform: translateY(1px); box-shadow: none; }
@@ -2059,7 +2125,12 @@
2059
2125
  still fits a narrow column, and a 116px ceiling between the two tiers.
2060
2126
  Snapping to either changes the hero's whole optical weight. */
2061
2127
  font-size: clamp(40px, 9cqi, 116px);
2062
- line-height: 0.96; letter-spacing: var(--tr-tighter);
2128
+ /* 0.96 let ascenders/descenders visibly touch between wrapped lines at the
2129
+ upper end of this clamp (measured on "the creative department of the
2130
+ internet" at the 116px ceiling) -- 1.02 keeps the tight, no-air display
2131
+ feel this title wants while clearing enough vertical room that letters
2132
+ stop colliding. */
2133
+ line-height: 1.02; letter-spacing: var(--tr-tighter);
2063
2134
  margin: 0; max-width: 20ch; text-wrap: balance;
2064
2135
  }
2065
2136
  .ds-247420 .ds-hero-body {
@@ -2282,13 +2353,27 @@
2282
2353
  (was 12/14 x 16 => ~43px rows). Density scales the vertical padding. */
2283
2354
  border-radius: var(--r-0); overflow: hidden;
2284
2355
  }
2356
+ /* Panel heads / KPI labels / table headers were all identical uppercase-
2357
+ tracked-mono weight (600), so a page with several of these side by side
2358
+ (a dashboard) reads as one flat volume with no anchor -- the most
2359
+ repetitive, least-singular label (a column header, one of many per
2360
+ table) drops to a lighter 500 with slightly tighter tracking, keeping the
2361
+ system's uppercase-mono voice but giving panel titles (still 600) a real
2362
+ step up as the "read this first" tier. */
2285
2363
  .ds-247420 table th {
2286
2364
  text-align: left;
2287
2365
  padding: calc(var(--space-2) * var(--density)) var(--space-2-75);
2288
- font-size: var(--fs-tiny); font-weight: 600;
2289
- color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-caps);
2366
+ font-size: var(--fs-tiny); font-weight: 500;
2367
+ color: var(--fg-3); text-transform: uppercase; letter-spacing: calc(var(--tr-caps) * 0.7);
2290
2368
  background: var(--bg-2);
2291
2369
  }
2370
+ /* letter-spacing adds trailing space AFTER the last glyph too, but the table's
2371
+ own border-radius+overflow:hidden (above) clips flush to the card edge --
2372
+ the last header's positive tracking bleeds past its own padding box and
2373
+ gets cropped mid-word ("STATUS" -> "STATI"). Absorb that bleed with a bit
2374
+ of extra right padding on the last column only, so no header text sits
2375
+ closer to the clip edge than --tr-caps can push it. */
2376
+ .ds-247420 table th:last-child { padding-right: calc(var(--space-2-75) + var(--tr-caps, 0px)); }
2292
2377
  .ds-247420 table td { padding: calc(var(--space-2) * var(--density)) var(--space-2-75); border-top: 1px solid var(--rule); }
2293
2378
  .ds-247420 table tr.clickable { cursor: pointer; }
2294
2379
  .ds-247420 table tr.clickable:hover td { background: var(--bg-2); }
@@ -2895,7 +2980,12 @@
2895
2980
  border-color: var(--rule);
2896
2981
  }
2897
2982
  .ds-247420 .ds-file-row:active { transform: translateY(1px); }
2898
- .ds-247420 .ds-file-row.active { background: var(--accent-tint); border-color: var(--accent); }
2983
+ /* file-grid's own header/caption both claim NEVER A BORDER -- border-color
2984
+ here silently broke that promise for exactly the row it's meant to call
2985
+ out (the row a screenshot/manual test would actually look at). Selected
2986
+ state stays legible via the tint alone; border-color stays transparent so
2987
+ the base rule's promise holds for every row, active or not. */
2988
+ .ds-247420 .ds-file-row.active { background: var(--accent-tint); }
2899
2989
  .ds-247420 .ds-file-row[data-file-type="dir"] { border-left-width: 3px; border-left-color: var(--accent); }
2900
2990
  .ds-247420 .ds-file-row[data-file-type="image"],
2901
2991
  .ds-247420 .ds-file-row[data-file-type="video"],
@@ -3230,9 +3320,14 @@
3230
3320
  }
3231
3321
  .ds-247420 .ds-error-banner:hover { background: color-mix(in oklab, var(--warn) 20%, var(--bg)); }
3232
3322
 
3233
- /* Dropzone */
3323
+ /* Dropzone — a tonal target, not a dashed-border affordance (preview/
3324
+ dropzone.html's own header/caption both describe this: "NO DASHED
3325
+ BORDERS" / "tonal panel that swaps to --panel-select on dragover"). A
3326
+ solid hairline plus the idle->dragover background swap is the actual
3327
+ design; dashed was this system's OTHER "drop target" vocabulary
3328
+ (.panel-docs, kits-appended.css) leaking in here by copy-paste. */
3234
3329
  .ds-247420 .ds-dropzone {
3235
- border: var(--bw-rule) dashed var(--rule);
3330
+ border: var(--bw-rule) solid var(--rule);
3236
3331
  border-radius: var(--r-3); background: var(--bg);
3237
3332
  transition: border-color var(--dur-base) var(--ease), background var(--dur-base) var(--ease);
3238
3333
  }
@@ -4333,8 +4428,14 @@
4333
4428
  :disabled pseudo-class, so a disabled link-styled button relies entirely
4334
4429
  on this class selector for its visual treatment (aria-disabled + tabindex
4335
4430
  are set in JS; this is the paired CSS half). */
4431
+ /* opacity:0.6 alone barely separated from an active .btn-primary against a
4432
+ busy background -- close enough in dark mode that users clicked disabled
4433
+ buttons expecting them to work. grayscale flattens any color signal (no
4434
+ more "still looks clickable-green") and the steeper opacity drop reads as
4435
+ unmistakably inert at a glance, not just slightly dimmed. */
4336
4436
  .ds-247420 .btn:disabled, .ds-247420 .btn-primary:disabled, .ds-247420 .btn-ghost:disabled, .ds-247420 .btn.is-disabled, .ds-247420 .btn-primary.is-disabled, .ds-247420 .btn-ghost.is-disabled, .ds-247420 button:disabled, .ds-247420[disabled] {
4337
- opacity: 0.6;
4437
+ opacity: 0.45;
4438
+ filter: grayscale(60%);
4338
4439
  cursor: not-allowed;
4339
4440
  pointer-events: none;
4340
4441
  }
@@ -4649,7 +4750,13 @@
4649
4750
  transform: rotate(-2deg);
4650
4751
  white-space: nowrap;
4651
4752
  }
4652
- .ds-247420 .stamp.ink { background: var(--ink); border-color: var(--ink); color: var(--paper); }
4753
+ /* border-color previously matched background exactly (var(--ink) on both) --
4754
+ same class of bug as the colors-core "paper" swatch: a border drawn in the
4755
+ identical color as its own fill is invisible, so the ink-toned stamp was
4756
+ the one variant on the page missing its box outline. --paper reads as a
4757
+ visible ring against the ink fill (paper-on-ink is this token pair's
4758
+ whole reason to exist), matching every other .stamp variant's contrast. */
4759
+ .ds-247420 .stamp.ink { background: var(--ink); border-color: var(--paper); color: var(--paper); }
4653
4760
  .ds-247420 .stamp.acid { background: var(--accent); border-color: var(--accent-ink); color: var(--accent-ink); }
4654
4761
  .ds-247420 .stamp.purple { border-color: var(--purple-2); color: var(--purple-2); }
4655
4762
  .ds-247420 .stamp.mascot { border-color: var(--mascot); color: var(--mascot-deep); }
@@ -4664,6 +4771,11 @@
4664
4771
  border: 2px solid var(--fg);
4665
4772
  border-radius: var(--r-hair);
4666
4773
  background: transparent; color: var(--fg);
4774
+ /* .stamp's own caption claims the rubber-stamp motif is "always rotated
4775
+ slightly" -- .btn-stamp is the same visual face as an interactive
4776
+ <button> (preview/stamps-lore.html's second row) and had no rotation at
4777
+ all, breaking that claim for every stamp in that row. */
4778
+ transform: rotate(-2deg);
4667
4779
  transition: background var(--dur-snap) var(--ease), color var(--dur-snap) var(--ease);
4668
4780
  }
4669
4781
  .ds-247420 .btn-stamp:hover { background: var(--panel-hover); }
@@ -4681,11 +4793,20 @@
4681
4793
  }
4682
4794
  .ds-247420 hr.rule { border-top: 1px solid var(--rule); }
4683
4795
  .ds-247420 hr.rule-double { border-top: 4px double var(--rule-strong); }
4684
- .ds-247420 hr.rule-dotted { border-top: 1px dotted var(--rule-strong); }
4685
-
4686
- /* Hairline-only text input no box, no fill. A single bottom rule that
4687
- thickens to 2px on focus, matching the row/rule zero-border aesthetic
4688
- instead of a browser-default boxed field. */
4796
+ /* 1px was indistinguishable from .rule -- border-style:dotted needs enough
4797
+ width to actually draw a gap between dots; below ~2px (esp. at DPRs where
4798
+ 1px resolves to a sub-pixel value like 0.8px) Chrome collapses it to a
4799
+ solid line, which is exactly what preview/rules.html's report caught live. */
4800
+ .ds-247420 hr.rule-dotted { border-top: 2px dotted var(--rule-strong); }
4801
+
4802
+ /* Hairline-only text input — no full box, no permanent fill. A single bottom
4803
+ rule that thickens to 2px on focus, matching the row/rule zero-border
4804
+ aesthetic instead of a browser-default boxed field. A completely flat,
4805
+ static hairline reads as a static label rather than an editable control
4806
+ at a glance (no cue at rest, nothing on hover) -- the very faint permanent
4807
+ wash plus a stronger hover tint below signal "this is a field" without
4808
+ reverting to the boxed/filled chrome the hairline design deliberately
4809
+ moved away from. */
4689
4810
  .ds-247420 .input {
4690
4811
  display: block; width: 100%; box-sizing: border-box;
4691
4812
  /* appearance:none alone is not enough: with color-scheme:dark set on the
@@ -4699,11 +4820,13 @@
4699
4820
  color-scheme: normal;
4700
4821
  border: 0; border-bottom: 1px solid var(--rule-strong);
4701
4822
  border-radius: var(--r-0);
4702
- background: transparent;
4823
+ background: color-mix(in oklab, var(--fg) 2.5%, transparent);
4703
4824
  box-shadow: none;
4704
4825
  padding: var(--space-2) var(--space-1);
4705
4826
  font: inherit; color: var(--fg);
4827
+ transition: background var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
4706
4828
  }
4829
+ .ds-247420 .input:hover { background: color-mix(in oklab, var(--fg) 5%, transparent); }
4707
4830
  /* Touch floor for the BASE input. Several specific inputs already carried this
4708
4831
  (ds-file-filter-input, ds-modal-input, ds-term-input) but the primitive every
4709
4832
  form actually uses did not, so a plain field measured 34px under a coarse
@@ -4721,6 +4844,40 @@
4721
4844
  border-bottom-color: var(--accent-ink);
4722
4845
  }
4723
4846
 
4847
+ /* Switch primitive (form-primitives.js Toggle) -- track + sliding knob.
4848
+ Previously unstyled anywhere in this repo (a bare button with no visible
4849
+ affordance), so every real consumer resorted to a local literal-bracket-
4850
+ text reimplementation ('[x] on'/'[ ] off') instead. Sized off --space
4851
+ tokens: a 40x22 track (2x11 knob diameter + 2px inset each side) is the
4852
+ standard iOS/Material switch proportion, not an arbitrary literal. */
4853
+ .ds-247420 .ds-toggle {
4854
+ appearance: none; -webkit-appearance: none;
4855
+ display: inline-flex; align-items: center; flex-shrink: 0;
4856
+ width: 40px; height: 22px; padding: 2px;
4857
+ border: 1px solid var(--rule-strong); border-radius: var(--r-pill, 999px);
4858
+ background: var(--bg-3); box-shadow: none; cursor: pointer;
4859
+ transition: background-color var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease);
4860
+ }
4861
+ .ds-247420 .ds-toggle-knob {
4862
+ width: 16px; height: 16px; border-radius: 50%;
4863
+ background: var(--fg-3);
4864
+ transition: transform var(--dur-snap) var(--ease), background-color var(--dur-snap) var(--ease);
4865
+ }
4866
+ .ds-247420 .ds-toggle[aria-checked="true"] {
4867
+ background: var(--accent-ink); border-color: var(--accent-ink);
4868
+ }
4869
+ .ds-247420 .ds-toggle[aria-checked="true"] .ds-toggle-knob {
4870
+ background: var(--panel-0, #fff);
4871
+ transform: translateX(18px);
4872
+ }
4873
+ .ds-247420 .ds-toggle:disabled { opacity: 0.5; cursor: not-allowed; }
4874
+ .ds-247420 .ds-toggle:focus-visible {
4875
+ outline: var(--focus-w) solid var(--focus-color);
4876
+ outline-offset: var(--focus-offset);
4877
+ }
4878
+ .ds-247420 .ds-toggle-row { display: inline-flex; align-items: center; gap: var(--space-2); cursor: pointer; }
4879
+ .ds-247420 .ds-toggle-row .ds-toggle-label { color: inherit; }
4880
+
4724
4881
  /* -- Field controls: themed base for TextField / Select / SearchInput --
4725
4882
  Root fix: previously only `transition` was set, so themed apps got
4726
4883
  browser-default white boxes in dark mode and labels collided with inputs
@@ -6324,12 +6481,21 @@
6324
6481
  gap: var(--space-1-75, 6px);
6325
6482
  }
6326
6483
  /* Table() scroll containment — wide tables scroll inside their own box,
6327
- never the page body. */
6484
+ never the page body. overflow-x:auto alone works but gives no visible cue
6485
+ that a table is wider than its box (macOS overlay scrollbars stay hidden
6486
+ until an active hover/scroll gesture) -- columns beyond the fold read as
6487
+ simply missing rather than reachable. An always-visible thin scrollbar
6488
+ track makes the overflow legible without a gesture first. */
6328
6489
  .ds-247420 .ds-table-wrap {
6329
6490
  overflow-x: auto;
6330
6491
  -webkit-overflow-scrolling: touch;
6331
6492
  max-width: 100%;
6493
+ scrollbar-width: thin;
6494
+ scrollbar-color: var(--rule-strong) transparent;
6332
6495
  }
6496
+ .ds-247420 .ds-table-wrap::-webkit-scrollbar { height: 8px; }
6497
+ .ds-247420 .ds-table-wrap::-webkit-scrollbar-thumb { background: var(--rule-strong); border-radius: var(--r-pill, 999px); }
6498
+ .ds-247420 .ds-table-wrap::-webkit-scrollbar-track { background: transparent; }
6333
6499
  .ds-247420 .ds-table-wrap > table { min-width: 100%; }
6334
6500
  /* Sortable column headers (Table's opt-in sortable prop) — a docstudio-cue
6335
6501
  addition: color stays neutral at rest (this is a structural control, not a