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 +188 -22
- package/dist/247420.js +27 -27
- package/package.json +1 -1
- package/src/components/shell/app-shell.js +7 -0
- package/src/css/app-shell/base.css +29 -1
- package/src/css/app-shell/files.css +13 -3
- package/src/css/app-shell/hero-content.css +22 -3
- package/src/css/app-shell/kits-appended.css +10 -1
- package/src/css/app-shell/primitives.css +10 -4
- package/src/css/app-shell/states-interactions.css +70 -8
- package/src/css/app-shell/topbar.css +35 -2
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
1491
|
-
an ink block with
|
|
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(--
|
|
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(--
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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)
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
4685
|
-
|
|
4686
|
-
|
|
4687
|
-
|
|
4688
|
-
|
|
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
|