@proyecto-viviana/ui 0.1.7 → 0.2.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.
- package/README.md +192 -0
- package/dist/autocomplete/index.d.ts +89 -0
- package/dist/autocomplete/index.d.ts.map +1 -0
- package/dist/breadcrumbs/index.d.ts +38 -0
- package/dist/breadcrumbs/index.d.ts.map +1 -0
- package/dist/button/Button.d.ts.map +1 -1
- package/dist/calendar/DateField.d.ts +47 -0
- package/dist/calendar/DateField.d.ts.map +1 -0
- package/dist/calendar/DatePicker.d.ts +48 -0
- package/dist/calendar/DatePicker.d.ts.map +1 -0
- package/dist/calendar/RangeCalendar.d.ts +42 -0
- package/dist/calendar/RangeCalendar.d.ts.map +1 -0
- package/dist/calendar/TimeField.d.ts +44 -0
- package/dist/calendar/TimeField.d.ts.map +1 -0
- package/dist/calendar/index.d.ts +50 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/checkbox/index.d.ts.map +1 -1
- package/dist/color/index.d.ts +228 -0
- package/dist/color/index.d.ts.map +1 -0
- package/dist/combobox/index.d.ts +81 -0
- package/dist/combobox/index.d.ts.map +1 -0
- package/dist/components.css +116 -14
- package/dist/custom/chip/index.d.ts +7 -2
- package/dist/custom/chip/index.d.ts.map +1 -1
- package/dist/custom/event-card/index.d.ts +5 -1
- package/dist/custom/event-card/index.d.ts.map +1 -1
- package/dist/custom/header/index.d.ts +16 -0
- package/dist/custom/header/index.d.ts.map +1 -0
- package/dist/custom/logo/index.d.ts +2 -0
- package/dist/custom/logo/index.d.ts.map +1 -1
- package/dist/custom/page-layout/index.d.ts +2 -0
- package/dist/custom/page-layout/index.d.ts.map +1 -1
- package/dist/custom/profile-card/index.d.ts +5 -1
- package/dist/custom/profile-card/index.d.ts.map +1 -1
- package/dist/custom/timeline-item/index.d.ts +12 -2
- package/dist/custom/timeline-item/index.d.ts.map +1 -1
- package/dist/dialog/Dialog.d.ts +67 -0
- package/dist/dialog/Dialog.d.ts.map +1 -0
- package/dist/dialog/index.d.ts +2 -17
- package/dist/dialog/index.d.ts.map +1 -1
- package/dist/disclosure/index.d.ts +84 -0
- package/dist/disclosure/index.d.ts.map +1 -0
- package/dist/gridlist/index.d.ts +92 -0
- package/dist/gridlist/index.d.ts.map +1 -0
- package/dist/index.d.ts +58 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6984 -783
- package/dist/index.js.map +1 -1
- package/dist/index.ssr.js +5905 -571
- package/dist/index.ssr.js.map +1 -1
- package/dist/landmark/index.d.ts +83 -0
- package/dist/landmark/index.d.ts.map +1 -0
- package/dist/link/index.d.ts.map +1 -1
- package/dist/listbox/index.d.ts +47 -0
- package/dist/listbox/index.d.ts.map +1 -0
- package/dist/menu/index.d.ts +74 -0
- package/dist/menu/index.d.ts.map +1 -0
- package/dist/meter/index.d.ts +49 -0
- package/dist/meter/index.d.ts.map +1 -0
- package/dist/numberfield/index.d.ts +50 -0
- package/dist/numberfield/index.d.ts.map +1 -0
- package/dist/popover/index.d.ts +85 -0
- package/dist/popover/index.d.ts.map +1 -0
- package/dist/radio/index.d.ts +7 -4
- package/dist/radio/index.d.ts.map +1 -1
- package/dist/searchfield/index.d.ts +44 -0
- package/dist/searchfield/index.d.ts.map +1 -0
- package/dist/select/index.d.ts +72 -0
- package/dist/select/index.d.ts.map +1 -0
- package/dist/slider/index.d.ts +53 -0
- package/dist/slider/index.d.ts.map +1 -0
- package/dist/switch/ToggleSwitch.d.ts.map +1 -1
- package/dist/table/index.d.ts +140 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/tabs/index.d.ts +56 -0
- package/dist/tabs/index.d.ts.map +1 -0
- package/dist/tag-group/index.d.ts +80 -0
- package/dist/tag-group/index.d.ts.map +1 -0
- package/dist/toast/index.d.ts +101 -0
- package/dist/toast/index.d.ts.map +1 -0
- package/dist/toolbar/index.d.ts +42 -0
- package/dist/toolbar/index.d.ts.map +1 -0
- package/dist/tooltip/index.d.ts +66 -5
- package/dist/tooltip/index.d.ts.map +1 -1
- package/dist/tree/index.d.ts +99 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/package.json +66 -58
- package/src/autocomplete/index.tsx +313 -0
- package/src/breadcrumbs/index.tsx +207 -0
- package/src/button/Button.tsx +74 -75
- package/src/calendar/DateField.tsx +200 -0
- package/src/calendar/DatePicker.tsx +298 -0
- package/src/calendar/RangeCalendar.tsx +236 -0
- package/src/calendar/TimeField.tsx +196 -0
- package/src/calendar/index.tsx +223 -0
- package/src/checkbox/index.tsx +3 -4
- package/src/color/index.tsx +687 -0
- package/src/combobox/index.tsx +383 -0
- package/src/components.css +116 -14
- package/src/custom/chip/index.tsx +17 -3
- package/src/custom/event-card/index.tsx +8 -2
- package/src/custom/header/index.tsx +33 -0
- package/src/custom/logo/index.tsx +7 -3
- package/src/custom/page-layout/index.tsx +12 -3
- package/src/custom/profile-card/index.tsx +8 -2
- package/src/custom/timeline-item/index.tsx +28 -4
- package/src/dialog/Dialog.tsx +260 -0
- package/src/dialog/index.tsx +3 -69
- package/src/disclosure/index.tsx +307 -0
- package/src/gridlist/index.tsx +403 -0
- package/src/index.ts +219 -4
- package/src/landmark/index.tsx +231 -0
- package/src/link/index.tsx +1 -2
- package/src/listbox/index.tsx +231 -0
- package/src/menu/index.tsx +297 -0
- package/src/meter/index.tsx +163 -0
- package/src/numberfield/index.tsx +482 -0
- package/src/popover/index.tsx +260 -0
- package/src/radio/index.tsx +36 -82
- package/src/searchfield/index.tsx +453 -0
- package/src/select/index.tsx +349 -0
- package/src/slider/index.tsx +382 -0
- package/src/switch/ToggleSwitch.tsx +1 -2
- package/src/table/index.tsx +531 -0
- package/src/tabs/index.tsx +273 -0
- package/src/tag-group/index.tsx +240 -0
- package/src/toast/index.tsx +324 -0
- package/src/toolbar/index.tsx +108 -0
- package/src/tooltip/index.tsx +171 -5
- package/src/tree/index.tsx +494 -0
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Select component for proyecto-viviana-ui
|
|
3
|
+
*
|
|
4
|
+
* Styled select component built on top of solidaria-components.
|
|
5
|
+
* Inspired by Spectrum 2's Picker component patterns.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { type JSX, Show, splitProps, createContext, useContext } from 'solid-js'
|
|
9
|
+
import {
|
|
10
|
+
Select as HeadlessSelect,
|
|
11
|
+
SelectTrigger as HeadlessSelectTrigger,
|
|
12
|
+
SelectValue as HeadlessSelectValue,
|
|
13
|
+
SelectListBox as HeadlessSelectListBox,
|
|
14
|
+
SelectOption as HeadlessSelectOption,
|
|
15
|
+
type SelectProps as HeadlessSelectProps,
|
|
16
|
+
type SelectTriggerProps as HeadlessSelectTriggerProps,
|
|
17
|
+
type SelectValueProps as HeadlessSelectValueProps,
|
|
18
|
+
type SelectListBoxProps as HeadlessSelectListBoxProps,
|
|
19
|
+
type SelectOptionProps as HeadlessSelectOptionProps,
|
|
20
|
+
type SelectRenderProps,
|
|
21
|
+
type SelectTriggerRenderProps,
|
|
22
|
+
type SelectValueRenderProps,
|
|
23
|
+
type SelectListBoxRenderProps,
|
|
24
|
+
type SelectOptionRenderProps,
|
|
25
|
+
} from '@proyecto-viviana/solidaria-components'
|
|
26
|
+
import type { Key } from '@proyecto-viviana/solid-stately'
|
|
27
|
+
|
|
28
|
+
// ============================================
|
|
29
|
+
// SIZE CONTEXT
|
|
30
|
+
// ============================================
|
|
31
|
+
|
|
32
|
+
export type SelectSize = 'sm' | 'md' | 'lg'
|
|
33
|
+
|
|
34
|
+
const SelectSizeContext = createContext<SelectSize>('md')
|
|
35
|
+
|
|
36
|
+
// ============================================
|
|
37
|
+
// TYPES
|
|
38
|
+
// ============================================
|
|
39
|
+
|
|
40
|
+
export interface SelectProps<T> extends Omit<HeadlessSelectProps<T>, 'class' | 'style'> {
|
|
41
|
+
/** The size of the select. */
|
|
42
|
+
size?: SelectSize
|
|
43
|
+
/** Additional CSS class name. */
|
|
44
|
+
class?: string
|
|
45
|
+
/** Label for the select. */
|
|
46
|
+
label?: string
|
|
47
|
+
/** Description for the select. */
|
|
48
|
+
description?: string
|
|
49
|
+
/** Error message when invalid. */
|
|
50
|
+
errorMessage?: string
|
|
51
|
+
/** Whether the select is invalid. */
|
|
52
|
+
isInvalid?: boolean
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface SelectTriggerProps extends Omit<HeadlessSelectTriggerProps, 'class' | 'style'> {
|
|
56
|
+
/** Additional CSS class name. */
|
|
57
|
+
class?: string
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface SelectValueProps<T> extends Omit<HeadlessSelectValueProps<T>, 'class' | 'style'> {
|
|
61
|
+
/** Additional CSS class name. */
|
|
62
|
+
class?: string
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface SelectListBoxProps<T> extends Omit<HeadlessSelectListBoxProps<T>, 'class' | 'style'> {
|
|
66
|
+
/** Additional CSS class name. */
|
|
67
|
+
class?: string
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface SelectOptionProps<T> extends Omit<HeadlessSelectOptionProps<T>, 'class' | 'style'> {
|
|
71
|
+
/** Additional CSS class name. */
|
|
72
|
+
class?: string
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ============================================
|
|
76
|
+
// STYLES
|
|
77
|
+
// ============================================
|
|
78
|
+
|
|
79
|
+
const sizeStyles = {
|
|
80
|
+
sm: {
|
|
81
|
+
trigger: 'h-8 text-sm px-3 gap-2',
|
|
82
|
+
label: 'text-sm',
|
|
83
|
+
option: 'text-sm py-1.5 px-3',
|
|
84
|
+
icon: 'h-4 w-4',
|
|
85
|
+
},
|
|
86
|
+
md: {
|
|
87
|
+
trigger: 'h-10 text-base px-4 gap-2',
|
|
88
|
+
label: 'text-base',
|
|
89
|
+
option: 'text-base py-2 px-4',
|
|
90
|
+
icon: 'h-5 w-5',
|
|
91
|
+
},
|
|
92
|
+
lg: {
|
|
93
|
+
trigger: 'h-12 text-lg px-5 gap-3',
|
|
94
|
+
label: 'text-lg',
|
|
95
|
+
option: 'text-lg py-2.5 px-5',
|
|
96
|
+
icon: 'h-6 w-6',
|
|
97
|
+
},
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ============================================
|
|
101
|
+
// SELECT COMPONENT
|
|
102
|
+
// ============================================
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* A select displays a collapsible list of options and allows a user to select one of them.
|
|
106
|
+
*
|
|
107
|
+
* Built on solidaria-components Select for full accessibility support.
|
|
108
|
+
*/
|
|
109
|
+
export function Select<T>(props: SelectProps<T>): JSX.Element {
|
|
110
|
+
const [local, headlessProps] = splitProps(props, [
|
|
111
|
+
'size',
|
|
112
|
+
'class',
|
|
113
|
+
'label',
|
|
114
|
+
'description',
|
|
115
|
+
'errorMessage',
|
|
116
|
+
'isInvalid',
|
|
117
|
+
])
|
|
118
|
+
|
|
119
|
+
const size = local.size ?? 'md'
|
|
120
|
+
const customClass = local.class ?? ''
|
|
121
|
+
|
|
122
|
+
const getClassName = (renderProps: SelectRenderProps): string => {
|
|
123
|
+
const base = 'relative inline-flex flex-col gap-1.5'
|
|
124
|
+
const disabledClass = renderProps.isDisabled ? 'opacity-50' : ''
|
|
125
|
+
return [base, disabledClass, customClass].filter(Boolean).join(' ')
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<SelectSizeContext.Provider value={size}>
|
|
130
|
+
<HeadlessSelect
|
|
131
|
+
{...headlessProps}
|
|
132
|
+
class={getClassName}
|
|
133
|
+
>
|
|
134
|
+
<Show when={local.label}>
|
|
135
|
+
<label class={`text-primary-200 font-medium ${sizeStyles[size].label}`}>
|
|
136
|
+
{local.label}
|
|
137
|
+
</label>
|
|
138
|
+
</Show>
|
|
139
|
+
{props.children}
|
|
140
|
+
<Show when={local.description && !local.isInvalid}>
|
|
141
|
+
<span class="text-primary-400 text-sm">{local.description}</span>
|
|
142
|
+
</Show>
|
|
143
|
+
<Show when={local.errorMessage && local.isInvalid}>
|
|
144
|
+
<span class="text-danger-400 text-sm">{local.errorMessage}</span>
|
|
145
|
+
</Show>
|
|
146
|
+
</HeadlessSelect>
|
|
147
|
+
</SelectSizeContext.Provider>
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ============================================
|
|
152
|
+
// SELECT TRIGGER COMPONENT
|
|
153
|
+
// ============================================
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* The trigger button for a select.
|
|
157
|
+
* SSR-compatible - renders children and chevron icon directly without render props.
|
|
158
|
+
*/
|
|
159
|
+
export function SelectTrigger(props: SelectTriggerProps): JSX.Element {
|
|
160
|
+
const [local, headlessProps] = splitProps(props, ['class'])
|
|
161
|
+
const size = useContext(SelectSizeContext)
|
|
162
|
+
const sizeStyle = sizeStyles[size]
|
|
163
|
+
const customClass = local.class ?? ''
|
|
164
|
+
|
|
165
|
+
const getClassName = (renderProps: SelectTriggerRenderProps): string => {
|
|
166
|
+
const base = 'inline-flex items-center justify-between rounded-lg border-2 transition-all duration-200 w-full'
|
|
167
|
+
const sizeClass = sizeStyle.trigger
|
|
168
|
+
|
|
169
|
+
let colorClass: string
|
|
170
|
+
if (renderProps.isDisabled) {
|
|
171
|
+
colorClass = 'border-bg-300 bg-bg-200 text-primary-500 cursor-not-allowed'
|
|
172
|
+
} else if (renderProps.isOpen) {
|
|
173
|
+
colorClass = 'border-accent bg-bg-300 text-primary-100'
|
|
174
|
+
} else if (renderProps.isHovered) {
|
|
175
|
+
colorClass = 'border-accent-300 bg-bg-300 text-primary-100 cursor-pointer'
|
|
176
|
+
} else {
|
|
177
|
+
colorClass = 'border-primary-600 bg-bg-400 text-primary-200 cursor-pointer'
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
const focusClass = renderProps.isFocusVisible
|
|
181
|
+
? 'ring-2 ring-accent-300 ring-offset-2 ring-offset-bg-400'
|
|
182
|
+
: ''
|
|
183
|
+
|
|
184
|
+
return [base, sizeClass, colorClass, focusClass, customClass].filter(Boolean).join(' ')
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return (
|
|
188
|
+
<HeadlessSelectTrigger
|
|
189
|
+
{...headlessProps}
|
|
190
|
+
class={getClassName}
|
|
191
|
+
>
|
|
192
|
+
{props.children as JSX.Element}
|
|
193
|
+
{/* Chevron rotates via CSS based on data-open attribute from headless component */}
|
|
194
|
+
<ChevronIcon class={`${sizeStyle.icon} transition-transform duration-200 data-open:rotate-180`} />
|
|
195
|
+
</HeadlessSelectTrigger>
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// ============================================
|
|
200
|
+
// SELECT VALUE COMPONENT
|
|
201
|
+
// ============================================
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Displays the selected value in a select.
|
|
205
|
+
*/
|
|
206
|
+
export function SelectValue<T>(props: SelectValueProps<T>): JSX.Element {
|
|
207
|
+
const [local, headlessProps] = splitProps(props, ['class'])
|
|
208
|
+
const customClass = local.class ?? ''
|
|
209
|
+
|
|
210
|
+
const getClassName = (renderProps: SelectValueRenderProps<T>): string => {
|
|
211
|
+
const base = 'truncate flex-1 text-left'
|
|
212
|
+
const placeholderClass = !renderProps.isSelected ? 'text-primary-500' : ''
|
|
213
|
+
return [base, placeholderClass, customClass].filter(Boolean).join(' ')
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
<HeadlessSelectValue
|
|
218
|
+
{...headlessProps}
|
|
219
|
+
class={getClassName}
|
|
220
|
+
children={props.children}
|
|
221
|
+
/>
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// ============================================
|
|
226
|
+
// SELECT LISTBOX COMPONENT
|
|
227
|
+
// ============================================
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* The listbox popup for a select.
|
|
231
|
+
*/
|
|
232
|
+
export function SelectListBox<T>(props: SelectListBoxProps<T>): JSX.Element {
|
|
233
|
+
const [local, headlessProps] = splitProps(props, ['class'])
|
|
234
|
+
const customClass = local.class ?? ''
|
|
235
|
+
|
|
236
|
+
const getClassName = (_renderProps: SelectListBoxRenderProps): string => {
|
|
237
|
+
const base = 'absolute z-50 mt-1 w-full rounded-lg border-2 border-primary-600 bg-bg-400 py-1 shadow-lg max-h-60 overflow-auto'
|
|
238
|
+
return [base, customClass].filter(Boolean).join(' ')
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return (
|
|
242
|
+
<HeadlessSelectListBox
|
|
243
|
+
{...headlessProps}
|
|
244
|
+
class={getClassName}
|
|
245
|
+
children={props.children}
|
|
246
|
+
/>
|
|
247
|
+
)
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// ============================================
|
|
251
|
+
// SELECT OPTION COMPONENT
|
|
252
|
+
// ============================================
|
|
253
|
+
|
|
254
|
+
// Padding classes for when no check icon is shown (to maintain alignment)
|
|
255
|
+
const paddingStyles = {
|
|
256
|
+
sm: 'pl-6', // h-4 (1rem) + gap-2 (0.5rem) = 1.5rem = pl-6
|
|
257
|
+
md: 'pl-7', // h-5 (1.25rem) + gap-2 (0.5rem) = 1.75rem ≈ pl-7
|
|
258
|
+
lg: 'pl-9', // h-6 (1.5rem) + gap-3 (0.75rem) = 2.25rem = pl-9
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* An option in a select listbox.
|
|
263
|
+
* SSR-compatible - renders check icon and content directly without render props.
|
|
264
|
+
*/
|
|
265
|
+
export function SelectOption<T>(props: SelectOptionProps<T>): JSX.Element {
|
|
266
|
+
const [local, headlessProps] = splitProps(props, ['class'])
|
|
267
|
+
const size = useContext(SelectSizeContext)
|
|
268
|
+
const sizeStyle = sizeStyles[size]
|
|
269
|
+
const customClass = local.class ?? ''
|
|
270
|
+
|
|
271
|
+
const getClassName = (renderProps: SelectOptionRenderProps): string => {
|
|
272
|
+
const base = 'flex items-center gap-2 cursor-pointer transition-colors duration-150'
|
|
273
|
+
const sizeClass = sizeStyle.option
|
|
274
|
+
|
|
275
|
+
let colorClass: string
|
|
276
|
+
if (renderProps.isDisabled) {
|
|
277
|
+
colorClass = 'text-primary-500 cursor-not-allowed'
|
|
278
|
+
} else if (renderProps.isSelected) {
|
|
279
|
+
colorClass = 'bg-accent/20 text-accent'
|
|
280
|
+
} else if (renderProps.isFocused || renderProps.isHovered) {
|
|
281
|
+
colorClass = 'bg-bg-300 text-primary-100'
|
|
282
|
+
} else {
|
|
283
|
+
colorClass = 'text-primary-200'
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const focusClass = renderProps.isFocusVisible
|
|
287
|
+
? 'ring-2 ring-inset ring-accent-300'
|
|
288
|
+
: ''
|
|
289
|
+
|
|
290
|
+
return [base, sizeClass, colorClass, focusClass, customClass].filter(Boolean).join(' ')
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const iconClass = `${sizeStyle.icon} text-accent shrink-0 hidden data-selected:block`
|
|
294
|
+
const paddingClass = paddingStyles[size]
|
|
295
|
+
|
|
296
|
+
return (
|
|
297
|
+
<HeadlessSelectOption
|
|
298
|
+
{...headlessProps}
|
|
299
|
+
class={getClassName}
|
|
300
|
+
>
|
|
301
|
+
{/* Check icon shows only when selected via data-selected attribute */}
|
|
302
|
+
<CheckIcon class={iconClass} />
|
|
303
|
+
<span class={`flex-1 data-selected:pl-0 ${paddingClass}`}>
|
|
304
|
+
{props.children as JSX.Element}
|
|
305
|
+
</span>
|
|
306
|
+
</HeadlessSelectOption>
|
|
307
|
+
)
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// ============================================
|
|
311
|
+
// ICONS
|
|
312
|
+
// ============================================
|
|
313
|
+
|
|
314
|
+
function ChevronIcon(props: { class?: string }): JSX.Element {
|
|
315
|
+
return (
|
|
316
|
+
<svg
|
|
317
|
+
class={props.class}
|
|
318
|
+
fill="none"
|
|
319
|
+
viewBox="0 0 24 24"
|
|
320
|
+
stroke="currentColor"
|
|
321
|
+
stroke-width="2"
|
|
322
|
+
>
|
|
323
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" />
|
|
324
|
+
</svg>
|
|
325
|
+
)
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
function CheckIcon(props: { class?: string }): JSX.Element {
|
|
329
|
+
return (
|
|
330
|
+
<svg
|
|
331
|
+
class={props.class}
|
|
332
|
+
fill="none"
|
|
333
|
+
viewBox="0 0 24 24"
|
|
334
|
+
stroke="currentColor"
|
|
335
|
+
stroke-width="2"
|
|
336
|
+
>
|
|
337
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />
|
|
338
|
+
</svg>
|
|
339
|
+
)
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Attach sub-components for convenience
|
|
343
|
+
Select.Trigger = SelectTrigger
|
|
344
|
+
Select.Value = SelectValue
|
|
345
|
+
Select.ListBox = SelectListBox
|
|
346
|
+
Select.Option = SelectOption
|
|
347
|
+
|
|
348
|
+
// Re-export Key type for convenience
|
|
349
|
+
export type { Key }
|