@uniai-fe/uds-primitives 0.1.8 → 0.1.10

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 (30) hide show
  1. package/README.md +11 -3
  2. package/dist/styles.css +144 -70
  3. package/package.json +7 -7
  4. package/src/components/alternate/img/spinner-large-52x52.svg +9 -0
  5. package/src/components/alternate/img/spinner-medium-36x36.svg +9 -0
  6. package/src/components/alternate/img/spinner-small-24x24.svg +9 -0
  7. package/src/components/alternate/index.scss +1 -1
  8. package/src/components/alternate/index.tsx +1 -1
  9. package/src/components/alternate/markup/empty/Data.tsx +26 -0
  10. package/src/components/alternate/markup/index.tsx +11 -4
  11. package/src/components/alternate/markup/loading/Default.tsx +32 -0
  12. package/src/components/alternate/markup/loading/Icon.tsx +38 -0
  13. package/src/components/alternate/styles/alternate.scss +69 -0
  14. package/src/components/alternate/styles/index.scss +1 -0
  15. package/src/components/button/index.tsx +1 -0
  16. package/src/components/button/markup/ButtonDefault.tsx +58 -107
  17. package/src/components/button/markup/ButtonRounded.tsx +18 -32
  18. package/src/components/button/markup/ButtonText.tsx +18 -33
  19. package/src/components/button/styles/button.scss +28 -10
  20. package/src/components/button/styles/round-button.scss +4 -4
  21. package/src/components/button/styles/text-button.scss +7 -7
  22. package/src/components/button/types/constants.ts +149 -0
  23. package/src/components/button/types/index.ts +107 -87
  24. package/src/components/button/types/templates.ts +61 -10
  25. package/src/components/button/utils/index.ts +2 -45
  26. package/src/components/input/markup/text/InputUtilityButton.tsx +2 -0
  27. package/src/components/slot/index.tsx +6 -0
  28. package/src/components/slot/markup/Component.tsx +34 -0
  29. package/src/components/slot/types/props.ts +66 -0
  30. package/src/index.tsx +1 -0
package/README.md CHANGED
@@ -40,7 +40,7 @@ import { Button } from "@uniai-fe/uds-primitives";
40
40
 
41
41
  export default function Page() {
42
42
  return (
43
- <Button.Default scale="solid-medium" priority="primary">
43
+ <Button.Default fill="solid" size="medium" priority="primary">
44
44
  확인
45
45
  </Button.Default>
46
46
  );
@@ -58,7 +58,8 @@ function LinkButton() {
58
58
  <Button.Default
59
59
  as={Link}
60
60
  href="/dashboard"
61
- scale="outlined-medium"
61
+ fill="outlined"
62
+ size="medium"
62
63
  priority="secondary"
63
64
  >
64
65
  대시보드로 이동
@@ -72,7 +73,7 @@ function LinkButton() {
72
73
  - 기본 클래스: `.button` (padding/height/radius/타이포/커서 담당)
73
74
  - 슬롯: `button-label`, `button-icon`, `button-left`, `button-right`, `button-loading`
74
75
  - Modifier: `button-scale-*`, `button-fill-*`, `button-priority-*`, `button-state-*`, `button-size-*`, `button-block`, `button-icon-left/right`
75
- - 차기 리팩토링에서는 디자인 관련 props를 `scale`(레이아웃/spacing 집합)과 `priority`(color set) 축으로 단순화하고, 나머지는 상태/slot 위주의 역할 props만 남긴다. 자세한 계획은 `docs/CONTEXT-BUTTON.md`에서 확인할 수 있다.
76
+ - `scale` prop은 legacy 호환용이며 `fill`/`size`를 명시 사용하는 것이 권장된다.
76
77
  - `loading` 상태는 readonly와 동일하게 잠기며 hover/pressed 반응을 막는다. anchor 등 커스텀 요소도 `aria-disabled="true"`를 통해 동일한 스타일을 적용받는다.
77
78
 
78
79
  ### TextButton / RoundButton 템플릿
@@ -102,6 +103,13 @@ function Templates() {
102
103
  - 템플릿별 클래스를 추가로 노출한다: `.button-template-text`, `.button-template-text-size-*`, `.button-template-round`, `.button-template-round-size-*`.
103
104
  - 스토리북 `primitives/Button` Story에서 solid/outlined/텍스트/라운드 4가지 카테고리를 한 번에 확인할 수 있다.
104
105
 
106
+ ### SlotComponent (폴리모픽 as 래퍼)
107
+
108
+ - `Button.Default`는 `SlotComponent`를 통해 `as` prop으로 전달된 요소(예: `Link`, `a`, `button`)에 공통 속성/`ref`를 안전하게 전달한다.
109
+ - `SlotComponentProps<C>`는 React가 허용하는 모든 native props + `data-*` 속성을 그대로 포함하고, `as/children/className`만 재정의한다.
110
+ - 필요 시 `import { SlotComponent } from "@uniai-fe/uds-primitives";`로 직접 사용해 카드/배너 등의 래퍼를 구현할 수 있다.
111
+ - 자세한 도입 배경과 API는 `docs/CONTEXT-SLOT.md`에서 확인할 수 있다.
112
+
105
113
  ### 최근 업데이트
106
114
 
107
115
  - TextInput Base 컴포넌트의 `clear` 버튼 로직을 pointer 이벤트 기반으로 재작성해 모바일 터치 환경에서도 안정적으로 입력값이 초기화되도록 했다.
package/dist/styles.css CHANGED
@@ -254,6 +254,66 @@
254
254
  --divider-margin: var(--spacing-gap-4, 8px);
255
255
  }
256
256
 
257
+ @keyframes alternate-loading-spin {
258
+ 0% {
259
+ transform: rotate(0deg);
260
+ }
261
+ 100% {
262
+ transform: rotate(360deg);
263
+ }
264
+ }
265
+ .alternate {
266
+ width: 100%;
267
+ height: 100%;
268
+ display: flex;
269
+ flex-direction: column;
270
+ align-items: center;
271
+ justify-content: center;
272
+ }
273
+ .alternate .empty-text {
274
+ font-size: 1.4rem;
275
+ color: var(--color-cool-gray-70);
276
+ line-height: 1.5;
277
+ word-break: keep-all;
278
+ text-align: center;
279
+ }
280
+ .alternate.is-horizontal {
281
+ flex-direction: row;
282
+ }
283
+ .alternate.is-horizontal.loading .empty-text {
284
+ transform: translateY(0.2rem);
285
+ }
286
+ .alternate.is-vertical {
287
+ flex-direction: column;
288
+ }
289
+
290
+ .alternate-loading-icon {
291
+ width: 2.4rem;
292
+ height: 2.4rem;
293
+ position: relative;
294
+ margin: 0;
295
+ display: flex;
296
+ align-items: center;
297
+ justify-content: center;
298
+ animation: alternate-loading-spin 1s linear infinite;
299
+ }
300
+ .alternate-loading-icon.is-horizontal {
301
+ margin-right: 1rem;
302
+ }
303
+ .alternate-loading-icon.is-vertical {
304
+ margin-bottom: 1rem;
305
+ }
306
+ .alternate-loading-icon.is-medium {
307
+ width: 3.6rem;
308
+ height: 3.6rem;
309
+ }
310
+ .alternate-loading-icon.is-large {
311
+ width: 5.2rem;
312
+ height: 5.2rem;
313
+ }
314
+
315
+
316
+
257
317
  .badge {
258
318
  --badge-height: var(--theme-badge-height-xsmall);
259
319
  --badge-padding-inline: var(--theme-badge-padding-inline-xsmall);
@@ -431,7 +491,7 @@
431
491
 
432
492
 
433
493
  /* Primitives 버튼 공통 스타일 */
434
- .button {
494
+ :where(.button) {
435
495
  display: flex;
436
496
  align-items: center;
437
497
  justify-content: center;
@@ -449,210 +509,224 @@
449
509
  filter: none;
450
510
  cursor: pointer;
451
511
  }
452
- .button span {
512
+ :where(.button) span {
453
513
  font-family: var(--font-caption-medium-family, var(--theme-button-font-body-medium-family, var(--font-body-medium-family, "Pretendard")));
454
514
  font-size: var(--font-caption-medium-size, var(--theme-button-font-body-medium-size, var(--font-body-medium-size, 16px)));
455
515
  font-weight: var(--font-caption-medium-weight, var(--theme-button-font-weight, 400));
456
516
  line-height: var(--font-caption-medium-line-height, var(--theme-button-font-body-medium-line-height, var(--font-body-medium-line-height, 24px)));
457
517
  letter-spacing: var(--font-caption-medium-letter-spacing, var(--theme-button-font-body-medium-letter-spacing, var(--font-body-medium-letter-spacing, 0px)));
458
518
  }
459
- .button .button-icon,
460
- .button .button-label,
461
- .button .button-left,
462
- .button .button-right {
519
+ :where(.button) .button-icon,
520
+ :where(.button) .button-label,
521
+ :where(.button) .button-left,
522
+ :where(.button) .button-right {
463
523
  display: inline-flex;
464
524
  align-items: center;
465
525
  justify-content: center;
466
526
  }
467
- .button.button-block {
527
+ :where(.button).button-block {
468
528
  width: 100%;
469
529
  }
470
530
 
471
- .button[aria-busy=true] {
531
+ :where(.button):not(.button-fill-solid):not(.button-fill-outlined) {
532
+ background-color: transparent;
533
+ border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
534
+ color: var(--theme-button-color-cool-gray-10, var(--color-cool-gray-10));
535
+ }
536
+ :where(.button):not(.button-fill-solid):not(.button-fill-outlined):hover:not(:disabled):not([aria-disabled=true]), :where(.button):not(.button-fill-solid):not(.button-fill-outlined)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
537
+ background-color: var(--theme-button-color-cool-gray-95, var(--color-cool-gray-95));
538
+ border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
539
+ }
540
+ :where(.button):not(.button-fill-solid):not(.button-fill-outlined):active:not(:disabled):not([aria-disabled=true]), :where(.button):not(.button-fill-solid):not(.button-fill-outlined)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
541
+ background-color: var(--theme-button-tertiary-solid-bg, var(--color-bg-surface-neutral));
542
+ border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
543
+ }
544
+
545
+ :where(.button)[aria-busy=true] {
472
546
  pointer-events: none;
473
547
  cursor: progress;
474
548
  }
475
549
 
476
- .button.button-fill-solid.button-priority-primary {
550
+ :where(.button.button-fill-solid.button-priority-primary) {
477
551
  background-color: var(--theme-button-color-primary-default, var(--color-primary-default));
478
552
  border-color: var(--theme-button-color-primary-default, var(--color-primary-default));
479
553
  color: var(--theme-button-color-common-100, var(--color-common-100));
480
554
  }
481
- .button.button-fill-solid.button-priority-primary:disabled, .button.button-fill-solid.button-priority-primary[aria-disabled=true] {
555
+ :where(.button.button-fill-solid.button-priority-primary):disabled, :where(.button.button-fill-solid.button-priority-primary)[aria-disabled=true] {
482
556
  background-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
483
557
  border-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
484
558
  color: var(--theme-button-color-label-disabled, var(--color-label-disabled));
485
559
  }
486
- .button.button-fill-solid.button-priority-primary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-primary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
560
+ :where(.button.button-fill-solid.button-priority-primary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-primary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
487
561
  background-color: var(--theme-button-color-blue-50, var(--color-blue-50));
488
562
  border-color: var(--theme-button-color-blue-50, var(--color-blue-50));
489
563
  }
490
- .button.button-fill-solid.button-priority-primary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-primary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
564
+ :where(.button.button-fill-solid.button-priority-primary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-primary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
491
565
  background-color: var(--theme-button-color-blue-45, var(--color-blue-45));
492
566
  border-color: var(--theme-button-color-blue-45, var(--color-blue-45));
493
567
  }
494
568
 
495
- .button.button-fill-outlined.button-priority-primary {
569
+ :where(.button.button-fill-outlined.button-priority-primary) {
496
570
  background-color: transparent;
497
571
  color: var(--theme-button-color-primary-default, var(--color-primary-default));
498
572
  border-color: var(--theme-button-color-primary-default, var(--color-primary-default));
499
573
  }
500
- .button.button-fill-outlined.button-priority-primary:disabled, .button.button-fill-outlined.button-priority-primary[aria-disabled=true] {
574
+ :where(.button.button-fill-outlined.button-priority-primary):disabled, :where(.button.button-fill-outlined.button-priority-primary)[aria-disabled=true] {
501
575
  background-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
502
576
  border-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
503
577
  color: var(--theme-button-color-label-disabled, var(--color-label-disabled));
504
578
  }
505
- .button.button-fill-outlined.button-priority-primary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-primary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
579
+ :where(.button.button-fill-outlined.button-priority-primary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-primary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
506
580
  background-color: var(--theme-button-color-primary-default, var(--color-primary-default));
507
581
  border-color: var(--theme-button-color-primary-default, var(--color-primary-default));
508
582
  }
509
- .button.button-fill-outlined.button-priority-primary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-primary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
583
+ :where(.button.button-fill-outlined.button-priority-primary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-primary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
510
584
  background-color: var(--theme-button-color-primary-default, var(--color-primary-default));
511
585
  border-color: var(--theme-button-color-primary-default, var(--color-primary-default));
512
586
  }
513
587
 
514
- .button.button-fill-solid.button-priority-secondary {
588
+ :where(.button.button-fill-solid.button-priority-secondary) {
515
589
  background-color: var(--theme-button-secondary-solid-bg, var(--color-blue-95, #e5eeff));
516
590
  border-color: var(--theme-button-secondary-solid-bg, var(--color-blue-95, #e5eeff));
517
591
  color: var(--theme-button-color-primary-default, var(--color-primary-default));
518
592
  }
519
- .button.button-fill-solid.button-priority-secondary:disabled, .button.button-fill-solid.button-priority-secondary[aria-disabled=true] {
593
+ :where(.button.button-fill-solid.button-priority-secondary):disabled, :where(.button.button-fill-solid.button-priority-secondary)[aria-disabled=true] {
520
594
  background-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
521
595
  border-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
522
596
  color: var(--theme-button-color-label-disabled, var(--color-label-disabled));
523
597
  }
524
- .button.button-fill-solid.button-priority-secondary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-secondary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
598
+ :where(.button.button-fill-solid.button-priority-secondary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-secondary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
525
599
  background-color: var(--theme-button-secondary-solid-hover-bg, #dbe9ff);
526
600
  border-color: var(--theme-button-secondary-solid-hover-bg, #dbe9ff);
527
601
  }
528
- .button.button-fill-solid.button-priority-secondary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-secondary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
602
+ :where(.button.button-fill-solid.button-priority-secondary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-secondary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
529
603
  background-color: var(--theme-button-secondary-solid-pressed-bg, #ccdeff);
530
604
  border-color: var(--theme-button-secondary-solid-pressed-bg, #ccdeff);
531
605
  }
532
606
 
533
- .button.button-fill-outlined.button-priority-secondary {
607
+ :where(.button.button-fill-outlined.button-priority-secondary) {
534
608
  background-color: transparent;
535
609
  color: var(--theme-button-color-primary-default, var(--color-primary-default));
536
610
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
537
611
  }
538
- .button.button-fill-outlined.button-priority-secondary:disabled, .button.button-fill-outlined.button-priority-secondary[aria-disabled=true] {
612
+ :where(.button.button-fill-outlined.button-priority-secondary):disabled, :where(.button.button-fill-outlined.button-priority-secondary)[aria-disabled=true] {
539
613
  background-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
540
614
  border-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
541
615
  color: var(--theme-button-color-label-disabled, var(--color-label-disabled));
542
616
  }
543
- .button.button-fill-outlined.button-priority-secondary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-secondary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
617
+ :where(.button.button-fill-outlined.button-priority-secondary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-secondary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
544
618
  background-color: var(--theme-button-color-blue-90, var(--color-blue-90));
545
619
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
546
620
  }
547
- .button.button-fill-outlined.button-priority-secondary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-secondary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
621
+ :where(.button.button-fill-outlined.button-priority-secondary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-secondary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
548
622
  background-color: var(--theme-button-secondary-solid-bg, var(--color-blue-95, #e5eeff));
549
623
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
550
624
  }
551
625
 
552
- .button.button-fill-solid.button-priority-tertiary {
626
+ :where(.button.button-fill-solid.button-priority-tertiary) {
553
627
  background-color: var(--theme-button-tertiary-solid-bg, var(--color-bg-surface-neutral));
554
628
  border-color: var(--theme-button-tertiary-solid-bg, var(--color-bg-surface-neutral));
555
629
  color: var(--theme-button-tertiary-solid-foreground, var(--color-label-neutral));
556
630
  }
557
- .button.button-fill-solid.button-priority-tertiary:disabled, .button.button-fill-solid.button-priority-tertiary[aria-disabled=true] {
631
+ :where(.button.button-fill-solid.button-priority-tertiary):disabled, :where(.button.button-fill-solid.button-priority-tertiary)[aria-disabled=true] {
558
632
  background-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
559
633
  border-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
560
634
  color: var(--theme-button-color-label-disabled, var(--color-label-disabled));
561
635
  }
562
- .button.button-fill-solid.button-priority-tertiary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-tertiary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
636
+ :where(.button.button-fill-solid.button-priority-tertiary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-tertiary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
563
637
  background-color: var(--theme-button-tertiary-solid-hover-bg, var(--color-bg-surface-static-cool-gray));
564
638
  border-color: var(--theme-button-tertiary-solid-hover-bg, var(--color-bg-surface-static-cool-gray));
565
639
  }
566
- .button.button-fill-solid.button-priority-tertiary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-tertiary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
640
+ :where(.button.button-fill-solid.button-priority-tertiary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-tertiary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
567
641
  background-color: var(--theme-button-tertiary-solid-pressed-bg, var(--color-bg-surface-strong));
568
642
  border-color: var(--theme-button-tertiary-solid-pressed-bg, var(--color-bg-surface-strong));
569
643
  }
570
644
 
571
- .button.button-fill-outlined.button-priority-tertiary {
645
+ :where(.button.button-fill-outlined.button-priority-tertiary) {
572
646
  background-color: transparent;
573
647
  color: var(--theme-button-color-cool-gray-10, var(--color-cool-gray-10));
574
648
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
575
649
  }
576
- .button.button-fill-outlined.button-priority-tertiary:disabled, .button.button-fill-outlined.button-priority-tertiary[aria-disabled=true] {
650
+ :where(.button.button-fill-outlined.button-priority-tertiary):disabled, :where(.button.button-fill-outlined.button-priority-tertiary)[aria-disabled=true] {
577
651
  background-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
578
652
  border-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
579
653
  color: var(--theme-button-color-label-disabled, var(--color-label-disabled));
580
654
  }
581
- .button.button-fill-outlined.button-priority-tertiary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-tertiary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
655
+ :where(.button.button-fill-outlined.button-priority-tertiary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-tertiary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
582
656
  background-color: var(--theme-button-color-cool-gray-95, var(--color-cool-gray-95));
583
657
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
584
658
  }
585
- .button.button-fill-outlined.button-priority-tertiary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-tertiary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
659
+ :where(.button.button-fill-outlined.button-priority-tertiary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-tertiary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
586
660
  background-color: var(--theme-button-tertiary-solid-bg, var(--color-bg-surface-neutral));
587
661
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
588
662
  }
589
663
 
590
- .button.button-size-small {
664
+ :where(.button.button-size-small) {
591
665
  padding-inline: var(--theme-button-padding-6, var(--spacing-padding-6, 24px));
592
666
  gap: var(--theme-button-gap-2, var(--spacing-gap-2, 8px));
593
667
  padding-block: var(--theme-button-padding-2, var(--spacing-padding-2, 4px));
594
668
  min-height: var(--theme-button-size-small-3, var(--theme-size-small-3, 32px));
595
669
  border-radius: var(--theme-button-radius-medium-3, var(--theme-radius-medium-3, 8px));
596
670
  }
597
- .button.button-size-small span {
671
+ :where(.button.button-size-small) span {
598
672
  font-size: var(--theme-button-font-label-medium-size, var(--font-label-medium-size, 14px));
599
673
  font-weight: var(--theme-button-font-weight, 400);
600
674
  line-height: var(--theme-button-font-label-medium-line-height, var(--font-label-medium-line-height, 1.5em));
601
675
  letter-spacing: var(--theme-button-font-label-medium-letter-spacing, var(--font-label-medium-letter-spacing, 0px));
602
676
  }
603
677
 
604
- .button.button-size-medium {
678
+ :where(.button.button-size-medium) {
605
679
  padding-inline: var(--theme-button-padding-7, var(--spacing-padding-7, 20px));
606
680
  gap: var(--theme-button-gap-2, var(--spacing-gap-2, 8px));
607
681
  padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px));
608
682
  min-height: var(--theme-button-size-medium-1, var(--theme-size-medium-1, 40px));
609
683
  border-radius: var(--theme-button-radius-medium-3, var(--theme-radius-medium-3, 8px));
610
684
  }
611
- .button.button-size-medium span {
685
+ :where(.button.button-size-medium) span {
612
686
  font-size: var(--theme-button-font-label-large-size, var(--font-label-large-size, 16px));
613
687
  font-weight: var(--theme-button-font-weight, 400);
614
688
  line-height: var(--theme-button-font-label-large-line-height, var(--font-label-large-line-height, 1.5em));
615
689
  letter-spacing: var(--theme-button-font-label-large-letter-spacing, var(--font-label-large-letter-spacing, 0px));
616
690
  }
617
691
 
618
- .button.button-size-large {
692
+ :where(.button.button-size-large) {
619
693
  padding-inline: var(--theme-button-padding-9, var(--spacing-padding-9, 28px));
620
694
  gap: var(--theme-button-gap-3, var(--spacing-gap-3, 12px));
621
695
  padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px));
622
696
  min-height: var(--theme-button-size-medium-2, var(--theme-size-medium-2, 48px));
623
697
  border-radius: var(--theme-button-radius-large-1, var(--theme-radius-large-1, 12px));
624
698
  }
625
- .button.button-size-large span {
699
+ :where(.button.button-size-large) span {
626
700
  font-size: var(--theme-button-font-body-medium-size, var(--font-body-medium-size, 17px));
627
701
  font-weight: var(--theme-button-font-weight, 400);
628
702
  line-height: var(--theme-button-font-body-medium-line-height, var(--font-body-medium-line-height, 1.5em));
629
703
  letter-spacing: var(--theme-button-font-body-medium-letter-spacing, var(--font-body-medium-letter-spacing, 0px));
630
704
  }
631
705
 
632
- .button.button-size-xlarge {
706
+ :where(.button.button-size-xlarge) {
633
707
  padding-inline: var(--theme-button-padding-9, var(--spacing-padding-9, 28px));
634
708
  gap: var(--theme-button-gap-3, var(--spacing-gap-3, 12px));
635
709
  padding-block: var(--theme-button-padding-5, var(--spacing-padding-5, 12px));
636
710
  min-height: var(--theme-button-size-medium-3, var(--theme-size-medium-3, 56px));
637
711
  border-radius: var(--theme-button-radius-large-2, var(--theme-radius-large-2, 16px));
638
712
  }
639
- .button.button-size-xlarge span {
713
+ :where(.button.button-size-xlarge) span {
640
714
  font-size: var(--theme-button-font-body-large-size, var(--font-body-large-size, 19px));
641
715
  font-weight: var(--theme-button-font-weight, 400);
642
716
  line-height: var(--theme-button-font-body-large-line-height, var(--font-body-large-line-height, 1.5em));
643
717
  letter-spacing: var(--theme-button-font-body-large-letter-spacing, var(--font-body-large-letter-spacing, 0px));
644
718
  }
645
719
 
646
- .button.button-fill-outlined {
720
+ :where(.button.button-fill-outlined) {
647
721
  box-shadow: none;
648
722
  }
649
723
 
650
- .button.button-fill-solid.button-priority-secondary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-secondary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
724
+ :where(.button.button-fill-solid.button-priority-secondary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-secondary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
651
725
  background-color: transparent;
652
726
  border-color: transparent;
653
727
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0);
654
728
  }
655
- .button.button-fill-solid.button-priority-secondary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-secondary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
729
+ :where(.button.button-fill-solid.button-priority-secondary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-secondary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
656
730
  background-color: transparent;
657
731
  border-color: transparent;
658
732
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0);
@@ -669,67 +743,67 @@
669
743
  box-shadow: none;
670
744
  }
671
745
 
672
- .button.button-fill-solid.button-priority-tertiary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-tertiary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
746
+ :where(.button.button-fill-solid.button-priority-tertiary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-tertiary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
673
747
  background-color: var(--color-border-standard-strong, var(--color-bg-surface-strong));
674
748
  border-color: var(--theme-button-tertiary-solid-bg, var(--color-bg-surface-neutral));
675
749
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.68);
676
750
  }
677
- .button.button-fill-solid.button-priority-tertiary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-solid.button-priority-tertiary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
751
+ :where(.button.button-fill-solid.button-priority-tertiary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-solid.button-priority-tertiary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
678
752
  background-color: var(--color-border-standard-strong, var(--color-bg-surface-strong));
679
753
  border-color: var(--theme-button-tertiary-solid-bg, var(--color-bg-surface-neutral));
680
754
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.48);
681
755
  }
682
756
 
683
- .button.button-fill-outlined.button-priority-primary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-primary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
757
+ :where(.button.button-fill-outlined.button-priority-primary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-primary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
684
758
  background-color: var(--theme-button-overlay-outlined-primary-bg, var(--color-blue-90));
685
759
  border-color: var(--theme-button-color-primary-default, var(--color-primary-default));
686
760
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.68);
687
761
  }
688
- .button.button-fill-outlined.button-priority-primary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-primary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
762
+ :where(.button.button-fill-outlined.button-priority-primary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-primary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
689
763
  background-color: var(--theme-button-overlay-outlined-primary-bg, var(--color-blue-90));
690
764
  border-color: var(--theme-button-color-primary-default, var(--color-primary-default));
691
765
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.28);
692
766
  }
693
767
 
694
- .button.button-fill-outlined.button-priority-secondary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-secondary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
768
+ :where(.button.button-fill-outlined.button-priority-secondary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-secondary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
695
769
  background-color: var(--theme-button-overlay-outlined-secondary-bg, var(--color-cool-gray-95));
696
770
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
697
771
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.68);
698
772
  }
699
- .button.button-fill-outlined.button-priority-secondary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-secondary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
773
+ :where(.button.button-fill-outlined.button-priority-secondary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-secondary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
700
774
  background-color: var(--theme-button-overlay-outlined-secondary-bg, var(--color-cool-gray-95));
701
775
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
702
776
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.28);
703
777
  }
704
778
 
705
- .button.button-fill-outlined.button-priority-tertiary:hover:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-tertiary[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
779
+ :where(.button.button-fill-outlined.button-priority-tertiary):hover:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-tertiary)[data-user-action=hover]:not(:disabled):not([aria-disabled=true]) {
706
780
  background-color: var(--theme-button-overlay-outlined-tertiary-bg, var(--color-cool-gray-95));
707
781
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
708
782
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.68);
709
783
  }
710
- .button.button-fill-outlined.button-priority-tertiary:active:not(:disabled):not([aria-disabled=true]), .button.button-fill-outlined.button-priority-tertiary[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
784
+ :where(.button.button-fill-outlined.button-priority-tertiary):active:not(:disabled):not([aria-disabled=true]), :where(.button.button-fill-outlined.button-priority-tertiary)[data-user-action=pressed]:not(:disabled):not([aria-disabled=true]) {
711
785
  background-color: var(--theme-button-overlay-outlined-tertiary-bg, var(--color-cool-gray-95));
712
786
  border-color: var(--theme-button-color-cool-gray-90, var(--color-cool-gray-90));
713
787
  box-shadow: inset 0 0 0 999px rgba(255, 255, 255, 0.28);
714
788
  }
715
789
 
716
- .button:disabled,
717
- .button[aria-disabled=true] {
790
+ :where(.button:disabled),
791
+ :where(.button[aria-disabled=true]) {
718
792
  background-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
719
793
  border-color: var(--theme-button-color-bg-surface-standard, var(--color-bg-surface-standard));
720
794
  color: var(--theme-button-color-label-disabled, var(--color-label-disabled));
721
795
  cursor: not-allowed;
722
796
  }
723
797
 
724
- .button.button-icon-left .button-label {
798
+ :where(.button.button-icon-left) .button-label {
725
799
  margin-left: var(--theme-button-gap-1, var(--spacing-gap-1, 4px));
726
800
  }
727
801
 
728
- .button.button-icon-right .button-label {
802
+ :where(.button.button-icon-right) .button-label {
729
803
  margin-right: var(--theme-button-gap-1, var(--spacing-gap-1, 4px));
730
804
  }
731
805
 
732
- .button.button-template-text {
806
+ :where(.button.button-template-text) {
733
807
  min-width: auto;
734
808
  border-color: transparent;
735
809
  background-color: transparent;
@@ -740,66 +814,66 @@
740
814
  border-radius: var(--theme-button-text-radius, var(--theme-radius-small, 4px));
741
815
  }
742
816
 
743
- .button.button-template-text-size-small {
817
+ :where(.button.button-template-text-size-small) {
744
818
  min-height: var(--theme-button-text-min-height-small, var(--theme-size-small-1, 20px));
745
819
  padding-inline: var(--theme-button-text-padding-inline-small, var(--spacing-padding-4, 8px));
746
820
  }
747
821
 
748
- .button.button-template-text-size-medium {
822
+ :where(.button.button-template-text-size-medium) {
749
823
  min-height: var(--theme-button-text-min-height-medium, var(--theme-size-small-2, 24px));
750
824
  padding-inline: var(--theme-button-text-padding-inline-medium, var(--spacing-padding-5, 12px));
751
825
  }
752
826
 
753
- .button.button-template-text-size-large {
827
+ :where(.button.button-template-text-size-large) {
754
828
  min-height: var(--theme-button-text-min-height-large, var(--theme-size-small-3, 32px));
755
829
  padding-inline: var(--theme-button-text-padding-inline-large, var(--spacing-padding-5, 12px));
756
830
  }
757
831
 
758
- .button.button-template-text:disabled {
832
+ :where(.button.button-template-text:disabled) {
759
833
  background-color: transparent;
760
834
  border-color: transparent;
761
835
  }
762
836
 
763
- .button.button-template-text.button-priority-secondary {
837
+ :where(.button.button-template-text.button-priority-secondary) {
764
838
  color: var(--theme-button-color-primary-default, var(--color-primary-default));
765
839
  }
766
- .button.button-template-text.button-priority-secondary:hover:not(:disabled), .button.button-template-text.button-priority-secondary[data-user-action=hover]:not(:disabled) {
840
+ :where(.button.button-template-text.button-priority-secondary):hover:not(:disabled), :where(.button.button-template-text.button-priority-secondary)[data-user-action=hover]:not(:disabled) {
767
841
  background-color: var(--color-bg-alternative-cool-gray, var(--color-cool-gray-95));
768
842
  }
769
- .button.button-template-text.button-priority-secondary:active:not(:disabled), .button.button-template-text.button-priority-secondary[data-user-action=pressed]:not(:disabled) {
843
+ :where(.button.button-template-text.button-priority-secondary):active:not(:disabled), :where(.button.button-template-text.button-priority-secondary)[data-user-action=pressed]:not(:disabled) {
770
844
  background-color: var(--color-secondary-strong, var(--color-blue-90));
771
845
  }
772
846
 
773
- .button.button-template-text.button-priority-tertiary {
847
+ :where(.button.button-template-text.button-priority-tertiary) {
774
848
  color: var(--theme-button-color-cool-gray-10, var(--color-cool-gray-10));
775
849
  }
776
- .button.button-template-text.button-priority-tertiary:hover:not(:disabled), .button.button-template-text.button-priority-tertiary[data-user-action=hover]:not(:disabled) {
850
+ :where(.button.button-template-text.button-priority-tertiary):hover:not(:disabled), :where(.button.button-template-text.button-priority-tertiary)[data-user-action=hover]:not(:disabled) {
777
851
  background-color: var(--color-bg-alternative-cool-gray, var(--color-cool-gray-95));
778
852
  }
779
- .button.button-template-text.button-priority-tertiary:active:not(:disabled), .button.button-template-text.button-priority-tertiary[data-user-action=pressed]:not(:disabled) {
853
+ :where(.button.button-template-text.button-priority-tertiary):active:not(:disabled), :where(.button.button-template-text.button-priority-tertiary)[data-user-action=pressed]:not(:disabled) {
780
854
  background-color: var(--color-bg-surface-strong, var(--color-cool-gray-20));
781
855
  }
782
856
 
783
- .button.button-template-round {
857
+ :where(.button.button-template-round) {
784
858
  min-width: auto;
785
859
  padding-block: var(--theme-button-round-padding-block, var(--spacing-padding-2, 4px));
786
860
  padding-inline: var(--theme-button-round-padding-inline-medium, var(--spacing-padding-6, 16px));
787
861
  gap: var(--spacing-gap-2, 8px);
788
862
  }
789
863
 
790
- .button.button-template-round-size-small {
864
+ :where(.button.button-template-round-size-small) {
791
865
  min-height: var(--theme-button-round-min-height-small, var(--theme-size-small-2, 24px));
792
866
  padding-inline: var(--theme-button-round-padding-inline-small, var(--spacing-padding-5, 12px));
793
867
  border-radius: var(--theme-button-round-radius-small, var(--theme-radius-xlarge-2, 16px));
794
868
  }
795
869
 
796
- .button.button-template-round-size-medium {
870
+ :where(.button.button-template-round-size-medium) {
797
871
  min-height: var(--theme-button-round-min-height-medium, var(--theme-size-small-3, 32px));
798
872
  padding-inline: var(--theme-button-round-padding-inline-medium, var(--spacing-padding-6, 16px));
799
873
  border-radius: var(--theme-button-round-radius-medium, var(--theme-radius-xlarge-2, 16px));
800
874
  }
801
875
 
802
- .button.button-template-round-size-large {
876
+ :where(.button.button-template-round-size-large) {
803
877
  min-height: var(--theme-button-round-min-height-large, var(--theme-size-medium-1, 40px));
804
878
  padding-inline: var(--theme-button-round-padding-inline-large, var(--spacing-padding-7, 20px));
805
879
  border-radius: var(--theme-button-round-radius-large, 30px);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniai-fe/uds-primitives",
3
- "version": "0.1.8",
3
+ "version": "0.1.10",
4
4
  "description": "UNIAI Design System; Primitives Components Package",
5
5
  "type": "module",
6
6
  "private": false,
@@ -14,7 +14,7 @@
14
14
  "publishConfig": {
15
15
  "access": "public"
16
16
  },
17
- "packageManager": "pnpm@10.27.0",
17
+ "packageManager": "pnpm@10.28.0",
18
18
  "engines": {
19
19
  "node": ">=24",
20
20
  "pnpm": ">=10"
@@ -61,9 +61,9 @@
61
61
  "react-hook-form": "^7"
62
62
  },
63
63
  "dependencies": {
64
- "@mantine/core": "^8.3.11",
65
- "@mantine/dates": "^8.3.11",
66
- "@mantine/hooks": "^8.3.11",
64
+ "@mantine/core": "^8.3.12",
65
+ "@mantine/dates": "^8.3.12",
66
+ "@mantine/hooks": "^8.3.12",
67
67
  "@radix-ui/react-checkbox": "^1.3.3",
68
68
  "@radix-ui/react-tabs": "^1.1.13",
69
69
  "@radix-ui/react-toggle-group": "^1.1.11",
@@ -77,7 +77,7 @@
77
77
  "@radix-ui/react-visually-hidden": "^1.2.4",
78
78
  "@svgr/webpack": "^8.1.0",
79
79
  "@types/node": "^24.10.2",
80
- "@types/react": "^19.2.7",
80
+ "@types/react": "^19.2.8",
81
81
  "@types/react-dom": "^19.2.3",
82
82
  "@uniai-fe/eslint-config": "workspace:*",
83
83
  "@uniai-fe/next-devkit": "workspace:*",
@@ -86,7 +86,7 @@
86
86
  "@uniai-fe/util-functions": "workspace:*",
87
87
  "eslint": "^9.39.2",
88
88
  "prettier": "^3.7.4",
89
- "react-hook-form": "^7.70.0",
89
+ "react-hook-form": "^7.71.0",
90
90
  "sass": "^1.97.2",
91
91
  "typescript": "~5.9.3"
92
92
  }
@@ -0,0 +1,9 @@
1
+ <svg width="52" height="52" viewBox="0 0 52 52" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="26" cy="26" r="24" stroke="url(#paint0_linear_748_639)" stroke-width="4"/>
3
+ <defs>
4
+ <linearGradient id="paint0_linear_748_639" x1="13.5" y1="3.34936" x2="39" y2="47.5167" gradientUnits="userSpaceOnUse">
5
+ <stop stop-color="#1A6AFF"/>
6
+ <stop offset="1" stop-color="white" stop-opacity="0"/>
7
+ </linearGradient>
8
+ </defs>
9
+ </svg>
@@ -0,0 +1,9 @@
1
+ <svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="18" cy="18" r="16" stroke="url(#paint0_linear_748_634)" stroke-width="4"/>
3
+ <defs>
4
+ <linearGradient id="paint0_linear_748_634" x1="9.66667" y1="2.89958" x2="26.6667" y2="32.3444" gradientUnits="userSpaceOnUse">
5
+ <stop stop-color="#1A6AFF"/>
6
+ <stop offset="1" stop-color="white" stop-opacity="0"/>
7
+ </linearGradient>
8
+ </defs>
9
+ </svg>
@@ -0,0 +1,9 @@
1
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <circle cx="12" cy="12" r="10" stroke="url(#paint0_linear_748_642)" stroke-width="4"/>
3
+ <defs>
4
+ <linearGradient id="paint0_linear_748_642" x1="6.79167" y1="2.56224" x2="17.4167" y2="20.9653" gradientUnits="userSpaceOnUse">
5
+ <stop stop-color="#1A6AFF"/>
6
+ <stop offset="1" stop-color="white" stop-opacity="0"/>
7
+ </linearGradient>
8
+ </defs>
9
+ </svg>
@@ -1 +1 @@
1
- @use "./styles/index.scss";
1
+ @use "./styles/index";