@nurihaus/web-design-system 3.0.3 → 3.1.1

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 (99) hide show
  1. package/dist/ai/components.md +305 -11
  2. package/dist/ai/tokens.md +38 -13
  3. package/dist/avatar.js +10 -9
  4. package/dist/breadcrumb.js +364 -0
  5. package/dist/check-box.js +16 -35
  6. package/dist/chunk-149.js +4 -4
  7. package/dist/chunk-298.js +1 -1
  8. package/dist/chunk-302.js +4 -4
  9. package/dist/chunk-309.js +1 -1
  10. package/dist/chunk-364.js +2 -2
  11. package/dist/chunk-387.js +23 -4
  12. package/dist/chunk-436.js +34 -0
  13. package/dist/chunk-558.js +6 -6
  14. package/dist/chunk-563.js +7 -7
  15. package/dist/chunk-657.js +143 -0
  16. package/dist/chunk-713.js +39 -0
  17. package/dist/chunk-739.js +6 -6
  18. package/dist/chunk-77.js +35 -0
  19. package/dist/chunk-777.js +2 -2
  20. package/dist/chunk-910.js +64 -0
  21. package/dist/chunk-917.js +1 -1
  22. package/dist/chunk-933.js +4 -4
  23. package/dist/chunk-976.js +2 -2
  24. package/dist/collapsible-menu.js +7 -7
  25. package/dist/components/breadcrumb/base-breadcrumb.d.ts +19 -0
  26. package/dist/components/breadcrumb/breadcrumb-props.d.ts +4 -0
  27. package/dist/components/breadcrumb/breadcrumb-type.d.ts +33 -0
  28. package/dist/components/breadcrumb/breadcrumb.d.ts +4 -0
  29. package/dist/components/breadcrumb/breadcrumb.stories.d.ts +25 -0
  30. package/dist/components/check-box/base-check-box.d.ts +1 -1
  31. package/dist/components/drawer/base-drawer.d.ts +15 -0
  32. package/dist/components/drawer/drawer-props.d.ts +11 -0
  33. package/dist/components/drawer/drawer-type.d.ts +28 -0
  34. package/dist/components/drawer/drawer.d.ts +4 -0
  35. package/dist/components/drawer/drawer.stories.d.ts +34 -0
  36. package/dist/components/drop-down/drop-down-props.d.ts +2 -2
  37. package/dist/components/drop-down/drop-down.stories.d.ts +1 -1
  38. package/dist/components/elements/text/text-props.d.ts +1 -1
  39. package/dist/components/elements/text/text.stories.d.ts +1 -1
  40. package/dist/components/modal/base-modal.d.ts +4 -1
  41. package/dist/components/modal/modal-props.d.ts +3 -0
  42. package/dist/components/modal/modal-type.d.ts +18 -4
  43. package/dist/components/modal/modal-with-double-button.stories.d.ts +22 -0
  44. package/dist/components/modal/modal.d.ts +4 -0
  45. package/dist/components/modal/modal.stories.d.ts +11 -6
  46. package/dist/components/pagination/base-pagination.d.ts +9 -0
  47. package/dist/components/pagination/pagination-props.d.ts +4 -0
  48. package/dist/components/pagination/pagination-type.d.ts +20 -0
  49. package/dist/components/pagination/pagination.d.ts +4 -0
  50. package/dist/components/pagination/pagination.stories.d.ts +25 -0
  51. package/dist/components/skeleton/base-skeleton.d.ts +4 -0
  52. package/dist/components/skeleton/skeleton-props.d.ts +15 -0
  53. package/dist/components/skeleton/skeleton-type.d.ts +12 -0
  54. package/dist/components/skeleton/skeleton.d.ts +4 -0
  55. package/dist/components/skeleton/skeleton.stories.d.ts +327 -0
  56. package/dist/components/switch/base-switch.d.ts +11 -0
  57. package/dist/components/switch/switch-props.d.ts +4 -0
  58. package/dist/components/switch/switch-type.d.ts +19 -0
  59. package/dist/components/switch/switch.d.ts +4 -0
  60. package/dist/components/switch/switch.stories.d.ts +24 -0
  61. package/dist/components/text-area/base-text-area.d.ts +10 -0
  62. package/dist/components/text-area/text-area-props.d.ts +12 -0
  63. package/dist/components/text-area/text-area-type.d.ts +34 -0
  64. package/dist/components/text-area/text-area.d.ts +4 -0
  65. package/dist/components/text-area/text-area.stories.d.ts +32 -0
  66. package/dist/components/text-field/text-field-props.d.ts +2 -2
  67. package/dist/components/text-field/text-field.stories.d.ts +1 -1
  68. package/dist/components/toast/base-toast.d.ts +20 -0
  69. package/dist/components/toast/toast-props.d.ts +18 -0
  70. package/dist/components/toast/toast-type.d.ts +45 -0
  71. package/dist/components/toast/toast.d.ts +5 -0
  72. package/dist/components/toast/toast.stories.d.ts +310 -0
  73. package/dist/components.css +1089 -56
  74. package/dist/cta-button.js +12 -11
  75. package/dist/data-table.js +6 -6
  76. package/dist/drawer.js +390 -0
  77. package/dist/drop-down.js +15 -29
  78. package/dist/helpers/hooks/useExternalState.d.ts +5 -0
  79. package/dist/icon-text-badge.js +11 -11
  80. package/dist/icon-text-option-badge.js +10 -10
  81. package/dist/index.d.ts +16 -0
  82. package/dist/index.js +2097 -477
  83. package/dist/loading.js +8 -8
  84. package/dist/modal-with-double-button.js +60 -255
  85. package/dist/modal.js +288 -0
  86. package/dist/option-badge.js +11 -11
  87. package/dist/pagination.js +412 -0
  88. package/dist/radio.js +10 -10
  89. package/dist/skeleton.js +331 -0
  90. package/dist/styles.css +921 -29
  91. package/dist/switch.js +349 -0
  92. package/dist/tabs.js +6 -6
  93. package/dist/text-area.js +374 -0
  94. package/dist/text-field.js +7 -7
  95. package/dist/text.js +8 -8
  96. package/dist/toast.js +497 -0
  97. package/dist/tokens.css +32 -5
  98. package/dist/tooltip.js +9 -9
  99. package/package.json +33 -1
@@ -411,6 +411,109 @@
411
411
  border: var(--hairline) solid var(--color-grey-scale-300);
412
412
  }
413
413
 
414
+ .base-breadcrumb:where(.list) {
415
+ display: flex;
416
+ flex-wrap: wrap;
417
+ align-items: center;
418
+ margin: 0;
419
+ padding: 0;
420
+ list-style: none;
421
+ }
422
+
423
+ .base-breadcrumb:where(.item,.separator) {
424
+ display: inline-flex;
425
+ align-items: center;
426
+ }
427
+
428
+ .base-breadcrumb:where(.link) {
429
+ color: inherit;
430
+ text-decoration: none;
431
+ cursor: var(--cursor-button);
432
+ }
433
+
434
+ .base-breadcrumb:where(.separator) {
435
+ -webkit-user-select: none;
436
+ -moz-user-select: none;
437
+ user-select: none;
438
+ }
439
+
440
+ /***************************************************************************************************
441
+ * *
442
+ * breadcrumb *
443
+ * *
444
+ ***************************************************************************************************/
445
+
446
+ .breadcrumb {
447
+ font-weight: var(--font-weight-medium);
448
+ color: var(--color-grey-scale-500);
449
+
450
+ /* 글자와 화살표가 같이 커진다. 화살표 치수는 size.css 의 --breadcrumb-chevron-* */
451
+ }
452
+
453
+ .breadcrumb.size-xs {
454
+ font-size: var(--font-size-xsm);
455
+ line-height: var(--line-height-xsm);
456
+ --breadcrumb-chevron: var(--breadcrumb-chevron-xs);
457
+ }
458
+
459
+ .breadcrumb.size-s {
460
+ font-size: var(--font-size-sm);
461
+ line-height: var(--line-height-sm);
462
+ --breadcrumb-chevron: var(--breadcrumb-chevron-s);
463
+ }
464
+
465
+ .breadcrumb.size-m {
466
+ font-size: var(--font-size-base);
467
+ line-height: var(--line-height-base);
468
+ --breadcrumb-chevron: var(--breadcrumb-chevron-m);
469
+ }
470
+
471
+ .breadcrumb.size-l {
472
+ font-size: var(--font-size-lg);
473
+ line-height: var(--line-height-lg);
474
+ --breadcrumb-chevron: var(--breadcrumb-chevron-l);
475
+ }
476
+
477
+ .breadcrumb.size-xl {
478
+ font-size: var(--font-size-xl);
479
+ line-height: var(--line-height-xl);
480
+ --breadcrumb-chevron: var(--breadcrumb-chevron-xl);
481
+ }
482
+
483
+ .breadcrumb-list {
484
+ gap: var(--spacing-4);
485
+ }
486
+
487
+ .breadcrumb-link {
488
+ border-radius: var(--radius-4);
489
+ transition: color var(--motion-fast) var(--motion-ease);
490
+ }
491
+
492
+ .breadcrumb-link:hover {
493
+ color: var(--color-grey-scale-800);
494
+ text-decoration: underline;
495
+ }
496
+
497
+ .breadcrumb-link:focus-visible {
498
+ outline: var(--hairline) solid var(--color-purple-900);
499
+ outline-offset: var(--spacing-2);
500
+ }
501
+
502
+ .breadcrumb-page {
503
+ color: var(--color-grey-scale-900);
504
+ font-weight: var(--font-weight-semibold);
505
+ }
506
+
507
+ .breadcrumb-separator {
508
+ color: var(--color-grey-scale-400);
509
+ }
510
+
511
+ .breadcrumb-chevron {
512
+ width: var(--breadcrumb-chevron);
513
+ height: var(--breadcrumb-chevron);
514
+ transform: rotate(-90deg);
515
+ }
516
+
414
517
  .base-button {
415
518
  display: flex;
416
519
  justify-content: center;
@@ -434,6 +537,7 @@
434
537
 
435
538
  .cta-button {
436
539
  border-radius: var(--radius-6);
540
+ /* 좌우 여백은 size 가 정한다. 글자 길이와 상관없이 양쪽에 같은 여백이 남는다 */
437
541
  }
438
542
 
439
543
  .cta-button.variant-primary {
@@ -502,6 +606,7 @@
502
606
 
503
607
  .cta-button.size-xl {
504
608
  height: var(--control-height-xl);
609
+ padding: 0 var(--spacing-24);
505
610
 
506
611
  font-size: var(--font-size-lg);
507
612
  line-height: var(--line-height-lg);
@@ -510,6 +615,7 @@
510
615
 
511
616
  .cta-button.size-l {
512
617
  height: var(--control-height-l);
618
+ padding: 0 var(--spacing-20);
513
619
 
514
620
  font-size: var(--font-size-base);
515
621
  line-height: var(--line-height-base);
@@ -518,6 +624,7 @@
518
624
 
519
625
  .cta-button.size-m {
520
626
  height: var(--control-height-m);
627
+ padding: 0 var(--spacing-16);
521
628
 
522
629
  font-size: var(--font-size-sm);
523
630
  line-height: var(--line-height-sm);
@@ -526,6 +633,7 @@
526
633
 
527
634
  .cta-button.size-s {
528
635
  height: var(--control-height-s);
636
+ padding: 0 var(--spacing-14);
529
637
 
530
638
  font-size: var(--font-size-xsm);
531
639
  line-height: var(--line-height-xsm);
@@ -534,6 +642,7 @@
534
642
 
535
643
  .cta-button.size-xs {
536
644
  height: var(--control-height-xs);
645
+ padding: 0 var(--spacing-12);
537
646
 
538
647
  font-size: var(--font-size-xsm);
539
648
  line-height: var(--line-height-xsm);
@@ -580,8 +689,21 @@
580
689
 
581
690
  width: 100%;
582
691
  height: 100%;
692
+
693
+ /* 체크 아이콘(16px 고정)을 칸 정가운데에 둔다. 빌드된 SVG 에 viewBox 가 없어 늘리면 그림이 왼쪽 위에 남는다 */
583
694
  }
584
695
 
696
+ .check-box-indicator:not(.wrapper) {
697
+ display: flex;
698
+ align-items: center;
699
+ justify-content: center;
700
+ }
701
+
702
+ .check-box-indicator:not(.wrapper) > svg {
703
+ display: block;
704
+ flex-shrink: 0;
705
+ }
706
+
585
707
  .check-box-indicator.size-l {
586
708
  width: var(--checkbox-size-l);
587
709
  height: var(--checkbox-size-l);
@@ -704,6 +826,185 @@
704
826
  margin-bottom: var(--spacing-4);
705
827
  }
706
828
 
829
+ /* Title·Close 같은 조각도 base-drawer 를 달므로 상자 스타일은 overlay·content 에만 건다. */
830
+
831
+ .base-drawer:where(.overlay) {
832
+ position: fixed;
833
+ top: 0;
834
+ left: 0;
835
+ right: 0;
836
+ bottom: 0;
837
+ background-color: rgba(0, 0, 0, 0.5);
838
+ z-index: var(--z-overlay);
839
+ }
840
+
841
+ .base-drawer[data-state='open']:where(.overlay) {
842
+ animation: drawer-overlay-in var(--motion-base) var(--motion-ease);
843
+ }
844
+
845
+ .base-drawer[data-state='closed']:where(.overlay) {
846
+ animation: drawer-overlay-out var(--motion-base) var(--motion-ease);
847
+ }
848
+
849
+ .base-drawer:where(.content) {
850
+ position: fixed;
851
+ display: flex;
852
+ flex-direction: column;
853
+ z-index: var(--z-modal);
854
+ background-color: var(--color-white);
855
+ }
856
+
857
+ .base-drawer:where(.title) {
858
+ margin: 0;
859
+ font-size: var(--font-size-lg);
860
+ font-weight: var(--font-weight-bold);
861
+ color: var(--color-black);
862
+ }
863
+
864
+ .base-drawer:where(.description) {
865
+ margin: 0;
866
+ font-size: var(--font-size-sm);
867
+ font-weight: var(--font-weight-medium);
868
+ color: var(--color-grey-scale-600);
869
+ }
870
+
871
+ .base-drawer:where(.close) {
872
+ display: inline-flex;
873
+ align-items: center;
874
+ justify-content: center;
875
+ padding: 0;
876
+ background-color: transparent;
877
+ border: none;
878
+ cursor: var(--cursor-button);
879
+ }
880
+
881
+ /***************************************************************************************************
882
+ * *
883
+ * drawer *
884
+ * *
885
+ ***************************************************************************************************/
886
+
887
+ /* Radix 는 애니메이션이 끝나야 닫힌 패널을 지우므로 transition 이 아니라 keyframes 로 들어오고 나간다. */
888
+
889
+ @keyframes drawer-overlay-in {
890
+ from {
891
+ opacity: 0;
892
+ }
893
+ to {
894
+ opacity: 1;
895
+ }
896
+ }
897
+
898
+ @keyframes drawer-overlay-out {
899
+ from {
900
+ opacity: 1;
901
+ }
902
+ to {
903
+ opacity: 0;
904
+ }
905
+ }
906
+
907
+ @keyframes drawer-slide-in {
908
+ from {
909
+ transform: var(--drawer-offset);
910
+ }
911
+ to {
912
+ transform: translate(0, 0);
913
+ }
914
+ }
915
+
916
+ @keyframes drawer-slide-out {
917
+ from {
918
+ transform: translate(0, 0);
919
+ }
920
+ to {
921
+ transform: var(--drawer-offset);
922
+ }
923
+ }
924
+
925
+ .drawer {
926
+ gap: var(--spacing-8);
927
+ padding: var(--spacing-24);
928
+ box-sizing: border-box;
929
+ }
930
+
931
+ .drawer.size-s {
932
+ --drawer-width: var(--drawer-width-s);
933
+ --drawer-height: var(--drawer-height-s);
934
+ }
935
+
936
+ .drawer.size-m {
937
+ --drawer-width: var(--drawer-width-m);
938
+ --drawer-height: var(--drawer-height-m);
939
+ }
940
+
941
+ .drawer.size-l {
942
+ --drawer-width: var(--drawer-width-l);
943
+ --drawer-height: var(--drawer-height-l);
944
+ }
945
+
946
+ .drawer.side-right {
947
+ top: 0;
948
+ right: 0;
949
+ bottom: 0;
950
+ width: var(--drawer-width);
951
+ max-width: 100%;
952
+ --drawer-offset: translateX(100%);
953
+ }
954
+
955
+ .drawer.side-left {
956
+ top: 0;
957
+ left: 0;
958
+ bottom: 0;
959
+ width: var(--drawer-width);
960
+ max-width: 100%;
961
+ --drawer-offset: translateX(-100%);
962
+ }
963
+
964
+ .drawer.side-bottom {
965
+ left: 0;
966
+ right: 0;
967
+ bottom: 0;
968
+ height: var(--drawer-height);
969
+ max-height: 100%;
970
+ border-top-left-radius: var(--radius-16);
971
+ border-top-right-radius: var(--radius-16);
972
+ --drawer-offset: translateY(100%);
973
+ }
974
+
975
+ .drawer[data-state='open'] {
976
+ animation: drawer-slide-in var(--motion-base) var(--motion-ease);
977
+ }
978
+
979
+ .drawer[data-state='closed'] {
980
+ animation: drawer-slide-out var(--motion-base) var(--motion-ease);
981
+ }
982
+
983
+ .drawer-header {
984
+ display: flex;
985
+ align-items: center;
986
+ justify-content: space-between;
987
+ gap: var(--spacing-12);
988
+ }
989
+
990
+ .drawer-close {
991
+ flex-shrink: 0;
992
+ }
993
+
994
+ .drawer-body {
995
+ flex: 1;
996
+ min-height: 0;
997
+ overflow-y: auto;
998
+ margin-top: var(--spacing-8);
999
+ }
1000
+
1001
+ .drawer-footer {
1002
+ display: flex;
1003
+ justify-content: flex-end;
1004
+ gap: var(--spacing-8);
1005
+ margin-top: var(--spacing-16);
1006
+ }
1007
+
707
1008
  /* placeholder 로 넘기는 span 의 색. base-drop-down 이 기본 placeholder 에 붙인다. */
708
1009
 
709
1010
  .nuri-placeholder {
@@ -723,12 +1024,41 @@
723
1024
  * *
724
1025
  ***************************************************************************************************/
725
1026
 
1027
+ /* 높이·좌우 여백·글자는 버튼·텍스트필드와 같은 단계 */
1028
+
1029
+ .drop-down-single-trigger.size-xs {
1030
+ height: var(--control-height-xs);
1031
+ padding: 0 var(--spacing-12);
1032
+ font-size: var(--font-size-xsm);
1033
+ line-height: var(--line-height-xsm);
1034
+ }
1035
+
726
1036
  .drop-down-single-trigger.size-s {
727
1037
  height: var(--control-height-s);
1038
+ padding: 0 var(--spacing-14);
1039
+ font-size: var(--font-size-sm);
1040
+ line-height: var(--line-height-sm);
728
1041
  }
729
1042
 
730
1043
  .drop-down-single-trigger.size-m {
731
1044
  height: var(--control-height-m);
1045
+ padding: 0 var(--spacing-16);
1046
+ font-size: var(--font-size-sm);
1047
+ line-height: var(--line-height-sm);
1048
+ }
1049
+
1050
+ .drop-down-single-trigger.size-l {
1051
+ height: var(--control-height-l);
1052
+ padding: 0 var(--spacing-20);
1053
+ font-size: var(--font-size-base);
1054
+ line-height: var(--line-height-base);
1055
+ }
1056
+
1057
+ .drop-down-single-trigger.size-xl {
1058
+ height: var(--control-height-xl);
1059
+ padding: 0 var(--spacing-24);
1060
+ font-size: var(--font-size-lg);
1061
+ line-height: var(--line-height-lg);
732
1062
  }
733
1063
 
734
1064
  .drop-down-single-trigger {
@@ -737,7 +1067,6 @@
737
1067
  border-radius: var(--radius-4);
738
1068
  width: -moz-fit-content;
739
1069
  width: fit-content;
740
- padding: 0 var(--spacing-14);
741
1070
  background-color: var(--color-white);
742
1071
  }
743
1072
 
@@ -773,8 +1102,8 @@
773
1102
  }
774
1103
 
775
1104
  .drop-down-single-value {
776
- font-size: var(--font-size-sm);
777
- line-height: var(--line-height-sm);
1105
+ font-size: inherit;
1106
+ line-height: inherit;
778
1107
  font-weight: var(--font-weight-medium);
779
1108
 
780
1109
  text-align: left;
@@ -1408,13 +1737,17 @@
1408
1737
  gap: var(--spacing-16);
1409
1738
  }
1410
1739
 
1411
- /* 기본 스피너(20px)를 확대 */
1740
+ /* 스피너를 레이아웃 크기로 키운다. transform: scale 은 보이는 크기만 키워 아래 글자와 겹친다 */
1412
1741
 
1413
1742
  .page-loading-indicator {
1414
- transform: scale(3.2);
1415
- transform-origin: center;
1743
+ --spinner-stroke: var(--overlay-spinner-stroke);
1416
1744
  }
1417
1745
 
1746
+ .page-loading-indicator .base-spinner,.page-loading-indicator .loading-indicator-ring {
1747
+ width: var(--overlay-spinner-size);
1748
+ height: var(--overlay-spinner-size);
1749
+ }
1750
+
1418
1751
  .page-loading-text {
1419
1752
  position: relative;
1420
1753
  }
@@ -1536,7 +1869,19 @@
1536
1869
  }
1537
1870
 
1538
1871
  .modal-with-double-button-title {
1539
- margin-bottom: var(--spacing-4);
1872
+ margin: 0 0 var(--spacing-4);
1873
+ font-size: var(--font-size-lg);
1874
+ font-weight: var(--font-weight-bold);
1875
+ text-align: center;
1876
+ color: var(--color-black);
1877
+ }
1878
+
1879
+ .modal-with-double-button-sub-title {
1880
+ margin: 0;
1881
+ font-size: var(--font-size-sm);
1882
+ font-weight: var(--font-weight-medium);
1883
+ text-align: center;
1884
+ color: var(--color-grey-scale-600);
1540
1885
  }
1541
1886
 
1542
1887
  .modal-with-double-button-content {
@@ -1575,77 +1920,412 @@
1575
1920
  width: 100%;
1576
1921
  }
1577
1922
 
1578
- .base-radio:where(.button) {
1579
- padding: 0;
1580
- }
1581
-
1582
1923
  /***************************************************************************************************
1583
1924
  * *
1584
- * radio *
1925
+ * modal *
1585
1926
  * *
1586
1927
  ***************************************************************************************************/
1587
1928
 
1588
- .radio:where(.radio-group) {
1589
- display: flex;
1590
- flex-direction: column;
1591
- gap: var(--spacing-16);
1592
- }
1929
+ .modal {
1930
+ align-items: stretch;
1931
+ gap: var(--spacing-20);
1932
+ max-width: calc(100% - var(--spacing-30) * 2);
1933
+ max-height: calc(100% - var(--spacing-30) * 2);
1934
+ overflow: auto;
1935
+ }
1593
1936
 
1594
- .radio:where(.radio-option) {
1595
- display: flex;
1596
- align-items: center;
1597
- gap: var(--spacing-6);
1937
+ .modal.size-s {
1938
+ width: var(--modal-width-s);
1598
1939
  }
1599
1940
 
1600
- .radio:where(.radio-button) {
1601
- display: flex;
1602
- align-items: center;
1603
- justify-content: center;
1604
- width: var(--radio-size);
1605
- height: var(--radio-size);
1606
- border-radius: 50%;
1607
- background-color: var(--color-grey-scale-200);
1941
+ .modal.size-m {
1942
+ width: var(--modal-width-m);
1608
1943
  }
1609
1944
 
1610
- .radio:where(.radio-indicator) {
1611
- width: var(--radio-dot-size);
1612
- height: var(--radio-dot-size);
1613
- border-radius: 50%;
1614
- background-color: var(--color-purple-900);
1945
+ .modal.size-l {
1946
+ width: var(--modal-width-l);
1615
1947
  }
1616
1948
 
1617
- .radio:where(.radio-label) {
1618
- font-size: var(--font-size-sm);
1619
- font-weight: var(--font-weight-medium);
1620
- color: var(--color-black);
1621
- }
1949
+ .modal-header {
1950
+ display: flex;
1951
+ justify-content: space-between;
1952
+ align-items: flex-start;
1953
+ gap: var(--spacing-10);
1954
+ }
1622
1955
 
1623
- .base-table {
1624
- width: -moz-fit-content;
1625
- width: fit-content;
1956
+ .modal-title {
1957
+ flex: 1;
1958
+ margin: 0;
1959
+ font-size: var(--font-size-lg);
1960
+ font-weight: var(--font-weight-bold);
1961
+ color: var(--color-black);
1626
1962
  }
1627
1963
 
1628
- .base-table .header {
1629
- display: flex;
1630
- align-items: center;
1631
- width: 100%;
1632
- }
1964
+ .modal-close-icon {
1965
+ flex-shrink: 0;
1966
+ width: var(--icon-size-m);
1967
+ height: var(--icon-size-m);
1968
+ padding: 0;
1969
+ background-color: transparent;
1970
+ color: var(--color-grey-scale-600);
1971
+ }
1633
1972
 
1634
- .base-table .body {
1635
- width: 100%;
1973
+ .modal-description {
1974
+ margin: 0;
1975
+ font-size: var(--font-size-sm);
1976
+ font-weight: var(--font-weight-medium);
1977
+ color: var(--color-grey-scale-600);
1978
+ }
1979
+
1980
+ .modal-body {
1981
+ font-size: var(--font-size-sm);
1982
+ color: var(--color-black);
1983
+ }
1984
+
1985
+ .modal-footer {
1986
+ display: flex;
1987
+ justify-content: flex-end;
1988
+ align-items: center;
1989
+ gap: var(--spacing-10);
1990
+ }
1991
+
1992
+ .base-pagination:where(.item) {
1993
+ display: inline-flex;
1994
+ align-items: center;
1995
+ justify-content: center;
1996
+ padding: 0;
1997
+ background-color: transparent;
1998
+ border: none;
1999
+ cursor: var(--cursor-button);
1636
2000
  }
1637
2001
 
1638
- .base-table .row {
1639
- display: flex;
2002
+ .base-pagination[data-disabled]:where(.item) {
2003
+ cursor: var(--cursor-disabled);
2004
+ }
2005
+
2006
+ .base-pagination:where(.ellipsis) {
2007
+ display: inline-flex;
1640
2008
  align-items: center;
1641
- width: 100%;
2009
+ justify-content: center;
2010
+ -webkit-user-select: none;
2011
+ -moz-user-select: none;
2012
+ user-select: none;
1642
2013
  }
1643
2014
 
1644
- .base-table .cell {
1645
- text-align: start;
2015
+ /***************************************************************************************************
2016
+ * *
2017
+ * pagination *
2018
+ * *
2019
+ ***************************************************************************************************/
2020
+
2021
+ .pagination {
2022
+ display: inline-flex;
2023
+ align-items: center;
2024
+ gap: var(--spacing-4);
2025
+ }
2026
+
2027
+ .pagination.size-s {
2028
+ --pagination-item-size: var(--control-height-s);
2029
+ --pagination-icon-size: var(--icon-size-s);
2030
+ font-size: var(--font-size-xsm);
2031
+ line-height: var(--line-height-xsm);
2032
+ }
2033
+
2034
+ .pagination.size-m {
2035
+ --pagination-item-size: var(--control-height-m);
2036
+ --pagination-icon-size: var(--icon-size-m);
2037
+ font-size: var(--font-size-sm);
2038
+ line-height: var(--line-height-sm);
2039
+ }
2040
+
2041
+ .pagination-item {
2042
+ min-width: var(--pagination-item-size);
2043
+ height: var(--pagination-item-size);
2044
+ padding: 0 var(--spacing-4);
2045
+ border-radius: var(--radius-6);
2046
+ color: var(--color-grey-scale-600);
2047
+ font-size: inherit;
2048
+ line-height: inherit;
2049
+ font-weight: var(--font-weight-medium);
2050
+ transition:
2051
+ background-color var(--motion-fast) var(--motion-ease),
2052
+ color var(--motion-fast) var(--motion-ease);
2053
+ }
2054
+
2055
+ .pagination-item:not(:disabled):hover {
2056
+ background-color: var(--color-grey-scale-100);
2057
+ color: var(--color-purple-900);
2058
+ }
2059
+
2060
+ .pagination-item[data-state='active'] {
2061
+ background-color: var(--color-purple-50);
2062
+ color: var(--color-purple-900);
2063
+ font-weight: var(--font-weight-bold);
2064
+ }
2065
+
2066
+ .pagination-item:disabled {
2067
+ background-color: transparent;
2068
+ color: var(--color-grey-scale-300);
2069
+ }
2070
+
2071
+ .pagination-ellipsis {
2072
+ min-width: var(--pagination-item-size);
2073
+ height: var(--pagination-item-size);
2074
+ color: var(--color-grey-scale-400);
2075
+ }
2076
+
2077
+ .pagination-icon {
2078
+ width: var(--pagination-icon-size);
2079
+ height: var(--pagination-icon-size);
2080
+ }
2081
+
2082
+ .pagination-icon-prev {
2083
+ transform: rotate(90deg);
2084
+ }
2085
+
2086
+ .pagination-icon-next {
2087
+ transform: rotate(-90deg);
2088
+ }
2089
+
2090
+ .base-radio:where(.button) {
2091
+ padding: 0;
2092
+ }
2093
+
2094
+ /***************************************************************************************************
2095
+ * *
2096
+ * radio *
2097
+ * *
2098
+ ***************************************************************************************************/
2099
+
2100
+ .radio:where(.radio-group) {
1646
2101
  display: flex;
1647
2102
  flex-direction: column;
2103
+ gap: var(--spacing-16);
2104
+ }
2105
+
2106
+ .radio:where(.radio-option) {
2107
+ display: flex;
2108
+ align-items: center;
2109
+ gap: var(--spacing-6);
2110
+ }
2111
+
2112
+ .radio:where(.radio-button) {
2113
+ display: flex;
2114
+ align-items: center;
1648
2115
  justify-content: center;
2116
+ width: var(--radio-size);
2117
+ height: var(--radio-size);
2118
+ border-radius: 50%;
2119
+ background-color: var(--color-grey-scale-200);
2120
+ }
2121
+
2122
+ .radio:where(.radio-indicator) {
2123
+ width: var(--radio-dot-size);
2124
+ height: var(--radio-dot-size);
2125
+ border-radius: 50%;
2126
+ background-color: var(--color-purple-900);
2127
+ }
2128
+
2129
+ .radio:where(.radio-label) {
2130
+ font-size: var(--font-size-sm);
2131
+ font-weight: var(--font-weight-medium);
2132
+ color: var(--color-black);
2133
+ }
2134
+
2135
+ /* disabled: 글자·점은 회색, 커서는 비활성. 버튼은 BaseButton 이, 라벨은 RadioLabel 이 data-disabled 를 단다 */
2136
+
2137
+ .radio.radio-label[data-disabled] {
2138
+ color: var(--color-grey-scale-400);
2139
+ cursor: var(--cursor-disabled);
2140
+ }
2141
+
2142
+ .radio.radio-button[data-disabled] {
2143
+ cursor: var(--cursor-disabled);
2144
+ background-color: var(--color-grey-scale-100);
2145
+ }
2146
+
2147
+ .radio.radio-button[data-disabled] .radio-indicator {
2148
+ background-color: var(--color-grey-scale-400);
2149
+ }
2150
+
2151
+ .base-skeleton {
2152
+ display: block;
2153
+ box-sizing: border-box;
2154
+ }
2155
+
2156
+ /***************************************************************************************************
2157
+ * *
2158
+ * skeleton *
2159
+ * *
2160
+ ***************************************************************************************************/
2161
+
2162
+ /* 단일 뼈대(text 한 줄·rect·circle)는 루트가, 여러 줄 text 는 각 .skeleton-line 이 뼈대다. */
2163
+
2164
+ .skeleton {
2165
+ position: relative;
2166
+ overflow: hidden;
2167
+ height: var(--skeleton-text-height);
2168
+ border-radius: var(--radius-4);
2169
+ background-color: var(--color-grey-scale-200);
2170
+ }
2171
+
2172
+ .skeleton.shape-circle {
2173
+ border-radius: var(--radius-full);
2174
+ aspect-ratio: 1;
2175
+ flex-shrink: 0;
2176
+ }
2177
+
2178
+ .skeleton.multiline {
2179
+ display: flex;
2180
+ flex-direction: column;
2181
+ gap: var(--spacing-8);
2182
+ height: auto;
2183
+ overflow: visible;
2184
+ background-color: transparent;
2185
+ }
2186
+
2187
+ .skeleton-line {
2188
+ position: relative;
2189
+ display: block;
2190
+ overflow: hidden;
2191
+ width: 100%;
2192
+ height: var(--skeleton-text-height);
2193
+ border-radius: var(--radius-4);
2194
+ background-color: var(--color-grey-scale-200);
2195
+ }
2196
+
2197
+ .skeleton-line:last-child:not(:only-child) {
2198
+ width: var(--skeleton-last-line-width);
2199
+ }
2200
+
2201
+ .skeleton.animated:not(.multiline)::after,
2202
+ .skeleton.animated .skeleton-line::after {
2203
+ content: '';
2204
+ position: absolute;
2205
+ inset: 0;
2206
+ background: linear-gradient(
2207
+ 90deg,
2208
+ transparent 0%,
2209
+ var(--color-grey-scale-100) 50%,
2210
+ transparent 100%
2211
+ );
2212
+ transform: translateX(-100%);
2213
+ animation: skeleton-shimmer var(--skeleton-duration) var(--motion-ease) infinite;
2214
+ }
2215
+
2216
+ @media (prefers-reduced-motion: reduce) {
2217
+ .skeleton.animated:not(.multiline)::after,
2218
+ .skeleton.animated .skeleton-line::after {
2219
+ animation: none;
2220
+ }
2221
+ }
2222
+
2223
+ @keyframes skeleton-shimmer {
2224
+ 0% {
2225
+ transform: translateX(-100%);
2226
+ }
2227
+ 100% {
2228
+ transform: translateX(100%);
2229
+ }
2230
+ }
2231
+
2232
+ .base-switch:where(.thumb) {
2233
+ display: block;
2234
+ }
2235
+
2236
+ .base-switch:where(.label) {
2237
+ font-size: var(--font-size-sm);
2238
+ font-weight: var(--font-weight-medium);
2239
+ color: var(--color-black);
2240
+ }
2241
+
2242
+ /***************************************************************************************************
2243
+ * *
2244
+ * switch *
2245
+ * *
2246
+ ***************************************************************************************************/
2247
+
2248
+ .switch {
2249
+ display: inline-flex;
2250
+ align-items: center;
2251
+ gap: var(--spacing-10);
2252
+
2253
+ padding: 0;
2254
+ background-color: transparent;
2255
+ border: none;
2256
+ cursor: var(--cursor-button);
2257
+ }
2258
+
2259
+ .switch[data-disabled] {
2260
+ cursor: var(--cursor-disabled);
2261
+ }
2262
+
2263
+ .switch-track {
2264
+ position: relative;
2265
+ display: inline-flex;
2266
+ align-items: center;
2267
+ flex-shrink: 0;
2268
+ padding: var(--switch-thumb-inset);
2269
+ border-radius: var(--radius-full);
2270
+ background-color: var(--color-grey-scale-300);
2271
+ transition: background-color var(--motion-fast) var(--motion-ease);
2272
+ }
2273
+
2274
+ .switch-track.size-s {
2275
+ width: var(--switch-width-s);
2276
+ height: var(--switch-height-s);
2277
+ --switch-travel: calc(var(--switch-width-s) - var(--switch-height-s));
2278
+ }
2279
+
2280
+ .switch-track.size-m {
2281
+ width: var(--switch-width-m);
2282
+ height: var(--switch-height-m);
2283
+ --switch-travel: calc(var(--switch-width-m) - var(--switch-height-m));
2284
+ }
2285
+
2286
+ .switch-track.size-l {
2287
+ width: var(--switch-width-l);
2288
+ height: var(--switch-height-l);
2289
+ --switch-travel: calc(var(--switch-width-l) - var(--switch-height-l));
2290
+ }
2291
+
2292
+ .switch-track[data-disabled] {
2293
+ background-color: var(--color-grey-scale-200);
2294
+ }
2295
+
2296
+ .switch[data-state='checked'] .switch-track {
2297
+ background-color: var(--color-purple-900);
2298
+ }
2299
+
2300
+ .switch-thumb {
2301
+ aspect-ratio: 1;
2302
+ height: 100%;
2303
+ border-radius: var(--radius-full);
2304
+ background-color: var(--color-white);
2305
+ transition: transform var(--motion-fast) var(--motion-ease);
2306
+ }
2307
+
2308
+ .switch-thumb[data-state='checked'] {
2309
+ transform: translateX(var(--switch-travel));
2310
+ }
2311
+
2312
+ .switch-thumb[data-disabled] {
2313
+ background-color: var(--color-grey-scale-100);
2314
+ }
2315
+
2316
+ .base-table {
2317
+ /* 진짜 테이블 레이아웃을 쓴다. 행을 flex 로 두면 헤더와 본문의 열 폭이 따로 놀아 고정열 경계가 어긋난다 */
2318
+ width: -moz-fit-content;
2319
+ width: fit-content;
2320
+ border-collapse: collapse;
2321
+ border-spacing: 0;
2322
+ table-layout: auto;
2323
+ }
2324
+
2325
+ .base-table .cell {
2326
+ padding: 0;
2327
+ text-align: start;
2328
+ vertical-align: middle;
1649
2329
  }
1650
2330
 
1651
2331
  /***************************************************************************************************
@@ -1807,13 +2487,99 @@
1807
2487
  z-index: var(--z-base);
1808
2488
  }
1809
2489
 
1810
- .base-text-field.input {
2490
+ .base-text-area:where(.textarea) {
2491
+ display: block;
2492
+ width: 100%;
2493
+ margin: 0;
1811
2494
  border: none;
1812
2495
  outline: none;
1813
2496
  background-color: transparent;
2497
+ font-family: inherit;
2498
+ font-weight: var(--font-weight-medium);
2499
+ color: var(--color-black);
2500
+ }
2501
+
2502
+ .base-text-area:where(.textarea)::-moz-placeholder {
2503
+ color: var(--color-grey-scale-400);
2504
+ }
2505
+
2506
+ .base-text-area:where(.textarea)::placeholder {
2507
+ color: var(--color-grey-scale-400);
2508
+ }
2509
+
2510
+ .base-text-area[data-disabled]:where(.textarea) {
2511
+ cursor: var(--cursor-disabled);
2512
+ }
2513
+
2514
+ /***************************************************************************************************
2515
+ * *
2516
+ * text-area *
2517
+ * *
2518
+ ***************************************************************************************************/
2519
+
2520
+ .text-area {
2521
+ height: -moz-fit-content;
2522
+ height: fit-content;
2523
+ }
2524
+
2525
+ .text-area-title {
2526
+ margin-bottom: var(--spacing-8);
2527
+ }
1814
2528
 
2529
+ /* 높이는 rows 가 정한다. size 는 글자 크기와 안쪽 여백만 바꾼다 */
2530
+
2531
+ .text-area-input-wrapper {
2532
+ display: flex;
2533
+ box-sizing: border-box;
2534
+
2535
+ border-radius: var(--radius-4);
2536
+ border: var(--hairline) solid var(--color-grey-scale-300);
2537
+ }
2538
+
2539
+ .text-area-input-wrapper.size-s > textarea {
2540
+ padding: var(--spacing-10) var(--spacing-14);
1815
2541
  font-size: var(--font-size-sm);
1816
2542
  line-height: var(--line-height-sm);
2543
+ }
2544
+
2545
+ .text-area-input-wrapper.size-m > textarea {
2546
+ padding: var(--spacing-14) var(--spacing-14);
2547
+ font-size: var(--font-size-base);
2548
+ line-height: var(--line-height-base);
2549
+ }
2550
+
2551
+ .text-area-input-wrapper.resize-none > textarea {
2552
+ resize: none;
2553
+ }
2554
+
2555
+ .text-area-input-wrapper.resize-vertical > textarea {
2556
+ resize: vertical;
2557
+ }
2558
+
2559
+ .text-area-input-wrapper:has( > textarea[data-disabled]) {
2560
+ border-color: var(--color-grey-scale-300);
2561
+ background-color: var(--color-grey-scale-100);
2562
+ }
2563
+
2564
+ .text-area-input-wrapper:focus-within {
2565
+ border: var(--hairline) solid var(--color-purple-900);
2566
+ }
2567
+
2568
+ .text-area-helper-text {
2569
+ margin-top: var(--spacing-4);
2570
+ }
2571
+
2572
+ .text-area-helper-text.error {
2573
+ color: var(--color-accent-red-500);
2574
+ }
2575
+
2576
+ .base-text-field.input {
2577
+ border: none;
2578
+ outline: none;
2579
+ background-color: transparent;
2580
+
2581
+ font-size: inherit;
2582
+ line-height: inherit;
1817
2583
  font-weight: var(--font-weight-medium);
1818
2584
  }
1819
2585
 
@@ -1853,18 +2619,45 @@
1853
2619
  justify-content: space-between;
1854
2620
  gap: var(--spacing-10);
1855
2621
 
1856
- padding: 0 var(--spacing-14);
2622
+ /* 높이는 버튼과 같은 --control-height-* 축, 좌우 여백·글자는 size 마다 버튼과 같은 단계 */
1857
2623
 
1858
2624
  border-radius: var(--radius-4);
1859
2625
  border: var(--hairline) solid var(--color-grey-scale-300);
1860
2626
  }
1861
2627
 
2628
+ .text-field-input-wrapper.size-xs {
2629
+ height: var(--control-height-xs);
2630
+ padding: 0 var(--spacing-12);
2631
+ font-size: var(--font-size-xsm);
2632
+ line-height: var(--line-height-xsm);
2633
+ }
2634
+
1862
2635
  .text-field-input-wrapper.size-s {
1863
2636
  height: var(--control-height-s);
2637
+ padding: 0 var(--spacing-14);
2638
+ font-size: var(--font-size-sm);
2639
+ line-height: var(--line-height-sm);
1864
2640
  }
1865
2641
 
1866
2642
  .text-field-input-wrapper.size-m {
1867
2643
  height: var(--control-height-m);
2644
+ padding: 0 var(--spacing-16);
2645
+ font-size: var(--font-size-sm);
2646
+ line-height: var(--line-height-sm);
2647
+ }
2648
+
2649
+ .text-field-input-wrapper.size-l {
2650
+ height: var(--control-height-l);
2651
+ padding: 0 var(--spacing-20);
2652
+ font-size: var(--font-size-base);
2653
+ line-height: var(--line-height-base);
2654
+ }
2655
+
2656
+ .text-field-input-wrapper.size-xl {
2657
+ height: var(--control-height-xl);
2658
+ padding: 0 var(--spacing-24);
2659
+ font-size: var(--font-size-lg);
2660
+ line-height: var(--line-height-lg);
1868
2661
  }
1869
2662
 
1870
2663
  .text-field-input-wrapper:has( > input[data-disabled='true']) {
@@ -1888,6 +2681,246 @@
1888
2681
  color: var(--color-accent-red-500);
1889
2682
  }
1890
2683
 
2684
+ /* 조각(title·close 등)도 base-toast 를 달므로 상자 스타일은 루트와 viewport 에만 건다. */
2685
+
2686
+ .base-toast:where(:not(.viewport, .title, .description, .action, .close)) {
2687
+ position: relative;
2688
+ display: flex;
2689
+ align-items: flex-start;
2690
+ gap: var(--spacing-12);
2691
+ list-style: none;
2692
+ }
2693
+
2694
+ .base-toast[data-state='open']:where(:not(.viewport,.title,.description,.action,.close)) {
2695
+ animation: toast-in var(--motion-base) var(--motion-ease);
2696
+ }
2697
+
2698
+ .base-toast[data-state='closed']:where(:not(.viewport,.title,.description,.action,.close)) {
2699
+ animation: toast-out var(--motion-fast) var(--motion-ease) forwards;
2700
+ }
2701
+
2702
+ .base-toast[data-swipe='move']:where(:not(.viewport,.title,.description,.action,.close)) {
2703
+ transform: translateX(var(--radix-toast-swipe-move-x));
2704
+ }
2705
+
2706
+ .base-toast[data-swipe='cancel']:where(:not(.viewport,.title,.description,.action,.close)) {
2707
+ transform: translateX(0);
2708
+ transition: transform var(--motion-fast) var(--motion-ease);
2709
+ }
2710
+
2711
+ .base-toast[data-swipe='end']:where(:not(.viewport,.title,.description,.action,.close)) {
2712
+ animation: toast-swipe-out var(--motion-fast) var(--motion-ease) forwards;
2713
+ }
2714
+
2715
+ .base-toast:where(.viewport) {
2716
+ position: fixed;
2717
+ z-index: var(--z-toast);
2718
+ display: flex;
2719
+ flex-direction: column;
2720
+ gap: var(--spacing-10);
2721
+ width: var(--toast-width);
2722
+ max-width: 100vw;
2723
+ margin: 0;
2724
+ padding: var(--spacing-24);
2725
+ list-style: none;
2726
+ outline: none;
2727
+ /* 아래에서 올라오는 자리를 기본으로 두고 position 클래스가 덮는다 */
2728
+ --toast-enter: translateY(var(--spacing-16));
2729
+ }
2730
+
2731
+ .base-toast.position-top-right:where(.viewport) {
2732
+ top: 0;
2733
+ right: 0;
2734
+ --toast-enter: translateY(calc(-1 * var(--spacing-16)));
2735
+ }
2736
+
2737
+ .base-toast.position-bottom-right:where(.viewport) {
2738
+ right: 0;
2739
+ bottom: 0;
2740
+ }
2741
+
2742
+ .base-toast.position-bottom-center:where(.viewport) {
2743
+ bottom: 0;
2744
+ left: 50%;
2745
+ transform: translateX(-50%);
2746
+ }
2747
+
2748
+ .base-toast:where(.title),.base-toast:where(.description) {
2749
+ margin: 0;
2750
+ }
2751
+
2752
+ .base-toast:where(.action),.base-toast:where(.close) {
2753
+ flex-shrink: 0;
2754
+ padding: 0;
2755
+ border: none;
2756
+ background: transparent;
2757
+ cursor: var(--cursor-button);
2758
+ }
2759
+
2760
+ @keyframes toast-in {
2761
+ from {
2762
+ opacity: 0;
2763
+ transform: var(--toast-enter);
2764
+ }
2765
+
2766
+ to {
2767
+ opacity: 1;
2768
+ transform: none;
2769
+ }
2770
+ }
2771
+
2772
+ @keyframes toast-out {
2773
+ from {
2774
+ opacity: 1;
2775
+ }
2776
+
2777
+ to {
2778
+ opacity: 0;
2779
+ }
2780
+ }
2781
+
2782
+ @keyframes toast-swipe-out {
2783
+ from {
2784
+ transform: translateX(var(--radix-toast-swipe-end-x));
2785
+ }
2786
+
2787
+ to {
2788
+ transform: translateX(calc(100% + var(--spacing-24)));
2789
+ }
2790
+ }
2791
+
2792
+ @media (prefers-reduced-motion: reduce) {
2793
+ .base-toast:where(:not(.viewport, .title, .description, .action, .close)) {
2794
+ animation: none;
2795
+ }
2796
+ }
2797
+
2798
+ /***************************************************************************************************
2799
+ * *
2800
+ * toast *
2801
+ * *
2802
+ ***************************************************************************************************/
2803
+
2804
+ /* Tooltip 과 같은 표면: 진한 바탕에 흰 글자, radius-6. variant 가 바탕색을 정한다(기본 purple-900, success green, warning orange, error red-500 = confirm 버튼) */
2805
+
2806
+ .toast {
2807
+ align-items: center;
2808
+ padding: var(--spacing-12) var(--spacing-14);
2809
+ border-radius: var(--radius-6);
2810
+ background-color: var(--color-purple-900);
2811
+ color: var(--color-white);
2812
+
2813
+ /* CTAButton secondary 와 같은 연보라. 이 variant 만 글자가 어둡다 */
2814
+ }
2815
+
2816
+ .toast.variant-secondary {
2817
+ background-color: var(--color-purple-50);
2818
+ color: var(--color-purple-900);
2819
+ }
2820
+
2821
+ .toast.variant-secondary .toast-title,.toast.variant-secondary .toast-close {
2822
+ color: var(--color-purple-900);
2823
+ }
2824
+
2825
+ .toast.variant-secondary .toast-description {
2826
+ color: var(--color-purple-700);
2827
+ }
2828
+
2829
+ .toast.variant-success {
2830
+ background-color: var(--color-accent-green-600);
2831
+ }
2832
+
2833
+ .toast.variant-success .toast-description {
2834
+ color: var(--color-accent-green-100);
2835
+ }
2836
+
2837
+ .toast.variant-warning {
2838
+ background-color: var(--color-accent-orange-500);
2839
+ }
2840
+
2841
+ .toast.variant-warning .toast-description {
2842
+ color: var(--color-accent-orange-100);
2843
+ }
2844
+
2845
+ .toast.variant-error {
2846
+ background-color: var(--color-accent-red-500);
2847
+ }
2848
+
2849
+ .toast.variant-error .toast-description {
2850
+ color: var(--color-accent-red-100);
2851
+ }
2852
+
2853
+ /* success·warning·error 는 앞에 상태 아이콘을 둔다. SVG 에 박힌 색을 글자색으로 맞춘다 */
2854
+
2855
+ .toast-icon {
2856
+ flex-shrink: 0;
2857
+ width: var(--icon-size-s);
2858
+ height: var(--icon-size-s);
2859
+ }
2860
+
2861
+ .toast-icon path[stroke] {
2862
+ stroke: currentColor;
2863
+ }
2864
+
2865
+ .toast-icon path[fill]:not([fill='none']) {
2866
+ fill: currentColor;
2867
+ }
2868
+
2869
+ .toast-body {
2870
+ display: flex;
2871
+ flex: 1;
2872
+ flex-direction: column;
2873
+ gap: var(--spacing-4);
2874
+ min-width: 0;
2875
+ }
2876
+
2877
+ .toast-title {
2878
+ font-size: var(--font-size-sm);
2879
+ line-height: var(--line-height-sm);
2880
+ font-weight: var(--font-weight-semibold);
2881
+ color: var(--color-white);
2882
+ word-break: break-word;
2883
+ }
2884
+
2885
+ .toast-description {
2886
+ font-size: var(--font-size-xsm);
2887
+ line-height: var(--line-height-xsm);
2888
+ font-weight: var(--font-weight-regular);
2889
+ color: var(--color-purple-200);
2890
+ word-break: break-word;
2891
+ }
2892
+
2893
+ /* action 은 CTAButton(xs·neutral: 흰 바탕, 보라 글자) 이라 모양은 버튼 CSS 가 정한다 */
2894
+
2895
+ .toast-action {
2896
+ white-space: nowrap;
2897
+ }
2898
+
2899
+ .toast-close {
2900
+ display: inline-flex;
2901
+ align-items: center;
2902
+ justify-content: center;
2903
+ width: var(--icon-size-s);
2904
+ height: var(--icon-size-s);
2905
+ color: var(--color-white);
2906
+ opacity: 0.7;
2907
+ }
2908
+
2909
+ .toast-close:hover {
2910
+ opacity: 1;
2911
+ }
2912
+
2913
+ /* multifly.svg 의 fill 이 회색으로 박혀 있어 글자색을 따르게 한다 */
2914
+
2915
+ .toast-close svg {
2916
+ width: 100%;
2917
+ height: 100%;
2918
+ }
2919
+
2920
+ :is(.toast-close svg) path {
2921
+ fill: currentColor;
2922
+ }
2923
+
1891
2924
  /* Trigger 도 base-tooltip 을 달므로 z-index 는 Content 에만 건다. */
1892
2925
 
1893
2926
  .base-tooltip:where(.content) {