@stacksjs/components 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +477 -0
- package/dist/Accordion-x2gjedap.stx +108 -0
- package/dist/Audio-0fk6p9tn.stx +50 -0
- package/dist/Avatar-5m0v0s4x.stx +88 -0
- package/dist/Badge-ynes82vv.stx +70 -0
- package/dist/Breadcrumb-h9n427sk.stx +79 -0
- package/dist/Button-7xtrzn14.stx +89 -0
- package/dist/Calendar-egvx1pma.stx +232 -0
- package/dist/Card-r9w7vy1a.stx +74 -0
- package/dist/Checkbox-m8v46pmx.stx +92 -0
- package/dist/Checkout-vcnnr176.stx +39 -0
- package/dist/CodeBlock-mwex82cm.stx +57 -0
- package/dist/Combobox-npb08vkp.stx +13 -0
- package/dist/ComboboxButton-vcdyq4zw.stx +13 -0
- package/dist/ComboboxInput-c9d2p02m.stx +25 -0
- package/dist/ComboboxOption-7d0h9ash.stx +52 -0
- package/dist/ComboboxOptions-4dtqc0qa.stx +12 -0
- package/dist/CommandPalette-ah00bf8v.stx +39 -0
- package/dist/CommandPaletteItem-2yx0gvtj.stx +32 -0
- package/dist/DefaultPaymentMethod-emw5fg8s.stx +62 -0
- package/dist/Dialog-1w4rz7x0.stx +19 -0
- package/dist/DialogBackdrop-qbm3y5ab.stx +9 -0
- package/dist/DialogDescription-01w5j74b.stx +11 -0
- package/dist/DialogPanel-brsszrrs.stx +16 -0
- package/dist/DialogTitle-3rxhwg21.stx +11 -0
- package/dist/Drawer-yfaz8q7f.stx +137 -0
- package/dist/Dropdown-ng7nx556.stx +24 -0
- package/dist/DropdownButton-vc4zpyrb.stx +23 -0
- package/dist/DropdownItem-z491y23c.stx +43 -0
- package/dist/DropdownItems-7ykf29sj.stx +18 -0
- package/dist/EmailInput-bfshpj92.stx +41 -0
- package/dist/Footer-xdaf02nr.stx +66 -0
- package/dist/Form-z4f7w6r1.stx +209 -0
- package/dist/Hero-9vvp7pxf.stx +25 -0
- package/dist/Image-ktk0451c.stx +197 -0
- package/dist/Installation-33bj4rm7.stx +39 -0
- package/dist/Listbox-xcejcmyc.stx +14 -0
- package/dist/ListboxButton-nx5kmw19.stx +17 -0
- package/dist/ListboxLabel-aky8a73n.stx +11 -0
- package/dist/ListboxOption-6h4hsdz5.stx +57 -0
- package/dist/ListboxOptions-2sacdtm5.stx +16 -0
- package/dist/Login-s2jkvd9y.stx +163 -0
- package/dist/Navigator-tqqdgdkw.stx +138 -0
- package/dist/Notification-sry8egea.stx +71 -0
- package/dist/NumberInput-zm93ddfw.stx +138 -0
- package/dist/Pagination-yza9v4qw.stx +183 -0
- package/dist/PasswordInput-4xnndp5y.stx +155 -0
- package/dist/PaymentMethods-jxba6kek.stx +113 -0
- package/dist/Popover-scbqatjq.stx +24 -0
- package/dist/PopoverButton-rbxhzj4k.stx +23 -0
- package/dist/PopoverPanel-9ng1rm6e.stx +23 -0
- package/dist/Portal-j111yvqp.stx +74 -0
- package/dist/Progress-gbmw3akr.stx +142 -0
- package/dist/Radio-1n9qamv1.stx +81 -0
- package/dist/RadioGroup-12dw2vhk.stx +13 -0
- package/dist/RadioGroupDescription-bjm3mdht.stx +11 -0
- package/dist/RadioGroupLabel-aky8a73n.stx +11 -0
- package/dist/RadioGroupOption-9pcxgwmd.stx +51 -0
- package/dist/SearchInput-g240e2nq.stx +63 -0
- package/dist/Select-p9f94b20.stx +89 -0
- package/dist/Sidebar-gwxw8q38.stx +288 -0
- package/dist/SidebarFooter-887kxret.stx +95 -0
- package/dist/SidebarHeader-qjeyx0hv.stx +100 -0
- package/dist/SidebarItem-4dpwtmb4.stx +118 -0
- package/dist/SidebarSection-kh92fk4m.stx +108 -0
- package/dist/Signup-3nxq5zag.stx +161 -0
- package/dist/Skeleton-g0nx1njm.stx +48 -0
- package/dist/Spinner-w4zj58xp.stx +109 -0
- package/dist/Stepper-rwc5actp.stx +17 -0
- package/dist/StepperStep-h0k657nm.stx +53 -0
- package/dist/SubscriptionCheckout-4cbxdg7w.stx +353 -0
- package/dist/Switch-kjq8qd2p.stx +74 -0
- package/dist/Table-59j9qwp0.stx +14 -0
- package/dist/TableBody-reka2gwv.stx +10 -0
- package/dist/TableCell-j7nh4sgr.stx +10 -0
- package/dist/TableHead-ecbrwpqm.stx +10 -0
- package/dist/TableHeader-jn2shwsv.stx +13 -0
- package/dist/TableRow-xz8rrxhc.stx +11 -0
- package/dist/Tabs-kb6ex6m7.stx +145 -0
- package/dist/Teleport-819cg9zm.stx +101 -0
- package/dist/TextInput-zx9kgr79.stx +146 -0
- package/dist/Textarea-5xvmrb0z.stx +119 -0
- package/dist/Tooltip-5ehqsy49.stx +76 -0
- package/dist/Transition-2j39s044.stx +174 -0
- package/dist/TwoFactorChallenge-2q4gg89m.stx +125 -0
- package/dist/Video-6aq4shh4.stx +45 -0
- package/dist/VirtualList-weh5qtm1.stx +83 -0
- package/dist/VirtualTable-59a1eskc.stx +113 -0
- package/dist/components/index.d.ts +4 -0
- package/dist/composables/index.d.ts +4 -0
- package/dist/composables/index.js +3 -0
- package/dist/composables/useCopyCode.d.ts +19 -0
- package/dist/composables/useDarkMode.d.ts +25 -0
- package/dist/composables/useSEO.d.ts +36 -0
- package/dist/composables/utilities/index.d.ts +5 -0
- package/dist/composables/utilities/useClickOutside.d.ts +28 -0
- package/dist/composables/utilities/useFocusTrap.d.ts +34 -0
- package/dist/composables/utilities/useKeyboard.d.ts +55 -0
- package/dist/composables/utilities/useLocalStorage.d.ts +33 -0
- package/dist/composables/utilities/useMediaQuery.d.ts +64 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +19 -0
- package/dist/ui/accordion/index.d.ts +12 -0
- package/dist/ui/audio/index.d.ts +12 -0
- package/dist/ui/auth/index.d.ts +29 -0
- package/dist/ui/avatar/index.d.ts +11 -0
- package/dist/ui/badge/index.d.ts +9 -0
- package/dist/ui/breadcrumb/index.d.ts +13 -0
- package/dist/ui/button/index.d.ts +45 -0
- package/dist/ui/calendar/index.d.ts +13 -0
- package/dist/ui/card/index.d.ts +12 -0
- package/dist/ui/checkbox/index.d.ts +15 -0
- package/dist/ui/combobox/index.d.ts +35 -0
- package/dist/ui/command-palette/index.d.ts +13 -0
- package/dist/ui/dialog/index.d.ts +27 -0
- package/dist/ui/drawer/index.d.ts +8 -0
- package/dist/ui/dropdown/index.d.ts +25 -0
- package/dist/ui/form/index.d.ts +48 -0
- package/dist/ui/image/index.d.ts +21 -0
- package/dist/ui/input/index.d.ts +73 -0
- package/dist/ui/listbox/index.d.ts +34 -0
- package/dist/ui/navigator/index.d.ts +18 -0
- package/dist/ui/notification/index.d.ts +11 -0
- package/dist/ui/pagination/index.d.ts +10 -0
- package/dist/ui/payment/index.d.ts +53 -0
- package/dist/ui/popover/index.d.ts +19 -0
- package/dist/ui/portal/index.d.ts +5 -0
- package/dist/ui/progress/index.d.ts +11 -0
- package/dist/ui/radio/index.d.ts +14 -0
- package/dist/ui/radio-group/index.d.ts +26 -0
- package/dist/ui/select/index.d.ts +19 -0
- package/dist/ui/sidebar/index.d.ts +129 -0
- package/dist/ui/skeleton/index.d.ts +10 -0
- package/dist/ui/spinner/index.d.ts +8 -0
- package/dist/ui/stepper/index.d.ts +17 -0
- package/dist/ui/storage/index.d.ts +40 -0
- package/dist/ui/switch/index.d.ts +9 -0
- package/dist/ui/table/index.d.ts +29 -0
- package/dist/ui/tabs/index.d.ts +14 -0
- package/dist/ui/teleport/index.d.ts +6 -0
- package/dist/ui/textarea/index.d.ts +19 -0
- package/dist/ui/tooltip/index.d.ts +9 -0
- package/dist/ui/transition/index.d.ts +24 -0
- package/dist/ui/video/index.d.ts +15 -0
- package/dist/ui/virtual-list/index.d.ts +9 -0
- package/dist/ui/virtual-table/index.d.ts +19 -0
- package/dist/utils/accessibility.d.ts +285 -0
- package/dist/utils/animation/easing.d.ts +112 -0
- package/dist/utils/animation/helpers.d.ts +119 -0
- package/dist/utils/animation/index.d.ts +3 -0
- package/dist/utils/animation/keyframes.d.ts +334 -0
- package/dist/utils/error-handling.d.ts +182 -0
- package/dist/utils/highlighter.d.ts +27 -0
- package/dist/utils/highlighter.js +2 -0
- package/dist/utils/i18n.d.ts +245 -0
- package/dist/utils/keep-alive.d.ts +171 -0
- package/dist/utils/lazy-loading.d.ts +174 -0
- package/dist/utils/prop-validation.d.ts +106 -0
- package/dist/utils/theme.d.ts +234 -0
- package/package.json +69 -0
- package/src/components/CodeBlock.stx +57 -0
- package/src/components/Footer.stx +66 -0
- package/src/components/Hero.stx +25 -0
- package/src/components/Installation.stx +39 -0
- package/src/components/index.ts +4 -0
- package/src/composables/index.ts +4 -0
- package/src/composables/useCopyCode.ts +73 -0
- package/src/composables/useDarkMode.ts +100 -0
- package/src/composables/useSEO.ts +229 -0
- package/src/composables/utilities/index.ts +7 -0
- package/src/composables/utilities/useClickOutside.ts +72 -0
- package/src/composables/utilities/useFocusTrap.ts +159 -0
- package/src/composables/utilities/useKeyboard.ts +124 -0
- package/src/composables/utilities/useLocalStorage.ts +132 -0
- package/src/composables/utilities/useMediaQuery.ts +118 -0
- package/src/index.ts +99 -0
- package/src/stx.d.ts +4 -0
- package/src/ui/accordion/Accordion.stx +108 -0
- package/src/ui/accordion/index.ts +14 -0
- package/src/ui/audio/Audio.stx +50 -0
- package/src/ui/audio/README.md +42 -0
- package/src/ui/audio/index.ts +13 -0
- package/src/ui/auth/Login.stx +163 -0
- package/src/ui/auth/README.md +145 -0
- package/src/ui/auth/Signup.stx +161 -0
- package/src/ui/auth/TwoFactorChallenge.stx +125 -0
- package/src/ui/auth/index.ts +32 -0
- package/src/ui/avatar/Avatar.stx +88 -0
- package/src/ui/avatar/index.ts +12 -0
- package/src/ui/badge/Badge.stx +70 -0
- package/src/ui/badge/index.ts +10 -0
- package/src/ui/breadcrumb/Breadcrumb.stx +79 -0
- package/src/ui/breadcrumb/index.ts +15 -0
- package/src/ui/button/Button.stx +89 -0
- package/src/ui/button/README.md +100 -0
- package/src/ui/button/index.ts +85 -0
- package/src/ui/calendar/Calendar.stx +232 -0
- package/src/ui/calendar/README.md +254 -0
- package/src/ui/calendar/index.ts +14 -0
- package/src/ui/card/Card.stx +74 -0
- package/src/ui/card/index.ts +13 -0
- package/src/ui/checkbox/Checkbox.stx +92 -0
- package/src/ui/checkbox/index.ts +16 -0
- package/src/ui/combobox/Combobox.stx +13 -0
- package/src/ui/combobox/ComboboxButton.stx +13 -0
- package/src/ui/combobox/ComboboxInput.stx +25 -0
- package/src/ui/combobox/ComboboxOption.stx +52 -0
- package/src/ui/combobox/ComboboxOptions.stx +12 -0
- package/src/ui/combobox/README.md +154 -0
- package/src/ui/combobox/index.ts +40 -0
- package/src/ui/command-palette/CommandPalette.stx +39 -0
- package/src/ui/command-palette/CommandPaletteItem.stx +32 -0
- package/src/ui/command-palette/README.md +42 -0
- package/src/ui/command-palette/index.ts +15 -0
- package/src/ui/dialog/Dialog.stx +19 -0
- package/src/ui/dialog/DialogBackdrop.stx +9 -0
- package/src/ui/dialog/DialogDescription.stx +11 -0
- package/src/ui/dialog/DialogPanel.stx +16 -0
- package/src/ui/dialog/DialogTitle.stx +11 -0
- package/src/ui/dialog/README.md +133 -0
- package/src/ui/dialog/index.ts +32 -0
- package/src/ui/drawer/Drawer.stx +137 -0
- package/src/ui/drawer/README.md +110 -0
- package/src/ui/drawer/index.ts +9 -0
- package/src/ui/dropdown/Dropdown.stx +24 -0
- package/src/ui/dropdown/DropdownButton.stx +23 -0
- package/src/ui/dropdown/DropdownItem.stx +43 -0
- package/src/ui/dropdown/DropdownItems.stx +18 -0
- package/src/ui/dropdown/README.md +142 -0
- package/src/ui/dropdown/index.ts +29 -0
- package/src/ui/form/Form.stx +209 -0
- package/src/ui/form/index.ts +67 -0
- package/src/ui/heatmap/Heatmap.stx +315 -0
- package/src/ui/image/Image.stx +197 -0
- package/src/ui/image/README.md +171 -0
- package/src/ui/image/index.ts +22 -0
- package/src/ui/input/EmailInput.stx +41 -0
- package/src/ui/input/NumberInput.stx +138 -0
- package/src/ui/input/PasswordInput.stx +155 -0
- package/src/ui/input/SearchInput.stx +63 -0
- package/src/ui/input/TextInput.stx +146 -0
- package/src/ui/input/index.ts +180 -0
- package/src/ui/listbox/Listbox.stx +14 -0
- package/src/ui/listbox/ListboxButton.stx +17 -0
- package/src/ui/listbox/ListboxLabel.stx +11 -0
- package/src/ui/listbox/ListboxOption.stx +57 -0
- package/src/ui/listbox/ListboxOptions.stx +16 -0
- package/src/ui/listbox/README.md +143 -0
- package/src/ui/listbox/index.ts +39 -0
- package/src/ui/navigator/Navigator.stx +138 -0
- package/src/ui/navigator/README.md +352 -0
- package/src/ui/navigator/index.ts +20 -0
- package/src/ui/notification/Notification.stx +71 -0
- package/src/ui/notification/README.md +118 -0
- package/src/ui/notification/index.ts +12 -0
- package/src/ui/pagination/Pagination.stx +183 -0
- package/src/ui/pagination/index.ts +11 -0
- package/src/ui/payment/Checkout.stx +39 -0
- package/src/ui/payment/DefaultPaymentMethod.stx +62 -0
- package/src/ui/payment/PaymentMethods.stx +113 -0
- package/src/ui/payment/README.md +427 -0
- package/src/ui/payment/SubscriptionCheckout.stx +353 -0
- package/src/ui/payment/index.ts +59 -0
- package/src/ui/popover/Popover.stx +24 -0
- package/src/ui/popover/PopoverButton.stx +23 -0
- package/src/ui/popover/PopoverPanel.stx +23 -0
- package/src/ui/popover/README.md +95 -0
- package/src/ui/popover/index.ts +22 -0
- package/src/ui/portal/Portal.stx +74 -0
- package/src/ui/portal/index.ts +6 -0
- package/src/ui/progress/Progress.stx +142 -0
- package/src/ui/progress/index.ts +12 -0
- package/src/ui/radio/Radio.stx +81 -0
- package/src/ui/radio/index.ts +15 -0
- package/src/ui/radio-group/README.md +145 -0
- package/src/ui/radio-group/RadioGroup.stx +13 -0
- package/src/ui/radio-group/RadioGroupDescription.stx +11 -0
- package/src/ui/radio-group/RadioGroupLabel.stx +11 -0
- package/src/ui/radio-group/RadioGroupOption.stx +51 -0
- package/src/ui/radio-group/index.ts +30 -0
- package/src/ui/select/README.md +204 -0
- package/src/ui/select/Select.stx +89 -0
- package/src/ui/select/index.ts +21 -0
- package/src/ui/sidebar/Sidebar.stx +288 -0
- package/src/ui/sidebar/SidebarFooter.stx +95 -0
- package/src/ui/sidebar/SidebarHeader.stx +100 -0
- package/src/ui/sidebar/SidebarItem.stx +118 -0
- package/src/ui/sidebar/SidebarSection.stx +108 -0
- package/src/ui/sidebar/index.ts +175 -0
- package/src/ui/skeleton/Skeleton.stx +48 -0
- package/src/ui/skeleton/index.ts +11 -0
- package/src/ui/spinner/Spinner.stx +109 -0
- package/src/ui/spinner/index.ts +9 -0
- package/src/ui/stepper/README.md +36 -0
- package/src/ui/stepper/Stepper.stx +17 -0
- package/src/ui/stepper/StepperStep.stx +53 -0
- package/src/ui/stepper/index.ts +19 -0
- package/src/ui/storage/README.md +193 -0
- package/src/ui/storage/index.ts +347 -0
- package/src/ui/switch/README.md +133 -0
- package/src/ui/switch/Switch.stx +74 -0
- package/src/ui/switch/index.ts +10 -0
- package/src/ui/table/README.md +39 -0
- package/src/ui/table/Table.stx +14 -0
- package/src/ui/table/TableBody.stx +10 -0
- package/src/ui/table/TableCell.stx +10 -0
- package/src/ui/table/TableHead.stx +10 -0
- package/src/ui/table/TableHeader.stx +13 -0
- package/src/ui/table/TableRow.stx +11 -0
- package/src/ui/table/index.ts +35 -0
- package/src/ui/tabs/Tabs.stx +145 -0
- package/src/ui/tabs/index.ts +16 -0
- package/src/ui/teleport/Teleport.stx +101 -0
- package/src/ui/teleport/index.ts +7 -0
- package/src/ui/textarea/Textarea.stx +119 -0
- package/src/ui/textarea/index.ts +20 -0
- package/src/ui/tooltip/Tooltip.stx +76 -0
- package/src/ui/tooltip/index.ts +10 -0
- package/src/ui/transition/README.md +30 -0
- package/src/ui/transition/Transition.stx +174 -0
- package/src/ui/transition/index.ts +25 -0
- package/src/ui/video/README.md +48 -0
- package/src/ui/video/Video.stx +45 -0
- package/src/ui/video/index.ts +16 -0
- package/src/ui/virtual-list/VirtualList.stx +83 -0
- package/src/ui/virtual-list/index.ts +10 -0
- package/src/ui/virtual-table/VirtualTable.stx +113 -0
- package/src/ui/virtual-table/index.ts +21 -0
- package/src/utils/PROP_VALIDATION.md +458 -0
- package/src/utils/THEME_SYSTEM.md +702 -0
- package/src/utils/accessibility.ts +841 -0
- package/src/utils/animation/easing.ts +368 -0
- package/src/utils/animation/helpers.ts +223 -0
- package/src/utils/animation/index.ts +5 -0
- package/src/utils/animation/keyframes.ts +230 -0
- package/src/utils/error-handling.ts +473 -0
- package/src/utils/highlighter.ts +93 -0
- package/src/utils/i18n.ts +634 -0
- package/src/utils/keep-alive.ts +818 -0
- package/src/utils/lazy-loading.ts +530 -0
- package/src/utils/prop-validation.ts +478 -0
- package/src/utils/theme.ts +626 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export const open = $props.open ?? false
|
|
3
|
+
export const onClose = $props.onClose || (() => {})
|
|
4
|
+
export const position = $props.position || 'right'
|
|
5
|
+
export const title = $props.title || ''
|
|
6
|
+
export const className = $props.className || ''
|
|
7
|
+
|
|
8
|
+
// Position classes
|
|
9
|
+
const positionClasses = {
|
|
10
|
+
right: 'inset-y-0 right-0 pl-10 sm:pl-16',
|
|
11
|
+
left: 'inset-y-0 left-0 pr-10 sm:pr-16',
|
|
12
|
+
top: 'inset-x-0 top-0 pb-10',
|
|
13
|
+
bottom: 'inset-x-0 bottom-0 pt-10',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Slide animation classes
|
|
17
|
+
const slideClasses = {
|
|
18
|
+
right: {
|
|
19
|
+
enter: 'translate-x-full',
|
|
20
|
+
leave: 'translate-x-0',
|
|
21
|
+
},
|
|
22
|
+
left: {
|
|
23
|
+
enter: '-translate-x-full',
|
|
24
|
+
leave: 'translate-x-0',
|
|
25
|
+
},
|
|
26
|
+
top: {
|
|
27
|
+
enter: '-translate-y-full',
|
|
28
|
+
leave: 'translate-y-0',
|
|
29
|
+
},
|
|
30
|
+
bottom: {
|
|
31
|
+
enter: 'translate-y-full',
|
|
32
|
+
leave: 'translate-y-0',
|
|
33
|
+
},
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Size classes based on position
|
|
37
|
+
const sizeClasses = {
|
|
38
|
+
right: 'max-w-md w-screen',
|
|
39
|
+
left: 'max-w-md w-screen',
|
|
40
|
+
top: 'max-h-[90vh] w-full',
|
|
41
|
+
bottom: 'max-h-[90vh] w-full',
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Close button position
|
|
45
|
+
const closeButtonPosition = {
|
|
46
|
+
right: 'left-0 -ml-8 sm:-ml-10',
|
|
47
|
+
left: 'right-0 -mr-8 sm:-mr-10',
|
|
48
|
+
top: 'right-0 -mr-8',
|
|
49
|
+
bottom: 'right-0 -mr-8',
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const containerClasses = `pointer-events-none fixed ${positionClasses[position]} flex max-w-full`.trim()
|
|
53
|
+
export const panelClasses = `pointer-events-auto relative ${sizeClasses[position]} ${className}`.trim()
|
|
54
|
+
export const slideAnimation = slideClasses[position]
|
|
55
|
+
export const closeButtonClasses = `absolute top-0 ${closeButtonPosition[position]} flex pt-4 pr-2 sm:pr-4`.trim()
|
|
56
|
+
</script>
|
|
57
|
+
|
|
58
|
+
@if(open)
|
|
59
|
+
<!-- Backdrop -->
|
|
60
|
+
<div
|
|
61
|
+
class="fixed inset-0 z-50 bg-gray-500/75 dark:bg-gray-900/75 transition-opacity duration-500"
|
|
62
|
+
style="animation: fadeIn 0.5s ease-in-out"
|
|
63
|
+
onclick="handleBackdropClick()"
|
|
64
|
+
></div>
|
|
65
|
+
|
|
66
|
+
<!-- Drawer Container -->
|
|
67
|
+
<div class="fixed inset-0 z-50 overflow-hidden">
|
|
68
|
+
<div class="absolute inset-0 overflow-hidden">
|
|
69
|
+
<div class="{{ containerClasses }}">
|
|
70
|
+
<!-- Drawer Panel -->
|
|
71
|
+
<div
|
|
72
|
+
class="{{ panelClasses }}"
|
|
73
|
+
style="animation: slideIn 0.5s ease-in-out"
|
|
74
|
+
>
|
|
75
|
+
<!-- Close Button -->
|
|
76
|
+
<div class="{{ closeButtonClasses }}">
|
|
77
|
+
<button
|
|
78
|
+
type="button"
|
|
79
|
+
class="relative rounded-md text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-white focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
|
|
80
|
+
onclick="handleClose()"
|
|
81
|
+
>
|
|
82
|
+
<span class="absolute -inset-2.5"></span>
|
|
83
|
+
<span class="sr-only">Close panel</span>
|
|
84
|
+
<svg class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" aria-hidden="true">
|
|
85
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
|
|
86
|
+
</svg>
|
|
87
|
+
</button>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<!-- Drawer Content -->
|
|
91
|
+
<div class="relative flex h-full flex-col overflow-y-auto bg-white dark:bg-blue-gray-800 py-6 shadow-xl">
|
|
92
|
+
@if(title)
|
|
93
|
+
<div class="px-4 sm:px-6">
|
|
94
|
+
<h2 class="text-base font-semibold text-gray-900 dark:text-gray-100">
|
|
95
|
+
{{ title }}
|
|
96
|
+
</h2>
|
|
97
|
+
</div>
|
|
98
|
+
@endif
|
|
99
|
+
<div class="relative mt-6 flex-1 px-4 sm:px-6">
|
|
100
|
+
<slot />
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
@endif
|
|
108
|
+
|
|
109
|
+
<style>
|
|
110
|
+
@keyframes fadeIn {
|
|
111
|
+
from { opacity: 0; }
|
|
112
|
+
to { opacity: 1; }
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@keyframes slideIn {
|
|
116
|
+
from {
|
|
117
|
+
transform: {{ position === 'right' ? 'translateX(100%)' : position === 'left' ? 'translateX(-100%)' : position === 'top' ? 'translateY(-100%)' : 'translateY(100%)' }};
|
|
118
|
+
}
|
|
119
|
+
to {
|
|
120
|
+
transform: translate(0, 0);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
</style>
|
|
124
|
+
|
|
125
|
+
<script>
|
|
126
|
+
function handleClose() {
|
|
127
|
+
if (onClose) {
|
|
128
|
+
onClose()
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function handleBackdropClick() {
|
|
133
|
+
if (onClose) {
|
|
134
|
+
onClose()
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
</script>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# Drawer Component
|
|
2
|
+
|
|
3
|
+
A slide-out panel component that can appear from any side of the screen.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bun add @stacksjs/components
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```stx
|
|
14
|
+
<script>
|
|
15
|
+
export let drawerOpen = false
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<button
|
|
19
|
+
class="rounded-md bg-gray-950/5 px-2.5 py-1.5 text-sm font-semibold text-gray-900 hover:bg-gray-950/10"
|
|
20
|
+
onclick="drawerOpen = true"
|
|
21
|
+
>
|
|
22
|
+
Open drawer
|
|
23
|
+
</button>
|
|
24
|
+
|
|
25
|
+
@component('Drawer', {
|
|
26
|
+
open: drawerOpen,
|
|
27
|
+
onClose: () => drawerOpen = false,
|
|
28
|
+
position: 'right',
|
|
29
|
+
title: 'Panel title'
|
|
30
|
+
})
|
|
31
|
+
<p class="text-sm text-gray-500 dark:text-gray-400">
|
|
32
|
+
Your drawer content goes here.
|
|
33
|
+
</p>
|
|
34
|
+
@endcomponent
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Props
|
|
38
|
+
|
|
39
|
+
| Prop | Type | Default | Description |
|
|
40
|
+
|------|------|---------|-------------|
|
|
41
|
+
| `open` | `boolean` | `false` | Controls drawer visibility |
|
|
42
|
+
| `onClose` | `function` | - | Callback when drawer should close |
|
|
43
|
+
| `position` | `'right' \| 'left' \| 'top' \| 'bottom'` | `'right'` | Position of the drawer |
|
|
44
|
+
| `title` | `string` | `''` | Optional title for the drawer |
|
|
45
|
+
| `className` | `string` | `''` | Additional CSS classes |
|
|
46
|
+
|
|
47
|
+
## Positions
|
|
48
|
+
|
|
49
|
+
### Right (default)
|
|
50
|
+
```stx
|
|
51
|
+
@component('Drawer', {
|
|
52
|
+
open: true,
|
|
53
|
+
position: 'right'
|
|
54
|
+
})
|
|
55
|
+
Content
|
|
56
|
+
@endcomponent
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Left
|
|
60
|
+
```stx
|
|
61
|
+
@component('Drawer', {
|
|
62
|
+
open: true,
|
|
63
|
+
position: 'left'
|
|
64
|
+
})
|
|
65
|
+
Content
|
|
66
|
+
@endcomponent
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Top
|
|
70
|
+
```stx
|
|
71
|
+
@component('Drawer', {
|
|
72
|
+
open: true,
|
|
73
|
+
position: 'top'
|
|
74
|
+
})
|
|
75
|
+
Content
|
|
76
|
+
@endcomponent
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Bottom
|
|
80
|
+
```stx
|
|
81
|
+
@component('Drawer', {
|
|
82
|
+
open: true,
|
|
83
|
+
position: 'bottom'
|
|
84
|
+
})
|
|
85
|
+
Content
|
|
86
|
+
@endcomponent
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Features
|
|
90
|
+
|
|
91
|
+
- **4 positions** - Slide from right, left, top, or bottom
|
|
92
|
+
- **Smooth animations** - CSS transitions for slide and fade effects
|
|
93
|
+
- **Backdrop click** - Closes drawer when clicking outside
|
|
94
|
+
- **Close button** - Positioned appropriately for each direction
|
|
95
|
+
- **Dark mode** - Full dark mode support
|
|
96
|
+
- **Accessible** - Screen reader support and focus management
|
|
97
|
+
- **Responsive** - Mobile-friendly with adjusted spacing
|
|
98
|
+
- **Modern ES modules** - Clean export syntax
|
|
99
|
+
- **Headwind styling** - Utility-first CSS classes
|
|
100
|
+
|
|
101
|
+
## Accessibility
|
|
102
|
+
|
|
103
|
+
- Close button includes `sr-only` text for screen readers
|
|
104
|
+
- Backdrop and close button have proper ARIA labels
|
|
105
|
+
- Keyboard accessible (ESC key closes drawer - handled by parent)
|
|
106
|
+
- Focus management for modal behavior
|
|
107
|
+
|
|
108
|
+
## Customization
|
|
109
|
+
|
|
110
|
+
The drawer accepts a `className` prop for additional styling and supports slot content for complete customization of the drawer body.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export const className = $props.className || ''
|
|
3
|
+
export const as = $props.as || 'div'
|
|
4
|
+
export let isOpen = false
|
|
5
|
+
|
|
6
|
+
export function toggle() {
|
|
7
|
+
isOpen = !isOpen
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export function close() {
|
|
11
|
+
isOpen = false
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function open() {
|
|
15
|
+
isOpen = true
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const baseClasses = 'relative inline-block text-left'
|
|
19
|
+
const dropdownClasses = `${baseClasses} ${className}`.trim()
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<component :is="{{ as }}" class="{{ dropdownClasses }}">
|
|
23
|
+
<slot :isOpen="isOpen" :toggle="toggle" :close="close" :open="open" />
|
|
24
|
+
</component>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export const className = $props.className || ''
|
|
3
|
+
export const as = $props.as || 'button'
|
|
4
|
+
export const disabled = $props.disabled || false
|
|
5
|
+
export const onClick = $props.onClick
|
|
6
|
+
|
|
7
|
+
const baseClasses = 'inline-flex justify-center items-center rounded-md focus:outline-none focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75'
|
|
8
|
+
const buttonClasses = `${baseClasses} ${className}`.trim()
|
|
9
|
+
|
|
10
|
+
export function handleClick(e) {
|
|
11
|
+
if (disabled) return
|
|
12
|
+
onClick?.(e)
|
|
13
|
+
}
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<component
|
|
17
|
+
:is="{{ as }}"
|
|
18
|
+
class="{{ buttonClasses }}"
|
|
19
|
+
@if(disabled)disabled aria-disabled="true"@endif
|
|
20
|
+
@click="handleClick"
|
|
21
|
+
>
|
|
22
|
+
<slot />
|
|
23
|
+
</component>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export const className = $props.className || ''
|
|
3
|
+
export const as = $props.as || 'div'
|
|
4
|
+
export const disabled = $props.disabled || false
|
|
5
|
+
export const onClick = $props.onClick
|
|
6
|
+
|
|
7
|
+
export let active = false
|
|
8
|
+
|
|
9
|
+
const baseClasses = 'group flex w-full items-center px-2 py-2 text-sm transition-colors'
|
|
10
|
+
const stateClasses = active
|
|
11
|
+
? 'bg-blue-500 text-white dark:bg-blue-600'
|
|
12
|
+
: 'text-neutral-900 dark:text-neutral-100'
|
|
13
|
+
const disabledClasses = disabled
|
|
14
|
+
? 'opacity-50 cursor-not-allowed'
|
|
15
|
+
: 'cursor-pointer'
|
|
16
|
+
|
|
17
|
+
const itemClasses = `${baseClasses} ${stateClasses} ${disabledClasses} ${className}`.trim()
|
|
18
|
+
|
|
19
|
+
export function handleClick(e) {
|
|
20
|
+
if (disabled) return
|
|
21
|
+
onClick?.(e)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function handleMouseEnter() {
|
|
25
|
+
if (!disabled) active = true
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function handleMouseLeave() {
|
|
29
|
+
active = false
|
|
30
|
+
}
|
|
31
|
+
</script>
|
|
32
|
+
|
|
33
|
+
<component
|
|
34
|
+
:is="{{ as }}"
|
|
35
|
+
class="{{ itemClasses }}"
|
|
36
|
+
role="menuitem"
|
|
37
|
+
@if(disabled)aria-disabled="true"@endif
|
|
38
|
+
@click="handleClick"
|
|
39
|
+
@mouseenter="handleMouseEnter"
|
|
40
|
+
@mouseleave="handleMouseLeave"
|
|
41
|
+
>
|
|
42
|
+
<slot :active="active" :disabled="disabled" />
|
|
43
|
+
</component>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export const className = $props.className || ''
|
|
3
|
+
export const as = $props.as || 'div'
|
|
4
|
+
export const static_ = $props.static || false
|
|
5
|
+
|
|
6
|
+
const baseClasses = 'absolute z-10 mt-2 origin-top-right divide-y divide-neutral-100 rounded-md bg-white shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:bg-neutral-800 dark:divide-neutral-700 dark:ring-neutral-600'
|
|
7
|
+
const itemsClasses = `${baseClasses} ${className}`.trim()
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<component
|
|
11
|
+
:is="{{ as }}"
|
|
12
|
+
class="{{ itemsClasses }}"
|
|
13
|
+
role="menu"
|
|
14
|
+
aria-orientation="vertical"
|
|
15
|
+
tabindex="-1"
|
|
16
|
+
>
|
|
17
|
+
<slot />
|
|
18
|
+
</component>
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Dropdown Component
|
|
2
|
+
|
|
3
|
+
A flexible dropdown menu component inspired by Headless UI, built with STX and headwind.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bun add @stacksjs/components
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```stx
|
|
14
|
+
@component('Dropdown')
|
|
15
|
+
@component('DropdownButton', { className: 'btn-primary' })
|
|
16
|
+
Options
|
|
17
|
+
@endcomponent
|
|
18
|
+
|
|
19
|
+
@component('DropdownItems')
|
|
20
|
+
@component('DropdownItem')
|
|
21
|
+
Edit
|
|
22
|
+
@endcomponent
|
|
23
|
+
@component('DropdownItem')
|
|
24
|
+
Delete
|
|
25
|
+
@endcomponent
|
|
26
|
+
@endcomponent
|
|
27
|
+
@endcomponent
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Props
|
|
31
|
+
|
|
32
|
+
### Dropdown
|
|
33
|
+
| Prop | Type | Default | Description |
|
|
34
|
+
|------|------|---------|-------------|
|
|
35
|
+
| `className` | `string` | `''` | Additional CSS classes |
|
|
36
|
+
| `as` | `string` | `'div'` | HTML element to render |
|
|
37
|
+
|
|
38
|
+
### DropdownButton
|
|
39
|
+
| Prop | Type | Default | Description |
|
|
40
|
+
|------|------|---------|-------------|
|
|
41
|
+
| `className` | `string` | `''` | Additional CSS classes |
|
|
42
|
+
| `as` | `string` | `'button'` | HTML element to render |
|
|
43
|
+
| `disabled` | `boolean` | `false` | Disable the button |
|
|
44
|
+
| `onClick` | `(e: Event) => void` | - | Click handler |
|
|
45
|
+
|
|
46
|
+
### DropdownItems
|
|
47
|
+
| Prop | Type | Default | Description |
|
|
48
|
+
|------|------|---------|-------------|
|
|
49
|
+
| `className` | `string` | `''` | Additional CSS classes |
|
|
50
|
+
| `as` | `string` | `'div'` | HTML element to render |
|
|
51
|
+
| `static` | `boolean` | `false` | Keep visible regardless of state |
|
|
52
|
+
|
|
53
|
+
### DropdownItem
|
|
54
|
+
| Prop | Type | Default | Description |
|
|
55
|
+
|------|------|---------|-------------|
|
|
56
|
+
| `className` | `string` | `''` | Additional CSS classes |
|
|
57
|
+
| `as` | `string` | `'div'` | HTML element to render |
|
|
58
|
+
| `disabled` | `boolean` | `false` | Disable the item |
|
|
59
|
+
| `onClick` | `(e: Event) => void` | - | Click handler |
|
|
60
|
+
|
|
61
|
+
## Examples
|
|
62
|
+
|
|
63
|
+
### Basic Dropdown
|
|
64
|
+
|
|
65
|
+
```stx
|
|
66
|
+
@component('Dropdown')
|
|
67
|
+
@component('DropdownButton', {
|
|
68
|
+
className: 'px-4 py-2 bg-blue-500 text-white rounded-md'
|
|
69
|
+
})
|
|
70
|
+
Actions
|
|
71
|
+
@endcomponent
|
|
72
|
+
|
|
73
|
+
@component('DropdownItems', {
|
|
74
|
+
className: 'w-56'
|
|
75
|
+
})
|
|
76
|
+
@component('DropdownItem')
|
|
77
|
+
Edit
|
|
78
|
+
@endcomponent
|
|
79
|
+
@component('DropdownItem')
|
|
80
|
+
Duplicate
|
|
81
|
+
@endcomponent
|
|
82
|
+
@component('DropdownItem', { disabled: true })
|
|
83
|
+
Archive (coming soon)
|
|
84
|
+
@endcomponent
|
|
85
|
+
@component('DropdownItem')
|
|
86
|
+
Delete
|
|
87
|
+
@endcomponent
|
|
88
|
+
@endcomponent
|
|
89
|
+
@endcomponent
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### With Icons
|
|
93
|
+
|
|
94
|
+
```stx
|
|
95
|
+
@component('DropdownItem')
|
|
96
|
+
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
97
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z" />
|
|
98
|
+
</svg>
|
|
99
|
+
Edit
|
|
100
|
+
@endcomponent
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Grouped Items
|
|
104
|
+
|
|
105
|
+
```stx
|
|
106
|
+
@component('DropdownItems')
|
|
107
|
+
<div class="px-1 py-1">
|
|
108
|
+
@component('DropdownItem')
|
|
109
|
+
Edit
|
|
110
|
+
@endcomponent
|
|
111
|
+
@component('DropdownItem')
|
|
112
|
+
Duplicate
|
|
113
|
+
@endcomponent
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<div class="px-1 py-1">
|
|
117
|
+
@component('DropdownItem')
|
|
118
|
+
Archive
|
|
119
|
+
@endcomponent
|
|
120
|
+
@component('DropdownItem')
|
|
121
|
+
Move
|
|
122
|
+
@endcomponent
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<div class="px-1 py-1">
|
|
126
|
+
@component('DropdownItem')
|
|
127
|
+
Delete
|
|
128
|
+
@endcomponent
|
|
129
|
+
</div>
|
|
130
|
+
@endcomponent
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Features
|
|
134
|
+
|
|
135
|
+
- Automatic positioning
|
|
136
|
+
- Keyboard navigation
|
|
137
|
+
- Focus management
|
|
138
|
+
- Dark mode support
|
|
139
|
+
- Accessible (WAI-ARIA)
|
|
140
|
+
- Customizable styling with headwind
|
|
141
|
+
- Disabled state support
|
|
142
|
+
- Active state on hover
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export { default as Dropdown } from './Dropdown.stx'
|
|
2
|
+
export { default as DropdownButton } from './DropdownButton.stx'
|
|
3
|
+
export { default as DropdownItem } from './DropdownItem.stx'
|
|
4
|
+
export { default as DropdownItems } from './DropdownItems.stx'
|
|
5
|
+
|
|
6
|
+
export interface DropdownProps {
|
|
7
|
+
className?: string
|
|
8
|
+
as?: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface DropdownButtonProps {
|
|
12
|
+
className?: string
|
|
13
|
+
as?: string
|
|
14
|
+
disabled?: boolean
|
|
15
|
+
onClick?: (e: Event) => void
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface DropdownItemsProps {
|
|
19
|
+
className?: string
|
|
20
|
+
as?: string
|
|
21
|
+
static?: boolean
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface DropdownItemProps {
|
|
25
|
+
className?: string
|
|
26
|
+
as?: string
|
|
27
|
+
disabled?: boolean
|
|
28
|
+
onClick?: (e: Event) => void
|
|
29
|
+
}
|