@catalystsoftware/ui 1.0.5 → 1.0.7

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 (155) hide show
  1. package/dist/data/data.tsx +29 -29
  2. package/dist/data/tailwind.config.js +3821 -261
  3. package/dist/data.tsx +29 -29
  4. package/package.json +4 -3
  5. package/components/catalyst-ui/buttons/burger.tsx +0 -207
  6. package/components/catalyst-ui/core/data-display/timeline.tsx +0 -210
  7. package/components/catalyst-ui/core/feedback/alert.tsx +0 -491
  8. package/components/catalyst-ui/core/feedback/spinner-1.tsx +0 -65
  9. package/components/catalyst-ui/core/feedback/toast.tsx +0 -1857
  10. package/components/catalyst-ui/core/navigation/menu.tsx +0 -164
  11. package/components/catalyst-ui/forms/toggle-class.tsx +0 -176
  12. package/components/catalyst-ui/hooks/use-copy-to-clipboard.tsx +0 -419
  13. package/components/catalyst-ui/hooks/use-counter.tsx +0 -13
  14. package/components/catalyst-ui/hooks/use-event-listener.tsx +0 -23
  15. package/components/catalyst-ui/hooks/use-export-markdown.tsx +0 -47
  16. package/components/catalyst-ui/hooks/use-focus.tsx +0 -17
  17. package/components/catalyst-ui/hooks/use-interval.tsx +0 -23
  18. package/components/catalyst-ui/hooks/use-is-client.tsx +0 -16
  19. package/components/catalyst-ui/hooks/use-media-query.tsx +0 -19
  20. package/components/catalyst-ui/hooks/use-mobile.tsx +0 -19
  21. package/components/catalyst-ui/hooks/use-resize-observer.tsx +0 -81
  22. package/components/catalyst-ui/hooks/use-timeout.tsx +0 -21
  23. package/components/catalyst-ui/hooks/use-timer.tsx +0 -209
  24. package/components/catalyst-ui/hooks/use-toggle.tsx +0 -12
  25. package/components/catalyst-ui/media/image.tsx +0 -13
  26. package/components/catalyst-ui/overlays/dual-sidebar.tsx +0 -4142
  27. package/components/catalyst-ui/overlays/sidebar-original.tsx +0 -726
  28. package/components/catalyst-ui/primitives/accordion.tsx +0 -250
  29. package/components/catalyst-ui/primitives/alert-dialog.tsx +0 -126
  30. package/components/catalyst-ui/primitives/aspect-ratio.tsx +0 -9
  31. package/components/catalyst-ui/primitives/avatar.tsx +0 -296
  32. package/components/catalyst-ui/primitives/badge.tsx +0 -57
  33. package/components/catalyst-ui/primitives/breadcrumb.tsx +0 -101
  34. package/components/catalyst-ui/primitives/button.tsx +0 -265
  35. package/components/catalyst-ui/primitives/calendar-v4.tsx +0 -208
  36. package/components/catalyst-ui/primitives/calendar.tsx +0 -295
  37. package/components/catalyst-ui/primitives/card.tsx +0 -618
  38. package/components/catalyst-ui/primitives/carousel.tsx +0 -238
  39. package/components/catalyst-ui/primitives/chart.tsx +0 -347
  40. package/components/catalyst-ui/primitives/checkbox.tsx +0 -225
  41. package/components/catalyst-ui/primitives/collapsible.tsx +0 -212
  42. package/components/catalyst-ui/primitives/command.tsx +0 -393
  43. package/components/catalyst-ui/primitives/context-menu.tsx +0 -236
  44. package/components/catalyst-ui/primitives/dialog.tsx +0 -471
  45. package/components/catalyst-ui/primitives/drawer.tsx +0 -761
  46. package/components/catalyst-ui/primitives/dropdown-menu.tsx +0 -290
  47. package/components/catalyst-ui/primitives/empty.tsx +0 -104
  48. package/components/catalyst-ui/primitives/field.tsx +0 -244
  49. package/components/catalyst-ui/primitives/hover-card.tsx +0 -124
  50. package/components/catalyst-ui/primitives/input-otp.tsx +0 -76
  51. package/components/catalyst-ui/primitives/input.tsx +0 -64
  52. package/components/catalyst-ui/primitives/item.tsx +0 -196
  53. package/components/catalyst-ui/primitives/kbd.tsx +0 -75
  54. package/components/catalyst-ui/primitives/label.tsx +0 -24
  55. package/components/catalyst-ui/primitives/navigation-menu.tsx +0 -150
  56. package/components/catalyst-ui/primitives/pagination.tsx +0 -198
  57. package/components/catalyst-ui/primitives/popover.tsx +0 -232
  58. package/components/catalyst-ui/primitives/progress.tsx +0 -34
  59. package/components/catalyst-ui/primitives/radio-group.tsx +0 -43
  60. package/components/catalyst-ui/primitives/resizable.tsx +0 -56
  61. package/components/catalyst-ui/primitives/select.tsx +0 -155
  62. package/components/catalyst-ui/primitives/separator.tsx +0 -74
  63. package/components/catalyst-ui/primitives/sheet.tsx +0 -126
  64. package/components/catalyst-ui/primitives/skeleton.tsx +0 -15
  65. package/components/catalyst-ui/primitives/slider.tsx +0 -27
  66. package/components/catalyst-ui/primitives/switch.tsx +0 -187
  67. package/components/catalyst-ui/primitives/tabs.tsx +0 -335
  68. package/components/catalyst-ui/primitives/textarea.tsx +0 -24
  69. package/components/catalyst-ui/primitives/toggle-group.tsx +0 -55
  70. package/components/catalyst-ui/primitives/toggle.tsx +0 -42
  71. package/components/catalyst-ui/primitives/tooltip.tsx +0 -116
  72. package/components/catalyst-ui/utils/basic-auth.tsx +0 -40
  73. package/components/catalyst-ui/utils/context-storage.tsx +0 -19
  74. package/components/catalyst-ui/utils/cors-middleware.tsx +0 -71
  75. package/components/catalyst-ui/utils/deferred-content.tsx +0 -595
  76. package/components/catalyst-ui/utils/honeypot-middleware.tsx +0 -38
  77. package/components/catalyst-ui/utils/incId.tsx +0 -75
  78. package/components/catalyst-ui/utils/jwk-auth.tsx +0 -36
  79. package/components/catalyst-ui/utils/request-id.tsx +0 -14
  80. package/components/catalyst-ui/utils/secure-headers.tsx +0 -37
  81. package/components/catalyst-ui/utils/server-timing.tsx +0 -23
  82. package/components/catalyst-ui/utils/utils.ts +0 -43
  83. package/components/catalyst-ui/utils/with-cookie.tsx +0 -43
  84. package/components/catalyst-ui/x/accordian-x.tsx +0 -428
  85. package/components/catalyst-ui/x/alert-x.tsx +0 -413
  86. package/components/catalyst-ui/x/animated-text-x.tsx +0 -2242
  87. package/components/catalyst-ui/x/avatar-x.tsx +0 -515
  88. package/components/catalyst-ui/x/badge-x.tsx +0 -670
  89. package/components/catalyst-ui/x/button-X.tsx +0 -2857
  90. package/components/catalyst-ui/x/button-group-x.tsx +0 -847
  91. package/components/catalyst-ui/x/calendar-x.tsx +0 -1910
  92. package/components/catalyst-ui/x/card-x.tsx +0 -2597
  93. package/components/catalyst-ui/x/checkbox-x.tsx +0 -656
  94. package/components/catalyst-ui/x/collapsible-x.tsx +0 -1360
  95. package/components/catalyst-ui/x/combobox-x.tsx +0 -911
  96. package/components/catalyst-ui/x/data-table-x.tsx +0 -1753
  97. package/components/catalyst-ui/x/date-picker-x.tsx +0 -648
  98. package/components/catalyst-ui/x/dialog-x.tsx +0 -659
  99. package/components/catalyst-ui/x/dropdown-menu-x.tsx +0 -612
  100. package/components/catalyst-ui/x/hover-card-x.tsx +0 -375
  101. package/components/catalyst-ui/x/icon-x.tsx +0 -840
  102. package/components/catalyst-ui/x/input-mask-x.tsx +0 -981
  103. package/components/catalyst-ui/x/input-otp-x.tsx +0 -659
  104. package/components/catalyst-ui/x/loader-x.tsx +0 -1757
  105. package/components/catalyst-ui/x/pagination-x.tsx +0 -622
  106. package/components/catalyst-ui/x/popover-x.tsx +0 -744
  107. package/components/catalyst-ui/x/radio-group-x.tsx +0 -499
  108. package/components/catalyst-ui/x/select-x.tsx +0 -1127
  109. package/components/catalyst-ui/x/sheet-x.tsx +0 -668
  110. package/components/catalyst-ui/x/switch-x.tsx +0 -681
  111. package/components/catalyst-ui/x/table-x.tsx +0 -574
  112. package/components/catalyst-ui/x/tabs-x.tsx +0 -839
  113. package/components/catalyst-ui/x/textarea-x.tsx +0 -1263
  114. package/components/catalyst-ui/x/tooltip-x.tsx +0 -396
  115. package/components/catalyst-ui/x/tracker-x.tsx +0 -560
  116. package/data/bg-data.tsx +0 -901
  117. package/data/buttons-data.tsx +0 -2327
  118. package/data/charts-data.tsx +0 -102
  119. package/data/chat-data.tsx +0 -83
  120. package/data/code-data.tsx +0 -1040
  121. package/data/comboboxes-data.tsx +0 -1843
  122. package/data/command-data.tsx +0 -1381
  123. package/data/core-data.tsx +0 -15953
  124. package/data/crm-data.tsx +0 -47
  125. package/data/data.tsx +0 -159
  126. package/data/date-and-time-data.tsx +0 -554
  127. package/data/dependencies.tsx +0 -7
  128. package/data/ecommerce-data.tsx +0 -1387
  129. package/data/forms-data.tsx +0 -7890
  130. package/data/hooks-data.tsx +0 -5487
  131. package/data/index.ts +0 -34
  132. package/data/inputs-data.tsx +0 -557
  133. package/data/interactive-data.tsx +0 -5394
  134. package/data/lofi-data.tsx +0 -18295
  135. package/data/marketing-data.tsx +0 -2546
  136. package/data/media-data.tsx +0 -1510
  137. package/data/motion-data.tsx +0 -5801
  138. package/data/overlay-data.tsx +0 -4136
  139. package/data/pdf-data.tsx +0 -124
  140. package/data/pos-data.tsx +0 -213
  141. package/data/postcss.config.js +0 -6
  142. package/data/primitive-data.tsx +0 -5170
  143. package/data/prompt-data.tsx +0 -1226
  144. package/data/requiredLibs.ts +0 -4
  145. package/data/sandbox-data.tsx +0 -1
  146. package/data/sidebars-data.tsx +0 -5421
  147. package/data/stacks-data.tsx +0 -32
  148. package/data/table-data.tsx +0 -706
  149. package/data/tailwind.config.js +0 -270
  150. package/data/tailwind.config.ngin.js +0 -3830
  151. package/data/tailwind.css +0 -431
  152. package/data/tools-data.tsx +0 -6910
  153. package/data/typography-data.tsx +0 -2050
  154. package/data/utils-data.tsx +0 -6500
  155. package/data/x-data.tsx +0 -1171
@@ -1,1127 +0,0 @@
1
- /**
2
-
3
-
4
- const SelectNativeDemo = () => {
5
- const id = useId()
6
-
7
- return (
8
- <div className='w-full max-w-xs space-y-2'>
9
- <Label htmlFor={id}>Native select default</Label>
10
- <SelectNative id={id}>
11
- <option value='1'>Male</option>
12
- <option value='2'>Female</option>
13
- <option value='3'>Other</option>
14
- </SelectNative>
15
- </div>
16
- )
17
- }
18
-
19
- const SelectNativePlaceholderDemo = () => {
20
- const id = useId()
21
-
22
- return (
23
- <div className='w-full max-w-xs space-y-2'>
24
- <Label htmlFor={id}>Native select with placeholder</Label>
25
- <SelectNative id={id} defaultValue=''>
26
- <option value='' disabled>
27
- Please select a gender
28
- </option>
29
- <option value='1'>Male</option>
30
- <option value='2'>Female</option>
31
- <option value='3'>Other</option>
32
- </SelectNative>
33
- </div>
34
- )
35
- }
36
-
37
- const NativeSelectWithIconDemo = () => {
38
- const id = useId()
39
-
40
- return (
41
- <div className='w-full max-w-xs space-y-2'>
42
- <Label htmlFor={id}>Native select with icon</Label>
43
- <div className='group relative'>
44
- <SelectNative id={id} className='pl-9' defaultValue=''>
45
- <option value='' disabled>
46
- Pick your favorite movie
47
- </option>
48
- <option value='1'>Godfather</option>
49
- <option value='2'>A Working Man</option>
50
- <option value='3'>The Dark Knight</option>
51
- <option value='4'>Inception</option>
52
- </SelectNative>
53
- <div className='text-muted-foreground/80 pointer-events-none absolute inset-y-0 left-0 flex items-center justify-center pl-3 group-has-[select[disabled]]:opacity-50'>
54
- <FilmIcon size={16} aria-hidden='true' />
55
- </div>
56
- </div>
57
- </div>
58
- )
59
- }
60
-
61
- const NativeSelectWithHelperTextDemo = () => {
62
- const id = useId()
63
-
64
- return (
65
- <div className='w-full max-w-xs space-y-2'>
66
- <Label htmlFor={id}>Native select with helper text</Label>
67
- <SelectNative id={id}>
68
- <option value='1'>Florida</option>
69
- <option value='2'>California</option>
70
- <option value='3'>San Francisco</option>
71
- <option value='4'>Alabama</option>
72
- </SelectNative>
73
- <p className='text-muted-foreground mt-2 text-xs' role='region' aria-live='polite'>
74
- Could you share which city you&apos;re based in?
75
- </p>
76
- </div>
77
- )
78
- }
79
-
80
- const NativeSelectWithErrorDemo = () => {
81
- const id = useId()
82
-
83
- return (
84
- <div className='w-full max-w-xs space-y-2'>
85
- <Label htmlFor={id}>Native select with error</Label>
86
- <SelectNative id={id} aria-invalid>
87
- <option value='1'>IST (Indian Standard Time)</option>
88
- <option value='2'>EST (Eastern Standard Time)</option>
89
- <option value='3'>PST (Pacific Standard Time)</option>
90
- <option value='4'>GMT (Greenwich Mean Time)</option>
91
- </SelectNative>
92
- <p className='text-destructive mt-2 text-xs' role='alert' aria-live='polite'>
93
- Selected option is invalid
94
- </p>
95
- </div>
96
- )
97
- }
98
-
99
- const NativeSelectRequiredDemo = () => {
100
- const id = useId()
101
-
102
- return (
103
- <div className='w-full max-w-xs space-y-2'>
104
- <Label htmlFor={id} className='gap-1'>
105
- Required native select <span className='text-destructive'>*</span>
106
- </Label>
107
- <SelectNative id={id} required>
108
- <option value='1'>Action</option>
109
- <option value='2'>Comedy</option>
110
- <option value='3'>Romance</option>
111
- <option value='4'>Thriller</option>
112
- </SelectNative>
113
- </div>
114
- )
115
- }
116
-
117
- const NativeSelectWithOptionGroupsDemo = () => {
118
- const id = useId()
119
-
120
- return (
121
- <div className='w-full max-w-xs space-y-2'>
122
- <Label htmlFor={id}>Native select with option groups</Label>
123
- <SelectNative id={id}>
124
- <optgroup label='Frontend Technologies'>
125
- <option value='1'>HTML</option>
126
- <option value='2'>CSS</option>
127
- <option value='3'>JavaScript</option>
128
- </optgroup>
129
- <optgroup label='Backend Technologies'>
130
- <option value='4'>Node.js</option>
131
- <option value='5'>Python</option>
132
- <option value='6'>Java</option>
133
- </optgroup>
134
- </SelectNative>
135
- </div>
136
- )
137
- }
138
-
139
- const NativeSelectWithOverlappingLabelDemo = () => {
140
- const id = useId()
141
-
142
- return (
143
- <div className='group relative w-full max-w-xs'>
144
- <label
145
- htmlFor={id}
146
- className='bg-background text-foreground absolute top-0 left-2 z-10 block -translate-y-1/2 px-1 text-xs font-medium group-has-[select:disabled]:opacity-50'
147
- >
148
- Native select with overlapping label
149
- </label>
150
- <SelectNative id={id}>
151
- <option value='1'>Developer</option>
152
- <option value='2'>Designer</option>
153
- <option value='3'>Manager</option>
154
- <option value='4'>QA Engineer</option>
155
- </SelectNative>
156
- </div>
157
- )
158
- }
159
-
160
- const NativeSelectWithInsetLabelDemo = () => {
161
- const id = useId()
162
-
163
- return (
164
- <div className='border-input bg-background focus-within:border-ring focus-within:ring-ring/50 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40 has-aria-invalid:border-destructive relative w-full max-w-xs rounded-md border shadow-xs transition-[color,box-shadow] outline-none focus-within:ring-[3px] has-[select:disabled]:cursor-not-allowed has-[select:disabled]:opacity-50 has-[select:is(:disabled)_*]:pointer-events-none'>
165
- <label htmlFor={id} className='text-foreground block px-3 pt-1 text-xs font-medium'>
166
- Native select with inset label
167
- </label>
168
- <SelectNative
169
- id={id}
170
- defaultValue=''
171
- className='border-none bg-transparent shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'
172
- >
173
- <option value='' disabled>
174
- Pick your favorite movie
175
- </option>
176
- <option value='1'>Interstellar</option>
177
- <option value='2'>Dune</option>
178
- <option value='3'>The Matrix</option>
179
- <option value='4'>Catch Me If You Can</option>
180
- </SelectNative>
181
- </div>
182
- )
183
- }
184
-
185
- const SelectDemo = () => {
186
- const id = useId()
187
-
188
- return (
189
- <div className='w-full max-w-xs space-y-2'>
190
- <Label htmlFor={id}>Default select</Label>
191
- <Select defaultValue='apple'>
192
- <SelectTrigger id={id} className='w-full'>
193
- <SelectValue placeholder='Select a fruit' />
194
- </SelectTrigger>
195
- <SelectContent>
196
- <SelectGroup>
197
- <SelectLabel>Fruits</SelectLabel>
198
- <SelectItem value='apple'>Apple</SelectItem>
199
- <SelectItem value='banana'>Banana</SelectItem>
200
- <SelectItem value='blueberry'>Blueberry</SelectItem>
201
- <SelectItem value='grapes'>Grapes</SelectItem>
202
- <SelectItem value='pineapple'>Pineapple</SelectItem>
203
- </SelectGroup>
204
- </SelectContent>
205
- </Select>
206
- </div>
207
- )
208
- }
209
-
210
- const SelectPlaceholderDemo = () => {
211
- const id = useId()
212
-
213
- return (
214
- <div className='w-full max-w-xs space-y-2'>
215
- <Label htmlFor={id}>Select with placeholder</Label>
216
- <Select>
217
- <SelectTrigger id={id} className='w-full'>
218
- <SelectValue placeholder='Select a fruit' />
219
- </SelectTrigger>
220
- <SelectContent>
221
- <SelectGroup>
222
- <SelectLabel>Fruits</SelectLabel>
223
- <SelectItem value='apple'>Apple</SelectItem>
224
- <SelectItem value='banana'>Banana</SelectItem>
225
- <SelectItem value='blueberry'>Blueberry</SelectItem>
226
- <SelectItem value='grapes'>Grapes</SelectItem>
227
- <SelectItem value='pineapple'>Pineapple</SelectItem>
228
- </SelectGroup>
229
- </SelectContent>
230
- </Select>
231
- </div>
232
- )
233
- }
234
-
235
- const SelectWithIconDemo = () => {
236
- const id = useId()
237
-
238
- return (
239
- <div className='w-full max-w-xs space-y-2'>
240
- <Label htmlFor={id}>Select with icon</Label>
241
- <Select defaultValue='god of wars'>
242
- <SelectTrigger id={id} className='relative w-full pl-9'>
243
- <div className='text-muted-foreground/80 pointer-events-none absolute inset-y-0 left-0 flex items-center justify-center pl-3 group-has-[select[disabled]]:opacity-50'>
244
- <FilmIcon size={16} aria-hidden='true' />
245
- </div>
246
- <SelectValue placeholder='Select time' />
247
- </SelectTrigger>
248
- <SelectContent>
249
- <SelectItem value='god of wars'>God of Wars</SelectItem>
250
- <SelectItem value='ghost rider'>Ghost Rider</SelectItem>
251
- <SelectItem value='the cloth'>The Cloth</SelectItem>
252
- <SelectItem value='the possession'>The Possession</SelectItem>
253
- </SelectContent>
254
- </Select>
255
- </div>
256
- )
257
- }
258
-
259
- const SelectWithHelperTextDemo = () => {
260
- const id = useId()
261
-
262
- return (
263
- <div className='w-full max-w-xs space-y-2'>
264
- <Label htmlFor={id}>Select with helper text</Label>
265
- <Select defaultValue='3'>
266
- <SelectTrigger id={id} className='w-full'>
267
- <SelectValue placeholder='Select framework' />
268
- </SelectTrigger>
269
- <SelectContent>
270
- <SelectItem value='1'>Florida</SelectItem>
271
- <SelectItem value='2'>New York</SelectItem>
272
- <SelectItem value='3'>California</SelectItem>
273
- <SelectItem value='4'>Texas</SelectItem>
274
- </SelectContent>
275
- </Select>
276
- <p className='text-muted-foreground mt-2 text-xs' role='region' aria-live='polite'>
277
- Could you share which city you&apos;re based in?
278
- </p>
279
- </div>
280
- )
281
- }
282
-
283
- const SelectInvalidState = () => {
284
- const id = useId()
285
-
286
- return (
287
- <div className='w-full max-w-xs space-y-2'>
288
- <Label htmlFor={id}>Select with error</Label>
289
- <Select defaultValue='1'>
290
- <SelectTrigger id={id} aria-invalid className='w-full'>
291
- <SelectValue />
292
- </SelectTrigger>
293
- <SelectContent>
294
- <SelectItem value='1'>Tesla</SelectItem>
295
- <SelectItem value='2'>BMW</SelectItem>
296
- <SelectItem value='3'>Audi</SelectItem>
297
- <SelectItem value='4'>Mercedes-Benz</SelectItem>
298
- </SelectContent>
299
- </Select>
300
- <p className='text-destructive mt-2 text-xs' role='alert' aria-live='polite'>
301
- Selected option is invalid
302
- </p>
303
- </div>
304
- )
305
- }
306
-
307
- const SelectSizesDemo = () => {
308
- return (
309
- <div className='w-full max-w-xs space-y-2'>
310
- <Select>
311
- <SelectTrigger size='sm' className='w-full'>
312
- <SelectValue placeholder='Small select' />
313
- </SelectTrigger>
314
- <SelectContent>
315
- <SelectGroup>
316
- <SelectLabel>Fruits</SelectLabel>
317
- <SelectItem value='apple'>Apple</SelectItem>
318
- <SelectItem value='banana'>Banana</SelectItem>
319
- <SelectItem value='blueberry'>Blueberry</SelectItem>
320
- <SelectItem value='grapes'>Grapes</SelectItem>
321
- <SelectItem value='pineapple'>Pineapple</SelectItem>
322
- </SelectGroup>
323
- </SelectContent>
324
- </Select>
325
- <Select>
326
- <SelectTrigger className='w-full'>
327
- <SelectValue placeholder='Default select' />
328
- </SelectTrigger>
329
- <SelectContent>
330
- <SelectGroup>
331
- <SelectLabel>Fruits</SelectLabel>
332
- <SelectItem value='apple'>Apple</SelectItem>
333
- <SelectItem value='banana'>Banana</SelectItem>
334
- <SelectItem value='blueberry'>Blueberry</SelectItem>
335
- <SelectItem value='grapes'>Grapes</SelectItem>
336
- <SelectItem value='pineapple'>Pineapple</SelectItem>
337
- </SelectGroup>
338
- </SelectContent>
339
- </Select>
340
- <Select>
341
- <SelectTrigger className='!h-10 w-full'>
342
- <SelectValue placeholder='Large select' />
343
- </SelectTrigger>
344
- <SelectContent>
345
- <SelectGroup>
346
- <SelectLabel>Fruits</SelectLabel>
347
- <SelectItem value='apple'>Apple</SelectItem>
348
- <SelectItem value='banana'>Banana</SelectItem>
349
- <SelectItem value='blueberry'>Blueberry</SelectItem>
350
- <SelectItem value='grapes'>Grapes</SelectItem>
351
- <SelectItem value='pineapple'>Pineapple</SelectItem>
352
- </SelectGroup>
353
- </SelectContent>
354
- </Select>
355
- </div>
356
- )
357
- }
358
-
359
- const SelectWithColorBorderAndRingDemo = () => {
360
- const id = useId()
361
-
362
- return (
363
- <div className='w-full max-w-xs space-y-2'>
364
- <Label htmlFor={id}>Select with colored border and ring</Label>
365
- <Select defaultValue='1'>
366
- <SelectTrigger
367
- id={id}
368
- className='w-full focus-visible:border-indigo-500 focus-visible:ring-indigo-500/20 dark:focus-visible:ring-indigo-500/40'
369
- >
370
- <SelectValue placeholder='Select framework' />
371
- </SelectTrigger>
372
- <SelectContent>
373
- <SelectItem value='1'>Electronics</SelectItem>
374
- <SelectItem value='2'>Clothing</SelectItem>
375
- <SelectItem value='3'>Home Appliances</SelectItem>
376
- <SelectItem value='4'>Books</SelectItem>
377
- </SelectContent>
378
- </Select>
379
- </div>
380
- )
381
- }
382
-
383
- const SelectBackgroundColorDemo = () => {
384
- const id = useId()
385
-
386
- return (
387
- <div className='w-full max-w-xs space-y-2'>
388
- <Label htmlFor={id}>Select with background color</Label>
389
- <Select defaultValue='hindi'>
390
- <SelectTrigger className='w-full border-sky-600 bg-sky-600/10 text-sky-600 shadow-none focus-visible:border-sky-600 focus-visible:ring-sky-600/20 dark:bg-sky-400/10 dark:text-sky-400 dark:hover:bg-sky-400/10 dark:focus-visible:ring-sky-400/40 [&_svg]:!text-sky-600 dark:[&_svg]:!text-sky-400'>
391
- <SelectValue placeholder='Select a fruit' />
392
- </SelectTrigger>
393
- <SelectContent>
394
- <SelectGroup className='[&_div:focus]:bg-sky-600/20 [&_div:focus]:text-sky-600 dark:[&_div:focus]:bg-sky-400/20 dark:[&_div:focus]:text-sky-400'>
395
- <SelectLabel>Languages</SelectLabel>
396
- <SelectItem value='hindi' className='focus:[&_svg]:!text-sky-600 dark:focus:[&_svg]:!text-sky-400'>
397
- Hindi
398
- </SelectItem>
399
- <SelectItem value='english' className='focus:[&_svg]:!text-sky-600 dark:focus:[&_svg]:!text-sky-400'>
400
- English
401
- </SelectItem>
402
- <SelectItem value='spanish' className='focus:[&_svg]:!text-sky-600 dark:focus:[&_svg]:!text-sky-400'>
403
- Spanish
404
- </SelectItem>
405
- <SelectItem value='mandarin' className='focus:[&_svg]:!text-sky-600 dark:focus:[&_svg]:!text-sky-400'>
406
- Mandarin
407
- </SelectItem>
408
- <SelectItem value='french' className='focus:[&_svg]:!text-sky-600 dark:focus:[&_svg]:!text-sky-400'>
409
- French
410
- </SelectItem>
411
- </SelectGroup>
412
- </SelectContent>
413
- </Select>
414
- </div>
415
- )
416
- }
417
-
418
- const SelectGhostDemo = () => {
419
- const id = useId()
420
-
421
- return (
422
- <div className='w-full max-w-xs space-y-2'>
423
- <Label htmlFor={id}>Ghost Select</Label>
424
- <Select defaultValue='apple'>
425
- <SelectTrigger className='hover:bg-accent w-full border-none shadow-none dark:bg-transparent'>
426
- <SelectValue placeholder='Select a fruit' />
427
- </SelectTrigger>
428
- <SelectContent>
429
- <SelectGroup>
430
- <SelectLabel>Fruits</SelectLabel>
431
- <SelectItem value='apple'>Apple</SelectItem>
432
- <SelectItem value='banana'>Banana</SelectItem>
433
- <SelectItem value='blueberry'>Blueberry</SelectItem>
434
- <SelectItem value='grapes'>Grapes</SelectItem>
435
- <SelectItem value='pineapple'>Pineapple</SelectItem>
436
- </SelectGroup>
437
- </SelectContent>
438
- </Select>
439
- </div>
440
- )
441
- }
442
-
443
- const SelectDisabledDemo = () => {
444
- const id = useId()
445
-
446
- return (
447
- <div className='w-full max-w-xs space-y-2'>
448
- <Label htmlFor={id}>Disabled select</Label>
449
- <Select defaultValue='apple' disabled>
450
- <SelectTrigger id={id} className='w-full'>
451
- <SelectValue placeholder='Select a fruit' />
452
- </SelectTrigger>
453
- <SelectContent>
454
- <SelectGroup>
455
- <SelectLabel>Fruits</SelectLabel>
456
- <SelectItem value='apple'>Apple</SelectItem>
457
- <SelectItem value='banana'>Banana</SelectItem>
458
- <SelectItem value='blueberry'>Blueberry</SelectItem>
459
- <SelectItem value='grapes'>Grapes</SelectItem>
460
- <SelectItem value='pineapple'>Pineapple</SelectItem>
461
- </SelectGroup>
462
- </SelectContent>
463
- </Select>
464
- </div>
465
- )
466
- }
467
-
468
- const SelectDisabledOptionDemo = () => {
469
- const id = useId()
470
-
471
- return (
472
- <div className='w-full max-w-xs space-y-2'>
473
- <Label htmlFor={id}>Disabled options select</Label>
474
- <Select defaultValue='apple'>
475
- <SelectTrigger id={id} className='w-full'>
476
- <SelectValue placeholder='Select a fruit' />
477
- </SelectTrigger>
478
- <SelectContent>
479
- <SelectGroup>
480
- <SelectLabel>Fruits</SelectLabel>
481
- <SelectItem value='apple'>Apple</SelectItem>
482
- <SelectItem value='banana' disabled>
483
- Banana
484
- </SelectItem>
485
- <SelectItem value='blueberry'>Blueberry</SelectItem>
486
- <SelectItem value='grapes' disabled>
487
- Grapes
488
- </SelectItem>
489
- <SelectItem value='pineapple'>Pineapple</SelectItem>
490
- </SelectGroup>
491
- </SelectContent>
492
- </Select>
493
- </div>
494
- )
495
- }
496
-
497
- const SelectRequiredDemo = () => {
498
- const id = useId()
499
-
500
- return (
501
- <div className='w-full max-w-xs space-y-2'>
502
- <Label htmlFor={id} className='gap-1'>
503
- Required select <span className='text-destructive'>*</span>
504
- </Label>
505
- <Select defaultValue='2' required>
506
- <SelectTrigger id={id} className='w-full'>
507
- <SelectValue placeholder='Select framework' />
508
- </SelectTrigger>
509
- <SelectContent>
510
- <SelectItem value='1'>United States</SelectItem>
511
- <SelectItem value='2'>Japan</SelectItem>
512
- <SelectItem value='3'>Australia</SelectItem>
513
- <SelectItem value='4'>Brazil</SelectItem>
514
- </SelectContent>
515
- </Select>
516
- </div>
517
- )
518
- }
519
-
520
- const SelectWithOptionsGroupsDemo = () => {
521
- const id = useId()
522
-
523
- return (
524
- <div className='w-full max-w-xs space-y-2'>
525
- <Label htmlFor={id}>Select with options groups</Label>
526
- <Select defaultValue='7'>
527
- <SelectTrigger id={id} className='w-full'>
528
- <SelectValue placeholder='Select framework' />
529
- </SelectTrigger>
530
- <SelectContent>
531
- <SelectGroup>
532
- <SelectLabel>North America</SelectLabel>
533
- <SelectItem value='1'>United States</SelectItem>
534
- <SelectItem value='2'>Canada</SelectItem>
535
- <SelectItem value='3'>Mexico</SelectItem>
536
- </SelectGroup>
537
- <SelectGroup>
538
- <SelectLabel>Europe</SelectLabel>
539
- <SelectItem value='4'>United Kingdom</SelectItem>
540
- <SelectItem value='5'>Germany</SelectItem>
541
- <SelectItem value='6'>France</SelectItem>
542
- </SelectGroup>
543
- <SelectGroup>
544
- <SelectLabel>Asia</SelectLabel>
545
- <SelectItem value='7'>India</SelectItem>
546
- <SelectItem value='8'>Japan</SelectItem>
547
- <SelectItem value='9'>China</SelectItem>
548
- </SelectGroup>
549
- </SelectContent>
550
- </Select>
551
- </div>
552
- )
553
- }
554
-
555
- const SelectWithSeparatorDemo = () => {
556
- const id = useId()
557
-
558
- return (
559
- <div className='w-full max-w-xs space-y-2'>
560
- <Label htmlFor={id}>Select with separator</Label>
561
- <Select defaultValue='7'>
562
- <SelectTrigger id={id} className='w-full'>
563
- <SelectValue placeholder='Select framework' />
564
- </SelectTrigger>
565
- <SelectContent>
566
- <SelectGroup>
567
- <SelectLabel>North America</SelectLabel>
568
- <SelectItem value='1'>United States</SelectItem>
569
- <SelectItem value='2'>Canada</SelectItem>
570
- <SelectItem value='3'>Mexico</SelectItem>
571
- </SelectGroup>
572
- <SelectSeparator />
573
- <SelectGroup>
574
- <SelectLabel>Europe</SelectLabel>
575
- <SelectItem value='4'>United Kingdom</SelectItem>
576
- <SelectItem value='5'>Germany</SelectItem>
577
- <SelectItem value='6'>France</SelectItem>
578
- </SelectGroup>
579
- <SelectSeparator />
580
- <SelectGroup>
581
- <SelectLabel>Asia</SelectLabel>
582
- <SelectItem value='7'>India</SelectItem>
583
- <SelectItem value='8'>Japan</SelectItem>
584
- <SelectItem value='9'>China</SelectItem>
585
- </SelectGroup>
586
- </SelectContent>
587
- </Select>
588
- </div>
589
- )
590
- }
591
-
592
- const SelectWithOverlappingLabelDemo = () => {
593
- const id = useId()
594
-
595
- return (
596
- <div className='group relative w-full max-w-xs'>
597
- <label
598
- htmlFor={id}
599
- className='bg-background text-foreground absolute top-0 left-2 z-10 block -translate-y-1/2 px-1 text-xs font-medium group-has-disabled:opacity-50'
600
- >
601
- Select with overlapping label
602
- </label>
603
- <Select>
604
- <SelectTrigger id={id} className='dark:!bg-background w-full'>
605
- <SelectValue placeholder='Select city' />
606
- </SelectTrigger>
607
- <SelectContent>
608
- <SelectItem value='1'>New York</SelectItem>
609
- <SelectItem value='2'>London</SelectItem>
610
- <SelectItem value='3'>Tokyo</SelectItem>
611
- <SelectItem value='4'>Paris</SelectItem>
612
- </SelectContent>
613
- </Select>
614
- </div>
615
- )
616
- }
617
-
618
- const SelectWithInsetLabelDemo = () => {
619
- const id = useId()
620
-
621
- return (
622
- <div className='border-input group bg-background focus-within:border-ring focus-within:ring-ring/50 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40 has-aria-invalid:border-destructive relative w-full max-w-xs rounded-md border shadow-xs transition-[color,box-shadow] outline-none focus-within:ring-[3px] has-disabled:pointer-events-none has-disabled:cursor-not-allowed has-disabled:opacity-50 has-[input:is(:disabled)]:*:pointer-events-none'>
623
- <label
624
- htmlFor={id}
625
- className='text-foreground dark:bg-input/30 dark:group-hover:bg-input/50 block px-3 pt-1 text-xs font-medium'
626
- >
627
- Select with inset label
628
- </label>
629
- <Select>
630
- <SelectTrigger
631
- id={id}
632
- className='dark:group-hover:bg-input/50 w-full rounded-t-none border-none bg-transparent shadow-none focus-visible:ring-0 focus-visible:ring-offset-0'
633
- >
634
- <SelectValue placeholder='Select payment method' />
635
- </SelectTrigger>
636
- <SelectContent>
637
- <SelectItem value='1'>Credit Card</SelectItem>
638
- <SelectItem value='2'>Google Pay</SelectItem>
639
- <SelectItem value='3'>PayPal</SelectItem>
640
- <SelectItem value='4'>Bitcoin</SelectItem>
641
- </SelectContent>
642
- </Select>
643
- </div>
644
- )
645
- }
646
-
647
- const SelectTimeZoneDemo = () => {
648
- const id = useId()
649
-
650
- return (
651
- <div className='w-full max-w-xs space-y-2'>
652
- <Label htmlFor={id}>Timezone Select</Label>
653
- <Select>
654
- <SelectTrigger id={id} className='w-full'>
655
- <SelectValue placeholder='Select a timezone' />
656
- </SelectTrigger>
657
- <SelectContent className='max-h-100'>
658
- <SelectGroup>
659
- <SelectLabel>North America</SelectLabel>
660
- <SelectItem value='est'>Eastern Standard Time (EST)</SelectItem>
661
- <SelectItem value='cst'>Central Standard Time (CST)</SelectItem>
662
- <SelectItem value='mst'>Mountain Standard Time (MST)</SelectItem>
663
- <SelectItem value='pst'>Pacific Standard Time (PST)</SelectItem>
664
- <SelectItem value='akst'>Alaska Standard Time (AKST)</SelectItem>
665
- <SelectItem value='hst'>Hawaii Standard Time (HST)</SelectItem>
666
- </SelectGroup>
667
- <SelectGroup>
668
- <SelectLabel>Europe & Africa</SelectLabel>
669
- <SelectItem value='gmt'>Greenwich Mean Time (GMT)</SelectItem>
670
- <SelectItem value='cet'>Central European Time (CET)</SelectItem>
671
- <SelectItem value='eet'>Eastern European Time (EET)</SelectItem>
672
- <SelectItem value='west'>Western European Summer Time (WEST)</SelectItem>
673
- <SelectItem value='cat'>Central Africa Time (CAT)</SelectItem>
674
- <SelectItem value='eat'>East Africa Time (EAT)</SelectItem>
675
- </SelectGroup>
676
- <SelectGroup>
677
- <SelectLabel>Asia</SelectLabel>
678
- <SelectItem value='msk'>Moscow Time (MSK)</SelectItem>
679
- <SelectItem value='ist'>India Standard Time (IST)</SelectItem>
680
- <SelectItem value='cst_china'>China Standard Time (CST)</SelectItem>
681
- <SelectItem value='jst'>Japan Standard Time (JST)</SelectItem>
682
- <SelectItem value='kst'>Korea Standard Time (KST)</SelectItem>
683
- <SelectItem value='ist_indonesia'>Indonesia Central Standard Time (WITA)</SelectItem>
684
- </SelectGroup>
685
- <SelectGroup>
686
- <SelectLabel>Australia & Pacific</SelectLabel>
687
- <SelectItem value='awst'>Australian Western Standard Time (AWST)</SelectItem>
688
- <SelectItem value='acst'>Australian Central Standard Time (ACST)</SelectItem>
689
- <SelectItem value='aest'>Australian Eastern Standard Time (AEST)</SelectItem>
690
- <SelectItem value='nzst'>New Zealand Standard Time (NZST)</SelectItem>
691
- <SelectItem value='fjt'>Fiji Time (FJT)</SelectItem>
692
- </SelectGroup>
693
- <SelectGroup>
694
- <SelectLabel>South America</SelectLabel>
695
- <SelectItem value='art'>Argentina Time (ART)</SelectItem>
696
- <SelectItem value='bot'>Bolivia Time (BOT)</SelectItem>
697
- <SelectItem value='brt'>Brasilia Time (BRT)</SelectItem>
698
- <SelectItem value='clt'>Chile Standard Time (CLT)</SelectItem>
699
- </SelectGroup>
700
- </SelectContent>
701
- </Select>
702
- </div>
703
- )
704
- }
705
-
706
- const SelectDemo = () => {
707
- const id = useId()
708
-
709
- return (
710
- <div className='w-full max-w-xs space-y-2'>
711
- <Label htmlFor={id}>Select option with icon</Label>
712
- <Select defaultValue='rock'>
713
- <SelectTrigger id={id} className='w-full'>
714
- <SelectValue placeholder='Select a music genre' />
715
- </SelectTrigger>
716
- <SelectContent>
717
- <SelectGroup>
718
- <SelectLabel>Music Genres</SelectLabel>
719
- <SelectItem value='rock'>
720
- <GuitarIcon />
721
- Rock
722
- </SelectItem>
723
- <SelectItem value='electronic'>
724
- <HeadphonesIcon />
725
- Electronic
726
- </SelectItem>
727
- <SelectItem value='pop'>
728
- <MicVocalIcon />
729
- Pop
730
- </SelectItem>
731
- <SelectItem value='jazz'>
732
- <MusicIcon />
733
- Jazz
734
- </SelectItem>
735
- </SelectGroup>
736
- </SelectContent>
737
- </Select>
738
- </div>
739
- )
740
- }
741
-
742
- const SelectWithLeadingTextDemo = () => {
743
- const id = useId()
744
-
745
- return (
746
- <div className='w-full max-w-xs space-y-2'>
747
- <Label htmlFor={id}>Select with leading text</Label>
748
- <Select defaultValue='1'>
749
- <SelectTrigger id={id} className='w-full'>
750
- <span>
751
- Favorite Movie: <SelectValue placeholder='Select a movie' />
752
- </span>
753
- </SelectTrigger>
754
- <SelectContent>
755
- <SelectItem value='1'>Inception</SelectItem>
756
- <SelectItem value='2'>Interstellar</SelectItem>
757
- <SelectItem value='3'>The Dark Knight</SelectItem>
758
- <SelectItem value='4'>Pulp Fiction</SelectItem>
759
- </SelectContent>
760
- </Select>
761
- </div>
762
- )
763
- }
764
-
765
- const SelectStatusDemo = () => {
766
- const id = useId()
767
-
768
- return (
769
- <div className='w-full max-w-xs space-y-2'>
770
- <Label htmlFor={id}>Status select</Label>
771
- <Select defaultValue='1'>
772
- <SelectTrigger
773
- id={id}
774
- className='w-full [&>span]:flex [&>span]:items-center [&>span]:gap-2 [&>span_svg]:shrink-0'
775
- >
776
- <SelectValue placeholder='Select status' />
777
- </SelectTrigger>
778
- <SelectContent className='[&_*[role=option]>span>svg]:text-muted-foreground/80 [&_*[role=option]]:pr-8 [&_*[role=option]]:pl-2 [&_*[role=option]>span]:right-2 [&_*[role=option]>span]:left-auto [&_*[role=option]>span]:flex [&_*[role=option]>span]:items-center [&_*[role=option]>span]:gap-2 [&_*[role=option]>span>svg]:shrink-0'>
779
- <SelectItem value='1'>
780
- <span className='flex items-center gap-2'>
781
- <CircleIcon className='size-2 fill-violet-500 text-violet-500' />
782
- <span className='truncate'>In Progress</span>
783
- </span>
784
- </SelectItem>
785
- <SelectItem value='2'>
786
- <span className='flex items-center gap-2'>
787
- <CircleIcon className='size-2 fill-amber-500 text-amber-500' />
788
- <span className='truncate'>Pending</span>
789
- </span>
790
- </SelectItem>
791
- <SelectItem value='3'>
792
- <span className='flex items-center gap-2'>
793
- <CircleIcon className='size-2 fill-emerald-600 text-emerald-600' />
794
- <span className='truncate'>Completed</span>
795
- </span>
796
- </SelectItem>
797
- <SelectItem value='4'>
798
- <span className='flex items-center gap-2'>
799
- <CircleIcon className='size-2 fill-gray-500 text-gray-500' />
800
- <span className='truncate'>Cancelled</span>
801
- </span>
802
- </SelectItem>
803
- <SelectItem value='5'>
804
- <span className='flex items-center gap-2'>
805
- <CircleIcon className='size-2 fill-red-500 text-red-500' />
806
- <span className='truncate'>Rejected</span>
807
- </span>
808
- </SelectItem>
809
- </SelectContent>
810
- </Select>
811
- </div>
812
- )
813
- }
814
-
815
- const SelectWithFlagsDemo = () => {
816
- const id = useId()
817
-
818
- return (
819
- <div className='w-full max-w-xs space-y-2'>
820
- <Label htmlFor={id}>Options with flag</Label>
821
- <Select defaultValue='1'>
822
- <SelectTrigger
823
- id={id}
824
- className='[&>span_svg]:text-muted-foreground/80 w-full [&>span]:flex [&>span]:items-center [&>span]:gap-2 [&>span_svg]:shrink-0'
825
- >
826
- <SelectValue placeholder='Select framework' />
827
- </SelectTrigger>
828
- <SelectContent className='[&_*[role=option]>span>svg]:text-muted-foreground/80 max-h-100 [&_*[role=option]]:pr-8 [&_*[role=option]]:pl-2 [&_*[role=option]>span]:right-2 [&_*[role=option]>span]:left-auto [&_*[role=option]>span]:flex [&_*[role=option]>span]:items-center [&_*[role=option]>span]:gap-2 [&_*[role=option]>span>svg]:shrink-0'>
829
- {countries.map(country => (
830
- <SelectItem key={country.value} value={country.value}>
831
- <img src={country.flag} alt={`${country.label} flag`} className='h-4 w-5' />{' '}
832
- <span className='truncate'>{country.label}</span>
833
- </SelectItem>
834
- ))}
835
- </SelectContent>
836
- </Select>
837
- </div>
838
- )
839
- }
840
-
841
- const SelectWithAvatarsDemo = () => {
842
- const id = useId()
843
-
844
- return (
845
- <div className='w-full max-w-xs space-y-2'>
846
- <Label htmlFor={id}>Options with avatar</Label>
847
- <Select defaultValue='1'>
848
- <SelectTrigger
849
- id={id}
850
- className='w-full pl-2 [&>span]:flex [&>span]:items-center [&>span]:gap-2 [&>span_img]:shrink-0'
851
- >
852
- <SelectValue placeholder='Select framework' />
853
- </SelectTrigger>
854
- <SelectContent className='[&_*[role=option]]:pr-8 [&_*[role=option]]:pl-2 [&_*[role=option]>span]:right-2 [&_*[role=option]>span]:left-auto [&_*[role=option]>span]:flex [&_*[role=option]>span]:items-center [&_*[role=option]>span]:gap-2'>
855
- <SelectGroup>
856
- <SelectLabel className='pl-2'>Impersonate user</SelectLabel>
857
- {users.map(item => (
858
- <SelectItem key={item.id} value={item.id}>
859
- <Avatar className='size-5'>
860
- <AvatarImage src={item.src} alt={item.name} className='rounded-full' />
861
- <AvatarFallback className='text-xs'>{item.fallback}</AvatarFallback>
862
- </Avatar>
863
- <span className='truncate'>{item.name}</span>
864
- </SelectItem>
865
- ))}
866
- </SelectGroup>
867
- </SelectContent>
868
- </Select>
869
- </div>
870
- )
871
- }
872
-
873
- const MultipleSelectDemo = () => {
874
- return (
875
- <div className='w-full max-w-xs space-y-2'>
876
- <Label>Multiselect</Label>
877
- <MultipleSelector
878
- commandProps={{
879
- label: 'Select categories'
880
- }}
881
- value={categories.slice(0, 2)}
882
- defaultOptions={categories}
883
- placeholder='Select categories'
884
- hideClearAllButton
885
- hidePlaceholderWhenSelected
886
- emptyIndicator={<p className='text-center text-sm'>No results found</p>}
887
- className='w-full'
888
- />
889
- <p className='text-muted-foreground text-xs' role='region' aria-live='polite'>
890
- Inspired by{' '}
891
- <a
892
- href='https://shadcnui-expansions.typeart.cc/docs/multiple-selector'
893
- className='hover:text-primary underline'
894
- target='_blank'
895
- >
896
- shadcn/ui expressions
897
- </a>
898
- </p>
899
- </div>
900
- )
901
- }
902
-
903
- const MultipleSelectWithPlaceholderDemo = () => {
904
- return (
905
- <div className='w-full max-w-xs space-y-2'>
906
- <Label>Multiselect with placeholder and clear</Label>
907
- <MultipleSelector
908
- commandProps={{
909
- label: 'Select categories'
910
- }}
911
- defaultOptions={categories}
912
- placeholder='Select categories'
913
- emptyIndicator={<p className='text-center text-sm'>No results found</p>}
914
- className='w-full'
915
- />
916
- <p className='text-muted-foreground text-xs' role='region' aria-live='polite'>
917
- Inspired by{' '}
918
- <a
919
- href='https://shadcnui-expansions.typeart.cc/docs/multiple-selector'
920
- className='hover:text-primary underline'
921
- target='_blank'
922
- >
923
- shadcn/ui expressions
924
- </a>
925
- </p>
926
- </div>
927
- )
928
- }
929
-
930
- const SelectNativeMultipleDemo = () => {
931
- const id = useId()
932
-
933
- return (
934
- <div className='w-full max-w-xs space-y-2'>
935
- <Label htmlFor={id}>Native multiple select</Label>
936
- <div className='border-input overflow-hidden rounded-md border'>
937
- <SelectNative id={id} multiple className='rounded-none border-none'>
938
- <option value='1'>Vegetarian</option>
939
- <option value='2'>Vegan</option>
940
- <option value='3'>Gluten-Free</option>
941
- <option value='4'>Halal</option>
942
- <option value='5'>Kosher</option>
943
- <option value='6'>Dairy-Free</option>
944
- </SelectNative>
945
- </div>
946
- </div>
947
- )
948
- }
949
-
950
- const ListboxSingleOptionDemo = () => {
951
- return (
952
- <div className='w-full max-w-xs space-y-2'>
953
- <Label>Listbox with single option selectable</Label>
954
- <div className='border-input overflow-hidden rounded-md border'>
955
- <ListBox
956
- className='bg-background space-y-1 p-1 text-sm shadow-xs transition-[color,box-shadow]'
957
- aria-label='Select framework'
958
- selectionMode='single'
959
- defaultSelectedKeys={['svelte']}
960
- >
961
- {listitems.map(item => (
962
- <ListBoxItem
963
- key={item.id}
964
- className='data-[disabled]:text-muted-foreground data-[selected]:bg-accent data-[selected]:text-accent-foreground flex items-center justify-between rounded-sm px-2 py-1.5'
965
- textValue={item.label}
966
- isDisabled={item.isDisabled}
967
- >
968
- {item.label}
969
- </ListBoxItem>
970
- ))}
971
- </ListBox>
972
- </div>
973
- <p className='text-muted-foreground text-xs' role='region' aria-live='polite'>
974
- Built using{' '}
975
- <a
976
- href='https://react-spectrum.adobe.com/react-aria/ListBox.html'
977
- className='hover:text-primary underline'
978
- target='_blank'
979
- >
980
- React Aria
981
- </a>
982
- </p>
983
- </div>
984
- )
985
- }
986
-
987
- const ListBoxWithOptionGroupsDemo = () => {
988
- return (
989
- <div className='w-full max-w-xs space-y-2'>
990
- <Label>Listbox with option groups</Label>
991
- <div className='border-input overflow-hidden rounded-md border'>
992
- <ListBox
993
- className='bg-background max-h-65 min-h-20 space-y-2 overflow-auto p-1 text-sm shadow-xs transition-[color,box-shadow]'
994
- aria-label='Select some foods'
995
- selectionMode='multiple'
996
- defaultSelectedKeys={['english', 'tuna']}
997
- >
998
- <ListBoxSection className='space-y-1'>
999
- <Header className='text-muted-foreground px-2 py-1.5 text-xs font-medium'>European Languages</Header>
1000
- <ListBoxItem
1001
- id='english'
1002
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1003
- >
1004
- English
1005
- </ListBoxItem>
1006
- <ListBoxItem
1007
- id='french'
1008
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1009
- >
1010
- French
1011
- </ListBoxItem>
1012
- <ListBoxItem
1013
- id='spanish'
1014
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1015
- >
1016
- Spanish
1017
- </ListBoxItem>
1018
- </ListBoxSection>
1019
- <Separator className='bg-border -mx-1 my-2 h-px' />
1020
- <ListBoxSection className='space-y-1'>
1021
- <Header className='text-muted-foreground px-2 py-1.5 text-xs font-medium'>Asian Languages</Header>
1022
- <ListBoxItem
1023
- id='hindi'
1024
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1025
- >
1026
- Hindi
1027
- </ListBoxItem>
1028
- <ListBoxItem
1029
- id='japanese'
1030
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1031
- >
1032
- Japanese
1033
- </ListBoxItem>
1034
- <ListBoxItem
1035
- id='mandarin'
1036
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1037
- >
1038
- Mandarin
1039
- </ListBoxItem>
1040
- </ListBoxSection>
1041
- <Separator className='bg-border -mx-1 my-2 h-px' />
1042
- <ListBoxSection className='space-y-1'>
1043
- <Header className='text-muted-foreground px-2 py-1.5 text-xs font-medium'>Other Languages</Header>
1044
- <ListBoxItem
1045
- id='swahili'
1046
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1047
- >
1048
- Swahili
1049
- </ListBoxItem>
1050
- <ListBoxItem
1051
- id='arabic'
1052
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1053
- >
1054
- Arabic
1055
- </ListBoxItem>
1056
- <ListBoxItem
1057
- id='russian'
1058
- className='data-[selected=true]:bg-accent data-[selected=true]:text-accent-foreground data-focus-visible:border-ring data-focus-visible:ring-ring/50 relative rounded px-2 py-1.5 outline-none data-disabled:cursor-not-allowed data-disabled:opacity-50 data-focus-visible:ring-[3px]'
1059
- >
1060
- Russian
1061
- </ListBoxItem>
1062
- </ListBoxSection>
1063
- </ListBox>
1064
- </div>
1065
- <p className='text-muted-foreground text-xs' role='region' aria-live='polite'>
1066
- Built using{' '}
1067
- <a
1068
- href='https://react-spectrum.adobe.com/react-aria/ListBox.html'
1069
- className='hover:text-primary underline'
1070
- target='_blank'
1071
- >
1072
- React Aria
1073
- </a>
1074
- </p>
1075
- </div>
1076
- )
1077
- }
1078
-
1079
- const SelectMenuSlideInDemo = () => {
1080
- const id = useId()
1081
-
1082
- return (
1083
- <div className='w-full max-w-xs space-y-2'>
1084
- <Label htmlFor={id}>Select menu slide-in from bottom</Label>
1085
- <Select defaultValue='apple'>
1086
- <SelectTrigger id={id} className='w-full'>
1087
- <SelectValue placeholder='Select a fruit' />
1088
- </SelectTrigger>
1089
- <SelectContent className='data-[state=open]:slide-in-from-bottom-8 data-[state=open]:zoom-in-100 duration-400'>
1090
- <SelectGroup>
1091
- <SelectLabel>Fruits</SelectLabel>
1092
- <SelectItem value='apple'>Apple</SelectItem>
1093
- <SelectItem value='banana'>Banana</SelectItem>
1094
- <SelectItem value='blueberry'>Blueberry</SelectItem>
1095
- <SelectItem value='grapes'>Grapes</SelectItem>
1096
- <SelectItem value='pineapple'>Pineapple</SelectItem>
1097
- </SelectGroup>
1098
- </SelectContent>
1099
- </Select>
1100
- </div>
1101
- )
1102
- }
1103
-
1104
- const SelectMenuZoomInDemo = () => {
1105
- const id = useId()
1106
-
1107
- return (
1108
- <div className='w-full max-w-xs space-y-2'>
1109
- <Label htmlFor={id}>Select menu zoom-in</Label>
1110
- <Select defaultValue='apple'>
1111
- <SelectTrigger id={id} className='w-full'>
1112
- <SelectValue placeholder='Select a fruit' />
1113
- </SelectTrigger>
1114
- <SelectContent className='data-[state=open]:!zoom-in-0 origin-center duration-400'>
1115
- <SelectGroup>
1116
- <SelectLabel>Fruits</SelectLabel>
1117
- <SelectItem value='apple'>Apple</SelectItem>
1118
- <SelectItem value='banana'>Banana</SelectItem>
1119
- <SelectItem value='blueberry'>Blueberry</SelectItem>
1120
- <SelectItem value='grapes'>Grapes</SelectItem>
1121
- <SelectItem value='pineapple'>Pineapple</SelectItem>
1122
- </SelectGroup>
1123
- </SelectContent>
1124
- </Select>
1125
- </div>
1126
- )
1127
- } */