@nurihaus/web-design-system 3.0.1 → 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 (175) hide show
  1. package/README.md +104 -5
  2. package/dist/.storybook/story-kit.d.ts +18 -0
  3. package/dist/ai/components.md +1036 -0
  4. package/dist/ai/tokens.md +344 -0
  5. package/dist/avatar.js +336 -0
  6. package/dist/breadcrumb.js +364 -0
  7. package/dist/check-box.js +360 -0
  8. package/dist/chunk-149.js +57 -0
  9. package/dist/chunk-298.js +34 -0
  10. package/dist/chunk-302.js +105 -0
  11. package/dist/chunk-309.js +36 -0
  12. package/dist/chunk-364.js +126 -0
  13. package/dist/chunk-387.js +56 -0
  14. package/dist/chunk-436.js +33 -0
  15. package/dist/chunk-558.js +200 -0
  16. package/dist/chunk-563.js +181 -0
  17. package/dist/chunk-657.js +143 -0
  18. package/dist/chunk-713.js +38 -0
  19. package/dist/chunk-739.js +68 -0
  20. package/dist/chunk-77.js +34 -0
  21. package/dist/chunk-777.js +117 -0
  22. package/dist/chunk-910.js +64 -0
  23. package/dist/chunk-917.js +35 -0
  24. package/dist/chunk-933.js +70 -0
  25. package/dist/chunk-976.js +29 -0
  26. package/dist/collapsible-menu.js +394 -0
  27. package/dist/components/avatar/avatar-props.d.ts +2 -6
  28. package/dist/components/avatar/avatar-type.d.ts +4 -5
  29. package/dist/components/avatar/avatar.d.ts +1 -0
  30. package/dist/components/avatar/avatar.stories.d.ts +17 -1
  31. package/dist/components/badge/badge-props.d.ts +17 -80
  32. package/dist/components/badge/badge-type.d.ts +38 -2
  33. package/dist/components/badge/badge.stories.d.ts +25 -2
  34. package/dist/components/badge/base-badge.d.ts +2 -1
  35. package/dist/components/badge/icon-text-badge.d.ts +3 -21
  36. package/dist/components/badge/icon-text-option-badge.d.ts +2 -15
  37. package/dist/components/badge/option-badge.d.ts +3 -20
  38. package/dist/components/breadcrumb/base-breadcrumb.d.ts +19 -0
  39. package/dist/components/breadcrumb/breadcrumb-props.d.ts +4 -0
  40. package/dist/components/breadcrumb/breadcrumb-type.d.ts +33 -0
  41. package/dist/components/breadcrumb/breadcrumb.d.ts +4 -0
  42. package/dist/components/breadcrumb/breadcrumb.stories.d.ts +25 -0
  43. package/dist/components/button/button-props.d.ts +2 -7
  44. package/dist/components/button/button-type.d.ts +11 -3
  45. package/dist/components/button/button.stories.d.ts +13 -10
  46. package/dist/components/button/cta-button.d.ts +3 -12
  47. package/dist/components/check-box/base-check-box.d.ts +9 -5
  48. package/dist/components/check-box/check-box-props.d.ts +2 -7
  49. package/dist/components/check-box/check-box-type.d.ts +11 -4
  50. package/dist/components/check-box/check-box.d.ts +3 -10
  51. package/dist/components/check-box/check-box.stories.d.ts +19 -4
  52. package/dist/components/collapsible-menu/base-collapsible-menu.d.ts +9 -5
  53. package/dist/components/collapsible-menu/collapsible-menu-props.d.ts +3 -12
  54. package/dist/components/collapsible-menu/collapsible-menu-type.d.ts +33 -9
  55. package/dist/components/collapsible-menu/collapsible-menu.d.ts +3 -23
  56. package/dist/components/collapsible-menu/collapsible-menu.stories.d.ts +20 -4
  57. package/dist/components/drawer/base-drawer.d.ts +15 -0
  58. package/dist/components/drawer/drawer-props.d.ts +11 -0
  59. package/dist/components/drawer/drawer-type.d.ts +28 -0
  60. package/dist/components/drawer/drawer.d.ts +4 -0
  61. package/dist/components/drawer/drawer.stories.d.ts +34 -0
  62. package/dist/components/drop-down/base-drop-down.d.ts +11 -3
  63. package/dist/components/drop-down/drop-down-props.d.ts +3 -12
  64. package/dist/components/drop-down/drop-down-type.d.ts +34 -15
  65. package/dist/components/drop-down/drop-down.d.ts +3 -32
  66. package/dist/components/drop-down/drop-down.stories.d.ts +23 -4
  67. package/dist/components/elements/text/base-text.d.ts +3 -0
  68. package/dist/components/elements/text/text-props.d.ts +16 -0
  69. package/dist/components/elements/text/text-type.d.ts +6 -2
  70. package/dist/components/elements/text/text.d.ts +2 -1
  71. package/dist/components/elements/text/text.stories.d.ts +43 -3
  72. package/dist/components/loading/index.d.ts +6 -6
  73. package/dist/components/loading/inline-loading/base-inline-loading.d.ts +3 -0
  74. package/dist/components/loading/inline-loading/inline-loading-props.d.ts +9 -0
  75. package/dist/components/loading/inline-loading/inline-loading-type.d.ts +8 -6
  76. package/dist/components/loading/inline-loading/inline-loading.d.ts +3 -2
  77. package/dist/components/loading/inline-loading/inline-loading.stories.d.ts +5 -9
  78. package/dist/components/loading/overlay-loading/base-overlay-loading.d.ts +3 -0
  79. package/dist/components/loading/overlay-loading/overlay-loading-props.d.ts +7 -0
  80. package/dist/components/loading/overlay-loading/overlay-loading-type.d.ts +6 -3
  81. package/dist/components/loading/overlay-loading/overlay-loading.d.ts +3 -3
  82. package/dist/components/loading/overlay-loading/overlay-loading.stories.d.ts +8 -8
  83. package/dist/components/loading/spinner/base-spinner.d.ts +4 -0
  84. package/dist/components/loading/spinner/spinner-props.d.ts +1 -0
  85. package/dist/components/loading/spinner/spinner-type.d.ts +4 -4
  86. package/dist/components/loading/spinner/spinner.d.ts +2 -2
  87. package/dist/components/loading/spinner/spinner.stories.d.ts +5 -12
  88. package/dist/components/modal/base-modal.d.ts +21 -6
  89. package/dist/components/modal/modal-props.d.ts +5 -7
  90. package/dist/components/modal/modal-type.d.ts +34 -10
  91. package/dist/components/modal/modal-with-double-button.d.ts +4 -16
  92. package/dist/components/modal/modal-with-double-button.stories.d.ts +22 -0
  93. package/dist/components/modal/modal.d.ts +4 -0
  94. package/dist/components/modal/modal.stories.d.ts +22 -4
  95. package/dist/components/pagination/base-pagination.d.ts +9 -0
  96. package/dist/components/pagination/pagination-props.d.ts +4 -0
  97. package/dist/components/pagination/pagination-type.d.ts +20 -0
  98. package/dist/components/pagination/pagination.d.ts +4 -0
  99. package/dist/components/pagination/pagination.stories.d.ts +25 -0
  100. package/dist/components/radio/base-radio.d.ts +9 -5
  101. package/dist/components/radio/radio-props.d.ts +1 -0
  102. package/dist/components/radio/radio-type.d.ts +6 -8
  103. package/dist/components/radio/radio.d.ts +2 -2
  104. package/dist/components/radio/radio.stories.d.ts +13 -4
  105. package/dist/components/skeleton/base-skeleton.d.ts +4 -0
  106. package/dist/components/skeleton/skeleton-props.d.ts +15 -0
  107. package/dist/components/skeleton/skeleton-type.d.ts +12 -0
  108. package/dist/components/skeleton/skeleton.d.ts +4 -0
  109. package/dist/components/skeleton/skeleton.stories.d.ts +327 -0
  110. package/dist/components/switch/base-switch.d.ts +11 -0
  111. package/dist/components/switch/switch-props.d.ts +4 -0
  112. package/dist/components/switch/switch-type.d.ts +19 -0
  113. package/dist/components/switch/switch.d.ts +4 -0
  114. package/dist/components/switch/switch.stories.d.ts +24 -0
  115. package/dist/components/table/base-table.d.ts +4 -5
  116. package/dist/components/table/data-table.d.ts +5 -22
  117. package/dist/components/table/table-type.d.ts +22 -1
  118. package/dist/components/table/table.stories.d.ts +19 -3
  119. package/dist/components/tabs/base-tabs.d.ts +7 -7
  120. package/dist/components/tabs/tabs-props.d.ts +1 -1
  121. package/dist/components/tabs/tabs-type.d.ts +9 -13
  122. package/dist/components/tabs/tabs.d.ts +3 -3
  123. package/dist/components/tabs/tabs.stories.d.ts +16 -10
  124. package/dist/components/text-area/base-text-area.d.ts +10 -0
  125. package/dist/components/text-area/text-area-props.d.ts +12 -0
  126. package/dist/components/text-area/text-area-type.d.ts +34 -0
  127. package/dist/components/text-area/text-area.d.ts +4 -0
  128. package/dist/components/text-area/text-area.stories.d.ts +32 -0
  129. package/dist/components/text-field/base-text-field.d.ts +5 -3
  130. package/dist/components/text-field/text-field-props.d.ts +3 -12
  131. package/dist/components/text-field/text-field-type.d.ts +14 -0
  132. package/dist/components/text-field/text-field.d.ts +3 -16
  133. package/dist/components/text-field/text-field.stories.d.ts +24 -0
  134. package/dist/components/toast/base-toast.d.ts +20 -0
  135. package/dist/components/toast/toast-props.d.ts +18 -0
  136. package/dist/components/toast/toast-type.d.ts +45 -0
  137. package/dist/components/toast/toast.d.ts +5 -0
  138. package/dist/components/toast/toast.stories.d.ts +310 -0
  139. package/dist/components/tooltip/base-tooltip.d.ts +13 -3
  140. package/dist/components/tooltip/tooltip-props.d.ts +3 -2
  141. package/dist/components/tooltip/tooltip-type.d.ts +17 -5
  142. package/dist/components/tooltip/tooltip.d.ts +4 -7
  143. package/dist/components/tooltip/tooltip.stories.d.ts +21 -4
  144. package/dist/components.css +3017 -0
  145. package/dist/cta-button.js +237 -0
  146. package/dist/data-table.js +386 -0
  147. package/dist/drawer.js +390 -0
  148. package/dist/drop-down.js +419 -0
  149. package/dist/helpers/hooks/useExternalState.d.ts +5 -0
  150. package/dist/helpers/props/common-props.d.ts +7 -0
  151. package/dist/helpers/types/common-props.d.ts +8 -0
  152. package/dist/icon-text-badge.js +294 -0
  153. package/dist/icon-text-option-badge.js +270 -0
  154. package/dist/index.d.ts +33 -1
  155. package/dist/index.js +4179 -10180
  156. package/dist/loading.js +383 -0
  157. package/dist/modal-with-double-button.js +332 -0
  158. package/dist/modal.js +288 -0
  159. package/dist/option-badge.js +293 -0
  160. package/dist/pagination.js +412 -0
  161. package/dist/radio.js +363 -0
  162. package/dist/reset.css +45 -0
  163. package/dist/skeleton.js +331 -0
  164. package/dist/styles.css +1386 -248
  165. package/dist/switch.js +349 -0
  166. package/dist/tabs.js +421 -0
  167. package/dist/text-area.js +374 -0
  168. package/dist/text-field.js +369 -0
  169. package/dist/text.js +233 -0
  170. package/dist/toast.js +496 -0
  171. package/dist/tokens.css +100 -0
  172. package/dist/tokens.js +4 -6
  173. package/dist/tooltip.js +360 -0
  174. package/package.json +123 -14
  175. package/dist/components/text-field/text-filed.stories.d.ts +0 -8
@@ -0,0 +1,3017 @@
1
+ /* 유틸리티 + 컴포넌트 스타일. 토큰·글꼴·리셋은 없다.
2
+ 글꼴을 앱이 직접 관리할 때 tokens.css 와 함께 가져온다. 컴포넌트 글자는 앱의 글꼴을 물려받는다. */
3
+
4
+ /* 컴포넌트 글자는 앱의 글꼴을 물려받는다. <button> 처럼 브라우저가 글꼴을 따로 주는 요소도 포함한다.
5
+ :where 로 우선순위를 0 으로 둔다. styles.css 에서는 token/font-face.css 의 .nuri-theme 글꼴이 이긴다. */
6
+
7
+ :where(.nuri-theme) {
8
+ font-family: inherit;
9
+ }
10
+
11
+ /* Utility */
12
+
13
+ .nuri-display-flex {
14
+ display: flex;
15
+ }
16
+
17
+ .nuri-display-inline-flex {
18
+ display: inline-flex;
19
+ }
20
+
21
+ .nuri-display-block {
22
+ display: block;
23
+ }
24
+
25
+ .nuri-display-inline-block {
26
+ display: inline-block;
27
+ }
28
+
29
+ .nuri-display-grid {
30
+ display: grid;
31
+ }
32
+
33
+ .nuri-display-inline-grid {
34
+ display: inline-grid;
35
+ }
36
+
37
+ .nuri-display-contents {
38
+ display: contents;
39
+ }
40
+
41
+ .nuri-display-none {
42
+ display: none;
43
+ }
44
+
45
+ .nuri-position-static {
46
+ position: static;
47
+ }
48
+
49
+ .nuri-position-relative {
50
+ position: relative;
51
+ }
52
+
53
+ .nuri-position-absolute {
54
+ position: absolute;
55
+ }
56
+
57
+ .nuri-position-fixed {
58
+ position: fixed;
59
+ }
60
+
61
+ .nuri-position-sticky {
62
+ position: sticky;
63
+ }
64
+
65
+ .nuri-flex-row {
66
+ flex-direction: row;
67
+ }
68
+
69
+ .nuri-flex-row-reverse {
70
+ flex-direction: row-reverse;
71
+ }
72
+
73
+ .nuri-flex-column {
74
+ flex-direction: column;
75
+ }
76
+
77
+ .nuri-flex-column-reverse {
78
+ flex-direction: column-reverse;
79
+ }
80
+
81
+ .nuri-ai-start {
82
+ align-items: flex-start;
83
+ }
84
+
85
+ .nuri-ai-center {
86
+ align-items: center;
87
+ }
88
+
89
+ .nuri-ai-end {
90
+ align-items: flex-end;
91
+ }
92
+
93
+ .nuri-ai-stretch {
94
+ align-items: stretch;
95
+ }
96
+
97
+ .nuri-ai-baseline {
98
+ align-items: baseline;
99
+ }
100
+
101
+ .nuri-justify-content-start {
102
+ justify-content: flex-start;
103
+ }
104
+
105
+ .nuri-justify-content-center {
106
+ justify-content: center;
107
+ }
108
+
109
+ .nuri-justify-content-end {
110
+ justify-content: flex-end;
111
+ }
112
+
113
+ .nuri-justify-content-between {
114
+ justify-content: space-between;
115
+ }
116
+
117
+ .nuri-justify-content-around {
118
+ justify-content: space-around;
119
+ }
120
+
121
+ .nuri-justify-content-evenly {
122
+ justify-content: space-evenly;
123
+ }
124
+
125
+ .nuri-overflow-visible {
126
+ overflow: visible;
127
+ }
128
+
129
+ .nuri-overflow-hidden {
130
+ overflow: hidden;
131
+ }
132
+
133
+ .nuri-overflow-scroll {
134
+ overflow: scroll;
135
+ }
136
+
137
+ .nuri-overflow-auto {
138
+ overflow: auto;
139
+ }
140
+
141
+ .nuri-overflow-x-visible {
142
+ overflow-x: visible;
143
+ }
144
+
145
+ .nuri-overflow-x-hidden {
146
+ overflow-x: hidden;
147
+ }
148
+
149
+ .nuri-overflow-x-scroll {
150
+ overflow-x: scroll;
151
+ }
152
+
153
+ .nuri-overflow-x-auto {
154
+ overflow-x: auto;
155
+ }
156
+
157
+ .nuri-overflow-y-visible {
158
+ overflow-y: visible;
159
+ }
160
+
161
+ .nuri-overflow-y-hidden {
162
+ overflow-y: hidden;
163
+ }
164
+
165
+ .nuri-overflow-y-scroll {
166
+ overflow-y: scroll;
167
+ }
168
+
169
+ .nuri-overflow-y-auto {
170
+ overflow-y: auto;
171
+ }
172
+
173
+ /* Component */
174
+
175
+ .base-avatar {
176
+ border-radius: 50%;
177
+ width: -moz-fit-content;
178
+ width: fit-content;
179
+ height: -moz-fit-content;
180
+ height: fit-content;
181
+ overflow: hidden;
182
+ }
183
+
184
+ .base-avatar.avatar-image {
185
+ width: 100%;
186
+ height: 100%;
187
+ -o-object-fit: cover;
188
+ object-fit: cover;
189
+ }
190
+
191
+ .base-avatar .avatar-fallback {
192
+ display: block;
193
+ width: 100%;
194
+ height: 100%;
195
+ }
196
+
197
+ :is(.base-avatar .avatar-fallback) svg {
198
+ width: 100%;
199
+ height: 100%;
200
+ }
201
+
202
+ /***************************************************************************************************
203
+ * *
204
+ * avatar *
205
+ * *
206
+ ***************************************************************************************************/
207
+
208
+ .avatar-wrapper {
209
+ position: relative;
210
+ display: inline-block;
211
+ }
212
+
213
+ .avatar {
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: center;
217
+ }
218
+
219
+ .avatar.size-xl {
220
+ width: var(--avatar-size-xl);
221
+ height: var(--avatar-size-xl);
222
+ border: var(--hairline) solid var(--color-grey-scale-200);
223
+ }
224
+
225
+ .avatar.size-l {
226
+ width: var(--avatar-size-l);
227
+ height: var(--avatar-size-l);
228
+ border: var(--hairline) solid var(--color-grey-scale-200);
229
+ }
230
+
231
+ .avatar.size-m {
232
+ width: var(--avatar-size-m);
233
+ height: var(--avatar-size-m);
234
+ border: var(--hairline) solid var(--color-grey-scale-200);
235
+ }
236
+
237
+ .avatar.size-s {
238
+ width: var(--avatar-size-s);
239
+ height: var(--avatar-size-s);
240
+ border: var(--hairline) solid var(--color-grey-scale-200);
241
+ }
242
+
243
+ .avatar-badge {
244
+ position: absolute;
245
+ right: 0;
246
+ bottom: 0;
247
+ display: flex;
248
+ align-items: center;
249
+ justify-content: center;
250
+ gap: var(--spacing-4);
251
+ border-radius: var(--radius-full);
252
+ border: var(--hairline) solid var(--color-grey-scale-200);
253
+ }
254
+
255
+ .avatar-badge.size-xl {
256
+ width: var(--avatar-badge-size-xl);
257
+ height: var(--avatar-badge-size-xl);
258
+ }
259
+
260
+ .avatar-badge.size-l {
261
+ width: var(--avatar-badge-size-l);
262
+ height: var(--avatar-badge-size-l);
263
+ }
264
+
265
+ .avatar-badge.size-m {
266
+ width: var(--avatar-badge-size-m);
267
+ height: var(--avatar-badge-size-m);
268
+ }
269
+
270
+ .avatar-badge.size-s {
271
+ width: var(--avatar-badge-size-s);
272
+ height: var(--avatar-badge-size-s);
273
+ }
274
+
275
+ .base-badge {
276
+ position: relative;
277
+ display: flex;
278
+ align-items: center;
279
+ gap: var(--spacing-4);
280
+ border-radius: var(--radius-full);
281
+ }
282
+
283
+ .base-badge.size-xl {
284
+ height: var(--label-height-xl);
285
+
286
+ font-size: var(--font-size-sm);
287
+ line-height: var(--line-height-sm);
288
+ font-weight: var(--font-weight-semibold);
289
+ }
290
+
291
+ .base-badge.size-l {
292
+ height: var(--label-height-l);
293
+
294
+ font-size: var(--font-size-sm);
295
+ line-height: var(--line-height-sm);
296
+ font-weight: var(--font-weight-semibold);
297
+ }
298
+
299
+ .base-badge.size-m {
300
+ height: var(--label-height-m);
301
+
302
+ font-size: var(--font-size-sm);
303
+ line-height: var(--line-height-sm);
304
+ font-weight: var(--font-weight-semibold);
305
+ }
306
+
307
+ .base-badge.size-s {
308
+ height: var(--label-height-s);
309
+
310
+ font-size: var(--font-size-sm);
311
+ line-height: var(--line-height-sm);
312
+ font-weight: var(--font-weight-bold);
313
+ }
314
+
315
+ .base-badge.size-xs {
316
+ height: var(--label-height-xs);
317
+
318
+ font-size: var(--font-size-xsm);
319
+ line-height: var(--line-height-xsm);
320
+ font-weight: var(--font-weight-bold);
321
+ }
322
+
323
+ .base-badge.icon-text-option {
324
+ display: flex;
325
+ align-items: center;
326
+ justify-content: space-between;
327
+
328
+ padding: 0 var(--spacing-20);
329
+ }
330
+
331
+ /***************************************************************************************************
332
+ * *
333
+ * option-badge *
334
+ * *
335
+ ***************************************************************************************************/
336
+
337
+ .option {
338
+ display: flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+
342
+ border-width: var(--hairline);
343
+ border-style: solid;
344
+ }
345
+
346
+ /***************************************************************************************************
347
+ * *
348
+ * option-badge *
349
+ * *
350
+ ***************************************************************************************************/
351
+
352
+ .icon-text {
353
+ display: flex;
354
+ align-items: center;
355
+ justify-content: center;
356
+ gap: var(--spacing-4);
357
+
358
+ border-width: var(--hairline);
359
+ border-style: solid;
360
+ }
361
+
362
+ /***************************************************************************************************
363
+ * *
364
+ * icon-text-option-badge *
365
+ * *
366
+ ***************************************************************************************************/
367
+
368
+ .icon-text-option {
369
+ display: flex;
370
+ align-items: center;
371
+ justify-content: space-between;
372
+
373
+ padding: 0 var(--spacing-20);
374
+ }
375
+
376
+ .icon-text-option > span {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: var(--spacing-4);
380
+ }
381
+
382
+ /***************************************************************************************************
383
+ * *
384
+ * variant *
385
+ * *
386
+ ***************************************************************************************************/
387
+
388
+ .variant-neutral:is(.option,.icon-text,.icon-text-option) {
389
+ color: var(--color-black);
390
+ background-color: var(--color-white);
391
+ border-color: transparent;
392
+ }
393
+
394
+ .variant-primary:is(.option,.icon-text,.icon-text-option) {
395
+ color: var(--color-purple-900);
396
+ background-color: var(--color-purple-50);
397
+ border-color: transparent;
398
+ }
399
+
400
+ .variant-danger:is(.option,.icon-text,.icon-text-option) {
401
+ color: var(--color-accent-red-700);
402
+ background-color: var(--color-accent-red-50);
403
+ border-color: transparent;
404
+ }
405
+
406
+ /* icon-text-option 은 테두리가 없는 모양이라 두께·스타일까지 여기서 준다. */
407
+
408
+ .variant-outlined:is(.option,.icon-text,.icon-text-option) {
409
+ color: var(--color-black);
410
+ background-color: var(--color-white);
411
+ border: var(--hairline) solid var(--color-grey-scale-300);
412
+ }
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
+
517
+ .base-button {
518
+ display: flex;
519
+ justify-content: center;
520
+ align-items: center;
521
+ gap: var(--spacing-10);
522
+ border-radius: var(--radius-6);
523
+ border: none;
524
+ cursor: pointer;
525
+ }
526
+
527
+ .base-button:focus-visible {
528
+ outline: none;
529
+ box-shadow: none;
530
+ }
531
+
532
+ /***************************************************************************************************
533
+ * *
534
+ * cta-button *
535
+ * *
536
+ ***************************************************************************************************/
537
+
538
+ .cta-button {
539
+ border-radius: var(--radius-6);
540
+ /* 좌우 여백은 size 가 정한다. 글자 길이와 상관없이 양쪽에 같은 여백이 남는다 */
541
+ }
542
+
543
+ .cta-button.variant-primary {
544
+ background-color: var(--color-purple-900);
545
+ border: var(--hairline) solid var(--color-purple-900);
546
+ color: var(--color-white);
547
+ }
548
+
549
+ .cta-button.variant-primary:not(:disabled):hover {
550
+ background-color: var(--color-purple-900);
551
+ border-color: var(--color-purple-900);
552
+ color: var(--color-white);
553
+ }
554
+
555
+ .cta-button.variant-secondary {
556
+ background-color: var(--color-purple-50);
557
+ color: var(--color-purple-900);
558
+ }
559
+
560
+ .cta-button.variant-secondary:not(:disabled):hover {
561
+ background-color: var(--color-purple-100);
562
+ border-color: var(--color-purple-100);
563
+ color: var(--color-purple-900);
564
+ }
565
+
566
+ .cta-button.variant-ghost {
567
+ background-color: var(--color-white);
568
+ border: var(--hairline) solid var(--color-grey-scale-300);
569
+ color: var(--color-purple-900);
570
+ }
571
+
572
+ .cta-button.variant-ghost:not(:disabled):hover {
573
+ background-color: var(--color-white);
574
+ border-color: var(--color-purple-900);
575
+ color: var(--color-purple-900);
576
+ }
577
+
578
+ .cta-button.variant-neutral {
579
+ background-color: var(--color-white);
580
+ color: var(--color-purple-900);
581
+ }
582
+
583
+ .cta-button.variant-neutral:not(:disabled):hover {
584
+ background-color: var(--color-grey-scale-100);
585
+ border: var(--hairline) solid var(--color-grey-scale-100);
586
+ color: var(--color-purple-900);
587
+ }
588
+
589
+ .cta-button.variant-confirm {
590
+ background-color: var(--color-accent-red-500);
591
+ border: var(--hairline) solid var(--color-accent-red-500);
592
+ color: var(--color-white);
593
+ }
594
+
595
+ .cta-button.variant-confirm:not(:disabled):hover {
596
+ background-color: var(--color-accent-red-700);
597
+ border-color: var(--color-accent-red-700);
598
+ color: var(--color-white);
599
+ }
600
+
601
+ .cta-button.variant-outlined {
602
+ background-color: var(--color-white);
603
+ border: var(--hairline) solid var(--color-accent-red-700);
604
+ color: var(--color-accent-red-700);
605
+ }
606
+
607
+ .cta-button.size-xl {
608
+ height: var(--control-height-xl);
609
+ padding: 0 var(--spacing-24);
610
+
611
+ font-size: var(--font-size-lg);
612
+ line-height: var(--line-height-lg);
613
+ font-weight: var(--font-weight-bold);
614
+ }
615
+
616
+ .cta-button.size-l {
617
+ height: var(--control-height-l);
618
+ padding: 0 var(--spacing-20);
619
+
620
+ font-size: var(--font-size-base);
621
+ line-height: var(--line-height-base);
622
+ font-weight: var(--font-weight-bold);
623
+ }
624
+
625
+ .cta-button.size-m {
626
+ height: var(--control-height-m);
627
+ padding: 0 var(--spacing-16);
628
+
629
+ font-size: var(--font-size-sm);
630
+ line-height: var(--line-height-sm);
631
+ font-weight: var(--font-weight-semibold);
632
+ }
633
+
634
+ .cta-button.size-s {
635
+ height: var(--control-height-s);
636
+ padding: 0 var(--spacing-14);
637
+
638
+ font-size: var(--font-size-xsm);
639
+ line-height: var(--line-height-xsm);
640
+ font-weight: var(--font-weight-semibold);
641
+ }
642
+
643
+ .cta-button.size-xs {
644
+ height: var(--control-height-xs);
645
+ padding: 0 var(--spacing-12);
646
+
647
+ font-size: var(--font-size-xsm);
648
+ line-height: var(--line-height-xsm);
649
+ font-weight: var(--font-weight-semibold);
650
+ }
651
+
652
+ .cta-button:disabled {
653
+ background-color: var(--color-grey-scale-200);
654
+ color: var(--color-white);
655
+ cursor: not-allowed;
656
+ border: none;
657
+ }
658
+
659
+ .base-check-box.label {
660
+ font-size: var(--font-size-sm);
661
+ font-weight: var(--font-weight-medium);
662
+ color: var(--color-black);
663
+ }
664
+
665
+ /***************************************************************************************************
666
+ * *
667
+ * check-box *
668
+ * *
669
+ ***************************************************************************************************/
670
+
671
+ .check-box {
672
+ display: flex;
673
+ align-items: center;
674
+ gap: var(--spacing-10);
675
+
676
+ background-color: transparent;
677
+ border: none;
678
+ }
679
+
680
+ .check-box-indicator.wrapper {
681
+ display: flex;
682
+ align-items: center;
683
+ justify-content: center;
684
+ border-radius: var(--radius-4);
685
+ border: var(--checkbox-border) solid var(--color-purple-900);
686
+ }
687
+
688
+ .check-box-indicator {
689
+
690
+ width: 100%;
691
+ height: 100%;
692
+
693
+ /* 체크 아이콘(16px 고정)을 칸 정가운데에 둔다. 빌드된 SVG 에 viewBox 가 없어 늘리면 그림이 왼쪽 위에 남는다 */
694
+ }
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
+
707
+ .check-box-indicator.size-l {
708
+ width: var(--checkbox-size-l);
709
+ height: var(--checkbox-size-l);
710
+ }
711
+
712
+ .check-box-indicator.size-m {
713
+ width: var(--checkbox-size-m);
714
+ height: var(--checkbox-size-m);
715
+ }
716
+
717
+ .check-box-indicator.size-s {
718
+ width: var(--checkbox-size-s);
719
+ height: var(--checkbox-size-s);
720
+ }
721
+
722
+ .check-box-indicator[data-state='unchecked'] {
723
+ background-color: var(--color-white);
724
+ }
725
+
726
+ .check-box-indicator[data-state='checked'] {
727
+ background-color: var(--color-purple-900);
728
+ }
729
+
730
+ .check-box-indicator[data-disabled='true'] {
731
+ border: none;
732
+ border-radius: var(--radius-4);
733
+ background-color: var(--color-grey-scale-300);
734
+ }
735
+
736
+ .base-collapsible-menu.trigger {
737
+ display: flex;
738
+ align-items: center;
739
+ justify-content: space-between;
740
+ gap: var(--spacing-10);
741
+ width: 100%;
742
+ }
743
+
744
+ /***************************************************************************************************
745
+ * *
746
+ * collapsible-menu *
747
+ * *
748
+ ***************************************************************************************************/
749
+
750
+ .collapsible-menu {
751
+ display: flex;
752
+ flex-direction: column;
753
+ gap: var(--spacing-4);
754
+ }
755
+
756
+ .collapsible-menu.size-s .collapsible-menu-row {
757
+ height: var(--menu-row-height-s);
758
+ }
759
+
760
+ .collapsible-menu.size-m .collapsible-menu-row {
761
+ height: var(--menu-row-height-m);
762
+ }
763
+
764
+ .collapsible-menu-row {
765
+ all: unset;
766
+ box-sizing: border-box;
767
+ display: flex;
768
+ align-items: center;
769
+ justify-content: space-between;
770
+ gap: var(--spacing-10);
771
+
772
+ width: 100%;
773
+ padding: 0 var(--spacing-12);
774
+ /* figma 토큰에 --radius-8 없음. 디자이너 확인 전까지 숫자 유지 */
775
+ border-radius: 8px; /* raw-px */
776
+ cursor: pointer;
777
+
778
+ font-size: var(--font-size-sm);
779
+ line-height: var(--line-height-sm);
780
+ font-weight: var(--font-weight-medium);
781
+ color: var(--collapsible-menu-text-color, var(--color-grey-scale-700));
782
+ }
783
+
784
+ .collapsible-menu-row:hover {
785
+ background-color: var(--collapsible-menu-hover-bg-color, var(--color-grey-scale-100));
786
+ }
787
+
788
+ .collapsible-menu-row.is-active {
789
+ background-color: var(--collapsible-menu-active-bg-color, var(--color-grey-scale-100));
790
+ color: var(--collapsible-menu-active-text-color, var(--color-purple-800));
791
+ font-weight: var(--collapsible-menu-active-font-weight, 600);
792
+ }
793
+
794
+ .collapsible-menu-row:disabled,.collapsible-menu-row[aria-disabled='true'] {
795
+ cursor: not-allowed;
796
+ color: var(--collapsible-menu-disabled-text-color, var(--color-grey-scale-400));
797
+ }
798
+
799
+ .collapsible-menu-left {
800
+ display: inline-flex;
801
+ align-items: center;
802
+ gap: var(--spacing-10);
803
+ min-width: 0;
804
+ }
805
+
806
+ .collapsible-menu-left > * {
807
+ min-width: 0;
808
+ }
809
+
810
+ .collapsible-menu-chevron {
811
+ width: var(--icon-size-s);
812
+ height: var(--icon-size-s);
813
+ color: var(--color-grey-scale-500);
814
+ transition: transform var(--motion-fast) var(--motion-ease);
815
+ }
816
+
817
+ .base-collapsible-menu.trigger[data-state='open'] .collapsible-menu-chevron {
818
+ transform: rotate(180deg);
819
+ }
820
+
821
+ .collapsible-menu-content {
822
+ display: flex;
823
+ flex-direction: column;
824
+ gap: var(--spacing-2);
825
+ margin-top: var(--spacing-2);
826
+ margin-bottom: var(--spacing-4);
827
+ }
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
+
1008
+ /* placeholder 로 넘기는 span 의 색. base-drop-down 이 기본 placeholder 에 붙인다. */
1009
+
1010
+ .nuri-placeholder {
1011
+ color: var(--color-grey-scale-400);
1012
+ }
1013
+
1014
+ .base-drop-down.trigger {
1015
+ display: flex;
1016
+ align-items: center;
1017
+ justify-content: space-between;
1018
+ gap: var(--spacing-10);
1019
+ }
1020
+
1021
+ /***************************************************************************************************
1022
+ * *
1023
+ * drop-down-single *
1024
+ * *
1025
+ ***************************************************************************************************/
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
+
1036
+ .drop-down-single-trigger.size-s {
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);
1041
+ }
1042
+
1043
+ .drop-down-single-trigger.size-m {
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);
1062
+ }
1063
+
1064
+ .drop-down-single-trigger {
1065
+
1066
+ border: var(--hairline) solid var(--color-grey-scale-300);
1067
+ border-radius: var(--radius-4);
1068
+ width: -moz-fit-content;
1069
+ width: fit-content;
1070
+ background-color: var(--color-white);
1071
+ }
1072
+
1073
+ .drop-down-single-trigger:focus {
1074
+ border-color: var(--color-purple-900);
1075
+ }
1076
+
1077
+ .drop-down-single-trigger[data-placeholder] .drop-down-single-icon {
1078
+ color: var(--color-grey-scale-400);
1079
+ }
1080
+
1081
+ .drop-down-single-trigger[data-placeholder] svg {
1082
+ color: var(--color-grey-scale-400);
1083
+ }
1084
+
1085
+ .drop-down-single-trigger:not([data-placeholder]) .drop-down-single-icon {
1086
+ color: var(--color-black);
1087
+ }
1088
+
1089
+ .drop-down-single-trigger:not([data-placeholder]) svg {
1090
+ color: var(--color-black);
1091
+ }
1092
+
1093
+ .drop-down-single-trigger[data-state='open'] .rotate {
1094
+ transform: rotate(180deg);
1095
+ transform-origin: 50% 50%;
1096
+ transition: transform var(--motion-fast) var(--motion-ease);
1097
+ will-change: transform;
1098
+ }
1099
+
1100
+ .drop-down-single-label {
1101
+ gap: var(--spacing-10);
1102
+ }
1103
+
1104
+ .drop-down-single-value {
1105
+ font-size: inherit;
1106
+ line-height: inherit;
1107
+ font-weight: var(--font-weight-medium);
1108
+
1109
+ text-align: left;
1110
+ }
1111
+
1112
+ .drop-down-single-value ::-moz-placeholder {
1113
+ color: var(--color-grey-scale-400);
1114
+ }
1115
+
1116
+ .drop-down-single-value ::placeholder {
1117
+ color: var(--color-grey-scale-400);
1118
+ }
1119
+
1120
+ .drop-down-single-content {
1121
+ z-index: var(--z-popover);
1122
+ min-width: var(--radix-select-trigger-width);
1123
+ overflow: hidden;
1124
+ box-shadow: var(--shadow-popover);
1125
+ border-radius: var(--radius-6);
1126
+ }
1127
+
1128
+ .drop-down-single-item {
1129
+ padding: var(--spacing-14);
1130
+ background-color: var(--color-white);
1131
+ outline: none;
1132
+ height: var(--drop-down-item-height);
1133
+
1134
+ font-size: var(--font-size-sm);
1135
+ line-height: var(--line-height-sm);
1136
+ font-weight: var(--font-weight-medium);
1137
+
1138
+ cursor: pointer;
1139
+ }
1140
+
1141
+ .drop-down-single-item[data-highlighted] {
1142
+ background-color: var(--color-purple-50);
1143
+ outline: none;
1144
+ }
1145
+
1146
+ .drop-down-single-item:disabled {
1147
+ background-color: var(--color-grey-scale-100);
1148
+ color: var(--color-grey-scale-400);
1149
+ cursor: not-allowed;
1150
+ }
1151
+
1152
+ .base-text:where(.xsm) {
1153
+ font-size: var(--font-size-xsm);
1154
+ line-height: var(--line-height-xsm);
1155
+ }
1156
+
1157
+ .base-text:where(.sm) {
1158
+ font-size: var(--font-size-sm);
1159
+ line-height: var(--line-height-sm);
1160
+ }
1161
+
1162
+ .base-text:where(.base) {
1163
+ font-size: var(--font-size-base);
1164
+ line-height: var(--line-height-base);
1165
+ }
1166
+
1167
+ .base-text:where(.lg) {
1168
+ font-size: var(--font-size-lg);
1169
+ line-height: var(--line-height-lg);
1170
+ }
1171
+
1172
+ .base-text:where(.xl) {
1173
+ font-size: var(--font-size-xl);
1174
+ line-height: var(--line-height-xl);
1175
+ }
1176
+
1177
+ .base-text:where(.t-2xl) {
1178
+ font-size: var(--font-size-2xl);
1179
+ line-height: var(--line-height-2xl);
1180
+ }
1181
+
1182
+ .base-text:where(.t-3xl) {
1183
+ font-size: var(--font-size-3xl);
1184
+ line-height: var(--line-height-3xl);
1185
+ }
1186
+
1187
+ .base-text:where(.t-4xl) {
1188
+ font-size: var(--font-size-4xl);
1189
+ line-height: var(--line-height-4xl);
1190
+ }
1191
+
1192
+ .base-text:where(.t-5xl) {
1193
+ font-size: var(--font-size-5xl);
1194
+ line-height: var(--line-height-5xl);
1195
+ }
1196
+
1197
+ .base-text:where(.t-6xl) {
1198
+ font-size: var(--font-size-6xl);
1199
+ line-height: var(--line-height-6xl);
1200
+ }
1201
+
1202
+ .base-text:where(.regular) {
1203
+ font-weight: var(--font-weight-regular);
1204
+ }
1205
+
1206
+ .base-text:where(.medium) {
1207
+ font-weight: var(--font-weight-medium);
1208
+ }
1209
+
1210
+ .base-text:where(.semibold) {
1211
+ font-weight: var(--font-weight-semibold);
1212
+ }
1213
+
1214
+ .base-text:where(.bold) {
1215
+ font-weight: var(--font-weight-bold);
1216
+ }
1217
+
1218
+ .base-text:where(.extrabold) {
1219
+ font-weight: var(--font-weight-extrabold);
1220
+ }
1221
+
1222
+ .base-text.textAlign-left[class*='textAlign-'] {
1223
+ text-align: left;
1224
+ }
1225
+
1226
+ .base-text.textAlign-center[class*='textAlign-'] {
1227
+ text-align: center;
1228
+ }
1229
+
1230
+ .base-text.textDecoration-underline[class*='textDecoration-'] {
1231
+ text-decoration: underline;
1232
+ }
1233
+
1234
+ .base-text.textDecoration-none[class*='textDecoration-'] {
1235
+ text-decoration: none;
1236
+ }
1237
+
1238
+ .base-text.textDecoration-lineThrough[class*='textDecoration-'] {
1239
+ text-decoration: line-through;
1240
+ }
1241
+
1242
+ .base-text.textDecoration-overline[class*='textDecoration-'] {
1243
+ text-decoration: overline;
1244
+ }
1245
+
1246
+ .base-text.textDecoration-blink[class*='textDecoration-'] {
1247
+ text-decoration: blink;
1248
+ }
1249
+
1250
+ .base-text.wordBreak-normal[class*='wordBreak-'] {
1251
+ word-break: normal;
1252
+ }
1253
+
1254
+ .base-text.wordBreak-breakAll[class*='wordBreak-'] {
1255
+ word-break: break-all;
1256
+ }
1257
+
1258
+ .base-text.wordBreak-breakWord[class*='wordBreak-'] {
1259
+ word-break: break-word;
1260
+ }
1261
+
1262
+ .base-text.wordBreak-keepAll[class*='wordBreak-'] {
1263
+ word-break: keep-all;
1264
+ }
1265
+
1266
+ .base-text.wordBreak-keepWord[class*='wordBreak-'] {
1267
+ word-break: keep-word;
1268
+ }
1269
+
1270
+ .base-text.wordBreak-breakSpaces[class*='wordBreak-'] {
1271
+ word-break: break-spaces;
1272
+ }
1273
+
1274
+ .base-text.wordBreak-all[class*='wordBreak-'] {
1275
+ word-break: all;
1276
+ }
1277
+
1278
+ .base-text.whiteSpace-normal[class*='whiteSpace-'] {
1279
+ white-space: normal;
1280
+ }
1281
+
1282
+ .base-text.whiteSpace-nowrap[class*='whiteSpace-'] {
1283
+ white-space: nowrap;
1284
+ }
1285
+
1286
+ .base-text.whiteSpace-pre[class*='whiteSpace-'] {
1287
+ white-space: pre;
1288
+ }
1289
+
1290
+ .base-text.whiteSpace-preLine[class*='whiteSpace-'] {
1291
+ white-space: pre-line;
1292
+ }
1293
+
1294
+ .base-text.whiteSpace-preWrap[class*='whiteSpace-'] {
1295
+ white-space: pre-wrap;
1296
+ }
1297
+
1298
+ .base-text.color-black[class*='color-'] {
1299
+ color: var(--color-black);
1300
+ }
1301
+
1302
+ .base-text.color-white[class*='color-'] {
1303
+ color: var(--color-white);
1304
+ }
1305
+
1306
+ .base-text.color-grey-scale-50[class*='color-'] {
1307
+ color: var(--color-grey-scale-50);
1308
+ }
1309
+
1310
+ .base-text.color-grey-scale-100[class*='color-'] {
1311
+ color: var(--color-grey-scale-100);
1312
+ }
1313
+
1314
+ .base-text.color-grey-scale-200[class*='color-'] {
1315
+ color: var(--color-grey-scale-200);
1316
+ }
1317
+
1318
+ .base-text.color-grey-scale-300[class*='color-'] {
1319
+ color: var(--color-grey-scale-300);
1320
+ }
1321
+
1322
+ .base-text.color-grey-scale-400[class*='color-'] {
1323
+ color: var(--color-grey-scale-400);
1324
+ }
1325
+
1326
+ .base-text.color-grey-scale-500[class*='color-'] {
1327
+ color: var(--color-grey-scale-500);
1328
+ }
1329
+
1330
+ .base-text.color-grey-scale-600[class*='color-'] {
1331
+ color: var(--color-grey-scale-600);
1332
+ }
1333
+
1334
+ .base-text.color-grey-scale-700[class*='color-'] {
1335
+ color: var(--color-grey-scale-700);
1336
+ }
1337
+
1338
+ .base-text.color-grey-scale-800[class*='color-'] {
1339
+ color: var(--color-grey-scale-800);
1340
+ }
1341
+
1342
+ .base-text.color-grey-scale-900[class*='color-'] {
1343
+ color: var(--color-grey-scale-900);
1344
+ }
1345
+
1346
+ .base-text.color-purple-50[class*='color-'] {
1347
+ color: var(--color-purple-50);
1348
+ }
1349
+
1350
+ .base-text.color-purple-100[class*='color-'] {
1351
+ color: var(--color-purple-100);
1352
+ }
1353
+
1354
+ .base-text.color-purple-200[class*='color-'] {
1355
+ color: var(--color-purple-200);
1356
+ }
1357
+
1358
+ .base-text.color-purple-300[class*='color-'] {
1359
+ color: var(--color-purple-300);
1360
+ }
1361
+
1362
+ .base-text.color-purple-400[class*='color-'] {
1363
+ color: var(--color-purple-400);
1364
+ }
1365
+
1366
+ .base-text.color-purple-500[class*='color-'] {
1367
+ color: var(--color-purple-500);
1368
+ }
1369
+
1370
+ .base-text.color-purple-600[class*='color-'] {
1371
+ color: var(--color-purple-600);
1372
+ }
1373
+
1374
+ .base-text.color-purple-700[class*='color-'] {
1375
+ color: var(--color-purple-700);
1376
+ }
1377
+
1378
+ .base-text.color-purple-800[class*='color-'] {
1379
+ color: var(--color-purple-800);
1380
+ }
1381
+
1382
+ .base-text.color-purple-900[class*='color-'] {
1383
+ color: var(--color-purple-900);
1384
+ }
1385
+
1386
+ .base-text.color-accent-red-50[class*='color-'] {
1387
+ color: var(--color-accent-red-50);
1388
+ }
1389
+
1390
+ .base-text.color-accent-red-100[class*='color-'] {
1391
+ color: var(--color-accent-red-100);
1392
+ }
1393
+
1394
+ .base-text.color-accent-red-200[class*='color-'] {
1395
+ color: var(--color-accent-red-200);
1396
+ }
1397
+
1398
+ .base-text.color-accent-red-300[class*='color-'] {
1399
+ color: var(--color-accent-red-300);
1400
+ }
1401
+
1402
+ .base-text.color-accent-red-400[class*='color-'] {
1403
+ color: var(--color-accent-red-400);
1404
+ }
1405
+
1406
+ .base-text.color-accent-red-500[class*='color-'] {
1407
+ color: var(--color-accent-red-500);
1408
+ }
1409
+
1410
+ .base-text.color-accent-red-600[class*='color-'] {
1411
+ color: var(--color-accent-red-600);
1412
+ }
1413
+
1414
+ .base-text.color-accent-red-700[class*='color-'] {
1415
+ color: var(--color-accent-red-700);
1416
+ }
1417
+
1418
+ .base-text.color-accent-red-800[class*='color-'] {
1419
+ color: var(--color-accent-red-800);
1420
+ }
1421
+
1422
+ .base-text.color-accent-red-900[class*='color-'] {
1423
+ color: var(--color-accent-red-900);
1424
+ }
1425
+
1426
+ .base-text.color-accent-pink-50[class*='color-'] {
1427
+ color: var(--color-accent-pink-50);
1428
+ }
1429
+
1430
+ .base-text.color-accent-pink-100[class*='color-'] {
1431
+ color: var(--color-accent-pink-100);
1432
+ }
1433
+
1434
+ .base-text.color-accent-pink-200[class*='color-'] {
1435
+ color: var(--color-accent-pink-200);
1436
+ }
1437
+
1438
+ .base-text.color-accent-pink-300[class*='color-'] {
1439
+ color: var(--color-accent-pink-300);
1440
+ }
1441
+
1442
+ .base-text.color-accent-pink-400[class*='color-'] {
1443
+ color: var(--color-accent-pink-400);
1444
+ }
1445
+
1446
+ .base-text.color-accent-pink-500[class*='color-'] {
1447
+ color: var(--color-accent-pink-500);
1448
+ }
1449
+
1450
+ .base-text.color-accent-pink-600[class*='color-'] {
1451
+ color: var(--color-accent-pink-600);
1452
+ }
1453
+
1454
+ .base-text.color-accent-pink-700[class*='color-'] {
1455
+ color: var(--color-accent-pink-700);
1456
+ }
1457
+
1458
+ .base-text.color-accent-pink-800[class*='color-'] {
1459
+ color: var(--color-accent-pink-800);
1460
+ }
1461
+
1462
+ .base-text.color-accent-pink-900[class*='color-'] {
1463
+ color: var(--color-accent-pink-900);
1464
+ }
1465
+
1466
+ .base-text.color-accent-magenta-50[class*='color-'] {
1467
+ color: var(--color-accent-magenta-50);
1468
+ }
1469
+
1470
+ .base-text.color-accent-magenta-100[class*='color-'] {
1471
+ color: var(--color-accent-magenta-100);
1472
+ }
1473
+
1474
+ .base-text.color-accent-magenta-200[class*='color-'] {
1475
+ color: var(--color-accent-magenta-200);
1476
+ }
1477
+
1478
+ .base-text.color-accent-magenta-300[class*='color-'] {
1479
+ color: var(--color-accent-magenta-300);
1480
+ }
1481
+
1482
+ .base-text.color-accent-magenta-400[class*='color-'] {
1483
+ color: var(--color-accent-magenta-400);
1484
+ }
1485
+
1486
+ .base-text.color-accent-magenta-500[class*='color-'] {
1487
+ color: var(--color-accent-magenta-500);
1488
+ }
1489
+
1490
+ .base-text.color-accent-magenta-600[class*='color-'] {
1491
+ color: var(--color-accent-magenta-600);
1492
+ }
1493
+
1494
+ .base-text.color-accent-magenta-700[class*='color-'] {
1495
+ color: var(--color-accent-magenta-700);
1496
+ }
1497
+
1498
+ .base-text.color-accent-magenta-800[class*='color-'] {
1499
+ color: var(--color-accent-magenta-800);
1500
+ }
1501
+
1502
+ .base-text.color-accent-magenta-900[class*='color-'] {
1503
+ color: var(--color-accent-magenta-900);
1504
+ }
1505
+
1506
+ .base-text.color-accent-blue-50[class*='color-'] {
1507
+ color: var(--color-accent-blue-50);
1508
+ }
1509
+
1510
+ .base-text.color-accent-blue-100[class*='color-'] {
1511
+ color: var(--color-accent-blue-100);
1512
+ }
1513
+
1514
+ .base-text.color-accent-blue-200[class*='color-'] {
1515
+ color: var(--color-accent-blue-200);
1516
+ }
1517
+
1518
+ .base-text.color-accent-blue-300[class*='color-'] {
1519
+ color: var(--color-accent-blue-300);
1520
+ }
1521
+
1522
+ .base-text.color-accent-blue-400[class*='color-'] {
1523
+ color: var(--color-accent-blue-400);
1524
+ }
1525
+
1526
+ .base-text.color-accent-blue-500[class*='color-'] {
1527
+ color: var(--color-accent-blue-500);
1528
+ }
1529
+
1530
+ .base-text.color-accent-blue-600[class*='color-'] {
1531
+ color: var(--color-accent-blue-600);
1532
+ }
1533
+
1534
+ .base-text.color-accent-blue-700[class*='color-'] {
1535
+ color: var(--color-accent-blue-700);
1536
+ }
1537
+
1538
+ .base-text.color-accent-blue-800[class*='color-'] {
1539
+ color: var(--color-accent-blue-800);
1540
+ }
1541
+
1542
+ .base-text.color-accent-blue-900[class*='color-'] {
1543
+ color: var(--color-accent-blue-900);
1544
+ }
1545
+
1546
+ .base-text.color-accent-mint-50[class*='color-'] {
1547
+ color: var(--color-accent-mint-50);
1548
+ }
1549
+
1550
+ .base-text.color-accent-mint-100[class*='color-'] {
1551
+ color: var(--color-accent-mint-100);
1552
+ }
1553
+
1554
+ .base-text.color-accent-mint-200[class*='color-'] {
1555
+ color: var(--color-accent-mint-200);
1556
+ }
1557
+
1558
+ .base-text.color-accent-mint-300[class*='color-'] {
1559
+ color: var(--color-accent-mint-300);
1560
+ }
1561
+
1562
+ .base-text.color-accent-mint-400[class*='color-'] {
1563
+ color: var(--color-accent-mint-400);
1564
+ }
1565
+
1566
+ .base-text.color-accent-mint-500[class*='color-'] {
1567
+ color: var(--color-accent-mint-500);
1568
+ }
1569
+
1570
+ .base-text.color-accent-mint-600[class*='color-'] {
1571
+ color: var(--color-accent-mint-600);
1572
+ }
1573
+
1574
+ .base-text.color-accent-mint-700[class*='color-'] {
1575
+ color: var(--color-accent-mint-700);
1576
+ }
1577
+
1578
+ .base-text.color-accent-mint-800[class*='color-'] {
1579
+ color: var(--color-accent-mint-800);
1580
+ }
1581
+
1582
+ .base-text.color-accent-mint-900[class*='color-'] {
1583
+ color: var(--color-accent-mint-900);
1584
+ }
1585
+
1586
+ .base-text.color-accent-green-50[class*='color-'] {
1587
+ color: var(--color-accent-green-50);
1588
+ }
1589
+
1590
+ .base-text.color-accent-green-100[class*='color-'] {
1591
+ color: var(--color-accent-green-100);
1592
+ }
1593
+
1594
+ .base-text.color-accent-green-200[class*='color-'] {
1595
+ color: var(--color-accent-green-200);
1596
+ }
1597
+
1598
+ .base-text.color-accent-green-300[class*='color-'] {
1599
+ color: var(--color-accent-green-300);
1600
+ }
1601
+
1602
+ .base-text.color-accent-green-400[class*='color-'] {
1603
+ color: var(--color-accent-green-400);
1604
+ }
1605
+
1606
+ .base-text.color-accent-green-500[class*='color-'] {
1607
+ color: var(--color-accent-green-500);
1608
+ }
1609
+
1610
+ .base-text.color-accent-green-600[class*='color-'] {
1611
+ color: var(--color-accent-green-600);
1612
+ }
1613
+
1614
+ .base-text.color-accent-green-700[class*='color-'] {
1615
+ color: var(--color-accent-green-700);
1616
+ }
1617
+
1618
+ .base-text.color-accent-green-800[class*='color-'] {
1619
+ color: var(--color-accent-green-800);
1620
+ }
1621
+
1622
+ .base-text.color-accent-green-900[class*='color-'] {
1623
+ color: var(--color-accent-green-900);
1624
+ }
1625
+
1626
+ .base-text.color-accent-yellow-50[class*='color-'] {
1627
+ color: var(--color-accent-yellow-50);
1628
+ }
1629
+
1630
+ .base-text.color-accent-yellow-100[class*='color-'] {
1631
+ color: var(--color-accent-yellow-100);
1632
+ }
1633
+
1634
+ .base-text.color-accent-yellow-200[class*='color-'] {
1635
+ color: var(--color-accent-yellow-200);
1636
+ }
1637
+
1638
+ .base-text.color-accent-yellow-300[class*='color-'] {
1639
+ color: var(--color-accent-yellow-300);
1640
+ }
1641
+
1642
+ .base-text.color-accent-yellow-400[class*='color-'] {
1643
+ color: var(--color-accent-yellow-400);
1644
+ }
1645
+
1646
+ .base-text.color-accent-yellow-500[class*='color-'] {
1647
+ color: var(--color-accent-yellow-500);
1648
+ }
1649
+
1650
+ .base-text.color-accent-yellow-600[class*='color-'] {
1651
+ color: var(--color-accent-yellow-600);
1652
+ }
1653
+
1654
+ .base-text.color-accent-yellow-700[class*='color-'] {
1655
+ color: var(--color-accent-yellow-700);
1656
+ }
1657
+
1658
+ .base-text.color-accent-yellow-800[class*='color-'] {
1659
+ color: var(--color-accent-yellow-800);
1660
+ }
1661
+
1662
+ .base-text.color-accent-yellow-900[class*='color-'] {
1663
+ color: var(--color-accent-yellow-900);
1664
+ }
1665
+
1666
+ .base-text.color-accent-orange-50[class*='color-'] {
1667
+ color: var(--color-accent-orange-50);
1668
+ }
1669
+
1670
+ .base-text.color-accent-orange-100[class*='color-'] {
1671
+ color: var(--color-accent-orange-100);
1672
+ }
1673
+
1674
+ .base-text.color-accent-orange-200[class*='color-'] {
1675
+ color: var(--color-accent-orange-200);
1676
+ }
1677
+
1678
+ .base-text.color-accent-orange-300[class*='color-'] {
1679
+ color: var(--color-accent-orange-300);
1680
+ }
1681
+
1682
+ .base-text.color-accent-orange-400[class*='color-'] {
1683
+ color: var(--color-accent-orange-400);
1684
+ }
1685
+
1686
+ .base-text.color-accent-orange-500[class*='color-'] {
1687
+ color: var(--color-accent-orange-500);
1688
+ }
1689
+
1690
+ .base-text.color-accent-orange-600[class*='color-'] {
1691
+ color: var(--color-accent-orange-600);
1692
+ }
1693
+
1694
+ .base-text.color-accent-orange-700[class*='color-'] {
1695
+ color: var(--color-accent-orange-700);
1696
+ }
1697
+
1698
+ .base-text.color-accent-orange-800[class*='color-'] {
1699
+ color: var(--color-accent-orange-800);
1700
+ }
1701
+
1702
+ .base-text.color-accent-orange-900[class*='color-'] {
1703
+ color: var(--color-accent-orange-900);
1704
+ }
1705
+
1706
+ .base-inline-loading {
1707
+ display: flex;
1708
+ width: 100%;
1709
+ height: 100%;
1710
+ align-items: center;
1711
+ }
1712
+
1713
+ /* 링은 currentColor 다. 우선순위 0 이라 넘겨받은 className 이나 style 의 color 가 늘 이긴다. */
1714
+
1715
+ :where(.base-inline-loading) {
1716
+ color: var(--color-grey-scale-200);
1717
+ }
1718
+
1719
+ .base-overlay-loading {
1720
+ position: fixed;
1721
+ inset: 0;
1722
+ display: flex;
1723
+ align-items: center;
1724
+ justify-content: center;
1725
+ }
1726
+
1727
+ .page-loading-backdrop {
1728
+ position: absolute;
1729
+ inset: 0;
1730
+ }
1731
+
1732
+ .page-loading-content {
1733
+ position: relative;
1734
+ display: flex;
1735
+ flex-direction: column;
1736
+ align-items: center;
1737
+ gap: var(--spacing-16);
1738
+ }
1739
+
1740
+ /* 스피너를 레이아웃 크기로 키운다. transform: scale 은 보이는 크기만 키워 아래 글자와 겹친다 */
1741
+
1742
+ .page-loading-indicator {
1743
+ --spinner-stroke: var(--overlay-spinner-stroke);
1744
+ }
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
+
1751
+ .page-loading-text {
1752
+ position: relative;
1753
+ }
1754
+
1755
+ .base-spinner {
1756
+ display: flex;
1757
+ width: var(--icon-size-m);
1758
+ height: var(--icon-size-m);
1759
+ align-items: center;
1760
+ justify-content: center;
1761
+ }
1762
+
1763
+ /* 우선순위 0 이라 넘겨받은 className 이나 style 의 color 가 늘 이긴다. */
1764
+
1765
+ :where(.base-spinner) {
1766
+ color: var(--color-grey-scale-200);
1767
+ }
1768
+
1769
+ .loading-indicator-ring {
1770
+ position: relative;
1771
+ width: var(--icon-size-m);
1772
+ height: var(--icon-size-m);
1773
+ }
1774
+
1775
+ .loading-indicator-single-ring {
1776
+ box-sizing: border-box;
1777
+ display: block;
1778
+ position: absolute;
1779
+ width: 100%;
1780
+ height: 100%;
1781
+ border: var(--spinner-stroke) solid;
1782
+ border-radius: 50%;
1783
+ animation: lds-ring var(--spinner-duration) var(--spinner-ease) infinite;
1784
+ border-color: currentColor transparent transparent transparent;
1785
+ }
1786
+
1787
+ .loading-indicator-single-ring:nth-child(1) {
1788
+ animation-delay: calc(var(--spinner-duration) * -0.375);
1789
+ }
1790
+
1791
+ .loading-indicator-single-ring:nth-child(2) {
1792
+ animation-delay: calc(var(--spinner-duration) * -0.25);
1793
+ }
1794
+
1795
+ .loading-indicator-single-ring:nth-child(3) {
1796
+ animation-delay: calc(var(--spinner-duration) * -0.125);
1797
+ }
1798
+
1799
+ .loading-indicator-single-ring:nth-child(4) {
1800
+ animation-delay: 0s;
1801
+ }
1802
+
1803
+ @keyframes lds-ring {
1804
+ 0% {
1805
+ transform: rotate(0deg);
1806
+ }
1807
+ 100% {
1808
+ transform: rotate(360deg);
1809
+ }
1810
+ }
1811
+
1812
+ /* Title·Close 같은 조각도 base-modal 을 달므로 상자 스타일은 container·overlay 에만 건다. */
1813
+
1814
+ .base-modal:where(.modal-container, .modal-overlay) {
1815
+ display: flex;
1816
+ flex-direction: column;
1817
+ align-items: center;
1818
+
1819
+ padding: var(--spacing-30);
1820
+ border-radius: var(--radius-6);
1821
+ }
1822
+
1823
+ .base-modal.modal-container {
1824
+ position: fixed;
1825
+ top: 50%;
1826
+ left: 50%;
1827
+ transform: translate(-50%, -50%);
1828
+ z-index: var(--z-modal);
1829
+ background-color: var(--color-white);
1830
+ }
1831
+
1832
+ .base-modal.modal-overlay {
1833
+ position: fixed;
1834
+ top: 0;
1835
+ left: 0;
1836
+ right: 0;
1837
+ bottom: 0;
1838
+ background-color: rgba(0, 0, 0, 0.5);
1839
+ z-index: var(--z-overlay);
1840
+ }
1841
+
1842
+ /***************************************************************************************************
1843
+ * *
1844
+ * modal-with-double-button *
1845
+ * *
1846
+ ***************************************************************************************************/
1847
+
1848
+ .modal-with-double-button-close-button {
1849
+ display: flex;
1850
+ justify-content: flex-start;
1851
+ align-items: center;
1852
+ width: 100%;
1853
+ }
1854
+
1855
+ .modal-with-double-button-container.size-s {
1856
+ width: var(--modal-width-s);
1857
+ }
1858
+
1859
+ .modal-with-double-button-container.size-m {
1860
+ width: var(--modal-width-m);
1861
+ }
1862
+
1863
+ .modal-with-double-button-container.size-l {
1864
+ width: var(--modal-width-l);
1865
+ }
1866
+
1867
+ .modal-with-double-button-title-icon {
1868
+ margin-bottom: var(--spacing-20);
1869
+ }
1870
+
1871
+ .modal-with-double-button-title {
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);
1885
+ }
1886
+
1887
+ .modal-with-double-button-content {
1888
+ margin-top: var(--spacing-20);
1889
+ }
1890
+
1891
+ .modal-with-double-button-close {
1892
+ display: flex;
1893
+ justify-content: space-between;
1894
+ align-items: center;
1895
+ gap: var(--spacing-16);
1896
+ width: 100%;
1897
+ margin-top: var(--spacing-30);
1898
+ }
1899
+
1900
+ .modal-with-double-button-close.row {
1901
+ display: flex;
1902
+ justify-content: center;
1903
+ align-items: center;
1904
+ gap: var(--spacing-16);
1905
+ }
1906
+
1907
+ .modal-with-double-button-close.row > * {
1908
+ flex: 1;
1909
+ }
1910
+
1911
+ .modal-with-double-button-close.column {
1912
+ display: flex;
1913
+ flex-direction: column;
1914
+ justify-content: center;
1915
+ align-items: center;
1916
+ gap: var(--spacing-10);
1917
+ }
1918
+
1919
+ .modal-with-double-button-close.column > * {
1920
+ width: 100%;
1921
+ }
1922
+
1923
+ /***************************************************************************************************
1924
+ * *
1925
+ * modal *
1926
+ * *
1927
+ ***************************************************************************************************/
1928
+
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
+ }
1936
+
1937
+ .modal.size-s {
1938
+ width: var(--modal-width-s);
1939
+ }
1940
+
1941
+ .modal.size-m {
1942
+ width: var(--modal-width-m);
1943
+ }
1944
+
1945
+ .modal.size-l {
1946
+ width: var(--modal-width-l);
1947
+ }
1948
+
1949
+ .modal-header {
1950
+ display: flex;
1951
+ justify-content: space-between;
1952
+ align-items: flex-start;
1953
+ gap: var(--spacing-10);
1954
+ }
1955
+
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);
1962
+ }
1963
+
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
+ }
1972
+
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);
2000
+ }
2001
+
2002
+ .base-pagination[data-disabled]:where(.item) {
2003
+ cursor: var(--cursor-disabled);
2004
+ }
2005
+
2006
+ .base-pagination:where(.ellipsis) {
2007
+ display: inline-flex;
2008
+ align-items: center;
2009
+ justify-content: center;
2010
+ -webkit-user-select: none;
2011
+ -moz-user-select: none;
2012
+ user-select: none;
2013
+ }
2014
+
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) {
2101
+ display: flex;
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;
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;
2329
+ }
2330
+
2331
+ /***************************************************************************************************
2332
+ * *
2333
+ * data-table *
2334
+ * *
2335
+ ***************************************************************************************************/
2336
+
2337
+ .data-table {
2338
+ position: relative;
2339
+ width: 100%;
2340
+ }
2341
+
2342
+ .data-table-header {
2343
+ position: sticky;
2344
+ top: 0;
2345
+ background-color: var(--color-white);
2346
+ z-index: var(--z-sticky-header);
2347
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
2348
+ }
2349
+
2350
+ .data-table-row {
2351
+ position: relative;
2352
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
2353
+ }
2354
+
2355
+ .data-table-row .fixed {
2356
+ position: sticky;
2357
+ background-color: var(--color-white);
2358
+ z-index: var(--z-sticky);
2359
+ }
2360
+
2361
+ :is(.data-table-row .fixed) > * {
2362
+ position: relative;
2363
+ z-index: var(--z-raised);
2364
+ }
2365
+
2366
+ .body .data-table-row:hover {
2367
+ background-color: var(--color-grey-scale-100);
2368
+ }
2369
+
2370
+ :is(.body .data-table-row:hover) .fixed {
2371
+ background-color: var(--color-grey-scale-100);
2372
+ }
2373
+
2374
+ .fixed-cell {
2375
+ position: sticky;
2376
+ left: 0;
2377
+ }
2378
+
2379
+ .base-tabs:where(.root) {
2380
+ width: 100%;
2381
+ display: block;
2382
+ }
2383
+
2384
+ /***************************************************************************************************
2385
+ * *
2386
+ * tabs *
2387
+ * *
2388
+ ***************************************************************************************************/
2389
+
2390
+ .tabs-list {
2391
+ display: flex;
2392
+ align-items: center;
2393
+ position: relative;
2394
+ }
2395
+
2396
+ .tabs-list.variant-underline {
2397
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
2398
+
2399
+ /* Scrollable logic */
2400
+ overflow-x: auto;
2401
+ scrollbar-width: none;
2402
+ }
2403
+
2404
+ .tabs-list.variant-underline::-webkit-scrollbar {
2405
+ display: none;
2406
+ }
2407
+
2408
+ .tabs-trigger {
2409
+ /* 1. 구조적 스타일 (Layout) */
2410
+ display: inline-flex;
2411
+ align-items: center;
2412
+ justify-content: center;
2413
+ cursor: pointer;
2414
+ background: transparent;
2415
+ border: 0;
2416
+ flex-shrink: 0;
2417
+
2418
+ /* 2. 테마 스타일 (Theme) */
2419
+ /* figma 토큰에 11px 없음. 디자이너 확인 전까지 숫자 유지 */
2420
+ padding: 10px 30px 11px 30px; /* raw-px */
2421
+ color: var(--color-grey-scale-400);
2422
+ font-size: var(--font-size-sm);
2423
+ font-weight: var(--font-weight-medium);
2424
+ border-bottom: var(--hairline) solid var(--color-grey-scale-200);
2425
+ transition: color var(--motion-base) var(--motion-ease);
2426
+ }
2427
+
2428
+ .tabs-trigger:hover {
2429
+ color: var(--color-purple-700);
2430
+ }
2431
+
2432
+ .tabs-trigger[data-state='active'] {
2433
+ color: var(--color-purple-700);
2434
+ font-weight: var(--font-weight-bold);
2435
+ }
2436
+
2437
+ .tabs-trigger.disabled {
2438
+ cursor: not-allowed;
2439
+ opacity: 0.5;
2440
+ }
2441
+
2442
+ /* 3. 변이 스타일 (Variants) */
2443
+
2444
+ .tabs-trigger.variant-underline {
2445
+ border-bottom: 0;
2446
+ }
2447
+
2448
+ .tabs-trigger.variant-underline[data-state='active'] {
2449
+ border-bottom-color: transparent;
2450
+ }
2451
+
2452
+ .tabs-trigger.variant-filled {
2453
+ flex: 1; /* full-width logic integrated */
2454
+ text-align: center;
2455
+ /* figma 토큰에 11px 없음. 디자이너 확인 전까지 숫자 유지 */
2456
+ padding: 11px 30px; /* raw-px */
2457
+ border-bottom: 0;
2458
+ z-index: var(--z-raised);
2459
+ }
2460
+
2461
+ .tabs-trigger.variant-filled:hover,.tabs-trigger.variant-filled[data-state='active'] {
2462
+ background-color: transparent;
2463
+ }
2464
+
2465
+ .tabs-indicator {
2466
+ /* 1. 구조적 스타일 (Layout) */
2467
+ position: absolute;
2468
+ pointer-events: none;
2469
+ z-index: var(--z-raised);
2470
+ transition:
2471
+ left var(--motion-base) var(--motion-ease),
2472
+ width var(--motion-base) var(--motion-ease);
2473
+
2474
+ /* 2. 변이 스타일 (Variants) */
2475
+ }
2476
+
2477
+ .tabs-indicator.variant-underline {
2478
+ bottom: 0;
2479
+ height: var(--tab-indicator-thickness);
2480
+ background-color: var(--color-purple-800);
2481
+ }
2482
+
2483
+ .tabs-indicator.variant-filled {
2484
+ top: 0;
2485
+ bottom: 0;
2486
+ background-color: var(--color-purple-50);
2487
+ z-index: var(--z-base);
2488
+ }
2489
+
2490
+ .base-text-area:where(.textarea) {
2491
+ display: block;
2492
+ width: 100%;
2493
+ margin: 0;
2494
+ border: none;
2495
+ outline: none;
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
+ }
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);
2541
+ font-size: var(--font-size-sm);
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;
2583
+ font-weight: var(--font-weight-medium);
2584
+ }
2585
+
2586
+ .base-text-field.input::-moz-placeholder {
2587
+ color: var(--color-grey-scale-400);
2588
+ }
2589
+
2590
+ .base-text-field.input::placeholder {
2591
+ color: var(--color-grey-scale-400);
2592
+ }
2593
+
2594
+ .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 {
2595
+ /* 브라우저 자동완성 배경을 덮는 관용 해킹. 토큰이 아니라 고정값이다 */ /* raw-value */
2596
+ box-shadow: 0 0 0px 1000px transparent inset; /* raw-value */
2597
+ -webkit-transition: background-color 5000s ease-in-out 0s;
2598
+ transition: background-color 5000s ease-in-out 0s; /* raw-value */
2599
+ }
2600
+
2601
+ /***************************************************************************************************
2602
+ * *
2603
+ * base-text-field *
2604
+ * *
2605
+ ***************************************************************************************************/
2606
+
2607
+ .text-field {
2608
+ height: -moz-fit-content;
2609
+ height: fit-content;
2610
+ }
2611
+
2612
+ .text-field-title {
2613
+ margin-bottom: var(--spacing-8);
2614
+ }
2615
+
2616
+ .text-field-input-wrapper {
2617
+ display: flex;
2618
+ align-items: center;
2619
+ justify-content: space-between;
2620
+ gap: var(--spacing-10);
2621
+
2622
+ /* 높이는 버튼과 같은 --control-height-* 축, 좌우 여백·글자는 size 마다 버튼과 같은 단계 */
2623
+
2624
+ border-radius: var(--radius-4);
2625
+ border: var(--hairline) solid var(--color-grey-scale-300);
2626
+ }
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
+
2635
+ .text-field-input-wrapper.size-s {
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);
2640
+ }
2641
+
2642
+ .text-field-input-wrapper.size-m {
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);
2661
+ }
2662
+
2663
+ .text-field-input-wrapper:has( > input[data-disabled='true']) {
2664
+ border-color: var(--color-grey-scale-300);
2665
+ background-color: var(--color-grey-scale-100);
2666
+ }
2667
+
2668
+ .text-field-input-wrapper:focus-within {
2669
+ border: var(--hairline) solid var(--color-purple-900);
2670
+ }
2671
+
2672
+ .text-field-input-wrapper > input {
2673
+ width: 100%;
2674
+ }
2675
+
2676
+ .text-field-helper-text {
2677
+ margin-top: var(--spacing-4);
2678
+ }
2679
+
2680
+ .text-field-helper-text.error {
2681
+ color: var(--color-accent-red-500);
2682
+ }
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
+
2924
+ /* Trigger 도 base-tooltip 을 달므로 z-index 는 Content 에만 건다. */
2925
+
2926
+ .base-tooltip:where(.content) {
2927
+ z-index: var(--z-tooltip);
2928
+ }
2929
+
2930
+ .base-tooltip.content {
2931
+ text-align: center;
2932
+ }
2933
+
2934
+ .base-tooltip:where(.trigger) {
2935
+ width: -moz-fit-content;
2936
+ width: fit-content;
2937
+ }
2938
+
2939
+ /***************************************************************************************************
2940
+ * *
2941
+ * tooltip *
2942
+ * *
2943
+ ***************************************************************************************************/
2944
+
2945
+ .tooltip-content {
2946
+ display: flex;
2947
+ justify-content: space-around;
2948
+ align-items: center;
2949
+ gap: var(--spacing-10);
2950
+
2951
+ background-color: var(--color-purple-900);
2952
+ color: var(--color-white);
2953
+ border-radius: var(--radius-6);
2954
+ padding: var(--spacing-12);
2955
+
2956
+ font-size: var(--font-size-sm);
2957
+ line-height: var(--line-height-sm);
2958
+ font-weight: var(--font-weight-regular);
2959
+
2960
+ position: relative;
2961
+ }
2962
+
2963
+ .tooltip-content::before {
2964
+ content: '';
2965
+ position: absolute;
2966
+ width: 0;
2967
+ height: 0;
2968
+ border-style: solid;
2969
+ }
2970
+
2971
+ .tooltip-content.direction-top {
2972
+ transform: translateY(calc(-1 * var(--spacing-10)));
2973
+ }
2974
+
2975
+ .tooltip-content.direction-top::before {
2976
+ bottom: calc(-1 * var(--tooltip-arrow));
2977
+ left: 50%;
2978
+ transform: translateX(-50%);
2979
+ border-width: var(--tooltip-arrow) var(--tooltip-arrow) 0 var(--tooltip-arrow);
2980
+ border-color: var(--color-purple-900) transparent transparent transparent;
2981
+ }
2982
+
2983
+ .tooltip-content.direction-bottom {
2984
+ transform: translateY(var(--spacing-10));
2985
+ }
2986
+
2987
+ .tooltip-content.direction-bottom::before {
2988
+ top: calc(-1 * var(--tooltip-arrow));
2989
+ left: 50%;
2990
+ transform: translateX(-50%);
2991
+ border-width: 0 var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow);
2992
+ border-color: transparent transparent var(--color-purple-900) transparent;
2993
+ }
2994
+
2995
+ .tooltip-content.direction-left {
2996
+ transform: translateX(calc(-1 * var(--spacing-10)));
2997
+ }
2998
+
2999
+ .tooltip-content.direction-left::before {
3000
+ right: calc(-1 * var(--tooltip-arrow));
3001
+ top: 50%;
3002
+ transform: translateY(-50%);
3003
+ border-width: var(--tooltip-arrow) 0 var(--tooltip-arrow) var(--tooltip-arrow);
3004
+ border-color: transparent transparent transparent var(--color-purple-900);
3005
+ }
3006
+
3007
+ .tooltip-content.direction-right {
3008
+ transform: translateX(var(--spacing-10));
3009
+ }
3010
+
3011
+ .tooltip-content.direction-right::before {
3012
+ left: calc(-1 * var(--tooltip-arrow));
3013
+ top: 50%;
3014
+ transform: translateY(-50%);
3015
+ border-width: var(--tooltip-arrow) var(--tooltip-arrow) var(--tooltip-arrow) 0;
3016
+ border-color: transparent var(--color-purple-900) transparent transparent;
3017
+ }