@cyberskill/design 1.2.0 → 1.3.8

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.
Files changed (215) hide show
  1. package/DESIGN.md +4 -3
  2. package/README.md +20 -19
  3. package/SKILL.md +5 -5
  4. package/THIRD-PARTY-NOTICES.md +35 -0
  5. package/VERSION +1 -1
  6. package/_ds_bundle.js +701 -1342
  7. package/_esm/cs.mjs +2 -2
  8. package/_esm/react.mjs +6 -1
  9. package/_vendor/NOTICE.md +16 -0
  10. package/_vendor/babel/README.md +7 -0
  11. package/_vendor/babel/babel.min.js +4 -0
  12. package/_vendor/react/README.md +3 -0
  13. package/_vendor/react/react-dom.production.min.js +1 -0
  14. package/_vendor/react/react.production.min.js +1 -0
  15. package/assets/aurora-hoa.webp +0 -0
  16. package/assets/aurora-kim.webp +0 -0
  17. package/assets/aurora-moc.webp +0 -0
  18. package/assets/aurora-tho.webp +0 -0
  19. package/assets/aurora-thuy.webp +0 -0
  20. package/base/ai.css +8 -3
  21. package/base/collections.css +10 -4
  22. package/base/components.css +5 -2
  23. package/base/controls.css +58 -21
  24. package/base/data.css +1 -1
  25. package/base/feedback.css +9 -2
  26. package/base/forms.css +1 -1
  27. package/base/glass.css +1 -1
  28. package/base/interaction.css +6 -2
  29. package/base/navigation.css +1 -1
  30. package/base/reset.css +7 -1
  31. package/base/responsive.css +13 -12
  32. package/base/shell.css +8 -2
  33. package/components/_i18n/i18n.js +28 -3
  34. package/components/_i18n/strings.js +42 -24
  35. package/components/ai/ChatMessage.d.ts +2 -0
  36. package/components/ai/ChatMessage.jsx +8 -4
  37. package/components/ai/ConfidenceMeter.d.ts +2 -0
  38. package/components/ai/HumanReviewGate.d.ts +2 -0
  39. package/components/ai/PromptInput.d.ts +2 -0
  40. package/components/ai/TypingIndicator.d.ts +2 -0
  41. package/components/ai/ai-conversation.card.html +3 -3
  42. package/components/ai/ai-lumi.card.html +3 -3
  43. package/components/ai/ai.card.html +3 -3
  44. package/components/brand/brand.card.html +3 -3
  45. package/components/button/buttons.card.html +3 -3
  46. package/components/data/Image.jsx +18 -2
  47. package/components/data/Sortable.d.ts +5 -1
  48. package/components/data/Sortable.jsx +42 -9
  49. package/components/data/Sortable.prompt.md +4 -2
  50. package/components/data/Terminal.jsx +3 -2
  51. package/components/data/Tooltip.d.ts +2 -0
  52. package/components/data/Tooltip.jsx +6 -3
  53. package/components/data/Tree.d.ts +2 -1
  54. package/components/data/Tree.jsx +137 -16
  55. package/components/data/Tree.prompt.md +1 -1
  56. package/components/data/collections.card.html +3 -3
  57. package/components/data/data.card.html +3 -3
  58. package/components/datatable/DataTable.d.ts +24 -1
  59. package/components/datatable/DataTable.jsx +78 -5
  60. package/components/datatable/DataTable.prompt.md +2 -1
  61. package/components/datatable/datatable.card.html +20 -16
  62. package/components/dialog/dialog.card.html +3 -3
  63. package/components/feedback/Alert.d.ts +2 -0
  64. package/components/feedback/Alert.jsx +8 -2
  65. package/components/feedback/EmptyState.d.ts +2 -0
  66. package/components/feedback/EmptyState.jsx +6 -3
  67. package/components/feedback/ProgressBar.d.ts +2 -0
  68. package/components/feedback/ProgressBar.jsx +6 -3
  69. package/components/feedback/Toast.jsx +15 -1
  70. package/components/feedback/Toast.prompt.md +2 -1
  71. package/components/feedback/feedback-2.card.html +3 -3
  72. package/components/feedback/feedback.card.html +3 -3
  73. package/components/forms/Cascader.jsx +7 -2
  74. package/components/forms/FileUpload.d.ts +2 -0
  75. package/components/forms/Form.d.ts +3 -1
  76. package/components/forms/Form.jsx +9 -1
  77. package/components/forms/Form.prompt.md +1 -1
  78. package/components/forms/Mentions.d.ts +1 -1
  79. package/components/forms/Mentions.jsx +59 -7
  80. package/components/forms/Mentions.prompt.md +3 -1
  81. package/components/forms/Rating.d.ts +3 -2
  82. package/components/forms/Rating.jsx +34 -3
  83. package/components/forms/Rating.prompt.md +1 -1
  84. package/components/forms/Select.d.ts +2 -0
  85. package/components/forms/Select.jsx +6 -2
  86. package/components/forms/Slider.d.ts +2 -0
  87. package/components/forms/Slider.jsx +5 -2
  88. package/components/forms/Switch.d.ts +2 -0
  89. package/components/forms/Switch.jsx +7 -9
  90. package/components/forms/Toggle.d.ts +2 -0
  91. package/components/forms/Toggle.jsx +14 -2
  92. package/components/forms/forms-2.card.html +3 -3
  93. package/components/forms/forms.card.html +3 -3
  94. package/components/icon/Icon.d.ts +1 -1
  95. package/components/icon/Icon.prompt.md +1 -1
  96. package/components/icon/icon.card.html +3 -3
  97. package/components/logo/logo.card.html +3 -3
  98. package/components/navigation/CommandPalette.d.ts +2 -0
  99. package/components/navigation/Menu.d.ts +2 -0
  100. package/components/navigation/Menu.jsx +60 -6
  101. package/components/navigation/Steps.d.ts +2 -0
  102. package/components/navigation/Steps.jsx +6 -3
  103. package/components/navigation/Tabs.d.ts +2 -0
  104. package/components/navigation/Tabs.jsx +6 -3
  105. package/components/navigation/Toolbar.d.ts +3 -2
  106. package/components/navigation/Toolbar.jsx +117 -11
  107. package/components/navigation/Toolbar.prompt.md +1 -1
  108. package/components/navigation/navigation.card.html +3 -3
  109. package/components/navigation/shell.card.html +3 -3
  110. package/components/overlays/ContextMenu.d.ts +2 -0
  111. package/components/overlays/ContextMenu.jsx +6 -3
  112. package/components/overlays/Drawer.d.ts +2 -0
  113. package/components/overlays/alertdialog.card.html +3 -3
  114. package/components/overlays/overlays.card.html +3 -3
  115. package/components/textfield/textfield.card.html +3 -3
  116. package/dist/styles.min.css +312 -64
  117. package/docs/ci-cd.md +18 -13
  118. package/docs/consumer-grant.md +3 -0
  119. package/docs/consuming.md +7 -7
  120. package/docs/contrast-report.md +79 -1
  121. package/docs/conventions.md +17 -4
  122. package/docs/decisions.md +40 -2
  123. package/docs/deploy.md +17 -6
  124. package/docs/design-styles.md +1 -1
  125. package/docs/quality-gates.md +19 -11
  126. package/docs/release-runbook.md +78 -0
  127. package/docs/sync.md +1 -1
  128. package/docs/vi/ci-cd.md +16 -13
  129. package/docs/vi/consumer-grant.md +3 -0
  130. package/docs/vi/consuming.md +7 -7
  131. package/docs/vi/contrast-report.md +79 -1
  132. package/docs/vi/conventions.md +18 -5
  133. package/docs/vi/decisions.md +39 -2
  134. package/docs/vi/deploy.md +17 -6
  135. package/docs/vi/quality-gates.md +18 -11
  136. package/docs/vi/release-runbook.md +78 -0
  137. package/docs/vi/sync.md +1 -1
  138. package/docs/viewer.html +2 -2
  139. package/fonts/OFL.txt +98 -0
  140. package/guidelines/atomic-view.html +2 -2
  141. package/guidelines/brand-imagery.html +1 -1
  142. package/guidelines/elements-variants.html +5 -5
  143. package/guidelines/spacing-breakpoints.html +2 -1
  144. package/guidelines/surfaces-glass.html +1 -1
  145. package/llms.txt +4 -4
  146. package/package.json +28 -8
  147. package/templates/app-shell/AppShell.dc.html +3 -3
  148. package/templates/app-shell/content-schema.json +7 -0
  149. package/templates/article/Article.dc.html +3 -3
  150. package/templates/article/content-schema.json +7 -0
  151. package/templates/auth/Auth.dc.html +26 -10
  152. package/templates/auth/content-schema.json +25 -0
  153. package/templates/dashboard/Dashboard.dc.html +4 -4
  154. package/templates/dashboard/content-schema.json +7 -0
  155. package/templates/delivery-change-note/DeliveryChangeNote.dc.html +2 -2
  156. package/templates/delivery-runbook/DeliveryRunbook.dc.html +2 -2
  157. package/templates/email-safe/email-announcement.html +2 -2
  158. package/templates/email-safe/email-dunning.html +2 -2
  159. package/templates/email-safe/email-investor.html +2 -2
  160. package/templates/email-safe/email-launch.html +2 -2
  161. package/templates/email-safe/email-newsletter.html +2 -2
  162. package/templates/email-safe/email-status.html +2 -2
  163. package/templates/email-safe/email-transactional.html +2 -2
  164. package/templates/finance-dunning-email/FinanceDunningEmail.dc.html +2 -2
  165. package/templates/finance-expense-report/FinanceExpenseReport.dc.html +2 -2
  166. package/templates/finance-invoice/FinanceInvoice.dc.html +2 -2
  167. package/templates/finance-quote/FinanceQuote.dc.html +4 -4
  168. package/templates/hr-interview-kit/HrInterviewKit.dc.html +1 -1
  169. package/templates/marketing-case-study/MarketingCaseStudy.dc.html +1 -1
  170. package/templates/marketing-page/MarketingPage.dc.html +3 -3
  171. package/templates/marketing-page/content-schema.json +1 -0
  172. package/templates/settings/Settings.dc.html +3 -3
  173. package/templates/settings/content-schema.json +7 -0
  174. package/tokens/element-seeds.json +2 -2
  175. package/tokens/elements.css +193 -19
  176. package/tokens/native/CSTokens.kt +3 -2
  177. package/tokens/native/CSTokens.swift +3 -2
  178. package/tokens/native/cs_tokens.dart +3 -2
  179. package/tokens/provenance.json +8 -8
  180. package/tokens/spacing.css +2 -1
  181. package/tokens/tokens.dtcg.json +19 -14
  182. package/tokens/tokens.js +16 -15
  183. package/tokens/tokens.json +15 -14
  184. package/ui_kits/deck/index.html +1 -1
  185. package/ui_kits/status-hub/StatusHub.jsx +1 -1
  186. package/ui_kits/status-hub/login.html +52 -10
  187. package/ui_kits/status-hub/project.html +1 -1
  188. package/ui_kits/status-hub/settings.html +1 -1
  189. package/ui_kits/website/Website.jsx +1 -1
  190. package/ui_kits/website/careers.html +2 -2
  191. package/ui_kits/website/chat.html +1 -1
  192. package/ui_kits/website/site.css +1 -1
  193. package/ui_kits/website/work.html +2 -2
  194. package/assets/aurora-hoa.png +0 -0
  195. package/assets/aurora-kim.png +0 -0
  196. package/assets/aurora-moc.png +0 -0
  197. package/assets/aurora-thuy.png +0 -0
  198. package/docs/decisions/container-query-migration.md +0 -18
  199. package/docs/decisions/overlay-manager-design.md +0 -101
  200. package/docs/plans/cyberskill-design-system-audit-and-12-month-evolution-plan.md +0 -1490
  201. package/docs/status/assets/favicon.svg +0 -5
  202. package/docs/status/assets/status-legacy.css +0 -399
  203. package/docs/status/assets/status-legacy.js +0 -505
  204. package/docs/status/assets/status.css +0 -644
  205. package/docs/status/assets/status.js +0 -1308
  206. package/docs/status/data/status-feed.json +0 -1
  207. package/docs/status/data/task/TASK-REL-001.js +0 -1
  208. package/docs/status/data/task/TASK-REL-002.js +0 -1
  209. package/docs/status/index.html +0 -46
  210. package/docs/status/roadmap.html +0 -4
  211. package/docs/status/status-legacy.html +0 -122
  212. package/docs/tasks/BACKLOG.md +0 -26
  213. package/docs/tasks/_state/commit-links.yaml +0 -14
  214. package/docs/tasks/release/TASK-REL-001-launch-1-1-0/spec.md +0 -55
  215. package/docs/tasks/release/TASK-REL-002-republish-1-1-1/spec.md +0 -54
@@ -1,644 +0,0 @@
1
- /* Generated by @cyberskill/tokens. Do not edit directly. */
2
- :root {
3
- /* Light is the default theme. Dark/system are opt-in via [data-theme] (see @cyberskill/react theme layer). */
4
- color-scheme: light;
5
- --cs-color-brand-umber: #45210E;
6
- --cs-color-brand-ochre: #F4BA17;
7
- --cs-color-surface-page: #FFFDF8;
8
- --cs-color-surface-panel: #FFFFFF;
9
- --cs-color-surface-raised: #FBF4E9;
10
- --cs-color-text-primary: #45210E;
11
- --cs-color-text-inverse: #FFFFFF;
12
- --cs-color-text-accent: #6E3B0E;
13
- --cs-color-text-muted: #6E5A4C;
14
- --cs-color-semantic-success: #166534;
15
- --cs-color-semantic-danger: #B42318;
16
- --cs-color-semantic-warning: #92400E;
17
- --cs-color-semantic-info: #1D4ED8;
18
- --cs-color-accent-ochre: #F4BA17;
19
- --cs-color-border-default: #E7D9C6;
20
- --cs-space-0: 0px;
21
- --cs-space-1: 4px;
22
- --cs-space-2: 8px;
23
- --cs-space-3: 12px;
24
- --cs-space-4: 16px;
25
- --cs-space-5: 20px;
26
- --cs-space-6: 24px;
27
- --cs-space-8: 32px;
28
- --cs-space-10: 40px;
29
- --cs-space-12: 48px;
30
- --cs-space-16: 64px;
31
- --cs-space-20: 80px;
32
- --cs-space-24: 96px;
33
- --cs-radius-sm: 4px;
34
- --cs-radius-md: 8px;
35
- --cs-radius-full: 999px;
36
- --cs-font-family-ui: Be Vietnam Pro, ui-sans-serif, system-ui;
37
- --cs-font-family-mono: JetBrains Mono, ui-monospace, SFMono-Regular, Menlo, Consolas;
38
- --cs-font-lineHeight-body: 1.5;
39
- --cs-font-lineHeight-heading: 1.35;
40
- --cs-component-button-primary-bg: #45210E;
41
- --cs-component-button-primary-fg: #FFFFFF;
42
- --cs-component-button-gap: 8px;
43
- --cs-component-button-radius: 8px;
44
- --cs-component-button-sm-paddingY: 8px;
45
- --cs-component-button-sm-paddingX: 14px;
46
- --cs-component-button-sm-minHeight: 36px;
47
- --cs-component-button-md-paddingY: 12px;
48
- --cs-component-button-md-paddingX: 20px;
49
- --cs-component-button-md-minHeight: 44px;
50
- --cs-component-button-lg-paddingY: 16px;
51
- --cs-component-button-lg-paddingX: 28px;
52
- --cs-component-button-lg-minHeight: 52px;
53
- --cs-component-textfield-border-default: #BFA58F;
54
- --cs-component-textfield-paddingY: 10px;
55
- --cs-component-textfield-paddingX: 12px;
56
- --cs-component-textfield-minHeight: 44px;
57
- --cs-breakpoint-xs: 0px;
58
- --cs-breakpoint-sm: 640px;
59
- --cs-breakpoint-md: 768px;
60
- --cs-breakpoint-lg: 1024px;
61
- --cs-breakpoint-xl: 1280px;
62
- --cs-breakpoint-2xl: 1536px;
63
- --cs-depth-bg: 0;
64
- --cs-depth-section: 5;
65
- --cs-depth-card: 10;
66
- --cs-depth-nav: 50;
67
- --cs-depth-modal: 100;
68
- --cs-depth-toast: 200;
69
- --cs-glass-whisper-blur: 8px;
70
- --cs-glass-whisper-saturate: 110%;
71
- --cs-glass-whisper-opacity: 60%;
72
- --cs-glass-light-blur: 12px;
73
- --cs-glass-light-saturate: 130%;
74
- --cs-glass-light-opacity: 70%;
75
- --cs-glass-standard-blur: 16px;
76
- --cs-glass-standard-saturate: 150%;
77
- --cs-glass-standard-opacity: 80%;
78
- --cs-glass-heavy-blur: 24px;
79
- --cs-glass-heavy-saturate: 180%;
80
- --cs-glass-heavy-opacity: 90%;
81
- }
82
-
83
- /* status.css - stylesheet for status-hub@3 (one tabless canvas).
84
- tokens.css is prepended at render time — brand umber/ochre stay single-sourced there.
85
- Paper (default) + night ([data-theme="night"]) are page-local layers over those tokens.
86
- Contract: raw colour literals live ONLY in the theme blocks below. Component rules use var(). */
87
-
88
- :root {
89
- --radius: 14px;
90
- --radius-s: 9px;
91
- --mono: var(--cs-font-family-mono, ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, monospace);
92
- --sans: var(--cs-font-family-ui, "Avenir Next", "Segoe UI", system-ui, -apple-system, sans-serif);
93
- --shadow: 0 1px 2px rgba(69, 33, 14, .05), 0 8px 28px -12px rgba(69, 33, 14, .14);
94
- --shadow-lg: 0 2px 6px rgba(69, 33, 14, .08), 0 24px 60px -18px rgba(69, 33, 14, .28);
95
- }
96
-
97
- /* Paper theme (default). Brand ink/accent from tokens.css. */
98
- body[data-theme="paper"], :root {
99
- color-scheme: light;
100
- --bg: #F8F1E3;
101
- --bg-grad: radial-gradient(1200px 500px at 18% -8%, rgba(244, 186, 23, .13), transparent 60%),
102
- radial-gradient(900px 420px at 95% -5%, rgba(110, 59, 14, .07), transparent 55%);
103
- --panel: var(--cs-color-surface-panel, #FFFFFF);
104
- --panel-2: var(--cs-color-surface-raised, #FBF4E9);
105
- --panel-3: #F4EAD8;
106
- --line: var(--cs-color-border-default, #E9DCC4);
107
- --line-soft: #F1E8D6;
108
- --ink: var(--cs-color-brand-umber, #45210E);
109
- --muted: var(--cs-color-text-muted, #6E5A4C);
110
- --faint: #A5907C;
111
- --accent: var(--cs-color-brand-ochre, #F4BA17);
112
- --accent-soft: rgba(244, 186, 23, .16);
113
- --accent-ink: var(--cs-color-text-accent, #6E3B0E);
114
- --done: #1F7A44;
115
- --done-soft: rgba(31, 122, 68, .13);
116
- --active: #1D6FD6;
117
- --active-soft: rgba(29, 111, 214, .12);
118
- --draft: #A28D77;
119
- --draft-soft: rgba(162, 141, 119, .16);
120
- --hold: #B45309;
121
- --hold-soft: rgba(180, 83, 9, .14);
122
- --bad: var(--cs-color-semantic-danger, #B42318);
123
- --bad-soft: rgba(180, 35, 24, .11);
124
- --exempt: #C9B99F;
125
- --glow: rgba(244, 186, 23, .45);
126
- --scrim: rgba(69, 33, 14, .35);
127
- --on-accent: var(--cs-color-brand-umber, #45210E);
128
- --accent-deep: #d99e08;
129
- --on-fill: #fff;
130
- }
131
-
132
- /* Night ops theme — [data-theme] layer, consistent with CDS token comment. */
133
- body[data-theme="night"] {
134
- color-scheme: dark;
135
- --bg: #12100B;
136
- --bg-grad: radial-gradient(1200px 500px at 18% -8%, rgba(244, 186, 23, .09), transparent 60%),
137
- radial-gradient(900px 420px at 95% -5%, rgba(244, 186, 23, .04), transparent 55%);
138
- --panel: #1B1810;
139
- --panel-2: #221E14;
140
- --panel-3: #2A2418;
141
- --line: #37301F;
142
- --line-soft: #2B2517;
143
- --ink: #F3EBD9;
144
- --muted: #BCAB90;
145
- --faint: #83755E;
146
- --accent: var(--cs-color-brand-ochre, #F4BA17);
147
- --accent-soft: rgba(244, 186, 23, .14);
148
- --accent-ink: #F4BA17;
149
- --done: #38C776;
150
- --done-soft: rgba(56, 199, 118, .14);
151
- --active: #5EA8FF;
152
- --active-soft: rgba(94, 168, 255, .13);
153
- --draft: #93836B;
154
- --draft-soft: rgba(147, 131, 107, .18);
155
- --hold: #F59E0B;
156
- --hold-soft: rgba(245, 158, 11, .15);
157
- --bad: #F87171;
158
- --bad-soft: rgba(248, 113, 113, .13);
159
- --exempt: #5C523F;
160
- --glow: rgba(244, 186, 23, .5);
161
- --scrim: rgba(0, 0, 0, .55);
162
- --shadow: 0 1px 2px rgba(0, 0, 0, .4), 0 10px 30px -12px rgba(0, 0, 0, .6);
163
- --shadow-lg: 0 2px 6px rgba(0, 0, 0, .5), 0 24px 60px -18px rgba(0, 0, 0, .75);
164
- --on-accent: #12100B;
165
- --accent-deep: #d99e08;
166
- --on-fill: #fff;
167
- }
168
-
169
- * { box-sizing: border-box; }
170
- html { scroll-behavior: smooth; }
171
- html, body { margin: 0; padding: 0; }
172
- body {
173
- background: var(--bg-grad), var(--bg);
174
- color: var(--ink);
175
- font: 15px/1.5 var(--sans);
176
- -webkit-font-smoothing: antialiased;
177
- }
178
- ::selection { background: var(--accent-soft); }
179
- a { color: var(--accent-ink); }
180
- button { font: inherit; color: inherit; background: none; border: 0; padding: 0; cursor: pointer; }
181
- :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
182
- svg text { font-family: var(--sans); }
183
- .mono { font-family: var(--mono); }
184
-
185
- .wrap { max-width: 1480px; margin: 0 auto; padding: 0 26px 90px; }
186
-
187
- /* ── command bar ─────────────────────────────────────────────────────────── */
188
- .bar {
189
- position: sticky; top: 0; z-index: 40;
190
- backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
191
- background: color-mix(in srgb, var(--bg) 78%, transparent);
192
- border-bottom: 1px solid var(--line);
193
- }
194
- .bar-in {
195
- max-width: 1480px; margin: 0 auto; padding: 10px 26px;
196
- display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
197
- }
198
- .logo {
199
- width: 30px; height: 30px; border-radius: 9px; flex: none;
200
- background: linear-gradient(135deg, var(--accent), var(--accent-deep));
201
- display: grid; place-items: center;
202
- color: var(--on-accent); font-weight: 800; font-size: 15px;
203
- box-shadow: inset 0 -6px 12px rgba(69, 33, 14, .25);
204
- }
205
- .ttl { font-weight: 700; font-size: 16px; letter-spacing: .01em; white-space: nowrap; }
206
- .ttl small { font-weight: 500; color: var(--muted); margin-left: 6px; }
207
- .vpill {
208
- font-family: var(--mono); font-size: 12px; font-weight: 600;
209
- background: var(--accent-soft); color: var(--accent-ink);
210
- border: 1px solid color-mix(in srgb, var(--accent) 45%, transparent);
211
- padding: 2px 9px; border-radius: 999px; white-space: nowrap;
212
- }
213
- .stamp { font-size: 11.5px; color: var(--faint); font-family: var(--mono); white-space: nowrap; }
214
- .bar-spring { flex: 1 1 0; min-width: 10px; }
215
-
216
- .search { position: relative; flex: 0 1 340px; min-width: 200px; }
217
- .search input {
218
- width: 100%; padding: 7px 12px 7px 32px;
219
- border: 1px solid var(--line); border-radius: 999px;
220
- background: var(--panel); color: var(--ink); font: 13.5px var(--sans);
221
- }
222
- .search input::placeholder { color: var(--faint); }
223
- .search .sicon { position: absolute; left: 11px; top: 8px; width: 14px; height: 14px; color: var(--faint); pointer-events: none; }
224
- .search kbd {
225
- position: absolute; right: 10px; top: 7px; font: 10.5px var(--mono);
226
- color: var(--faint); border: 1px solid var(--line); border-radius: 5px; padding: 0 5px;
227
- background: var(--panel-2);
228
- }
229
- .sr-drop {
230
- position: absolute; top: calc(100% + 6px); left: 0; right: 0; z-index: 50;
231
- background: var(--panel); border: 1px solid var(--line); border-radius: 12px;
232
- box-shadow: var(--shadow-lg); overflow: hidden; max-height: 380px; overflow-y: auto;
233
- }
234
- .sr-item { display: flex; gap: 9px; align-items: center; width: 100%; text-align: left; padding: 8px 12px; border-bottom: 1px solid var(--line-soft); }
235
- .sr-item:last-child { border-bottom: 0; }
236
- .sr-item.on, .sr-item:hover { background: var(--accent-soft); }
237
- .sr-kind { font: 10px var(--mono); color: var(--faint); text-transform: uppercase; width: 46px; flex: none; }
238
- .sr-id { font: 12px var(--mono); color: var(--accent-ink); white-space: nowrap; }
239
- .sr-t { font-size: 12.5px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
240
- .sr-empty { padding: 12px; font-size: 13px; color: var(--faint); }
241
-
242
- .scopes { display: flex; gap: 4px; background: var(--panel-2); border: 1px solid var(--line); border-radius: 999px; padding: 3px; }
243
- .scope { font-size: 12.5px; font-weight: 600; color: var(--muted); padding: 3px 11px; border-radius: 999px; white-space: nowrap; }
244
- .scope:hover { color: var(--ink); }
245
- .scope.on { background: var(--panel); color: var(--ink); box-shadow: var(--shadow); }
246
- .scope .n { font-family: var(--mono); font-size: 10.5px; color: var(--faint); margin-left: 4px; }
247
- .scope.on .n { color: var(--accent-ink); }
248
-
249
- .selchip {
250
- display: inline-flex; align-items: center; gap: 7px;
251
- background: var(--accent-soft); border: 1px solid color-mix(in srgb, var(--accent) 50%, transparent);
252
- color: var(--accent-ink); border-radius: 999px; padding: 3px 6px 3px 11px;
253
- font-size: 12.5px; font-weight: 600; white-space: nowrap;
254
- }
255
- .selchip .x { width: 17px; height: 17px; border-radius: 50%; display: grid; place-items: center; background: color-mix(in srgb, var(--accent) 30%, transparent); font-size: 11px; line-height: 1; }
256
- .selchip .x:hover { background: var(--accent); color: var(--on-accent); }
257
-
258
- .theme-btn {
259
- width: 32px; height: 32px; border-radius: 50%; border: 1px solid var(--line);
260
- background: var(--panel); display: grid; place-items: center; color: var(--muted); flex: none;
261
- }
262
- .theme-btn:hover { color: var(--ink); border-color: var(--accent); }
263
- .theme-btn svg { width: 15px; height: 15px; }
264
-
265
- /* ── bands ──────────────────────────────────────────────────────────────── */
266
- .band { margin-top: 46px; }
267
- .band-hd { display: flex; align-items: baseline; gap: 12px; margin-bottom: 14px; flex-wrap: wrap; }
268
- .band-hd .num { font: 700 11px var(--mono); color: var(--accent-ink); background: var(--accent-soft); border-radius: 6px; padding: 2px 7px; letter-spacing: .08em; }
269
- .band-hd h2 { font-size: 19px; margin: 0; letter-spacing: -.01em; }
270
- .band-hd .sub { color: var(--muted); font-size: 13px; }
271
- .band-hd .tools { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
272
-
273
- .card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); }
274
-
275
- /* ── 01 pulse ───────────────────────────────────────────────────────────── */
276
- .hero { display: grid; grid-template-columns: repeat(6, 1fr); gap: 12px; }
277
- .vt { padding: 15px 16px 13px; position: relative; overflow: hidden; text-align: left; display: block; width: 100%; }
278
- button.vt:hover { border-color: color-mix(in srgb, var(--accent) 55%, var(--line)); transform: translateY(-1px); transition: .15s; }
279
- .vt .lbl { font-size: 11.5px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase; color: var(--faint); display: flex; gap: 6px; align-items: center; }
280
- .vt .big { font-size: 30px; font-weight: 700; letter-spacing: -.02em; margin-top: 5px; font-variant-numeric: tabular-nums; line-height: 1.05; }
281
- .vt .big small { font-size: 15px; color: var(--muted); font-weight: 600; }
282
- .vt .sub { font-size: 12px; color: var(--muted); margin-top: 3px; }
283
- .vt .sub b { color: var(--ink); }
284
- .vt.tone-done .big { color: var(--done); }
285
- .vt.tone-active .big { color: var(--active); }
286
- .vt.tone-bad .big { color: var(--bad); }
287
- .vt.tone-hold .big { color: var(--hold); }
288
- .vt .ring { position: absolute; right: 12px; top: 13px; width: 52px; height: 52px; }
289
- .vt .ring text { font: 700 12px var(--mono); fill: var(--ink); }
290
- .vt .corner { position: absolute; right: 14px; top: 14px; }
291
- .vt .trend { position: absolute; right: 12px; bottom: 10px; width: 84px; height: 26px; opacity: .9; }
292
-
293
- .att-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 10px; margin-top: 12px; }
294
- .att { display: flex; gap: 11px; align-items: flex-start; padding: 11px 13px; border-radius: var(--radius-s); border: 1px solid var(--line); background: var(--panel); text-align: left; box-shadow: var(--shadow); }
295
- .att:hover { border-color: color-mix(in srgb, var(--accent) 55%, var(--line)); }
296
- .att .ic { width: 28px; height: 28px; border-radius: 8px; display: grid; place-items: center; flex: none; margin-top: 1px; }
297
- .att .ic svg { width: 15px; height: 15px; }
298
- .att.crit .ic { background: var(--bad-soft); color: var(--bad); }
299
- .att.warn .ic { background: var(--hold-soft); color: var(--hold); }
300
- .att.ok .ic { background: var(--done-soft); color: var(--done); }
301
- .att.info .ic { background: var(--active-soft); color: var(--active); }
302
- .att b { display: block; font-size: 13.5px; line-height: 1.3; }
303
- .att span { display: block; font-size: 12px; color: var(--muted); margin-top: 2px; line-height: 1.4; }
304
-
305
- /* ── 02 roadmap ─────────────────────────────────────────────────────────── */
306
- .road-card { padding: 18px 10px 8px; }
307
- .road-scroll { overflow-x: auto; }
308
- #roadsvg { display: block; min-width: 980px; width: 100%; }
309
- #roadsvg .month-line { stroke: var(--line-soft); stroke-width: 1; }
310
- #roadsvg .month-lab { fill: var(--faint); font-size: 10.5px; font-family: var(--mono); }
311
- #roadsvg .today-line { stroke: var(--accent); stroke-width: 1.6; stroke-dasharray: 2 3; }
312
- #roadsvg .today-lab { fill: var(--accent-ink); font-size: 10px; font-weight: 700; font-family: var(--mono); }
313
- #roadsvg .burn-area { fill: var(--done-soft); }
314
- #roadsvg .burn-line { fill: none; stroke: var(--done); stroke-width: 1.8; }
315
- #roadsvg .burn-lab { fill: var(--done); font-size: 10px; font-family: var(--mono); font-weight: 700; }
316
- #roadsvg .ph-row-line { stroke: var(--line-soft); }
317
- #roadsvg .ph-name { fill: var(--ink); font-size: 11.5px; font-weight: 700; }
318
- #roadsvg .ph-count { fill: var(--faint); font-size: 10px; font-family: var(--mono); }
319
- #roadsvg .ph-track { fill: var(--panel-3); }
320
- #roadsvg .ph-fill { fill: var(--done); opacity: .78; }
321
- #roadsvg .ph-hit { fill: transparent; cursor: pointer; }
322
- #roadsvg g.ph.sel .ph-track { stroke: var(--accent); stroke-width: 1.5; }
323
- #roadsvg g.ph:hover .ph-track { stroke: var(--accent); stroke-width: 1; }
324
- #roadsvg .ax { stroke: var(--line); stroke-width: 1.2; }
325
- #roadsvg .rel { cursor: pointer; }
326
- #roadsvg .rel circle { fill: var(--panel); stroke: var(--accent-ink); stroke-width: 1.6; }
327
- #roadsvg .rel:hover circle, #roadsvg .rel.sel circle { fill: var(--accent); stroke-width: 2; }
328
- #roadsvg .rel text { fill: var(--accent-ink); font: 700 10px var(--mono); text-anchor: middle; }
329
- #roadsvg .rel .cnt { fill: var(--ink); }
330
- #roadsvg .viol-tick { fill: var(--bad); }
331
- .road-foot { display: flex; gap: 16px; align-items: center; padding: 6px 14px 8px; flex-wrap: wrap; }
332
- .rel-strip { display: flex; gap: 6px; overflow-x: auto; padding: 4px 2px; flex: 1; }
333
- .rv-chip { font: 600 11.5px var(--mono); border: 1px solid var(--line); background: var(--panel-2); color: var(--muted); border-radius: 7px; padding: 3px 8px; white-space: nowrap; }
334
- .rv-chip:hover { border-color: var(--accent); color: var(--ink); }
335
- .rv-chip.sel { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-ink); }
336
- .rv-chip .d { color: var(--faint); margin-left: 5px; font-weight: 400; }
337
- .legend { display: flex; gap: 13px; font-size: 11.5px; color: var(--muted); flex-wrap: wrap; align-items: center; }
338
- .legend i { display: inline-block; width: 9px; height: 9px; border-radius: 3px; margin-right: 5px; vertical-align: -1px; }
339
-
340
- /* ── 03 module map ──────────────────────────────────────────────────────── */
341
- .map-grid { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 14px; align-items: stretch; }
342
- .map-card { position: relative; overflow: hidden; }
343
- #map { display: block; width: 100%; height: auto; }
344
- #map .medge { fill: none; stroke: color-mix(in srgb, var(--faint) 52%, transparent); transition: opacity .15s, stroke .15s; }
345
- #map .medge.hot { stroke: var(--accent-ink); opacity: 1; }
346
- #map .medge.dim { opacity: .1; }
347
- #map .mnode { cursor: pointer; }
348
- #map .mnode .body { fill: var(--panel); stroke: var(--line); stroke-width: 1.4; filter: drop-shadow(0 2px 4px rgba(69,33,14,.10)); }
349
- body[data-theme="night"] #map .mnode .body { filter: drop-shadow(0 3px 6px rgba(0,0,0,.5)); }
350
- #map .mnode:hover .body, #map .mnode.sel .body { stroke: var(--accent); stroke-width: 2.2; }
351
- #map .mnode.sel .body { fill: color-mix(in srgb, var(--accent) 9%, var(--panel)); }
352
- #map .mnode.dim { opacity: .22; }
353
- #map .arc { fill: none; }
354
- #map .arc.a-done { stroke: var(--done); }
355
- #map .arc.a-active { stroke: var(--active); }
356
- #map .arc.a-draft { stroke: var(--draft); opacity: .55; }
357
- #map .arc.a-hold { stroke: var(--hold); }
358
- #map .nm { fill: var(--ink); font-weight: 700; text-anchor: middle; }
359
- #map .ct { fill: var(--muted); font-family: var(--mono); text-anchor: middle; }
360
- #map .bbadge circle { fill: var(--bad); }
361
- #map .bbadge text { fill: var(--on-fill); font: 700 9px var(--mono); text-anchor: middle; }
362
- #map .pulse { fill: var(--active); }
363
- @keyframes pulse { 0% { opacity: .9; r: 3; } 70% { opacity: 0; r: 8; } 100% { opacity: 0; r: 8; } }
364
- #map .pulse-halo { fill: none; stroke: var(--active); animation: pulse 2.2s ease-out infinite; }
365
- .map-hint { position: absolute; left: 14px; bottom: 10px; font-size: 11px; color: var(--faint); }
366
-
367
- .rank { display: flex; flex-direction: column; gap: 12px; }
368
- .rank-block { padding: 13px 15px; }
369
- .rank-block h4 { margin: 0 0 9px; font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--faint); }
370
- .rrow { display: grid; grid-template-columns: 84px 1fr 34px; gap: 9px; align-items: center; width: 100%; padding: 3px 0; text-align: left; }
371
- .rrow:hover .rr-id { color: var(--accent-ink); }
372
- .rr-id { font: 600 12px var(--mono); color: var(--ink); overflow: hidden; text-overflow: ellipsis; }
373
- .rr-bar { height: 7px; background: var(--panel-3); border-radius: 4px; overflow: hidden; }
374
- .rr-bar i { display: block; height: 100%; border-radius: 4px; }
375
- .rr-n { font: 600 11.5px var(--mono); color: var(--muted); text-align: right; }
376
-
377
- /* ── 04 dependency flow ─────────────────────────────────────────────────── */
378
- .flow-card { position: relative; }
379
- .flow-tools { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
380
- .fchip { font-size: 12.5px; font-weight: 600; color: var(--muted); border: 1px solid var(--line); border-radius: 999px; padding: 4px 12px; background: var(--panel); }
381
- .fchip:hover { color: var(--ink); border-color: var(--accent); }
382
- .fchip.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent-ink); }
383
- .fchip .n { font-family: var(--mono); font-size: 10.5px; margin-left: 4px; opacity: .75; }
384
- .flow-scroll { overflow: auto; max-height: 640px; }
385
- #flow { display: block; }
386
- #flow .fedge { fill: none; stroke: color-mix(in srgb, var(--faint) 55%, transparent); stroke-width: 1.3; transition: opacity .12s; }
387
- #flow .fedge.blocked { stroke: var(--bad); stroke-dasharray: 4 3; opacity: .8; }
388
- #flow .fedge.crit { stroke: var(--accent-ink); stroke-width: 2.2; }
389
- #flow .fedge.hot { stroke: var(--accent-ink); stroke-width: 2; opacity: 1; }
390
- #flow .fedge.dim { opacity: .07; }
391
- #flow .fnode { cursor: pointer; }
392
- #flow .fnode rect { fill: var(--panel); stroke: var(--line); stroke-width: 1.2; rx: 7px; }
393
- #flow .fnode:hover rect, #flow .fnode.sel rect { stroke: var(--accent); stroke-width: 2; }
394
- #flow .fnode.dim { opacity: .18; }
395
- #flow .fnode.crit rect { stroke: var(--accent-ink); stroke-width: 1.8; }
396
- #flow .fnode.b-done rect { fill: color-mix(in srgb, var(--done) 7%, var(--panel)); }
397
- #flow .fnode.blocked rect { stroke: var(--bad); }
398
- #flow .fnode .fid { font: 600 10.5px var(--mono); fill: var(--ink); }
399
- #flow .fnode .fttl { font-size: 9.5px; fill: var(--muted); }
400
- #flow .fnode .fdot { r: 4; }
401
- #flow .fdot.b-done { fill: var(--done); }
402
- #flow .fdot.b-active { fill: var(--active); }
403
- #flow .fdot.b-draft { fill: var(--draft); }
404
- #flow .fdot.b-hold { fill: var(--hold); }
405
- #flow .fnode .pflag { font: 700 8.5px var(--mono); fill: var(--bad); }
406
- #flow .stub { font: 10px var(--mono); fill: var(--faint); }
407
- #flow .col-lab { font: 600 10px var(--mono); fill: var(--faint); letter-spacing: .08em; }
408
- .flow-foot { display: flex; gap: 14px; padding: 9px 16px; border-top: 1px solid var(--line-soft); font-size: 11.5px; color: var(--muted); flex-wrap: wrap; align-items: center; }
409
- .flow-empty { padding: 44px; text-align: center; color: var(--faint); font-size: 13.5px; }
410
-
411
- /* ── 05 releases + traceability ─────────────────────────────────────────── */
412
- .rule-banner { display: flex; gap: 14px; padding: 15px 18px; align-items: flex-start; border-left: 4px solid var(--accent); margin-bottom: 14px; }
413
- .rule-banner .ic { width: 34px; height: 34px; border-radius: 10px; background: var(--accent-soft); color: var(--accent-ink); display: grid; place-items: center; flex: none; }
414
- .rule-banner .ic svg { width: 17px; height: 17px; }
415
- .rule-txt { font-size: 13.5px; }
416
- .rule-txt b { display: block; margin-bottom: 2px; font-size: 14px; }
417
- .rule-txt .enf { color: var(--muted); font-size: 12.5px; margin-top: 4px; }
418
- .rule-stats { margin-left: auto; display: flex; gap: 18px; flex: none; }
419
- .rs { text-align: right; }
420
- .rs b { display: block; font-size: 21px; font-variant-numeric: tabular-nums; letter-spacing: -.01em; }
421
- .rs span { font-size: 11px; color: var(--faint); text-transform: uppercase; letter-spacing: .06em; }
422
- .rs.bad b { color: var(--bad); }
423
- .rs.good b { color: var(--done); }
424
-
425
- .ledger { display: flex; flex-direction: column; gap: 12px; }
426
- .rel-card { padding: 0; overflow: hidden; scroll-margin-top: 90px; }
427
- .rel-card.sel { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft), var(--shadow); }
428
- .rel-hd { display: flex; align-items: center; gap: 12px; padding: 13px 18px; flex-wrap: wrap; }
429
- .rel-hd .rv { font: 700 14px var(--mono); background: var(--accent-soft); color: var(--accent-ink); border: 1px solid color-mix(in srgb, var(--accent) 45%, transparent); padding: 2px 11px; border-radius: 8px; }
430
- .rel-hd .rd { color: var(--faint); font-size: 12.5px; font-family: var(--mono); }
431
- .rel-hd .cnt { font-size: 12px; font-weight: 600; padding: 2px 9px; border-radius: 999px; }
432
- .cnt.feat { background: var(--done-soft); color: var(--done); }
433
- .cnt.fix { background: var(--bad-soft); color: var(--bad); }
434
- .cnt.impr { background: var(--active-soft); color: var(--active); }
435
- .rel-hd .sp { flex: 1; }
436
- .covwrap { display: flex; align-items: center; gap: 9px; min-width: 220px; }
437
- .covbar { flex: 1; height: 9px; border-radius: 5px; overflow: hidden; display: flex; background: var(--panel-3); min-width: 90px; }
438
- .covbar i { display: block; height: 100%; }
439
- .covbar .c-linked { background: var(--done); }
440
- .covbar .c-exempt { background: var(--exempt); }
441
- .covbar .c-unlinked { background: var(--bad); }
442
- .covlab { font: 600 11px var(--mono); color: var(--muted); white-space: nowrap; }
443
- .covlab.bad { color: var(--bad); }
444
- .notes3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0; border-top: 1px solid var(--line-soft); }
445
- .ncol { padding: 12px 18px 14px; min-width: 0; }
446
- .ncol + .ncol { border-left: 1px solid var(--line-soft); }
447
- .ncol h4 { margin: 0 0 8px; font-size: 11px; letter-spacing: .09em; text-transform: uppercase; display: flex; align-items: center; gap: 6px; }
448
- .ncol h4 .k { width: 8px; height: 8px; border-radius: 3px; }
449
- .ncol.feat h4 { color: var(--done); } .ncol.feat .k { background: var(--done); }
450
- .ncol.fix h4 { color: var(--bad); } .ncol.fix .k { background: var(--bad); }
451
- .ncol.impr h4 { color: var(--active); } .ncol.impr .k { background: var(--active); }
452
- .nitem { font-size: 12.8px; color: var(--ink); padding: 5px 0; border-bottom: 1px dashed var(--line-soft); line-height: 1.45; overflow-wrap: anywhere; }
453
- .nitem:last-child { border-bottom: 0; }
454
- .nitem .none { color: var(--faint); font-style: italic; }
455
- .tchip { display: inline-block; font: 600 10.5px var(--mono); border-radius: 6px; padding: 1px 6px; margin: 0 2px; border: 1px solid var(--line); background: var(--panel-2); color: var(--accent-ink); vertical-align: 1px; }
456
- .tchip:hover { border-color: var(--accent); background: var(--accent-soft); }
457
- .tchip .dt { display: inline-block; width: 6px; height: 6px; border-radius: 50%; margin-right: 4px; }
458
- .dt.b-done { background: var(--done); } .dt.b-active { background: var(--active); }
459
- .dt.b-draft { background: var(--draft); } .dt.b-hold { background: var(--hold); } .dt.ghost { background: var(--faint); }
460
- details.commits { border-top: 1px solid var(--line-soft); }
461
- details.commits summary { padding: 9px 18px; font-size: 12px; color: var(--muted); cursor: pointer; user-select: none; }
462
- details.commits summary:hover { color: var(--ink); }
463
- details.commits summary .vio { color: var(--bad); font-weight: 700; }
464
- .crow { display: flex; gap: 10px; padding: 5px 18px; font-size: 12px; align-items: baseline; border-top: 1px dashed var(--line-soft); }
465
- .crow .h { font-family: var(--mono); color: var(--faint); flex: none; }
466
- .crow .s { color: var(--ink); overflow-wrap: anywhere; }
467
- .crow.unlinked { background: var(--bad-soft); }
468
- .crow.unlinked .s { color: var(--ink); }
469
- .crow .flag { margin-left: auto; flex: none; font: 700 10px var(--mono); color: var(--bad); border: 1px solid var(--bad); border-radius: 5px; padding: 0 6px; }
470
- .crow .flag.ok { color: var(--exempt); border-color: var(--exempt); }
471
- .trend-card { padding: 13px 18px 9px; margin-bottom: 14px; }
472
- .trend-card h4 { margin: 0 0 6px; font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--faint); }
473
- #trend { display: block; width: 100%; height: 74px; }
474
- #trend .tb { cursor: pointer; }
475
- #trend .tb rect.bgb { fill: var(--panel-3); }
476
- #trend .tb rect.fgb { fill: var(--done); }
477
- #trend .tb.low rect.fgb { fill: var(--bad); }
478
- #trend .tb.mid rect.fgb { fill: var(--hold); }
479
- #trend text { font: 9px var(--mono); fill: var(--faint); text-anchor: middle; }
480
-
481
- /* ── 06 index ───────────────────────────────────────────────────────────── */
482
- .idx-card { overflow: hidden; }
483
- .idx-group { border-bottom: 1px solid var(--line-soft); }
484
- .idx-group:last-child { border-bottom: 0; }
485
- .idx-group summary { display: flex; gap: 12px; align-items: center; padding: 11px 18px; cursor: pointer; user-select: none; list-style: none; }
486
- .idx-group summary::-webkit-details-marker { display: none; }
487
- .idx-group summary:hover { background: var(--panel-2); }
488
- .idx-group summary .car { transition: transform .15s; color: var(--faint); width: 14px; }
489
- .idx-group[open] summary .car { transform: rotate(90deg); }
490
- .ig-name { font-weight: 700; font-size: 13.5px; font-family: var(--mono); }
491
- .ig-meta { color: var(--faint); font-size: 12px; }
492
- .ig-bar { width: 130px; height: 7px; border-radius: 4px; overflow: hidden; display: flex; background: var(--panel-3); margin-left: auto; }
493
- .ig-bar i { height: 100%; display: block; }
494
- .irow { display: grid; grid-template-columns: 132px 1fr 110px 44px 70px; gap: 10px; align-items: center; width: 100%; text-align: left; padding: 6px 18px 6px 44px; border-top: 1px dashed var(--line-soft); font-size: 12.8px; }
495
- .irow:hover { background: var(--accent-soft); }
496
- .irow .iid { font: 600 11.5px var(--mono); color: var(--accent-ink); white-space: nowrap; }
497
- .irow .ittl { color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
498
- .irow .ideps { font: 10.5px var(--mono); color: var(--faint); text-align: right; white-space: nowrap; }
499
- .pill { display: inline-flex; align-items: center; gap: 5px; font-size: 10.5px; font-weight: 700; border-radius: 999px; padding: 1px 8px; white-space: nowrap; width: fit-content; }
500
- .pill i { width: 6px; height: 6px; border-radius: 50%; display: inline-block; }
501
- .pill.b-done { background: var(--done-soft); color: var(--done); } .pill.b-done i { background: var(--done); }
502
- .pill.b-active { background: var(--active-soft); color: var(--active); } .pill.b-active i { background: var(--active); }
503
- .pill.b-draft { background: var(--draft-soft); color: color-mix(in srgb, var(--draft) 60%, var(--ink)); } .pill.b-draft i { background: var(--draft); }
504
- .pill.b-hold { background: var(--hold-soft); color: var(--hold); } .pill.b-hold i { background: var(--hold); }
505
- .prio { font: 700 10px var(--mono); color: var(--muted); }
506
- .prio.p0 { color: var(--bad); } .prio.p1 { color: var(--hold); }
507
-
508
- /* ── drawer ─────────────────────────────────────────────────────────────── */
509
- .scrim { position: fixed; inset: 0; background: var(--scrim); z-index: 60; opacity: 0; pointer-events: none; transition: opacity .18s; }
510
- .scrim.open { opacity: 1; pointer-events: auto; }
511
- .drawer {
512
- position: fixed; top: 0; right: 0; bottom: 0; width: min(560px, 94vw); z-index: 61;
513
- background: var(--panel); border-left: 1px solid var(--line); box-shadow: var(--shadow-lg);
514
- transform: translateX(102%); transition: transform .22s cubic-bezier(.2, .8, .25, 1);
515
- display: flex; flex-direction: column;
516
- }
517
- .drawer.open { transform: none; }
518
- .d-hd { padding: 16px 20px 12px; border-bottom: 1px solid var(--line); display: flex; gap: 12px; align-items: flex-start; }
519
- .d-id { font: 700 13px var(--mono); color: var(--accent-ink); }
520
- .d-ttl { font-size: 16.5px; font-weight: 700; line-height: 1.3; margin-top: 3px; }
521
- .d-close { margin-left: auto; width: 30px; height: 30px; border-radius: 8px; border: 1px solid var(--line); display: grid; place-items: center; color: var(--muted); flex: none; }
522
- .d-close:hover { border-color: var(--bad); color: var(--bad); }
523
- .d-body { overflow-y: auto; padding: 16px 20px 30px; flex: 1; }
524
- .d-meta { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 9px 14px; margin-bottom: 15px; }
525
- .dm { background: var(--panel-2); border: 1px solid var(--line-soft); border-radius: 9px; padding: 7px 10px; }
526
- .dm .k { font-size: 10px; text-transform: uppercase; letter-spacing: .07em; color: var(--faint); }
527
- .dm .v { font-size: 12.5px; font-weight: 600; margin-top: 1px; overflow-wrap: anywhere; }
528
- .d-sec { margin-top: 16px; }
529
- .d-sec h4 { margin: 0 0 7px; font-size: 11px; letter-spacing: .08em; text-transform: uppercase; color: var(--faint); }
530
- .d-sum { font-size: 13.5px; color: var(--ink); line-height: 1.55; background: var(--panel-2); border-radius: 10px; padding: 11px 13px; border: 1px solid var(--line-soft); }
531
- .chips { display: flex; flex-wrap: wrap; gap: 6px; }
532
- .d-warn { display: flex; gap: 8px; align-items: flex-start; background: var(--bad-soft); border: 1px solid color-mix(in srgb, var(--bad) 35%, transparent); color: var(--ink); border-radius: 9px; padding: 9px 12px; font-size: 12.5px; margin-top: 12px; }
533
- .d-warn svg { width: 14px; height: 14px; color: var(--bad); flex: none; margin-top: 2px; }
534
- .d-links { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 16px; }
535
- .btn { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600; border: 1px solid var(--line); border-radius: 9px; padding: 6px 12px; background: var(--panel-2); color: var(--ink); text-decoration: none; }
536
- .btn:hover { border-color: var(--accent); background: var(--accent-soft); color: var(--accent-ink); }
537
- .btn svg { width: 13px; height: 13px; }
538
- .d-rel { font-size: 12.5px; padding: 5px 0; border-bottom: 1px dashed var(--line-soft); display: flex; gap: 8px; align-items: baseline; }
539
- .d-rel .h { font-family: var(--mono); color: var(--faint); flex: none; }
540
-
541
- /* ── v2 additions: sync, compact ledger/index, GitHub links, staleness ──── */
542
- .vpill.branch { background: var(--panel-2); color: var(--muted); border-color: var(--line); text-decoration: none; }
543
- .vpill.branch:hover { border-color: var(--accent); color: var(--accent-ink); }
544
- a.vpill { text-decoration: none; }
545
- .vpill.stale { background: var(--hold-soft); color: var(--hold); border-color: color-mix(in srgb, var(--hold) 45%, transparent); cursor: help; }
546
- .stamp-a { color: inherit; text-decoration: none; }
547
- a.stamp-a:hover { color: var(--accent-ink); }
548
- .selchip > button:first-child { color: inherit; font: inherit; font-weight: 600; }
549
- .selchip > button:first-child:hover { text-decoration: underline; }
550
- .prlink { color: var(--accent-ink); font-weight: 600; text-decoration: none; border-bottom: 1px dashed color-mix(in srgb, var(--accent) 60%, transparent); }
551
- .prlink:hover { border-bottom-style: solid; }
552
- a.h { text-decoration: none; }
553
- a.h:hover { color: var(--accent-ink) !important; text-decoration: underline; }
554
- a.rv { text-decoration: none; }
555
- a.rv:hover { filter: brightness(1.05); box-shadow: 0 0 0 2px var(--accent-soft); }
556
- #roadsvg g.ph.dim { opacity: .3; }
557
- #roadsvg g.ph.dim .ph-hit { opacity: 1; }
558
- .rel-card.paged { display: none; }
559
- .show-more {
560
- display: block; width: 100%; text-align: center; font-size: 12.5px; font-weight: 600;
561
- color: var(--accent-ink); background: var(--accent-soft); border: 1px dashed color-mix(in srgb, var(--accent) 55%, transparent);
562
- border-radius: var(--radius-s); padding: 8px;
563
- }
564
- .show-more:hover { background: color-mix(in srgb, var(--accent) 24%, transparent); }
565
- .rel-slimcard { overflow: hidden; }
566
- .rel-slimcard summary { padding: 11px 18px; font-size: 12.5px; color: var(--muted); cursor: pointer; user-select: none; }
567
- .rel-slimcard summary:hover { color: var(--ink); }
568
- .slimrow {
569
- display: flex; gap: 12px; align-items: baseline; padding: 6px 18px;
570
- border-top: 1px dashed var(--line-soft); cursor: pointer; font-size: 12.5px;
571
- }
572
- .slimrow:hover { background: var(--accent-soft); }
573
- .slimrow.sel { background: var(--accent-soft); box-shadow: inset 3px 0 0 var(--accent); }
574
- .rv-s { font-size: 12px; padding: 0 8px; }
575
- .slimrow .rd { color: var(--faint); font-family: var(--mono); font-size: 11.5px; }
576
- .slim-cov { margin-left: auto; font: 600 11px var(--mono); color: var(--muted); }
577
- .slim-cov.bad { color: var(--bad); }
578
- .ig-fc {
579
- font: 700 11px var(--mono); color: var(--accent-ink); background: var(--accent-soft);
580
- border-radius: 999px; padding: 1px 9px; white-space: nowrap;
581
- }
582
- .idx-card .show-more { width: calc(100% - 36px); margin: 8px 18px 12px; }
583
-
584
- /* ── tooltip ────────────────────────────────────────────────────────────── */
585
- #tip {
586
- position: fixed; z-index: 80; pointer-events: none; max-width: 340px;
587
- background: var(--panel); color: var(--ink); border: 1px solid var(--line);
588
- border-radius: 10px; box-shadow: var(--shadow-lg); padding: 9px 12px; font-size: 12px;
589
- opacity: 0; transform: translateY(4px); transition: opacity .1s;
590
- }
591
- #tip.on { opacity: 1; transform: none; }
592
- #tip b { display: block; font-size: 12.5px; }
593
- #tip .m { color: var(--muted); margin-top: 3px; line-height: 1.45; }
594
- #tip .mono { color: var(--accent-ink); }
595
-
596
- /* ── footer + shell chrome ──────────────────────────────────────────────── */
597
- .foot { margin-top: 60px; padding-top: 18px; border-top: 1px solid var(--line); color: var(--faint); font-size: 12px; display: flex; gap: 8px 22px; flex-wrap: wrap; }
598
- .foot .mono { font-size: 11px; }
599
- .gen-foot { margin: 0 auto; max-width: 1480px; padding: 18px 26px 48px; color: var(--faint); font-size: 12px; border-top: 1px solid var(--line); }
600
- .gen-foot .code { font-family: var(--mono); }
601
- .skip {
602
- position: absolute; left: -9999px; top: 0; z-index: 100;
603
- background: var(--accent); color: var(--ink); padding: 8px 14px; border-radius: var(--radius-s);
604
- }
605
- .skip:focus { left: 12px; top: 12px; }
606
- .sr-only {
607
- position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
608
- overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
609
- }
610
- .ops-reports { max-width: 1480px; margin: 0 auto; padding: 0 26px 40px; }
611
- .ops-reports .panel { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius); padding: 16px 18px; margin-bottom: 14px; }
612
- .ops-reports h2 { margin: 0 0 10px; font-size: 15px; }
613
- .ops-reports .nojs-t { width: 100%; border-collapse: collapse; font-size: 13px; }
614
- .ops-reports .nojs-t th, .ops-reports .nojs-t td { text-align: left; padding: 6px 8px; border-bottom: 1px solid var(--line-soft); }
615
- .ops-reports .muted, .nojs .muted { color: var(--muted); font-size: 12px; }
616
- .ops-reports .code, .nojs .code { font-family: var(--mono); font-size: 12px; }
617
- .nojs { padding: 48px 26px; max-width: 1480px; margin: 0 auto; }
618
- .nojs table { width: 100%; border-collapse: collapse; font-size: 13px; }
619
- .nojs th, .nojs td { text-align: left; padding: 6px 8px; border-bottom: 1px solid var(--line); }
620
- .drawer .spec { font-size: 13px; line-height: 1.55; }
621
- .drawer .spec h1, .drawer .spec h2, .drawer .spec h3 { font-size: 14px; margin: 14px 0 6px; }
622
-
623
- /* ── responsive ─────────────────────────────────────────────────────────── */
624
- @media (max-width: 1180px) {
625
- .hero { grid-template-columns: repeat(3, 1fr); }
626
- .map-grid { grid-template-columns: 1fr; }
627
- .rank { flex-direction: row; flex-wrap: wrap; }
628
- .rank-block { flex: 1 1 240px; }
629
- }
630
- @media (max-width: 760px) {
631
- .wrap { padding: 0 14px 70px; }
632
- .hero { grid-template-columns: repeat(2, 1fr); }
633
- .notes3 { grid-template-columns: 1fr; }
634
- .ncol + .ncol { border-left: 0; border-top: 1px solid var(--line-soft); }
635
- .irow { grid-template-columns: 110px 1fr 84px; }
636
- .irow .prio, .irow .ideps { display: none; }
637
- .rule-stats { margin-left: 0; }
638
- .d-meta { grid-template-columns: 1fr 1fr; }
639
- }
640
- @media (prefers-reduced-motion: reduce) {
641
- html { scroll-behavior: auto; }
642
- #map .pulse-halo { animation: none; display: none; }
643
- .drawer, .scrim, button.vt { transition: none; }
644
- }