@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
@@ -1,10 +1,10 @@
1
1
  # Contrast report — elemental pairings (APCA)
2
2
 
3
- Generated 2026-07-22 · sweep at VERSION 1.0.0 pin.
3
+ Generated 2026-07-27 · sweep at VERSION 1.1.1 pin.
4
4
 
5
5
  **Doctrine encoded by this sweep:** text sits on `-bright` or `-tint`, never on the mid-tone `-accent` — at any size. The accent is for bars, borders, progress fills, and non-text fills only. (Rule stated in `tokens/elements.css` and conventions.)
6
6
 
7
- Token nudges applied for v2.0: bright lightened for clay, hoa, lava, plasma, thủy, ocean, forest, titanium; `-on` flipped dark for lava, ocean, forest, titanium.
7
+ Packs are generated from `tokens/element-seeds.json` (soft / middle / deep ladder, light↔dark hue lock). Geometry gate: `_audit/element-geometry.html`.
8
8
  | Scope | Pairing | fg / bg | Lc | Verdict |
9
9
  |---|---|---|---|---|
10
10
  | root (Thổ default) | text-accent on white (bold labels) | #6E3B0E / #FFFFFF | 90.7 | ✓ |
@@ -16,110 +16,98 @@ Token nudges applied for v2.0: bright lightened for clay, hoa, lava, plasma, th
16
16
  | tho | text-accent on tint (bold labels) | #6E3B0E / #FBF4E9 | 84.6 | ✓ |
17
17
  | tho | accent-bright on ink (headings) | #F4BA17 / #45210E | 66.3 | ✓ |
18
18
  | tho | accent-on on accent-bright (CTA text) | #45210E / #F4BA17 | 66.3 | ✓ |
19
- | tho | accent-bright on dark panel (dark labels) | #F4BA17 / #221710 | 69.2 | ✓ |
20
- | tho · clay | text-accent on white (bold labels) | #8F5230 / #FFFFFF | 80.4 | ✓ |
21
- | tho · clay | text-accent on tint (bold labels) | #8F5230 / #F8EDE4 | 70.7 | ✓ |
22
- | tho · clay | accent-bright on ink (headings) | #EDBF9D / #2E1607 | 71.6 | ✓ |
23
- | tho · clay | accent-on on accent-bright (CTA text) | #2E1607 / #EDBF9D | 72 | ✓ |
24
- | tho · clay | accent-bright on dark panel (dark labels) | #EDBF9D / #221710 | 72 | ✓ |
25
- | tho · sand | text-accent on white (bold labels) | #8A6F3C / #FFFFFF | 72.9 | ✓ |
26
- | tho · sand | text-accent on tint (bold labels) | #8A6F3C / #FAF3E3 | 66 | ✓ |
27
- | tho · sand | accent-bright on ink (headings) | #EFDCB2 / #3A2A10 | 82 | ✓ |
28
- | tho · sand | accent-on on accent-bright (CTA text) | #3A2A10 / #EFDCB2 | 80.8 | ✓ |
29
- | tho · sand | accent-bright on dark panel (dark labels) | #EFDCB2 / #221710 | 85.1 | ✓ |
30
- | hoa | text-accent on white (bold labels) | #A93E14 / #FFFFFF | 80 | ✓ |
31
- | hoa | text-accent on tint (bold labels) | #A93E14 / #FBEADF | 69.3 | ✓ |
32
- | hoa | accent-bright on ink (headings) | #F6A26B / #231007 | 62 | ✓ |
33
- | hoa | accent-on on accent-bright (CTA text) | #231007 / #F6A26B | 63.3 | ✓ |
34
- | hoa | accent-bright on dark panel (dark labels) | #F6A26B / #221710 | 61.6 | ✓ |
35
- | hoa · lava | text-accent on white (bold labels) | #9B2D14 / #FFFFFF | 85.1 | ✓ |
36
- | hoa · lava | text-accent on tint (bold labels) | #9B2D14 / #FAE5DC | 72.1 | ✓ |
37
- | hoa · lava | accent-bright on ink (headings) | #F6AC85 / #1D0B05 | 66.5 | ✓ |
38
- | hoa · lava | accent-on on accent-bright (CTA text) | #1D0B05 / #F6AC85 | 67.6 | ✓ |
39
- | hoa · lava | accent-bright on dark panel (dark labels) | #F6AC85 / #221710 | 65.7 | ✓ |
40
- | hoa · plasma | text-accent on white (bold labels) | #B02348 / #FFFFFF | 81.2 | ✓ |
41
- | hoa · plasma | text-accent on tint (bold labels) | #B02348 / #FBE6EB | 69.3 | ✓ |
42
- | hoa · plasma | accent-bright on ink (headings) | #F7A8B8 / #200812 | 66.8 | ✓ |
43
- | hoa · plasma | accent-on on accent-bright (CTA text) | #200812 / #F7A8B8 | 67.9 | ✓ |
44
- | hoa · plasma | accent-bright on dark panel (dark labels) | #F7A8B8 / #221710 | 66.1 | ✓ |
45
- | thuy | text-accent on white (bold labels) | #2F5E6B / #FFFFFF | 84.7 | ✓ |
46
- | thuy | text-accent on tint (bold labels) | #2F5E6B / #E6F1F2 | 75.1 | ✓ |
47
- | thuy | accent-bright on ink (headings) | #A6D0DA / #0E1D20 | 72.4 | ✓ |
48
- | thuy | accent-on on accent-bright (CTA text) | #0E1D20 / #A6D0DA | 72.8 | ✓ |
49
- | thuy | accent-bright on dark panel (dark labels) | #A6D0DA / #221710 | 72.5 | ✓ |
50
- | thuy · ocean | text-accent on white (bold labels) | #1C3E56 / #FFFFFF | 95.7 | ✓ |
51
- | thuy · ocean | text-accent on tint (bold labels) | #1C3E56 / #E4EEF4 | 84.7 | ✓ |
52
- | thuy · ocean | accent-bright on ink (headings) | #A9CCE0 / #0B161E | 71.8 | ✓ |
53
- | thuy · ocean | accent-on on accent-bright (CTA text) | #0B161E / #A9CCE0 | 72.6 | ✓ |
54
- | thuy · ocean | accent-bright on dark panel (dark labels) | #A9CCE0 / #221710 | 71.4 | ✓ |
55
- | thuy · mist | text-accent on white (bold labels) | #4A686E / #FFFFFF | 80 | ✓ |
56
- | thuy · mist | text-accent on tint (bold labels) | #4A686E / #F0F6F7 | 73.9 | ✓ |
57
- | thuy · mist | accent-bright on ink (headings) | #C4DADD / #16262A | 78.9 | ✓ |
58
- | thuy · mist | accent-on on accent-bright (CTA text) | #16262A / #C4DADD | 78.5 | ✓ |
59
- | thuy · mist | accent-bright on dark panel (dark labels) | #C4DADD / #221710 | 80.3 | ✓ |
60
- | moc | text-accent on white (bold labels) | #4C6B35 / #FFFFFF | 80.2 | ✓ |
61
- | moc | text-accent on tint (bold labels) | #4C6B35 / #EEF3E2 | 71.8 | ✓ |
62
- | moc | accent-bright on ink (headings) | #A9C177 / #18200F | 62.3 | ✓ |
63
- | moc | accent-on on accent-bright (CTA text) | #18200F / #A9C177 | 63.2 | ✓ |
64
- | moc | accent-bright on dark panel (dark labels) | #A9C177 / #221710 | 62.8 | ✓ |
65
- | moc · bamboo | text-accent on white (bold labels) | #5B7237 / #FFFFFF | 76.7 | ✓ |
66
- | moc · bamboo | text-accent on tint (bold labels) | #5B7237 / #F3F7E8 | 70.8 | ✓ |
67
- | moc · bamboo | accent-bright on ink (headings) | #C4D69B / #1C240F | 75 | ✓ |
68
- | moc · bamboo | accent-on on accent-bright (CTA text) | #1C240F / #C4D69B | 75 | ✓ |
69
- | moc · bamboo | accent-bright on dark panel (dark labels) | #C4D69B / #221710 | 76 | ✓ |
70
- | moc · forest | text-accent on white (bold labels) | #31481F / #FFFFFF | 93.4 | ✓ |
71
- | moc · forest | text-accent on tint (bold labels) | #31481F / #E9EFE1 | 82.6 | ✓ |
72
- | moc · forest | accent-bright on ink (headings) | #B3CE9B / #101708 | 71 | ✓ |
73
- | moc · forest | accent-on on accent-bright (CTA text) | #101708 / #B3CE9B | 71.8 | ✓ |
74
- | moc · forest | accent-bright on dark panel (dark labels) | #B3CE9B / #221710 | 70.5 | ✓ |
75
- | kim | text-accent on white (bold labels) | #6E6151 / #FFFFFF | 80.1 | ✓ |
76
- | kim | text-accent on tint (bold labels) | #6E6151 / #F3EFE6 | 70.7 | ✓ |
77
- | kim | accent-bright on ink (headings) | #D8CCB6 / #221C12 | 74.7 | ✓ |
78
- | kim | accent-on on accent-bright (CTA text) | #221C12 / #D8CCB6 | 74.9 | ✓ |
79
- | kim | accent-bright on dark panel (dark labels) | #D8CCB6 / #221710 | 75.1 | ✓ |
80
- | kim · steel | text-accent on white (bold labels) | #565C5E / #FFFFFF | 83.5 | ✓ |
81
- | kim · steel | text-accent on tint (bold labels) | #565C5E / #EFF1F1 | 74.9 | ✓ |
82
- | kim · steel | accent-bright on ink (headings) | #C2C6C6 / #191D1E | 70 | ✓ |
83
- | kim · steel | accent-on on accent-bright (CTA text) | #191D1E / #C2C6C6 | 70.6 | ✓ |
84
- | kim · steel | accent-bright on dark panel (dark labels) | #C2C6C6 / #221710 | 70.3 | ✓ |
85
- | kim · titanium | text-accent on white (bold labels) | #56504A / #FFFFFF | 87.6 | ✓ |
86
- | kim · titanium | text-accent on tint (bold labels) | #56504A / #EFEBE5 | 76 | ✓ |
87
- | kim · titanium | accent-bright on ink (headings) | #D9CFC0 / #171310 | 77.5 | ✓ |
88
- | kim · titanium | accent-on on accent-bright (CTA text) | #171310 / #D9CFC0 | 77.9 | ✓ |
89
- | kim · titanium | accent-bright on dark panel (dark labels) | #D9CFC0 / #221710 | 76.9 | ✓ |
19
+ | tho | accent-bright on dark panel (dark labels) | #FEC42C / #221710 | 75 | ✓ |
20
+ | tho · sand | text-accent on white (bold labels) | #90825E / #FFFFFF | 65.4 | ✓ |
21
+ | tho · sand | text-accent on tint (bold labels) | #90825E / #FBF7EA | 60.6 | ✓ |
22
+ | tho · sand | accent-bright on ink (headings) | #F6EBCC / #292414 | 92.3 | ✓ |
23
+ | tho · sand | accent-on on accent-bright (CTA text) | #292414 / #F6EBCC | 90.8 | ✓ |
24
+ | tho · sand | accent-bright on dark panel (dark labels) | #F6EBCC / #221710 | 93.8 | ✓ |
25
+ | tho · clay | text-accent on white (bold labels) | #201300 / #FFFFFF | 104.8 | ✓ |
26
+ | tho · clay | text-accent on tint (bold labels) | #201300 / #FFF6E7 | 100 | ✓ |
27
+ | tho · clay | accent-bright on ink (headings) | #DEC7A2 / #2D220E | 71.7 | ✓ |
28
+ | tho · clay | accent-on on accent-bright (CTA text) | #2D220E / #DEC7A2 | 71.8 | ✓ |
29
+ | tho · clay | accent-bright on dark panel (dark labels) | #E4CDA8 / #221710 | 76.7 | ✓ |
30
+ | hoa | text-accent on white (bold labels) | #B47054 / #FFFFFF | 66.2 | ✓ |
31
+ | hoa | text-accent on tint (bold labels) | #B47054 / #FFF4F0 | 60.9 | ✓ |
32
+ | hoa | accent-bright on ink (headings) | #FED3C3 / #381B10 | 82.8 | ✓ |
33
+ | hoa | accent-on on accent-bright (CTA text) | #381B10 / #FED3C3 | 82.1 | ✓ |
34
+ | hoa | accent-bright on dark panel (dark labels) | #FED3C3 / #221710 | 84.2 | ✓ |
35
+ | hoa · plasma | text-accent on white (bold labels) | #967C75 / #FFFFFF | 66.1 | ✓ |
36
+ | hoa · plasma | text-accent on tint (bold labels) | #967C75 / #FEF4F2 | 60.7 | ✓ |
37
+ | hoa · plasma | accent-bright on ink (headings) | #FCE6DF / #2C211E | 91.8 | ✓ |
38
+ | hoa · plasma | accent-on on accent-bright (CTA text) | #2C211E / #FCE6DF | 90.4 | ✓ |
39
+ | hoa · plasma | accent-bright on dark panel (dark labels) | #FCE6DF / #221710 | 93.2 | ✓ |
40
+ | hoa · lava | text-accent on white (bold labels) | #280D00 / #FFFFFF | 104.7 | ✓ |
41
+ | hoa · lava | text-accent on tint (bold labels) | #280D00 / #FFF4EF | 99.4 | ✓ |
42
+ | hoa · lava | accent-bright on ink (headings) | #F1BEA4 / #361D0F | 71 | ✓ |
43
+ | hoa · lava | accent-on on accent-bright (CTA text) | #361D0F / #F1BEA4 | 71.2 | ✓ |
44
+ | hoa · lava | accent-bright on dark panel (dark labels) | #F8C4AA / #221710 | 76.2 | ✓ |
45
+ | thuy | text-accent on white (bold labels) | #108EA0 / #FFFFFF | 65.8 | ✓ |
46
+ | thuy | text-accent on tint (bold labels) | #108EA0 / #E7FBFF | 61.2 | ✓ |
47
+ | thuy | accent-bright on ink (headings) | #99EEFF / #012A30 | 85.3 | ✓ |
48
+ | thuy | accent-on on accent-bright (CTA text) | #012A30 / #99EEFF | 84.3 | ✓ |
49
+ | thuy | accent-bright on dark panel (dark labels) | #99EEFF / #221710 | 87.2 | ✓ |
50
+ | thuy · mist | text-accent on white (bold labels) | #5A8A90 / #FFFFFF | 65.8 | ✓ |
51
+ | thuy · mist | text-accent on tint (bold labels) | #5A8A90 / #EBFAFC | 61.1 | ✓ |
52
+ | thuy · mist | accent-bright on ink (headings) | #CDF4F9 / #13282B | 93.1 | ✓ |
53
+ | thuy · mist | accent-on on accent-bright (CTA text) | #13282B / #CDF4F9 | 91.5 | ✓ |
54
+ | thuy · mist | accent-bright on dark panel (dark labels) | #CDF4F9 / #221710 | 94.7 | ✓ |
55
+ | thuy · ocean | text-accent on white (bold labels) | #011A21 / #FFFFFF | 104.5 | ✓ |
56
+ | thuy · ocean | text-accent on tint (bold labels) | #011A21 / #EAFAFF | 99.8 | ✓ |
57
+ | thuy · ocean | accent-bright on ink (headings) | #A8D3E0 / #10282F | 72.7 | ✓ |
58
+ | thuy · ocean | accent-on on accent-bright (CTA text) | #10282F / #A8D3E0 | 72.6 | ✓ |
59
+ | thuy · ocean | accent-bright on dark panel (dark labels) | #ABD6E3 / #221710 | 76.1 | ✓ |
60
+ | moc | text-accent on white (bold labels) | #629122 / #FFFFFF | 64.9 | ✓ |
61
+ | moc | text-accent on tint (bold labels) | #629122 / #EFFCE3 | 60.5 | ✓ |
62
+ | moc | accent-bright on ink (headings) | #C5ED9C / #182A00 | 85.2 | ✓ |
63
+ | moc | accent-on on accent-bright (CTA text) | #182A00 / #C5ED9C | 84.2 | ✓ |
64
+ | moc | accent-bright on dark panel (dark labels) | #C5ED9C / #221710 | 86.9 | ✓ |
65
+ | moc · bamboo | text-accent on white (bold labels) | #7C8965 / #FFFFFF | 64.9 | ✓ |
66
+ | moc · bamboo | text-accent on tint (bold labels) | #7C8965 / #F4F9ED | 60.2 | ✓ |
67
+ | moc · bamboo | accent-bright on ink (headings) | #E5F1D2 / #212617 | 93 | ✓ |
68
+ | moc · bamboo | accent-on on accent-bright (CTA text) | #212617 / #E5F1D2 | 91.4 | ✓ |
69
+ | moc · bamboo | accent-bright on dark panel (dark labels) | #E5F1D2 / #221710 | 94.5 | ✓ |
70
+ | moc · forest | text-accent on white (bold labels) | #051D00 / #FFFFFF | 104.4 | ✓ |
71
+ | moc · forest | text-accent on tint (bold labels) | #051D00 / #ECFDE7 | 100.2 | ✓ |
72
+ | moc · forest | accent-bright on ink (headings) | #B0D8A3 / #162A0E | 73.2 | ✓ |
73
+ | moc · forest | accent-on on accent-bright (CTA text) | #162A0E / #B0D8A3 | 73.2 | ✓ |
74
+ | moc · forest | accent-bright on dark panel (dark labels) | #B0D8A3 / #221710 | 75 | ✓ |
75
+ | kim | text-accent on white (bold labels) | #AC780B / #FFFFFF | 65.8 | ✓ |
76
+ | kim | text-accent on tint (bold labels) | #AC780B / #FFF5E7 | 60.5 | ✓ |
77
+ | kim | accent-bright on ink (headings) | #FDD89F / #312002 | 83.5 | ✓ |
78
+ | kim | accent-on on accent-bright (CTA text) | #312002 / #FDD89F | 82.8 | ✓ |
79
+ | kim | accent-bright on dark panel (dark labels) | #FDD89F / #221710 | 85 | ✓ |
80
+ | kim · titanium | text-accent on white (bold labels) | #947F65 / #FFFFFF | 65.8 | ✓ |
81
+ | kim · titanium | text-accent on tint (bold labels) | #947F65 / #FDF5ED | 60.5 | ✓ |
82
+ | kim · titanium | accent-bright on ink (headings) | #FBE8D2 / #2B2217 | 92 | ✓ |
83
+ | kim · titanium | accent-on on accent-bright (CTA text) | #2B2217 / #FBE8D2 | 90.6 | ✓ |
84
+ | kim · titanium | accent-bright on dark panel (dark labels) | #FBE8D2 / #221710 | 93.4 | ✓ |
85
+ | kim · steel | text-accent on white (bold labels) | #1F1400 / #FFFFFF | 104.8 | ✓ |
86
+ | kim · steel | text-accent on tint (bold labels) | #1F1400 / #FEF6E7 | 99.8 | ✓ |
87
+ | kim · steel | accent-bright on ink (headings) | #DCC8A2 / #2D220E | 71.8 | ✓ |
88
+ | kim · steel | accent-on on accent-bright (CTA text) | #2D220E / #DCC8A2 | 71.9 | ✓ |
89
+ | kim · steel | accent-bright on dark panel (dark labels) | #DFCBA5 / #221710 | 75.1 | ✓ |
90
90
 
91
91
  **Failures: 0.** All text pairings pass Lc ≥ 60.
92
92
 
93
- ## Dark-theme semantic colours (WCAG, added v2.8.0)
93
+ ## Dark pack APCA floors (gate twin)
94
94
 
95
- The light-theme semantic foregrounds failed on dark surfaces (~2.5:1), so the dark theme overrides them. WCAG contrast on the dark panel `#221710` (and as a fill paired with dark ink `#1a1108`):
96
- | Role | Dark value | on panel | as fill w/ ink | Verdict |
95
+ Targets match `_audit/apca-dark-preview.html`: bright ≥ 75 · accent ≥ 60 · on/strong ≥ 75 · ink-on-tint ≥ 75.
96
+ | Pack | bright | accent | on | ink |
97
97
  |---|---|---|---|---|
98
- | success | #4ADE80 | 10.06 | 10.69 | ✓ |
99
- | danger | #F87171 | 6.34 | 6.73 | ✓ |
100
- | warning | #FBBF24 | 10.50 | 11.16 | ✓ |
101
- | info | #7CB2FB | 8.03 | 8.53 | ✓ |
98
+ | tho | 75 | 69.2 | 75.6 | 76.8 |
99
+ | tho · sand | 93.8 | 92.7 | 75.6 | 91.5 |
100
+ | tho · clay | 76.7 | 60.4 | 94.1 | 76.2 |
101
+ | hoa | 84.2 | 68.2 | 75.1 | 81.9 |
102
+ | hoa · plasma | 93.2 | 91.2 | 75 | 90.9 |
103
+ | hoa · lava | 76.2 | 61.1 | 94 | 75.7 |
104
+ | thuy | 87.2 | 72.8 | 76 | 84.4 |
105
+ | thuy · mist | 94.7 | 94 | 75.9 | 92 |
106
+ | thuy · ocean | 76.1 | 60.1 | 93.9 | 75.1 |
107
+ | moc | 86.9 | 71.8 | 75.4 | 84.4 |
108
+ | moc · bamboo | 94.5 | 93.6 | 75.3 | 92 |
109
+ | moc · forest | 75 | 60.8 | 93.7 | 76.3 |
110
+ | kim | 85 | 69.2 | 75.6 | 82.6 |
111
+ | kim · titanium | 93.4 | 92.1 | 75.8 | 91.1 |
112
+ | kim · steel | 75.1 | 60.7 | 94 | 76.4 |
102
113
 
103
- Core dark also remaps the primary button to Ochre (`#f4ba17` on `#1a1108`) and warms the field border — so no dark control is low-contrast. Dark shadows are umber-tinted (weak on dark by nature); the dark hairline border provides panel separation instead.
104
- This file is generated — re-run the APCA sweep script after any token change.
105
-
106
- ## Dark elemental packs — APCA verification (v4.0.0, Jul 2026)
107
-
108
- Generated with the owner-approved dark packs applied; measured by the same SAPC-4g implementation as `_audit/apca-dark-preview.html` (also the regression gate). Targets: bright ≥ 75 · accent ≥ 60 · button ink ≥ 75 · ink-on-tint ≥ 75 — **15/15 packs pass**.
109
- | Pack | bright | accent | on/strong | ink/tint |
110
- |---|---|---|---|---|
111
- | tho | 75 | 69.2 | 75.1 | 75.3 |
112
- | tho · clay | 75.7 | 61.5 | 76 | 76.1 |
113
- | tho · sand | 85.1 | 74.3 | 75.7 | 83.6 |
114
- | hoa | 75.1 | 61.5 | 75.6 | 75.9 |
115
- | hoa · lava | 75 | 60.6 | 83.5 | 75.8 |
116
- | hoa · plasma | 75.9 | 60.8 | 75.4 | 76.7 |
117
- | thuy | 76.6 | 61.6 | 76.7 | 76.6 |
118
- | thuy · ocean | 77.2 | 60 | 86.6 | 75.5 |
119
- | thuy · mist | 80.3 | 66.6 | 76 | 78.7 |
120
- | moc | 76 | 60.1 | 76 | 76.1 |
121
- | moc · bamboo | 76 | 62.8 | 75 | 76.2 |
122
- | moc · forest | 76.4 | 60.9 | 88.6 | 76.6 |
123
- | kim | 75.1 | 60.1 | 75.2 | 75.4 |
124
- | kim · steel | 76.3 | 61.1 | 76 | 76.6 |
125
- | kim · titanium | 76.9 | 60.9 | 79.4 | 75.5 |
@@ -4,24 +4,25 @@ For humans and agents *extending this system*. (Consumers: read `SKILL.md`.) The
4
4
 
5
5
  ## The expansion rule
6
6
 
7
- **When anything grows, everything updates in the same change.** A new element/variant, icon, component, token role, language, or template pattern must propagate to: tokens/source → specimen cards (guidelines + the component group card) **and related guideline pages** → component contract trio (`.jsx` + `.d.ts` + `.prompt.md`) → **all** templates (tweak enums and maps) → Storybook Live / Identity Lab → docs (README counts, SKILL, **and every related document the change touches** — kit READMEs, registry, contrast report regenerated after token changes). **Do not bump `VERSION` and do not maintain a changelog file** — version stays at 1.0.0. Continuity is git history plus curated **Release Notes** (`docs/release-notes.md` / Storybook). Gate every expansion with the compiler check **and a grep for the old enum/list** — nothing ships half-propagated. Documented scope boundaries (doctrine, not gaps): UI-kit pages stay pixel-faithful Thổ recreations (axes demoed in Storybook Live and Identity Lab); every template is bilingual EN·VN and English-default (client/media collateral stays English-primary), and language variants render **fully separated** — see the decision log.
7
+ **When anything grows, everything updates in the same change.** A new element/variant, icon, component, token role, language, or template pattern must propagate to: tokens/source → specimen cards (guidelines + the component group card) **and related guideline pages** → component contract trio (`.jsx` + `.d.ts` + `.prompt.md`) → **all** templates (tweak enums and maps) → Storybook toolbar / Atomic View → docs (README counts, SKILL, **and every related document the change touches** — kit READMEs, registry, contrast report regenerated after token changes). **Bump `VERSION` only with an explicit owner instruction; do not maintain a changelog** — current release is **1.1.1**. Continuity is git history plus curated **Release Notes** (`docs/release-notes.md` / Storybook). Gate every expansion with the compiler check **and a grep for the old enum/list** — nothing ships half-propagated. Documented scope boundaries (doctrine, not gaps): UI-kit pages stay pixel-faithful Thổ recreations (axes demoed in Storybook toolbar and Atomic View); every template is bilingual EN·VN and English-default (client/media collateral stays English-primary), and language variants render **fully separated** — see the decision log.
8
8
 
9
- ## The three axes
9
+ ## The four axes
10
10
 
11
- Every rendered surface resolves three orthogonal scopes — never encode one axis inside another:
11
+ Every rendered surface resolves four orthogonal scopes — never encode one axis inside another:
12
12
  | Axis | Attribute | Owns | Packs live in |
13
13
  |---|---|---|---|
14
- | **Theme** | `data-theme="dark\|system"` | light/dark inversion | `tokens/colors.css` |
14
+ | **Theme** | `data-theme="dark\|system"` | light / dark / system (OS) | `tokens/colors.css` |
15
15
  | **Element** (Ngũ Hành) | `data-cs-element` + `data-cs-variant` | hue identity per product | `tokens/elements.css` |
16
16
  | **Language** | `lang` / Language tweak | EN · VI copy | component registry + template props |
17
+ | **Style** | `data-cs-style` (optional; absent ≡ `liquid-glass`) | surface material pack | `tokens/styles.css` |
17
18
 
18
- Surface treatment is liquid-glass (fixed). Immutable under all axes: Umber/Ochre anchors, voice, type families, semantic status colors, the 3px Ochre focus ring, APCA floors, ≥44px targets.
19
+ Style’s sole pack today is **liquid-glass**. Immutable under all axes: Umber/Ochre anchors, voice, type families, semantic status colors, the 3px Ochre focus ring, APCA floors, ≥44px targets.
19
20
 
20
21
  ## Naming grammar
21
22
 
22
23
  - Tokens: `--cs-<layer>-<role>[-<state>]` (`--cs-color-text-muted`). Element role layer: `--cs-accent-*` (9-token contract — see `tokens/elements.css` header).
23
24
 
24
- - Classes: `.cs-<block>[-<part>][--modifier]`. Data attributes: `data-theme`, `data-cs-element`, `data-cs-variant`.
25
+ - Classes: `.cs-<block>[-<part>][--modifier]`. Data attributes: `data-theme`, `data-cs-element`, `data-cs-variant`, `data-cs-style`.
25
26
 
26
27
  - Files: `tokens/<concern>.css` · `base/<concern>.css` (concern names, never changelog names — "interaction", not "refinements2") · `components/<group>/<Name>.{jsx,d.ts,prompt.md}` · `templates/<dept>-<artifact>/` · `guidelines/<group>-<topic>.html`.
27
28
 
@@ -37,18 +38,20 @@ Surface treatment is liquid-glass (fixed). Immutable under all axes: Umber/Ochre
37
38
 
38
39
  **New element variant** — stay inside the element's oklch envelope; set the 9 `--cs-accent-*` contract tokens plus `--cs-color-text-accent`/`--cs-color-link` (APCA-check both); the aurora wash inherits from the element via `.cs-aurora-wash` (override the class rule only if the variant truly needs its own image); gradient partner (`grad-b`) must follow Tương sinh.
39
40
 
40
- **Ship check** — run the compiler check until clean, then run `_audit/docs-consistency.html` **and** `_audit/namespace-portability.html` (both must be green). Version stays pinned at 1.0.0.
41
+ **Ship check** — run the compiler check until clean, then run `_audit/docs-consistency.html` **and** `_audit/namespace-portability.html` (both must be green). Version is LAUNCHED at 1.1.0; current pin is **1.1.1**.
41
42
 
42
43
  ## Decision log (owner-approved)
43
44
 
44
45
  - Elements fully replace Ochre inside product scopes; plasma's hot-pink edge approved (Jul 2026).
45
46
 
46
- - Axes are Theme × Element × Language only. Surface treatment is liquid-glass (fixed).
47
+ - Axes are Theme × Element × Language × Style. Style pack is liquid-glass (sole pack; absent ≡ default).
47
48
 
48
49
  - Product registry is **locked** (Jul 2026) — eight portfolio mappings in `docs/products.md`; do not invent new product → element assignments.
49
50
 
50
51
  - Text never sits on the mid-tone `-accent` — codified after the APCA sweep (see `docs/contrast-report.md`).
51
52
 
53
+ - **The display face is a token role, not a second default (Jul 2026).** `--cs-font-family-display` ships Space Grotesk (variable 300–700, Vietnamese subset) self-hosted alongside Be Vietnam Pro and JetBrains Mono, so a product with a headline face — `cyberskill.world` / Lumi — consumes a DS role instead of maintaining its own `@font-face` exception. **Nothing in the DS points at it**: `--cs-heading-family` still resolves to `--cs-font-family-ui`, every template and UI kit is unchanged, and a scope opts in with `.cs-display-face` (`base/typography.css`), which retargets `--cs-heading-family` only — body copy stays on the UI face. Space Grotesk has no 800, so the extrabold heading weight clamps to 700 within that family (CSS does not hop to Be Vietnam Pro for a missing weight). Adding a family means adding its faces to `tokens/fonts.css` **and** its files to `fonts/` **and** its entries to `_ds_manifest.json` `fonts[]`/`brandFonts[]` — `_audit/font-face-integrity.html` fails on any of the three being out of step, and on any family missing the Vietnamese subset. This changes no product → element mapping; `docs/products.md` stays locked.
54
+
52
55
  - Language variants render **fully separated**: switching the Language tweak yields a complete single-language artifact — no partial translation left in headings, labels, helper text, footers, or body. The only bilingual-by-design elements are the CyberSkill name + slogan lockup (`Hiện Thực Hoá Ý Chí · Turn Your Will Into Real`, the canonical form — never a lone half) and the A4 legal identity block (company legal name + state motto). Everything else swaps with the tweak (Jul 2026).
53
56
 
54
57
  - **Namespace is resolved, never hardcoded** — the compiler names the bundle global `window.CyberSkillDesignSystem_<projectId>`, and that 6-hex suffix is derived from the project id, so it changes whenever the system is imported into another project. Templates read the stable `window.CyberSkillDS` alias that `ds-base.js` publishes on bundle load; cards, UI-kit pages, the standalone email, and audit harnesses resolve by prefix (`window[Object.keys(window).find(k=>/^CyberSkillDesignSystem_[0-9a-f]{6}$/.test(k))]`). `_ds_bundle.js`/`_ds_manifest.json` and the frozen `_audit/exports/` snapshot legitimately carry the real suffix (they *define* it). Enforced by `_audit/namespace-portability.html`, which scans every manifest-indexed source — keeps re-import **zero-touch** (Jul 2026).
@@ -65,7 +68,7 @@ Every template exports; the right path depends on the archetype. All paths prese
65
68
  | Email / product page / any DC | **Standalone offline HTML** | The DC loads CSS + bundle dynamically via `ds-base.js`, which `super_inline_html` can't see. To bundle: make a `*-standalone.html` copy **in the same folder** (keeps `./support.js` relative) with **static** `<link rel="stylesheet" href="../../styles.css">` + `<script src="../../_ds_bundle.js">` in the raw `<head>` (both inlinable) instead of `ds-base.js`, plus a `<template id="__bundler_thumbnail">`. Bake the target language into the props default. Then `super_inline_html`. |
66
69
  | Any | **Editor-native + Claude Code handoff** | The whole project is dev-handoff-ready (compiled bundle + `.d.ts` + `prompt.md` per component); generate the package on request via the handoff skill. |
67
70
 
68
- **Font behavior on export.** Brand fonts are self-hosted (`Be Vietnam Pro` UI, mono). PPTX keeps the brand-font **names** but does not embed the files — on a machine without them PowerPoint substitutes a fallback (VN Unicode text is preserved; shapes may reflow slightly). For a fully self-contained hand-off, either tell the recipient to install the fonts, or export with a web-safe swap (`fontSwaps:[{from:'Be Vietnam Pro',to:'Arial'}]` — Arial covers Vietnamese). Standalone HTML **embeds** the fonts (inlined `@font-face` from `styles.css`), so it is always faithful offline (Jul 2026).
71
+ **Font behavior on export.** Brand fonts are self-hosted (`Be Vietnam Pro` UI, `Space Grotesk` opt-in display, mono). PPTX keeps the brand-font **names** but does not embed the files — on a machine without them PowerPoint substitutes a fallback (VN Unicode text is preserved; shapes may reflow slightly). For a fully self-contained hand-off, either tell the recipient to install the fonts, or export with a web-safe swap (`fontSwaps:[{from:'Be Vietnam Pro',to:'Arial'}]` — Arial covers Vietnamese). Standalone HTML **embeds** the fonts (inlined `@font-face` from `styles.css`), so it is always faithful offline (Jul 2026).
69
72
 
70
73
  ## Accessibility (base/a11y.css + component ARIA)
71
74
 
package/docs/decisions.md CHANGED
@@ -24,7 +24,7 @@ Stay on the current Figma plan. Variables REST API is Enterprise-only — write
24
24
 
25
25
  **Owner choice: Storybook is the single live hub** (Jul 2026)
26
26
 
27
- - Operators use Storybook at `/` for Theme × Element × Language and component control matrices.
27
+ - Operators use Storybook at `/` for Theme × Element × Language × Style and component control matrices.
28
28
  - No separate Live View page exists in the tree.
29
29
  - Legacy `/dashboard`, `/dashboard/`, `/dashboard.html`, `/dashboard/:path*`, `/playground`, `/playground/`, `/playground/:path*` redirect to `/`.
30
30
  - Portable Atomic View and other static HTML remain for zero-build gates and consumers; they are not the site product entry.
@@ -44,17 +44,18 @@ Stay on the current Figma plan. Variables REST API is Enterprise-only — write
44
44
 
45
45
  **Status: provisional / soft-skip — not a live library publish** (Jul 2026; deferred Jul 2026)
46
46
 
47
- - CI job `code-connect` + `figma.config.json` + 99 `*.figma.tsx` mappings are in-repo (import snippets use `@cyberskill/design`).
47
+ - CI job `code-connect` + `figma.config.json` + 105 `*.figma.tsx` mappings are in-repo (import snippets use `@cyberskill/design`).
48
48
  - Publish soft-skips when secrets are missing or the API returns 403/404/429. Soft-skip ≠ successful Code Connect publish.
49
49
  - **Owner deferral:** stay on **Figma free / non-Org** for now — do not pursue live Code Connect until an Org/Enterprise seat with a published team library is available. Then replace synthetic `9999:*` stubs in `code-connect/node-map.json` with real `nodeId`s. See `docs/figma.md`.
50
50
 
51
- ## 7. npm publish — path shipped; unlock in progress
51
+ ## 7. npm publish — live via Trusted Publishing (OIDC)
52
52
 
53
- **Status: operator-ready; package not yet on the registry as `@cyberskill/design`** (Jul 2026)
53
+ **Status: LAUNCHED `@cyberskill/design@1.1.0`; current pin `@cyberskill/design@1.1.1`; CI publish uses npm Trusted Publishing; tokens disallowed** (Jul 2026; LAUNCH 2026-07-27)
54
54
 
55
- - `package.json` is `private: false`; package name **`@cyberskill/design`** (scoped `@cyberskill/*` convention; `publishConfig.access: public`); `prepublishOnly` runs `build:bundle` + `build:design-md --check`.
56
- - Workflow `.github/workflows/npm-publish.yml` on `workflow_dispatch` / `v*` tags; without `NPM_TOKEN` the job **soft-skips** (exit 0 + tarball report). Soft-skip ≠ a published release.
57
- - **Owner progress:** npm org **`@cyberskill`** already publishes other packages; `NPM_TOKEN` is set on the repo. **Still required:** run **Actions → npm-publish → Run workflow** once so `@cyberskill/design@1.0.0` appears on the registry, then issue an **explicit consumer grant** (policy text — not a secret) for teams allowed to install. License stays **UNLICENSED**; version stays **1.0.0**. See `docs/consuming.md`.
55
+ - `package.json` is `private: false`; package name **`@cyberskill/design`** (`publishConfig.access: public`); `repository.url` matches this GitHub repo for provenance.
56
+ - Workflow `.github/workflows/npm-publish.yml`: `id-token: write` + GitHub-hosted runner; **no** `NPM_TOKEN` / `NODE_AUTH_TOKEN` on the publish step (OIDC). npm Trusted Publisher must list workflow filename **`npm-publish.yml`** for `cyberskill-official/design-system`. Soft-skip on auth / 403 / 404 / EOTP / version conflict.
57
+ - Package **Publishing access** on npmjs: **Require two-factor authentication and disallow tokens** (OIDC Trusted Publishing still works; classic / granular publish tokens are rejected). Long-lived `NPM_TOKEN` secrets are revoked.
58
+ - License stays **UNLICENSED**; version is **1.1.1**. Approved use is recorded in **`docs/consumer-grant.md`** (CyberSkill portfolio products). Registry install alone is not a public license.
58
59
 
59
60
  ## 8. Native store packaging — scaffolds shipped; submit disabled
60
61
 
@@ -76,18 +77,40 @@ Recorded Jul 2026 — unlock defaults (updated as operator steps land):
76
77
 
77
78
  - **Figma Variables** — stay Tokens Studio / non-Enterprise (decision §3). Soft-skip on Variables REST remains honest.
78
79
  - **Code Connect** — **skipped while on Figma free**; revisit only after Org + published library + real `nodeId`s (decision §6). Soft-skip ≠ publish.
79
- - **npm** — org `@cyberskill` + `NPM_TOKEN` ready; first publish of `@cyberskill/design` + written consumer grant still owner-run (decision §7). Soft-skip ≠ a published release of *this* package.
80
+ - **npm** — **LAUNCH `@cyberskill/design@1.1.0`**; current pin **`@cyberskill/design@1.1.1`** (publish via `v*` tag / Trusted Publishing); CI uses **Trusted Publishing (OIDC)** via `npm-publish.yml`; npmjs **disallow tokens**; consumer grant in force at `docs/consumer-grant.md` (decision §7). Default package entry is bundler-native `_esm/react.mjs` (React peer); browser path is `@cyberskill/design/legacy` → `_esm/cs.mjs` (decision §10).
81
+
82
+ ## 10. Bundler-native React export (Next / SSR)
83
+
84
+ **Owner choice: ship `_esm/react.mjs` as default `exports["."]`** (Jul 2026; React 19 host Jul 2026)
85
+
86
+ - React / react-dom are **peerDependencies** (`^18 || ^19`); the entry re-exports source JSX (consumer transpiles — e.g. Next `transpilePackages`). Host Storybook / CI **devDependencies** pin **react@19.2.8** / **react-dom@19.2.8**.
87
+ - Browser / no-build keeps `_esm/cs.mjs` at `exports["./legacy"]` (CDN self-ensure + `_ds_bundle.js`). Official React 19 dropped UMD builds — the CDN path loads **`umd-react@19.2.8`** (SRI-pinned) to populate `window.React` / `window.ReactDOM` for `_ds_bundle.js`. Same pin is used in audit HTML, specimen cards, UI kits, and the byte-identical `templates/*/support.js` runtime.
88
+ - Alias `@cyberskill/design/react` mirrors the default entry. VERSION is **1.1.1** post-LAUNCH; republish via Trusted Publishing after merge / tag.
89
+ - Docs: `docs/consuming.md` (+ VI); gates: `package-exports-integrity` + `test:react-entry`.
80
90
 
81
91
  ## Maintainer tasks (open)
82
92
 
83
93
  Operational follow-ups — not product marketing, not a backlog surface:
84
94
 
85
95
  1. **Code Connect** — deferred (Figma free). When upgrading to Org: replace `9999:*` stubs in `code-connect/node-map.json` with real published-library node IDs.
86
- 2. **npm first publish + grant** — ~~org / `NPM_TOKEN`~~ **done**. Remaining: Actions → **npm-publish** → Run workflow; confirm `npm view @cyberskill/design`; write the consumer grant for approved teams (see `docs/consuming.md`).
96
+
97
+ ~~2. npm consumer grant~~ — **done** (Jul 2026): Trusted Publishing + `docs/consumer-grant.md` (+ VI) for CyberSkill portfolio products.
87
98
 
88
99
  ~~3. Finalize products registry~~ — **done** (Jul 2026): see decision §9; `docs/products.md` is locked.
89
100
 
90
- Schema sidecars and Storybook `FullMatrix` continue to grow **opportunistically** when a primary already qualifies (today only Button has FullMatrix under the contract) — not as a mass-add pass. See `docs/quality-gates.md`.
101
+ ~~4. First registry consumer path~~ — **done** (Jul 2026): `examples/npm-hello/` installs `@cyberskill/design` for locked **Lumi** identity; documented in `docs/consuming.md` (+ VI) and `docs/release-notes.md`. Now targets **1.1.1** post-LAUNCH.
102
+
103
+ 5. **Native + element-pack drift on PRs is fail-closed** (Jul 2026) — `regenerate-tokens` runs read-only on pull requests and exits 1 instead of pushing; only `regenerate-tokens-push` (main / schedule / manual) holds `contents: write`. When a PR fails it, run `npm run tokens:elements && node _audit/ci/generate-native-tokens.mjs` and commit packs + natives. See `docs/ci-cd.md`.
104
+
105
+ 6. **Shadcn gap / Wave 2** (Jul 2026) — CyberSkill already covers ~53 of shadcn’s 62 primitives as CS-native (forms / overlays / nav / data). Shipped: pilot `ScrollArea`, `Collapsible`, `AspectRatio`; Wave 2 `AlertDialog` (vs Popconfirm), `Item` row primitive, `NativeSelect`. Residual shadcn gaps are intentional non-ports (blocks, Tailwind, Radix CLI). Do **not** port those — map patterns to existing `templates/` + `ui_kits/`.
106
+
107
+ 7. **Element colour geometry** (Jul 2026; owner palette bar Jul 2026) — **30** default sets (5 × soft/middle/deep × light/dark) from `tokens/element-seeds.json` (`npm run tokens:elements`): soft = washed pastel, middle = intensity-synced default (Thổ middle pins logo ochre), deep = clearly darker sibling in the same hue family; harmonious role ramps; light↔dark hue lock; APCA dark floors. Geometry gate requires both minΔE and minΔL plus monotonic L. Public variant names unchanged. Hard gate: `_audit/element-geometry.html`. Benchmark rubric: `docs/benchmark-rubric.md`.
108
+
109
+ 8. **Style axis (`data-cs-style`)** (Jul 2026) — Fourth product axis; sole live pack **liquid-glass** (absent ≡ liquid-glass). Contract: `tokens/styles.css` + hard gate `_audit/style-contract.html`. Future Style packs may expand indefinitely, each with its own colour-combination language — only via owner approval + Expansion Rule checklist in `docs/benchmark-rubric.md` (do not invent packs casually).
110
+
111
+ 9. **Identity Lab retired** (Jul 2026) — Owner choice: delete `ui_kits/status-hub/identity-lab.html` and every product/docs/Storybook reference. Axis demos live in the Storybook Theme × Element × Language × Style toolbar, Atomic View, and the Elements Geometry specimen. Theme × Element × Language × Style **axes remain** product infrastructure (templates, tokens, kits Thổ-faithful). Do not revive the Lab under another name without a new decision.
112
+
113
+ Storybook `FullMatrix` is required whenever a public primary has ≥1 of {size enums, variant enums, state keys} (contract floor ≥28 stories). Schema sidecars remain complete for content-hole templates; axis-only templates omit by design. See `docs/quality-gates.md` and `docs/storybook.md`.
91
114
 
92
115
  ## How to change a decision
93
116
 
package/docs/deploy.md CHANGED
@@ -40,7 +40,7 @@ Shipped for production (`design.cyberskill.world`):
40
40
 
41
41
  If you host under a **different** domain, change the absolute URLs in those meta tags to match your origin, or re-export the PNG and keep the path `assets/og-dashboard.png`.
42
42
 
43
- **Common misconfig:** picking a JS framework preset (Next/CRA) — Vercel then runs the wrong build graph and may 404 root docs. The preset must stay **"Other"** and `vercel.json` must own install/build/output (see table above). `package.json` is publishable (`"private": false`) for the npm path; it also carries **host-only** scripts (`build:storybook`, `build:site`, verify/test) that product apps should not depend on (see `docs/consuming.md` and `docs/storybook.md`). Packaging copies the portable webroot then overlays Storybook at `.vercel-static/` root (portable paths like `/styles.css`, `/_audit/`, `/guidelines/` stay available beside Storybook assets). **How to tell a hosting misconfig from a real docs bug:** open `/_audit/docs-consistency.html` on the *deployed* URL — the gate detects an HTML/error body where a raw `.md`/`.json` was expected and reports "hosting is intercepting this path".
43
+ **Common misconfig:** picking a JS framework preset (Next/CRA) — Vercel then runs the wrong build graph and may 404 root docs. The preset must stay **"Other"** and `vercel.json` must own install/build/output (see table above). `package.json` is publishable (`"private": false`) for the npm path; it also carries **host-only** scripts (`build:storybook`, `build:site`, verify/test) that product apps should not depend on (see `docs/consuming.md` and `docs/storybook.md`). Packaging copies the portable webroot then overlays Storybook at `.vercel-static/` root (portable paths like `/styles.css`, `/_audit/`, `/guidelines/` stay available beside Storybook assets). **`_audit/` stays public on purpose** — Storybook Status embeds `_audit/run.html` full-bleed; removing it would break the product surface. **How to tell a hosting misconfig from a real docs bug:** open `/_audit/docs-consistency.html` on the *deployed* URL — the gate detects an HTML/error body where a raw `.md`/`.json` was expected and reports "hosting is intercepting this path".
44
44
 
45
45
  ## Generic VPS / nginx / any static host
46
46
 
@@ -1,25 +1,43 @@
1
1
  # Design styles
2
2
 
3
- Current surface treatment is **liquid-glass** (fixed). The live styling axes are **Theme × Element × Language** only.
3
+ The live styling axes are **Theme × Element × Language × Style**. Style’s sole pack today is **liquid-glass** (absent `data-cs-style` ≡ liquid-glass — same default pattern as light theme / Thổ middle).
4
+
4
5
  | Axis | How to set it | What it changes |
5
6
  |---|---|---|
6
- | **Theme** | `data-theme="light\|dark"` | light/dark semantic colours |
7
- | **Element** | `data-cs-element` + optional `data-cs-variant` | Ngũ Hành product identity (15 packs) |
7
+ | **Theme** | light = attribute absent; `data-theme="dark"` | light/dark semantic colours (product UI axis). Token-level `data-theme="system"` follows the OS (`prefers-color-scheme`) and mirrors dark — Storybook toolbar and Atomic View expose a system control |
8
+ | **Element** | `data-cs-element` + optional `data-cs-variant` | Ngũ Hành product identity (**15 packs** = 5 elements × soft/middle/deep) |
8
9
  | **Language** | `lang` / Language tweak | EN · VI copy |
10
+ | **Style** | `data-cs-style` (optional; absent ≡ `liquid-glass`) | Surface material pack. Sole pack today: **liquid-glass** (`tokens/styles.css` + `base/glass.css`) |
9
11
 
10
- ## Fixed treatment
12
+ ## Element colour contract
11
13
 
12
- - Liquid-glass materials (`cs-surface-*`) are the default surface language.
14
+ Source of truth: [`tokens/element-seeds.json`](../tokens/element-seeds.json) → `npm run tokens:elements` → [`tokens/elements.css`](../tokens/elements.css) (+ JSON / JS / DTCG / native mirrors). **Do not hand-edit pack hexes.**
13
15
 
14
- - Radius, shadow, and glass tokens come from the base system — not a parallel "style pack" axis.
16
+ | Rule | Detail |
17
+ |---|---|
18
+ | **Default** | Thổ **middle** (studio) — logo ochre `#F4BA17` on `:root` when no element attribute is set |
19
+ | **Intensity ladder** | Every element has **soft · middle · deep** with shared OKLCH L targets (C scaled per element). Middle is the default (no `data-cs-variant`) |
20
+ | **Names preserved** | Public variants stay `sand/clay`, `plasma/lava`, `mist/ocean`, `bamboo/forest`, `titanium/steel` — mapped onto the ladder (see [`docs/products.md`](products.md) Slot column) |
21
+ | **Character offsets** | Small explicit `dh`/`dc` in the seed file only (e.g. Hỏa·plasma, Kim·steel) — not freehand drift |
22
+ | **Light ↔ dark** | Same hue family (Δh locked); roles remapped + APCA-solved — 15 × 2 = **30 colour sets** |
23
+ | **Text rule** | Text on `-bright` or `-tint` only — never on mid-tone `-accent` |
24
+ | **Never remap** | `--cs-color-accent-ochre` focus ring · semantic status colours |
25
+ | **Geometry gate** | [`_audit/element-geometry.html`](../_audit/element-geometry.html) — intensity sync · variant distinctness · hue identity |
15
26
 
27
+ ## Style pack — liquid-glass
28
+
29
+ - Liquid-glass materials (`cs-surface-*`) are the default surface language.
30
+ - Radius, shadow, and glass tokens come from `tokens/elevation.css` + `base/glass.css`; the Style axis contract lives in [`tokens/styles.css`](../tokens/styles.css).
31
+ - Gate: [`_audit/style-contract.html`](../_audit/style-contract.html) — allowlists `liquid-glass` only.
16
32
  - Rejected by doctrine: neon/cyberpunk cold hues, memphis playfulness, full skeuomorphism, emoji in UI chrome.
33
+ - Type families are fixed and token-named: Be Vietnam Pro (UI) · Space Grotesk (`--cs-font-family-display`, opt-in headline face) · JetBrains Mono (code). The display face is a **role a scope may opt into** with `.cs-display-face`, not a product axis.
17
34
 
18
35
  ## Adding a new look
19
36
 
20
37
  Prefer:
21
- 1. A new **Element** or **variant** when the shift is hue/identity.
38
+ 1. A new **Element** intensity tweak (seed offset) when the shift is hue/identity inside Ngũ Hành.
22
39
  2. Local composition with existing tokens/classes when the shift is one-off layout.
23
40
  3. A documented pattern in `docs/conventions.md` + a specimen card when the pattern should be reusable.
41
+ 4. A new **`data-cs-style`** pack only after an Expansion Rule pass — see [`docs/benchmark-rubric.md`](benchmark-rubric.md) style-expansion checklist. Styles consume the same 9 accent roles; they must not invent parallel Element packs.
24
42
 
25
- Do not invent a fourth product axis without an Expansion Rule pass across tokens, Storybook Live, templates, docs, and gates.
43
+ Do not invent a fifth product axis, and do not add a second Style pack without the Expansion Rule checklist.
package/docs/figma.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## What ships in-repo
4
4
  - Design tokens in CSS + DTCG (`tokens/tokens.dtcg.json`) with native Swift/Kotlin/Flutter mirrors.
5
- - UI kits under `ui_kits/` are HTML recreations that stay pixel-faithful to the brand doctrine (Thổ-first Identity Lab).
5
+ - UI kits under `ui_kits/` are HTML recreations that stay pixel-faithful to the brand doctrine (Thổ-first kits; axis demos in Storybook / Atomic View).
6
6
  - **Code Connect** mappings for all **99** public primaries (`components/**/*.figma.tsx` + `figma.config.json` + `code-connect/node-map.json`).
7
7
 
8
8
  ## Tokens Studio import recipe (hand-sync)
@@ -47,7 +47,7 @@ Must be **repository secrets** under the Actions tab (exact names, case-sensitiv
47
47
 
48
48
  If you hover a PAT and only see scopes like `file_content:read`, `file_comments:*`, `webhooks:*`, `library_*` — that is expected on **Professional / Organization** seats. Figma **does not list** `file_variables:*` unless the account is on **Enterprise**. Regenerating a PAT on a non-Enterprise plan cannot unlock the Variables REST API.
49
49
 
50
- **What CI does today:** secrets + file open work on any plan; the Variables write soft-skips with a report when Figma returns 403 / invalid scopes for `file_variables` (so gates stay green). Full auto-push needs Enterprise + those two scopes on the PAT.
50
+ **What CI does today:** the `figma-variables-push` job **soft-skips (exit 0 + report) if `FIGMA_TOKEN` / `FIGMA_FILE_KEY` are empty** — same honesty as Code Connect (missing secrets are not a red main). With secrets present, file open works on any plan; the Variables write also soft-skips with a report when Figma returns **403** / invalid scopes for `file_variables`. Soft-skip ≠ live Variables sync. Full auto-push needs Enterprise + those two scopes on the PAT.
51
51
 
52
52
  **Non-Enterprise alternatives:** hand-sync colour styles from `tokens/tokens.dtcg.json`, or use [Tokens Studio](https://tokens.studio/) / the Plugin API inside the desktop app (plugin path does not use this REST job) — see the import recipe above.
53
53
 
@@ -83,7 +83,7 @@ After a successful push, open the file in Figma → **Local variables** → coll
83
83
  | Mappings | `components/**/<Name>.figma.tsx` — **99** primaries; Button / TextField / Dialog / Card / Alert have prop maps; others are stubs |
84
84
  | Generator | `npm run code-connect:generate` → `_audit/ci/generate-code-connect.mjs` |
85
85
  | CI job | `code-connect` in `design-system-gates.yml` (PR + `main` + manual) |
86
- | Local dry-run | `npm run code-connect:dry-run` (no secrets; asserts config + ≥99 files) |
86
+ | Local dry-run | `npm run code-connect:dry-run` (no secrets; asserts config + ≥105 files) |
87
87
 
88
88
  Document URLs use placeholder file key **`CS_FIGMA_FILE_KEY`**. Publish substitutes `FIGMA_FILE_KEY` via `documentUrlSubstitutions`.
89
89
 
package/docs/live-hub.md CHANGED
@@ -20,9 +20,9 @@
20
20
 
21
21
  | Surface | Role |
22
22
  |---|---|
23
- | **Storybook** (`/`) | Host product surface: Theme × Element × Language toolbar, Docs/Foundations/Components/Release Notes/Status, and Maintainer/* iframes into portable HTML |
23
+ | **Storybook** (`/`) | Host product surface: Theme × Element × Language × Style toolbar, Docs/Foundations/Components/Release Notes/Status, and Maintainer/* iframes into portable HTML |
24
24
  | **Atomic View** (`guidelines/atomic-view.html`) | Portable zero-build component grid for gates and clone-and-open browsing — not the public product entry |
25
- | **Other guidelines / templates** | Portable specimens; opened from Storybook Maintainer/* when exploring Motion, Identity Lab, kitchen-sink, etc. |
25
+ | **Other guidelines / templates** | Portable specimens; opened from Storybook Maintainer/* when exploring Motion, Status Hub / Website / Deck indexes, kitchen-sink, etc. |
26
26
  | **Legacy `/dashboard`, `/dashboard/`, `/dashboard.html`, `/dashboard/:path*`, `/playground`, `/playground/`, `/playground/:path*`** | Redirect to `/` (stubs + Vercel redirects) |
27
27
 
28
28
  ## Surface map (Maintainer/* stories)
@@ -31,7 +31,9 @@
31
31
  |---|---|
32
32
  | Components/* CSF | React sources under `components/` |
33
33
  | Maintainer/Surfaces → Motion | `guidelines/motion.html` |
34
- | Maintainer/Surfaces → Identity Lab | `ui_kits/status-hub/identity-lab.html` |
34
+ | Maintainer/Surfaces → Status Hub | `ui_kits/status-hub/index.html` |
35
+ | Maintainer/Surfaces → Website | `ui_kits/website/index.html` |
36
+ | Maintainer/Surfaces → Deck | `ui_kits/deck/index.html` |
35
37
  | Maintainer/Surfaces → Template Playground | `templates/playground.html` |
36
38
  | Maintainer/Surfaces → Kitchen Sink | `templates/kitchen-sink.html` |
37
39
  | Maintainer/Surfaces → Image Slots | `templates/image-slots-demo.html` |
package/docs/products.md CHANGED
@@ -4,22 +4,24 @@
4
4
 
5
5
  **Source of truth.** Maps CyberSkill portfolio products to Ngũ Hành element packs. One element per product; secondary accents only in gradient washes along Tương sinh.
6
6
 
7
- | Product | Element | Variant | Secondary (Tương sinh) | Markup |
8
- |---|---|---|---|---|
9
- | **Lumi** — wish assistant | Hỏa · fire | plasma | tho | `data-cs-element="hoa" data-cs-variant="plasma"` |
10
- | **Status Hub** — client portfolio portal | Thủy · water | river (default) | moc | `data-cs-element="thuy"` |
11
- | **CyberOS Agent Spine** — agent infra, memory, gates | Kim · metal | steel | thuy | `data-cs-element="kim" data-cs-variant="steel"` |
12
- | **CyberSkill Design System** — this library | Mộc · wood | leaf (default) | hoa | `data-cs-element="moc"` |
13
- | **cyberskill.world** — the studio site | Thổ · earth | studio (default) | — | *(no attributes — studio is Thổ)* |
14
- | **Client delivery suite** — kickoff · QBR · runbooks | Thổ · earth | clay | kim | `data-cs-element="tho" data-cs-variant="clay"` |
15
- | **Board / investor collateral** | Kim · metal | champagne (default) | thuy | `data-cs-element="kim"` |
16
- | **HR / employment instruments** | Mộc · wood | bamboo | hoa | `data-cs-element="moc" data-cs-variant="bamboo"` |
7
+ | Product | Element | Variant | Slot | Secondary (Tương sinh) | Markup |
8
+ |---|---|---|---|---|---|
9
+ | **Lumi** — wish assistant | Hỏa · fire | plasma | soft | tho | `data-cs-element="hoa" data-cs-variant="plasma"` |
10
+ | **Status Hub** — client portfolio portal | Thủy · water | river (default) | middle | moc | `data-cs-element="thuy"` |
11
+ | **CyberOS Agent Spine** — agent infra, memory, gates | Kim · metal | steel | deep | thuy | `data-cs-element="kim" data-cs-variant="steel"` |
12
+ | **CyberSkill Design System** — this library | Mộc · wood | leaf (default) | middle | hoa | `data-cs-element="moc"` |
13
+ | **cyberskill.world** — the studio site | Thổ · earth | studio (default) | middle | — | *(no attributes — studio is Thổ)* |
14
+ | **Client delivery suite** — kickoff · QBR · runbooks | Thổ · earth | clay | deep | kim | `data-cs-element="tho" data-cs-variant="clay"` |
15
+ | **Board / investor collateral** | Kim · metal | champagne (default) | middle | thuy | `data-cs-element="kim"` |
16
+ | **HR / employment instruments** | Mộc · wood | bamboo | soft | hoa | `data-cs-element="moc" data-cs-variant="bamboo"` |
17
+
18
+ **Slots** (soft / middle / deep) are the shared intensity ladder — see [`docs/design-styles.md`](design-styles.md). Public variant names stay stable; packs are generated from `tokens/element-seeds.json`.
17
19
 
18
20
  **Why these:** Lumi is conversational spark (plasma). Status Hub is calm status flow (Thủy). Agent Spine is precision infrastructure (Kim·steel). Design System grows everything else (Mộc). Studio brand is Thổ. Delivery is grounded earth (clay). Board collateral is metal precision. HR instruments grow people (bamboo).
19
21
 
20
22
  ## Scope
21
23
 
22
- - **UI kits stay Thổ-faithful.** `ui_kits/status-hub` and `ui_kits/website` remain Thổ recreations; per-element demos live in **Identity Lab** / Storybook Live.
24
+ - **UI kits stay Thổ-faithful.** `ui_kits/status-hub` and `ui_kits/website` remain Thổ recreations; per-element demos live in the **Storybook Element toolbar**, **Atomic View**, and **Elements Geometry** specimen.
23
25
 
24
26
  - **Consuming a mapping:** scope the product root with the row's Markup and consume `--cs-accent-*`.
25
27