@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.
- package/dist/components/Banner/Banner.types.d.ts +24 -1
- package/dist/components/Banner/Banner.types.d.ts.map +1 -1
- package/dist/components/Card/Card.types.d.ts +12 -0
- package/dist/components/Card/Card.types.d.ts.map +1 -1
- package/dist/components/ColorMode/ColorModeToggle.d.ts +7 -2
- package/dist/components/ColorMode/ColorModeToggle.d.ts.map +1 -1
- package/dist/components/ColorMode/ColorModeToggle.js +8 -3
- package/dist/components/ColorMode/ColorModeToggle.js.map +1 -1
- package/dist/components/ColorMode/ColorModeToggle.mjs +8 -3
- package/dist/components/ColorMode/ColorModeToggle.mjs.map +1 -1
- package/dist/components/Confetti/Confetti.types.d.ts +5 -1
- package/dist/components/Confetti/Confetti.types.d.ts.map +1 -1
- package/dist/components/Confetti/confettiColors.d.ts +5 -5
- package/dist/components/Confetti/confettiColors.js +5 -5
- package/dist/components/Confetti/confettiColors.mjs +5 -5
- package/dist/components/ErrorFallback/ErrorFallback.types.d.ts +6 -0
- package/dist/components/ErrorFallback/ErrorFallback.types.d.ts.map +1 -1
- package/dist/components/Form/FormModalFooter/FormModalFooter.types.d.ts +4 -1
- package/dist/components/Form/FormModalFooter/FormModalFooter.types.d.ts.map +1 -1
- package/dist/components/LineGraph/LineGraph.d.ts.map +1 -1
- package/dist/components/LineGraph/LineGraph.js +4 -5
- package/dist/components/LineGraph/LineGraph.js.map +1 -1
- package/dist/components/LineGraph/LineGraph.mjs +5 -6
- package/dist/components/LineGraph/LineGraph.mjs.map +1 -1
- package/dist/components/LineGraph/LineGraph.types.d.ts +12 -2
- package/dist/components/LineGraph/LineGraph.types.d.ts.map +1 -1
- package/dist/components/LineGraph/seriesColors.d.ts +12 -8
- package/dist/components/LineGraph/seriesColors.d.ts.map +1 -1
- package/dist/components/LineGraph/seriesColors.js +8 -7
- package/dist/components/LineGraph/seriesColors.js.map +1 -1
- package/dist/components/LineGraph/seriesColors.mjs +8 -7
- package/dist/components/LineGraph/seriesColors.mjs.map +1 -1
- package/dist/components/Masonry/Masonry.types.d.ts +8 -3
- package/dist/components/Masonry/Masonry.types.d.ts.map +1 -1
- package/dist/components/Menu/MenuItem.types.d.ts +8 -0
- package/dist/components/Menu/MenuItem.types.d.ts.map +1 -1
- package/dist/components/Modal/ModalCloseButton.d.ts +1 -1
- package/dist/components/Modal/ModalCloseButton.js +1 -1
- package/dist/components/Modal/ModalCloseButton.mjs +1 -1
- package/dist/components/Pagination/Pagination.d.ts +11 -10
- package/dist/components/Pagination/Pagination.d.ts.map +1 -1
- package/dist/components/Pagination/Pagination.js +11 -10
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Pagination/Pagination.mjs +11 -10
- package/dist/components/Pagination/Pagination.mjs.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.types.d.ts +9 -0
- package/dist/components/ProgressBar/ProgressBar.types.d.ts.map +1 -1
- package/dist/components/RadialProgress/RadialProgress.types.d.ts +21 -1
- package/dist/components/RadialProgress/RadialProgress.types.d.ts.map +1 -1
- package/dist/components/SeeMoreButton/SeeMoreButton.types.d.ts +8 -0
- package/dist/components/SeeMoreButton/SeeMoreButton.types.d.ts.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.d.ts.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.js +6 -7
- package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.mjs +6 -7
- package/dist/components/SegmentedControl/SegmentedControl.mjs.map +1 -1
- package/dist/components/SegmentedProgressBar/SegmentedProgressBar.types.d.ts +2 -0
- package/dist/components/SegmentedProgressBar/SegmentedProgressBar.types.d.ts.map +1 -1
- package/dist/components/Toast/Toast.styles.d.ts +6 -2
- package/dist/components/Toast/Toast.styles.d.ts.map +1 -1
- package/dist/components/Toast/Toast.styles.js +18 -10
- package/dist/components/Toast/Toast.styles.js.map +1 -1
- package/dist/components/Toast/Toast.styles.mjs +18 -10
- package/dist/components/Toast/Toast.styles.mjs.map +1 -1
- package/dist/theme/colors.d.ts +2 -2
- package/dist/theme/colors.d.ts.map +1 -1
- package/dist/theme/colors.js +22 -2
- package/dist/theme/colors.js.map +1 -1
- package/dist/theme/colors.mjs +23 -3
- package/dist/theme/colors.mjs.map +1 -1
- package/dist/theme/palette.generated.d.ts +98 -0
- package/dist/theme/palette.generated.d.ts.map +1 -1
- package/dist/theme/palette.generated.js +99 -0
- package/dist/theme/palette.generated.js.map +1 -1
- package/dist/theme/palette.generated.mjs +99 -1
- package/dist/theme/palette.generated.mjs.map +1 -1
- package/dist/theme/paletteSwatches.d.ts +20 -0
- package/dist/theme/paletteSwatches.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/Accordion/Accordion.stories.tsx +85 -0
- package/src/components/Accordion/Accordion.usage.mdx +200 -0
- package/src/components/Appear/Appear.usage.mdx +107 -0
- package/src/components/Avatar/Avatar.stories.tsx +71 -1
- package/src/components/Avatar/Avatar.usage.mdx +166 -0
- package/src/components/Banner/Banner.stories.tsx +152 -2
- package/src/components/Banner/Banner.types.ts +30 -1
- package/src/components/Banner/Banner.usage.mdx +233 -0
- package/src/components/BottomSheet/BottomSheet.stories.tsx +168 -1
- package/src/components/BottomSheet/BottomSheet.usage.mdx +216 -0
- package/src/components/Breadcrumb/Breadcrumb.stories.tsx +59 -0
- package/src/components/Breadcrumb/Breadcrumb.usage.mdx +181 -0
- package/src/components/Button/Button.stories.tsx +263 -3
- package/src/components/Button/Button.usage.mdx +342 -0
- package/src/components/Card/Card.stories.tsx +106 -0
- package/src/components/Card/Card.types.ts +12 -0
- package/src/components/Card/Card.usage.mdx +216 -0
- package/src/components/Checkbox/Checkbox.stories.tsx +140 -13
- package/src/components/Checkbox/Checkbox.usage.mdx +214 -0
- package/src/components/Chip/Chip.usage.mdx +78 -0
- package/src/components/Code/Code.stories.tsx +60 -0
- package/src/components/Code/Code.usage.mdx +187 -0
- package/src/components/CodeTabs/CodeTabs.stories.tsx +53 -0
- package/src/components/CodeTabs/CodeTabs.usage.mdx +176 -0
- package/src/components/Collapsible/Collapsible.stories.tsx +58 -0
- package/src/components/Collapsible/Collapsible.usage.mdx +173 -0
- package/src/components/ColorMode/ColorMode.stories.tsx +50 -0
- package/src/components/ColorMode/ColorMode.usage.mdx +135 -0
- package/src/components/ColorMode/ColorModeToggle.tsx +10 -3
- package/src/components/Confetti/Confetti.types.ts +5 -1
- package/src/components/Confetti/Confetti.usage.mdx +111 -0
- package/src/components/Confetti/confettiColors.ts +5 -5
- package/src/components/Container/Container.stories.tsx +32 -0
- package/src/components/Container/Container.usage.mdx +130 -0
- package/src/components/CopyableCode/CopyableCode.stories.tsx +62 -0
- package/src/components/CopyableCode/CopyableCode.usage.mdx +168 -0
- package/src/components/CountBadge/CountBadge.stories.tsx +69 -0
- package/src/components/CountBadge/CountBadge.usage.mdx +215 -0
- package/src/components/CountUp/CountUp.usage.mdx +107 -0
- package/src/components/DatePicker/DatePicker.usage.mdx +177 -0
- package/src/components/DatePicker/RangeDatePicker.stories.tsx +87 -3
- package/src/components/ErrorFallback/ErrorFallback.types.ts +6 -0
- package/src/components/ErrorFallback/ErrorFallback.usage.mdx +127 -0
- package/src/components/ExpandableText/ExpandableText.stories.tsx +55 -0
- package/src/components/ExpandableText/ExpandableText.usage.mdx +176 -0
- package/src/components/FileInput/FileInput.stories.tsx +38 -1
- package/src/components/FileInput/FileInput.usage.mdx +178 -0
- package/src/components/FileItem/FileItem.stories.tsx +71 -0
- package/src/components/FileItem/FileItem.usage.mdx +180 -0
- package/src/components/FileList/FileList.stories.tsx +25 -0
- package/src/components/FileList/FileList.usage.mdx +165 -0
- package/src/components/FlyTo/FlyTo.usage.mdx +99 -0
- package/src/components/Form/Form.stories.tsx +149 -0
- package/src/components/Form/Form.usage.mdx +201 -0
- package/src/components/Form/FormModalFooter/FormModalFooter.types.ts +4 -1
- package/src/components/FormControl/FormControl.stories.tsx +35 -0
- package/src/components/FormControl/FormControl.usage.mdx +128 -0
- package/src/components/FormIntegration/FormIntegration.usage.mdx +158 -0
- package/src/components/FormLabel/FormLabel.stories.tsx +71 -0
- package/src/components/FormLabel/FormLabel.usage.mdx +125 -0
- package/src/components/Icon/Icon.stories.tsx +61 -1
- package/src/components/Icon/Icon.usage.mdx +158 -0
- package/src/components/IconButton/IconButton.stories.tsx +209 -5
- package/src/components/IconButton/IconButton.usage.mdx +273 -0
- package/src/components/InfoSprinkle/InfoSprinkle.stories.tsx +77 -1
- package/src/components/InfoSprinkle/InfoSprinkle.usage.mdx +189 -0
- package/src/components/InlineCode/InlineCode.stories.tsx +75 -0
- package/src/components/InlineCode/InlineCode.usage.mdx +142 -0
- package/src/components/Input/Input.stories.tsx +180 -0
- package/src/components/Input/Input.usage.mdx +278 -0
- package/src/components/LineGraph/LineGraph.stories.tsx +112 -0
- package/src/components/LineGraph/LineGraph.tsx +4 -5
- package/src/components/LineGraph/LineGraph.types.ts +12 -2
- package/src/components/LineGraph/LineGraph.usage.mdx +186 -0
- package/src/components/LineGraph/seriesColors.test.ts +11 -10
- package/src/components/LineGraph/seriesColors.ts +18 -16
- package/src/components/Loaders/Loaders.stories.tsx +93 -0
- package/src/components/Loaders/Loaders.usage.mdx +180 -0
- package/src/components/LogicianProvider/LogicianProvider.usage.mdx +98 -0
- package/src/components/Markdown/Markdown.stories.tsx +53 -0
- package/src/components/Markdown/Markdown.usage.mdx +182 -0
- package/src/components/Masonry/Masonry.stories.tsx +63 -1
- package/src/components/Masonry/Masonry.types.ts +8 -3
- package/src/components/Masonry/Masonry.usage.mdx +142 -0
- package/src/components/MaxLengthIndicator/MaxLengthIndicator.stories.tsx +57 -0
- package/src/components/MaxLengthIndicator/MaxLengthIndicator.usage.mdx +125 -0
- package/src/components/Menu/Menu.stories.tsx +146 -2
- package/src/components/Menu/Menu.usage.mdx +230 -0
- package/src/components/Menu/MenuItem.types.ts +8 -0
- package/src/components/Modal/Modal.stories.tsx +177 -1
- package/src/components/Modal/Modal.usage.mdx +262 -0
- package/src/components/Modal/ModalCloseButton.tsx +1 -1
- package/src/components/MonthPicker/MonthPicker.stories.tsx +30 -0
- package/src/components/MonthPicker/MonthPicker.usage.mdx +191 -0
- package/src/components/Pagination/Pagination.stories.tsx +90 -1
- package/src/components/Pagination/Pagination.tsx +11 -10
- package/src/components/Pagination/Pagination.usage.mdx +186 -0
- package/src/components/PasswordInput/PasswordInput.stories.tsx +51 -0
- package/src/components/PasswordInput/PasswordInput.usage.mdx +193 -0
- package/src/components/PinInput/PinInput.stories.tsx +91 -0
- package/src/components/PinInput/PinInput.usage.mdx +194 -0
- package/src/components/Popover/Popover.stories.tsx +104 -1
- package/src/components/Popover/Popover.usage.mdx +197 -0
- package/src/components/ProgressBar/ProgressBar.stories.tsx +92 -1
- package/src/components/ProgressBar/ProgressBar.types.ts +9 -0
- package/src/components/ProgressBar/ProgressBar.usage.mdx +210 -0
- package/src/components/Pulse/Pulse.usage.mdx +102 -0
- package/src/components/RadialProgress/RadialProgress.stories.tsx +74 -1
- package/src/components/RadialProgress/RadialProgress.types.ts +21 -1
- package/src/components/RadialProgress/RadialProgress.usage.mdx +153 -0
- package/src/components/Radio/Radio.stories.tsx +119 -0
- package/src/components/Radio/Radio.usage.mdx +187 -0
- package/src/components/Reveal/Reveal.usage.mdx +105 -0
- package/src/components/ScaledContext/ScaledContext.usage.mdx +111 -0
- package/src/components/SeeMoreButton/SeeMoreButton.stories.tsx +146 -2
- package/src/components/SeeMoreButton/SeeMoreButton.types.ts +8 -0
- package/src/components/SeeMoreButton/SeeMoreButton.usage.mdx +213 -0
- package/src/components/SegmentedControl/SegmentedControl.stories.tsx +69 -0
- package/src/components/SegmentedControl/SegmentedControl.tsx +6 -7
- package/src/components/SegmentedControl/SegmentedControl.usage.mdx +209 -0
- package/src/components/SegmentedProgressBar/SegmentedProgressBar.stories.tsx +54 -0
- package/src/components/SegmentedProgressBar/SegmentedProgressBar.types.ts +2 -0
- package/src/components/SegmentedProgressBar/SegmentedProgressBar.usage.mdx +145 -0
- package/src/components/Select/Select.stories.tsx +209 -1
- package/src/components/Select/Select.usage.mdx +278 -0
- package/src/components/Shake/Shake.usage.mdx +107 -0
- package/src/components/Slider/Slider.stories.tsx +116 -0
- package/src/components/Slider/Slider.usage.mdx +179 -0
- package/src/components/Spinner/Spinner.stories.tsx +64 -0
- package/src/components/Spinner/Spinner.usage.mdx +136 -0
- package/src/components/SwapTransition/SwapTransition.usage.mdx +102 -0
- package/src/components/Switch/Switch.stories.tsx +131 -6
- package/src/components/Switch/Switch.usage.mdx +199 -0
- package/src/components/Table/Table.stories.tsx +159 -1
- package/src/components/Table/Table.usage.mdx +235 -0
- package/src/components/Tabs/Tabs.stories.tsx +86 -0
- package/src/components/Tabs/Tabs.usage.mdx +219 -0
- package/src/components/Tag/Tag.stories.tsx +181 -4
- package/src/components/Tag/Tag.usage.mdx +257 -0
- package/src/components/Textarea/Textarea.stories.tsx +113 -0
- package/src/components/Textarea/Textarea.usage.mdx +186 -0
- package/src/components/Toast/Toast.stories.tsx +185 -3
- package/src/components/Toast/Toast.styles.ts +18 -10
- package/src/components/Toast/Toast.usage.mdx +265 -0
- package/src/components/Tooltip/Tooltip.stories.tsx +86 -1
- package/src/components/Tooltip/Tooltip.usage.mdx +211 -0
- package/src/components/Tree/Tree.stories.tsx +89 -0
- package/src/components/Tree/Tree.usage.mdx +207 -0
- package/src/components/Typography/Typography.stories.tsx +117 -0
- package/src/components/Typography/Typography.usage.mdx +251 -0
- package/src/components/Workflow/Workflow.usage.mdx +199 -0
- package/src/components/noRawScales.test.ts +5 -1
- package/src/foundations/BrandColour.mdx +65 -2
- package/src/theme/BazePalette.stories.tsx +111 -1
- package/src/theme/Palette.stories.tsx +2 -2
- package/src/theme/SemanticTokens.mdx +75 -16
- package/src/theme/claude.md +15 -9
- package/src/theme/colors.ts +33 -3
- package/src/theme/contrast.test.ts +32 -0
- package/src/theme/palette.generated.ts +99 -0
- 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
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
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
|
+
};
|