@bongos/core 1.19.988 → 1.19.989
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 +12 -12
- package/docs/module-api-changelog.md +2 -0
- package/modules/hall-ui/public/style.css +172 -0
- package/modules/hall-ui/public/work.css +1 -170
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/src/module-api.js +1 -1
- package/tests/hall_board_world.mjs +9 -2
package/.bongos-core.json
CHANGED
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.989",
|
|
6
|
+
"core_contract": "1.19.989",
|
|
7
|
+
"source_commit": "e2ff7b827391116e3e99f4b850441ca7482a3466",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-09-23T19:
|
|
9
|
+
"built_at": "2026-09-23T19:44:16.401Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
12
|
"docs_redacted": 518,
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
19
|
"file_count": 2938,
|
|
20
|
-
"tree_sha256": "
|
|
20
|
+
"tree_sha256": "65dea20f4453b26ed36b673a7a34da0008c338d0f4307aa1b327f3171ce42cb0",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/ask-for-help/SKILL.md",
|
|
@@ -2712,7 +2712,7 @@
|
|
|
2712
2712
|
{
|
|
2713
2713
|
"path": "docs/module-api-changelog.md",
|
|
2714
2714
|
"mode": "0000644",
|
|
2715
|
-
"sha256": "
|
|
2715
|
+
"sha256": "b06d9ffcfde6e55a0997ffa926a671d0f53478d5e7c351b92374485e359cc0cd"
|
|
2716
2716
|
},
|
|
2717
2717
|
{
|
|
2718
2718
|
"path": "docs/modules-contract.md",
|
|
@@ -5407,7 +5407,7 @@
|
|
|
5407
5407
|
{
|
|
5408
5408
|
"path": "modules/hall-ui/public/style.css",
|
|
5409
5409
|
"mode": "0000644",
|
|
5410
|
-
"sha256": "
|
|
5410
|
+
"sha256": "b8a9b64e1febe57eddbb1005335712a19e581e69d16bb42346eba24bd73acfb7"
|
|
5411
5411
|
},
|
|
5412
5412
|
{
|
|
5413
5413
|
"path": "modules/hall-ui/public/task-detail.js",
|
|
@@ -5492,7 +5492,7 @@
|
|
|
5492
5492
|
{
|
|
5493
5493
|
"path": "modules/hall-ui/public/work.css",
|
|
5494
5494
|
"mode": "0000644",
|
|
5495
|
-
"sha256": "
|
|
5495
|
+
"sha256": "68399594a00fdffaf9833d3105d8c9e2f5872642b0f49868edae6cc526fa9021"
|
|
5496
5496
|
},
|
|
5497
5497
|
{
|
|
5498
5498
|
"path": "modules/hall-ui/public/work.html",
|
|
@@ -8162,12 +8162,12 @@
|
|
|
8162
8162
|
{
|
|
8163
8163
|
"path": "package-lock.json",
|
|
8164
8164
|
"mode": "0000644",
|
|
8165
|
-
"sha256": "
|
|
8165
|
+
"sha256": "09936259916688c880c3c787419714a83a798ccf7fd09b50d7fe26d3d293e600"
|
|
8166
8166
|
},
|
|
8167
8167
|
{
|
|
8168
8168
|
"path": "package.json",
|
|
8169
8169
|
"mode": "0000644",
|
|
8170
|
-
"sha256": "
|
|
8170
|
+
"sha256": "126708cbc785a14f0cf42ef0a151889033a852f1a331e6ab73b0c75743f41856"
|
|
8171
8171
|
},
|
|
8172
8172
|
{
|
|
8173
8173
|
"path": "public-docs/index.html",
|
|
@@ -10202,7 +10202,7 @@
|
|
|
10202
10202
|
{
|
|
10203
10203
|
"path": "src/module-api.js",
|
|
10204
10204
|
"mode": "0000644",
|
|
10205
|
-
"sha256": "
|
|
10205
|
+
"sha256": "5ed09f42ce4e04ca5f27bc3d4004ceab18bf604bd8a8fca72648afbf389b0935"
|
|
10206
10206
|
},
|
|
10207
10207
|
{
|
|
10208
10208
|
"path": "src/module-loader/catalog.js",
|
|
@@ -12077,7 +12077,7 @@
|
|
|
12077
12077
|
{
|
|
12078
12078
|
"path": "tests/hall_board_world.mjs",
|
|
12079
12079
|
"mode": "0000644",
|
|
12080
|
-
"sha256": "
|
|
12080
|
+
"sha256": "48c6176c97d4cc167c57aeaf77baa78667731125c5ff2369564f08cbe9a146c7"
|
|
12081
12081
|
},
|
|
12082
12082
|
{
|
|
12083
12083
|
"path": "tests/hall_builders_page_pass.mjs",
|
|
@@ -2450,5 +2450,7 @@ is load-bearing: the script throws rather than guess if it is missing, and
|
|
|
2450
2450
|
landed since 1.19.986 with no explicit bump. run 35906802480. (task 1002620)
|
|
2451
2451
|
1.19.988 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2452
2452
|
landed since 1.19.987 with no explicit bump. run 35909292753. (task 1002620)
|
|
2453
|
+
1.19.989 — CI auto-patch (publish-on-merge, ADR 0161): carrier for merges
|
|
2454
|
+
landed since 1.19.988 with no explicit bump. run 35911149318. (task 1002620)
|
|
2453
2455
|
---------------------------------------------------------------------------
|
|
2454
2456
|
```
|
|
@@ -2661,6 +2661,178 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
2661
2661
|
text-transform: var(--label-case);
|
|
2662
2662
|
color: var(--ink-soft);
|
|
2663
2663
|
}
|
|
2664
|
+
/* How old the task is (task 1002955, OTBKit.ageChipHtml). Quiet by default —
|
|
2665
|
+
it's orientation, not a call to act — but a task past the stale threshold
|
|
2666
|
+
steps up from faint to soft so a queue that has been sitting reads at a
|
|
2667
|
+
glance. The exact date is on the tooltip, hence `cursor: help`. Deliberately
|
|
2668
|
+
NOT --warn: that token is the verification vocabulary and as bare text on the
|
|
2669
|
+
dark card it loses contrast. --ink-soft steps up legibly in both modes. */
|
|
2670
|
+
.task__age {
|
|
2671
|
+
font-family: var(--font-mono);
|
|
2672
|
+
font-size: 11.5px;
|
|
2673
|
+
font-variant-numeric: tabular-nums;
|
|
2674
|
+
color: var(--ink-faint);
|
|
2675
|
+
white-space: nowrap;
|
|
2676
|
+
cursor: help;
|
|
2677
|
+
}
|
|
2678
|
+
.task__age--stale { color: var(--ink-soft); }
|
|
2679
|
+
|
|
2680
|
+
/* The four tag variants that carry meaning beyond "a fact". Each keeps the
|
|
2681
|
+
outlined shape style.css gives .task__tag and only changes what it says. */
|
|
2682
|
+
.task__tag--newcomer {
|
|
2683
|
+
background: var(--ok-weak);
|
|
2684
|
+
color: var(--ok);
|
|
2685
|
+
border-color: color-mix(in srgb, var(--ok) 30%, transparent);
|
|
2686
|
+
}
|
|
2687
|
+
.task__tag--mine {
|
|
2688
|
+
background: var(--accent-tint);
|
|
2689
|
+
color: var(--accent-ink);
|
|
2690
|
+
border-color: color-mix(in srgb, var(--accent) 35%, transparent);
|
|
2691
|
+
}
|
|
2692
|
+
/* task 1498 / ADR 0084: per-task rank floor. Outlined + emphasized (not a
|
|
2693
|
+
filled tag) so a gated task reads as "authority required", distinct from the
|
|
2694
|
+
filled newcomer tag. --warn is the verification vocabulary, kept on purpose. */
|
|
2695
|
+
.task__tag--rank {
|
|
2696
|
+
background: transparent;
|
|
2697
|
+
color: var(--warn);
|
|
2698
|
+
border-color: color-mix(in srgb, var(--warn) 45%, transparent);
|
|
2699
|
+
}
|
|
2700
|
+
/* task 1752: the open (no floor) state — muted so "Any rank" reads as "open to
|
|
2701
|
+
all", not as a warning like the gated --rank tag above. */
|
|
2702
|
+
.task__tag--rank-open {
|
|
2703
|
+
background: transparent;
|
|
2704
|
+
color: var(--ink-faint);
|
|
2705
|
+
border-color: var(--rule-soft);
|
|
2706
|
+
}
|
|
2707
|
+
/* ---- #616 / task 2170 / task 1003304: claim + copy on the claimable card ----
|
|
2708
|
+
The card's geometry, tags, credits figure, checkbox and copy button all live
|
|
2709
|
+
in this work-board section (they are the re-skin), and so do the primary door,
|
|
2710
|
+
the touches chip and the whole-card selection target (promoted from work.css,
|
|
2711
|
+
task 1003659, so their cascade position is the same on every page). */
|
|
2712
|
+
|
|
2713
|
+
/* The page's one primary action, and the only accent FILL on the board.
|
|
2714
|
+
--accent-on is the dark ink that goes on the salmon: white on it fails AA and
|
|
2715
|
+
DESIGN.md bans it outright, which is what the old `color: #fff` was. */
|
|
2716
|
+
.task__claim {
|
|
2717
|
+
display: inline-flex;
|
|
2718
|
+
align-items: center;
|
|
2719
|
+
justify-content: center;
|
|
2720
|
+
min-height: 34px;
|
|
2721
|
+
min-width: 74px;
|
|
2722
|
+
padding: 0 16px;
|
|
2723
|
+
background: var(--accent);
|
|
2724
|
+
border: 0;
|
|
2725
|
+
color: var(--accent-on);
|
|
2726
|
+
border-radius: var(--radius-pill);
|
|
2727
|
+
font-size: 13.5px;
|
|
2728
|
+
font-weight: 500;
|
|
2729
|
+
text-transform: lowercase;
|
|
2730
|
+
cursor: pointer;
|
|
2731
|
+
white-space: nowrap;
|
|
2732
|
+
transition: background 150ms, opacity 150ms;
|
|
2733
|
+
}
|
|
2734
|
+
.task__claim:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); }
|
|
2735
|
+
.task__claim:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
|
|
2736
|
+
|
|
2737
|
+
/* Files a claimable task is responsible for — a compact count chip in the meta
|
|
2738
|
+
row; the full path list rides the tooltip (task 2170 density pass). The mono
|
|
2739
|
+
fact voice: this is a number the ledger produced. */
|
|
2740
|
+
.task__touches {
|
|
2741
|
+
font-family: var(--font-mono);
|
|
2742
|
+
font-size: 11.5px;
|
|
2743
|
+
font-variant-numeric: tabular-nums;
|
|
2744
|
+
color: var(--ink-faint);
|
|
2745
|
+
white-space: nowrap;
|
|
2746
|
+
cursor: help;
|
|
2747
|
+
}
|
|
2748
|
+
|
|
2749
|
+
/* task 1753: the whole card is clickable → toggles selection (task 1869). */
|
|
2750
|
+
.task { cursor: pointer; }
|
|
2751
|
+
|
|
2752
|
+
@media (max-width: 640px) {
|
|
2753
|
+
.task__actions { grid-column: 1 / -1; justify-self: start; padding-top: 6px; }
|
|
2754
|
+
}
|
|
2755
|
+
|
|
2756
|
+
/* ---- task 1759: the bottom bulk-action toolbar (promoted from work.css, task 1003659) ---- */
|
|
2757
|
+
.bulk-toolbar {
|
|
2758
|
+
position: fixed;
|
|
2759
|
+
left: var(--sidebar-w);
|
|
2760
|
+
right: 0;
|
|
2761
|
+
bottom: 0;
|
|
2762
|
+
/* The chrome tier, not above it: the toast (z 100) has to stay readable over
|
|
2763
|
+
this bar, and the drawer + its scrim have to cover it. */
|
|
2764
|
+
z-index: var(--z-topbar);
|
|
2765
|
+
display: flex;
|
|
2766
|
+
align-items: center;
|
|
2767
|
+
gap: 16px;
|
|
2768
|
+
flex-wrap: wrap;
|
|
2769
|
+
padding: 12px 20px;
|
|
2770
|
+
/* TWO layers, and the bottom one is why. The topbar and the rail can be bare
|
|
2771
|
+
--glass because the page GROUND is behind them; this bar sits over the task
|
|
2772
|
+
cards, and in light --glass is a 5% ink tint with the blur at 0px, so the
|
|
2773
|
+
card underneath read straight through it and the buttons landed on top of a
|
|
2774
|
+
task title (looked at, 1280w light). Painting --bg under the tint makes the
|
|
2775
|
+
bar opaque without giving up the glass character or spending a literal. */
|
|
2776
|
+
background: linear-gradient(var(--glass), var(--glass)), var(--bg);
|
|
2777
|
+
border-top: var(--line) solid var(--glass-edge);
|
|
2778
|
+
backdrop-filter: blur(var(--glass-blur));
|
|
2779
|
+
-webkit-backdrop-filter: blur(var(--glass-blur));
|
|
2780
|
+
color: var(--ink);
|
|
2781
|
+
}
|
|
2782
|
+
.bulk-toolbar[hidden] { display: none; }
|
|
2783
|
+
.bulk-toolbar__count {
|
|
2784
|
+
font-family: var(--label-face);
|
|
2785
|
+
font-size: var(--label-size);
|
|
2786
|
+
letter-spacing: var(--label-space);
|
|
2787
|
+
text-transform: var(--label-case);
|
|
2788
|
+
color: var(--ink);
|
|
2789
|
+
white-space: nowrap;
|
|
2790
|
+
}
|
|
2791
|
+
.bulk-toolbar__actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-left: auto; }
|
|
2792
|
+
.bulk-toolbar__btn {
|
|
2793
|
+
display: inline-flex;
|
|
2794
|
+
align-items: center;
|
|
2795
|
+
justify-content: center;
|
|
2796
|
+
min-height: 30px;
|
|
2797
|
+
padding: 0 14px;
|
|
2798
|
+
background: var(--glass);
|
|
2799
|
+
border: var(--line) solid var(--glass-edge);
|
|
2800
|
+
color: var(--ink);
|
|
2801
|
+
border-radius: var(--radius-pill);
|
|
2802
|
+
font-size: 13px;
|
|
2803
|
+
text-transform: lowercase;
|
|
2804
|
+
cursor: pointer;
|
|
2805
|
+
white-space: nowrap;
|
|
2806
|
+
transition: background 150ms, opacity 150ms;
|
|
2807
|
+
}
|
|
2808
|
+
.bulk-toolbar__btn:hover:not(:disabled) { background: var(--glass-strong); }
|
|
2809
|
+
.bulk-toolbar__btn:disabled { color: var(--ink-faint); border-color: var(--rule-soft); cursor: not-allowed; }
|
|
2810
|
+
.bulk-toolbar__clear {
|
|
2811
|
+
min-height: 30px;
|
|
2812
|
+
padding: 0 10px;
|
|
2813
|
+
background: transparent;
|
|
2814
|
+
border: none;
|
|
2815
|
+
color: var(--ink-soft);
|
|
2816
|
+
font-size: 13px;
|
|
2817
|
+
text-transform: lowercase;
|
|
2818
|
+
text-decoration: underline;
|
|
2819
|
+
text-underline-offset: 4px;
|
|
2820
|
+
cursor: pointer;
|
|
2821
|
+
}
|
|
2822
|
+
.bulk-toolbar__clear:hover { color: var(--ink); }
|
|
2823
|
+
|
|
2824
|
+
/* The shell's .app-content already ends in 108px of bottom air at desktop
|
|
2825
|
+
width, which is what clears the bar — but at 768 it drops to 48px for the
|
|
2826
|
+
phone, and there the bar is TALLER (its actions wrap to their own row). So
|
|
2827
|
+
the phone width buys the room back, scoped to this page: goals.html loads
|
|
2828
|
+
this sheet too and has no bulk toolbar to clear. */
|
|
2829
|
+
@media (max-width: 768px) {
|
|
2830
|
+
/* At the drawer breakpoint the sidebar leaves the flow, so the bar spans. */
|
|
2831
|
+
.bulk-toolbar { left: 0; padding: 10px 14px; gap: 10px; }
|
|
2832
|
+
.bulk-toolbar__actions { margin-left: 0; width: 100%; }
|
|
2833
|
+
body[data-page="work"] .app-content { padding-bottom: 200px; }
|
|
2834
|
+
}
|
|
2835
|
+
|
|
2664
2836
|
.task__credits { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; padding-top: 2px; }
|
|
2665
2837
|
/* A credit figure is DATA, not live — the display face in ink, never accent
|
|
2666
2838
|
(DESIGN.md, The One Warm Thing Rule + The Tabular Rule). */
|
|
@@ -46,93 +46,6 @@
|
|
|
46
46
|
color: var(--ink-faint);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
/* ---- #616 / task 2170 / task 1003304: claim + copy on the claimable card ----
|
|
50
|
-
The card's geometry, tags, credits figure, checkbox and copy button all live
|
|
51
|
-
in style.css's work-board section now (they are the re-skin). What stays here
|
|
52
|
-
is the page-local behaviour: the primary door, the two meta chips, and the
|
|
53
|
-
fact that the whole card is a selection target. */
|
|
54
|
-
|
|
55
|
-
/* The page's one primary action, and the only accent FILL on the board.
|
|
56
|
-
--accent-on is the dark ink that goes on the salmon: white on it fails AA and
|
|
57
|
-
DESIGN.md bans it outright, which is what the old `color: #fff` was. */
|
|
58
|
-
.task__claim {
|
|
59
|
-
display: inline-flex;
|
|
60
|
-
align-items: center;
|
|
61
|
-
justify-content: center;
|
|
62
|
-
min-height: 34px;
|
|
63
|
-
min-width: 74px;
|
|
64
|
-
padding: 0 16px;
|
|
65
|
-
background: var(--accent);
|
|
66
|
-
border: 0;
|
|
67
|
-
color: var(--accent-on);
|
|
68
|
-
border-radius: var(--radius-pill);
|
|
69
|
-
font-size: 13.5px;
|
|
70
|
-
font-weight: 500;
|
|
71
|
-
text-transform: lowercase;
|
|
72
|
-
cursor: pointer;
|
|
73
|
-
white-space: nowrap;
|
|
74
|
-
transition: background 150ms, opacity 150ms;
|
|
75
|
-
}
|
|
76
|
-
.task__claim:hover:not(:disabled) { background: var(--accent-lift); color: var(--accent-on); }
|
|
77
|
-
.task__claim:disabled { background: var(--glass); color: var(--ink-faint); cursor: default; }
|
|
78
|
-
|
|
79
|
-
/* Files a claimable task is responsible for — a compact count chip in the meta
|
|
80
|
-
row; the full path list rides the tooltip (task 2170 density pass). The mono
|
|
81
|
-
fact voice: this is a number the ledger produced. */
|
|
82
|
-
.task__touches {
|
|
83
|
-
font-family: var(--font-mono);
|
|
84
|
-
font-size: 11.5px;
|
|
85
|
-
font-variant-numeric: tabular-nums;
|
|
86
|
-
color: var(--ink-faint);
|
|
87
|
-
white-space: nowrap;
|
|
88
|
-
cursor: help;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/* How old the task is (task 1002955, OTBKit.ageChipHtml). Quiet by default —
|
|
92
|
-
it's orientation, not a call to act — but a task past the stale threshold
|
|
93
|
-
steps up from faint to soft so a queue that has been sitting reads at a
|
|
94
|
-
glance. The exact date is on the tooltip, hence `cursor: help`. Deliberately
|
|
95
|
-
NOT --warn: that token is the verification vocabulary and as bare text on the
|
|
96
|
-
dark card it loses contrast. --ink-soft steps up legibly in both modes. */
|
|
97
|
-
.task__age {
|
|
98
|
-
font-family: var(--font-mono);
|
|
99
|
-
font-size: 11.5px;
|
|
100
|
-
font-variant-numeric: tabular-nums;
|
|
101
|
-
color: var(--ink-faint);
|
|
102
|
-
white-space: nowrap;
|
|
103
|
-
cursor: help;
|
|
104
|
-
}
|
|
105
|
-
.task__age--stale { color: var(--ink-soft); }
|
|
106
|
-
|
|
107
|
-
/* The three tag variants that carry meaning beyond "a fact". Each keeps the
|
|
108
|
-
outlined shape style.css gives .task__tag and only changes what it says. */
|
|
109
|
-
.task__tag--newcomer {
|
|
110
|
-
background: var(--ok-weak);
|
|
111
|
-
color: var(--ok);
|
|
112
|
-
border-color: color-mix(in srgb, var(--ok) 30%, transparent);
|
|
113
|
-
}
|
|
114
|
-
.task__tag--mine {
|
|
115
|
-
background: var(--accent-tint);
|
|
116
|
-
color: var(--accent-ink);
|
|
117
|
-
border-color: color-mix(in srgb, var(--accent) 35%, transparent);
|
|
118
|
-
}
|
|
119
|
-
/* task 1498 / ADR 0084: per-task rank floor. Outlined + emphasized (not a
|
|
120
|
-
filled tag) so a gated task reads as "authority required", distinct from the
|
|
121
|
-
filled newcomer tag. --warn is the verification vocabulary, kept on purpose. */
|
|
122
|
-
.task__tag--rank {
|
|
123
|
-
background: transparent;
|
|
124
|
-
color: var(--warn);
|
|
125
|
-
border-color: color-mix(in srgb, var(--warn) 45%, transparent);
|
|
126
|
-
}
|
|
127
|
-
/* task 1752: the open (no floor) state — muted so "Any rank" reads as "open to
|
|
128
|
-
all", not as a warning like the gated --rank tag above. */
|
|
129
|
-
.task__tag--rank-open {
|
|
130
|
-
background: transparent;
|
|
131
|
-
color: var(--ink-faint);
|
|
132
|
-
border-color: var(--rule-soft);
|
|
133
|
-
}
|
|
134
|
-
/* task 1753: the whole card is clickable → toggles selection (task 1869). */
|
|
135
|
-
.task { cursor: pointer; }
|
|
136
49
|
.backlog-count {
|
|
137
50
|
font-family: var(--font-mono);
|
|
138
51
|
font-size: 11px;
|
|
@@ -205,11 +118,8 @@
|
|
|
205
118
|
.history__goal { display: inline-block; margin-top: 3px; color: var(--ink-soft); font-size: 12.5px; }
|
|
206
119
|
.history__when { color: var(--ink-soft); font-size: 12.5px; white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
207
120
|
|
|
208
|
-
@media (max-width: 640px) {
|
|
209
|
-
.task__actions { grid-column: 1 / -1; justify-self: start; padding-top: 6px; }
|
|
210
|
-
}
|
|
211
121
|
|
|
212
|
-
/* ---- task 1759: multi-select
|
|
122
|
+
/* ---- task 1759: multi-select checkbox (the toolbar itself is in style.css) ----
|
|
213
123
|
Re-cut for the 24px floor and the world (task 1003304). The floating dark
|
|
214
124
|
pill is gone: it painted an INVERTED surface (background: var(--ink)) with
|
|
215
125
|
three rgba(255,255,255,…) literals on top, which was correct only for as long
|
|
@@ -250,85 +160,6 @@
|
|
|
250
160
|
transform: rotate(42deg);
|
|
251
161
|
}
|
|
252
162
|
|
|
253
|
-
.bulk-toolbar {
|
|
254
|
-
position: fixed;
|
|
255
|
-
left: var(--sidebar-w);
|
|
256
|
-
right: 0;
|
|
257
|
-
bottom: 0;
|
|
258
|
-
/* The chrome tier, not above it: the toast (z 100) has to stay readable over
|
|
259
|
-
this bar, and the drawer + its scrim have to cover it. */
|
|
260
|
-
z-index: var(--z-topbar);
|
|
261
|
-
display: flex;
|
|
262
|
-
align-items: center;
|
|
263
|
-
gap: 16px;
|
|
264
|
-
flex-wrap: wrap;
|
|
265
|
-
padding: 12px 20px;
|
|
266
|
-
/* TWO layers, and the bottom one is why. The topbar and the rail can be bare
|
|
267
|
-
--glass because the page GROUND is behind them; this bar sits over the task
|
|
268
|
-
cards, and in light --glass is a 5% ink tint with the blur at 0px, so the
|
|
269
|
-
card underneath read straight through it and the buttons landed on top of a
|
|
270
|
-
task title (looked at, 1280w light). Painting --bg under the tint makes the
|
|
271
|
-
bar opaque without giving up the glass character or spending a literal. */
|
|
272
|
-
background: linear-gradient(var(--glass), var(--glass)), var(--bg);
|
|
273
|
-
border-top: var(--line) solid var(--glass-edge);
|
|
274
|
-
backdrop-filter: blur(var(--glass-blur));
|
|
275
|
-
-webkit-backdrop-filter: blur(var(--glass-blur));
|
|
276
|
-
color: var(--ink);
|
|
277
|
-
}
|
|
278
|
-
.bulk-toolbar[hidden] { display: none; }
|
|
279
|
-
.bulk-toolbar__count {
|
|
280
|
-
font-family: var(--label-face);
|
|
281
|
-
font-size: var(--label-size);
|
|
282
|
-
letter-spacing: var(--label-space);
|
|
283
|
-
text-transform: var(--label-case);
|
|
284
|
-
color: var(--ink);
|
|
285
|
-
white-space: nowrap;
|
|
286
|
-
}
|
|
287
|
-
.bulk-toolbar__actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-left: auto; }
|
|
288
|
-
.bulk-toolbar__btn {
|
|
289
|
-
display: inline-flex;
|
|
290
|
-
align-items: center;
|
|
291
|
-
justify-content: center;
|
|
292
|
-
min-height: 30px;
|
|
293
|
-
padding: 0 14px;
|
|
294
|
-
background: var(--glass);
|
|
295
|
-
border: var(--line) solid var(--glass-edge);
|
|
296
|
-
color: var(--ink);
|
|
297
|
-
border-radius: var(--radius-pill);
|
|
298
|
-
font-size: 13px;
|
|
299
|
-
text-transform: lowercase;
|
|
300
|
-
cursor: pointer;
|
|
301
|
-
white-space: nowrap;
|
|
302
|
-
transition: background 150ms, opacity 150ms;
|
|
303
|
-
}
|
|
304
|
-
.bulk-toolbar__btn:hover:not(:disabled) { background: var(--glass-strong); }
|
|
305
|
-
.bulk-toolbar__btn:disabled { color: var(--ink-faint); border-color: var(--rule-soft); cursor: not-allowed; }
|
|
306
|
-
.bulk-toolbar__clear {
|
|
307
|
-
min-height: 30px;
|
|
308
|
-
padding: 0 10px;
|
|
309
|
-
background: transparent;
|
|
310
|
-
border: none;
|
|
311
|
-
color: var(--ink-soft);
|
|
312
|
-
font-size: 13px;
|
|
313
|
-
text-transform: lowercase;
|
|
314
|
-
text-decoration: underline;
|
|
315
|
-
text-underline-offset: 4px;
|
|
316
|
-
cursor: pointer;
|
|
317
|
-
}
|
|
318
|
-
.bulk-toolbar__clear:hover { color: var(--ink); }
|
|
319
|
-
|
|
320
|
-
/* The shell's .app-content already ends in 108px of bottom air at desktop
|
|
321
|
-
width, which is what clears the bar — but at 768 it drops to 48px for the
|
|
322
|
-
phone, and there the bar is TALLER (its actions wrap to their own row). So
|
|
323
|
-
the phone width buys the room back, scoped to this page: goals.html loads
|
|
324
|
-
this sheet too and has no bulk toolbar to clear. */
|
|
325
|
-
@media (max-width: 768px) {
|
|
326
|
-
/* At the drawer breakpoint the sidebar leaves the flow, so the bar spans. */
|
|
327
|
-
.bulk-toolbar { left: 0; padding: 10px 14px; gap: 10px; }
|
|
328
|
-
.bulk-toolbar__actions { margin-left: 0; width: 100%; }
|
|
329
|
-
body[data-page="work"] .app-content { padding-bottom: 200px; }
|
|
330
|
-
}
|
|
331
|
-
|
|
332
163
|
/* ---- "Only mine" lens (the board's tab-wide filter; goal board's To-do bar
|
|
333
164
|
borrows the same class) --------------------------------------------------
|
|
334
165
|
Deliberately QUIETER than the filter bar below it: a checkbox in the label
|
package/package-lock.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.989",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@bongos/core",
|
|
9
|
-
"version": "1.19.
|
|
9
|
+
"version": "1.19.989",
|
|
10
10
|
"license": "AGPL-3.0-or-later",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"express": "^4.21.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bongos/core",
|
|
3
|
-
"version": "1.19.
|
|
3
|
+
"version": "1.19.989",
|
|
4
4
|
"description": "Cloud Bongos — the AI-first build platform core (GDS + platform surfaces + module system), installed as a versioned dependency (ADR 0108).",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"main": "src/platform-server.js",
|
package/src/module-api.js
CHANGED
|
@@ -71,7 +71,7 @@ const { responsibilityFor, ROLE_RESPONSIBILITIES } = require('./role-responsibil
|
|
|
71
71
|
// there. scripts/gds/bump-version.js still rewrites the literal below; it appends
|
|
72
72
|
// the entry to that file. Look for a version's history there, not here.
|
|
73
73
|
// ---------------------------------------------------------------------------
|
|
74
|
-
const CORE_VERSION = '1.19.
|
|
74
|
+
const CORE_VERSION = '1.19.989'; // CI auto-patch carrier (ADR 0161); changelog: docs/module-api-changelog.md
|
|
75
75
|
|
|
76
76
|
// A namespaced logger so a module's log lines are attributable + consistent.
|
|
77
77
|
// Usage: const log = api.logger('dev-box'); log.info('mounted');
|
|
@@ -104,7 +104,7 @@ test('a prose link buys BOTH axes — padding for width, negative margin to give
|
|
|
104
104
|
// ---- 3. the world's own bans ------------------------------------------------
|
|
105
105
|
|
|
106
106
|
test('nothing on the board paints text white on the accent', () => {
|
|
107
|
-
const claim = rule(
|
|
107
|
+
const claim = rule(styleCss, '.task__claim');
|
|
108
108
|
assert.ok(claim, '.task__claim has a rule');
|
|
109
109
|
assert.match(claim, /background:\s*var\(--accent\)/, 'the claim button is the page\'s one accent fill');
|
|
110
110
|
assert.match(claim, /color:\s*var\(--accent-on\)/,
|
|
@@ -115,6 +115,13 @@ test('nothing on the board paints text white on the accent', () => {
|
|
|
115
115
|
'the literal this task removed must not come back');
|
|
116
116
|
});
|
|
117
117
|
|
|
118
|
+
test('the shared task + bulk-toolbar rules live in style.css (the shared base), not the page-local work.css', () => {
|
|
119
|
+
for (const sel of ['.task__age', '.task__age--stale', '.task__tag--newcomer', '.task__tag--mine', '.task__tag--rank', '.task__tag--rank-open', '.task__claim', '.task__touches', '.task', '.bulk-toolbar', '.bulk-toolbar__count', '.bulk-toolbar__actions', '.bulk-toolbar__btn', '.bulk-toolbar__clear']) {
|
|
120
|
+
assert.ok(rule(styleCss, sel), `style.css carries ${sel}, beside .task__tag`);
|
|
121
|
+
assert.equal(rule(workCss, sel), null, `work.css must not restate ${sel}`);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
118
125
|
test('work.css spends no compat alias — that was the sheet\'s removal list', () => {
|
|
119
126
|
const aliases = ['--surface', '--surface-2', '--border', '--border-strong', '--accent-weak', '--accent-text'];
|
|
120
127
|
const bare = workCss.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
@@ -124,7 +131,7 @@ test('work.css spends no compat alias — that was the sheet\'s removal list', (
|
|
|
124
131
|
});
|
|
125
132
|
|
|
126
133
|
test('the bulk toolbar carries no rgba literal and is opaque over the cards', () => {
|
|
127
|
-
const bar = rule(
|
|
134
|
+
const bar = rule(styleCss, '.bulk-toolbar');
|
|
128
135
|
assert.ok(bar, '.bulk-toolbar has a rule');
|
|
129
136
|
assert.doesNotMatch(bar, /rgba?\(/i,
|
|
130
137
|
'the three rgba(255,255,255,…) literals went with the inverted --ink surface that needed them');
|