@uniai-fe/uds-primitives 0.0.7 → 0.0.9

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 (56) hide show
  1. package/README.md +64 -5
  2. package/dist/styles.css +220 -303
  3. package/package.json +4 -4
  4. package/src/components/badge/markup/Badge.tsx +10 -0
  5. package/src/components/badge/styles/index.scss +2 -2
  6. package/src/components/badge/types/index.ts +1 -1
  7. package/src/components/button/index.scss +3 -1
  8. package/src/components/button/index.tsx +9 -1
  9. package/src/components/button/markup/ButtonDefault.tsx +162 -0
  10. package/src/components/button/markup/ButtonRounded.tsx +48 -0
  11. package/src/components/button/markup/ButtonText.tsx +49 -0
  12. package/src/components/button/markup/index.ts +3 -0
  13. package/src/components/button/styles/{index.scss → button.scss} +202 -424
  14. package/src/components/button/styles/round-button.scss +56 -0
  15. package/src/components/button/styles/text-button.scss +96 -0
  16. package/src/components/button/types/index.ts +110 -35
  17. package/src/components/button/types/templates.ts +33 -0
  18. package/src/components/button/utils/index.ts +19 -19
  19. package/src/components/checkbox/markup/Checkbox.tsx +20 -2
  20. package/src/components/checkbox/types/checkbox.ts +16 -0
  21. package/src/components/chip/markup/Chip.tsx +8 -0
  22. package/src/components/dialog/markup/{confirm-dialog.tsx → ConfirmDialog.tsx} +23 -0
  23. package/src/components/dialog/markup/{notice-dialog.tsx → NoticeDialog.tsx} +18 -0
  24. package/src/components/dialog/markup/index.tsx +2 -2
  25. package/src/components/dialog/types/index.ts +43 -0
  26. package/src/components/drawer/markup/{drawer.tsx → Drawer.tsx} +58 -0
  27. package/src/components/drawer/markup/index.tsx +1 -1
  28. package/src/components/drawer/types/index.ts +24 -0
  29. package/src/components/input/markup/text/Base.tsx +32 -3
  30. package/src/components/input/markup/text/Identification.tsx +15 -2
  31. package/src/components/input/markup/text/Password.tsx +35 -2
  32. package/src/components/input/markup/text/Phone.tsx +38 -2
  33. package/src/components/input/markup/text/Search.tsx +30 -1
  34. package/src/components/input/styles/index.scss +6 -6
  35. package/src/components/input/types/index.ts +22 -1
  36. package/src/components/input/utils/index.ts +6 -0
  37. package/src/components/navigation/markup/mobile/BottomNavigation.tsx +11 -0
  38. package/src/components/navigation/types/index.ts +22 -0
  39. package/src/components/pagination/markup/Carousel.tsx +1 -0
  40. package/src/components/pagination/markup/Count.tsx +1 -0
  41. package/src/components/pagination/markup/Pagination.tsx +2 -0
  42. package/src/components/radio/markup/Radio.tsx +16 -2
  43. package/src/components/radio/markup/RadioCard.tsx +8 -0
  44. package/src/components/radio/markup/RadioCardGroup.tsx +8 -0
  45. package/src/components/radio/types/radio.ts +39 -0
  46. package/src/components/segmented-control/markup/SegmentedControl.tsx +12 -0
  47. package/src/components/segmented-control/types/index.ts +16 -0
  48. package/src/components/tab/markup/TabContent.tsx +5 -0
  49. package/src/components/tab/markup/TabList.tsx +19 -2
  50. package/src/components/tab/markup/TabRoot.tsx +50 -4
  51. package/src/components/tab/markup/TabTrigger.tsx +9 -1
  52. package/src/components/tab/styles/index.scss +28 -10
  53. package/src/components/tab/types/index.ts +10 -0
  54. package/src/components/tab/utils/tab-context.ts +8 -2
  55. package/src/components/button/markup/Button.tsx +0 -175
  56. package/src/components/button/markup/index.tsx +0 -1
@@ -1,7 +1,7 @@
1
1
  @use "@uniai-fe/uds-foundation/css";
2
2
  @use "sass:map";
3
3
 
4
- :where(.radix-themes, .theme-root, :root) {
4
+ :root {
5
5
  /* spacing */
6
6
  --theme-button-gap-1: var(--spacing-gap-1);
7
7
  --theme-button-gap-2: var(--spacing-gap-2);
@@ -15,6 +15,24 @@
15
15
  --theme-button-padding-7: var(--spacing-padding-7);
16
16
  --theme-button-padding-9: var(--spacing-padding-9);
17
17
  --theme-button-min-width: var(--theme-size-small-2);
18
+ --theme-button-text-padding-block: var(--spacing-padding-4, 8px);
19
+ --theme-button-text-padding-inline-small: var(--spacing-padding-4, 8px);
20
+ --theme-button-text-padding-inline-medium: var(--spacing-padding-5, 12px);
21
+ --theme-button-text-padding-inline-large: var(--spacing-padding-5, 12px);
22
+ --theme-button-text-min-height-small: var(--theme-size-small-1, 20px);
23
+ --theme-button-text-min-height-medium: var(--theme-size-small-2, 24px);
24
+ --theme-button-text-min-height-large: var(--theme-size-small-3, 32px);
25
+ --theme-button-text-radius: var(--theme-radius-small, 4px);
26
+ --theme-button-round-padding-inline-small: var(--spacing-padding-5, 12px);
27
+ --theme-button-round-padding-inline-medium: var(--spacing-padding-6, 16px);
28
+ --theme-button-round-padding-inline-large: var(--spacing-padding-7, 20px);
29
+ --theme-button-round-padding-block: var(--spacing-padding-2, 4px);
30
+ --theme-button-round-min-height-small: var(--theme-size-small-2, 24px);
31
+ --theme-button-round-min-height-medium: var(--theme-size-small-3, 32px);
32
+ --theme-button-round-min-height-large: var(--theme-size-medium-1, 40px);
33
+ --theme-button-round-radius-small: var(--theme-radius-xlarge-2, 16px);
34
+ --theme-button-round-radius-medium: var(--theme-radius-xlarge-2, 16px);
35
+ --theme-button-round-radius-large: 30px;
18
36
 
19
37
  /* size/radius */
20
38
  --theme-button-size-small-1: var(--theme-size-small-1);
@@ -105,16 +123,8 @@
105
123
  --theme-button-overlay-outlined-primary-bg: var(--color-blue-90);
106
124
  --theme-button-overlay-outlined-secondary-bg: var(--color-cool-gray-95);
107
125
  --theme-button-overlay-outlined-tertiary-bg: var(--color-cool-gray-95);
108
-
109
- /* text-button backgrounds */
110
- --theme-button-text-default-hover-bg: var(--color-tertiary-default);
111
- --theme-button-text-default-pressed-bg: var(--color-tertiary-strong);
112
- --theme-button-text-secondary-hover-bg: var(--color-bg-alternative-cool-gray);
113
- --theme-button-text-secondary-pressed-bg: var(--color-secondary-strong);
114
- --theme-button-text-tertiary-hover-bg: var(--color-bg-alternative-cool-gray);
115
- --theme-button-text-tertiary-pressed-bg: var(--color-bg-surface-strong);
116
126
  }
117
- $button-intents: (
127
+ $button-priorities: (
118
128
  primary: (
119
129
  solid-bg: var(
120
130
  --theme-button-color-primary-default,
@@ -130,6 +140,10 @@ $button-intents: (
130
140
  --theme-button-color-primary-default,
131
141
  var(--color-primary-default)
132
142
  ),
143
+ outline-foreground: var(
144
+ --theme-button-color-primary-default,
145
+ var(--color-primary-default)
146
+ ),
133
147
  outline-hover-bg: var(
134
148
  --theme-button-color-primary-default,
135
149
  var(--color-primary-default)
@@ -138,14 +152,6 @@ $button-intents: (
138
152
  --theme-button-color-common-100,
139
153
  var(--color-common-100)
140
154
  ),
141
- text-color: var(
142
- --theme-button-color-primary-default,
143
- var(--color-primary-default)
144
- ),
145
- text-hover-color: var(
146
- --theme-button-color-primary-heavy,
147
- var(--color-primary-heavy)
148
- ),
149
155
  ),
150
156
  secondary: (
151
157
  solid-bg: var(
@@ -162,21 +168,17 @@ $button-intents: (
162
168
  --theme-button-color-cool-gray-90,
163
169
  var(--color-cool-gray-90)
164
170
  ),
171
+ outline-foreground: var(
172
+ --theme-button-color-primary-default,
173
+ var(--color-primary-default)
174
+ ),
165
175
  outline-hover-bg: var(--theme-button-color-blue-90, var(--color-blue-90)),
166
176
  outline-hover-foreground: var(
167
177
  --theme-button-color-primary-heavy,
168
178
  var(--color-primary-heavy)
169
179
  ),
170
- text-color: var(
171
- --theme-button-color-primary-default,
172
- var(--color-primary-default)
173
- ),
174
- text-hover-color: var(
175
- --theme-button-color-primary-strong,
176
- var(--color-primary-strong)
177
- ),
178
180
  ),
179
- teritary: (
181
+ tertiary: (
180
182
  solid-bg: var(
181
183
  --theme-button-tertiary-solid-bg,
182
184
  var(--color-bg-surface-neutral)
@@ -197,6 +199,10 @@ $button-intents: (
197
199
  --theme-button-color-cool-gray-90,
198
200
  var(--color-cool-gray-90)
199
201
  ),
202
+ outline-foreground: var(
203
+ --theme-button-color-cool-gray-10,
204
+ var(--color-cool-gray-10)
205
+ ),
200
206
  outline-hover-bg: var(
201
207
  --theme-button-color-cool-gray-95,
202
208
  var(--color-cool-gray-95)
@@ -205,38 +211,30 @@ $button-intents: (
205
211
  --theme-button-color-neutral-base,
206
212
  var(--color-neutral-20)
207
213
  ),
208
- text-color: var(
209
- --theme-button-color-cool-gray-10,
210
- var(--color-cool-gray-10)
211
- ),
212
- text-hover-color: var(
213
- --theme-button-color-neutral-base,
214
- var(--color-neutral-20)
215
- ),
216
214
  ),
217
215
  );
218
216
 
219
- @function intent-token($intent, $key) {
220
- @return map.get(map.get($button-intents, $intent), $key);
217
+ @function priority-token($priority, $key) {
218
+ @return map.get(map.get($button-priorities, $priority), $key);
221
219
  }
222
220
 
223
- @mixin button-state-selector($variant, $intent) {
224
- .button:where([data-variant="#{$variant}"][data-intent="#{$intent}"]) {
221
+ @mixin button-state-selector($fill, $priority) {
222
+ .button.button-fill-#{$fill}.button-priority-#{$priority} {
225
223
  @content;
226
224
  }
227
225
  }
228
226
 
229
227
  @mixin button-overlay-state(
230
- $variant,
231
- $intent,
228
+ $fill,
229
+ $priority,
232
230
  $bg,
233
231
  $hover-opacity,
234
232
  $pressed-opacity,
235
233
  $border-color: null
236
234
  ) {
237
- .button:where([data-variant="#{$variant}"][data-intent="#{$intent}"]) {
238
- &:hover:not(:disabled),
239
- &[data-simulated-state="hover"]:not(:disabled) {
235
+ .button.button-fill-#{$fill}.button-priority-#{$priority} {
236
+ &:hover:not(:disabled):not([aria-disabled="true"]),
237
+ &[data-user-action="hover"]:not(:disabled):not([aria-disabled="true"]) {
240
238
  background-color: $bg;
241
239
  @if $border-color == null {
242
240
  border-color: $bg;
@@ -246,8 +244,8 @@ $button-intents: (
246
244
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, $hover-opacity);
247
245
  }
248
246
 
249
- &:active:not(:disabled),
250
- &[data-simulated-state="pressed"]:not(:disabled) {
247
+ &:active:not(:disabled):not([aria-disabled="true"]),
248
+ &[data-user-action="pressed"]:not(:disabled):not([aria-disabled="true"]) {
251
249
  background-color: $bg;
252
250
  @if $border-color == null {
253
251
  border-color: $bg;
@@ -259,7 +257,7 @@ $button-intents: (
259
257
  }
260
258
  }
261
259
 
262
- /* Radix reset 이후에도 primitives 스타일이 유지되도록 공통 클래스에 스타일 부여 */
260
+ /* Primitives 버튼 공통 스타일 */
263
261
  .button {
264
262
  display: flex;
265
263
  align-items: center;
@@ -284,62 +282,70 @@ $button-intents: (
284
282
  background-color: transparent;
285
283
  color: var(--theme-button-color-neutral-base, var(--color-neutral-20));
286
284
  box-shadow: none;
287
- font-family: var(
288
- --theme-button-font-body-medium-family,
289
- var(--font-body-medium-family, "Pretendard")
290
- );
291
- font-size: var(
292
- --theme-button-font-body-medium-size,
293
- var(--font-body-medium-size, 16px)
294
- );
295
- font-weight: var(
296
- --theme-button-font-weight,
297
- 400
298
- ); /* 버튼 텍스트는 스케일과 무관하게 weight 400 유지 */
299
- line-height: var(
300
- --theme-button-font-body-medium-line-height,
301
- var(--font-body-medium-line-height, 24px)
302
- );
303
- letter-spacing: var(
304
- --theme-button-font-body-medium-letter-spacing,
305
- var(--font-body-medium-letter-spacing, 0px)
306
- );
307
- /* Radix Theme pressed filter를 비활성화해 상태 색상이 그대로 노출되도록 한다. */
308
- --base-button-solid-active-filter: none;
309
- --base-button-solid-high-contrast-hover-filter: none;
310
- --base-button-solid-high-contrast-active-filter: none;
311
- --base-button-classic-active-filter: none;
312
- --base-button-classic-high-contrast-hover-filter: none;
313
- --base-button-classic-high-contrast-active-filter: none;
314
285
  filter: none;
315
286
  cursor: pointer;
316
- }
317
287
 
318
- .button:where([data-block="true"]) {
319
- width: 100%;
288
+ span {
289
+ font-family: var(
290
+ --font-caption-medium-family,
291
+ var(
292
+ --theme-button-font-body-medium-family,
293
+ var(--font-body-medium-family, "Pretendard")
294
+ )
295
+ );
296
+ font-size: var(
297
+ --font-caption-medium-size,
298
+ var(
299
+ --theme-button-font-body-medium-size,
300
+ var(--font-body-medium-size, 16px)
301
+ )
302
+ );
303
+ font-weight: var(
304
+ --font-caption-medium-weight,
305
+ var(--theme-button-font-weight, 400)
306
+ );
307
+ line-height: var(
308
+ --font-caption-medium-line-height,
309
+ var(
310
+ --theme-button-font-body-medium-line-height,
311
+ var(--font-body-medium-line-height, 24px)
312
+ )
313
+ );
314
+ letter-spacing: var(
315
+ --font-caption-medium-letter-spacing,
316
+ var(
317
+ --theme-button-font-body-medium-letter-spacing,
318
+ var(--font-body-medium-letter-spacing, 0px)
319
+ )
320
+ );
321
+ }
322
+
323
+ .button-icon,
324
+ .button-label,
325
+ .button-left,
326
+ .button-right {
327
+ display: inline-flex;
328
+ align-items: center;
329
+ justify-content: center;
330
+ }
331
+
332
+ &.button-block {
333
+ width: 100%;
334
+ }
320
335
  }
321
336
 
322
- .button:where([data-loading="true"]) {
337
+ .button[aria-busy="true"] {
323
338
  pointer-events: none;
324
339
  cursor: progress;
325
340
  }
326
341
 
327
- .button-icon,
328
- .button-label,
329
- .button-prefix,
330
- .button-suffix {
331
- display: inline-flex;
332
- align-items: center;
333
- justify-content: center;
334
- }
335
-
336
- @each $intent, $tokens in $button-intents {
337
- @include button-state-selector("solid", $intent) {
338
- background-color: intent-token($intent, solid-bg);
339
- border-color: intent-token($intent, solid-bg);
340
- color: intent-token($intent, solid-foreground);
342
+ @each $priority, $tokens in $button-priorities {
343
+ @include button-state-selector("solid", $priority) {
344
+ background-color: priority-token($priority, solid-bg);
345
+ border-color: priority-token($priority, solid-bg);
346
+ color: priority-token($priority, solid-foreground);
341
347
  &:disabled,
342
- &[data-disabled="true"] {
348
+ &[aria-disabled="true"] {
343
349
  background-color: var(
344
350
  --theme-button-color-bg-surface-standard,
345
351
  var(--color-bg-surface-standard)
@@ -354,26 +360,26 @@ $button-intents: (
354
360
  );
355
361
  }
356
362
 
357
- &:hover:not(:disabled),
358
- &[data-simulated-state="hover"]:not(:disabled) {
359
- background-color: intent-token($intent, solid-hover);
360
- border-color: intent-token($intent, solid-hover);
363
+ &:hover:not(:disabled):not([aria-disabled="true"]),
364
+ &[data-user-action="hover"]:not(:disabled):not([aria-disabled="true"]) {
365
+ background-color: priority-token($priority, solid-hover);
366
+ border-color: priority-token($priority, solid-hover);
361
367
  }
362
368
 
363
- &:active:not(:disabled),
364
- &[data-simulated-state="pressed"]:not(:disabled) {
365
- background-color: intent-token($intent, solid-active);
366
- border-color: intent-token($intent, solid-active);
369
+ &:active:not(:disabled):not([aria-disabled="true"]),
370
+ &[data-user-action="pressed"]:not(:disabled):not([aria-disabled="true"]) {
371
+ background-color: priority-token($priority, solid-active);
372
+ border-color: priority-token($priority, solid-active);
367
373
  }
368
374
  }
369
375
 
370
- @include button-state-selector("outlined", $intent) {
376
+ @include button-state-selector("outlined", $priority) {
371
377
  background-color: transparent;
372
- color: intent-token($intent, text-color);
373
- border-color: intent-token($intent, outline-border);
378
+ color: priority-token($priority, outline-foreground);
379
+ border-color: priority-token($priority, outline-border);
374
380
 
375
381
  &:disabled,
376
- &[data-disabled="true"] {
382
+ &[aria-disabled="true"] {
377
383
  background-color: var(
378
384
  --theme-button-color-bg-surface-standard,
379
385
  var(--color-bg-surface-standard)
@@ -388,71 +394,16 @@ $button-intents: (
388
394
  );
389
395
  }
390
396
 
391
- &:hover:not(:disabled),
392
- &[data-simulated-state="hover"]:not(:disabled) {
393
- background-color: intent-token($intent, outline-hover-bg);
394
- border-color: intent-token($intent, outline-border);
397
+ &:hover:not(:disabled):not([aria-disabled="true"]),
398
+ &[data-user-action="hover"]:not(:disabled):not([aria-disabled="true"]) {
399
+ background-color: priority-token($priority, outline-hover-bg);
400
+ border-color: priority-token($priority, outline-border);
395
401
  }
396
402
 
397
- &:active:not(:disabled),
398
- &[data-simulated-state="pressed"]:not(:disabled) {
399
- background-color: intent-token($intent, solid-bg);
400
- border-color: intent-token($intent, outline-border);
401
- }
402
- }
403
-
404
- @include button-state-selector("text-button", $intent) {
405
- border-color: transparent;
406
- background-color: transparent;
407
- color: intent-token($intent, text-color);
408
-
409
- $hover-bg: var(
410
- --theme-button-text-default-hover-bg,
411
- var(--color-tertiary-default)
412
- );
413
- $pressed-bg: var(
414
- --theme-button-text-default-pressed-bg,
415
- var(--color-tertiary-strong)
416
- );
417
-
418
- @if $intent == secondary {
419
- $hover-bg: var(
420
- --theme-button-text-secondary-hover-bg,
421
- var(--color-bg-alternative-cool-gray)
422
- );
423
- $pressed-bg: var(
424
- --theme-button-text-secondary-pressed-bg,
425
- var(--color-secondary-strong)
426
- );
427
- } @else if $intent == teritary {
428
- $hover-bg: var(
429
- --theme-button-text-tertiary-hover-bg,
430
- var(--color-bg-alternative-cool-gray)
431
- );
432
- $pressed-bg: var(
433
- --theme-button-text-tertiary-pressed-bg,
434
- var(--color-bg-surface-strong)
435
- );
436
- }
437
-
438
- &:hover:not(:disabled),
439
- &[data-simulated-state="hover"]:not(:disabled) {
440
- background-color: $hover-bg;
441
- }
442
-
443
- &:active:not(:disabled),
444
- &[data-simulated-state="pressed"]:not(:disabled) {
445
- background-color: $pressed-bg;
446
- }
447
-
448
- &:disabled,
449
- &[data-disabled="true"] {
450
- background-color: transparent;
451
- border-color: transparent;
452
- color: var(
453
- --theme-button-color-label-disabled,
454
- var(--color-label-disabled)
455
- );
403
+ &:active:not(:disabled):not([aria-disabled="true"]),
404
+ &[data-user-action="pressed"]:not(:disabled):not([aria-disabled="true"]) {
405
+ background-color: priority-token($priority, solid-bg);
406
+ border-color: priority-token($priority, outline-border);
456
407
  }
457
408
  }
458
409
  }
@@ -460,324 +411,155 @@ $button-intents: (
460
411
  $button-size-map: (
461
412
  small: (
462
413
  padding-inline: var(
463
- --theme-button-padding-3,
464
- var(--spacing-padding-3, 12px)
414
+ --theme-button-padding-6,
415
+ var(--spacing-padding-6, 24px)
465
416
  ),
466
- padding-block: var(--theme-button-padding-1, var(--spacing-padding-1, 2px)),
467
- gap: var(--theme-button-gap-1, var(--spacing-gap-1, 4px)),
468
- font-size: var(
417
+ padding-block: var(--theme-button-padding-2, var(--spacing-padding-2, 4px)),
418
+ gap: var(--theme-button-gap-2, var(--spacing-gap-2, 8px)),
419
+ text-font-size: var(
469
420
  --theme-button-font-label-medium-size,
470
421
  var(--font-label-medium-size, 14px)
471
422
  ),
472
- font-weight: var(
473
- --theme-button-font-label-medium-weight,
474
- var(--font-label-medium-weight, 400)
475
- ),
476
- line-height: var(
423
+ text-font-weight: var(--theme-button-font-weight, 400),
424
+ text-line-height: var(
477
425
  --theme-button-font-label-medium-line-height,
478
426
  var(--font-label-medium-line-height, 1.5em)
479
427
  ),
480
- letter-spacing: var(
428
+ text-letter-spacing: var(
481
429
  --theme-button-font-label-medium-letter-spacing,
482
430
  var(--font-label-medium-letter-spacing, 0px)
483
431
  ),
432
+ min-height: var(
433
+ --theme-button-size-small-3,
434
+ var(--theme-size-small-3, 32px)
435
+ ),
436
+ radius: var(
437
+ --theme-button-radius-medium-3,
438
+ var(--theme-radius-medium-3, 8px)
439
+ ),
484
440
  ),
485
441
  medium: (
486
442
  padding-inline: var(
487
- --theme-button-padding-4,
488
- var(--spacing-padding-4, 16px)
443
+ --theme-button-padding-7,
444
+ var(--spacing-padding-7, 20px)
489
445
  ),
490
446
  gap: var(--theme-button-gap-2, var(--spacing-gap-2, 8px)),
491
- padding-block: var(--theme-button-padding-2, var(--spacing-padding-2, 4px)),
492
- font-size: var(
447
+ padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px)),
448
+ text-font-size: var(
493
449
  --theme-button-font-label-large-size,
494
450
  var(--font-label-large-size, 16px)
495
451
  ),
496
- font-weight: var(
497
- --theme-button-font-label-large-weight,
498
- var(--font-label-large-weight, 400)
499
- ),
500
- line-height: var(
452
+ text-font-weight: var(--theme-button-font-weight, 400),
453
+ text-line-height: var(
501
454
  --theme-button-font-label-large-line-height,
502
455
  var(--font-label-large-line-height, 1.5em)
503
456
  ),
504
- letter-spacing: var(
457
+ text-letter-spacing: var(
505
458
  --theme-button-font-label-large-letter-spacing,
506
459
  var(--font-label-large-letter-spacing, 0px)
507
460
  ),
461
+ min-height: var(
462
+ --theme-button-size-medium-1,
463
+ var(--theme-size-medium-1, 40px)
464
+ ),
465
+ radius: var(
466
+ --theme-button-radius-medium-3,
467
+ var(--theme-radius-medium-3, 8px)
468
+ ),
508
469
  ),
509
470
  large: (
510
471
  padding-inline: var(
511
- --theme-button-padding-5,
512
- var(--spacing-padding-5, 20px)
472
+ --theme-button-padding-9,
473
+ var(--spacing-padding-9, 28px)
513
474
  ),
514
475
  gap: var(--theme-button-gap-3, var(--spacing-gap-3, 12px)),
515
- padding-block: var(--theme-button-padding-3, var(--spacing-padding-3, 6px)),
516
- font-size: var(
476
+ padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px)),
477
+ text-font-size: var(
517
478
  --theme-button-font-body-medium-size,
518
479
  var(--font-body-medium-size, 17px)
519
480
  ),
520
- font-weight: var(
521
- --theme-button-font-body-medium-weight,
522
- var(--font-body-medium-weight, 500)
523
- ),
524
- line-height: var(
481
+ text-font-weight: var(--theme-button-font-weight, 400),
482
+ text-line-height: var(
525
483
  --theme-button-font-body-medium-line-height,
526
484
  var(--font-body-medium-line-height, 1.5em)
527
485
  ),
528
- letter-spacing: var(
486
+ text-letter-spacing: var(
529
487
  --theme-button-font-body-medium-letter-spacing,
530
488
  var(--font-body-medium-letter-spacing, 0px)
531
489
  ),
490
+ min-height: var(
491
+ --theme-button-size-medium-2,
492
+ var(--theme-size-medium-2, 48px)
493
+ ),
494
+ radius: var(
495
+ --theme-button-radius-large-1,
496
+ var(--theme-radius-large-1, 12px)
497
+ ),
532
498
  ),
533
499
  xlarge: (
534
500
  padding-inline: var(
535
- --theme-button-padding-6,
536
- var(--spacing-padding-6, 24px)
501
+ --theme-button-padding-9,
502
+ var(--spacing-padding-9, 28px)
537
503
  ),
538
504
  gap: var(--theme-button-gap-3, var(--spacing-gap-3, 12px)),
539
- padding-block: var(--theme-button-padding-4, var(--spacing-padding-4, 8px)),
540
- font-size: var(
505
+ padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px)),
506
+ text-font-size: var(
541
507
  --theme-button-font-body-large-size,
542
508
  var(--font-body-large-size, 19px)
543
509
  ),
544
- font-weight: var(
545
- --theme-button-font-body-large-weight,
546
- var(--font-body-large-weight, 600)
547
- ),
548
- line-height: var(
510
+ text-font-weight: var(--theme-button-font-weight, 400),
511
+ text-line-height: var(
549
512
  --theme-button-font-body-large-line-height,
550
513
  var(--font-body-large-line-height, 1.5em)
551
514
  ),
552
- letter-spacing: var(
515
+ text-letter-spacing: var(
553
516
  --theme-button-font-body-large-letter-spacing,
554
517
  var(--font-body-large-letter-spacing, 0px)
555
518
  ),
556
- ),
557
- );
558
-
559
- $button-padding-default: (
560
- small: (
561
- padding-block: var(--theme-button-padding-2, var(--spacing-padding-2, 4px)),
562
- padding-inline: var(
563
- --theme-button-padding-6,
564
- var(--spacing-padding-6, 24px)
565
- ),
566
- ),
567
- medium: (
568
- padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px)),
569
- padding-inline: var(
570
- --theme-button-padding-7,
571
- var(--spacing-padding-7, 20px)
572
- ),
573
- ),
574
- large: (
575
- padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px)),
576
- padding-inline: var(
577
- --theme-button-padding-9,
578
- var(--spacing-padding-9, 28px)
579
- ),
580
- ),
581
- xlarge: (
582
- padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px)),
583
- padding-inline: var(
584
- --theme-button-padding-9,
585
- var(--spacing-padding-9, 28px)
586
- ),
587
- ),
588
- );
589
-
590
- $button-padding-round: (
591
- small: (
592
- padding-block: var(--theme-button-padding-2, var(--spacing-padding-2, 4px)),
593
- padding-inline: var(
594
- --theme-button-padding-5,
595
- var(--spacing-padding-5, 20px)
596
- ),
597
- ),
598
- medium: (
599
- padding-block: var(--theme-button-padding-2, var(--spacing-padding-2, 4px)),
600
- padding-inline: var(
601
- --theme-button-padding-6,
602
- var(--spacing-padding-6, 24px)
519
+ min-height: var(
520
+ --theme-button-size-medium-3,
521
+ var(--theme-size-medium-3, 56px)
603
522
  ),
604
- ),
605
- large: (
606
- padding-block: var(--theme-button-padding-2, var(--spacing-padding-2, 4px)),
607
- padding-inline: var(
608
- --theme-button-padding-7,
609
- var(--spacing-padding-7, 20px)
610
- ),
611
- ),
612
- );
613
-
614
- $button-padding-text: (
615
- small: (
616
- padding-block: var(--theme-button-padding-4, var(--spacing-padding-4, 8px)),
617
- padding-inline: var(--theme-button-padding-4, var(--spacing-padding-4, 8px)),
618
- ),
619
- medium: (
620
- padding-block: var(--theme-button-padding-4, var(--spacing-padding-4, 8px)),
621
- padding-inline: var(
622
- --theme-button-padding-5,
623
- var(--spacing-padding-5, 12px)
624
- ),
625
- ),
626
- large: (
627
- padding-block: var(--theme-button-padding-4, var(--spacing-padding-4, 8px)),
628
- padding-inline: var(
629
- --theme-button-padding-5,
630
- var(--spacing-padding-5, 12px)
523
+ radius: var(
524
+ --theme-button-radius-large-2,
525
+ var(--theme-radius-large-2, 16px)
631
526
  ),
632
527
  ),
633
528
  );
634
529
 
635
530
  @each $size, $tokens in $button-size-map {
636
- .button:where([data-size="#{$size}"]) {
531
+ .button.button-size-#{$size} {
637
532
  padding-inline: map.get($tokens, padding-inline);
638
533
  gap: map.get($tokens, gap);
639
534
  padding-block: map.get($tokens, padding-block);
640
- font-size: map.get($tokens, font-size);
641
- font-weight: var(--theme-button-font-weight, 400);
642
- line-height: map.get($tokens, line-height);
643
- letter-spacing: map.get($tokens, letter-spacing);
644
- }
645
- }
646
-
647
- @mixin button-padding-variant($variant, $map) {
648
- @each $size, $tokens in $map {
649
- .button:where([data-variant="#{$variant}"][data-size="#{$size}"]) {
650
- padding-block: map.get($tokens, padding-block);
651
- padding-inline: map.get($tokens, padding-inline);
652
- }
653
- }
654
- }
655
-
656
- @mixin button-padding-shape($shape, $map) {
657
- @each $size, $tokens in $map {
658
- .button:where([data-shape="#{$shape}"][data-size="#{$size}"]) {
659
- padding-block: map.get($tokens, padding-block);
660
- padding-inline: map.get($tokens, padding-inline);
535
+ min-height: map.get($tokens, min-height);
536
+ border-radius: map.get($tokens, radius);
537
+
538
+ span {
539
+ font-size: map.get($tokens, text-font-size);
540
+ font-weight: map.get($tokens, text-font-weight);
541
+ line-height: map.get($tokens, text-line-height);
542
+ letter-spacing: map.get($tokens, text-letter-spacing);
661
543
  }
662
544
  }
663
545
  }
664
546
 
665
- @include button-padding-variant("solid", $button-padding-default);
666
- @include button-padding-variant("outlined", $button-padding-default);
667
- @include button-padding-variant("text-button", $button-padding-text);
668
- @include button-padding-shape("round", $button-padding-round);
669
-
670
- $button-dimension-default: (
671
- small: (
672
- height: var(--theme-button-size-small-3, var(--theme-size-small-3, 32px)),
673
- radius: var(
674
- --theme-button-radius-medium-3,
675
- var(--theme-radius-medium-3, 8px)
676
- ),
677
- ),
678
- medium: (
679
- height: var(--theme-button-size-medium-1, var(--theme-size-medium-1, 40px)),
680
- radius: var(
681
- --theme-button-radius-medium-3,
682
- var(--theme-radius-medium-3, 8px)
683
- ),
684
- ),
685
- large: (
686
- height: var(--theme-button-size-medium-2, var(--theme-size-medium-2, 48px)),
687
- radius: var(
688
- --theme-button-radius-large-1,
689
- var(--theme-radius-large-1, 12px)
690
- ),
691
- ),
692
- xlarge: (
693
- height: var(--theme-button-size-medium-3, var(--theme-size-medium-3, 56px)),
694
- radius: var(
695
- --theme-button-radius-large-2,
696
- var(--theme-radius-large-2, 16px)
697
- ),
698
- ),
699
- );
700
-
701
- $button-dimension-round: (
702
- small: (
703
- height: var(--theme-button-size-small-2, var(--theme-size-small-2, 24px)),
704
- radius: var(--theme-button-size-small-2, var(--theme-size-small-2, 24px)),
705
- ),
706
- medium: (
707
- height: var(--theme-button-size-small-3, var(--theme-size-small-3, 32px)),
708
- radius: var(--theme-button-size-small-3, var(--theme-size-small-3, 32px)),
709
- ),
710
- large: (
711
- height: var(--theme-button-size-medium-1, var(--theme-size-medium-1, 40px)),
712
- radius: var(--theme-button-size-medium-1, var(--theme-size-medium-1, 40px)),
713
- ),
714
- );
715
-
716
- $button-dimension-text: (
717
- small: (
718
- height: var(--theme-button-size-small-1, var(--theme-size-small-1, 20px)),
719
- radius: var(
720
- --theme-button-radius-medium-3,
721
- var(--theme-radius-medium-3, 8px)
722
- ),
723
- ),
724
- medium: (
725
- height: var(--theme-button-size-small-2, var(--theme-size-small-2, 24px)),
726
- radius: var(
727
- --theme-button-radius-medium-3,
728
- var(--theme-radius-medium-3, 8px)
729
- ),
730
- ),
731
- large: (
732
- height: var(--theme-button-size-small-3, var(--theme-size-small-3, 32px)),
733
- radius: var(
734
- --theme-button-radius-medium-3,
735
- var(--theme-radius-medium-3, 8px)
736
- ),
737
- ),
738
- );
739
-
740
- @mixin button-dimension-variant($variant, $map) {
741
- @each $size, $tokens in $map {
742
- .button:where([data-variant="#{$variant}"][data-size="#{$size}"]) {
743
- height: map.get($tokens, height);
744
- border-radius: map.get($tokens, radius);
745
- }
746
- }
747
- }
748
-
749
- @mixin button-dimension-shape($shape, $map) {
750
- @each $size, $tokens in $map {
751
- .button:where([data-shape="#{$shape}"][data-size="#{$size}"]) {
752
- height: map.get($tokens, height);
753
- border-radius: map.get($tokens, radius);
754
- }
755
- }
756
- }
757
-
758
- @include button-dimension-variant("solid", $button-dimension-default);
759
- @include button-dimension-variant("outlined", $button-dimension-default);
760
- @include button-dimension-variant("text-button", $button-dimension-text);
761
- @include button-dimension-shape("round", $button-dimension-round);
762
-
763
- /* Radix Themes outline variant는 box-shadow가 default로 들어가므로 제거 */
764
- .button.rt-variant-outline,
765
- .button:where([data-variant="outlined"]) {
547
+ .button.button-fill-outlined {
766
548
  box-shadow: none;
767
549
  }
768
550
 
769
551
  @include button-overlay-state("solid", "secondary", transparent, 0, 0);
770
552
 
771
- .button:where([data-variant="solid"][data-intent="secondary"]) {
772
- &:hover:not(:disabled),
773
- &[data-simulated-state="hover"]:not(:disabled) {
553
+ .button.button-fill-solid.button-priority-secondary {
554
+ &:hover:not(:disabled):not([aria-disabled="true"]),
555
+ &[data-user-action="hover"]:not(:disabled):not([aria-disabled="true"]) {
774
556
  background-color: var(--theme-button-secondary-solid-hover-bg, #dbe9ff);
775
557
  border-color: var(--theme-button-secondary-solid-hover-bg, #dbe9ff);
776
558
  box-shadow: none;
777
559
  }
778
560
 
779
- &:active:not(:disabled),
780
- &[data-simulated-state="pressed"]:not(:disabled) {
561
+ &:active:not(:disabled):not([aria-disabled="true"]),
562
+ &[data-user-action="pressed"]:not(:disabled):not([aria-disabled="true"]) {
781
563
  background-color: var(--theme-button-secondary-solid-pressed-bg, #ccdeff);
782
564
  border-color: var(--theme-button-secondary-solid-pressed-bg, #ccdeff);
783
565
  box-shadow: none;
@@ -786,11 +568,11 @@ $button-dimension-text: (
786
568
 
787
569
  @include button-overlay-state(
788
570
  "solid",
789
- "teritary",
571
+ "tertiary",
790
572
  var(--color-border-standard-strong, var(--color-bg-surface-strong)),
791
573
  0.68,
792
574
  0.48,
793
- intent-token(teritary, solid-bg)
575
+ priority-token(tertiary, solid-bg)
794
576
  );
795
577
 
796
578
  @include button-overlay-state(
@@ -799,7 +581,7 @@ $button-dimension-text: (
799
581
  var(--theme-button-overlay-outlined-primary-bg, var(--color-blue-90)),
800
582
  0.68,
801
583
  0.28,
802
- intent-token(primary, outline-border)
584
+ priority-token(primary, outline-border)
803
585
  );
804
586
 
805
587
  @include button-overlay-state(
@@ -808,20 +590,20 @@ $button-dimension-text: (
808
590
  var(--theme-button-overlay-outlined-secondary-bg, var(--color-cool-gray-95)),
809
591
  0.68,
810
592
  0.28,
811
- intent-token(secondary, outline-border)
593
+ priority-token(secondary, outline-border)
812
594
  );
813
595
 
814
596
  @include button-overlay-state(
815
597
  "outlined",
816
- "teritary",
598
+ "tertiary",
817
599
  var(--theme-button-overlay-outlined-tertiary-bg, var(--color-cool-gray-95)),
818
600
  0.68,
819
601
  0.28,
820
- intent-token(teritary, outline-border)
602
+ priority-token(tertiary, outline-border)
821
603
  );
822
604
 
823
605
  .button:disabled,
824
- .button:where([data-disabled="true"]) {
606
+ .button[aria-disabled="true"] {
825
607
  background-color: var(
826
608
  --theme-button-color-bg-surface-standard,
827
609
  var(--color-bg-surface-standard)
@@ -834,14 +616,10 @@ $button-dimension-text: (
834
616
  cursor: not-allowed;
835
617
  }
836
618
 
837
- .button:where([data-shape="round"]) {
838
- border-radius: 9999px;
839
- }
840
-
841
- .button:where([data-icon-slot="left"]) .button-label {
619
+ .button.button-icon-left .button-label {
842
620
  margin-left: var(--theme-button-gap-1, var(--spacing-gap-1, 4px));
843
621
  }
844
622
 
845
- .button:where([data-icon-slot="right"]) .button-label {
623
+ .button.button-icon-right .button-label {
846
624
  margin-right: var(--theme-button-gap-1, var(--spacing-gap-1, 4px));
847
625
  }