@nurihaus/web-design-system 3.0.1 → 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 +465 -219
  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;
@@ -460,88 +533,99 @@ p {
460
533
  * avatar *
461
534
  * *
462
535
  ***************************************************************************************************/
536
+ .avatar-wrapper {
537
+ position: relative;
538
+ display: inline-block;
539
+ }
463
540
  .avatar {
464
541
  display: flex;
465
542
  align-items: center;
466
543
  justify-content: center;
467
544
  }
468
545
  .avatar.size-xl {
469
- width: 124px;
470
- height: 124px;
471
- border: 1px solid #e4e4e7;
546
+ width: var(--avatar-size-xl);
547
+ height: var(--avatar-size-xl);
548
+ border: var(--hairline) solid var(--color-grey-scale-200);
472
549
  }
473
- .avatar.size-xl.badge-option {
474
- width: 48px;
475
- height: 48px;
476
- }
477
550
  .avatar.size-l {
478
- width: 74px;
479
- height: 74px;
480
- border: 1px solid #e4e4e7;
551
+ width: var(--avatar-size-l);
552
+ height: var(--avatar-size-l);
553
+ border: var(--hairline) solid var(--color-grey-scale-200);
481
554
  }
482
- .avatar.size-l.badge-option {
483
- width: 30px;
484
- height: 30px;
485
- }
486
555
  .avatar.size-m {
487
- width: 58px;
488
- height: 58px;
489
- border: 1px solid #e4e4e7;
556
+ width: var(--avatar-size-m);
557
+ height: var(--avatar-size-m);
558
+ border: var(--hairline) solid var(--color-grey-scale-200);
490
559
  }
491
- .avatar.size-m.badge-option {
492
- width: 24px;
493
- height: 24px;
494
- }
495
560
  .avatar.size-s {
496
- width: 40px;
497
- height: 40px;
498
- border: 1px solid #e4e4e7;
561
+ width: var(--avatar-size-s);
562
+ height: var(--avatar-size-s);
563
+ border: var(--hairline) solid var(--color-grey-scale-200);
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);
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);
499
591
  }
500
- .avatar.size-s.badge-option {
501
- width: 18px;
502
- height: 18px;
503
- }
504
592
  .base-badge {
505
593
  position: relative;
506
594
  display: flex;
507
595
  align-items: center;
508
- gap: 4px;
509
- border-radius: 40px;
510
-
511
- background-color: attr(data-backgroundColor color, transparent);
512
- color: attr(data-textColor color, transparent);
513
- border: attr(data-borderColor color, transparent);
596
+ gap: var(--spacing-4);
597
+ border-radius: var(--radius-full);
514
598
  }
515
- .base-badge.size-l {
516
- height: 48px;
599
+ .base-badge.size-xl {
600
+ height: var(--label-height-xl);
517
601
 
518
602
  font-size: var(--font-size-sm);
519
603
  line-height: var(--line-height-sm);
520
604
  font-weight: var(--font-weight-semibold);
521
605
  }
522
- .base-badge.size-m {
523
- height: 40px;
606
+ .base-badge.size-l {
607
+ height: var(--label-height-l);
524
608
 
525
609
  font-size: var(--font-size-sm);
526
610
  line-height: var(--line-height-sm);
527
611
  font-weight: var(--font-weight-semibold);
528
612
  }
529
- .base-badge.size-r {
530
- height: 36px;
613
+ .base-badge.size-m {
614
+ height: var(--label-height-m);
531
615
 
532
616
  font-size: var(--font-size-sm);
533
617
  line-height: var(--line-height-sm);
534
618
  font-weight: var(--font-weight-semibold);
535
619
  }
536
620
  .base-badge.size-s {
537
- height: 32px;
621
+ height: var(--label-height-s);
538
622
 
539
623
  font-size: var(--font-size-sm);
540
624
  line-height: var(--line-height-sm);
541
625
  font-weight: var(--font-weight-bold);
542
626
  }
543
- .base-badge.size-sm {
544
- height: 28px;
627
+ .base-badge.size-xs {
628
+ height: var(--label-height-xs);
545
629
 
546
630
  font-size: var(--font-size-xsm);
547
631
  line-height: var(--line-height-xsm);
@@ -552,7 +636,7 @@ p {
552
636
  align-items: center;
553
637
  justify-content: space-between;
554
638
 
555
- padding: 0 20px;
639
+ padding: 0 var(--spacing-20);
556
640
  }
557
641
  /***************************************************************************************************
558
642
  * *
@@ -564,7 +648,7 @@ p {
564
648
  align-items: center;
565
649
  justify-content: center;
566
650
 
567
- border-width: 1px;
651
+ border-width: var(--hairline);
568
652
  border-style: solid;
569
653
  }
570
654
  /***************************************************************************************************
@@ -576,9 +660,9 @@ p {
576
660
  display: flex;
577
661
  align-items: center;
578
662
  justify-content: center;
579
- gap: 4px;
663
+ gap: var(--spacing-4);
580
664
 
581
- border-width: 1px;
665
+ border-width: var(--hairline);
582
666
  border-style: solid;
583
667
  }
584
668
  /***************************************************************************************************
@@ -591,19 +675,45 @@ p {
591
675
  align-items: center;
592
676
  justify-content: space-between;
593
677
 
594
- padding: 0 20px;
678
+ padding: 0 var(--spacing-20);
595
679
  }
596
680
  .icon-text-option > span {
597
681
  display: flex;
598
682
  align-items: center;
599
- 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);
600
710
  }
601
711
  .base-button {
602
712
  display: flex;
603
713
  justify-content: center;
604
714
  align-items: center;
605
- gap: 10px;
606
- border-radius: 6px;
715
+ gap: var(--spacing-10);
716
+ border-radius: var(--radius-6);
607
717
  border: none;
608
718
  cursor: pointer;
609
719
  }
@@ -617,11 +727,11 @@ p {
617
727
  * *
618
728
  ***************************************************************************************************/
619
729
  .cta-button {
620
- border-radius: 6px;
730
+ border-radius: var(--radius-6);
621
731
  }
622
732
  .cta-button.variant-primary {
623
733
  background-color: var(--color-purple-900);
624
- border: 1px solid var(--color-purple-900);
734
+ border: var(--hairline) solid var(--color-purple-900);
625
735
  color: var(--color-white);
626
736
  }
627
737
  .cta-button.variant-primary:not(:disabled):hover {
@@ -640,7 +750,7 @@ p {
640
750
  }
641
751
  .cta-button.variant-ghost {
642
752
  background-color: var(--color-white);
643
- border: 1px solid var(--color-grey-scale-300);
753
+ border: var(--hairline) solid var(--color-grey-scale-300);
644
754
  color: var(--color-purple-900);
645
755
  }
646
756
  .cta-button.variant-ghost:not(:disabled):hover {
@@ -654,12 +764,12 @@ p {
654
764
  }
655
765
  .cta-button.variant-neutral:not(:disabled):hover {
656
766
  background-color: var(--color-grey-scale-100);
657
- border: 1px solid var(--color-grey-scale-100);
767
+ border: var(--hairline) solid var(--color-grey-scale-100);
658
768
  color: var(--color-purple-900);
659
769
  }
660
770
  .cta-button.variant-confirm {
661
771
  background-color: var(--color-accent-red-500);
662
- border: 1px solid var(--color-accent-red-500);
772
+ border: var(--hairline) solid var(--color-accent-red-500);
663
773
  color: var(--color-white);
664
774
  }
665
775
  .cta-button.variant-confirm:not(:disabled):hover {
@@ -669,46 +779,39 @@ p {
669
779
  }
670
780
  .cta-button.variant-outlined {
671
781
  background-color: var(--color-white);
672
- border: 1px solid var(--color-accent-red-700);
782
+ border: var(--hairline) solid var(--color-accent-red-700);
673
783
  color: var(--color-accent-red-700);
674
784
  }
675
785
  .cta-button.size-xl {
676
- height: 60px;
786
+ height: var(--control-height-xl);
677
787
 
678
788
  font-size: var(--font-size-lg);
679
789
  line-height: var(--line-height-lg);
680
790
  font-weight: var(--font-weight-bold);
681
791
  }
682
792
  .cta-button.size-l {
683
- height: 54px;
793
+ height: var(--control-height-l);
684
794
 
685
795
  font-size: var(--font-size-base);
686
796
  line-height: var(--line-height-base);
687
797
  font-weight: var(--font-weight-bold);
688
798
  }
689
- .cta-button.size-r {
690
- height: 48px;
691
-
692
- font-size: var(--font-size-sm);
693
- line-height: var(--line-height-sm);
694
- font-weight: var(--font-weight-semibold);
695
- }
696
799
  .cta-button.size-m {
697
- height: 50px;
800
+ height: var(--control-height-m);
698
801
 
699
802
  font-size: var(--font-size-sm);
700
803
  line-height: var(--line-height-sm);
701
804
  font-weight: var(--font-weight-semibold);
702
805
  }
703
806
  .cta-button.size-s {
704
- height: 40px;
807
+ height: var(--control-height-s);
705
808
 
706
809
  font-size: var(--font-size-xsm);
707
810
  line-height: var(--line-height-xsm);
708
811
  font-weight: var(--font-weight-semibold);
709
812
  }
710
813
  .cta-button.size-xs {
711
- height: 30px;
814
+ height: var(--control-height-xs);
712
815
 
713
816
  font-size: var(--font-size-xsm);
714
817
  line-height: var(--line-height-xsm);
@@ -733,7 +836,7 @@ p {
733
836
  .check-box {
734
837
  display: flex;
735
838
  align-items: center;
736
- gap: 10px;
839
+ gap: var(--spacing-10);
737
840
 
738
841
  background-color: transparent;
739
842
  border: none;
@@ -742,8 +845,8 @@ p {
742
845
  display: flex;
743
846
  align-items: center;
744
847
  justify-content: center;
745
- border-radius: 4px;
746
- border: 1.5px solid var(--color-purple-900);
848
+ border-radius: var(--radius-4);
849
+ border: var(--checkbox-border) solid var(--color-purple-900);
747
850
  }
748
851
  .check-box-indicator {
749
852
 
@@ -751,33 +854,33 @@ p {
751
854
  height: 100%;
752
855
  }
753
856
  .check-box-indicator.size-l {
754
- width: 24px;
755
- height: 24px;
857
+ width: var(--checkbox-size-l);
858
+ height: var(--checkbox-size-l);
756
859
  }
757
860
  .check-box-indicator.size-m {
758
- width: 20px;
759
- height: 20px;
861
+ width: var(--checkbox-size-m);
862
+ height: var(--checkbox-size-m);
760
863
  }
761
864
  .check-box-indicator.size-s {
762
- width: 18px;
763
- height: 18px;
865
+ width: var(--checkbox-size-s);
866
+ height: var(--checkbox-size-s);
764
867
  }
765
868
  .check-box-indicator[data-state='unchecked'] {
766
- background-color: #fff;
869
+ background-color: var(--color-white);
767
870
  }
768
871
  .check-box-indicator[data-state='checked'] {
769
872
  background-color: var(--color-purple-900);
770
873
  }
771
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
879
  .base-collapsible-menu.trigger {
777
880
  display: flex;
778
881
  align-items: center;
779
882
  justify-content: space-between;
780
- gap: 10px;
883
+ gap: var(--spacing-10);
781
884
  width: 100%;
782
885
  }
783
886
  /***************************************************************************************************
@@ -788,13 +891,13 @@ p {
788
891
  .collapsible-menu {
789
892
  display: flex;
790
893
  flex-direction: column;
791
- gap: 4px;
894
+ gap: var(--spacing-4);
792
895
  }
793
- .collapsible-menu.size-m .collapsible-menu-row {
794
- height: 40px;
896
+ .collapsible-menu.size-s .collapsible-menu-row {
897
+ height: var(--menu-row-height-s);
795
898
  }
796
- .collapsible-menu.size-l .collapsible-menu-row {
797
- height: 48px;
899
+ .collapsible-menu.size-m .collapsible-menu-row {
900
+ height: var(--menu-row-height-m);
798
901
  }
799
902
  .collapsible-menu-row {
800
903
  all: unset;
@@ -802,11 +905,12 @@ p {
802
905
  display: flex;
803
906
  align-items: center;
804
907
  justify-content: space-between;
805
- gap: 10px;
908
+ gap: var(--spacing-10);
806
909
 
807
910
  width: 100%;
808
- padding: 0 12px;
809
- border-radius: 8px;
911
+ padding: 0 var(--spacing-12);
912
+ /* figma 토큰에 --radius-8 없음. 디자이너 확인 전까지 숫자 유지 */
913
+ border-radius: 8px; /* raw-px */
810
914
  cursor: pointer;
811
915
 
812
916
  font-size: var(--font-size-sm);
@@ -829,17 +933,17 @@ p {
829
933
  .collapsible-menu-left {
830
934
  display: inline-flex;
831
935
  align-items: center;
832
- gap: 10px;
936
+ gap: var(--spacing-10);
833
937
  min-width: 0;
834
938
  }
835
939
  .collapsible-menu-left > * {
836
940
  min-width: 0;
837
941
  }
838
942
  .collapsible-menu-chevron {
839
- width: 18px;
840
- height: 18px;
943
+ width: var(--icon-size-s);
944
+ height: var(--icon-size-s);
841
945
  color: var(--color-grey-scale-500);
842
- transition: transform 160ms ease;
946
+ transition: transform var(--motion-fast) var(--motion-ease);
843
947
  }
844
948
  .base-collapsible-menu.trigger[data-state='open'] .collapsible-menu-chevron {
845
949
  transform: rotate(180deg);
@@ -847,34 +951,38 @@ p {
847
951
  .collapsible-menu-content {
848
952
  display: flex;
849
953
  flex-direction: column;
850
- gap: 2px;
851
- margin-top: 2px;
852
- margin-bottom: 4px;
954
+ gap: var(--spacing-2);
955
+ margin-top: var(--spacing-2);
956
+ margin-bottom: var(--spacing-4);
957
+ }
958
+ /* placeholder 로 넘기는 span 의 색. base-drop-down 이 기본 placeholder 에 붙인다. */
959
+ .nuri-placeholder {
960
+ color: var(--color-grey-scale-400);
853
961
  }
854
962
  .base-drop-down.trigger {
855
963
  display: flex;
856
964
  align-items: center;
857
965
  justify-content: space-between;
858
- gap: 10px;
966
+ gap: var(--spacing-10);
859
967
  }
860
968
  /***************************************************************************************************
861
969
  * *
862
970
  * drop-down-single *
863
971
  * *
864
972
  ***************************************************************************************************/
865
- .drop-down-single-trigger.size-m {
866
- height: 40px;
973
+ .drop-down-single-trigger.size-s {
974
+ height: var(--control-height-s);
867
975
  }
868
- .drop-down-single-trigger.size-l {
869
- height: 50px;
976
+ .drop-down-single-trigger.size-m {
977
+ height: var(--control-height-m);
870
978
  }
871
979
  .drop-down-single-trigger {
872
980
 
873
- border: 1px solid var(--color-grey-scale-300);
874
- border-radius: 4px;
981
+ border: var(--hairline) solid var(--color-grey-scale-300);
982
+ border-radius: var(--radius-4);
875
983
  width: -moz-fit-content;
876
984
  width: fit-content;
877
- padding: 0 14px;
985
+ padding: 0 var(--spacing-14);
878
986
  background-color: var(--color-white);
879
987
  }
880
988
  .drop-down-single-trigger:focus {
@@ -895,9 +1003,12 @@ p {
895
1003
  .drop-down-single-trigger[data-state='open'] .rotate {
896
1004
  transform: rotate(180deg);
897
1005
  transform-origin: 50% 50%;
898
- transition: transform 160ms ease;
1006
+ transition: transform var(--motion-fast) var(--motion-ease);
899
1007
  will-change: transform;
900
1008
  }
1009
+ .drop-down-single-label {
1010
+ gap: var(--spacing-10);
1011
+ }
901
1012
  .drop-down-single-value {
902
1013
  font-size: var(--font-size-sm);
903
1014
  line-height: var(--line-height-sm);
@@ -912,19 +1023,17 @@ p {
912
1023
  color: var(--color-grey-scale-400);
913
1024
  }
914
1025
  .drop-down-single-content {
915
- z-index: 5;
1026
+ z-index: var(--z-popover);
916
1027
  min-width: var(--radix-select-trigger-width);
917
1028
  overflow: hidden;
918
- box-shadow:
919
- 0px 4px 6px -2px rgba(0, 0, 0, 0.06),
920
- 0px 10px 15px -3px rgba(0, 0, 0, 0.1);
921
- border-radius: 6px;
1029
+ box-shadow: var(--shadow-popover);
1030
+ border-radius: var(--radius-6);
922
1031
  }
923
1032
  .drop-down-single-item {
924
- padding: 14px;
1033
+ padding: var(--spacing-14);
925
1034
  background-color: var(--color-white);
926
1035
  outline: none;
927
- height: 46px;
1036
+ height: var(--drop-down-item-height);
928
1037
 
929
1038
  font-size: var(--font-size-sm);
930
1039
  line-height: var(--line-height-sm);
@@ -1359,42 +1468,57 @@ p {
1359
1468
  .base-text.color-accent-orange-900[class*='color-'] {
1360
1469
  color: var(--color-accent-orange-900);
1361
1470
  }
1362
- .component-loading-inline {
1363
- display: flex;
1364
- width: 100%;
1365
- height: 100%;
1366
- align-items: center;
1367
- }
1368
- /* components/loading/overlay-loading/overlay-loading-style.css */
1369
- .page-loading-container {
1471
+ .base-inline-loading {
1472
+ display: flex;
1473
+ width: 100%;
1474
+ height: 100%;
1475
+ align-items: center;
1476
+ }
1477
+ /* 링은 currentColor 다. 우선순위 0 이라 넘겨받은 className 이나 style 의 color 가 늘 이긴다. */
1478
+ :where(.base-inline-loading) {
1479
+ color: var(--color-grey-scale-200);
1480
+ }
1481
+ .base-overlay-loading {
1370
1482
  position: fixed;
1371
1483
  inset: 0;
1372
1484
  display: flex;
1373
1485
  align-items: center;
1374
1486
  justify-content: center;
1375
1487
  }
1376
- .page-loading-backdrop { position: absolute; inset: 0; }
1488
+ .page-loading-backdrop {
1489
+ position: absolute;
1490
+ inset: 0;
1491
+ }
1377
1492
  .page-loading-content {
1378
1493
  position: relative;
1379
1494
  display: flex;
1380
1495
  flex-direction: column;
1381
1496
  align-items: center;
1382
- gap: 16px;
1497
+ gap: var(--spacing-16);
1383
1498
  }
1384
1499
  /* 기본 스피너(20px)를 확대 */
1385
- .page-loading-indicator { transform: scale(3.2); transform-origin: center; }
1386
- .page-loading-text { position: relative; }
1387
- .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 {
1388
1508
  display: flex;
1389
- width: 20px;
1390
- height: 20px;
1509
+ width: var(--icon-size-m);
1510
+ height: var(--icon-size-m);
1391
1511
  align-items: center;
1392
1512
  justify-content: center;
1393
1513
  }
1514
+ /* 우선순위 0 이라 넘겨받은 className 이나 style 의 color 가 늘 이긴다. */
1515
+ :where(.base-spinner) {
1516
+ color: var(--color-grey-scale-200);
1517
+ }
1394
1518
  .loading-indicator-ring {
1395
1519
  position: relative;
1396
- width: 20px;
1397
- height: 20px;
1520
+ width: var(--icon-size-m);
1521
+ height: var(--icon-size-m);
1398
1522
  }
1399
1523
  .loading-indicator-single-ring {
1400
1524
  box-sizing: border-box;
@@ -1402,37 +1526,46 @@ p {
1402
1526
  position: absolute;
1403
1527
  width: 100%;
1404
1528
  height: 100%;
1405
- border: 3px solid;
1529
+ border: var(--spinner-stroke) solid;
1406
1530
  border-radius: 50%;
1407
- animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
1408
- /* 기본값은 white, 상위에서 --spinner-border-color 주입 */
1409
- 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;
1410
1545
  }
1411
- /* nth-child 지연은 그대로 CSS or 인라인 중 하나만 사용한다면, 아래는 제거 가능 (지금은 인라인 사용 중) */
1412
- /*
1413
- .loading-indicator-single-ring:nth-child(1) { animation-delay: -0.45s; }
1414
- .loading-indicator-single-ring:nth-child(2) { animation-delay: -0.3s; }
1415
- .loading-indicator-single-ring:nth-child(3) { animation-delay: -0.15s; }
1416
- .loading-indicator-single-ring:nth-child(4) { animation-delay: 0s; }
1417
- */
1418
1546
  @keyframes lds-ring {
1419
- 0% { transform: rotate(0deg); }
1420
- 100% { transform: rotate(360deg); }
1547
+ 0% {
1548
+ transform: rotate(0deg);
1549
+ }
1550
+ 100% {
1551
+ transform: rotate(360deg);
1552
+ }
1421
1553
  }
1422
- .base-modal {
1554
+ /* Title·Close 같은 조각도 base-modal 을 달므로 상자 스타일은 container·overlay 에만 건다. */
1555
+ .base-modal:where(.modal-container, .modal-overlay) {
1423
1556
  display: flex;
1424
1557
  flex-direction: column;
1425
1558
  align-items: center;
1426
1559
 
1427
- padding: 30px;
1428
- border-radius: 6px;
1560
+ padding: var(--spacing-30);
1561
+ border-radius: var(--radius-6);
1429
1562
  }
1430
1563
  .base-modal.modal-container {
1431
1564
  position: fixed;
1432
1565
  top: 50%;
1433
1566
  left: 50%;
1434
1567
  transform: translate(-50%, -50%);
1435
- z-index: 9999;
1568
+ z-index: var(--z-modal);
1436
1569
  background-color: var(--color-white);
1437
1570
  }
1438
1571
  .base-modal.modal-overlay {
@@ -1442,7 +1575,7 @@ p {
1442
1575
  right: 0;
1443
1576
  bottom: 0;
1444
1577
  background-color: rgba(0, 0, 0, 0.5);
1445
- z-index: 9998;
1578
+ z-index: var(--z-overlay);
1446
1579
  }
1447
1580
  /***************************************************************************************************
1448
1581
  * *
@@ -1456,36 +1589,36 @@ p {
1456
1589
  width: 100%;
1457
1590
  }
1458
1591
  .modal-with-double-button-container.size-s {
1459
- width: 400px;
1592
+ width: var(--modal-width-s);
1460
1593
  }
1461
1594
  .modal-with-double-button-container.size-m {
1462
- width: 450px;
1595
+ width: var(--modal-width-m);
1463
1596
  }
1464
1597
  .modal-with-double-button-container.size-l {
1465
- width: 500px;
1598
+ width: var(--modal-width-l);
1466
1599
  }
1467
1600
  .modal-with-double-button-title-icon {
1468
- margin-bottom: 20px;
1601
+ margin-bottom: var(--spacing-20);
1469
1602
  }
1470
1603
  .modal-with-double-button-title {
1471
- margin-bottom: 4px;
1604
+ margin-bottom: var(--spacing-4);
1472
1605
  }
1473
1606
  .modal-with-double-button-content {
1474
- margin-top: 20px;
1607
+ margin-top: var(--spacing-20);
1475
1608
  }
1476
1609
  .modal-with-double-button-close {
1477
1610
  display: flex;
1478
1611
  justify-content: space-between;
1479
1612
  align-items: center;
1480
- gap: 16px;
1613
+ gap: var(--spacing-16);
1481
1614
  width: 100%;
1482
- margin-top: 30px;
1615
+ margin-top: var(--spacing-30);
1483
1616
  }
1484
1617
  .modal-with-double-button-close.row {
1485
1618
  display: flex;
1486
1619
  justify-content: center;
1487
1620
  align-items: center;
1488
- gap: 16px;
1621
+ gap: var(--spacing-16);
1489
1622
  }
1490
1623
  .modal-with-double-button-close.row > * {
1491
1624
  flex: 1;
@@ -1495,28 +1628,41 @@ p {
1495
1628
  flex-direction: column;
1496
1629
  justify-content: center;
1497
1630
  align-items: center;
1498
- gap: 10px;
1631
+ gap: var(--spacing-10);
1499
1632
  }
1500
1633
  .modal-with-double-button-close.column > * {
1501
1634
  width: 100%;
1502
1635
  }
1636
+ .base-radio:where(.button) {
1637
+ padding: 0;
1638
+ }
1639
+ /***************************************************************************************************
1640
+ * *
1641
+ * radio *
1642
+ * *
1643
+ ***************************************************************************************************/
1503
1644
  .radio:where(.radio-group) {
1504
1645
  display: flex;
1505
1646
  flex-direction: column;
1506
- 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);
1507
1653
  }
1508
1654
  .radio:where(.radio-button) {
1509
1655
  display: flex;
1510
1656
  align-items: center;
1511
1657
  justify-content: center;
1512
- width: 18px;
1513
- height: 18px;
1658
+ width: var(--radio-size);
1659
+ height: var(--radio-size);
1514
1660
  border-radius: 50%;
1515
1661
  background-color: var(--color-grey-scale-200);
1516
1662
  }
1517
1663
  .radio:where(.radio-indicator) {
1518
- width: 8px;
1519
- height: 8px;
1664
+ width: var(--radio-dot-size);
1665
+ height: var(--radio-dot-size);
1520
1666
  border-radius: 50%;
1521
1667
  background-color: var(--color-purple-900);
1522
1668
  }
@@ -1560,33 +1706,127 @@ p {
1560
1706
  .data-table-header {
1561
1707
  position: sticky;
1562
1708
  top: 0;
1563
- background-color: #fff;
1564
- z-index: 3;
1565
- 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);
1566
1712
  }
1567
1713
  .data-table-row {
1568
1714
  position: relative;
1569
- border-bottom: 1px solid var(--color-grey-scale-200);
1715
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
1570
1716
  }
1571
1717
  .data-table-row .fixed {
1572
1718
  position: sticky;
1573
- background-color: #fff;
1574
- z-index: 2;
1719
+ background-color: var(--color-white);
1720
+ z-index: var(--z-sticky);
1575
1721
  }
1576
1722
  :is(.data-table-row .fixed) > * {
1577
1723
  position: relative;
1578
- z-index: 1;
1724
+ z-index: var(--z-raised);
1579
1725
  }
1580
1726
  .body .data-table-row:hover {
1581
- background-color: #f5f5f5;
1727
+ background-color: var(--color-grey-scale-100);
1582
1728
  }
1583
1729
  :is(.body .data-table-row:hover) .fixed {
1584
- background-color: #f5f5f5;
1730
+ background-color: var(--color-grey-scale-100);
1585
1731
  }
1586
1732
  .fixed-cell {
1587
1733
  position: sticky;
1588
1734
  left: 0;
1589
1735
  }
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
+ }
1590
1830
  .base-text-field.input {
1591
1831
  border: none;
1592
1832
  outline: none;
@@ -1603,76 +1843,82 @@ p {
1603
1843
  color: var(--color-grey-scale-400);
1604
1844
  }
1605
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 {
1606
- box-shadow: 0 0 0px 1000px transparent inset;
1846
+ /* 브라우저 자동완성 배경을 덮는 관용 해킹. 토큰이 아니라 고정값이다 */ /* raw-value */
1847
+ box-shadow: 0 0 0px 1000px transparent inset; /* raw-value */
1607
1848
  -webkit-transition: background-color 5000s ease-in-out 0s;
1608
- transition: background-color 5000s ease-in-out 0s;
1849
+ transition: background-color 5000s ease-in-out 0s; /* raw-value */
1609
1850
  }
1610
1851
  /***************************************************************************************************
1611
1852
  * *
1612
1853
  * base-text-field *
1613
1854
  * *
1614
1855
  ***************************************************************************************************/
1856
+ .text-field {
1857
+ height: -moz-fit-content;
1858
+ height: fit-content;
1859
+ }
1615
1860
  .text-field-title {
1616
- margin-bottom: 8px;
1861
+ margin-bottom: var(--spacing-8);
1617
1862
  }
1618
1863
  .text-field-input-wrapper {
1619
1864
  display: flex;
1620
1865
  align-items: center;
1621
1866
  justify-content: space-between;
1622
- gap: 10px;
1867
+ gap: var(--spacing-10);
1623
1868
 
1624
- padding: 0 14px;
1869
+ padding: 0 var(--spacing-14);
1625
1870
 
1626
- border-radius: 4px;
1627
- border: 1px solid var(--color-grey-scale-300);
1871
+ border-radius: var(--radius-4);
1872
+ border: var(--hairline) solid var(--color-grey-scale-300);
1628
1873
  }
1629
- .text-field-input-wrapper.size-m {
1630
- height: 40px;
1874
+ .text-field-input-wrapper.size-s {
1875
+ height: var(--control-height-s);
1631
1876
  }
1632
- .text-field-input-wrapper.size-l {
1633
- height: 50px;
1877
+ .text-field-input-wrapper.size-m {
1878
+ height: var(--control-height-m);
1634
1879
  }
1635
- .text-field-input-wrapper:has([data-disabled='true']) {
1880
+ .text-field-input-wrapper:has( > input[data-disabled='true']) {
1636
1881
  border-color: var(--color-grey-scale-300);
1637
1882
  background-color: var(--color-grey-scale-100);
1638
1883
  }
1639
1884
  .text-field-input-wrapper:focus-within {
1640
- border: 1px solid var(--color-purple-900);
1885
+ border: var(--hairline) solid var(--color-purple-900);
1641
1886
  }
1642
1887
  .text-field-input-wrapper > input {
1643
1888
  width: 100%;
1644
1889
  }
1645
1890
  .text-field-helper-text {
1646
- margin-top: 4px;
1891
+ margin-top: var(--spacing-4);
1647
1892
  }
1648
1893
  .text-field-helper-text.error {
1649
1894
  color: var(--color-accent-red-500);
1650
1895
  }
1651
- .base-tooltip {
1652
- z-index: 3;
1653
- }
1896
+ /* Trigger 도 base-tooltip 을 달므로 z-index 는 Content 에만 건다. */
1897
+ .base-tooltip:where(.content) {
1898
+ z-index: var(--z-tooltip);
1899
+ }
1654
1900
  .base-tooltip.content {
1655
1901
  text-align: center;
1656
1902
  }
1903
+ .base-tooltip:where(.trigger) {
1904
+ width: -moz-fit-content;
1905
+ width: fit-content;
1906
+ }
1657
1907
  /***************************************************************************************************
1658
1908
  * *
1659
1909
  * tooltip *
1660
1910
  * *
1661
1911
  ***************************************************************************************************/
1662
- .tooltip-trigger {
1663
- width: -moz-fit-content;
1664
- width: fit-content;
1665
- }
1666
1912
  .tooltip-content {
1667
1913
  display: flex;
1668
1914
  justify-content: space-around;
1669
1915
  align-items: center;
1670
- gap: 10px;
1916
+ gap: var(--spacing-10);
1671
1917
 
1672
1918
  background-color: var(--color-purple-900);
1673
1919
  color: var(--color-white);
1674
- border-radius: 6px;
1675
- padding: 12px;
1920
+ border-radius: var(--radius-6);
1921
+ padding: var(--spacing-12);
1676
1922
 
1677
1923
  font-size: var(--font-size-sm);
1678
1924
  line-height: var(--line-height-sm);
@@ -1688,42 +1934,42 @@ p {
1688
1934
  border-style: solid;
1689
1935
  }
1690
1936
  .tooltip-content.direction-top {
1691
- transform: translateY(-10px);
1937
+ transform: translateY(calc(-1 * var(--spacing-10)));
1692
1938
  }
1693
1939
  .tooltip-content.direction-top::before {
1694
- bottom: -8px;
1940
+ bottom: calc(-1 * var(--tooltip-arrow));
1695
1941
  left: 50%;
1696
1942
  transform: translateX(-50%);
1697
- border-width: 8px 8px 0 8px;
1943
+ border-width: var(--tooltip-arrow) var(--tooltip-arrow) 0 var(--tooltip-arrow);
1698
1944
  border-color: var(--color-purple-900) transparent transparent transparent;
1699
1945
  }
1700
1946
  .tooltip-content.direction-bottom {
1701
- transform: translateY(10px);
1947
+ transform: translateY(var(--spacing-10));
1702
1948
  }
1703
1949
  .tooltip-content.direction-bottom::before {
1704
- top: -8px;
1950
+ top: calc(-1 * var(--tooltip-arrow));
1705
1951
  left: 50%;
1706
1952
  transform: translateX(-50%);
1707
- border-width: 0 8px 8px 8px;
1953
+ border-width: 0 var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow);
1708
1954
  border-color: transparent transparent var(--color-purple-900) transparent;
1709
1955
  }
1710
1956
  .tooltip-content.direction-left {
1711
- transform: translateX(-10px);
1957
+ transform: translateX(calc(-1 * var(--spacing-10)));
1712
1958
  }
1713
1959
  .tooltip-content.direction-left::before {
1714
- right: -8px;
1960
+ right: calc(-1 * var(--tooltip-arrow));
1715
1961
  top: 50%;
1716
1962
  transform: translateY(-50%);
1717
- border-width: 8px 0 8px 8px;
1963
+ border-width: var(--tooltip-arrow) 0 var(--tooltip-arrow) var(--tooltip-arrow);
1718
1964
  border-color: transparent transparent transparent var(--color-purple-900);
1719
1965
  }
1720
1966
  .tooltip-content.direction-right {
1721
- transform: translateX(10px);
1967
+ transform: translateX(var(--spacing-10));
1722
1968
  }
1723
1969
  .tooltip-content.direction-right::before {
1724
- left: -8px;
1970
+ left: calc(-1 * var(--tooltip-arrow));
1725
1971
  top: 50%;
1726
1972
  transform: translateY(-50%);
1727
- border-width: 8px 8px 8px 0;
1973
+ border-width: var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow) 0;
1728
1974
  border-color: transparent var(--color-purple-900) transparent transparent;
1729
1975
  }