@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.
Files changed (342) hide show
  1. package/README.md +477 -0
  2. package/dist/Accordion-x2gjedap.stx +108 -0
  3. package/dist/Audio-0fk6p9tn.stx +50 -0
  4. package/dist/Avatar-5m0v0s4x.stx +88 -0
  5. package/dist/Badge-ynes82vv.stx +70 -0
  6. package/dist/Breadcrumb-h9n427sk.stx +79 -0
  7. package/dist/Button-7xtrzn14.stx +89 -0
  8. package/dist/Calendar-egvx1pma.stx +232 -0
  9. package/dist/Card-r9w7vy1a.stx +74 -0
  10. package/dist/Checkbox-m8v46pmx.stx +92 -0
  11. package/dist/Checkout-vcnnr176.stx +39 -0
  12. package/dist/CodeBlock-mwex82cm.stx +57 -0
  13. package/dist/Combobox-npb08vkp.stx +13 -0
  14. package/dist/ComboboxButton-vcdyq4zw.stx +13 -0
  15. package/dist/ComboboxInput-c9d2p02m.stx +25 -0
  16. package/dist/ComboboxOption-7d0h9ash.stx +52 -0
  17. package/dist/ComboboxOptions-4dtqc0qa.stx +12 -0
  18. package/dist/CommandPalette-ah00bf8v.stx +39 -0
  19. package/dist/CommandPaletteItem-2yx0gvtj.stx +32 -0
  20. package/dist/DefaultPaymentMethod-emw5fg8s.stx +62 -0
  21. package/dist/Dialog-1w4rz7x0.stx +19 -0
  22. package/dist/DialogBackdrop-qbm3y5ab.stx +9 -0
  23. package/dist/DialogDescription-01w5j74b.stx +11 -0
  24. package/dist/DialogPanel-brsszrrs.stx +16 -0
  25. package/dist/DialogTitle-3rxhwg21.stx +11 -0
  26. package/dist/Drawer-yfaz8q7f.stx +137 -0
  27. package/dist/Dropdown-ng7nx556.stx +24 -0
  28. package/dist/DropdownButton-vc4zpyrb.stx +23 -0
  29. package/dist/DropdownItem-z491y23c.stx +43 -0
  30. package/dist/DropdownItems-7ykf29sj.stx +18 -0
  31. package/dist/EmailInput-bfshpj92.stx +41 -0
  32. package/dist/Footer-xdaf02nr.stx +66 -0
  33. package/dist/Form-z4f7w6r1.stx +209 -0
  34. package/dist/Hero-9vvp7pxf.stx +25 -0
  35. package/dist/Image-ktk0451c.stx +197 -0
  36. package/dist/Installation-33bj4rm7.stx +39 -0
  37. package/dist/Listbox-xcejcmyc.stx +14 -0
  38. package/dist/ListboxButton-nx5kmw19.stx +17 -0
  39. package/dist/ListboxLabel-aky8a73n.stx +11 -0
  40. package/dist/ListboxOption-6h4hsdz5.stx +57 -0
  41. package/dist/ListboxOptions-2sacdtm5.stx +16 -0
  42. package/dist/Login-s2jkvd9y.stx +163 -0
  43. package/dist/Navigator-tqqdgdkw.stx +138 -0
  44. package/dist/Notification-sry8egea.stx +71 -0
  45. package/dist/NumberInput-zm93ddfw.stx +138 -0
  46. package/dist/Pagination-yza9v4qw.stx +183 -0
  47. package/dist/PasswordInput-4xnndp5y.stx +155 -0
  48. package/dist/PaymentMethods-jxba6kek.stx +113 -0
  49. package/dist/Popover-scbqatjq.stx +24 -0
  50. package/dist/PopoverButton-rbxhzj4k.stx +23 -0
  51. package/dist/PopoverPanel-9ng1rm6e.stx +23 -0
  52. package/dist/Portal-j111yvqp.stx +74 -0
  53. package/dist/Progress-gbmw3akr.stx +142 -0
  54. package/dist/Radio-1n9qamv1.stx +81 -0
  55. package/dist/RadioGroup-12dw2vhk.stx +13 -0
  56. package/dist/RadioGroupDescription-bjm3mdht.stx +11 -0
  57. package/dist/RadioGroupLabel-aky8a73n.stx +11 -0
  58. package/dist/RadioGroupOption-9pcxgwmd.stx +51 -0
  59. package/dist/SearchInput-g240e2nq.stx +63 -0
  60. package/dist/Select-p9f94b20.stx +89 -0
  61. package/dist/Sidebar-gwxw8q38.stx +288 -0
  62. package/dist/SidebarFooter-887kxret.stx +95 -0
  63. package/dist/SidebarHeader-qjeyx0hv.stx +100 -0
  64. package/dist/SidebarItem-4dpwtmb4.stx +118 -0
  65. package/dist/SidebarSection-kh92fk4m.stx +108 -0
  66. package/dist/Signup-3nxq5zag.stx +161 -0
  67. package/dist/Skeleton-g0nx1njm.stx +48 -0
  68. package/dist/Spinner-w4zj58xp.stx +109 -0
  69. package/dist/Stepper-rwc5actp.stx +17 -0
  70. package/dist/StepperStep-h0k657nm.stx +53 -0
  71. package/dist/SubscriptionCheckout-4cbxdg7w.stx +353 -0
  72. package/dist/Switch-kjq8qd2p.stx +74 -0
  73. package/dist/Table-59j9qwp0.stx +14 -0
  74. package/dist/TableBody-reka2gwv.stx +10 -0
  75. package/dist/TableCell-j7nh4sgr.stx +10 -0
  76. package/dist/TableHead-ecbrwpqm.stx +10 -0
  77. package/dist/TableHeader-jn2shwsv.stx +13 -0
  78. package/dist/TableRow-xz8rrxhc.stx +11 -0
  79. package/dist/Tabs-kb6ex6m7.stx +145 -0
  80. package/dist/Teleport-819cg9zm.stx +101 -0
  81. package/dist/TextInput-zx9kgr79.stx +146 -0
  82. package/dist/Textarea-5xvmrb0z.stx +119 -0
  83. package/dist/Tooltip-5ehqsy49.stx +76 -0
  84. package/dist/Transition-2j39s044.stx +174 -0
  85. package/dist/TwoFactorChallenge-2q4gg89m.stx +125 -0
  86. package/dist/Video-6aq4shh4.stx +45 -0
  87. package/dist/VirtualList-weh5qtm1.stx +83 -0
  88. package/dist/VirtualTable-59a1eskc.stx +113 -0
  89. package/dist/components/index.d.ts +4 -0
  90. package/dist/composables/index.d.ts +4 -0
  91. package/dist/composables/index.js +3 -0
  92. package/dist/composables/useCopyCode.d.ts +19 -0
  93. package/dist/composables/useDarkMode.d.ts +25 -0
  94. package/dist/composables/useSEO.d.ts +36 -0
  95. package/dist/composables/utilities/index.d.ts +5 -0
  96. package/dist/composables/utilities/useClickOutside.d.ts +28 -0
  97. package/dist/composables/utilities/useFocusTrap.d.ts +34 -0
  98. package/dist/composables/utilities/useKeyboard.d.ts +55 -0
  99. package/dist/composables/utilities/useLocalStorage.d.ts +33 -0
  100. package/dist/composables/utilities/useMediaQuery.d.ts +64 -0
  101. package/dist/index.d.ts +86 -0
  102. package/dist/index.js +19 -0
  103. package/dist/ui/accordion/index.d.ts +12 -0
  104. package/dist/ui/audio/index.d.ts +12 -0
  105. package/dist/ui/auth/index.d.ts +29 -0
  106. package/dist/ui/avatar/index.d.ts +11 -0
  107. package/dist/ui/badge/index.d.ts +9 -0
  108. package/dist/ui/breadcrumb/index.d.ts +13 -0
  109. package/dist/ui/button/index.d.ts +45 -0
  110. package/dist/ui/calendar/index.d.ts +13 -0
  111. package/dist/ui/card/index.d.ts +12 -0
  112. package/dist/ui/checkbox/index.d.ts +15 -0
  113. package/dist/ui/combobox/index.d.ts +35 -0
  114. package/dist/ui/command-palette/index.d.ts +13 -0
  115. package/dist/ui/dialog/index.d.ts +27 -0
  116. package/dist/ui/drawer/index.d.ts +8 -0
  117. package/dist/ui/dropdown/index.d.ts +25 -0
  118. package/dist/ui/form/index.d.ts +48 -0
  119. package/dist/ui/image/index.d.ts +21 -0
  120. package/dist/ui/input/index.d.ts +73 -0
  121. package/dist/ui/listbox/index.d.ts +34 -0
  122. package/dist/ui/navigator/index.d.ts +18 -0
  123. package/dist/ui/notification/index.d.ts +11 -0
  124. package/dist/ui/pagination/index.d.ts +10 -0
  125. package/dist/ui/payment/index.d.ts +53 -0
  126. package/dist/ui/popover/index.d.ts +19 -0
  127. package/dist/ui/portal/index.d.ts +5 -0
  128. package/dist/ui/progress/index.d.ts +11 -0
  129. package/dist/ui/radio/index.d.ts +14 -0
  130. package/dist/ui/radio-group/index.d.ts +26 -0
  131. package/dist/ui/select/index.d.ts +19 -0
  132. package/dist/ui/sidebar/index.d.ts +129 -0
  133. package/dist/ui/skeleton/index.d.ts +10 -0
  134. package/dist/ui/spinner/index.d.ts +8 -0
  135. package/dist/ui/stepper/index.d.ts +17 -0
  136. package/dist/ui/storage/index.d.ts +40 -0
  137. package/dist/ui/switch/index.d.ts +9 -0
  138. package/dist/ui/table/index.d.ts +29 -0
  139. package/dist/ui/tabs/index.d.ts +14 -0
  140. package/dist/ui/teleport/index.d.ts +6 -0
  141. package/dist/ui/textarea/index.d.ts +19 -0
  142. package/dist/ui/tooltip/index.d.ts +9 -0
  143. package/dist/ui/transition/index.d.ts +24 -0
  144. package/dist/ui/video/index.d.ts +15 -0
  145. package/dist/ui/virtual-list/index.d.ts +9 -0
  146. package/dist/ui/virtual-table/index.d.ts +19 -0
  147. package/dist/utils/accessibility.d.ts +285 -0
  148. package/dist/utils/animation/easing.d.ts +112 -0
  149. package/dist/utils/animation/helpers.d.ts +119 -0
  150. package/dist/utils/animation/index.d.ts +3 -0
  151. package/dist/utils/animation/keyframes.d.ts +334 -0
  152. package/dist/utils/error-handling.d.ts +182 -0
  153. package/dist/utils/highlighter.d.ts +27 -0
  154. package/dist/utils/highlighter.js +2 -0
  155. package/dist/utils/i18n.d.ts +245 -0
  156. package/dist/utils/keep-alive.d.ts +171 -0
  157. package/dist/utils/lazy-loading.d.ts +174 -0
  158. package/dist/utils/prop-validation.d.ts +106 -0
  159. package/dist/utils/theme.d.ts +234 -0
  160. package/package.json +69 -0
  161. package/src/components/CodeBlock.stx +57 -0
  162. package/src/components/Footer.stx +66 -0
  163. package/src/components/Hero.stx +25 -0
  164. package/src/components/Installation.stx +39 -0
  165. package/src/components/index.ts +4 -0
  166. package/src/composables/index.ts +4 -0
  167. package/src/composables/useCopyCode.ts +73 -0
  168. package/src/composables/useDarkMode.ts +100 -0
  169. package/src/composables/useSEO.ts +229 -0
  170. package/src/composables/utilities/index.ts +7 -0
  171. package/src/composables/utilities/useClickOutside.ts +72 -0
  172. package/src/composables/utilities/useFocusTrap.ts +159 -0
  173. package/src/composables/utilities/useKeyboard.ts +124 -0
  174. package/src/composables/utilities/useLocalStorage.ts +132 -0
  175. package/src/composables/utilities/useMediaQuery.ts +118 -0
  176. package/src/index.ts +99 -0
  177. package/src/stx.d.ts +4 -0
  178. package/src/ui/accordion/Accordion.stx +108 -0
  179. package/src/ui/accordion/index.ts +14 -0
  180. package/src/ui/audio/Audio.stx +50 -0
  181. package/src/ui/audio/README.md +42 -0
  182. package/src/ui/audio/index.ts +13 -0
  183. package/src/ui/auth/Login.stx +163 -0
  184. package/src/ui/auth/README.md +145 -0
  185. package/src/ui/auth/Signup.stx +161 -0
  186. package/src/ui/auth/TwoFactorChallenge.stx +125 -0
  187. package/src/ui/auth/index.ts +32 -0
  188. package/src/ui/avatar/Avatar.stx +88 -0
  189. package/src/ui/avatar/index.ts +12 -0
  190. package/src/ui/badge/Badge.stx +70 -0
  191. package/src/ui/badge/index.ts +10 -0
  192. package/src/ui/breadcrumb/Breadcrumb.stx +79 -0
  193. package/src/ui/breadcrumb/index.ts +15 -0
  194. package/src/ui/button/Button.stx +89 -0
  195. package/src/ui/button/README.md +100 -0
  196. package/src/ui/button/index.ts +85 -0
  197. package/src/ui/calendar/Calendar.stx +232 -0
  198. package/src/ui/calendar/README.md +254 -0
  199. package/src/ui/calendar/index.ts +14 -0
  200. package/src/ui/card/Card.stx +74 -0
  201. package/src/ui/card/index.ts +13 -0
  202. package/src/ui/checkbox/Checkbox.stx +92 -0
  203. package/src/ui/checkbox/index.ts +16 -0
  204. package/src/ui/combobox/Combobox.stx +13 -0
  205. package/src/ui/combobox/ComboboxButton.stx +13 -0
  206. package/src/ui/combobox/ComboboxInput.stx +25 -0
  207. package/src/ui/combobox/ComboboxOption.stx +52 -0
  208. package/src/ui/combobox/ComboboxOptions.stx +12 -0
  209. package/src/ui/combobox/README.md +154 -0
  210. package/src/ui/combobox/index.ts +40 -0
  211. package/src/ui/command-palette/CommandPalette.stx +39 -0
  212. package/src/ui/command-palette/CommandPaletteItem.stx +32 -0
  213. package/src/ui/command-palette/README.md +42 -0
  214. package/src/ui/command-palette/index.ts +15 -0
  215. package/src/ui/dialog/Dialog.stx +19 -0
  216. package/src/ui/dialog/DialogBackdrop.stx +9 -0
  217. package/src/ui/dialog/DialogDescription.stx +11 -0
  218. package/src/ui/dialog/DialogPanel.stx +16 -0
  219. package/src/ui/dialog/DialogTitle.stx +11 -0
  220. package/src/ui/dialog/README.md +133 -0
  221. package/src/ui/dialog/index.ts +32 -0
  222. package/src/ui/drawer/Drawer.stx +137 -0
  223. package/src/ui/drawer/README.md +110 -0
  224. package/src/ui/drawer/index.ts +9 -0
  225. package/src/ui/dropdown/Dropdown.stx +24 -0
  226. package/src/ui/dropdown/DropdownButton.stx +23 -0
  227. package/src/ui/dropdown/DropdownItem.stx +43 -0
  228. package/src/ui/dropdown/DropdownItems.stx +18 -0
  229. package/src/ui/dropdown/README.md +142 -0
  230. package/src/ui/dropdown/index.ts +29 -0
  231. package/src/ui/form/Form.stx +209 -0
  232. package/src/ui/form/index.ts +67 -0
  233. package/src/ui/heatmap/Heatmap.stx +315 -0
  234. package/src/ui/image/Image.stx +197 -0
  235. package/src/ui/image/README.md +171 -0
  236. package/src/ui/image/index.ts +22 -0
  237. package/src/ui/input/EmailInput.stx +41 -0
  238. package/src/ui/input/NumberInput.stx +138 -0
  239. package/src/ui/input/PasswordInput.stx +155 -0
  240. package/src/ui/input/SearchInput.stx +63 -0
  241. package/src/ui/input/TextInput.stx +146 -0
  242. package/src/ui/input/index.ts +180 -0
  243. package/src/ui/listbox/Listbox.stx +14 -0
  244. package/src/ui/listbox/ListboxButton.stx +17 -0
  245. package/src/ui/listbox/ListboxLabel.stx +11 -0
  246. package/src/ui/listbox/ListboxOption.stx +57 -0
  247. package/src/ui/listbox/ListboxOptions.stx +16 -0
  248. package/src/ui/listbox/README.md +143 -0
  249. package/src/ui/listbox/index.ts +39 -0
  250. package/src/ui/navigator/Navigator.stx +138 -0
  251. package/src/ui/navigator/README.md +352 -0
  252. package/src/ui/navigator/index.ts +20 -0
  253. package/src/ui/notification/Notification.stx +71 -0
  254. package/src/ui/notification/README.md +118 -0
  255. package/src/ui/notification/index.ts +12 -0
  256. package/src/ui/pagination/Pagination.stx +183 -0
  257. package/src/ui/pagination/index.ts +11 -0
  258. package/src/ui/payment/Checkout.stx +39 -0
  259. package/src/ui/payment/DefaultPaymentMethod.stx +62 -0
  260. package/src/ui/payment/PaymentMethods.stx +113 -0
  261. package/src/ui/payment/README.md +427 -0
  262. package/src/ui/payment/SubscriptionCheckout.stx +353 -0
  263. package/src/ui/payment/index.ts +59 -0
  264. package/src/ui/popover/Popover.stx +24 -0
  265. package/src/ui/popover/PopoverButton.stx +23 -0
  266. package/src/ui/popover/PopoverPanel.stx +23 -0
  267. package/src/ui/popover/README.md +95 -0
  268. package/src/ui/popover/index.ts +22 -0
  269. package/src/ui/portal/Portal.stx +74 -0
  270. package/src/ui/portal/index.ts +6 -0
  271. package/src/ui/progress/Progress.stx +142 -0
  272. package/src/ui/progress/index.ts +12 -0
  273. package/src/ui/radio/Radio.stx +81 -0
  274. package/src/ui/radio/index.ts +15 -0
  275. package/src/ui/radio-group/README.md +145 -0
  276. package/src/ui/radio-group/RadioGroup.stx +13 -0
  277. package/src/ui/radio-group/RadioGroupDescription.stx +11 -0
  278. package/src/ui/radio-group/RadioGroupLabel.stx +11 -0
  279. package/src/ui/radio-group/RadioGroupOption.stx +51 -0
  280. package/src/ui/radio-group/index.ts +30 -0
  281. package/src/ui/select/README.md +204 -0
  282. package/src/ui/select/Select.stx +89 -0
  283. package/src/ui/select/index.ts +21 -0
  284. package/src/ui/sidebar/Sidebar.stx +288 -0
  285. package/src/ui/sidebar/SidebarFooter.stx +95 -0
  286. package/src/ui/sidebar/SidebarHeader.stx +100 -0
  287. package/src/ui/sidebar/SidebarItem.stx +118 -0
  288. package/src/ui/sidebar/SidebarSection.stx +108 -0
  289. package/src/ui/sidebar/index.ts +175 -0
  290. package/src/ui/skeleton/Skeleton.stx +48 -0
  291. package/src/ui/skeleton/index.ts +11 -0
  292. package/src/ui/spinner/Spinner.stx +109 -0
  293. package/src/ui/spinner/index.ts +9 -0
  294. package/src/ui/stepper/README.md +36 -0
  295. package/src/ui/stepper/Stepper.stx +17 -0
  296. package/src/ui/stepper/StepperStep.stx +53 -0
  297. package/src/ui/stepper/index.ts +19 -0
  298. package/src/ui/storage/README.md +193 -0
  299. package/src/ui/storage/index.ts +347 -0
  300. package/src/ui/switch/README.md +133 -0
  301. package/src/ui/switch/Switch.stx +74 -0
  302. package/src/ui/switch/index.ts +10 -0
  303. package/src/ui/table/README.md +39 -0
  304. package/src/ui/table/Table.stx +14 -0
  305. package/src/ui/table/TableBody.stx +10 -0
  306. package/src/ui/table/TableCell.stx +10 -0
  307. package/src/ui/table/TableHead.stx +10 -0
  308. package/src/ui/table/TableHeader.stx +13 -0
  309. package/src/ui/table/TableRow.stx +11 -0
  310. package/src/ui/table/index.ts +35 -0
  311. package/src/ui/tabs/Tabs.stx +145 -0
  312. package/src/ui/tabs/index.ts +16 -0
  313. package/src/ui/teleport/Teleport.stx +101 -0
  314. package/src/ui/teleport/index.ts +7 -0
  315. package/src/ui/textarea/Textarea.stx +119 -0
  316. package/src/ui/textarea/index.ts +20 -0
  317. package/src/ui/tooltip/Tooltip.stx +76 -0
  318. package/src/ui/tooltip/index.ts +10 -0
  319. package/src/ui/transition/README.md +30 -0
  320. package/src/ui/transition/Transition.stx +174 -0
  321. package/src/ui/transition/index.ts +25 -0
  322. package/src/ui/video/README.md +48 -0
  323. package/src/ui/video/Video.stx +45 -0
  324. package/src/ui/video/index.ts +16 -0
  325. package/src/ui/virtual-list/VirtualList.stx +83 -0
  326. package/src/ui/virtual-list/index.ts +10 -0
  327. package/src/ui/virtual-table/VirtualTable.stx +113 -0
  328. package/src/ui/virtual-table/index.ts +21 -0
  329. package/src/utils/PROP_VALIDATION.md +458 -0
  330. package/src/utils/THEME_SYSTEM.md +702 -0
  331. package/src/utils/accessibility.ts +841 -0
  332. package/src/utils/animation/easing.ts +368 -0
  333. package/src/utils/animation/helpers.ts +223 -0
  334. package/src/utils/animation/index.ts +5 -0
  335. package/src/utils/animation/keyframes.ts +230 -0
  336. package/src/utils/error-handling.ts +473 -0
  337. package/src/utils/highlighter.ts +93 -0
  338. package/src/utils/i18n.ts +634 -0
  339. package/src/utils/keep-alive.ts +818 -0
  340. package/src/utils/lazy-loading.ts +530 -0
  341. package/src/utils/prop-validation.ts +478 -0
  342. 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,9 @@
1
+ export { default as Drawer } from './Drawer.stx'
2
+
3
+ export interface DrawerProps {
4
+ open?: boolean
5
+ onClose?: () => void
6
+ position?: 'right' | 'left' | 'top' | 'bottom'
7
+ title?: string
8
+ className?: string
9
+ }
@@ -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
+ }