@nurihaus/web-design-system 3.5.0 → 3.6.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.
@@ -164,7 +164,7 @@ import { Callout } from '@nurihaus/web-design-system/callout'; // 이 컴포
164
164
  import { Callout } from '@nurihaus/web-design-system'; // 루트. 첫 로드 JS 가 커진다
165
165
  ```
166
166
 
167
- **언제 쓴다.** 버튼 같은 대상에 붙어 늘 떠 있는 짧은 라벨 말풍선에 쓴다(예: 로그인 버튼의 "최근 사용"). 꼬리 자리는 `tail`(`bottom-start` 기본·`bottom-end`·`top-start`·`top-end`)로 고른다. 버튼에 붙일 때는 Callout 을 직접 놓지 말고 CTAButton 의 `callout` prop 을 쓴다 — 모서리 자리를 DS 가 잡는다. 그 밖의 대상에 놓을 때는 자리(`position: absolute`·위치)를 쓰는 쪽이 `className` 으로 정한다. `.base-callout` 이 꼬리 기준으로 `position: relative` 를 가지므로 한 단계 구체적인 선택자(`.slot > .x`)로 덮는다.
167
+ **언제 쓴다.** 버튼 같은 대상에 붙어 늘 떠 있는 짧은 라벨 말풍선에 쓴다(예: 로그인 버튼의 "최근 사용"). 꼬리 자리는 `tail`(`bottom-start` 기본·`bottom-end`·`top-start`·`top-end`)로 고른다. 나타날 때 꼬리에서 튀어나온 뒤 세 번 둥실 움직이고 멈춘다(동작 줄이기 설정이면 움직이지 않는다). 모션은 쓰는 쪽이 고르지 않는다. 버튼에 붙일 때는 Callout 을 직접 놓지 말고 CTAButton 의 `callout` prop 을 쓴다 — 모서리 자리를 DS 가 잡는다. 그 밖의 대상에 놓을 때는 자리(`position: absolute`·위치)를 쓰는 쪽이 `className` 으로 정한다. 위치는 `top`·`right` 같은 값으로 잡는다 — `transform` 은 등장 모션이 쓰므로 덮어써진다. `.base-callout` 이 꼬리 기준으로 `position: relative` 를 가지므로 한 단계 구체적인 선택자(`.slot > .x`)로 덮는다.
168
168
 
169
169
  **쓰지 않는다.** 마우스를 올리거나 포커스했을 때만 설명을 보여 주려면 Tooltip 을 쓴다. 상태값·분류 라벨은 OptionBadge 를 쓴다.
170
170
 
@@ -22,6 +22,7 @@ declare const meta: {
22
22
  title: import("react").ReactNode;
23
23
  track?: string | undefined;
24
24
  key?: import("react").Key | null | undefined;
25
+ value?: string | number | readonly string[] | undefined;
25
26
  defaultChecked?: boolean | undefined | undefined;
26
27
  defaultValue?: string | number | readonly string[] | undefined;
27
28
  suppressContentEditableWarning?: boolean | undefined | undefined;
@@ -285,11 +286,10 @@ declare const meta: {
285
286
  onTransitionEnd?: import("react").TransitionEventHandler<HTMLLIElement> | undefined;
286
287
  onTransitionEndCapture?: import("react").TransitionEventHandler<HTMLLIElement> | undefined;
287
288
  variant?: (typeof variants)[number] | undefined;
288
- defaultOpen?: boolean | undefined;
289
+ trackProps?: Record<string, string | number | boolean> | undefined;
289
290
  open?: boolean | undefined;
291
+ defaultOpen?: boolean | undefined;
290
292
  onOpenChange?: ((open: boolean) => void) | undefined;
291
- trackProps?: Record<string, string | number | boolean> | undefined;
292
- value?: string | number | readonly string[] | undefined;
293
293
  onResume?: (() => void) | undefined;
294
294
  duration?: number | undefined;
295
295
  description?: import("react").ReactNode;
@@ -848,9 +848,33 @@
848
848
  font-weight: var(--font-weight-bold);
849
849
  white-space: nowrap;
850
850
 
851
- /* 꼬리: --spacing-8 정사각형을 45도 돌린다. 한 변의 절반에 테두리 두께만큼 더 밖으로 내어 몸통 테두리를 덮는다 */
851
+ /* 나타날 때 꼬리에서 튀어나온 뒤 세 번 둥실 움직이고 멈춘다 (ADR 0007). 계속 움직이면 거슬린다.
852
+ 둥실 지연 = 팝 지연 + 팝 시간. 팝 쪽을 바꾸면 둥실 지연도 같이 바꾼다 */
853
+ --callout-origin: var(--spacing-16) 100%;
854
+ --callout-enter: translateY(var(--spacing-4));
855
+
856
+ transform-origin: var(--callout-origin);
857
+ animation:
858
+ callout-pop var(--motion-slow) var(--motion-spring) var(--motion-fast) both,
859
+ callout-float calc(var(--motion-base) * 8) var(--motion-ease)
860
+ calc(var(--motion-fast) + var(--motion-slow)) 3;
852
861
  }
853
862
 
863
+ .base-callout.tail-bottom-end {
864
+ --callout-origin: calc(100% - var(--spacing-16)) 100%;
865
+ }
866
+
867
+ .base-callout:is(.tail-top-start,.tail-top-end) {
868
+ --callout-origin: var(--spacing-16) 0;
869
+ --callout-enter: translateY(calc(var(--spacing-4) * -1));
870
+ }
871
+
872
+ .base-callout.tail-top-end {
873
+ --callout-origin: calc(100% - var(--spacing-16)) 0;
874
+ }
875
+
876
+ /* 꼬리: --spacing-8 정사각형을 45도 돌린다. 한 변의 절반에 테두리 두께만큼 더 밖으로 내어 몸통 테두리를 덮는다 */
877
+
854
878
  .base-callout::after {
855
879
  content: '';
856
880
  position: absolute;
@@ -881,6 +905,35 @@
881
905
  right: var(--spacing-12);
882
906
  }
883
907
 
908
+ @keyframes callout-pop {
909
+ from {
910
+ opacity: 0;
911
+ transform: var(--callout-enter) scale(0.6);
912
+ }
913
+
914
+ to {
915
+ opacity: 1;
916
+ transform: none;
917
+ }
918
+ }
919
+
920
+ @keyframes callout-float {
921
+ 0%,
922
+ 100% {
923
+ transform: none;
924
+ }
925
+
926
+ 50% {
927
+ transform: translateY(calc(var(--spacing-6) / -2));
928
+ }
929
+ }
930
+
931
+ @media (prefers-reduced-motion: reduce) {
932
+ .base-callout {
933
+ animation: none;
934
+ }
935
+ }
936
+
884
937
  .base-check-box.label {
885
938
  font-size: var(--font-size-sm);
886
939
  font-weight: var(--font-weight-medium);
package/dist/styles.css CHANGED
@@ -1161,8 +1161,28 @@ p {
1161
1161
  font-weight: var(--font-weight-bold);
1162
1162
  white-space: nowrap;
1163
1163
 
1164
- /* 꼬리: --spacing-8 정사각형을 45도 돌린다. 한 변의 절반에 테두리 두께만큼 더 밖으로 내어 몸통 테두리를 덮는다 */
1164
+ /* 나타날 때 꼬리에서 튀어나온 뒤 세 번 둥실 움직이고 멈춘다 (ADR 0007). 계속 움직이면 거슬린다.
1165
+ 둥실 지연 = 팝 지연 + 팝 시간. 팝 쪽을 바꾸면 둥실 지연도 같이 바꾼다 */
1166
+ --callout-origin: var(--spacing-16) 100%;
1167
+ --callout-enter: translateY(var(--spacing-4));
1168
+
1169
+ transform-origin: var(--callout-origin);
1170
+ animation:
1171
+ callout-pop var(--motion-slow) var(--motion-spring) var(--motion-fast) both,
1172
+ callout-float calc(var(--motion-base) * 8) var(--motion-ease)
1173
+ calc(var(--motion-fast) + var(--motion-slow)) 3;
1165
1174
  }
1175
+ .base-callout.tail-bottom-end {
1176
+ --callout-origin: calc(100% - var(--spacing-16)) 100%;
1177
+ }
1178
+ .base-callout:is(.tail-top-start,.tail-top-end) {
1179
+ --callout-origin: var(--spacing-16) 0;
1180
+ --callout-enter: translateY(calc(var(--spacing-4) * -1));
1181
+ }
1182
+ .base-callout.tail-top-end {
1183
+ --callout-origin: calc(100% - var(--spacing-16)) 0;
1184
+ }
1185
+ /* 꼬리: --spacing-8 정사각형을 45도 돌린다. 한 변의 절반에 테두리 두께만큼 더 밖으로 내어 몸통 테두리를 덮는다 */
1166
1186
  .base-callout::after {
1167
1187
  content: '';
1168
1188
  position: absolute;
@@ -1188,6 +1208,32 @@ p {
1188
1208
  .base-callout:is(.tail-bottom-end,.tail-top-end)::after {
1189
1209
  right: var(--spacing-12);
1190
1210
  }
1211
+ @keyframes callout-pop {
1212
+ from {
1213
+ opacity: 0;
1214
+ transform: var(--callout-enter) scale(0.6);
1215
+ }
1216
+
1217
+ to {
1218
+ opacity: 1;
1219
+ transform: none;
1220
+ }
1221
+ }
1222
+ @keyframes callout-float {
1223
+ 0%,
1224
+ 100% {
1225
+ transform: none;
1226
+ }
1227
+
1228
+ 50% {
1229
+ transform: translateY(calc(var(--spacing-6) / -2));
1230
+ }
1231
+ }
1232
+ @media (prefers-reduced-motion: reduce) {
1233
+ .base-callout {
1234
+ animation: none;
1235
+ }
1236
+ }
1191
1237
  .base-check-box.label {
1192
1238
  font-size: var(--font-size-sm);
1193
1239
  font-weight: var(--font-weight-medium);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nurihaus/web-design-system",
3
- "version": "3.5.0",
3
+ "version": "3.6.0",
4
4
  "description": "Nurihaus 디자인 시스템 — 컴포넌트와 디자인 토큰",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",