@mindlogic-ai/logician-ui 5.0.0-alpha.2 → 5.0.0-alpha.21

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 (533) hide show
  1. package/README.md +1 -0
  2. package/dist/components/Avatar/Avatar.d.ts +68 -11
  3. package/dist/components/Avatar/Avatar.d.ts.map +1 -1
  4. package/dist/components/Avatar/Avatar.js +41 -5
  5. package/dist/components/Avatar/Avatar.js.map +1 -1
  6. package/dist/components/Avatar/Avatar.mjs +40 -5
  7. package/dist/components/Avatar/Avatar.mjs.map +1 -1
  8. package/dist/components/Avatar/index.d.ts +2 -2
  9. package/dist/components/Avatar/index.d.ts.map +1 -1
  10. package/dist/components/Badge/Badge.d.ts.map +1 -1
  11. package/dist/components/Badge/Badge.js +5 -3
  12. package/dist/components/Badge/Badge.js.map +1 -1
  13. package/dist/components/Badge/Badge.mjs +5 -3
  14. package/dist/components/Badge/Badge.mjs.map +1 -1
  15. package/dist/components/Badge/Badge.types.d.ts +7 -5
  16. package/dist/components/Badge/Badge.types.d.ts.map +1 -1
  17. package/dist/components/Banner/Banner.types.d.ts +24 -1
  18. package/dist/components/Banner/Banner.types.d.ts.map +1 -1
  19. package/dist/components/BottomSheet/BottomSheet.styles.d.ts +2 -2
  20. package/dist/components/Button/Button.d.ts.map +1 -1
  21. package/dist/components/Button/Button.js +31 -3
  22. package/dist/components/Button/Button.js.map +1 -1
  23. package/dist/components/Button/Button.mjs +31 -3
  24. package/dist/components/Button/Button.mjs.map +1 -1
  25. package/dist/components/Button/Button.types.d.ts +38 -1
  26. package/dist/components/Button/Button.types.d.ts.map +1 -1
  27. package/dist/components/Card/Card.types.d.ts +12 -0
  28. package/dist/components/Card/Card.types.d.ts.map +1 -1
  29. package/dist/components/Code/shikiAdapter.d.ts +3 -1
  30. package/dist/components/Code/shikiAdapter.d.ts.map +1 -1
  31. package/dist/components/Code/shikiAdapter.js +29 -8
  32. package/dist/components/Code/shikiAdapter.js.map +1 -1
  33. package/dist/components/Code/shikiAdapter.mjs +29 -8
  34. package/dist/components/Code/shikiAdapter.mjs.map +1 -1
  35. package/dist/components/CodeTabs/CodeTabs.styles.d.ts +6 -5
  36. package/dist/components/CodeTabs/CodeTabs.styles.d.ts.map +1 -1
  37. package/dist/components/CodeTabs/CodeTabs.styles.js +6 -5
  38. package/dist/components/CodeTabs/CodeTabs.styles.js.map +1 -1
  39. package/dist/components/CodeTabs/CodeTabs.styles.mjs +6 -5
  40. package/dist/components/CodeTabs/CodeTabs.styles.mjs.map +1 -1
  41. package/dist/components/ColorMode/ColorModeToggle.d.ts +7 -2
  42. package/dist/components/ColorMode/ColorModeToggle.d.ts.map +1 -1
  43. package/dist/components/ColorMode/ColorModeToggle.js +8 -3
  44. package/dist/components/ColorMode/ColorModeToggle.js.map +1 -1
  45. package/dist/components/ColorMode/ColorModeToggle.mjs +8 -3
  46. package/dist/components/ColorMode/ColorModeToggle.mjs.map +1 -1
  47. package/dist/components/Confetti/Confetti.types.d.ts +5 -1
  48. package/dist/components/Confetti/Confetti.types.d.ts.map +1 -1
  49. package/dist/components/Confetti/confettiColors.d.ts +5 -5
  50. package/dist/components/Confetti/confettiColors.js +5 -5
  51. package/dist/components/Confetti/confettiColors.mjs +5 -5
  52. package/dist/components/ErrorFallback/ErrorFallback.types.d.ts +6 -0
  53. package/dist/components/ErrorFallback/ErrorFallback.types.d.ts.map +1 -1
  54. package/dist/components/Form/FormModalFooter/FormModalFooter.d.ts +1 -1
  55. package/dist/components/Form/FormModalFooter/FormModalFooter.d.ts.map +1 -1
  56. package/dist/components/Form/FormModalFooter/FormModalFooter.js +2 -2
  57. package/dist/components/Form/FormModalFooter/FormModalFooter.js.map +1 -1
  58. package/dist/components/Form/FormModalFooter/FormModalFooter.mjs +2 -2
  59. package/dist/components/Form/FormModalFooter/FormModalFooter.mjs.map +1 -1
  60. package/dist/components/Form/FormModalFooter/FormModalFooter.types.d.ts +11 -1
  61. package/dist/components/Form/FormModalFooter/FormModalFooter.types.d.ts.map +1 -1
  62. package/dist/components/Form/FormSection/CollapsibleFormSection.js +1 -0
  63. package/dist/components/Form/FormSection/CollapsibleFormSection.js.map +1 -1
  64. package/dist/components/Form/FormSection/CollapsibleFormSection.mjs +1 -0
  65. package/dist/components/Form/FormSection/CollapsibleFormSection.mjs.map +1 -1
  66. package/dist/components/Input/Input.d.ts.map +1 -1
  67. package/dist/components/Input/Input.js +4 -0
  68. package/dist/components/Input/Input.js.map +1 -1
  69. package/dist/components/Input/Input.mjs +4 -0
  70. package/dist/components/Input/Input.mjs.map +1 -1
  71. package/dist/components/LineGraph/LineGraph.d.ts.map +1 -1
  72. package/dist/components/LineGraph/LineGraph.js +4 -5
  73. package/dist/components/LineGraph/LineGraph.js.map +1 -1
  74. package/dist/components/LineGraph/LineGraph.mjs +5 -6
  75. package/dist/components/LineGraph/LineGraph.mjs.map +1 -1
  76. package/dist/components/LineGraph/LineGraph.types.d.ts +12 -2
  77. package/dist/components/LineGraph/LineGraph.types.d.ts.map +1 -1
  78. package/dist/components/LineGraph/seriesColors.d.ts +12 -8
  79. package/dist/components/LineGraph/seriesColors.d.ts.map +1 -1
  80. package/dist/components/LineGraph/seriesColors.js +8 -7
  81. package/dist/components/LineGraph/seriesColors.js.map +1 -1
  82. package/dist/components/LineGraph/seriesColors.mjs +8 -7
  83. package/dist/components/LineGraph/seriesColors.mjs.map +1 -1
  84. package/dist/components/Masonry/Masonry.types.d.ts +8 -3
  85. package/dist/components/Masonry/Masonry.types.d.ts.map +1 -1
  86. package/dist/components/Menu/MenuItem.types.d.ts +8 -0
  87. package/dist/components/Menu/MenuItem.types.d.ts.map +1 -1
  88. package/dist/components/Modal/ModalCloseButton.d.ts +1 -1
  89. package/dist/components/Modal/ModalCloseButton.js +1 -1
  90. package/dist/components/Modal/ModalCloseButton.mjs +1 -1
  91. package/dist/components/NavList/NavList.d.ts +35 -0
  92. package/dist/components/NavList/NavList.d.ts.map +1 -0
  93. package/dist/components/NavList/NavList.js +113 -0
  94. package/dist/components/NavList/NavList.js.map +1 -0
  95. package/dist/components/NavList/NavList.mjs +111 -0
  96. package/dist/components/NavList/NavList.mjs.map +1 -0
  97. package/dist/components/NavList/NavList.styles.d.ts +90 -0
  98. package/dist/components/NavList/NavList.styles.d.ts.map +1 -0
  99. package/dist/components/NavList/NavList.styles.js +104 -0
  100. package/dist/components/NavList/NavList.styles.js.map +1 -0
  101. package/dist/components/NavList/NavList.styles.mjs +97 -0
  102. package/dist/components/NavList/NavList.styles.mjs.map +1 -0
  103. package/dist/components/NavList/NavList.translations.json.js +19 -0
  104. package/dist/components/NavList/NavList.translations.json.js.map +1 -0
  105. package/dist/components/NavList/NavList.translations.json.mjs +14 -0
  106. package/dist/components/NavList/NavList.translations.json.mjs.map +1 -0
  107. package/dist/components/NavList/NavList.types.d.ts +140 -0
  108. package/dist/components/NavList/NavList.types.d.ts.map +1 -0
  109. package/dist/components/NavList/NavListContext.d.ts +30 -0
  110. package/dist/components/NavList/NavListContext.d.ts.map +1 -0
  111. package/dist/components/NavList/NavListContext.js +16 -0
  112. package/dist/components/NavList/NavListContext.js.map +1 -0
  113. package/dist/components/NavList/NavListContext.mjs +13 -0
  114. package/dist/components/NavList/NavListContext.mjs.map +1 -0
  115. package/dist/components/NavList/NavListGroup.d.ts +31 -0
  116. package/dist/components/NavList/NavListGroup.d.ts.map +1 -0
  117. package/dist/components/NavList/NavListGroup.js +115 -0
  118. package/dist/components/NavList/NavListGroup.js.map +1 -0
  119. package/dist/components/NavList/NavListGroup.mjs +113 -0
  120. package/dist/components/NavList/NavListGroup.mjs.map +1 -0
  121. package/dist/components/NavList/NavListItem.d.ts +16 -0
  122. package/dist/components/NavList/NavListItem.d.ts.map +1 -0
  123. package/dist/components/NavList/NavListItem.js +284 -0
  124. package/dist/components/NavList/NavListItem.js.map +1 -0
  125. package/dist/components/NavList/NavListItem.mjs +282 -0
  126. package/dist/components/NavList/NavListItem.mjs.map +1 -0
  127. package/dist/components/NavList/NavListSkeleton.d.ts +17 -0
  128. package/dist/components/NavList/NavListSkeleton.d.ts.map +1 -0
  129. package/dist/components/NavList/NavListSkeleton.js +33 -0
  130. package/dist/components/NavList/NavListSkeleton.js.map +1 -0
  131. package/dist/components/NavList/NavListSkeleton.mjs +31 -0
  132. package/dist/components/NavList/NavListSkeleton.mjs.map +1 -0
  133. package/dist/components/NavList/index.d.ts +7 -0
  134. package/dist/components/NavList/index.d.ts.map +1 -0
  135. package/dist/components/Pagination/Pagination.d.ts +11 -10
  136. package/dist/components/Pagination/Pagination.d.ts.map +1 -1
  137. package/dist/components/Pagination/Pagination.js +11 -10
  138. package/dist/components/Pagination/Pagination.js.map +1 -1
  139. package/dist/components/Pagination/Pagination.mjs +11 -10
  140. package/dist/components/Pagination/Pagination.mjs.map +1 -1
  141. package/dist/components/ProgressBar/ProgressBar.types.d.ts +9 -0
  142. package/dist/components/ProgressBar/ProgressBar.types.d.ts.map +1 -1
  143. package/dist/components/RadialProgress/RadialProgress.types.d.ts +21 -1
  144. package/dist/components/RadialProgress/RadialProgress.types.d.ts.map +1 -1
  145. package/dist/components/SeeMoreButton/SeeMoreButton.types.d.ts +8 -0
  146. package/dist/components/SeeMoreButton/SeeMoreButton.types.d.ts.map +1 -1
  147. package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  148. package/dist/components/SegmentedControl/SegmentedControl.js +6 -7
  149. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  150. package/dist/components/SegmentedControl/SegmentedControl.mjs +6 -7
  151. package/dist/components/SegmentedControl/SegmentedControl.mjs.map +1 -1
  152. package/dist/components/SegmentedProgressBar/SegmentedProgressBar.types.d.ts +2 -0
  153. package/dist/components/SegmentedProgressBar/SegmentedProgressBar.types.d.ts.map +1 -1
  154. package/dist/components/Select/Combobox.d.ts +1 -1
  155. package/dist/components/Select/Combobox.d.ts.map +1 -1
  156. package/dist/components/Select/Combobox.js +9 -2
  157. package/dist/components/Select/Combobox.js.map +1 -1
  158. package/dist/components/Select/Combobox.mjs +10 -3
  159. package/dist/components/Select/Combobox.mjs.map +1 -1
  160. package/dist/components/Select/Select.d.ts +1 -1
  161. package/dist/components/Select/Select.d.ts.map +1 -1
  162. package/dist/components/Select/Select.js +14 -2
  163. package/dist/components/Select/Select.js.map +1 -1
  164. package/dist/components/Select/Select.mjs +15 -3
  165. package/dist/components/Select/Select.mjs.map +1 -1
  166. package/dist/components/Select/Select.styles.d.ts +97 -1
  167. package/dist/components/Select/Select.styles.d.ts.map +1 -1
  168. package/dist/components/Select/Select.styles.js +83 -0
  169. package/dist/components/Select/Select.styles.js.map +1 -1
  170. package/dist/components/Select/Select.styles.mjs +82 -1
  171. package/dist/components/Select/Select.styles.mjs.map +1 -1
  172. package/dist/components/Tabs/Tab/Tab.styles.d.ts +1 -1
  173. package/dist/components/Tabs/Tab/Tab.styles.js +1 -1
  174. package/dist/components/Tabs/Tab/Tab.styles.mjs +1 -1
  175. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  176. package/dist/components/Textarea/Textarea.js +4 -0
  177. package/dist/components/Textarea/Textarea.js.map +1 -1
  178. package/dist/components/Textarea/Textarea.mjs +4 -0
  179. package/dist/components/Textarea/Textarea.mjs.map +1 -1
  180. package/dist/components/Toast/Toast.styles.d.ts +6 -2
  181. package/dist/components/Toast/Toast.styles.d.ts.map +1 -1
  182. package/dist/components/Toast/Toast.styles.js +18 -10
  183. package/dist/components/Toast/Toast.styles.js.map +1 -1
  184. package/dist/components/Toast/Toast.styles.mjs +18 -10
  185. package/dist/components/Toast/Toast.styles.mjs.map +1 -1
  186. package/dist/components/Typography/Caption.d.ts.map +1 -1
  187. package/dist/components/Typography/Caption.js +1 -1
  188. package/dist/components/Typography/Caption.js.map +1 -1
  189. package/dist/components/Typography/Caption.mjs +1 -1
  190. package/dist/components/Typography/Caption.mjs.map +1 -1
  191. package/dist/components/Typography/H1.d.ts.map +1 -1
  192. package/dist/components/Typography/H1.js +1 -1
  193. package/dist/components/Typography/H1.js.map +1 -1
  194. package/dist/components/Typography/H1.mjs +1 -1
  195. package/dist/components/Typography/H1.mjs.map +1 -1
  196. package/dist/components/Typography/H2.d.ts.map +1 -1
  197. package/dist/components/Typography/H2.js +1 -1
  198. package/dist/components/Typography/H2.js.map +1 -1
  199. package/dist/components/Typography/H2.mjs +1 -1
  200. package/dist/components/Typography/H2.mjs.map +1 -1
  201. package/dist/components/Typography/H3.d.ts.map +1 -1
  202. package/dist/components/Typography/H3.js +1 -1
  203. package/dist/components/Typography/H3.js.map +1 -1
  204. package/dist/components/Typography/H3.mjs +1 -1
  205. package/dist/components/Typography/H3.mjs.map +1 -1
  206. package/dist/components/Typography/H4.d.ts.map +1 -1
  207. package/dist/components/Typography/H4.js +1 -1
  208. package/dist/components/Typography/H4.js.map +1 -1
  209. package/dist/components/Typography/H4.mjs +1 -1
  210. package/dist/components/Typography/H4.mjs.map +1 -1
  211. package/dist/components/Typography/H5.d.ts.map +1 -1
  212. package/dist/components/Typography/H5.js +1 -1
  213. package/dist/components/Typography/H5.js.map +1 -1
  214. package/dist/components/Typography/H5.mjs +1 -1
  215. package/dist/components/Typography/H5.mjs.map +1 -1
  216. package/dist/components/Typography/Link.d.ts.map +1 -1
  217. package/dist/components/Typography/Link.js +1 -1
  218. package/dist/components/Typography/Link.js.map +1 -1
  219. package/dist/components/Typography/Link.mjs +1 -1
  220. package/dist/components/Typography/Link.mjs.map +1 -1
  221. package/dist/components/Typography/Overline.d.ts.map +1 -1
  222. package/dist/components/Typography/Overline.js +1 -1
  223. package/dist/components/Typography/Overline.js.map +1 -1
  224. package/dist/components/Typography/Overline.mjs +1 -1
  225. package/dist/components/Typography/Overline.mjs.map +1 -1
  226. package/dist/components/Typography/Subtext.d.ts.map +1 -1
  227. package/dist/components/Typography/Subtext.js +1 -1
  228. package/dist/components/Typography/Subtext.js.map +1 -1
  229. package/dist/components/Typography/Subtext.mjs +1 -1
  230. package/dist/components/Typography/Subtext.mjs.map +1 -1
  231. package/dist/components/Typography/Subtitle.d.ts.map +1 -1
  232. package/dist/components/Typography/Subtitle.js +1 -1
  233. package/dist/components/Typography/Subtitle.js.map +1 -1
  234. package/dist/components/Typography/Subtitle.mjs +1 -1
  235. package/dist/components/Typography/Subtitle.mjs.map +1 -1
  236. package/dist/components/Typography/Text.d.ts.map +1 -1
  237. package/dist/components/Typography/Text.js +1 -1
  238. package/dist/components/Typography/Text.js.map +1 -1
  239. package/dist/components/Typography/Text.mjs +1 -1
  240. package/dist/components/Typography/Text.mjs.map +1 -1
  241. package/dist/hooks/useLanguage.d.ts +5 -0
  242. package/dist/hooks/useLanguage.d.ts.map +1 -1
  243. package/dist/hooks/useLanguage.js +7 -3
  244. package/dist/hooks/useLanguage.js.map +1 -1
  245. package/dist/hooks/useLanguage.mjs +7 -4
  246. package/dist/hooks/useLanguage.mjs.map +1 -1
  247. package/dist/hooks/useTranslate.d.ts.map +1 -1
  248. package/dist/hooks/useTranslate.js +8 -5
  249. package/dist/hooks/useTranslate.js.map +1 -1
  250. package/dist/hooks/useTranslate.mjs +8 -5
  251. package/dist/hooks/useTranslate.mjs.map +1 -1
  252. package/dist/index.d.ts +2 -1
  253. package/dist/index.d.ts.map +1 -1
  254. package/dist/index.js +13 -0
  255. package/dist/index.js.map +1 -1
  256. package/dist/index.mjs +7 -2
  257. package/dist/index.mjs.map +1 -1
  258. package/dist/theme/colors.d.ts +2 -2
  259. package/dist/theme/colors.d.ts.map +1 -1
  260. package/dist/theme/colors.js +54 -18
  261. package/dist/theme/colors.js.map +1 -1
  262. package/dist/theme/colors.mjs +55 -19
  263. package/dist/theme/colors.mjs.map +1 -1
  264. package/dist/theme/global.d.ts.map +1 -1
  265. package/dist/theme/global.js +19 -1
  266. package/dist/theme/global.js.map +1 -1
  267. package/dist/theme/global.mjs +19 -1
  268. package/dist/theme/global.mjs.map +1 -1
  269. package/dist/theme/index.d.ts.map +1 -1
  270. package/dist/theme/index.js +2 -0
  271. package/dist/theme/index.js.map +1 -1
  272. package/dist/theme/index.mjs +2 -0
  273. package/dist/theme/index.mjs.map +1 -1
  274. package/dist/theme/palette.generated.d.ts +232 -123
  275. package/dist/theme/palette.generated.d.ts.map +1 -1
  276. package/dist/theme/palette.generated.js +233 -123
  277. package/dist/theme/palette.generated.js.map +1 -1
  278. package/dist/theme/palette.generated.mjs +233 -124
  279. package/dist/theme/palette.generated.mjs.map +1 -1
  280. package/dist/theme/paletteSwatches.d.ts +20 -0
  281. package/dist/theme/paletteSwatches.d.ts.map +1 -1
  282. package/dist/theme/recipes/avatar.d.ts +30 -0
  283. package/dist/theme/recipes/avatar.d.ts.map +1 -0
  284. package/dist/theme/recipes/avatar.js +96 -0
  285. package/dist/theme/recipes/avatar.js.map +1 -0
  286. package/dist/theme/recipes/avatar.mjs +94 -0
  287. package/dist/theme/recipes/avatar.mjs.map +1 -0
  288. package/dist/translations/Defaults.translations.json.js +19 -1
  289. package/dist/translations/Defaults.translations.json.js.map +1 -1
  290. package/dist/translations/Defaults.translations.json.mjs +18 -2
  291. package/dist/translations/Defaults.translations.json.mjs.map +1 -1
  292. package/dist/utils/disabledControl.d.ts +8 -1
  293. package/dist/utils/disabledControl.d.ts.map +1 -1
  294. package/dist/utils/disabledControl.js +8 -1
  295. package/dist/utils/disabledControl.js.map +1 -1
  296. package/dist/utils/disabledControl.mjs +8 -1
  297. package/dist/utils/disabledControl.mjs.map +1 -1
  298. package/dist/utils/focusRing.d.ts +22 -0
  299. package/dist/utils/focusRing.d.ts.map +1 -1
  300. package/dist/utils/focusRing.js +22 -0
  301. package/dist/utils/focusRing.js.map +1 -1
  302. package/dist/utils/focusRing.mjs +21 -1
  303. package/dist/utils/focusRing.mjs.map +1 -1
  304. package/package.json +2 -1
  305. package/src/components/Accordion/Accordion.stories.tsx +85 -0
  306. package/src/components/Accordion/Accordion.usage.mdx +200 -0
  307. package/src/components/Appear/Appear.usage.mdx +107 -0
  308. package/src/components/Avatar/Avatar.recipe.test.tsx +176 -0
  309. package/src/components/Avatar/Avatar.stories.tsx +199 -24
  310. package/src/components/Avatar/Avatar.tsx +118 -21
  311. package/src/components/Avatar/Avatar.usage.mdx +185 -0
  312. package/src/components/Avatar/index.tsx +8 -1
  313. package/src/components/Badge/Badge.stories.tsx +193 -3
  314. package/src/components/Badge/Badge.tsx +5 -3
  315. package/src/components/Badge/Badge.types.ts +7 -5
  316. package/src/components/Badge/Badge.usage.mdx +265 -0
  317. package/src/components/Banner/Banner.stories.tsx +152 -2
  318. package/src/components/Banner/Banner.types.ts +30 -1
  319. package/src/components/Banner/Banner.usage.mdx +233 -0
  320. package/src/components/BottomSheet/BottomSheet.stories.tsx +168 -1
  321. package/src/components/BottomSheet/BottomSheet.test.tsx +2 -1
  322. package/src/components/BottomSheet/BottomSheet.usage.mdx +216 -0
  323. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +59 -0
  324. package/src/components/Breadcrumb/Breadcrumb.usage.mdx +181 -0
  325. package/src/components/Button/Button.focusableWhenDisabled.test.tsx +218 -0
  326. package/src/components/Button/Button.stories.tsx +332 -3
  327. package/src/components/Button/Button.tsx +46 -3
  328. package/src/components/Button/Button.types.ts +38 -1
  329. package/src/components/Button/Button.usage.mdx +358 -0
  330. package/src/components/Button/Button.variants.test.tsx +13 -1
  331. package/src/components/Card/Card.stories.tsx +106 -0
  332. package/src/components/Card/Card.types.ts +12 -0
  333. package/src/components/Card/Card.usage.mdx +216 -0
  334. package/src/components/Checkbox/Checkbox.stories.tsx +140 -13
  335. package/src/components/Checkbox/Checkbox.usage.mdx +214 -0
  336. package/src/components/Chip/Chip.usage.mdx +78 -0
  337. package/src/components/Code/Code.stories.tsx +60 -0
  338. package/src/components/Code/Code.test.tsx +116 -0
  339. package/src/components/Code/Code.usage.mdx +187 -0
  340. package/src/components/Code/shikiAdapter.ts +38 -9
  341. package/src/components/CodeTabs/CodeTabs.stories.tsx +53 -0
  342. package/src/components/CodeTabs/CodeTabs.styles.ts +6 -5
  343. package/src/components/CodeTabs/CodeTabs.usage.mdx +176 -0
  344. package/src/components/Collapsible/Collapsible.stories.tsx +58 -0
  345. package/src/components/Collapsible/Collapsible.usage.mdx +173 -0
  346. package/src/components/ColorMode/ColorMode.stories.tsx +50 -0
  347. package/src/components/ColorMode/ColorMode.usage.mdx +135 -0
  348. package/src/components/ColorMode/ColorModeToggle.tsx +10 -3
  349. package/src/components/Confetti/Confetti.types.ts +5 -1
  350. package/src/components/Confetti/Confetti.usage.mdx +111 -0
  351. package/src/components/Confetti/confettiColors.ts +5 -5
  352. package/src/components/Container/Container.stories.tsx +32 -0
  353. package/src/components/Container/Container.usage.mdx +130 -0
  354. package/src/components/CopyableCode/CopyableCode.stories.tsx +62 -0
  355. package/src/components/CopyableCode/CopyableCode.usage.mdx +168 -0
  356. package/src/components/CountBadge/CountBadge.stories.tsx +69 -0
  357. package/src/components/CountBadge/CountBadge.usage.mdx +215 -0
  358. package/src/components/CountUp/CountUp.usage.mdx +107 -0
  359. package/src/components/DatePicker/DatePicker.usage.mdx +177 -0
  360. package/src/components/DatePicker/RangeDatePicker.stories.tsx +87 -3
  361. package/src/components/ErrorFallback/ErrorFallback.types.ts +6 -0
  362. package/src/components/ErrorFallback/ErrorFallback.usage.mdx +127 -0
  363. package/src/components/ExpandableText/ExpandableText.stories.tsx +55 -0
  364. package/src/components/ExpandableText/ExpandableText.usage.mdx +176 -0
  365. package/src/components/FileInput/FileInput.stories.tsx +38 -1
  366. package/src/components/FileInput/FileInput.usage.mdx +178 -0
  367. package/src/components/FileItem/FileItem.stories.tsx +71 -0
  368. package/src/components/FileItem/FileItem.usage.mdx +180 -0
  369. package/src/components/FileList/FileList.stories.tsx +25 -0
  370. package/src/components/FileList/FileList.usage.mdx +165 -0
  371. package/src/components/FlyTo/FlyTo.usage.mdx +99 -0
  372. package/src/components/Form/Form.stories.tsx +149 -0
  373. package/src/components/Form/Form.usage.mdx +203 -0
  374. package/src/components/Form/FormModalFooter/FormModalFooter.stories.tsx +1 -1
  375. package/src/components/Form/FormModalFooter/FormModalFooter.test.tsx +19 -1
  376. package/src/components/Form/FormModalFooter/FormModalFooter.tsx +2 -0
  377. package/src/components/Form/FormModalFooter/FormModalFooter.types.ts +11 -1
  378. package/src/components/FormControl/FormControl.stories.tsx +35 -0
  379. package/src/components/FormControl/FormControl.usage.mdx +128 -0
  380. package/src/components/FormIntegration/FormIntegration.usage.mdx +158 -0
  381. package/src/components/FormLabel/FormLabel.stories.tsx +71 -0
  382. package/src/components/FormLabel/FormLabel.usage.mdx +125 -0
  383. package/src/components/Icon/Icon.stories.tsx +61 -1
  384. package/src/components/Icon/Icon.usage.mdx +158 -0
  385. package/src/components/IconButton/IconButton.stories.tsx +213 -5
  386. package/src/components/IconButton/IconButton.usage.mdx +275 -0
  387. package/src/components/InfoSprinkle/InfoSprinkle.stories.tsx +77 -1
  388. package/src/components/InfoSprinkle/InfoSprinkle.usage.mdx +189 -0
  389. package/src/components/InlineCode/InlineCode.stories.tsx +75 -0
  390. package/src/components/InlineCode/InlineCode.usage.mdx +142 -0
  391. package/src/components/Input/Input.stories.tsx +180 -0
  392. package/src/components/Input/Input.tsx +4 -0
  393. package/src/components/Input/Input.usage.mdx +278 -0
  394. package/src/components/LineGraph/LineGraph.stories.tsx +112 -0
  395. package/src/components/LineGraph/LineGraph.tsx +4 -5
  396. package/src/components/LineGraph/LineGraph.types.ts +12 -2
  397. package/src/components/LineGraph/LineGraph.usage.mdx +186 -0
  398. package/src/components/LineGraph/seriesColors.test.ts +10 -9
  399. package/src/components/LineGraph/seriesColors.ts +18 -16
  400. package/src/components/Loaders/Loaders.stories.tsx +93 -0
  401. package/src/components/Loaders/Loaders.usage.mdx +180 -0
  402. package/src/components/LogicianProvider/LogicianProvider.usage.mdx +98 -0
  403. package/src/components/Markdown/Markdown.stories.tsx +53 -0
  404. package/src/components/Markdown/Markdown.usage.mdx +182 -0
  405. package/src/components/Masonry/Masonry.stories.tsx +63 -1
  406. package/src/components/Masonry/Masonry.types.ts +8 -3
  407. package/src/components/Masonry/Masonry.usage.mdx +142 -0
  408. package/src/components/MaxLengthIndicator/MaxLengthIndicator.stories.tsx +57 -0
  409. package/src/components/MaxLengthIndicator/MaxLengthIndicator.usage.mdx +125 -0
  410. package/src/components/Menu/Menu.stories.tsx +146 -2
  411. package/src/components/Menu/Menu.usage.mdx +238 -0
  412. package/src/components/Menu/MenuItem.types.ts +8 -0
  413. package/src/components/Modal/Modal.stories.tsx +177 -1
  414. package/src/components/Modal/Modal.usage.mdx +262 -0
  415. package/src/components/Modal/ModalCloseButton.tsx +1 -1
  416. package/src/components/MonthPicker/MonthPicker.stories.tsx +30 -0
  417. package/src/components/MonthPicker/MonthPicker.usage.mdx +191 -0
  418. package/src/components/NavList/NavList.stories.tsx +927 -0
  419. package/src/components/NavList/NavList.styles.ts +114 -0
  420. package/src/components/NavList/NavList.test.tsx +1306 -0
  421. package/src/components/NavList/NavList.translations.json +9 -0
  422. package/src/components/NavList/NavList.tsx +160 -0
  423. package/src/components/NavList/NavList.types.ts +155 -0
  424. package/src/components/NavList/NavList.usage.mdx +545 -0
  425. package/src/components/NavList/NavListContext.ts +25 -0
  426. package/src/components/NavList/NavListGroup.tsx +243 -0
  427. package/src/components/NavList/NavListItem.tsx +543 -0
  428. package/src/components/NavList/NavListSkeleton.tsx +57 -0
  429. package/src/components/NavList/index.ts +15 -0
  430. package/src/components/Pagination/Pagination.stories.tsx +90 -1
  431. package/src/components/Pagination/Pagination.tsx +11 -10
  432. package/src/components/Pagination/Pagination.usage.mdx +186 -0
  433. package/src/components/PasswordInput/PasswordInput.stories.tsx +51 -0
  434. package/src/components/PasswordInput/PasswordInput.usage.mdx +193 -0
  435. package/src/components/PinInput/PinInput.stories.tsx +91 -0
  436. package/src/components/PinInput/PinInput.usage.mdx +194 -0
  437. package/src/components/Popover/Popover.stories.tsx +104 -1
  438. package/src/components/Popover/Popover.usage.mdx +197 -0
  439. package/src/components/ProgressBar/ProgressBar.stories.tsx +92 -1
  440. package/src/components/ProgressBar/ProgressBar.types.ts +9 -0
  441. package/src/components/ProgressBar/ProgressBar.usage.mdx +210 -0
  442. package/src/components/Pulse/Pulse.usage.mdx +102 -0
  443. package/src/components/RadialProgress/RadialProgress.stories.tsx +74 -1
  444. package/src/components/RadialProgress/RadialProgress.types.ts +21 -1
  445. package/src/components/RadialProgress/RadialProgress.usage.mdx +153 -0
  446. package/src/components/Radio/Radio.stories.tsx +119 -0
  447. package/src/components/Radio/Radio.usage.mdx +187 -0
  448. package/src/components/Reveal/Reveal.usage.mdx +105 -0
  449. package/src/components/ScaledContext/ScaledContext.usage.mdx +111 -0
  450. package/src/components/SeeMoreButton/SeeMoreButton.stories.tsx +146 -2
  451. package/src/components/SeeMoreButton/SeeMoreButton.types.ts +8 -0
  452. package/src/components/SeeMoreButton/SeeMoreButton.usage.mdx +213 -0
  453. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +69 -0
  454. package/src/components/SegmentedControl/SegmentedControl.tsx +6 -7
  455. package/src/components/SegmentedControl/SegmentedControl.usage.mdx +209 -0
  456. package/src/components/SegmentedProgressBar/SegmentedProgressBar.stories.tsx +54 -0
  457. package/src/components/SegmentedProgressBar/SegmentedProgressBar.types.ts +2 -0
  458. package/src/components/SegmentedProgressBar/SegmentedProgressBar.usage.mdx +145 -0
  459. package/src/components/Select/Combobox.tsx +28 -3
  460. package/src/components/Select/Select.clearTrigger.test.tsx +76 -0
  461. package/src/components/Select/Select.stories.tsx +290 -1
  462. package/src/components/Select/Select.styles.ts +89 -0
  463. package/src/components/Select/Select.tsx +28 -2
  464. package/src/components/Select/Select.usage.mdx +341 -0
  465. package/src/components/Shake/Shake.usage.mdx +107 -0
  466. package/src/components/Slider/Slider.stories.tsx +116 -0
  467. package/src/components/Slider/Slider.usage.mdx +179 -0
  468. package/src/components/Spinner/Spinner.stories.tsx +64 -0
  469. package/src/components/Spinner/Spinner.usage.mdx +136 -0
  470. package/src/components/SwapTransition/SwapTransition.usage.mdx +102 -0
  471. package/src/components/Switch/Switch.stories.tsx +131 -6
  472. package/src/components/Switch/Switch.usage.mdx +199 -0
  473. package/src/components/Table/Table.stories.tsx +159 -1
  474. package/src/components/Table/Table.usage.mdx +235 -0
  475. package/src/components/Tabs/Tab/Tab.styles.ts +1 -1
  476. package/src/components/Tabs/Tabs.stories.tsx +86 -0
  477. package/src/components/Tabs/Tabs.usage.mdx +263 -0
  478. package/src/components/Tag/Tag.stories.tsx +181 -4
  479. package/src/components/Tag/Tag.usage.mdx +257 -0
  480. package/src/components/Textarea/Textarea.stories.tsx +113 -0
  481. package/src/components/Textarea/Textarea.tsx +4 -0
  482. package/src/components/Textarea/Textarea.usage.mdx +186 -0
  483. package/src/components/Toast/Toast.stories.tsx +185 -3
  484. package/src/components/Toast/Toast.styles.ts +18 -10
  485. package/src/components/Toast/Toast.usage.mdx +265 -0
  486. package/src/components/Tooltip/Tooltip.stories.tsx +86 -1
  487. package/src/components/Tooltip/Tooltip.usage.mdx +219 -0
  488. package/src/components/Tree/Tree.stories.tsx +89 -0
  489. package/src/components/Tree/Tree.usage.mdx +207 -0
  490. package/src/components/Typography/Caption.tsx +0 -1
  491. package/src/components/Typography/H1.tsx +0 -1
  492. package/src/components/Typography/H2.tsx +0 -1
  493. package/src/components/Typography/H3.tsx +0 -1
  494. package/src/components/Typography/H4.tsx +0 -1
  495. package/src/components/Typography/H5.tsx +0 -1
  496. package/src/components/Typography/Link.tsx +0 -1
  497. package/src/components/Typography/Overline.tsx +0 -1
  498. package/src/components/Typography/Subtext.tsx +0 -1
  499. package/src/components/Typography/Subtitle.tsx +0 -1
  500. package/src/components/Typography/Text.tsx +0 -1
  501. package/src/components/Typography/Typography.stories.tsx +117 -0
  502. package/src/components/Typography/Typography.usage.mdx +257 -0
  503. package/src/components/Workflow/Workflow.usage.mdx +199 -0
  504. package/src/components/a11y.kwcag.test.tsx +66 -0
  505. package/src/components/claude.md +1 -1
  506. package/src/components/noRawScales.test.ts +5 -1
  507. package/src/foundations/BrandAssets.mdx +637 -0
  508. package/src/foundations/BrandAssets.stories.tsx +680 -0
  509. package/src/foundations/BrandColour.mdx +366 -0
  510. package/src/foundations/BrandColour.stories.tsx +343 -0
  511. package/src/guidelines/ComponentPageTemplate.mdx +84 -0
  512. package/src/guidelines/FeedbackActions.mdx +162 -23
  513. package/src/guidelines/_components/Lang.tsx +175 -0
  514. package/src/guidelines/_components/TokenTable.tsx +136 -0
  515. package/src/hooks/useLanguage.ts +8 -3
  516. package/src/hooks/useTranslate.test.tsx +46 -0
  517. package/src/hooks/useTranslate.ts +7 -5
  518. package/src/index.ts +7 -1
  519. package/src/theme/BazePalette.stories.tsx +111 -1
  520. package/src/theme/Palette.stories.tsx +2 -2
  521. package/src/theme/SemanticTokens.mdx +76 -17
  522. package/src/theme/claude.md +23 -9
  523. package/src/theme/colors.ts +71 -18
  524. package/src/theme/contrast.test.ts +57 -0
  525. package/src/theme/global.ts +20 -1
  526. package/src/theme/index.ts +2 -0
  527. package/src/theme/palette.generated.ts +233 -123
  528. package/src/theme/paletteSwatches.test.ts +1 -1
  529. package/src/theme/paletteSwatches.ts +35 -0
  530. package/src/theme/recipes/avatar.ts +92 -0
  531. package/src/translations/Defaults.translations.json +14 -0
  532. package/src/utils/disabledControl.ts +8 -1
  533. package/src/utils/focusRing.ts +23 -0
@@ -0,0 +1,78 @@
1
+ import { Canvas, Meta } from '@storybook/blocks';
2
+
3
+ import { En, Ko, LangToggle } from '../../guidelines/_components/Lang';
4
+ import * as ChipStories from './Chip.stories';
5
+
6
+ <Meta of={ChipStories} name="Usage" />
7
+
8
+ <LangToggle />
9
+
10
+ <En>
11
+
12
+ # Chip (deprecated)
13
+
14
+ **Use `Tag`.** Since 5.0 `Chip` is a thin alias of `Tag` and it is removed in
15
+ 6.0. It still renders so that unmigrated screens do not break, keeps the 4.x
16
+ pill shape so they do not shift, and warns once per `colorScheme` × `variant`
17
+ pair in development.
18
+
19
+ Everything about when and how to use it is on **Components/Tag/Usage**.
20
+
21
+ ## Migrating
22
+
23
+ | 4.x `colorScheme` | 4.x `variant` | Renders as | Write instead |
24
+ | --- | --- | --- | --- |
25
+ | `primary` (default), `secondary`, `neutral` | `soft` (default) or `outline` | neutral | `<Tag>` |
26
+ | `primary`, `secondary`, `neutral` | `solid` | the selected look | `<Tag as="button" selected={…}>` for a filter chip |
27
+ | `danger`, `success`, `warning` | `soft` | that tone | `<Tag tone="…">`, or `Badge` if it is a status |
28
+ | `danger`, `success`, `warning` | `solid` | that tone (5.0 has no solid status fill) | Choose by hand |
29
+ | `danger`, `success`, `warning` | `outline` | neutral | Choose by hand |
30
+
31
+ "Choose by hand" pairs say so in the dev warning. A `solid` Chip gets the
32
+ selected *look* only: it does not become a toggle and has no `aria-pressed`
33
+ unless you pass `selected` yourself.
34
+
35
+ Two things change when you swap `Chip` for `Tag`:
36
+
37
+ - **Shape.** Tag uses the `md` radius and tighter padding. Chip's 32px pill
38
+ exists only for unmigrated screens.
39
+ - **Interactivity.** If the chip was clickable, render the Tag `as="button"`
40
+ so it is keyboard-operable (WCAG 2.1.1).
41
+
42
+ </En>
43
+
44
+ <Ko>
45
+
46
+ # Chip (지원 중단)
47
+
48
+ **`Tag`를 씁니다.** 5.0부터 `Chip`은 `Tag`의 얇은 별칭이며 6.0에서 사라집니다.
49
+ 아직 옮기지 않은 화면이 깨지지 않도록 계속 그려지고, 화면이 밀리지 않도록 4.x의
50
+ 알약 모양을 유지하며, 개발 환경에서 `colorScheme` × `variant` 조합마다 한 번씩 경고를
51
+ 냅니다.
52
+
53
+ 언제, 어떻게 쓰는지는 모두 **Components/Tag/Usage**에 있습니다.
54
+
55
+ ## 옮기는 방법
56
+
57
+ | 4.x `colorScheme` | 4.x `variant` | 지금 그려지는 모양 | 바꿔 쓸 코드 |
58
+ | --- | --- | --- | --- |
59
+ | `primary`(기본), `secondary`, `neutral` | `soft`(기본) 또는 `outline` | neutral | `<Tag>` |
60
+ | `primary`, `secondary`, `neutral` | `solid` | 선택된 모양 | 필터 칩이라면 `<Tag as="button" selected={…}>` |
61
+ | `danger`, `success`, `warning` | `soft` | 해당 tone | `<Tag tone="…">`, 상태라면 `Badge` |
62
+ | `danger`, `success`, `warning` | `solid` | 해당 tone(5.0에는 진한 상태 바탕이 없음) | 직접 고릅니다 |
63
+ | `danger`, `success`, `warning` | `outline` | neutral | 직접 고릅니다 |
64
+
65
+ "직접 고릅니다"에 해당하는 조합은 개발 경고에도 그렇게 나옵니다. `solid` Chip은
66
+ 선택된 *모양*만 얻습니다. `selected`를 직접 넘기지 않는 한 토글이 되지 않고
67
+ `aria-pressed`도 붙지 않습니다.
68
+
69
+ `Chip`을 `Tag`로 바꾸면 두 가지가 달라집니다.
70
+
71
+ - **모양.** Tag는 `md` 모서리와 더 좁은 여백을 씁니다. Chip의 32px 알약 모양은 아직
72
+ 옮기지 않은 화면을 위해서만 남아 있습니다.
73
+ - **누를 수 있는지.** 누를 수 있던 칩이라면 Tag를 `as="button"`으로 그려야 키보드로도
74
+ 쓸 수 있습니다(WCAG 2.1.1).
75
+
76
+ </Ko>
77
+
78
+ <Canvas of={ChipStories.LegacyMapping} />
@@ -1,5 +1,8 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
2
 
3
+ import { T } from '../../guidelines/_components/Lang';
4
+ import { TokenTable } from '../../guidelines/_components/TokenTable';
5
+ import { Text } from '../Typography';
3
6
  import { Code } from './Code';
4
7
  import { BUNDLED_LANGUAGES } from './shikiAdapter';
5
8
 
@@ -211,3 +214,60 @@ export const CustomContainer: Story = {
211
214
  };`,
212
215
  },
213
216
  };
217
+
218
+ // ───────────────────────── Usage-page specimens ─────────────────────────
219
+ // Pulled into `Code.usage.mdx` with <Canvas of={…} />. Hidden from the
220
+ // sidebar (`!dev`); `tags` is written out on each story because the indexer
221
+ // reads CSF statically.
222
+
223
+ export const DoLanguageAndCopy: Story = {
224
+ tags: ['!dev'],
225
+ parameters: { layout: 'padded' },
226
+ name: 'Usage / Do: a language and a copy button for a snippet',
227
+ args: {
228
+ language: 'bash',
229
+ onCopy: () => {},
230
+ children: `curl https://api.example.com/v1/chat/completions \\
231
+ -H "Authorization: Bearer $API_KEY" \\
232
+ -d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "안녕"}]}'`,
233
+ },
234
+ };
235
+
236
+ export const DontBlockForIdentifier: Story = {
237
+ tags: ['!dev'],
238
+ parameters: { layout: 'padded' },
239
+ name: "Usage / Don't: a block for one word in a sentence",
240
+ render: () => (
241
+ <>
242
+ <Text mb={2}>요청 본문의 모델 이름 칸에는</Text>
243
+ <Code>model</Code>
244
+ <Text mt={2}>을 넣습니다.</Text>
245
+ </>
246
+ ),
247
+ };
248
+
249
+ export const UsageTokens: Story = {
250
+ tags: ['!dev'],
251
+ parameters: { layout: 'padded' },
252
+ name: 'Usage / Tokens',
253
+ render: () => (
254
+ <TokenTable
255
+ rows={[
256
+ { token: 'border.default', use: <T en="Border" ko="테두리" /> },
257
+ {
258
+ token: 'bg.surface',
259
+ use: <T en="Header background" ko="머리 영역 배경" />,
260
+ },
261
+ {
262
+ token: 'fg.default',
263
+ use: <T en="Language title" ko="언어 이름" />,
264
+ },
265
+ { token: 'fg.muted', use: <T en="Copy icon" ko="복사 아이콘" /> },
266
+ {
267
+ token: 'success.fg',
268
+ use: <T en="Copied check" ko="복사 완료 표시" />,
269
+ },
270
+ ]}
271
+ />
272
+ ),
273
+ };
@@ -0,0 +1,116 @@
1
+ import { ChakraProvider } from '@chakra-ui/react';
2
+ import { render, waitFor } from '@testing-library/react';
3
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
4
+
5
+ import { system } from '../../theme';
6
+
7
+ const shiki = vi.hoisted(() => ({
8
+ createHighlighter: vi.fn(),
9
+ dispose: vi.fn(),
10
+ }));
11
+
12
+ // The real Shiki compiles grammars through WASM, which is slow in jsdom and
13
+ // not what these tests are about. The fake marks highlighted output with a
14
+ // class so a test can tell highlighted text from the plain-text fallback.
15
+ vi.mock('shiki', () => ({
16
+ createHighlighter: shiki.createHighlighter,
17
+ }));
18
+
19
+ const fakeHighlighter = {
20
+ codeToHtml: (code: string) =>
21
+ `<pre><code><span class="test-highlighted">${code}</span></code></pre>`,
22
+ dispose: shiki.dispose,
23
+ };
24
+
25
+ // shikiAdapter caches the highlighter at module level. Re-import Code per test
26
+ // so each one starts with an empty cache.
27
+ const loadCode = async () => (await import('./Code')).Code;
28
+
29
+ const wrap = (ui: React.ReactNode) =>
30
+ render(<ChakraProvider value={system}>{ui}</ChakraProvider>);
31
+
32
+ beforeEach(() => {
33
+ vi.resetModules();
34
+ shiki.createHighlighter.mockReset();
35
+ shiki.createHighlighter.mockResolvedValue(fakeHighlighter);
36
+ shiki.dispose.mockReset();
37
+ });
38
+
39
+ describe('Code highlighter', () => {
40
+ it('creates one highlighter for many code blocks', async () => {
41
+ const Code = await loadCode();
42
+ const { container } = wrap(
43
+ <>
44
+ {Array.from({ length: 20 }, (_, i) => (
45
+ <Code key={i} language="javascript">{`const n = ${i};`}</Code>
46
+ ))}
47
+ </>
48
+ );
49
+
50
+ await waitFor(() =>
51
+ expect(container.querySelectorAll('.test-highlighted')).toHaveLength(20)
52
+ );
53
+ expect(shiki.createHighlighter).toHaveBeenCalledTimes(1);
54
+ });
55
+
56
+ it('keeps highlighting the other blocks when one block unmounts', async () => {
57
+ const Code = await loadCode();
58
+ const Blocks = ({ showFirst }: { showFirst: boolean }) => (
59
+ <>
60
+ {showFirst && <Code language="javascript">first</Code>}
61
+ <Code language="javascript">second</Code>
62
+ </>
63
+ );
64
+ const { container, rerender } = wrap(<Blocks showFirst />);
65
+ await waitFor(() =>
66
+ expect(container.querySelectorAll('.test-highlighted')).toHaveLength(2)
67
+ );
68
+
69
+ rerender(
70
+ <ChakraProvider value={system}>
71
+ <Blocks showFirst={false} />
72
+ </ChakraProvider>
73
+ );
74
+
75
+ expect(shiki.dispose).not.toHaveBeenCalled();
76
+ expect(container.querySelectorAll('.test-highlighted')).toHaveLength(1);
77
+
78
+ // A block mounted later reuses the same highlighter.
79
+ rerender(
80
+ <ChakraProvider value={system}>
81
+ <Blocks showFirst />
82
+ </ChakraProvider>
83
+ );
84
+ await waitFor(() =>
85
+ expect(container.querySelectorAll('.test-highlighted')).toHaveLength(2)
86
+ );
87
+ expect(shiki.createHighlighter).toHaveBeenCalledTimes(1);
88
+ });
89
+
90
+ it('retries on the next mount when loading fails', async () => {
91
+ const consoleError = vi
92
+ .spyOn(console, 'error')
93
+ .mockImplementation(() => {});
94
+ shiki.createHighlighter.mockRejectedValueOnce(new Error('load failed'));
95
+ const Code = await loadCode();
96
+
97
+ const first = wrap(<Code language="javascript">a</Code>);
98
+ await waitFor(() =>
99
+ expect(consoleError).toHaveBeenCalledWith(
100
+ expect.stringContaining('Failed to load the Shiki highlighter'),
101
+ expect.any(Error)
102
+ )
103
+ );
104
+ // The failed block falls back to plain text instead of throwing.
105
+ expect(first.container).toHaveTextContent('a');
106
+ expect(first.container.querySelector('.test-highlighted')).toBeNull();
107
+ first.unmount();
108
+
109
+ const { container } = wrap(<Code language="javascript">b</Code>);
110
+ await waitFor(() =>
111
+ expect(container.querySelectorAll('.test-highlighted')).toHaveLength(1)
112
+ );
113
+ expect(shiki.createHighlighter).toHaveBeenCalledTimes(2);
114
+ consoleError.mockRestore();
115
+ });
116
+ });
@@ -0,0 +1,187 @@
1
+ import { Canvas, Meta } from '@storybook/blocks';
2
+
3
+ import { En, Ko, LangToggle, Verdict } from '../../guidelines/_components/Lang';
4
+ import * as CodeStories from './Code.stories';
5
+
6
+ <Meta of={CodeStories} name="Usage" />
7
+
8
+ <LangToggle />
9
+
10
+ <En>
11
+
12
+ # Code
13
+
14
+ A syntax-highlighted block of code (Shiki, `github-dark` token colours) with
15
+ an optional language header and copy button. `Markdown` uses it for fenced
16
+ code blocks.
17
+
18
+ ## When to use
19
+
20
+ - A snippet the reader reads or copies: an API request, a config file, raw
21
+ JSON from an audit event.
22
+ - More than one line, or a line too long to sit inside a sentence.
23
+
24
+ ## When not to use
25
+
26
+ - A name or value inside a sentence → `InlineCode`.
27
+ - A single line the user only needs to copy (an endpoint, a key) →
28
+ `CopyableCode`.
29
+ - The same example in several languages → `CodeTabs`.
30
+
31
+ ## Options
32
+
33
+ | Prop | Means |
34
+ | --- | --- |
35
+ | `language` | Highlighting language (`js` is read as `javascript`). With a language, the header shows its name. |
36
+ | `onCopy` | Turns the copy button on. The component writes to the clipboard; `onCopy` receives the copied text for side effects. |
37
+ | `hideHeader` | No header. If `onCopy` is set, the copy button floats in the top-right corner with a 복사 / 복사 완료 tooltip. |
38
+ | `showLineNumbers` | Line numbers in the gutter. |
39
+ | `containerProps` | Props for the CodeBlock root (margins, `maxH`, `className`). |
40
+
41
+ Without `language`, there is no header, and without `onCopy`, no copy button.
42
+
43
+ ## Do / Don't
44
+
45
+ </En>
46
+
47
+ <Ko>
48
+
49
+ # Code
50
+
51
+ 문법 강조(Shiki, `github-dark` 색)가 적용된 코드 블록입니다. 언어 이름이 있는 머리
52
+ 영역과 복사 버튼을 켤 수 있습니다. `Markdown`의 코드 블록도 이 컴포넌트로 그립니다.
53
+
54
+ ## 언제 쓰나요
55
+
56
+ - 읽거나 복사할 코드 조각: API 요청, 설정 파일, 감사 로그 이벤트의 원본 JSON.
57
+ - 두 줄 이상이거나, 문장 안에 넣기에는 너무 긴 한 줄.
58
+
59
+ ## 언제 쓰지 않나요
60
+
61
+ - 문장 안의 이름이나 값은 `InlineCode`를 씁니다.
62
+ - 복사만 하면 되는 한 줄(엔드포인트, 키)은 `CopyableCode`를 씁니다.
63
+ - 같은 예제를 여러 언어로 보여 준다면 `CodeTabs`를 씁니다.
64
+
65
+ ## 옵션
66
+
67
+ | 속성 | 뜻 |
68
+ | --- | --- |
69
+ | `language` | 강조할 언어(`js`는 `javascript`로 읽음). 언어를 주면 머리 영역에 언어 이름이 나옵니다. |
70
+ | `onCopy` | 복사 버튼을 켭니다. 클립보드에는 컴포넌트가 직접 쓰고, `onCopy`는 복사한 글을 받아 부가 작업에 씁니다. |
71
+ | `hideHeader` | 머리 영역을 숨깁니다. `onCopy`가 있으면 복사 버튼이 오른쪽 위에 떠 있고 '복사' / '복사 완료' 툴팁이 붙습니다. |
72
+ | `showLineNumbers` | 줄 번호를 보여 줍니다. |
73
+ | `containerProps` | CodeBlock 루트에 넘길 속성(여백, `maxH`, `className`). |
74
+
75
+ `language`가 없으면 머리 영역이 없고, `onCopy`가 없으면 복사 버튼도 없습니다.
76
+
77
+ ## 이렇게 하세요 / 이렇게 하지 마세요
78
+
79
+ </Ko>
80
+
81
+ <Canvas of={CodeStories.DoLanguageAndCopy} />
82
+ <Verdict
83
+ kind="do"
84
+ en="Set the language and turn on copy for anything the reader will paste into a terminal or file."
85
+ ko="터미널이나 파일에 붙여 넣을 코드에는 언어를 지정하고 복사 버튼을 켭니다."
86
+ />
87
+
88
+ <Canvas of={CodeStories.DontBlockForIdentifier} />
89
+ <Verdict
90
+ kind="dont"
91
+ en="Break a sentence with a block for one word. Use InlineCode inside the sentence."
92
+ ko="한 단어 때문에 블록으로 문장을 끊지 마세요. 문장 안에 InlineCode를 씁니다."
93
+ />
94
+
95
+ <En>
96
+
97
+ ## Content
98
+
99
+ - Show code that runs as pasted. Mark placeholders clearly (`$API_KEY`,
100
+ `<chatbot_id>`) and never show a real secret.
101
+ - Keep examples short; link to full documentation for the rest.
102
+ - Explain the code in the text around it, not in long comments inside it.
103
+
104
+ ## Accessibility
105
+
106
+ What Code does for you:
107
+
108
+ - The code is text, so it can be selected, copied and read by a screen
109
+ reader.
110
+ - The copy buttons are real buttons with names. The floating copy button
111
+ takes its name from the translated 복사 / 복사 완료 and has a focus ring
112
+ (WCAG 4.1.2, 2.4.7).
113
+
114
+ What you still have to do:
115
+
116
+ - The header copy button's name is the fixed English "Copy code". In a
117
+ Korean screen, consider `hideHeader` with `onCopy` (translated name), or
118
+ note it for a follow-up fix.
119
+ - Introduce the block in the text before it, so a screen reader user knows
120
+ what the code is for (WCAG 1.3.1).
121
+ - A long line scrolls sideways inside the block. Keep it readable at 320px
122
+ width by breaking long commands (WCAG 1.4.10).
123
+
124
+ ## Tokens
125
+
126
+ Shiki's `github-dark` paints the code itself; these are the tokens the
127
+ component sets around it.
128
+
129
+ </En>
130
+
131
+ <Ko>
132
+
133
+ ## 문구
134
+
135
+ - 붙여 넣으면 바로 동작하는 코드를 보여 줍니다. 바꿔 넣을 자리는 `$API_KEY`,
136
+ `<chatbot_id>`처럼 분명히 표시하고, 실제 비밀 값은 보여 주지 않습니다.
137
+ - 예제는 짧게 두고, 나머지는 전체 문서로 연결합니다.
138
+ - 설명은 코드 안의 긴 주석이 아니라 코드 앞뒤의 본문에 씁니다.
139
+
140
+ ## 접근성
141
+
142
+ Code가 알아서 하는 일
143
+
144
+ - 코드는 글자이므로 선택하고 복사할 수 있고 화면 낭독기도 읽습니다.
145
+ - 복사 버튼은 이름이 있는 실제 버튼입니다. 떠 있는 복사 버튼은 번역된 '복사' /
146
+ '복사 완료'를 이름으로 쓰고 초점 링이 있습니다(WCAG 4.1.2, 2.4.7).
147
+
148
+ 직접 챙겨야 하는 일
149
+
150
+ - 머리 영역의 복사 버튼 이름은 영어 "Copy code"로 고정되어 있습니다. 한국어 화면에서는
151
+ `hideHeader`와 `onCopy`를 함께 써서 번역된 이름을 쓰는 방법을 검토하거나, 후속 수정
152
+ 거리로 남깁니다.
153
+ - 블록 앞 본문에서 이 코드가 무엇인지 먼저 알려, 화면 낭독기 사용자도 코드의 쓰임을
154
+ 알 수 있게 합니다(WCAG 1.3.1).
155
+ - 긴 줄은 블록 안에서 가로로 스크롤됩니다. 긴 명령은 줄을 나눠 폭 320px에서도 읽을
156
+ 수 있게 합니다(WCAG 1.4.10).
157
+
158
+ ## 토큰
159
+
160
+ 코드 자체의 색은 Shiki의 `github-dark`가 칠합니다. 아래는 컴포넌트가 그 둘레에 쓰는
161
+ 토큰입니다.
162
+
163
+ </Ko>
164
+
165
+ <Canvas of={CodeStories.UsageTokens} sourceState="none" />
166
+
167
+ <En>
168
+
169
+ ## Related
170
+
171
+ - **InlineCode**: code inside a sentence.
172
+ - **CopyableCode**: one line with a copy button.
173
+ - **CodeTabs**: the same example in several languages.
174
+ - **Markdown**: renders fenced code blocks with Code.
175
+
176
+ </En>
177
+
178
+ <Ko>
179
+
180
+ ## 관련 컴포넌트
181
+
182
+ - **InlineCode**: 문장 안의 코드.
183
+ - **CopyableCode**: 복사 버튼이 달린 한 줄.
184
+ - **CodeTabs**: 같은 예제를 여러 언어로.
185
+ - **Markdown**: 코드 블록을 Code로 그립니다.
186
+
187
+ </Ko>
@@ -33,15 +33,44 @@ export const BUNDLED_LANGUAGES: BundledLanguage[] = [
33
33
  'yaml',
34
34
  ];
35
35
 
36
- export const shikiAdapter = createShikiAdapter<
37
- HighlighterGeneric<BundledLanguage, BundledTheme>
38
- >({
39
- async load() {
40
- const { createHighlighter } = await import('shiki');
41
- return createHighlighter({
42
- langs: BUNDLED_LANGUAGES,
43
- themes: ['github-dark'],
36
+ type Highlighter = HighlighterGeneric<BundledLanguage, BundledTheme>;
37
+
38
+ // One highlighter for the whole app. Every <Code> mounts its own
39
+ // AdapterProvider, and Chakra calls `load()` once per provider. Without this
40
+ // cache a chat with 136 code blocks built 136 highlighters, each compiling all
41
+ // BUNDLED_LANGUAGES, and froze the tab for tens of seconds.
42
+ let highlighterPromise: Promise<Highlighter | null> | null = null;
43
+
44
+ const loadHighlighter = (): Promise<Highlighter | null> => {
45
+ highlighterPromise ??= import('shiki')
46
+ .then(({ createHighlighter }) =>
47
+ createHighlighter({
48
+ langs: BUNDLED_LANGUAGES,
49
+ themes: ['github-dark'],
50
+ })
51
+ )
52
+ .catch((error: unknown) => {
53
+ // Chakra does not catch a rejected load, so resolve to null instead: the
54
+ // block renders as plain text. Clear the cache so the next mount retries.
55
+ console.error(
56
+ '[logician-ui] Failed to load the Shiki highlighter',
57
+ error
58
+ );
59
+ highlighterPromise = null;
60
+ return null;
44
61
  });
45
- },
62
+ return highlighterPromise;
63
+ };
64
+
65
+ const baseAdapter = createShikiAdapter<Highlighter | null>({
66
+ load: loadHighlighter,
46
67
  theme: 'github-dark',
47
68
  });
69
+
70
+ // Chakra's default `unloadContext` calls `dispose()` when a provider unmounts.
71
+ // The highlighter is shared, so one block unmounting would break highlighting
72
+ // in every other block. Keep it alive for the life of the page.
73
+ export const shikiAdapter: typeof baseAdapter = {
74
+ ...baseAdapter,
75
+ unloadContext: () => {},
76
+ };
@@ -1,6 +1,9 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
2
 
3
+ import { T } from '../../guidelines/_components/Lang';
4
+ import { TokenTable } from '../../guidelines/_components/TokenTable';
3
5
  import { CodeTabs } from './CodeTabs';
6
+ import { CODE_CHROME } from './CodeTabs.styles';
4
7
 
5
8
  const meta = {
6
9
  title: 'Components/CodeTabs',
@@ -50,3 +53,53 @@ export const WithCopyFunction: Story = {
50
53
  },
51
54
  },
52
55
  };
56
+
57
+ // ───────────────────────── Usage-page specimens ─────────────────────────
58
+ // Pulled into `CodeTabs.usage.mdx` with <Canvas of={…} />. Hidden from the
59
+ // sidebar (`!dev`); `tags` is written out on each story because the indexer
60
+ // reads CSF statically.
61
+
62
+ export const DoSameCallPerLanguage: Story = {
63
+ tags: ['!dev'],
64
+ name: 'Usage / Do: one call, one tab per language',
65
+ args: { code: CODE_SAMPLES, onCopy: () => {} },
66
+ };
67
+
68
+ export const DontStepsAsTabs: Story = {
69
+ tags: ['!dev'],
70
+ name: "Usage / Don't: different steps behind language tabs",
71
+ args: {
72
+ code: {
73
+ bash: 'npm install openai',
74
+ javascript: "const client = new OpenAI({ apiKey: process.env.API_KEY });",
75
+ json: '{ "model": "gpt-4o", "stream": true }',
76
+ },
77
+ },
78
+ };
79
+
80
+ const CHROME_USE = {
81
+ bg: { en: 'Surface (tab bar and code)', ko: '바탕(탭 막대와 코드)' },
82
+ bgHover: { en: 'Tab and copy hover', ko: '탭과 복사 버튼 호버' },
83
+ bgActive: { en: 'Copy pressed', ko: '복사 버튼 누름' },
84
+ fg: {
85
+ en: 'Selected tab; unselected at 70%, divider at 15%',
86
+ ko: '선택된 탭. 선택 안 된 탭은 70%, 구분선은 15%',
87
+ },
88
+ } as const;
89
+
90
+ /** Read from `CODE_CHROME` in `CodeTabs.styles.ts`; alpha variants folded in. */
91
+ export const UsageTokens: Story = {
92
+ tags: ['!dev'],
93
+ name: 'Usage / Tokens',
94
+ args: { code: CODE_SAMPLES },
95
+ render: () => (
96
+ <TokenTable
97
+ rows={(Object.keys(CHROME_USE) as (keyof typeof CHROME_USE)[]).map(
98
+ (role) => ({
99
+ token: CODE_CHROME[role],
100
+ use: <T {...CHROME_USE[role]} />,
101
+ })
102
+ )}
103
+ />
104
+ ),
105
+ };
@@ -4,14 +4,15 @@
4
4
  * The code is highlighted with Shiki's `github-dark`, whose token colours are
5
5
  * written for a dark ground in BOTH app modes, so the surface must stay dark in
6
6
  * both too. `bg.inverse` does not: it is `tooltip.bg`, near-black in light but
7
- * light sand in dark, and the `fg.muted` text on it flipped as well (~1.4:1 in
7
+ * a light warm grey in dark, and the `fg.muted` text on it flipped as well (~1.4:1 in
8
8
  * light, ~1.1:1 in dark).
9
9
  *
10
10
  * `action.*` is the one role pair that is dark in every mode (BAZE ink:
11
- * #252525 light / #38332E dark, `action.fg` 12.5–13.2:1 on it, high contrast
11
+ * #252525 light / #2E2F2F dark, `action.fg` 10.8–13.4:1 on it, high contrast
12
12
  * included), so the chrome reads it. The unselected label is `action.fg` at
13
- * 70% — ≥ 7.0:1 on `action.bg` and ≥ 5.6:1 on `action.bgHover`, both schemes,
14
- * all four modes.
13
+ * 80% — ≥ 7.4:1 on `action.bg` and ≥ 6.7:1 on `action.bgHover`, both schemes,
14
+ * all four modes. (70% fell to 6.1:1 once dark `action.fg` became the
15
+ * off-white body text instead of pure white.)
15
16
  *
16
17
  * Borrowed rather than owned: `action.*` is the Run button's role. A dedicated
17
18
  * `code.*` role family (bg / fg / fgMuted / bgHover) would be the clean home.
@@ -21,6 +22,6 @@ export const CODE_CHROME = {
21
22
  bgHover: 'action.bgHover',
22
23
  bgActive: 'action.bgActive',
23
24
  fg: 'action.fg',
24
- fgMuted: 'action.fg/70',
25
+ fgMuted: 'action.fg/80',
25
26
  divider: 'action.fg/15',
26
27
  } as const;