@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.
@@ -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: 20px;
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
- .setup__getcode-summary { cursor: pointer; font-weight: 600; font-size: 13px; }
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: 10px; }
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: 4px 14px;
2058
- align-items: center;
2059
- background: var(--surface);
2060
- border: 1px solid var(--border);
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: 12px 16px;
2063
- }
2064
- .task__id { color: var(--ink-faint); font-variant-numeric: tabular-nums; font-size: 13px; display: flex; align-items: center; gap: 6px; }
2065
- /* task 1759: the work-board multi-select checkbox, hosted in the id cell so no
2066
- grid column needs to shift. Sized up slightly from a native default checkbox
2067
- so it's an easy target next to the small id text. */
2068
- .task__select { width: 15px; height: 15px; cursor: pointer; accent-color: var(--accent); flex: none; }
2069
- .task--selected { border-color: var(--accent); background: var(--accent-weak); }
2070
- /* task 1869: the explicit open-detail hitbox — clicking the card body now
2071
- toggles selection, so this small icon button is the only way in from a
2072
- claimable card to the task-detail overlay. */
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: 18px;
2076
- height: 18px;
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(--surface-2); }
2089
- .task__body { min-width: 0; }
2090
- .task__title { font-weight: 600; font-size: 13.5px; margin: 0; }
2091
- .task__meta { display: flex; flex-wrap: wrap; gap: 4px 10px; font-size: 12px; color: var(--ink-faint); margin-top: 2px; }
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
- height: 18px;
2096
- padding: 0 8px;
2097
- border-radius: 999px;
2098
- background: var(--surface-2);
2099
- border: 1px solid var(--border);
2100
- font-size: 11px;
2101
- font-weight: 500;
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 { text-align: right; }
2105
- .task__credits-num { font-weight: 650; font-variant-numeric: tabular-nums; font-size: 15px; }
2106
- .task__credits-label { font-size: 11px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-faint); }
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
- border: 1px solid var(--border-strong);
2109
- background: var(--surface);
2110
- color: var(--ink-soft);
2111
- border-radius: var(--radius-sm);
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: 4px 10px;
2238
+ padding: 0;
2114
2239
  cursor: pointer;
2115
2240
  }
2116
- .task__copy:hover { background: var(--surface-2); }
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: 4px; }
2244
+ .task__copy-icon { margin-right: 0; }
2119
2245
 
2120
2246
  @media (max-width: 640px) {
2121
- .task { grid-template-columns: auto minmax(0, 1fr); }
2122
- .task__credits { grid-column: 2; text-align: left; }
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: 14px 0 6px; font-size: 12px; font-weight: 600;
2394
- text-transform: uppercase; letter-spacing: 0.04em; color: var(--ink-faint);
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: two-column main zone on wide screens — Home reads as a
2507
- dashboard, not a stack. The attention inbox (and the More row) span both
2508
- columns; the home-main cards sit side by side. Mirrors the
2509
- .view-zone--band grid idiom (cards drop their own margins inside a grid). */
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". Quiet rows, accented title, one foot link. */
2521
- .next-up { list-style: none; margin: 0 0 4px; padding: 0; display: flex; flex-direction: column; gap: 8px; }
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: 10px 14px;
2527
- border: 0;
2528
- border-radius: var(--radius-sm);
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-up__title { font-weight: 500; font-size: 13.5px; color: var(--ink); }
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: 12px; color: var(--ink-faint); font-variant-numeric: tabular-nums; }
2534
- .next-up__foot { margin: 0 0 14px; font-size: 13px; }
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 —