@nurihaus/web-design-system 3.0.3 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/ai/components.md +305 -11
  2. package/dist/ai/tokens.md +38 -13
  3. package/dist/avatar.js +8 -8
  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 +33 -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 +38 -0
  17. package/dist/chunk-739.js +6 -6
  18. package/dist/chunk-77.js +34 -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 +2090 -475
  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 +496 -0
  97. package/dist/tokens.css +32 -5
  98. package/dist/tooltip.js +9 -9
  99. package/package.json +33 -1
package/dist/styles.css CHANGED
@@ -153,11 +153,11 @@
153
153
  --line-height-5xl: 66px;
154
154
  --line-height-6xl: 82px;
155
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;
156
+ --control-height-xs: 28px;
157
+ --control-height-s: 36px;
158
+ --control-height-m: 40px;
159
+ --control-height-l: 44px;
160
+ --control-height-xl: 48px;
161
161
 
162
162
  /* 라벨: badge */
163
163
  --label-height-xs: 28px;
@@ -177,6 +177,15 @@
177
177
  --checkbox-size-l: 24px;
178
178
  --radio-size: 18px;
179
179
  --radio-dot-size: 8px;
180
+
181
+ /* 스위치: 트랙 폭·높이. 손잡이는 트랙 높이에서 inset 을 뺀 정사각이다 */
182
+ --switch-width-s: 32px;
183
+ --switch-width-m: 40px;
184
+ --switch-width-l: 48px;
185
+ --switch-height-s: 18px;
186
+ --switch-height-m: 22px;
187
+ --switch-height-l: 26px;
188
+ --switch-thumb-inset: 2px;
180
189
  --avatar-size-s: 40px;
181
190
  --avatar-size-m: 58px;
182
191
  --avatar-size-l: 74px;
@@ -187,6 +196,13 @@
187
196
  --avatar-badge-size-xl: 48px;
188
197
 
189
198
  /* 폭 */
199
+ --drawer-width-s: 320px;
200
+ --drawer-width-m: 400px;
201
+ --drawer-width-l: 520px;
202
+ --drawer-height-s: 320px;
203
+ --drawer-height-m: 400px;
204
+ --drawer-height-l: 520px;
205
+ --toast-width: 360px;
190
206
  --modal-width-s: 400px;
191
207
  --modal-width-m: 450px;
192
208
  --modal-width-l: 500px;
@@ -197,8 +213,17 @@
197
213
  --icon-size-l: 24px;
198
214
  --tooltip-arrow: 8px;
199
215
  --spinner-stroke: 3px;
216
+ --overlay-spinner-size: 64px;
217
+ --overlay-spinner-stroke: 8px;
200
218
  --tab-indicator-thickness: 3px;
201
219
  --checkbox-border: 1.5px;
220
+ --breadcrumb-chevron-xs: 12px;
221
+ --breadcrumb-chevron-s: 14px;
222
+ --breadcrumb-chevron-m: 16px;
223
+ --breadcrumb-chevron-l: 18px;
224
+ --breadcrumb-chevron-xl: 20px;
225
+ --skeleton-text-height: 16px;
226
+ --skeleton-last-line-width: 60%;
202
227
  --hairline: 1px;
203
228
 
204
229
  /* 그림자 */
@@ -213,12 +238,14 @@
213
238
  --z-popover: 5;
214
239
  --z-overlay: 9998;
215
240
  --z-modal: 9999;
241
+ --z-toast: 10000;
216
242
 
217
243
  /* 모션 */
218
244
  --motion-fast: 160ms;
219
245
  --motion-base: 300ms;
220
246
  --motion-ease: ease;
221
247
  --spinner-duration: 1.2s;
248
+ --skeleton-duration: 1.5s;
222
249
  --spinner-ease: cubic-bezier(0.5, 0, 0.5, 1);
223
250
  }
224
251
  /* semantic: app */
@@ -708,6 +735,91 @@ p {
708
735
  background-color: var(--color-white);
709
736
  border: var(--hairline) solid var(--color-grey-scale-300);
710
737
  }
738
+ .base-breadcrumb:where(.list) {
739
+ display: flex;
740
+ flex-wrap: wrap;
741
+ align-items: center;
742
+ margin: 0;
743
+ padding: 0;
744
+ list-style: none;
745
+ }
746
+ .base-breadcrumb:where(.item,.separator) {
747
+ display: inline-flex;
748
+ align-items: center;
749
+ }
750
+ .base-breadcrumb:where(.link) {
751
+ color: inherit;
752
+ text-decoration: none;
753
+ cursor: var(--cursor-button);
754
+ }
755
+ .base-breadcrumb:where(.separator) {
756
+ -webkit-user-select: none;
757
+ -moz-user-select: none;
758
+ user-select: none;
759
+ }
760
+ /***************************************************************************************************
761
+ * *
762
+ * breadcrumb *
763
+ * *
764
+ ***************************************************************************************************/
765
+ .breadcrumb {
766
+ font-weight: var(--font-weight-medium);
767
+ color: var(--color-grey-scale-500);
768
+
769
+ /* 글자와 화살표가 같이 커진다. 화살표 치수는 size.css 의 --breadcrumb-chevron-* */
770
+ }
771
+ .breadcrumb.size-xs {
772
+ font-size: var(--font-size-xsm);
773
+ line-height: var(--line-height-xsm);
774
+ --breadcrumb-chevron: var(--breadcrumb-chevron-xs);
775
+ }
776
+ .breadcrumb.size-s {
777
+ font-size: var(--font-size-sm);
778
+ line-height: var(--line-height-sm);
779
+ --breadcrumb-chevron: var(--breadcrumb-chevron-s);
780
+ }
781
+ .breadcrumb.size-m {
782
+ font-size: var(--font-size-base);
783
+ line-height: var(--line-height-base);
784
+ --breadcrumb-chevron: var(--breadcrumb-chevron-m);
785
+ }
786
+ .breadcrumb.size-l {
787
+ font-size: var(--font-size-lg);
788
+ line-height: var(--line-height-lg);
789
+ --breadcrumb-chevron: var(--breadcrumb-chevron-l);
790
+ }
791
+ .breadcrumb.size-xl {
792
+ font-size: var(--font-size-xl);
793
+ line-height: var(--line-height-xl);
794
+ --breadcrumb-chevron: var(--breadcrumb-chevron-xl);
795
+ }
796
+ .breadcrumb-list {
797
+ gap: var(--spacing-4);
798
+ }
799
+ .breadcrumb-link {
800
+ border-radius: var(--radius-4);
801
+ transition: color var(--motion-fast) var(--motion-ease);
802
+ }
803
+ .breadcrumb-link:hover {
804
+ color: var(--color-grey-scale-800);
805
+ text-decoration: underline;
806
+ }
807
+ .breadcrumb-link:focus-visible {
808
+ outline: var(--hairline) solid var(--color-purple-900);
809
+ outline-offset: var(--spacing-2);
810
+ }
811
+ .breadcrumb-page {
812
+ color: var(--color-grey-scale-900);
813
+ font-weight: var(--font-weight-semibold);
814
+ }
815
+ .breadcrumb-separator {
816
+ color: var(--color-grey-scale-400);
817
+ }
818
+ .breadcrumb-chevron {
819
+ width: var(--breadcrumb-chevron);
820
+ height: var(--breadcrumb-chevron);
821
+ transform: rotate(-90deg);
822
+ }
711
823
  .base-button {
712
824
  display: flex;
713
825
  justify-content: center;
@@ -728,6 +840,7 @@ p {
728
840
  ***************************************************************************************************/
729
841
  .cta-button {
730
842
  border-radius: var(--radius-6);
843
+ /* 좌우 여백은 size 가 정한다. 글자 길이와 상관없이 양쪽에 같은 여백이 남는다 */
731
844
  }
732
845
  .cta-button.variant-primary {
733
846
  background-color: var(--color-purple-900);
@@ -784,6 +897,7 @@ p {
784
897
  }
785
898
  .cta-button.size-xl {
786
899
  height: var(--control-height-xl);
900
+ padding: 0 var(--spacing-24);
787
901
 
788
902
  font-size: var(--font-size-lg);
789
903
  line-height: var(--line-height-lg);
@@ -791,6 +905,7 @@ p {
791
905
  }
792
906
  .cta-button.size-l {
793
907
  height: var(--control-height-l);
908
+ padding: 0 var(--spacing-20);
794
909
 
795
910
  font-size: var(--font-size-base);
796
911
  line-height: var(--line-height-base);
@@ -798,6 +913,7 @@ p {
798
913
  }
799
914
  .cta-button.size-m {
800
915
  height: var(--control-height-m);
916
+ padding: 0 var(--spacing-16);
801
917
 
802
918
  font-size: var(--font-size-sm);
803
919
  line-height: var(--line-height-sm);
@@ -805,6 +921,7 @@ p {
805
921
  }
806
922
  .cta-button.size-s {
807
923
  height: var(--control-height-s);
924
+ padding: 0 var(--spacing-14);
808
925
 
809
926
  font-size: var(--font-size-xsm);
810
927
  line-height: var(--line-height-xsm);
@@ -812,6 +929,7 @@ p {
812
929
  }
813
930
  .cta-button.size-xs {
814
931
  height: var(--control-height-xs);
932
+ padding: 0 var(--spacing-12);
815
933
 
816
934
  font-size: var(--font-size-xsm);
817
935
  line-height: var(--line-height-xsm);
@@ -852,7 +970,18 @@ p {
852
970
 
853
971
  width: 100%;
854
972
  height: 100%;
973
+
974
+ /* 체크 아이콘(16px 고정)을 칸 정가운데에 둔다. 빌드된 SVG 에 viewBox 가 없어 늘리면 그림이 왼쪽 위에 남는다 */
855
975
  }
976
+ .check-box-indicator:not(.wrapper) {
977
+ display: flex;
978
+ align-items: center;
979
+ justify-content: center;
980
+ }
981
+ .check-box-indicator:not(.wrapper) > svg {
982
+ display: block;
983
+ flex-shrink: 0;
984
+ }
856
985
  .check-box-indicator.size-l {
857
986
  width: var(--checkbox-size-l);
858
987
  height: var(--checkbox-size-l);
@@ -955,6 +1084,158 @@ p {
955
1084
  margin-top: var(--spacing-2);
956
1085
  margin-bottom: var(--spacing-4);
957
1086
  }
1087
+ /* Title·Close 같은 조각도 base-drawer 를 달므로 상자 스타일은 overlay·content 에만 건다. */
1088
+ .base-drawer:where(.overlay) {
1089
+ position: fixed;
1090
+ top: 0;
1091
+ left: 0;
1092
+ right: 0;
1093
+ bottom: 0;
1094
+ background-color: rgba(0, 0, 0, 0.5);
1095
+ z-index: var(--z-overlay);
1096
+ }
1097
+ .base-drawer[data-state='open']:where(.overlay) {
1098
+ animation: drawer-overlay-in var(--motion-base) var(--motion-ease);
1099
+ }
1100
+ .base-drawer[data-state='closed']:where(.overlay) {
1101
+ animation: drawer-overlay-out var(--motion-base) var(--motion-ease);
1102
+ }
1103
+ .base-drawer:where(.content) {
1104
+ position: fixed;
1105
+ display: flex;
1106
+ flex-direction: column;
1107
+ z-index: var(--z-modal);
1108
+ background-color: var(--color-white);
1109
+ }
1110
+ .base-drawer:where(.title) {
1111
+ margin: 0;
1112
+ font-size: var(--font-size-lg);
1113
+ font-weight: var(--font-weight-bold);
1114
+ color: var(--color-black);
1115
+ }
1116
+ .base-drawer:where(.description) {
1117
+ margin: 0;
1118
+ font-size: var(--font-size-sm);
1119
+ font-weight: var(--font-weight-medium);
1120
+ color: var(--color-grey-scale-600);
1121
+ }
1122
+ .base-drawer:where(.close) {
1123
+ display: inline-flex;
1124
+ align-items: center;
1125
+ justify-content: center;
1126
+ padding: 0;
1127
+ background-color: transparent;
1128
+ border: none;
1129
+ cursor: var(--cursor-button);
1130
+ }
1131
+ /***************************************************************************************************
1132
+ * *
1133
+ * drawer *
1134
+ * *
1135
+ ***************************************************************************************************/
1136
+ /* Radix 는 애니메이션이 끝나야 닫힌 패널을 지우므로 transition 이 아니라 keyframes 로 들어오고 나간다. */
1137
+ @keyframes drawer-overlay-in {
1138
+ from {
1139
+ opacity: 0;
1140
+ }
1141
+ to {
1142
+ opacity: 1;
1143
+ }
1144
+ }
1145
+ @keyframes drawer-overlay-out {
1146
+ from {
1147
+ opacity: 1;
1148
+ }
1149
+ to {
1150
+ opacity: 0;
1151
+ }
1152
+ }
1153
+ @keyframes drawer-slide-in {
1154
+ from {
1155
+ transform: var(--drawer-offset);
1156
+ }
1157
+ to {
1158
+ transform: translate(0, 0);
1159
+ }
1160
+ }
1161
+ @keyframes drawer-slide-out {
1162
+ from {
1163
+ transform: translate(0, 0);
1164
+ }
1165
+ to {
1166
+ transform: var(--drawer-offset);
1167
+ }
1168
+ }
1169
+ .drawer {
1170
+ gap: var(--spacing-8);
1171
+ padding: var(--spacing-24);
1172
+ box-sizing: border-box;
1173
+ }
1174
+ .drawer.size-s {
1175
+ --drawer-width: var(--drawer-width-s);
1176
+ --drawer-height: var(--drawer-height-s);
1177
+ }
1178
+ .drawer.size-m {
1179
+ --drawer-width: var(--drawer-width-m);
1180
+ --drawer-height: var(--drawer-height-m);
1181
+ }
1182
+ .drawer.size-l {
1183
+ --drawer-width: var(--drawer-width-l);
1184
+ --drawer-height: var(--drawer-height-l);
1185
+ }
1186
+ .drawer.side-right {
1187
+ top: 0;
1188
+ right: 0;
1189
+ bottom: 0;
1190
+ width: var(--drawer-width);
1191
+ max-width: 100%;
1192
+ --drawer-offset: translateX(100%);
1193
+ }
1194
+ .drawer.side-left {
1195
+ top: 0;
1196
+ left: 0;
1197
+ bottom: 0;
1198
+ width: var(--drawer-width);
1199
+ max-width: 100%;
1200
+ --drawer-offset: translateX(-100%);
1201
+ }
1202
+ .drawer.side-bottom {
1203
+ left: 0;
1204
+ right: 0;
1205
+ bottom: 0;
1206
+ height: var(--drawer-height);
1207
+ max-height: 100%;
1208
+ border-top-left-radius: var(--radius-16);
1209
+ border-top-right-radius: var(--radius-16);
1210
+ --drawer-offset: translateY(100%);
1211
+ }
1212
+ .drawer[data-state='open'] {
1213
+ animation: drawer-slide-in var(--motion-base) var(--motion-ease);
1214
+ }
1215
+ .drawer[data-state='closed'] {
1216
+ animation: drawer-slide-out var(--motion-base) var(--motion-ease);
1217
+ }
1218
+ .drawer-header {
1219
+ display: flex;
1220
+ align-items: center;
1221
+ justify-content: space-between;
1222
+ gap: var(--spacing-12);
1223
+ }
1224
+ .drawer-close {
1225
+ flex-shrink: 0;
1226
+ }
1227
+ .drawer-body {
1228
+ flex: 1;
1229
+ min-height: 0;
1230
+ overflow-y: auto;
1231
+ margin-top: var(--spacing-8);
1232
+ }
1233
+ .drawer-footer {
1234
+ display: flex;
1235
+ justify-content: flex-end;
1236
+ gap: var(--spacing-8);
1237
+ margin-top: var(--spacing-16);
1238
+ }
958
1239
  /* placeholder 로 넘기는 span 의 색. base-drop-down 이 기본 placeholder 에 붙인다. */
959
1240
  .nuri-placeholder {
960
1241
  color: var(--color-grey-scale-400);
@@ -970,11 +1251,36 @@ p {
970
1251
  * drop-down-single *
971
1252
  * *
972
1253
  ***************************************************************************************************/
1254
+ /* 높이·좌우 여백·글자는 버튼·텍스트필드와 같은 단계 */
1255
+ .drop-down-single-trigger.size-xs {
1256
+ height: var(--control-height-xs);
1257
+ padding: 0 var(--spacing-12);
1258
+ font-size: var(--font-size-xsm);
1259
+ line-height: var(--line-height-xsm);
1260
+ }
973
1261
  .drop-down-single-trigger.size-s {
974
1262
  height: var(--control-height-s);
1263
+ padding: 0 var(--spacing-14);
1264
+ font-size: var(--font-size-sm);
1265
+ line-height: var(--line-height-sm);
975
1266
  }
976
1267
  .drop-down-single-trigger.size-m {
977
1268
  height: var(--control-height-m);
1269
+ padding: 0 var(--spacing-16);
1270
+ font-size: var(--font-size-sm);
1271
+ line-height: var(--line-height-sm);
1272
+ }
1273
+ .drop-down-single-trigger.size-l {
1274
+ height: var(--control-height-l);
1275
+ padding: 0 var(--spacing-20);
1276
+ font-size: var(--font-size-base);
1277
+ line-height: var(--line-height-base);
1278
+ }
1279
+ .drop-down-single-trigger.size-xl {
1280
+ height: var(--control-height-xl);
1281
+ padding: 0 var(--spacing-24);
1282
+ font-size: var(--font-size-lg);
1283
+ line-height: var(--line-height-lg);
978
1284
  }
979
1285
  .drop-down-single-trigger {
980
1286
 
@@ -982,7 +1288,6 @@ p {
982
1288
  border-radius: var(--radius-4);
983
1289
  width: -moz-fit-content;
984
1290
  width: fit-content;
985
- padding: 0 var(--spacing-14);
986
1291
  background-color: var(--color-white);
987
1292
  }
988
1293
  .drop-down-single-trigger:focus {
@@ -1010,8 +1315,8 @@ p {
1010
1315
  gap: var(--spacing-10);
1011
1316
  }
1012
1317
  .drop-down-single-value {
1013
- font-size: var(--font-size-sm);
1014
- line-height: var(--line-height-sm);
1318
+ font-size: inherit;
1319
+ line-height: inherit;
1015
1320
  font-weight: var(--font-weight-medium);
1016
1321
 
1017
1322
  text-align: left;
@@ -1496,11 +1801,14 @@ p {
1496
1801
  align-items: center;
1497
1802
  gap: var(--spacing-16);
1498
1803
  }
1499
- /* 기본 스피너(20px)를 확대 */
1804
+ /* 스피너를 레이아웃 크기로 키운다. transform: scale 은 보이는 크기만 키워 아래 글자와 겹친다 */
1500
1805
  .page-loading-indicator {
1501
- transform: scale(3.2);
1502
- transform-origin: center;
1806
+ --spinner-stroke: var(--overlay-spinner-stroke);
1503
1807
  }
1808
+ .page-loading-indicator .base-spinner,.page-loading-indicator .loading-indicator-ring {
1809
+ width: var(--overlay-spinner-size);
1810
+ height: var(--overlay-spinner-size);
1811
+ }
1504
1812
  .page-loading-text {
1505
1813
  position: relative;
1506
1814
  }
@@ -1601,7 +1909,18 @@ p {
1601
1909
  margin-bottom: var(--spacing-20);
1602
1910
  }
1603
1911
  .modal-with-double-button-title {
1604
- margin-bottom: var(--spacing-4);
1912
+ margin: 0 0 var(--spacing-4);
1913
+ font-size: var(--font-size-lg);
1914
+ font-weight: var(--font-weight-bold);
1915
+ text-align: center;
1916
+ color: var(--color-black);
1917
+ }
1918
+ .modal-with-double-button-sub-title {
1919
+ margin: 0;
1920
+ font-size: var(--font-size-sm);
1921
+ font-weight: var(--font-weight-medium);
1922
+ text-align: center;
1923
+ color: var(--color-grey-scale-600);
1605
1924
  }
1606
1925
  .modal-with-double-button-content {
1607
1926
  margin-top: var(--spacing-20);
@@ -1633,6 +1952,147 @@ p {
1633
1952
  .modal-with-double-button-close.column > * {
1634
1953
  width: 100%;
1635
1954
  }
1955
+ /***************************************************************************************************
1956
+ * *
1957
+ * modal *
1958
+ * *
1959
+ ***************************************************************************************************/
1960
+ .modal {
1961
+ align-items: stretch;
1962
+ gap: var(--spacing-20);
1963
+ max-width: calc(100% - var(--spacing-30) * 2);
1964
+ max-height: calc(100% - var(--spacing-30) * 2);
1965
+ overflow: auto;
1966
+ }
1967
+ .modal.size-s {
1968
+ width: var(--modal-width-s);
1969
+ }
1970
+ .modal.size-m {
1971
+ width: var(--modal-width-m);
1972
+ }
1973
+ .modal.size-l {
1974
+ width: var(--modal-width-l);
1975
+ }
1976
+ .modal-header {
1977
+ display: flex;
1978
+ justify-content: space-between;
1979
+ align-items: flex-start;
1980
+ gap: var(--spacing-10);
1981
+ }
1982
+ .modal-title {
1983
+ flex: 1;
1984
+ margin: 0;
1985
+ font-size: var(--font-size-lg);
1986
+ font-weight: var(--font-weight-bold);
1987
+ color: var(--color-black);
1988
+ }
1989
+ .modal-close-icon {
1990
+ flex-shrink: 0;
1991
+ width: var(--icon-size-m);
1992
+ height: var(--icon-size-m);
1993
+ padding: 0;
1994
+ background-color: transparent;
1995
+ color: var(--color-grey-scale-600);
1996
+ }
1997
+ .modal-description {
1998
+ margin: 0;
1999
+ font-size: var(--font-size-sm);
2000
+ font-weight: var(--font-weight-medium);
2001
+ color: var(--color-grey-scale-600);
2002
+ }
2003
+ .modal-body {
2004
+ font-size: var(--font-size-sm);
2005
+ color: var(--color-black);
2006
+ }
2007
+ .modal-footer {
2008
+ display: flex;
2009
+ justify-content: flex-end;
2010
+ align-items: center;
2011
+ gap: var(--spacing-10);
2012
+ }
2013
+ .base-pagination:where(.item) {
2014
+ display: inline-flex;
2015
+ align-items: center;
2016
+ justify-content: center;
2017
+ padding: 0;
2018
+ background-color: transparent;
2019
+ border: none;
2020
+ cursor: var(--cursor-button);
2021
+ }
2022
+ .base-pagination[data-disabled]:where(.item) {
2023
+ cursor: var(--cursor-disabled);
2024
+ }
2025
+ .base-pagination:where(.ellipsis) {
2026
+ display: inline-flex;
2027
+ align-items: center;
2028
+ justify-content: center;
2029
+ -webkit-user-select: none;
2030
+ -moz-user-select: none;
2031
+ user-select: none;
2032
+ }
2033
+ /***************************************************************************************************
2034
+ * *
2035
+ * pagination *
2036
+ * *
2037
+ ***************************************************************************************************/
2038
+ .pagination {
2039
+ display: inline-flex;
2040
+ align-items: center;
2041
+ gap: var(--spacing-4);
2042
+ }
2043
+ .pagination.size-s {
2044
+ --pagination-item-size: var(--control-height-s);
2045
+ --pagination-icon-size: var(--icon-size-s);
2046
+ font-size: var(--font-size-xsm);
2047
+ line-height: var(--line-height-xsm);
2048
+ }
2049
+ .pagination.size-m {
2050
+ --pagination-item-size: var(--control-height-m);
2051
+ --pagination-icon-size: var(--icon-size-m);
2052
+ font-size: var(--font-size-sm);
2053
+ line-height: var(--line-height-sm);
2054
+ }
2055
+ .pagination-item {
2056
+ min-width: var(--pagination-item-size);
2057
+ height: var(--pagination-item-size);
2058
+ padding: 0 var(--spacing-4);
2059
+ border-radius: var(--radius-6);
2060
+ color: var(--color-grey-scale-600);
2061
+ font-size: inherit;
2062
+ line-height: inherit;
2063
+ font-weight: var(--font-weight-medium);
2064
+ transition:
2065
+ background-color var(--motion-fast) var(--motion-ease),
2066
+ color var(--motion-fast) var(--motion-ease);
2067
+ }
2068
+ .pagination-item:not(:disabled):hover {
2069
+ background-color: var(--color-grey-scale-100);
2070
+ color: var(--color-purple-900);
2071
+ }
2072
+ .pagination-item[data-state='active'] {
2073
+ background-color: var(--color-purple-50);
2074
+ color: var(--color-purple-900);
2075
+ font-weight: var(--font-weight-bold);
2076
+ }
2077
+ .pagination-item:disabled {
2078
+ background-color: transparent;
2079
+ color: var(--color-grey-scale-300);
2080
+ }
2081
+ .pagination-ellipsis {
2082
+ min-width: var(--pagination-item-size);
2083
+ height: var(--pagination-item-size);
2084
+ color: var(--color-grey-scale-400);
2085
+ }
2086
+ .pagination-icon {
2087
+ width: var(--pagination-icon-size);
2088
+ height: var(--pagination-icon-size);
2089
+ }
2090
+ .pagination-icon-prev {
2091
+ transform: rotate(90deg);
2092
+ }
2093
+ .pagination-icon-next {
2094
+ transform: rotate(-90deg);
2095
+ }
1636
2096
  .base-radio:where(.button) {
1637
2097
  padding: 0;
1638
2098
  }
@@ -1671,28 +2131,170 @@ p {
1671
2131
  font-weight: var(--font-weight-medium);
1672
2132
  color: var(--color-black);
1673
2133
  }
1674
- .base-table {
1675
- width: -moz-fit-content;
1676
- width: fit-content;
2134
+ /* disabled: 글자·점은 회색, 커서는 비활성. 버튼은 BaseButton 이, 라벨은 RadioLabel 이 data-disabled 를 단다 */
2135
+ .radio.radio-label[data-disabled] {
2136
+ color: var(--color-grey-scale-400);
2137
+ cursor: var(--cursor-disabled);
2138
+ }
2139
+ .radio.radio-button[data-disabled] {
2140
+ cursor: var(--cursor-disabled);
2141
+ background-color: var(--color-grey-scale-100);
2142
+ }
2143
+ .radio.radio-button[data-disabled] .radio-indicator {
2144
+ background-color: var(--color-grey-scale-400);
2145
+ }
2146
+ .base-skeleton {
2147
+ display: block;
2148
+ box-sizing: border-box;
1677
2149
  }
1678
- .base-table .header {
2150
+ /***************************************************************************************************
2151
+ * *
2152
+ * skeleton *
2153
+ * *
2154
+ ***************************************************************************************************/
2155
+ /* 단일 뼈대(text 한 줄·rect·circle)는 루트가, 여러 줄 text 는 각 .skeleton-line 이 뼈대다. */
2156
+ .skeleton {
2157
+ position: relative;
2158
+ overflow: hidden;
2159
+ height: var(--skeleton-text-height);
2160
+ border-radius: var(--radius-4);
2161
+ background-color: var(--color-grey-scale-200);
2162
+ }
2163
+ .skeleton.shape-circle {
2164
+ border-radius: var(--radius-full);
2165
+ aspect-ratio: 1;
2166
+ flex-shrink: 0;
2167
+ }
2168
+ .skeleton.multiline {
1679
2169
  display: flex;
1680
- align-items: center;
1681
- width: 100%;
2170
+ flex-direction: column;
2171
+ gap: var(--spacing-8);
2172
+ height: auto;
2173
+ overflow: visible;
2174
+ background-color: transparent;
1682
2175
  }
1683
- .base-table .body {
1684
- width: 100%;
2176
+ .skeleton-line {
2177
+ position: relative;
2178
+ display: block;
2179
+ overflow: hidden;
2180
+ width: 100%;
2181
+ height: var(--skeleton-text-height);
2182
+ border-radius: var(--radius-4);
2183
+ background-color: var(--color-grey-scale-200);
2184
+ }
2185
+ .skeleton-line:last-child:not(:only-child) {
2186
+ width: var(--skeleton-last-line-width);
1685
2187
  }
1686
- .base-table .row {
1687
- display: flex;
1688
- align-items: center;
1689
- width: 100%;
2188
+ .skeleton.animated:not(.multiline)::after,
2189
+ .skeleton.animated .skeleton-line::after {
2190
+ content: '';
2191
+ position: absolute;
2192
+ inset: 0;
2193
+ background: linear-gradient(
2194
+ 90deg,
2195
+ transparent 0%,
2196
+ var(--color-grey-scale-100) 50%,
2197
+ transparent 100%
2198
+ );
2199
+ transform: translateX(-100%);
2200
+ animation: skeleton-shimmer var(--skeleton-duration) var(--motion-ease) infinite;
2201
+ }
2202
+ @media (prefers-reduced-motion: reduce) {
2203
+ .skeleton.animated:not(.multiline)::after,
2204
+ .skeleton.animated .skeleton-line::after {
2205
+ animation: none;
2206
+ }
2207
+ }
2208
+ @keyframes skeleton-shimmer {
2209
+ 0% {
2210
+ transform: translateX(-100%);
2211
+ }
2212
+ 100% {
2213
+ transform: translateX(100%);
1690
2214
  }
2215
+ }
2216
+ .base-switch:where(.thumb) {
2217
+ display: block;
2218
+ }
2219
+ .base-switch:where(.label) {
2220
+ font-size: var(--font-size-sm);
2221
+ font-weight: var(--font-weight-medium);
2222
+ color: var(--color-black);
2223
+ }
2224
+ /***************************************************************************************************
2225
+ * *
2226
+ * switch *
2227
+ * *
2228
+ ***************************************************************************************************/
2229
+ .switch {
2230
+ display: inline-flex;
2231
+ align-items: center;
2232
+ gap: var(--spacing-10);
2233
+
2234
+ padding: 0;
2235
+ background-color: transparent;
2236
+ border: none;
2237
+ cursor: var(--cursor-button);
2238
+ }
2239
+ .switch[data-disabled] {
2240
+ cursor: var(--cursor-disabled);
2241
+ }
2242
+ .switch-track {
2243
+ position: relative;
2244
+ display: inline-flex;
2245
+ align-items: center;
2246
+ flex-shrink: 0;
2247
+ padding: var(--switch-thumb-inset);
2248
+ border-radius: var(--radius-full);
2249
+ background-color: var(--color-grey-scale-300);
2250
+ transition: background-color var(--motion-fast) var(--motion-ease);
2251
+ }
2252
+ .switch-track.size-s {
2253
+ width: var(--switch-width-s);
2254
+ height: var(--switch-height-s);
2255
+ --switch-travel: calc(var(--switch-width-s) - var(--switch-height-s));
2256
+ }
2257
+ .switch-track.size-m {
2258
+ width: var(--switch-width-m);
2259
+ height: var(--switch-height-m);
2260
+ --switch-travel: calc(var(--switch-width-m) - var(--switch-height-m));
2261
+ }
2262
+ .switch-track.size-l {
2263
+ width: var(--switch-width-l);
2264
+ height: var(--switch-height-l);
2265
+ --switch-travel: calc(var(--switch-width-l) - var(--switch-height-l));
2266
+ }
2267
+ .switch-track[data-disabled] {
2268
+ background-color: var(--color-grey-scale-200);
2269
+ }
2270
+ .switch[data-state='checked'] .switch-track {
2271
+ background-color: var(--color-purple-900);
2272
+ }
2273
+ .switch-thumb {
2274
+ aspect-ratio: 1;
2275
+ height: 100%;
2276
+ border-radius: var(--radius-full);
2277
+ background-color: var(--color-white);
2278
+ transition: transform var(--motion-fast) var(--motion-ease);
2279
+ }
2280
+ .switch-thumb[data-state='checked'] {
2281
+ transform: translateX(var(--switch-travel));
2282
+ }
2283
+ .switch-thumb[data-disabled] {
2284
+ background-color: var(--color-grey-scale-100);
2285
+ }
2286
+ .base-table {
2287
+ /* 진짜 테이블 레이아웃을 쓴다. 행을 flex 로 두면 헤더와 본문의 열 폭이 따로 놀아 고정열 경계가 어긋난다 */
2288
+ width: -moz-fit-content;
2289
+ width: fit-content;
2290
+ border-collapse: collapse;
2291
+ border-spacing: 0;
2292
+ table-layout: auto;
2293
+ }
1691
2294
  .base-table .cell {
2295
+ padding: 0;
1692
2296
  text-align: start;
1693
- display: flex;
1694
- flex-direction: column;
1695
- justify-content: center;
2297
+ vertical-align: middle;
1696
2298
  }
1697
2299
  /***************************************************************************************************
1698
2300
  * *
@@ -1827,13 +2429,82 @@ p {
1827
2429
  background-color: var(--color-purple-50);
1828
2430
  z-index: var(--z-base);
1829
2431
  }
1830
- .base-text-field.input {
2432
+ .base-text-area:where(.textarea) {
2433
+ display: block;
2434
+ width: 100%;
2435
+ margin: 0;
1831
2436
  border: none;
1832
2437
  outline: none;
1833
2438
  background-color: transparent;
2439
+ font-family: inherit;
2440
+ font-weight: var(--font-weight-medium);
2441
+ color: var(--color-black);
2442
+ }
2443
+ .base-text-area:where(.textarea)::-moz-placeholder {
2444
+ color: var(--color-grey-scale-400);
2445
+ }
2446
+ .base-text-area:where(.textarea)::placeholder {
2447
+ color: var(--color-grey-scale-400);
2448
+ }
2449
+ .base-text-area[data-disabled]:where(.textarea) {
2450
+ cursor: var(--cursor-disabled);
2451
+ }
2452
+ /***************************************************************************************************
2453
+ * *
2454
+ * text-area *
2455
+ * *
2456
+ ***************************************************************************************************/
2457
+ .text-area {
2458
+ height: -moz-fit-content;
2459
+ height: fit-content;
2460
+ }
2461
+ .text-area-title {
2462
+ margin-bottom: var(--spacing-8);
2463
+ }
2464
+ /* 높이는 rows 가 정한다. size 는 글자 크기와 안쪽 여백만 바꾼다 */
2465
+ .text-area-input-wrapper {
2466
+ display: flex;
2467
+ box-sizing: border-box;
1834
2468
 
2469
+ border-radius: var(--radius-4);
2470
+ border: var(--hairline) solid var(--color-grey-scale-300);
2471
+ }
2472
+ .text-area-input-wrapper.size-s > textarea {
2473
+ padding: var(--spacing-10) var(--spacing-14);
1835
2474
  font-size: var(--font-size-sm);
1836
2475
  line-height: var(--line-height-sm);
2476
+ }
2477
+ .text-area-input-wrapper.size-m > textarea {
2478
+ padding: var(--spacing-14) var(--spacing-14);
2479
+ font-size: var(--font-size-base);
2480
+ line-height: var(--line-height-base);
2481
+ }
2482
+ .text-area-input-wrapper.resize-none > textarea {
2483
+ resize: none;
2484
+ }
2485
+ .text-area-input-wrapper.resize-vertical > textarea {
2486
+ resize: vertical;
2487
+ }
2488
+ .text-area-input-wrapper:has( > textarea[data-disabled]) {
2489
+ border-color: var(--color-grey-scale-300);
2490
+ background-color: var(--color-grey-scale-100);
2491
+ }
2492
+ .text-area-input-wrapper:focus-within {
2493
+ border: var(--hairline) solid var(--color-purple-900);
2494
+ }
2495
+ .text-area-helper-text {
2496
+ margin-top: var(--spacing-4);
2497
+ }
2498
+ .text-area-helper-text.error {
2499
+ color: var(--color-accent-red-500);
2500
+ }
2501
+ .base-text-field.input {
2502
+ border: none;
2503
+ outline: none;
2504
+ background-color: transparent;
2505
+
2506
+ font-size: inherit;
2507
+ line-height: inherit;
1837
2508
  font-weight: var(--font-weight-medium);
1838
2509
  }
1839
2510
  .base-text-field.input::-moz-placeholder {
@@ -1866,16 +2537,40 @@ p {
1866
2537
  justify-content: space-between;
1867
2538
  gap: var(--spacing-10);
1868
2539
 
1869
- padding: 0 var(--spacing-14);
2540
+ /* 높이는 버튼과 같은 --control-height-* 축, 좌우 여백·글자는 size 마다 버튼과 같은 단계 */
1870
2541
 
1871
2542
  border-radius: var(--radius-4);
1872
2543
  border: var(--hairline) solid var(--color-grey-scale-300);
1873
2544
  }
2545
+ .text-field-input-wrapper.size-xs {
2546
+ height: var(--control-height-xs);
2547
+ padding: 0 var(--spacing-12);
2548
+ font-size: var(--font-size-xsm);
2549
+ line-height: var(--line-height-xsm);
2550
+ }
1874
2551
  .text-field-input-wrapper.size-s {
1875
2552
  height: var(--control-height-s);
2553
+ padding: 0 var(--spacing-14);
2554
+ font-size: var(--font-size-sm);
2555
+ line-height: var(--line-height-sm);
1876
2556
  }
1877
2557
  .text-field-input-wrapper.size-m {
1878
2558
  height: var(--control-height-m);
2559
+ padding: 0 var(--spacing-16);
2560
+ font-size: var(--font-size-sm);
2561
+ line-height: var(--line-height-sm);
2562
+ }
2563
+ .text-field-input-wrapper.size-l {
2564
+ height: var(--control-height-l);
2565
+ padding: 0 var(--spacing-20);
2566
+ font-size: var(--font-size-base);
2567
+ line-height: var(--line-height-base);
2568
+ }
2569
+ .text-field-input-wrapper.size-xl {
2570
+ height: var(--control-height-xl);
2571
+ padding: 0 var(--spacing-24);
2572
+ font-size: var(--font-size-lg);
2573
+ line-height: var(--line-height-lg);
1879
2574
  }
1880
2575
  .text-field-input-wrapper:has( > input[data-disabled='true']) {
1881
2576
  border-color: var(--color-grey-scale-300);
@@ -1893,6 +2588,203 @@ p {
1893
2588
  .text-field-helper-text.error {
1894
2589
  color: var(--color-accent-red-500);
1895
2590
  }
2591
+ /* 조각(title·close 등)도 base-toast 를 달므로 상자 스타일은 루트와 viewport 에만 건다. */
2592
+ .base-toast:where(:not(.viewport, .title, .description, .action, .close)) {
2593
+ position: relative;
2594
+ display: flex;
2595
+ align-items: flex-start;
2596
+ gap: var(--spacing-12);
2597
+ list-style: none;
2598
+ }
2599
+ .base-toast[data-state='open']:where(:not(.viewport,.title,.description,.action,.close)) {
2600
+ animation: toast-in var(--motion-base) var(--motion-ease);
2601
+ }
2602
+ .base-toast[data-state='closed']:where(:not(.viewport,.title,.description,.action,.close)) {
2603
+ animation: toast-out var(--motion-fast) var(--motion-ease) forwards;
2604
+ }
2605
+ .base-toast[data-swipe='move']:where(:not(.viewport,.title,.description,.action,.close)) {
2606
+ transform: translateX(var(--radix-toast-swipe-move-x));
2607
+ }
2608
+ .base-toast[data-swipe='cancel']:where(:not(.viewport,.title,.description,.action,.close)) {
2609
+ transform: translateX(0);
2610
+ transition: transform var(--motion-fast) var(--motion-ease);
2611
+ }
2612
+ .base-toast[data-swipe='end']:where(:not(.viewport,.title,.description,.action,.close)) {
2613
+ animation: toast-swipe-out var(--motion-fast) var(--motion-ease) forwards;
2614
+ }
2615
+ .base-toast:where(.viewport) {
2616
+ position: fixed;
2617
+ z-index: var(--z-toast);
2618
+ display: flex;
2619
+ flex-direction: column;
2620
+ gap: var(--spacing-10);
2621
+ width: var(--toast-width);
2622
+ max-width: 100vw;
2623
+ margin: 0;
2624
+ padding: var(--spacing-24);
2625
+ list-style: none;
2626
+ outline: none;
2627
+ /* 아래에서 올라오는 자리를 기본으로 두고 position 클래스가 덮는다 */
2628
+ --toast-enter: translateY(var(--spacing-16));
2629
+ }
2630
+ .base-toast.position-top-right:where(.viewport) {
2631
+ top: 0;
2632
+ right: 0;
2633
+ --toast-enter: translateY(calc(-1 * var(--spacing-16)));
2634
+ }
2635
+ .base-toast.position-bottom-right:where(.viewport) {
2636
+ right: 0;
2637
+ bottom: 0;
2638
+ }
2639
+ .base-toast.position-bottom-center:where(.viewport) {
2640
+ bottom: 0;
2641
+ left: 50%;
2642
+ transform: translateX(-50%);
2643
+ }
2644
+ .base-toast:where(.title),.base-toast:where(.description) {
2645
+ margin: 0;
2646
+ }
2647
+ .base-toast:where(.action),.base-toast:where(.close) {
2648
+ flex-shrink: 0;
2649
+ padding: 0;
2650
+ border: none;
2651
+ background: transparent;
2652
+ cursor: var(--cursor-button);
2653
+ }
2654
+ @keyframes toast-in {
2655
+ from {
2656
+ opacity: 0;
2657
+ transform: var(--toast-enter);
2658
+ }
2659
+
2660
+ to {
2661
+ opacity: 1;
2662
+ transform: none;
2663
+ }
2664
+ }
2665
+ @keyframes toast-out {
2666
+ from {
2667
+ opacity: 1;
2668
+ }
2669
+
2670
+ to {
2671
+ opacity: 0;
2672
+ }
2673
+ }
2674
+ @keyframes toast-swipe-out {
2675
+ from {
2676
+ transform: translateX(var(--radix-toast-swipe-end-x));
2677
+ }
2678
+
2679
+ to {
2680
+ transform: translateX(calc(100% + var(--spacing-24)));
2681
+ }
2682
+ }
2683
+ @media (prefers-reduced-motion: reduce) {
2684
+ .base-toast:where(:not(.viewport, .title, .description, .action, .close)) {
2685
+ animation: none;
2686
+ }
2687
+ }
2688
+ /***************************************************************************************************
2689
+ * *
2690
+ * toast *
2691
+ * *
2692
+ ***************************************************************************************************/
2693
+ /* Tooltip 과 같은 표면: 진한 바탕에 흰 글자, radius-6. variant 가 바탕색을 정한다(기본 purple-900, success green, warning orange, error red-500 = confirm 버튼) */
2694
+ .toast {
2695
+ align-items: center;
2696
+ padding: var(--spacing-12) var(--spacing-14);
2697
+ border-radius: var(--radius-6);
2698
+ background-color: var(--color-purple-900);
2699
+ color: var(--color-white);
2700
+
2701
+ /* CTAButton secondary 와 같은 연보라. 이 variant 만 글자가 어둡다 */
2702
+ }
2703
+ .toast.variant-secondary {
2704
+ background-color: var(--color-purple-50);
2705
+ color: var(--color-purple-900);
2706
+ }
2707
+ .toast.variant-secondary .toast-title,.toast.variant-secondary .toast-close {
2708
+ color: var(--color-purple-900);
2709
+ }
2710
+ .toast.variant-secondary .toast-description {
2711
+ color: var(--color-purple-700);
2712
+ }
2713
+ .toast.variant-success {
2714
+ background-color: var(--color-accent-green-600);
2715
+ }
2716
+ .toast.variant-success .toast-description {
2717
+ color: var(--color-accent-green-100);
2718
+ }
2719
+ .toast.variant-warning {
2720
+ background-color: var(--color-accent-orange-500);
2721
+ }
2722
+ .toast.variant-warning .toast-description {
2723
+ color: var(--color-accent-orange-100);
2724
+ }
2725
+ .toast.variant-error {
2726
+ background-color: var(--color-accent-red-500);
2727
+ }
2728
+ .toast.variant-error .toast-description {
2729
+ color: var(--color-accent-red-100);
2730
+ }
2731
+ /* success·warning·error 는 앞에 상태 아이콘을 둔다. SVG 에 박힌 색을 글자색으로 맞춘다 */
2732
+ .toast-icon {
2733
+ flex-shrink: 0;
2734
+ width: var(--icon-size-s);
2735
+ height: var(--icon-size-s);
2736
+ }
2737
+ .toast-icon path[stroke] {
2738
+ stroke: currentColor;
2739
+ }
2740
+ .toast-icon path[fill]:not([fill='none']) {
2741
+ fill: currentColor;
2742
+ }
2743
+ .toast-body {
2744
+ display: flex;
2745
+ flex: 1;
2746
+ flex-direction: column;
2747
+ gap: var(--spacing-4);
2748
+ min-width: 0;
2749
+ }
2750
+ .toast-title {
2751
+ font-size: var(--font-size-sm);
2752
+ line-height: var(--line-height-sm);
2753
+ font-weight: var(--font-weight-semibold);
2754
+ color: var(--color-white);
2755
+ word-break: break-word;
2756
+ }
2757
+ .toast-description {
2758
+ font-size: var(--font-size-xsm);
2759
+ line-height: var(--line-height-xsm);
2760
+ font-weight: var(--font-weight-regular);
2761
+ color: var(--color-purple-200);
2762
+ word-break: break-word;
2763
+ }
2764
+ /* action 은 CTAButton(xs·neutral: 흰 바탕, 보라 글자) 이라 모양은 버튼 CSS 가 정한다 */
2765
+ .toast-action {
2766
+ white-space: nowrap;
2767
+ }
2768
+ .toast-close {
2769
+ display: inline-flex;
2770
+ align-items: center;
2771
+ justify-content: center;
2772
+ width: var(--icon-size-s);
2773
+ height: var(--icon-size-s);
2774
+ color: var(--color-white);
2775
+ opacity: 0.7;
2776
+ }
2777
+ .toast-close:hover {
2778
+ opacity: 1;
2779
+ }
2780
+ /* multifly.svg 의 fill 이 회색으로 박혀 있어 글자색을 따르게 한다 */
2781
+ .toast-close svg {
2782
+ width: 100%;
2783
+ height: 100%;
2784
+ }
2785
+ :is(.toast-close svg) path {
2786
+ fill: currentColor;
2787
+ }
1896
2788
  /* Trigger 도 base-tooltip 을 달므로 z-index 는 Content 에만 건다. */
1897
2789
  .base-tooltip:where(.content) {
1898
2790
  z-index: var(--z-tooltip);