@azure-id/orc 1.9.2 → 2.1.0
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/CHANGELOG.md +722 -0
- package/README-id.md +56 -42
- package/README.md +58 -41
- package/bin/build-agents.js +125 -29
- package/bin/clear-logs.js +620 -0
- package/bin/cli.js +1873 -180
- package/bin/fix.js +459 -0
- package/bin/gotcha-import.js +1081 -0
- package/bin/gotcha.js +1566 -0
- package/bin/graph-query.js +1 -1
- package/bin/graph.js +717 -717
- package/bin/habit.js +1538 -0
- package/bin/mockrun-catalog.js +284 -276
- package/bin/onboarding-content.js +2 -1
- package/bin/pricing.json +28 -21
- package/bin/run-undo.js +398 -0
- package/bin/trace-write.js +869 -0
- package/bin/verify-contracts.js +627 -100
- package/bin/verify-package.js +68 -10
- package/bin/webui/api.js +151 -6
- package/bin/webui/app.html +239 -232
- package/bin/webui/css/00-tokens.css +110 -92
- package/bin/webui/css/04-motion.css +87 -0
- package/bin/webui/css/06-responsive.css +203 -178
- package/bin/webui/css/panels/behaviour.css +205 -0
- package/bin/webui/css/panels/hookui.css +79 -0
- package/bin/webui/fixtures/behaviour.js +562 -0
- package/bin/webui/fixtures/extra.js +9 -9
- package/bin/webui/fixtures/flow.js +81 -81
- package/bin/webui/fixtures/hookui.js +506 -431
- package/bin/webui/fixtures/index.js +66 -3
- package/bin/webui/fixtures/knowledge.js +9 -3
- package/bin/webui/fixtures/maintenance.js +123 -42
- package/bin/webui/fixtures/rules.js +1007 -1002
- package/bin/webui/fixtures/settings.js +6 -7
- package/bin/webui/fixtures/stats.js +25 -6
- package/bin/webui/fixtures/wait.js +98 -97
- package/bin/webui/i18n/en/behaviour.json +156 -0
- package/bin/webui/i18n/en/hookui.json +290 -194
- package/bin/webui/i18n/en/maintenance.json +71 -52
- package/bin/webui/i18n/en/nav.json +25 -24
- package/bin/webui/i18n/en/settings.json +60 -60
- package/bin/webui/i18n/en/tour.json +37 -35
- package/bin/webui/i18n/id/behaviour.json +156 -0
- package/bin/webui/i18n/id/hookui.json +290 -194
- package/bin/webui/i18n/id/maintenance.json +71 -52
- package/bin/webui/i18n/id/nav.json +25 -24
- package/bin/webui/i18n/id/settings.json +60 -60
- package/bin/webui/i18n/id/tour.json +37 -35
- package/bin/webui/js/01-i18n.js +155 -154
- package/bin/webui/js/05-banners.js +181 -172
- package/bin/webui/js/06-edit.js +193 -183
- package/bin/webui/js/90-tour.js +498 -494
- package/bin/webui/js/91-shortcuts.js +126 -126
- package/bin/webui/js/99-boot.js +121 -118
- package/bin/webui/js/panels/behaviour.js +1087 -0
- package/bin/webui/js/panels/hookui.js +2196 -1691
- package/bin/webui/js/panels/maintenance.js +336 -235
- package/bin/webui/js/panels/settings.js +726 -719
- package/mock-run/INDEX.md +110 -107
- package/mock-run/extra-slots.md +1 -1
- package/mock-run/gotcha-import.md +118 -0
- package/mock-run/habits.md +129 -0
- package/mock-run/orc-aftermath.md +392 -392
- package/mock-run/orc-budget.md +29 -33
- package/mock-run/orc-cli.md +200 -200
- package/mock-run/orc-explain.md +86 -86
- package/mock-run/orc-extra.md +389 -392
- package/mock-run/orc-fix.md +87 -0
- package/mock-run/orc-pattern.md +112 -112
- package/mock-run/orc-quick.md +6 -1
- package/mock-run/orc.md +157 -157
- package/package.json +1 -1
- package/templates/agents/MODEL-MAPPING.md +37 -34
- package/templates/agents/orc-advisor-opus-5-xhigh.md +1 -7
- package/templates/agents/orc-analyze-mini-opus-5-med.md +1 -6
- package/templates/agents/orc-analyze-mini-sonnet-5-high.md +2 -5
- package/templates/agents/{orc-claude-writer-opus-4-8-high.md → orc-claude-writer-opus-5-low.md} +48 -53
- package/templates/agents/orc-context-combiner-opus-5-high.md +1 -11
- package/templates/agents/orc-executor-haiku-4-5.md +14 -6
- package/templates/agents/orc-executor-opus-4-7-high.md +14 -6
- package/templates/agents/orc-executor-opus-4-7-med.md +14 -6
- package/templates/agents/orc-executor-opus-4-8-high.md +14 -6
- package/templates/agents/orc-executor-opus-5-high.md +14 -6
- package/templates/agents/orc-executor-opus-5-low.md +14 -6
- package/templates/agents/orc-executor-opus-5-med.md +14 -6
- package/templates/agents/orc-executor-sonnet-4-6-high.md +14 -6
- package/templates/agents/orc-executor-sonnet-4-6-med.md +14 -6
- package/templates/agents/orc-executor-sonnet-5-high.md +15 -7
- package/templates/agents/orc-executor-sonnet-5-low.md +155 -0
- package/templates/agents/orc-executor-sonnet-5-med.md +155 -0
- package/templates/agents/orc-graph-noter-sonnet-4-6-med.md +1 -10
- package/templates/agents/orc-judge-opus-5-xhigh.md +5 -9
- package/templates/agents/orc-learn-writer-opus-5-low.md +1 -7
- package/templates/agents/orc-pattern-codifier-opus-5-med.md +1 -8
- package/templates/agents/orc-pattern-codifier-sonnet-5-high.md +58 -63
- package/templates/agents/orc-planner-mini-opus-5-med.md +1 -4
- package/templates/agents/orc-planner-mini-sonnet-5-high.md +2 -3
- package/templates/agents/orc-planner-opus-5-med.md +1 -4
- package/templates/agents/orc-recon-opus-5-low.md +1 -8
- package/templates/agents/orc-recon-sonnet-4-6-med.md +1 -8
- package/templates/agents/orc-retro-opus-5-med.md +6 -8
- package/templates/agents/orc-retro-sonnet-5-high.md +7 -8
- package/templates/agents/orc-reviewer-opus-5-low.md +96 -0
- package/templates/agents/orc-scout-opus-5-low.md +1 -6
- package/templates/agents/orc-scout-sonnet-4-6-high.md +35 -39
- package/templates/agents/orc-system-analyst-opus-5-high.md +1 -6
- package/templates/agents/orc-test-author-opus-5-med.md +4 -5
- package/templates/agents/orc-trace-writer-haiku-4-5.md +3 -7
- package/templates/agents/orc-verifier-opus-5-med.md +16 -8
- package/templates/agents/{orc-wiki-scanner-opus-4-8-high.md → orc-wiki-scanner-opus-5-low.md} +74 -79
- package/templates/agents/orc-wiki-scanner-sonnet-5-high.md +97 -106
- package/templates/commands/orc-analyze.md +13 -21
- package/templates/commands/orc-fast.md +10 -15
- package/templates/commands/orc-fix.md +18 -0
- package/templates/commands/orc-poly.md +12 -21
- package/templates/commands/orc-pr-driver.md +11 -30
- package/templates/commands/orc-pr-setup.md +10 -31
- package/templates/commands/orc-route.md +11 -41
- package/templates/commands/orc-test.md +5 -60
- package/templates/commands/orc-wiki.md +64 -64
- package/templates/hooks/README.md +109 -7
- package/templates/hooks/orc-session-hook.js +339 -0
- package/templates/hooks/orc-statusline-render.js +317 -23
- package/templates/hooks/orc-statusline.js +165 -50
- package/templates/hooks/orc-subagent-line.js +23 -5
- package/templates/hooks/orc-weather-fetch.js +123 -0
- package/templates/skills/_shared/README.md +9 -0
- package/templates/skills/_shared/code-graph.md +47 -55
- package/templates/skills/_shared/config-precedence.md +3 -1
- package/templates/skills/_shared/extra-dispatch.md +78 -93
- package/templates/skills/_shared/gotchas.md +248 -177
- package/templates/skills/_shared/habits.md +101 -0
- package/templates/skills/_shared/lane-contract.md +84 -0
- package/templates/skills/_shared/opus5-only.md +14 -14
- package/templates/skills/_shared/phases/README.md +142 -83
- package/templates/skills/_shared/phases/analyst-gates.md +10 -21
- package/templates/skills/_shared/phases/execution.md +8 -14
- package/templates/skills/_shared/phases/house-rules.md +27 -32
- package/templates/skills/_shared/phases/intake.md +127 -133
- package/templates/skills/_shared/phases/mock-example.md +46 -56
- package/templates/skills/_shared/phases/plan-handoff.md +91 -97
- package/templates/skills/_shared/phases/planning.md +7 -17
- package/templates/skills/_shared/phases/preflight.md +19 -42
- package/templates/skills/_shared/phases/review.md +24 -28
- package/templates/skills/_shared/phases/rules.md +18 -42
- package/templates/skills/_shared/phases/scoring.md +55 -65
- package/templates/skills/_shared/phases/security-checklist.md +46 -50
- package/templates/skills/_shared/phases/security.md +45 -55
- package/templates/skills/_shared/phases/ship.md +6 -15
- package/templates/skills/_shared/phases/stop-resume.md +2 -5
- package/templates/skills/_shared/phases/summary.md +73 -48
- package/templates/skills/_shared/phases/testgen.md +41 -51
- package/templates/skills/_shared/phases/trace-verbs.md +447 -0
- package/templates/skills/_shared/phases/trace.md +66 -297
- package/templates/skills/_shared/phases/verify.md +62 -70
- package/templates/skills/_shared/phases/wave-grouping.md +128 -133
- package/templates/skills/_shared/phases/wiki-consult.md +10 -6
- package/templates/skills/_shared/read-ladder.md +2 -55
- package/templates/skills/_shared/return-validation.md +17 -70
- package/templates/skills/_shared/review-slice.md +106 -0
- package/templates/skills/_shared/smoke-gate.md +46 -28
- package/templates/skills/_shared/wait.md +1 -0
- package/templates/skills/context-combiner/SKILL.md +15 -44
- package/templates/skills/orc/README.md +2 -2
- package/templates/skills/orc/SKILL.md +35 -63
- package/templates/skills/orc/config.md +25 -27
- package/templates/skills/orc/examples/full-run-mock.md +2 -1
- package/templates/skills/orc/references/effort-and-mode.md +17 -17
- package/templates/skills/orc/references/pattern-gate.md +89 -89
- package/templates/skills/orc/references/phases/intake.md +41 -47
- package/templates/skills/orc/references/phases/integration.md +13 -19
- package/templates/skills/orc/references/preflight-report.md +11 -12
- package/templates/skills/orc/references/ultra-mode.md +9 -7
- package/templates/skills/orc/schemas/checkpoint.md +122 -122
- package/templates/skills/orc/subskills/orc-execution/SKILL.md +27 -73
- package/templates/skills/orc/subskills/orc-execution/core.md +12 -99
- package/templates/skills/orc/subskills/orc-execution/subagent.md +14 -13
- package/templates/skills/orc/subskills/orc-review-verify/SKILL.md +12 -53
- package/templates/skills/orc/subskills/orc-review-verify/core.md +52 -135
- package/templates/skills/orc/subskills/orc-review-verify/subagent.md +7 -7
- package/templates/skills/orc/subskills/orc-testgen/SKILL.md +11 -22
- package/templates/skills/orc/subskills/orc-testgen/core.md +20 -59
- package/templates/skills/orc/subskills/orc-testgen/subagent.md +7 -7
- package/templates/skills/orc-advisor/SKILL.md +56 -60
- package/templates/skills/orc-analyze/SKILL.md +33 -67
- package/templates/skills/orc-analyze/schemas/report-audit.md +2 -1
- package/templates/skills/orc-analyze/schemas/report-prose.md +2 -1
- package/templates/skills/orc-analyze-mini/SKILL.md +35 -70
- package/templates/skills/orc-claude/SKILL.md +14 -14
- package/templates/skills/orc-claude/examples/claude-run-mock.md +65 -65
- package/templates/skills/orc-diy/README.md +31 -0
- package/templates/skills/orc-diy/SKILL.md +27 -78
- package/templates/skills/orc-diy/references/blocks/pattern.md +18 -18
- package/templates/skills/orc-fast/SKILL.md +49 -75
- package/templates/skills/orc-fix/SKILL.md +110 -0
- package/templates/skills/orc-judge/SKILL.md +77 -82
- package/templates/skills/orc-mini/SKILL.md +64 -112
- package/templates/skills/orc-mini/examples/mini-run-mock.md +4 -2
- package/templates/skills/orc-pattern/SKILL.md +27 -48
- package/templates/skills/orc-poly/SKILL.md +32 -61
- package/templates/skills/orc-pr-driver/SKILL.md +25 -51
- package/templates/skills/orc-pr-driver/references/green-gate.md +113 -105
- package/templates/skills/orc-pr-setup/SKILL.md +20 -45
- package/templates/skills/orc-quick/README.md +44 -3
- package/templates/skills/orc-quick/SKILL.md +77 -108
- package/templates/skills/orc-quick/references/dispatch-gate.md +18 -6
- package/templates/skills/orc-quick/references/gh-mode.md +50 -1
- package/templates/skills/orc-quick/references/look.md +3 -1
- package/templates/skills/orc-retro/SKILL.md +20 -19
- package/templates/skills/orc-retro/examples/retro-mock.md +17 -17
- package/templates/skills/orc-route/SKILL.md +25 -45
- package/templates/skills/orc-test/SKILL.md +16 -37
- package/templates/skills/orc-verify/SKILL.md +14 -32
- package/templates/skills/orc-wait/SKILL.md +156 -163
- package/templates/skills/orc-wiki/README.md +325 -325
- package/templates/skills/orc-wiki/SKILL.md +195 -195
- package/templates/skills/orc-wiki/examples/wiki-run-mock.md +37 -37
- package/templates/skills/orc-wiki/references/extra.md +2 -2
- package/templates/skills/orc-wiki/references/partial-refresh.md +276 -271
- package/templates/skills/orc-wiki/references/phases/phase-0.md +2 -7
- package/templates/skills/orc-wiki/references/phases/phase-1.md +1 -6
- package/templates/skills/orc-wiki/references/phases/phase-2.md +4 -9
- package/templates/skills/orc-wiki/references/phases/phase-3.md +1 -6
- package/templates/skills/orc-wiki/references/phases/phase-3c.md +4 -8
- package/templates/agents/orc-claude-writer-opus-5-med.md +0 -55
- package/templates/agents/orc-reviewer-opus-5-med.md +0 -60
- package/templates/agents/orc-wiki-scanner-opus-5-med.md +0 -81
|
@@ -1,178 +1,203 @@
|
|
|
1
|
-
/* 06-responsive.css — orc ui
|
|
2
|
-
The width breakpoints that cross panel boundaries (the rail becomes a strip,
|
|
3
|
-
the Learn rail becomes a scrollable row). They override rules from the shell
|
|
4
|
-
AND from four panels, so they load after every one of them — the same reason
|
|
5
|
-
04-motion.css is last. Breakpoints that only touch ONE panel stay in that
|
|
6
|
-
panel's file.
|
|
7
|
-
|
|
8
|
-
The <link> ORDER in app.html is the cascade order, and the numeric
|
|
9
|
-
prefix is that order. No @import: it would carry no session token and
|
|
10
|
-
401. */
|
|
11
|
-
|
|
12
|
-
/* --------------------------------------------------------------- RESPONSIVE */
|
|
13
|
-
|
|
14
|
-
@media (max-width: 1040px) {
|
|
15
|
-
/* The Learn rail stops being a rail and becomes a scrollable strip above the
|
|
16
|
-
reading pane — a 244px column plus prose does not fit twice over. */
|
|
17
|
-
.learn { grid-template-columns: 1fr; }
|
|
18
|
-
.learn-side { position: static; max-height: none; }
|
|
19
|
-
.learn-nav { flex-direction: row; overflow-x: auto; padding-bottom: 2px; }
|
|
20
|
-
.learn-nav-item { flex: 0 0 auto; max-width: 210px; }
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@media (max-width: 900px) {
|
|
24
|
-
.shell { grid-template-columns: 1fr; }
|
|
25
|
-
.rail {
|
|
26
|
-
position: static;
|
|
27
|
-
height: auto;
|
|
28
|
-
flex-direction: row;
|
|
29
|
-
align-items: center;
|
|
30
|
-
gap: var(--sp-4);
|
|
31
|
-
overflow-x: auto;
|
|
32
|
-
border-right: 0;
|
|
33
|
-
border-bottom: 1px solid var(--line-soft);
|
|
34
|
-
}
|
|
35
|
-
.nav { flex-direction: row; flex-wrap: nowrap; }
|
|
36
|
-
.nav a { white-space: nowrap; }
|
|
37
|
-
.rail-foot { flex-direction: row; align-items: center; }
|
|
38
|
-
.rail-project { max-width: 180px; }
|
|
39
|
-
.main { padding: var(--sp-4); }
|
|
40
|
-
.setting { grid-template-columns: 1fr; }
|
|
41
|
-
.setting-control { align-items: flex-start; }
|
|
42
|
-
/* The rank ladder keeps its prio column — it is 34px and it is the thing
|
|
43
|
-
that makes the row readable as a ladder rather than a list. The state
|
|
44
|
-
chip wraps under instead, which is the only child that can spare the
|
|
45
|
-
line. Declared explicitly, like every `.run-card` variant below. */
|
|
46
|
-
.rank-row { grid-template-columns: 34px minmax(0, 1fr); }
|
|
47
|
-
.rank-row > .chip { grid-column: 2; justify-self: start; }
|
|
48
|
-
/* A phase row drops its right-hand column under the body rather than
|
|
49
|
-
squeezing it: `read`, `when` and the layer list are facts, and a fact
|
|
50
|
-
wrapped to one character per line is not readable. Declared explicitly. */
|
|
51
|
-
.phase-row { grid-template-columns: 28px minmax(0, 1fr); }
|
|
52
|
-
.phase-right { grid-column: 2; flex-direction: row; flex-wrap: wrap; align-items: center; }
|
|
53
|
-
.call-detail { padding-left: var(--sp-3); }
|
|
54
|
-
/* Every `.run-card` VARIANT collapses explicitly. A variant that inherits a
|
|
55
|
-
column count it does not have is the v0.49.2 Overview collision again, just
|
|
56
|
-
at a narrower width. */
|
|
57
|
-
.run-card { grid-template-columns: 16px 80px minmax(0, 1fr); }
|
|
58
|
-
.run-card.no-caret { grid-template-columns: 80px minmax(0, 1fr); }
|
|
59
|
-
.run-card.has-extra { grid-template-columns: 16px 80px auto minmax(0, 1fr); }
|
|
60
|
-
.run-card.no-caret.has-extra { grid-template-columns: 80px auto minmax(0, 1fr); }
|
|
61
|
-
.run-age { grid-column: 3; }
|
|
62
|
-
.run-card.no-caret .run-age { grid-column: 2; }
|
|
63
|
-
.run-card.has-extra .run-age { grid-column: 4; }
|
|
64
|
-
.run-card.no-caret.has-extra .run-age { grid-column: 3; }
|
|
65
|
-
.todo { grid-template-columns: 4px minmax(0, 1fr); }
|
|
66
|
-
.todo-cta { grid-column: 2; margin-top: var(--sp-2); }
|
|
67
|
-
/* Extra. v0.50.0 brought the rail's segment floor down here so a band was
|
|
68
|
-
never squeezed to a sliver. v0.53.0 deleted that floor entirely: the band
|
|
69
|
-
ladder puts the proportional bar INSIDE a full-width row, so there is
|
|
70
|
-
nothing left to squeeze and nothing left to tune per viewport. What the
|
|
71
|
-
ladder does need at this width is for its head to stop pretending it has
|
|
72
|
-
five columns. */
|
|
73
|
-
.ex-band-head { grid-template-columns: minmax(0, 30%) minmax(0, auto) minmax(0, 1fr) 16px; }
|
|
74
|
-
/* v0.55.0 — EVERY VARIANT COLLAPSES EXPLICITLY. A position row has no bar, so
|
|
75
|
-
its first column is the slot name rather than a track; leaving it on the
|
|
76
|
-
band template here would put the target under the caret. */
|
|
77
|
-
.ex-slot-head { grid-template-columns: minmax(0, 40%) minmax(0, 1fr) 16px; }
|
|
78
|
-
.ex-slot-when { grid-column: 1 / -1; }
|
|
79
|
-
/* v1.5.0 — /orc-test. Every grid here DECLARES its columns, so every one of
|
|
80
|
-
them collapses explicitly rather than inheriting a template it no longer
|
|
81
|
-
has the width for. The route, the case row and the OWASP row all keep the
|
|
82
|
-
SAME child count in every state (that is the `.ex-tool` lesson), so the
|
|
83
|
-
collapse is a template change and never a hidden child. */
|
|
84
|
-
.ts-route { grid-template-columns: 56px minmax(0, 1fr); }
|
|
85
|
-
.ts-route > .chip { grid-column: 2; justify-self: start; }
|
|
86
|
-
.ts-where { grid-column: 1 / -1; }
|
|
87
|
-
.ts-case { grid-template-columns: 56px minmax(0, 1fr); }
|
|
88
|
-
.ts-case > .chip { grid-column: 2; justify-self: start; }
|
|
89
|
-
.ts-case-mid { grid-column: 1 / -1; }
|
|
90
|
-
.ts-case-tail { grid-column: 1 / -1; justify-content: flex-start; }
|
|
91
|
-
.ts-owasp { grid-template-columns: 56px minmax(0, 1fr); }
|
|
92
|
-
.ts-owasp-mid { grid-column: 1 / -1; }
|
|
93
|
-
.ex-band-chips { grid-column: 1 / -1; justify-content: flex-start; }
|
|
94
|
-
.ex-route-controls { align-items: stretch; }
|
|
95
|
-
.ex-route-controls .btn { width: 100%; }
|
|
96
|
-
/* v0.53.0 — `.ex-tool` was the one `.ex-*` block with no entry here at all.
|
|
97
|
-
At this width a tool card's actions are the reason you opened the panel, so
|
|
98
|
-
they go full width rather than being squeezed onto the end of a row. */
|
|
99
|
-
.ex-tool > .row-actions:not(:first-child) { align-items: stretch; }
|
|
100
|
-
.ex-tool > .row-actions:not(:first-child) .btn { width: 100%; }
|
|
101
|
-
/* v0.54.0 — a recovery row's identity is the longest thing in it, so at this
|
|
102
|
-
width it takes its own line rather than truncating a profile and a model
|
|
103
|
-
into nothing. The row is a FLEX COLUMN, so this is a wrap rather than a
|
|
104
|
-
second grid template. */
|
|
105
|
-
.ex-rec-head { flex-wrap: wrap; }
|
|
106
|
-
.ex-rec-who { flex: 1 1 100%; white-space: normal; }
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
@media (max-width: 600px) {
|
|
110
|
-
/* Below this there is no honest way to keep a chip, a slug and an age on one
|
|
111
|
-
line, so the card stacks: chip, then the slug and where it stands, then the
|
|
112
|
-
age. One column, in reading order. */
|
|
113
|
-
.run-card,
|
|
114
|
-
.run-card.no-caret,
|
|
115
|
-
.run-card.has-extra,
|
|
116
|
-
.run-card.no-caret.has-extra {
|
|
117
|
-
grid-template-columns: minmax(0, 1fr);
|
|
118
|
-
gap: var(--sp-2);
|
|
119
|
-
}
|
|
120
|
-
.run-caret { display: none; }
|
|
121
|
-
.run-card .run-age { grid-column: 1; }
|
|
122
|
-
/* Extra: the provider catalog stops being a grid — below this a two-column
|
|
123
|
-
tile cannot hold a base URL and two links without wrapping mid-word — and
|
|
124
|
-
the connect form's two columns become one. */
|
|
125
|
-
.ex-provider-grid { grid-template-columns: minmax(0, 1fr); }
|
|
126
|
-
.ex-strip { gap: var(--sp-3); }
|
|
127
|
-
.ex-route-controls > * { flex: 1 1 100%; }
|
|
128
|
-
/* The tool card's head stops being a row: a label, a binary name and a state
|
|
129
|
-
chip cannot share a line honestly below this. */
|
|
130
|
-
.ex-tool > .row-actions:first-child { flex-direction: column; align-items: flex-start; }
|
|
131
|
-
/* A per-file position line cannot hold a path, a state word and a line delta
|
|
132
|
-
on one row below this — and the path is the half that must stay readable. */
|
|
133
|
-
.ex-rec-file { flex-direction: column; align-items: flex-start; }
|
|
134
|
-
|
|
135
|
-
/* v1.3.0 — the CLI Hook Interface. Every variant that DECLARES columns
|
|
136
|
-
collapses explicitly; the ones that do not (the chip, the palette row) are
|
|
137
|
-
flex and wrap on their own, which is exactly why they were written that
|
|
138
|
-
way. The PREVIEW never collapses: it is a monospaced grid and squeezing it
|
|
139
|
-
would misreport the width the user is deciding. It scrolls instead. */
|
|
140
|
-
.hk-degrade-row,
|
|
141
|
-
.hk-compare-row,
|
|
142
|
-
.hk-field,
|
|
143
|
-
.hk-check {
|
|
144
|
-
grid-template-columns: 1fr;
|
|
145
|
-
gap: 4px;
|
|
146
|
-
}
|
|
147
|
-
.hk-degrade-label,
|
|
148
|
-
.hk-compare-label {
|
|
149
|
-
text-align: left;
|
|
150
|
-
}
|
|
151
|
-
.hk-gallery {
|
|
152
|
-
grid-template-columns: 1fr 1fr;
|
|
153
|
-
}
|
|
154
|
-
.hk-prow-id {
|
|
155
|
-
min-width: 0;
|
|
156
|
-
}
|
|
157
|
-
/* v1.4.1 — the editor's two-column field (a name plus the sentence that
|
|
158
|
-
explains it, then the control) stacks; and DRAG IS OFF below this width. A
|
|
159
|
-
40-pixel drop gap on a phone is not a target, so the three buttons on every
|
|
160
|
-
chip are the path — which is why they are buttons on the chip and not a
|
|
161
|
-
menu behind one. */
|
|
162
|
-
.hk-chip {
|
|
163
|
-
max-width: none;
|
|
164
|
-
flex-basis: 100%;
|
|
165
|
-
cursor: default;
|
|
166
|
-
}
|
|
167
|
-
.hk-grip { display: none; }
|
|
168
|
-
.hk-add { flex-basis: 100%; }
|
|
169
|
-
.hk-picker, .hk-editor { min-width: 0; }
|
|
170
|
-
.hk-theme { flex-basis: 100%; max-width: none; }
|
|
171
|
-
/* The caution KEEPS its two columns. The mark and the sentence belong to each
|
|
172
|
-
other, and stacking them puts a lone ✕ on a line of its own above the text
|
|
173
|
-
it is about. The mark column narrows instead. */
|
|
174
|
-
.hk-caution {
|
|
175
|
-
grid-template-columns: 14px 1fr;
|
|
176
|
-
gap: 6px;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
1
|
+
/* 06-responsive.css — orc ui
|
|
2
|
+
The width breakpoints that cross panel boundaries (the rail becomes a strip,
|
|
3
|
+
the Learn rail becomes a scrollable row). They override rules from the shell
|
|
4
|
+
AND from four panels, so they load after every one of them — the same reason
|
|
5
|
+
04-motion.css is last. Breakpoints that only touch ONE panel stay in that
|
|
6
|
+
panel's file.
|
|
7
|
+
|
|
8
|
+
The <link> ORDER in app.html is the cascade order, and the numeric
|
|
9
|
+
prefix is that order. No @import: it would carry no session token and
|
|
10
|
+
401. */
|
|
11
|
+
|
|
12
|
+
/* --------------------------------------------------------------- RESPONSIVE */
|
|
13
|
+
|
|
14
|
+
@media (max-width: 1040px) {
|
|
15
|
+
/* The Learn rail stops being a rail and becomes a scrollable strip above the
|
|
16
|
+
reading pane — a 244px column plus prose does not fit twice over. */
|
|
17
|
+
.learn { grid-template-columns: 1fr; }
|
|
18
|
+
.learn-side { position: static; max-height: none; }
|
|
19
|
+
.learn-nav { flex-direction: row; overflow-x: auto; padding-bottom: 2px; }
|
|
20
|
+
.learn-nav-item { flex: 0 0 auto; max-width: 210px; }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@media (max-width: 900px) {
|
|
24
|
+
.shell { grid-template-columns: 1fr; }
|
|
25
|
+
.rail {
|
|
26
|
+
position: static;
|
|
27
|
+
height: auto;
|
|
28
|
+
flex-direction: row;
|
|
29
|
+
align-items: center;
|
|
30
|
+
gap: var(--sp-4);
|
|
31
|
+
overflow-x: auto;
|
|
32
|
+
border-right: 0;
|
|
33
|
+
border-bottom: 1px solid var(--line-soft);
|
|
34
|
+
}
|
|
35
|
+
.nav { flex-direction: row; flex-wrap: nowrap; }
|
|
36
|
+
.nav a { white-space: nowrap; }
|
|
37
|
+
.rail-foot { flex-direction: row; align-items: center; }
|
|
38
|
+
.rail-project { max-width: 180px; }
|
|
39
|
+
.main { padding: var(--sp-4); }
|
|
40
|
+
.setting { grid-template-columns: 1fr; }
|
|
41
|
+
.setting-control { align-items: flex-start; }
|
|
42
|
+
/* The rank ladder keeps its prio column — it is 34px and it is the thing
|
|
43
|
+
that makes the row readable as a ladder rather than a list. The state
|
|
44
|
+
chip wraps under instead, which is the only child that can spare the
|
|
45
|
+
line. Declared explicitly, like every `.run-card` variant below. */
|
|
46
|
+
.rank-row { grid-template-columns: 34px minmax(0, 1fr); }
|
|
47
|
+
.rank-row > .chip { grid-column: 2; justify-self: start; }
|
|
48
|
+
/* A phase row drops its right-hand column under the body rather than
|
|
49
|
+
squeezing it: `read`, `when` and the layer list are facts, and a fact
|
|
50
|
+
wrapped to one character per line is not readable. Declared explicitly. */
|
|
51
|
+
.phase-row { grid-template-columns: 28px minmax(0, 1fr); }
|
|
52
|
+
.phase-right { grid-column: 2; flex-direction: row; flex-wrap: wrap; align-items: center; }
|
|
53
|
+
.call-detail { padding-left: var(--sp-3); }
|
|
54
|
+
/* Every `.run-card` VARIANT collapses explicitly. A variant that inherits a
|
|
55
|
+
column count it does not have is the v0.49.2 Overview collision again, just
|
|
56
|
+
at a narrower width. */
|
|
57
|
+
.run-card { grid-template-columns: 16px 80px minmax(0, 1fr); }
|
|
58
|
+
.run-card.no-caret { grid-template-columns: 80px minmax(0, 1fr); }
|
|
59
|
+
.run-card.has-extra { grid-template-columns: 16px 80px auto minmax(0, 1fr); }
|
|
60
|
+
.run-card.no-caret.has-extra { grid-template-columns: 80px auto minmax(0, 1fr); }
|
|
61
|
+
.run-age { grid-column: 3; }
|
|
62
|
+
.run-card.no-caret .run-age { grid-column: 2; }
|
|
63
|
+
.run-card.has-extra .run-age { grid-column: 4; }
|
|
64
|
+
.run-card.no-caret.has-extra .run-age { grid-column: 3; }
|
|
65
|
+
.todo { grid-template-columns: 4px minmax(0, 1fr); }
|
|
66
|
+
.todo-cta { grid-column: 2; margin-top: var(--sp-2); }
|
|
67
|
+
/* Extra. v0.50.0 brought the rail's segment floor down here so a band was
|
|
68
|
+
never squeezed to a sliver. v0.53.0 deleted that floor entirely: the band
|
|
69
|
+
ladder puts the proportional bar INSIDE a full-width row, so there is
|
|
70
|
+
nothing left to squeeze and nothing left to tune per viewport. What the
|
|
71
|
+
ladder does need at this width is for its head to stop pretending it has
|
|
72
|
+
five columns. */
|
|
73
|
+
.ex-band-head { grid-template-columns: minmax(0, 30%) minmax(0, auto) minmax(0, 1fr) 16px; }
|
|
74
|
+
/* v0.55.0 — EVERY VARIANT COLLAPSES EXPLICITLY. A position row has no bar, so
|
|
75
|
+
its first column is the slot name rather than a track; leaving it on the
|
|
76
|
+
band template here would put the target under the caret. */
|
|
77
|
+
.ex-slot-head { grid-template-columns: minmax(0, 40%) minmax(0, 1fr) 16px; }
|
|
78
|
+
.ex-slot-when { grid-column: 1 / -1; }
|
|
79
|
+
/* v1.5.0 — /orc-test. Every grid here DECLARES its columns, so every one of
|
|
80
|
+
them collapses explicitly rather than inheriting a template it no longer
|
|
81
|
+
has the width for. The route, the case row and the OWASP row all keep the
|
|
82
|
+
SAME child count in every state (that is the `.ex-tool` lesson), so the
|
|
83
|
+
collapse is a template change and never a hidden child. */
|
|
84
|
+
.ts-route { grid-template-columns: 56px minmax(0, 1fr); }
|
|
85
|
+
.ts-route > .chip { grid-column: 2; justify-self: start; }
|
|
86
|
+
.ts-where { grid-column: 1 / -1; }
|
|
87
|
+
.ts-case { grid-template-columns: 56px minmax(0, 1fr); }
|
|
88
|
+
.ts-case > .chip { grid-column: 2; justify-self: start; }
|
|
89
|
+
.ts-case-mid { grid-column: 1 / -1; }
|
|
90
|
+
.ts-case-tail { grid-column: 1 / -1; justify-content: flex-start; }
|
|
91
|
+
.ts-owasp { grid-template-columns: 56px minmax(0, 1fr); }
|
|
92
|
+
.ts-owasp-mid { grid-column: 1 / -1; }
|
|
93
|
+
.ex-band-chips { grid-column: 1 / -1; justify-content: flex-start; }
|
|
94
|
+
.ex-route-controls { align-items: stretch; }
|
|
95
|
+
.ex-route-controls .btn { width: 100%; }
|
|
96
|
+
/* v0.53.0 — `.ex-tool` was the one `.ex-*` block with no entry here at all.
|
|
97
|
+
At this width a tool card's actions are the reason you opened the panel, so
|
|
98
|
+
they go full width rather than being squeezed onto the end of a row. */
|
|
99
|
+
.ex-tool > .row-actions:not(:first-child) { align-items: stretch; }
|
|
100
|
+
.ex-tool > .row-actions:not(:first-child) .btn { width: 100%; }
|
|
101
|
+
/* v0.54.0 — a recovery row's identity is the longest thing in it, so at this
|
|
102
|
+
width it takes its own line rather than truncating a profile and a model
|
|
103
|
+
into nothing. The row is a FLEX COLUMN, so this is a wrap rather than a
|
|
104
|
+
second grid template. */
|
|
105
|
+
.ex-rec-head { flex-wrap: wrap; }
|
|
106
|
+
.ex-rec-who { flex: 1 1 100%; white-space: normal; }
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@media (max-width: 600px) {
|
|
110
|
+
/* Below this there is no honest way to keep a chip, a slug and an age on one
|
|
111
|
+
line, so the card stacks: chip, then the slug and where it stands, then the
|
|
112
|
+
age. One column, in reading order. */
|
|
113
|
+
.run-card,
|
|
114
|
+
.run-card.no-caret,
|
|
115
|
+
.run-card.has-extra,
|
|
116
|
+
.run-card.no-caret.has-extra {
|
|
117
|
+
grid-template-columns: minmax(0, 1fr);
|
|
118
|
+
gap: var(--sp-2);
|
|
119
|
+
}
|
|
120
|
+
.run-caret { display: none; }
|
|
121
|
+
.run-card .run-age { grid-column: 1; }
|
|
122
|
+
/* Extra: the provider catalog stops being a grid — below this a two-column
|
|
123
|
+
tile cannot hold a base URL and two links without wrapping mid-word — and
|
|
124
|
+
the connect form's two columns become one. */
|
|
125
|
+
.ex-provider-grid { grid-template-columns: minmax(0, 1fr); }
|
|
126
|
+
.ex-strip { gap: var(--sp-3); }
|
|
127
|
+
.ex-route-controls > * { flex: 1 1 100%; }
|
|
128
|
+
/* The tool card's head stops being a row: a label, a binary name and a state
|
|
129
|
+
chip cannot share a line honestly below this. */
|
|
130
|
+
.ex-tool > .row-actions:first-child { flex-direction: column; align-items: flex-start; }
|
|
131
|
+
/* A per-file position line cannot hold a path, a state word and a line delta
|
|
132
|
+
on one row below this — and the path is the half that must stay readable. */
|
|
133
|
+
.ex-rec-file { flex-direction: column; align-items: flex-start; }
|
|
134
|
+
|
|
135
|
+
/* v1.3.0 — the CLI Hook Interface. Every variant that DECLARES columns
|
|
136
|
+
collapses explicitly; the ones that do not (the chip, the palette row) are
|
|
137
|
+
flex and wrap on their own, which is exactly why they were written that
|
|
138
|
+
way. The PREVIEW never collapses: it is a monospaced grid and squeezing it
|
|
139
|
+
would misreport the width the user is deciding. It scrolls instead. */
|
|
140
|
+
.hk-degrade-row,
|
|
141
|
+
.hk-compare-row,
|
|
142
|
+
.hk-field,
|
|
143
|
+
.hk-check {
|
|
144
|
+
grid-template-columns: 1fr;
|
|
145
|
+
gap: 4px;
|
|
146
|
+
}
|
|
147
|
+
.hk-degrade-label,
|
|
148
|
+
.hk-compare-label {
|
|
149
|
+
text-align: left;
|
|
150
|
+
}
|
|
151
|
+
.hk-gallery {
|
|
152
|
+
grid-template-columns: 1fr 1fr;
|
|
153
|
+
}
|
|
154
|
+
.hk-prow-id {
|
|
155
|
+
min-width: 0;
|
|
156
|
+
}
|
|
157
|
+
/* v1.4.1 — the editor's two-column field (a name plus the sentence that
|
|
158
|
+
explains it, then the control) stacks; and DRAG IS OFF below this width. A
|
|
159
|
+
40-pixel drop gap on a phone is not a target, so the three buttons on every
|
|
160
|
+
chip are the path — which is why they are buttons on the chip and not a
|
|
161
|
+
menu behind one. */
|
|
162
|
+
.hk-chip {
|
|
163
|
+
max-width: none;
|
|
164
|
+
flex-basis: 100%;
|
|
165
|
+
cursor: default;
|
|
166
|
+
}
|
|
167
|
+
.hk-grip { display: none; }
|
|
168
|
+
.hk-add { flex-basis: 100%; }
|
|
169
|
+
.hk-picker, .hk-editor { min-width: 0; }
|
|
170
|
+
.hk-theme { flex-basis: 100%; max-width: none; }
|
|
171
|
+
/* The caution KEEPS its two columns. The mark and the sentence belong to each
|
|
172
|
+
other, and stacking them puts a lone ✕ on a line of its own above the text
|
|
173
|
+
it is about. The mark column narrows instead. */
|
|
174
|
+
.hk-caution {
|
|
175
|
+
grid-template-columns: 14px 1fr;
|
|
176
|
+
gap: 6px;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* The Behaviour panel (v2.0.0 W7) on a phone. No sideways page scroll at 375 px:
|
|
181
|
+
the orbit goes, the tiles pair up, the rows stack, and the heat map keeps all
|
|
182
|
+
24 columns but labels every other hour. */
|
|
183
|
+
@media (max-width: 860px) {
|
|
184
|
+
.bh-orbit { display: none; }
|
|
185
|
+
.bh-hero { padding: var(--sp-4); }
|
|
186
|
+
.bh-tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
187
|
+
.bh-tile { padding: var(--sp-2) var(--sp-3); }
|
|
188
|
+
.bh-tile-v { font-size: 22px; }
|
|
189
|
+
.bh-portrait li { flex-direction: column; gap: 0; font-size: 14px; }
|
|
190
|
+
.bh-portrait .bh-k { min-width: 0; }
|
|
191
|
+
.bh-tab { padding: 8px 10px; }
|
|
192
|
+
.bh-habit-body { grid-template-columns: 52px minmax(0, 1fr); }
|
|
193
|
+
.bh-ring { width: 52px; height: 52px; }
|
|
194
|
+
.bh-log-row { grid-template-columns: minmax(0, 1fr) auto; row-gap: 2px; }
|
|
195
|
+
.bh-log-row .t, .bh-log-row .bh-log-q { grid-column: 1 / -1; }
|
|
196
|
+
.bh-cat { grid-template-columns: minmax(0, 96px) minmax(0, 1fr) 70px; }
|
|
197
|
+
.bh-lesson { grid-template-columns: 48px minmax(0, 1fr); }
|
|
198
|
+
.bh-lesson-right { grid-column: 1 / -1; flex-direction: row; justify-content: flex-start; }
|
|
199
|
+
.bh-heat { grid-template-columns: 26px repeat(24, minmax(0, 1fr)); gap: 2px; }
|
|
200
|
+
.bh-heat .h:nth-child(odd) { visibility: hidden; }
|
|
201
|
+
.bh-lesson > .btn { grid-column: 1 / -1; justify-self: start; }
|
|
202
|
+
.bh-src-bar span { padding: 0; font-size: 0; } /* too narrow to label: the row badges and the title carry the source */
|
|
203
|
+
}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/* panels/behaviour.css — orc ui
|
|
2
|
+
The Behaviour panel (v2.0.0 W7): layout only. Motion is NOT here — every
|
|
3
|
+
animation and the ONE reduced-motion block live in 04-motion.css, and the
|
|
4
|
+
phone layout lives in 06-responsive.css. Colours are tokens only: the seven
|
|
5
|
+
series colours --s1 … --s7 are defined in 00-tokens.css.
|
|
6
|
+
|
|
7
|
+
The panel never branches on a CLI word. A state, a class, a `by=` value, a
|
|
8
|
+
gotcha source or status arrives as a `data-*` attribute, and THIS file maps
|
|
9
|
+
it to a token — so a colour is never the only signal (the word is always in
|
|
10
|
+
the chip), and the JS names no state.
|
|
11
|
+
|
|
12
|
+
The <link> ORDER in app.html is the cascade order, and the numeric
|
|
13
|
+
prefix is that order. No @import: it would carry no session token and
|
|
14
|
+
401. */
|
|
15
|
+
|
|
16
|
+
.bh-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
|
|
17
|
+
.bh-dim { color: var(--text-dim); }
|
|
18
|
+
.bh-faint { color: var(--text-faint); }
|
|
19
|
+
|
|
20
|
+
/* ── head: the learning switch and the window switch ─────────────────────── */
|
|
21
|
+
.bh-headright { display: flex; gap: var(--sp-3); align-items: center; flex-wrap: wrap; }
|
|
22
|
+
.bh-seg { display: inline-flex; align-items: center; background: var(--surface-2); border: 1px solid var(--line); border-radius: 100px; padding: 2px; }
|
|
23
|
+
.bh-seg button { border: 0; background: none; padding: 4px 12px; border-radius: 100px; cursor: pointer; color: var(--text-dim); font: inherit; font-size: 12px; }
|
|
24
|
+
.bh-seg button[aria-pressed="true"] { background: var(--surface); color: var(--text); box-shadow: 0 1px 0 var(--line); }
|
|
25
|
+
.bh-seg-mode button[aria-pressed="true"] { background: var(--accent); color: var(--surface); }
|
|
26
|
+
.bh-seg-label { font-size: 11px; text-transform: uppercase; letter-spacing: .07em; color: var(--text-faint); padding: 0 8px 0 10px; }
|
|
27
|
+
.bh-seg button:focus-visible, .bh-tab:focus-visible, .bh-input:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
28
|
+
|
|
29
|
+
/* ── the hero ────────────────────────────────────────────────────────────── */
|
|
30
|
+
.bh-hero {
|
|
31
|
+
position: relative; overflow: hidden; border-radius: var(--radius-lg); border: 1px solid var(--line);
|
|
32
|
+
padding: var(--sp-5) var(--sp-5) var(--sp-4);
|
|
33
|
+
background: radial-gradient(900px 260px at 0% 0%, var(--accent-wash), transparent 60%), var(--surface);
|
|
34
|
+
display: flex; flex-direction: column; gap: var(--sp-3);
|
|
35
|
+
}
|
|
36
|
+
.bh-eyebrow { font-size: 11px; letter-spacing: .09em; text-transform: uppercase; color: var(--text-faint); display: flex; gap: var(--sp-2); align-items: center; flex-wrap: wrap; }
|
|
37
|
+
.bh-portrait { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
|
|
38
|
+
.bh-portrait li { font-size: 15px; line-height: 1.45; display: flex; gap: 10px; align-items: baseline; }
|
|
39
|
+
.bh-portrait .bh-k { font-size: 11px; color: var(--text-faint); min-width: 70px; }
|
|
40
|
+
.bh-orbit { position: absolute; right: -40px; top: -40px; width: 260px; height: 260px; opacity: .55; pointer-events: none; }
|
|
41
|
+
.bh-orbit circle { fill: none; stroke: var(--line); stroke-width: 1; }
|
|
42
|
+
.bh-orbit .sat { fill: var(--accent); stroke: none; }
|
|
43
|
+
.bh-off-title { font-size: 18px; font-weight: 650; }
|
|
44
|
+
.bh-off-list { margin: 0 0 0 18px; display: flex; flex-direction: column; gap: 6px; color: var(--text-dim); }
|
|
45
|
+
.bh-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: var(--sp-3); }
|
|
46
|
+
.bh-tile { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: var(--sp-3) var(--sp-4); min-width: 0; }
|
|
47
|
+
.bh-tile-l { font-size: 11px; text-transform: uppercase; letter-spacing: .07em; color: var(--text-faint); }
|
|
48
|
+
.bh-tile-v { font-size: 28px; font-weight: 650; letter-spacing: -.02em; line-height: 1.15; margin-top: 2px; font-variant-numeric: tabular-nums; }
|
|
49
|
+
.bh-tile-v small { font-size: 13px; color: var(--text-dim); font-weight: 500; margin-left: 6px; }
|
|
50
|
+
.bh-tile-n { font-size: 11px; color: var(--text-dim); }
|
|
51
|
+
.chip[data-mode="propose"] { background: var(--accent-wash); color: var(--accent); }
|
|
52
|
+
|
|
53
|
+
/* ── the tabs ────────────────────────────────────────────────────────────── */
|
|
54
|
+
.bh-tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--line); position: relative; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
|
|
55
|
+
.bh-tab { flex: none; white-space: nowrap; }
|
|
56
|
+
.bh-tab { border: 0; background: none; padding: 10px 14px; cursor: pointer; color: var(--text-dim); font: inherit; font-weight: 550; display: flex; gap: 6px; align-items: center; border-radius: var(--radius-sm) var(--radius-sm) 0 0; }
|
|
57
|
+
.bh-tab:hover { color: var(--text); background: var(--surface-2); }
|
|
58
|
+
.bh-tab[aria-selected="true"] { color: var(--text); }
|
|
59
|
+
.bh-count { font-family: var(--mono); font-size: 10px; padding: 1px 6px; border-radius: 100px; background: var(--surface-3); color: var(--text-dim); }
|
|
60
|
+
.bh-count.hot { background: var(--accent-wash); color: var(--accent); }
|
|
61
|
+
.bh-tab-ink { position: absolute; bottom: 0; left: 0; width: 0; height: 2px; background: var(--accent); border-radius: 2px; }
|
|
62
|
+
|
|
63
|
+
/* ── the CLI's words, mapped to tokens ───────────────────────────────────── */
|
|
64
|
+
.chip[data-state="proposed"], .chip[data-status="candidate"] { background: var(--accent-wash); color: var(--accent); }
|
|
65
|
+
.chip[data-state="applied"], .chip[data-status="active"], .chip[data-sync="ok"] { background: var(--ok-wash); color: var(--ok); }
|
|
66
|
+
.chip[data-state="stale"], .chip[data-state="shadowed"], .chip[data-status="quiet"], .chip[data-sync="timed out"] { background: var(--warn-wash); color: var(--warn); }
|
|
67
|
+
.chip[data-state="never"], .chip[data-status="orphaned"], .chip[data-sync="failed"] { background: var(--bad-wash); color: var(--bad); }
|
|
68
|
+
.chip[data-by="ledger"] { background: var(--warn-wash); color: var(--warn); }
|
|
69
|
+
.chip[data-by="learned"] { background: var(--accent-wash); color: var(--accent); }
|
|
70
|
+
.chip[data-by="config"] { background: var(--ok-wash); color: var(--ok); }
|
|
71
|
+
.bh-cls { font-family: var(--mono); font-size: 10px; padding: 1px 6px; border-radius: 4px; border: 1px solid var(--line); color: var(--text-dim); }
|
|
72
|
+
.bh-cls[data-cls="apply"] { border-color: color-mix(in srgb, var(--ok) 45%, var(--line)); color: var(--ok); }
|
|
73
|
+
.bh-cls[data-cls="suggest"] { border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); color: var(--accent); }
|
|
74
|
+
.bh-cls[data-cls="never"] { border-color: color-mix(in srgb, var(--bad) 45%, var(--line)); color: var(--bad); }
|
|
75
|
+
|
|
76
|
+
/* ── Habits ──────────────────────────────────────────────────────────────── */
|
|
77
|
+
.bh-legend { display: flex; gap: var(--sp-2) var(--sp-4); flex-wrap: wrap; align-items: center; }
|
|
78
|
+
.bh-next { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
|
|
79
|
+
.bh-next li { display: flex; gap: var(--sp-2); align-items: baseline; flex-wrap: wrap; }
|
|
80
|
+
.bh-habits { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(340px, 100%), 1fr)); gap: var(--sp-4); }
|
|
81
|
+
.bh-habit { position: relative; background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); padding: var(--sp-4); display: flex; flex-direction: column; gap: var(--sp-3); min-width: 0; }
|
|
82
|
+
.bh-habit:hover { border-color: var(--text-faint); box-shadow: var(--shadow); }
|
|
83
|
+
.bh-habit:focus { outline: 2px solid var(--accent); outline-offset: 2px; }
|
|
84
|
+
.bh-habit[data-state="proposed"] { border-color: color-mix(in srgb, var(--accent) 55%, var(--line)); }
|
|
85
|
+
.bh-habit[data-state="never"] { background: repeating-linear-gradient(135deg, var(--surface), var(--surface) 10px, var(--surface-2) 10px, var(--surface-2) 20px); }
|
|
86
|
+
.bh-habit-top { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; }
|
|
87
|
+
.bh-habit-top > .chip { margin-left: auto; }
|
|
88
|
+
.bh-lane { font-size: 11px; color: var(--text-dim); background: var(--surface-2); border: 1px solid var(--line-soft); padding: 1px 7px; border-radius: var(--radius-sm); }
|
|
89
|
+
.bh-qid { font-size: 11px; color: var(--text-faint); overflow-wrap: anywhere; }
|
|
90
|
+
.bh-habit-body { display: grid; grid-template-columns: 64px minmax(0, 1fr); gap: var(--sp-3); align-items: center; }
|
|
91
|
+
.bh-habit h3 { font-size: 15px; font-weight: 600; margin: 0; }
|
|
92
|
+
.bh-line { color: var(--text-dim); font-size: 12.5px; }
|
|
93
|
+
.bh-ring { width: 64px; height: 64px; }
|
|
94
|
+
.bh-ring .bg { fill: none; stroke: var(--surface-3); stroke-width: 6; }
|
|
95
|
+
.bh-ring .fg { fill: none; stroke-width: 6; stroke-linecap: round; transform: rotate(-90deg); transform-origin: 50% 50%; stroke: var(--accent); }
|
|
96
|
+
.bh-ring[data-state="applied"] .fg { stroke: var(--ok); }
|
|
97
|
+
.bh-ring[data-state="stale"] .fg, .bh-ring[data-state="shadowed"] .fg { stroke: var(--warn); }
|
|
98
|
+
.bh-ring[data-state="never"] .fg { stroke: var(--bad); }
|
|
99
|
+
.bh-ring[data-state="observed"] .fg, .bh-ring[data-state="declined"] .fg, .bh-ring[data-state="never-ask"] .fg { stroke: var(--idle); }
|
|
100
|
+
.bh-ring text { font: 600 14px var(--font); fill: var(--text); text-anchor: middle; dominant-baseline: central; }
|
|
101
|
+
.bh-ring text.s { font-size: 9px; fill: var(--text-faint); font-weight: 500; }
|
|
102
|
+
.bh-dist { display: flex; height: 10px; border-radius: 100px; overflow: hidden; background: var(--surface-3); gap: 2px; }
|
|
103
|
+
.bh-dist span { display: block; height: 100%; border-radius: 2px; background: var(--text-faint); }
|
|
104
|
+
.bh-dist span.is-top { background: var(--accent); }
|
|
105
|
+
.bh-habit[data-state="never"] .bh-dist span.is-top { background: var(--bad); }
|
|
106
|
+
.bh-habit[data-state="stale"] .bh-dist span.is-top { background: var(--warn); }
|
|
107
|
+
.bh-dist-legend { display: flex; gap: var(--sp-2) var(--sp-3); flex-wrap: wrap; font-size: 11px; color: var(--text-dim); align-items: center; }
|
|
108
|
+
.bh-dist-legend i { display: inline-block; width: 8px; height: 8px; border-radius: 2px; margin-right: 5px; background: var(--text-faint); }
|
|
109
|
+
.bh-dist-legend i.is-top { background: var(--accent); }
|
|
110
|
+
.bh-habit-meta { display: flex; gap: var(--sp-2) var(--sp-3); flex-wrap: wrap; font-size: 11px; color: var(--text-faint); align-items: center; }
|
|
111
|
+
.bh-habit-meta b { color: var(--text-dim); font-weight: 500; overflow-wrap: anywhere; }
|
|
112
|
+
.bh-streak { display: flex; gap: 3px; font-size: 11px; line-height: 1; font-family: var(--mono); }
|
|
113
|
+
.bh-streak i { font-style: normal; width: 11px; text-align: center; color: var(--text-faint); }
|
|
114
|
+
.bh-streak i.on { color: var(--accent); }
|
|
115
|
+
.bh-why { font-size: 11.5px; color: var(--text-dim); border-left: 2px solid var(--line); padding-left: var(--sp-2); }
|
|
116
|
+
.bh-actions-wrap { display: flex; flex-direction: column; gap: var(--sp-2); }
|
|
117
|
+
.bh-actions-wrap:empty { display: none; }
|
|
118
|
+
.bh-cmd { display: flex; align-items: center; gap: var(--sp-2); font-size: 11px; color: var(--text-dim); background: var(--surface-2); border: 1px dashed var(--line); border-radius: var(--radius-sm); padding: 4px 8px; min-width: 0; }
|
|
119
|
+
.bh-cmd .mono { overflow-wrap: anywhere; min-width: 0; }
|
|
120
|
+
.bh-cmd .copy-btn { margin-left: auto; flex: none; }
|
|
121
|
+
.bh-history { display: flex; flex-direction: column; gap: var(--sp-2); }
|
|
122
|
+
.bh-hist-row { display: flex; gap: var(--sp-2) var(--sp-3); align-items: center; flex-wrap: wrap; font-size: 12px; }
|
|
123
|
+
|
|
124
|
+
/* ── Rhythm ──────────────────────────────────────────────────────────────── */
|
|
125
|
+
.bh-heat { display: grid; grid-template-columns: 34px repeat(24, minmax(0, 1fr)); gap: 3px; align-items: center; }
|
|
126
|
+
.bh-heat .h { font-size: 9px; color: var(--text-faint); text-align: center; font-family: var(--mono); }
|
|
127
|
+
.bh-heat .d { font-size: 10px; color: var(--text-faint); font-family: var(--mono); }
|
|
128
|
+
.bh-heat .c { aspect-ratio: 1; border-radius: 3px; background: var(--surface-3); }
|
|
129
|
+
.bh-heat .c:hover { outline: 1px solid var(--text-faint); }
|
|
130
|
+
.bh-mix { display: flex; height: 22px; border-radius: 6px; overflow: hidden; gap: 2px; }
|
|
131
|
+
.bh-mix span { display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 600; color: var(--bg); white-space: nowrap; overflow: hidden; min-width: 0; }
|
|
132
|
+
.bh-mix-legend { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 6px var(--sp-4); font-size: 12px; }
|
|
133
|
+
.bh-mix-legend div { display: flex; align-items: center; gap: 8px; min-width: 0; }
|
|
134
|
+
.bh-mix-legend i { width: 10px; height: 10px; border-radius: 3px; flex: none; }
|
|
135
|
+
.bh-mix-legend .bh-dim { margin-left: auto; }
|
|
136
|
+
.bh-chart { width: 100%; height: 150px; display: block; }
|
|
137
|
+
.bh-chart .grid-l { stroke: var(--line-soft); stroke-width: 1; }
|
|
138
|
+
.bh-chart .ln { fill: none; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; stroke: var(--accent); }
|
|
139
|
+
.bh-chart .pt { stroke: var(--surface); stroke-width: 2; fill: var(--accent); }
|
|
140
|
+
.bh-chart[data-kind="ok"] .ln { stroke: var(--ok); }
|
|
141
|
+
.bh-chart[data-kind="ok"] .pt { fill: var(--ok); }
|
|
142
|
+
.bh-chart[data-kind="warn"] .ln { stroke: var(--warn); }
|
|
143
|
+
.bh-chart[data-kind="warn"] .pt { fill: var(--warn); }
|
|
144
|
+
.bh-chart .target { stroke: var(--ok); stroke-dasharray: 4 4; stroke-width: 1; }
|
|
145
|
+
.bh-chart text { font: 10px var(--mono); fill: var(--text-faint); }
|
|
146
|
+
.bh-how { display: flex; align-items: flex-end; gap: 6px; height: 130px; padding-top: 6px; }
|
|
147
|
+
.bh-how-col { flex: 1; display: flex; flex-direction: column-reverse; gap: 2px; height: 100%; min-width: 0; }
|
|
148
|
+
.bh-how-col span { display: block; border-radius: 3px; width: 100%; }
|
|
149
|
+
[data-by="user"].bh-grow-y, .bh-dist-legend i[data-by="user"] { background: var(--s7); }
|
|
150
|
+
[data-by="ledger"].bh-grow-y, .bh-dist-legend i[data-by="ledger"] { background: var(--s3); }
|
|
151
|
+
[data-by="learned"].bh-grow-y, .bh-dist-legend i[data-by="learned"] { background: var(--s1); }
|
|
152
|
+
[data-by="config"].bh-grow-y, .bh-dist-legend i[data-by="config"] { background: var(--s2); }
|
|
153
|
+
[data-by="default"].bh-grow-y, .bh-dist-legend i[data-by="default"] { background: var(--s4); }
|
|
154
|
+
|
|
155
|
+
/* ── Gotchas ─────────────────────────────────────────────────────────────── */
|
|
156
|
+
.bh-src-bar { display: flex; height: 26px; border-radius: 7px; overflow: hidden; gap: 2px; }
|
|
157
|
+
.bh-src-bar span { display: flex; align-items: center; padding: 0 8px; font-size: 11px; font-weight: 600; color: var(--bg); white-space: nowrap; overflow: hidden; min-width: 0; }
|
|
158
|
+
[data-source="repair"] { background: var(--s6); }
|
|
159
|
+
[data-source="drift"] { background: var(--s4); }
|
|
160
|
+
[data-source="review"] { background: var(--s2); }
|
|
161
|
+
[data-source="verify"] { background: var(--s3); }
|
|
162
|
+
[data-source="defect"] { background: var(--s5); }
|
|
163
|
+
[data-source="pr"] { background: var(--s1); }
|
|
164
|
+
[data-source="sonar"] { background: var(--s5); }
|
|
165
|
+
[data-source="sarif"] { background: var(--s4); }
|
|
166
|
+
[data-source="ci"] { background: var(--s3); }
|
|
167
|
+
[data-source="dismissal"] { background: var(--s7); }
|
|
168
|
+
.bh-lesson { display: grid; grid-template-columns: 56px minmax(0, 1fr) auto; gap: var(--sp-3); align-items: center; padding: var(--sp-3) 0; border-top: 1px solid var(--line-soft); }
|
|
169
|
+
.card > .bh-lesson:first-of-type { border-top: 0; }
|
|
170
|
+
.bh-lesson-id { font-size: 12px; color: var(--text-dim); }
|
|
171
|
+
.bh-lesson-rule { font-size: 13px; overflow-wrap: anywhere; }
|
|
172
|
+
.bh-lesson-sub { display: flex; gap: var(--sp-2); flex-wrap: wrap; align-items: center; margin-top: 3px; font-size: 11px; color: var(--text-faint); }
|
|
173
|
+
.bh-scope { color: var(--text-dim); overflow-wrap: anywhere; }
|
|
174
|
+
.bh-src { font-size: 10px; padding: 1px 6px; border-radius: 4px; color: var(--bg); }
|
|
175
|
+
.bh-lesson-right { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; }
|
|
176
|
+
.bh-spark { display: flex; align-items: flex-end; gap: 2px; height: 22px; }
|
|
177
|
+
.bh-spark i { width: 4px; border-radius: 1px; background: var(--accent); opacity: .8; }
|
|
178
|
+
.bh-spark i.zero { opacity: .25; }
|
|
179
|
+
.bh-input { width: 100%; background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 7px 10px; color: var(--text); font: 12px var(--mono); }
|
|
180
|
+
.bh-card-out { font-size: 11.5px; line-height: 1.6; background: var(--bg); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: var(--sp-3); white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text-dim); min-height: 90px; margin: 0; }
|
|
181
|
+
|
|
182
|
+
/* ── Review quality ──────────────────────────────────────────────────────── */
|
|
183
|
+
.bh-cat { display: grid; grid-template-columns: minmax(0, 150px) minmax(0, 1fr) 90px; gap: var(--sp-3); align-items: center; padding: 6px 0; }
|
|
184
|
+
.bh-cat-name { font-size: 11.5px; overflow-wrap: anywhere; }
|
|
185
|
+
.bh-cat-bar { height: 10px; background: var(--surface-3); border-radius: 100px; position: relative; }
|
|
186
|
+
.bh-cat-bar span { display: block; height: 100%; border-radius: 100px; }
|
|
187
|
+
.bh-cat-bar span[data-band="ok"] { background: var(--ok); }
|
|
188
|
+
.bh-cat-bar span[data-band="warn"] { background: var(--warn); }
|
|
189
|
+
.bh-cat-bar span[data-band="bad"] { background: var(--bad); }
|
|
190
|
+
.bh-cat-bar .tick { position: absolute; top: -3px; bottom: -3px; width: 2px; background: var(--text-faint); opacity: .6; }
|
|
191
|
+
.bh-cat-num { font-size: 11px; color: var(--text-dim); text-align: right; }
|
|
192
|
+
.bh-floor { font-size: 12px; color: var(--text-dim); border: 1px dashed var(--line); border-radius: var(--radius-sm); padding: var(--sp-4); text-align: center; }
|
|
193
|
+
|
|
194
|
+
/* ── Answer log ──────────────────────────────────────────────────────────── */
|
|
195
|
+
.bh-log-row { display: grid; grid-template-columns: 150px 90px minmax(0, 1fr) auto; gap: var(--sp-3); align-items: center; padding: 8px 0; border-top: 1px solid var(--line-soft); font-size: 12.5px; }
|
|
196
|
+
.bh-log-row:first-child { border-top: 0; }
|
|
197
|
+
.bh-log-row .t { font-size: 11px; color: var(--text-faint); }
|
|
198
|
+
.bh-log-row .ln { font-size: 11px; color: var(--text-dim); }
|
|
199
|
+
.bh-log-q { overflow-wrap: anywhere; }
|
|
200
|
+
|
|
201
|
+
/* ── footer + rail dot ───────────────────────────────────────────────────── */
|
|
202
|
+
.bh-foot { display: flex; gap: var(--sp-2) var(--sp-4); flex-wrap: wrap; align-items: center; font-size: 11.5px; color: var(--text-faint); }
|
|
203
|
+
.bh-foot .mono { overflow-wrap: anywhere; }
|
|
204
|
+
.bh-dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); margin-left: 6px; vertical-align: middle; }
|
|
205
|
+
.bh-tabpanel pre.cmd { white-space: pre-wrap; overflow-wrap: anywhere; margin: 0; }
|