@stevederico/skateboard-ui 3.12.0 → 4.1.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/CHANGELOG.md +25 -0
- package/README.md +37 -31
- package/dist/components/core/Command.js +33 -7
- package/dist/shadcn/ui/accordion.d.ts +1 -6
- package/dist/shadcn/ui/accordion.js +3 -17
- package/dist/shadcn/ui/alert-dialog.d.ts +1 -18
- package/dist/shadcn/ui/alert-dialog.js +3 -43
- package/dist/shadcn/ui/alert.d.ts +1 -13
- package/dist/shadcn/ui/alert.js +3 -28
- package/dist/shadcn/ui/aspect-ratio.d.ts +1 -4
- package/dist/shadcn/ui/aspect-ratio.js +3 -8
- package/dist/shadcn/ui/avatar.d.ts +1 -11
- package/dist/shadcn/ui/avatar.js +3 -24
- package/dist/shadcn/ui/badge.d.ts +1 -14
- package/dist/shadcn/ui/badge.js +3 -33
- package/dist/shadcn/ui/breadcrumb.d.ts +1 -10
- package/dist/shadcn/ui/breadcrumb.js +3 -37
- package/dist/shadcn/ui/button-group.d.ts +1 -13
- package/dist/shadcn/ui/button-group.js +3 -36
- package/dist/shadcn/ui/button.d.ts +1 -34
- package/dist/shadcn/ui/button.js +3 -53
- package/dist/shadcn/ui/calendar.d.ts +1 -13
- package/dist/shadcn/ui/calendar.js +3 -75
- package/dist/shadcn/ui/card.d.ts +1 -11
- package/dist/shadcn/ui/card.js +3 -25
- package/dist/shadcn/ui/checkbox.d.ts +1 -3
- package/dist/shadcn/ui/checkbox.js +3 -9
- package/dist/shadcn/ui/collapsible.d.ts +1 -5
- package/dist/shadcn/ui/collapsible.js +3 -13
- package/dist/shadcn/ui/command.d.ts +1 -19
- package/dist/shadcn/ui/command.js +3 -35
- package/dist/shadcn/ui/context-menu.d.ts +1 -29
- package/dist/shadcn/ui/context-menu.js +3 -52
- package/dist/shadcn/ui/dialog.d.ts +1 -17
- package/dist/shadcn/ui/dialog.js +3 -38
- package/dist/shadcn/ui/drawer.d.ts +1 -13
- package/dist/shadcn/ui/drawer.js +3 -196
- package/dist/shadcn/ui/dropdown-menu.d.ts +1 -29
- package/dist/shadcn/ui/dropdown-menu.js +3 -52
- package/dist/shadcn/ui/empty.d.ts +1 -14
- package/dist/shadcn/ui/empty.js +3 -33
- package/dist/shadcn/ui/field.d.ts +1 -28
- package/dist/shadcn/ui/field.js +3 -68
- package/dist/shadcn/ui/hover-card.d.ts +1 -5
- package/dist/shadcn/ui/hover-card.js +3 -14
- package/dist/shadcn/ui/input-group.d.ts +1 -28
- package/dist/shadcn/ui/input-group.js +3 -58
- package/dist/shadcn/ui/input.d.ts +1 -3
- package/dist/shadcn/ui/input.js +3 -8
- package/dist/shadcn/ui/item.d.ts +1 -34
- package/dist/shadcn/ui/item.js +3 -79
- package/dist/shadcn/ui/kbd.d.ts +1 -3
- package/dist/shadcn/ui/kbd.js +3 -9
- package/dist/shadcn/ui/label.d.ts +1 -3
- package/dist/shadcn/ui/label.js +3 -8
- package/dist/shadcn/ui/menubar.d.ts +1 -29
- package/dist/shadcn/ui/menubar.js +3 -57
- package/dist/shadcn/ui/navigation-menu.d.ts +1 -13
- package/dist/shadcn/ui/navigation-menu.js +3 -31
- package/dist/shadcn/ui/pagination.d.ts +1 -17
- package/dist/shadcn/ui/pagination.js +3 -27
- package/dist/shadcn/ui/popover.d.ts +1 -9
- package/dist/shadcn/ui/popover.js +3 -24
- package/dist/shadcn/ui/progress.d.ts +1 -7
- package/dist/shadcn/ui/progress.js +3 -20
- package/dist/shadcn/ui/radio-group.d.ts +1 -5
- package/dist/shadcn/ui/radio-group.js +3 -12
- package/dist/shadcn/ui/scroll-area.d.ts +1 -5
- package/dist/shadcn/ui/scroll-area.js +3 -12
- package/dist/shadcn/ui/select.d.ts +1 -15
- package/dist/shadcn/ui/select.js +3 -35
- package/dist/shadcn/ui/separator.d.ts +1 -3
- package/dist/shadcn/ui/separator.js +3 -8
- package/dist/shadcn/ui/sheet.d.ts +1 -14
- package/dist/shadcn/ui/sheet.js +3 -38
- package/dist/shadcn/ui/sidebar.d.ts +1 -70
- package/dist/shadcn/ui/sidebar.js +3 -256
- package/dist/shadcn/ui/skeleton.d.ts +1 -2
- package/dist/shadcn/ui/skeleton.js +3 -6
- package/dist/shadcn/ui/slider.d.ts +1 -3
- package/dist/shadcn/ui/slider.js +3 -12
- package/dist/shadcn/ui/spinner.d.ts +1 -2
- package/dist/shadcn/ui/spinner.js +3 -7
- package/dist/shadcn/ui/switch.d.ts +1 -5
- package/dist/shadcn/ui/switch.js +3 -8
- package/dist/shadcn/ui/table.d.ts +1 -10
- package/dist/shadcn/ui/table.js +3 -29
- package/dist/shadcn/ui/tabs.d.ts +1 -13
- package/dist/shadcn/ui/tabs.js +3 -29
- package/dist/shadcn/ui/textarea.d.ts +1 -3
- package/dist/shadcn/ui/textarea.js +3 -7
- package/dist/shadcn/ui/toggle-group.d.ts +1 -11
- package/dist/shadcn/ui/toggle-group.js +3 -25
- package/dist/shadcn/ui/toggle.d.ts +1 -15
- package/dist/shadcn/ui/toggle.js +3 -26
- package/dist/shadcn/ui/tooltip.d.ts +1 -6
- package/dist/shadcn/ui/tooltip.js +3 -17
- package/dist/ui/accordion.d.ts +21 -0
- package/dist/ui/accordion.js +67 -0
- package/dist/ui/alert-dialog.d.ts +32 -0
- package/dist/ui/alert-dialog.js +102 -0
- package/dist/ui/alert.d.ts +13 -0
- package/dist/ui/alert.js +28 -0
- package/dist/ui/aspect-ratio.d.ts +5 -0
- package/dist/ui/aspect-ratio.js +9 -0
- package/dist/ui/avatar.d.ts +14 -0
- package/dist/ui/avatar.js +49 -0
- package/dist/ui/badge.d.ts +22 -0
- package/dist/ui/badge.js +26 -0
- package/dist/ui/breadcrumb.d.ts +13 -0
- package/dist/ui/breadcrumb.js +29 -0
- package/dist/ui/button-group.d.ts +21 -0
- package/dist/ui/button-group.js +29 -0
- package/dist/ui/button.d.ts +38 -0
- package/dist/ui/button.js +49 -0
- package/dist/ui/calendar.d.ts +13 -0
- package/dist/ui/calendar.js +75 -0
- package/dist/ui/card.d.ts +11 -0
- package/dist/ui/card.js +25 -0
- package/dist/ui/checkbox.d.ts +17 -0
- package/dist/ui/checkbox.js +25 -0
- package/dist/ui/collapsible.d.ts +11 -0
- package/dist/ui/collapsible.js +40 -0
- package/dist/ui/command.d.ts +19 -0
- package/dist/ui/command.js +35 -0
- package/dist/ui/context-menu.d.ts +53 -0
- package/dist/ui/context-menu.js +372 -0
- package/dist/ui/dialog.d.ts +40 -0
- package/dist/ui/dialog.js +109 -0
- package/dist/ui/drawer.d.ts +36 -0
- package/dist/ui/drawer.js +243 -0
- package/dist/ui/dropdown-menu.d.ts +61 -0
- package/dist/ui/dropdown-menu.js +347 -0
- package/dist/ui/empty.d.ts +14 -0
- package/dist/ui/empty.js +33 -0
- package/dist/ui/field.d.ts +28 -0
- package/dist/ui/field.js +68 -0
- package/dist/ui/hover-card.d.ts +32 -0
- package/dist/ui/hover-card.js +119 -0
- package/dist/ui/input-group.d.ts +28 -0
- package/dist/ui/input-group.js +58 -0
- package/dist/ui/input.d.ts +3 -0
- package/dist/ui/input.js +7 -0
- package/dist/ui/item.d.ts +41 -0
- package/dist/ui/item.js +69 -0
- package/dist/ui/kbd.d.ts +4 -0
- package/dist/ui/kbd.js +10 -0
- package/dist/ui/label.d.ts +3 -0
- package/dist/ui/label.js +8 -0
- package/dist/ui/menubar.d.ts +59 -0
- package/dist/ui/menubar.js +397 -0
- package/dist/ui/navigation-menu.d.ts +24 -0
- package/dist/ui/navigation-menu.js +203 -0
- package/dist/ui/pagination.d.ts +17 -0
- package/dist/ui/pagination.js +36 -0
- package/dist/ui/popover.d.ts +25 -0
- package/dist/ui/popover.js +126 -0
- package/dist/ui/portal.d.ts +7 -0
- package/dist/ui/portal.js +12 -0
- package/dist/ui/progress.d.ts +15 -0
- package/dist/ui/progress.js +36 -0
- package/dist/ui/radio-group.d.ts +17 -0
- package/dist/ui/radio-group.js +66 -0
- package/dist/ui/scroll-area.d.ts +9 -0
- package/dist/ui/scroll-area.js +72 -0
- package/dist/ui/select.d.ts +37 -0
- package/dist/ui/select.js +226 -0
- package/dist/ui/separator.d.ts +14 -0
- package/dist/ui/separator.js +13 -0
- package/dist/ui/sheet.d.ts +31 -0
- package/dist/ui/sheet.js +121 -0
- package/dist/ui/sidebar.d.ts +86 -0
- package/dist/ui/sidebar.js +211 -0
- package/dist/ui/skeleton.d.ts +3 -0
- package/dist/ui/skeleton.js +7 -0
- package/dist/ui/slider.d.ts +18 -0
- package/dist/ui/slider.js +94 -0
- package/dist/ui/slot.d.ts +27 -0
- package/dist/ui/slot.js +62 -0
- package/dist/ui/spinner.d.ts +3 -0
- package/dist/ui/spinner.js +8 -0
- package/dist/ui/switch.d.ts +17 -0
- package/dist/ui/switch.js +23 -0
- package/dist/ui/table.d.ts +10 -0
- package/dist/ui/table.js +29 -0
- package/dist/ui/tabs.d.ts +29 -0
- package/dist/ui/tabs.js +96 -0
- package/dist/ui/textarea.d.ts +3 -0
- package/dist/ui/textarea.js +7 -0
- package/dist/ui/toggle-group.d.ts +23 -0
- package/dist/ui/toggle-group.js +52 -0
- package/dist/ui/toggle.d.ts +25 -0
- package/dist/ui/toggle.js +41 -0
- package/dist/ui/tooltip.d.ts +25 -0
- package/dist/ui/tooltip.js +90 -0
- package/dist/ui/use-controllable-state.d.ts +10 -0
- package/dist/ui/use-controllable-state.js +17 -0
- package/dist/ui/use-dismiss.d.ts +10 -0
- package/dist/ui/use-dismiss.js +51 -0
- package/dist/ui/use-floating.d.ts +42 -0
- package/dist/ui/use-floating.js +136 -0
- package/dist/ui/use-presence.d.ts +8 -0
- package/dist/ui/use-presence.js +48 -0
- package/dist/ui/use-typeahead.d.ts +19 -0
- package/dist/ui/use-typeahead.js +64 -0
- package/package.json +6 -1
- package/dist/shadcn/lib/base-ui/LICENSE +0 -21
- package/dist/shadcn/lib/base-ui/_chunk-000kmre8.js +0 -150
- package/dist/shadcn/lib/base-ui/_chunk-1vw45v38.js +0 -64
- package/dist/shadcn/lib/base-ui/_chunk-23rx7haq.js +0 -81
- package/dist/shadcn/lib/base-ui/_chunk-242gh8ph.js +0 -230
- package/dist/shadcn/lib/base-ui/_chunk-26cc610z.js +0 -6
- package/dist/shadcn/lib/base-ui/_chunk-2z044bba.js +0 -5890
- package/dist/shadcn/lib/base-ui/_chunk-3cpd1vjz.js +0 -13
- package/dist/shadcn/lib/base-ui/_chunk-3enq1vat.js +0 -82
- package/dist/shadcn/lib/base-ui/_chunk-3xpke33f.js +0 -23
- package/dist/shadcn/lib/base-ui/_chunk-451nqgsa.js +0 -6
- package/dist/shadcn/lib/base-ui/_chunk-4maf6pas.js +0 -11
- package/dist/shadcn/lib/base-ui/_chunk-4zhfq4d3.js +0 -16
- package/dist/shadcn/lib/base-ui/_chunk-5gaqyne5.js +0 -21
- package/dist/shadcn/lib/base-ui/_chunk-5tt5hk59.js +0 -4
- package/dist/shadcn/lib/base-ui/_chunk-5tze5c8q.js +0 -13
- package/dist/shadcn/lib/base-ui/_chunk-5xmdvndx.js +0 -225
- package/dist/shadcn/lib/base-ui/_chunk-6adaer33.js +0 -435
- package/dist/shadcn/lib/base-ui/_chunk-6ejf1z1r.js +0 -9
- package/dist/shadcn/lib/base-ui/_chunk-6kqramh9.js +0 -27
- package/dist/shadcn/lib/base-ui/_chunk-7b9dc493.js +0 -14
- package/dist/shadcn/lib/base-ui/_chunk-8a9vv8am.js +0 -89
- package/dist/shadcn/lib/base-ui/_chunk-8ctgmf06.js +0 -129
- package/dist/shadcn/lib/base-ui/_chunk-8ganmsbg.js +0 -54
- package/dist/shadcn/lib/base-ui/_chunk-8xaqxgck.js +0 -15
- package/dist/shadcn/lib/base-ui/_chunk-95tf2rxq.js +0 -62
- package/dist/shadcn/lib/base-ui/_chunk-9x63vfqj.js +0 -70
- package/dist/shadcn/lib/base-ui/_chunk-ase0ydtt.js +0 -9
- package/dist/shadcn/lib/base-ui/_chunk-b0nc8wq7.js +0 -34
- package/dist/shadcn/lib/base-ui/_chunk-b5ya6xds.js +0 -10
- package/dist/shadcn/lib/base-ui/_chunk-b6dkjkbw.js +0 -43
- package/dist/shadcn/lib/base-ui/_chunk-c2bz952e.js +0 -19
- package/dist/shadcn/lib/base-ui/_chunk-cdgfsr3q.js +0 -15
- package/dist/shadcn/lib/base-ui/_chunk-cdj8cpx5.js +0 -347
- package/dist/shadcn/lib/base-ui/_chunk-cgptgywc.js +0 -104
- package/dist/shadcn/lib/base-ui/_chunk-cwvtvwc7.js +0 -35
- package/dist/shadcn/lib/base-ui/_chunk-dan0mva4.js +0 -23
- package/dist/shadcn/lib/base-ui/_chunk-dzvjwv25.js +0 -0
- package/dist/shadcn/lib/base-ui/_chunk-e13rsb6b.js +0 -184
- package/dist/shadcn/lib/base-ui/_chunk-e56mpvk1.js +0 -118
- package/dist/shadcn/lib/base-ui/_chunk-e6k2ecs7.js +0 -48
- package/dist/shadcn/lib/base-ui/_chunk-ebyxgtb4.js +0 -29
- package/dist/shadcn/lib/base-ui/_chunk-f2wttwrf.js +0 -39
- package/dist/shadcn/lib/base-ui/_chunk-fdzctasg.js +0 -38
- package/dist/shadcn/lib/base-ui/_chunk-ffpjy0ta.js +0 -39
- package/dist/shadcn/lib/base-ui/_chunk-fqry7pew.js +0 -603
- package/dist/shadcn/lib/base-ui/_chunk-ghn1tzt8.js +0 -84
- package/dist/shadcn/lib/base-ui/_chunk-gy0bpkmx.js +0 -12
- package/dist/shadcn/lib/base-ui/_chunk-hm5h9vsk.js +0 -16
- package/dist/shadcn/lib/base-ui/_chunk-htdj1jps.js +0 -833
- package/dist/shadcn/lib/base-ui/_chunk-j29xjete.js +0 -146
- package/dist/shadcn/lib/base-ui/_chunk-j3qkyd10.js +0 -50
- package/dist/shadcn/lib/base-ui/_chunk-ktvsd5k6.js +0 -2386
- package/dist/shadcn/lib/base-ui/_chunk-kw8nnq00.js +0 -546
- package/dist/shadcn/lib/base-ui/_chunk-m307wpdj.js +0 -18
- package/dist/shadcn/lib/base-ui/_chunk-mnd0j7v9.js +0 -15
- package/dist/shadcn/lib/base-ui/_chunk-n11h505c.js +0 -32
- package/dist/shadcn/lib/base-ui/_chunk-p0e2qacz.js +0 -26
- package/dist/shadcn/lib/base-ui/_chunk-pv7b791x.js +0 -106
- package/dist/shadcn/lib/base-ui/_chunk-q5cg71p7.js +0 -83
- package/dist/shadcn/lib/base-ui/_chunk-qbezxj1g.js +0 -385
- package/dist/shadcn/lib/base-ui/_chunk-qmsqz6nt.js +0 -15
- package/dist/shadcn/lib/base-ui/_chunk-rrh8rt4v.js +0 -65
- package/dist/shadcn/lib/base-ui/_chunk-s5pwkz8v.js +0 -25
- package/dist/shadcn/lib/base-ui/_chunk-svxv97ph.js +0 -218
- package/dist/shadcn/lib/base-ui/_chunk-t7ppm3t0.js +0 -68
- package/dist/shadcn/lib/base-ui/_chunk-vg16xxmb.js +0 -52
- package/dist/shadcn/lib/base-ui/_chunk-vgkfmtbe.js +0 -21
- package/dist/shadcn/lib/base-ui/_chunk-watha94s.js +0 -14
- package/dist/shadcn/lib/base-ui/_chunk-wdqynnjf.js +0 -35
- package/dist/shadcn/lib/base-ui/_chunk-wx2nxg0p.js +0 -15
- package/dist/shadcn/lib/base-ui/_chunk-x11e1k9r.js +0 -0
- package/dist/shadcn/lib/base-ui/_chunk-x8xehj6d.js +0 -302
- package/dist/shadcn/lib/base-ui/_chunk-xcqbtm2f.js +0 -28
- package/dist/shadcn/lib/base-ui/_chunk-ytnp24gq.js +0 -328
- package/dist/shadcn/lib/base-ui/_chunk-yzr7eg4b.js +0 -6
- package/dist/shadcn/lib/base-ui/_chunk-zk4mtm9m.js +0 -9
- package/dist/shadcn/lib/base-ui/accordion.d.ts +0 -447
- package/dist/shadcn/lib/base-ui/accordion.js +0 -630
- package/dist/shadcn/lib/base-ui/alert-dialog.d.ts +0 -1467
- package/dist/shadcn/lib/base-ui/alert-dialog.js +0 -98
- package/dist/shadcn/lib/base-ui/avatar.d.ts +0 -123
- package/dist/shadcn/lib/base-ui/avatar.js +0 -235
- package/dist/shadcn/lib/base-ui/button.d.ts +0 -84
- package/dist/shadcn/lib/base-ui/button.js +0 -51
- package/dist/shadcn/lib/base-ui/checkbox.d.ts +0 -341
- package/dist/shadcn/lib/base-ui/checkbox.js +0 -501
- package/dist/shadcn/lib/base-ui/collapsible.d.ts +0 -291
- package/dist/shadcn/lib/base-ui/collapsible.js +0 -264
- package/dist/shadcn/lib/base-ui/context-menu.d.ts +0 -2213
- package/dist/shadcn/lib/base-ui/context-menu.js +0 -323
- package/dist/shadcn/lib/base-ui/dialog.d.ts +0 -1448
- package/dist/shadcn/lib/base-ui/dialog.js +0 -79
- package/dist/shadcn/lib/base-ui/input.d.ts +0 -506
- package/dist/shadcn/lib/base-ui/input.js +0 -1027
- package/dist/shadcn/lib/base-ui/menu.d.ts +0 -2275
- package/dist/shadcn/lib/base-ui/menu.js +0 -60
- package/dist/shadcn/lib/base-ui/menubar.d.ts +0 -48
- package/dist/shadcn/lib/base-ui/menubar.js +0 -156
- package/dist/shadcn/lib/base-ui/merge-props.d.ts +0 -70
- package/dist/shadcn/lib/base-ui/merge-props.js +0 -15
- package/dist/shadcn/lib/base-ui/navigation-menu.d.ts +0 -825
- package/dist/shadcn/lib/base-ui/navigation-menu.js +0 -1849
- package/dist/shadcn/lib/base-ui/popover.d.ts +0 -1743
- package/dist/shadcn/lib/base-ui/popover.js +0 -1089
- package/dist/shadcn/lib/base-ui/preview-card.d.ts +0 -1608
- package/dist/shadcn/lib/base-ui/preview-card.js +0 -919
- package/dist/shadcn/lib/base-ui/progress.d.ts +0 -172
- package/dist/shadcn/lib/base-ui/progress.js +0 -272
- package/dist/shadcn/lib/base-ui/radio-group.d.ts +0 -260
- package/dist/shadcn/lib/base-ui/radio-group.js +0 -239
- package/dist/shadcn/lib/base-ui/radio.d.ts +0 -176
- package/dist/shadcn/lib/base-ui/radio.js +0 -387
- package/dist/shadcn/lib/base-ui/scroll-area.d.ts +0 -241
- package/dist/shadcn/lib/base-ui/scroll-area.js +0 -1055
- package/dist/shadcn/lib/base-ui/select.d.ts +0 -1266
- package/dist/shadcn/lib/base-ui/select.js +0 -2450
- package/dist/shadcn/lib/base-ui/separator.d.ts +0 -76
- package/dist/shadcn/lib/base-ui/separator.js +0 -11
- package/dist/shadcn/lib/base-ui/slider.d.ts +0 -551
- package/dist/shadcn/lib/base-ui/slider.js +0 -1583
- package/dist/shadcn/lib/base-ui/switch.d.ts +0 -313
- package/dist/shadcn/lib/base-ui/switch.js +0 -326
- package/dist/shadcn/lib/base-ui/tabs.d.ts +0 -406
- package/dist/shadcn/lib/base-ui/tabs.js +0 -915
- package/dist/shadcn/lib/base-ui/toggle-group.d.ts +0 -235
- package/dist/shadcn/lib/base-ui/toggle-group.js +0 -145
- package/dist/shadcn/lib/base-ui/toggle.d.ts +0 -224
- package/dist/shadcn/lib/base-ui/toggle.js +0 -127
- package/dist/shadcn/lib/base-ui/tooltip.d.ts +0 -1656
- package/dist/shadcn/lib/base-ui/tooltip.js +0 -920
- package/dist/shadcn/lib/base-ui/use-render.d.ts +0 -87
- package/dist/shadcn/lib/base-ui/use-render.js +0 -15
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../shadcn/lib/utils.js";
|
|
5
|
+
import { mergeRefs } from "./slot.js";
|
|
6
|
+
import { Portal } from "./portal.js";
|
|
7
|
+
import { useFloating } from "./use-floating.js";
|
|
8
|
+
import { usePresence } from "./use-presence.js";
|
|
9
|
+
import { useControllableState } from "./use-controllable-state.js";
|
|
10
|
+
import { useTypeahead } from "./use-typeahead.js";
|
|
11
|
+
import { ChevronDownIcon, CheckIcon } from "../icons/index.js";
|
|
12
|
+
const SelectContext = React.createContext(null);
|
|
13
|
+
function useSelect() {
|
|
14
|
+
const ctx = React.useContext(SelectContext);
|
|
15
|
+
if (!ctx)
|
|
16
|
+
throw new Error("Select parts must be used within <Select>");
|
|
17
|
+
return ctx;
|
|
18
|
+
}
|
|
19
|
+
function Select({ value, defaultValue, onValueChange, open, defaultOpen = false, onOpenChange, children, }) {
|
|
20
|
+
const [selected, setSelected] = useControllableState({
|
|
21
|
+
value,
|
|
22
|
+
defaultValue,
|
|
23
|
+
onChange: onValueChange,
|
|
24
|
+
});
|
|
25
|
+
const [isOpen, setOpen] = useControllableState({
|
|
26
|
+
value: open,
|
|
27
|
+
defaultValue: defaultOpen,
|
|
28
|
+
onChange: onOpenChange,
|
|
29
|
+
});
|
|
30
|
+
const triggerRef = React.useRef(null);
|
|
31
|
+
const contentId = React.useId();
|
|
32
|
+
const [labels, setLabels] = React.useState({});
|
|
33
|
+
const registerLabel = React.useCallback((v, label) => setLabels((prev) => ({ ...prev, [v]: label })), []);
|
|
34
|
+
const unregisterLabel = React.useCallback((v) => setLabels((prev) => {
|
|
35
|
+
const { [v]: _, ...rest } = prev;
|
|
36
|
+
return rest;
|
|
37
|
+
}), []);
|
|
38
|
+
const setValue = React.useCallback((v) => {
|
|
39
|
+
setSelected(v);
|
|
40
|
+
setOpen(false);
|
|
41
|
+
triggerRef.current?.focus();
|
|
42
|
+
}, [setSelected, setOpen]);
|
|
43
|
+
return (_jsx(SelectContext.Provider, { value: {
|
|
44
|
+
open: isOpen,
|
|
45
|
+
setOpen,
|
|
46
|
+
value: selected,
|
|
47
|
+
setValue,
|
|
48
|
+
triggerRef,
|
|
49
|
+
contentId,
|
|
50
|
+
labels,
|
|
51
|
+
registerLabel,
|
|
52
|
+
unregisterLabel,
|
|
53
|
+
}, children: children }));
|
|
54
|
+
}
|
|
55
|
+
function SelectGroup({ className, ...props }) {
|
|
56
|
+
return (_jsx("div", { role: "group", "data-slot": "select-group", className: cn("scroll-my-1 p-1", className), ...props }));
|
|
57
|
+
}
|
|
58
|
+
function SelectValue({ className, placeholder, ...props }) {
|
|
59
|
+
const { value, labels } = useSelect();
|
|
60
|
+
const label = value !== undefined ? labels[value] : undefined;
|
|
61
|
+
return (_jsx("span", { "data-slot": "select-value", "data-placeholder": value === undefined ? "" : undefined, className: cn("flex flex-1 text-left", className), ...props, children: label ?? placeholder ?? null }));
|
|
62
|
+
}
|
|
63
|
+
function SelectTrigger({ className, size = "default", children, onClick, onKeyDown, ...props }) {
|
|
64
|
+
const { open, setOpen, value, triggerRef, contentId } = useSelect();
|
|
65
|
+
return (_jsxs("button", { ref: triggerRef, type: "button", role: "combobox", "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": open ? contentId : undefined, "data-slot": "select-trigger", "data-size": size, "data-state": open ? "open" : "closed", "data-placeholder": value === undefined ? "" : undefined, className: cn("flex w-fit cursor-pointer items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), onClick: (e) => {
|
|
66
|
+
onClick?.(e);
|
|
67
|
+
if (!e.defaultPrevented)
|
|
68
|
+
setOpen(!open);
|
|
69
|
+
}, onKeyDown: (e) => {
|
|
70
|
+
onKeyDown?.(e);
|
|
71
|
+
if (e.defaultPrevented)
|
|
72
|
+
return;
|
|
73
|
+
if (e.key === "ArrowDown" || e.key === "Enter" || e.key === " ") {
|
|
74
|
+
e.preventDefault();
|
|
75
|
+
setOpen(true);
|
|
76
|
+
}
|
|
77
|
+
}, ...props, children: [children, _jsx(ChevronDownIcon, {})] }));
|
|
78
|
+
}
|
|
79
|
+
function optionsOf(container) {
|
|
80
|
+
return Array.from(container.querySelectorAll('[role="option"]:not([data-disabled])'));
|
|
81
|
+
}
|
|
82
|
+
function SelectContent({ className, children, side = "bottom", sideOffset = 4, align = "center", alignOffset = 0, onKeyDown, ...props }) {
|
|
83
|
+
const { open, setOpen, value, triggerRef, contentId } = useSelect();
|
|
84
|
+
const [mounted, presenceRef] = usePresence(open);
|
|
85
|
+
const { floatingRef, pos } = useFloating(triggerRef, mounted, {
|
|
86
|
+
side,
|
|
87
|
+
align,
|
|
88
|
+
sideOffset,
|
|
89
|
+
alignOffset,
|
|
90
|
+
});
|
|
91
|
+
const containerRef = React.useRef(null);
|
|
92
|
+
const { onTypeaheadKeyDown } = useTypeahead();
|
|
93
|
+
// Focus the selected (or first) option once the popup is actually visible.
|
|
94
|
+
const didFocus = React.useRef(false);
|
|
95
|
+
React.useEffect(() => {
|
|
96
|
+
if (!open) {
|
|
97
|
+
didFocus.current = false;
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
let raf = 0;
|
|
101
|
+
const tryFocus = () => {
|
|
102
|
+
const c = containerRef.current;
|
|
103
|
+
if (c && getComputedStyle(c).visibility !== "hidden") {
|
|
104
|
+
didFocus.current = true;
|
|
105
|
+
const opts = optionsOf(c);
|
|
106
|
+
const selected = opts.find((o) => o.getAttribute("data-value") === value);
|
|
107
|
+
(selected ?? opts[0])?.focus();
|
|
108
|
+
}
|
|
109
|
+
else if (!didFocus.current) {
|
|
110
|
+
raf = requestAnimationFrame(tryFocus);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
raf = requestAnimationFrame(tryFocus);
|
|
114
|
+
return () => cancelAnimationFrame(raf);
|
|
115
|
+
}, [open, value]);
|
|
116
|
+
React.useEffect(() => {
|
|
117
|
+
if (!open)
|
|
118
|
+
return;
|
|
119
|
+
const onPointerDown = (e) => {
|
|
120
|
+
const t = e.target;
|
|
121
|
+
if (triggerRef.current?.contains(t))
|
|
122
|
+
return;
|
|
123
|
+
if (containerRef.current?.contains(t))
|
|
124
|
+
return;
|
|
125
|
+
setOpen(false);
|
|
126
|
+
};
|
|
127
|
+
document.addEventListener("pointerdown", onPointerDown, true);
|
|
128
|
+
return () => {
|
|
129
|
+
document.removeEventListener("pointerdown", onPointerDown, true);
|
|
130
|
+
};
|
|
131
|
+
}, [open, setOpen, triggerRef]);
|
|
132
|
+
// While closed, render the items into a hidden tree so their value→label
|
|
133
|
+
// mappings register — this lets SelectValue show the selected label on initial
|
|
134
|
+
// render, before the listbox has ever been opened.
|
|
135
|
+
if (!mounted) {
|
|
136
|
+
return (_jsx("div", { hidden: true, "aria-hidden": true, "data-slot": "select-content-registry", children: children }));
|
|
137
|
+
}
|
|
138
|
+
const triggerWidth = triggerRef.current?.offsetWidth;
|
|
139
|
+
return (_jsx(Portal, { children: _jsx("div", { ref: mergeRefs(floatingRef, presenceRef, containerRef), id: contentId, role: "listbox", tabIndex: -1, "data-slot": "select-content", "data-state": open ? "open" : "closed", "data-open": open ? "" : undefined, "data-closed": open ? undefined : "", "data-side": pos?.side ?? side, style: {
|
|
140
|
+
position: "fixed",
|
|
141
|
+
left: pos?.x ?? 0,
|
|
142
|
+
top: pos?.y ?? 0,
|
|
143
|
+
minWidth: triggerWidth,
|
|
144
|
+
visibility: pos ? "visible" : "hidden",
|
|
145
|
+
["--transform-origin"]: pos?.transformOrigin ?? "center",
|
|
146
|
+
["--available-height"]: pos ? `${pos.availableHeight}px` : undefined,
|
|
147
|
+
}, onPointerMove: (e) => {
|
|
148
|
+
const opt = e.target.closest('[role="option"]:not([data-disabled])');
|
|
149
|
+
if (opt && opt !== document.activeElement)
|
|
150
|
+
opt.focus();
|
|
151
|
+
}, onKeyDown: (e) => {
|
|
152
|
+
onKeyDown?.(e);
|
|
153
|
+
if (e.defaultPrevented)
|
|
154
|
+
return;
|
|
155
|
+
const c = containerRef.current;
|
|
156
|
+
const opts = optionsOf(c);
|
|
157
|
+
const idx = opts.indexOf(document.activeElement);
|
|
158
|
+
if (e.key === "ArrowDown") {
|
|
159
|
+
e.preventDefault();
|
|
160
|
+
opts[idx < 0 ? 0 : (idx + 1) % opts.length]?.focus();
|
|
161
|
+
}
|
|
162
|
+
else if (e.key === "ArrowUp") {
|
|
163
|
+
e.preventDefault();
|
|
164
|
+
opts[idx < 0 ? opts.length - 1 : (idx - 1 + opts.length) % opts.length]?.focus();
|
|
165
|
+
}
|
|
166
|
+
else if (e.key === "Home") {
|
|
167
|
+
e.preventDefault();
|
|
168
|
+
opts[0]?.focus();
|
|
169
|
+
}
|
|
170
|
+
else if (e.key === "End") {
|
|
171
|
+
e.preventDefault();
|
|
172
|
+
opts[opts.length - 1]?.focus();
|
|
173
|
+
}
|
|
174
|
+
else if (e.key === "Escape") {
|
|
175
|
+
e.preventDefault();
|
|
176
|
+
setOpen(false);
|
|
177
|
+
triggerRef.current?.focus();
|
|
178
|
+
}
|
|
179
|
+
else if (e.key === "Enter" || e.key === " ") {
|
|
180
|
+
const active = document.activeElement;
|
|
181
|
+
if (active && c.contains(active) && active.getAttribute("role") === "option") {
|
|
182
|
+
e.preventDefault();
|
|
183
|
+
active.click();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const match = onTypeaheadKeyDown(e, opts, idx);
|
|
188
|
+
if (match) {
|
|
189
|
+
e.preventDefault();
|
|
190
|
+
match.focus();
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}, className: cn("relative isolate z-50 max-h-(--available-height) min-w-36 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-md bg-popover p-1 text-popover-foreground shadow-md ring-1 ring-foreground/10 duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95", className), ...props, children: children }) }));
|
|
194
|
+
}
|
|
195
|
+
function SelectLabel({ className, ...props }) {
|
|
196
|
+
return (_jsx("div", { "data-slot": "select-label", className: cn("px-2 py-1.5 text-xs text-muted-foreground", className), ...props }));
|
|
197
|
+
}
|
|
198
|
+
function SelectItem({ className, children, value, disabled, onClick, ...props }) {
|
|
199
|
+
const ctx = useSelect();
|
|
200
|
+
const selected = ctx.value === value;
|
|
201
|
+
// Register the value→label mapping. Kept sticky (no unregister on unmount) so
|
|
202
|
+
// SelectValue can still render the selected label after the list closes and
|
|
203
|
+
// its items unmount.
|
|
204
|
+
const { registerLabel } = ctx;
|
|
205
|
+
React.useEffect(() => {
|
|
206
|
+
registerLabel(value, children);
|
|
207
|
+
}, [value, children, registerLabel]);
|
|
208
|
+
return (_jsxs("div", { role: "option", tabIndex: -1, "aria-selected": selected, "aria-disabled": disabled || undefined, "data-slot": "select-item", "data-value": value, "data-disabled": disabled ? "" : undefined, className: cn("relative flex w-full cursor-pointer items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className), onClick: (e) => {
|
|
209
|
+
if (disabled)
|
|
210
|
+
return;
|
|
211
|
+
onClick?.(e);
|
|
212
|
+
if (!e.defaultPrevented)
|
|
213
|
+
ctx.setValue(value);
|
|
214
|
+
}, ...props, children: [_jsx("span", { className: "flex flex-1 shrink-0 items-center gap-2 whitespace-nowrap", children: children }), selected ? (_jsx("span", { className: "pointer-events-none absolute right-2 flex size-4 items-center justify-center", children: _jsx(CheckIcon, {}) })) : null] }));
|
|
215
|
+
}
|
|
216
|
+
function SelectSeparator({ className, ...props }) {
|
|
217
|
+
return (_jsx("div", { role: "separator", "data-slot": "select-separator", className: cn("pointer-events-none -mx-1 my-1 h-px bg-border", className), ...props }));
|
|
218
|
+
}
|
|
219
|
+
/** No-op scroll buttons — native overflow handles scrolling. Kept for API parity. */
|
|
220
|
+
function SelectScrollUpButton(_props) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
function SelectScrollDownButton(_props) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
export interface SeparatorProps extends React.ComponentProps<"div"> {
|
|
3
|
+
orientation?: "horizontal" | "vertical";
|
|
4
|
+
/** Set true for a purely-visual divider hidden from a11y. Defaults to false
|
|
5
|
+
* so the separator keeps `role="separator"` semantics (matches the spec). */
|
|
6
|
+
decorative?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Self-contained separator: a styled `<div>` with the correct ARIA role and
|
|
10
|
+
* orientation. No primitive framework, no `data-orientation` style bridge —
|
|
11
|
+
* orientation classes are applied directly.
|
|
12
|
+
*/
|
|
13
|
+
declare function Separator({ className, orientation, decorative, ...props }: SeparatorProps): React.JSX.Element;
|
|
14
|
+
export { Separator };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../shadcn/lib/utils.js";
|
|
5
|
+
/**
|
|
6
|
+
* Self-contained separator: a styled `<div>` with the correct ARIA role and
|
|
7
|
+
* orientation. No primitive framework, no `data-orientation` style bridge —
|
|
8
|
+
* orientation classes are applied directly.
|
|
9
|
+
*/
|
|
10
|
+
function Separator({ className, orientation = "horizontal", decorative = false, ...props }) {
|
|
11
|
+
return (_jsx("div", { "data-slot": "separator", "data-orientation": orientation, role: decorative ? "none" : "separator", "aria-orientation": decorative ? undefined : orientation, className: cn("shrink-0 bg-border", orientation === "horizontal" ? "h-px w-full" : "w-px self-stretch", className), ...props }));
|
|
12
|
+
}
|
|
13
|
+
export { Separator };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
type SheetSide = "top" | "right" | "bottom" | "left";
|
|
3
|
+
export interface SheetProps {
|
|
4
|
+
open?: boolean;
|
|
5
|
+
defaultOpen?: boolean;
|
|
6
|
+
onOpenChange?: (open: boolean) => void;
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/** Self-contained sheet (drawer) on native `<dialog>`, sliding in from an edge.
|
|
10
|
+
* Exit slide is preserved via {@link usePresence} before `dialog.close()`. */
|
|
11
|
+
declare function Sheet({ open, defaultOpen, onOpenChange, children }: SheetProps): React.JSX.Element;
|
|
12
|
+
declare function SheetTrigger({ asChild, render, nativeButton: _nativeButton, children, onClick, ...props }: React.ComponentProps<"button"> & {
|
|
13
|
+
asChild?: boolean;
|
|
14
|
+
render?: React.ReactElement;
|
|
15
|
+
nativeButton?: boolean;
|
|
16
|
+
}): React.JSX.Element;
|
|
17
|
+
declare function SheetClose({ asChild, render, nativeButton: _nativeButton, children, onClick, ...props }: React.ComponentProps<"button"> & {
|
|
18
|
+
asChild?: boolean;
|
|
19
|
+
render?: React.ReactElement;
|
|
20
|
+
nativeButton?: boolean;
|
|
21
|
+
}): React.JSX.Element;
|
|
22
|
+
export interface SheetContentProps extends React.ComponentProps<"dialog"> {
|
|
23
|
+
side?: SheetSide;
|
|
24
|
+
showCloseButton?: boolean;
|
|
25
|
+
}
|
|
26
|
+
declare function SheetContent({ className, children, side, showCloseButton, ...props }: SheetContentProps): React.JSX.Element | null;
|
|
27
|
+
declare function SheetHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
28
|
+
declare function SheetFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
29
|
+
declare function SheetTitle({ className, ...props }: React.ComponentProps<"h2">): React.JSX.Element;
|
|
30
|
+
declare function SheetDescription({ className, ...props }: React.ComponentProps<"p">): React.JSX.Element;
|
|
31
|
+
export { Sheet, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, };
|
package/dist/ui/sheet.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { cn } from "../shadcn/lib/utils.js";
|
|
5
|
+
import { Button } from "./button.js";
|
|
6
|
+
import { Slot, mergeRefs, resolveRender } from "./slot.js";
|
|
7
|
+
import { XIcon } from "../icons/index.js";
|
|
8
|
+
import { useControllableState } from "./use-controllable-state.js";
|
|
9
|
+
import { usePresence } from "./use-presence.js";
|
|
10
|
+
const SheetContext = React.createContext(null);
|
|
11
|
+
function useSheet() {
|
|
12
|
+
const ctx = React.useContext(SheetContext);
|
|
13
|
+
if (!ctx)
|
|
14
|
+
throw new Error("Sheet parts must be used within <Sheet>");
|
|
15
|
+
return ctx;
|
|
16
|
+
}
|
|
17
|
+
/** Self-contained sheet (drawer) on native `<dialog>`, sliding in from an edge.
|
|
18
|
+
* Exit slide is preserved via {@link usePresence} before `dialog.close()`. */
|
|
19
|
+
function Sheet({ open, defaultOpen = false, onOpenChange, children }) {
|
|
20
|
+
const [isOpen, setOpen] = useControllableState({
|
|
21
|
+
value: open,
|
|
22
|
+
defaultValue: defaultOpen,
|
|
23
|
+
onChange: onOpenChange,
|
|
24
|
+
});
|
|
25
|
+
const titleId = React.useId();
|
|
26
|
+
const descriptionId = React.useId();
|
|
27
|
+
return (_jsx(SheetContext.Provider, { value: { open: isOpen, setOpen, titleId, descriptionId }, children: children }));
|
|
28
|
+
}
|
|
29
|
+
function SheetTrigger({ asChild = false, render, nativeButton: _nativeButton, children, onClick, ...props }) {
|
|
30
|
+
const { open, setOpen } = useSheet();
|
|
31
|
+
const { useSlot, slotChild } = resolveRender(asChild, render, children);
|
|
32
|
+
const Comp = useSlot ? Slot : "button";
|
|
33
|
+
return (_jsx(Comp, { type: useSlot ? undefined : "button", "data-slot": "sheet-trigger", "aria-haspopup": "dialog", "data-state": open ? "open" : "closed", onClick: (e) => {
|
|
34
|
+
onClick?.(e);
|
|
35
|
+
if (!e.defaultPrevented)
|
|
36
|
+
setOpen(true);
|
|
37
|
+
}, ...props, children: slotChild }));
|
|
38
|
+
}
|
|
39
|
+
function SheetClose({ asChild = false, render, nativeButton: _nativeButton, children, onClick, ...props }) {
|
|
40
|
+
const { setOpen } = useSheet();
|
|
41
|
+
const { useSlot, slotChild } = resolveRender(asChild, render, children);
|
|
42
|
+
const Comp = useSlot ? Slot : "button";
|
|
43
|
+
return (_jsx(Comp, { type: useSlot ? undefined : "button", "data-slot": "sheet-close", onClick: (e) => {
|
|
44
|
+
onClick?.(e);
|
|
45
|
+
if (!e.defaultPrevented)
|
|
46
|
+
setOpen(false);
|
|
47
|
+
}, ...props, children: slotChild }));
|
|
48
|
+
}
|
|
49
|
+
// `left-auto`/`right-auto`/etc. override the native <dialog> UA inset (left:0),
|
|
50
|
+
// otherwise `right-0` + a width would still anchor to the left edge.
|
|
51
|
+
const SIDE_POSITION = {
|
|
52
|
+
right: "inset-y-0 right-0 left-auto h-full w-3/4 border-l sm:max-w-sm",
|
|
53
|
+
left: "inset-y-0 left-0 right-auto h-full w-3/4 border-r sm:max-w-sm",
|
|
54
|
+
top: "inset-x-0 top-0 bottom-auto h-auto border-b",
|
|
55
|
+
bottom: "inset-x-0 bottom-0 top-auto h-auto border-t",
|
|
56
|
+
};
|
|
57
|
+
const SIDE_IN = {
|
|
58
|
+
right: "slide-in-from-right-52",
|
|
59
|
+
left: "slide-in-from-left-52",
|
|
60
|
+
top: "slide-in-from-top-52",
|
|
61
|
+
bottom: "slide-in-from-bottom-52",
|
|
62
|
+
};
|
|
63
|
+
const SIDE_OUT = {
|
|
64
|
+
right: "slide-out-to-right-52",
|
|
65
|
+
left: "slide-out-to-left-52",
|
|
66
|
+
top: "slide-out-to-top-52",
|
|
67
|
+
bottom: "slide-out-to-bottom-52",
|
|
68
|
+
};
|
|
69
|
+
function SheetContent({ className, children, side = "right", showCloseButton = true, ...props }) {
|
|
70
|
+
const { open, setOpen, titleId, descriptionId } = useSheet();
|
|
71
|
+
const ref = React.useRef(null);
|
|
72
|
+
const pointerDownOnBackdrop = React.useRef(false);
|
|
73
|
+
const [mounted, presenceRef] = usePresence(open);
|
|
74
|
+
React.useEffect(() => {
|
|
75
|
+
const node = ref.current;
|
|
76
|
+
if (!node)
|
|
77
|
+
return;
|
|
78
|
+
if (mounted && !node.open)
|
|
79
|
+
node.showModal();
|
|
80
|
+
else if (!mounted && node.open)
|
|
81
|
+
node.close();
|
|
82
|
+
}, [mounted]);
|
|
83
|
+
React.useEffect(() => {
|
|
84
|
+
if (!mounted)
|
|
85
|
+
return;
|
|
86
|
+
const prev = document.body.style.overflow;
|
|
87
|
+
document.body.style.overflow = "hidden";
|
|
88
|
+
return () => {
|
|
89
|
+
document.body.style.overflow = prev;
|
|
90
|
+
};
|
|
91
|
+
}, [mounted]);
|
|
92
|
+
if (!mounted)
|
|
93
|
+
return null;
|
|
94
|
+
return (_jsxs("dialog", { ...props, ref: mergeRefs(ref, presenceRef), "aria-labelledby": titleId, "aria-describedby": descriptionId, "data-slot": "sheet-content", "data-side": side, "data-state": open ? "open" : "closed", "data-open": open ? "" : undefined, "data-closed": open ? undefined : "", onCancel: (e) => {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
setOpen(false);
|
|
97
|
+
}, onClose: () => setOpen(false), onPointerDown: (e) => {
|
|
98
|
+
pointerDownOnBackdrop.current = e.target === ref.current;
|
|
99
|
+
}, onClick: (e) => {
|
|
100
|
+
if (e.target === ref.current && pointerDownOnBackdrop.current) {
|
|
101
|
+
setOpen(false);
|
|
102
|
+
}
|
|
103
|
+
}, className: cn("m-0 flex max-h-none flex-col gap-4 bg-background bg-clip-padding p-0 text-sm text-foreground shadow-lg backdrop:bg-black/10 backdrop:duration-150 supports-backdrop-filter:backdrop:backdrop-blur-xs fixed", SIDE_POSITION[side], open
|
|
104
|
+
? `animate-in fade-in-0 ${SIDE_IN[side]} duration-200`
|
|
105
|
+
: `animate-out fade-out-0 ${SIDE_OUT[side]} duration-200`, className), children: [children, showCloseButton && (_jsx(SheetClose, { asChild: true, children: _jsxs(Button, { variant: "ghost", className: "absolute top-4 right-4", size: "icon-sm", children: [_jsx(XIcon, {}), _jsx("span", { className: "sr-only", children: "Close" })] }) }))] }));
|
|
106
|
+
}
|
|
107
|
+
function SheetHeader({ className, ...props }) {
|
|
108
|
+
return (_jsx("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-1.5 p-4", className), ...props }));
|
|
109
|
+
}
|
|
110
|
+
function SheetFooter({ className, ...props }) {
|
|
111
|
+
return (_jsx("div", { "data-slot": "sheet-footer", className: cn("mt-auto flex flex-col gap-2 p-4", className), ...props }));
|
|
112
|
+
}
|
|
113
|
+
function SheetTitle({ className, ...props }) {
|
|
114
|
+
const { titleId } = useSheet();
|
|
115
|
+
return (_jsx("h2", { id: titleId, "data-slot": "sheet-title", className: cn("font-medium text-foreground", className), ...props }));
|
|
116
|
+
}
|
|
117
|
+
function SheetDescription({ className, ...props }) {
|
|
118
|
+
const { descriptionId } = useSheet();
|
|
119
|
+
return (_jsx("p", { id: descriptionId, "data-slot": "sheet-description", className: cn("text-sm text-muted-foreground", className), ...props }));
|
|
120
|
+
}
|
|
121
|
+
export { Sheet, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription, };
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type VariantProps } from "../shadcn/lib/cva.js";
|
|
3
|
+
import { Button } from "./button.js";
|
|
4
|
+
import { Input } from "./input.js";
|
|
5
|
+
import { Separator } from "./separator.js";
|
|
6
|
+
import { TooltipContent } from "./tooltip.js";
|
|
7
|
+
type SidebarContextProps = {
|
|
8
|
+
state: "expanded" | "collapsed";
|
|
9
|
+
open: boolean;
|
|
10
|
+
setOpen: (open: boolean) => void;
|
|
11
|
+
openMobile: boolean;
|
|
12
|
+
setOpenMobile: (open: boolean) => void;
|
|
13
|
+
isMobile: boolean;
|
|
14
|
+
toggleSidebar: () => void;
|
|
15
|
+
};
|
|
16
|
+
declare function useSidebar(): SidebarContextProps;
|
|
17
|
+
declare function SidebarProvider({ defaultOpen, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props }: React.ComponentProps<"div"> & {
|
|
18
|
+
defaultOpen?: boolean;
|
|
19
|
+
open?: boolean;
|
|
20
|
+
onOpenChange?: (open: boolean) => void;
|
|
21
|
+
}): React.JSX.Element;
|
|
22
|
+
declare function Sidebar({ side, variant, collapsible, className, children, dir, ...props }: React.ComponentProps<"div"> & {
|
|
23
|
+
side?: "left" | "right";
|
|
24
|
+
variant?: "sidebar" | "floating" | "inset";
|
|
25
|
+
collapsible?: "offcanvas" | "icon" | "none";
|
|
26
|
+
}): React.JSX.Element;
|
|
27
|
+
declare function SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>): React.JSX.Element;
|
|
28
|
+
declare function SidebarRail({ className, ...props }: React.ComponentProps<"button">): React.JSX.Element;
|
|
29
|
+
declare function SidebarInset({ className, ...props }: React.ComponentProps<"main">): React.JSX.Element;
|
|
30
|
+
declare function SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>): React.JSX.Element;
|
|
31
|
+
declare function SidebarHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
32
|
+
declare function SidebarFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
33
|
+
declare function SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>): React.JSX.Element;
|
|
34
|
+
declare function SidebarContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
35
|
+
declare function SidebarGroup({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
36
|
+
declare function SidebarGroupLabel({ className, asChild, render, nativeButton: _nativeButton, children, ...props }: React.ComponentProps<"div"> & {
|
|
37
|
+
asChild?: boolean;
|
|
38
|
+
render?: React.ReactElement;
|
|
39
|
+
nativeButton?: boolean;
|
|
40
|
+
}): React.JSX.Element;
|
|
41
|
+
declare function SidebarGroupAction({ className, asChild, render, nativeButton: _nativeButton, children, ...props }: React.ComponentProps<"button"> & {
|
|
42
|
+
asChild?: boolean;
|
|
43
|
+
render?: React.ReactElement;
|
|
44
|
+
nativeButton?: boolean;
|
|
45
|
+
}): React.JSX.Element;
|
|
46
|
+
declare function SidebarGroupContent({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
47
|
+
declare function SidebarMenu({ className, ...props }: React.ComponentProps<"ul">): React.JSX.Element;
|
|
48
|
+
declare function SidebarMenuItem({ className, ...props }: React.ComponentProps<"li">): React.JSX.Element;
|
|
49
|
+
declare const sidebarMenuButtonVariants: (props?: import("../shadcn/lib/cva.js").CvaProps<{
|
|
50
|
+
variant: {
|
|
51
|
+
default: string;
|
|
52
|
+
outline: string;
|
|
53
|
+
};
|
|
54
|
+
size: {
|
|
55
|
+
default: string;
|
|
56
|
+
sm: string;
|
|
57
|
+
lg: string;
|
|
58
|
+
};
|
|
59
|
+
}> | undefined) => string;
|
|
60
|
+
declare function SidebarMenuButton({ asChild, render, nativeButton: _nativeButton, children, isActive, variant, size, tooltip, className, ...props }: React.ComponentProps<"button"> & {
|
|
61
|
+
asChild?: boolean;
|
|
62
|
+
render?: React.ReactElement;
|
|
63
|
+
nativeButton?: boolean;
|
|
64
|
+
isActive?: boolean;
|
|
65
|
+
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
|
|
66
|
+
} & VariantProps<typeof sidebarMenuButtonVariants>): React.JSX.Element;
|
|
67
|
+
declare function SidebarMenuAction({ className, asChild, render, nativeButton: _nativeButton, children, showOnHover, ...props }: React.ComponentProps<"button"> & {
|
|
68
|
+
asChild?: boolean;
|
|
69
|
+
render?: React.ReactElement;
|
|
70
|
+
nativeButton?: boolean;
|
|
71
|
+
showOnHover?: boolean;
|
|
72
|
+
}): React.JSX.Element;
|
|
73
|
+
declare function SidebarMenuBadge({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
74
|
+
declare function SidebarMenuSkeleton({ className, showIcon, ...props }: React.ComponentProps<"div"> & {
|
|
75
|
+
showIcon?: boolean;
|
|
76
|
+
}): React.JSX.Element;
|
|
77
|
+
declare function SidebarMenuSub({ className, ...props }: React.ComponentProps<"ul">): React.JSX.Element;
|
|
78
|
+
declare function SidebarMenuSubItem({ className, ...props }: React.ComponentProps<"li">): React.JSX.Element;
|
|
79
|
+
declare function SidebarMenuSubButton({ asChild, render, nativeButton: _nativeButton, children, size, isActive, className, ...props }: React.ComponentProps<"a"> & {
|
|
80
|
+
asChild?: boolean;
|
|
81
|
+
render?: React.ReactElement;
|
|
82
|
+
nativeButton?: boolean;
|
|
83
|
+
size?: "sm" | "md";
|
|
84
|
+
isActive?: boolean;
|
|
85
|
+
}): React.JSX.Element;
|
|
86
|
+
export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, };
|