@cyberskill/design 1.0.0 → 1.1.1

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 (266) hide show
  1. package/DESIGN.md +10 -9
  2. package/README.md +31 -28
  3. package/SKILL.md +13 -9
  4. package/VERSION +1 -1
  5. package/_ds_bundle.js +660 -202
  6. package/_ds_manifest.json +1 -1
  7. package/_esm/cs.mjs +14 -8
  8. package/_esm/react.d.ts +216 -0
  9. package/_esm/react.mjs +114 -0
  10. package/base/collections.css +31 -0
  11. package/base/components.css +3 -0
  12. package/base/data.css +33 -0
  13. package/base/forms.css +8 -0
  14. package/base/interaction.css +1 -0
  15. package/base/typography.css +6 -0
  16. package/components/_i18n/strings.js +8 -4
  17. package/components/ai/ai-conversation.card.html +2 -2
  18. package/components/ai/ai-lumi.card.html +2 -2
  19. package/components/ai/ai.card.html +2 -2
  20. package/components/brand/brand.card.html +2 -2
  21. package/components/button/buttons.card.html +2 -2
  22. package/components/data/AspectRatio.d.ts +16 -0
  23. package/components/data/AspectRatio.figma.tsx +12 -0
  24. package/components/data/AspectRatio.jsx +16 -0
  25. package/components/data/AspectRatio.prompt.md +7 -0
  26. package/components/data/Collapsible.d.ts +21 -0
  27. package/components/data/Collapsible.figma.tsx +12 -0
  28. package/components/data/Collapsible.jsx +49 -0
  29. package/components/data/Collapsible.prompt.md +7 -0
  30. package/components/data/Image.d.ts +4 -0
  31. package/components/data/Image.prompt.md +2 -2
  32. package/components/data/Item.d.ts +26 -0
  33. package/components/data/Item.figma.tsx +12 -0
  34. package/components/data/Item.jsx +63 -0
  35. package/components/data/Item.prompt.md +10 -0
  36. package/components/data/ScrollArea.d.ts +16 -0
  37. package/components/data/ScrollArea.figma.tsx +12 -0
  38. package/components/data/ScrollArea.jsx +25 -0
  39. package/components/data/ScrollArea.prompt.md +7 -0
  40. package/components/data/collections.card.html +15 -4
  41. package/components/data/data.card.html +15 -4
  42. package/components/datatable/datatable.card.html +2 -2
  43. package/components/dialog/dialog.card.html +2 -2
  44. package/components/feedback/feedback-2.card.html +2 -2
  45. package/components/feedback/feedback.card.html +2 -2
  46. package/components/forms/Cascader.jsx +5 -3
  47. package/components/forms/Editor.prompt.md +1 -1
  48. package/components/forms/InputGroup.d.ts +4 -0
  49. package/components/forms/InputGroup.jsx +38 -8
  50. package/components/forms/InputGroup.prompt.md +3 -3
  51. package/components/forms/NativeSelect.d.ts +22 -0
  52. package/components/forms/NativeSelect.figma.tsx +12 -0
  53. package/components/forms/NativeSelect.jsx +56 -0
  54. package/components/forms/NativeSelect.prompt.md +10 -0
  55. package/components/forms/NumberField.d.ts +5 -0
  56. package/components/forms/NumberField.jsx +51 -7
  57. package/components/forms/NumberField.prompt.md +2 -2
  58. package/components/forms/SegmentedControl.jsx +1 -1
  59. package/components/forms/TagInput.d.ts +3 -0
  60. package/components/forms/TagInput.jsx +62 -20
  61. package/components/forms/TagInput.prompt.md +2 -2
  62. package/components/forms/forms-2.card.html +2 -2
  63. package/components/forms/forms.card.html +5 -4
  64. package/components/icon/Icon.prompt.md +1 -1
  65. package/components/icon/icon.card.html +2 -2
  66. package/components/logo/Logo.jsx +2 -1
  67. package/components/logo/logo.card.html +2 -2
  68. package/components/navigation/Menu.jsx +14 -1
  69. package/components/navigation/navigation.card.html +2 -2
  70. package/components/navigation/shell.card.html +2 -2
  71. package/components/overlays/AlertDialog.d.ts +29 -0
  72. package/components/overlays/AlertDialog.figma.tsx +12 -0
  73. package/components/overlays/AlertDialog.jsx +142 -0
  74. package/components/overlays/AlertDialog.prompt.md +12 -0
  75. package/components/overlays/Drawer.jsx +1 -1
  76. package/components/overlays/Popconfirm.jsx +14 -1
  77. package/components/overlays/Popover.jsx +14 -1
  78. package/components/overlays/alertdialog.card.html +42 -0
  79. package/components/overlays/overlays.card.html +2 -2
  80. package/components/textfield/textfield.card.html +2 -2
  81. package/docs/benchmark-rubric.md +46 -0
  82. package/docs/ci-cd.md +17 -11
  83. package/docs/consumer-grant.md +37 -0
  84. package/docs/consuming.md +45 -16
  85. package/docs/contrast-report.md +91 -103
  86. package/docs/conventions.md +12 -9
  87. package/docs/decisions.md +33 -10
  88. package/docs/deploy.md +1 -1
  89. package/docs/design-styles.md +26 -8
  90. package/docs/figma.md +3 -3
  91. package/docs/live-hub.md +5 -3
  92. package/docs/products.md +13 -11
  93. package/docs/quality-gates.md +35 -21
  94. package/docs/release-notes.md +21 -3
  95. package/docs/status/assets/favicon.svg +5 -0
  96. package/docs/status/assets/status-legacy.css +399 -0
  97. package/docs/status/assets/status-legacy.js +505 -0
  98. package/docs/status/assets/status.css +644 -0
  99. package/docs/status/assets/status.js +1308 -0
  100. package/docs/status/data/status-feed.json +1 -0
  101. package/docs/status/data/task/TASK-REL-001.js +1 -0
  102. package/docs/status/data/task/TASK-REL-002.js +1 -0
  103. package/docs/status/index.html +42 -0
  104. package/docs/status/roadmap.html +4 -0
  105. package/docs/status/status-legacy.html +117 -0
  106. package/docs/storybook.md +5 -4
  107. package/docs/sync.md +3 -2
  108. package/docs/tasks/BACKLOG.md +26 -0
  109. package/docs/tasks/release/TASK-REL-001-launch-1-1-0/spec.md +55 -0
  110. package/docs/tasks/release/TASK-REL-002-republish-1-1-1/spec.md +54 -0
  111. package/docs/template-schema-v2.md +15 -3
  112. package/docs/vi/benchmark-rubric.md +46 -0
  113. package/docs/vi/ci-cd.md +17 -11
  114. package/docs/vi/consumer-grant.md +37 -0
  115. package/docs/vi/consuming.md +45 -16
  116. package/docs/vi/contrast-report.md +94 -106
  117. package/docs/vi/conventions.md +12 -9
  118. package/docs/vi/decisions.md +33 -10
  119. package/docs/vi/deploy.md +1 -1
  120. package/docs/vi/design-styles.md +26 -8
  121. package/docs/vi/figma.md +3 -3
  122. package/docs/vi/live-hub.md +5 -3
  123. package/docs/vi/products.md +13 -11
  124. package/docs/vi/quality-gates.md +35 -21
  125. package/docs/vi/release-notes.md +26 -8
  126. package/docs/vi/storybook.md +5 -4
  127. package/docs/vi/sync.md +3 -2
  128. package/docs/vi/template-schema-v2.md +15 -3
  129. package/docs/viewer.html +2 -2
  130. package/fonts/spacegrotesk-var-latin-ext.woff2 +0 -0
  131. package/fonts/spacegrotesk-var-latin.woff2 +0 -0
  132. package/fonts/spacegrotesk-var-vietnamese.woff2 +0 -0
  133. package/guidelines/atomic-view.html +40 -27
  134. package/guidelines/elements-geometry.html +69 -0
  135. package/guidelines/elements-variants.html +17 -17
  136. package/guidelines/type-families.html +16 -10
  137. package/llms.txt +17 -11
  138. package/package.json +38 -16
  139. package/styles.css +1 -0
  140. package/templates/ai-cluster-demo.html +29 -14
  141. package/templates/app-shell/support.js +4 -4
  142. package/templates/article/content-schema.json +6 -0
  143. package/templates/article/support.js +4 -4
  144. package/templates/auth/support.js +4 -4
  145. package/templates/bod-deck/support.js +4 -4
  146. package/templates/bod-investor-update/support.js +4 -4
  147. package/templates/bod-memo/support.js +4 -4
  148. package/templates/bod-minutes/content-schema.json +12 -0
  149. package/templates/bod-minutes/support.js +4 -4
  150. package/templates/bod-report/support.js +4 -4
  151. package/templates/bod-resolution/support.js +4 -4
  152. package/templates/culture-event-invite/support.js +4 -4
  153. package/templates/dashboard/support.js +4 -4
  154. package/templates/delivery-change-note/support.js +4 -4
  155. package/templates/delivery-kickoff/support.js +4 -4
  156. package/templates/delivery-qbr-deck/support.js +4 -4
  157. package/templates/delivery-runbook/content-schema.json +6 -0
  158. package/templates/delivery-runbook/support.js +4 -4
  159. package/templates/delivery-status-email/support.js +4 -4
  160. package/templates/doc-style-guide/DocStyleGuide.dc.html +2 -2
  161. package/templates/doc-style-guide/support.js +4 -4
  162. package/templates/doc-suite-index/support.js +4 -4
  163. package/templates/doc-templates/DocTemplates.dc.html +1 -1
  164. package/templates/doc-templates/support.js +4 -4
  165. package/templates/email/support.js +4 -4
  166. package/templates/email-safe/README.md +17 -4
  167. package/templates/email-safe/email-launch.html +3 -3
  168. package/templates/email-safe/email-newsletter.html +1 -1
  169. package/templates/finance-dunning-email/support.js +4 -4
  170. package/templates/finance-expense-report/support.js +4 -4
  171. package/templates/finance-invoice/support.js +4 -4
  172. package/templates/finance-quote/support.js +4 -4
  173. package/templates/hr-announcement/support.js +4 -4
  174. package/templates/hr-interview-kit/content-schema.json +12 -0
  175. package/templates/hr-interview-kit/support.js +4 -4
  176. package/templates/hr-offboarding/content-schema.json +12 -0
  177. package/templates/hr-offboarding/support.js +4 -4
  178. package/templates/hr-performance-review/content-schema.json +12 -0
  179. package/templates/hr-performance-review/support.js +4 -4
  180. package/templates/hr-pip/content-schema.json +12 -0
  181. package/templates/hr-pip/support.js +4 -4
  182. package/templates/legal-msa/content-schema.json +16 -0
  183. package/templates/legal-msa/support.js +4 -4
  184. package/templates/legal-sow/support.js +4 -4
  185. package/templates/marketing-campaign-brief/support.js +4 -4
  186. package/templates/marketing-case-study/support.js +4 -4
  187. package/templates/marketing-launch/support.js +4 -4
  188. package/templates/marketing-newsletter/support.js +4 -4
  189. package/templates/marketing-page/content-schema.json +0 -1
  190. package/templates/marketing-page/support.js +4 -4
  191. package/templates/marketing-press-release/support.js +4 -4
  192. package/templates/marketing-social-kit/support.js +4 -4
  193. package/templates/playground.html +8 -4
  194. package/templates/sales-one-pager/support.js +4 -4
  195. package/templates/sales-proposal-deck/support.js +4 -4
  196. package/templates/settings/Settings.dc.html +26 -14
  197. package/templates/settings/content-schema.json +36 -0
  198. package/templates/settings/support.js +4 -4
  199. package/templates/slide-deck/support.js +4 -4
  200. package/templates/team-meeting-agenda/content-schema.json +16 -0
  201. package/templates/team-meeting-agenda/support.js +4 -4
  202. package/templates/tech-incident-report/support.js +4 -4
  203. package/templates/tech-release-notes/support.js +4 -4
  204. package/templates/tech-retro/content-schema.json +12 -0
  205. package/templates/tech-retro/support.js +4 -4
  206. package/templates/tech-rfc/content-schema.json +6 -0
  207. package/templates/tech-rfc/support.js +4 -4
  208. package/templates/vn-appointment-transfer/support.js +4 -4
  209. package/templates/vn-certificate-of-employment/support.js +4 -4
  210. package/templates/vn-code-of-conduct/support.js +4 -4
  211. package/templates/vn-compensation-regulation/support.js +4 -4
  212. package/templates/vn-contract-amendment/support.js +4 -4
  213. package/templates/vn-contractor-agreement/support.js +4 -4
  214. package/templates/vn-data-protection-policy/support.js +4 -4
  215. package/templates/vn-disciplinary-case-file/support.js +4 -4
  216. package/templates/vn-disciplinary-schedule/content-schema.json +15 -0
  217. package/templates/vn-disciplinary-schedule/support.js +4 -4
  218. package/templates/vn-employee-request/support.js +4 -4
  219. package/templates/vn-exit-handover/support.js +4 -4
  220. package/templates/vn-foreign-employee-pack/support.js +4 -4
  221. package/templates/vn-grassroots-democracy/support.js +4 -4
  222. package/templates/vn-infosec-policy/support.js +4 -4
  223. package/templates/vn-internal-labor-regulations/support.js +4 -4
  224. package/templates/vn-internship-agreement/support.js +4 -4
  225. package/templates/vn-job-description/support.js +4 -4
  226. package/templates/vn-labor-contract/support.js +4 -4
  227. package/templates/vn-labour-management-book/content-schema.json +15 -0
  228. package/templates/vn-labour-management-book/support.js +4 -4
  229. package/templates/vn-mutual-nda/support.js +4 -4
  230. package/templates/vn-ndnca-ip/support.js +4 -4
  231. package/templates/vn-offer-letter/support.js +4 -4
  232. package/templates/vn-onboarding-checklist/support.js +4 -4
  233. package/templates/vn-pdpl-consent/support.js +4 -4
  234. package/templates/vn-performance-evaluation-regulation/support.js +4 -4
  235. package/templates/vn-performance-review-form/support.js +4 -4
  236. package/templates/vn-phantom-stock/support.js +4 -4
  237. package/templates/vn-probation-contract/support.js +4 -4
  238. package/templates/vn-receipt-acknowledgement/content-schema.json +15 -0
  239. package/templates/vn-receipt-acknowledgement/support.js +4 -4
  240. package/templates/vn-remote-work-policy/support.js +4 -4
  241. package/templates/vn-resignation-letter/support.js +4 -4
  242. package/templates/vn-salary-scale/content-schema.json +15 -0
  243. package/templates/vn-salary-scale/support.js +4 -4
  244. package/templates/vn-sow-appendix/support.js +4 -4
  245. package/templates/vn-termination-decision/support.js +4 -4
  246. package/templates/vn-total-rewards-appendix/support.js +4 -4
  247. package/templates/vn-training-commitment/support.js +4 -4
  248. package/templates/vn-travel-expense-policy/support.js +4 -4
  249. package/tokens/element-seeds.json +112 -0
  250. package/tokens/elements.css +274 -187
  251. package/tokens/fonts.css +12 -3
  252. package/tokens/native/CSTokens.kt +84 -68
  253. package/tokens/native/CSTokens.swift +84 -68
  254. package/tokens/native/cs_tokens.dart +84 -68
  255. package/tokens/provenance.json +9 -9
  256. package/tokens/styles.css +15 -0
  257. package/tokens/tokens.dtcg.json +258 -233
  258. package/tokens/tokens.js +168 -167
  259. package/tokens/tokens.json +167 -166
  260. package/tokens/typography.css +9 -1
  261. package/ui_kits/status-hub/README.md +1 -2
  262. package/ui_kits/status-hub/index.html +2 -2
  263. package/ui_kits/status-hub/settings.html +6 -3
  264. package/ui_kits/website/chat.html +2 -2
  265. package/ui_kits/website/index.html +2 -2
  266. package/ui_kits/status-hub/identity-lab.html +0 -134
@@ -0,0 +1,644 @@
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
+ }