@cyberskill/design 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (779) hide show
  1. package/DESIGN.md +85 -85
  2. package/README.md +3 -3
  3. package/SECURITY.md +4 -4
  4. package/VERSION +1 -1
  5. package/_ds_bundle.js +2 -2
  6. package/_ds_bundle.js.map +1 -1
  7. package/_ds_manifest.json +141 -141
  8. package/_esm/cs.mjs +2 -2
  9. package/base/collections.css +3 -2
  10. package/base/components.css +8 -7
  11. package/base/controls.css +14 -14
  12. package/base/data.css +3 -3
  13. package/base/feedback.css +2 -2
  14. package/base/forms.css +3 -2
  15. package/base/glass.css +2 -2
  16. package/base/interaction.css +6 -1
  17. package/base/navigation.css +2 -2
  18. package/base/reset.css +2 -0
  19. package/base/shell.css +5 -5
  20. package/base/typography.css +4 -4
  21. package/components/_i18n/strings.js +3 -3
  22. package/components/_utils/open-change.js +18 -0
  23. package/components/ai/ai-conversation.card.html +2 -0
  24. package/components/ai/ai-lumi.card.html +2 -0
  25. package/components/ai/ai.card.html +2 -0
  26. package/components/api-discovery.json +94 -24
  27. package/components/api-index.json +528 -80
  28. package/components/brand/brand.card.html +2 -0
  29. package/components/button/buttons.card.html +2 -0
  30. package/components/contracts.json +23 -9
  31. package/components/data/collections.card.html +2 -0
  32. package/components/data/data.card.html +2 -0
  33. package/components/datatable/DataGrid.jsx +1 -1
  34. package/components/datatable/datatable.card.html +2 -0
  35. package/components/dialog/Dialog.d.ts +3 -0
  36. package/components/dialog/Dialog.jsx +7 -5
  37. package/components/dialog/Dialog.prompt.md +1 -0
  38. package/components/dialog/dialog.card.html +2 -0
  39. package/components/feedback/Alert.d.ts +5 -1
  40. package/components/feedback/Alert.jsx +4 -3
  41. package/components/feedback/Alert.prompt.md +2 -0
  42. package/components/feedback/Toast.d.ts +3 -0
  43. package/components/feedback/Toast.jsx +4 -3
  44. package/components/feedback/Toast.prompt.md +1 -0
  45. package/components/feedback/feedback-2.card.html +2 -0
  46. package/components/feedback/feedback.card.html +2 -0
  47. package/components/forms/forms-2.card.html +2 -0
  48. package/components/forms/forms.card.html +2 -0
  49. package/components/i18n/i18n.card.html +2 -1
  50. package/components/icon/icon.card.html +2 -0
  51. package/components/lifecycle.json +433 -55
  52. package/components/logo/logo.card.html +2 -0
  53. package/components/navigation/CommandPalette.d.ts +4 -1
  54. package/components/navigation/CommandPalette.jsx +6 -5
  55. package/components/navigation/CommandPalette.prompt.md +1 -0
  56. package/components/navigation/Menubar.jsx +2 -2
  57. package/components/navigation/navigation.card.html +2 -0
  58. package/components/navigation/shell.card.html +2 -0
  59. package/components/overlays/Drawer.d.ts +3 -0
  60. package/components/overlays/Drawer.jsx +6 -5
  61. package/components/overlays/Drawer.prompt.md +1 -0
  62. package/components/overlays/Tour.d.ts +3 -0
  63. package/components/overlays/Tour.jsx +8 -5
  64. package/components/overlays/Tour.prompt.md +1 -0
  65. package/components/overlays/alertdialog.card.html +2 -0
  66. package/components/overlays/overlays.card.html +2 -0
  67. package/components/prompt-api.json +17 -10
  68. package/components/scenarios.json +37 -37
  69. package/components/specifications.json +3403 -1401
  70. package/components/static-html-reference.json +36 -36
  71. package/components/textfield/textfield.card.html +2 -0
  72. package/dist/esm/_esm/react.mjs +69 -68
  73. package/dist/esm/build.json +526 -518
  74. package/dist/esm/chunks/{chunk-FEUTSZBN.mjs → chunk-2CCVFTPL.mjs} +2 -2
  75. package/dist/esm/chunks/{chunk-W5VR7GTL.mjs → chunk-2VVGZEOQ.mjs} +2 -2
  76. package/dist/esm/chunks/{chunk-3RC4CDAE.mjs → chunk-3R5WJQCB.mjs} +2 -2
  77. package/dist/esm/chunks/{chunk-W6N22NMF.mjs → chunk-4FGB6VHN.mjs} +2 -2
  78. package/dist/esm/chunks/{chunk-JN57OITY.mjs → chunk-4RSFD6QC.mjs} +10 -7
  79. package/dist/esm/chunks/chunk-4RSFD6QC.mjs.map +7 -0
  80. package/dist/esm/chunks/{chunk-YZR3C7V2.mjs → chunk-4TO35YGK.mjs} +2 -2
  81. package/dist/esm/chunks/{chunk-JSAPFO73.mjs → chunk-4YWKKULF.mjs} +2 -2
  82. package/dist/esm/chunks/{chunk-W2RF4NWB.mjs → chunk-5FQGNCKS.mjs} +2 -2
  83. package/dist/esm/chunks/chunk-65SIJBJX.mjs +22 -0
  84. package/dist/esm/chunks/chunk-65SIJBJX.mjs.map +7 -0
  85. package/dist/esm/chunks/{chunk-SYCXNMYP.mjs → chunk-6ECKJ6RS.mjs} +2 -2
  86. package/dist/esm/chunks/{chunk-CH4W6RCG.mjs → chunk-6H7JYBPI.mjs} +10 -5
  87. package/dist/esm/chunks/chunk-6H7JYBPI.mjs.map +7 -0
  88. package/dist/esm/chunks/{chunk-72AUOI37.mjs → chunk-6TZDNLHE.mjs} +2 -2
  89. package/dist/esm/chunks/{chunk-QGCPHFSI.mjs → chunk-72STPBL4.mjs} +2 -2
  90. package/dist/esm/chunks/{chunk-37AN57S5.mjs → chunk-7GSR2NGL.mjs} +3 -3
  91. package/dist/esm/chunks/{chunk-A3PGQW3X.mjs → chunk-AA5BSO3T.mjs} +2 -2
  92. package/dist/esm/chunks/{chunk-NH6M42ZI.mjs → chunk-ASGO2FW5.mjs} +2 -2
  93. package/dist/esm/chunks/{chunk-GP5ITSCH.mjs → chunk-C3NAMBA7.mjs} +2 -2
  94. package/dist/esm/chunks/{chunk-YA7Y7PEC.mjs → chunk-CKBL3UEA.mjs} +2 -2
  95. package/dist/esm/chunks/{chunk-H7EJ7TNP.mjs → chunk-CYZ22MB7.mjs} +2 -2
  96. package/dist/esm/chunks/{chunk-JRIWHAWW.mjs → chunk-D7A4ZCMJ.mjs} +2 -2
  97. package/dist/esm/chunks/{chunk-A7RWM4XH.mjs → chunk-DANUZS4S.mjs} +2 -2
  98. package/dist/esm/chunks/{chunk-FAVSLU7E.mjs → chunk-DFBKBVSE.mjs} +2 -2
  99. package/dist/esm/chunks/{chunk-TNHQB6CI.mjs → chunk-DW4AWLA5.mjs} +2 -2
  100. package/dist/esm/chunks/{chunk-5R5KMLUR.mjs → chunk-DWJIX65T.mjs} +2 -2
  101. package/dist/esm/chunks/{chunk-YJNSQ5PJ.mjs → chunk-EITZT2U5.mjs} +2 -2
  102. package/dist/esm/chunks/{chunk-CSJHR2W2.mjs → chunk-EOCMQT4L.mjs} +2 -2
  103. package/dist/esm/chunks/{chunk-4QBKN42N.mjs → chunk-EXOOST5G.mjs} +2 -2
  104. package/dist/esm/chunks/{chunk-7HTAAMIY.mjs → chunk-FF5D53IP.mjs} +2 -2
  105. package/dist/esm/chunks/{chunk-JNK7QN24.mjs → chunk-FOEJO2YQ.mjs} +2 -2
  106. package/dist/esm/chunks/{chunk-F3M5TQ76.mjs → chunk-GB6VWFOE.mjs} +11 -6
  107. package/dist/esm/chunks/chunk-GB6VWFOE.mjs.map +7 -0
  108. package/dist/esm/chunks/{chunk-UFE32JPH.mjs → chunk-GHWOEHEX.mjs} +8 -4
  109. package/dist/esm/chunks/chunk-GHWOEHEX.mjs.map +7 -0
  110. package/dist/esm/chunks/{chunk-HYQG5XND.mjs → chunk-GLPQBE2J.mjs} +2 -2
  111. package/dist/esm/chunks/{chunk-HUW6OY7C.mjs → chunk-GNEVR5Q4.mjs} +2 -2
  112. package/dist/esm/chunks/{chunk-SEYKDGXE.mjs → chunk-H4TKHAB3.mjs} +2 -2
  113. package/dist/esm/chunks/{chunk-ANWF2NX3.mjs → chunk-H6HQZ5RI.mjs} +3 -3
  114. package/dist/esm/chunks/{chunk-ANWF2NX3.mjs.map → chunk-H6HQZ5RI.mjs.map} +2 -2
  115. package/dist/esm/chunks/{chunk-OR5UTKW7.mjs → chunk-I3H7EAH5.mjs} +2 -2
  116. package/dist/esm/chunks/{chunk-P64YS5W2.mjs → chunk-I3PQVFX5.mjs} +2 -2
  117. package/dist/esm/chunks/{chunk-5MR3C2QG.mjs → chunk-IOEWPBAL.mjs} +2 -2
  118. package/dist/esm/chunks/{chunk-TN2MZXGS.mjs → chunk-JIHWIDMP.mjs} +2 -2
  119. package/dist/esm/chunks/{chunk-FXELBWXK.mjs → chunk-JTAYZ36C.mjs} +4 -3
  120. package/dist/esm/chunks/{chunk-FXELBWXK.mjs.map → chunk-JTAYZ36C.mjs.map} +2 -2
  121. package/dist/esm/chunks/{chunk-25AOTZAM.mjs → chunk-JZYRXWPD.mjs} +4 -4
  122. package/dist/esm/chunks/{chunk-25AOTZAM.mjs.map → chunk-JZYRXWPD.mjs.map} +2 -2
  123. package/dist/esm/chunks/{chunk-YX62AV33.mjs → chunk-KAOUK33L.mjs} +2 -2
  124. package/dist/esm/chunks/{chunk-UVJ5BBQG.mjs → chunk-KWPNHP73.mjs} +2 -2
  125. package/dist/esm/chunks/{chunk-BABSYWVB.mjs → chunk-LCC4ZVVO.mjs} +2 -2
  126. package/dist/esm/chunks/{chunk-GWBINWTF.mjs → chunk-LWRFPVX7.mjs} +8 -4
  127. package/dist/esm/chunks/chunk-LWRFPVX7.mjs.map +7 -0
  128. package/dist/esm/chunks/{chunk-HVF4NT6P.mjs → chunk-MRXEJSQQ.mjs} +2 -2
  129. package/dist/esm/chunks/{chunk-DIIXA7WD.mjs → chunk-NZKMM4FK.mjs} +2 -2
  130. package/dist/esm/chunks/{chunk-CLWTVJM3.mjs → chunk-OEWAQZYE.mjs} +2 -2
  131. package/dist/esm/chunks/{chunk-IH4I7JSB.mjs → chunk-OILXJXVX.mjs} +10 -7
  132. package/dist/esm/chunks/chunk-OILXJXVX.mjs.map +7 -0
  133. package/dist/esm/chunks/{chunk-OOZKMXYB.mjs → chunk-PBP2MKZH.mjs} +2 -2
  134. package/dist/esm/chunks/{chunk-JKKJHQVQ.mjs → chunk-PE6KC2U7.mjs} +2 -2
  135. package/dist/esm/chunks/{chunk-N5TM7UIY.mjs → chunk-PFTKXY5Q.mjs} +2 -2
  136. package/dist/esm/chunks/{chunk-R7QVE2JP.mjs → chunk-PLN3ITUB.mjs} +2 -2
  137. package/dist/esm/chunks/{chunk-NEMFYL4X.mjs → chunk-QBPDNM7S.mjs} +2 -2
  138. package/dist/esm/chunks/{chunk-JDI3UMJW.mjs → chunk-SIMVM4RV.mjs} +2 -2
  139. package/dist/esm/chunks/{chunk-WJF2Q2Y3.mjs → chunk-TMXLSCAG.mjs} +2 -2
  140. package/dist/esm/chunks/{chunk-TGYG7JP4.mjs → chunk-TNQXCIBM.mjs} +2 -2
  141. package/dist/esm/chunks/{chunk-DHTD5KM5.mjs → chunk-TWCJMLGG.mjs} +2 -2
  142. package/dist/esm/chunks/{chunk-EPFDMHPK.mjs → chunk-U7RKPGRO.mjs} +2 -2
  143. package/dist/esm/chunks/{chunk-NMIGE2IM.mjs → chunk-UWNMGKAN.mjs} +2 -2
  144. package/dist/esm/chunks/{chunk-KXFGO7N4.mjs → chunk-VAPKJRQI.mjs} +2 -2
  145. package/dist/esm/chunks/{chunk-XTBN55D3.mjs → chunk-VUCJT2QJ.mjs} +2 -2
  146. package/dist/esm/chunks/{chunk-TVTBVHT2.mjs → chunk-WLANQTOU.mjs} +2 -2
  147. package/dist/esm/chunks/{chunk-3MCNCG2L.mjs → chunk-XZ5NWMO7.mjs} +2 -2
  148. package/dist/esm/chunks/{chunk-QPXQZBQC.mjs → chunk-YKU2KVAQ.mjs} +2 -2
  149. package/dist/esm/chunks/{chunk-ZKFOGW4D.mjs → chunk-YLSFKG64.mjs} +2 -2
  150. package/dist/esm/chunks/{chunk-TO2T6EEB.mjs → chunk-YVSAUCWW.mjs} +3 -3
  151. package/dist/esm/chunks/{chunk-XN74VX5H.mjs → chunk-ZKBAIIAQ.mjs} +2 -2
  152. package/dist/esm/chunks/{chunk-7IJTTRPK.mjs → chunk-ZPLENPV2.mjs} +2 -2
  153. package/dist/esm/components/ai/AIDisclosureBadge.mjs +2 -2
  154. package/dist/esm/components/ai/ChatMessage.mjs +2 -2
  155. package/dist/esm/components/ai/CitationList.mjs +2 -2
  156. package/dist/esm/components/ai/ConfidenceMeter.mjs +2 -2
  157. package/dist/esm/components/ai/HumanReviewGate.mjs +2 -2
  158. package/dist/esm/components/ai/PromptInput.mjs +2 -2
  159. package/dist/esm/components/ai/TypingIndicator.mjs +2 -2
  160. package/dist/esm/components/data/Carousel.mjs +2 -2
  161. package/dist/esm/components/data/Chart.mjs +2 -2
  162. package/dist/esm/components/data/CodeBlock.mjs +2 -2
  163. package/dist/esm/components/data/Comment.mjs +2 -2
  164. package/dist/esm/components/data/Image.mjs +2 -2
  165. package/dist/esm/components/data/Sortable.mjs +2 -2
  166. package/dist/esm/components/data/Splitter.mjs +2 -2
  167. package/dist/esm/components/data/Terminal.mjs +2 -2
  168. package/dist/esm/components/data/Tooltip.mjs +2 -2
  169. package/dist/esm/components/datatable/DataGrid.mjs +2 -2
  170. package/dist/esm/components/datatable/DataTable.mjs +3 -3
  171. package/dist/esm/components/datatable/TreeTable.mjs +2 -2
  172. package/dist/esm/components/dialog/Dialog.mjs +3 -2
  173. package/dist/esm/components/feedback/Alert.mjs +3 -2
  174. package/dist/esm/components/feedback/EmptyState.mjs +2 -2
  175. package/dist/esm/components/feedback/ProgressBar.mjs +2 -2
  176. package/dist/esm/components/feedback/Result.mjs +2 -2
  177. package/dist/esm/components/feedback/Spinner.mjs +2 -2
  178. package/dist/esm/components/feedback/Tag.mjs +2 -2
  179. package/dist/esm/components/feedback/Toast.mjs +3 -2
  180. package/dist/esm/components/forms/Calendar.mjs +2 -2
  181. package/dist/esm/components/forms/Cascader.mjs +2 -2
  182. package/dist/esm/components/forms/ColorPicker.mjs +2 -2
  183. package/dist/esm/components/forms/Combobox.mjs +2 -2
  184. package/dist/esm/components/forms/DatePicker.mjs +3 -3
  185. package/dist/esm/components/forms/Editor.mjs +2 -2
  186. package/dist/esm/components/forms/FileUpload.mjs +2 -2
  187. package/dist/esm/components/forms/Form.mjs +2 -2
  188. package/dist/esm/components/forms/InlineEdit.mjs +2 -2
  189. package/dist/esm/components/forms/InputGroup.mjs +2 -2
  190. package/dist/esm/components/forms/InputOTP.mjs +2 -2
  191. package/dist/esm/components/forms/Mentions.mjs +2 -2
  192. package/dist/esm/components/forms/NumberField.mjs +2 -2
  193. package/dist/esm/components/forms/Rating.mjs +2 -2
  194. package/dist/esm/components/forms/SearchField.mjs +2 -2
  195. package/dist/esm/components/forms/Select.mjs +2 -2
  196. package/dist/esm/components/forms/Slider.mjs +2 -2
  197. package/dist/esm/components/forms/Switch.mjs +2 -2
  198. package/dist/esm/components/forms/TagInput.mjs +2 -2
  199. package/dist/esm/components/forms/TimePicker.mjs +2 -2
  200. package/dist/esm/components/forms/Toggle.mjs +2 -2
  201. package/dist/esm/components/forms/Transfer.mjs +2 -2
  202. package/dist/esm/components/forms/TreeSelect.mjs +2 -2
  203. package/dist/esm/components/i18n/LocaleProvider.mjs +2 -2
  204. package/dist/esm/components/navigation/BackTop.mjs +2 -2
  205. package/dist/esm/components/navigation/Breadcrumb.mjs +2 -2
  206. package/dist/esm/components/navigation/CommandPalette.mjs +3 -2
  207. package/dist/esm/components/navigation/HotKeys.mjs +2 -2
  208. package/dist/esm/components/navigation/Menu.mjs +2 -2
  209. package/dist/esm/components/navigation/Menubar.mjs +2 -2
  210. package/dist/esm/components/navigation/Pagination.mjs +2 -2
  211. package/dist/esm/components/navigation/Steps.mjs +2 -2
  212. package/dist/esm/components/navigation/Tabs.mjs +2 -2
  213. package/dist/esm/components/navigation/Toolbar.mjs +2 -2
  214. package/dist/esm/components/overlays/AlertDialog.mjs +2 -2
  215. package/dist/esm/components/overlays/ContextMenu.mjs +2 -2
  216. package/dist/esm/components/overlays/Drawer.mjs +3 -2
  217. package/dist/esm/components/overlays/Popconfirm.mjs +2 -2
  218. package/dist/esm/components/overlays/Popover.mjs +2 -2
  219. package/dist/esm/components/overlays/Tour.mjs +3 -2
  220. package/dist/styles.min.css +1 -1
  221. package/docs/ci-cd.md +1 -1
  222. package/docs/component-api.md +1 -1
  223. package/docs/consuming.md +1 -1
  224. package/docs/contrast-report.md +1 -1
  225. package/docs/conventions.md +1 -1
  226. package/docs/design-styles.md +1 -1
  227. package/docs/manual-at-matrix.md +2 -0
  228. package/docs/quality-gates.md +2 -1
  229. package/docs/reference-catalog.json +81 -81
  230. package/docs/release-notes.md +1 -1
  231. package/docs/static-html-reference.md +27 -27
  232. package/docs/template-inventory.json +162 -162
  233. package/docs/vi/ci-cd.md +1 -1
  234. package/docs/vi/component-api.md +1 -1
  235. package/docs/vi/consuming.md +1 -1
  236. package/docs/vi/contrast-report.md +1 -1
  237. package/docs/vi/conventions.md +1 -1
  238. package/docs/vi/decisions/component-specification-evidence.md +1 -1
  239. package/docs/vi/decisions/token-alias-compatibility.md +1 -1
  240. package/docs/vi/design-styles.md +1 -1
  241. package/docs/vi/entrypoints/DESIGN.md +85 -85
  242. package/docs/vi/entrypoints/README.md +3 -3
  243. package/docs/vi/manual-at-matrix.md +2 -0
  244. package/docs/vi/quality-gates.md +2 -1
  245. package/docs/vi/release-notes.md +1 -1
  246. package/docs/vi/static-html-reference.md +27 -27
  247. package/docs/viewer.html +9 -12
  248. package/guidelines/atomic-view.html +35 -31
  249. package/guidelines/brand-iconography.html +33 -32
  250. package/guidelines/brand-imagery.html +2 -1
  251. package/guidelines/brand-interaction.html +3 -2
  252. package/guidelines/brand-voice.html +2 -1
  253. package/guidelines/colors-anchors.html +2 -1
  254. package/guidelines/colors-semantic.html +2 -1
  255. package/guidelines/colors-surfaces.html +2 -1
  256. package/guidelines/colors-text.html +2 -1
  257. package/guidelines/documents.html +3 -2
  258. package/guidelines/elements-components.html +4 -3
  259. package/guidelines/elements-concept.html +3 -2
  260. package/guidelines/elements-geometry.html +4 -3
  261. package/guidelines/elements-variants.html +4 -3
  262. package/guidelines/guideline-language.js +1 -1
  263. package/guidelines/motion-interaction.html +2 -1
  264. package/guidelines/motion.html +12 -13
  265. package/guidelines/responsive-bilingual.html +7 -6
  266. package/guidelines/rtl-preview.html +2 -2
  267. package/guidelines/spacing-breakpoints.html +2 -1
  268. package/guidelines/spacing-radius.html +4 -3
  269. package/guidelines/spacing-scale.html +2 -1
  270. package/guidelines/surfaces-aurora.html +2 -1
  271. package/guidelines/surfaces-depth.html +3 -2
  272. package/guidelines/surfaces-glass.html +2 -1
  273. package/guidelines/surfaces-shadow.html +2 -1
  274. package/guidelines/type-families.html +2 -1
  275. package/guidelines/type-lineheight.html +2 -1
  276. package/guidelines/type-scale.html +2 -1
  277. package/guidelines/type-weights.html +2 -1
  278. package/package.json +3 -2
  279. package/styles/components/manifest.json +156 -148
  280. package/styles.layered.css +156 -149
  281. package/styles.layered.provenance.json +17 -17
  282. package/templates/_vendor/deck-stage.js +3 -3
  283. package/templates/_vendor/doc-export.js +1 -1
  284. package/templates/_vendor/support.js +1 -1
  285. package/templates/ai-cluster-demo.html +2 -1
  286. package/templates/app-shell/AppShell.dc.html +2 -1
  287. package/templates/app-shell/support.js +1 -1
  288. package/templates/article/Article.dc.html +2 -1
  289. package/templates/article/support.js +1 -1
  290. package/templates/auth/Auth.dc.html +2 -1
  291. package/templates/auth/support.js +1 -1
  292. package/templates/bod-deck/BodDeck.dc.html +1 -0
  293. package/templates/bod-deck/support.js +1 -1
  294. package/templates/bod-investor-update/BodInvestorUpdate.dc.html +1 -0
  295. package/templates/bod-investor-update/support.js +1 -1
  296. package/templates/bod-memo/support.js +1 -1
  297. package/templates/bod-minutes/BodMinutes.dc.html +1 -0
  298. package/templates/bod-minutes/support.js +1 -1
  299. package/templates/bod-report/BodReport.dc.html +1 -0
  300. package/templates/bod-report/support.js +1 -1
  301. package/templates/bod-resolution/BodResolution.dc.html +1 -0
  302. package/templates/bod-resolution/support.js +1 -1
  303. package/templates/culture-event-invite/CultureEventInvite.dc.html +1 -0
  304. package/templates/culture-event-invite/support.js +1 -1
  305. package/templates/dashboard/Dashboard.dc.html +2 -1
  306. package/templates/dashboard/support.js +1 -1
  307. package/templates/delivery-change-note/DeliveryChangeNote.dc.html +1 -0
  308. package/templates/delivery-change-note/support.js +1 -1
  309. package/templates/delivery-kickoff/DeliveryKickoff.dc.html +1 -0
  310. package/templates/delivery-kickoff/support.js +1 -1
  311. package/templates/delivery-qbr-deck/DeliveryQbrDeck.dc.html +3 -2
  312. package/templates/delivery-qbr-deck/support.js +1 -1
  313. package/templates/delivery-runbook/DeliveryRunbook.dc.html +1 -0
  314. package/templates/delivery-runbook/support.js +1 -1
  315. package/templates/delivery-status-email/support.js +1 -1
  316. package/templates/doc-style-guide/DocStyleGuide.dc.html +1 -0
  317. package/templates/doc-style-guide/support.js +1 -1
  318. package/templates/doc-suite-index/DocSuiteIndex.dc.html +1 -0
  319. package/templates/doc-suite-index/support.js +1 -1
  320. package/templates/doc-templates/support.js +1 -1
  321. package/templates/email/Email-VN-standalone.html +2 -1
  322. package/templates/email/support.js +1 -1
  323. package/templates/email-safe/email-announcement.html +2 -1
  324. package/templates/email-safe/email-dunning.html +2 -1
  325. package/templates/email-safe/email-investor.html +2 -1
  326. package/templates/email-safe/email-launch.html +2 -1
  327. package/templates/email-safe/email-newsletter.html +2 -1
  328. package/templates/email-safe/email-status.html +2 -1
  329. package/templates/email-safe/email-transactional.html +2 -1
  330. package/templates/finance-dunning-email/support.js +1 -1
  331. package/templates/finance-expense-report/support.js +1 -1
  332. package/templates/finance-invoice/support.js +1 -1
  333. package/templates/finance-quote/support.js +1 -1
  334. package/templates/hr-announcement/support.js +1 -1
  335. package/templates/hr-interview-kit/HrInterviewKit.dc.html +1 -0
  336. package/templates/hr-interview-kit/support.js +1 -1
  337. package/templates/hr-offboarding/HrOffboarding.dc.html +1 -0
  338. package/templates/hr-offboarding/support.js +1 -1
  339. package/templates/hr-performance-review/HrPerformanceReview.dc.html +1 -0
  340. package/templates/hr-performance-review/support.js +1 -1
  341. package/templates/hr-pip/HrPip.dc.html +1 -0
  342. package/templates/hr-pip/support.js +1 -1
  343. package/templates/image-slots-demo.html +11 -9
  344. package/templates/kitchen-sink.html +8 -4
  345. package/templates/legal-msa/LegalMsa.dc.html +1 -0
  346. package/templates/legal-msa/support.js +1 -1
  347. package/templates/legal-sow/support.js +1 -1
  348. package/templates/marketing-campaign-brief/MarketingCampaignBrief.dc.html +1 -0
  349. package/templates/marketing-campaign-brief/support.js +1 -1
  350. package/templates/marketing-case-study/MarketingCaseStudy.dc.html +1 -0
  351. package/templates/marketing-case-study/support.js +1 -1
  352. package/templates/marketing-launch/support.js +1 -1
  353. package/templates/marketing-newsletter/support.js +1 -1
  354. package/templates/marketing-page/MarketingPage.dc.html +6 -3
  355. package/templates/marketing-page/support.js +1 -1
  356. package/templates/marketing-press-release/MarketingPressRelease.dc.html +2 -1
  357. package/templates/marketing-press-release/support.js +1 -1
  358. package/templates/marketing-social-kit/MarketingSocialKit.dc.html +1 -0
  359. package/templates/marketing-social-kit/support.js +1 -1
  360. package/templates/playground.html +9 -7
  361. package/templates/sales-one-pager/SalesOnePager.dc.html +1 -0
  362. package/templates/sales-one-pager/support.js +1 -1
  363. package/templates/sales-proposal-deck/SalesProposalDeck.dc.html +1 -0
  364. package/templates/sales-proposal-deck/support.js +1 -1
  365. package/templates/settings/Settings.dc.html +2 -1
  366. package/templates/settings/support.js +1 -1
  367. package/templates/slide-deck/SlideDeck.dc.html +1 -0
  368. package/templates/slide-deck/support.js +1 -1
  369. package/templates/team-meeting-agenda/TeamMeetingAgenda.dc.html +1 -0
  370. package/templates/team-meeting-agenda/support.js +1 -1
  371. package/templates/tech-incident-report/TechIncidentReport.dc.html +1 -0
  372. package/templates/tech-incident-report/support.js +1 -1
  373. package/templates/tech-release-notes/support.js +1 -1
  374. package/templates/tech-retro/TechRetro.dc.html +1 -0
  375. package/templates/tech-retro/support.js +1 -1
  376. package/templates/tech-rfc/TechRfc.dc.html +2 -1
  377. package/templates/tech-rfc/support.js +1 -1
  378. package/templates/vn-appointment-transfer/support.js +1 -1
  379. package/templates/vn-certificate-of-employment/support.js +1 -1
  380. package/templates/vn-code-of-conduct/support.js +1 -1
  381. package/templates/vn-compensation-regulation/support.js +1 -1
  382. package/templates/vn-contract-amendment/support.js +1 -1
  383. package/templates/vn-contractor-agreement/support.js +1 -1
  384. package/templates/vn-data-protection-policy/support.js +1 -1
  385. package/templates/vn-disciplinary-case-file/support.js +1 -1
  386. package/templates/vn-disciplinary-schedule/VnDisciplinarySchedule.dc.html +1 -0
  387. package/templates/vn-disciplinary-schedule/support.js +1 -1
  388. package/templates/vn-employee-request/support.js +1 -1
  389. package/templates/vn-exit-handover/support.js +1 -1
  390. package/templates/vn-foreign-employee-pack/VnForeignEmployeePack.dc.html +1 -0
  391. package/templates/vn-foreign-employee-pack/support.js +1 -1
  392. package/templates/vn-framework-agreement/support.js +1 -1
  393. package/templates/vn-grassroots-democracy/support.js +1 -1
  394. package/templates/vn-infosec-policy/support.js +1 -1
  395. package/templates/vn-internal-labor-regulations/support.js +1 -1
  396. package/templates/vn-internship-agreement/support.js +1 -1
  397. package/templates/vn-job-description/support.js +1 -1
  398. package/templates/vn-labor-contract/support.js +1 -1
  399. package/templates/vn-labour-management-book/VnLabourManagementBook.dc.html +1 -0
  400. package/templates/vn-labour-management-book/support.js +1 -1
  401. package/templates/vn-mutual-nda/support.js +1 -1
  402. package/templates/vn-ndnca-ip/support.js +1 -1
  403. package/templates/vn-offer-letter/support.js +1 -1
  404. package/templates/vn-onboarding-checklist/VnOnboardingChecklist.dc.html +1 -0
  405. package/templates/vn-onboarding-checklist/support.js +1 -1
  406. package/templates/vn-pdpl-consent/support.js +1 -1
  407. package/templates/vn-performance-evaluation-regulation/support.js +1 -1
  408. package/templates/vn-performance-review-form/support.js +1 -1
  409. package/templates/vn-phantom-stock/VnPhantomStock.dc.html +1 -0
  410. package/templates/vn-phantom-stock/support.js +1 -1
  411. package/templates/vn-probation-contract/support.js +1 -1
  412. package/templates/vn-receipt-acknowledgement/VnReceiptAcknowledgement.dc.html +1 -0
  413. package/templates/vn-receipt-acknowledgement/support.js +1 -1
  414. package/templates/vn-remote-work-policy/support.js +1 -1
  415. package/templates/vn-resignation-letter/support.js +1 -1
  416. package/templates/vn-salary-scale/VnSalaryScale.dc.html +1 -0
  417. package/templates/vn-salary-scale/support.js +1 -1
  418. package/templates/vn-sow-appendix/support.js +1 -1
  419. package/templates/vn-termination-decision/support.js +1 -1
  420. package/templates/vn-total-rewards-appendix/support.js +1 -1
  421. package/templates/vn-training-commitment/support.js +1 -1
  422. package/templates/vn-travel-expense-policy/support.js +1 -1
  423. package/tokens/base-inventory.json +22 -22
  424. package/tokens/component-tokens.css +38 -38
  425. package/tokens/declarations.json +157 -157
  426. package/tokens/element-seeds.json +1 -1
  427. package/tokens/elements.css +48 -48
  428. package/tokens/modes/dark__default__comfortable__high.dtcg.json +1 -1
  429. package/tokens/modes/dark__default__comfortable__standard.dtcg.json +1 -1
  430. package/tokens/modes/dark__default__compact__high.dtcg.json +1 -1
  431. package/tokens/modes/dark__default__compact__standard.dtcg.json +1 -1
  432. package/tokens/modes/dark__hoa-lava__comfortable__high.dtcg.json +1 -1
  433. package/tokens/modes/dark__hoa-lava__comfortable__standard.dtcg.json +1 -1
  434. package/tokens/modes/dark__hoa-lava__compact__high.dtcg.json +1 -1
  435. package/tokens/modes/dark__hoa-lava__compact__standard.dtcg.json +1 -1
  436. package/tokens/modes/dark__hoa-plasma__comfortable__high.dtcg.json +1 -1
  437. package/tokens/modes/dark__hoa-plasma__comfortable__standard.dtcg.json +1 -1
  438. package/tokens/modes/dark__hoa-plasma__compact__high.dtcg.json +1 -1
  439. package/tokens/modes/dark__hoa-plasma__compact__standard.dtcg.json +1 -1
  440. package/tokens/modes/dark__hoa__comfortable__high.dtcg.json +1 -1
  441. package/tokens/modes/dark__hoa__comfortable__standard.dtcg.json +1 -1
  442. package/tokens/modes/dark__hoa__compact__high.dtcg.json +1 -1
  443. package/tokens/modes/dark__hoa__compact__standard.dtcg.json +1 -1
  444. package/tokens/modes/dark__kim-steel__comfortable__high.dtcg.json +1 -1
  445. package/tokens/modes/dark__kim-steel__comfortable__standard.dtcg.json +1 -1
  446. package/tokens/modes/dark__kim-steel__compact__high.dtcg.json +1 -1
  447. package/tokens/modes/dark__kim-steel__compact__standard.dtcg.json +1 -1
  448. package/tokens/modes/dark__kim-titanium__comfortable__high.dtcg.json +1 -1
  449. package/tokens/modes/dark__kim-titanium__comfortable__standard.dtcg.json +1 -1
  450. package/tokens/modes/dark__kim-titanium__compact__high.dtcg.json +1 -1
  451. package/tokens/modes/dark__kim-titanium__compact__standard.dtcg.json +1 -1
  452. package/tokens/modes/dark__kim__comfortable__high.dtcg.json +1 -1
  453. package/tokens/modes/dark__kim__comfortable__standard.dtcg.json +1 -1
  454. package/tokens/modes/dark__kim__compact__high.dtcg.json +1 -1
  455. package/tokens/modes/dark__kim__compact__standard.dtcg.json +1 -1
  456. package/tokens/modes/dark__moc-bamboo__comfortable__high.dtcg.json +1 -1
  457. package/tokens/modes/dark__moc-bamboo__comfortable__standard.dtcg.json +1 -1
  458. package/tokens/modes/dark__moc-bamboo__compact__high.dtcg.json +1 -1
  459. package/tokens/modes/dark__moc-bamboo__compact__standard.dtcg.json +1 -1
  460. package/tokens/modes/dark__moc-forest__comfortable__high.dtcg.json +1 -1
  461. package/tokens/modes/dark__moc-forest__comfortable__standard.dtcg.json +1 -1
  462. package/tokens/modes/dark__moc-forest__compact__high.dtcg.json +1 -1
  463. package/tokens/modes/dark__moc-forest__compact__standard.dtcg.json +1 -1
  464. package/tokens/modes/dark__moc__comfortable__high.dtcg.json +1 -1
  465. package/tokens/modes/dark__moc__comfortable__standard.dtcg.json +1 -1
  466. package/tokens/modes/dark__moc__compact__high.dtcg.json +1 -1
  467. package/tokens/modes/dark__moc__compact__standard.dtcg.json +1 -1
  468. package/tokens/modes/dark__tho-clay__comfortable__high.dtcg.json +1 -1
  469. package/tokens/modes/dark__tho-clay__comfortable__standard.dtcg.json +1 -1
  470. package/tokens/modes/dark__tho-clay__compact__high.dtcg.json +1 -1
  471. package/tokens/modes/dark__tho-clay__compact__standard.dtcg.json +1 -1
  472. package/tokens/modes/dark__tho-sand__comfortable__high.dtcg.json +1 -1
  473. package/tokens/modes/dark__tho-sand__comfortable__standard.dtcg.json +1 -1
  474. package/tokens/modes/dark__tho-sand__compact__high.dtcg.json +1 -1
  475. package/tokens/modes/dark__tho-sand__compact__standard.dtcg.json +1 -1
  476. package/tokens/modes/dark__tho__comfortable__high.dtcg.json +1 -1
  477. package/tokens/modes/dark__tho__comfortable__standard.dtcg.json +1 -1
  478. package/tokens/modes/dark__tho__compact__high.dtcg.json +1 -1
  479. package/tokens/modes/dark__tho__compact__standard.dtcg.json +1 -1
  480. package/tokens/modes/dark__thuy-mist__comfortable__high.dtcg.json +1 -1
  481. package/tokens/modes/dark__thuy-mist__comfortable__standard.dtcg.json +1 -1
  482. package/tokens/modes/dark__thuy-mist__compact__high.dtcg.json +1 -1
  483. package/tokens/modes/dark__thuy-mist__compact__standard.dtcg.json +1 -1
  484. package/tokens/modes/dark__thuy-ocean__comfortable__high.dtcg.json +1 -1
  485. package/tokens/modes/dark__thuy-ocean__comfortable__standard.dtcg.json +1 -1
  486. package/tokens/modes/dark__thuy-ocean__compact__high.dtcg.json +1 -1
  487. package/tokens/modes/dark__thuy-ocean__compact__standard.dtcg.json +1 -1
  488. package/tokens/modes/dark__thuy__comfortable__high.dtcg.json +1 -1
  489. package/tokens/modes/dark__thuy__comfortable__standard.dtcg.json +1 -1
  490. package/tokens/modes/dark__thuy__compact__high.dtcg.json +1 -1
  491. package/tokens/modes/dark__thuy__compact__standard.dtcg.json +1 -1
  492. package/tokens/modes/index.json +2068 -2068
  493. package/tokens/modes/light__default__comfortable__high.dtcg.json +1 -1
  494. package/tokens/modes/light__default__comfortable__standard.dtcg.json +1 -1
  495. package/tokens/modes/light__default__compact__high.dtcg.json +1 -1
  496. package/tokens/modes/light__default__compact__standard.dtcg.json +1 -1
  497. package/tokens/modes/light__hoa-lava__comfortable__high.dtcg.json +1 -1
  498. package/tokens/modes/light__hoa-lava__comfortable__standard.dtcg.json +1 -1
  499. package/tokens/modes/light__hoa-lava__compact__high.dtcg.json +1 -1
  500. package/tokens/modes/light__hoa-lava__compact__standard.dtcg.json +1 -1
  501. package/tokens/modes/light__hoa-plasma__comfortable__high.dtcg.json +1 -1
  502. package/tokens/modes/light__hoa-plasma__comfortable__standard.dtcg.json +1 -1
  503. package/tokens/modes/light__hoa-plasma__compact__high.dtcg.json +1 -1
  504. package/tokens/modes/light__hoa-plasma__compact__standard.dtcg.json +1 -1
  505. package/tokens/modes/light__hoa__comfortable__high.dtcg.json +1 -1
  506. package/tokens/modes/light__hoa__comfortable__standard.dtcg.json +1 -1
  507. package/tokens/modes/light__hoa__compact__high.dtcg.json +1 -1
  508. package/tokens/modes/light__hoa__compact__standard.dtcg.json +1 -1
  509. package/tokens/modes/light__kim-steel__comfortable__high.dtcg.json +1 -1
  510. package/tokens/modes/light__kim-steel__comfortable__standard.dtcg.json +1 -1
  511. package/tokens/modes/light__kim-steel__compact__high.dtcg.json +1 -1
  512. package/tokens/modes/light__kim-steel__compact__standard.dtcg.json +1 -1
  513. package/tokens/modes/light__kim-titanium__comfortable__high.dtcg.json +1 -1
  514. package/tokens/modes/light__kim-titanium__comfortable__standard.dtcg.json +1 -1
  515. package/tokens/modes/light__kim-titanium__compact__high.dtcg.json +1 -1
  516. package/tokens/modes/light__kim-titanium__compact__standard.dtcg.json +1 -1
  517. package/tokens/modes/light__kim__comfortable__high.dtcg.json +1 -1
  518. package/tokens/modes/light__kim__comfortable__standard.dtcg.json +1 -1
  519. package/tokens/modes/light__kim__compact__high.dtcg.json +1 -1
  520. package/tokens/modes/light__kim__compact__standard.dtcg.json +1 -1
  521. package/tokens/modes/light__moc-bamboo__comfortable__high.dtcg.json +1 -1
  522. package/tokens/modes/light__moc-bamboo__comfortable__standard.dtcg.json +1 -1
  523. package/tokens/modes/light__moc-bamboo__compact__high.dtcg.json +1 -1
  524. package/tokens/modes/light__moc-bamboo__compact__standard.dtcg.json +1 -1
  525. package/tokens/modes/light__moc-forest__comfortable__high.dtcg.json +1 -1
  526. package/tokens/modes/light__moc-forest__comfortable__standard.dtcg.json +1 -1
  527. package/tokens/modes/light__moc-forest__compact__high.dtcg.json +1 -1
  528. package/tokens/modes/light__moc-forest__compact__standard.dtcg.json +1 -1
  529. package/tokens/modes/light__moc__comfortable__high.dtcg.json +1 -1
  530. package/tokens/modes/light__moc__comfortable__standard.dtcg.json +1 -1
  531. package/tokens/modes/light__moc__compact__high.dtcg.json +1 -1
  532. package/tokens/modes/light__moc__compact__standard.dtcg.json +1 -1
  533. package/tokens/modes/light__tho-clay__comfortable__high.dtcg.json +1 -1
  534. package/tokens/modes/light__tho-clay__comfortable__standard.dtcg.json +1 -1
  535. package/tokens/modes/light__tho-clay__compact__high.dtcg.json +1 -1
  536. package/tokens/modes/light__tho-clay__compact__standard.dtcg.json +1 -1
  537. package/tokens/modes/light__tho-sand__comfortable__high.dtcg.json +1 -1
  538. package/tokens/modes/light__tho-sand__comfortable__standard.dtcg.json +1 -1
  539. package/tokens/modes/light__tho-sand__compact__high.dtcg.json +1 -1
  540. package/tokens/modes/light__tho-sand__compact__standard.dtcg.json +1 -1
  541. package/tokens/modes/light__tho__comfortable__high.dtcg.json +1 -1
  542. package/tokens/modes/light__tho__comfortable__standard.dtcg.json +1 -1
  543. package/tokens/modes/light__tho__compact__high.dtcg.json +1 -1
  544. package/tokens/modes/light__tho__compact__standard.dtcg.json +1 -1
  545. package/tokens/modes/light__thuy-mist__comfortable__high.dtcg.json +1 -1
  546. package/tokens/modes/light__thuy-mist__comfortable__standard.dtcg.json +1 -1
  547. package/tokens/modes/light__thuy-mist__compact__high.dtcg.json +1 -1
  548. package/tokens/modes/light__thuy-mist__compact__standard.dtcg.json +1 -1
  549. package/tokens/modes/light__thuy-ocean__comfortable__high.dtcg.json +1 -1
  550. package/tokens/modes/light__thuy-ocean__comfortable__standard.dtcg.json +1 -1
  551. package/tokens/modes/light__thuy-ocean__compact__high.dtcg.json +1 -1
  552. package/tokens/modes/light__thuy-ocean__compact__standard.dtcg.json +1 -1
  553. package/tokens/modes/light__thuy__comfortable__high.dtcg.json +1 -1
  554. package/tokens/modes/light__thuy__comfortable__standard.dtcg.json +1 -1
  555. package/tokens/modes/light__thuy__compact__high.dtcg.json +1 -1
  556. package/tokens/modes/light__thuy__compact__standard.dtcg.json +1 -1
  557. package/tokens/modes/system-dark__default__comfortable__high.dtcg.json +1 -1
  558. package/tokens/modes/system-dark__default__comfortable__standard.dtcg.json +1 -1
  559. package/tokens/modes/system-dark__default__compact__high.dtcg.json +1 -1
  560. package/tokens/modes/system-dark__default__compact__standard.dtcg.json +1 -1
  561. package/tokens/modes/system-dark__hoa-lava__comfortable__high.dtcg.json +1 -1
  562. package/tokens/modes/system-dark__hoa-lava__comfortable__standard.dtcg.json +1 -1
  563. package/tokens/modes/system-dark__hoa-lava__compact__high.dtcg.json +1 -1
  564. package/tokens/modes/system-dark__hoa-lava__compact__standard.dtcg.json +1 -1
  565. package/tokens/modes/system-dark__hoa-plasma__comfortable__high.dtcg.json +1 -1
  566. package/tokens/modes/system-dark__hoa-plasma__comfortable__standard.dtcg.json +1 -1
  567. package/tokens/modes/system-dark__hoa-plasma__compact__high.dtcg.json +1 -1
  568. package/tokens/modes/system-dark__hoa-plasma__compact__standard.dtcg.json +1 -1
  569. package/tokens/modes/system-dark__hoa__comfortable__high.dtcg.json +1 -1
  570. package/tokens/modes/system-dark__hoa__comfortable__standard.dtcg.json +1 -1
  571. package/tokens/modes/system-dark__hoa__compact__high.dtcg.json +1 -1
  572. package/tokens/modes/system-dark__hoa__compact__standard.dtcg.json +1 -1
  573. package/tokens/modes/system-dark__kim-steel__comfortable__high.dtcg.json +1 -1
  574. package/tokens/modes/system-dark__kim-steel__comfortable__standard.dtcg.json +1 -1
  575. package/tokens/modes/system-dark__kim-steel__compact__high.dtcg.json +1 -1
  576. package/tokens/modes/system-dark__kim-steel__compact__standard.dtcg.json +1 -1
  577. package/tokens/modes/system-dark__kim-titanium__comfortable__high.dtcg.json +1 -1
  578. package/tokens/modes/system-dark__kim-titanium__comfortable__standard.dtcg.json +1 -1
  579. package/tokens/modes/system-dark__kim-titanium__compact__high.dtcg.json +1 -1
  580. package/tokens/modes/system-dark__kim-titanium__compact__standard.dtcg.json +1 -1
  581. package/tokens/modes/system-dark__kim__comfortable__high.dtcg.json +1 -1
  582. package/tokens/modes/system-dark__kim__comfortable__standard.dtcg.json +1 -1
  583. package/tokens/modes/system-dark__kim__compact__high.dtcg.json +1 -1
  584. package/tokens/modes/system-dark__kim__compact__standard.dtcg.json +1 -1
  585. package/tokens/modes/system-dark__moc-bamboo__comfortable__high.dtcg.json +1 -1
  586. package/tokens/modes/system-dark__moc-bamboo__comfortable__standard.dtcg.json +1 -1
  587. package/tokens/modes/system-dark__moc-bamboo__compact__high.dtcg.json +1 -1
  588. package/tokens/modes/system-dark__moc-bamboo__compact__standard.dtcg.json +1 -1
  589. package/tokens/modes/system-dark__moc-forest__comfortable__high.dtcg.json +1 -1
  590. package/tokens/modes/system-dark__moc-forest__comfortable__standard.dtcg.json +1 -1
  591. package/tokens/modes/system-dark__moc-forest__compact__high.dtcg.json +1 -1
  592. package/tokens/modes/system-dark__moc-forest__compact__standard.dtcg.json +1 -1
  593. package/tokens/modes/system-dark__moc__comfortable__high.dtcg.json +1 -1
  594. package/tokens/modes/system-dark__moc__comfortable__standard.dtcg.json +1 -1
  595. package/tokens/modes/system-dark__moc__compact__high.dtcg.json +1 -1
  596. package/tokens/modes/system-dark__moc__compact__standard.dtcg.json +1 -1
  597. package/tokens/modes/system-dark__tho-clay__comfortable__high.dtcg.json +1 -1
  598. package/tokens/modes/system-dark__tho-clay__comfortable__standard.dtcg.json +1 -1
  599. package/tokens/modes/system-dark__tho-clay__compact__high.dtcg.json +1 -1
  600. package/tokens/modes/system-dark__tho-clay__compact__standard.dtcg.json +1 -1
  601. package/tokens/modes/system-dark__tho-sand__comfortable__high.dtcg.json +1 -1
  602. package/tokens/modes/system-dark__tho-sand__comfortable__standard.dtcg.json +1 -1
  603. package/tokens/modes/system-dark__tho-sand__compact__high.dtcg.json +1 -1
  604. package/tokens/modes/system-dark__tho-sand__compact__standard.dtcg.json +1 -1
  605. package/tokens/modes/system-dark__tho__comfortable__high.dtcg.json +1 -1
  606. package/tokens/modes/system-dark__tho__comfortable__standard.dtcg.json +1 -1
  607. package/tokens/modes/system-dark__tho__compact__high.dtcg.json +1 -1
  608. package/tokens/modes/system-dark__tho__compact__standard.dtcg.json +1 -1
  609. package/tokens/modes/system-dark__thuy-mist__comfortable__high.dtcg.json +1 -1
  610. package/tokens/modes/system-dark__thuy-mist__comfortable__standard.dtcg.json +1 -1
  611. package/tokens/modes/system-dark__thuy-mist__compact__high.dtcg.json +1 -1
  612. package/tokens/modes/system-dark__thuy-mist__compact__standard.dtcg.json +1 -1
  613. package/tokens/modes/system-dark__thuy-ocean__comfortable__high.dtcg.json +1 -1
  614. package/tokens/modes/system-dark__thuy-ocean__comfortable__standard.dtcg.json +1 -1
  615. package/tokens/modes/system-dark__thuy-ocean__compact__high.dtcg.json +1 -1
  616. package/tokens/modes/system-dark__thuy-ocean__compact__standard.dtcg.json +1 -1
  617. package/tokens/modes/system-dark__thuy__comfortable__high.dtcg.json +1 -1
  618. package/tokens/modes/system-dark__thuy__comfortable__standard.dtcg.json +1 -1
  619. package/tokens/modes/system-dark__thuy__compact__high.dtcg.json +1 -1
  620. package/tokens/modes/system-dark__thuy__compact__standard.dtcg.json +1 -1
  621. package/tokens/modes/system-light__default__comfortable__high.dtcg.json +1 -1
  622. package/tokens/modes/system-light__default__comfortable__standard.dtcg.json +1 -1
  623. package/tokens/modes/system-light__default__compact__high.dtcg.json +1 -1
  624. package/tokens/modes/system-light__default__compact__standard.dtcg.json +1 -1
  625. package/tokens/modes/system-light__hoa-lava__comfortable__high.dtcg.json +1 -1
  626. package/tokens/modes/system-light__hoa-lava__comfortable__standard.dtcg.json +1 -1
  627. package/tokens/modes/system-light__hoa-lava__compact__high.dtcg.json +1 -1
  628. package/tokens/modes/system-light__hoa-lava__compact__standard.dtcg.json +1 -1
  629. package/tokens/modes/system-light__hoa-plasma__comfortable__high.dtcg.json +1 -1
  630. package/tokens/modes/system-light__hoa-plasma__comfortable__standard.dtcg.json +1 -1
  631. package/tokens/modes/system-light__hoa-plasma__compact__high.dtcg.json +1 -1
  632. package/tokens/modes/system-light__hoa-plasma__compact__standard.dtcg.json +1 -1
  633. package/tokens/modes/system-light__hoa__comfortable__high.dtcg.json +1 -1
  634. package/tokens/modes/system-light__hoa__comfortable__standard.dtcg.json +1 -1
  635. package/tokens/modes/system-light__hoa__compact__high.dtcg.json +1 -1
  636. package/tokens/modes/system-light__hoa__compact__standard.dtcg.json +1 -1
  637. package/tokens/modes/system-light__kim-steel__comfortable__high.dtcg.json +1 -1
  638. package/tokens/modes/system-light__kim-steel__comfortable__standard.dtcg.json +1 -1
  639. package/tokens/modes/system-light__kim-steel__compact__high.dtcg.json +1 -1
  640. package/tokens/modes/system-light__kim-steel__compact__standard.dtcg.json +1 -1
  641. package/tokens/modes/system-light__kim-titanium__comfortable__high.dtcg.json +1 -1
  642. package/tokens/modes/system-light__kim-titanium__comfortable__standard.dtcg.json +1 -1
  643. package/tokens/modes/system-light__kim-titanium__compact__high.dtcg.json +1 -1
  644. package/tokens/modes/system-light__kim-titanium__compact__standard.dtcg.json +1 -1
  645. package/tokens/modes/system-light__kim__comfortable__high.dtcg.json +1 -1
  646. package/tokens/modes/system-light__kim__comfortable__standard.dtcg.json +1 -1
  647. package/tokens/modes/system-light__kim__compact__high.dtcg.json +1 -1
  648. package/tokens/modes/system-light__kim__compact__standard.dtcg.json +1 -1
  649. package/tokens/modes/system-light__moc-bamboo__comfortable__high.dtcg.json +1 -1
  650. package/tokens/modes/system-light__moc-bamboo__comfortable__standard.dtcg.json +1 -1
  651. package/tokens/modes/system-light__moc-bamboo__compact__high.dtcg.json +1 -1
  652. package/tokens/modes/system-light__moc-bamboo__compact__standard.dtcg.json +1 -1
  653. package/tokens/modes/system-light__moc-forest__comfortable__high.dtcg.json +1 -1
  654. package/tokens/modes/system-light__moc-forest__comfortable__standard.dtcg.json +1 -1
  655. package/tokens/modes/system-light__moc-forest__compact__high.dtcg.json +1 -1
  656. package/tokens/modes/system-light__moc-forest__compact__standard.dtcg.json +1 -1
  657. package/tokens/modes/system-light__moc__comfortable__high.dtcg.json +1 -1
  658. package/tokens/modes/system-light__moc__comfortable__standard.dtcg.json +1 -1
  659. package/tokens/modes/system-light__moc__compact__high.dtcg.json +1 -1
  660. package/tokens/modes/system-light__moc__compact__standard.dtcg.json +1 -1
  661. package/tokens/modes/system-light__tho-clay__comfortable__high.dtcg.json +1 -1
  662. package/tokens/modes/system-light__tho-clay__comfortable__standard.dtcg.json +1 -1
  663. package/tokens/modes/system-light__tho-clay__compact__high.dtcg.json +1 -1
  664. package/tokens/modes/system-light__tho-clay__compact__standard.dtcg.json +1 -1
  665. package/tokens/modes/system-light__tho-sand__comfortable__high.dtcg.json +1 -1
  666. package/tokens/modes/system-light__tho-sand__comfortable__standard.dtcg.json +1 -1
  667. package/tokens/modes/system-light__tho-sand__compact__high.dtcg.json +1 -1
  668. package/tokens/modes/system-light__tho-sand__compact__standard.dtcg.json +1 -1
  669. package/tokens/modes/system-light__tho__comfortable__high.dtcg.json +1 -1
  670. package/tokens/modes/system-light__tho__comfortable__standard.dtcg.json +1 -1
  671. package/tokens/modes/system-light__tho__compact__high.dtcg.json +1 -1
  672. package/tokens/modes/system-light__tho__compact__standard.dtcg.json +1 -1
  673. package/tokens/modes/system-light__thuy-mist__comfortable__high.dtcg.json +1 -1
  674. package/tokens/modes/system-light__thuy-mist__comfortable__standard.dtcg.json +1 -1
  675. package/tokens/modes/system-light__thuy-mist__compact__high.dtcg.json +1 -1
  676. package/tokens/modes/system-light__thuy-mist__compact__standard.dtcg.json +1 -1
  677. package/tokens/modes/system-light__thuy-ocean__comfortable__high.dtcg.json +1 -1
  678. package/tokens/modes/system-light__thuy-ocean__comfortable__standard.dtcg.json +1 -1
  679. package/tokens/modes/system-light__thuy-ocean__compact__high.dtcg.json +1 -1
  680. package/tokens/modes/system-light__thuy-ocean__compact__standard.dtcg.json +1 -1
  681. package/tokens/modes/system-light__thuy__comfortable__high.dtcg.json +1 -1
  682. package/tokens/modes/system-light__thuy__comfortable__standard.dtcg.json +1 -1
  683. package/tokens/modes/system-light__thuy__compact__high.dtcg.json +1 -1
  684. package/tokens/modes/system-light__thuy__compact__standard.dtcg.json +1 -1
  685. package/tokens/native/CSModes.kt +233 -233
  686. package/tokens/native/CSModes.swift +233 -233
  687. package/tokens/native/CSTokens.kt +11 -11
  688. package/tokens/native/CSTokens.swift +11 -11
  689. package/tokens/native/cs_modes.dart +233 -233
  690. package/tokens/native/cs_tokens.dart +11 -11
  691. package/tokens/native/mode-provenance.json +11 -11
  692. package/tokens/provenance.json +6 -6
  693. package/tokens/theme-attributes.css +40 -40
  694. package/tokens/tokens.dtcg.json +187 -130
  695. package/tokens/tokens.js +87 -87
  696. package/tokens/tokens.json +86 -86
  697. package/tokens/typography.css +6 -6
  698. package/tokens/variables.css +131 -131
  699. package/tokens/viewer.html +15 -11
  700. package/ui_kits/deck/index.html +4 -2
  701. package/ui_kits/status-hub/StatusHub.jsx +7 -7
  702. package/ui_kits/status-hub/data.js +3 -3
  703. package/ui_kits/status-hub/index.html +1 -0
  704. package/ui_kits/status-hub/login.html +8 -6
  705. package/ui_kits/status-hub/project.html +7 -6
  706. package/ui_kits/status-hub/settings.html +9 -8
  707. package/ui_kits/status-hub/status.css +10 -8
  708. package/ui_kits/website/Website.jsx +3 -3
  709. package/ui_kits/website/careers.html +24 -7
  710. package/ui_kits/website/chat.html +5 -2
  711. package/ui_kits/website/index.html +1 -0
  712. package/ui_kits/website/site.css +30 -6
  713. package/ui_kits/website/work.html +12 -7
  714. package/components/_utils/use-viewport-panel.js +0 -30
  715. package/dist/esm/chunks/chunk-CH4W6RCG.mjs.map +0 -7
  716. package/dist/esm/chunks/chunk-F3M5TQ76.mjs.map +0 -7
  717. package/dist/esm/chunks/chunk-GWBINWTF.mjs.map +0 -7
  718. package/dist/esm/chunks/chunk-IH4I7JSB.mjs.map +0 -7
  719. package/dist/esm/chunks/chunk-JN57OITY.mjs.map +0 -7
  720. package/dist/esm/chunks/chunk-UFE32JPH.mjs.map +0 -7
  721. /package/dist/esm/chunks/{chunk-FEUTSZBN.mjs.map → chunk-2CCVFTPL.mjs.map} +0 -0
  722. /package/dist/esm/chunks/{chunk-W5VR7GTL.mjs.map → chunk-2VVGZEOQ.mjs.map} +0 -0
  723. /package/dist/esm/chunks/{chunk-3RC4CDAE.mjs.map → chunk-3R5WJQCB.mjs.map} +0 -0
  724. /package/dist/esm/chunks/{chunk-W6N22NMF.mjs.map → chunk-4FGB6VHN.mjs.map} +0 -0
  725. /package/dist/esm/chunks/{chunk-YZR3C7V2.mjs.map → chunk-4TO35YGK.mjs.map} +0 -0
  726. /package/dist/esm/chunks/{chunk-JSAPFO73.mjs.map → chunk-4YWKKULF.mjs.map} +0 -0
  727. /package/dist/esm/chunks/{chunk-W2RF4NWB.mjs.map → chunk-5FQGNCKS.mjs.map} +0 -0
  728. /package/dist/esm/chunks/{chunk-SYCXNMYP.mjs.map → chunk-6ECKJ6RS.mjs.map} +0 -0
  729. /package/dist/esm/chunks/{chunk-72AUOI37.mjs.map → chunk-6TZDNLHE.mjs.map} +0 -0
  730. /package/dist/esm/chunks/{chunk-QGCPHFSI.mjs.map → chunk-72STPBL4.mjs.map} +0 -0
  731. /package/dist/esm/chunks/{chunk-37AN57S5.mjs.map → chunk-7GSR2NGL.mjs.map} +0 -0
  732. /package/dist/esm/chunks/{chunk-A3PGQW3X.mjs.map → chunk-AA5BSO3T.mjs.map} +0 -0
  733. /package/dist/esm/chunks/{chunk-NH6M42ZI.mjs.map → chunk-ASGO2FW5.mjs.map} +0 -0
  734. /package/dist/esm/chunks/{chunk-GP5ITSCH.mjs.map → chunk-C3NAMBA7.mjs.map} +0 -0
  735. /package/dist/esm/chunks/{chunk-YA7Y7PEC.mjs.map → chunk-CKBL3UEA.mjs.map} +0 -0
  736. /package/dist/esm/chunks/{chunk-H7EJ7TNP.mjs.map → chunk-CYZ22MB7.mjs.map} +0 -0
  737. /package/dist/esm/chunks/{chunk-JRIWHAWW.mjs.map → chunk-D7A4ZCMJ.mjs.map} +0 -0
  738. /package/dist/esm/chunks/{chunk-A7RWM4XH.mjs.map → chunk-DANUZS4S.mjs.map} +0 -0
  739. /package/dist/esm/chunks/{chunk-FAVSLU7E.mjs.map → chunk-DFBKBVSE.mjs.map} +0 -0
  740. /package/dist/esm/chunks/{chunk-TNHQB6CI.mjs.map → chunk-DW4AWLA5.mjs.map} +0 -0
  741. /package/dist/esm/chunks/{chunk-5R5KMLUR.mjs.map → chunk-DWJIX65T.mjs.map} +0 -0
  742. /package/dist/esm/chunks/{chunk-YJNSQ5PJ.mjs.map → chunk-EITZT2U5.mjs.map} +0 -0
  743. /package/dist/esm/chunks/{chunk-CSJHR2W2.mjs.map → chunk-EOCMQT4L.mjs.map} +0 -0
  744. /package/dist/esm/chunks/{chunk-4QBKN42N.mjs.map → chunk-EXOOST5G.mjs.map} +0 -0
  745. /package/dist/esm/chunks/{chunk-7HTAAMIY.mjs.map → chunk-FF5D53IP.mjs.map} +0 -0
  746. /package/dist/esm/chunks/{chunk-JNK7QN24.mjs.map → chunk-FOEJO2YQ.mjs.map} +0 -0
  747. /package/dist/esm/chunks/{chunk-HYQG5XND.mjs.map → chunk-GLPQBE2J.mjs.map} +0 -0
  748. /package/dist/esm/chunks/{chunk-HUW6OY7C.mjs.map → chunk-GNEVR5Q4.mjs.map} +0 -0
  749. /package/dist/esm/chunks/{chunk-SEYKDGXE.mjs.map → chunk-H4TKHAB3.mjs.map} +0 -0
  750. /package/dist/esm/chunks/{chunk-OR5UTKW7.mjs.map → chunk-I3H7EAH5.mjs.map} +0 -0
  751. /package/dist/esm/chunks/{chunk-P64YS5W2.mjs.map → chunk-I3PQVFX5.mjs.map} +0 -0
  752. /package/dist/esm/chunks/{chunk-5MR3C2QG.mjs.map → chunk-IOEWPBAL.mjs.map} +0 -0
  753. /package/dist/esm/chunks/{chunk-TN2MZXGS.mjs.map → chunk-JIHWIDMP.mjs.map} +0 -0
  754. /package/dist/esm/chunks/{chunk-YX62AV33.mjs.map → chunk-KAOUK33L.mjs.map} +0 -0
  755. /package/dist/esm/chunks/{chunk-UVJ5BBQG.mjs.map → chunk-KWPNHP73.mjs.map} +0 -0
  756. /package/dist/esm/chunks/{chunk-BABSYWVB.mjs.map → chunk-LCC4ZVVO.mjs.map} +0 -0
  757. /package/dist/esm/chunks/{chunk-HVF4NT6P.mjs.map → chunk-MRXEJSQQ.mjs.map} +0 -0
  758. /package/dist/esm/chunks/{chunk-DIIXA7WD.mjs.map → chunk-NZKMM4FK.mjs.map} +0 -0
  759. /package/dist/esm/chunks/{chunk-CLWTVJM3.mjs.map → chunk-OEWAQZYE.mjs.map} +0 -0
  760. /package/dist/esm/chunks/{chunk-OOZKMXYB.mjs.map → chunk-PBP2MKZH.mjs.map} +0 -0
  761. /package/dist/esm/chunks/{chunk-JKKJHQVQ.mjs.map → chunk-PE6KC2U7.mjs.map} +0 -0
  762. /package/dist/esm/chunks/{chunk-N5TM7UIY.mjs.map → chunk-PFTKXY5Q.mjs.map} +0 -0
  763. /package/dist/esm/chunks/{chunk-R7QVE2JP.mjs.map → chunk-PLN3ITUB.mjs.map} +0 -0
  764. /package/dist/esm/chunks/{chunk-NEMFYL4X.mjs.map → chunk-QBPDNM7S.mjs.map} +0 -0
  765. /package/dist/esm/chunks/{chunk-JDI3UMJW.mjs.map → chunk-SIMVM4RV.mjs.map} +0 -0
  766. /package/dist/esm/chunks/{chunk-WJF2Q2Y3.mjs.map → chunk-TMXLSCAG.mjs.map} +0 -0
  767. /package/dist/esm/chunks/{chunk-TGYG7JP4.mjs.map → chunk-TNQXCIBM.mjs.map} +0 -0
  768. /package/dist/esm/chunks/{chunk-DHTD5KM5.mjs.map → chunk-TWCJMLGG.mjs.map} +0 -0
  769. /package/dist/esm/chunks/{chunk-EPFDMHPK.mjs.map → chunk-U7RKPGRO.mjs.map} +0 -0
  770. /package/dist/esm/chunks/{chunk-NMIGE2IM.mjs.map → chunk-UWNMGKAN.mjs.map} +0 -0
  771. /package/dist/esm/chunks/{chunk-KXFGO7N4.mjs.map → chunk-VAPKJRQI.mjs.map} +0 -0
  772. /package/dist/esm/chunks/{chunk-XTBN55D3.mjs.map → chunk-VUCJT2QJ.mjs.map} +0 -0
  773. /package/dist/esm/chunks/{chunk-TVTBVHT2.mjs.map → chunk-WLANQTOU.mjs.map} +0 -0
  774. /package/dist/esm/chunks/{chunk-3MCNCG2L.mjs.map → chunk-XZ5NWMO7.mjs.map} +0 -0
  775. /package/dist/esm/chunks/{chunk-QPXQZBQC.mjs.map → chunk-YKU2KVAQ.mjs.map} +0 -0
  776. /package/dist/esm/chunks/{chunk-ZKFOGW4D.mjs.map → chunk-YLSFKG64.mjs.map} +0 -0
  777. /package/dist/esm/chunks/{chunk-TO2T6EEB.mjs.map → chunk-YVSAUCWW.mjs.map} +0 -0
  778. /package/dist/esm/chunks/{chunk-XN74VX5H.mjs.map → chunk-ZKBAIIAQ.mjs.map} +0 -0
  779. /package/dist/esm/chunks/{chunk-7IJTTRPK.mjs.map → chunk-ZPLENPV2.mjs.map} +0 -0
@@ -3,6 +3,10 @@ import {
3
3
  overlaySurfaceClass,
4
4
  useOverlaySurface
5
5
  } from "./chunk-ETO3IZEA.mjs";
6
+ import {
7
+ hasDismiss,
8
+ notifyClosed
9
+ } from "./chunk-65SIJBJX.mjs";
6
10
  import {
7
11
  Icon
8
12
  } from "./chunk-JPZKGP54.mjs";
@@ -13,7 +17,7 @@ import {
13
17
  import {
14
18
  makeT,
15
19
  useLang
16
- } from "./chunk-25AOTZAM.mjs";
20
+ } from "./chunk-JZYRXWPD.mjs";
17
21
  import {
18
22
  cx
19
23
  } from "./chunk-5LXHLKXS.mjs";
@@ -29,6 +33,7 @@ var Dialog = React.forwardRef(function Dialog2({
29
33
  children,
30
34
  actions,
31
35
  onClose,
36
+ onOpenChange,
32
37
  className,
33
38
  closeLabel,
34
39
  lang,
@@ -43,8 +48,8 @@ var Dialog = React.forwardRef(function Dialog2({
43
48
  const backdrop = React.useRef(null);
44
49
  const material = overlaySurfaceClass(className);
45
50
  const surface = useOverlaySurface(!!open, panel, material);
46
- const closeRef = React.useRef(onClose);
47
- closeRef.current = onClose;
51
+ const closeRef = React.useRef(null);
52
+ closeRef.current = () => notifyClosed(onOpenChange, onClose);
48
53
  const { scope } = useOverlayLayer({
49
54
  open: !!open,
50
55
  kind: "modal",
@@ -55,7 +60,7 @@ var Dialog = React.forwardRef(function Dialog2({
55
60
  });
56
61
  const cl = closeLabel != null ? closeLabel : makeT("Dialog", L, localeMessages)("close");
57
62
  if (!open) return null;
58
- return /* @__PURE__ */ React.createElement(overlayScopeContext.Provider, { value: scope }, /* @__PURE__ */ React.createElement("div", { ref, className: "cs-dialog-layer" }, /* @__PURE__ */ React.createElement("div", { ref: backdrop, className: "cs-dialog__overlay", onClick: onClose, "aria-hidden": "true" }), material ? /* @__PURE__ */ React.createElement("div", { ref: surface, className: cx("cs-overlay-surface", material), "aria-hidden": "true" }) : null, /* @__PURE__ */ React.createElement(
63
+ return /* @__PURE__ */ React.createElement(overlayScopeContext.Provider, { value: scope }, /* @__PURE__ */ React.createElement("div", { ref, className: "cs-dialog-layer" }, /* @__PURE__ */ React.createElement("div", { ref: backdrop, className: "cs-dialog__overlay", onClick: () => closeRef.current(), "aria-hidden": "true" }), material ? /* @__PURE__ */ React.createElement("div", { ref: surface, className: cx("cs-overlay-surface", material), "aria-hidden": "true" }) : null, /* @__PURE__ */ React.createElement(
59
64
  "section",
60
65
  {
61
66
  ...props,
@@ -68,7 +73,7 @@ var Dialog = React.forwardRef(function Dialog2({
68
73
  "aria-describedby": Object.prototype.hasOwnProperty.call(props, "aria-describedby") ? props["aria-describedby"] || void 0 : bodyId,
69
74
  className: cx("cs-dialog", className)
70
75
  },
71
- /* @__PURE__ */ React.createElement("header", { className: "cs-dialog__header" }, /* @__PURE__ */ React.createElement("h2", { id: titleId, className: "cs-dialog__title" }, title), onClose ? /* @__PURE__ */ React.createElement("button", { type: "button", className: "cs-button cs-button--ghost cs-button--sm", onClick: onClose, "aria-label": cl }, /* @__PURE__ */ React.createElement(Icon, { name: "close", size: "sm" })) : null),
76
+ /* @__PURE__ */ React.createElement("header", { className: "cs-dialog__header" }, /* @__PURE__ */ React.createElement("h2", { id: titleId, className: "cs-dialog__title" }, title), hasDismiss(onOpenChange, onClose) ? /* @__PURE__ */ React.createElement("button", { type: "button", className: "cs-button cs-button--ghost cs-button--sm", onClick: () => closeRef.current(), "aria-label": cl }, /* @__PURE__ */ React.createElement(Icon, { name: "close", size: "sm" })) : null),
72
77
  /* @__PURE__ */ React.createElement("div", { id: bodyId, className: "cs-dialog__body" }, children),
73
78
  actions || actions === 0 ? /* @__PURE__ */ React.createElement("footer", { className: "cs-dialog__actions" }, actions) : null
74
79
  )));
@@ -78,4 +83,4 @@ Dialog.displayName = "Dialog";
78
83
  export {
79
84
  Dialog
80
85
  };
81
- //# sourceMappingURL=chunk-F3M5TQ76.mjs.map
86
+ //# sourceMappingURL=chunk-GB6VWFOE.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../components/dialog/Dialog.jsx"],
4
+ "sourcesContent": ["import { useComposedRefs } from \"../_utils/refs.js\";\nimport React from \"react\";\nimport { makeT, useLang } from \"../_i18n/i18n.js\";\nimport { Icon } from \"../icon/Icon.jsx\";\nimport { cx } from \"../_utils/cx.js\";\nimport { overlaySurfaceClass, useOverlaySurface } from \"../_utils/use-overlay-surface.js\";\nimport { useOverlayLayer, overlayScopeContext } from \"../overlays/OverlayManager.jsx\";\nimport { hasDismiss, notifyClosed } from \"../_utils/open-change.js\";\n\n/**\n * CyberSkill Dialog — modal overlay + panel. aria-modal, labelled by title and\n * described by its body, scrim click closes. Body scroll is locked while open\n * via the overlay manager (nested-safe). Compose actions in the footer with Buttons.\n */\nexport const Dialog = React.forwardRef(function Dialog({\n open,\n title,\n children,\n actions,\n onClose,\n onOpenChange,\n className,\n closeLabel,\n lang,\n ...props\n}, forwardedRef) {\n const baseId = React.useId();\n const titleId = baseId + \"-title\";\n const bodyId = children == null ? undefined : baseId + \"-body\";\n const [ref, L, localeMessages] = useLang(lang);\n const panel = React.useRef(null);\n const mergedNativeRef = useComposedRefs(panel, forwardedRef);\n const backdrop = React.useRef(null);\n const material = overlaySurfaceClass(className);\n const surface = useOverlaySurface(!!open, panel, material);\n const closeRef = React.useRef(null);\n closeRef.current = () => notifyClosed(onOpenChange, onClose);\n\n const { scope } = useOverlayLayer({\n open: !!open,\n kind: \"modal\",\n trapFocus: true,\n onEscape: () => closeRef.current && closeRef.current(),\n panelRef: panel,\n backdropRef: backdrop,\n });\n\n const cl = closeLabel != null ? closeLabel : makeT(\"Dialog\", L, localeMessages)(\"close\");\n if (!open) return null;\n return (\n <overlayScopeContext.Provider value={scope}>\n <div ref={ref} className=\"cs-dialog-layer\">\n <div ref={backdrop} className=\"cs-dialog__overlay\" onClick={() => closeRef.current()} aria-hidden=\"true\" />\n {material ? <div ref={surface} className={cx(\"cs-overlay-surface\", material)} aria-hidden=\"true\" /> : null}\n <section\n {...props}\n ref={mergedNativeRef}\n data-cs-overlay-material={material || undefined}\n tabIndex={-1}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={Object.prototype.hasOwnProperty.call(props, \"aria-describedby\") ? (props[\"aria-describedby\"] || undefined) : bodyId}\n className={cx(\"cs-dialog\", className)}\n >\n <header className=\"cs-dialog__header\">\n <h2 id={titleId} className=\"cs-dialog__title\">{title}</h2>\n {hasDismiss(onOpenChange, onClose) ? (\n <button type=\"button\" className=\"cs-button cs-button--ghost cs-button--sm\" onClick={() => closeRef.current()} aria-label={cl}>\n <Icon name=\"close\" size=\"sm\" />\n </button>\n ) : null}\n </header>\n <div id={bodyId} className=\"cs-dialog__body\">{children}</div>\n {(actions || actions === 0) ? <footer className=\"cs-dialog__actions\">{actions}</footer> : null}\n </section>\n </div>\n </overlayScopeContext.Provider>\n );\n});\nDialog.displayName = \"Dialog\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,WAAW;AAaX,IAAM,SAAS,MAAM,WAAW,SAASA,QAAO;AAAA,EACrD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAG,cAAc;AACf,QAAM,SAAS,MAAM,MAAM;AAC3B,QAAM,UAAU,SAAS;AACzB,QAAM,SAAS,YAAY,OAAO,SAAY,SAAS;AACvD,QAAM,CAAC,KAAK,GAAG,cAAc,IAAI,QAAQ,IAAI;AAC7C,QAAM,QAAQ,MAAM,OAAO,IAAI;AAC/B,QAAM,kBAAkB,gBAAgB,OAAO,YAAY;AAC3D,QAAM,WAAW,MAAM,OAAO,IAAI;AAClC,QAAM,WAAW,oBAAoB,SAAS;AAC9C,QAAM,UAAU,kBAAkB,CAAC,CAAC,MAAM,OAAO,QAAQ;AACzD,QAAM,WAAW,MAAM,OAAO,IAAI;AAClC,WAAS,UAAU,MAAM,aAAa,cAAc,OAAO;AAE3D,QAAM,EAAE,MAAM,IAAI,gBAAgB;AAAA,IAChC,MAAM,CAAC,CAAC;AAAA,IACR,MAAM;AAAA,IACN,WAAW;AAAA,IACX,UAAU,MAAM,SAAS,WAAW,SAAS,QAAQ;AAAA,IACrD,UAAU;AAAA,IACV,aAAa;AAAA,EACf,CAAC;AAED,QAAM,KAAK,cAAc,OAAO,aAAa,MAAM,UAAU,GAAG,cAAc,EAAE,OAAO;AACvF,MAAI,CAAC,KAAM,QAAO;AAClB,SACE,oCAAC,oBAAoB,UAApB,EAA6B,OAAO,SACrC,oCAAC,SAAI,KAAU,WAAU,qBACvB,oCAAC,SAAI,KAAK,UAAU,WAAU,sBAAqB,SAAS,MAAM,SAAS,QAAQ,GAAG,eAAY,QAAO,GACxG,WAAW,oCAAC,SAAI,KAAK,SAAS,WAAW,GAAG,sBAAsB,QAAQ,GAAG,eAAY,QAAO,IAAK,MACtG;AAAA,IAAC;AAAA;AAAA,MACE,GAAG;AAAA,MACJ,KAAK;AAAA,MACL,4BAA0B,YAAY;AAAA,MACtC,UAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAW;AAAA,MACX,mBAAiB;AAAA,MACjB,oBAAkB,OAAO,UAAU,eAAe,KAAK,OAAO,kBAAkB,IAAK,MAAM,kBAAkB,KAAK,SAAa;AAAA,MAC/H,WAAW,GAAG,aAAa,SAAS;AAAA;AAAA,IAEpC,oCAAC,YAAO,WAAU,uBAChB,oCAAC,QAAG,IAAI,SAAS,WAAU,sBAAoB,KAAM,GACpD,WAAW,cAAc,OAAO,IAC/B,oCAAC,YAAO,MAAK,UAAS,WAAU,4CAA2C,SAAS,MAAM,SAAS,QAAQ,GAAG,cAAY,MACxH,oCAAC,QAAK,MAAK,SAAQ,MAAK,MAAK,CAC/B,IACE,IACN;AAAA,IACA,oCAAC,SAAI,IAAI,QAAQ,WAAU,qBAAmB,QAAS;AAAA,IACrD,WAAW,YAAY,IAAK,oCAAC,YAAO,WAAU,wBAAsB,OAAQ,IAAY;AAAA,EAC5F,CACF,CACA;AAEJ,CAAC;AACD,OAAO,cAAc;",
6
+ "names": ["Dialog"]
7
+ }
@@ -1,8 +1,12 @@
1
1
  "use client";
2
+ import {
3
+ hasDismiss,
4
+ notifyDismiss
5
+ } from "./chunk-65SIJBJX.mjs";
2
6
  import {
3
7
  makeT,
4
8
  useLang
5
- } from "./chunk-25AOTZAM.mjs";
9
+ } from "./chunk-JZYRXWPD.mjs";
6
10
  import {
7
11
  cx
8
12
  } from "./chunk-5LXHLKXS.mjs";
@@ -21,15 +25,15 @@ var PATHS = {
21
25
  function DefaultIcon({ variant }) {
22
26
  return /* @__PURE__ */ React.createElement("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "1.9", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("path", { d: PATHS[variant] || PATHS.info }));
23
27
  }
24
- var Alert = React.forwardRef(function Alert2({ variant = "info", title, icon, children, onDismiss, lang, className, ...props }, forwardedRef) {
28
+ var Alert = React.forwardRef(function Alert2({ variant = "info", title, icon, children, onDismiss, onClose, onOpenChange, lang, className, ...props }, forwardedRef) {
25
29
  const [ref, L, localeMessages] = useLang(lang);
26
30
  const mergedNativeRef = useComposedRefs(ref, forwardedRef);
27
31
  const t = makeT("Alert", L, localeMessages);
28
- return /* @__PURE__ */ React.createElement("div", { ref: mergedNativeRef, role: "status", className: cx("cs-alert", `cs-alert--${variant}`, className), ...props }, /* @__PURE__ */ React.createElement("span", { className: "cs-alert__icon" }, icon ?? /* @__PURE__ */ React.createElement(DefaultIcon, { variant })), /* @__PURE__ */ React.createElement("div", null, title || title === 0 ? /* @__PURE__ */ React.createElement("p", { className: "cs-alert__title" }, title) : null, children || children === 0 ? /* @__PURE__ */ React.createElement("div", { className: "cs-alert__body" }, children) : null), onDismiss ? /* @__PURE__ */ React.createElement("button", { type: "button", className: "cs-alert__dismiss", "aria-label": t("dismiss"), onClick: onDismiss }, "×") : null);
32
+ return /* @__PURE__ */ React.createElement("div", { ref: mergedNativeRef, role: "status", className: cx("cs-alert", `cs-alert--${variant}`, className), ...props }, /* @__PURE__ */ React.createElement("span", { className: "cs-alert__icon" }, icon ?? /* @__PURE__ */ React.createElement(DefaultIcon, { variant })), /* @__PURE__ */ React.createElement("div", null, title || title === 0 ? /* @__PURE__ */ React.createElement("p", { className: "cs-alert__title" }, title) : null, children || children === 0 ? /* @__PURE__ */ React.createElement("div", { className: "cs-alert__body" }, children) : null), hasDismiss(onOpenChange, onClose, onDismiss) ? /* @__PURE__ */ React.createElement("button", { type: "button", className: "cs-alert__dismiss", "aria-label": t("dismiss"), onClick: (event) => notifyDismiss(event, onOpenChange, onClose, onDismiss) }, "×") : null);
29
33
  });
30
34
  Alert.displayName = "Alert";
31
35
 
32
36
  export {
33
37
  Alert
34
38
  };
35
- //# sourceMappingURL=chunk-UFE32JPH.mjs.map
39
+ //# sourceMappingURL=chunk-GHWOEHEX.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../components/feedback/Alert.jsx"],
4
+ "sourcesContent": ["import { useComposedRefs } from \"../_utils/refs.js\";\nimport React from \"react\";\nimport { makeT, useLang } from \"../_i18n/i18n.js\";\nimport { cx } from \"../_utils/cx.js\";\nimport { hasDismiss, notifyDismiss } from \"../_utils/open-change.js\";\n\nconst PATHS = {\n info: \"M12 8h.01M11 12h1v4h1 M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\",\n success: \"M4 12.5l5 5 11-11\",\n warning: \"M12 3l9 16H3z M12 10v4 M12 17h.01\",\n danger: \"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z M9 9l6 6 M15 9l-6 6\",\n};\nfunction DefaultIcon({ variant }) {\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.9\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d={PATHS[variant] || PATHS.info} />\n </svg>\n );\n}\n\n/** CyberSkill Alert — inline banner. variant: info | success | warning | danger. */\nexport const Alert = React.forwardRef(function Alert({ variant = \"info\", title, icon, children, onDismiss, onClose, onOpenChange, lang, className, ...props }, forwardedRef) {\n const [ref, L, localeMessages] = useLang(lang);\n const mergedNativeRef = useComposedRefs(ref, forwardedRef);\n const t = makeT(\"Alert\", L, localeMessages);\n return (\n <div ref={mergedNativeRef} role=\"status\" className={cx(\"cs-alert\", `cs-alert--${variant}`, className)} {...props}>\n <span className=\"cs-alert__icon\">{icon ?? <DefaultIcon variant={variant} />}</span>\n <div>\n {(title || title === 0) ? <p className=\"cs-alert__title\">{title}</p> : null}\n {(children || children === 0) ? <div className=\"cs-alert__body\">{children}</div> : null}\n </div>\n {hasDismiss(onOpenChange, onClose, onDismiss) ? (\n <button type=\"button\" className=\"cs-alert__dismiss\" aria-label={t(\"dismiss\")} onClick={(event) => notifyDismiss(event, onOpenChange, onClose, onDismiss)}>×</button>\n ) : null}\n </div>\n );\n});\nAlert.displayName = \"Alert\";\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AACA,OAAO,WAAW;AAKlB,IAAM,QAAQ;AAAA,EACZ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AACV;AACA,SAAS,YAAY,EAAE,QAAQ,GAAG;AAChC,SACE,oCAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,eAAY,UAC3J,oCAAC,UAAK,GAAG,MAAM,OAAO,KAAK,MAAM,MAAM,CACzC;AAEJ;AAGO,IAAM,QAAQ,MAAM,WAAW,SAASA,OAAM,EAAE,UAAU,QAAQ,OAAO,MAAM,UAAU,WAAW,SAAS,cAAc,MAAM,WAAW,GAAG,MAAM,GAAG,cAAc;AAC3K,QAAM,CAAC,KAAK,GAAG,cAAc,IAAI,QAAQ,IAAI;AAC7C,QAAM,kBAAkB,gBAAgB,KAAK,YAAY;AACzD,QAAM,IAAI,MAAM,SAAS,GAAG,cAAc;AAC1C,SACE,oCAAC,SAAI,KAAK,iBAAiB,MAAK,UAAS,WAAW,GAAG,YAAY,aAAa,OAAO,IAAI,SAAS,GAAI,GAAG,SACzG,oCAAC,UAAK,WAAU,oBAAkB,QAAQ,oCAAC,eAAY,SAAkB,CAAG,GAC5E,oCAAC,aACG,SAAS,UAAU,IAAK,oCAAC,OAAE,WAAU,qBAAmB,KAAM,IAAO,MACrE,YAAY,aAAa,IAAK,oCAAC,SAAI,WAAU,oBAAkB,QAAS,IAAS,IACrF,GACC,WAAW,cAAc,SAAS,SAAS,IAC1C,oCAAC,YAAO,MAAK,UAAS,WAAU,qBAAoB,cAAY,EAAE,SAAS,GAAG,SAAS,CAAC,UAAU,cAAc,OAAO,cAAc,SAAS,SAAS,KAAG,GAAC,IACzJ,IACN;AAEJ,CAAC;AACD,MAAM,cAAc;",
6
+ "names": ["Alert"]
7
+ }
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  makeT,
8
8
  useLang
9
- } from "./chunk-25AOTZAM.mjs";
9
+ } from "./chunk-JZYRXWPD.mjs";
10
10
  import {
11
11
  mergeTargetProps
12
12
  } from "./chunk-RQFCRXMQ.mjs";
@@ -71,4 +71,4 @@ InlineEdit.displayName = "InlineEdit";
71
71
  export {
72
72
  InlineEdit
73
73
  };
74
- //# sourceMappingURL=chunk-HYQG5XND.mjs.map
74
+ //# sourceMappingURL=chunk-GLPQBE2J.mjs.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  makeT,
4
4
  useLang
5
- } from "./chunk-25AOTZAM.mjs";
5
+ } from "./chunk-JZYRXWPD.mjs";
6
6
  import {
7
7
  mergeTargetProps
8
8
  } from "./chunk-RQFCRXMQ.mjs";
@@ -43,4 +43,4 @@ Transfer.displayName = "Transfer";
43
43
  export {
44
44
  Transfer
45
45
  };
46
- //# sourceMappingURL=chunk-HUW6OY7C.mjs.map
46
+ //# sourceMappingURL=chunk-GNEVR5Q4.mjs.map
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  makeT,
12
12
  useLang
13
- } from "./chunk-25AOTZAM.mjs";
13
+ } from "./chunk-JZYRXWPD.mjs";
14
14
  import {
15
15
  mergeTargetProps
16
16
  } from "./chunk-RQFCRXMQ.mjs";
@@ -184,4 +184,4 @@ export {
184
184
  Menu,
185
185
  MenuItem
186
186
  };
187
- //# sourceMappingURL=chunk-SEYKDGXE.mjs.map
187
+ //# sourceMappingURL=chunk-H4TKHAB3.mjs.map
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  makeT,
7
7
  useLang
8
- } from "./chunk-25AOTZAM.mjs";
8
+ } from "./chunk-JZYRXWPD.mjs";
9
9
  import {
10
10
  useClientLayoutEffect
11
11
  } from "./chunk-CQQ2JOJD.mjs";
@@ -188,7 +188,7 @@ var DataGrid = React.forwardRef(function DataGrid2({
188
188
  ) : null
189
189
  )))), /* @__PURE__ */ React.createElement("tbody", null, sorted.length === 0 ? /* @__PURE__ */ React.createElement("tr", { "aria-rowindex": useVirtual ? 2 : void 0 }, /* @__PURE__ */ React.createElement("td", { colSpan: orderedColumns.length + (selectable ? 1 : 0), className: "cs-table__empty" }, empty != null ? empty : t("empty"))) : /* @__PURE__ */ React.createElement(React.Fragment, null, padTop > 0 ? /* @__PURE__ */ React.createElement("tr", { "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("td", { colSpan: orderedColumns.length + (selectable ? 1 : 0), style: { height: padTop, padding: 0, border: 0 } })) : null, slice.map((r, i) => {
190
190
  const k = r[rowKey] != null ? r[rowKey] : start + i;
191
- return /* @__PURE__ */ React.createElement("tr", { key: k, "aria-rowindex": useVirtual ? start + i + 2 : void 0, className: selected.includes(k) ? "is-selected" : void 0, style: useVirtual ? { height: effectiveRowHeight } : void 0 }, selectable ? /* @__PURE__ */ React.createElement("td", { className: "cs-datagrid__selcol" }, /* @__PURE__ */ React.createElement("label", { className: "cs-datagrid__check" }, /* @__PURE__ */ React.createElement("input", { type: "checkbox", "aria-label": `${t("selectRow")}: ${String(orderedColumns.map((c) => r[c.key]).find((v) => typeof v === "string" && v.trim()) ?? k)}`, checked: selected.includes(k), onChange: () => toggle(k) }))) : null, orderedColumns.map((c) => /* @__PURE__ */ React.createElement("td", { key: c.key, className: c.pinned ? "cs-datagrid__pinned" : void 0, style: c.pinned ? { position: "sticky", insetInlineStart: 0, background: "var(--cs-color-surface-panel)" } : void 0 }, c.render ? c.render(r) : r[c.key])));
191
+ return /* @__PURE__ */ React.createElement("tr", { key: k, "aria-rowindex": useVirtual ? start + i + 2 : void 0, "aria-selected": selectable ? selected.includes(k) : void 0, className: selected.includes(k) ? "is-selected" : void 0, style: useVirtual ? { height: effectiveRowHeight } : void 0 }, selectable ? /* @__PURE__ */ React.createElement("td", { className: "cs-datagrid__selcol" }, /* @__PURE__ */ React.createElement("label", { className: "cs-datagrid__check" }, /* @__PURE__ */ React.createElement("input", { type: "checkbox", "aria-label": `${t("selectRow")}: ${String(orderedColumns.map((c) => r[c.key]).find((v) => typeof v === "string" && v.trim()) ?? k)}`, checked: selected.includes(k), onChange: () => toggle(k) }))) : null, orderedColumns.map((c) => /* @__PURE__ */ React.createElement("td", { key: c.key, className: c.pinned ? "cs-datagrid__pinned" : void 0, style: c.pinned ? { position: "sticky", insetInlineStart: 0, background: "var(--cs-color-surface-panel)" } : void 0 }, c.render ? c.render(r) : r[c.key])));
192
192
  }), padBottom > 0 ? /* @__PURE__ */ React.createElement("tr", { "aria-hidden": "true" }, /* @__PURE__ */ React.createElement("td", { colSpan: orderedColumns.length + (selectable ? 1 : 0), style: { height: padBottom, padding: 0, border: 0 } })) : null)))
193
193
  );
194
194
  });
@@ -197,4 +197,4 @@ DataGrid.displayName = "DataGrid";
197
197
  export {
198
198
  DataGrid
199
199
  };
200
- //# sourceMappingURL=chunk-ANWF2NX3.mjs.map
200
+ //# sourceMappingURL=chunk-H6HQZ5RI.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../components/datatable/DataGrid.jsx"],
4
- "sourcesContent": ["import { useComposedRefs } from \"../_utils/refs.js\";\nimport { mergeTargetProps } from \"../_utils/field-association.js\";\nimport React from \"react\";\nimport { makeT, useLang } from \"../_i18n/i18n.js\";\nimport { Icon } from \"../icon/Icon.jsx\";\nimport { cx } from \"../_utils/cx.js\";\nimport { useClientLayoutEffect } from \"../_utils/use-client-layout-effect.js\";\n\n/**\n * CyberSkill DataGrid — advanced table: sortable columns, selectable rows, sticky header,\n * optional column pin + client filter + row virtualization + optional column order persistence.\n */\nexport const DataGrid = React.forwardRef(function DataGrid({\n columns = [],\n rows = [],\n rowKey = \"id\",\n selectable = false,\n selected = [],\n onSelect,\n height = 280,\n caption,\n empty,\n lang,\n className,\n rootProps,\n filterText,\n filterKeys,\n /** When true (or rows exceed virtualThreshold), only paint a window of rows. */\n virtual = false,\n /** Row threshold that auto-enables virtualization. Default 80. */\n virtualThreshold = 80,\n /** Approximate row height for windowing. Default 36. */\n rowHeight = 36,\n /** localStorage key — when set, column key order is persisted across reloads. */\n persistKey,\n}, forwardedRef) {\n const [sort, setSort] = React.useState(null); // {key, dir}\n const nameId = React.useId();\n const [scrollTop, setScrollTop] = React.useState(0);\n const estimate = Number.isFinite(rowHeight) && rowHeight > 0 ? rowHeight : 36;\n const [measuredRowHeight, setMeasuredRowHeight] = React.useState(estimate);\n const effectiveRowHeight = Math.max(estimate, measuredRowHeight);\n const [colOrder, setColOrder] = React.useState(null);\n useClientLayoutEffect(() => {\n if (!persistKey) { setColOrder(null); return; }\n try {\n const raw = localStorage.getItem(\"cs:datagrid:cols:\" + persistKey);\n const arr = raw ? JSON.parse(raw) : null;\n setColOrder(Array.isArray(arr) ? arr : null);\n } catch (e) { setColOrder(null); }\n }, [persistKey]);\n const [ref, L, localeMessages] = useLang(lang);\n const mergedNativeRef = useComposedRefs(ref, forwardedRef);\n const t = makeT(\"DataGrid\", L, localeMessages);\n\n const orderedColumns = React.useMemo(() => {\n if (!colOrder || !colOrder.length) return columns;\n const map = new Map(columns.map((c) => [c.key, c]));\n const out = [];\n for (const k of colOrder) if (map.has(k)) { out.push(map.get(k)); map.delete(k); }\n for (const c of map.values()) out.push(c);\n return out;\n }, [columns, colOrder]);\n\n const filtered = React.useMemo(() => {\n const q = (filterText == null ? \"\" : String(filterText)).trim().toLowerCase();\n if (!q) return rows;\n const keys = filterKeys && filterKeys.length ? filterKeys : orderedColumns.map((c) => c.key);\n return rows.filter((r) => keys.some((k) => String(r[k] == null ? \"\" : r[k]).toLowerCase().includes(q)));\n }, [rows, filterText, filterKeys, orderedColumns]);\n\n const sorted = React.useMemo(() => {\n if (!sort) return filtered;\n const col = orderedColumns.find((c) => c.key === sort.key);\n const val = (r) => (col && col.sortValue ? col.sortValue(r) : r[sort.key]);\n return [...filtered].sort((a, b) => { const x = val(a), y = val(b); return (x > y ? 1 : x < y ? -1 : 0) * (sort.dir === \"asc\" ? 1 : -1); });\n }, [filtered, sort, orderedColumns]);\n\n const useVirtual = virtual || sorted.length >= virtualThreshold;\n const bodyH = Math.max(0, height - 40);\n const visibleCount = useVirtual ? Math.ceil(bodyH / effectiveRowHeight) + 8 : sorted.length;\n // Data/filter changes can leave the old scroll offset beyond the new rows.\n // Keep a populated final window; removing stale padding lets the browser\n // clamp its physical scroll position to the new content height as well.\n const start = useVirtual ? Math.min(Math.max(0, sorted.length - visibleCount), Math.max(0, Math.floor(scrollTop / effectiveRowHeight) - 4)) : 0;\n const end = useVirtual ? Math.min(sorted.length, start + visibleCount) : sorted.length;\n const slice = sorted.slice(start, end);\n const padTop = useVirtual ? start * effectiveRowHeight : 0;\n const padBottom = useVirtual ? Math.max(0, (sorted.length - end) * effectiveRowHeight) : 0;\n\n // CSS (including larger touch controls) can exceed the caller's estimate.\n // Measure natural rendered rows before paint, without retaining the previous\n // inline floor: switching back to a denser layout must be able to shrink.\n useClientLayoutEffect(() => {\n const host = ref.current;\n if (!host || !useVirtual) return;\n const rows = [...host.querySelectorAll('tbody > tr:not([aria-hidden=\"true\"])')];\n if (!slice.length || !rows.length) return;\n const measure = () => {\n const old = rows.map(row => row.style.height);\n rows.forEach(row => { row.style.height = \"\"; });\n const next = Math.max(estimate, ...rows.map(row => row.getBoundingClientRect().height));\n rows.forEach((row, i) => { row.style.height = old[i]; });\n setMeasuredRowHeight(previous => Math.abs(previous - next) > 0.01 ? next : previous);\n };\n measure();\n const resize = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n resize?.observe(host);\n rows.forEach(row => resize?.observe(row));\n const ancestors = new MutationObserver(measure);\n for (let node = host; node; node = node.parentElement) {\n ancestors.observe(node, { attributes: true, attributeFilter: [\"class\", \"style\", \"lang\", \"data-cs-density\", \"data-cs-element\", \"data-cs-variant\"] });\n }\n const coarse = window.matchMedia(\"(pointer: coarse)\");\n coarse.addEventListener(\"change\", measure);\n document.fonts?.addEventListener(\"loadingdone\", measure);\n return () => {\n resize?.disconnect();\n ancestors.disconnect();\n coarse.removeEventListener(\"change\", measure);\n document.fonts?.removeEventListener(\"loadingdone\", measure);\n };\n }, [useVirtual, slice, estimate, ref]);\n\n const allSel = selectable && filtered.length && filtered.every((r) => selected.includes(r[rowKey]));\n const toggleAll = () => onSelect && onSelect(allSel ? [] : filtered.map((r) => r[rowKey]));\n const toggle = (k) => onSelect && onSelect(selected.includes(k) ? selected.filter((x) => x !== k) : [...selected, k]);\n\n const pinColumn = (key) => {\n if (!persistKey) return;\n const keys = orderedColumns.map((c) => c.key);\n const next = [key, ...keys.filter((k) => k !== key)];\n setColOrder(next);\n try { localStorage.setItem(\"cs:datagrid:cols:\" + persistKey, JSON.stringify(next)); } catch (e) {}\n };\n\n return (\n <div\n ref={mergedNativeRef}\n {...mergeTargetProps({\n className: cx(\"cs-datagrid\", useVirtual && \"cs-datagrid--virtual\", className),\n onScroll: useVirtual ? (e) => setScrollTop(e.currentTarget.scrollTop) : undefined,\n }, rootProps, [\"data-virtual\", \"data-row-count\", \"data-row-height\"])}\n style={{ ...rootProps?.style, maxBlockSize: height, overflow: \"auto\" }}\n data-virtual={useVirtual ? \"true\" : \"false\"}\n data-row-count={sorted.length}\n data-row-height={useVirtual ? effectiveRowHeight : undefined}\n >\n <table className=\"cs-table\" aria-rowcount={useVirtual ? Math.max(2, sorted.length + 1) : undefined}>\n {(caption || caption === 0) ? <caption>{caption}</caption> : null}\n <thead>\n <tr aria-rowindex={useVirtual ? 1 : undefined}>\n {selectable ? <th scope=\"col\" className=\"cs-datagrid__selcol\"><label className=\"cs-datagrid__check\"><input type=\"checkbox\" aria-label={t(\"selectAll\")} checked={!!allSel} onChange={toggleAll} /></label></th> : null}\n {orderedColumns.map((c, columnIndex) => (\n <th\n key={c.key}\n scope=\"col\"\n className={c.pinned ? \"cs-datagrid__pinned\" : undefined}\n style={c.pinned ? { position: \"sticky\", insetInlineStart: 0, zIndex: 1, background: \"var(--cs-color-surface-panel)\" } : undefined}\n aria-sort={sort && sort.key === c.key ? (sort.dir === \"asc\" ? \"ascending\" : \"descending\") : undefined}\n >\n {c.sortable ? (\n <button type=\"button\" className=\"cs-datagrid__sort\" onClick={() => setSort((s) => (!s || s.key !== c.key ? { key: c.key, dir: \"asc\" } : s.dir === \"asc\" ? { key: c.key, dir: \"desc\" } : null))}>\n <span id={nameId + \"-header-\" + columnIndex}>{c.header}</span><span aria-hidden=\"true\">{sort && sort.key === c.key ? (sort.dir === \"asc\" ? \" ▲\" : \" ▼\") : \" ↕\"}</span>\n </button>\n ) : <span id={nameId + \"-header-\" + columnIndex}>{c.header}</span>}\n {persistKey ? (\n <button\n type=\"button\"\n className=\"cs-datagrid__pin\"\n title={t(\"pin\")}\n onClick={() => pinColumn(c.key)}\n aria-label={c.header == null ? t(\"pinNamed\").replace(\"{name}\", c.key) : undefined}\n aria-labelledby={c.header == null ? undefined : nameId + \"-pin-start-\" + columnIndex + \" \" + nameId + \"-header-\" + columnIndex + \" \" + nameId + \"-pin-end-\" + columnIndex}\n >\n <span className=\"cs-sr-only\" id={nameId + \"-pin-start-\" + columnIndex}>{t(\"pinNamed\").split(\"{name}\")[0]}</span>\n <Icon name=\"pin\" size=\"sm\" />\n <span className=\"cs-sr-only\" id={nameId + \"-pin-end-\" + columnIndex}>{t(\"pinNamed\").split(\"{name}\")[1]}</span>\n </button>\n ) : null}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {sorted.length === 0 ? (\n <tr aria-rowindex={useVirtual ? 2 : undefined}><td colSpan={orderedColumns.length + (selectable ? 1 : 0)} className=\"cs-table__empty\">{empty != null ? empty : t(\"empty\")}</td></tr>\n ) : (\n <>\n {padTop > 0 ? <tr aria-hidden=\"true\"><td colSpan={orderedColumns.length + (selectable ? 1 : 0)} style={{ height: padTop, padding: 0, border: 0 }} /></tr> : null}\n {slice.map((r, i) => {\n const k = r[rowKey] != null ? r[rowKey] : start + i;\n return (\n <tr key={k} aria-rowindex={useVirtual ? start + i + 2 : undefined} className={selected.includes(k) ? \"is-selected\" : undefined} style={useVirtual ? { height: effectiveRowHeight } : undefined}>\n {selectable ? <td className=\"cs-datagrid__selcol\"><label className=\"cs-datagrid__check\"><input type=\"checkbox\" aria-label={`${t(\"selectRow\")}: ${String(orderedColumns.map(c => r[c.key]).find(v => typeof v === \"string\" && v.trim()) ?? k)}`} checked={selected.includes(k)} onChange={() => toggle(k)} /></label></td> : null}\n {orderedColumns.map((c) => (\n <td key={c.key} className={c.pinned ? \"cs-datagrid__pinned\" : undefined} style={c.pinned ? { position: \"sticky\", insetInlineStart: 0, background: \"var(--cs-color-surface-panel)\" } : undefined}>\n {c.render ? c.render(r) : r[c.key]}\n </td>\n ))}\n </tr>\n );\n })}\n {padBottom > 0 ? <tr aria-hidden=\"true\"><td colSpan={orderedColumns.length + (selectable ? 1 : 0)} style={{ height: padBottom, padding: 0, border: 0 }} /></tr> : null}\n </>\n )}\n </tbody>\n </table>\n </div>\n );\n});\nDataGrid.displayName = \"DataGrid\";\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { useComposedRefs } from \"../_utils/refs.js\";\nimport { mergeTargetProps } from \"../_utils/field-association.js\";\nimport React from \"react\";\nimport { makeT, useLang } from \"../_i18n/i18n.js\";\nimport { Icon } from \"../icon/Icon.jsx\";\nimport { cx } from \"../_utils/cx.js\";\nimport { useClientLayoutEffect } from \"../_utils/use-client-layout-effect.js\";\n\n/**\n * CyberSkill DataGrid — advanced table: sortable columns, selectable rows, sticky header,\n * optional column pin + client filter + row virtualization + optional column order persistence.\n */\nexport const DataGrid = React.forwardRef(function DataGrid({\n columns = [],\n rows = [],\n rowKey = \"id\",\n selectable = false,\n selected = [],\n onSelect,\n height = 280,\n caption,\n empty,\n lang,\n className,\n rootProps,\n filterText,\n filterKeys,\n /** When true (or rows exceed virtualThreshold), only paint a window of rows. */\n virtual = false,\n /** Row threshold that auto-enables virtualization. Default 80. */\n virtualThreshold = 80,\n /** Approximate row height for windowing. Default 36. */\n rowHeight = 36,\n /** localStorage key — when set, column key order is persisted across reloads. */\n persistKey,\n}, forwardedRef) {\n const [sort, setSort] = React.useState(null); // {key, dir}\n const nameId = React.useId();\n const [scrollTop, setScrollTop] = React.useState(0);\n const estimate = Number.isFinite(rowHeight) && rowHeight > 0 ? rowHeight : 36;\n const [measuredRowHeight, setMeasuredRowHeight] = React.useState(estimate);\n const effectiveRowHeight = Math.max(estimate, measuredRowHeight);\n const [colOrder, setColOrder] = React.useState(null);\n useClientLayoutEffect(() => {\n if (!persistKey) { setColOrder(null); return; }\n try {\n const raw = localStorage.getItem(\"cs:datagrid:cols:\" + persistKey);\n const arr = raw ? JSON.parse(raw) : null;\n setColOrder(Array.isArray(arr) ? arr : null);\n } catch (e) { setColOrder(null); }\n }, [persistKey]);\n const [ref, L, localeMessages] = useLang(lang);\n const mergedNativeRef = useComposedRefs(ref, forwardedRef);\n const t = makeT(\"DataGrid\", L, localeMessages);\n\n const orderedColumns = React.useMemo(() => {\n if (!colOrder || !colOrder.length) return columns;\n const map = new Map(columns.map((c) => [c.key, c]));\n const out = [];\n for (const k of colOrder) if (map.has(k)) { out.push(map.get(k)); map.delete(k); }\n for (const c of map.values()) out.push(c);\n return out;\n }, [columns, colOrder]);\n\n const filtered = React.useMemo(() => {\n const q = (filterText == null ? \"\" : String(filterText)).trim().toLowerCase();\n if (!q) return rows;\n const keys = filterKeys && filterKeys.length ? filterKeys : orderedColumns.map((c) => c.key);\n return rows.filter((r) => keys.some((k) => String(r[k] == null ? \"\" : r[k]).toLowerCase().includes(q)));\n }, [rows, filterText, filterKeys, orderedColumns]);\n\n const sorted = React.useMemo(() => {\n if (!sort) return filtered;\n const col = orderedColumns.find((c) => c.key === sort.key);\n const val = (r) => (col && col.sortValue ? col.sortValue(r) : r[sort.key]);\n return [...filtered].sort((a, b) => { const x = val(a), y = val(b); return (x > y ? 1 : x < y ? -1 : 0) * (sort.dir === \"asc\" ? 1 : -1); });\n }, [filtered, sort, orderedColumns]);\n\n const useVirtual = virtual || sorted.length >= virtualThreshold;\n const bodyH = Math.max(0, height - 40);\n const visibleCount = useVirtual ? Math.ceil(bodyH / effectiveRowHeight) + 8 : sorted.length;\n // Data/filter changes can leave the old scroll offset beyond the new rows.\n // Keep a populated final window; removing stale padding lets the browser\n // clamp its physical scroll position to the new content height as well.\n const start = useVirtual ? Math.min(Math.max(0, sorted.length - visibleCount), Math.max(0, Math.floor(scrollTop / effectiveRowHeight) - 4)) : 0;\n const end = useVirtual ? Math.min(sorted.length, start + visibleCount) : sorted.length;\n const slice = sorted.slice(start, end);\n const padTop = useVirtual ? start * effectiveRowHeight : 0;\n const padBottom = useVirtual ? Math.max(0, (sorted.length - end) * effectiveRowHeight) : 0;\n\n // CSS (including larger touch controls) can exceed the caller's estimate.\n // Measure natural rendered rows before paint, without retaining the previous\n // inline floor: switching back to a denser layout must be able to shrink.\n useClientLayoutEffect(() => {\n const host = ref.current;\n if (!host || !useVirtual) return;\n const rows = [...host.querySelectorAll('tbody > tr:not([aria-hidden=\"true\"])')];\n if (!slice.length || !rows.length) return;\n const measure = () => {\n const old = rows.map(row => row.style.height);\n rows.forEach(row => { row.style.height = \"\"; });\n const next = Math.max(estimate, ...rows.map(row => row.getBoundingClientRect().height));\n rows.forEach((row, i) => { row.style.height = old[i]; });\n setMeasuredRowHeight(previous => Math.abs(previous - next) > 0.01 ? next : previous);\n };\n measure();\n const resize = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n resize?.observe(host);\n rows.forEach(row => resize?.observe(row));\n const ancestors = new MutationObserver(measure);\n for (let node = host; node; node = node.parentElement) {\n ancestors.observe(node, { attributes: true, attributeFilter: [\"class\", \"style\", \"lang\", \"data-cs-density\", \"data-cs-element\", \"data-cs-variant\"] });\n }\n const coarse = window.matchMedia(\"(pointer: coarse)\");\n coarse.addEventListener(\"change\", measure);\n document.fonts?.addEventListener(\"loadingdone\", measure);\n return () => {\n resize?.disconnect();\n ancestors.disconnect();\n coarse.removeEventListener(\"change\", measure);\n document.fonts?.removeEventListener(\"loadingdone\", measure);\n };\n }, [useVirtual, slice, estimate, ref]);\n\n const allSel = selectable && filtered.length && filtered.every((r) => selected.includes(r[rowKey]));\n const toggleAll = () => onSelect && onSelect(allSel ? [] : filtered.map((r) => r[rowKey]));\n const toggle = (k) => onSelect && onSelect(selected.includes(k) ? selected.filter((x) => x !== k) : [...selected, k]);\n\n const pinColumn = (key) => {\n if (!persistKey) return;\n const keys = orderedColumns.map((c) => c.key);\n const next = [key, ...keys.filter((k) => k !== key)];\n setColOrder(next);\n try { localStorage.setItem(\"cs:datagrid:cols:\" + persistKey, JSON.stringify(next)); } catch (e) {}\n };\n\n return (\n <div\n ref={mergedNativeRef}\n {...mergeTargetProps({\n className: cx(\"cs-datagrid\", useVirtual && \"cs-datagrid--virtual\", className),\n onScroll: useVirtual ? (e) => setScrollTop(e.currentTarget.scrollTop) : undefined,\n }, rootProps, [\"data-virtual\", \"data-row-count\", \"data-row-height\"])}\n style={{ ...rootProps?.style, maxBlockSize: height, overflow: \"auto\" }}\n data-virtual={useVirtual ? \"true\" : \"false\"}\n data-row-count={sorted.length}\n data-row-height={useVirtual ? effectiveRowHeight : undefined}\n >\n <table className=\"cs-table\" aria-rowcount={useVirtual ? Math.max(2, sorted.length + 1) : undefined}>\n {(caption || caption === 0) ? <caption>{caption}</caption> : null}\n <thead>\n <tr aria-rowindex={useVirtual ? 1 : undefined}>\n {selectable ? <th scope=\"col\" className=\"cs-datagrid__selcol\"><label className=\"cs-datagrid__check\"><input type=\"checkbox\" aria-label={t(\"selectAll\")} checked={!!allSel} onChange={toggleAll} /></label></th> : null}\n {orderedColumns.map((c, columnIndex) => (\n <th\n key={c.key}\n scope=\"col\"\n className={c.pinned ? \"cs-datagrid__pinned\" : undefined}\n style={c.pinned ? { position: \"sticky\", insetInlineStart: 0, zIndex: 1, background: \"var(--cs-color-surface-panel)\" } : undefined}\n aria-sort={sort && sort.key === c.key ? (sort.dir === \"asc\" ? \"ascending\" : \"descending\") : undefined}\n >\n {c.sortable ? (\n <button type=\"button\" className=\"cs-datagrid__sort\" onClick={() => setSort((s) => (!s || s.key !== c.key ? { key: c.key, dir: \"asc\" } : s.dir === \"asc\" ? { key: c.key, dir: \"desc\" } : null))}>\n <span id={nameId + \"-header-\" + columnIndex}>{c.header}</span><span aria-hidden=\"true\">{sort && sort.key === c.key ? (sort.dir === \"asc\" ? \" ▲\" : \" ▼\") : \" ↕\"}</span>\n </button>\n ) : <span id={nameId + \"-header-\" + columnIndex}>{c.header}</span>}\n {persistKey ? (\n <button\n type=\"button\"\n className=\"cs-datagrid__pin\"\n title={t(\"pin\")}\n onClick={() => pinColumn(c.key)}\n aria-label={c.header == null ? t(\"pinNamed\").replace(\"{name}\", c.key) : undefined}\n aria-labelledby={c.header == null ? undefined : nameId + \"-pin-start-\" + columnIndex + \" \" + nameId + \"-header-\" + columnIndex + \" \" + nameId + \"-pin-end-\" + columnIndex}\n >\n <span className=\"cs-sr-only\" id={nameId + \"-pin-start-\" + columnIndex}>{t(\"pinNamed\").split(\"{name}\")[0]}</span>\n <Icon name=\"pin\" size=\"sm\" />\n <span className=\"cs-sr-only\" id={nameId + \"-pin-end-\" + columnIndex}>{t(\"pinNamed\").split(\"{name}\")[1]}</span>\n </button>\n ) : null}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {sorted.length === 0 ? (\n <tr aria-rowindex={useVirtual ? 2 : undefined}><td colSpan={orderedColumns.length + (selectable ? 1 : 0)} className=\"cs-table__empty\">{empty != null ? empty : t(\"empty\")}</td></tr>\n ) : (\n <>\n {padTop > 0 ? <tr aria-hidden=\"true\"><td colSpan={orderedColumns.length + (selectable ? 1 : 0)} style={{ height: padTop, padding: 0, border: 0 }} /></tr> : null}\n {slice.map((r, i) => {\n const k = r[rowKey] != null ? r[rowKey] : start + i;\n return (\n <tr key={k} aria-rowindex={useVirtual ? start + i + 2 : undefined} aria-selected={selectable ? selected.includes(k) : undefined} className={selected.includes(k) ? \"is-selected\" : undefined} style={useVirtual ? { height: effectiveRowHeight } : undefined}>\n {selectable ? <td className=\"cs-datagrid__selcol\"><label className=\"cs-datagrid__check\"><input type=\"checkbox\" aria-label={`${t(\"selectRow\")}: ${String(orderedColumns.map(c => r[c.key]).find(v => typeof v === \"string\" && v.trim()) ?? k)}`} checked={selected.includes(k)} onChange={() => toggle(k)} /></label></td> : null}\n {orderedColumns.map((c) => (\n <td key={c.key} className={c.pinned ? \"cs-datagrid__pinned\" : undefined} style={c.pinned ? { position: \"sticky\", insetInlineStart: 0, background: \"var(--cs-color-surface-panel)\" } : undefined}>\n {c.render ? c.render(r) : r[c.key]}\n </td>\n ))}\n </tr>\n );\n })}\n {padBottom > 0 ? <tr aria-hidden=\"true\"><td colSpan={orderedColumns.length + (selectable ? 1 : 0)} style={{ height: padBottom, padding: 0, border: 0 }} /></tr> : null}\n </>\n )}\n </tbody>\n </table>\n </div>\n );\n});\nDataGrid.displayName = \"DataGrid\";\n"],
5
+ "mappings": "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",
6
6
  "names": ["DataGrid", "rows"]
7
7
  }
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  makeT,
4
4
  useLang
5
- } from "./chunk-25AOTZAM.mjs";
5
+ } from "./chunk-JZYRXWPD.mjs";
6
6
  import {
7
7
  mergeTargetProps
8
8
  } from "./chunk-RQFCRXMQ.mjs";
@@ -29,4 +29,4 @@ ChatMessage.displayName = "ChatMessage";
29
29
  export {
30
30
  ChatMessage
31
31
  };
32
- //# sourceMappingURL=chunk-OR5UTKW7.mjs.map
32
+ //# sourceMappingURL=chunk-I3H7EAH5.mjs.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  makeT,
4
4
  useLang
5
- } from "./chunk-25AOTZAM.mjs";
5
+ } from "./chunk-JZYRXWPD.mjs";
6
6
  import {
7
7
  mergeTargetProps
8
8
  } from "./chunk-RQFCRXMQ.mjs";
@@ -57,4 +57,4 @@ Chart.displayName = "Chart";
57
57
  export {
58
58
  Chart
59
59
  };
60
- //# sourceMappingURL=chunk-P64YS5W2.mjs.map
60
+ //# sourceMappingURL=chunk-I3PQVFX5.mjs.map
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  makeT,
11
11
  useLang
12
- } from "./chunk-25AOTZAM.mjs";
12
+ } from "./chunk-JZYRXWPD.mjs";
13
13
  import {
14
14
  mergeTargetProps
15
15
  } from "./chunk-RQFCRXMQ.mjs";
@@ -139,4 +139,4 @@ Mentions.displayName = "Mentions";
139
139
  export {
140
140
  Mentions
141
141
  };
142
- //# sourceMappingURL=chunk-5MR3C2QG.mjs.map
142
+ //# sourceMappingURL=chunk-IOEWPBAL.mjs.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  makeT,
4
4
  useLang
5
- } from "./chunk-25AOTZAM.mjs";
5
+ } from "./chunk-JZYRXWPD.mjs";
6
6
  import {
7
7
  mergeIds
8
8
  } from "./chunk-RQFCRXMQ.mjs";
@@ -36,4 +36,4 @@ Select.displayName = "Select";
36
36
  export {
37
37
  Select
38
38
  };
39
- //# sourceMappingURL=chunk-TN2MZXGS.mjs.map
39
+ //# sourceMappingURL=chunk-JIHWIDMP.mjs.map
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  makeT,
11
11
  useLang
12
- } from "./chunk-25AOTZAM.mjs";
12
+ } from "./chunk-JZYRXWPD.mjs";
13
13
  import {
14
14
  useClientLayoutEffect
15
15
  } from "./chunk-CQQ2JOJD.mjs";
@@ -119,13 +119,14 @@ var Menubar = React.forwardRef(function Menubar2({ portal = true, placement, men
119
119
  setOpen(target);
120
120
  return;
121
121
  } else if (e.key === "Tab") {
122
+ e.preventDefault();
122
123
  setOpen(null);
123
124
  btns.current[i]?.focus();
124
125
  return;
125
126
  } else return;
126
127
  e.preventDefault();
127
128
  items[next]?.focus();
128
- } }, m.items.map((it, j) => it === "-" ? /* @__PURE__ */ React.createElement("span", { key: j, className: "cs-menu__sep", role: "separator" }) : /* @__PURE__ */ React.createElement("button", { key: j, type: "button", role: "menuitem", className: cx("cs-menu__item", it.danger && "cs-menu__item--danger"), onClick: () => {
129
+ } }, m.items.map((it, j) => it === "-" ? /* @__PURE__ */ React.createElement("span", { key: j, className: "cs-menu__sep", role: "separator" }) : /* @__PURE__ */ React.createElement("button", { key: j, type: "button", role: "menuitem", tabIndex: -1, className: cx("cs-menu__item", it.danger && "cs-menu__item--danger"), onClick: () => {
129
130
  setOpen(null);
130
131
  btns.current[i]?.focus();
131
132
  it.onSelect && it.onSelect();
@@ -136,4 +137,4 @@ Menubar.displayName = "Menubar";
136
137
  export {
137
138
  Menubar
138
139
  };
139
- //# sourceMappingURL=chunk-FXELBWXK.mjs.map
140
+ //# sourceMappingURL=chunk-JTAYZ36C.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../components/navigation/Menubar.jsx"],
4
- "sourcesContent": ["import { useFloatingPanel } from \"../_utils/floating-panel.js\";\nimport { useComposedRefs } from \"../_utils/refs.js\";\nimport { mergeTargetProps } from \"../_utils/field-association.js\";\nimport React from \"react\";\nimport { useClientLayoutEffect } from \"../_utils/use-client-layout-effect.js\";\nimport { useOverlayLayer, overlayScopeContext } from \"../overlays/OverlayManager.jsx\";\nimport { makeT, useLang } from \"../_i18n/i18n.js\";\nimport { cx } from \"../_utils/cx.js\";\n\n/** CyberSkill Menubar — app-style horizontal menu bar. menus: [{label, items:[{label,onSelect,danger}|\"-\"]}]. */\nexport const Menubar = React.forwardRef(function Menubar({ portal = true, placement, menus = [], className, \"aria-label\": ariaLabel, \"aria-labelledby\": ariaLabelledBy , rootProps }, forwardedRef) {\n const floatingRef = React.useRef(null);\n const [open, setOpen] = React.useState(null);\n const [focusI, setFocusI] = React.useState(0);\n const [wrap, L, localeMessages] = useLang();\n const mergedNativeRef = useComposedRefs(wrap, forwardedRef);\n const t = makeT(\"Menubar\", L, localeMessages);\n const id = React.useId();\n const itemFocus = React.useRef(null);\n const menuRefs = React.useRef([]);\n const btns = React.useRef([]);\n const floating = useFloatingPanel({ open: open != null, anchorRef: wrap, panelRef: floatingRef, portal, manageTabOrder: false, placement: placement ?? \"bottom-start\", gap: 5, getAnchor: ()=>btns.current[open], getInlineParent: ()=>btns.current[open]?.parentElement, identity: open });\n const { scope } = useOverlayLayer({ open: (open != null) && floating.ready, kind: \"dropdown\", panelRef: floatingRef, surfaceKey: floating.surfaceKey, restoreFocus: false, onEscape: () => { setOpen(null); btns.current[open]?.focus(); } });\n useClientLayoutEffect(() => {\n if (open == null || itemFocus.current == null || !floating.ready) return;\n const items = menuRefs.current[open]?.querySelectorAll('[role=\"menuitem\"]');\n const target = itemFocus.current; itemFocus.current = null;\n (target === -1 ? items?.[items.length - 1] : items?.[0])?.focus();\n }, [open, floating.ready, floating.surfaceKey]);\n React.useEffect(() => {\n if (open == null) return;\n const d = (e) => { if (!floating.contains(e.target)) setOpen(null); };\n document.addEventListener(\"mousedown\", d);\n return () => { document.removeEventListener(\"mousedown\", d); };\n }, [open]);\n const nav = (e, i) => {\n let n = null;\n if (e.key === \"ArrowRight\") n = (i + 1) % menus.length;\n else if (e.key === \"ArrowLeft\") n = (i - 1 + menus.length) % menus.length;\n else if (e.key === \"Home\") n = 0;\n else if (e.key === \"End\") n = menus.length - 1;\n else if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \" \"].includes(e.key)) { e.preventDefault(); itemFocus.current = e.key === \"ArrowUp\" ? -1 : 0; if (open === i) { const items = menuRefs.current[i]?.querySelectorAll('[role=\"menuitem\"]'); (itemFocus.current === -1 ? items?.[items.length - 1] : items?.[0])?.focus(); itemFocus.current = null; } else setOpen(i); return; }\n if (n == null) return;\n e.preventDefault(); setFocusI(n); if (open != null) setOpen(n);\n const b = btns.current[n]; if (b) b.focus();\n };\n return (\n <overlayScopeContext.Provider value={scope}>\n <div ref={mergedNativeRef} {...mergeTargetProps({ \"className\": cx(\"cs-menubar\", className) }, rootProps, [\"role\",\"aria-label\",\"aria-labelledby\"])} role=\"menubar\" aria-label={ariaLabel ?? (ariaLabelledBy ? undefined : t(\"label\"))} aria-labelledby={ariaLabelledBy}>\n {menus.map((m, i) => (\n <span key={i} className=\"cs-menubar__wrap\">\n <button id={`${id}-top-${i}`} type=\"button\" role=\"menuitem\" aria-haspopup=\"menu\" aria-expanded={open === i} tabIndex={i === focusI ? 0 : -1}\n ref={(el) => (btns.current[i] = el)} onKeyDown={(e) => nav(e, i)} onFocus={() => setFocusI(i)}\n className={cx(\"cs-menubar__top\", open === i && \"is-open\")}\n onClick={() => setOpen(open === i ? null : i)} onMouseEnter={() => { if (open != null && open !== i) setOpen(i); }}>{m.label}</button>\n {open === i ? (\n floating.render(<span className=\"cs-menu__list\" role=\"menu\" aria-labelledby={`${id}-top-${i}`} ref={el => { menuRefs.current[i] = el; floatingRef.current = el; }} onKeyDown={e => {\n const items = [...e.currentTarget.querySelectorAll('[role=\"menuitem\"]')];\n const current = items.indexOf(document.activeElement);\n let next;\n if (e.key === \"ArrowDown\") next = (current + 1) % items.length;\n else if (e.key === \"ArrowUp\") next = (current - 1 + items.length) % items.length;\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = items.length - 1;\n else if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\n e.preventDefault(); const target = (i + (e.key === \"ArrowRight\" ? 1 : -1) + menus.length) % menus.length;\n itemFocus.current = 0; setFocusI(target); setOpen(target); return;\n } else if (e.key === \"Tab\") { setOpen(null); btns.current[i]?.focus(); return; }\n else return;\n e.preventDefault(); items[next]?.focus();\n }}>\n {m.items.map((it, j) => it === \"-\"\n ? <span key={j} className=\"cs-menu__sep\" role=\"separator\" />\n : <button key={j} type=\"button\" role=\"menuitem\" className={cx(\"cs-menu__item\", it.danger && \"cs-menu__item--danger\")} onClick={() => { setOpen(null); btns.current[i]?.focus(); it.onSelect && it.onSelect(); }}>{it.label}</button>)}\n </span>)\n ) : null}\n </span>\n ))}\n </div>\n </overlayScopeContext.Provider>\n );\n});\nMenubar.displayName = \"Menubar\";\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { useFloatingPanel } from \"../_utils/floating-panel.js\";\nimport { useComposedRefs } from \"../_utils/refs.js\";\nimport { mergeTargetProps } from \"../_utils/field-association.js\";\nimport React from \"react\";\nimport { useClientLayoutEffect } from \"../_utils/use-client-layout-effect.js\";\nimport { useOverlayLayer, overlayScopeContext } from \"../overlays/OverlayManager.jsx\";\nimport { makeT, useLang } from \"../_i18n/i18n.js\";\nimport { cx } from \"../_utils/cx.js\";\n\n/** CyberSkill Menubar — app-style horizontal menu bar. menus: [{label, items:[{label,onSelect,danger}|\"-\"]}]. */\nexport const Menubar = React.forwardRef(function Menubar({ portal = true, placement, menus = [], className, \"aria-label\": ariaLabel, \"aria-labelledby\": ariaLabelledBy , rootProps }, forwardedRef) {\n const floatingRef = React.useRef(null);\n const [open, setOpen] = React.useState(null);\n const [focusI, setFocusI] = React.useState(0);\n const [wrap, L, localeMessages] = useLang();\n const mergedNativeRef = useComposedRefs(wrap, forwardedRef);\n const t = makeT(\"Menubar\", L, localeMessages);\n const id = React.useId();\n const itemFocus = React.useRef(null);\n const menuRefs = React.useRef([]);\n const btns = React.useRef([]);\n const floating = useFloatingPanel({ open: open != null, anchorRef: wrap, panelRef: floatingRef, portal, manageTabOrder: false, placement: placement ?? \"bottom-start\", gap: 5, getAnchor: ()=>btns.current[open], getInlineParent: ()=>btns.current[open]?.parentElement, identity: open });\n const { scope } = useOverlayLayer({ open: (open != null) && floating.ready, kind: \"dropdown\", panelRef: floatingRef, surfaceKey: floating.surfaceKey, restoreFocus: false, onEscape: () => { setOpen(null); btns.current[open]?.focus(); } });\n useClientLayoutEffect(() => {\n if (open == null || itemFocus.current == null || !floating.ready) return;\n const items = menuRefs.current[open]?.querySelectorAll('[role=\"menuitem\"]');\n const target = itemFocus.current; itemFocus.current = null;\n (target === -1 ? items?.[items.length - 1] : items?.[0])?.focus();\n }, [open, floating.ready, floating.surfaceKey]);\n React.useEffect(() => {\n if (open == null) return;\n const d = (e) => { if (!floating.contains(e.target)) setOpen(null); };\n document.addEventListener(\"mousedown\", d);\n return () => { document.removeEventListener(\"mousedown\", d); };\n }, [open]);\n const nav = (e, i) => {\n let n = null;\n if (e.key === \"ArrowRight\") n = (i + 1) % menus.length;\n else if (e.key === \"ArrowLeft\") n = (i - 1 + menus.length) % menus.length;\n else if (e.key === \"Home\") n = 0;\n else if (e.key === \"End\") n = menus.length - 1;\n else if ([\"ArrowDown\", \"ArrowUp\", \"Enter\", \" \"].includes(e.key)) { e.preventDefault(); itemFocus.current = e.key === \"ArrowUp\" ? -1 : 0; if (open === i) { const items = menuRefs.current[i]?.querySelectorAll('[role=\"menuitem\"]'); (itemFocus.current === -1 ? items?.[items.length - 1] : items?.[0])?.focus(); itemFocus.current = null; } else setOpen(i); return; }\n if (n == null) return;\n e.preventDefault(); setFocusI(n); if (open != null) setOpen(n);\n const b = btns.current[n]; if (b) b.focus();\n };\n return (\n <overlayScopeContext.Provider value={scope}>\n <div ref={mergedNativeRef} {...mergeTargetProps({ \"className\": cx(\"cs-menubar\", className) }, rootProps, [\"role\",\"aria-label\",\"aria-labelledby\"])} role=\"menubar\" aria-label={ariaLabel ?? (ariaLabelledBy ? undefined : t(\"label\"))} aria-labelledby={ariaLabelledBy}>\n {menus.map((m, i) => (\n <span key={i} className=\"cs-menubar__wrap\">\n <button id={`${id}-top-${i}`} type=\"button\" role=\"menuitem\" aria-haspopup=\"menu\" aria-expanded={open === i} tabIndex={i === focusI ? 0 : -1}\n ref={(el) => (btns.current[i] = el)} onKeyDown={(e) => nav(e, i)} onFocus={() => setFocusI(i)}\n className={cx(\"cs-menubar__top\", open === i && \"is-open\")}\n onClick={() => setOpen(open === i ? null : i)} onMouseEnter={() => { if (open != null && open !== i) setOpen(i); }}>{m.label}</button>\n {open === i ? (\n floating.render(<span className=\"cs-menu__list\" role=\"menu\" aria-labelledby={`${id}-top-${i}`} ref={el => { menuRefs.current[i] = el; floatingRef.current = el; }} onKeyDown={e => {\n const items = [...e.currentTarget.querySelectorAll('[role=\"menuitem\"]')];\n const current = items.indexOf(document.activeElement);\n let next;\n if (e.key === \"ArrowDown\") next = (current + 1) % items.length;\n else if (e.key === \"ArrowUp\") next = (current - 1 + items.length) % items.length;\n else if (e.key === \"Home\") next = 0;\n else if (e.key === \"End\") next = items.length - 1;\n else if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\n e.preventDefault(); const target = (i + (e.key === \"ArrowRight\" ? 1 : -1) + menus.length) % menus.length;\n itemFocus.current = 0; setFocusI(target); setOpen(target); return;\n } else if (e.key === \"Tab\") { e.preventDefault(); setOpen(null); btns.current[i]?.focus(); return; }\n else return;\n e.preventDefault(); items[next]?.focus();\n }}>\n {m.items.map((it, j) => it === \"-\"\n ? <span key={j} className=\"cs-menu__sep\" role=\"separator\" />\n : <button key={j} type=\"button\" role=\"menuitem\" tabIndex={-1} className={cx(\"cs-menu__item\", it.danger && \"cs-menu__item--danger\")} onClick={() => { setOpen(null); btns.current[i]?.focus(); it.onSelect && it.onSelect(); }}>{it.label}</button>)}\n </span>)\n ) : null}\n </span>\n ))}\n </div>\n </overlayScopeContext.Provider>\n );\n});\nMenubar.displayName = \"Menubar\";\n"],
5
+ "mappings": "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",
6
6
  "names": ["Menubar"]
7
7
  }
@@ -176,7 +176,7 @@ var strings = {
176
176
  },
177
177
  Result: {
178
178
  en: { success: "Done", error: "We couldn't complete that", warning: "Please check", info: "Here's what happened" },
179
- vi: { success: "Hoàn tất", error: "Chúng tôi chưa hoàn tất được", warning: "Vui lòng kiểm tra", info: "Đây là điều đã xảy ra" }
179
+ vi: { success: "Hoàn tất", error: "Chưa thực hiện được thao tác này", warning: "Vui lòng kiểm tra", info: "Thông tin chi tiết" }
180
180
  },
181
181
  InlineEdit: {
182
182
  en: { edit: "Edit", empty: "Add text" },
@@ -217,11 +217,11 @@ var strings = {
217
217
  },
218
218
  PromptInput: {
219
219
  en: { placeholder: "Type your wish…", send: "Send", hint: "Lumi replies, then hands clear wishes to a human." },
220
- vi: { placeholder: "Nhập điều ước của bạn…", send: "Gửi", hint: "Lumi trả lời, rồi chuyển điều ước rõ ràng cho con người." }
220
+ vi: { placeholder: "Nhập điều ước của bạn…", send: "Gửi", hint: "Lumi phản hồi trước, rồi chuyển điều ước rõ ràng đến đội ngũ." }
221
221
  },
222
222
  HumanReviewGate: {
223
223
  en: { aria: "Human review gate", risk: "review required", approve: "Approve", reject: "Reject", reviewer: "Reviewer" },
224
- vi: { aria: "Cổng kiểm duyệt của con người", risk: "cần xem xét", approve: "Phê duyệt", reject: "Từ chối", reviewer: "Người duyệt" }
224
+ vi: { aria: "Bước duyệt của người phụ trách", risk: "cần xem xét", approve: "Phê duyệt", reject: "Từ chối", reviewer: "Người duyệt" }
225
225
  },
226
226
  Switch: {
227
227
  en: { label: "Setting" },
@@ -432,4 +432,4 @@ export {
432
432
  monthName,
433
433
  formatNumber
434
434
  };
435
- //# sourceMappingURL=chunk-25AOTZAM.mjs.map
435
+ //# sourceMappingURL=chunk-JZYRXWPD.mjs.map