@uniai-fe/uds-primitives 0.3.59 → 0.4.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 (83) hide show
  1. package/README.md +209 -3
  2. package/dist/styles.css +91 -76
  3. package/package.json +1 -1
  4. package/src/components/alternate/index.tsx +7 -1
  5. package/src/components/alternate/markup/Label.tsx +10 -5
  6. package/src/components/alternate/markup/empty/Data.tsx +9 -6
  7. package/src/components/alternate/markup/index.tsx +8 -0
  8. package/src/components/alternate/markup/loading/Default.tsx +10 -6
  9. package/src/components/alternate/markup/loading/Icon.tsx +11 -4
  10. package/src/components/alternate/types/index.ts +75 -2
  11. package/src/components/badge/index.tsx +4 -1
  12. package/src/components/badge/markup/Badge.tsx +10 -8
  13. package/src/components/badge/types/index.ts +26 -2
  14. package/src/components/button/index.tsx +6 -1
  15. package/src/components/button/markup/Base.tsx +20 -18
  16. package/src/components/button/markup/Rounded.tsx +7 -4
  17. package/src/components/button/markup/Text.tsx +7 -4
  18. package/src/components/calendar/index.tsx +8 -0
  19. package/src/components/calendar/markup/index.tsx +7 -7
  20. package/src/components/carousel/index.tsx +8 -0
  21. package/src/components/carousel/markup/index.tsx +9 -0
  22. package/src/components/checkbox/index.tsx +7 -0
  23. package/src/components/chip/index.tsx +7 -1
  24. package/src/components/chip/markup/index.tsx +9 -0
  25. package/src/components/divider/index.tsx +4 -0
  26. package/src/components/divider/markup/Divider.tsx +11 -7
  27. package/src/components/divider/types/index.ts +1 -0
  28. package/src/components/divider/types/props.ts +27 -0
  29. package/src/components/drawer/index.tsx +7 -0
  30. package/src/components/drawer/markup/index.tsx +6 -0
  31. package/src/components/dropdown/index.tsx +7 -0
  32. package/src/components/dropdown/markup/Template.tsx +9 -2
  33. package/src/components/dropdown/markup/foundation/Container.tsx +30 -12
  34. package/src/components/dropdown/markup/index.tsx +9 -10
  35. package/src/components/dropdown/types/base.ts +13 -0
  36. package/src/components/dropdown/types/props.ts +19 -2
  37. package/src/components/form/index.tsx +7 -0
  38. package/src/components/form/markup/index.tsx +6 -2
  39. package/src/components/info-box/index.tsx +7 -0
  40. package/src/components/info-box/markup/InfoBox.tsx +1 -1
  41. package/src/components/info-box/markup/index.ts +6 -0
  42. package/src/components/info-box/types/props.ts +2 -2
  43. package/src/components/input/index.tsx +6 -1
  44. package/src/components/input/markup/foundation/Input.tsx +2 -2
  45. package/src/components/input/styles/foundation.scss +57 -54
  46. package/src/components/input/types/foundation.ts +1 -1
  47. package/src/components/navigation/index.tsx +7 -0
  48. package/src/components/navigation/markup/index.tsx +6 -0
  49. package/src/components/pagination/index.tsx +6 -1
  50. package/src/components/pagination/markup/index.tsx +7 -0
  51. package/src/components/pop-over/index.tsx +7 -0
  52. package/src/components/pop-over/markup/index.tsx +5 -4
  53. package/src/components/radio/index.tsx +5 -1
  54. package/src/components/scrollbar/hooks/index.ts +1 -1
  55. package/src/components/scrollbar/index.tsx +1 -1
  56. package/src/components/scrollbar/markup/index.tsx +1 -1
  57. package/src/components/scrollbar/types/index.ts +1 -1
  58. package/src/components/scrollbar/utils/index.ts +1 -1
  59. package/src/components/segmented-control/index.tsx +5 -1
  60. package/src/components/segmented-control/markup/index.ts +6 -0
  61. package/src/components/select/index.tsx +6 -1
  62. package/src/components/select/markup/Default.tsx +10 -13
  63. package/src/components/select/markup/foundation/Selected.tsx +31 -26
  64. package/src/components/select/markup/index.tsx +1 -1
  65. package/src/components/select/markup/multiple/Multiple.tsx +32 -15
  66. package/src/components/select/styles/select.scss +15 -6
  67. package/src/components/select/styles/variables.scss +4 -0
  68. package/src/components/select/types/multiple.ts +19 -0
  69. package/src/components/select/types/props.ts +19 -6
  70. package/src/components/select/utils/display.tsx +41 -0
  71. package/src/components/select/utils/index.ts +1 -4
  72. package/src/components/slot/index.tsx +7 -0
  73. package/src/components/slot/markup/index.tsx +6 -0
  74. package/src/components/spinner/hooks/index.ts +1 -1
  75. package/src/components/spinner/index.tsx +1 -1
  76. package/src/components/spinner/markup/index.tsx +1 -1
  77. package/src/components/spinner/types/index.ts +1 -1
  78. package/src/components/spinner/utils/index.ts +1 -1
  79. package/src/components/tab/index.tsx +5 -1
  80. package/src/components/tab/markup/index.tsx +8 -0
  81. package/src/components/table/index.tsx +3 -0
  82. package/src/components/tooltip/index.tsx +7 -0
  83. package/src/components/tooltip/markup/index.tsx +7 -6
package/README.md CHANGED
@@ -47,6 +47,212 @@ export default function Page() {
47
47
  }
48
48
  ```
49
49
 
50
+ ## 제공 도구 목록
51
+
52
+ - `Alternate.EmptyData`
53
+ - `Alternate.LoadingDefault`
54
+ - `Alternate.LoadingIcon`
55
+ - `Alternate.Text`
56
+ - `AlternateEmptyDataProps`
57
+ - `AlternateLoadingDefaultProps`
58
+ - `AlternateLoadingIconProps`
59
+ - `AlternateTextProps`
60
+ - `Badge`
61
+ - `BadgeProps`
62
+ - `Chip.Default`
63
+ - `Chip.ClickableStyle`
64
+ - `Chip.InputStyle`
65
+ - `Chip.Label`
66
+ - `Chip.List`
67
+ - `ChipProps`
68
+ - `ChipListRootProps`
69
+ - `ChipListItemData`
70
+ - `Calendar.Root`
71
+ - `Calendar.Container`
72
+ - `Calendar.Header`
73
+ - `Calendar.Body`
74
+ - `Calendar.Footer`
75
+ - `Calendar.Core`
76
+ - `Calendar.Icon`
77
+ - `CalendarValue`
78
+ - `CalendarRootProps`
79
+ - `CalendarContainerProps`
80
+ - `CalendarGridProps`
81
+ - `CalendarDatePickerProps`
82
+ - `Carousel.Provider`
83
+ - `Carousel.Container`
84
+ - `Carousel.Control`
85
+ - `Carousel.Track`
86
+ - `Carousel.Button.Base`
87
+ - `Carousel.Button.Prev`
88
+ - `Carousel.Button.Next`
89
+ - `useCarousel`
90
+ - `useCarouselProviderController`
91
+ - `CarouselProviderProps`
92
+ - `CarouselTrackProps`
93
+ - `CarouselContainerProps`
94
+ - `CarouselControlProps`
95
+ - `CarouselPrevButtonProps`
96
+ - `CarouselNextButtonProps`
97
+ - `DrawerRoot`
98
+ - `DrawerTrigger`
99
+ - `DrawerPortal`
100
+ - `DrawerOverlay`
101
+ - `DrawerContent`
102
+ - `DrawerHeader`
103
+ - `DrawerBody`
104
+ - `DrawerFooter`
105
+ - `DrawerTitle`
106
+ - `DrawerDescription`
107
+ - `DrawerClose`
108
+ - `DrawerRootProps`
109
+ - `DrawerTriggerProps`
110
+ - `DrawerContentProps`
111
+ - `useDrawerDrag`
112
+ - `Form.Provider`
113
+ - `Form.Field.Container`
114
+ - `Form.Field.Header`
115
+ - `Form.Field.Body`
116
+ - `Form.Field.Footer`
117
+ - `Form.Field.Template`
118
+ - `FormFieldTemplateProps`
119
+ - `FormFieldContainerProps`
120
+ - `FormFieldHeaderProps`
121
+ - `FormFieldFooterProps`
122
+ - `FormFieldWidth`
123
+ - `FormFieldState`
124
+ - `getFormFieldWidthAttr`
125
+ - `getFormFieldWidthValue`
126
+ - `InfoBox`
127
+ - `InfoBoxIcon`
128
+ - `InfoBoxProps`
129
+ - `InfoBoxState`
130
+ - `BottomNavigation`
131
+ - `BottomNavigationProps`
132
+ - `NavigationItem`
133
+ - `NavigationItemKey`
134
+ - `NavigationHrefItem`
135
+ - `NavigationActionItem`
136
+ - `NavigationSitemapNode`
137
+ - `NavigationSitemapCollection`
138
+ - `NavigationSitemapOptions`
139
+ - `composeNavigationClassName`
140
+ - `isHrefNavigationItem`
141
+ - `Pagination`
142
+ - `PaginationCarousel`
143
+ - `PaginationCount`
144
+ - `PaginationProps`
145
+ - `PaginationCarouselProps`
146
+ - `PaginationCountProps`
147
+ - `PaginationCountSize`
148
+ - `PaginationCarouselPriority`
149
+ - `normalizePaginationState`
150
+ - `createPaginationPages`
151
+ - `composePaginationClassName`
152
+ - `Slot.Base`
153
+ - `Slot.Text`
154
+ - `SlotComponentProps`
155
+ - `SlotTextProps`
156
+ - `TabRoot`
157
+ - `TabList`
158
+ - `TabTrigger`
159
+ - `TabContent`
160
+ - `TabRootProps`
161
+ - `TabListProps`
162
+ - `TabTriggerProps`
163
+ - `TabContentProps`
164
+ - `TabVariant`
165
+ - `TabScale`
166
+ - `TabContext`
167
+ - `useTabContext`
168
+ - `SegmentedControl`
169
+ - `SegmentedControlLabel`
170
+ - `SegmentedControlProps`
171
+ - `SegmentedControlOption`
172
+ - `SegmentedControlValue`
173
+ - `Divider`
174
+ - `DividerProps`
175
+ - `DividerDirection`
176
+ - `scrollbar` (현재 public export 없음)
177
+ - `spinner` (현재 public export 없음)
178
+ - `Table.Root`
179
+ - `Table.Head`
180
+ - `Table.Body`
181
+ - `Table.Foot`
182
+ - `Table.Row`
183
+ - `Table.Th`
184
+ - `Table.Td`
185
+ - `Table.Cell`
186
+ - `Table.Text`
187
+ - `Table.Container`
188
+ - `Table.Colgroup`
189
+ - `Table.Col`
190
+ - `TableColumnData`
191
+ - `TableRootProps`
192
+ - `TableContainerProps`
193
+ - `TableCellProps`
194
+ - `Button.Default`
195
+ - `Button.Text`
196
+ - `Button.Rounded`
197
+ - `Button.Label`
198
+ - `ButtonProps`
199
+ - `TextButtonProps`
200
+ - `RoundButtonProps`
201
+ - `Input.Base`
202
+ - `Input.TextArea`
203
+ - `Input.Text.Password`
204
+ - `Input.Text.Phone`
205
+ - `Input.Text.Email`
206
+ - `Input.Text.Search`
207
+ - `Input.Text.AuthCode`
208
+ - `Input.Date.Template`
209
+ - `Input.Address.Template`
210
+ - `Input.Address.Button`
211
+ - `Input.File.UploadButton`
212
+ - `Input.File.UploadedChip`
213
+ - `Input.File.List.*`
214
+ - `useInputFile`
215
+ - `useInputFileContext`
216
+ - `Select.Default`
217
+ - `Select.Multiple`
218
+ - `Select.Container`
219
+ - `Select.Trigger.Base`
220
+ - `Select.Selected.Base`
221
+ - `Select.Selected.Multiple`
222
+ - `SelectDropdownOption`
223
+ - `SelectMultipleTag`
224
+ - `Dropdown.Root`
225
+ - `Dropdown.Trigger`
226
+ - `Dropdown.Container`
227
+ - `Dropdown.Menu.Item`
228
+ - `Dropdown.Menu.List`
229
+ - `Dropdown.Template`
230
+ - `DropdownTemplateItem`
231
+ - `DropdownTemplateChangePayload`
232
+ - `Radio`
233
+ - `RadioField`
234
+ - `RadioCard`
235
+ - `RadioCardGroup`
236
+ - `RadioProps`
237
+ - `RadioFieldProps`
238
+ - `Checkbox`
239
+ - `CheckboxField`
240
+ - `CheckboxProps`
241
+ - `CheckboxFieldProps`
242
+ - `CheckboxSize`
243
+ - `Tooltip.Root`
244
+ - `Tooltip.Trigger`
245
+ - `Tooltip.Message`
246
+ - `Tooltip.Text`
247
+ - `Tooltip.Template`
248
+ - `TooltipMessageProps`
249
+ - `PopOver.Root`
250
+ - `PopOver.Trigger`
251
+ - `PopOver.Content`
252
+ - `PopOverRootProps`
253
+ - `PopOverTriggerProps`
254
+ - `PopOverContentProps`
255
+
50
256
  ### Link/Anchor로 사용하기
51
257
 
52
258
  ```tsx
@@ -103,11 +309,11 @@ function Templates() {
103
309
  - 템플릿별 클래스를 추가로 노출한다: `.button-template-text`, `.button-template-text-size-*`, `.button-template-round`, `.button-template-round-size-*`.
104
310
  - 스토리북 `primitives/Button` Story에서 solid/outlined/텍스트/라운드 4가지 카테고리를 한 번에 확인할 수 있다.
105
311
 
106
- ### SlotComponent (폴리모픽 as 래퍼)
312
+ ### Slot (폴리모픽 as 래퍼)
107
313
 
108
- - `Button.Default`는 `SlotComponent`를 통해 `as` prop으로 전달된 요소(예: `Link`, `a`, `button`)에 공통 속성/`ref`를 안전하게 전달한다.
314
+ - `Button.Default`는 `Slot.Base`를 통해 `as` prop으로 전달된 요소(예: `Link`, `a`, `button`)에 공통 속성/`ref`를 안전하게 전달한다.
109
315
  - `SlotComponentProps<C>`는 React가 허용하는 모든 native props + `data-*` 속성을 그대로 포함하고, `as/children/className`만 재정의한다.
110
- - 필요 시 `import { SlotComponent } from "@uniai-fe/uds-primitives";`로 직접 사용해 카드/배너 등의 래퍼를 구현할 수 있다.
316
+ - 필요 시 `import { Slot } from "@uniai-fe/uds-primitives";` 후 `Slot.Base`, `Slot.Text`를 직접 사용해 카드/배너 래퍼나 텍스트 슬롯을 구현할 수 있다.
111
317
  - 자세한 도입 배경과 API는 `docs/CONTEXT-SLOT.md`에서 확인할 수 있다.
112
318
 
113
319
  ### 최근 업데이트
package/dist/styles.css CHANGED
@@ -614,6 +614,8 @@
614
614
  --select-secondary-color-text-readonly: var(
615
615
  --select-primary-color-text-readonly
616
616
  );
617
+ --select-secondary-color-border-disabled: var(--color-label-disabled);
618
+ --select-secondary-color-border-readonly: transparent;
617
619
  --select-secondary-color-placeholder: var(--color-label-alternative);
618
620
  --select-secondary-color-placeholder-disabled: var(--color-label-disabled);
619
621
  --select-secondary-color-placeholder-readonly: var(
@@ -623,9 +625,11 @@
623
625
  --select-color-surface-secondary-hover: var(--color-surface-static-cool-gray);
624
626
  --select-color-surface-secondary-active: var(--color-surface-standard);
625
627
  --select-color-surface-secondary-disabled: var(--color-surface-neutral);
628
+ --select-color-surface-secondary-readonly: transparent;
626
629
  --select-icon-color-default: var(--color-cool-gray-75);
627
630
  --select-icon-color-focused: var(--color-cool-gray-20);
628
631
  --select-icon-color-disabled: var(--color-cool-gray-85);
632
+ --select-icon-color-readonly: transparent;
629
633
  /* Multi select chip */
630
634
  --select-multiple-chip-gap: var(--spacing-gap-2);
631
635
  --select-multiple-tag-label-gap: var(--spacing-gap-1);
@@ -2556,34 +2560,34 @@ figure.chip {
2556
2560
  flex: var(--input-flex);
2557
2561
  min-width: 0;
2558
2562
  }
2559
- .input[data-width=auto] {
2563
+ .input:where([data-width=auto]) {
2560
2564
  --input-width: auto;
2561
2565
  --input-flex: 0 1 auto;
2562
2566
  }
2563
- .input[data-width=fill] {
2567
+ .input:where([data-width=fill]) {
2564
2568
  --input-width: auto;
2565
2569
  --input-flex: 1 1 0%;
2566
2570
  }
2567
- .input[data-width=full], .input[data-block=true] {
2571
+ .input:where([data-width=full]), .input:where([data-block=true]) {
2568
2572
  --input-width: 100%;
2569
2573
  --input-flex: 0 0 100%;
2570
2574
  }
2571
- .input[data-width=fit] {
2575
+ .input:where([data-width=fit]) {
2572
2576
  --input-width: fit-content;
2573
2577
  --input-flex: 0 0 auto;
2574
2578
  }
2575
- .input[data-width=custom] {
2579
+ .input:where([data-width=custom]) {
2576
2580
  --input-flex: 0 0 auto;
2577
2581
  }
2578
2582
  .input--block {
2579
2583
  width: 100%;
2580
2584
  }
2581
- .input[data-priority=table] {
2585
+ .input:where([data-priority=table]) {
2582
2586
  display: block;
2583
2587
  --input-width: 100%;
2584
2588
  height: 100%;
2585
2589
  }
2586
- .input[data-priority=table] .input-box {
2590
+ .input:where([data-priority=table]) .input-box {
2587
2591
  height: 100%;
2588
2592
  }
2589
2593
 
@@ -2626,21 +2630,21 @@ figure.chip {
2626
2630
  outline: none;
2627
2631
  box-shadow: none;
2628
2632
  }
2629
- .input-field[data-size=small] {
2633
+ .input-field:where([data-size=small]) {
2630
2634
  min-height: var(--input-default-height-small);
2631
2635
  --input-font-size: var(--input-text-small-size);
2632
2636
  --input-line-height: var(--input-text-small-line-height);
2633
2637
  --input-font-weight: var(--input-text-small-weight);
2634
2638
  --input-letter-spacing: var(--input-text-small-letter-spacing);
2635
2639
  }
2636
- .input-field[data-size=large] {
2640
+ .input-field:where([data-size=large]) {
2637
2641
  min-height: var(--input-default-height-large);
2638
2642
  --input-font-size: var(--input-text-large-size);
2639
2643
  --input-line-height: var(--input-text-large-line-height);
2640
2644
  --input-font-weight: var(--input-text-large-weight);
2641
2645
  --input-letter-spacing: var(--input-text-large-letter-spacing);
2642
2646
  }
2643
- .input-field[data-priority=secondary] {
2647
+ .input-field:where([data-priority=secondary]) {
2644
2648
  border: none;
2645
2649
  border-bottom: var(--input-border-width-default) solid var(--input-border-color);
2646
2650
  border-radius: 0;
@@ -2648,23 +2652,23 @@ figure.chip {
2648
2652
  padding-block: var(--input-secondary-padding-block);
2649
2653
  background-color: var(--input-secondary-surface-color);
2650
2654
  }
2651
- .input-field[data-priority=secondary][data-state=active], .input-field[data-priority=secondary][data-state=focused] {
2655
+ .input-field:where([data-priority=secondary]):where([data-state=active]), .input-field:where([data-priority=secondary]):where([data-state=focused]) {
2652
2656
  border-bottom-color: var(--input-border-active-color);
2653
2657
  border-bottom-width: var(--input-border-width-emphasis);
2654
2658
  }
2655
- .input-field[data-priority=secondary][data-state=success] {
2659
+ .input-field:where([data-priority=secondary]):where([data-state=success]) {
2656
2660
  border-bottom-color: var(--input-border-success-color);
2657
2661
  border-bottom-width: var(--input-border-width-emphasis);
2658
2662
  }
2659
- .input-field[data-priority=secondary][data-state=error] {
2663
+ .input-field:where([data-priority=secondary]):where([data-state=error]) {
2660
2664
  border-bottom-color: var(--input-border-error-color);
2661
2665
  border-bottom-width: var(--input-border-width-emphasis);
2662
2666
  }
2663
- .input-field[data-priority=secondary][data-state=disabled] {
2667
+ .input-field:where([data-priority=secondary]):where([data-state=disabled]) {
2664
2668
  border-bottom-color: var(--input-border-underline-disabled-color);
2665
2669
  border-bottom-width: var(--input-border-width-default);
2666
2670
  }
2667
- .input-field[data-priority=tertiary] {
2671
+ .input-field:where([data-priority=tertiary]) {
2668
2672
  border-radius: var(--input-tertiary-radius-base);
2669
2673
  background-color: var(--input-surface-color);
2670
2674
  min-height: var(--input-tertiary-height-base);
@@ -2677,7 +2681,7 @@ figure.chip {
2677
2681
  flex-wrap: wrap;
2678
2682
  align-items: center;
2679
2683
  }
2680
- .input-field[data-priority=tertiary] .input-field-control {
2684
+ .input-field:where([data-priority=tertiary]) .input-field-control {
2681
2685
  display: grid;
2682
2686
  grid-template-columns: auto minmax(0, 1fr);
2683
2687
  column-gap: var(--input-default-gap);
@@ -2686,57 +2690,57 @@ figure.chip {
2686
2690
  flex: 1 1 auto;
2687
2691
  min-width: 0;
2688
2692
  }
2689
- .input-field[data-priority=tertiary] .input-inline-label {
2693
+ .input-field:where([data-priority=tertiary]) .input-inline-label {
2690
2694
  grid-column: 1/-1;
2691
2695
  margin: 0;
2692
2696
  align-self: flex-start;
2693
2697
  }
2694
- .input-field[data-priority=tertiary] .input-element {
2698
+ .input-field:where([data-priority=tertiary]) .input-element {
2695
2699
  min-height: var(--input-tertiary-element-min-height);
2696
2700
  width: auto;
2697
2701
  flex: 1 1 auto;
2698
2702
  }
2699
- .input-field[data-priority=tertiary] .input-field-utilities {
2703
+ .input-field:where([data-priority=tertiary]) .input-field-utilities {
2700
2704
  align-self: center;
2701
2705
  margin-left: 0;
2702
2706
  }
2703
- .input-field[data-priority=table] {
2707
+ .input-field:where([data-priority=table]) {
2704
2708
  height: 100%;
2705
2709
  border-radius: var(--input-table-radius-base);
2706
2710
  border-color: var(--input-border-table-default-color);
2707
2711
  background-color: var(--input-table-surface-color);
2708
2712
  }
2709
- .input-field[data-priority=table][data-state=disabled] {
2713
+ .input-field:where([data-priority=table]):where([data-state=disabled]) {
2710
2714
  border-color: var(--input-border-table-disabled-color);
2711
2715
  background-color: var(--input-table-surface-disabled-color);
2712
2716
  }
2713
- .input-field[data-priority=table][data-readonly=true] {
2717
+ .input-field:where([data-priority=table]):where([data-readonly=true]) {
2714
2718
  border-color: var(--input-border-table-readonly-color);
2715
2719
  background-color: var(--input-table-surface-readonly-color);
2716
2720
  }
2717
- .input-field:not([data-priority=secondary])[data-state=active], .input-field:not([data-priority=secondary])[data-state=focused] {
2721
+ .input-field:not([data-priority=secondary]):where([data-state=active]), .input-field:not([data-priority=secondary]):where([data-state=focused]) {
2718
2722
  border-color: var(--input-border-active-color);
2719
2723
  border-width: var(--input-border-width-emphasis);
2720
2724
  }
2721
- .input-field:not([data-priority=secondary])[data-state=success] {
2725
+ .input-field:not([data-priority=secondary]):where([data-state=success]) {
2722
2726
  border-color: var(--input-border-success-color);
2723
2727
  border-width: var(--input-border-width-emphasis);
2724
2728
  }
2725
- .input-field:not([data-priority=secondary])[data-state=error] {
2729
+ .input-field:not([data-priority=secondary]):where([data-state=error]) {
2726
2730
  border-color: var(--input-border-error-color);
2727
2731
  border-width: var(--input-border-width-emphasis);
2728
2732
  }
2729
- .input-field:not([data-priority=secondary])[data-state=disabled] {
2733
+ .input-field:not([data-priority=secondary]):where([data-state=disabled]) {
2730
2734
  border-color: var(--input-border-disabled-color);
2731
2735
  border-width: var(--input-border-width-default);
2732
2736
  background-color: var(--input-surface-disabled-color); /* disabled 배경 토큰 */
2733
2737
  }
2734
- .input-field:not([data-priority=secondary])[data-readonly=true] {
2738
+ .input-field:not([data-priority=secondary]):where([data-readonly=true]) {
2735
2739
  border-color: var(--input-border-disabled-color);
2736
2740
  border-width: var(--input-border-width-default);
2737
2741
  background-color: var(--input-surface-disabled-color);
2738
2742
  }
2739
- .input-field:not([data-priority=secondary])[data-state=error][data-readonly=true] {
2743
+ .input-field:not([data-priority=secondary]):where([data-state=error][data-readonly=true]) {
2740
2744
  border-color: var(--input-border-error-color);
2741
2745
  border-width: var(--input-border-width-emphasis);
2742
2746
  }
@@ -2777,7 +2781,7 @@ figure.chip {
2777
2781
  box-shadow: none;
2778
2782
  }
2779
2783
 
2780
- .input-field[data-has-value=true] .input-element:not(:disabled) {
2784
+ .input-field:where([data-has-value=true]) .input-element:not(:disabled) {
2781
2785
  color: var(--input-text-color);
2782
2786
  caret-color: var(--input-text-color);
2783
2787
  }
@@ -2790,7 +2794,7 @@ figure.chip {
2790
2794
  min-width: 0;
2791
2795
  }
2792
2796
 
2793
- .input[data-input-type=textarea] .input-field {
2797
+ .input:where([data-input-type=textarea]) .input-field {
2794
2798
  --input-textarea-radius: var(--input-textarea-radius-medium);
2795
2799
  --input-textarea-padding-inline: var(--input-textarea-padding-inline-medium);
2796
2800
  --input-textarea-padding-block: var(--input-textarea-padding-block-medium);
@@ -2801,29 +2805,29 @@ figure.chip {
2801
2805
  border-radius: var(--input-textarea-radius);
2802
2806
  padding: var(--input-textarea-padding-block) var(--input-textarea-padding-inline);
2803
2807
  }
2804
- .input[data-input-type=textarea] .input-field[data-size=small] {
2808
+ .input:where([data-input-type=textarea]) .input-field:where([data-size=small]) {
2805
2809
  --input-textarea-radius: var(--input-textarea-radius-small);
2806
2810
  --input-textarea-padding-inline: var(--input-textarea-padding-inline-small);
2807
2811
  --input-textarea-padding-block: var(--input-textarea-padding-block-small);
2808
2812
  --input-textarea-gap: var(--input-textarea-gap-small);
2809
2813
  }
2810
- .input[data-input-type=textarea] .input-field[data-size=large] {
2814
+ .input:where([data-input-type=textarea]) .input-field:where([data-size=large]) {
2811
2815
  --input-textarea-radius: var(--input-textarea-radius-large);
2812
2816
  --input-textarea-padding-inline: var(--input-textarea-padding-inline-large);
2813
2817
  --input-textarea-padding-block: var(--input-textarea-padding-block-large);
2814
2818
  --input-textarea-gap: var(--input-textarea-gap-large);
2815
2819
  }
2816
2820
 
2817
- .input[data-input-type=textarea] {
2821
+ .input:where([data-input-type=textarea]) {
2818
2822
  min-height: var(--input-textarea-height);
2819
2823
  }
2820
- .input[data-input-type=textarea] .input-box {
2824
+ .input:where([data-input-type=textarea]) .input-box {
2821
2825
  height: 100%;
2822
2826
  }
2823
- .input[data-input-type=textarea] .input-field {
2827
+ .input:where([data-input-type=textarea]) .input-field {
2824
2828
  height: 100%;
2825
2829
  }
2826
- .input[data-input-type=textarea] .input-field-control {
2830
+ .input:where([data-input-type=textarea]) .input-field-control {
2827
2831
  flex: 1 1 auto;
2828
2832
  width: 100%;
2829
2833
  align-items: stretch;
@@ -2865,27 +2869,27 @@ figure.chip {
2865
2869
  color: var(--input-label-color);
2866
2870
  }
2867
2871
 
2868
- .input-field[data-priority=secondary] .input-element {
2872
+ .input-field:where([data-priority=secondary]) .input-element {
2869
2873
  padding-inline: 0;
2870
2874
  }
2871
2875
 
2872
- .input-field[data-priority=tertiary] .input-element {
2876
+ .input-field:where([data-priority=tertiary]) .input-element {
2873
2877
  min-height: var(--input-tertiary-element-min-height);
2874
2878
  }
2875
2879
 
2876
- .input-field[data-priority=table][data-size=small] .input-element {
2880
+ .input-field:where([data-priority=table]):where([data-size=small]) .input-element {
2877
2881
  font-size: var(--input-table-text-small-size);
2878
2882
  line-height: var(--input-table-text-small-line-height);
2879
2883
  font-weight: var(--input-table-text-small-weight);
2880
2884
  }
2881
2885
 
2882
- .input-field[data-priority=table][data-size=medium] .input-element {
2886
+ .input-field:where([data-priority=table]):where([data-size=medium]) .input-element {
2883
2887
  font-size: var(--input-table-text-medium-size);
2884
2888
  line-height: var(--input-table-text-medium-line-height);
2885
2889
  font-weight: var(--input-table-text-medium-weight);
2886
2890
  }
2887
2891
 
2888
- .input-field[data-priority=table][data-size=large] .input-element {
2892
+ .input-field:where([data-priority=table]):where([data-size=large]) .input-element {
2889
2893
  font-size: var(--input-table-text-large-size);
2890
2894
  line-height: var(--input-table-text-large-line-height);
2891
2895
  font-weight: var(--input-table-text-large-weight);
@@ -2896,10 +2900,10 @@ figure.chip {
2896
2900
  font-size: var(--input-helper-font-size);
2897
2901
  line-height: var(--input-helper-line-height);
2898
2902
  }
2899
- [data-state=error] .input-helper-text {
2903
+ :where([data-state=error]) .input-helper-text {
2900
2904
  color: var(--input-border-error-color);
2901
2905
  }
2902
- [data-state=disabled] .input-helper-text {
2906
+ :where([data-state=disabled]) .input-helper-text {
2903
2907
  color: var(--input-helper-disabled-color);
2904
2908
  }
2905
2909
 
@@ -2920,77 +2924,78 @@ figure.chip {
2920
2924
  .input-affix-clear, .input-affix-status {
2921
2925
  color: var(--input-text-color);
2922
2926
  }
2923
- .input-affix-status[data-state=error] {
2927
+ .input-affix-status:where([data-state=error]) {
2924
2928
  color: var(--input-status-error-color);
2925
2929
  }
2926
- .input-affix-status[data-state=success] {
2930
+ .input-affix-status:where([data-state=success]) {
2927
2931
  color: var(--input-status-success-color);
2928
2932
  }
2929
2933
 
2930
- .input-field[data-priority=secondary] {
2934
+ .input-field:where([data-priority=secondary]) {
2931
2935
  border-bottom-width: var(--input-border-width-default);
2932
2936
  }
2933
- .input-field[data-priority=secondary][data-state=active], .input-field[data-priority=secondary][data-state=focused] {
2937
+ .input-field:where([data-priority=secondary]) :where([data-state=active]),
2938
+ .input-field:where([data-priority=secondary]) :where([data-state=focused]) {
2934
2939
  border-bottom-color: var(--input-border-active-color);
2935
2940
  border-bottom-width: var(--input-border-width-emphasis);
2936
2941
  }
2937
- .input-field[data-priority=secondary][data-state=success] {
2942
+ .input-field:where([data-priority=secondary]) :where([data-state=success]) {
2938
2943
  border-bottom-color: var(--input-border-success-color);
2939
2944
  border-bottom-width: var(--input-border-width-emphasis);
2940
2945
  }
2941
- .input-field[data-priority=secondary][data-state=error] {
2946
+ .input-field:where([data-priority=secondary]) :where([data-state=error]) {
2942
2947
  border-bottom-color: var(--input-border-error-color);
2943
2948
  border-bottom-width: var(--input-border-width-emphasis);
2944
2949
  }
2945
- .input-field[data-priority=secondary][data-state=disabled] {
2950
+ .input-field:where([data-priority=secondary]) :where([data-state=disabled]) {
2946
2951
  border-bottom-color: var(--input-border-underline-disabled-color);
2947
2952
  border-bottom-width: var(--input-border-width-default);
2948
2953
  }
2949
- .input-field[data-priority=secondary][data-readonly=true] {
2954
+ .input-field:where([data-priority=secondary]) :where([data-readonly=true]) {
2950
2955
  border-bottom-color: var(--input-border-underline-disabled-color);
2951
2956
  border-bottom-width: var(--input-border-width-default);
2952
2957
  }
2953
2958
 
2954
- .input[data-state=active] .input-label,
2955
- .input[data-state=active] .input-inline-label,
2956
- .input[data-state=focused] .input-label,
2957
- .input[data-state=focused] .input-inline-label,
2958
- .input[data-state=success] .input-label,
2959
- .input[data-state=success] .input-inline-label {
2959
+ .input:where([data-state=active]) .input-label,
2960
+ .input:where([data-state=active]) .input-inline-label,
2961
+ .input:where([data-state=focused]) .input-label,
2962
+ .input:where([data-state=focused]) .input-inline-label,
2963
+ .input:where([data-state=success]) .input-label,
2964
+ .input:where([data-state=success]) .input-inline-label {
2960
2965
  color: var(--input-label-accent-color);
2961
2966
  }
2962
2967
 
2963
- .input[data-state=error] .input-label,
2964
- .input[data-state=error] .input-inline-label {
2968
+ .input:where([data-state=error]) .input-label,
2969
+ .input:where([data-state=error]) .input-inline-label {
2965
2970
  color: var(--input-label-error-color);
2966
2971
  }
2967
- .input[data-state=error] .input-helper-text {
2972
+ .input:where([data-state=error]) .input-helper-text {
2968
2973
  color: var(--input-label-error-color);
2969
2974
  }
2970
- .input[data-state=error] .input-textarea-length {
2975
+ .input:where([data-state=error]) .input-textarea-length {
2971
2976
  color: var(--input-label-error-color);
2972
2977
  }
2973
2978
 
2974
- .input[data-state=disabled] .input-label,
2975
- .input[data-state=disabled] .input-inline-label,
2976
- .input[data-state=disabled] .input-helper-text,
2977
- .input[data-state=disabled] .input-affix,
2978
- .input[data-state=disabled] .input-textarea-length {
2979
+ .input:where([data-state=disabled]) .input-label,
2980
+ .input:where([data-state=disabled]) .input-inline-label,
2981
+ .input:where([data-state=disabled]) .input-helper-text,
2982
+ .input:where([data-state=disabled]) .input-affix,
2983
+ .input:where([data-state=disabled]) .input-textarea-length {
2979
2984
  color: var(--input-helper-disabled-color);
2980
2985
  }
2981
- .input[data-state=disabled] .input-field {
2986
+ .input:where([data-state=disabled]) .input-field {
2982
2987
  border-color: var(--input-border-color);
2983
2988
  background-color: var(--input-surface-disabled-color);
2984
2989
  }
2985
- .input[data-state=disabled] .input-field[data-priority=secondary] {
2990
+ .input:where([data-state=disabled]) .input-field[data-priority=secondary] {
2986
2991
  background-color: var(--input-secondary-surface-color);
2987
2992
  }
2988
- .input[data-state=disabled] .input-field[data-priority=table] {
2993
+ .input:where([data-state=disabled]) .input-field[data-priority=table] {
2989
2994
  background-color: var(--input-table-surface-disabled-color);
2990
2995
  border-color: var(--input-border-table-disabled-color);
2991
2996
  }
2992
2997
 
2993
- .input[data-readonly=true] .input-field[data-priority=table] {
2998
+ .input:where([data-readonly=true]) .input-field:where([data-priority=table]) {
2994
2999
  background-color: var(--input-table-surface-readonly-color);
2995
3000
  border-color: var(--input-border-table-readonly-color);
2996
3001
  }
@@ -3871,7 +3876,11 @@ figure.chip {
3871
3876
  --select-flex: 1 1 0%;
3872
3877
  }
3873
3878
 
3874
- .select[data-width=full],
3879
+ .select:where([data-width=full]) {
3880
+ --select-width: 100%;
3881
+ --select-flex: 0 0 100%;
3882
+ }
3883
+
3875
3884
  .select-block {
3876
3885
  --select-width: 100%;
3877
3886
  --select-flex: 0 0 100%;
@@ -3982,12 +3991,13 @@ figure.chip {
3982
3991
  border-color: var(--select-primary-color-border-disabled);
3983
3992
  background-color: var(--select-primary-color-surface-disabled);
3984
3993
  cursor: default;
3985
- --select-icon-fill: var(--select-icon-color-disabled);
3994
+ --select-icon-fill: var(--select-icon-color-readonly);
3986
3995
  }
3987
3996
  .select-button:where([data-priority=secondary]):where([data-readonly=true]) {
3988
- border-color: transparent;
3989
- background-color: var(--select-color-surface-secondary-disabled);
3997
+ border-color: var(--select-secondary-color-border-readonly);
3998
+ background-color: var(--select-color-surface-secondary-readonly);
3990
3999
  cursor: default;
4000
+ --select-icon-fill: var(--select-icon-color-readonly);
3991
4001
  }
3992
4002
  .select-button:where([data-priority=secondary]):where([data-readonly=true])::after {
3993
4003
  background-color: var(--select-color-border-secondary-disabled);
@@ -3997,7 +4007,7 @@ figure.chip {
3997
4007
  border-color: var(--select-table-border-readonly-color);
3998
4008
  background-color: var(--select-table-surface-readonly-color);
3999
4009
  cursor: not-allowed;
4000
- --select-icon-fill: var(--select-table-icon-color-disabled);
4010
+ --select-icon-fill: var(--select-table-icon-color-readonly);
4001
4011
  }
4002
4012
  .select-button:where(:not([data-priority=secondary])):where([data-state=disabled]), .select-button:where(:not([data-priority=secondary])):disabled {
4003
4013
  border-color: var(--select-primary-color-border-disabled);
@@ -4006,7 +4016,7 @@ figure.chip {
4006
4016
  --select-icon-fill: var(--select-icon-color-disabled);
4007
4017
  }
4008
4018
  .select-button:where([data-priority=secondary]):where([data-state=disabled]), .select-button:where([data-priority=secondary]):disabled {
4009
- border-color: transparent;
4019
+ border-color: var(--select-secondary-color-border-disabled);
4010
4020
  background-color: var(--select-color-surface-secondary-disabled);
4011
4021
  }
4012
4022
  .select-button:where([data-priority=secondary]):where([data-state=disabled])::after, .select-button:where([data-priority=secondary]):disabled::after {
@@ -4073,6 +4083,11 @@ figure.chip {
4073
4083
  color: var(--select-secondary-color-text-readonly);
4074
4084
  }
4075
4085
 
4086
+ .select-input-label-readonly {
4087
+ width: auto;
4088
+ max-width: 100%;
4089
+ }
4090
+
4076
4091
  .select-button:where(:not([data-state=disabled])) .select-value[data-has-value=true] .select-input-label {
4077
4092
  color: var(--select-color-text-value);
4078
4093
  caret-color: var(--select-color-text-value);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uniai-fe/uds-primitives",
3
- "version": "0.3.59",
3
+ "version": "0.4.0",
4
4
  "description": "UNIAI Design System; Primitives Components Package",
5
5
  "type": "module",
6
6
  "private": false,