@bongos/core 1.17.2 → 1.17.3
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 +292 -32
- package/clients/bongos-client/README.md +1 -1
- package/clients/bongos-client/bongos-client.global.js +2 -0
- package/clients/bongos-client/index.cjs +2 -0
- package/clients/bongos-client/index.d.ts +4 -2
- package/clients/bongos-client/index.mjs +2 -0
- package/docs/api/openapi.json +65 -26
- package/docs/api-reference.md +3 -2
- package/modules/hall-ui/public/builders.js +96 -646
- package/modules/hall-ui/public/goal-inbox.js +67 -26
- package/modules/hall-ui/public/goals-page.js +4 -1
- package/modules/hall-ui/public/goals.html +8 -0
- package/modules/hall-ui/public/hall-kit.js +474 -0
- package/modules/hall-ui/public/hall-widgets.js +11 -15
- package/modules/hall-ui/public/instances-panel.js +24 -3
- package/modules/hall-ui/public/new-project-wizard.js +6 -5
- package/modules/hall-ui/public/style.css +125 -0
- package/modules/hall-ui/public/work.css +194 -0
- package/modules/hall-ui/public/work.html +46 -374
- package/modules/hall-ui/public/work.js +137 -102
- package/modules/lifecycle/criterion-suggest.js +80 -0
- package/modules/lifecycle/db.js +42 -5
- package/modules/lifecycle/routes/goals.js +26 -0
- package/modules/lifecycle/routes/tasks.js +21 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/hall-preview/README.md +103 -0
- package/scripts/hall-preview/fixtures/access-requests.json +1 -0
- package/scripts/hall-preview/fixtures/achievements.json +76 -0
- package/scripts/hall-preview/fixtures/analytics__builder.json +251 -0
- package/scripts/hall-preview/fixtures/audit-log.json +1 -0
- package/scripts/hall-preview/fixtures/boxes__cost-ledger.json +1 -0
- package/scripts/hall-preview/fixtures/builders__active-claims.json +1 -0
- package/scripts/hall-preview/fixtures/builders__directory.json +81 -0
- package/scripts/hall-preview/fixtures/builders__roster.json +1 -0
- package/scripts/hall-preview/fixtures/goals.json +502 -0
- package/scripts/hall-preview/fixtures/goals__25.json +96 -0
- package/scripts/hall-preview/fixtures/goals__26.json +67 -0
- package/scripts/hall-preview/fixtures/goals__3.json +103 -0
- package/scripts/hall-preview/fixtures/goals__35.json +49 -0
- package/scripts/hall-preview/fixtures/goals__conflicts.json +154 -0
- package/scripts/hall-preview/fixtures/goals__detail.json +96 -0
- package/scripts/hall-preview/fixtures/goals__inbox.json +5 -0
- package/scripts/hall-preview/fixtures/goals__requests.json +3 -0
- package/scripts/hall-preview/fixtures/grades__by-builder.json +1 -0
- package/scripts/hall-preview/fixtures/inbox.json +330 -0
- package/scripts/hall-preview/fixtures/instance.json +124 -0
- package/scripts/hall-preview/fixtures/leaderboard.json +184 -0
- package/scripts/hall-preview/fixtures/me.json +476 -0
- package/scripts/hall-preview/fixtures/me__recent-ships.json +304 -0
- package/scripts/hall-preview/fixtures/override-requests.json +1 -0
- package/scripts/hall-preview/fixtures/provisioning__fleet.json +1 -0
- package/scripts/hall-preview/fixtures/provisioning__fleet__cost-ledger.json +1 -0
- package/scripts/hall-preview/fixtures/provisioning__instances.json +1 -0
- package/scripts/hall-preview/fixtures/public__analytics__ecosystem.json +516 -0
- package/scripts/hall-preview/fixtures/public__bounty-table.json +37 -0
- package/scripts/hall-preview/fixtures/public__cost-summary.json +742 -0
- package/scripts/hall-preview/fixtures/public__estimation-drift.json +41 -0
- package/scripts/hall-preview/fixtures/public__grades.json +50 -0
- package/scripts/hall-preview/fixtures/public__progress.json +124 -0
- package/scripts/hall-preview/fixtures/public__recent-shipped.json +426 -0
- package/scripts/hall-preview/fixtures/public__repo-health.json +160 -0
- package/scripts/hall-preview/fixtures/public__repo-info.json +5 -0
- package/scripts/hall-preview/fixtures/security__docs.json +1 -0
- package/scripts/hall-preview/fixtures/security__reports.json +1 -0
- package/scripts/hall-preview/fixtures/sessions__search.json +1 -0
- package/scripts/hall-preview/fixtures/tasks.json +2420 -0
- package/scripts/hall-preview/fixtures/tasks__claimable.json +2555 -0
- package/scripts/hall-preview/fixtures/tasks__detail.json +111 -0
- package/scripts/hall-preview/fixtures/tasks__peer-votes__feed.json +330 -0
- package/scripts/hall-preview/fixtures/versions.json +89 -0
- package/scripts/hall-preview/refresh-fixtures.js +77 -0
- package/scripts/hall-preview/server.js +178 -0
- package/scripts/migrate.sh +29 -4
- package/src/bongos/optimizer.js +37 -2
- package/tests/criterion_suggest.mjs +106 -0
- package/tests/migrate_root_resolution.mjs +97 -0
|
@@ -53,13 +53,16 @@
|
|
|
53
53
|
// 0c. Quick stats — headline numbers for the Home dashboard (task 1723).
|
|
54
54
|
// Filled by builders.js: credits + karma + rank from /me (renderProfile),
|
|
55
55
|
// shipped count once the ships feed settles (renderRecentShips).
|
|
56
|
+
// task 2169: each tile is a LINK — the stat row doubles as the fastest
|
|
57
|
+
// navigation on the page (Credits → the economy doc, Shipped/Karma → the
|
|
58
|
+
// Standing sections that explain them, Rank → the ladder).
|
|
56
59
|
w('home-stats', 'Overview', 15,
|
|
57
60
|
'<h2 id="home-stats-h" class="sr-only">Overview</h2>' +
|
|
58
61
|
'<div class="stat-row" id="home-stats-row">' +
|
|
59
|
-
'<
|
|
60
|
-
'<
|
|
61
|
-
'<
|
|
62
|
-
'<
|
|
62
|
+
'<a class="stat-tile" href="/drachmae"><span class="stat-tile__label" data-currency-label="caps">Credits</span><span class="stat-tile__num" id="stat-credits">—</span></a>' +
|
|
63
|
+
'<a class="stat-tile" href="#standing"><span class="stat-tile__label">Shipped</span><span class="stat-tile__num" id="stat-shipped">—</span><span class="stat-tile__sub" id="stat-shipped-sub"></span></a>' +
|
|
64
|
+
'<a class="stat-tile" href="#standing"><span class="stat-tile__label">Karma</span><span class="stat-tile__num" id="stat-karma">—</span><span class="stat-tile__sub" id="stat-karma-sub"></span></a>' +
|
|
65
|
+
'<a class="stat-tile" href="/ranks"><span class="stat-tile__label">Rank</span><span class="stat-tile__num stat-tile__num--badge" id="stat-rank">—</span><span class="stat-tile__sub" id="stat-rank-sub"></span></a>' +
|
|
63
66
|
'</div>',
|
|
64
67
|
{ view: 'home', zone: 'home-stats', sectionClass: 'scroll scroll--bare', labelledby: 'home-stats-h', hiddenByDefault: true });
|
|
65
68
|
|
|
@@ -73,17 +76,10 @@
|
|
|
73
76
|
|
|
74
77
|
// (Goals — goals.js registers itself into the other half of the Home band.)
|
|
75
78
|
|
|
76
|
-
//
|
|
77
|
-
//
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
// links to #/idea/N — the task-detail overlay opens it with the Metic+ Discard
|
|
81
|
-
// control, so triage happens in place.
|
|
82
|
-
w('triage-inbox', 'Idea inbox', 26,
|
|
83
|
-
'<h2 id="triage-inbox-h" class="scroll__h">Idea inbox<span class="count-pill" id="triage-inbox-count" hidden></span></h2>' +
|
|
84
|
-
'<p class="scroll__lede">Open ideas awaiting triage. Open one to promote it to a task or discard it.</p>' +
|
|
85
|
-
'<ul class="triage-inbox" id="triage-inbox-list"><li class="profile__placeholder">…</li></ul>',
|
|
86
|
-
{ view: 'home', zone: 'home-main', labelledby: 'triage-inbox-h', hiddenByDefault: true });
|
|
79
|
+
// (task 2169: the idea-triage cue — task 1471 — no longer registers its own
|
|
80
|
+
// card; its rows render into the "Needs your attention" card that
|
|
81
|
+
// goal-inbox.js owns (#attention-ideas), the single landing place for every
|
|
82
|
+
// actionable item. builders.js still gates the /inbox fetch to Metic+.)
|
|
87
83
|
|
|
88
84
|
// 0e. Recent work — compact 5-row table (task 1723). Filled by builders.js
|
|
89
85
|
// renderRecentShips from the same feed as the full Your-work table.
|
|
@@ -148,9 +148,17 @@
|
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
+
// task 2169: this is the "Projects" card — instances state + the
|
|
152
|
+
// Start-a-project wizard merged. The wizard (an idle multi-step form, the
|
|
153
|
+
// page's worst length offender as its own card) renders ON DEMAND behind the
|
|
154
|
+
// header button, via window.OTBNewProject (new-project-wizard.js).
|
|
151
155
|
const SKELETON =
|
|
152
|
-
'<
|
|
153
|
-
|
|
156
|
+
'<div class="proj-head">' +
|
|
157
|
+
'<h2 id="instances-h" class="scroll__h">Projects</h2>' +
|
|
158
|
+
'<button type="button" class="btn-ghost" id="new-project-toggle" aria-expanded="false" aria-controls="new-project-mount">+ Start a project</button>' +
|
|
159
|
+
'</div>' +
|
|
160
|
+
'<p class="scroll__lede">Hosting you’ve provisioned through Cloud Bongos — each instance’s status and estimated monthly cost. Provision one right here, or with <code>bongos init</code>.</p>' +
|
|
161
|
+
'<div id="new-project-mount" hidden></div>' +
|
|
154
162
|
'<div id="instances-own-body"><div class="profile__placeholder">Loading your instances…</div></div>' +
|
|
155
163
|
'<div id="instances-fleet" hidden>' +
|
|
156
164
|
'<h3 class="scroll__h" style="font-size:1rem;margin-top:1rem">Fleet</h3>' +
|
|
@@ -161,11 +169,24 @@
|
|
|
161
169
|
function mount(hostEl) {
|
|
162
170
|
host = hostEl;
|
|
163
171
|
host.innerHTML = SKELETON;
|
|
172
|
+
const toggle = host.querySelector('#new-project-toggle');
|
|
173
|
+
const wizardMount = host.querySelector('#new-project-mount');
|
|
174
|
+
let wizardRendered = false;
|
|
175
|
+
toggle?.addEventListener('click', () => {
|
|
176
|
+
if (!wizardRendered && window.OTBNewProject) {
|
|
177
|
+
window.OTBNewProject.renderInto(wizardMount);
|
|
178
|
+
wizardRendered = true;
|
|
179
|
+
}
|
|
180
|
+
const open = wizardMount.hidden;
|
|
181
|
+
wizardMount.hidden = !open;
|
|
182
|
+
toggle.setAttribute('aria-expanded', String(open));
|
|
183
|
+
toggle.textContent = open ? '− Start a project' : '+ Start a project';
|
|
184
|
+
});
|
|
164
185
|
load();
|
|
165
186
|
}
|
|
166
187
|
|
|
167
188
|
window.OTB.contributeHallWidget({
|
|
168
|
-
id: 'instances-scroll', label: '
|
|
189
|
+
id: 'instances-scroll', label: 'Projects', order: 33,
|
|
169
190
|
module: 'provisioning', view: 'home', zone: 'home-main',
|
|
170
191
|
labelledby: 'instances-h', mount,
|
|
171
192
|
});
|
|
@@ -180,9 +180,10 @@
|
|
|
180
180
|
if (btn) btn.addEventListener('click', submit);
|
|
181
181
|
}
|
|
182
182
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
183
|
+
// task 2169: the wizard no longer registers its own always-open Home card —
|
|
184
|
+
// an idle multi-step form was the page's worst length offender. It renders
|
|
185
|
+
// on demand into the Projects card (instances-panel.js) behind its
|
|
186
|
+
// "Start a project" disclosure button. Module gating is inherited: only the
|
|
187
|
+
// provisioning-gated Projects card ever calls this.
|
|
188
|
+
window.OTBNewProject = { renderInto: mount };
|
|
188
189
|
})();
|
|
@@ -105,6 +105,22 @@ html[data-theme="dark"] body { background: var(--bg); }
|
|
|
105
105
|
html:not([data-theme]) body { background: var(--bg); }
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
/* ---------- table of contents (task 2166) ----------
|
|
109
|
+
Section banners in file order — grep "----------" to jump:
|
|
110
|
+
tokens + dark theme (ABOVE — the theming contract; never move/rename)
|
|
111
|
+
base · app shell · responsive shell · cards (.scroll) · stat tiles
|
|
112
|
+
Standing layout (section rail) · legacy page chrome compat
|
|
113
|
+
ledger tables · filters / pager / buttons · profile / standing
|
|
114
|
+
rank badges + tooltip · karma / acclaim · achievements · dev curve
|
|
115
|
+
onboarding checklist · welcome panel + setup selector · landing
|
|
116
|
+
goals · work-board task cards · ranks page
|
|
117
|
+
security / roster / admin leftovers (dead — removed by task 2179)
|
|
118
|
+
toast + overlays · misc shared bits · widget one-offs (wizard, triage,
|
|
119
|
+
goal inbox) · hall-kit components (END — the shared kit, task 2166).
|
|
120
|
+
New page-SPECIFIC styles belong in that page's own <page>.css (the
|
|
121
|
+
primer.css precedent), not here; new SHARED components join the kit
|
|
122
|
+
section at the end. */
|
|
123
|
+
|
|
108
124
|
/* ---------- base ---------- */
|
|
109
125
|
|
|
110
126
|
* { box-sizing: border-box; }
|
|
@@ -1789,3 +1805,112 @@ main [id] { scroll-margin-top: calc(var(--topbar-h) + 16px); }
|
|
|
1789
1805
|
.ginbox__note { margin: 3px 0 0; font-size: 12.5px; color: var(--ink-soft); font-style: italic; }
|
|
1790
1806
|
.ginbox__actions { flex: 0 0 auto; display: flex; gap: 6px; }
|
|
1791
1807
|
.ginbox__pending { font-size: 12.5px; margin: 10px 0 0; color: var(--ink-soft); }
|
|
1808
|
+
|
|
1809
|
+
/* ---------- hall-kit components (task 2166) ----------
|
|
1810
|
+
Styles for the shared kit (hall-kit.js / window.OTBKit): pager bar,
|
|
1811
|
+
filter-bar disclosure + chips, tab strip, empty state, skeleton shimmer,
|
|
1812
|
+
collapsible card. The kit reuses .ledger/.pager/.filters/.setup__tab/
|
|
1813
|
+
.rail-link defined above; only what is new lives here. The .pager--paged
|
|
1814
|
+
block is promoted VERBATIM from work.html's page-local <style> (task 1931)
|
|
1815
|
+
so every page can render the standard bar — work.html's identical copy
|
|
1816
|
+
retires with task 2170 (duplicate rules, no visual change meanwhile). */
|
|
1817
|
+
|
|
1818
|
+
.pager--paged { justify-content: space-between; flex-wrap: wrap; gap: 10px 16px; }
|
|
1819
|
+
.pager__nav { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
|
|
1820
|
+
.pager__perpage {
|
|
1821
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
1822
|
+
font-size: 12px; color: var(--ink-faint);
|
|
1823
|
+
}
|
|
1824
|
+
.pager__perpage select { height: 30px; padding: 2px 8px; font-size: 13px; }
|
|
1825
|
+
.pager__page {
|
|
1826
|
+
font-size: 12.5px; color: var(--ink-soft);
|
|
1827
|
+
font-variant-numeric: tabular-nums; min-width: 6.5em; text-align: center;
|
|
1828
|
+
}
|
|
1829
|
+
.pager__nav .pager__btn:disabled { opacity: 0.4; cursor: default; }
|
|
1830
|
+
|
|
1831
|
+
/* filter-bar disclosure ("Filters" button) + removable active-filter chips */
|
|
1832
|
+
.filters__more-count { margin-left: 6px; }
|
|
1833
|
+
.filters--overflow {
|
|
1834
|
+
padding: 10px 12px;
|
|
1835
|
+
border: 1px dashed var(--border-strong);
|
|
1836
|
+
border-radius: var(--radius-sm);
|
|
1837
|
+
background: var(--surface-2);
|
|
1838
|
+
margin-bottom: 14px;
|
|
1839
|
+
}
|
|
1840
|
+
.filter-chips { display: flex; flex-wrap: wrap; gap: 6px; margin: 0 0 12px; }
|
|
1841
|
+
.chip {
|
|
1842
|
+
display: inline-flex; align-items: center; gap: 6px;
|
|
1843
|
+
padding: 3px 10px;
|
|
1844
|
+
font-size: 12.5px;
|
|
1845
|
+
color: var(--accent-text);
|
|
1846
|
+
background: var(--accent-weak);
|
|
1847
|
+
border: 1px solid color-mix(in srgb, var(--accent) 30%, var(--border));
|
|
1848
|
+
border-radius: 999px;
|
|
1849
|
+
cursor: pointer;
|
|
1850
|
+
}
|
|
1851
|
+
.chip:hover { background: color-mix(in srgb, var(--accent) 16%, var(--bg-card)); }
|
|
1852
|
+
|
|
1853
|
+
/* tab strip — the .setup__tab idiom in the .setup__toggle frame, promoted */
|
|
1854
|
+
.kit-tabs {
|
|
1855
|
+
display: inline-flex;
|
|
1856
|
+
max-width: 100%;
|
|
1857
|
+
overflow-x: auto;
|
|
1858
|
+
border: 1px solid var(--border-strong);
|
|
1859
|
+
border-radius: var(--radius-sm);
|
|
1860
|
+
margin: 0 0 14px;
|
|
1861
|
+
}
|
|
1862
|
+
.kit-tabs .setup__tab { white-space: nowrap; }
|
|
1863
|
+
.kit-tabs .setup__tab .count-pill { margin-left: 6px; }
|
|
1864
|
+
|
|
1865
|
+
/* empty state — one short line + at most one action link */
|
|
1866
|
+
.empty-state { padding: 6px 0; }
|
|
1867
|
+
.empty-state p { margin: 0; font-size: 13px; color: var(--ink-faint); }
|
|
1868
|
+
.empty-state__action { display: inline-block; margin-top: 6px; font-size: 13px; }
|
|
1869
|
+
|
|
1870
|
+
/* skeleton shimmer — standard-height placeholder rows while data loads, so
|
|
1871
|
+
cards don't jump; derives from the ink/bg tokens like everything else */
|
|
1872
|
+
.kit-skel {
|
|
1873
|
+
display: inline-block;
|
|
1874
|
+
width: 60%;
|
|
1875
|
+
min-width: 80px;
|
|
1876
|
+
height: 12px;
|
|
1877
|
+
border-radius: 6px;
|
|
1878
|
+
background: linear-gradient(90deg,
|
|
1879
|
+
color-mix(in srgb, var(--ink) 7%, var(--bg-card)) 25%,
|
|
1880
|
+
color-mix(in srgb, var(--ink) 13%, var(--bg-card)) 45%,
|
|
1881
|
+
color-mix(in srgb, var(--ink) 7%, var(--bg-card)) 65%);
|
|
1882
|
+
background-size: 200% 100%;
|
|
1883
|
+
animation: kit-skel-shimmer 1.2s ease-in-out infinite;
|
|
1884
|
+
}
|
|
1885
|
+
.kit-skel-row td { border-bottom: 1px solid var(--rule-soft); }
|
|
1886
|
+
@keyframes kit-skel-shimmer {
|
|
1887
|
+
from { background-position: 120% 0; }
|
|
1888
|
+
to { background-position: -80% 0; }
|
|
1889
|
+
}
|
|
1890
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1891
|
+
.kit-skel { animation: none; }
|
|
1892
|
+
}
|
|
1893
|
+
|
|
1894
|
+
/* collapsible card body — the Work-backlog <details> idiom, generalized */
|
|
1895
|
+
.kit-collapse__summary {
|
|
1896
|
+
cursor: pointer;
|
|
1897
|
+
display: flex;
|
|
1898
|
+
align-items: baseline;
|
|
1899
|
+
gap: 8px;
|
|
1900
|
+
}
|
|
1901
|
+
.kit-collapse__summary .scroll__h { display: inline; margin: 0; }
|
|
1902
|
+
.kit-collapse__body { margin-top: 12px; }
|
|
1903
|
+
|
|
1904
|
+
/* ---- Home dashboard (task 2169) ---- */
|
|
1905
|
+
/* Stat tiles are links now — inherit ink, reveal affordance on hover. */
|
|
1906
|
+
a.stat-tile { color: inherit; }
|
|
1907
|
+
a.stat-tile:hover {
|
|
1908
|
+
text-decoration: none;
|
|
1909
|
+
border-color: color-mix(in srgb, var(--accent) 35%, var(--border));
|
|
1910
|
+
background: color-mix(in srgb, var(--accent) 3%, var(--surface));
|
|
1911
|
+
}
|
|
1912
|
+
/* Projects card header: title left, "Start a project" disclosure right. */
|
|
1913
|
+
.proj-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
|
|
1914
|
+
.proj-head .scroll__h { margin: 0; }
|
|
1915
|
+
/* The over-budget "More" row — one quiet line, not a card. */
|
|
1916
|
+
.home-more { margin: 0; font-size: 13px; color: var(--ink-soft); }
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/* work.css — page-local styles for the Work Board (task 2170; extracted from
|
|
2
|
+
work.html's old inline <style> per the hall placement rules). Only what the
|
|
3
|
+
shared kit doesn't carry lives here: in-flight actions, claimable task
|
|
4
|
+
cards (dense 2-line layout), history list, bulk toolbar. Shared pieces —
|
|
5
|
+
.pager--paged, .count-pill, .kit-tabs, .filters overflow — are in
|
|
6
|
+
style.css. Everything derives from the shared design tokens so instance
|
|
7
|
+
packs reskin this page along with the rest of the hall. */
|
|
8
|
+
|
|
9
|
+
.kbd {
|
|
10
|
+
display: inline-block;
|
|
11
|
+
padding: 0 6px;
|
|
12
|
+
border: 1px solid var(--border-strong);
|
|
13
|
+
border-radius: 5px;
|
|
14
|
+
background: var(--surface-2);
|
|
15
|
+
font-size: 0.85em;
|
|
16
|
+
font-weight: 600;
|
|
17
|
+
color: var(--ink-soft);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.wip-builder { color: var(--ink); font-weight: 600; }
|
|
21
|
+
.wip-builder small { color: var(--ink-soft); font-weight: 400; }
|
|
22
|
+
|
|
23
|
+
/* Filtered-count line under the filter bar. */
|
|
24
|
+
.claim-count-line {
|
|
25
|
+
margin: 0 0 10px;
|
|
26
|
+
font-size: 12.5px;
|
|
27
|
+
color: var(--ink-faint);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* ---- #616 / task 2170: claim/release actions + the dense task card ---- */
|
|
31
|
+
|
|
32
|
+
/* task 2170 (owner call 2026-07-10): denser 2-line cards. The card keeps its
|
|
33
|
+
grid but tightens padding and type, actions go horizontal, and the touches
|
|
34
|
+
path-dump becomes a "✎ N files" chip with the full list in the tooltip. */
|
|
35
|
+
.task { padding: 8px 12px; gap: 2px 12px; }
|
|
36
|
+
.task__title { font-size: 13px; line-height: 1.35; }
|
|
37
|
+
.task__meta { margin-top: 1px; row-gap: 2px; }
|
|
38
|
+
|
|
39
|
+
.task__actions {
|
|
40
|
+
display: flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
gap: 6px;
|
|
43
|
+
}
|
|
44
|
+
/* Claim is the primary action — filled accent so it reads above Copy. */
|
|
45
|
+
.task__claim {
|
|
46
|
+
background: var(--accent);
|
|
47
|
+
border: 1px solid var(--accent-deep);
|
|
48
|
+
color: #fff;
|
|
49
|
+
border-radius: var(--radius-sm);
|
|
50
|
+
font-size: 12.5px;
|
|
51
|
+
font-weight: 600;
|
|
52
|
+
padding: 5px 14px;
|
|
53
|
+
cursor: pointer;
|
|
54
|
+
white-space: nowrap;
|
|
55
|
+
transition: background 150ms, opacity 150ms;
|
|
56
|
+
}
|
|
57
|
+
.task__claim:hover { background: var(--accent-deep); }
|
|
58
|
+
.task__claim:disabled { opacity: 0.55; cursor: default; }
|
|
59
|
+
|
|
60
|
+
/* Files a claimable task is responsible for — a compact count chip in the
|
|
61
|
+
meta row; the full path list rides the tooltip (task 2170 density pass). */
|
|
62
|
+
.task__touches {
|
|
63
|
+
color: var(--ink-faint);
|
|
64
|
+
font-size: 12px;
|
|
65
|
+
white-space: nowrap;
|
|
66
|
+
cursor: help;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.task__tag--newcomer {
|
|
70
|
+
background: var(--ok-weak);
|
|
71
|
+
color: var(--ok);
|
|
72
|
+
border-color: color-mix(in srgb, var(--ok) 30%, transparent);
|
|
73
|
+
}
|
|
74
|
+
.task__tag--mine {
|
|
75
|
+
background: var(--accent-weak);
|
|
76
|
+
color: var(--accent-text);
|
|
77
|
+
border-color: color-mix(in srgb, var(--accent) 35%, transparent);
|
|
78
|
+
}
|
|
79
|
+
/* task 1498 / ADR 0084: per-task rank floor. Outlined + emphasized (not a
|
|
80
|
+
filled tag) so a gated task reads as "authority required", distinct from
|
|
81
|
+
the filled newcomer tag. */
|
|
82
|
+
.task__tag--rank {
|
|
83
|
+
background: transparent;
|
|
84
|
+
color: var(--warn);
|
|
85
|
+
border-color: color-mix(in srgb, var(--warn) 45%, transparent);
|
|
86
|
+
font-weight: 600;
|
|
87
|
+
letter-spacing: 0.02em;
|
|
88
|
+
}
|
|
89
|
+
/* task 1752: the open (no floor) state — muted/neutral so "Any rank" reads as
|
|
90
|
+
"open to all", not as a warning like the gated --rank tag above. */
|
|
91
|
+
.task__tag--rank-open {
|
|
92
|
+
background: transparent;
|
|
93
|
+
color: var(--ink-faint);
|
|
94
|
+
border-color: var(--border);
|
|
95
|
+
}
|
|
96
|
+
/* task 1753: the whole card is clickable → toggles selection (task 1869). */
|
|
97
|
+
.task { cursor: pointer; }
|
|
98
|
+
.backlog-count { font-size: 13px; color: var(--ink-faint); margin-left: 8px; }
|
|
99
|
+
#backlog-list .history__row { cursor: pointer; }
|
|
100
|
+
|
|
101
|
+
/* In-flight table: release action on the viewer's own claims. */
|
|
102
|
+
.wip__action { text-align: right; white-space: nowrap; }
|
|
103
|
+
.wip__release {
|
|
104
|
+
background: var(--surface);
|
|
105
|
+
border: 1px solid var(--border-strong);
|
|
106
|
+
color: var(--ink-soft);
|
|
107
|
+
border-radius: var(--radius-sm);
|
|
108
|
+
font-size: 12px;
|
|
109
|
+
font-weight: 600;
|
|
110
|
+
padding: 4px 11px;
|
|
111
|
+
cursor: pointer;
|
|
112
|
+
transition: background 150ms, color 150ms, border-color 150ms;
|
|
113
|
+
}
|
|
114
|
+
.wip__release:hover:not(:disabled) {
|
|
115
|
+
background: var(--danger-weak);
|
|
116
|
+
color: var(--danger);
|
|
117
|
+
border-color: color-mix(in srgb, var(--danger) 40%, transparent);
|
|
118
|
+
}
|
|
119
|
+
.wip__release:disabled { opacity: 0.55; cursor: default; }
|
|
120
|
+
.wip__mine-none { color: var(--ink-faint); }
|
|
121
|
+
.wip__row--mine { background: var(--accent-weak); }
|
|
122
|
+
|
|
123
|
+
/* Recently-shipped history. */
|
|
124
|
+
.history { display: flex; flex-direction: column; gap: 2px; margin-top: 6px; }
|
|
125
|
+
.history__row {
|
|
126
|
+
display: flex; align-items: baseline; gap: 12px;
|
|
127
|
+
padding: 6px 4px;
|
|
128
|
+
border-bottom: 1px solid var(--rule-soft);
|
|
129
|
+
}
|
|
130
|
+
.history__row:last-child { border-bottom: none; }
|
|
131
|
+
.history__id {
|
|
132
|
+
font-weight: 600; color: var(--ink-soft);
|
|
133
|
+
font-variant-numeric: tabular-nums; min-width: 3.2em;
|
|
134
|
+
}
|
|
135
|
+
.history__title { flex: 1 1 auto; color: var(--ink); min-width: 0; }
|
|
136
|
+
.history__when { color: var(--ink-faint); font-size: 12.5px; white-space: nowrap; }
|
|
137
|
+
|
|
138
|
+
@media (max-width: 640px) {
|
|
139
|
+
.task__actions { grid-column: 2; justify-self: start; }
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* ---- task 1759: multi-select + the bottom bulk-action toolbar ---- */
|
|
143
|
+
|
|
144
|
+
.wip__select-cell { width: 1%; text-align: center; }
|
|
145
|
+
.wip__select { width: 15px; height: 15px; cursor: pointer; accent-color: var(--accent); }
|
|
146
|
+
|
|
147
|
+
.bulk-toolbar {
|
|
148
|
+
position: fixed;
|
|
149
|
+
left: 50%;
|
|
150
|
+
bottom: 20px;
|
|
151
|
+
transform: translateX(-50%);
|
|
152
|
+
z-index: 120;
|
|
153
|
+
display: flex;
|
|
154
|
+
align-items: center;
|
|
155
|
+
gap: 14px;
|
|
156
|
+
flex-wrap: wrap;
|
|
157
|
+
background: var(--ink);
|
|
158
|
+
color: var(--bg-card);
|
|
159
|
+
padding: 10px 16px;
|
|
160
|
+
border-radius: var(--radius);
|
|
161
|
+
box-shadow: var(--shadow-pop);
|
|
162
|
+
max-width: min(92vw, 720px);
|
|
163
|
+
}
|
|
164
|
+
.bulk-toolbar[hidden] { display: none; }
|
|
165
|
+
.bulk-toolbar__count { font-size: 13px; font-weight: 600; white-space: nowrap; }
|
|
166
|
+
.bulk-toolbar__actions { display: flex; gap: 8px; flex-wrap: wrap; }
|
|
167
|
+
.bulk-toolbar__btn {
|
|
168
|
+
background: rgba(255, 255, 255, 0.12);
|
|
169
|
+
border: 1px solid rgba(255, 255, 255, 0.25);
|
|
170
|
+
color: var(--bg-card);
|
|
171
|
+
border-radius: var(--radius-sm);
|
|
172
|
+
font-size: 12.5px;
|
|
173
|
+
font-weight: 600;
|
|
174
|
+
padding: 6px 12px;
|
|
175
|
+
cursor: pointer;
|
|
176
|
+
white-space: nowrap;
|
|
177
|
+
transition: background 150ms, opacity 150ms;
|
|
178
|
+
}
|
|
179
|
+
.bulk-toolbar__btn:hover:not(:disabled) { background: rgba(255, 255, 255, 0.22); }
|
|
180
|
+
.bulk-toolbar__btn:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
181
|
+
.bulk-toolbar__clear {
|
|
182
|
+
background: transparent;
|
|
183
|
+
border: none;
|
|
184
|
+
color: var(--bg-card);
|
|
185
|
+
opacity: 0.75;
|
|
186
|
+
font-size: 12.5px;
|
|
187
|
+
cursor: pointer;
|
|
188
|
+
padding: 4px 6px;
|
|
189
|
+
}
|
|
190
|
+
.bulk-toolbar__clear:hover { opacity: 1; }
|
|
191
|
+
|
|
192
|
+
@media (max-width: 640px) {
|
|
193
|
+
.bulk-toolbar { left: 12px; right: 12px; bottom: 12px; transform: none; max-width: none; }
|
|
194
|
+
}
|