@mindlogic-ai/logician-ui 5.0.0-alpha.3 → 5.0.0-alpha.4

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 (240) hide show
  1. package/dist/components/Banner/Banner.types.d.ts +24 -1
  2. package/dist/components/Banner/Banner.types.d.ts.map +1 -1
  3. package/dist/components/Card/Card.types.d.ts +12 -0
  4. package/dist/components/Card/Card.types.d.ts.map +1 -1
  5. package/dist/components/ColorMode/ColorModeToggle.d.ts +7 -2
  6. package/dist/components/ColorMode/ColorModeToggle.d.ts.map +1 -1
  7. package/dist/components/ColorMode/ColorModeToggle.js +8 -3
  8. package/dist/components/ColorMode/ColorModeToggle.js.map +1 -1
  9. package/dist/components/ColorMode/ColorModeToggle.mjs +8 -3
  10. package/dist/components/ColorMode/ColorModeToggle.mjs.map +1 -1
  11. package/dist/components/Confetti/Confetti.types.d.ts +5 -1
  12. package/dist/components/Confetti/Confetti.types.d.ts.map +1 -1
  13. package/dist/components/Confetti/confettiColors.d.ts +5 -5
  14. package/dist/components/Confetti/confettiColors.js +5 -5
  15. package/dist/components/Confetti/confettiColors.mjs +5 -5
  16. package/dist/components/ErrorFallback/ErrorFallback.types.d.ts +6 -0
  17. package/dist/components/ErrorFallback/ErrorFallback.types.d.ts.map +1 -1
  18. package/dist/components/Form/FormModalFooter/FormModalFooter.types.d.ts +4 -1
  19. package/dist/components/Form/FormModalFooter/FormModalFooter.types.d.ts.map +1 -1
  20. package/dist/components/LineGraph/LineGraph.d.ts.map +1 -1
  21. package/dist/components/LineGraph/LineGraph.js +4 -5
  22. package/dist/components/LineGraph/LineGraph.js.map +1 -1
  23. package/dist/components/LineGraph/LineGraph.mjs +5 -6
  24. package/dist/components/LineGraph/LineGraph.mjs.map +1 -1
  25. package/dist/components/LineGraph/LineGraph.types.d.ts +12 -2
  26. package/dist/components/LineGraph/LineGraph.types.d.ts.map +1 -1
  27. package/dist/components/LineGraph/seriesColors.d.ts +12 -8
  28. package/dist/components/LineGraph/seriesColors.d.ts.map +1 -1
  29. package/dist/components/LineGraph/seriesColors.js +8 -7
  30. package/dist/components/LineGraph/seriesColors.js.map +1 -1
  31. package/dist/components/LineGraph/seriesColors.mjs +8 -7
  32. package/dist/components/LineGraph/seriesColors.mjs.map +1 -1
  33. package/dist/components/Masonry/Masonry.types.d.ts +8 -3
  34. package/dist/components/Masonry/Masonry.types.d.ts.map +1 -1
  35. package/dist/components/Menu/MenuItem.types.d.ts +8 -0
  36. package/dist/components/Menu/MenuItem.types.d.ts.map +1 -1
  37. package/dist/components/Modal/ModalCloseButton.d.ts +1 -1
  38. package/dist/components/Modal/ModalCloseButton.js +1 -1
  39. package/dist/components/Modal/ModalCloseButton.mjs +1 -1
  40. package/dist/components/Pagination/Pagination.d.ts +11 -10
  41. package/dist/components/Pagination/Pagination.d.ts.map +1 -1
  42. package/dist/components/Pagination/Pagination.js +11 -10
  43. package/dist/components/Pagination/Pagination.js.map +1 -1
  44. package/dist/components/Pagination/Pagination.mjs +11 -10
  45. package/dist/components/Pagination/Pagination.mjs.map +1 -1
  46. package/dist/components/ProgressBar/ProgressBar.types.d.ts +9 -0
  47. package/dist/components/ProgressBar/ProgressBar.types.d.ts.map +1 -1
  48. package/dist/components/RadialProgress/RadialProgress.types.d.ts +21 -1
  49. package/dist/components/RadialProgress/RadialProgress.types.d.ts.map +1 -1
  50. package/dist/components/SeeMoreButton/SeeMoreButton.types.d.ts +8 -0
  51. package/dist/components/SeeMoreButton/SeeMoreButton.types.d.ts.map +1 -1
  52. package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
  53. package/dist/components/SegmentedControl/SegmentedControl.js +6 -7
  54. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  55. package/dist/components/SegmentedControl/SegmentedControl.mjs +6 -7
  56. package/dist/components/SegmentedControl/SegmentedControl.mjs.map +1 -1
  57. package/dist/components/SegmentedProgressBar/SegmentedProgressBar.types.d.ts +2 -0
  58. package/dist/components/SegmentedProgressBar/SegmentedProgressBar.types.d.ts.map +1 -1
  59. package/dist/components/Toast/Toast.styles.d.ts +6 -2
  60. package/dist/components/Toast/Toast.styles.d.ts.map +1 -1
  61. package/dist/components/Toast/Toast.styles.js +18 -10
  62. package/dist/components/Toast/Toast.styles.js.map +1 -1
  63. package/dist/components/Toast/Toast.styles.mjs +18 -10
  64. package/dist/components/Toast/Toast.styles.mjs.map +1 -1
  65. package/dist/theme/colors.d.ts +2 -2
  66. package/dist/theme/colors.d.ts.map +1 -1
  67. package/dist/theme/colors.js +22 -2
  68. package/dist/theme/colors.js.map +1 -1
  69. package/dist/theme/colors.mjs +23 -3
  70. package/dist/theme/colors.mjs.map +1 -1
  71. package/dist/theme/palette.generated.d.ts +98 -0
  72. package/dist/theme/palette.generated.d.ts.map +1 -1
  73. package/dist/theme/palette.generated.js +99 -0
  74. package/dist/theme/palette.generated.js.map +1 -1
  75. package/dist/theme/palette.generated.mjs +99 -1
  76. package/dist/theme/palette.generated.mjs.map +1 -1
  77. package/dist/theme/paletteSwatches.d.ts +20 -0
  78. package/dist/theme/paletteSwatches.d.ts.map +1 -1
  79. package/package.json +1 -1
  80. package/src/components/Accordion/Accordion.stories.tsx +85 -0
  81. package/src/components/Accordion/Accordion.usage.mdx +200 -0
  82. package/src/components/Appear/Appear.usage.mdx +107 -0
  83. package/src/components/Avatar/Avatar.stories.tsx +71 -1
  84. package/src/components/Avatar/Avatar.usage.mdx +166 -0
  85. package/src/components/Banner/Banner.stories.tsx +152 -2
  86. package/src/components/Banner/Banner.types.ts +30 -1
  87. package/src/components/Banner/Banner.usage.mdx +233 -0
  88. package/src/components/BottomSheet/BottomSheet.stories.tsx +168 -1
  89. package/src/components/BottomSheet/BottomSheet.usage.mdx +216 -0
  90. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +59 -0
  91. package/src/components/Breadcrumb/Breadcrumb.usage.mdx +181 -0
  92. package/src/components/Button/Button.stories.tsx +263 -3
  93. package/src/components/Button/Button.usage.mdx +342 -0
  94. package/src/components/Card/Card.stories.tsx +106 -0
  95. package/src/components/Card/Card.types.ts +12 -0
  96. package/src/components/Card/Card.usage.mdx +216 -0
  97. package/src/components/Checkbox/Checkbox.stories.tsx +140 -13
  98. package/src/components/Checkbox/Checkbox.usage.mdx +214 -0
  99. package/src/components/Chip/Chip.usage.mdx +78 -0
  100. package/src/components/Code/Code.stories.tsx +60 -0
  101. package/src/components/Code/Code.usage.mdx +187 -0
  102. package/src/components/CodeTabs/CodeTabs.stories.tsx +53 -0
  103. package/src/components/CodeTabs/CodeTabs.usage.mdx +176 -0
  104. package/src/components/Collapsible/Collapsible.stories.tsx +58 -0
  105. package/src/components/Collapsible/Collapsible.usage.mdx +173 -0
  106. package/src/components/ColorMode/ColorMode.stories.tsx +50 -0
  107. package/src/components/ColorMode/ColorMode.usage.mdx +135 -0
  108. package/src/components/ColorMode/ColorModeToggle.tsx +10 -3
  109. package/src/components/Confetti/Confetti.types.ts +5 -1
  110. package/src/components/Confetti/Confetti.usage.mdx +111 -0
  111. package/src/components/Confetti/confettiColors.ts +5 -5
  112. package/src/components/Container/Container.stories.tsx +32 -0
  113. package/src/components/Container/Container.usage.mdx +130 -0
  114. package/src/components/CopyableCode/CopyableCode.stories.tsx +62 -0
  115. package/src/components/CopyableCode/CopyableCode.usage.mdx +168 -0
  116. package/src/components/CountBadge/CountBadge.stories.tsx +69 -0
  117. package/src/components/CountBadge/CountBadge.usage.mdx +215 -0
  118. package/src/components/CountUp/CountUp.usage.mdx +107 -0
  119. package/src/components/DatePicker/DatePicker.usage.mdx +177 -0
  120. package/src/components/DatePicker/RangeDatePicker.stories.tsx +87 -3
  121. package/src/components/ErrorFallback/ErrorFallback.types.ts +6 -0
  122. package/src/components/ErrorFallback/ErrorFallback.usage.mdx +127 -0
  123. package/src/components/ExpandableText/ExpandableText.stories.tsx +55 -0
  124. package/src/components/ExpandableText/ExpandableText.usage.mdx +176 -0
  125. package/src/components/FileInput/FileInput.stories.tsx +38 -1
  126. package/src/components/FileInput/FileInput.usage.mdx +178 -0
  127. package/src/components/FileItem/FileItem.stories.tsx +71 -0
  128. package/src/components/FileItem/FileItem.usage.mdx +180 -0
  129. package/src/components/FileList/FileList.stories.tsx +25 -0
  130. package/src/components/FileList/FileList.usage.mdx +165 -0
  131. package/src/components/FlyTo/FlyTo.usage.mdx +99 -0
  132. package/src/components/Form/Form.stories.tsx +149 -0
  133. package/src/components/Form/Form.usage.mdx +201 -0
  134. package/src/components/Form/FormModalFooter/FormModalFooter.types.ts +4 -1
  135. package/src/components/FormControl/FormControl.stories.tsx +35 -0
  136. package/src/components/FormControl/FormControl.usage.mdx +128 -0
  137. package/src/components/FormIntegration/FormIntegration.usage.mdx +158 -0
  138. package/src/components/FormLabel/FormLabel.stories.tsx +71 -0
  139. package/src/components/FormLabel/FormLabel.usage.mdx +125 -0
  140. package/src/components/Icon/Icon.stories.tsx +61 -1
  141. package/src/components/Icon/Icon.usage.mdx +158 -0
  142. package/src/components/IconButton/IconButton.stories.tsx +209 -5
  143. package/src/components/IconButton/IconButton.usage.mdx +273 -0
  144. package/src/components/InfoSprinkle/InfoSprinkle.stories.tsx +77 -1
  145. package/src/components/InfoSprinkle/InfoSprinkle.usage.mdx +189 -0
  146. package/src/components/InlineCode/InlineCode.stories.tsx +75 -0
  147. package/src/components/InlineCode/InlineCode.usage.mdx +142 -0
  148. package/src/components/Input/Input.stories.tsx +180 -0
  149. package/src/components/Input/Input.usage.mdx +278 -0
  150. package/src/components/LineGraph/LineGraph.stories.tsx +112 -0
  151. package/src/components/LineGraph/LineGraph.tsx +4 -5
  152. package/src/components/LineGraph/LineGraph.types.ts +12 -2
  153. package/src/components/LineGraph/LineGraph.usage.mdx +186 -0
  154. package/src/components/LineGraph/seriesColors.test.ts +11 -10
  155. package/src/components/LineGraph/seriesColors.ts +18 -16
  156. package/src/components/Loaders/Loaders.stories.tsx +93 -0
  157. package/src/components/Loaders/Loaders.usage.mdx +180 -0
  158. package/src/components/LogicianProvider/LogicianProvider.usage.mdx +98 -0
  159. package/src/components/Markdown/Markdown.stories.tsx +53 -0
  160. package/src/components/Markdown/Markdown.usage.mdx +182 -0
  161. package/src/components/Masonry/Masonry.stories.tsx +63 -1
  162. package/src/components/Masonry/Masonry.types.ts +8 -3
  163. package/src/components/Masonry/Masonry.usage.mdx +142 -0
  164. package/src/components/MaxLengthIndicator/MaxLengthIndicator.stories.tsx +57 -0
  165. package/src/components/MaxLengthIndicator/MaxLengthIndicator.usage.mdx +125 -0
  166. package/src/components/Menu/Menu.stories.tsx +146 -2
  167. package/src/components/Menu/Menu.usage.mdx +230 -0
  168. package/src/components/Menu/MenuItem.types.ts +8 -0
  169. package/src/components/Modal/Modal.stories.tsx +177 -1
  170. package/src/components/Modal/Modal.usage.mdx +262 -0
  171. package/src/components/Modal/ModalCloseButton.tsx +1 -1
  172. package/src/components/MonthPicker/MonthPicker.stories.tsx +30 -0
  173. package/src/components/MonthPicker/MonthPicker.usage.mdx +191 -0
  174. package/src/components/Pagination/Pagination.stories.tsx +90 -1
  175. package/src/components/Pagination/Pagination.tsx +11 -10
  176. package/src/components/Pagination/Pagination.usage.mdx +186 -0
  177. package/src/components/PasswordInput/PasswordInput.stories.tsx +51 -0
  178. package/src/components/PasswordInput/PasswordInput.usage.mdx +193 -0
  179. package/src/components/PinInput/PinInput.stories.tsx +91 -0
  180. package/src/components/PinInput/PinInput.usage.mdx +194 -0
  181. package/src/components/Popover/Popover.stories.tsx +104 -1
  182. package/src/components/Popover/Popover.usage.mdx +197 -0
  183. package/src/components/ProgressBar/ProgressBar.stories.tsx +92 -1
  184. package/src/components/ProgressBar/ProgressBar.types.ts +9 -0
  185. package/src/components/ProgressBar/ProgressBar.usage.mdx +210 -0
  186. package/src/components/Pulse/Pulse.usage.mdx +102 -0
  187. package/src/components/RadialProgress/RadialProgress.stories.tsx +74 -1
  188. package/src/components/RadialProgress/RadialProgress.types.ts +21 -1
  189. package/src/components/RadialProgress/RadialProgress.usage.mdx +153 -0
  190. package/src/components/Radio/Radio.stories.tsx +119 -0
  191. package/src/components/Radio/Radio.usage.mdx +187 -0
  192. package/src/components/Reveal/Reveal.usage.mdx +105 -0
  193. package/src/components/ScaledContext/ScaledContext.usage.mdx +111 -0
  194. package/src/components/SeeMoreButton/SeeMoreButton.stories.tsx +146 -2
  195. package/src/components/SeeMoreButton/SeeMoreButton.types.ts +8 -0
  196. package/src/components/SeeMoreButton/SeeMoreButton.usage.mdx +213 -0
  197. package/src/components/SegmentedControl/SegmentedControl.stories.tsx +69 -0
  198. package/src/components/SegmentedControl/SegmentedControl.tsx +6 -7
  199. package/src/components/SegmentedControl/SegmentedControl.usage.mdx +209 -0
  200. package/src/components/SegmentedProgressBar/SegmentedProgressBar.stories.tsx +54 -0
  201. package/src/components/SegmentedProgressBar/SegmentedProgressBar.types.ts +2 -0
  202. package/src/components/SegmentedProgressBar/SegmentedProgressBar.usage.mdx +145 -0
  203. package/src/components/Select/Select.stories.tsx +209 -1
  204. package/src/components/Select/Select.usage.mdx +278 -0
  205. package/src/components/Shake/Shake.usage.mdx +107 -0
  206. package/src/components/Slider/Slider.stories.tsx +116 -0
  207. package/src/components/Slider/Slider.usage.mdx +179 -0
  208. package/src/components/Spinner/Spinner.stories.tsx +64 -0
  209. package/src/components/Spinner/Spinner.usage.mdx +136 -0
  210. package/src/components/SwapTransition/SwapTransition.usage.mdx +102 -0
  211. package/src/components/Switch/Switch.stories.tsx +131 -6
  212. package/src/components/Switch/Switch.usage.mdx +199 -0
  213. package/src/components/Table/Table.stories.tsx +159 -1
  214. package/src/components/Table/Table.usage.mdx +235 -0
  215. package/src/components/Tabs/Tabs.stories.tsx +86 -0
  216. package/src/components/Tabs/Tabs.usage.mdx +219 -0
  217. package/src/components/Tag/Tag.stories.tsx +181 -4
  218. package/src/components/Tag/Tag.usage.mdx +257 -0
  219. package/src/components/Textarea/Textarea.stories.tsx +113 -0
  220. package/src/components/Textarea/Textarea.usage.mdx +186 -0
  221. package/src/components/Toast/Toast.stories.tsx +185 -3
  222. package/src/components/Toast/Toast.styles.ts +18 -10
  223. package/src/components/Toast/Toast.usage.mdx +265 -0
  224. package/src/components/Tooltip/Tooltip.stories.tsx +86 -1
  225. package/src/components/Tooltip/Tooltip.usage.mdx +211 -0
  226. package/src/components/Tree/Tree.stories.tsx +89 -0
  227. package/src/components/Tree/Tree.usage.mdx +207 -0
  228. package/src/components/Typography/Typography.stories.tsx +117 -0
  229. package/src/components/Typography/Typography.usage.mdx +251 -0
  230. package/src/components/Workflow/Workflow.usage.mdx +199 -0
  231. package/src/components/noRawScales.test.ts +5 -1
  232. package/src/foundations/BrandColour.mdx +65 -2
  233. package/src/theme/BazePalette.stories.tsx +111 -1
  234. package/src/theme/Palette.stories.tsx +2 -2
  235. package/src/theme/SemanticTokens.mdx +75 -16
  236. package/src/theme/claude.md +15 -9
  237. package/src/theme/colors.ts +33 -3
  238. package/src/theme/contrast.test.ts +32 -0
  239. package/src/theme/palette.generated.ts +99 -0
  240. package/src/theme/paletteSwatches.ts +35 -0
@@ -0,0 +1,111 @@
1
+ import { ArgTypes, Canvas, Meta } from '@storybook/blocks';
2
+
3
+ import { En, Ko, LangToggle } from '../../guidelines/_components/Lang';
4
+ import * as ConfettiStories from './Confetti.stories';
5
+
6
+ <Meta of={ConfettiStories} name="Usage" />
7
+
8
+ <LangToggle />
9
+
10
+ <En>
11
+
12
+ # Confetti
13
+
14
+ A one-shot celebratory burst over a container, for the rare moment a purchase
15
+ completes or a reward lands.
16
+
17
+ </En>
18
+
19
+ <Ko>
20
+
21
+ # Confetti
22
+
23
+ 컨테이너 위로 한 번 터지는 축하 효과입니다. 구매가 끝나거나 보상을 받는 드문 순간에 씁니다.
24
+
25
+ </Ko>
26
+
27
+ <Canvas of={ConfettiStories.Default} />
28
+
29
+ <En>
30
+
31
+ ## When to use
32
+
33
+ - A purchase confirmation, a completed course or a level-up: an outcome the
34
+ reader earned and does not see often.
35
+ - At most once per moment. Mount it when the moment begins; pass a new `seed`
36
+ only to scatter a new burst.
37
+ - A small win inside a flow, such as one correct answer, may pair a small burst
38
+ with its `Appear` stamp. Keep that burst smaller (fewer pieces, or scaled
39
+ down) than the ones for a purchase or a level-up, so the rarer moments still
40
+ read bigger.
41
+
42
+ ## When not to use
43
+
44
+ - Routine success (saved, sent, copied) → `Toast`, or `Pulse` on the value
45
+ that changed.
46
+ - Anything that went wrong or needs attention → never.
47
+
48
+ ## Reduced motion and accessibility
49
+
50
+ - With `prefers-reduced-motion: reduce` the pieces mount but stay invisible.
51
+ The burst carries no information, so nothing is lost.
52
+ - The overlay is `aria-hidden` and ignores the pointer, so it never covers a
53
+ button or reaches a screen reader. The success itself must be stated in text
54
+ on the screen.
55
+ - Every piece finishes in under three seconds, so there is nothing to pause
56
+ (WCAG 2.2.2 covers motion longer than five seconds).
57
+
58
+ ## Props
59
+
60
+ Confetti takes no children. It fills the nearest positioned ancestor, so give
61
+ that element `position: relative`, or the burst covers the whole page. The
62
+ default colours are decorative only: coral, beige and the system hues with no
63
+ status meaning. Red, yellow, green and blue are left out of the defaults
64
+ because they mean danger, warning, success and info. Passing them through
65
+ `colors` is fine: a burst lasts under two seconds on a moment that is already
66
+ a success, so no piece can be read as a status. The status-colour rule is for
67
+ things that stay on screen, such as badges, chart lines and text. The defaults
68
+ are light-mode values and do not change in dark mode; pass `colors` (tokens
69
+ work) if that matters.
70
+
71
+ </En>
72
+
73
+ <Ko>
74
+
75
+ ## 언제 쓰나요
76
+
77
+ - 구매 확인, 과정 완료, 레벨 업처럼 사용자가 직접 얻어 냈고 자주 보지 않는 결과.
78
+ - 한 순간에 한 번만 씁니다. 그 순간이 시작될 때 마운트하고, 새로 터뜨릴 때만 `seed`를
79
+ 바꿉니다.
80
+ - 정답 하나처럼 흐름 속의 작은 성공에는 `Appear` 표시와 함께 작은 폭죽을 터뜨려도
81
+ 됩니다. 구매나 레벨 업 때보다 작게(조각을 줄이거나 크기를 줄여) 터뜨려야 드문 순간이
82
+ 더 크게 느껴집니다.
83
+
84
+ ## 언제 쓰지 않나요
85
+
86
+ - 저장, 전송, 복사처럼 흔한 성공에는 `Toast`를 쓰거나, 바뀐 값에 `Pulse`를 씁니다.
87
+ - 잘못됐거나 확인이 필요한 일에는 절대 쓰지 않습니다.
88
+
89
+ ## 동작 줄이기와 접근성
90
+
91
+ - `prefers-reduced-motion: reduce`에서는 조각이 마운트되지만 보이지 않습니다. 이
92
+ 효과에는 정보가 없으니 잃는 것도 없습니다.
93
+ - 겹쳐진 층에는 `aria-hidden`이 붙고 포인터를 받지 않으므로, 버튼을 가리거나 화면
94
+ 낭독기에 읽히지 않습니다. 성공했다는 사실은 화면의 문구로 따로 알려야 합니다.
95
+ - 모든 조각이 3초 안에 끝나므로 멈춤 기능이 필요 없습니다(WCAG 2.2.2는 5초 넘게
96
+ 움직이는 콘텐츠에 해당합니다).
97
+
98
+ ## 속성
99
+
100
+ Confetti는 자식을 받지 않습니다. 가장 가까운 위치 지정 조상을 채우므로, 그 요소에
101
+ `position: relative`를 줍니다. 그러지 않으면 페이지 전체를 덮습니다. 기본 색은 장식용으로,
102
+ 코랄, 베이지, 그리고 상태 뜻이 없는 시스템 색만 씁니다. 빨강, 노랑, 초록, 파랑은 각각
103
+ 위험, 경고, 성공, 정보를 뜻하므로 기본값에서 뺐습니다. 그래도 `colors`로 넘기는 것은
104
+ 괜찮습니다. 폭죽은 이미 성공한 순간에 2초도 안 돼 사라지므로, 어떤 조각도 상태 표시로
105
+ 읽히지 않습니다. 상태 색 규칙은 배지, 차트 선, 글자처럼 화면에 남는 요소에 적용합니다.
106
+ 기본 색은 라이트 모드 값이라 다크 모드에서 바뀌지 않습니다. 필요하면 `colors`를
107
+ 넘깁니다(토큰도 됩니다).
108
+
109
+ </Ko>
110
+
111
+ <ArgTypes of={ConfettiStories} include={['pieceCount', 'colors', 'seed']} />
@@ -2,11 +2,11 @@ import type { SystemHue } from '../../theme/colors';
2
2
  import { CORAL, RAMPS, SYSTEM_HUES } from '../../theme/palette.generated';
3
3
 
4
4
  /**
5
- * Hues that carry meaning elsewhere in the system and so never colour a piece
6
- * by default: red, yellow and green are the danger, warning and success
7
- * solids, and blue is info and links. The same rule as the chart series
8
- * defaults (`LineGraph/seriesColors.ts`) — a red piece in a "payment complete"
9
- * burst says something the screen does not.
5
+ * Hues left out of the *default* pieces: red, yellow and green are the
6
+ * danger, warning and success solids, and blue is info and links. This is a
7
+ * default, not a ban — a caller may pass them through `colors`, since a burst
8
+ * lasting under two seconds on a success moment cannot be read as a status
9
+ * (Confetti.usage.mdx).
10
10
  */
11
11
  export const CONFETTI_EXCLUDED_HUES = [
12
12
  'red',
@@ -1,5 +1,7 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
2
 
3
+ import { Card } from '../Card';
4
+ import { H1, Text } from '../Typography';
3
5
  import { Container } from './Container';
4
6
 
5
7
  const meta = {
@@ -18,3 +20,33 @@ export default meta;
18
20
  type Story = StoryObj<typeof meta>;
19
21
 
20
22
  export const Basic: Story = {};
23
+
24
+ // ───────────────────────── Usage-page specimens ─────────────────────────
25
+ // Pulled into `Container.usage.mdx` with <Canvas of={…} />. Hidden from the
26
+ // sidebar (`!dev`); `tags` is written out on each story because the indexer
27
+ // reads CSF statically.
28
+
29
+ export const DoPageLandmark: Story = {
30
+ tags: ['!dev'],
31
+ name: 'Usage / Do: the page column, as the main landmark',
32
+ args: { bg: undefined, p: 6, textAlign: 'start' },
33
+ render: (args) => (
34
+ <Container {...args} as="main">
35
+ <H1 mb={2}>사용량</H1>
36
+ <Text>이번 달 1일부터 오늘까지의 합계입니다.</Text>
37
+ </Container>
38
+ ),
39
+ };
40
+
41
+ export const DontInsideACard: Story = {
42
+ tags: ['!dev'],
43
+ name: "Usage / Don't: a Container inside a narrow box",
44
+ args: { bg: 'primary.washActive', p: 4, textAlign: 'start' },
45
+ render: (args) => (
46
+ <Card p={4} maxW="320px" overflow="auto">
47
+ <Container {...args}>
48
+ 폭이 창 크기로 정해져 카드 밖으로 넘칩니다.
49
+ </Container>
50
+ </Card>
51
+ ),
52
+ };
@@ -0,0 +1,130 @@
1
+ import { Canvas, Meta } from '@storybook/blocks';
2
+
3
+ import { En, Ko, LangToggle, Verdict } from '../../guidelines/_components/Lang';
4
+ import * as ContainerStories from './Container.stories';
5
+
6
+ <Meta of={ContainerStories} name="Usage" />
7
+
8
+ <LangToggle />
9
+
10
+ <En>
11
+
12
+ # Container
13
+
14
+ The centred page column. It is Chakra's `Container` plus a responsive
15
+ `minWidth`: the largest theme breakpoint that still leaves a 10% gutter on
16
+ each side of the **window**, recomputed on resize. `disableResponsive` turns
17
+ that off.
18
+
19
+ ## When to use
20
+
21
+ - Once per page, around the main content, so pages share the same width.
22
+
23
+ ## When not to use
24
+
25
+ - Inside a card, a modal, a drawer or a sidebar → `Box` or `Stack` with a
26
+ `maxW`. The width comes from the window, not the parent, so it overflows a
27
+ narrow box.
28
+ - To centre a small block → `Flex` / `Center`.
29
+
30
+ ## Do / Don't
31
+
32
+ </En>
33
+
34
+ <Ko>
35
+
36
+ # Container
37
+
38
+ 가운데 정렬된 페이지 열입니다. Chakra의 `Container`에 반응형 `minWidth`를 더했습니다.
39
+ **창** 양쪽에 10% 여백을 남기는 가장 큰 테마 중단점 값을 쓰고, 창 크기가 바뀌면 다시
40
+ 계산합니다. `disableResponsive`로 끌 수 있습니다.
41
+
42
+ ## 언제 쓰나요
43
+
44
+ - 페이지마다 한 번, 본문을 감싸서 페이지들의 너비를 맞출 때.
45
+
46
+ ## 언제 쓰지 않나요
47
+
48
+ - 카드, 모달, 서랍, 사이드바 안에서는 `maxW`를 준 `Box`나 `Stack`을 씁니다. 너비가
49
+ 부모가 아니라 창에서 정해지므로 좁은 상자 밖으로 넘칩니다.
50
+ - 작은 블록을 가운데 두려면 `Flex` / `Center`를 씁니다.
51
+
52
+ ## 이렇게 하세요 / 이렇게 하지 마세요
53
+
54
+ </Ko>
55
+
56
+ <Canvas of={ContainerStories.DoPageLandmark} />
57
+ <Verdict
58
+ kind="do"
59
+ en="Use one Container for the page column and render it as the main landmark (as='main')."
60
+ ko="페이지 열에 Container 하나를 쓰고, 본문 랜드마크로 그립니다(as='main')."
61
+ />
62
+
63
+ <Canvas of={ContainerStories.DontInsideACard} />
64
+ <Verdict
65
+ kind="dont"
66
+ en="Put a Container inside a narrow box. Its minimum width follows the window and spills out of the card."
67
+ ko="좁은 상자 안에 Container를 넣지 마세요. 최소 너비가 창을 따르므로 카드 밖으로 넘칩니다."
68
+ />
69
+
70
+ <En>
71
+
72
+ ## Accessibility
73
+
74
+ What Container does for you:
75
+
76
+ - `as` changes the element and its props, so the page column can be a
77
+ landmark: `as="main"`, `as="section"`, `as="nav"`.
78
+
79
+ What you still have to do:
80
+
81
+ - **Mark the main content** with `as="main"` once per page, so "skip to
82
+ content" and landmark navigation work (WCAG 1.3.1, 2.4.1).
83
+ - The `minWidth` is set after mount, from the window. Check pages at 320px
84
+ wide and at 400% zoom for sideways scrolling (WCAG 1.4.10).
85
+
86
+ ## Tokens
87
+
88
+ Container sets no colour tokens.
89
+
90
+ </En>
91
+
92
+ <Ko>
93
+
94
+ ## 접근성
95
+
96
+ Container가 알아서 하는 일
97
+
98
+ - `as`가 요소와 그 속성을 함께 바꾸므로 페이지 열을 랜드마크로 만들 수 있습니다:
99
+ `as="main"`, `as="section"`, `as="nav"`.
100
+
101
+ 직접 챙겨야 하는 일
102
+
103
+ - **본문을 표시합니다.** 페이지마다 한 번 `as="main"`을 써야 "본문 바로가기"와
104
+ 랜드마크 이동이 동작합니다(WCAG 1.3.1, 2.4.1).
105
+ - `minWidth`는 화면에 그려진 뒤 창 크기로 정해집니다. 폭 320px과 400% 확대에서 가로
106
+ 스크롤이 생기지 않는지 확인합니다(WCAG 1.4.10).
107
+
108
+ ## 토큰
109
+
110
+ Container는 색 토큰을 쓰지 않습니다.
111
+
112
+ </Ko>
113
+
114
+ <En>
115
+
116
+ ## Related
117
+
118
+ - **Masonry**: a multi-column layout inside the page.
119
+ - **Card**: a bounded block inside the page.
120
+
121
+ </En>
122
+
123
+ <Ko>
124
+
125
+ ## 관련 컴포넌트
126
+
127
+ - **Masonry**: 페이지 안의 여러 열 레이아웃.
128
+ - **Card**: 페이지 안의 경계 있는 블록.
129
+
130
+ </Ko>
@@ -1,5 +1,7 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
2
 
3
+ import { T } from '../../guidelines/_components/Lang';
4
+ import { TokenTable } from '../../guidelines/_components/TokenTable';
3
5
  import { CopyableCode } from './CopyableCode';
4
6
  import { CopyableCodeProps } from './CopyableCode.types';
5
7
 
@@ -20,3 +22,63 @@ export default meta;
20
22
  type Story = StoryObj<typeof CopyableCode>;
21
23
 
22
24
  export const Basic: Story = {};
25
+
26
+ // ───────────────────────── Usage-page specimens ─────────────────────────
27
+ // Pulled into `CopyableCode.usage.mdx` with <Canvas of={…} />. Hidden from
28
+ // the sidebar (`!dev`); `tags` is written out on each story because the
29
+ // indexer reads CSF statically.
30
+
31
+ /** CopyableCode does not touch the clipboard; the caller's `onCopy` does. */
32
+ const copy = (text: string) => () => {
33
+ void navigator.clipboard?.writeText(text);
34
+ };
35
+
36
+ const ENDPOINT = 'https://api.example.com/v1/chat/completions';
37
+
38
+ export const DoOneLineValue: Story = {
39
+ tags: ['!dev'],
40
+ parameters: { layout: 'padded' },
41
+ name: 'Usage / Do: one line the user pastes somewhere else',
42
+ args: { children: ENDPOINT, onCopy: copy(ENDPOINT) },
43
+ };
44
+
45
+ const SCRIPT = `import OpenAI from 'openai';
46
+ const client = new OpenAI({ baseURL: '${ENDPOINT}' });
47
+ const res = await client.chat.completions.create({ model: 'gpt-4o' });`;
48
+
49
+ export const DontMultiLine: Story = {
50
+ tags: ['!dev'],
51
+ parameters: { layout: 'padded' },
52
+ name: "Usage / Don't: a multi-line snippet",
53
+ args: { children: SCRIPT, onCopy: copy(SCRIPT) },
54
+ };
55
+
56
+ export const UsageTokens: Story = {
57
+ tags: ['!dev'],
58
+ parameters: { layout: 'padded' },
59
+ name: 'Usage / Tokens',
60
+ render: () => (
61
+ <TokenTable
62
+ rows={[
63
+ {
64
+ token: 'bg.surface',
65
+ use: (
66
+ <T
67
+ en="Card surface and the fade under the button"
68
+ ko="카드 바탕과 버튼 아래 흐려지는 부분"
69
+ />
70
+ ),
71
+ },
72
+ { token: 'border.subtle', use: <T en="Card border" ko="카드 테두리" /> },
73
+ {
74
+ token: 'primary.main',
75
+ use: <T en="Copy button (primary)" ko="복사 버튼(primary)" />,
76
+ },
77
+ {
78
+ token: 'fg.onPrimary',
79
+ use: <T en="Copy button label" ko="복사 버튼 글자" />,
80
+ },
81
+ ]}
82
+ />
83
+ ),
84
+ };
@@ -0,0 +1,168 @@
1
+ import { Canvas, Meta } from '@storybook/blocks';
2
+
3
+ import { En, Ko, LangToggle, Verdict } from '../../guidelines/_components/Lang';
4
+ import * as CopyableCodeStories from './CopyableCode.stories';
5
+
6
+ <Meta of={CopyableCodeStories} name="Usage" />
7
+
8
+ <LangToggle />
9
+
10
+ <En>
11
+
12
+ # CopyableCode
13
+
14
+ One line of code or a value in a card, with a 복사 button that confirms
15
+ itself (the icon becomes a check and the label becomes 복사 완료 for 1.6
16
+ seconds). FactChat uses it for model IDs and endpoints on the developer page.
17
+
18
+ ## When to use
19
+
20
+ - A single value the user copies and pastes elsewhere: an endpoint, a model
21
+ ID, an embed URL.
22
+
23
+ ## When not to use
24
+
25
+ - Several lines → `Code` with `onCopy`. CopyableCode renders on one line
26
+ (`white-space: nowrap`), so line breaks are lost.
27
+ - A value inside a sentence → `InlineCode`.
28
+ - A secret shown once (a new API key) → still fine, but say in the text that
29
+ it will not be shown again.
30
+
31
+ ## Props
32
+
33
+ | Prop | Means |
34
+ | --- | --- |
35
+ | `children` | The value shown. |
36
+ | `onCopy` | **Required, and it does the copying.** CopyableCode does not write to the clipboard; your handler must call `navigator.clipboard.writeText`. The button confirms when clicked either way. |
37
+ | `containerProps` | Props for the outer `Flex` (width, margins). |
38
+
39
+ ## Do / Don't
40
+
41
+ </En>
42
+
43
+ <Ko>
44
+
45
+ # CopyableCode
46
+
47
+ 카드 안에 코드 한 줄이나 값을 보여 주고 '복사' 버튼을 붙인 컴포넌트입니다. 버튼을
48
+ 누르면 1.6초 동안 아이콘이 체크로, 글자가 '복사 완료'로 바뀌어 스스로 확인해 줍니다.
49
+ FactChat은 개발자 페이지의 모델 ID와 엔드포인트에 씁니다.
50
+
51
+ ## 언제 쓰나요
52
+
53
+ - 사용자가 복사해서 다른 곳에 붙여 넣는 값 하나: 엔드포인트, 모델 ID, 임베드 URL.
54
+
55
+ ## 언제 쓰지 않나요
56
+
57
+ - 여러 줄이라면 `onCopy`를 준 `Code`를 씁니다. CopyableCode는 한 줄로
58
+ 그리므로(`white-space: nowrap`) 줄바꿈이 사라집니다.
59
+ - 문장 안의 값은 `InlineCode`를 씁니다.
60
+ - 한 번만 보여 주는 비밀 값(새 API 키)에도 쓸 수 있지만, 다시 볼 수 없다는 점을 본문에
61
+ 적습니다.
62
+
63
+ ## 속성
64
+
65
+ | 속성 | 뜻 |
66
+ | --- | --- |
67
+ | `children` | 보여 줄 값. |
68
+ | `onCopy` | **필수이며, 복사는 이 함수가 합니다.** CopyableCode는 클립보드에 쓰지 않으므로 넘긴 함수에서 `navigator.clipboard.writeText`를 불러야 합니다. 버튼의 확인 표시는 어느 경우에나 나타납니다. |
69
+ | `containerProps` | 바깥 `Flex`에 넘길 속성(너비, 여백). |
70
+
71
+ ## 이렇게 하세요 / 이렇게 하지 마세요
72
+
73
+ </Ko>
74
+
75
+ <Canvas of={CopyableCodeStories.DoOneLineValue} />
76
+ <Verdict
77
+ kind="do"
78
+ en="Use it for one value, and write it to the clipboard in onCopy."
79
+ ko="값 하나에 쓰고, onCopy에서 클립보드에 씁니다."
80
+ />
81
+
82
+ <Canvas of={CopyableCodeStories.DontMultiLine} />
83
+ <Verdict
84
+ kind="dont"
85
+ en="Use it for a multi-line snippet. The lines run together and scroll sideways under the button. Use Code with onCopy."
86
+ ko="여러 줄 코드에 쓰지 마세요. 줄이 하나로 이어지고 버튼 아래로 가로 스크롤됩니다. onCopy를 준 Code를 씁니다."
87
+ />
88
+
89
+ <En>
90
+
91
+ ## Content
92
+
93
+ - Show the exact value, nothing around it: no quotes, no "URL:".
94
+ - Put the label in the text above (모델 ID, 엔드포인트).
95
+
96
+ ## Accessibility
97
+
98
+ What CopyableCode does for you:
99
+
100
+ - The button is a real `Button` with a visible, translated label, so its name
101
+ matches what is shown (WCAG 2.5.3, 4.1.2).
102
+ - Only one label is exposed at a time (the other is `aria-hidden`), and the
103
+ button keeps its width when the label changes.
104
+
105
+ What you still have to do:
106
+
107
+ - **Copy for real.** If `onCopy` does nothing, the button still says 복사
108
+ 완료 and tells the user something false.
109
+ - The confirmation is visual only; there is no live region. If the copy
110
+ result matters (a key shown once), also announce it, for example with a
111
+ `Toast` (WCAG 4.1.3).
112
+ - A long value scrolls sideways under a fade. Make sure the start of the
113
+ value is the part that identifies it.
114
+
115
+ ## Tokens
116
+
117
+ </En>
118
+
119
+ <Ko>
120
+
121
+ ## 문구
122
+
123
+ - 값만 정확히 보여 줍니다. 따옴표나 "URL:" 같은 말을 붙이지 않습니다.
124
+ - 라벨(모델 ID, 엔드포인트)은 위 본문에 씁니다.
125
+
126
+ ## 접근성
127
+
128
+ CopyableCode가 알아서 하는 일
129
+
130
+ - 버튼은 번역된 글자가 보이는 실제 `Button`이라, 보이는 글자와 읽히는 이름이
131
+ 같습니다(WCAG 2.5.3, 4.1.2).
132
+ - 한 번에 한 글자만 노출되고(다른 하나는 `aria-hidden`), 글자가 바뀌어도 버튼 너비가
133
+ 그대로입니다.
134
+
135
+ 직접 챙겨야 하는 일
136
+
137
+ - **실제로 복사합니다.** `onCopy`가 아무것도 하지 않아도 버튼은 '복사 완료'를 띄우므로
138
+ 사용자에게 사실이 아닌 것을 알리게 됩니다.
139
+ - 확인 표시는 화면에만 나타나고 라이브 영역이 없습니다. 복사 결과가 중요하다면(한 번만
140
+ 보여 주는 키 등) `Toast` 같은 방법으로도 알립니다(WCAG 4.1.3).
141
+ - 긴 값은 흐려지는 부분 아래로 가로 스크롤됩니다. 값의 앞부분만 보고도 무엇인지 알 수
142
+ 있게 합니다.
143
+
144
+ ## 토큰
145
+
146
+ </Ko>
147
+
148
+ <Canvas of={CopyableCodeStories.UsageTokens} sourceState="none" />
149
+
150
+ <En>
151
+
152
+ ## Related
153
+
154
+ - **Code**: multi-line snippets with a copy button.
155
+ - **InlineCode**: a value inside a sentence.
156
+ - **Toast**: announce a copy result that matters.
157
+
158
+ </En>
159
+
160
+ <Ko>
161
+
162
+ ## 관련 컴포넌트
163
+
164
+ - **Code**: 복사 버튼이 있는 여러 줄 코드.
165
+ - **InlineCode**: 문장 안의 값.
166
+ - **Toast**: 중요한 복사 결과를 알릴 때.
167
+
168
+ </Ko>
@@ -1,9 +1,12 @@
1
1
  import { Flex, HStack, Text } from '@chakra-ui/react';
2
2
  import { Meta, StoryObj } from '@storybook/react';
3
3
 
4
+ import { T } from '../../guidelines/_components/Lang';
5
+ import { TokenTable } from '../../guidelines/_components/TokenTable';
4
6
  import { BellIcon } from '../Icon';
5
7
  import { IconButton } from '../IconButton';
6
8
  import { CountBadge } from '.';
9
+ import { countBadgeBaseStyles } from './CountBadge.styles';
7
10
 
8
11
  const meta = {
9
12
  title: 'Components/CountBadge',
@@ -107,3 +110,69 @@ export const OnIconButton: Story = {
107
110
  );
108
111
  },
109
112
  };
113
+
114
+ // ───────────────────────── Usage-page specimens ─────────────────────────
115
+ // Pulled into `CountBadge.usage.mdx` with <Canvas of={…} />. Hidden from the
116
+ // sidebar (`!dev`); `tags` is written on each story because the indexer reads
117
+ // CSF statically.
118
+
119
+ const FOLDERS = [
120
+ { name: '연구 자료', files: 128 },
121
+ { name: '수업 자료', files: 42 },
122
+ { name: '행정 문서', files: 7 },
123
+ ];
124
+
125
+ export const DontCountForTotals: Story = {
126
+ tags: ['!dev'],
127
+ parameters: { layout: 'padded' },
128
+ name: "Usage / Don't: a count badge for a total",
129
+ render: () => (
130
+ <Flex direction="column" gap={2} w="240px">
131
+ {FOLDERS.map((folder) => (
132
+ <HStack key={folder.name} justify="space-between">
133
+ <Text>{folder.name}</Text>
134
+ <CountBadge count={folder.files} />
135
+ </HStack>
136
+ ))}
137
+ </Flex>
138
+ ),
139
+ };
140
+
141
+ export const DoTotalsAsText: Story = {
142
+ tags: ['!dev'],
143
+ parameters: { layout: 'padded' },
144
+ name: 'Usage / Do: totals as plain text',
145
+ render: () => (
146
+ <Flex direction="column" gap={2} w="240px">
147
+ {FOLDERS.map((folder) => (
148
+ <HStack key={folder.name} justify="space-between">
149
+ <Text>{folder.name}</Text>
150
+ <Text textStyle="subtext" color="fg.muted">
151
+ 파일 {folder.files}개
152
+ </Text>
153
+ </HStack>
154
+ ))}
155
+ </Flex>
156
+ ),
157
+ };
158
+
159
+ /** Tokens the badge reads, from `CountBadge.styles.ts` and the theme. */
160
+ export const UsageTokens: Story = {
161
+ tags: ['!dev'],
162
+ parameters: { layout: 'padded' },
163
+ name: 'Usage / Tokens',
164
+ render: () => (
165
+ <TokenTable
166
+ rows={[
167
+ {
168
+ token: countBadgeBaseStyles.bgColor as string,
169
+ use: <T en="fill (number and dot)" ko="바탕(숫자, 점)" />,
170
+ },
171
+ {
172
+ token: countBadgeBaseStyles.color as string,
173
+ use: <T en="number" ko="숫자" />,
174
+ },
175
+ ]}
176
+ />
177
+ ),
178
+ };