anentrypoint-design 0.0.469 → 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 +36 -271
- package/dist/247420.js +25 -25
- package/package.json +1 -1
- package/src/components/files-modals.js +2 -0
- package/src/components.js +2 -1
- package/src/css/app-shell/base.css +10 -121
- package/src/css/app-shell/primitives.css +0 -78
- package/src/kits/flatspace-theme/index.js +0 -12
- package/types/components.d.ts +26 -1
package/dist/247420.css
CHANGED
|
@@ -805,50 +805,26 @@
|
|
|
805
805
|
}
|
|
806
806
|
|
|
807
807
|
/* app-shell.css */
|
|
808
|
-
/* ============================================================
|
|
809
|
-
247420 design system — component sheet
|
|
810
|
-
shadcn-neutral: system-font display + body + mono, no custom web fonts.
|
|
811
|
-
Confident hierarchy, centered editorial stack, neutral grayscale accent.
|
|
812
|
-
Indicator rails over hairlines.
|
|
813
|
-
============================================================ */
|
|
814
|
-
|
|
815
|
-
/* ============================================================
|
|
816
|
-
Base
|
|
817
|
-
============================================================ */
|
|
818
808
|
.ds-247420 * { box-sizing: border-box; }
|
|
819
809
|
.ds-247420, .ds-247420 body { margin: 0; padding: 0; }
|
|
820
810
|
.ds-247420 button, .ds-247420 input, .ds-247420 select, .ds-247420 textarea { font: inherit; }
|
|
821
811
|
|
|
822
|
-
/* ============================================================
|
|
823
|
-
Accessibility — Skip Link
|
|
824
|
-
============================================================ */
|
|
825
812
|
.ds-247420 .skip-link {
|
|
813
|
+
--skip-link-preflight-translate-clear: -100%;
|
|
826
814
|
position: absolute;
|
|
827
|
-
/* -40px alone left the 44px-tall pill (padding + min-height floor below)
|
|
828
|
-
poking ~4px into every page pre-focus -- measured live via
|
|
829
|
-
getBoundingClientRect(). The offset must clear the full rendered height,
|
|
830
|
-
not a guessed constant, so translateY pushes it out by its own box. */
|
|
831
815
|
top: 0;
|
|
832
816
|
left: 0;
|
|
833
|
-
transform: translateY(-
|
|
817
|
+
transform: translateY(var(--skip-link-preflight-translate-clear));
|
|
834
818
|
background: var(--accent);
|
|
835
819
|
color: var(--accent-fg);
|
|
836
820
|
padding: var(--space-2) var(--space-3);
|
|
837
821
|
text-decoration: none;
|
|
838
|
-
/* Must outrank every layer of chrome once focused, or the first Tab press
|
|
839
|
-
lands on a control hidden behind the sticky header (was z-index:100,
|
|
840
|
-
which the header alone now matches). */
|
|
841
822
|
z-index: var(--z-top);
|
|
842
823
|
border-radius: var(--r-pill);
|
|
843
824
|
font-weight: 600;
|
|
844
825
|
font-size: var(--fs-sm);
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
it 39px tall -- measured live under coarse-pointer emulation on every kit.
|
|
848
|
-
Floored unconditionally rather than under a pointer:coarse query, because
|
|
849
|
-
switch and head-pointer users are not detected as coarse pointers and need
|
|
850
|
-
the larger target just as much. */
|
|
851
|
-
min-height: 44px;
|
|
826
|
+
--skip-link-min-touch-target: 44px;
|
|
827
|
+
min-height: var(--skip-link-min-touch-target);
|
|
852
828
|
display: inline-flex;
|
|
853
829
|
align-items: center;
|
|
854
830
|
}
|
|
@@ -858,23 +834,6 @@
|
|
|
858
834
|
outline: var(--focus-w) solid var(--focus-color);
|
|
859
835
|
outline-offset: var(--focus-offset);
|
|
860
836
|
}
|
|
861
|
-
/* Visually-hidden but still in the accessibility tree. Emitted by Row() (the
|
|
862
|
-
rail status word), FilterBar()/FileGrid() (aria-live result counts) and
|
|
863
|
-
form-primitives' required marker — all of which shipped BEFORE this rule
|
|
864
|
-
existed anywhere the app shell loads. The only other definitions live in
|
|
865
|
-
app-surfaces.css (pre-scoped to `.ds-247420`, so it never reaches a kit that
|
|
866
|
-
does not mount that root) and editor-primitives.css (a separate opt-in
|
|
867
|
-
<link>), which left every app-shell consumer rendering screen-reader-only
|
|
868
|
-
text VISIBLY the moment it passed `rail`/`resultCount`.
|
|
869
|
-
Deliberately NOT `display:none` / `visibility:hidden` / `width:0`: those
|
|
870
|
-
remove the node from the accessibility tree too, which defeats the entire
|
|
871
|
-
purpose — the text exists only for AT. The clip + 1px box is what keeps it
|
|
872
|
-
announced while occupying no visible area.
|
|
873
|
-
`margin: -1px` is OFF-SCALE ON PURPOSE — it is not rhythm, it is one half of
|
|
874
|
-
the canonical visually-hidden idiom: the negative margin cancels the 1px box
|
|
875
|
-
so the clipped element contributes zero layout. Snapping it to a --space-*
|
|
876
|
-
rung would reintroduce a measurable gap. `clip` is deprecated but retained
|
|
877
|
-
alongside `clip-path` for older AT/browser pairs that ignore the latter. */
|
|
878
837
|
.ds-247420 .sr-only {
|
|
879
838
|
position: absolute;
|
|
880
839
|
width: 1px;
|
|
@@ -888,11 +847,6 @@
|
|
|
888
847
|
border: 0;
|
|
889
848
|
}
|
|
890
849
|
|
|
891
|
-
/* .ds-aspect — generic aspect-ratio utility. Native `aspect-ratio` property
|
|
892
|
-
(broadly supported for years) rather than the padding-bottom hack: no
|
|
893
|
-
extra wrapper markup, no absolutely-positioned inner layer needed just to
|
|
894
|
-
fill the box. `--aspect` defaults to 16/9; a caller overrides it inline
|
|
895
|
-
(e.g. style="--aspect:1/1") or via a ratio-named modifier class below. */
|
|
896
850
|
.ds-247420 .ds-aspect {
|
|
897
851
|
aspect-ratio: var(--aspect, 16 / 9);
|
|
898
852
|
width: 100%;
|
|
@@ -912,14 +866,11 @@
|
|
|
912
866
|
-webkit-font-smoothing: antialiased;
|
|
913
867
|
text-rendering: optimizeLegibility;
|
|
914
868
|
}
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
scoping a value per theme rather than sharing one across both). */
|
|
920
|
-
.ds-247420 ::selection { background: color-mix(in oklab, var(--accent) 46%, var(--bg-2)); color: var(--fg); }
|
|
869
|
+
.ds-247420 {
|
|
870
|
+
--selection-tint-paper-share: 46%;
|
|
871
|
+
}
|
|
872
|
+
.ds-247420 ::selection { background: color-mix(in oklab, var(--accent) var(--selection-tint-paper-share), var(--bg-2)); color: var(--fg); }
|
|
921
873
|
|
|
922
|
-
/* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
|
|
923
874
|
.ds-247420 .app, .ds-247420 .ds-stage {
|
|
924
875
|
container-type: inline-size;
|
|
925
876
|
overflow-x: clip;
|
|
@@ -927,29 +878,16 @@
|
|
|
927
878
|
}
|
|
928
879
|
.ds-247420 .app * { min-width: 0; }
|
|
929
880
|
|
|
930
|
-
/* Scrollbar treatment, applied once at the root rather than per-component.
|
|
931
|
-
chat.css already styled its own thread and code blocks this way, but every
|
|
932
|
-
other scroll container (.app-side-shell, .app-main, .ds-scroll-x,
|
|
933
|
-
.ds-table-wrap, .ds-live-log) fell back to the UA default -- measured live,
|
|
934
|
-
4 of 4 containers on dashboard and 7 of 7 on gm_inspector were unstyled while
|
|
935
|
-
chat's two were not. A default scrollbar reads as a bright seam against a
|
|
936
|
-
near-black panel in the ink and dark themes, and inconsistently between two
|
|
937
|
-
panels on the same page. Tokens mean the thumb follows the active theme.
|
|
938
|
-
Inheriting from the container also covers scrollers added later. */
|
|
939
881
|
.ds-247420 .app, .ds-247420 .ds-stage, .ds-247420 .app *, .ds-247420 .ds-stage * {
|
|
940
882
|
scrollbar-width: thin;
|
|
941
883
|
scrollbar-color: var(--bg-3) transparent;
|
|
942
884
|
}
|
|
943
885
|
|
|
944
|
-
/* ============================================================
|
|
945
|
-
Typography
|
|
946
|
-
============================================================ */
|
|
947
886
|
.ds-247420 h1, .ds-247420 .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; }
|
|
948
887
|
.ds-247420 h2, .ds-247420 .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; }
|
|
949
888
|
.ds-247420 h3, .ds-247420 .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; }
|
|
950
889
|
.ds-247420 h4, .ds-247420 .t-h4 { font-family: var(--ff-display); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
|
|
951
890
|
|
|
952
|
-
/* App/chrome typescale opt-in: compact heading ceiling for application UIs. */
|
|
953
891
|
.ds-247420[data-typescale="app"] h1, .ds-247420[data-typescale="app"] .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
|
|
954
892
|
.ds-247420[data-typescale="app"] h2, .ds-247420[data-typescale="app"] .t-h2 { font-size: var(--fs-h2-app); }
|
|
955
893
|
.ds-247420[data-typescale="app"] h3, .ds-247420[data-typescale="app"] .t-h3 { font-size: var(--fs-h3-app); }
|
|
@@ -959,21 +897,9 @@
|
|
|
959
897
|
.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
898
|
|
|
961
899
|
.ds-247420 .t-display { font-family: var(--ff-display); font-weight: 600; letter-spacing: var(--tr-tight); }
|
|
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
900
|
.ds-247420 .t-mono { font-family: var(--ff-mono); font-weight: 400; }
|
|
968
901
|
.ds-247420 .t-body { font-family: var(--ff-body); }
|
|
969
902
|
|
|
970
|
-
/* House small-label voice, in two sizes. Every declaration here is sourced
|
|
971
|
-
from a token, so a sheet that cannot join these selector lists (community.css
|
|
972
|
-
and gm-prose.css ship as separate <link>-able exports and must not depend on
|
|
973
|
-
app-shell.css being present) still composes the same voice by referencing the
|
|
974
|
-
same four tokens — --ff-mono / --fs-* / uppercase / --tr-label. That token
|
|
975
|
-
set, not this rule, is the single source of truth; a selector that restates a
|
|
976
|
-
literal instead of the token is the drift this pairing exists to prevent. */
|
|
977
903
|
.ds-247420 .t-label { font-family: var(--ff-mono); font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-label); font-weight: 500; }
|
|
978
904
|
.ds-247420 .t-micro { font-family: var(--ff-mono); font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: var(--tr-label); color: var(--fg-3); }
|
|
979
905
|
.ds-247420 .t-meta { font-family: var(--ff-body); font-size: var(--fs-sm); color: var(--fg-3); }
|
|
@@ -984,35 +910,14 @@
|
|
|
984
910
|
margin: 0;
|
|
985
911
|
}
|
|
986
912
|
|
|
987
|
-
/* h1/h2/h3/h4 and .lede/.t-lede are both margin:0 primitives by design (a
|
|
988
|
-
heading used standalone must not force space its context doesn't want).
|
|
989
|
-
But a heading immediately followed by a lede is a named pairing, not two
|
|
990
|
-
independent primitives that happen to be adjacent -- it needs its own gap
|
|
991
|
-
regardless of whether the surrounding shell opts into .ds-app-surface
|
|
992
|
-
(which only adds this spacing on landing/marketing surfaces, leaving every
|
|
993
|
-
Operate-mode kit that skips that class with a zero-gap heading+subtitle). */
|
|
994
913
|
.ds-247420 h1 + .lede, .ds-247420 h1 + .t-lede, .ds-247420 h2 + .lede, .ds-247420 h2 + .t-lede, .ds-247420 h3 + .lede, .ds-247420 h3 + .t-lede, .ds-247420 .t-h1 + .lede, .ds-247420 .t-h1 + .t-lede {
|
|
995
914
|
margin-top: var(--space-2);
|
|
996
915
|
}
|
|
997
916
|
|
|
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
917
|
.ds-247420 .lede + .post-body, .ds-247420 .t-lede + .post-body, .ds-247420 .lede + .ds-prose, .ds-247420 .t-lede + .ds-prose {
|
|
1004
918
|
margin-top: var(--space-4);
|
|
1005
919
|
}
|
|
1006
920
|
|
|
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
921
|
.ds-247420 .lede + .ds-section, .ds-247420 .t-lede + .ds-section {
|
|
1017
922
|
margin-top: var(--space-8);
|
|
1018
923
|
}
|
|
@@ -1026,7 +931,6 @@
|
|
|
1026
931
|
color: var(--accent-ink);
|
|
1027
932
|
display: inline-flex; align-items: center; gap: 12px;
|
|
1028
933
|
}
|
|
1029
|
-
/* Editorial kicker mark — a short solid ink rule, the print-byline tell. */
|
|
1030
934
|
.ds-247420 .eyebrow::before {
|
|
1031
935
|
content: '';
|
|
1032
936
|
width: 28px; height: 3px; background: currentColor;
|
|
@@ -1055,21 +959,6 @@
|
|
|
1055
959
|
font-family: var(--ff-body);
|
|
1056
960
|
}
|
|
1057
961
|
.ds-247420 .ds-prose blockquote p:last-child { margin-bottom: 0; }
|
|
1058
|
-
/* Closing line of an article ("end. reply by opening a pr."), set off from the
|
|
1059
|
-
body it terminates. Quieter and smaller than the prose around it: it takes
|
|
1060
|
-
the mono face and the --fg-3 tone the house uses for ancillary voices
|
|
1061
|
-
(.t-micro, .dim), so the endnote reads as chrome around the article rather
|
|
1062
|
-
than a final paragraph of it. The --space-5 lead does the "set off" — it
|
|
1063
|
-
breaks the paragraph rhythm so the eye registers the piece has ended before
|
|
1064
|
-
reading the words; margin-bottom:0 overrides .ds-prose p's --space-4 so the
|
|
1065
|
-
article does not end on dead space.
|
|
1066
|
-
Lives here, beside the rest of the .ds-prose family, NOT in gm-prose.css:
|
|
1067
|
-
the blog kit that uses this class links only colors_and_type.css +
|
|
1068
|
-
app-shell.css, so a rule in that separately-<link>-ed export would be exactly
|
|
1069
|
-
as undefined as the class was before. Sized at --fs-xs, not the --fs-micro
|
|
1070
|
-
label rung: this is a readable sentence with a link in it, not a micro-label.
|
|
1071
|
-
The link inherits .ds-prose a's --accent-ink treatment (a readable TEXT tone;
|
|
1072
|
-
the bare --accent fill is ~1.07:1 on paper) — deliberately not re-stated. */
|
|
1073
962
|
.ds-247420 .ds-prose .ds-prose-endnote,
|
|
1074
963
|
.ds-247420 .ds-prose-endnote {
|
|
1075
964
|
margin-top: var(--space-5);
|
|
@@ -1082,7 +971,6 @@
|
|
|
1082
971
|
|
|
1083
972
|
.ds-247420 .dim { color: var(--fg-3); }
|
|
1084
973
|
|
|
1085
|
-
/* Links */
|
|
1086
974
|
.ds-247420 a { color: inherit; text-decoration: none; }
|
|
1087
975
|
.ds-247420 a.ds-link-accent, .ds-247420 .ds-prose a {
|
|
1088
976
|
color: var(--accent-ink);
|
|
@@ -1100,8 +988,9 @@
|
|
|
1100
988
|
}
|
|
1101
989
|
|
|
1102
990
|
.ds-247420 code {
|
|
991
|
+
--code-pill-tier3-surface: var(--bg-3);
|
|
1103
992
|
font-family: var(--ff-mono); font-size: 0.92em;
|
|
1104
|
-
background: var(--
|
|
993
|
+
background: var(--code-pill-tier3-surface); padding: 0.15em 0.5em; border-radius: var(--r-1);
|
|
1105
994
|
}
|
|
1106
995
|
|
|
1107
996
|
.ds-247420 pre {
|
|
@@ -1515,15 +1404,8 @@
|
|
|
1515
1404
|
border-bottom: var(--bw-hair, 1px) dotted var(--rule-strong);
|
|
1516
1405
|
}
|
|
1517
1406
|
|
|
1518
|
-
/* ============================================================
|
|
1519
|
-
Primitives
|
|
1520
|
-
============================================================ */
|
|
1521
1407
|
.ds-247420 .btn, .ds-247420 .btn-primary, .ds-247420 .btn-ghost {
|
|
1522
1408
|
display: inline-flex; align-items: center; justify-content: center; gap: 6px;
|
|
1523
|
-
/* Fixed height + horizontal-only padding: the control height is exact and
|
|
1524
|
-
alignable (flex centres the label vertically), the way webgeist snaps every
|
|
1525
|
-
control to a height ladder. Default is the --ctl-md rung; --btn-sm/--btn-lg
|
|
1526
|
-
retune height + h-padding + font per size. Density scales the ladder. */
|
|
1527
1409
|
height: var(--ctl-md); min-height: var(--ctl-md);
|
|
1528
1410
|
padding: 0 var(--space-2-75);
|
|
1529
1411
|
font-family: var(--ff-body);
|
|
@@ -1531,30 +1413,15 @@
|
|
|
1531
1413
|
text-decoration: none;
|
|
1532
1414
|
white-space: nowrap;
|
|
1533
1415
|
cursor: pointer;
|
|
1534
|
-
/* Rounded-rect app chrome, not a marketing-page stadium CTA.
|
|
1535
|
-
Shape vocabulary: r-1/r-2 = actionable buttons, icon-buttons, and
|
|
1536
|
-
containers; r-pill = reserved for status/input/chip/badge/progress
|
|
1537
|
-
surfaces (composer input, chips, badges, progress bars, theme-toggle
|
|
1538
|
-
segments) - never for actions. */
|
|
1539
1416
|
border-radius: var(--r-1);
|
|
1540
1417
|
border: var(--bw-hair) solid transparent;
|
|
1541
1418
|
box-shadow: none;
|
|
1542
|
-
/* Restrained hover-lift: a 1px rise + hairline shadow reads as a crisp,
|
|
1543
|
-
confident affordance rather than a soft glow-card float. */
|
|
1544
1419
|
transition: transform var(--dur-base) var(--ease-spring), background var(--dur-snap) var(--ease),
|
|
1545
1420
|
color var(--dur-snap) var(--ease), box-shadow var(--dur-base) var(--ease-spring),
|
|
1546
1421
|
border-color var(--dur-snap) var(--ease);
|
|
1547
1422
|
}
|
|
1548
1423
|
.ds-247420 .btn { background: var(--bg-2); color: var(--fg); border-color: var(--rule); }
|
|
1549
1424
|
.ds-247420 .btn:hover { background: var(--bg-3); color: var(--fg); transform: translateY(-1px); box-shadow: var(--shadow-1); }
|
|
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. */
|
|
1558
1425
|
.ds-247420 .btn-primary {
|
|
1559
1426
|
background: var(--green); color: var(--on-color);
|
|
1560
1427
|
font-weight: 700;
|
|
@@ -1568,10 +1435,6 @@
|
|
|
1568
1435
|
outline-offset: var(--focus-offset);
|
|
1569
1436
|
}
|
|
1570
1437
|
|
|
1571
|
-
/* Button size ladder — the size prop on Btn() (sm | md | lg). md is the base
|
|
1572
|
-
rule above; sm/lg retune height (off the --ctl-* ladder), horizontal padding,
|
|
1573
|
-
and font-size so a size swap is one class, never inline padding overrides
|
|
1574
|
-
(the old preview faked sizes with style=). Applies to every variant. */
|
|
1575
1438
|
.ds-247420 .btn-sm, .ds-247420 .btn-sm.btn-primary, .ds-247420 .btn-sm.btn-ghost {
|
|
1576
1439
|
height: var(--ctl-sm); min-height: var(--ctl-sm);
|
|
1577
1440
|
padding: 0 var(--space-2); font-size: var(--fs-tiny); gap: var(--space-1);
|
|
@@ -1581,10 +1444,6 @@
|
|
|
1581
1444
|
padding: 0 var(--space-4); font-size: var(--fs-body); gap: var(--space-2);
|
|
1582
1445
|
}
|
|
1583
1446
|
|
|
1584
|
-
/* App-mode quiet interactions — the marketing hover-lift (translateY + shadow)
|
|
1585
|
-
and the .row .meta slide read as decorative float on a dense working surface.
|
|
1586
|
-
Under [data-typescale="app"], state changes are background/border-only: crisp,
|
|
1587
|
-
no motion, no elevation. Marketing surfaces (no data-typescale) keep the lift. */
|
|
1588
1447
|
.ds-247420[data-typescale="app"] .btn:hover,
|
|
1589
1448
|
.ds-247420[data-typescale="app"] .btn-primary:hover,
|
|
1590
1449
|
.ds-247420[data-typescale="app"] .btn-ghost:hover { transform: none; box-shadow: none; }
|
|
@@ -1595,9 +1454,6 @@
|
|
|
1595
1454
|
.ds-247420[data-typescale="app"] a.row:hover .meta,
|
|
1596
1455
|
.ds-247420[data-typescale="app"] .row[role="button"]:hover .meta { transform: none; }
|
|
1597
1456
|
|
|
1598
|
-
/* ============================================================
|
|
1599
|
-
IconButton — square icon-only button
|
|
1600
|
-
============================================================ */
|
|
1601
1457
|
.ds-247420 .ds-icon-btn {
|
|
1602
1458
|
display: inline-flex; align-items: center; justify-content: center;
|
|
1603
1459
|
padding: 0; border: none; cursor: pointer;
|
|
@@ -1614,7 +1470,6 @@
|
|
|
1614
1470
|
.ds-247420 .ds-icon-btn-ghost:hover { background: var(--fg); color: var(--bg); }
|
|
1615
1471
|
.ds-247420 .ds-icon-btn-primary { background: var(--accent); color: var(--accent-fg); }
|
|
1616
1472
|
.ds-247420 .ds-icon-btn-primary:hover { background: var(--fg); color: var(--accent-ink); }
|
|
1617
|
-
/* warn = destructive ACTION tone; flame stays exclusively error STATUS. */
|
|
1618
1473
|
.ds-247420 .ds-icon-btn-danger { background: var(--warn); color: var(--on-color); }
|
|
1619
1474
|
.ds-247420 .ds-icon-btn-danger:hover { filter: brightness(0.92); }
|
|
1620
1475
|
.ds-247420 .ds-icon-btn:active { transform: translateY(1px); }
|
|
@@ -1622,9 +1477,6 @@
|
|
|
1622
1477
|
opacity: 0.5; cursor: not-allowed; pointer-events: none;
|
|
1623
1478
|
}
|
|
1624
1479
|
|
|
1625
|
-
/* ============================================================
|
|
1626
|
-
Badge — small inline count/status pill
|
|
1627
|
-
============================================================ */
|
|
1628
1480
|
.ds-247420 .ds-badge {
|
|
1629
1481
|
display: inline-flex; align-items: center; justify-content: center;
|
|
1630
1482
|
min-width: 18px; height: 18px; padding: 0 6px;
|
|
@@ -1632,15 +1484,8 @@
|
|
|
1632
1484
|
border-radius: var(--r-pill);
|
|
1633
1485
|
background: var(--bg-3); color: var(--fg-2);
|
|
1634
1486
|
}
|
|
1635
|
-
/* Badge size ladder — sm for dense inline counts, lg for prominent markers.
|
|
1636
|
-
Base (above) stays the 18px default. */
|
|
1637
1487
|
.ds-247420 .ds-badge.ds-badge--sm { min-width: 14px; height: 14px; padding: 0 var(--space-1); font-size: 10px; }
|
|
1638
1488
|
.ds-247420 .ds-badge.ds-badge--lg { min-width: 22px; height: 22px; padding: 0 var(--space-2); font-size: var(--fs-tiny); }
|
|
1639
|
-
/* Canonical tone names are tone-success / tone-error / tone-neutral. Every
|
|
1640
|
-
other tone name grouped into the same rule below (tone-green/tone-live,
|
|
1641
|
-
tone-flame, tone-wip, tone-sun/tone-yellow, tone-ok/tone-miss) is a
|
|
1642
|
-
true-synonym legacy alias, kept working but sharing one declaration so the
|
|
1643
|
-
tone-family colors can't drift apart across names. */
|
|
1644
1489
|
.ds-247420 .ds-badge.tone-green, .ds-247420 .ds-badge.tone-live, .ds-247420 .ds-badge.tone-success {
|
|
1645
1490
|
background: var(--green-tint); color: var(--green-deep);
|
|
1646
1491
|
}
|
|
@@ -1667,18 +1512,12 @@
|
|
|
1667
1512
|
letter-spacing: var(--tr-caps); text-transform: uppercase;
|
|
1668
1513
|
border-radius: var(--r-pill);
|
|
1669
1514
|
}
|
|
1670
|
-
/* Chip size ladder — sm for dense toolbars/table cells, lg for prominent
|
|
1671
|
-
status. tone-* colouring (below) is orthogonal to size. */
|
|
1672
1515
|
.ds-247420 .chip.chip--sm { padding: var(--space-half) var(--space-2); font-size: var(--fs-micro); gap: var(--space-1); }
|
|
1673
1516
|
.ds-247420 .chip.chip--lg { padding: var(--space-1-75) var(--space-2-75); font-size: var(--fs-xs); }
|
|
1674
|
-
/* Tag variant — a rectangular, sentence-case chip for dense data (table cells,
|
|
1675
|
-
inline labels) where the all-caps pill reads too shouty and space-hungry.
|
|
1676
|
-
Keeps the tone-* palette; drops the caps + pill for a tight --r-0 corner. */
|
|
1677
1517
|
.ds-247420 .chip.chip--tag {
|
|
1678
1518
|
text-transform: none; letter-spacing: 0; font-weight: 500;
|
|
1679
1519
|
border-radius: var(--r-0); padding: var(--space-half) var(--space-2);
|
|
1680
1520
|
}
|
|
1681
|
-
/* Same canonical/legacy-alias grouping as .ds-badge above. */
|
|
1682
1521
|
.ds-247420 .chip.tone-green, .ds-247420 .chip.tone-live, .ds-247420 .chip.tone-success, .ds-247420 .chip.tone-ok {
|
|
1683
1522
|
background: var(--green-tint); color: var(--green-deep);
|
|
1684
1523
|
}
|
|
@@ -1688,21 +1527,9 @@
|
|
|
1688
1527
|
.ds-247420 .chip.tone-wip, .ds-247420 .chip.tone-neutral {
|
|
1689
1528
|
background: var(--bg-3); color: var(--fg-2);
|
|
1690
1529
|
}
|
|
1691
|
-
/* `.chip.accent` is the bare-adjective spelling of tone-accent (ui_kits/blog
|
|
1692
|
-
uses it for a "draft" chip). It had no rule anywhere, so an accented chip
|
|
1693
|
-
rendered byte-identical to a plain one. Folded into the alias grouping rather
|
|
1694
|
-
than given its own block, so the two spellings cannot drift apart. --accent
|
|
1695
|
-
is the FILL and --accent-ink the readable text tone (AGENTS.md) — the bare
|
|
1696
|
-
lead is ~1.07:1 on paper and unreadable as text. */
|
|
1697
1530
|
.ds-247420 .chip.accent, .ds-247420 .chip.tone-accent {
|
|
1698
1531
|
background: var(--accent-tint); color: var(--accent-ink);
|
|
1699
1532
|
}
|
|
1700
|
-
/* tone-dim was applied by five kits (aicat, project_page, signin, system_primer,
|
|
1701
|
-
terminal) with no rule anywhere, so a "dim" chip rendered byte-identical to a
|
|
1702
|
-
plain one — measured at rgb(234,230,218) on rgb(31,31,38), same opacity. It is
|
|
1703
|
-
the recede-into-the-row tone: the tier-3 foreground on the same recessed
|
|
1704
|
-
surface tone-wip uses, which is quieter than the default --fg-2 without
|
|
1705
|
-
dropping to an opacity fade that would take the border and background with it. */
|
|
1706
1533
|
.ds-247420 .chip.tone-dim {
|
|
1707
1534
|
background: var(--bg-3); color: var(--fg-3);
|
|
1708
1535
|
}
|
|
@@ -1716,10 +1543,6 @@
|
|
|
1716
1543
|
.ds-247420 .chip.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
|
|
1717
1544
|
.ds-247420 .chip.tone-yellow { background: var(--sun); color: var(--ink); }
|
|
1718
1545
|
|
|
1719
|
-
/* Removable chip — a trailing dismiss (x) button for editable tag/filter
|
|
1720
|
-
chip lists (session tags, saved-search chips). Reuses the chip's own
|
|
1721
|
-
tone/size; the button itself stays neutral-at-rest, per the standing
|
|
1722
|
-
color-reserved-for-meaning convention, tinting only on hover/focus. */
|
|
1723
1546
|
.ds-247420 .chip.ds-chip-removable { padding-right: var(--space-1); }
|
|
1724
1547
|
.ds-247420 .ds-chip-remove-btn {
|
|
1725
1548
|
display: inline-flex; align-items: center; justify-content: center;
|
|
@@ -1735,8 +1558,6 @@
|
|
|
1735
1558
|
.ds-247420 .ds-chip-remove-btn svg { width: 12px; height: 12px; }
|
|
1736
1559
|
}
|
|
1737
1560
|
|
|
1738
|
-
/* ds-pill — plain neutral chip, distinct from the toned .ds-badge/.chip family
|
|
1739
|
-
(gmsniff's .pill: a bare rounded label with no semantic tone). */
|
|
1740
1561
|
.ds-247420 .ds-pill {
|
|
1741
1562
|
display: inline-block;
|
|
1742
1563
|
padding: 1px 7px;
|
|
@@ -1754,16 +1575,6 @@
|
|
|
1754
1575
|
font-family: var(--ff-mono); font-size: var(--fs-tiny);
|
|
1755
1576
|
opacity: 0.8;
|
|
1756
1577
|
}
|
|
1757
|
-
/* Glyph() (src/components/shell/atoms.js) emits `glyph glyph-{size}` and an
|
|
1758
|
-
inline `font-size: var(--glyph-size-{size}, <literal>)`. The custom property
|
|
1759
|
-
is the documented theming hook — it is what lets a theme retune glyph scale
|
|
1760
|
-
without touching the component — but nothing declared it, so every glyph fell
|
|
1761
|
-
through to the hard-coded inline literal and the hook was inert. Declaring
|
|
1762
|
-
the three rungs on the scale makes the hook real; the sm/lg classes also give
|
|
1763
|
-
the box a matching footprint instead of the one-size 18px square. */
|
|
1764
|
-
/* Values mirror Glyph()'s own inline fallbacks exactly (11 / 13 / 16px), so
|
|
1765
|
-
declaring the hook changes nothing visually — it only makes the property
|
|
1766
|
-
themeable, which is what it always claimed to be. */
|
|
1767
1578
|
.ds-247420 .glyph { --glyph-size-sm: var(--fs-nano); --glyph-size-base: var(--fs-tiny); --glyph-size-lg: var(--fs-body); }
|
|
1768
1579
|
.ds-247420 .glyph-sm { width: 14px; height: 14px; }
|
|
1769
1580
|
.ds-247420 .glyph-lg { width: 22px; height: 22px; }
|
|
@@ -13344,20 +13155,12 @@
|
|
|
13344
13155
|
.ds-247420 .fd-page-error { max-height: 60vh; overflow: auto; white-space: pre-wrap; word-break: break-all; }
|
|
13345
13156
|
|
|
13346
13157
|
/* gm-prose.css */
|
|
13347
|
-
/* ============================================================
|
|
13348
|
-
gm-prose -- long-form article + doc-site prose surfaces
|
|
13349
|
-
Extracted-article host, sticky table-of-contents rail, CLI
|
|
13350
|
-
transcript block, definition-panel rows, repo cards, tag
|
|
13351
|
-
chips, and attributed callouts. Consumed pro-rata by doc
|
|
13352
|
-
sites (the gm paper) that mount the SDK and inject a flatspace
|
|
13353
|
-
article into #ds-article-host. Every color is a token from
|
|
13354
|
-
colors_and_type.css; no raw literals.
|
|
13355
|
-
============================================================ */
|
|
13356
|
-
|
|
13357
13158
|
.ds-247420 .ds-prose { line-height: 1.65; }
|
|
13358
13159
|
.ds-247420 .ds-prose a { color: var(--panel-accent); }
|
|
13359
13160
|
.ds-247420 .ds-prose a:hover { background: none; color: var(--panel-accent); text-decoration-color: transparent; }
|
|
13360
13161
|
.ds-247420 .ds-prose pre, .ds-247420 .ds-prose table { overflow-x: auto; max-width: 100%; }
|
|
13162
|
+
.ds-247420 .ds-prose .mermaid { max-width: 100%; }
|
|
13163
|
+
.ds-247420 .ds-prose .mermaid svg { max-width: 100%; height: auto; cursor: zoom-in; }
|
|
13361
13164
|
.ds-247420 .ds-prose canvas {
|
|
13362
13165
|
display: block;
|
|
13363
13166
|
width: 100%;
|
|
@@ -13373,33 +13176,33 @@
|
|
|
13373
13176
|
min-height: 0;
|
|
13374
13177
|
}
|
|
13375
13178
|
|
|
13179
|
+
.ds-247420 {
|
|
13180
|
+
--article-toc-rail-w: 256px;
|
|
13181
|
+
--article-toc-gutter-nonrhythm: 44px;
|
|
13182
|
+
--article-toc-header-gap: 16px;
|
|
13183
|
+
}
|
|
13376
13184
|
.ds-247420 #ds-article-host.has-toc {
|
|
13377
13185
|
display: flex;
|
|
13378
13186
|
align-items: flex-start;
|
|
13379
|
-
|
|
13380
|
-
|
|
13381
|
-
|
|
13382
|
-
would silently change the host's computed max-width unless the calc were
|
|
13383
|
-
re-derived, so the literal and the calc stay coupled and explicit. */
|
|
13384
|
-
column-gap: 44px;
|
|
13385
|
-
gap: 44px;
|
|
13386
|
-
max-width: calc(256px + 44px + var(--measure-narrow));
|
|
13187
|
+
column-gap: var(--article-toc-gutter-nonrhythm);
|
|
13188
|
+
gap: var(--article-toc-gutter-nonrhythm);
|
|
13189
|
+
max-width: calc(var(--article-toc-rail-w) + var(--article-toc-gutter-nonrhythm) + var(--measure));
|
|
13387
13190
|
margin-left: auto;
|
|
13388
13191
|
margin-right: auto;
|
|
13389
13192
|
}
|
|
13390
13193
|
.ds-247420 #ds-article-host.has-toc > .article-col {
|
|
13391
13194
|
flex: 1 1 0;
|
|
13392
13195
|
min-width: 0;
|
|
13393
|
-
max-width: var(--measure
|
|
13196
|
+
max-width: var(--measure);
|
|
13394
13197
|
}
|
|
13395
13198
|
.ds-247420 #ds-article-host.has-toc > .toc {
|
|
13396
|
-
flex: 0 0
|
|
13199
|
+
flex: 0 0 var(--article-toc-rail-w);
|
|
13397
13200
|
align-self: flex-start;
|
|
13398
13201
|
position: sticky;
|
|
13399
|
-
top:
|
|
13202
|
+
top: calc(var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) + var(--article-toc-header-gap));
|
|
13400
13203
|
align-self: start;
|
|
13401
|
-
max-height: calc(100vh -
|
|
13402
|
-
max-height: calc(100dvh -
|
|
13204
|
+
max-height: calc(100vh - var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) - 32px);
|
|
13205
|
+
max-height: calc(100dvh - var(--article-header-h, calc(var(--app-topbar-h, 0px) + var(--app-crumb-h, 0px))) - 32px);
|
|
13403
13206
|
overflow-y: auto;
|
|
13404
13207
|
overscroll-behavior: contain;
|
|
13405
13208
|
margin: 0;
|
|
@@ -13423,15 +13226,6 @@
|
|
|
13423
13226
|
background: var(--panel-text-3);
|
|
13424
13227
|
background-clip: padding-box;
|
|
13425
13228
|
}
|
|
13426
|
-
/* Small-label voice — the local composition of the house `.t-label` recipe
|
|
13427
|
-
(src/css/app-shell/base.css). This sheet is a standalone published export
|
|
13428
|
-
with its own <link>, so it cannot join the `.t-label` selector list; it
|
|
13429
|
-
composes by referencing the identical token set. Both members are gm-
|
|
13430
|
-
generated markup (injected into #ds-article-host), so the class list is not
|
|
13431
|
-
reachable from src/ — the rule, not the markup, does the composing.
|
|
13432
|
-
Deliberate override for both: --panel-text-2, because prose surfaces use the
|
|
13433
|
-
panel text ramp rather than the app --fg ramp. Sized at --fs-nano: these
|
|
13434
|
-
labels ride above dense article chrome, not UI text. */
|
|
13435
13229
|
.ds-247420 #ds-article-host .toc .toc-title,
|
|
13436
13230
|
.ds-247420 .ds-prose .gm-callout .who {
|
|
13437
13231
|
font-family: var(--ff-mono);
|
|
@@ -13445,7 +13239,13 @@
|
|
|
13445
13239
|
margin: 0 0 var(--space-3) 0;
|
|
13446
13240
|
}
|
|
13447
13241
|
.ds-247420 #ds-article-host .toc ol { margin: 0; padding-left: var(--space-3-5); }
|
|
13448
|
-
.ds-247420 #ds-article-host .toc li {
|
|
13242
|
+
.ds-247420 #ds-article-host .toc li {
|
|
13243
|
+
font-size: var(--fs-tiny);
|
|
13244
|
+
line-height: 1.85;
|
|
13245
|
+
color: var(--panel-text);
|
|
13246
|
+
min-height: 1.85em;
|
|
13247
|
+
}
|
|
13248
|
+
.ds-247420 #ds-article-host .toc li:nth-child(5n) { margin-bottom: var(--space-2); }
|
|
13449
13249
|
.ds-247420 #ds-article-host .toc li::marker { color: var(--panel-text-3); font-variant-numeric: tabular-nums; }
|
|
13450
13250
|
.ds-247420 #ds-article-host .toc a { color: var(--panel-text-2); text-decoration: none; transition: color .12s ease; }
|
|
13451
13251
|
.ds-247420 #ds-article-host .toc a:hover { color: var(--panel-accent); }
|
|
@@ -13461,28 +13261,15 @@
|
|
|
13461
13261
|
}
|
|
13462
13262
|
}
|
|
13463
13263
|
|
|
13464
|
-
/* .ds-cli-block — the multi-row article/transcript container (CliBlock()'s
|
|
13465
|
-
outer wrapper holding stacked .ds-cli-row / .ds-cli-comment children).
|
|
13466
|
-
Distinct from the bare `.cli` single prompt+cmd row primitive owned by
|
|
13467
|
-
app-shell.css (Install(), HeroFromPageData(), terminal/site quickstart
|
|
13468
|
-
lines) — the two used to share the `.cli` selector with incompatible
|
|
13469
|
-
display models (flex row vs block transcript), so whichever stylesheet
|
|
13470
|
-
loaded last silently won for both consumers. Renamed here to remove the
|
|
13471
|
-
collision; see content.js CliBlock(). */
|
|
13472
13264
|
.ds-247420 .ds-cli-block {
|
|
13265
|
+
--ds-cli-block-fs-mono-halfrung: 12.5px;
|
|
13473
13266
|
display: block;
|
|
13474
13267
|
background: var(--panel-1);
|
|
13475
13268
|
border-radius: var(--r-0);
|
|
13476
13269
|
padding: var(--space-3) var(--space-3-5);
|
|
13477
13270
|
margin: var(--space-3) 0 var(--space-5) 0;
|
|
13478
13271
|
font-family: var(--ff-mono);
|
|
13479
|
-
|
|
13480
|
-
in the mono face, which runs optically ~1 rung larger than the system
|
|
13481
|
-
stack at the same px. --fs-micro (12) reads thin against the surrounding
|
|
13482
|
-
prose and --fs-tiny (13) reads heavy; 12.5 is the tuned midpoint. There is
|
|
13483
|
-
no half-rung on the --fs-* ladder and one must not be invented for a
|
|
13484
|
-
single block, so this literal stays. */
|
|
13485
|
-
font-size: 12.5px;
|
|
13272
|
+
font-size: var(--ds-cli-block-fs-mono-halfrung);
|
|
13486
13273
|
line-height: 1.6;
|
|
13487
13274
|
color: var(--panel-text);
|
|
13488
13275
|
box-shadow: var(--panel-shadow);
|
|
@@ -13555,18 +13342,11 @@
|
|
|
13555
13342
|
color: var(--panel-text-2);
|
|
13556
13343
|
border: 1px solid var(--panel-3);
|
|
13557
13344
|
font-size: 0.7rem;
|
|
13558
|
-
|
|
13559
|
-
|
|
13560
|
-
when a doc site scales root font-size. A px rung would decouple them. */
|
|
13561
|
-
padding: 0.15rem 0.5rem;
|
|
13345
|
+
--tag-inset-rem-coupled-to-root-fontsize: 0.15rem 0.5rem;
|
|
13346
|
+
padding: var(--tag-inset-rem-coupled-to-root-fontsize);
|
|
13562
13347
|
border-radius: var(--r-hair);
|
|
13563
13348
|
font-family: var(--ff-mono);
|
|
13564
13349
|
}
|
|
13565
|
-
/* Attributed callout — an editorial pull-quote (it carries a .who byline), so
|
|
13566
|
-
the left accent is DELIBERATE, not the generic alert stripe. Expressed via
|
|
13567
|
-
the house .panel-spine idiom (absolute ::before rail at --bw-chunk, squared
|
|
13568
|
-
leading corners) instead of a raw 3px border-left, so it stays on the border
|
|
13569
|
-
scale and matches the spine primitive in panel-row.css. */
|
|
13570
13350
|
.ds-247420 .ds-prose .gm-callout {
|
|
13571
13351
|
position: relative;
|
|
13572
13352
|
margin: var(--space-3-5) 0;
|
|
@@ -13581,23 +13361,11 @@
|
|
|
13581
13361
|
width: var(--bw-chunk); background: var(--panel-accent);
|
|
13582
13362
|
border-radius: var(--bw-chunk) 0 0 var(--bw-chunk);
|
|
13583
13363
|
}
|
|
13584
|
-
/* Joins the small-label voice above; only its own box properties here. */
|
|
13585
13364
|
.ds-247420 .ds-prose .gm-callout .who {
|
|
13586
13365
|
display: block;
|
|
13587
13366
|
margin-bottom: var(--space-1);
|
|
13588
13367
|
}
|
|
13589
13368
|
|
|
13590
|
-
/* .ds-prose-endnote — the closing line of an article ("end. reply by opening a
|
|
13591
|
-
pr."), set off from the body it terminates. Quieter and smaller than prose:
|
|
13592
|
-
it takes the mono face and the --panel-text-2 tone that this sheet's other
|
|
13593
|
-
ancillary voices use (.toc a, .gm-callout .who, .card .desc), so the endnote
|
|
13594
|
-
reads as chrome around the article rather than a final paragraph of it. The
|
|
13595
|
-
generous --space-5 lead is what does the "set off" — it breaks the paragraph
|
|
13596
|
-
rhythm so the eye registers the piece has ended before reading the words.
|
|
13597
|
-
Sized at --fs-xs rather than the --fs-nano label rung: this is a readable
|
|
13598
|
-
sentence with a link in it, not an uppercase micro-label.
|
|
13599
|
-
Replaces the inline style ui_kits/blog carried before the inline-style
|
|
13600
|
-
sweep, which named this class without ever defining it. */
|
|
13601
13369
|
.ds-247420 .ds-prose .ds-prose-endnote,
|
|
13602
13370
|
.ds-247420 .ds-prose-endnote {
|
|
13603
13371
|
margin-top: var(--space-5);
|
|
@@ -13607,9 +13375,6 @@
|
|
|
13607
13375
|
line-height: 1.6;
|
|
13608
13376
|
color: var(--panel-text-2);
|
|
13609
13377
|
}
|
|
13610
|
-
/* The endnote's link keeps the prose accent but stays in the quiet register —
|
|
13611
|
-
--panel-accent is the panel-ramp counterpart of --accent-ink (a readable
|
|
13612
|
-
TEXT tone), never the bare --accent fill, which is ~1.07:1 on paper. */
|
|
13613
13378
|
.ds-247420 .ds-prose-endnote a { color: var(--panel-accent); text-decoration: none; }
|
|
13614
13379
|
.ds-247420 .ds-prose-endnote a:hover { text-decoration: underline; }
|
|
13615
13380
|
|