shapes-ui 0.5.0 → 0.6.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/.github/workflows/pr-preview.yml +9 -2
- package/CHANGELOG.md +11 -0
- package/README.md +13 -0
- package/content/components/accordion.mdx +13 -0
- package/content/components/alert-dialog.mdx +34 -0
- package/content/components/autocomplete.mdx +62 -0
- package/content/components/avatar.mdx +11 -0
- package/content/components/button.mdx +8 -0
- package/content/components/checkbox.mdx +11 -0
- package/content/components/collapsible.mdx +11 -0
- package/content/components/combobox.mdx +33 -0
- package/content/components/context-menu.mdx +29 -0
- package/content/components/dialog.mdx +33 -0
- package/content/components/drawer.mdx +38 -0
- package/content/components/field.mdx +21 -0
- package/content/components/fieldset.mdx +10 -0
- package/content/components/form.mdx +8 -0
- package/content/components/input.mdx +4 -0
- package/content/components/menu.mdx +27 -0
- package/content/components/menubar.mdx +31 -0
- package/content/components/meter.mdx +14 -0
- package/content/components/navigation-menu.mdx +28 -0
- package/content/components/number-field.mdx +25 -0
- package/content/components/popover.mdx +22 -0
- package/content/components/preview-card.mdx +14 -2
- package/content/components/progress.mdx +15 -1
- package/content/components/radio.mdx +11 -0
- package/content/components/scroll-area.mdx +23 -0
- package/content/components/select.mdx +27 -0
- package/content/components/separator.mdx +29 -0
- package/content/components/slider.mdx +4 -0
- package/content/components/switch.mdx +4 -0
- package/content/components/tabs.mdx +15 -0
- package/content/components/toast.mdx +10 -0
- package/content/components/toggle-group.mdx +37 -0
- package/content/components/toggle.mdx +12 -0
- package/content/components/toolbar.mdx +22 -0
- package/content/components/tooltip.mdx +13 -0
- package/content/docs/installation.mdx +30 -0
- package/content-collections.ts +65 -1
- package/dist/cli.js +947 -101
- package/examples/__index.tsx +136 -68
- package/examples/autocomplete-align.tsx +39 -0
- package/examples/autocomplete-controlled.tsx +44 -0
- package/examples/autocomplete-groups.tsx +65 -0
- package/examples/autocomplete-no-clear.tsx +40 -0
- package/examples/avatar-demo.tsx +3 -3
- package/examples/input-group-with-button.tsx +1 -1
- package/examples/separator-demo.tsx +13 -0
- package/examples/separator-horizontal.tsx +18 -0
- package/package.json +19 -18
- package/public/base-ui.svg +1 -0
- package/src/assets/base-ui.svg +1 -0
- package/src/commands/add.ts +79 -38
- package/src/commands/cli.ts +50 -3
- package/src/commands/create.ts +262 -0
- package/src/commands/init.ts +45 -12
- package/src/commands/palette.ts +55 -0
- package/src/components/docs/layout/footer.tsx +2 -2
- package/src/components/docs/layout/header.tsx +7 -9
- package/src/components/docs/layout/mobile-menu.tsx +0 -1
- package/src/components/docs/layout/nav-list.tsx +2 -2
- package/src/components/docs/layout/page-header.tsx +52 -7
- package/src/components/docs/layout/split-layout.tsx +9 -10
- package/src/components/docs/layout/table-of-content.tsx +145 -0
- package/src/components/docs/markdown/components.tsx +142 -29
- package/src/components/docs/markdown/copy-button.tsx +41 -0
- package/src/components/docs/markdown/installation-block.tsx +5 -24
- package/src/components/docs/markdown/render-preview.tsx +1 -1
- package/src/components/ui/button-group.tsx +1 -1
- package/src/components/ui/scroll-area.tsx +11 -2
- package/src/lib/docs-headings.ts +72 -0
- package/src/routeTree.gen.ts +60 -3
- package/src/routes/__root.tsx +2 -2
- package/src/routes/components.$slug.tsx +20 -4
- package/src/routes/docs.$slug.tsx +78 -0
- package/src/routes/docs.tsx +15 -0
- package/src/styles/styles.css +1 -1
- package/src/utils/cli-utils.ts +8 -8
- package/src/utils/dependency-installer.ts +30 -0
- package/src/utils/package-manager.ts +4 -4
- package/src/utils/palette.ts +666 -0
- package/src/utils/schema.ts +6 -0
package/examples/__index.tsx
CHANGED
|
@@ -14,9 +14,11 @@ type Example = {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
export const examples: ExampleRegistry = {
|
|
17
|
-
|
|
17
|
+
accordion: {
|
|
18
18
|
title: "Accordion",
|
|
19
|
-
code: lazy(() =>
|
|
19
|
+
code: lazy(() =>
|
|
20
|
+
import("../src/components/ui/accordion").then((m) => ({ default: m.Accordion })),
|
|
21
|
+
),
|
|
20
22
|
examples: [
|
|
21
23
|
{
|
|
22
24
|
name: "accordion-surface",
|
|
@@ -45,9 +47,9 @@ export const examples: ExampleRegistry = {
|
|
|
45
47
|
},
|
|
46
48
|
],
|
|
47
49
|
},
|
|
48
|
-
|
|
50
|
+
alert: {
|
|
49
51
|
title: "Alert",
|
|
50
|
-
code: lazy(() => import("../src/components/ui/alert").then(m => ({ default: m.Alert }))),
|
|
52
|
+
code: lazy(() => import("../src/components/ui/alert").then((m) => ({ default: m.Alert }))),
|
|
51
53
|
examples: [
|
|
52
54
|
{
|
|
53
55
|
name: "alert-warning",
|
|
@@ -98,7 +100,9 @@ export const examples: ExampleRegistry = {
|
|
|
98
100
|
},
|
|
99
101
|
"alert-dialog": {
|
|
100
102
|
title: "Alert Dialog",
|
|
101
|
-
code: lazy(() =>
|
|
103
|
+
code: lazy(() =>
|
|
104
|
+
import("../src/components/ui/alert-dialog").then((m) => ({ default: m.AlertDialog })),
|
|
105
|
+
),
|
|
102
106
|
examples: [
|
|
103
107
|
{
|
|
104
108
|
name: "alert-dialog-icon",
|
|
@@ -117,10 +121,32 @@ export const examples: ExampleRegistry = {
|
|
|
117
121
|
},
|
|
118
122
|
],
|
|
119
123
|
},
|
|
120
|
-
|
|
124
|
+
autocomplete: {
|
|
121
125
|
title: "Autocomplete",
|
|
122
|
-
code: lazy(() =>
|
|
126
|
+
code: lazy(() =>
|
|
127
|
+
import("../src/components/ui/autocomplete").then((m) => ({ default: m.Autocomplete })),
|
|
128
|
+
),
|
|
123
129
|
examples: [
|
|
130
|
+
{
|
|
131
|
+
name: "autocomplete-groups",
|
|
132
|
+
title: "Groups",
|
|
133
|
+
code: lazy(() => import("./autocomplete-groups")),
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
name: "autocomplete-no-clear",
|
|
137
|
+
title: "No Clear",
|
|
138
|
+
code: lazy(() => import("./autocomplete-no-clear")),
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: "autocomplete-align",
|
|
142
|
+
title: "Alignment",
|
|
143
|
+
code: lazy(() => import("./autocomplete-align")),
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
name: "autocomplete-controlled",
|
|
147
|
+
title: "Controlled",
|
|
148
|
+
code: lazy(() => import("./autocomplete-controlled")),
|
|
149
|
+
},
|
|
124
150
|
{
|
|
125
151
|
name: "autocomplete-demo",
|
|
126
152
|
title: "Demo",
|
|
@@ -128,9 +154,9 @@ export const examples: ExampleRegistry = {
|
|
|
128
154
|
},
|
|
129
155
|
],
|
|
130
156
|
},
|
|
131
|
-
|
|
157
|
+
avatar: {
|
|
132
158
|
title: "Avatar",
|
|
133
|
-
code: lazy(() => import("../src/components/ui/avatar").then(m => ({ default: m.Avatar }))),
|
|
159
|
+
code: lazy(() => import("../src/components/ui/avatar").then((m) => ({ default: m.Avatar }))),
|
|
134
160
|
examples: [
|
|
135
161
|
{
|
|
136
162
|
name: "avatar-demo",
|
|
@@ -139,9 +165,9 @@ export const examples: ExampleRegistry = {
|
|
|
139
165
|
},
|
|
140
166
|
],
|
|
141
167
|
},
|
|
142
|
-
|
|
168
|
+
badge: {
|
|
143
169
|
title: "Badge",
|
|
144
|
-
code: lazy(() => import("../src/components/ui/badge").then(m => ({ default: m.Badge }))),
|
|
170
|
+
code: lazy(() => import("../src/components/ui/badge").then((m) => ({ default: m.Badge }))),
|
|
145
171
|
examples: [
|
|
146
172
|
{
|
|
147
173
|
name: "badge-variants",
|
|
@@ -165,9 +191,9 @@ export const examples: ExampleRegistry = {
|
|
|
165
191
|
},
|
|
166
192
|
],
|
|
167
193
|
},
|
|
168
|
-
|
|
194
|
+
button: {
|
|
169
195
|
title: "Button",
|
|
170
|
-
code: lazy(() => import("../src/components/ui/button").then(m => ({ default: m.Button }))),
|
|
196
|
+
code: lazy(() => import("../src/components/ui/button").then((m) => ({ default: m.Button }))),
|
|
171
197
|
examples: [
|
|
172
198
|
{
|
|
173
199
|
name: "button-warning",
|
|
@@ -228,7 +254,9 @@ export const examples: ExampleRegistry = {
|
|
|
228
254
|
},
|
|
229
255
|
"button-group": {
|
|
230
256
|
title: "Button Group",
|
|
231
|
-
code: lazy(() =>
|
|
257
|
+
code: lazy(() =>
|
|
258
|
+
import("../src/components/ui/button-group").then((m) => ({ default: m.ButtonGroup })),
|
|
259
|
+
),
|
|
232
260
|
examples: [
|
|
233
261
|
{
|
|
234
262
|
name: "button-group-vertical",
|
|
@@ -252,9 +280,9 @@ export const examples: ExampleRegistry = {
|
|
|
252
280
|
},
|
|
253
281
|
],
|
|
254
282
|
},
|
|
255
|
-
|
|
283
|
+
card: {
|
|
256
284
|
title: "Card",
|
|
257
|
-
code: lazy(() => import("../src/components/ui/card").then(m => ({ default: m.Card }))),
|
|
285
|
+
code: lazy(() => import("../src/components/ui/card").then((m) => ({ default: m.Card }))),
|
|
258
286
|
examples: [
|
|
259
287
|
{
|
|
260
288
|
name: "card-demo",
|
|
@@ -263,9 +291,11 @@ export const examples: ExampleRegistry = {
|
|
|
263
291
|
},
|
|
264
292
|
],
|
|
265
293
|
},
|
|
266
|
-
|
|
294
|
+
checkbox: {
|
|
267
295
|
title: "Checkbox",
|
|
268
|
-
code: lazy(() =>
|
|
296
|
+
code: lazy(() =>
|
|
297
|
+
import("../src/components/ui/checkbox").then((m) => ({ default: m.Checkbox })),
|
|
298
|
+
),
|
|
269
299
|
examples: [
|
|
270
300
|
{
|
|
271
301
|
name: "checkbox-with-text",
|
|
@@ -299,9 +329,11 @@ export const examples: ExampleRegistry = {
|
|
|
299
329
|
},
|
|
300
330
|
],
|
|
301
331
|
},
|
|
302
|
-
|
|
332
|
+
collapsible: {
|
|
303
333
|
title: "Collapsible",
|
|
304
|
-
code: lazy(() =>
|
|
334
|
+
code: lazy(() =>
|
|
335
|
+
import("../src/components/ui/collapsible").then((m) => ({ default: m.Collapsible })),
|
|
336
|
+
),
|
|
305
337
|
examples: [
|
|
306
338
|
{
|
|
307
339
|
name: "collapsible-demo",
|
|
@@ -310,9 +342,11 @@ export const examples: ExampleRegistry = {
|
|
|
310
342
|
},
|
|
311
343
|
],
|
|
312
344
|
},
|
|
313
|
-
|
|
345
|
+
combobox: {
|
|
314
346
|
title: "Combobox",
|
|
315
|
-
code: lazy(() =>
|
|
347
|
+
code: lazy(() =>
|
|
348
|
+
import("../src/components/ui/combobox").then((m) => ({ default: m.Combobox })),
|
|
349
|
+
),
|
|
316
350
|
examples: [
|
|
317
351
|
{
|
|
318
352
|
name: "combobox-demo",
|
|
@@ -323,7 +357,9 @@ export const examples: ExampleRegistry = {
|
|
|
323
357
|
},
|
|
324
358
|
"context-menu": {
|
|
325
359
|
title: "Context Menu",
|
|
326
|
-
code: lazy(() =>
|
|
360
|
+
code: lazy(() =>
|
|
361
|
+
import("../src/components/ui/context-menu").then((m) => ({ default: m.ContextMenu })),
|
|
362
|
+
),
|
|
327
363
|
examples: [
|
|
328
364
|
{
|
|
329
365
|
name: "context-menu-demo",
|
|
@@ -332,9 +368,9 @@ export const examples: ExampleRegistry = {
|
|
|
332
368
|
},
|
|
333
369
|
],
|
|
334
370
|
},
|
|
335
|
-
|
|
371
|
+
dialog: {
|
|
336
372
|
title: "Dialog",
|
|
337
|
-
code: lazy(() => import("../src/components/ui/dialog").then(m => ({ default: m.Dialog }))),
|
|
373
|
+
code: lazy(() => import("../src/components/ui/dialog").then((m) => ({ default: m.Dialog }))),
|
|
338
374
|
examples: [
|
|
339
375
|
{
|
|
340
376
|
name: "dialog-demo",
|
|
@@ -343,9 +379,9 @@ export const examples: ExampleRegistry = {
|
|
|
343
379
|
},
|
|
344
380
|
],
|
|
345
381
|
},
|
|
346
|
-
|
|
382
|
+
drawer: {
|
|
347
383
|
title: "Drawer",
|
|
348
|
-
code: lazy(() => import("../src/components/ui/drawer").then(m => ({ default: m.Drawer }))),
|
|
384
|
+
code: lazy(() => import("../src/components/ui/drawer").then((m) => ({ default: m.Drawer }))),
|
|
349
385
|
examples: [
|
|
350
386
|
{
|
|
351
387
|
name: "drawer-snap-points",
|
|
@@ -374,9 +410,9 @@ export const examples: ExampleRegistry = {
|
|
|
374
410
|
},
|
|
375
411
|
],
|
|
376
412
|
},
|
|
377
|
-
|
|
413
|
+
field: {
|
|
378
414
|
title: "Field",
|
|
379
|
-
code: lazy(() => import("../src/components/ui/field").then(m => ({ default: m.Field }))),
|
|
415
|
+
code: lazy(() => import("../src/components/ui/field").then((m) => ({ default: m.Field }))),
|
|
380
416
|
examples: [
|
|
381
417
|
{
|
|
382
418
|
name: "field-validation",
|
|
@@ -405,9 +441,11 @@ export const examples: ExampleRegistry = {
|
|
|
405
441
|
},
|
|
406
442
|
],
|
|
407
443
|
},
|
|
408
|
-
|
|
444
|
+
fieldset: {
|
|
409
445
|
title: "Fieldset",
|
|
410
|
-
code: lazy(() =>
|
|
446
|
+
code: lazy(() =>
|
|
447
|
+
import("../src/components/ui/fieldset").then((m) => ({ default: m.Fieldset })),
|
|
448
|
+
),
|
|
411
449
|
examples: [
|
|
412
450
|
{
|
|
413
451
|
name: "fieldset-nested",
|
|
@@ -421,9 +459,9 @@ export const examples: ExampleRegistry = {
|
|
|
421
459
|
},
|
|
422
460
|
],
|
|
423
461
|
},
|
|
424
|
-
|
|
462
|
+
form: {
|
|
425
463
|
title: "Form",
|
|
426
|
-
code: lazy(() => import("../src/components/ui/form").then(m => ({ default: m.Form }))),
|
|
464
|
+
code: lazy(() => import("../src/components/ui/form").then((m) => ({ default: m.Form }))),
|
|
427
465
|
examples: [
|
|
428
466
|
{
|
|
429
467
|
name: "form-demo",
|
|
@@ -432,9 +470,9 @@ export const examples: ExampleRegistry = {
|
|
|
432
470
|
},
|
|
433
471
|
],
|
|
434
472
|
},
|
|
435
|
-
|
|
473
|
+
input: {
|
|
436
474
|
title: "Input",
|
|
437
|
-
code: lazy(() => import("../src/components/ui/input").then(m => ({ default: m.Input }))),
|
|
475
|
+
code: lazy(() => import("../src/components/ui/input").then((m) => ({ default: m.Input }))),
|
|
438
476
|
examples: [
|
|
439
477
|
{
|
|
440
478
|
name: "input-required",
|
|
@@ -475,7 +513,9 @@ export const examples: ExampleRegistry = {
|
|
|
475
513
|
},
|
|
476
514
|
"input-group": {
|
|
477
515
|
title: "Input Group",
|
|
478
|
-
code: lazy(() =>
|
|
516
|
+
code: lazy(() =>
|
|
517
|
+
import("../src/components/ui/input-group").then((m) => ({ default: m.InputGroup })),
|
|
518
|
+
),
|
|
479
519
|
examples: [
|
|
480
520
|
{
|
|
481
521
|
name: "input-group-with-prefix",
|
|
@@ -524,9 +564,9 @@ export const examples: ExampleRegistry = {
|
|
|
524
564
|
},
|
|
525
565
|
],
|
|
526
566
|
},
|
|
527
|
-
|
|
567
|
+
menu: {
|
|
528
568
|
title: "Menu",
|
|
529
|
-
code: lazy(() => import("../src/components/ui/menu").then(m => ({ default: m.Menu }))),
|
|
569
|
+
code: lazy(() => import("../src/components/ui/menu").then((m) => ({ default: m.Menu }))),
|
|
530
570
|
examples: [
|
|
531
571
|
{
|
|
532
572
|
name: "menu-submenu",
|
|
@@ -565,9 +605,9 @@ export const examples: ExampleRegistry = {
|
|
|
565
605
|
},
|
|
566
606
|
],
|
|
567
607
|
},
|
|
568
|
-
|
|
608
|
+
menubar: {
|
|
569
609
|
title: "Menubar",
|
|
570
|
-
code: lazy(() => import("../src/components/ui/menubar").then(m => ({ default: m.Menubar }))),
|
|
610
|
+
code: lazy(() => import("../src/components/ui/menubar").then((m) => ({ default: m.Menubar }))),
|
|
571
611
|
examples: [
|
|
572
612
|
{
|
|
573
613
|
name: "menubar-demo",
|
|
@@ -581,9 +621,9 @@ export const examples: ExampleRegistry = {
|
|
|
581
621
|
},
|
|
582
622
|
],
|
|
583
623
|
},
|
|
584
|
-
|
|
624
|
+
meter: {
|
|
585
625
|
title: "Meter",
|
|
586
|
-
code: lazy(() => import("../src/components/ui/meter").then(m => ({ default: m.Meter }))),
|
|
626
|
+
code: lazy(() => import("../src/components/ui/meter").then((m) => ({ default: m.Meter }))),
|
|
587
627
|
examples: [
|
|
588
628
|
{
|
|
589
629
|
name: "meter-no-value",
|
|
@@ -609,7 +649,9 @@ export const examples: ExampleRegistry = {
|
|
|
609
649
|
},
|
|
610
650
|
"navigation-menu": {
|
|
611
651
|
title: "Navigation Menu",
|
|
612
|
-
code: lazy(() =>
|
|
652
|
+
code: lazy(() =>
|
|
653
|
+
import("../src/components/ui/navigation-menu").then((m) => ({ default: m.NavigationMenu })),
|
|
654
|
+
),
|
|
613
655
|
examples: [
|
|
614
656
|
{
|
|
615
657
|
name: "navigation-menu-demo",
|
|
@@ -620,7 +662,9 @@ export const examples: ExampleRegistry = {
|
|
|
620
662
|
},
|
|
621
663
|
"number-field": {
|
|
622
664
|
title: "Number Field",
|
|
623
|
-
code: lazy(() =>
|
|
665
|
+
code: lazy(() =>
|
|
666
|
+
import("../src/components/ui/number-field").then((m) => ({ default: m.NumberField })),
|
|
667
|
+
),
|
|
624
668
|
examples: [
|
|
625
669
|
{
|
|
626
670
|
name: "number-field-scrub",
|
|
@@ -639,9 +683,9 @@ export const examples: ExampleRegistry = {
|
|
|
639
683
|
},
|
|
640
684
|
],
|
|
641
685
|
},
|
|
642
|
-
|
|
686
|
+
popover: {
|
|
643
687
|
title: "Popover",
|
|
644
|
-
code: lazy(() => import("../src/components/ui/popover").then(m => ({ default: m.Popover }))),
|
|
688
|
+
code: lazy(() => import("../src/components/ui/popover").then((m) => ({ default: m.Popover }))),
|
|
645
689
|
examples: [
|
|
646
690
|
{
|
|
647
691
|
name: "popover-positions",
|
|
@@ -662,7 +706,9 @@ export const examples: ExampleRegistry = {
|
|
|
662
706
|
},
|
|
663
707
|
"preview-card": {
|
|
664
708
|
title: "Preview Card",
|
|
665
|
-
code: lazy(() =>
|
|
709
|
+
code: lazy(() =>
|
|
710
|
+
import("../src/components/ui/preview-card").then((m) => ({ default: m.PreviewCard })),
|
|
711
|
+
),
|
|
666
712
|
examples: [
|
|
667
713
|
{
|
|
668
714
|
name: "preview-card-links",
|
|
@@ -676,9 +722,11 @@ export const examples: ExampleRegistry = {
|
|
|
676
722
|
},
|
|
677
723
|
],
|
|
678
724
|
},
|
|
679
|
-
|
|
725
|
+
progress: {
|
|
680
726
|
title: "Progress",
|
|
681
|
-
code: lazy(() =>
|
|
727
|
+
code: lazy(() =>
|
|
728
|
+
import("../src/components/ui/progress").then((m) => ({ default: m.Progress })),
|
|
729
|
+
),
|
|
682
730
|
examples: [
|
|
683
731
|
{
|
|
684
732
|
name: "progress-demo",
|
|
@@ -687,9 +735,9 @@ export const examples: ExampleRegistry = {
|
|
|
687
735
|
},
|
|
688
736
|
],
|
|
689
737
|
},
|
|
690
|
-
|
|
738
|
+
radio: {
|
|
691
739
|
title: "Radio",
|
|
692
|
-
code: lazy(() => import("../src/components/ui/radio").then(m => ({ default: m.Radio }))),
|
|
740
|
+
code: lazy(() => import("../src/components/ui/radio").then((m) => ({ default: m.Radio }))),
|
|
693
741
|
examples: [
|
|
694
742
|
{
|
|
695
743
|
name: "radio-orientation",
|
|
@@ -715,7 +763,9 @@ export const examples: ExampleRegistry = {
|
|
|
715
763
|
},
|
|
716
764
|
"scroll-area": {
|
|
717
765
|
title: "Scroll Area",
|
|
718
|
-
code: lazy(() =>
|
|
766
|
+
code: lazy(() =>
|
|
767
|
+
import("../src/components/ui/scroll-area").then((m) => ({ default: m.ScrollArea })),
|
|
768
|
+
),
|
|
719
769
|
examples: [
|
|
720
770
|
{
|
|
721
771
|
name: "scroll-area-demo",
|
|
@@ -724,9 +774,27 @@ export const examples: ExampleRegistry = {
|
|
|
724
774
|
},
|
|
725
775
|
],
|
|
726
776
|
},
|
|
727
|
-
|
|
777
|
+
separator: {
|
|
778
|
+
title: "Separator",
|
|
779
|
+
code: lazy(() =>
|
|
780
|
+
import("../src/components/ui/separator").then((m) => ({ default: m.Separator })),
|
|
781
|
+
),
|
|
782
|
+
examples: [
|
|
783
|
+
{
|
|
784
|
+
name: "separator-horizontal",
|
|
785
|
+
title: "Horizontal",
|
|
786
|
+
code: lazy(() => import("./separator-horizontal")),
|
|
787
|
+
},
|
|
788
|
+
{
|
|
789
|
+
name: "separator-demo",
|
|
790
|
+
title: "Vertical",
|
|
791
|
+
code: lazy(() => import("./separator-demo")),
|
|
792
|
+
},
|
|
793
|
+
],
|
|
794
|
+
},
|
|
795
|
+
select: {
|
|
728
796
|
title: "Select",
|
|
729
|
-
code: lazy(() => import("../src/components/ui/select").then(m => ({ default: m.Select }))),
|
|
797
|
+
code: lazy(() => import("../src/components/ui/select").then((m) => ({ default: m.Select }))),
|
|
730
798
|
examples: [
|
|
731
799
|
{
|
|
732
800
|
name: "select-scrollable",
|
|
@@ -760,9 +828,9 @@ export const examples: ExampleRegistry = {
|
|
|
760
828
|
},
|
|
761
829
|
],
|
|
762
830
|
},
|
|
763
|
-
|
|
831
|
+
slider: {
|
|
764
832
|
title: "Slider",
|
|
765
|
-
code: lazy(() => import("../src/components/ui/slider").then(m => ({ default: m.Slider }))),
|
|
833
|
+
code: lazy(() => import("../src/components/ui/slider").then((m) => ({ default: m.Slider }))),
|
|
766
834
|
examples: [
|
|
767
835
|
{
|
|
768
836
|
name: "slider-vertical",
|
|
@@ -801,9 +869,9 @@ export const examples: ExampleRegistry = {
|
|
|
801
869
|
},
|
|
802
870
|
],
|
|
803
871
|
},
|
|
804
|
-
|
|
872
|
+
switch: {
|
|
805
873
|
title: "Switch",
|
|
806
|
-
code: lazy(() => import("../src/components/ui/switch").then(m => ({ default: m.Switch }))),
|
|
874
|
+
code: lazy(() => import("../src/components/ui/switch").then((m) => ({ default: m.Switch }))),
|
|
807
875
|
examples: [
|
|
808
876
|
{
|
|
809
877
|
name: "switch-with-label",
|
|
@@ -827,9 +895,9 @@ export const examples: ExampleRegistry = {
|
|
|
827
895
|
},
|
|
828
896
|
],
|
|
829
897
|
},
|
|
830
|
-
|
|
898
|
+
tabs: {
|
|
831
899
|
title: "Tabs",
|
|
832
|
-
code: lazy(() => import("../src/components/ui/tabs").then(m => ({ default: m.Tabs }))),
|
|
900
|
+
code: lazy(() => import("../src/components/ui/tabs").then((m) => ({ default: m.Tabs }))),
|
|
833
901
|
examples: [
|
|
834
902
|
{
|
|
835
903
|
name: "tabs-vertical",
|
|
@@ -853,9 +921,9 @@ export const examples: ExampleRegistry = {
|
|
|
853
921
|
},
|
|
854
922
|
],
|
|
855
923
|
},
|
|
856
|
-
|
|
924
|
+
toast: {
|
|
857
925
|
title: "Toast",
|
|
858
|
-
code: lazy(() => import("../src/components/ui/toast").then(m => ({ default: m.Toast }))),
|
|
926
|
+
code: lazy(() => import("../src/components/ui/toast").then((m) => ({ default: m.Toast }))),
|
|
859
927
|
examples: [
|
|
860
928
|
{
|
|
861
929
|
name: "toast-variants",
|
|
@@ -904,9 +972,9 @@ export const examples: ExampleRegistry = {
|
|
|
904
972
|
},
|
|
905
973
|
],
|
|
906
974
|
},
|
|
907
|
-
|
|
975
|
+
toggle: {
|
|
908
976
|
title: "Toggle",
|
|
909
|
-
code: lazy(() => import("../src/components/ui/toggle").then(m => ({ default: m.Toggle }))),
|
|
977
|
+
code: lazy(() => import("../src/components/ui/toggle").then((m) => ({ default: m.Toggle }))),
|
|
910
978
|
examples: [
|
|
911
979
|
{
|
|
912
980
|
name: "toggle-icon-fill",
|
|
@@ -935,9 +1003,9 @@ export const examples: ExampleRegistry = {
|
|
|
935
1003
|
},
|
|
936
1004
|
],
|
|
937
1005
|
},
|
|
938
|
-
|
|
1006
|
+
toolbar: {
|
|
939
1007
|
title: "Toolbar",
|
|
940
|
-
code: lazy(() => import("../src/components/ui/toolbar").then(m => ({ default: m.Toolbar }))),
|
|
1008
|
+
code: lazy(() => import("../src/components/ui/toolbar").then((m) => ({ default: m.Toolbar }))),
|
|
941
1009
|
examples: [
|
|
942
1010
|
{
|
|
943
1011
|
name: "toolbar-menu",
|
|
@@ -956,9 +1024,9 @@ export const examples: ExampleRegistry = {
|
|
|
956
1024
|
},
|
|
957
1025
|
],
|
|
958
1026
|
},
|
|
959
|
-
|
|
1027
|
+
tooltip: {
|
|
960
1028
|
title: "Tooltip",
|
|
961
|
-
code: lazy(() => import("../src/components/ui/tooltip").then(m => ({ default: m.Tooltip }))),
|
|
1029
|
+
code: lazy(() => import("../src/components/ui/tooltip").then((m) => ({ default: m.Tooltip }))),
|
|
962
1030
|
examples: [
|
|
963
1031
|
{
|
|
964
1032
|
name: "tooltip-positions",
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Autocomplete,
|
|
5
|
+
AutocompleteEmpty,
|
|
6
|
+
AutocompleteItem,
|
|
7
|
+
AutocompleteList,
|
|
8
|
+
AutocompletePopup,
|
|
9
|
+
} from "@/components/ui/autocomplete";
|
|
10
|
+
|
|
11
|
+
const languages = ["TypeScript", "JavaScript", "Rust", "Go", "Python"];
|
|
12
|
+
|
|
13
|
+
export default function AutocompleteAlign() {
|
|
14
|
+
const [open, setOpen] = useState(false);
|
|
15
|
+
const [value, setValue] = useState("");
|
|
16
|
+
|
|
17
|
+
const filtered = languages.filter((item) => item.toLowerCase().includes(value.toLowerCase()));
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Autocomplete
|
|
21
|
+
open={open}
|
|
22
|
+
onOpenChange={setOpen}
|
|
23
|
+
value={value}
|
|
24
|
+
onValueChange={setValue}
|
|
25
|
+
placeholder="Search language..."
|
|
26
|
+
>
|
|
27
|
+
<AutocompletePopup align="start" sideOffset={4} className="max-w-64">
|
|
28
|
+
<AutocompleteList>
|
|
29
|
+
{filtered.map((item) => (
|
|
30
|
+
<AutocompleteItem key={item} value={item}>
|
|
31
|
+
{item}
|
|
32
|
+
</AutocompleteItem>
|
|
33
|
+
))}
|
|
34
|
+
{filtered.length === 0 && <AutocompleteEmpty>No results found</AutocompleteEmpty>}
|
|
35
|
+
</AutocompleteList>
|
|
36
|
+
</AutocompletePopup>
|
|
37
|
+
</Autocomplete>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Autocomplete,
|
|
5
|
+
AutocompleteEmpty,
|
|
6
|
+
AutocompleteItem,
|
|
7
|
+
AutocompleteList,
|
|
8
|
+
AutocompletePopup,
|
|
9
|
+
} from "@/components/ui/autocomplete";
|
|
10
|
+
|
|
11
|
+
const options = ["Apple", "Banana", "Blueberry", "Cherry", "Orange"];
|
|
12
|
+
|
|
13
|
+
export default function AutocompleteControlled() {
|
|
14
|
+
const [open, setOpen] = useState(false);
|
|
15
|
+
const [value, setValue] = useState("");
|
|
16
|
+
|
|
17
|
+
const filtered = options.filter((item) => item.toLowerCase().includes(value.toLowerCase()));
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<div className="space-y-3">
|
|
21
|
+
<Autocomplete
|
|
22
|
+
open={open}
|
|
23
|
+
onOpenChange={setOpen}
|
|
24
|
+
value={value}
|
|
25
|
+
onValueChange={setValue}
|
|
26
|
+
placeholder="Select a fruit..."
|
|
27
|
+
>
|
|
28
|
+
<AutocompletePopup>
|
|
29
|
+
<AutocompleteList>
|
|
30
|
+
{filtered.map((item) => (
|
|
31
|
+
<AutocompleteItem key={item} value={item}>
|
|
32
|
+
{item}
|
|
33
|
+
</AutocompleteItem>
|
|
34
|
+
))}
|
|
35
|
+
{filtered.length === 0 && <AutocompleteEmpty>No results found</AutocompleteEmpty>}
|
|
36
|
+
</AutocompleteList>
|
|
37
|
+
</AutocompletePopup>
|
|
38
|
+
</Autocomplete>
|
|
39
|
+
<p className="text-sm text-muted-foreground">
|
|
40
|
+
Selected value: <span className="font-medium text-foreground">{value || "—"}</span>
|
|
41
|
+
</p>
|
|
42
|
+
</div>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Autocomplete,
|
|
5
|
+
AutocompleteEmpty,
|
|
6
|
+
AutocompleteGroup,
|
|
7
|
+
AutocompleteGroupLabel,
|
|
8
|
+
AutocompleteItem,
|
|
9
|
+
AutocompleteList,
|
|
10
|
+
AutocompletePopup,
|
|
11
|
+
AutocompleteSeparator,
|
|
12
|
+
} from "@/components/ui/autocomplete";
|
|
13
|
+
|
|
14
|
+
const frameworks = ["React", "Vue", "Svelte", "Solid"];
|
|
15
|
+
const metaFrameworks = ["Next.js", "Nuxt", "Remix", "Astro"];
|
|
16
|
+
|
|
17
|
+
export default function AutocompleteGroups() {
|
|
18
|
+
const [open, setOpen] = useState(false);
|
|
19
|
+
const [value, setValue] = useState("");
|
|
20
|
+
|
|
21
|
+
const query = value.toLowerCase();
|
|
22
|
+
const filteredFrameworks = frameworks.filter((item) => item.toLowerCase().includes(query));
|
|
23
|
+
const filteredMeta = metaFrameworks.filter((item) => item.toLowerCase().includes(query));
|
|
24
|
+
const hasResults = filteredFrameworks.length > 0 || filteredMeta.length > 0;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Autocomplete
|
|
28
|
+
open={open}
|
|
29
|
+
onOpenChange={setOpen}
|
|
30
|
+
value={value}
|
|
31
|
+
onValueChange={setValue}
|
|
32
|
+
placeholder="Search frameworks..."
|
|
33
|
+
>
|
|
34
|
+
<AutocompletePopup>
|
|
35
|
+
<AutocompleteList>
|
|
36
|
+
{!hasResults && <AutocompleteEmpty>No results found</AutocompleteEmpty>}
|
|
37
|
+
|
|
38
|
+
{filteredFrameworks.length > 0 && (
|
|
39
|
+
<AutocompleteGroup>
|
|
40
|
+
<AutocompleteGroupLabel>Frameworks</AutocompleteGroupLabel>
|
|
41
|
+
{filteredFrameworks.map((item) => (
|
|
42
|
+
<AutocompleteItem key={item} value={item}>
|
|
43
|
+
{item}
|
|
44
|
+
</AutocompleteItem>
|
|
45
|
+
))}
|
|
46
|
+
</AutocompleteGroup>
|
|
47
|
+
)}
|
|
48
|
+
|
|
49
|
+
{filteredFrameworks.length > 0 && filteredMeta.length > 0 && <AutocompleteSeparator />}
|
|
50
|
+
|
|
51
|
+
{filteredMeta.length > 0 && (
|
|
52
|
+
<AutocompleteGroup>
|
|
53
|
+
<AutocompleteGroupLabel>Meta Frameworks</AutocompleteGroupLabel>
|
|
54
|
+
{filteredMeta.map((item) => (
|
|
55
|
+
<AutocompleteItem key={item} value={item}>
|
|
56
|
+
{item}
|
|
57
|
+
</AutocompleteItem>
|
|
58
|
+
))}
|
|
59
|
+
</AutocompleteGroup>
|
|
60
|
+
)}
|
|
61
|
+
</AutocompleteList>
|
|
62
|
+
</AutocompletePopup>
|
|
63
|
+
</Autocomplete>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
Autocomplete,
|
|
5
|
+
AutocompleteEmpty,
|
|
6
|
+
AutocompleteItem,
|
|
7
|
+
AutocompleteList,
|
|
8
|
+
AutocompletePopup,
|
|
9
|
+
} from "@/components/ui/autocomplete";
|
|
10
|
+
|
|
11
|
+
const tags = ["Design", "Frontend", "Backend", "DevOps", "Testing"];
|
|
12
|
+
|
|
13
|
+
export default function AutocompleteNoClear() {
|
|
14
|
+
const [open, setOpen] = useState(false);
|
|
15
|
+
const [value, setValue] = useState("");
|
|
16
|
+
|
|
17
|
+
const filtered = tags.filter((item) => item.toLowerCase().includes(value.toLowerCase()));
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<Autocomplete
|
|
21
|
+
open={open}
|
|
22
|
+
onOpenChange={setOpen}
|
|
23
|
+
value={value}
|
|
24
|
+
onValueChange={setValue}
|
|
25
|
+
placeholder="Pick a tag..."
|
|
26
|
+
showClearButton={false}
|
|
27
|
+
>
|
|
28
|
+
<AutocompletePopup>
|
|
29
|
+
<AutocompleteList>
|
|
30
|
+
{filtered.map((item) => (
|
|
31
|
+
<AutocompleteItem key={item} value={item}>
|
|
32
|
+
{item}
|
|
33
|
+
</AutocompleteItem>
|
|
34
|
+
))}
|
|
35
|
+
{filtered.length === 0 && <AutocompleteEmpty>No tags found</AutocompleteEmpty>}
|
|
36
|
+
</AutocompleteList>
|
|
37
|
+
</AutocompletePopup>
|
|
38
|
+
</Autocomplete>
|
|
39
|
+
);
|
|
40
|
+
}
|