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.
Files changed (83) hide show
  1. package/.github/workflows/pr-preview.yml +9 -2
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +13 -0
  4. package/content/components/accordion.mdx +13 -0
  5. package/content/components/alert-dialog.mdx +34 -0
  6. package/content/components/autocomplete.mdx +62 -0
  7. package/content/components/avatar.mdx +11 -0
  8. package/content/components/button.mdx +8 -0
  9. package/content/components/checkbox.mdx +11 -0
  10. package/content/components/collapsible.mdx +11 -0
  11. package/content/components/combobox.mdx +33 -0
  12. package/content/components/context-menu.mdx +29 -0
  13. package/content/components/dialog.mdx +33 -0
  14. package/content/components/drawer.mdx +38 -0
  15. package/content/components/field.mdx +21 -0
  16. package/content/components/fieldset.mdx +10 -0
  17. package/content/components/form.mdx +8 -0
  18. package/content/components/input.mdx +4 -0
  19. package/content/components/menu.mdx +27 -0
  20. package/content/components/menubar.mdx +31 -0
  21. package/content/components/meter.mdx +14 -0
  22. package/content/components/navigation-menu.mdx +28 -0
  23. package/content/components/number-field.mdx +25 -0
  24. package/content/components/popover.mdx +22 -0
  25. package/content/components/preview-card.mdx +14 -2
  26. package/content/components/progress.mdx +15 -1
  27. package/content/components/radio.mdx +11 -0
  28. package/content/components/scroll-area.mdx +23 -0
  29. package/content/components/select.mdx +27 -0
  30. package/content/components/separator.mdx +29 -0
  31. package/content/components/slider.mdx +4 -0
  32. package/content/components/switch.mdx +4 -0
  33. package/content/components/tabs.mdx +15 -0
  34. package/content/components/toast.mdx +10 -0
  35. package/content/components/toggle-group.mdx +37 -0
  36. package/content/components/toggle.mdx +12 -0
  37. package/content/components/toolbar.mdx +22 -0
  38. package/content/components/tooltip.mdx +13 -0
  39. package/content/docs/installation.mdx +30 -0
  40. package/content-collections.ts +65 -1
  41. package/dist/cli.js +947 -101
  42. package/examples/__index.tsx +136 -68
  43. package/examples/autocomplete-align.tsx +39 -0
  44. package/examples/autocomplete-controlled.tsx +44 -0
  45. package/examples/autocomplete-groups.tsx +65 -0
  46. package/examples/autocomplete-no-clear.tsx +40 -0
  47. package/examples/avatar-demo.tsx +3 -3
  48. package/examples/input-group-with-button.tsx +1 -1
  49. package/examples/separator-demo.tsx +13 -0
  50. package/examples/separator-horizontal.tsx +18 -0
  51. package/package.json +19 -18
  52. package/public/base-ui.svg +1 -0
  53. package/src/assets/base-ui.svg +1 -0
  54. package/src/commands/add.ts +79 -38
  55. package/src/commands/cli.ts +50 -3
  56. package/src/commands/create.ts +262 -0
  57. package/src/commands/init.ts +45 -12
  58. package/src/commands/palette.ts +55 -0
  59. package/src/components/docs/layout/footer.tsx +2 -2
  60. package/src/components/docs/layout/header.tsx +7 -9
  61. package/src/components/docs/layout/mobile-menu.tsx +0 -1
  62. package/src/components/docs/layout/nav-list.tsx +2 -2
  63. package/src/components/docs/layout/page-header.tsx +52 -7
  64. package/src/components/docs/layout/split-layout.tsx +9 -10
  65. package/src/components/docs/layout/table-of-content.tsx +145 -0
  66. package/src/components/docs/markdown/components.tsx +142 -29
  67. package/src/components/docs/markdown/copy-button.tsx +41 -0
  68. package/src/components/docs/markdown/installation-block.tsx +5 -24
  69. package/src/components/docs/markdown/render-preview.tsx +1 -1
  70. package/src/components/ui/button-group.tsx +1 -1
  71. package/src/components/ui/scroll-area.tsx +11 -2
  72. package/src/lib/docs-headings.ts +72 -0
  73. package/src/routeTree.gen.ts +60 -3
  74. package/src/routes/__root.tsx +2 -2
  75. package/src/routes/components.$slug.tsx +20 -4
  76. package/src/routes/docs.$slug.tsx +78 -0
  77. package/src/routes/docs.tsx +15 -0
  78. package/src/styles/styles.css +1 -1
  79. package/src/utils/cli-utils.ts +8 -8
  80. package/src/utils/dependency-installer.ts +30 -0
  81. package/src/utils/package-manager.ts +4 -4
  82. package/src/utils/palette.ts +666 -0
  83. package/src/utils/schema.ts +6 -0
@@ -14,9 +14,11 @@ type Example = {
14
14
  };
15
15
 
16
16
  export const examples: ExampleRegistry = {
17
- "accordion": {
17
+ accordion: {
18
18
  title: "Accordion",
19
- code: lazy(() => import("../src/components/ui/accordion").then(m => ({ default: m.Accordion }))),
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
- "alert": {
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(() => import("../src/components/ui/alert-dialog").then(m => ({ default: m.AlertDialog }))),
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
- "autocomplete": {
124
+ autocomplete: {
121
125
  title: "Autocomplete",
122
- code: lazy(() => import("../src/components/ui/autocomplete").then(m => ({ default: m.Autocomplete }))),
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
- "avatar": {
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
- "badge": {
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
- "button": {
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(() => import("../src/components/ui/button-group").then(m => ({ default: m.ButtonGroup }))),
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
- "card": {
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
- "checkbox": {
294
+ checkbox: {
267
295
  title: "Checkbox",
268
- code: lazy(() => import("../src/components/ui/checkbox").then(m => ({ default: m.Checkbox }))),
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
- "collapsible": {
332
+ collapsible: {
303
333
  title: "Collapsible",
304
- code: lazy(() => import("../src/components/ui/collapsible").then(m => ({ default: m.Collapsible }))),
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
- "combobox": {
345
+ combobox: {
314
346
  title: "Combobox",
315
- code: lazy(() => import("../src/components/ui/combobox").then(m => ({ default: m.Combobox }))),
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(() => import("../src/components/ui/context-menu").then(m => ({ default: m.ContextMenu }))),
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
- "dialog": {
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
- "drawer": {
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
- "field": {
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
- "fieldset": {
444
+ fieldset: {
409
445
  title: "Fieldset",
410
- code: lazy(() => import("../src/components/ui/fieldset").then(m => ({ default: m.Fieldset }))),
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
- "form": {
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
- "input": {
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(() => import("../src/components/ui/input-group").then(m => ({ default: m.InputGroup }))),
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
- "menu": {
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
- "menubar": {
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
- "meter": {
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(() => import("../src/components/ui/navigation-menu").then(m => ({ default: m.NavigationMenu }))),
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(() => import("../src/components/ui/number-field").then(m => ({ default: m.NumberField }))),
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
- "popover": {
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(() => import("../src/components/ui/preview-card").then(m => ({ default: m.PreviewCard }))),
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
- "progress": {
725
+ progress: {
680
726
  title: "Progress",
681
- code: lazy(() => import("../src/components/ui/progress").then(m => ({ default: m.Progress }))),
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
- "radio": {
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(() => import("../src/components/ui/scroll-area").then(m => ({ default: m.ScrollArea }))),
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
- "select": {
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
- "slider": {
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
- "switch": {
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
- "tabs": {
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
- "toast": {
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
- "toggle": {
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
- "toolbar": {
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
- "tooltip": {
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
+ }