@marianmeres/stuic 3.0.0 → 3.0.2

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 (156) hide show
  1. package/dist/actions/index.d.ts +1 -0
  2. package/dist/actions/index.js +1 -0
  3. package/dist/actions/typeahead.svelte.d.ts +53 -0
  4. package/dist/actions/typeahead.svelte.js +328 -0
  5. package/dist/base.css +17 -0
  6. package/dist/components/AlertConfirmPrompt/AlertConfirmPrompt.svelte +4 -3
  7. package/dist/components/AlertConfirmPrompt/AlertConfirmPrompt.svelte.d.ts +4 -3
  8. package/dist/components/AlertConfirmPrompt/Current.svelte +1 -2
  9. package/dist/components/AlertConfirmPrompt/Current.svelte.d.ts +0 -1
  10. package/dist/components/AlertConfirmPrompt/index.css +47 -43
  11. package/dist/components/AssetsPreview/AssetsPreview.svelte +0 -1
  12. package/dist/components/AssetsPreview/AssetsPreview.svelte.d.ts +0 -1
  13. package/dist/components/AssetsPreview/index.css +31 -29
  14. package/dist/components/Avatar/Avatar.svelte +0 -1
  15. package/dist/components/Avatar/Avatar.svelte.d.ts +0 -1
  16. package/dist/components/Avatar/index.css +87 -85
  17. package/dist/components/Backdrop/Backdrop.svelte +0 -1
  18. package/dist/components/Backdrop/Backdrop.svelte.d.ts +0 -1
  19. package/dist/components/Backdrop/index.css +15 -13
  20. package/dist/components/Button/Button.svelte +0 -1
  21. package/dist/components/Button/Button.svelte.d.ts +0 -1
  22. package/dist/components/Button/index.css +431 -429
  23. package/dist/components/ButtonGroupRadio/ButtonGroupRadio.svelte +0 -1
  24. package/dist/components/ButtonGroupRadio/ButtonGroupRadio.svelte.d.ts +0 -1
  25. package/dist/components/ButtonGroupRadio/index.css +123 -117
  26. package/dist/components/Collapsible/index.css +17 -15
  27. package/dist/components/CommandMenu/CommandMenu.svelte +7 -4
  28. package/dist/components/CommandMenu/CommandMenu.svelte.d.ts +0 -1
  29. package/dist/components/CommandMenu/index.css +27 -25
  30. package/dist/components/DismissibleMessage/DismissibleMessage.svelte +0 -2
  31. package/dist/components/DismissibleMessage/DismissibleMessage.svelte.d.ts +0 -1
  32. package/dist/components/DismissibleMessage/index.css +116 -110
  33. package/dist/components/DropdownMenu/DropdownMenu.svelte +317 -74
  34. package/dist/components/DropdownMenu/DropdownMenu.svelte.d.ts +19 -1
  35. package/dist/components/DropdownMenu/index.css +236 -170
  36. package/dist/components/DropdownMenu/index.d.ts +1 -1
  37. package/dist/components/HoverExpandableWidth/HoverExpandableWidth.svelte +3 -1
  38. package/dist/components/HoverExpandableWidth/HoverExpandableWidth.svelte.d.ts +1 -0
  39. package/dist/components/Input/FieldInput.svelte +8 -0
  40. package/dist/components/Input/FieldInput.svelte.d.ts +2 -0
  41. package/dist/components/Input/FieldOptions.svelte +1 -1
  42. package/dist/components/Input/index.css +411 -398
  43. package/dist/components/KbdShortcut/KbdShortcut.svelte +4 -12
  44. package/dist/components/KbdShortcut/README.md +34 -0
  45. package/dist/components/KbdShortcut/index.css +55 -0
  46. package/dist/components/ListItemButton/ListItemButton.svelte +0 -1
  47. package/dist/components/ListItemButton/ListItemButton.svelte.d.ts +0 -1
  48. package/dist/components/ListItemButton/index.css +118 -116
  49. package/dist/components/Modal/Modal.svelte +0 -1
  50. package/dist/components/Modal/Modal.svelte.d.ts +0 -1
  51. package/dist/components/Modal/index.css +18 -16
  52. package/dist/components/ModalDialog/index.css +29 -27
  53. package/dist/components/Nav/Nav.svelte +732 -0
  54. package/dist/components/Nav/Nav.svelte.d.ts +110 -0
  55. package/dist/components/Nav/README.md +334 -0
  56. package/dist/components/Nav/index.css +318 -0
  57. package/dist/components/Nav/index.d.ts +1 -0
  58. package/dist/components/Nav/index.js +1 -0
  59. package/dist/components/Notifications/Notifications.svelte +2 -3
  60. package/dist/components/Notifications/Notifications.svelte.d.ts +0 -1
  61. package/dist/components/Notifications/index.css +158 -158
  62. package/dist/components/Notifications/notifications-stack.svelte.d.ts +4 -0
  63. package/dist/components/Notifications/notifications-stack.svelte.js +8 -0
  64. package/dist/components/Progress/Progress.svelte +4 -2
  65. package/dist/components/Progress/Progress.svelte.d.ts +1 -0
  66. package/dist/components/Progress/README.md +86 -15
  67. package/dist/components/Progress/_internal/Bar.svelte +4 -15
  68. package/dist/components/Progress/_internal/Bar.svelte.d.ts +1 -1
  69. package/dist/components/Progress/_internal/Circle.svelte +30 -2
  70. package/dist/components/Progress/_internal/Circle.svelte.d.ts +1 -0
  71. package/dist/components/Progress/index.css +47 -1
  72. package/dist/components/Skeleton/README.md +152 -0
  73. package/dist/components/Skeleton/Skeleton.svelte +6 -7
  74. package/dist/components/Skeleton/Skeleton.svelte.d.ts +0 -1
  75. package/dist/components/Skeleton/index.css +73 -43
  76. package/dist/components/Spinner/README.md +149 -37
  77. package/dist/components/Spinner/Spinner.svelte +14 -38
  78. package/dist/components/Spinner/Spinner.svelte.d.ts +2 -1
  79. package/dist/components/Spinner/SpinnerCircle.svelte +6 -34
  80. package/dist/components/Spinner/SpinnerCircle.svelte.d.ts +1 -0
  81. package/dist/components/Spinner/SpinnerCircleOscillate.svelte +10 -5
  82. package/dist/components/Spinner/SpinnerUnicode.svelte +3 -1
  83. package/dist/components/Spinner/SpinnerUnicode.svelte.d.ts +1 -0
  84. package/dist/components/Spinner/index.css +104 -0
  85. package/dist/components/Switch/README.md +34 -18
  86. package/dist/components/Switch/Switch.svelte +24 -46
  87. package/dist/components/Switch/Switch.svelte.d.ts +4 -2
  88. package/dist/components/Switch/index.css +120 -2
  89. package/dist/components/Switch/index.d.ts +1 -2
  90. package/dist/components/Switch/index.js +1 -2
  91. package/dist/components/TabbedMenu/README.md +28 -17
  92. package/dist/components/TabbedMenu/TabbedMenu.svelte +5 -46
  93. package/dist/components/TabbedMenu/TabbedMenu.svelte.d.ts +0 -1
  94. package/dist/components/TabbedMenu/index.css +85 -3
  95. package/dist/components/ThemePreview/ThemePreview.svelte +86 -33
  96. package/dist/components/ThemePreview/ThemePreview.svelte.d.ts +3 -1
  97. package/dist/components/ThemePreview/index.css +24 -8
  98. package/dist/components/TwCheck/README.md +32 -13
  99. package/dist/components/TwCheck/TwCheck.svelte +11 -9
  100. package/dist/components/TwCheck/TwCheck.svelte.d.ts +0 -1
  101. package/dist/components/TwCheck/index.css +14 -0
  102. package/dist/components/TypeaheadInput/TypeaheadInput.svelte +19 -187
  103. package/dist/components/TypeaheadInput/TypeaheadInput.svelte.d.ts +4 -2
  104. package/dist/icons/index.d.ts +1 -0
  105. package/dist/icons/index.js +1 -0
  106. package/dist/index.css +44 -39
  107. package/dist/index.d.ts +1 -0
  108. package/dist/index.js +1 -0
  109. package/dist/themes/blue-orange.css +246 -156
  110. package/dist/themes/blue-orange.js +24 -0
  111. package/dist/themes/cyan-red.css +246 -156
  112. package/dist/themes/cyan-red.js +24 -0
  113. package/dist/themes/cyan-slate.css +246 -156
  114. package/dist/themes/cyan-slate.js +25 -1
  115. package/dist/themes/emerald-pink.css +246 -156
  116. package/dist/themes/emerald-pink.js +25 -1
  117. package/dist/themes/fuchsia-emerald.css +246 -156
  118. package/dist/themes/fuchsia-emerald.js +25 -1
  119. package/dist/themes/gray.css +246 -156
  120. package/dist/themes/gray.js +24 -0
  121. package/dist/themes/indigo-amber.css +246 -156
  122. package/dist/themes/indigo-amber.js +26 -2
  123. package/dist/themes/neutral.css +246 -156
  124. package/dist/themes/neutral.js +24 -0
  125. package/dist/themes/pink-emerald.css +246 -156
  126. package/dist/themes/pink-emerald.js +25 -1
  127. package/dist/themes/pink-teal.css +253 -0
  128. package/dist/themes/pink-teal.d.ts +6 -0
  129. package/dist/themes/pink-teal.js +175 -0
  130. package/dist/themes/purple-yellow.css +246 -156
  131. package/dist/themes/purple-yellow.js +24 -0
  132. package/dist/themes/rainbow.css +246 -156
  133. package/dist/themes/rainbow.js +25 -1
  134. package/dist/themes/red-blue.css +246 -156
  135. package/dist/themes/red-blue.js +24 -0
  136. package/dist/themes/red-cyan.css +246 -156
  137. package/dist/themes/red-cyan.js +24 -0
  138. package/dist/themes/red-sky.css +253 -0
  139. package/dist/themes/red-sky.d.ts +6 -0
  140. package/dist/themes/red-sky.js +175 -0
  141. package/dist/themes/rose-teal.css +246 -156
  142. package/dist/themes/rose-teal.js +24 -0
  143. package/dist/themes/sky-amber.css +246 -156
  144. package/dist/themes/sky-amber.js +26 -2
  145. package/dist/themes/slate-cyan.css +246 -156
  146. package/dist/themes/slate-cyan.js +25 -1
  147. package/dist/themes/teal-rose.css +246 -156
  148. package/dist/themes/teal-rose.js +24 -0
  149. package/dist/themes/violet-lime.css +246 -156
  150. package/dist/themes/violet-lime.js +27 -3
  151. package/dist/utils/design-tokens.d.ts +1 -1
  152. package/dist/utils/design-tokens.js +44 -3
  153. package/dist/utils/storage-abstraction.js +1 -1
  154. package/package.json +11 -28
  155. package/dist/components/Switch/SwitchButton.svelte +0 -134
  156. package/dist/components/Switch/SwitchButton.svelte.d.ts +0 -21
@@ -68,464 +68,477 @@
68
68
  --stuic-field-options-optgroup-text: var(--stuic-color-muted-foreground);
69
69
  }
70
70
 
71
- /* ============================================================================
72
- BASE INPUT ELEMENT STYLES
73
- Replaces @tailwindcss/forms plugin for input elements
74
- ============================================================================ */
71
+ @layer components {
72
+ /* ============================================================================
73
+ BASE INPUT ELEMENT STYLES
74
+ Replaces @tailwindcss/forms plugin for input elements
75
+ ============================================================================ */
76
+
77
+ .stuic-input
78
+ input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not(
79
+ [type="file"]
80
+ ),
81
+ .stuic-input textarea,
82
+ .stuic-input select {
83
+ /* Reset browser defaults */
84
+ appearance: none;
85
+ -webkit-appearance: none;
86
+
87
+ /* Layout */
88
+ display: block;
89
+ width: 100%;
90
+ flex: 1;
91
+
92
+ /* Box model - remove internal styling, let wrapper handle border/bg */
93
+ border: 0;
94
+ background: transparent;
95
+ border-radius: 0;
96
+
97
+ /* Typography */
98
+ font-family: var(--stuic-input-font-family);
99
+ color: var(--stuic-input-text);
100
+ letter-spacing: -0.025em;
75
101
 
76
- .stuic-input
77
- input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
78
- .stuic-input textarea,
79
- .stuic-input select {
80
- /* Reset browser defaults */
81
- appearance: none;
82
- -webkit-appearance: none;
83
-
84
- /* Layout */
85
- display: block;
86
- width: 100%;
87
- flex: 1;
88
-
89
- /* Box model - remove internal styling, let wrapper handle border/bg */
90
- border: 0;
91
- background: transparent;
92
- border-radius: 0;
93
-
94
- /* Typography */
95
- font-family: var(--stuic-input-font-family);
96
- color: var(--stuic-input-text);
97
- letter-spacing: -0.025em;
98
-
99
- /* Focus - remove browser defaults, wrapper handles focus ring */
100
- &:focus {
101
- outline: none;
102
- box-shadow: none;
102
+ /* Focus - remove browser defaults, wrapper handles focus ring */
103
+ &:focus {
104
+ outline: none;
105
+ box-shadow: none;
106
+ }
107
+
108
+ &:focus-visible {
109
+ outline: none;
110
+ }
111
+
112
+ /* Disabled state */
113
+ &:disabled {
114
+ cursor: not-allowed;
115
+ }
116
+
117
+ /* Placeholder */
118
+ &::placeholder {
119
+ color: var(--stuic-input-placeholder);
120
+ opacity: 0.5;
121
+ letter-spacing: -0.025em;
122
+ }
103
123
  }
104
124
 
105
- &:focus-visible {
106
- outline: none;
125
+ /* ============================================================================
126
+ SIZE VARIANTS
127
+ Applied via data-size attribute on .stuic-input
128
+ ============================================================================ */
129
+
130
+ .stuic-input[data-size="sm"]
131
+ input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not(
132
+ [type="file"]
133
+ ),
134
+ .stuic-input[data-size="sm"] textarea,
135
+ .stuic-input[data-size="sm"] select {
136
+ padding: var(--stuic-input-padding-y-sm) var(--stuic-input-padding-x-sm);
137
+ font-size: var(--stuic-input-font-size-sm);
138
+ min-height: var(--stuic-input-min-height-sm);
107
139
  }
108
140
 
109
- /* Disabled state */
110
- &:disabled {
111
- cursor: not-allowed;
141
+ .stuic-input[data-size="sm"] select {
142
+ padding-right: 2.5rem;
112
143
  }
113
144
 
114
- /* Placeholder */
115
- &::placeholder {
116
- color: var(--stuic-input-placeholder);
117
- opacity: 0.5;
118
- letter-spacing: -0.025em;
145
+ .stuic-input[data-size="md"]
146
+ input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not(
147
+ [type="file"]
148
+ ),
149
+ .stuic-input[data-size="md"] textarea,
150
+ .stuic-input[data-size="md"] select,
151
+ .stuic-input:not([data-size])
152
+ input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not(
153
+ [type="file"]
154
+ ),
155
+ .stuic-input:not([data-size]) textarea,
156
+ .stuic-input:not([data-size]) select {
157
+ padding: var(--stuic-input-padding-y-md) var(--stuic-input-padding-x-md);
158
+ font-size: var(--stuic-input-font-size-md);
159
+ min-height: var(--stuic-input-min-height-md);
119
160
  }
120
- }
121
-
122
- /* ============================================================================
123
- SIZE VARIANTS
124
- Applied via data-size attribute on .stuic-input
125
- ============================================================================ */
126
-
127
- .stuic-input[data-size="sm"]
128
- input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
129
- .stuic-input[data-size="sm"] textarea,
130
- .stuic-input[data-size="sm"] select {
131
- padding: var(--stuic-input-padding-y-sm) var(--stuic-input-padding-x-sm);
132
- font-size: var(--stuic-input-font-size-sm);
133
- min-height: var(--stuic-input-min-height-sm);
134
- }
135
-
136
- .stuic-input[data-size="sm"] select {
137
- padding-right: 2.5rem;
138
- }
139
-
140
- .stuic-input[data-size="md"]
141
- input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
142
- .stuic-input[data-size="md"] textarea,
143
- .stuic-input[data-size="md"] select,
144
- .stuic-input:not([data-size])
145
- input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
146
- .stuic-input:not([data-size]) textarea,
147
- .stuic-input:not([data-size]) select {
148
- padding: var(--stuic-input-padding-y-md) var(--stuic-input-padding-x-md);
149
- font-size: var(--stuic-input-font-size-md);
150
- min-height: var(--stuic-input-min-height-md);
151
- }
152
-
153
- .stuic-input[data-size="md"] select,
154
- .stuic-input:not([data-size]) select {
155
- padding-right: 2.5rem;
156
- }
157
-
158
- .stuic-input[data-size="lg"]
159
- input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not([type="file"]),
160
- .stuic-input[data-size="lg"] textarea,
161
- .stuic-input[data-size="lg"] select {
162
- padding: var(--stuic-input-padding-y-lg) var(--stuic-input-padding-x-lg);
163
- font-size: var(--stuic-input-font-size-lg);
164
- min-height: var(--stuic-input-min-height-lg);
165
- }
166
161
 
167
- .stuic-input[data-size="lg"] select {
168
- padding-right: 2.5rem;
169
- }
170
-
171
- /* Label sizing */
172
- .stuic-input[data-size="sm"] .label-box label {
173
- font-size: var(--stuic-input-font-size-sm);
174
- }
175
-
176
- .stuic-input[data-size="lg"] .label-box label {
177
- font-weight: 600;
178
- }
162
+ .stuic-input[data-size="md"] select,
163
+ .stuic-input:not([data-size]) select {
164
+ padding-right: 2.5rem;
165
+ }
179
166
 
180
- /* ============================================================================
181
- INPUT WRAPPER STYLES
182
- The visual container that provides border, background, and focus ring
183
- ============================================================================ */
167
+ .stuic-input[data-size="lg"]
168
+ input:not([type="checkbox"]):not([type="radio"]):not([type="range"]):not(
169
+ [type="file"]
170
+ ),
171
+ .stuic-input[data-size="lg"] textarea,
172
+ .stuic-input[data-size="lg"] select {
173
+ padding: var(--stuic-input-padding-y-lg) var(--stuic-input-padding-x-lg);
174
+ font-size: var(--stuic-input-font-size-lg);
175
+ min-height: var(--stuic-input-min-height-lg);
176
+ }
184
177
 
185
- .stuic-input .input-wrap {
186
- background: var(--stuic-input-bg);
187
- border: 1px solid var(--stuic-input-border);
188
- border-radius: var(--stuic-input-radius);
189
- transition:
190
- border-color var(--stuic-input-transition),
191
- box-shadow var(--stuic-input-transition);
192
- }
178
+ .stuic-input[data-size="lg"] select {
179
+ padding-right: 2.5rem;
180
+ }
193
181
 
194
- .stuic-input .input-wrap:focus-within {
195
- border-color: var(--stuic-input-border-focus);
196
- box-shadow: 0 0 0 var(--stuic-input-ring-width) var(--stuic-input-ring-color);
197
- }
182
+ /* Label sizing */
183
+ .stuic-input[data-size="sm"] .label-box label {
184
+ font-size: var(--stuic-input-font-size-sm);
185
+ }
198
186
 
199
- /* Invalid state */
200
- .stuic-input.invalid .input-wrap,
201
- .stuic-input .input-wrap.invalid {
202
- border-color: var(--stuic-input-accent-error);
203
- }
187
+ .stuic-input[data-size="lg"] .label-box label {
188
+ font-weight: 600;
189
+ }
204
190
 
205
- .stuic-input.invalid .input-wrap:focus-within,
206
- .stuic-input .input-wrap.invalid:focus-within {
207
- border-color: var(--stuic-input-accent-error);
208
- box-shadow: 0 0 0 var(--stuic-input-ring-width)
209
- color-mix(in srgb, var(--stuic-input-accent-error) 20%, transparent);
210
- }
191
+ /* ============================================================================
192
+ INPUT WRAPPER STYLES
193
+ The visual container that provides border, background, and focus ring
194
+ ============================================================================ */
195
+
196
+ .stuic-input .input-wrap {
197
+ background: var(--stuic-input-bg);
198
+ border: 1px solid var(--stuic-input-border);
199
+ border-radius: var(--stuic-input-radius);
200
+ transition:
201
+ border-color var(--stuic-input-transition),
202
+ box-shadow var(--stuic-input-transition);
203
+ }
211
204
 
212
- /* Disabled state */
213
- .stuic-input.disabled .input-wrap,
214
- .stuic-input .input-wrap.disabled {
215
- opacity: 0.5;
216
- cursor: not-allowed;
217
- }
205
+ .stuic-input .input-wrap:focus-within {
206
+ border-color: var(--stuic-input-border-focus);
207
+ box-shadow: 0 0 0 var(--stuic-input-ring-width) var(--stuic-input-ring-color);
208
+ }
218
209
 
219
- /* Transparent wrapper utility - for components like Switch that don't need wrapper styling */
220
- .stuic-input .input-wrap.input-wrap-transparent,
221
- .stuic-input.invalid .input-wrap.input-wrap-transparent,
222
- .stuic-input .input-wrap.input-wrap-transparent:focus-within,
223
- .stuic-input.invalid .input-wrap.input-wrap-transparent:focus-within {
224
- background: transparent;
225
- border: none;
226
- box-shadow: none;
227
- }
210
+ /* Invalid state */
211
+ .stuic-input.invalid .input-wrap,
212
+ .stuic-input .input-wrap.invalid {
213
+ border-color: var(--stuic-input-accent-error);
214
+ }
228
215
 
229
- /* Size-specific input-wrap padding */
230
- .stuic-input[data-size="lg"] .input-wrap {
231
- padding: calc(var(--spacing) * 1);
232
- }
216
+ .stuic-input.invalid .input-wrap:focus-within,
217
+ .stuic-input .input-wrap.invalid:focus-within {
218
+ border-color: var(--stuic-input-accent-error);
219
+ box-shadow: 0 0 0 var(--stuic-input-ring-width)
220
+ color-mix(in srgb, var(--stuic-input-accent-error) 20%, var(--stuic-color-background));
221
+ }
233
222
 
234
- /* ============================================================================
235
- VALIDATION MESSAGE
236
- ============================================================================ */
223
+ /* Disabled state */
224
+ .stuic-input.disabled .input-wrap,
225
+ .stuic-input .input-wrap.disabled {
226
+ opacity: 0.5;
227
+ cursor: not-allowed;
228
+ }
237
229
 
238
- .stuic-input .validation-box {
239
- color: var(--stuic-input-accent-error);
240
- }
230
+ /* Transparent wrapper utility - for components like Switch that don't need wrapper styling */
231
+ .stuic-input .input-wrap.input-wrap-transparent,
232
+ .stuic-input.invalid .input-wrap.input-wrap-transparent,
233
+ .stuic-input .input-wrap.input-wrap-transparent:focus-within,
234
+ .stuic-input.invalid .input-wrap.input-wrap-transparent:focus-within {
235
+ background: transparent;
236
+ border: none;
237
+ box-shadow: none;
238
+ }
241
239
 
242
- /* ============================================================================
243
- SELECT SPECIFIC
244
- Custom dropdown arrow since we removed @tailwindcss/forms
245
- ============================================================================ */
240
+ /* Size-specific input-wrap padding */
241
+ .stuic-input[data-size="lg"] .input-wrap {
242
+ padding: calc(var(--spacing) * 1);
243
+ }
246
244
 
247
- .stuic-input select {
248
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
249
- background-position: right 0.5rem center;
250
- background-repeat: no-repeat;
251
- background-size: 1.5em 1.5em;
252
- cursor: pointer;
253
- }
245
+ /* ============================================================================
246
+ VALIDATION MESSAGE
247
+ ============================================================================ */
254
248
 
255
- /* ============================================================================
256
- TEXTAREA SPECIFIC
257
- ============================================================================ */
249
+ .stuic-input .validation-box {
250
+ color: var(--stuic-input-accent-error);
251
+ }
258
252
 
259
- .stuic-input textarea {
260
- scrollbar-width: thin;
261
- resize: vertical;
262
- }
253
+ /* ============================================================================
254
+ SELECT SPECIFIC
255
+ Custom dropdown arrow since we removed @tailwindcss/forms
256
+ ============================================================================ */
257
+
258
+ .stuic-input select {
259
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
260
+ background-position: right 0.5rem center;
261
+ background-repeat: no-repeat;
262
+ background-size: 1.5em 1.5em;
263
+ cursor: pointer;
264
+ }
263
265
 
264
- /* ============================================================================
265
- FILE INPUT
266
- ============================================================================ */
266
+ /* ============================================================================
267
+ TEXTAREA SPECIFIC
268
+ ============================================================================ */
267
269
 
268
- .stuic-input input[type="file"] {
269
- padding: 0;
270
- cursor: pointer;
271
- }
270
+ .stuic-input textarea {
271
+ scrollbar-width: thin;
272
+ resize: vertical;
273
+ }
272
274
 
273
- /* Remove padding from file input wrapper */
274
- .stuic-input:has(input[type="file"]) .input-wrap {
275
- padding: 0;
276
- }
275
+ /* ============================================================================
276
+ FILE INPUT
277
+ ============================================================================ */
277
278
 
278
- .stuic-input input[type="file"]::file-selector-button {
279
- padding: var(--stuic-input-padding-y-md) var(--stuic-input-padding-x-md);
280
- margin-right: 1rem;
281
- background: var(--stuic-color-muted);
282
- color: var(--stuic-color-foreground);
283
- border: 0;
284
- border-radius: var(--stuic-input-radius);
285
- cursor: pointer;
286
- font-family: var(--stuic-input-font-family);
287
- transition: background var(--stuic-input-transition);
288
- }
279
+ .stuic-input input[type="file"] {
280
+ padding: 0;
281
+ cursor: pointer;
282
+ }
289
283
 
290
- .stuic-input input[type="file"]::file-selector-button:hover {
291
- background: var(--stuic-color-muted-hover);
292
- }
284
+ /* Remove padding from file input wrapper */
285
+ .stuic-input:has(input[type="file"]) .input-wrap {
286
+ padding: 0;
287
+ }
293
288
 
294
- /* ============================================================================
295
- RANGE INPUT
296
- Custom styling since we removed @tailwindcss/forms
297
- ============================================================================ */
289
+ .stuic-input input[type="file"]::file-selector-button {
290
+ padding: var(--stuic-input-padding-y-md) var(--stuic-input-padding-x-md);
291
+ margin-right: 1rem;
292
+ background: var(--stuic-color-muted);
293
+ color: var(--stuic-color-foreground);
294
+ border: 0;
295
+ border-radius: var(--stuic-input-radius);
296
+ cursor: pointer;
297
+ font-family: var(--stuic-input-font-family);
298
+ transition: background var(--stuic-input-transition);
299
+ }
298
300
 
299
- .stuic-input input[type="range"] {
300
- width: 100%;
301
- padding: var(--stuic-input-padding-y-md) var(--stuic-input-padding-x-md);
302
- margin: calc(
303
- (var(--stuic-input-range-thumb-size) - var(--stuic-input-range-track-height)) / 2
304
- )
305
- 0;
306
- background-color: transparent;
307
- appearance: none;
308
- cursor: pointer;
309
- }
301
+ .stuic-input input[type="file"]::file-selector-button:hover {
302
+ background: var(--stuic-color-muted-hover);
303
+ }
310
304
 
311
- .stuic-input input[type="range"]:focus {
312
- outline: none;
313
- }
305
+ /* ============================================================================
306
+ RANGE INPUT
307
+ Custom styling since we removed @tailwindcss/forms
308
+ ============================================================================ */
309
+
310
+ .stuic-input input[type="range"] {
311
+ width: 100%;
312
+ padding: var(--stuic-input-padding-y-md) var(--stuic-input-padding-x-md);
313
+ margin: calc(
314
+ (var(--stuic-input-range-thumb-size) - var(--stuic-input-range-track-height)) / 2
315
+ )
316
+ 0;
317
+ background-color: transparent;
318
+ appearance: none;
319
+ cursor: pointer;
320
+ }
314
321
 
315
- /* Webkit Track */
316
- .stuic-input input[type="range"]::-webkit-slider-runnable-track {
317
- width: 100%;
318
- height: var(--stuic-input-range-track-height);
319
- background: var(--stuic-input-range-track-bg);
320
- border: 0;
321
- border-radius: var(--stuic-input-range-track-radius);
322
- cursor: pointer;
323
- }
322
+ .stuic-input input[type="range"]:focus {
323
+ outline: none;
324
+ }
324
325
 
325
- /* Webkit Thumb */
326
- .stuic-input input[type="range"]::-webkit-slider-thumb {
327
- width: var(--stuic-input-range-thumb-size);
328
- height: var(--stuic-input-range-thumb-size);
329
- margin-top: calc(
330
- -1 * (var(--stuic-input-range-thumb-size) - var(--stuic-input-range-track-height)) / 2
331
- );
332
- background-color: var(--stuic-input-accent);
333
- border: 0;
334
- border-radius: 50%;
335
- cursor: pointer;
336
- -webkit-appearance: none;
337
- }
326
+ /* Webkit Track */
327
+ .stuic-input input[type="range"]::-webkit-slider-runnable-track {
328
+ width: 100%;
329
+ height: var(--stuic-input-range-track-height);
330
+ background: var(--stuic-input-range-track-bg);
331
+ border: 0;
332
+ border-radius: var(--stuic-input-range-track-radius);
333
+ cursor: pointer;
334
+ }
338
335
 
339
- /* Firefox Track */
340
- .stuic-input input[type="range"]::-moz-range-track {
341
- width: 100%;
342
- height: var(--stuic-input-range-track-height);
343
- background: var(--stuic-input-range-track-bg);
344
- border: 0;
345
- border-radius: var(--stuic-input-range-track-radius);
346
- cursor: pointer;
347
- }
336
+ /* Webkit Thumb */
337
+ .stuic-input input[type="range"]::-webkit-slider-thumb {
338
+ width: var(--stuic-input-range-thumb-size);
339
+ height: var(--stuic-input-range-thumb-size);
340
+ margin-top: calc(
341
+ -1 * (var(--stuic-input-range-thumb-size) - var(--stuic-input-range-track-height)) /
342
+ 2
343
+ );
344
+ background-color: var(--stuic-input-accent);
345
+ border: 0;
346
+ border-radius: 50%;
347
+ cursor: pointer;
348
+ -webkit-appearance: none;
349
+ }
348
350
 
349
- /* Firefox Thumb */
350
- .stuic-input input[type="range"]::-moz-range-thumb {
351
- width: var(--stuic-input-range-thumb-size);
352
- height: var(--stuic-input-range-thumb-size);
353
- background-color: var(--stuic-input-accent);
354
- border: 0;
355
- border-radius: 50%;
356
- cursor: pointer;
357
- }
351
+ /* Firefox Track */
352
+ .stuic-input input[type="range"]::-moz-range-track {
353
+ width: 100%;
354
+ height: var(--stuic-input-range-track-height);
355
+ background: var(--stuic-input-range-track-bg);
356
+ border: 0;
357
+ border-radius: var(--stuic-input-range-track-radius);
358
+ cursor: pointer;
359
+ }
358
360
 
359
- /* MS Edge Track (legacy) */
360
- .stuic-input input[type="range"]::-ms-track {
361
- width: 100%;
362
- height: var(--stuic-input-range-track-height);
363
- background: transparent;
364
- border-color: transparent;
365
- color: transparent;
366
- cursor: pointer;
367
- }
361
+ /* Firefox Thumb */
362
+ .stuic-input input[type="range"]::-moz-range-thumb {
363
+ width: var(--stuic-input-range-thumb-size);
364
+ height: var(--stuic-input-range-thumb-size);
365
+ background-color: var(--stuic-input-accent);
366
+ border: 0;
367
+ border-radius: 50%;
368
+ cursor: pointer;
369
+ }
368
370
 
369
- .stuic-input input[type="range"]::-ms-fill-lower,
370
- .stuic-input input[type="range"]::-ms-fill-upper {
371
- background: var(--stuic-input-range-track-bg);
372
- border: 0;
373
- border-radius: var(--stuic-input-range-track-radius);
374
- }
371
+ /* MS Edge Track (legacy) */
372
+ .stuic-input input[type="range"]::-ms-track {
373
+ width: 100%;
374
+ height: var(--stuic-input-range-track-height);
375
+ background: transparent;
376
+ border-color: transparent;
377
+ color: transparent;
378
+ cursor: pointer;
379
+ }
375
380
 
376
- .stuic-input input[type="range"]::-ms-thumb {
377
- width: var(--stuic-input-range-thumb-size);
378
- height: var(--stuic-input-range-thumb-size);
379
- background-color: var(--stuic-input-accent);
380
- border: 0;
381
- border-radius: 50%;
382
- cursor: pointer;
383
- margin-top: 0;
384
- }
381
+ .stuic-input input[type="range"]::-ms-fill-lower,
382
+ .stuic-input input[type="range"]::-ms-fill-upper {
383
+ background: var(--stuic-input-range-track-bg);
384
+ border: 0;
385
+ border-radius: var(--stuic-input-range-track-radius);
386
+ }
385
387
 
386
- /* ============================================================================
387
- CHECKBOX STYLES
388
- ============================================================================ */
388
+ .stuic-input input[type="range"]::-ms-thumb {
389
+ width: var(--stuic-input-range-thumb-size);
390
+ height: var(--stuic-input-range-thumb-size);
391
+ background-color: var(--stuic-input-accent);
392
+ border: 0;
393
+ border-radius: 50%;
394
+ cursor: pointer;
395
+ margin-top: 0;
396
+ }
389
397
 
390
- .stuic-checkbox input[type="checkbox"] {
391
- appearance: none;
392
- -webkit-appearance: none;
393
- width: var(--stuic-checkbox-size);
394
- height: var(--stuic-checkbox-size);
395
- border-radius: var(--stuic-checkbox-radius);
396
- background: var(--stuic-checkbox-bg);
397
- border: 1px solid var(--stuic-checkbox-border);
398
- cursor: pointer;
399
- transition:
400
- background var(--stuic-input-transition),
401
- border-color var(--stuic-input-transition),
402
- box-shadow var(--stuic-input-transition);
403
- }
398
+ /* ============================================================================
399
+ CHECKBOX STYLES
400
+ ============================================================================ */
401
+
402
+ .stuic-checkbox input[type="checkbox"] {
403
+ appearance: none;
404
+ -webkit-appearance: none;
405
+ width: var(--stuic-checkbox-size);
406
+ height: var(--stuic-checkbox-size);
407
+ border-radius: var(--stuic-checkbox-radius);
408
+ background: var(--stuic-checkbox-bg);
409
+ border: 1px solid var(--stuic-checkbox-border);
410
+ cursor: pointer;
411
+ transition:
412
+ background var(--stuic-input-transition),
413
+ border-color var(--stuic-input-transition),
414
+ box-shadow var(--stuic-input-transition);
415
+ }
404
416
 
405
- .stuic-checkbox input[type="checkbox"]:checked {
406
- background: var(--stuic-checkbox-checked-bg);
407
- border-color: var(--stuic-checkbox-checked-border);
408
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
409
- background-size: 100% 100%;
410
- background-position: center;
411
- background-repeat: no-repeat;
412
- }
417
+ .stuic-checkbox input[type="checkbox"]:checked {
418
+ background: var(--stuic-checkbox-checked-bg);
419
+ border-color: var(--stuic-checkbox-checked-border);
420
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");
421
+ background-size: 100% 100%;
422
+ background-position: center;
423
+ background-repeat: no-repeat;
424
+ }
413
425
 
414
- .stuic-checkbox input[type="checkbox"]:focus {
415
- outline: none;
416
- border-color: var(--stuic-input-border-focus);
417
- box-shadow: 0 0 0 var(--stuic-input-ring-width) var(--stuic-input-ring-color);
418
- }
426
+ .stuic-checkbox input[type="checkbox"]:focus {
427
+ outline: none;
428
+ border-color: var(--stuic-input-border-focus);
429
+ box-shadow: 0 0 0 var(--stuic-input-ring-width) var(--stuic-input-ring-color);
430
+ }
419
431
 
420
- .stuic-checkbox input[type="checkbox"]:disabled {
421
- cursor: not-allowed;
422
- opacity: 0.5;
423
- }
432
+ .stuic-checkbox input[type="checkbox"]:disabled {
433
+ cursor: not-allowed;
434
+ opacity: 0.5;
435
+ }
424
436
 
425
- .stuic-checkbox .validation-box {
426
- color: var(--stuic-input-accent-error);
427
- }
437
+ .stuic-checkbox .validation-box {
438
+ color: var(--stuic-input-accent-error);
439
+ }
428
440
 
429
- /* ============================================================================
430
- RADIO STYLES
431
- ============================================================================ */
441
+ /* ============================================================================
442
+ RADIO STYLES
443
+ ============================================================================ */
432
444
 
433
- .stuic-radios .radios-box {
434
- background: var(--stuic-input-bg);
435
- border: 1px solid var(--stuic-input-border);
436
- border-radius: var(--stuic-input-radius);
437
- }
445
+ .stuic-radios .radios-box {
446
+ background: var(--stuic-input-bg);
447
+ border: 1px solid var(--stuic-input-border);
448
+ border-radius: var(--stuic-input-radius);
449
+ }
438
450
 
439
- .stuic-radios.invalid .radios-box {
440
- border-color: var(--stuic-input-accent-error);
441
- }
451
+ .stuic-radios.invalid .radios-box {
452
+ border-color: var(--stuic-input-accent-error);
453
+ }
442
454
 
443
- .stuic-radios .validation-box {
444
- color: var(--stuic-input-accent-error);
445
- }
455
+ .stuic-radios .validation-box {
456
+ color: var(--stuic-input-accent-error);
457
+ }
446
458
 
447
- .stuic-radios input[type="radio"] {
448
- appearance: none;
449
- -webkit-appearance: none;
450
- width: var(--stuic-radio-size);
451
- height: var(--stuic-radio-size);
452
- border-radius: 50%;
453
- background: var(--stuic-checkbox-bg);
454
- border: 1px solid var(--stuic-checkbox-border);
455
- cursor: pointer;
456
- transition:
457
- background var(--stuic-input-transition),
458
- border-color var(--stuic-input-transition),
459
- box-shadow var(--stuic-input-transition);
460
- }
459
+ .stuic-radios input[type="radio"] {
460
+ appearance: none;
461
+ -webkit-appearance: none;
462
+ width: var(--stuic-radio-size);
463
+ height: var(--stuic-radio-size);
464
+ border-radius: 50%;
465
+ background: var(--stuic-checkbox-bg);
466
+ border: 1px solid var(--stuic-checkbox-border);
467
+ cursor: pointer;
468
+ transition:
469
+ background var(--stuic-input-transition),
470
+ border-color var(--stuic-input-transition),
471
+ box-shadow var(--stuic-input-transition);
472
+ }
461
473
 
462
- .stuic-radios input[type="radio"]:checked {
463
- background: var(--stuic-checkbox-checked-bg);
464
- border-color: var(--stuic-checkbox-checked-border);
465
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
466
- background-size: 100% 100%;
467
- background-position: center;
468
- background-repeat: no-repeat;
469
- }
474
+ .stuic-radios input[type="radio"]:checked {
475
+ background: var(--stuic-checkbox-checked-bg);
476
+ border-color: var(--stuic-checkbox-checked-border);
477
+ background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");
478
+ background-size: 100% 100%;
479
+ background-position: center;
480
+ background-repeat: no-repeat;
481
+ }
470
482
 
471
- .stuic-radios input[type="radio"]:focus {
472
- outline: none;
473
- border-color: var(--stuic-input-border-focus);
474
- box-shadow: 0 0 0 var(--stuic-input-ring-width) var(--stuic-input-ring-color);
475
- }
483
+ .stuic-radios input[type="radio"]:focus {
484
+ outline: none;
485
+ border-color: var(--stuic-input-border-focus);
486
+ box-shadow: 0 0 0 var(--stuic-input-ring-width) var(--stuic-input-ring-color);
487
+ }
476
488
 
477
- .stuic-radios input[type="radio"]:disabled {
478
- cursor: not-allowed;
479
- opacity: 0.5;
480
- }
489
+ .stuic-radios input[type="radio"]:disabled {
490
+ cursor: not-allowed;
491
+ opacity: 0.5;
492
+ }
481
493
 
482
- /* ============================================================================
483
- FIELD OPTIONS COMPONENT STYLES
484
- ============================================================================ */
494
+ /* ============================================================================
495
+ FIELD OPTIONS COMPONENT STYLES
496
+ ============================================================================ */
485
497
 
486
- /* Control buttons (Select All, Clear) */
487
- .stuic-field-options-control {
488
- color: var(--stuic-field-options-control-text);
489
- transition: color 150ms;
490
- }
498
+ /* Control buttons (Select All, Clear) */
499
+ .stuic-field-options-control {
500
+ color: var(--stuic-field-options-control-text);
501
+ transition: color 150ms;
502
+ }
491
503
 
492
- .stuic-field-options-control:hover:not(:disabled),
493
- .stuic-field-options-control:focus-visible {
494
- color: var(--stuic-field-options-control-text-hover);
495
- }
504
+ .stuic-field-options-control:hover:not(:disabled),
505
+ .stuic-field-options-control:focus-visible {
506
+ color: var(--stuic-field-options-control-text-hover);
507
+ }
496
508
 
497
- .stuic-field-options-control:focus-visible {
498
- outline: 2px solid var(--stuic-field-options-control-ring);
499
- outline-offset: 1px;
500
- }
509
+ .stuic-field-options-control:focus-visible {
510
+ outline: 2px solid var(--stuic-field-options-control-ring);
511
+ outline-offset: 1px;
512
+ }
501
513
 
502
- .stuic-field-options-control:disabled,
503
- .stuic-field-options-control[data-disabled] {
504
- opacity: 0.5;
505
- }
514
+ .stuic-field-options-control:disabled,
515
+ .stuic-field-options-control[data-disabled] {
516
+ opacity: 0.5;
517
+ }
506
518
 
507
- /* Muted/secondary text */
508
- .stuic-field-options-muted {
509
- color: var(--stuic-field-options-muted-text);
510
- }
519
+ /* Muted/secondary text */
520
+ .stuic-field-options-muted {
521
+ color: var(--stuic-field-options-muted-text);
522
+ }
511
523
 
512
- /* Placeholder/loading states */
513
- .stuic-field-options-placeholder {
514
- color: var(--stuic-field-options-muted-text);
515
- }
524
+ /* Placeholder/loading states */
525
+ .stuic-field-options-placeholder {
526
+ color: var(--stuic-field-options-muted-text);
527
+ }
516
528
 
517
- /* Optgroup labels */
518
- .stuic-field-options-optgroup {
519
- color: var(--stuic-field-options-optgroup-text);
520
- }
529
+ /* Optgroup labels */
530
+ .stuic-field-options-optgroup {
531
+ color: var(--stuic-field-options-optgroup-text);
532
+ }
521
533
 
522
- /* Icon states - inherit color from parent ListItemButton */
523
- .stuic-field-options-icon {
524
- color: inherit;
525
- opacity: 0.5;
526
- transition: opacity 150ms;
527
- }
534
+ /* Icon states - inherit color from parent ListItemButton */
535
+ .stuic-field-options-icon {
536
+ color: inherit;
537
+ opacity: 0.5;
538
+ transition: opacity 150ms;
539
+ }
528
540
 
529
- .stuic-field-options-icon--selected {
530
- opacity: 1;
541
+ .stuic-field-options-icon--selected {
542
+ opacity: 1;
543
+ }
531
544
  }