diff --git a/apps/console/app.js b/apps/console/app.js index 6456080..21036e5 100644 --- a/apps/console/app.js +++ b/apps/console/app.js @@ -25,6 +25,15 @@ function cell(className, text) { return node; } +function taskCell(label, className, text) { + const node = document.createElement("span"); + node.className = "task-cell"; + node.dataset.label = label; + node.setAttribute("role", "cell"); + node.append(cell(className, text)); + return node; +} + function stateLabel(state) { return state.replaceAll("_", " "); } @@ -86,6 +95,7 @@ function renderTask(task) { row.setAttribute("role", "row"); const title = document.createElement("span"); title.className = "task-title"; + title.setAttribute("role", "cell"); const strong = document.createElement("strong"); strong.textContent = task.title; const small = document.createElement("small"); @@ -93,10 +103,10 @@ function renderTask(task) { title.append(strong, small); row.append( title, - cell(`badge badge-state ${task.policy_valid ? "" : "badge-policy-failed"}`, stateLabel(task.derived_state)), - cell(`badge badge-risk-${task.risk}`, task.risk), - cell("", String(task.evidence_count)), - cell("", String(task.review_count)) + taskCell("State", `badge badge-state ${task.policy_valid ? "" : "badge-policy-failed"}`, stateLabel(task.derived_state)), + taskCell("Risk", `badge badge-risk-${task.risk}`, task.risk), + taskCell("Evidence", "", String(task.evidence_count)), + taskCell("Reviews", "", String(task.review_count)) ); const gates = document.createElement("div"); gates.className = "task-gates"; diff --git a/apps/console/index.html b/apps/console/index.html index a79b4fb..b7005bd 100644 --- a/apps/console/index.html +++ b/apps/console/index.html @@ -38,6 +38,10 @@

One record for work
across many minds.

Tasks
Active
Evidence
+
Reviews
+
Decisions
+ +
@@ -65,9 +69,6 @@

Pilot readiness

-
Reviews
-
Decisions
-
diff --git a/apps/console/styles.css b/apps/console/styles.css index 782a7a2..e0c8eba 100644 --- a/apps/console/styles.css +++ b/apps/console/styles.css @@ -102,6 +102,8 @@ footer { border-top: 1px solid var(--line); color: var(--muted); display: flex; .task-header { display: none; } .task-row { gap: 12px; grid-template-columns: 1fr 1fr; padding: 18px 6px; } .task-title { grid-column: 1 / -1; } + .task-cell { align-items: flex-start; display: flex; flex-direction: column; gap: 6px; } + .task-cell::before { color: var(--muted); content: attr(data-label); font-family: ui-monospace, monospace; font-size: 9px; letter-spacing: .1em; text-transform: uppercase; } .flow { grid-template-columns: 1fr; } .flow li { min-height: 150px; } .flow li > span { margin-top: 36px; } @@ -142,3 +144,4 @@ h3 { font-size: 19px; margin: 5px 0 0; } .project-metrics article { border-bottom: 1px solid var(--line); } .milestone-grid { grid-template-columns: 1fr; } .milestone-heading, .pilot-heading { align-items: start; flex-direction: column; } +} diff --git a/docs/app.js b/docs/app.js index 6456080..21036e5 100644 --- a/docs/app.js +++ b/docs/app.js @@ -25,6 +25,15 @@ function cell(className, text) { return node; } +function taskCell(label, className, text) { + const node = document.createElement("span"); + node.className = "task-cell"; + node.dataset.label = label; + node.setAttribute("role", "cell"); + node.append(cell(className, text)); + return node; +} + function stateLabel(state) { return state.replaceAll("_", " "); } @@ -86,6 +95,7 @@ function renderTask(task) { row.setAttribute("role", "row"); const title = document.createElement("span"); title.className = "task-title"; + title.setAttribute("role", "cell"); const strong = document.createElement("strong"); strong.textContent = task.title; const small = document.createElement("small"); @@ -93,10 +103,10 @@ function renderTask(task) { title.append(strong, small); row.append( title, - cell(`badge badge-state ${task.policy_valid ? "" : "badge-policy-failed"}`, stateLabel(task.derived_state)), - cell(`badge badge-risk-${task.risk}`, task.risk), - cell("", String(task.evidence_count)), - cell("", String(task.review_count)) + taskCell("State", `badge badge-state ${task.policy_valid ? "" : "badge-policy-failed"}`, stateLabel(task.derived_state)), + taskCell("Risk", `badge badge-risk-${task.risk}`, task.risk), + taskCell("Evidence", "", String(task.evidence_count)), + taskCell("Reviews", "", String(task.review_count)) ); const gates = document.createElement("div"); gates.className = "task-gates"; diff --git a/docs/index.html b/docs/index.html index a79b4fb..b7005bd 100644 --- a/docs/index.html +++ b/docs/index.html @@ -38,6 +38,10 @@

One record for work
across many minds.

Tasks
Active
Evidence
+
Reviews
+
Decisions
+
+
@@ -65,9 +69,6 @@

Pilot readiness

-
Reviews
-
Decisions
-
diff --git a/docs/styles.css b/docs/styles.css index 782a7a2..e0c8eba 100644 --- a/docs/styles.css +++ b/docs/styles.css @@ -102,6 +102,8 @@ footer { border-top: 1px solid var(--line); color: var(--muted); display: flex; .task-header { display: none; } .task-row { gap: 12px; grid-template-columns: 1fr 1fr; padding: 18px 6px; } .task-title { grid-column: 1 / -1; } + .task-cell { align-items: flex-start; display: flex; flex-direction: column; gap: 6px; } + .task-cell::before { color: var(--muted); content: attr(data-label); font-family: ui-monospace, monospace; font-size: 9px; letter-spacing: .1em; text-transform: uppercase; } .flow { grid-template-columns: 1fr; } .flow li { min-height: 150px; } .flow li > span { margin-top: 36px; } @@ -142,3 +144,4 @@ h3 { font-size: 19px; margin: 5px 0 0; } .project-metrics article { border-bottom: 1px solid var(--line); } .milestone-grid { grid-template-columns: 1fr; } .milestone-heading, .pilot-heading { align-items: start; flex-direction: column; } +}