@bongos/core 1.19.446 → 1.19.447
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/.bongos-core.json +32 -17
- package/docs/copy-inventory.md +25 -24
- package/docs/copy-registry.json +34 -25
- package/docs/module-api-changelog.md +2 -0
- package/modules/hall-ui/public/index.states.json +17 -0
- package/modules/hall-ui/public/style.css +208 -66
- package/modules/hall-ui/public/work.css +226 -100
- package/modules/hall-ui/public/work.html +14 -2
- package/modules/hall-ui/public/work.js +1 -1
- package/modules/hall-ui/public/work.states.json +19 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/hall_board_world.mjs +153 -0
|
@@ -1027,6 +1027,36 @@ main:focus { outline: none; }
|
|
|
1027
1027
|
font-size: 13px;
|
|
1028
1028
|
}
|
|
1029
1029
|
|
|
1030
|
+
/* The 24px floor for links that sit in PROSE (task 1003304). A link in a lede,
|
|
1031
|
+
a card foot or a setup hint is a real control in a line with no vertical
|
|
1032
|
+
rhythm of its own, so it renders at its 17-19px line box and fails the floor
|
|
1033
|
+
— measured on Home and the board at every width in both modes ("Roadmap"
|
|
1034
|
+
59x18, "Goals page" 69x18, "View full standing" 118x18, "primer" 37x17).
|
|
1035
|
+
DESIGN.md's footer rule is the remedy: go inline-block and buy the height
|
|
1036
|
+
back with padding, which costs the line's own leading nothing.
|
|
1037
|
+
THE FLOOR IS BOTH AXES, and that is the half worth writing down — "Git" came
|
|
1038
|
+
back 17x24, still failing, because a three-letter link is genuinely narrower
|
|
1039
|
+
than 24px. The horizontal padding buys the width and the equal negative
|
|
1040
|
+
margin gives it straight back to the layout, so the target grows and the
|
|
1041
|
+
sentence does not re-space around it.
|
|
1042
|
+
It lives here rather than in each page's sheet because these classes are the
|
|
1043
|
+
shell's, and the alternative is five identical copies as 1003305-1003308
|
|
1044
|
+
land. */
|
|
1045
|
+
.scroll__lede a,
|
|
1046
|
+
.card-foot a,
|
|
1047
|
+
.next-up__foot a,
|
|
1048
|
+
.setup__steps a,
|
|
1049
|
+
.setup__hint a,
|
|
1050
|
+
.setup__foot a {
|
|
1051
|
+
display: inline-block;
|
|
1052
|
+
min-width: 24px;
|
|
1053
|
+
min-height: 24px;
|
|
1054
|
+
padding: 3px 4px;
|
|
1055
|
+
margin: 0 -4px;
|
|
1056
|
+
line-height: 18px;
|
|
1057
|
+
text-align: center;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1030
1060
|
.pill-link,
|
|
1031
1061
|
#welcome-reopen a {
|
|
1032
1062
|
display: inline-flex;
|
|
@@ -1569,10 +1599,14 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
1569
1599
|
|
|
1570
1600
|
/* ---------- rank badges + tooltip ---------- */
|
|
1571
1601
|
|
|
1602
|
+
/* 24px, not the old 20 (task 1003304). The badge is not itself a control, but
|
|
1603
|
+
.rank-badge-stretch below covers it edge to edge and IS one — so the badge's
|
|
1604
|
+
height is the link's height, and at 20 it failed the floor on every page that
|
|
1605
|
+
renders a rank. Only the box grew; the type and the colours are untouched. */
|
|
1572
1606
|
.rank-badge {
|
|
1573
1607
|
display: inline-flex;
|
|
1574
1608
|
align-items: center;
|
|
1575
|
-
height:
|
|
1609
|
+
height: 24px;
|
|
1576
1610
|
padding: 0 9px;
|
|
1577
1611
|
border-radius: 999px;
|
|
1578
1612
|
font-size: 11.5px;
|
|
@@ -1873,6 +1907,8 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
1873
1907
|
.setup[data-config="online"] .setup__pane--online { display: block; }
|
|
1874
1908
|
.setup__steps { margin: 8px 0; padding-left: 20px; font-size: 13.5px; }
|
|
1875
1909
|
.setup__steps li { margin: 6px 0; }
|
|
1910
|
+
/* The setup panel's prose links ("Git", "Claude Code", "primer") take the
|
|
1911
|
+
shared prose-link floor rule in the cards section above (task 1003304). */
|
|
1876
1912
|
.setup__steps code {
|
|
1877
1913
|
font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
|
|
1878
1914
|
font-size: 12px;
|
|
@@ -1956,7 +1992,18 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
1956
1992
|
.setup__copy:hover { background: var(--surface-2); }
|
|
1957
1993
|
.setup__copy--copied { background: var(--ok-weak); color: var(--ok); border-color: color-mix(in srgb, var(--ok) 35%, transparent); }
|
|
1958
1994
|
.setup__getcode { margin: 10px 0; }
|
|
1959
|
-
|
|
1995
|
+
/* A <summary> is a control, so it owes the 24px floor like any other; it
|
|
1996
|
+
measured 20px tall (task 1003304). The height is bought with padding rather
|
|
1997
|
+
than a display change, because a <summary> is display:list-item by default
|
|
1998
|
+
and flex or block would silently eat its disclosure marker. */
|
|
1999
|
+
.setup__getcode-summary {
|
|
2000
|
+
cursor: pointer;
|
|
2001
|
+
font-weight: 600;
|
|
2002
|
+
font-size: 13px;
|
|
2003
|
+
min-height: 24px;
|
|
2004
|
+
padding: 3px 0;
|
|
2005
|
+
line-height: 18px;
|
|
2006
|
+
}
|
|
1960
2007
|
.setup__getcode-lede { font-size: 12.5px; color: var(--ink-soft); }
|
|
1961
2008
|
.setup__getcode-body { margin-top: 8px; }
|
|
1962
2009
|
|
|
@@ -2048,32 +2095,87 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2048
2095
|
.goal-mine__ver { font-size: 12px; color: var(--ink-faint); }
|
|
2049
2096
|
.goal-mine__foot { font-size: 13px; margin: 10px 0 0; }
|
|
2050
2097
|
|
|
2051
|
-
/* ---------- work-board task cards (work page) ----------
|
|
2098
|
+
/* ---------- work-board task cards (work page) ----------
|
|
2099
|
+
Re-skinned into the chrome world by task 1003304 (goal 1000081). In v3 "the
|
|
2100
|
+
glass hall" a claimable task IS the panel — --bg-card at the full --radius,
|
|
2101
|
+
tone separating it from the ground, no drawn edge at rest — which is why
|
|
2102
|
+
#claim-scroll in work.html is .scroll--bare: a .scroll around these would be
|
|
2103
|
+
a card inside a card. The dense LISTS on the other three tabs keep their
|
|
2104
|
+
panel and take v1's bare-ledger row inside it (direction §6). */
|
|
2052
2105
|
|
|
2053
|
-
.task-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap:
|
|
2106
|
+
.task-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; }
|
|
2054
2107
|
.task {
|
|
2055
2108
|
display: grid;
|
|
2056
2109
|
grid-template-columns: auto minmax(0, 1fr) auto auto;
|
|
2057
|
-
gap:
|
|
2058
|
-
align-items:
|
|
2059
|
-
background: var(--
|
|
2060
|
-
|
|
2110
|
+
gap: 0 18px;
|
|
2111
|
+
align-items: start;
|
|
2112
|
+
background: var(--bg-card);
|
|
2113
|
+
/* The edge is transparent at rest and spends --glass-edge on hover: v3
|
|
2114
|
+
separates by tone, and a drawn border on every row rebuilds the boxed
|
|
2115
|
+
stack the pick removed. The 1px is always there so nothing reflows. */
|
|
2116
|
+
border: var(--line) solid transparent;
|
|
2061
2117
|
border-radius: var(--radius);
|
|
2062
|
-
padding:
|
|
2063
|
-
}
|
|
2064
|
-
.
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2118
|
+
padding: 17px 22px;
|
|
2119
|
+
}
|
|
2120
|
+
.task:hover { border-color: var(--glass-edge); }
|
|
2121
|
+
.task__id { display: flex; align-items: center; gap: 2px; padding-top: 2px; }
|
|
2122
|
+
.task__num {
|
|
2123
|
+
font-family: var(--font-mono);
|
|
2124
|
+
font-size: 12.5px;
|
|
2125
|
+
font-variant-numeric: tabular-nums;
|
|
2126
|
+
color: var(--ink-faint);
|
|
2127
|
+
}
|
|
2128
|
+
/* task 1759, re-cut for the 24px floor (task 1003304): the hit area is 24px and
|
|
2129
|
+
the DRAWN box is 14px inside it. The old 15px input was the control itself,
|
|
2130
|
+
so it failed the floor at every width — painting the box with ::before is
|
|
2131
|
+
what lets the target grow without the checkbox growing with it. */
|
|
2132
|
+
.task__select {
|
|
2133
|
+
appearance: none;
|
|
2134
|
+
-webkit-appearance: none;
|
|
2135
|
+
position: relative;
|
|
2136
|
+
width: 24px;
|
|
2137
|
+
height: 24px;
|
|
2138
|
+
margin: 0;
|
|
2139
|
+
flex: none;
|
|
2140
|
+
cursor: pointer;
|
|
2141
|
+
}
|
|
2142
|
+
.task__select::before {
|
|
2143
|
+
content: "";
|
|
2144
|
+
position: absolute;
|
|
2145
|
+
left: 5px;
|
|
2146
|
+
top: 5px;
|
|
2147
|
+
width: 14px;
|
|
2148
|
+
height: 14px;
|
|
2149
|
+
border: var(--line) solid var(--rule);
|
|
2150
|
+
border-radius: 3px;
|
|
2151
|
+
}
|
|
2152
|
+
.task__select:checked::before { background: var(--accent); border-color: var(--accent); }
|
|
2153
|
+
.task__select:checked::after {
|
|
2154
|
+
content: "";
|
|
2155
|
+
position: absolute;
|
|
2156
|
+
left: 9px;
|
|
2157
|
+
top: 8px;
|
|
2158
|
+
width: 4px;
|
|
2159
|
+
height: 8px;
|
|
2160
|
+
border: solid var(--accent-on);
|
|
2161
|
+
border-width: 0 1.5px 1.5px 0;
|
|
2162
|
+
transform: rotate(42deg);
|
|
2163
|
+
}
|
|
2164
|
+
/* Selection is NOT hover. The mock draws both with --glass-edge, which reads
|
|
2165
|
+
fine on a mock with one selected row and not at all on a board whose whole
|
|
2166
|
+
point is selecting several for the bulk bar — so selection keeps an accent
|
|
2167
|
+
signal (a selected row is live, which is what the accent is for).
|
|
2168
|
+
The EDGE carries it, not a fill: --accent-tint is a 30% mix in light, and
|
|
2169
|
+
three selected rows painted with it took over the page (looked at, 1280w
|
|
2170
|
+
light). The checked box is already an accent fill on every selected row;
|
|
2171
|
+
a second one per row is what made it shout. */
|
|
2172
|
+
.task--selected { border-color: var(--accent); }
|
|
2173
|
+
/* task 1869: the explicit open-detail hitbox — clicking the card body toggles
|
|
2174
|
+
selection, so this is the only way from a claimable card into the overlay. */
|
|
2073
2175
|
.task__open {
|
|
2074
2176
|
flex: none;
|
|
2075
|
-
width:
|
|
2076
|
-
height:
|
|
2177
|
+
width: 26px;
|
|
2178
|
+
height: 26px;
|
|
2077
2179
|
display: inline-flex;
|
|
2078
2180
|
align-items: center;
|
|
2079
2181
|
justify-content: center;
|
|
@@ -2085,41 +2187,68 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2085
2187
|
cursor: pointer;
|
|
2086
2188
|
border-radius: var(--radius-sm);
|
|
2087
2189
|
}
|
|
2088
|
-
.task__open:hover { color: var(--ink); background: var(--
|
|
2089
|
-
.task__body { min-width: 0; }
|
|
2090
|
-
.task__title { font-weight:
|
|
2091
|
-
.task__meta { display: flex; flex-wrap: wrap; gap:
|
|
2190
|
+
.task__open:hover { color: var(--ink); background: var(--glass); }
|
|
2191
|
+
.task__body { min-width: 0; padding-top: 2px; }
|
|
2192
|
+
.task__title { font-weight: 400; font-size: 14.5px; line-height: 1.4; margin: 0 0 7px; color: var(--ink); }
|
|
2193
|
+
.task__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; font-size: 12px; color: var(--ink-faint); margin-top: 0; }
|
|
2194
|
+
/* The label voice, outlined — a tag is a fact about the task, never a fill. */
|
|
2092
2195
|
.task__tag {
|
|
2093
2196
|
display: inline-flex;
|
|
2094
2197
|
align-items: center;
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
font-size:
|
|
2101
|
-
|
|
2198
|
+
padding: 2px 8px;
|
|
2199
|
+
border-radius: var(--radius-pill);
|
|
2200
|
+
background: none;
|
|
2201
|
+
border: var(--line) solid var(--rule);
|
|
2202
|
+
font-family: var(--label-face);
|
|
2203
|
+
font-size: 10.5px;
|
|
2204
|
+
letter-spacing: var(--label-space);
|
|
2205
|
+
text-transform: var(--label-case);
|
|
2102
2206
|
color: var(--ink-soft);
|
|
2103
2207
|
}
|
|
2104
|
-
.task__credits {
|
|
2105
|
-
|
|
2106
|
-
.
|
|
2208
|
+
.task__credits { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; padding-top: 2px; }
|
|
2209
|
+
/* A credit figure is DATA, not live — the display face in ink, never accent
|
|
2210
|
+
(DESIGN.md, The One Warm Thing Rule + The Tabular Rule). */
|
|
2211
|
+
.task__credits-num {
|
|
2212
|
+
font-family: var(--font-display);
|
|
2213
|
+
font-weight: 300;
|
|
2214
|
+
font-size: 26px;
|
|
2215
|
+
line-height: 1;
|
|
2216
|
+
letter-spacing: -0.03em;
|
|
2217
|
+
font-variant-numeric: tabular-nums;
|
|
2218
|
+
color: var(--ink);
|
|
2219
|
+
}
|
|
2220
|
+
.task__credits-label {
|
|
2221
|
+
font-family: var(--label-face);
|
|
2222
|
+
font-size: 10px;
|
|
2223
|
+
letter-spacing: var(--label-space);
|
|
2224
|
+
text-transform: var(--label-case);
|
|
2225
|
+
color: var(--ink-faint);
|
|
2226
|
+
}
|
|
2107
2227
|
.task__copy {
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2228
|
+
display: inline-flex;
|
|
2229
|
+
align-items: center;
|
|
2230
|
+
justify-content: center;
|
|
2231
|
+
width: 32px;
|
|
2232
|
+
height: 32px;
|
|
2233
|
+
border: var(--line) solid var(--rule);
|
|
2234
|
+
background: none;
|
|
2235
|
+
color: var(--ink-faint);
|
|
2236
|
+
border-radius: var(--radius-pill);
|
|
2112
2237
|
font-size: 12.5px;
|
|
2113
|
-
padding:
|
|
2238
|
+
padding: 0;
|
|
2114
2239
|
cursor: pointer;
|
|
2115
2240
|
}
|
|
2116
|
-
.task__copy:hover {
|
|
2241
|
+
.task__copy:hover { color: var(--ink); border-color: var(--ink-faint); }
|
|
2242
|
+
/* The status vocabulary, not the accent: "copied" is a verification state. */
|
|
2117
2243
|
.task__copy[data-copied="1"] { background: var(--ok-weak); color: var(--ok); border-color: color-mix(in srgb, var(--ok) 35%, transparent); }
|
|
2118
|
-
.task__copy-icon { margin-right:
|
|
2244
|
+
.task__copy-icon { margin-right: 0; }
|
|
2119
2245
|
|
|
2120
2246
|
@media (max-width: 640px) {
|
|
2121
|
-
.task { grid-template-columns:
|
|
2122
|
-
.
|
|
2247
|
+
.task { grid-template-columns: minmax(0, 1fr) auto; gap: 6px 14px; padding: 14px 16px; }
|
|
2248
|
+
.task__id { grid-column: 1; }
|
|
2249
|
+
.task__credits { grid-column: 2; grid-row: 1; flex-direction: row; align-items: baseline; gap: 6px; }
|
|
2250
|
+
.task__credits-num { font-size: 20px; }
|
|
2251
|
+
.task__body { grid-column: 1 / -1; }
|
|
2123
2252
|
}
|
|
2124
2253
|
|
|
2125
2254
|
/* ---------- ranks page ---------- */
|
|
@@ -2389,10 +2518,21 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2389
2518
|
invitations to accept + join-requests to approve. Matches the home widgets'
|
|
2390
2519
|
card language (.scroll host); each row is body-left / actions-right. */
|
|
2391
2520
|
.ginbox { list-style: none; margin: 0 0 4px; padding: 0; }
|
|
2521
|
+
/* Home's sub-heading voice — the label token, not a hardcoded uppercase (task
|
|
2522
|
+
1003304). Taking the token is what makes it flip: --label-face resolves to
|
|
2523
|
+
the mono in light and back to the body face in dark, because mono caps read
|
|
2524
|
+
as precise on paper and thin on black. All four users of this class
|
|
2525
|
+
(hall-widgets, goal-inbox, profile-nudge, builders) are Home surfaces. */
|
|
2392
2526
|
.ginbox__sec-h {
|
|
2393
|
-
margin:
|
|
2394
|
-
|
|
2527
|
+
margin: 22px 0 10px;
|
|
2528
|
+
font-family: var(--label-face);
|
|
2529
|
+
font-size: var(--label-size);
|
|
2530
|
+
font-weight: 400;
|
|
2531
|
+
letter-spacing: var(--label-space);
|
|
2532
|
+
text-transform: var(--label-case);
|
|
2533
|
+
color: var(--ink-faint);
|
|
2395
2534
|
}
|
|
2535
|
+
.ginbox__sec-h:first-child { margin-top: 0; }
|
|
2396
2536
|
.ginbox__item {
|
|
2397
2537
|
display: flex; align-items: flex-start; gap: 12px;
|
|
2398
2538
|
padding: 9px 0; border-top: 1px solid var(--rule-soft);
|
|
@@ -2495,7 +2635,7 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2495
2635
|
.kit-collapse__summary .scroll__h { display: inline; margin: 0; }
|
|
2496
2636
|
.kit-collapse__body { margin-top: 12px; }
|
|
2497
2637
|
|
|
2498
|
-
/* ---- Home dashboard (task 2169) ---- */
|
|
2638
|
+
/* ---- Home dashboard (task 2169; re-skinned into the world by task 1003304) ---- */
|
|
2499
2639
|
/* Stat tiles are links now — inherit ink, reveal affordance on hover. */
|
|
2500
2640
|
a.stat-tile { color: inherit; }
|
|
2501
2641
|
a.stat-tile:hover { text-decoration: none; background: var(--glass); }
|
|
@@ -2503,35 +2643,37 @@ a.stat-tile:hover .stat-tile__sub { color: var(--ink-soft); }
|
|
|
2503
2643
|
/* The over-budget "More" row — one quiet line, not a card. */
|
|
2504
2644
|
.home-more { margin: 0; font-size: 13px; color: var(--ink-soft); }
|
|
2505
2645
|
|
|
2506
|
-
/* task 2184
|
|
2507
|
-
|
|
2508
|
-
columns
|
|
2509
|
-
|
|
2646
|
+
/* task 2184's two-column main zone, RETIRED by task 1003304. The zone holds
|
|
2647
|
+
the attention inbox, the More row and the overflow — all three of which
|
|
2648
|
+
already spanned both columns — plus ONE card, Your work. So the second
|
|
2649
|
+
column was always empty and the "dashboard, not a stack" it was reaching for
|
|
2650
|
+
is what #zone-home-band above actually delivers (Standing beside Goals).
|
|
2651
|
+
v3 agrees: its board mock puts the two-up in a .band and runs
|
|
2652
|
+
"Needs your attention" and "Your work" full width as sheets. One column
|
|
2653
|
+
here, and the dead half of the page goes away. */
|
|
2510
2654
|
#zone-home-main { display: grid; grid-template-columns: minmax(0, 1fr); gap: 20px; align-items: start; }
|
|
2511
2655
|
#zone-home-main > .scroll { margin: 0; }
|
|
2512
|
-
@media (min-width: 1024px) {
|
|
2513
|
-
#zone-home-main { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
2514
|
-
#zone-home-main > #attention-scroll,
|
|
2515
|
-
#zone-home-main > #home-more-row,
|
|
2516
|
-
#zone-home-main > #zone-home-overflow { grid-column: 1 / -1; }
|
|
2517
|
-
}
|
|
2518
2656
|
|
|
2519
2657
|
/* task 2184: the "Next up" slice in the Your-work card — the page's answer to
|
|
2520
|
-
"what's my next action".
|
|
2521
|
-
|
|
2658
|
+
"what's my next action". v1's bare ledger row inside v3's panel (direction
|
|
2659
|
+
§6): a hairline and the row's own air, never a filled tile — a fill here was
|
|
2660
|
+
a card inside a card, and it was the last site in the hall spending
|
|
2661
|
+
--surface-2 as a raised surface. The first row drops its rule and its top
|
|
2662
|
+
padding so the list starts flush against the panel's air. */
|
|
2663
|
+
.next-up { list-style: none; margin: 0 0 4px; padding: 0; display: flex; flex-direction: column; gap: 0; }
|
|
2522
2664
|
.next-up__item {
|
|
2523
2665
|
display: flex;
|
|
2524
2666
|
flex-direction: column;
|
|
2525
2667
|
gap: 2px;
|
|
2526
|
-
padding:
|
|
2527
|
-
border:
|
|
2528
|
-
|
|
2529
|
-
background: var(--surface-2);
|
|
2668
|
+
padding: 14px 0;
|
|
2669
|
+
border-top: var(--line) solid var(--rule-soft);
|
|
2670
|
+
background: none;
|
|
2530
2671
|
}
|
|
2531
|
-
.next-
|
|
2672
|
+
.next-up__item:first-child { border-top: 0; padding-top: 0; }
|
|
2673
|
+
.next-up__title { font-weight: 400; font-size: 14px; color: var(--ink); }
|
|
2532
2674
|
.next-up__title:hover { color: var(--accent-ink); }
|
|
2533
|
-
.next-up__meta { font-size:
|
|
2534
|
-
.next-up__foot { margin:
|
|
2675
|
+
.next-up__meta { font-family: var(--font-mono); font-size: 11.5px; color: var(--ink-faint); font-variant-numeric: tabular-nums; }
|
|
2676
|
+
.next-up__foot { margin: 14px 0 18px; font-size: 13px; }
|
|
2535
2677
|
|
|
2536
2678
|
/* ---------- jump palette (task 2178) ----------
|
|
2537
2679
|
The top-bar slot + the Ctrl/Cmd-K overlay. Styled from existing tokens only —
|