@nurihaus/web-design-system 3.7.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +15 -4
  2. package/dist/ai/components.md +658 -12
  3. package/dist/ai/motion.md +431 -0
  4. package/dist/ai/tokens.md +93 -4
  5. package/dist/avatar.js +5 -3
  6. package/dist/bottom-bar.js +261 -0
  7. package/dist/bottom-nav.js +10 -57
  8. package/dist/breadcrumb.js +7 -5
  9. package/dist/callout.js +5 -3
  10. package/dist/card.js +278 -0
  11. package/dist/check-box.js +7 -5
  12. package/dist/chip-group.js +6 -4
  13. package/dist/chunk-1176.js +24 -0
  14. package/dist/chunk-3274.js +71 -0
  15. package/dist/chunk-345.js +72 -0
  16. package/dist/chunk-3547.js +56 -0
  17. package/dist/chunk-6459.js +107 -0
  18. package/dist/{chunk-6364.js → chunk-7335.js} +2 -67
  19. package/dist/chunk-7653.js +4 -0
  20. package/dist/chunk-910.js +26 -13
  21. package/dist/chunk-9497.js +66 -0
  22. package/dist/collapsible-menu.js +6 -4
  23. package/dist/components/badge/badge-props.d.ts +4 -4
  24. package/dist/components/badge/badge.stories.d.ts +1 -1
  25. package/dist/components/bottom-bar/base-bottom-bar.d.ts +4 -0
  26. package/dist/components/bottom-bar/bottom-bar-props.d.ts +1 -0
  27. package/dist/components/bottom-bar/bottom-bar-type.d.ts +3 -0
  28. package/dist/components/bottom-bar/bottom-bar.d.ts +6 -0
  29. package/dist/components/bottom-bar/bottom-bar.stories.d.ts +282 -0
  30. package/dist/components/button/button-type.d.ts +3 -1
  31. package/dist/components/button/button.stories.d.ts +1 -0
  32. package/dist/components/card/base-card.d.ts +3 -0
  33. package/dist/components/card/card-props.d.ts +9 -0
  34. package/dist/components/card/card-type.d.ts +8 -0
  35. package/dist/components/card/card.d.ts +5 -0
  36. package/dist/components/card/card.stories.d.ts +24 -0
  37. package/dist/components/description-list/base-description-list.d.ts +4 -0
  38. package/dist/components/description-list/description-list-props.d.ts +1 -0
  39. package/dist/components/description-list/description-list-type.d.ts +13 -0
  40. package/dist/components/description-list/description-list.d.ts +5 -0
  41. package/dist/components/description-list/description-list.stories.d.ts +20 -0
  42. package/dist/components/empty-state/base-empty-state.d.ts +4 -0
  43. package/dist/components/empty-state/empty-state-props.d.ts +10 -0
  44. package/dist/components/empty-state/empty-state-type.d.ts +14 -0
  45. package/dist/components/empty-state/empty-state.d.ts +5 -0
  46. package/dist/components/empty-state/empty-state.stories.d.ts +300 -0
  47. package/dist/components/icon/icon-paths.d.ts +4 -0
  48. package/dist/components/icon/icon.stories.d.ts +1 -1
  49. package/dist/components/icon-button/base-icon-button.d.ts +3 -0
  50. package/dist/components/icon-button/icon-button-props.d.ts +12 -0
  51. package/dist/components/icon-button/icon-button-type.d.ts +16 -0
  52. package/dist/components/icon-button/icon-button.d.ts +5 -0
  53. package/dist/components/icon-button/icon-button.stories.d.ts +31 -0
  54. package/dist/components/list/base-list.d.ts +7 -0
  55. package/dist/components/list/list-group.d.ts +5 -0
  56. package/dist/components/list/list-group.stories.d.ts +14 -0
  57. package/dist/components/list/list-props.d.ts +2 -0
  58. package/dist/components/list/list-row.d.ts +5 -0
  59. package/dist/components/list/list-row.stories.d.ts +304 -0
  60. package/dist/components/list/list-type.d.ts +25 -0
  61. package/dist/components/media/base-media.d.ts +16 -0
  62. package/dist/components/media/media-props.d.ts +5 -0
  63. package/dist/components/media/media-thumbnail.d.ts +4 -0
  64. package/dist/components/media/media-thumbnail.stories.d.ts +34 -0
  65. package/dist/components/media/media-type.d.ts +43 -0
  66. package/dist/components/media/media-viewer.d.ts +4 -0
  67. package/dist/components/media/media-viewer.stories.d.ts +24 -0
  68. package/dist/components/message/base-message.d.ts +11 -0
  69. package/dist/components/message/message-event.d.ts +6 -0
  70. package/dist/components/message/message-props.d.ts +17 -0
  71. package/dist/components/message/message-thread.d.ts +6 -0
  72. package/dist/components/message/message-type.d.ts +21 -0
  73. package/dist/components/message/message.d.ts +5 -0
  74. package/dist/components/message/message.stories.d.ts +313 -0
  75. package/dist/components/message-composer/base-message-composer.d.ts +11 -0
  76. package/dist/components/message-composer/message-composer-props.d.ts +1 -0
  77. package/dist/components/message-composer/message-composer-type.d.ts +31 -0
  78. package/dist/components/message-composer/message-composer.d.ts +5 -0
  79. package/dist/components/message-composer/message-composer.stories.d.ts +46 -0
  80. package/dist/components/motion/motion-provider.d.ts +5 -0
  81. package/dist/components/motion/motion-type.d.ts +6 -0
  82. package/dist/components/motion/motion.d.ts +2 -0
  83. package/dist/components/motion/motion.stories.d.ts +23 -0
  84. package/dist/components/notice/base-notice.d.ts +4 -0
  85. package/dist/components/notice/notice-props.d.ts +16 -0
  86. package/dist/components/notice/notice-type.d.ts +21 -0
  87. package/dist/components/notice/notice.d.ts +5 -0
  88. package/dist/components/notice/notice.stories.d.ts +304 -0
  89. package/dist/components/radio/base-radio.d.ts +2 -1
  90. package/dist/components/radio/radio-props.d.ts +9 -1
  91. package/dist/components/radio/radio-type.d.ts +9 -0
  92. package/dist/components/radio/radio.stories.d.ts +10 -0
  93. package/dist/components/tag/base-tag.d.ts +8 -0
  94. package/dist/components/tag/tag-props.d.ts +1 -0
  95. package/dist/components/tag/tag-type.d.ts +20 -0
  96. package/dist/components/tag/tag.d.ts +4 -0
  97. package/dist/components/tag/tag.stories.d.ts +14 -0
  98. package/dist/components.css +1330 -171
  99. package/dist/cta-button.js +38 -21
  100. package/dist/data-table.js +5 -3
  101. package/dist/description-list.js +274 -0
  102. package/dist/drawer.js +7 -5
  103. package/dist/drop-down.js +8 -6
  104. package/dist/empty-state.js +300 -0
  105. package/dist/helpers/utils/fillLinkChild.d.ts +6 -0
  106. package/dist/icon-button.js +338 -0
  107. package/dist/icon-text-badge.js +11 -9
  108. package/dist/icon-text-option-badge.js +8 -6
  109. package/dist/icon.js +7 -4
  110. package/dist/index.d.ts +30 -2
  111. package/dist/index.js +2482 -223
  112. package/dist/list-group.js +253 -0
  113. package/dist/list-row.js +308 -0
  114. package/dist/loading.js +6 -4
  115. package/dist/media-thumbnail.js +412 -0
  116. package/dist/media-viewer.js +274 -0
  117. package/dist/message-composer.js +399 -0
  118. package/dist/message-event.js +216 -0
  119. package/dist/message-thread.js +216 -0
  120. package/dist/message.js +271 -0
  121. package/dist/modal-with-double-button.js +15 -11
  122. package/dist/modal.js +9 -7
  123. package/dist/motion.js +52 -0
  124. package/dist/notice.js +346 -0
  125. package/dist/option-badge.js +11 -9
  126. package/dist/pagination.js +8 -6
  127. package/dist/radio.js +114 -30
  128. package/dist/skeleton.js +4 -2
  129. package/dist/step-progress.js +4 -2
  130. package/dist/styles.css +1215 -130
  131. package/dist/switch.js +6 -4
  132. package/dist/tabs.js +5 -3
  133. package/dist/tag.js +311 -0
  134. package/dist/text-area.js +8 -6
  135. package/dist/text-field.js +8 -6
  136. package/dist/text.js +5 -3
  137. package/dist/toast.js +15 -11
  138. package/dist/tokens/generated/index.d.ts +1 -0
  139. package/dist/tokens/generated/motion.d.ts +153 -0
  140. package/dist/tokens.css +122 -2
  141. package/dist/tokens.js +156 -1
  142. package/dist/tooltip.js +6 -4
  143. package/package.json +67 -1
@@ -0,0 +1,431 @@
1
+ <!-- tokens/motion.json 에서 생성됨 — 손으로 고치지 않는다. `yarn tokens` -->
2
+
3
+ # 모션 토큰
4
+
5
+ 모션은 원시값(primitive) → 의미 토큰 → 컴포넌트 3층이다. 컴포넌트와 화면은 의미 토큰만 쓴다.
6
+
7
+ - CSS 는 `var(--motion-{토큰}-{키})` 를 쓴다. `--duration-*`·`--ease-*` 를 직접 쓰지 않는다.
8
+ - JS(motion 라이브러리)는 `motionTokens` 를 쓴다. 시간은 초다. CSS 변수의 시간은 ms 다.
9
+ - 스프링은 CSS 에서 `linear()` 곡선과 settle 시간 두 변수로 재생한다. motion 없이 CSS 만으로 같은 곡선이 나온다.
10
+ - `prefers-reduced-motion: reduce` 이면 시간 변수가 모두 `0ms` 가 된다. `MotionProvider` 는 motion 쪽을 같은 설정에 맞춘다.
11
+
12
+ ## 의미 토큰
13
+
14
+ ### press
15
+
16
+ | 항목 | 내용 |
17
+ | --- | --- |
18
+ | 뜻 | 눌림 피드백 |
19
+ | 트리거 | pointerdown 부터 pointerup 까지 |
20
+ | 붙는 곳 | onClick 이나 href 가 있는 모든 표면(버튼·칩·탭·행·카드·키) |
21
+ | 붙이지 않는 곳 | 텍스트 입력, disabled 표면 |
22
+ | 구현층 | `css` |
23
+ | prop | `pressEffect` |
24
+ | reduced-motion | 전환 0ms. 색·scale 은 즉시 바뀐다 |
25
+ | 작업 | KAN-9516 |
26
+
27
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['press']` | 풀린 값 |
28
+ | --- | --- | --- | --- | --- |
29
+ | `duration` | `--motion-press-duration` | `var(--duration-xs)` | `0.12` | 120ms |
30
+ | `ease` | `--motion-press-ease` | `var(--ease-out)` | `[0.25,0.1,0.25,1]` | cubic-bezier(0.25, 0.1, 0.25, 1) |
31
+ | `scale` | `--motion-press-scale` | `0.98` | `0.98` | 0.98 |
32
+ | `dim` | `--motion-press-dim` | `0.12` | `0.12` | 0.12 |
33
+
34
+ ### confirm
35
+
36
+ | 항목 | 내용 |
37
+ | --- | --- |
38
+ | 뜻 | 선택 확정 피드백 |
39
+ | 트리거 | 사용자 조작으로 값이 바뀜. prop 으로 값을 바꾼 것은 움직이지 않는다 |
40
+ | 붙는 곳 | boolean·선택 컨트롤(Checkbox·Radio·Switch·Rating). 세기 weak·strong 과 delay 를 고른다 |
41
+ | 붙이지 않는 곳 | 값이 바뀌어도 선택이 아닌 것(입력 글자, 페이지 번호) |
42
+ | 구현층 | `motion` |
43
+ | prop | `motion` · `delay` |
44
+ | reduced-motion | MotionConfig 가 transform 을 끄고 색만 바뀐다 |
45
+ | 작업 | KAN-9517 |
46
+
47
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['confirm']` | 풀린 값 |
48
+ | --- | --- | --- | --- | --- |
49
+ | `weak` | `--motion-confirm-weak-ease` | `var(--ease-spring-small)` | `{"type":"spring","stiffness":480,"damping":50,"mass":1}` | stiffness 480 · damping 50 |
50
+ | | `--motion-confirm-weak-duration` | `var(--duration-spring-small)` | | |
51
+ | `strong` | `--motion-confirm-strong-ease` | `var(--ease-spring-bounce)` | `{"type":"spring","stiffness":300,"damping":15,"mass":1}` | stiffness 300 · damping 15 |
52
+ | | `--motion-confirm-strong-duration` | `var(--duration-spring-bounce)` | | |
53
+
54
+ ### reject
55
+
56
+ | 항목 | 내용 |
57
+ | --- | --- |
58
+ | 뜻 | 거부·불가 피드백 |
59
+ | 트리거 | 막힌 조작(disabled 클릭, 닫기 금지 오버레이 클릭, 경계값 초과) |
60
+ | 붙는 곳 | 막힌 조작을 받은 표면 그 자체 |
61
+ | 붙이지 않는 곳 | 오류 문구가 이미 보이는 입력. 흔들림을 오류 알림 대신 쓰지 않는다 |
62
+ | 구현층 | `css` |
63
+ | prop | 없음 |
64
+ | reduced-motion | 흔들지 않는다. 시간이 0ms 가 된다 |
65
+ | 작업 | KAN-9517, KAN-9519 |
66
+
67
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['reject']` | 풀린 값 |
68
+ | --- | --- | --- | --- | --- |
69
+ | `duration` | `--motion-reject-duration` | `var(--duration-l)` | `0.35` | 350ms |
70
+ | `ease` | `--motion-reject-ease` | `var(--ease-linear)` | `"linear"` | linear |
71
+ | `distance` | `--motion-reject-distance` | `2px` | `"2px"` | 2px |
72
+
73
+ ### enter
74
+
75
+ | 항목 | 내용 |
76
+ | --- | --- |
77
+ | 뜻 | 콘텐츠 등장 |
78
+ | 트리거 | mount, data-state open |
79
+ | 붙는 곳 | 오버레이(Modal·Drawer·Toast·Tooltip)와 조건부 렌더 블록. 중앙 오버레이는 scale, 가장자리는 slide, 그 밖은 fade. 세기 weak·strong. 대상에 붙은 말풍선(Callout)은 꼬리에서 pop |
80
+ | 붙이지 않는 곳 | 첫 화면에 처음부터 있는 콘텐츠, 목록의 항목 하나하나(reveal 을 쓴다) |
81
+ | 구현층 | `css` |
82
+ | prop | `motion` · `onEntered` |
83
+ | reduced-motion | 시간이 0ms 가 되어 바로 보인다. onEntered 는 그대로 불린다 |
84
+ | 작업 | KAN-9518, KAN-9528 |
85
+
86
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['enter']` | 풀린 값 |
87
+ | --- | --- | --- | --- | --- |
88
+ | `duration` | `--motion-enter-duration` | `var(--duration-m)` | `0.24` | 240ms |
89
+ | `ease` | `--motion-enter-ease` | `var(--ease-out)` | `[0.25,0.1,0.25,1]` | cubic-bezier(0.25, 0.1, 0.25, 1) |
90
+ | `strong` | `--motion-enter-strong-ease` | `var(--ease-spring-bounce)` | `{"type":"spring","stiffness":300,"damping":15,"mass":1}` | stiffness 300 · damping 15 |
91
+ | | `--motion-enter-strong-duration` | `var(--duration-spring-bounce)` | | |
92
+ | `scale-from` | `--motion-enter-scale-from` | `0.96` | `0.96` | 0.96 |
93
+ | `offset` | `--motion-enter-offset` | `16px` | `"16px"` | 16px |
94
+ | `pop-scale` | `--motion-enter-pop-scale` | `0.6` | `0.6` | 0.6 |
95
+
96
+ ### exit
97
+
98
+ | 항목 | 내용 |
99
+ | --- | --- |
100
+ | 뜻 | 콘텐츠 퇴장 |
101
+ | 트리거 | unmount, data-state closed |
102
+ | 붙는 곳 | enter 와 같은 대상 |
103
+ | 붙이지 않는 곳 | enter 가 없는 콘텐츠 |
104
+ | 구현층 | `css` |
105
+ | prop | `onExited` |
106
+ | reduced-motion | 시간이 0ms 가 되어 바로 사라진다. onExited 는 그대로 불린다 |
107
+ | 작업 | KAN-9518 |
108
+
109
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['exit']` | 풀린 값 |
110
+ | --- | --- | --- | --- | --- |
111
+ | `duration` | `--motion-exit-duration` | `var(--duration-s)` | `0.16` | 160ms |
112
+ | `ease` | `--motion-exit-ease` | `var(--ease-in)` | `[0.4,0,1,1]` | cubic-bezier(0.4, 0, 1, 1) |
113
+
114
+ ### appear
115
+
116
+ | 항목 | 내용 |
117
+ | --- | --- |
118
+ | 뜻 | 지연 등장(주의 끌기) |
119
+ | 트리거 | 화면 진입 뒤 delay |
120
+ | 붙는 곳 | 행동 유도 요소(CTA·BottomNav)에 명시 prop 으로만 |
121
+ | 붙이지 않는 곳 | 기본값으로 켜기. 한 화면에 둘 이상 |
122
+ | 구현층 | `css` |
123
+ | prop | `appear` |
124
+ | reduced-motion | delay 없이 바로 보인다 |
125
+ | 작업 | KAN-9521 |
126
+
127
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['appear']` | 풀린 값 |
128
+ | --- | --- | --- | --- | --- |
129
+ | `duration` | `--motion-appear-duration` | `var(--duration-m)` | `0.24` | 240ms |
130
+ | `ease` | `--motion-appear-ease` | `var(--ease-out)` | `[0.25,0.1,0.25,1]` | cubic-bezier(0.25, 0.1, 0.25, 1) |
131
+
132
+ ### reveal
133
+
134
+ | 항목 | 내용 |
135
+ | --- | --- |
136
+ | 뜻 | 집합의 순차 등장 |
137
+ | 트리거 | 집합 첫 렌더 |
138
+ | 붙는 곳 | 동질 항목의 집합(StepProgress 단계·목록·격자) |
139
+ | 붙이지 않는 곳 | 다시 그릴 때마다 반복하기, 항목이 많은 목록(앞 몇 개만) |
140
+ | 구현층 | `css` |
141
+ | prop | `animated` |
142
+ | reduced-motion | 한꺼번에 바로 보인다 |
143
+ | 작업 | KAN-9520 |
144
+
145
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['reveal']` | 풀린 값 |
146
+ | --- | --- | --- | --- | --- |
147
+ | `duration` | `--motion-reveal-duration` | `var(--duration-m)` | `0.24` | 240ms |
148
+ | `ease` | `--motion-reveal-ease` | `var(--ease-out)` | `[0.25,0.1,0.25,1]` | cubic-bezier(0.25, 0.1, 0.25, 1) |
149
+ | `gap` | `--motion-reveal-gap` | `80ms` | `0.08` | 80ms |
150
+
151
+ ### progress
152
+
153
+ | 항목 | 내용 |
154
+ | --- | --- |
155
+ | 뜻 | 값 변화의 연속 표현 |
156
+ | 트리거 | 수치 prop 변경. 첫 렌더는 움직이지 않는다 |
157
+ | 붙는 곳 | 진행도·위치를 보여주는 것(StepProgress·Tabs 인디케이터) |
158
+ | 붙이지 않는 곳 | 값이 아니라 콘텐츠가 바뀌는 것 |
159
+ | 구현층 | `css` |
160
+ | prop | 없음 |
161
+ | reduced-motion | 새 위치로 바로 옮긴다 |
162
+ | 작업 | KAN-9523, KAN-9527 |
163
+
164
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['progress']` | 풀린 값 |
165
+ | --- | --- | --- | --- | --- |
166
+ | `duration` | `--motion-progress-duration` | `var(--duration-m)` | `0.24` | 240ms |
167
+ | `spring` | `--motion-progress-spring-ease` | `var(--ease-spring-basic)` | `{"type":"spring","stiffness":200,"damping":30,"mass":1}` | stiffness 200 · damping 30 |
168
+ | | `--motion-progress-spring-duration` | `var(--duration-spring-basic)` | | |
169
+
170
+ ### expand
171
+
172
+ | 항목 | 내용 |
173
+ | --- | --- |
174
+ | 뜻 | 펼침·접힘 |
175
+ | 트리거 | open 토글 |
176
+ | 붙는 곳 | 접히는 컨테이너와 화살표 회전(CollapsibleMenu·DropDown 화살표) |
177
+ | 붙이지 않는 곳 | 오버레이로 뜨는 목록 자체(enter 를 쓴다) |
178
+ | 구현층 | `css` |
179
+ | prop | 없음 |
180
+ | reduced-motion | 바로 펼쳐지고 화살표는 바로 돈다 |
181
+ | 작업 | KAN-9524 |
182
+
183
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['expand']` | 풀린 값 |
184
+ | --- | --- | --- | --- | --- |
185
+ | `duration` | `--motion-expand-duration` | `var(--duration-m)` | `0.24` | 240ms |
186
+ | `ease` | `--motion-expand-ease` | `var(--ease-out)` | `[0.25,0.1,0.25,1]` | cubic-bezier(0.25, 0.1, 0.25, 1) |
187
+ | `rotate` | `--motion-expand-rotate` | `180deg` | `"180deg"` | 180deg |
188
+
189
+ ### dismiss-on-scroll
190
+
191
+ | 항목 | 내용 |
192
+ | --- | --- |
193
+ | 뜻 | 스크롤 방향 따라 숨김 |
194
+ | 트리거 | 스크롤 방향 전환 |
195
+ | 붙는 곳 | 고정 바(BottomNav). opt-in |
196
+ | 붙이지 않는 곳 | 기본값으로 켜기, 화면 안 콘텐츠 |
197
+ | 구현층 | `css+hook` |
198
+ | prop | `hideOnScroll` |
199
+ | reduced-motion | 숨김과 보임이 바로 바뀐다 |
200
+ | 작업 | KAN-9522 |
201
+
202
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['dismiss-on-scroll']` | 풀린 값 |
203
+ | --- | --- | --- | --- | --- |
204
+ | `duration` | `--motion-dismiss-on-scroll-duration` | `var(--duration-m)` | `0.24` | 240ms |
205
+ | `ease` | `--motion-dismiss-on-scroll-ease` | `var(--ease-out)` | `[0.25,0.1,0.25,1]` | cubic-bezier(0.25, 0.1, 0.25, 1) |
206
+ | `threshold` | `--motion-dismiss-on-scroll-threshold` | `1px` | `"1px"` | 1px |
207
+
208
+ ### attention
209
+
210
+ | 항목 | 내용 |
211
+ | --- | --- |
212
+ | 뜻 | 주목 유도(shine·blink) |
213
+ | 트리거 | 명령형 호출(ref 메서드) |
214
+ | 붙는 곳 | 행·카드·배지. 자동 재생 금지 |
215
+ | 붙이지 않는 곳 | 마운트하자마자 재생, 반복 재생 |
216
+ | 구현층 | `css+hook` |
217
+ | prop | 없음 |
218
+ | reduced-motion | 재생하지 않는다 |
219
+ | 작업 | KAN-9525 |
220
+
221
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['attention']` | 풀린 값 |
222
+ | --- | --- | --- | --- | --- |
223
+ | `shine` | `--motion-attention-shine` | `2500ms` | `2.5` | 2500ms |
224
+ | `blink` | `--motion-attention-blink` | `300ms` | `0.3` | 300ms |
225
+ | `float-distance` | `--motion-attention-float-distance` | `3px` | `"3px"` | 3px |
226
+
227
+ ### busy
228
+
229
+ | 항목 | 내용 |
230
+ | --- | --- |
231
+ | 뜻 | 진행 중 |
232
+ | 트리거 | loading prop |
233
+ | 붙는 곳 | 비동기 액션 버튼·로더. 너비를 유지하고 aria-busy 를 단다 |
234
+ | 붙이지 않는 곳 | 1초 안에 끝나는 동작에 깜빡 보이기 |
235
+ | 구현층 | `css` |
236
+ | prop | `loading` · `animated` |
237
+ | reduced-motion | 링·shimmer·dots 가 멈춘다. aria-busy 와 글자로 상태를 알린다 |
238
+ | 작업 | KAN-9526 |
239
+
240
+ | 키 | CSS 변수 | CSS 값 | JS `motionTokens['busy']` | 풀린 값 |
241
+ | --- | --- | --- | --- | --- |
242
+ | `ring` | `--motion-busy-ring` | `1200ms` | `1.2` | 1200ms |
243
+ | `ring-ease` | `--motion-busy-ring-ease` | `var(--ease-symmetric)` | `[0.5,0,0.5,1]` | cubic-bezier(0.5, 0, 0.5, 1) |
244
+ | `shimmer` | `--motion-busy-shimmer` | `1500ms` | `1.5` | 1500ms |
245
+ | `dots` | `--motion-busy-dots` | `600ms` | `0.6` | 600ms |
246
+
247
+ ## 원시값
248
+
249
+ ### duration
250
+
251
+ | 이름 | CSS 변수 | ms |
252
+ | --- | --- | --- |
253
+ | `xs` | `--duration-xs` | 120 |
254
+ | `s` | `--duration-s` | 160 |
255
+ | `m` | `--duration-m` | 240 |
256
+ | `l` | `--duration-l` | 350 |
257
+ | `xl` | `--duration-xl` | 500 |
258
+
259
+ ### ease
260
+
261
+ | 이름 | CSS 변수 | 값 |
262
+ | --- | --- | --- |
263
+ | `out` | `--ease-out` | `cubic-bezier(0.25, 0.1, 0.25, 1)` |
264
+ | `in` | `--ease-in` | `cubic-bezier(0.4, 0, 1, 1)` |
265
+ | `in-out` | `--ease-in-out` | `cubic-bezier(0.4, 0, 0.1, 1)` |
266
+ | `back` | `--ease-back` | `cubic-bezier(0.34, 1.56, 0.64, 1)` |
267
+ | `symmetric` | `--ease-symmetric` | `cubic-bezier(0.5, 0, 0.5, 1)` |
268
+ | `linear` | `--ease-linear` | `linear` |
269
+
270
+ ### spring
271
+
272
+ 질량은 1 이다. settle 은 |x−1| < 0.001 이고 속도가 0.01/s 밑으로 내려간 뒤 다시 벗어나지 않는 시간이다.
273
+
274
+ | 이름 | stiffness | damping | 곡선 변수 | 시간 변수 | settle ms | 점 수 |
275
+ | --- | --- | --- | --- | --- | --- | --- |
276
+ | `rapid` | 1000 | 55 | `--ease-spring-rapid` | `--duration-spring-rapid` | 318 | 40 |
277
+ | `quick` | 800 | 55 | `--ease-spring-quick` | `--duration-spring-quick` | 334 | 40 |
278
+ | `small` | 480 | 50 | `--ease-spring-small` | `--duration-spring-small` | 587 | 59 |
279
+ | `medium` | 270 | 25 | `--ease-spring-medium` | `--duration-spring-medium` | 552 | 56 |
280
+ | `basic` | 200 | 30 | `--ease-spring-basic` | `--duration-spring-basic` | 761 | 77 |
281
+ | `large` | 100 | 15 | `--ease-spring-large` | `--duration-spring-large` | 876 | 88 |
282
+ | `bounce` | 300 | 15 | `--ease-spring-bounce` | `--duration-spring-bounce` | 958 | 96 |
283
+ | `slow` | 70 | 20 | `--ease-spring-slow` | `--duration-spring-slow` | 1604 | 161 |
284
+
285
+ ## 적용 매핑표
286
+
287
+ 컴포넌트마다 어느 토큰이 붙는지 정한 표다. `✓` 는 규칙에 걸려 붙고, `opt` 는 prop 을 줄 때만 붙는다. 컴포넌트에 실제로 붙이는 일은 표의 작업 키가 한다.
288
+
289
+ | 컴포넌트 | press | confirm | reject | enter | exit | appear | reveal | progress | expand | dismiss-on-scroll | attention | busy |
290
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
291
+ | Avatar | – | – | – | – | – | – | – | – | – | – | – | – |
292
+ | CTAButton | ✓ | – | ✓ | – | – | opt | – | – | – | – | – | ✓ |
293
+ | OptionBadge | – | – | – | – | – | – | – | – | – | – | opt | – |
294
+ | IconTextBadge | – | – | – | – | – | – | – | – | – | – | opt | – |
295
+ | IconTextOptionBadge | – | – | – | – | – | – | – | – | – | – | opt | – |
296
+ | DataTable | ✓ | – | – | – | – | – | – | – | – | – | opt | – |
297
+ | TextField | – | – | – | – | – | – | – | – | – | – | – | – |
298
+ | Radio | ✓ | ✓ | – | – | – | – | – | – | – | – | – | – |
299
+ | Checkbox | ✓ | ✓ | – | – | – | – | – | – | – | – | – | – |
300
+ | Switch | ✓ | ✓ | – | – | – | – | – | – | – | – | – | – |
301
+ | TextArea | – | – | – | – | – | – | – | – | – | – | – | – |
302
+ | Toast | – | – | – | ✓ | ✓ | – | – | – | – | – | – | – |
303
+ | ToastProvider | – | – | – | – | – | – | – | – | – | – | – | – |
304
+ | Pagination | ✓ | – | – | – | – | – | – | – | – | – | – | – |
305
+ | Modal | – | – | – | ✓ | ✓ | – | – | – | – | – | – | – |
306
+ | Drawer | – | – | – | ✓ | ✓ | – | – | – | – | – | – | – |
307
+ | Skeleton | – | – | – | – | – | – | – | – | – | – | – | ✓ |
308
+ | Breadcrumb | ✓ | – | – | – | – | – | – | – | – | – | – | – |
309
+ | DropDown | ✓ | – | – | ✓ | ✓ | – | – | – | ✓ | – | – | – |
310
+ | CollapsibleMenu | ✓ | – | – | – | – | – | – | – | ✓ | – | – | – |
311
+ | Text | – | – | – | – | – | – | – | – | – | – | – | – |
312
+ | Tooltip | – | – | – | ✓ | ✓ | – | – | – | – | – | – | – |
313
+ | TooltipProvider | – | – | – | – | – | – | – | – | – | – | – | – |
314
+ | Tabs | ✓ | – | – | – | – | – | – | ✓ | – | – | – | – |
315
+ | ModalWithDoubleButton | – | – | – | ✓ | ✓ | – | – | – | – | – | – | – |
316
+ | Spinner | – | – | – | – | – | – | – | – | – | – | – | ✓ |
317
+ | InlineLoading | – | – | – | – | – | – | – | – | – | – | – | ✓ |
318
+ | OverlayLoading | – | – | – | ✓ | ✓ | – | – | – | – | – | – | ✓ |
319
+ | Icon | – | – | – | – | – | – | – | – | – | – | – | – |
320
+ | BottomNav | ✓ | – | – | – | – | opt | – | ✓ | – | opt | – | – |
321
+ | StepProgress | – | – | – | – | – | – | opt | ✓ | – | – | – | – |
322
+ | ChipGroup | ✓ | ✓ | – | – | – | – | – | – | – | – | – | – |
323
+ | LogProvider | – | – | – | – | – | – | – | – | – | – | – | – |
324
+ | MotionProvider | – | – | – | – | – | – | – | – | – | – | – | – |
325
+ | Callout | – | – | – | ✓ | – | – | – | – | – | – | ✓ | – |
326
+ | Card | ✓ | – | – | – | – | – | – | – | – | – | opt | – |
327
+ | ListGroup | – | – | – | – | – | – | – | – | – | – | – | – |
328
+ | ListRow | ✓ | – | – | – | – | – | – | – | – | – | opt | – |
329
+ | DescriptionList | – | – | – | – | – | – | – | – | – | – | – | – |
330
+ | Notice | – | – | – | opt | – | – | – | – | – | – | – | – |
331
+ | EmptyState | – | – | – | – | – | – | – | – | – | – | – | – |
332
+ | Tag | ✓ | – | – | – | – | – | – | – | – | – | – | – |
333
+ | MessageThread | – | – | – | – | – | – | – | – | – | – | – | – |
334
+ | Message | – | – | – | opt | – | – | – | – | – | – | – | – |
335
+ | MessageEvent | – | – | – | – | – | – | – | – | – | – | – | – |
336
+ | MessageComposer | ✓ | – | ✓ | – | – | – | – | – | – | – | – | ✓ |
337
+ | BottomBar | – | – | – | – | – | – | – | – | – | – | – | – |
338
+ | MediaThumbnail | ✓ | – | – | – | – | – | – | – | – | – | – | ✓ |
339
+ | MediaViewer | – | – | – | ✓ | ✓ | – | – | – | – | – | – | – |
340
+ | IconButton | ✓ | – | – | – | – | – | – | – | – | – | – | – |
341
+
342
+ ### 판단 근거
343
+
344
+ - **Avatar** 없음. onClick 을 받지 않는 표시용 이미지다. 누를 수 있게 하려면 쓰는 쪽이 버튼으로 감싸고 그 버튼이 press 를 받는다
345
+ - **CTAButton** press: onClick 표면 (KAN-9516) · reject: disabled 상태에서 누르면 막힌 조작이다 (KAN-9517) · appear(opt): 행동 유도 요소. appear prop 으로만 (KAN-9521) · busy: loading prop 이 있는 비동기 액션 버튼 (KAN-9526)
346
+ - **OptionBadge** attention(opt): 배지. 값이 새로 생긴 순간 쓰는 쪽이 ref 메서드로 부른다 (KAN-9525)
347
+ - **IconTextBadge** attention(opt): 배지. 값이 새로 생긴 순간 쓰는 쪽이 ref 메서드로 부른다 (KAN-9525)
348
+ - **IconTextOptionBadge** attention(opt): 배지. 값이 새로 생긴 순간 쓰는 쪽이 ref 메서드로 부른다 (KAN-9525)
349
+ - **DataTable** press: onClickRow·onClickCell 이 있는 행과 칸은 onClick 표면이다. 없는 행은 붙지 않는다 (KAN-9516) · attention(opt): 행. 방금 바뀐 행을 쓰는 쪽이 ref 메서드로 짚는다 (KAN-9525)
350
+ - **TextField** 없음. 텍스트 입력은 press 의 avoid 대상이다. 글자가 바뀌는 것은 선택이 아니라 confirm 도 아니다.
351
+ - **Radio** press: 선택지마다 누르는 표면이다 (KAN-9516) · confirm: 하나를 고르는 선택 컨트롤 (KAN-9517)
352
+ - **Checkbox** press: 누르는 표면이다 (KAN-9516) · confirm: boolean 선택 컨트롤 (KAN-9517)
353
+ - **Switch** press: 누르는 표면이다 (KAN-9516) · confirm: boolean 선택 컨트롤. 손잡이 이동과 트랙 색이 확정 피드백이다 (KAN-9517)
354
+ - **TextArea** 없음. 텍스트 입력은 press 의 avoid 대상이다. 글자가 바뀌는 것은 선택이 아니라 confirm 도 아니다
355
+ - **Toast** enter: 가장자리 오버레이라 slide 와 fade 로 들어온다 (KAN-9518) · exit: enter 와 같은 대상. 스와이프로 밀어 닫을 때도 exit 다 (KAN-9518)
356
+ - **ToastProvider** 없음. 토스트 자리(viewport)만 그린다. 모션은 각 Toast 가 받는다
357
+ - **Pagination** press: 페이지 버튼은 onClick 표면이다 (KAN-9516)
358
+ - **Modal** enter: 중앙 오버레이라 scale 로 들어온다 (KAN-9518) · exit: enter 와 같은 대상 (KAN-9518)
359
+ - **Drawer** enter: 가장자리 오버레이라 slide 로 들어오고 바탕은 fade 다 (KAN-9518) · exit: enter 와 같은 대상 (KAN-9518)
360
+ - **Skeleton** busy: 로딩 자리표시. animated 가 켜지면 shimmer 가 흐른다 (KAN-9526)
361
+ - **Breadcrumb** press: href·onItemClick 이 있는 항목은 누르는 표면이다 (KAN-9516)
362
+ - **DropDown** press: 트리거와 항목은 누르는 표면이다 (KAN-9516) · enter: 목록이 떠 있는 오버레이로 열린다. 중앙이 아니라 fade (KAN-9518) · exit: enter 와 같은 대상 (KAN-9518) · expand: 열림에 따라 트리거 화살표가 돈다 (KAN-9524)
363
+ - **CollapsibleMenu** press: 행은 누르는 표면이다 (KAN-9516) · expand: 하위 메뉴가 접히고 화살표가 돈다 (KAN-9524)
364
+ - **Text** 없음. 글자만 그린다
365
+ - **Tooltip** enter: 떠 있는 오버레이다. 작아서 fade (KAN-9518) · exit: enter 와 같은 대상 (KAN-9518)
366
+ - **TooltipProvider** 없음. DOM 을 그리지 않는다. 지연 시간만 나눠 준다
367
+ - **Tabs** press: 트리거는 onClick 표면 (KAN-9516) · progress: 인디케이터 위치가 값에 따라 움직인다 (KAN-9527)
368
+ - **ModalWithDoubleButton** enter: Modal 을 그대로 쓰는 중앙 오버레이. 버튼의 press 는 CTAButton 행이 받는다 (KAN-9518) · exit: enter 와 같은 대상 (KAN-9518)
369
+ - **Spinner** busy: 로더 링 (KAN-9526)
370
+ - **InlineLoading** busy: Spinner 링을 그대로 쓴다. 옛 모션은 Spinner 행에 있다 (KAN-9526)
371
+ - **OverlayLoading** busy: Spinner 링을 그대로 쓴다 (KAN-9526) · enter: open 으로 나타나는 화면 전체 오버레이. 바탕은 fade (KAN-9518) · exit: enter 와 같은 대상 (KAN-9518)
372
+ - **Icon** 없음. 장식 그림이다. 모션은 감싸는 컴포넌트가 정한다
373
+ - **BottomNav** press: 탭은 href 가 있는 표면이다 (KAN-9516) · progress: 선택 캡슐 위치가 value 에 따라 움직인다 (KAN-9527) · appear(opt): 행동 유도 요소. appear prop 으로만 (KAN-9521) · dismiss-on-scroll(opt): 고정 바. hideOnScroll prop 으로만 (KAN-9522)
374
+ - **StepProgress** progress: current 가 바뀌면 진행 막대가 따라 채워진다 (KAN-9523) · reveal(opt): 동질 단계의 집합. animated prop 으로만 첫 렌더에 순차 등장 (KAN-9520)
375
+ - **ChipGroup** press: 칩은 onClick 표면이다 (KAN-9516) · confirm: 하나를 고르는 선택 컨트롤이다. 고른 칩의 색 바뀜이 확정 피드백이다 (KAN-9517)
376
+ - **LogProvider** 없음. DOM 을 그리지 않는다
377
+ - **MotionProvider** 없음. DOM 을 그리지 않는다. 다른 컴포넌트의 motion 층이 이 아래에서 돈다
378
+ - **Callout** enter: 대상에 붙은 말풍선. 꼬리에서 pop 으로 나타난다(ADR 0007) (KAN-9518) · attention: 나타난 뒤 세 번 둥실 움직인다(ADR 0007). 자동 재생이라 attention 의 '명령형 호출로만' 규칙과 어긋난다. KAN-9525 에서 규칙이나 Callout 중 하나를 고친다 (KAN-9525)
379
+ - **Card** press: 링크·버튼 카드(asChild 로 a[href]·button)는 누르는 표면이다. 보기만 하는 카드는 붙지 않는다 (KAN-9451) · attention(opt): 카드. 방금 생긴 카드를 쓰는 쪽이 ref 메서드로 짚는다 (KAN-9525)
380
+ - **ListGroup** 없음. 면과 제목만 그린다. 눌림은 각 ListRow 가 받는다
381
+ - **ListRow** press: onClick·링크가 있는 행은 누르는 표면이다. 폭이 꽉 찬 행이라 scale 대신 배경이 어두워진다 (KAN-9451) · attention(opt): 행. 방금 바뀐 행을 쓰는 쪽이 ref 메서드로 짚는다 (KAN-9525)
382
+ - **DescriptionList** 없음. 이름–값 글자만 그린다. 누르는 표면이 아니다
383
+ - **Notice** enter(opt): 조건부로 나타나는 인라인 안내. motion prop 을 줄 때만 fade 로 들어온다. 나갈 때 모션은 presence 가 필요해 두지 않는다 (KAN-9451)
384
+ - **EmptyState** 없음. 누를 곳이 없는 표시용 화면이다. 버튼은 쓰는 쪽이 넘긴 CTAButton 이 press 를 받는다
385
+ - **Tag** press: 지우기 버튼(X)은 onClick 표면이다 (KAN-9451)
386
+ - **MessageThread** 없음. 목록 틀이다. 등장 모션은 항목(Message)이 가진다
387
+ - **Message** enter(opt): 방금 보내거나 받은 메시지만 motion prop 으로. 처음 그린 대화는 움직이지 않는다 (KAN-9451)
388
+ - **MessageEvent** 없음. 대화 가운데 날짜·상태 줄. 움직이지 않는다
389
+ - **MessageComposer** press: 보내기 버튼은 onClick 표면 (KAN-9451) · reject: 보낼 수 없을 때(빈 값·disabled) 누르면 막힌 조작이다 (KAN-9451) · busy: loading prop 이면 보내기 원에 Spinner (KAN-9451)
390
+ - **BottomBar** 없음. 주 행동·입력을 담는 고정 바라 스크롤로 숨기지 않는다
391
+ - **MediaThumbnail** press: 여는 버튼은 onClick 표면이다 (KAN-9451) · busy: 올리는 중(loading) 에 Spinner 를 덮는다 (KAN-9451)
392
+ - **MediaViewer** enter: 화면 전체 오버레이라 scale 로 들어오고 바탕은 fade 다 (KAN-9451) · exit: enter 와 같은 대상 (KAN-9451)
393
+ - **IconButton** press: onClick·링크가 있는 누르는 표면이다. ghost 는 누르는 동안 회색 원도 보인다 (KAN-9451)
394
+
395
+ ### 바꿀 옛 모션
396
+
397
+ 지금 컴포넌트 CSS 에 있는 모션과, 작업이 그것을 바꿀 토큰이다.
398
+
399
+ - **Switch** `switch-style.css:42 transition background-color var(--motion-fast) var(--motion-ease)` → confirm
400
+ - **Switch** `switch-style.css:76 transition transform var(--motion-fast) var(--motion-ease)` → confirm
401
+ - **Toast** `toast-style.css:10 animation motion-enter-slide·motion-enter-fade var(--motion-base) var(--motion-ease)` → enter
402
+ - **Toast** `toast-style.css:16 animation motion-exit-fade var(--motion-fast) var(--motion-ease)` → exit
403
+ - **Toast** `toast-style.css:25 transition transform var(--motion-fast) var(--motion-ease) (스와이프 취소)` → exit
404
+ - **Toast** `toast-style.css:31 animation motion-exit-swipe var(--motion-fast) var(--motion-ease)` → exit
405
+ - **Toast** `toast-style.css:86 prefers-reduced-motion 에서 animation none` → enter
406
+ - **Pagination** `pagination-style.css:59 transition background-color·color var(--motion-fast) var(--motion-ease)` → press
407
+ - **Drawer** `drawer-style.css:13 animation motion-enter-fade var(--motion-base) var(--motion-ease) (바탕)` → enter
408
+ - **Drawer** `drawer-style.css:17 animation motion-exit-fade var(--motion-base) var(--motion-ease) (바탕)` → exit
409
+ - **Drawer** `drawer-style.css:111 animation motion-enter-slide var(--motion-base) var(--motion-ease)` → enter
410
+ - **Drawer** `drawer-style.css:115 animation motion-exit-slide var(--motion-base) var(--motion-ease)` → exit
411
+ - **Skeleton** `skeleton-style.css:62 animation motion-busy-shimmer var(--skeleton-duration) var(--motion-ease)` → busy
412
+ - **Skeleton** `skeleton-style.css:68 prefers-reduced-motion 에서 animation none` → busy
413
+ - **Breadcrumb** `breadcrumb-style.css:75 transition color var(--motion-fast) var(--motion-ease)` → press
414
+ - **DropDown** `drop-down-style.css:91 transition transform var(--motion-fast) var(--motion-ease) (화살표)` → expand
415
+ - **CollapsibleMenu** `collapsible-menu-style.css:86 transition transform var(--motion-fast) var(--motion-ease) (화살표)` → expand
416
+ - **Tabs** `tabs-style.css:48 transition color var(--motion-base) var(--motion-ease)` → press
417
+ - **Tabs** `tabs-style.css:92 transition left·width var(--motion-base) var(--motion-ease)` → progress
418
+ - **Spinner** `spinner-style.css:28 animation motion-busy-ring var(--spinner-duration) var(--spinner-ease)` → busy
419
+ - **Spinner** `spinner-style.css:33 animation-delay calc(var(--spinner-duration) * -0.375)` → busy
420
+ - **Spinner** `spinner-style.css:36 animation-delay calc(var(--spinner-duration) * -0.25)` → busy
421
+ - **Spinner** `spinner-style.css:39 animation-delay calc(var(--spinner-duration) * -0.125)` → busy
422
+ - **Spinner** `spinner-style.css:42 animation-delay 0s` → busy
423
+ - **BottomNav** `bottom-nav-style.css:78 transition transform var(--motion-slow) var(--motion-spring) (선택 캡슐)` → progress
424
+ - **BottomNav** `bottom-nav-style.css:81 prefers-reduced-motion 에서 transition none` → progress
425
+ - **BottomNav** `bottom-nav-style.css:90 transition color var(--motion-fast) var(--motion-ease)` → press
426
+ - **BottomNav** `bottom-nav-style.css:110 transition transform var(--motion-fast) var(--motion-spring) (아이콘 눌림)` → press
427
+ - **StepProgress** `step-progress-style.css:30 transition background-color var(--motion-base) var(--motion-ease)` → progress
428
+ - **ChipGroup** `chip-group-style.css:51 transition background-color·color·border-color var(--motion-fast) var(--motion-ease)` → confirm
429
+ - **Callout** `callout-style.css:27 animation motion-enter-pop var(--motion-slow) var(--motion-spring) var(--motion-fast) both` → enter
430
+ - **Callout** `callout-style.css:29 animation motion-attention-float calc(var(--motion-base) * 8) var(--motion-ease) … 3` → attention
431
+ - **Callout** `callout-style.css:100 prefers-reduced-motion 에서 animation none` → enter
package/dist/ai/tokens.md CHANGED
@@ -354,6 +354,20 @@
354
354
  | `--bottom-nav-badge-dot` | `8px` | 폭 |
355
355
  | `--bottom-nav-badge-count` | `18px` | 폭 |
356
356
  | `--glass-blur` | `18px` | 폭 |
357
+ | `--list-row-height` | `56px` | 목록 행: list-row. 한 줄 이름에 보조 글이 붙어도 이 높이부터 |
358
+ | `--touch-target` | `44px` | 손가락 터치 영역. 보이는 크기가 작은 버튼(아이콘 버튼·빼기·보내기)이 이만큼 눌린다 |
359
+ | `--media-thumbnail-size-s` | `64px` | 사진·영상 썸네일: media-thumbnail. 말풍선 안에서는 쓰는 쪽이 width 로 정하고 이 폭을 넘지 않는다 |
360
+ | `--media-thumbnail-size-m` | `96px` | 사진·영상 썸네일: media-thumbnail. 말풍선 안에서는 쓰는 쪽이 width 로 정하고 이 폭을 넘지 않는다 |
361
+ | `--media-thumbnail-max-width` | `240px` | 사진·영상 썸네일: media-thumbnail. 말풍선 안에서는 쓰는 쪽이 width 로 정하고 이 폭을 넘지 않는다 |
362
+ | `--media-overlay-button-size` | `36px` | 사진·영상 썸네일: media-thumbnail. 말풍선 안에서는 쓰는 쪽이 width 로 정하고 이 폭을 넘지 않는다 |
363
+ | `--media-remove-size` | `20px` | 사진·영상 썸네일: media-thumbnail. 말풍선 안에서는 쓰는 쪽이 width 로 정하고 이 폭을 넘지 않는다 |
364
+ | `--media-invalid-border` | `2px` | 사진·영상 썸네일: media-thumbnail. 말풍선 안에서는 쓰는 쪽이 width 로 정하고 이 폭을 넘지 않는다 |
365
+ | `--composer-send-size` | `36px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
366
+ | `--composer-max-height` | `132px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
367
+ | `--icon-button-size-s` | `36px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
368
+ | `--icon-button-size-m` | `44px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
369
+ | `--icon-button-size-l` | `56px` | 메시지 입력: message-composer. 보내기 원과 입력 칸 최대 높이(16/22 다섯 줄 + 위아래 안쪽) |
370
+ | `--empty-state-icon-box` | `64px` | 빈 화면: empty-state 아이콘 원 |
357
371
  | `--step-bar-height` | `4px` | 진행 단계 바 |
358
372
  | `--icon-size-xs` | `16px` | 그 밖의 치수 |
359
373
  | `--icon-size-s` | `18px` | 그 밖의 치수 |
@@ -385,11 +399,86 @@
385
399
  | `--z-overlay` | `9998` | 레이어. 값이 같아도 역할이 다르면 이름을 따로 둔다 |
386
400
  | `--z-modal` | `9999` | 레이어. 값이 같아도 역할이 다르면 이름을 따로 둔다 |
387
401
  | `--z-toast` | `10000` | 레이어. 값이 같아도 역할이 다르면 이름을 따로 둔다 |
388
- | `--motion-fast` | `160ms` | 모션 |
389
- | `--motion-base` | `300ms` | 모션 |
390
- | `--motion-ease` | `ease` | 모션 |
391
- | `--motion-slow` | `420ms` | 모션 |
402
+ | `--motion-fast` | `160ms` | 옛 모션 변수 |
403
+ | `--motion-base` | `300ms` | 옛 모션 변수 |
404
+ | `--motion-ease` | `ease` | 옛 모션 변수 |
405
+ | `--motion-slow` | `420ms` | 옛 모션 변수 |
392
406
  | `--motion-spring` | `cubic-bezier(0.34, 1.45, 0.5, 1)` | 끝에서 살짝 넘쳤다 돌아온다. 탭 바 선택 캡슐 |
393
407
  | `--spinner-duration` | `1.2s` | 끝에서 살짝 넘쳤다 돌아온다. 탭 바 선택 캡슐 |
394
408
  | `--skeleton-duration` | `1.5s` | 끝에서 살짝 넘쳤다 돌아온다. 탭 바 선택 캡슐 |
395
409
  | `--spinner-ease` | `cubic-bezier(0.5, 0, 0.5, 1)` | 끝에서 살짝 넘쳤다 돌아온다. 탭 바 선택 캡슐 |
410
+
411
+ ## 모션
412
+
413
+ 토큰마다 뜻 · 붙는 곳 · prop · reduced-motion 규칙과 컴포넌트별 적용 매핑표는 같은 폴더의 `motion.md` 에 있다. 화면 CSS 는 `--motion-{토큰}-{키}` 를 쓴다. `--duration-*` · `--ease-*` 는 의미 토큰이 가리키는 원시값이다. `prefers-reduced-motion: reduce` 이면 시간 변수가 모두 `0ms` 가 된다.
414
+
415
+ | 변수 | 값 |
416
+ | --- | --- |
417
+ | `--duration-xs` | `120ms` |
418
+ | `--duration-s` | `160ms` |
419
+ | `--duration-m` | `240ms` |
420
+ | `--duration-l` | `350ms` |
421
+ | `--duration-xl` | `500ms` |
422
+ | `--ease-out` | `cubic-bezier(0.25, 0.1, 0.25, 1)` |
423
+ | `--ease-in` | `cubic-bezier(0.4, 0, 1, 1)` |
424
+ | `--ease-in-out` | `cubic-bezier(0.4, 0, 0.1, 1)` |
425
+ | `--ease-back` | `cubic-bezier(0.34, 1.56, 0.64, 1)` |
426
+ | `--ease-symmetric` | `cubic-bezier(0.5, 0, 0.5, 1)` |
427
+ | `--ease-linear` | `linear` |
428
+ | `--ease-spring-rapid` | `linear(0, 0.0273, 0.0945, 0.184, 0.2834, 0.384, 0.4804, 0.5691, 0.6483, 0.7174, 0.7764, 0.8259, 0.8667, 0.8999, 0.9264, 0.9473, 0.9634, 0.9757, 0.9849, 0.9916, 0.9964, 0.9996, 1.0017, 1.003, 1.0037, 1.0039, 1.0039, 1.0037, 1.0033, 1.003, 1.0026, 1.0022, 1.0018, 1.0015, 1.0012, 1.001, 1.0007, 1.0006, 1.0004, 1.0003, 1)` |
429
+ | `--duration-spring-rapid` | `318ms` |
430
+ | `--ease-spring-quick` | `linear(0, 0.024, 0.0825, 0.1604, 0.247, 0.3352, 0.4205, 0.5002, 0.5728, 0.6377, 0.6948, 0.7445, 0.7872, 0.8237, 0.8546, 0.8806, 0.9023, 0.9204, 0.9354, 0.9477, 0.9578, 0.9661, 0.9728, 0.9783, 0.9827, 0.9863, 0.9891, 0.9914, 0.9933, 0.9947, 0.9959, 0.9968, 0.9975, 0.9981, 0.9985, 0.9989, 0.9991, 0.9993, 0.9995, 0.9996, 1)` |
431
+ | `--duration-spring-quick` | `334ms` |
432
+ | `--ease-spring-small` | `linear(0, 0.0202, 0.069, 0.1334, 0.2049, 0.278, 0.3493, 0.417, 0.4799, 0.5375, 0.5898, 0.6369, 0.6791, 0.7167, 0.7501, 0.7798, 0.806, 0.8292, 0.8497, 0.8677, 0.8836, 0.8976, 0.91, 0.9208, 0.9304, 0.9388, 0.9462, 0.9527, 0.9584, 0.9634, 0.9679, 0.9717, 0.9752, 0.9782, 0.9808, 0.9831, 0.9852, 0.987, 0.9885, 0.9899, 0.9911, 0.9922, 0.9932, 0.994, 0.9947, 0.9954, 0.9959, 0.9964, 0.9968, 0.9972, 0.9976, 0.9979, 0.9981, 0.9983, 0.9985, 0.9987, 0.9989, 0.999, 0.9991, 1)` |
433
+ | `--duration-spring-small` | `587ms` |
434
+ | `--ease-spring-medium` | `linear(0, 0.0121, 0.0444, 0.0919, 0.1501, 0.2152, 0.2844, 0.355, 0.4252, 0.4934, 0.5585, 0.6195, 0.6761, 0.7278, 0.7746, 0.8164, 0.8533, 0.8855, 0.9134, 0.9372, 0.9572, 0.9739, 0.9875, 0.9984, 1.007, 1.0136, 1.0184, 1.0217, 1.0238, 1.0249, 1.0252, 1.0248, 1.0239, 1.0227, 1.0212, 1.0196, 1.0178, 1.016, 1.0143, 1.0126, 1.0109, 1.0094, 1.008, 1.0067, 1.0055, 1.0045, 1.0036, 1.0028, 1.0021, 1.0015, 1.001, 1.0006, 1.0003, 1, 0.9998, 0.9996, 1)` |
435
+ | `--duration-spring-medium` | `552ms` |
436
+ | `--ease-spring-basic` | `linear(0, 0.0089, 0.0322, 0.0658, 0.1066, 0.152, 0.2001, 0.2493, 0.2986, 0.3471, 0.3941, 0.4393, 0.4824, 0.5232, 0.5615, 0.5974, 0.6309, 0.662, 0.6909, 0.7175, 0.7421, 0.7648, 0.7855, 0.8046, 0.8221, 0.8381, 0.8527, 0.8661, 0.8783, 0.8894, 0.8995, 0.9088, 0.9172, 0.9248, 0.9318, 0.9381, 0.9438, 0.949, 0.9538, 0.9581, 0.962, 0.9655, 0.9687, 0.9717, 0.9743, 0.9767, 0.9789, 0.9809, 0.9827, 0.9843, 0.9858, 0.9871, 0.9883, 0.9894, 0.9904, 0.9913, 0.9921, 0.9929, 0.9935, 0.9941, 0.9947, 0.9952, 0.9956, 0.9961, 0.9964, 0.9968, 0.9971, 0.9973, 0.9976, 0.9978, 0.998, 0.9982, 0.9984, 0.9985, 0.9987, 0.9988, 0.9989, 1)` |
437
+ | `--duration-spring-basic` | `761ms` |
438
+ | `--ease-spring-large` | `linear(0, 0.0047, 0.0179, 0.0383, 0.0648, 0.0961, 0.1315, 0.1699, 0.2106, 0.2529, 0.2963, 0.3401, 0.3838, 0.4272, 0.4699, 0.5115, 0.5518, 0.5906, 0.6278, 0.6633, 0.697, 0.7288, 0.7586, 0.7866, 0.8126, 0.8368, 0.859, 0.8795, 0.8983, 0.9154, 0.9309, 0.9449, 0.9575, 0.9687, 0.9786, 0.9874, 0.995, 1.0017, 1.0074, 1.0122, 1.0163, 1.0196, 1.0223, 1.0244, 1.0261, 1.0272, 1.0279, 1.0283, 1.0284, 1.0282, 1.0277, 1.0271, 1.0263, 1.0254, 1.0243, 1.0232, 1.0221, 1.0208, 1.0196, 1.0184, 1.0171, 1.0159, 1.0147, 1.0135, 1.0124, 1.0113, 1.0103, 1.0093, 1.0083, 1.0074, 1.0066, 1.0058, 1.0051, 1.0044, 1.0038, 1.0033, 1.0027, 1.0023, 1.0018, 1.0015, 1.0011, 1.0008, 1.0005, 1.0003, 1.0001, 0.9999, 0.9997, 0.9996, 1)` |
439
+ | `--duration-spring-large` | `876ms` |
440
+ | `--ease-spring-bounce` | `linear(0, 0.0142, 0.0537, 0.1139, 0.1902, 0.2784, 0.3743, 0.4741, 0.5747, 0.673, 0.7667, 0.8538, 0.9329, 1.0028, 1.063, 1.113, 1.153, 1.1831, 1.204, 1.2164, 1.221, 1.2189, 1.211, 1.1984, 1.182, 1.1629, 1.1419, 1.1199, 1.0977, 1.0758, 1.0549, 1.0354, 1.0176, 1.0018, 0.9881, 0.9767, 0.9675, 0.9605, 0.9555, 0.9525, 0.9512, 0.9514, 0.953, 0.9556, 0.9591, 0.9633, 0.9678, 0.9727, 0.9776, 0.9825, 0.9871, 0.9915, 0.9955, 0.9991, 1.0022, 1.0048, 1.0069, 1.0085, 1.0097, 1.0104, 1.0108, 1.0108, 1.0105, 1.0099, 1.0092, 1.0083, 1.0073, 1.0062, 1.0051, 1.0041, 1.003, 1.002, 1.0011, 1.0003, 0.9996, 0.999, 0.9985, 0.9982, 0.9979, 0.9977, 0.9976, 0.9976, 0.9977, 0.9978, 0.9979, 0.9981, 0.9984, 0.9986, 0.9988, 0.9991, 0.9993, 0.9995, 0.9997, 0.9999, 1.0001, 1.0002, 1)` |
441
+ | `--duration-spring-bounce` | `958ms` |
442
+ | `--ease-spring-slow` | `linear(0, 0.0033, 0.0122, 0.0257, 0.043, 0.0631, 0.0855, 0.1096, 0.135, 0.1612, 0.188, 0.215, 0.2421, 0.2691, 0.2958, 0.3221, 0.348, 0.3732, 0.3979, 0.4219, 0.4452, 0.4677, 0.4896, 0.5107, 0.5311, 0.5507, 0.5697, 0.5879, 0.6054, 0.6222, 0.6384, 0.654, 0.6689, 0.6832, 0.6969, 0.71, 0.7226, 0.7347, 0.7462, 0.7573, 0.7679, 0.778, 0.7877, 0.797, 0.8059, 0.8144, 0.8225, 0.8303, 0.8378, 0.8449, 0.8517, 0.8582, 0.8645, 0.8704, 0.8761, 0.8816, 0.8868, 0.8918, 0.8965, 0.9011, 0.9054, 0.9096, 0.9136, 0.9174, 0.921, 0.9245, 0.9278, 0.931, 0.934, 0.9369, 0.9397, 0.9424, 0.9449, 0.9473, 0.9497, 0.9519, 0.954, 0.956, 0.958, 0.9598, 0.9616, 0.9633, 0.9649, 0.9664, 0.9679, 0.9693, 0.9707, 0.972, 0.9732, 0.9744, 0.9755, 0.9766, 0.9776, 0.9786, 0.9796, 0.9805, 0.9813, 0.9821, 0.9829, 0.9837, 0.9844, 0.9851, 0.9857, 0.9864, 0.987, 0.9875, 0.9881, 0.9886, 0.9891, 0.9896, 0.9901, 0.9905, 0.9909, 0.9913, 0.9917, 0.9921, 0.9924, 0.9927, 0.9931, 0.9934, 0.9937, 0.9939, 0.9942, 0.9945, 0.9947, 0.9949, 0.9952, 0.9954, 0.9956, 0.9958, 0.996, 0.9961, 0.9963, 0.9965, 0.9966, 0.9968, 0.9969, 0.9971, 0.9972, 0.9973, 0.9974, 0.9975, 0.9976, 0.9978, 0.9979, 0.9979, 0.998, 0.9981, 0.9982, 0.9983, 0.9984, 0.9984, 0.9985, 0.9986, 0.9986, 0.9987, 0.9987, 0.9988, 0.9989, 0.9989, 0.999, 1)` |
443
+ | `--duration-spring-slow` | `1604ms` |
444
+ | `--motion-press-duration` | `var(--duration-xs)` |
445
+ | `--motion-press-ease` | `var(--ease-out)` |
446
+ | `--motion-press-scale` | `0.98` |
447
+ | `--motion-press-dim` | `0.12` |
448
+ | `--motion-confirm-weak-ease` | `var(--ease-spring-small)` |
449
+ | `--motion-confirm-weak-duration` | `var(--duration-spring-small)` |
450
+ | `--motion-confirm-strong-ease` | `var(--ease-spring-bounce)` |
451
+ | `--motion-confirm-strong-duration` | `var(--duration-spring-bounce)` |
452
+ | `--motion-reject-duration` | `var(--duration-l)` |
453
+ | `--motion-reject-ease` | `var(--ease-linear)` |
454
+ | `--motion-reject-distance` | `2px` |
455
+ | `--motion-enter-duration` | `var(--duration-m)` |
456
+ | `--motion-enter-ease` | `var(--ease-out)` |
457
+ | `--motion-enter-strong-ease` | `var(--ease-spring-bounce)` |
458
+ | `--motion-enter-strong-duration` | `var(--duration-spring-bounce)` |
459
+ | `--motion-enter-scale-from` | `0.96` |
460
+ | `--motion-enter-offset` | `16px` |
461
+ | `--motion-enter-pop-scale` | `0.6` |
462
+ | `--motion-exit-duration` | `var(--duration-s)` |
463
+ | `--motion-exit-ease` | `var(--ease-in)` |
464
+ | `--motion-appear-duration` | `var(--duration-m)` |
465
+ | `--motion-appear-ease` | `var(--ease-out)` |
466
+ | `--motion-reveal-duration` | `var(--duration-m)` |
467
+ | `--motion-reveal-ease` | `var(--ease-out)` |
468
+ | `--motion-reveal-gap` | `80ms` |
469
+ | `--motion-progress-duration` | `var(--duration-m)` |
470
+ | `--motion-progress-spring-ease` | `var(--ease-spring-basic)` |
471
+ | `--motion-progress-spring-duration` | `var(--duration-spring-basic)` |
472
+ | `--motion-expand-duration` | `var(--duration-m)` |
473
+ | `--motion-expand-ease` | `var(--ease-out)` |
474
+ | `--motion-expand-rotate` | `180deg` |
475
+ | `--motion-dismiss-on-scroll-duration` | `var(--duration-m)` |
476
+ | `--motion-dismiss-on-scroll-ease` | `var(--ease-out)` |
477
+ | `--motion-dismiss-on-scroll-threshold` | `1px` |
478
+ | `--motion-attention-shine` | `2500ms` |
479
+ | `--motion-attention-blink` | `300ms` |
480
+ | `--motion-attention-float-distance` | `3px` |
481
+ | `--motion-busy-ring` | `1200ms` |
482
+ | `--motion-busy-ring-ease` | `var(--ease-symmetric)` |
483
+ | `--motion-busy-shimmer` | `1500ms` |
484
+ | `--motion-busy-dots` | `600ms` |
package/dist/avatar.js CHANGED
@@ -320,17 +320,19 @@ module.exports = x({ ["jsx"]: () => (__WEBPACK_EXTERNAL_MODULE_react_jsx_runtime
320
320
  /******/
321
321
  /************************************************************************/
322
322
  /******/
323
- /******/ import * as __webpack_chunk_1__ from "./chunk-6364.js";
323
+ /******/ import * as __webpack_chunk_1__ from "./chunk-3274.js";
324
324
  /******/ __nuri_require__.C(__webpack_chunk_1__);
325
- /******/ import * as __webpack_chunk_2__ from "./chunk-2777.js";
325
+ /******/ import * as __webpack_chunk_2__ from "./chunk-7335.js";
326
326
  /******/ __nuri_require__.C(__webpack_chunk_2__);
327
327
  /******/ import * as __webpack_chunk_3__ from "./chunk-7298.js";
328
328
  /******/ __nuri_require__.C(__webpack_chunk_3__);
329
+ /******/ import * as __webpack_chunk_4__ from "./chunk-2777.js";
330
+ /******/ __nuri_require__.C(__webpack_chunk_4__);
329
331
  /******/
330
332
  /******/ // startup
331
333
  /******/ // Load entry module and return exports
332
334
  /******/ // This entry module depends on other loaded chunks and execution need to be delayed
333
- /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [6364,2777,7298], () => (__nuri_require__(5468)))
335
+ /******/ var __webpack_exports__ = __nuri_require__.O(undefined, [3274,7335,7298,2777], () => (__nuri_require__(5468)))
334
336
  /******/ __webpack_exports__ = __nuri_require__.O(__webpack_exports__);
335
337
  /******/ const __webpack_exports__default = __webpack_exports__.A;
336
338
  /******/ export { __webpack_exports__default as default };