@nurihaus/web-design-system 3.0.0 → 3.0.3

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 (124) hide show
  1. package/README.md +104 -5
  2. package/dist/.storybook/story-kit.d.ts +18 -0
  3. package/dist/ai/components.md +742 -0
  4. package/dist/ai/tokens.md +319 -0
  5. package/dist/avatar.js +336 -0
  6. package/dist/check-box.js +379 -0
  7. package/dist/chunk-149.js +57 -0
  8. package/dist/chunk-298.js +34 -0
  9. package/dist/chunk-302.js +105 -0
  10. package/dist/chunk-309.js +36 -0
  11. package/dist/chunk-364.js +126 -0
  12. package/dist/chunk-387.js +37 -0
  13. package/dist/chunk-558.js +200 -0
  14. package/dist/chunk-563.js +181 -0
  15. package/dist/chunk-739.js +68 -0
  16. package/dist/chunk-777.js +117 -0
  17. package/dist/chunk-917.js +35 -0
  18. package/dist/chunk-933.js +70 -0
  19. package/dist/chunk-976.js +29 -0
  20. package/dist/collapsible-menu.js +394 -0
  21. package/dist/components/avatar/avatar-props.d.ts +2 -6
  22. package/dist/components/avatar/avatar-type.d.ts +4 -5
  23. package/dist/components/avatar/avatar.d.ts +1 -0
  24. package/dist/components/avatar/avatar.stories.d.ts +17 -1
  25. package/dist/components/badge/badge-props.d.ts +17 -80
  26. package/dist/components/badge/badge-type.d.ts +38 -2
  27. package/dist/components/badge/badge.stories.d.ts +25 -2
  28. package/dist/components/badge/base-badge.d.ts +2 -1
  29. package/dist/components/badge/icon-text-badge.d.ts +3 -21
  30. package/dist/components/badge/icon-text-option-badge.d.ts +2 -15
  31. package/dist/components/badge/option-badge.d.ts +3 -20
  32. package/dist/components/button/button-props.d.ts +2 -7
  33. package/dist/components/button/button-type.d.ts +11 -3
  34. package/dist/components/button/button.stories.d.ts +13 -10
  35. package/dist/components/button/cta-button.d.ts +3 -12
  36. package/dist/components/check-box/base-check-box.d.ts +9 -5
  37. package/dist/components/check-box/check-box-props.d.ts +2 -7
  38. package/dist/components/check-box/check-box-type.d.ts +11 -4
  39. package/dist/components/check-box/check-box.d.ts +3 -10
  40. package/dist/components/check-box/check-box.stories.d.ts +19 -4
  41. package/dist/components/collapsible-menu/base-collapsible-menu.d.ts +9 -5
  42. package/dist/components/collapsible-menu/collapsible-menu-props.d.ts +3 -12
  43. package/dist/components/collapsible-menu/collapsible-menu-type.d.ts +33 -9
  44. package/dist/components/collapsible-menu/collapsible-menu.d.ts +3 -23
  45. package/dist/components/collapsible-menu/collapsible-menu.stories.d.ts +20 -4
  46. package/dist/components/drop-down/base-drop-down.d.ts +11 -3
  47. package/dist/components/drop-down/drop-down-props.d.ts +3 -12
  48. package/dist/components/drop-down/drop-down-type.d.ts +34 -15
  49. package/dist/components/drop-down/drop-down.d.ts +3 -32
  50. package/dist/components/drop-down/drop-down.stories.d.ts +23 -4
  51. package/dist/components/elements/text/base-text.d.ts +3 -0
  52. package/dist/components/elements/text/text-props.d.ts +16 -0
  53. package/dist/components/elements/text/text-type.d.ts +6 -2
  54. package/dist/components/elements/text/text.d.ts +2 -1
  55. package/dist/components/elements/text/text.stories.d.ts +43 -3
  56. package/dist/components/loading/index.d.ts +6 -6
  57. package/dist/components/loading/inline-loading/base-inline-loading.d.ts +3 -0
  58. package/dist/components/loading/inline-loading/inline-loading-props.d.ts +9 -0
  59. package/dist/components/loading/inline-loading/inline-loading-type.d.ts +8 -6
  60. package/dist/components/loading/inline-loading/inline-loading.d.ts +3 -2
  61. package/dist/components/loading/inline-loading/inline-loading.stories.d.ts +5 -9
  62. package/dist/components/loading/overlay-loading/base-overlay-loading.d.ts +3 -0
  63. package/dist/components/loading/overlay-loading/overlay-loading-props.d.ts +7 -0
  64. package/dist/components/loading/overlay-loading/overlay-loading-type.d.ts +6 -3
  65. package/dist/components/loading/overlay-loading/overlay-loading.d.ts +3 -3
  66. package/dist/components/loading/overlay-loading/overlay-loading.stories.d.ts +8 -8
  67. package/dist/components/loading/spinner/base-spinner.d.ts +4 -0
  68. package/dist/components/loading/spinner/spinner-props.d.ts +1 -0
  69. package/dist/components/loading/spinner/spinner-type.d.ts +4 -4
  70. package/dist/components/loading/spinner/spinner.d.ts +2 -2
  71. package/dist/components/loading/spinner/spinner.stories.d.ts +5 -12
  72. package/dist/components/modal/base-modal.d.ts +17 -5
  73. package/dist/components/modal/modal-props.d.ts +2 -7
  74. package/dist/components/modal/modal-type.d.ts +20 -10
  75. package/dist/components/modal/modal-with-double-button.d.ts +4 -16
  76. package/dist/components/modal/modal.stories.d.ts +15 -2
  77. package/dist/components/radio/base-radio.d.ts +9 -5
  78. package/dist/components/radio/radio-props.d.ts +1 -0
  79. package/dist/components/radio/radio-type.d.ts +6 -8
  80. package/dist/components/radio/radio.d.ts +2 -2
  81. package/dist/components/radio/radio.stories.d.ts +13 -4
  82. package/dist/components/table/base-table.d.ts +4 -5
  83. package/dist/components/table/data-table.d.ts +5 -22
  84. package/dist/components/table/table-type.d.ts +22 -1
  85. package/dist/components/table/table.stories.d.ts +19 -3
  86. package/dist/components/tabs/base-tabs.d.ts +7 -7
  87. package/dist/components/tabs/tabs-props.d.ts +1 -1
  88. package/dist/components/tabs/tabs-type.d.ts +9 -13
  89. package/dist/components/tabs/tabs.d.ts +3 -3
  90. package/dist/components/tabs/tabs.stories.d.ts +16 -10
  91. package/dist/components/text-field/base-text-field.d.ts +5 -3
  92. package/dist/components/text-field/text-field-props.d.ts +3 -12
  93. package/dist/components/text-field/text-field-type.d.ts +14 -0
  94. package/dist/components/text-field/text-field.d.ts +3 -16
  95. package/dist/components/text-field/text-field.stories.d.ts +24 -0
  96. package/dist/components/tooltip/base-tooltip.d.ts +13 -3
  97. package/dist/components/tooltip/tooltip-props.d.ts +3 -2
  98. package/dist/components/tooltip/tooltip-type.d.ts +17 -5
  99. package/dist/components/tooltip/tooltip.d.ts +4 -7
  100. package/dist/components/tooltip/tooltip.stories.d.ts +21 -4
  101. package/dist/components.css +1984 -0
  102. package/dist/cta-button.js +236 -0
  103. package/dist/data-table.js +386 -0
  104. package/dist/drop-down.js +433 -0
  105. package/dist/helpers/props/common-props.d.ts +7 -0
  106. package/dist/helpers/types/common-props.d.ts +8 -0
  107. package/dist/icon-text-badge.js +294 -0
  108. package/dist/icon-text-option-badge.js +270 -0
  109. package/dist/index.d.ts +17 -1
  110. package/dist/index.js +3021 -10637
  111. package/dist/loading.js +383 -0
  112. package/dist/modal-with-double-button.js +527 -0
  113. package/dist/option-badge.js +293 -0
  114. package/dist/radio.js +363 -0
  115. package/dist/reset.css +45 -0
  116. package/dist/styles.css +785 -559
  117. package/dist/tabs.js +421 -0
  118. package/dist/text-field.js +369 -0
  119. package/dist/text.js +233 -0
  120. package/dist/tokens.css +73 -0
  121. package/dist/tokens.js +4 -6
  122. package/dist/tooltip.js +360 -0
  123. package/package.json +91 -14
  124. package/dist/components/text-field/text-filed.stories.d.ts +0 -8
package/dist/styles.css CHANGED
@@ -1,8 +1,5 @@
1
-
2
- @import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.8/dist/web/static/pretendard.css');
3
- @import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap');
4
- @import url('https://fonts.googleapis.com/icon?family=Material+Icons');
5
- /* 토큰 + 글꼴 + 리셋 + 유틸리티 + 컴포넌트. 디자인 시스템 컴포넌트를 쓸 때 가져온다. */
1
+ /* 토큰 + 글꼴 스택(.nuri-theme) + 리셋 + 유틸리티 + 컴포넌트. 디자인 시스템 컴포넌트를 쓸 때 가져온다.
2
+ 글꼴 파일은 불러오지 않는다. 앱이 불러온다. */
6
3
  /* 변수만. 이것만 가져와도 화면이 바뀌지 않는다. CSS Modules 에서 var() 로 쓴다. */
7
4
  /* tokens/figma.json 에서 생성됨 — 손으로 고치지 않는다. `npm run tokens` */
8
5
  :root {
@@ -155,6 +152,74 @@
155
152
  --line-height-4xl: 43px;
156
153
  --line-height-5xl: 66px;
157
154
  --line-height-6xl: 82px;
155
+ /* 한 줄에 나란히 놓이는 컨트롤: button, drop-down, text-field */
156
+ --control-height-xs: 30px;
157
+ --control-height-s: 40px;
158
+ --control-height-m: 50px;
159
+ --control-height-l: 54px;
160
+ --control-height-xl: 60px;
161
+
162
+ /* 라벨: badge */
163
+ --label-height-xs: 28px;
164
+ --label-height-s: 32px;
165
+ --label-height-m: 36px;
166
+ --label-height-l: 40px;
167
+ --label-height-xl: 48px;
168
+
169
+ /* 메뉴 행: collapsible-menu, drop-down 항목 */
170
+ --menu-row-height-s: 40px;
171
+ --menu-row-height-m: 48px;
172
+ --drop-down-item-height: 46px;
173
+
174
+ /* 정사각 */
175
+ --checkbox-size-s: 18px;
176
+ --checkbox-size-m: 20px;
177
+ --checkbox-size-l: 24px;
178
+ --radio-size: 18px;
179
+ --radio-dot-size: 8px;
180
+ --avatar-size-s: 40px;
181
+ --avatar-size-m: 58px;
182
+ --avatar-size-l: 74px;
183
+ --avatar-size-xl: 124px;
184
+ --avatar-badge-size-s: 18px;
185
+ --avatar-badge-size-m: 24px;
186
+ --avatar-badge-size-l: 30px;
187
+ --avatar-badge-size-xl: 48px;
188
+
189
+ /* 폭 */
190
+ --modal-width-s: 400px;
191
+ --modal-width-m: 450px;
192
+ --modal-width-l: 500px;
193
+
194
+ /* 그 밖의 치수 */
195
+ --icon-size-s: 18px;
196
+ --icon-size-m: 20px;
197
+ --icon-size-l: 24px;
198
+ --tooltip-arrow: 8px;
199
+ --spinner-stroke: 3px;
200
+ --tab-indicator-thickness: 3px;
201
+ --checkbox-border: 1.5px;
202
+ --hairline: 1px;
203
+
204
+ /* 그림자 */
205
+ --shadow-popover: 0px 4px 6px -2px rgba(0, 0, 0, 0.06), 0px 10px 15px -3px rgba(0, 0, 0, 0.1);
206
+
207
+ /* 레이어. 값이 같아도 역할이 다르면 이름을 따로 둔다 */
208
+ --z-base: 0;
209
+ --z-raised: 1;
210
+ --z-sticky: 2;
211
+ --z-sticky-header: 3;
212
+ --z-tooltip: 3;
213
+ --z-popover: 5;
214
+ --z-overlay: 9998;
215
+ --z-modal: 9999;
216
+
217
+ /* 모션 */
218
+ --motion-fast: 160ms;
219
+ --motion-base: 300ms;
220
+ --motion-ease: ease;
221
+ --spinner-duration: 1.2s;
222
+ --spinner-ease: cubic-bezier(0.5, 0, 0.5, 1);
158
223
  }
159
224
  /* semantic: app */
160
225
  :root, :root[data-ds-theme='app'] {
@@ -233,6 +298,11 @@
233
298
  --button-size-l: 54;
234
299
  --button-size-xl: 60;
235
300
  }
301
+ /*
302
+ * 크기·두께·레이어·모션. figma.json 에서 만들지 않고 손으로 유지한다(font-face.css 와 같다).
303
+ * 디자이너가 숫자를 바꾸는 곳은 여기다. 컴포넌트 CSS 는 숫자를 쓰지 않고 이 변수를 쓴다(빌드가 검사).
304
+ * 크기 이름은 xs · s · m · l · xl 다섯 개다. 컴포넌트는 그중 지원하는 것만 고른다.
305
+ */
236
306
  .nuri-theme {
237
307
  --cursor-button: pointer;
238
308
  --cursor-disabled: not-allowed;
@@ -256,15 +326,11 @@
256
326
  'Noto Color Emoji',
257
327
  sans-serif;
258
328
  }
259
- /* 웹폰트와 기본 글꼴. 토큰이 아니라 손으로 유지한다. */
260
329
  /*
261
- * 글꼴은 `:root` 에 걸지 않는다. 토큰만 가져다 쓰는 앱의 글꼴을 뺏지 않기 위해서다.
262
- * 디자인 시스템의 글꼴을 원하면 이 클래스를 붙인다.
330
+ * 글꼴 스택. 토큰이 아니라 손으로 유지한다.
331
+ * 웹폰트 파일은 불러오지 않는다. 앱이 Pretendard 를 불러왔으면 그것을, 아니면 시스템 글꼴을 쓴다.
332
+ * `:root` 에 걸지 않는다. 토큰만 가져다 쓰는 앱의 글꼴을 뺏지 않기 위해서다.
263
333
  */
264
- .nuri-placeholder {
265
- color: var(--color-grey-scale-400);
266
- }
267
- /* Reset */
268
334
  /* 모든 요소의 마진과 패딩 제거 */
269
335
  * {
270
336
  margin: 0;
@@ -310,6 +376,13 @@ p {
310
376
  margin-top: 0;
311
377
  margin-bottom: 0;
312
378
  }
379
+ /* 유틸리티 + 컴포넌트 스타일. 토큰·글꼴·리셋은 없다.
380
+ 글꼴을 앱이 직접 관리할 때 tokens.css 와 함께 가져온다. 컴포넌트 글자는 앱의 글꼴을 물려받는다. */
381
+ /* 컴포넌트 글자는 앱의 글꼴을 물려받는다. <button> 처럼 브라우저가 글꼴을 따로 주는 요소도 포함한다.
382
+ :where 로 우선순위를 0 으로 둔다. styles.css 에서는 token/font-face.css 의 .nuri-theme 글꼴이 이긴다. */
383
+ :where(.nuri-theme) {
384
+ font-family: inherit;
385
+ }
313
386
  /* Utility */
314
387
  .nuri-display-flex {
315
388
  display: flex;
@@ -439,158 +512,132 @@ p {
439
512
  height: -moz-fit-content;
440
513
  height: fit-content;
441
514
  overflow: hidden;
442
-
443
- &.avatar-image {
515
+ }
516
+ .base-avatar.avatar-image {
444
517
  width: 100%;
445
518
  height: 100%;
446
519
  -o-object-fit: cover;
447
520
  object-fit: cover;
448
521
  }
449
-
450
- & .avatar-fallback {
522
+ .base-avatar .avatar-fallback {
451
523
  display: block;
452
524
  width: 100%;
453
525
  height: 100%;
454
-
455
- & svg {
526
+ }
527
+ :is(.base-avatar .avatar-fallback) svg {
456
528
  width: 100%;
457
529
  height: 100%;
458
530
  }
459
- }
460
- }
461
531
  /***************************************************************************************************
462
532
  * *
463
533
  * avatar *
464
534
  * *
465
535
  ***************************************************************************************************/
536
+ .avatar-wrapper {
537
+ position: relative;
538
+ display: inline-block;
539
+ }
466
540
  .avatar {
467
541
  display: flex;
468
542
  align-items: center;
469
543
  justify-content: center;
470
-
471
- &.size-xl {
472
- width: 124px;
473
- height: 124px;
474
- border: 1px solid #e4e4e7;
475
-
476
- &.badge-option {
477
- width: 48px;
478
- height: 48px;
479
- width: 30px;
480
- height: 30px;
481
- width: 24px;
482
- height: 24px;
483
- width: 18px;
484
- height: 18px;
485
- }
486
- height: 60px;
487
-
488
- font-size: var(--font-size-lg);
489
- line-height: var(--line-height-lg);
490
- font-weight: var(--font-weight-bold)
544
+ }
545
+ .avatar.size-xl {
546
+ width: var(--avatar-size-xl);
547
+ height: var(--avatar-size-xl);
548
+ border: var(--hairline) solid var(--color-grey-scale-200);
491
549
  }
492
-
493
- &.size-l {
494
- width: 74px;
495
- height: 74px;
496
- border: 1px solid #e4e4e7;
497
- height: 48px;
498
-
499
- font-size: var(--font-size-sm);
500
- line-height: var(--line-height-sm);
501
- font-weight: var(--font-weight-semibold);
502
- height: 54px;
503
-
504
- font-size: var(--font-size-base);
505
- line-height: var(--line-height-base);
506
- font-weight: var(--font-weight-bold);
507
- width: 24px;
508
- height: 24px;
509
- height: 50px;
510
- width: 500px;
511
- height: 50px
550
+ .avatar.size-l {
551
+ width: var(--avatar-size-l);
552
+ height: var(--avatar-size-l);
553
+ border: var(--hairline) solid var(--color-grey-scale-200);
512
554
  }
513
-
514
- &.size-m {
515
- width: 58px;
516
- height: 58px;
517
- border: 1px solid #e4e4e7;
518
- height: 40px;
519
-
520
- font-size: var(--font-size-sm);
521
- line-height: var(--line-height-sm);
522
- font-weight: var(--font-weight-semibold);
523
- height: 50px;
524
-
525
- font-size: var(--font-size-sm);
526
- line-height: var(--line-height-sm);
527
- font-weight: var(--font-weight-semibold);
528
- width: 20px;
529
- height: 20px;
530
- height: 40px;
531
- width: 450px;
532
- height: 40px
555
+ .avatar.size-m {
556
+ width: var(--avatar-size-m);
557
+ height: var(--avatar-size-m);
558
+ border: var(--hairline) solid var(--color-grey-scale-200);
533
559
  }
534
-
535
- &.size-s {
536
- width: 40px;
537
- height: 40px;
538
- border: 1px solid #e4e4e7;
539
- height: 32px;
540
-
541
- font-size: var(--font-size-sm);
542
- line-height: var(--line-height-sm);
543
- font-weight: var(--font-weight-bold);
544
- height: 40px;
545
-
546
- font-size: var(--font-size-xsm);
547
- line-height: var(--line-height-xsm);
548
- font-weight: var(--font-weight-semibold);
549
- width: 18px;
550
- height: 18px;
551
- width: 400px
560
+ .avatar.size-s {
561
+ width: var(--avatar-size-s);
562
+ height: var(--avatar-size-s);
563
+ border: var(--hairline) solid var(--color-grey-scale-200);
552
564
  }
565
+ .avatar-badge {
566
+ position: absolute;
567
+ right: 0;
568
+ bottom: 0;
569
+ display: flex;
570
+ align-items: center;
571
+ justify-content: center;
572
+ gap: var(--spacing-4);
573
+ border-radius: var(--radius-full);
574
+ border: var(--hairline) solid var(--color-grey-scale-200);
553
575
  }
576
+ .avatar-badge.size-xl {
577
+ width: var(--avatar-badge-size-xl);
578
+ height: var(--avatar-badge-size-xl);
579
+ }
580
+ .avatar-badge.size-l {
581
+ width: var(--avatar-badge-size-l);
582
+ height: var(--avatar-badge-size-l);
583
+ }
584
+ .avatar-badge.size-m {
585
+ width: var(--avatar-badge-size-m);
586
+ height: var(--avatar-badge-size-m);
587
+ }
588
+ .avatar-badge.size-s {
589
+ width: var(--avatar-badge-size-s);
590
+ height: var(--avatar-badge-size-s);
591
+ }
554
592
  .base-badge {
555
593
  position: relative;
556
594
  display: flex;
557
595
  align-items: center;
558
- gap: 4px;
559
- border-radius: 40px;
560
-
561
- background-color: attr(data-backgroundColor color, transparent);
562
- color: attr(data-textColor color, transparent);
563
- border: attr(data-borderColor color, transparent);
596
+ gap: var(--spacing-4);
597
+ border-radius: var(--radius-full);
598
+ }
599
+ .base-badge.size-xl {
600
+ height: var(--label-height-xl);
564
601
 
565
- &.size-r {
566
- height: 36px;
602
+ font-size: var(--font-size-sm);
603
+ line-height: var(--line-height-sm);
604
+ font-weight: var(--font-weight-semibold);
605
+ }
606
+ .base-badge.size-l {
607
+ height: var(--label-height-l);
567
608
 
568
609
  font-size: var(--font-size-sm);
569
610
  line-height: var(--line-height-sm);
570
611
  font-weight: var(--font-weight-semibold);
571
- height: 48px;
612
+ }
613
+ .base-badge.size-m {
614
+ height: var(--label-height-m);
572
615
 
573
616
  font-size: var(--font-size-sm);
574
617
  line-height: var(--line-height-sm);
575
618
  font-weight: var(--font-weight-semibold);
576
619
  }
620
+ .base-badge.size-s {
621
+ height: var(--label-height-s);
577
622
 
578
- &.size-sm {
579
- height: 28px;
623
+ font-size: var(--font-size-sm);
624
+ line-height: var(--line-height-sm);
625
+ font-weight: var(--font-weight-bold);
626
+ }
627
+ .base-badge.size-xs {
628
+ height: var(--label-height-xs);
580
629
 
581
630
  font-size: var(--font-size-xsm);
582
631
  line-height: var(--line-height-xsm);
583
632
  font-weight: var(--font-weight-bold);
584
633
  }
585
-
586
- &.icon-text-option {
634
+ .base-badge.icon-text-option {
587
635
  display: flex;
588
636
  align-items: center;
589
637
  justify-content: space-between;
590
638
 
591
- padding: 0 20px;
639
+ padding: 0 var(--spacing-20);
592
640
  }
593
- }
594
641
  /***************************************************************************************************
595
642
  * *
596
643
  * option-badge *
@@ -601,7 +648,7 @@ p {
601
648
  align-items: center;
602
649
  justify-content: center;
603
650
 
604
- border-width: 1px;
651
+ border-width: var(--hairline);
605
652
  border-style: solid;
606
653
  }
607
654
  /***************************************************************************************************
@@ -613,9 +660,9 @@ p {
613
660
  display: flex;
614
661
  align-items: center;
615
662
  justify-content: center;
616
- gap: 4px;
663
+ gap: var(--spacing-4);
617
664
 
618
- border-width: 1px;
665
+ border-width: var(--hairline);
619
666
  border-style: solid;
620
667
  }
621
668
  /***************************************************************************************************
@@ -628,113 +675,159 @@ p {
628
675
  align-items: center;
629
676
  justify-content: space-between;
630
677
 
631
- padding: 0 20px;
632
-
633
- > span {
678
+ padding: 0 var(--spacing-20);
679
+ }
680
+ .icon-text-option > span {
634
681
  display: flex;
635
682
  align-items: center;
636
- gap: 4px;
683
+ gap: var(--spacing-4);
684
+ }
685
+ /***************************************************************************************************
686
+ * *
687
+ * variant *
688
+ * *
689
+ ***************************************************************************************************/
690
+ .variant-neutral:is(.option,.icon-text,.icon-text-option) {
691
+ color: var(--color-black);
692
+ background-color: var(--color-white);
693
+ border-color: transparent;
694
+ }
695
+ .variant-primary:is(.option,.icon-text,.icon-text-option) {
696
+ color: var(--color-purple-900);
697
+ background-color: var(--color-purple-50);
698
+ border-color: transparent;
699
+ }
700
+ .variant-danger:is(.option,.icon-text,.icon-text-option) {
701
+ color: var(--color-accent-red-700);
702
+ background-color: var(--color-accent-red-50);
703
+ border-color: transparent;
704
+ }
705
+ /* icon-text-option 은 테두리가 없는 모양이라 두께·스타일까지 여기서 준다. */
706
+ .variant-outlined:is(.option,.icon-text,.icon-text-option) {
707
+ color: var(--color-black);
708
+ background-color: var(--color-white);
709
+ border: var(--hairline) solid var(--color-grey-scale-300);
637
710
  }
638
- }
639
711
  .base-button {
640
712
  display: flex;
641
713
  justify-content: center;
642
714
  align-items: center;
643
- gap: 10px;
644
- border-radius: 6px;
715
+ gap: var(--spacing-10);
716
+ border-radius: var(--radius-6);
645
717
  border: none;
646
718
  cursor: pointer;
647
-
648
- &:focus-visible {
719
+ }
720
+ .base-button:focus-visible {
649
721
  outline: none;
650
722
  box-shadow: none;
651
723
  }
652
- }
653
724
  /***************************************************************************************************
654
725
  * *
655
726
  * cta-button *
656
727
  * *
657
728
  ***************************************************************************************************/
658
729
  .cta-button {
659
- border-radius: 6px;
660
-
661
- &.variant-primary {
730
+ border-radius: var(--radius-6);
731
+ }
732
+ .cta-button.variant-primary {
662
733
  background-color: var(--color-purple-900);
663
- border: 1px solid var(--color-purple-900);
734
+ border: var(--hairline) solid var(--color-purple-900);
664
735
  color: var(--color-white);
665
-
666
- &:not(:disabled):hover {
736
+ }
737
+ .cta-button.variant-primary:not(:disabled):hover {
667
738
  background-color: var(--color-purple-900);
668
739
  border-color: var(--color-purple-900);
669
740
  color: var(--color-white);
741
+ }
742
+ .cta-button.variant-secondary {
743
+ background-color: var(--color-purple-50);
744
+ color: var(--color-purple-900);
745
+ }
746
+ .cta-button.variant-secondary:not(:disabled):hover {
670
747
  background-color: var(--color-purple-100);
671
748
  border-color: var(--color-purple-100);
672
749
  color: var(--color-purple-900);
750
+ }
751
+ .cta-button.variant-ghost {
752
+ background-color: var(--color-white);
753
+ border: var(--hairline) solid var(--color-grey-scale-300);
754
+ color: var(--color-purple-900);
755
+ }
756
+ .cta-button.variant-ghost:not(:disabled):hover {
673
757
  background-color: var(--color-white);
674
758
  border-color: var(--color-purple-900);
675
759
  color: var(--color-purple-900);
760
+ }
761
+ .cta-button.variant-neutral {
762
+ background-color: var(--color-white);
763
+ color: var(--color-purple-900);
764
+ }
765
+ .cta-button.variant-neutral:not(:disabled):hover {
676
766
  background-color: var(--color-grey-scale-100);
677
- border: 1px solid var(--color-grey-scale-100);
767
+ border: var(--hairline) solid var(--color-grey-scale-100);
678
768
  color: var(--color-purple-900);
769
+ }
770
+ .cta-button.variant-confirm {
771
+ background-color: var(--color-accent-red-500);
772
+ border: var(--hairline) solid var(--color-accent-red-500);
773
+ color: var(--color-white);
774
+ }
775
+ .cta-button.variant-confirm:not(:disabled):hover {
679
776
  background-color: var(--color-accent-red-700);
680
777
  border-color: var(--color-accent-red-700);
681
778
  color: var(--color-white);
682
779
  }
683
- }
684
-
685
- &.variant-secondary {
686
- background-color: var(--color-purple-50);
687
- color: var(--color-purple-900)
688
- }
689
-
690
- &.variant-ghost {
780
+ .cta-button.variant-outlined {
691
781
  background-color: var(--color-white);
692
- border: 1px solid var(--color-grey-scale-300);
693
- color: var(--color-purple-900)
782
+ border: var(--hairline) solid var(--color-accent-red-700);
783
+ color: var(--color-accent-red-700);
694
784
  }
785
+ .cta-button.size-xl {
786
+ height: var(--control-height-xl);
695
787
 
696
- &.variant-neutral {
697
- background-color: var(--color-white);
698
- color: var(--color-purple-900)
788
+ font-size: var(--font-size-lg);
789
+ line-height: var(--line-height-lg);
790
+ font-weight: var(--font-weight-bold);
699
791
  }
792
+ .cta-button.size-l {
793
+ height: var(--control-height-l);
700
794
 
701
- &.variant-confirm {
702
- background-color: var(--color-accent-red-500);
703
- border: 1px solid var(--color-accent-red-500);
704
- color: var(--color-white)
795
+ font-size: var(--font-size-base);
796
+ line-height: var(--line-height-base);
797
+ font-weight: var(--font-weight-bold);
705
798
  }
799
+ .cta-button.size-m {
800
+ height: var(--control-height-m);
706
801
 
707
- &.variant-outlined {
708
- background-color: var(--color-white);
709
- border: 1px solid var(--color-accent-red-700);
710
- color: var(--color-accent-red-700);
802
+ font-size: var(--font-size-sm);
803
+ line-height: var(--line-height-sm);
804
+ font-weight: var(--font-weight-semibold);
711
805
  }
712
-
713
- &.size-xs {
714
- height: 30px;
806
+ .cta-button.size-s {
807
+ height: var(--control-height-s);
715
808
 
716
809
  font-size: var(--font-size-xsm);
717
810
  line-height: var(--line-height-xsm);
718
811
  font-weight: var(--font-weight-semibold);
719
812
  }
813
+ .cta-button.size-xs {
814
+ height: var(--control-height-xs);
720
815
 
721
- &:disabled {
816
+ font-size: var(--font-size-xsm);
817
+ line-height: var(--line-height-xsm);
818
+ font-weight: var(--font-weight-semibold);
819
+ }
820
+ .cta-button:disabled {
722
821
  background-color: var(--color-grey-scale-200);
723
822
  color: var(--color-white);
724
823
  cursor: not-allowed;
725
824
  border: none;
726
- background-color: var(--color-grey-scale-100);
727
- color: var(--color-grey-scale-400);
728
- cursor: not-allowed;
729
825
  }
730
- }
731
- .base-check-box {
732
- &.label {
826
+ .base-check-box.label {
733
827
  font-size: var(--font-size-sm);
734
828
  font-weight: var(--font-weight-medium);
735
829
  color: var(--color-black);
736
830
  }
737
- }
738
831
  /***************************************************************************************************
739
832
  * *
740
833
  * check-box *
@@ -743,50 +836,53 @@ p {
743
836
  .check-box {
744
837
  display: flex;
745
838
  align-items: center;
746
- gap: 10px;
839
+ gap: var(--spacing-10);
747
840
 
748
841
  background-color: transparent;
749
842
  border: none;
750
843
  }
751
- .check-box-indicator {
752
- &.wrapper {
844
+ .check-box-indicator.wrapper {
753
845
  display: flex;
754
846
  align-items: center;
755
847
  justify-content: center;
756
- border-radius: 4px;
757
- border: 1.5px solid var(--color-purple-900);
848
+ border-radius: var(--radius-4);
849
+ border: var(--checkbox-border) solid var(--color-purple-900);
758
850
  }
851
+ .check-box-indicator {
759
852
 
760
853
  width: 100%;
761
854
  height: 100%;
762
-
763
- &[data-state='unchecked'] {
764
- background-color: #fff;
855
+ }
856
+ .check-box-indicator.size-l {
857
+ width: var(--checkbox-size-l);
858
+ height: var(--checkbox-size-l);
765
859
  }
766
-
767
- &[data-state='checked'] {
860
+ .check-box-indicator.size-m {
861
+ width: var(--checkbox-size-m);
862
+ height: var(--checkbox-size-m);
863
+ }
864
+ .check-box-indicator.size-s {
865
+ width: var(--checkbox-size-s);
866
+ height: var(--checkbox-size-s);
867
+ }
868
+ .check-box-indicator[data-state='unchecked'] {
869
+ background-color: var(--color-white);
870
+ }
871
+ .check-box-indicator[data-state='checked'] {
768
872
  background-color: var(--color-purple-900);
769
873
  }
770
-
771
- &[data-disabled='true'] {
874
+ .check-box-indicator[data-disabled='true'] {
772
875
  border: none;
773
- border-radius: 4px;
876
+ border-radius: var(--radius-4);
774
877
  background-color: var(--color-grey-scale-300);
775
878
  }
776
- }
777
- .base-collapsible-menu {
778
- &.trigger {
879
+ .base-collapsible-menu.trigger {
779
880
  display: flex;
780
881
  align-items: center;
781
882
  justify-content: space-between;
782
- gap: 10px;
883
+ gap: var(--spacing-10);
783
884
  width: 100%;
784
- display: flex;
785
- align-items: center;
786
- justify-content: space-between;
787
- gap: 10px;
788
885
  }
789
- }
790
886
  /***************************************************************************************************
791
887
  * *
792
888
  * collapsible-menu *
@@ -795,60 +891,59 @@ p {
795
891
  .collapsible-menu {
796
892
  display: flex;
797
893
  flex-direction: column;
798
- gap: 4px;
894
+ gap: var(--spacing-4);
799
895
  }
800
- .collapsible-menu.size-m {
801
- .collapsible-menu-row {
802
- height: 40px;
803
- height: 48px;
896
+ .collapsible-menu.size-s .collapsible-menu-row {
897
+ height: var(--menu-row-height-s);
898
+ }
899
+ .collapsible-menu.size-m .collapsible-menu-row {
900
+ height: var(--menu-row-height-m);
901
+ }
902
+ .collapsible-menu-row {
804
903
  all: unset;
805
904
  box-sizing: border-box;
806
905
  display: flex;
807
906
  align-items: center;
808
907
  justify-content: space-between;
809
- gap: 10px;
908
+ gap: var(--spacing-10);
810
909
 
811
910
  width: 100%;
812
- padding: 0 12px;
813
- border-radius: 8px;
911
+ padding: 0 var(--spacing-12);
912
+ /* figma 토큰에 --radius-8 없음. 디자이너 확인 전까지 숫자 유지 */
913
+ border-radius: 8px; /* raw-px */
814
914
  cursor: pointer;
815
915
 
816
916
  font-size: var(--font-size-sm);
817
917
  line-height: var(--line-height-sm);
818
918
  font-weight: var(--font-weight-medium);
819
919
  color: var(--collapsible-menu-text-color, var(--color-grey-scale-700));
820
-
821
- &:hover {
920
+ }
921
+ .collapsible-menu-row:hover {
822
922
  background-color: var(--collapsible-menu-hover-bg-color, var(--color-grey-scale-100));
823
923
  }
824
-
825
- &.is-active {
924
+ .collapsible-menu-row.is-active {
826
925
  background-color: var(--collapsible-menu-active-bg-color, var(--color-grey-scale-100));
827
926
  color: var(--collapsible-menu-active-text-color, var(--color-purple-800));
828
927
  font-weight: var(--collapsible-menu-active-font-weight, 600);
829
928
  }
830
-
831
- &:disabled,
832
- &[aria-disabled='true'] {
929
+ .collapsible-menu-row:disabled,.collapsible-menu-row[aria-disabled='true'] {
833
930
  cursor: not-allowed;
834
931
  color: var(--collapsible-menu-disabled-text-color, var(--color-grey-scale-400));
835
932
  }
836
- }
837
- }
838
933
  .collapsible-menu-left {
839
934
  display: inline-flex;
840
935
  align-items: center;
841
- gap: 10px;
936
+ gap: var(--spacing-10);
842
937
  min-width: 0;
843
938
  }
844
939
  .collapsible-menu-left > * {
845
940
  min-width: 0;
846
941
  }
847
942
  .collapsible-menu-chevron {
848
- width: 18px;
849
- height: 18px;
943
+ width: var(--icon-size-s);
944
+ height: var(--icon-size-s);
850
945
  color: var(--color-grey-scale-500);
851
- transition: transform 160ms ease;
946
+ transition: transform var(--motion-fast) var(--motion-ease);
852
947
  }
853
948
  .base-collapsible-menu.trigger[data-state='open'] .collapsible-menu-chevron {
854
949
  transform: rotate(180deg);
@@ -856,48 +951,63 @@ p {
856
951
  .collapsible-menu-content {
857
952
  display: flex;
858
953
  flex-direction: column;
859
- gap: 2px;
860
- margin-top: 2px;
861
- margin-bottom: 4px;
954
+ gap: var(--spacing-2);
955
+ margin-top: var(--spacing-2);
956
+ margin-bottom: var(--spacing-4);
862
957
  }
958
+ /* placeholder 로 넘기는 span 의 색. base-drop-down 이 기본 placeholder 에 붙인다. */
959
+ .nuri-placeholder {
960
+ color: var(--color-grey-scale-400);
961
+ }
962
+ .base-drop-down.trigger {
963
+ display: flex;
964
+ align-items: center;
965
+ justify-content: space-between;
966
+ gap: var(--spacing-10);
967
+ }
863
968
  /***************************************************************************************************
864
969
  * *
865
970
  * drop-down-single *
866
971
  * *
867
972
  ***************************************************************************************************/
973
+ .drop-down-single-trigger.size-s {
974
+ height: var(--control-height-s);
975
+ }
976
+ .drop-down-single-trigger.size-m {
977
+ height: var(--control-height-m);
978
+ }
868
979
  .drop-down-single-trigger {
869
980
 
870
- border: 1px solid var(--color-grey-scale-300);
871
- border-radius: 4px;
981
+ border: var(--hairline) solid var(--color-grey-scale-300);
982
+ border-radius: var(--radius-4);
872
983
  width: -moz-fit-content;
873
984
  width: fit-content;
874
- padding: 0 14px;
985
+ padding: 0 var(--spacing-14);
875
986
  background-color: var(--color-white);
876
-
877
- &:focus {
987
+ }
988
+ .drop-down-single-trigger:focus {
878
989
  border-color: var(--color-purple-900);
879
990
  }
880
-
881
- &[data-placeholder] {
882
- .drop-down-single-icon {
991
+ .drop-down-single-trigger[data-placeholder] .drop-down-single-icon {
883
992
  color: var(--color-grey-scale-400);
884
- color: var(--color-black);
885
993
  }
886
-
887
- svg {
994
+ .drop-down-single-trigger[data-placeholder] svg {
888
995
  color: var(--color-grey-scale-400);
996
+ }
997
+ .drop-down-single-trigger:not([data-placeholder]) .drop-down-single-icon {
889
998
  color: var(--color-black);
890
999
  }
891
- }
892
-
893
- &[data-state='open'] {
894
- .rotate {
1000
+ .drop-down-single-trigger:not([data-placeholder]) svg {
1001
+ color: var(--color-black);
1002
+ }
1003
+ .drop-down-single-trigger[data-state='open'] .rotate {
895
1004
  transform: rotate(180deg);
896
1005
  transform-origin: 50% 50%;
897
- transition: transform 160ms ease;
1006
+ transition: transform var(--motion-fast) var(--motion-ease);
898
1007
  will-change: transform;
899
1008
  }
900
- }
1009
+ .drop-down-single-label {
1010
+ gap: var(--spacing-10);
901
1011
  }
902
1012
  .drop-down-single-value {
903
1013
  font-size: var(--font-size-sm);
@@ -905,513 +1015,510 @@ p {
905
1015
  font-weight: var(--font-weight-medium);
906
1016
 
907
1017
  text-align: left;
908
-
909
- ::-moz-placeholder {
1018
+ }
1019
+ .drop-down-single-value ::-moz-placeholder {
910
1020
  color: var(--color-grey-scale-400);
911
1021
  }
912
-
913
- ::placeholder {
1022
+ .drop-down-single-value ::placeholder {
914
1023
  color: var(--color-grey-scale-400);
915
1024
  }
916
- }
917
1025
  .drop-down-single-content {
918
- z-index: 5;
1026
+ z-index: var(--z-popover);
919
1027
  min-width: var(--radix-select-trigger-width);
920
1028
  overflow: hidden;
921
- box-shadow:
922
- 0px 4px 6px -2px rgba(0, 0, 0, 0.06),
923
- 0px 10px 15px -3px rgba(0, 0, 0, 0.1);
924
- border-radius: 6px;
1029
+ box-shadow: var(--shadow-popover);
1030
+ border-radius: var(--radius-6);
925
1031
  }
926
1032
  .drop-down-single-item {
927
- padding: 14px;
1033
+ padding: var(--spacing-14);
928
1034
  background-color: var(--color-white);
929
1035
  outline: none;
930
- height: 46px;
1036
+ height: var(--drop-down-item-height);
931
1037
 
932
1038
  font-size: var(--font-size-sm);
933
1039
  line-height: var(--line-height-sm);
934
1040
  font-weight: var(--font-weight-medium);
935
1041
 
936
1042
  cursor: pointer;
937
-
938
- &[data-highlighted] {
1043
+ }
1044
+ .drop-down-single-item[data-highlighted] {
939
1045
  background-color: var(--color-purple-50);
940
1046
  outline: none;
941
1047
  }
942
- }
943
- .base-text {
944
- &:where(.xsm) {
1048
+ .drop-down-single-item:disabled {
1049
+ background-color: var(--color-grey-scale-100);
1050
+ color: var(--color-grey-scale-400);
1051
+ cursor: not-allowed;
1052
+ }
1053
+ .base-text:where(.xsm) {
945
1054
  font-size: var(--font-size-xsm);
946
1055
  line-height: var(--line-height-xsm);
947
1056
  }
948
- &:where(.sm) {
1057
+ .base-text:where(.sm) {
949
1058
  font-size: var(--font-size-sm);
950
1059
  line-height: var(--line-height-sm);
951
1060
  }
952
- &:where(.base) {
1061
+ .base-text:where(.base) {
953
1062
  font-size: var(--font-size-base);
954
1063
  line-height: var(--line-height-base);
955
1064
  }
956
- &:where(.lg) {
1065
+ .base-text:where(.lg) {
957
1066
  font-size: var(--font-size-lg);
958
1067
  line-height: var(--line-height-lg);
959
1068
  }
960
- &:where(.xl) {
1069
+ .base-text:where(.xl) {
961
1070
  font-size: var(--font-size-xl);
962
1071
  line-height: var(--line-height-xl);
963
1072
  }
964
- &:where(.t-2xl) {
1073
+ .base-text:where(.t-2xl) {
965
1074
  font-size: var(--font-size-2xl);
966
1075
  line-height: var(--line-height-2xl);
967
1076
  }
968
- &:where(.t-3xl) {
1077
+ .base-text:where(.t-3xl) {
969
1078
  font-size: var(--font-size-3xl);
970
1079
  line-height: var(--line-height-3xl);
971
1080
  }
972
- &:where(.t-4xl) {
1081
+ .base-text:where(.t-4xl) {
973
1082
  font-size: var(--font-size-4xl);
974
1083
  line-height: var(--line-height-4xl);
975
1084
  }
976
- &:where(.t-5xl) {
1085
+ .base-text:where(.t-5xl) {
977
1086
  font-size: var(--font-size-5xl);
978
1087
  line-height: var(--line-height-5xl);
979
1088
  }
980
- &:where(.t-6xl) {
1089
+ .base-text:where(.t-6xl) {
981
1090
  font-size: var(--font-size-6xl);
982
1091
  line-height: var(--line-height-6xl);
983
1092
  }
984
-
985
- &:where(.regular) {
1093
+ .base-text:where(.regular) {
986
1094
  font-weight: var(--font-weight-regular);
987
1095
  }
988
- &:where(.medium) {
1096
+ .base-text:where(.medium) {
989
1097
  font-weight: var(--font-weight-medium);
990
1098
  }
991
- &:where(.semibold) {
1099
+ .base-text:where(.semibold) {
992
1100
  font-weight: var(--font-weight-semibold);
993
1101
  }
994
- &:where(.bold) {
1102
+ .base-text:where(.bold) {
995
1103
  font-weight: var(--font-weight-bold);
996
1104
  }
997
- &:where(.extrabold) {
1105
+ .base-text:where(.extrabold) {
998
1106
  font-weight: var(--font-weight-extrabold);
999
1107
  }
1000
-
1001
- &[class*='textAlign-'] {
1002
- &.textAlign-left {
1108
+ .base-text.textAlign-left[class*='textAlign-'] {
1003
1109
  text-align: left;
1004
1110
  }
1005
- &.textAlign-center {
1111
+ .base-text.textAlign-center[class*='textAlign-'] {
1006
1112
  text-align: center;
1007
1113
  }
1008
- }
1009
-
1010
- &[class*='textDecoration-'] {
1011
- &.textDecoration-underline {
1114
+ .base-text.textDecoration-underline[class*='textDecoration-'] {
1012
1115
  text-decoration: underline;
1013
1116
  }
1014
- &.textDecoration-none {
1117
+ .base-text.textDecoration-none[class*='textDecoration-'] {
1015
1118
  text-decoration: none;
1016
1119
  }
1017
- &.textDecoration-lineThrough {
1120
+ .base-text.textDecoration-lineThrough[class*='textDecoration-'] {
1018
1121
  text-decoration: line-through;
1019
1122
  }
1020
- &.textDecoration-overline {
1123
+ .base-text.textDecoration-overline[class*='textDecoration-'] {
1021
1124
  text-decoration: overline;
1022
1125
  }
1023
- &.textDecoration-blink {
1126
+ .base-text.textDecoration-blink[class*='textDecoration-'] {
1024
1127
  text-decoration: blink;
1025
1128
  }
1026
- }
1027
-
1028
- &[class*='wordBreak-'] {
1029
- &.wordBreak-normal {
1129
+ .base-text.wordBreak-normal[class*='wordBreak-'] {
1030
1130
  word-break: normal;
1031
1131
  }
1032
- &.wordBreak-breakAll {
1132
+ .base-text.wordBreak-breakAll[class*='wordBreak-'] {
1033
1133
  word-break: break-all;
1034
1134
  }
1035
- &.wordBreak-breakWord {
1135
+ .base-text.wordBreak-breakWord[class*='wordBreak-'] {
1036
1136
  word-break: break-word;
1037
1137
  }
1038
- &.wordBreak-keepAll {
1138
+ .base-text.wordBreak-keepAll[class*='wordBreak-'] {
1039
1139
  word-break: keep-all;
1040
1140
  }
1041
- &.wordBreak-keepWord {
1141
+ .base-text.wordBreak-keepWord[class*='wordBreak-'] {
1042
1142
  word-break: keep-word;
1043
1143
  }
1044
- &.wordBreak-breakSpaces {
1144
+ .base-text.wordBreak-breakSpaces[class*='wordBreak-'] {
1045
1145
  word-break: break-spaces;
1046
1146
  }
1047
- &.wordBreak-all {
1147
+ .base-text.wordBreak-all[class*='wordBreak-'] {
1048
1148
  word-break: all;
1049
1149
  }
1050
- }
1051
-
1052
- &[class*='whiteSpace-'] {
1053
- &.whiteSpace-normal {
1150
+ .base-text.whiteSpace-normal[class*='whiteSpace-'] {
1054
1151
  white-space: normal;
1055
1152
  }
1056
- &.whiteSpace-nowrap {
1153
+ .base-text.whiteSpace-nowrap[class*='whiteSpace-'] {
1057
1154
  white-space: nowrap;
1058
1155
  }
1059
- &.whiteSpace-pre {
1156
+ .base-text.whiteSpace-pre[class*='whiteSpace-'] {
1060
1157
  white-space: pre;
1061
1158
  }
1062
- &.whiteSpace-preLine {
1159
+ .base-text.whiteSpace-preLine[class*='whiteSpace-'] {
1063
1160
  white-space: pre-line;
1064
1161
  }
1065
- &.whiteSpace-preWrap {
1162
+ .base-text.whiteSpace-preWrap[class*='whiteSpace-'] {
1066
1163
  white-space: pre-wrap;
1067
1164
  }
1068
- }
1069
-
1070
- &[class*='color-'] {
1071
- &.color-black {
1165
+ .base-text.color-black[class*='color-'] {
1072
1166
  color: var(--color-black);
1073
1167
  }
1074
- &.color-white {
1168
+ .base-text.color-white[class*='color-'] {
1075
1169
  color: var(--color-white);
1076
1170
  }
1077
- &.color-grey-scale-50 {
1171
+ .base-text.color-grey-scale-50[class*='color-'] {
1078
1172
  color: var(--color-grey-scale-50);
1079
1173
  }
1080
- &.color-grey-scale-100 {
1174
+ .base-text.color-grey-scale-100[class*='color-'] {
1081
1175
  color: var(--color-grey-scale-100);
1082
1176
  }
1083
- &.color-grey-scale-200 {
1177
+ .base-text.color-grey-scale-200[class*='color-'] {
1084
1178
  color: var(--color-grey-scale-200);
1085
1179
  }
1086
- &.color-grey-scale-300 {
1180
+ .base-text.color-grey-scale-300[class*='color-'] {
1087
1181
  color: var(--color-grey-scale-300);
1088
1182
  }
1089
- &.color-grey-scale-400 {
1183
+ .base-text.color-grey-scale-400[class*='color-'] {
1090
1184
  color: var(--color-grey-scale-400);
1091
1185
  }
1092
- &.color-grey-scale-500 {
1186
+ .base-text.color-grey-scale-500[class*='color-'] {
1093
1187
  color: var(--color-grey-scale-500);
1094
1188
  }
1095
- &.color-grey-scale-600 {
1189
+ .base-text.color-grey-scale-600[class*='color-'] {
1096
1190
  color: var(--color-grey-scale-600);
1097
1191
  }
1098
- &.color-grey-scale-700 {
1192
+ .base-text.color-grey-scale-700[class*='color-'] {
1099
1193
  color: var(--color-grey-scale-700);
1100
1194
  }
1101
- &.color-grey-scale-800 {
1195
+ .base-text.color-grey-scale-800[class*='color-'] {
1102
1196
  color: var(--color-grey-scale-800);
1103
1197
  }
1104
- &.color-grey-scale-900 {
1198
+ .base-text.color-grey-scale-900[class*='color-'] {
1105
1199
  color: var(--color-grey-scale-900);
1106
1200
  }
1107
- &.color-purple-50 {
1201
+ .base-text.color-purple-50[class*='color-'] {
1108
1202
  color: var(--color-purple-50);
1109
1203
  }
1110
- &.color-purple-100 {
1204
+ .base-text.color-purple-100[class*='color-'] {
1111
1205
  color: var(--color-purple-100);
1112
1206
  }
1113
- &.color-purple-200 {
1207
+ .base-text.color-purple-200[class*='color-'] {
1114
1208
  color: var(--color-purple-200);
1115
1209
  }
1116
- &.color-purple-300 {
1210
+ .base-text.color-purple-300[class*='color-'] {
1117
1211
  color: var(--color-purple-300);
1118
1212
  }
1119
- &.color-purple-400 {
1213
+ .base-text.color-purple-400[class*='color-'] {
1120
1214
  color: var(--color-purple-400);
1121
1215
  }
1122
- &.color-purple-500 {
1216
+ .base-text.color-purple-500[class*='color-'] {
1123
1217
  color: var(--color-purple-500);
1124
1218
  }
1125
- &.color-purple-600 {
1219
+ .base-text.color-purple-600[class*='color-'] {
1126
1220
  color: var(--color-purple-600);
1127
1221
  }
1128
- &.color-purple-700 {
1222
+ .base-text.color-purple-700[class*='color-'] {
1129
1223
  color: var(--color-purple-700);
1130
1224
  }
1131
- &.color-purple-800 {
1225
+ .base-text.color-purple-800[class*='color-'] {
1132
1226
  color: var(--color-purple-800);
1133
1227
  }
1134
- &.color-purple-900 {
1228
+ .base-text.color-purple-900[class*='color-'] {
1135
1229
  color: var(--color-purple-900);
1136
1230
  }
1137
- &.color-accent-red-50 {
1231
+ .base-text.color-accent-red-50[class*='color-'] {
1138
1232
  color: var(--color-accent-red-50);
1139
1233
  }
1140
- &.color-accent-red-100 {
1234
+ .base-text.color-accent-red-100[class*='color-'] {
1141
1235
  color: var(--color-accent-red-100);
1142
1236
  }
1143
- &.color-accent-red-200 {
1237
+ .base-text.color-accent-red-200[class*='color-'] {
1144
1238
  color: var(--color-accent-red-200);
1145
1239
  }
1146
- &.color-accent-red-300 {
1240
+ .base-text.color-accent-red-300[class*='color-'] {
1147
1241
  color: var(--color-accent-red-300);
1148
1242
  }
1149
- &.color-accent-red-400 {
1243
+ .base-text.color-accent-red-400[class*='color-'] {
1150
1244
  color: var(--color-accent-red-400);
1151
1245
  }
1152
- &.color-accent-red-500 {
1246
+ .base-text.color-accent-red-500[class*='color-'] {
1153
1247
  color: var(--color-accent-red-500);
1154
1248
  }
1155
- &.color-accent-red-600 {
1249
+ .base-text.color-accent-red-600[class*='color-'] {
1156
1250
  color: var(--color-accent-red-600);
1157
1251
  }
1158
- &.color-accent-red-700 {
1252
+ .base-text.color-accent-red-700[class*='color-'] {
1159
1253
  color: var(--color-accent-red-700);
1160
1254
  }
1161
- &.color-accent-red-800 {
1255
+ .base-text.color-accent-red-800[class*='color-'] {
1162
1256
  color: var(--color-accent-red-800);
1163
1257
  }
1164
- &.color-accent-red-900 {
1258
+ .base-text.color-accent-red-900[class*='color-'] {
1165
1259
  color: var(--color-accent-red-900);
1166
1260
  }
1167
- &.color-accent-pink-50 {
1261
+ .base-text.color-accent-pink-50[class*='color-'] {
1168
1262
  color: var(--color-accent-pink-50);
1169
1263
  }
1170
- &.color-accent-pink-100 {
1264
+ .base-text.color-accent-pink-100[class*='color-'] {
1171
1265
  color: var(--color-accent-pink-100);
1172
1266
  }
1173
- &.color-accent-pink-200 {
1267
+ .base-text.color-accent-pink-200[class*='color-'] {
1174
1268
  color: var(--color-accent-pink-200);
1175
1269
  }
1176
- &.color-accent-pink-300 {
1270
+ .base-text.color-accent-pink-300[class*='color-'] {
1177
1271
  color: var(--color-accent-pink-300);
1178
1272
  }
1179
- &.color-accent-pink-400 {
1273
+ .base-text.color-accent-pink-400[class*='color-'] {
1180
1274
  color: var(--color-accent-pink-400);
1181
1275
  }
1182
- &.color-accent-pink-500 {
1276
+ .base-text.color-accent-pink-500[class*='color-'] {
1183
1277
  color: var(--color-accent-pink-500);
1184
1278
  }
1185
- &.color-accent-pink-600 {
1279
+ .base-text.color-accent-pink-600[class*='color-'] {
1186
1280
  color: var(--color-accent-pink-600);
1187
1281
  }
1188
- &.color-accent-pink-700 {
1282
+ .base-text.color-accent-pink-700[class*='color-'] {
1189
1283
  color: var(--color-accent-pink-700);
1190
1284
  }
1191
- &.color-accent-pink-800 {
1285
+ .base-text.color-accent-pink-800[class*='color-'] {
1192
1286
  color: var(--color-accent-pink-800);
1193
1287
  }
1194
- &.color-accent-pink-900 {
1288
+ .base-text.color-accent-pink-900[class*='color-'] {
1195
1289
  color: var(--color-accent-pink-900);
1196
1290
  }
1197
- &.color-accent-magenta-50 {
1291
+ .base-text.color-accent-magenta-50[class*='color-'] {
1198
1292
  color: var(--color-accent-magenta-50);
1199
1293
  }
1200
- &.color-accent-magenta-100 {
1294
+ .base-text.color-accent-magenta-100[class*='color-'] {
1201
1295
  color: var(--color-accent-magenta-100);
1202
1296
  }
1203
- &.color-accent-magenta-200 {
1297
+ .base-text.color-accent-magenta-200[class*='color-'] {
1204
1298
  color: var(--color-accent-magenta-200);
1205
1299
  }
1206
- &.color-accent-magenta-300 {
1300
+ .base-text.color-accent-magenta-300[class*='color-'] {
1207
1301
  color: var(--color-accent-magenta-300);
1208
1302
  }
1209
- &.color-accent-magenta-400 {
1303
+ .base-text.color-accent-magenta-400[class*='color-'] {
1210
1304
  color: var(--color-accent-magenta-400);
1211
1305
  }
1212
- &.color-accent-magenta-500 {
1306
+ .base-text.color-accent-magenta-500[class*='color-'] {
1213
1307
  color: var(--color-accent-magenta-500);
1214
1308
  }
1215
- &.color-accent-magenta-600 {
1309
+ .base-text.color-accent-magenta-600[class*='color-'] {
1216
1310
  color: var(--color-accent-magenta-600);
1217
1311
  }
1218
- &.color-accent-magenta-700 {
1312
+ .base-text.color-accent-magenta-700[class*='color-'] {
1219
1313
  color: var(--color-accent-magenta-700);
1220
1314
  }
1221
- &.color-accent-magenta-800 {
1315
+ .base-text.color-accent-magenta-800[class*='color-'] {
1222
1316
  color: var(--color-accent-magenta-800);
1223
1317
  }
1224
- &.color-accent-magenta-900 {
1318
+ .base-text.color-accent-magenta-900[class*='color-'] {
1225
1319
  color: var(--color-accent-magenta-900);
1226
1320
  }
1227
- &.color-accent-blue-50 {
1321
+ .base-text.color-accent-blue-50[class*='color-'] {
1228
1322
  color: var(--color-accent-blue-50);
1229
1323
  }
1230
- &.color-accent-blue-100 {
1324
+ .base-text.color-accent-blue-100[class*='color-'] {
1231
1325
  color: var(--color-accent-blue-100);
1232
1326
  }
1233
- &.color-accent-blue-200 {
1327
+ .base-text.color-accent-blue-200[class*='color-'] {
1234
1328
  color: var(--color-accent-blue-200);
1235
1329
  }
1236
- &.color-accent-blue-300 {
1330
+ .base-text.color-accent-blue-300[class*='color-'] {
1237
1331
  color: var(--color-accent-blue-300);
1238
1332
  }
1239
- &.color-accent-blue-400 {
1333
+ .base-text.color-accent-blue-400[class*='color-'] {
1240
1334
  color: var(--color-accent-blue-400);
1241
1335
  }
1242
- &.color-accent-blue-500 {
1336
+ .base-text.color-accent-blue-500[class*='color-'] {
1243
1337
  color: var(--color-accent-blue-500);
1244
1338
  }
1245
- &.color-accent-blue-600 {
1339
+ .base-text.color-accent-blue-600[class*='color-'] {
1246
1340
  color: var(--color-accent-blue-600);
1247
1341
  }
1248
- &.color-accent-blue-700 {
1342
+ .base-text.color-accent-blue-700[class*='color-'] {
1249
1343
  color: var(--color-accent-blue-700);
1250
1344
  }
1251
- &.color-accent-blue-800 {
1345
+ .base-text.color-accent-blue-800[class*='color-'] {
1252
1346
  color: var(--color-accent-blue-800);
1253
1347
  }
1254
- &.color-accent-blue-900 {
1348
+ .base-text.color-accent-blue-900[class*='color-'] {
1255
1349
  color: var(--color-accent-blue-900);
1256
1350
  }
1257
- &.color-accent-mint-50 {
1351
+ .base-text.color-accent-mint-50[class*='color-'] {
1258
1352
  color: var(--color-accent-mint-50);
1259
1353
  }
1260
- &.color-accent-mint-100 {
1354
+ .base-text.color-accent-mint-100[class*='color-'] {
1261
1355
  color: var(--color-accent-mint-100);
1262
1356
  }
1263
- &.color-accent-mint-200 {
1357
+ .base-text.color-accent-mint-200[class*='color-'] {
1264
1358
  color: var(--color-accent-mint-200);
1265
1359
  }
1266
- &.color-accent-mint-300 {
1360
+ .base-text.color-accent-mint-300[class*='color-'] {
1267
1361
  color: var(--color-accent-mint-300);
1268
1362
  }
1269
- &.color-accent-mint-400 {
1363
+ .base-text.color-accent-mint-400[class*='color-'] {
1270
1364
  color: var(--color-accent-mint-400);
1271
1365
  }
1272
- &.color-accent-mint-500 {
1366
+ .base-text.color-accent-mint-500[class*='color-'] {
1273
1367
  color: var(--color-accent-mint-500);
1274
1368
  }
1275
- &.color-accent-mint-600 {
1369
+ .base-text.color-accent-mint-600[class*='color-'] {
1276
1370
  color: var(--color-accent-mint-600);
1277
1371
  }
1278
- &.color-accent-mint-700 {
1372
+ .base-text.color-accent-mint-700[class*='color-'] {
1279
1373
  color: var(--color-accent-mint-700);
1280
1374
  }
1281
- &.color-accent-mint-800 {
1375
+ .base-text.color-accent-mint-800[class*='color-'] {
1282
1376
  color: var(--color-accent-mint-800);
1283
1377
  }
1284
- &.color-accent-mint-900 {
1378
+ .base-text.color-accent-mint-900[class*='color-'] {
1285
1379
  color: var(--color-accent-mint-900);
1286
1380
  }
1287
- &.color-accent-green-50 {
1381
+ .base-text.color-accent-green-50[class*='color-'] {
1288
1382
  color: var(--color-accent-green-50);
1289
1383
  }
1290
- &.color-accent-green-100 {
1384
+ .base-text.color-accent-green-100[class*='color-'] {
1291
1385
  color: var(--color-accent-green-100);
1292
1386
  }
1293
- &.color-accent-green-200 {
1387
+ .base-text.color-accent-green-200[class*='color-'] {
1294
1388
  color: var(--color-accent-green-200);
1295
1389
  }
1296
- &.color-accent-green-300 {
1390
+ .base-text.color-accent-green-300[class*='color-'] {
1297
1391
  color: var(--color-accent-green-300);
1298
1392
  }
1299
- &.color-accent-green-400 {
1393
+ .base-text.color-accent-green-400[class*='color-'] {
1300
1394
  color: var(--color-accent-green-400);
1301
1395
  }
1302
- &.color-accent-green-500 {
1396
+ .base-text.color-accent-green-500[class*='color-'] {
1303
1397
  color: var(--color-accent-green-500);
1304
1398
  }
1305
- &.color-accent-green-600 {
1399
+ .base-text.color-accent-green-600[class*='color-'] {
1306
1400
  color: var(--color-accent-green-600);
1307
1401
  }
1308
- &.color-accent-green-700 {
1402
+ .base-text.color-accent-green-700[class*='color-'] {
1309
1403
  color: var(--color-accent-green-700);
1310
1404
  }
1311
- &.color-accent-green-800 {
1405
+ .base-text.color-accent-green-800[class*='color-'] {
1312
1406
  color: var(--color-accent-green-800);
1313
1407
  }
1314
- &.color-accent-green-900 {
1408
+ .base-text.color-accent-green-900[class*='color-'] {
1315
1409
  color: var(--color-accent-green-900);
1316
1410
  }
1317
- &.color-accent-yellow-50 {
1411
+ .base-text.color-accent-yellow-50[class*='color-'] {
1318
1412
  color: var(--color-accent-yellow-50);
1319
1413
  }
1320
- &.color-accent-yellow-100 {
1414
+ .base-text.color-accent-yellow-100[class*='color-'] {
1321
1415
  color: var(--color-accent-yellow-100);
1322
1416
  }
1323
- &.color-accent-yellow-200 {
1417
+ .base-text.color-accent-yellow-200[class*='color-'] {
1324
1418
  color: var(--color-accent-yellow-200);
1325
1419
  }
1326
- &.color-accent-yellow-300 {
1420
+ .base-text.color-accent-yellow-300[class*='color-'] {
1327
1421
  color: var(--color-accent-yellow-300);
1328
1422
  }
1329
- &.color-accent-yellow-400 {
1423
+ .base-text.color-accent-yellow-400[class*='color-'] {
1330
1424
  color: var(--color-accent-yellow-400);
1331
1425
  }
1332
- &.color-accent-yellow-500 {
1426
+ .base-text.color-accent-yellow-500[class*='color-'] {
1333
1427
  color: var(--color-accent-yellow-500);
1334
1428
  }
1335
- &.color-accent-yellow-600 {
1429
+ .base-text.color-accent-yellow-600[class*='color-'] {
1336
1430
  color: var(--color-accent-yellow-600);
1337
1431
  }
1338
- &.color-accent-yellow-700 {
1432
+ .base-text.color-accent-yellow-700[class*='color-'] {
1339
1433
  color: var(--color-accent-yellow-700);
1340
1434
  }
1341
- &.color-accent-yellow-800 {
1435
+ .base-text.color-accent-yellow-800[class*='color-'] {
1342
1436
  color: var(--color-accent-yellow-800);
1343
1437
  }
1344
- &.color-accent-yellow-900 {
1438
+ .base-text.color-accent-yellow-900[class*='color-'] {
1345
1439
  color: var(--color-accent-yellow-900);
1346
1440
  }
1347
- &.color-accent-orange-50 {
1441
+ .base-text.color-accent-orange-50[class*='color-'] {
1348
1442
  color: var(--color-accent-orange-50);
1349
1443
  }
1350
- &.color-accent-orange-100 {
1444
+ .base-text.color-accent-orange-100[class*='color-'] {
1351
1445
  color: var(--color-accent-orange-100);
1352
1446
  }
1353
- &.color-accent-orange-200 {
1447
+ .base-text.color-accent-orange-200[class*='color-'] {
1354
1448
  color: var(--color-accent-orange-200);
1355
1449
  }
1356
- &.color-accent-orange-300 {
1450
+ .base-text.color-accent-orange-300[class*='color-'] {
1357
1451
  color: var(--color-accent-orange-300);
1358
1452
  }
1359
- &.color-accent-orange-400 {
1453
+ .base-text.color-accent-orange-400[class*='color-'] {
1360
1454
  color: var(--color-accent-orange-400);
1361
1455
  }
1362
- &.color-accent-orange-500 {
1456
+ .base-text.color-accent-orange-500[class*='color-'] {
1363
1457
  color: var(--color-accent-orange-500);
1364
1458
  }
1365
- &.color-accent-orange-600 {
1459
+ .base-text.color-accent-orange-600[class*='color-'] {
1366
1460
  color: var(--color-accent-orange-600);
1367
1461
  }
1368
- &.color-accent-orange-700 {
1462
+ .base-text.color-accent-orange-700[class*='color-'] {
1369
1463
  color: var(--color-accent-orange-700);
1370
1464
  }
1371
- &.color-accent-orange-800 {
1465
+ .base-text.color-accent-orange-800[class*='color-'] {
1372
1466
  color: var(--color-accent-orange-800);
1373
1467
  }
1374
- &.color-accent-orange-900 {
1468
+ .base-text.color-accent-orange-900[class*='color-'] {
1375
1469
  color: var(--color-accent-orange-900);
1376
1470
  }
1377
- }
1471
+ .base-inline-loading {
1472
+ display: flex;
1473
+ width: 100%;
1474
+ height: 100%;
1475
+ align-items: center;
1378
1476
  }
1379
- .component-loading-inline {
1380
- display: flex;
1381
- width: 100%;
1382
- height: 100%;
1383
- align-items: center;
1384
- }
1385
- /* components/loading/overlay-loading/overlay-loading-style.css */
1386
- .page-loading-container {
1477
+ /* 링은 currentColor 다. 우선순위 0 이라 넘겨받은 className 이나 style 의 color 가 늘 이긴다. */
1478
+ :where(.base-inline-loading) {
1479
+ color: var(--color-grey-scale-200);
1480
+ }
1481
+ .base-overlay-loading {
1387
1482
  position: fixed;
1388
1483
  inset: 0;
1389
1484
  display: flex;
1390
1485
  align-items: center;
1391
1486
  justify-content: center;
1392
1487
  }
1393
- .page-loading-backdrop { position: absolute; inset: 0; }
1488
+ .page-loading-backdrop {
1489
+ position: absolute;
1490
+ inset: 0;
1491
+ }
1394
1492
  .page-loading-content {
1395
1493
  position: relative;
1396
1494
  display: flex;
1397
1495
  flex-direction: column;
1398
1496
  align-items: center;
1399
- gap: 16px;
1497
+ gap: var(--spacing-16);
1400
1498
  }
1401
1499
  /* 기본 스피너(20px)를 확대 */
1402
- .page-loading-indicator { transform: scale(3.2); transform-origin: center; }
1403
- .page-loading-text { position: relative; }
1404
- .component-loading-container {
1500
+ .page-loading-indicator {
1501
+ transform: scale(3.2);
1502
+ transform-origin: center;
1503
+ }
1504
+ .page-loading-text {
1505
+ position: relative;
1506
+ }
1507
+ .base-spinner {
1405
1508
  display: flex;
1406
- width: 20px;
1407
- height: 20px;
1509
+ width: var(--icon-size-m);
1510
+ height: var(--icon-size-m);
1408
1511
  align-items: center;
1409
1512
  justify-content: center;
1410
1513
  }
1514
+ /* 우선순위 0 이라 넘겨받은 className 이나 style 의 color 가 늘 이긴다. */
1515
+ :where(.base-spinner) {
1516
+ color: var(--color-grey-scale-200);
1517
+ }
1411
1518
  .loading-indicator-ring {
1412
1519
  position: relative;
1413
- width: 20px;
1414
- height: 20px;
1520
+ width: var(--icon-size-m);
1521
+ height: var(--icon-size-m);
1415
1522
  }
1416
1523
  .loading-indicator-single-ring {
1417
1524
  box-sizing: border-box;
@@ -1419,50 +1526,57 @@ p {
1419
1526
  position: absolute;
1420
1527
  width: 100%;
1421
1528
  height: 100%;
1422
- border: 3px solid;
1529
+ border: var(--spinner-stroke) solid;
1423
1530
  border-radius: 50%;
1424
- animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
1425
- /* 기본값은 white, 상위에서 --spinner-border-color 주입 */
1426
- border-color: var(--spinner-border-color, var(--color-white)) transparent transparent transparent;
1531
+ animation: lds-ring var(--spinner-duration) var(--spinner-ease) infinite;
1532
+ border-color: currentColor transparent transparent transparent;
1533
+ }
1534
+ .loading-indicator-single-ring:nth-child(1) {
1535
+ animation-delay: calc(var(--spinner-duration) * -0.375);
1536
+ }
1537
+ .loading-indicator-single-ring:nth-child(2) {
1538
+ animation-delay: calc(var(--spinner-duration) * -0.25);
1539
+ }
1540
+ .loading-indicator-single-ring:nth-child(3) {
1541
+ animation-delay: calc(var(--spinner-duration) * -0.125);
1542
+ }
1543
+ .loading-indicator-single-ring:nth-child(4) {
1544
+ animation-delay: 0s;
1427
1545
  }
1428
- /* nth-child 지연은 그대로 CSS or 인라인 중 하나만 사용한다면, 아래는 제거 가능 (지금은 인라인 사용 중) */
1429
- /*
1430
- .loading-indicator-single-ring:nth-child(1) { animation-delay: -0.45s; }
1431
- .loading-indicator-single-ring:nth-child(2) { animation-delay: -0.3s; }
1432
- .loading-indicator-single-ring:nth-child(3) { animation-delay: -0.15s; }
1433
- .loading-indicator-single-ring:nth-child(4) { animation-delay: 0s; }
1434
- */
1435
1546
  @keyframes lds-ring {
1436
- 0% { transform: rotate(0deg); }
1437
- 100% { transform: rotate(360deg); }
1547
+ 0% {
1548
+ transform: rotate(0deg);
1549
+ }
1550
+ 100% {
1551
+ transform: rotate(360deg);
1552
+ }
1438
1553
  }
1439
- .base-modal {
1554
+ /* Title·Close 같은 조각도 base-modal 을 달므로 상자 스타일은 container·overlay 에만 건다. */
1555
+ .base-modal:where(.modal-container, .modal-overlay) {
1440
1556
  display: flex;
1441
1557
  flex-direction: column;
1442
1558
  align-items: center;
1443
1559
 
1444
- padding: 30px;
1445
- border-radius: 6px;
1446
-
1447
- &.modal-container {
1560
+ padding: var(--spacing-30);
1561
+ border-radius: var(--radius-6);
1562
+ }
1563
+ .base-modal.modal-container {
1448
1564
  position: fixed;
1449
1565
  top: 50%;
1450
1566
  left: 50%;
1451
1567
  transform: translate(-50%, -50%);
1452
- z-index: 9999;
1568
+ z-index: var(--z-modal);
1453
1569
  background-color: var(--color-white);
1454
1570
  }
1455
-
1456
- &.modal-overlay {
1571
+ .base-modal.modal-overlay {
1457
1572
  position: fixed;
1458
1573
  top: 0;
1459
1574
  left: 0;
1460
1575
  right: 0;
1461
1576
  bottom: 0;
1462
1577
  background-color: rgba(0, 0, 0, 0.5);
1463
- z-index: 9998;
1578
+ z-index: var(--z-overlay);
1464
1579
  }
1465
- }
1466
1580
  /***************************************************************************************************
1467
1581
  * *
1468
1582
  * modal-with-double-button *
@@ -1474,97 +1588,112 @@ p {
1474
1588
  align-items: center;
1475
1589
  width: 100%;
1476
1590
  }
1591
+ .modal-with-double-button-container.size-s {
1592
+ width: var(--modal-width-s);
1593
+ }
1594
+ .modal-with-double-button-container.size-m {
1595
+ width: var(--modal-width-m);
1596
+ }
1597
+ .modal-with-double-button-container.size-l {
1598
+ width: var(--modal-width-l);
1599
+ }
1477
1600
  .modal-with-double-button-title-icon {
1478
- margin-bottom: 20px;
1601
+ margin-bottom: var(--spacing-20);
1479
1602
  }
1480
1603
  .modal-with-double-button-title {
1481
- margin-bottom: 4px;
1604
+ margin-bottom: var(--spacing-4);
1482
1605
  }
1483
1606
  .modal-with-double-button-content {
1484
- margin-top: 20px;
1607
+ margin-top: var(--spacing-20);
1485
1608
  }
1486
1609
  .modal-with-double-button-close {
1487
1610
  display: flex;
1488
1611
  justify-content: space-between;
1489
1612
  align-items: center;
1490
- gap: 16px;
1613
+ gap: var(--spacing-16);
1491
1614
  width: 100%;
1492
- margin-top: 30px;
1493
-
1494
- &.row {
1615
+ margin-top: var(--spacing-30);
1616
+ }
1617
+ .modal-with-double-button-close.row {
1495
1618
  display: flex;
1496
1619
  justify-content: center;
1497
1620
  align-items: center;
1498
- gap: 16px;
1499
-
1500
- > * {
1621
+ gap: var(--spacing-16);
1622
+ }
1623
+ .modal-with-double-button-close.row > * {
1501
1624
  flex: 1;
1502
- width: 100%;
1503
1625
  }
1504
- }
1505
-
1506
- &.column {
1626
+ .modal-with-double-button-close.column {
1507
1627
  display: flex;
1508
1628
  flex-direction: column;
1509
1629
  justify-content: center;
1510
1630
  align-items: center;
1511
- gap: 10px
1631
+ gap: var(--spacing-10);
1512
1632
  }
1513
- }
1514
- .radio {
1515
- &:where(.radio-group) {
1633
+ .modal-with-double-button-close.column > * {
1634
+ width: 100%;
1635
+ }
1636
+ .base-radio:where(.button) {
1637
+ padding: 0;
1638
+ }
1639
+ /***************************************************************************************************
1640
+ * *
1641
+ * radio *
1642
+ * *
1643
+ ***************************************************************************************************/
1644
+ .radio:where(.radio-group) {
1516
1645
  display: flex;
1517
1646
  flex-direction: column;
1518
- gap: 16px;
1647
+ gap: var(--spacing-16);
1648
+ }
1649
+ .radio:where(.radio-option) {
1650
+ display: flex;
1651
+ align-items: center;
1652
+ gap: var(--spacing-6);
1519
1653
  }
1520
- &:where(.radio-button) {
1654
+ .radio:where(.radio-button) {
1521
1655
  display: flex;
1522
1656
  align-items: center;
1523
1657
  justify-content: center;
1524
- width: 18px;
1525
- height: 18px;
1658
+ width: var(--radio-size);
1659
+ height: var(--radio-size);
1526
1660
  border-radius: 50%;
1527
1661
  background-color: var(--color-grey-scale-200);
1528
1662
  }
1529
- &:where(.radio-indicator) {
1530
- width: 8px;
1531
- height: 8px;
1663
+ .radio:where(.radio-indicator) {
1664
+ width: var(--radio-dot-size);
1665
+ height: var(--radio-dot-size);
1532
1666
  border-radius: 50%;
1533
1667
  background-color: var(--color-purple-900);
1534
1668
  }
1535
- &:where(.radio-label) {
1669
+ .radio:where(.radio-label) {
1536
1670
  font-size: var(--font-size-sm);
1537
1671
  font-weight: var(--font-weight-medium);
1538
1672
  color: var(--color-black);
1539
1673
  }
1540
- }
1541
1674
  .base-table {
1542
1675
  width: -moz-fit-content;
1543
1676
  width: fit-content;
1544
-
1545
- .header {
1677
+ }
1678
+ .base-table .header {
1546
1679
  display: flex;
1547
1680
  align-items: center;
1548
1681
  width: 100%;
1549
1682
  }
1550
-
1551
- .body {
1683
+ .base-table .body {
1552
1684
  width: 100%;
1553
1685
  }
1554
-
1555
- .row {
1686
+ .base-table .row {
1556
1687
  display: flex;
1557
1688
  align-items: center;
1558
1689
  width: 100%;
1559
1690
  }
1560
-
1561
- .cell {
1691
+ .base-table .cell {
1562
1692
  text-align: start;
1563
1693
  display: flex;
1564
1694
  flex-direction: column;
1565
1695
  justify-content: center;
1566
1696
  }
1567
- }
1568
1697
  /***************************************************************************************************
1569
1698
  * *
1570
1699
  * data-table *
@@ -1577,35 +1706,128 @@ p {
1577
1706
  .data-table-header {
1578
1707
  position: sticky;
1579
1708
  top: 0;
1580
- background-color: #fff;
1581
- z-index: 3;
1582
- border-bottom: 1px solid #e4e4e7;
1709
+ background-color: var(--color-white);
1710
+ z-index: var(--z-sticky-header);
1711
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
1583
1712
  }
1584
1713
  .data-table-row {
1585
1714
  position: relative;
1586
- border-bottom: 1px solid var(--color-grey-scale-200);
1587
-
1588
- .fixed {
1715
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
1716
+ }
1717
+ .data-table-row .fixed {
1589
1718
  position: sticky;
1590
- background-color: #fff;
1591
- z-index: 2;
1592
-
1593
- & > * {
1719
+ background-color: var(--color-white);
1720
+ z-index: var(--z-sticky);
1721
+ }
1722
+ :is(.data-table-row .fixed) > * {
1594
1723
  position: relative;
1595
- z-index: 1;
1724
+ z-index: var(--z-raised);
1596
1725
  }
1597
- background-color: #f5f5f5
1598
- }
1599
- }
1600
1726
  .body .data-table-row:hover {
1601
- background-color: #f5f5f5
1727
+ background-color: var(--color-grey-scale-100);
1602
1728
  }
1729
+ :is(.body .data-table-row:hover) .fixed {
1730
+ background-color: var(--color-grey-scale-100);
1731
+ }
1603
1732
  .fixed-cell {
1604
1733
  position: sticky;
1605
1734
  left: 0;
1606
1735
  }
1607
- .base-text-field {
1608
- &.input {
1736
+ .base-tabs:where(.root) {
1737
+ width: 100%;
1738
+ display: block;
1739
+ }
1740
+ /***************************************************************************************************
1741
+ * *
1742
+ * tabs *
1743
+ * *
1744
+ ***************************************************************************************************/
1745
+ .tabs-list {
1746
+ display: flex;
1747
+ align-items: center;
1748
+ position: relative;
1749
+ }
1750
+ .tabs-list.variant-underline {
1751
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
1752
+
1753
+ /* Scrollable logic */
1754
+ overflow-x: auto;
1755
+ scrollbar-width: none;
1756
+ }
1757
+ .tabs-list.variant-underline::-webkit-scrollbar {
1758
+ display: none;
1759
+ }
1760
+ .tabs-trigger {
1761
+ /* 1. 구조적 스타일 (Layout) */
1762
+ display: inline-flex;
1763
+ align-items: center;
1764
+ justify-content: center;
1765
+ cursor: pointer;
1766
+ background: transparent;
1767
+ border: 0;
1768
+ flex-shrink: 0;
1769
+
1770
+ /* 2. 테마 스타일 (Theme) */
1771
+ /* figma 토큰에 11px 없음. 디자이너 확인 전까지 숫자 유지 */
1772
+ padding: 10px 30px 11px 30px; /* raw-px */
1773
+ color: var(--color-grey-scale-400);
1774
+ font-size: var(--font-size-sm);
1775
+ font-weight: var(--font-weight-medium);
1776
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
1777
+ transition: color var(--motion-base) var(--motion-ease);
1778
+ }
1779
+ .tabs-trigger:hover {
1780
+ color: var(--color-purple-700);
1781
+ }
1782
+ .tabs-trigger[data-state='active'] {
1783
+ color: var(--color-purple-700);
1784
+ font-weight: var(--font-weight-bold);
1785
+ }
1786
+ .tabs-trigger.disabled {
1787
+ cursor: not-allowed;
1788
+ opacity: 0.5;
1789
+ }
1790
+ /* 3. 변이 스타일 (Variants) */
1791
+ .tabs-trigger.variant-underline {
1792
+ border-bottom: 0;
1793
+ }
1794
+ .tabs-trigger.variant-underline[data-state='active'] {
1795
+ border-bottom-color: transparent;
1796
+ }
1797
+ .tabs-trigger.variant-filled {
1798
+ flex: 1; /* full-width logic integrated */
1799
+ text-align: center;
1800
+ /* figma 토큰에 11px 없음. 디자이너 확인 전까지 숫자 유지 */
1801
+ padding: 11px 30px; /* raw-px */
1802
+ border-bottom: 0;
1803
+ z-index: var(--z-raised);
1804
+ }
1805
+ .tabs-trigger.variant-filled:hover,.tabs-trigger.variant-filled[data-state='active'] {
1806
+ background-color: transparent;
1807
+ }
1808
+ .tabs-indicator {
1809
+ /* 1. 구조적 스타일 (Layout) */
1810
+ position: absolute;
1811
+ pointer-events: none;
1812
+ z-index: var(--z-raised);
1813
+ transition:
1814
+ left var(--motion-base) var(--motion-ease),
1815
+ width var(--motion-base) var(--motion-ease);
1816
+
1817
+ /* 2. 변이 스타일 (Variants) */
1818
+ }
1819
+ .tabs-indicator.variant-underline {
1820
+ bottom: 0;
1821
+ height: var(--tab-indicator-thickness);
1822
+ background-color: var(--color-purple-800);
1823
+ }
1824
+ .tabs-indicator.variant-filled {
1825
+ top: 0;
1826
+ bottom: 0;
1827
+ background-color: var(--color-purple-50);
1828
+ z-index: var(--z-base);
1829
+ }
1830
+ .base-text-field.input {
1609
1831
  border: none;
1610
1832
  outline: none;
1611
1833
  background-color: transparent;
@@ -1613,137 +1835,141 @@ p {
1613
1835
  font-size: var(--font-size-sm);
1614
1836
  line-height: var(--line-height-sm);
1615
1837
  font-weight: var(--font-weight-medium);
1616
-
1617
- &::-moz-placeholder {
1838
+ }
1839
+ .base-text-field.input::-moz-placeholder {
1618
1840
  color: var(--color-grey-scale-400);
1619
1841
  }
1620
-
1621
- &::placeholder {
1842
+ .base-text-field.input::placeholder {
1622
1843
  color: var(--color-grey-scale-400);
1623
1844
  }
1624
-
1625
- &:-webkit-autofill,
1626
- &:-webkit-autofill:hover,
1627
- &:-webkit-autofill:focus,
1628
- &:-webkit-autofill:active {
1629
- box-shadow: 0 0 0px 1000px transparent inset;
1845
+ .base-text-field.input:-webkit-autofill,.base-text-field.input:-webkit-autofill:hover,.base-text-field.input:-webkit-autofill:focus,.base-text-field.input:-webkit-autofill:active {
1846
+ /* 브라우저 자동완성 배경을 덮는 관용 해킹. 토큰이 아니라 고정값이다 */ /* raw-value */
1847
+ box-shadow: 0 0 0px 1000px transparent inset; /* raw-value */
1630
1848
  -webkit-transition: background-color 5000s ease-in-out 0s;
1631
- transition: background-color 5000s ease-in-out 0s;
1849
+ transition: background-color 5000s ease-in-out 0s; /* raw-value */
1632
1850
  }
1633
- }
1634
- }
1635
1851
  /***************************************************************************************************
1636
1852
  * *
1637
1853
  * base-text-field *
1638
1854
  * *
1639
1855
  ***************************************************************************************************/
1856
+ .text-field {
1857
+ height: -moz-fit-content;
1858
+ height: fit-content;
1859
+ }
1640
1860
  .text-field-title {
1641
- margin-bottom: 8px;
1861
+ margin-bottom: var(--spacing-8);
1642
1862
  }
1643
1863
  .text-field-input-wrapper {
1644
1864
  display: flex;
1645
1865
  align-items: center;
1646
1866
  justify-content: space-between;
1647
- gap: 10px;
1648
-
1649
- padding: 0 14px;
1867
+ gap: var(--spacing-10);
1650
1868
 
1651
- border-radius: 4px;
1652
- border: 1px solid var(--color-grey-scale-300);
1869
+ padding: 0 var(--spacing-14);
1653
1870
 
1654
- &:has([data-disabled='true']) {
1871
+ border-radius: var(--radius-4);
1872
+ border: var(--hairline) solid var(--color-grey-scale-300);
1873
+ }
1874
+ .text-field-input-wrapper.size-s {
1875
+ height: var(--control-height-s);
1876
+ }
1877
+ .text-field-input-wrapper.size-m {
1878
+ height: var(--control-height-m);
1879
+ }
1880
+ .text-field-input-wrapper:has( > input[data-disabled='true']) {
1655
1881
  border-color: var(--color-grey-scale-300);
1656
1882
  background-color: var(--color-grey-scale-100);
1657
1883
  }
1658
-
1659
- &:focus-within {
1660
- border: 1px solid var(--color-purple-900);
1884
+ .text-field-input-wrapper:focus-within {
1885
+ border: var(--hairline) solid var(--color-purple-900);
1661
1886
  }
1662
-
1663
- > input {
1887
+ .text-field-input-wrapper > input {
1664
1888
  width: 100%;
1665
1889
  }
1666
- }
1667
1890
  .text-field-helper-text {
1668
- margin-top: 4px;
1669
-
1670
- &.error {
1891
+ margin-top: var(--spacing-4);
1892
+ }
1893
+ .text-field-helper-text.error {
1671
1894
  color: var(--color-accent-red-500);
1672
1895
  }
1673
- }
1674
- .base-tooltip {
1675
- z-index: 3;
1676
- &.content {
1896
+ /* Trigger 도 base-tooltip 을 달므로 z-index 는 Content 에만 건다. */
1897
+ .base-tooltip:where(.content) {
1898
+ z-index: var(--z-tooltip);
1899
+ }
1900
+ .base-tooltip.content {
1677
1901
  text-align: center;
1678
1902
  }
1679
- }
1903
+ .base-tooltip:where(.trigger) {
1904
+ width: -moz-fit-content;
1905
+ width: fit-content;
1906
+ }
1680
1907
  /***************************************************************************************************
1681
1908
  * *
1682
1909
  * tooltip *
1683
1910
  * *
1684
1911
  ***************************************************************************************************/
1685
- .tooltip-trigger {
1686
- width: -moz-fit-content;
1687
- width: fit-content;
1688
- }
1689
1912
  .tooltip-content {
1690
1913
  display: flex;
1691
1914
  justify-content: space-around;
1692
1915
  align-items: center;
1693
- gap: 10px;
1916
+ gap: var(--spacing-10);
1694
1917
 
1695
1918
  background-color: var(--color-purple-900);
1696
1919
  color: var(--color-white);
1697
- border-radius: 6px;
1698
- padding: 12px;
1920
+ border-radius: var(--radius-6);
1921
+ padding: var(--spacing-12);
1699
1922
 
1700
1923
  font-size: var(--font-size-sm);
1701
1924
  line-height: var(--line-height-sm);
1702
1925
  font-weight: var(--font-weight-regular);
1703
1926
 
1704
1927
  position: relative;
1705
-
1706
- &::before {
1928
+ }
1929
+ .tooltip-content::before {
1707
1930
  content: '';
1708
1931
  position: absolute;
1709
1932
  width: 0;
1710
1933
  height: 0;
1711
1934
  border-style: solid;
1712
- bottom: -8px;
1935
+ }
1936
+ .tooltip-content.direction-top {
1937
+ transform: translateY(calc(-1 * var(--spacing-10)));
1938
+ }
1939
+ .tooltip-content.direction-top::before {
1940
+ bottom: calc(-1 * var(--tooltip-arrow));
1713
1941
  left: 50%;
1714
1942
  transform: translateX(-50%);
1715
- border-width: 8px 8px 0 8px;
1943
+ border-width: var(--tooltip-arrow) var(--tooltip-arrow) 0 var(--tooltip-arrow);
1716
1944
  border-color: var(--color-purple-900) transparent transparent transparent;
1717
- top: -8px;
1945
+ }
1946
+ .tooltip-content.direction-bottom {
1947
+ transform: translateY(var(--spacing-10));
1948
+ }
1949
+ .tooltip-content.direction-bottom::before {
1950
+ top: calc(-1 * var(--tooltip-arrow));
1718
1951
  left: 50%;
1719
1952
  transform: translateX(-50%);
1720
- border-width: 0 8px 8px 8px;
1953
+ border-width: 0 var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow);
1721
1954
  border-color: transparent transparent var(--color-purple-900) transparent;
1722
- right: -8px;
1955
+ }
1956
+ .tooltip-content.direction-left {
1957
+ transform: translateX(calc(-1 * var(--spacing-10)));
1958
+ }
1959
+ .tooltip-content.direction-left::before {
1960
+ right: calc(-1 * var(--tooltip-arrow));
1723
1961
  top: 50%;
1724
1962
  transform: translateY(-50%);
1725
- border-width: 8px 0 8px 8px;
1963
+ border-width: var(--tooltip-arrow) 0 var(--tooltip-arrow) var(--tooltip-arrow);
1726
1964
  border-color: transparent transparent transparent var(--color-purple-900);
1727
- left: -8px;
1965
+ }
1966
+ .tooltip-content.direction-right {
1967
+ transform: translateX(var(--spacing-10));
1968
+ }
1969
+ .tooltip-content.direction-right::before {
1970
+ left: calc(-1 * var(--tooltip-arrow));
1728
1971
  top: 50%;
1729
1972
  transform: translateY(-50%);
1730
- border-width: 8px 8px 8px 0;
1973
+ border-width: var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow) 0;
1731
1974
  border-color: transparent var(--color-purple-900) transparent transparent;
1732
- }
1733
-
1734
- &.direction-top {
1735
- transform: translateY(-10px)
1736
- }
1737
-
1738
- &.direction-bottom {
1739
- transform: translateY(10px)
1740
- }
1741
-
1742
- &.direction-left {
1743
- transform: translateX(-10px)
1744
- }
1745
-
1746
- &.direction-right {
1747
- transform: translateX(10px)
1748
- }
1749
- }
1975
+ }