@nikala-ui/docs 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. package/README.md +22 -0
  2. package/dist/cli/commands/build.d.ts +5 -0
  3. package/dist/cli/commands/build.d.ts.map +1 -0
  4. package/dist/cli/commands/build.js +27 -0
  5. package/dist/cli/commands/build.js.map +1 -0
  6. package/dist/cli/commands/dev.d.ts +7 -0
  7. package/dist/cli/commands/dev.d.ts.map +1 -0
  8. package/dist/cli/commands/dev.js +32 -0
  9. package/dist/cli/commands/dev.js.map +1 -0
  10. package/dist/cli/commands/init.d.ts +2 -0
  11. package/dist/cli/commands/init.d.ts.map +1 -0
  12. package/dist/cli/commands/init.js +308 -0
  13. package/dist/cli/commands/init.js.map +1 -0
  14. package/dist/cli/commands/preview.d.ts +7 -0
  15. package/dist/cli/commands/preview.d.ts.map +1 -0
  16. package/dist/cli/commands/preview.js +24 -0
  17. package/dist/cli/commands/preview.js.map +1 -0
  18. package/dist/cli/commands/serve.d.ts +7 -0
  19. package/dist/cli/commands/serve.d.ts.map +1 -0
  20. package/dist/cli/commands/serve.js +33 -0
  21. package/dist/cli/commands/serve.js.map +1 -0
  22. package/dist/cli/index.d.ts +3 -0
  23. package/dist/cli/index.d.ts.map +1 -0
  24. package/dist/cli/index.js +53 -0
  25. package/dist/cli/index.js.map +1 -0
  26. package/dist/client/App.d.ts +5 -0
  27. package/dist/client/App.d.ts.map +1 -0
  28. package/dist/client/App.jsx +31 -0
  29. package/dist/client/App.jsx.map +1 -0
  30. package/dist/client/app-types.d.ts +14 -0
  31. package/dist/client/app-types.d.ts.map +1 -0
  32. package/dist/client/app-types.js +2 -0
  33. package/dist/client/app-types.js.map +1 -0
  34. package/dist/client/components/DocsLayoutShell.d.ts +21 -0
  35. package/dist/client/components/DocsLayoutShell.d.ts.map +1 -0
  36. package/dist/client/components/DocsLayoutShell.jsx +14 -0
  37. package/dist/client/components/DocsLayoutShell.jsx.map +1 -0
  38. package/dist/client/components/DocsPageContent.d.ts +9 -0
  39. package/dist/client/components/DocsPageContent.d.ts.map +1 -0
  40. package/dist/client/components/DocsPageContent.jsx +10 -0
  41. package/dist/client/components/DocsPageContent.jsx.map +1 -0
  42. package/dist/client/entry.d.ts +2 -0
  43. package/dist/client/entry.d.ts.map +1 -0
  44. package/dist/client/entry.jsx +28 -0
  45. package/dist/client/entry.jsx.map +1 -0
  46. package/dist/client/index.html +21 -0
  47. package/dist/client/navigation/page-navigation.d.ts +9 -0
  48. package/dist/client/navigation/page-navigation.d.ts.map +1 -0
  49. package/dist/client/navigation/page-navigation.js +51 -0
  50. package/dist/client/navigation/page-navigation.js.map +1 -0
  51. package/dist/client/routing/use-docs-router.d.ts +17 -0
  52. package/dist/client/routing/use-docs-router.d.ts.map +1 -0
  53. package/dist/client/routing/use-docs-router.js +71 -0
  54. package/dist/client/routing/use-docs-router.js.map +1 -0
  55. package/dist/client/ssr-entry.d.ts +3 -0
  56. package/dist/client/ssr-entry.d.ts.map +1 -0
  57. package/dist/client/ssr-entry.jsx +13 -0
  58. package/dist/client/ssr-entry.jsx.map +1 -0
  59. package/dist/client/style.css +183 -0
  60. package/dist/client/utils/sidebar.d.ts +2 -0
  61. package/dist/client/utils/sidebar.d.ts.map +1 -0
  62. package/dist/client/utils/sidebar.js +2 -0
  63. package/dist/client/utils/sidebar.js.map +1 -0
  64. package/dist/components/mdx-components.d.ts +34 -0
  65. package/dist/components/mdx-components.d.ts.map +1 -0
  66. package/dist/components/mdx-components.jsx +131 -0
  67. package/dist/components/mdx-components.jsx.map +1 -0
  68. package/dist/config.d.ts +6 -0
  69. package/dist/config.d.ts.map +1 -0
  70. package/dist/config.js +105 -0
  71. package/dist/config.js.map +1 -0
  72. package/dist/core/content-scanner.d.ts +10 -0
  73. package/dist/core/content-scanner.d.ts.map +1 -0
  74. package/dist/core/content-scanner.js +153 -0
  75. package/dist/core/content-scanner.js.map +1 -0
  76. package/dist/core/route-tree.d.ts +19 -0
  77. package/dist/core/route-tree.d.ts.map +1 -0
  78. package/dist/core/route-tree.js +176 -0
  79. package/dist/core/route-tree.js.map +1 -0
  80. package/dist/index.d.ts +13 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +14 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/lib/cn.d.ts +6 -0
  85. package/dist/lib/cn.d.ts.map +1 -0
  86. package/dist/lib/cn.js +9 -0
  87. package/dist/lib/cn.js.map +1 -0
  88. package/dist/mdx/compiler.d.ts +13 -0
  89. package/dist/mdx/compiler.d.ts.map +1 -0
  90. package/dist/mdx/compiler.js +38 -0
  91. package/dist/mdx/compiler.js.map +1 -0
  92. package/dist/mdx/highlighter.d.ts +22 -0
  93. package/dist/mdx/highlighter.d.ts.map +1 -0
  94. package/dist/mdx/highlighter.js +139 -0
  95. package/dist/mdx/highlighter.js.map +1 -0
  96. package/dist/mdx/rehype-shiki.d.ts +3 -0
  97. package/dist/mdx/rehype-shiki.d.ts.map +1 -0
  98. package/dist/mdx/rehype-shiki.js +83 -0
  99. package/dist/mdx/rehype-shiki.js.map +1 -0
  100. package/dist/navigation/index.d.ts +2 -0
  101. package/dist/navigation/index.d.ts.map +1 -0
  102. package/dist/navigation/index.js +2 -0
  103. package/dist/navigation/index.js.map +1 -0
  104. package/dist/navigation/sidebar-state.d.ts +6 -0
  105. package/dist/navigation/sidebar-state.d.ts.map +1 -0
  106. package/dist/navigation/sidebar-state.js +20 -0
  107. package/dist/navigation/sidebar-state.js.map +1 -0
  108. package/dist/navigation/sidebar-tree.d.ts +7 -0
  109. package/dist/navigation/sidebar-tree.d.ts.map +1 -0
  110. package/dist/navigation/sidebar-tree.js +11 -0
  111. package/dist/navigation/sidebar-tree.js.map +1 -0
  112. package/dist/registry/accordion.json +18 -0
  113. package/dist/registry/alert.json +18 -0
  114. package/dist/registry/api-table.json +21 -0
  115. package/dist/registry/aspect-ratio.json +17 -0
  116. package/dist/registry/avatar.json +17 -0
  117. package/dist/registry/badge.json +18 -0
  118. package/dist/registry/banner.json +19 -0
  119. package/dist/registry/breadcrumb.json +17 -0
  120. package/dist/registry/bubble.json +18 -0
  121. package/dist/registry/button-group.json +20 -0
  122. package/dist/registry/button.json +21 -0
  123. package/dist/registry/callout.json +19 -0
  124. package/dist/registry/card.json +17 -0
  125. package/dist/registry/checkbox.json +20 -0
  126. package/dist/registry/code-block.json +26 -0
  127. package/dist/registry/code-group.json +20 -0
  128. package/dist/registry/collapsible.json +18 -0
  129. package/dist/registry/combobox.json +21 -0
  130. package/dist/registry/command.json +27 -0
  131. package/dist/registry/component-viewer.json +25 -0
  132. package/dist/registry/container.json +18 -0
  133. package/dist/registry/context-menu.json +24 -0
  134. package/dist/registry/create-active-element.json +13 -0
  135. package/dist/registry/create-app-updater.json +13 -0
  136. package/dist/registry/create-audio.json +7 -0
  137. package/dist/registry/create-battery.json +13 -0
  138. package/dist/registry/create-chat-scroll.json +13 -0
  139. package/dist/registry/create-click-outside.json +13 -0
  140. package/dist/registry/create-clipboard.json +13 -0
  141. package/dist/registry/create-color-mode.json +13 -0
  142. package/dist/registry/create-controllable-signal.json +13 -0
  143. package/dist/registry/create-debounce.json +13 -0
  144. package/dist/registry/create-disclosure.json +13 -0
  145. package/dist/registry/create-document-tabs.json +13 -0
  146. package/dist/registry/create-document-title.json +13 -0
  147. package/dist/registry/create-drop-zone.json +13 -0
  148. package/dist/registry/create-event-source.json +13 -0
  149. package/dist/registry/create-favicon.json +13 -0
  150. package/dist/registry/create-fetch.json +13 -0
  151. package/dist/registry/create-focus-trap.json +13 -0
  152. package/dist/registry/create-form.json +13 -0
  153. package/dist/registry/create-fullscreen.json +13 -0
  154. package/dist/registry/create-geolocation.json +13 -0
  155. package/dist/registry/create-global-shortcut.json +13 -0
  156. package/dist/registry/create-hover.json +13 -0
  157. package/dist/registry/create-idle.json +13 -0
  158. package/dist/registry/create-infinite-scroll.json +13 -0
  159. package/dist/registry/create-input-mask.json +13 -0
  160. package/dist/registry/create-intersection-observer.json +13 -0
  161. package/dist/registry/create-keybindings.json +13 -0
  162. package/dist/registry/create-lock-scroll.json +13 -0
  163. package/dist/registry/create-long-press.json +13 -0
  164. package/dist/registry/create-media-query.json +13 -0
  165. package/dist/registry/create-mouse-position.json +13 -0
  166. package/dist/registry/create-network-status.json +13 -0
  167. package/dist/registry/create-orientation.json +13 -0
  168. package/dist/registry/create-pagination.json +13 -0
  169. package/dist/registry/create-permission.json +13 -0
  170. package/dist/registry/create-previous.json +13 -0
  171. package/dist/registry/create-resize-observer.json +13 -0
  172. package/dist/registry/create-scroll-into-view.json +13 -0
  173. package/dist/registry/create-scroll-position.json +13 -0
  174. package/dist/registry/create-storage.json +13 -0
  175. package/dist/registry/create-tauri-window.json +13 -0
  176. package/dist/registry/create-timer.json +13 -0
  177. package/dist/registry/create-tiptap-editor.json +34 -0
  178. package/dist/registry/create-undo-redo.json +13 -0
  179. package/dist/registry/create-web-notification.json +13 -0
  180. package/dist/registry/create-websocket.json +13 -0
  181. package/dist/registry/create-window-size.json +13 -0
  182. package/dist/registry/dialog.json +21 -0
  183. package/dist/registry/dropdown-menu.json +22 -0
  184. package/dist/registry/dropzone.json +21 -0
  185. package/dist/registry/empty.json +17 -0
  186. package/dist/registry/field.json +20 -0
  187. package/dist/registry/file-tree.json +21 -0
  188. package/dist/registry/footer.json +18 -0
  189. package/dist/registry/forgot-password-01.json +28 -0
  190. package/dist/registry/form-message.json +17 -0
  191. package/dist/registry/form.json +17 -0
  192. package/dist/registry/hero-01.json +22 -0
  193. package/dist/registry/hover-card.json +18 -0
  194. package/dist/registry/icon-button.json +20 -0
  195. package/dist/registry/index.json +1489 -0
  196. package/dist/registry/input-group.json +21 -0
  197. package/dist/registry/input.json +17 -0
  198. package/dist/registry/kbd.json +18 -0
  199. package/dist/registry/label.json +18 -0
  200. package/dist/registry/list.json +20 -0
  201. package/dist/registry/login-01.json +28 -0
  202. package/dist/registry/logo.json +17 -0
  203. package/dist/registry/marker.json +17 -0
  204. package/dist/registry/marquee.json +17 -0
  205. package/dist/registry/message.json +17 -0
  206. package/dist/registry/navbar.json +19 -0
  207. package/dist/registry/navigation-menu.json +22 -0
  208. package/dist/registry/number-input.json +24 -0
  209. package/dist/registry/otp-verification-01.json +26 -0
  210. package/dist/registry/package-manager-tabs.json +24 -0
  211. package/dist/registry/pager.json +21 -0
  212. package/dist/registry/pagination.json +22 -0
  213. package/dist/registry/pin-input.json +17 -0
  214. package/dist/registry/popover.json +22 -0
  215. package/dist/registry/progress.json +18 -0
  216. package/dist/registry/radio-group.json +18 -0
  217. package/dist/registry/rating.json +19 -0
  218. package/dist/registry/register-01.json +31 -0
  219. package/dist/registry/resizable.json +21 -0
  220. package/dist/registry/review-card.json +23 -0
  221. package/dist/registry/rich-text-editor.json +95 -0
  222. package/dist/registry/scroll-area.json +21 -0
  223. package/dist/registry/section-heading.json +21 -0
  224. package/dist/registry/select.json +22 -0
  225. package/dist/registry/separator.json +17 -0
  226. package/dist/registry/sheet.json +22 -0
  227. package/dist/registry/sidebar.json +24 -0
  228. package/dist/registry/skeleton.json +17 -0
  229. package/dist/registry/slider.json +18 -0
  230. package/dist/registry/spinner.json +18 -0
  231. package/dist/registry/stat.json +19 -0
  232. package/dist/registry/status.json +18 -0
  233. package/dist/registry/steps.json +20 -0
  234. package/dist/registry/switch.json +20 -0
  235. package/dist/registry/table-of-contents.json +23 -0
  236. package/dist/registry/table.json +17 -0
  237. package/dist/registry/tabs.json +20 -0
  238. package/dist/registry/textarea.json +17 -0
  239. package/dist/registry/theme-manager.json +39 -0
  240. package/dist/registry/timeline.json +18 -0
  241. package/dist/registry/titlebar-tabs.json +24 -0
  242. package/dist/registry/titlebar.json +26 -0
  243. package/dist/registry/toast.json +20 -0
  244. package/dist/registry/toggle-group.json +21 -0
  245. package/dist/registry/toggle.json +18 -0
  246. package/dist/registry/tooltip.json +18 -0
  247. package/dist/registry/updater-modal.json +26 -0
  248. package/dist/server/index.d.ts +18 -0
  249. package/dist/server/index.d.ts.map +1 -0
  250. package/dist/server/index.js +526 -0
  251. package/dist/server/index.js.map +1 -0
  252. package/dist/server/plugin.d.ts +10 -0
  253. package/dist/server/plugin.d.ts.map +1 -0
  254. package/dist/server/plugin.js +271 -0
  255. package/dist/server/plugin.js.map +1 -0
  256. package/dist/themes/default/content/breadcrumbs.d.ts +4 -0
  257. package/dist/themes/default/content/breadcrumbs.d.ts.map +1 -0
  258. package/dist/themes/default/content/breadcrumbs.jsx +31 -0
  259. package/dist/themes/default/content/breadcrumbs.jsx.map +1 -0
  260. package/dist/themes/default/content/pager.d.ts +5 -0
  261. package/dist/themes/default/content/pager.d.ts.map +1 -0
  262. package/dist/themes/default/content/pager.jsx +9 -0
  263. package/dist/themes/default/content/pager.jsx.map +1 -0
  264. package/dist/themes/default/content/table-of-contents.d.ts +4 -0
  265. package/dist/themes/default/content/table-of-contents.d.ts.map +1 -0
  266. package/dist/themes/default/content/table-of-contents.jsx +19 -0
  267. package/dist/themes/default/content/table-of-contents.jsx.map +1 -0
  268. package/dist/themes/default/index.d.ts +11 -0
  269. package/dist/themes/default/index.d.ts.map +1 -0
  270. package/dist/themes/default/index.js +30 -0
  271. package/dist/themes/default/index.js.map +1 -0
  272. package/dist/themes/default/layout.d.ts +4 -0
  273. package/dist/themes/default/layout.d.ts.map +1 -0
  274. package/dist/themes/default/layout.jsx +75 -0
  275. package/dist/themes/default/layout.jsx.map +1 -0
  276. package/dist/themes/default/navbar.d.ts +4 -0
  277. package/dist/themes/default/navbar.d.ts.map +1 -0
  278. package/dist/themes/default/navbar.jsx +74 -0
  279. package/dist/themes/default/navbar.jsx.map +1 -0
  280. package/dist/themes/default/navigation/mobile-table-of-contents.d.ts +4 -0
  281. package/dist/themes/default/navigation/mobile-table-of-contents.d.ts.map +1 -0
  282. package/dist/themes/default/navigation/mobile-table-of-contents.jsx +22 -0
  283. package/dist/themes/default/navigation/mobile-table-of-contents.jsx.map +1 -0
  284. package/dist/themes/default/navigation/sidebar-tree.d.ts +8 -0
  285. package/dist/themes/default/navigation/sidebar-tree.d.ts.map +1 -0
  286. package/dist/themes/default/navigation/sidebar-tree.jsx +100 -0
  287. package/dist/themes/default/navigation/sidebar-tree.jsx.map +1 -0
  288. package/dist/themes/default/overlays/search-dialog.d.ts +4 -0
  289. package/dist/themes/default/overlays/search-dialog.d.ts.map +1 -0
  290. package/dist/themes/default/overlays/search-dialog.jsx +34 -0
  291. package/dist/themes/default/overlays/search-dialog.jsx.map +1 -0
  292. package/dist/themes/default/sidebar.d.ts +4 -0
  293. package/dist/themes/default/sidebar.d.ts.map +1 -0
  294. package/dist/themes/default/sidebar.jsx +60 -0
  295. package/dist/themes/default/sidebar.jsx.map +1 -0
  296. package/dist/themes/index.d.ts +4 -0
  297. package/dist/themes/index.d.ts.map +1 -0
  298. package/dist/themes/index.js +5 -0
  299. package/dist/themes/index.js.map +1 -0
  300. package/dist/themes/types.d.ts +83 -0
  301. package/dist/themes/types.d.ts.map +1 -0
  302. package/dist/themes/types.js +2 -0
  303. package/dist/themes/types.js.map +1 -0
  304. package/dist/types.d.ts +97 -0
  305. package/dist/types.d.ts.map +1 -0
  306. package/dist/types.js +3 -0
  307. package/dist/types.js.map +1 -0
  308. package/dist/vendor/core-src/index.css +11 -0
  309. package/dist/vendor/core-src/index.ts +48 -0
  310. package/dist/vendor/core-src/lib/cn.ts +9 -0
  311. package/dist/vendor/core-src/registry/blocks/forgot-password-01.tsx +141 -0
  312. package/dist/vendor/core-src/registry/blocks/hero-01.tsx +28 -0
  313. package/dist/vendor/core-src/registry/blocks/login-01.tsx +231 -0
  314. package/dist/vendor/core-src/registry/blocks/otp-verification-01.tsx +170 -0
  315. package/dist/vendor/core-src/registry/blocks/register-01.tsx +318 -0
  316. package/dist/vendor/core-src/registry/components/ui/accordion.tsx +128 -0
  317. package/dist/vendor/core-src/registry/components/ui/alert.tsx +155 -0
  318. package/dist/vendor/core-src/registry/components/ui/api-table.tsx +117 -0
  319. package/dist/vendor/core-src/registry/components/ui/aspect-ratio.tsx +31 -0
  320. package/dist/vendor/core-src/registry/components/ui/avatar.tsx +114 -0
  321. package/dist/vendor/core-src/registry/components/ui/badge.tsx +56 -0
  322. package/dist/vendor/core-src/registry/components/ui/banner.tsx +187 -0
  323. package/dist/vendor/core-src/registry/components/ui/breadcrumb.tsx +136 -0
  324. package/dist/vendor/core-src/registry/components/ui/bubble.tsx +142 -0
  325. package/dist/vendor/core-src/registry/components/ui/button-group.tsx +42 -0
  326. package/dist/vendor/core-src/registry/components/ui/button.tsx +82 -0
  327. package/dist/vendor/core-src/registry/components/ui/callout.tsx +137 -0
  328. package/dist/vendor/core-src/registry/components/ui/card.tsx +113 -0
  329. package/dist/vendor/core-src/registry/components/ui/checkbox.tsx +74 -0
  330. package/dist/vendor/core-src/registry/components/ui/code-block.tsx +326 -0
  331. package/dist/vendor/core-src/registry/components/ui/code-group.tsx +105 -0
  332. package/dist/vendor/core-src/registry/components/ui/collapsible.tsx +73 -0
  333. package/dist/vendor/core-src/registry/components/ui/combobox.tsx +299 -0
  334. package/dist/vendor/core-src/registry/components/ui/command.tsx +378 -0
  335. package/dist/vendor/core-src/registry/components/ui/component-viewer.tsx +363 -0
  336. package/dist/vendor/core-src/registry/components/ui/container.tsx +45 -0
  337. package/dist/vendor/core-src/registry/components/ui/context-menu.tsx +237 -0
  338. package/dist/vendor/core-src/registry/components/ui/dialog.tsx +200 -0
  339. package/dist/vendor/core-src/registry/components/ui/dropdown-menu.tsx +298 -0
  340. package/dist/vendor/core-src/registry/components/ui/dropzone.tsx +189 -0
  341. package/dist/vendor/core-src/registry/components/ui/empty.tsx +83 -0
  342. package/dist/vendor/core-src/registry/components/ui/field.tsx +71 -0
  343. package/dist/vendor/core-src/registry/components/ui/file-tree.tsx +181 -0
  344. package/dist/vendor/core-src/registry/components/ui/footer.tsx +247 -0
  345. package/dist/vendor/core-src/registry/components/ui/form-message.tsx +36 -0
  346. package/dist/vendor/core-src/registry/components/ui/form.tsx +21 -0
  347. package/dist/vendor/core-src/registry/components/ui/hover-card.tsx +105 -0
  348. package/dist/vendor/core-src/registry/components/ui/icon-button.tsx +34 -0
  349. package/dist/vendor/core-src/registry/components/ui/input-group.tsx +80 -0
  350. package/dist/vendor/core-src/registry/components/ui/input.tsx +28 -0
  351. package/dist/vendor/core-src/registry/components/ui/kbd.tsx +73 -0
  352. package/dist/vendor/core-src/registry/components/ui/label.tsx +30 -0
  353. package/dist/vendor/core-src/registry/components/ui/list.tsx +222 -0
  354. package/dist/vendor/core-src/registry/components/ui/logo.tsx +68 -0
  355. package/dist/vendor/core-src/registry/components/ui/marker.tsx +102 -0
  356. package/dist/vendor/core-src/registry/components/ui/marquee.tsx +118 -0
  357. package/dist/vendor/core-src/registry/components/ui/message.tsx +168 -0
  358. package/dist/vendor/core-src/registry/components/ui/navbar.tsx +375 -0
  359. package/dist/vendor/core-src/registry/components/ui/navigation-menu.tsx +358 -0
  360. package/dist/vendor/core-src/registry/components/ui/number-input.tsx +150 -0
  361. package/dist/vendor/core-src/registry/components/ui/package-manager-tabs.tsx +226 -0
  362. package/dist/vendor/core-src/registry/components/ui/pager.tsx +102 -0
  363. package/dist/vendor/core-src/registry/components/ui/pagination.tsx +258 -0
  364. package/dist/vendor/core-src/registry/components/ui/pin-input.tsx +198 -0
  365. package/dist/vendor/core-src/registry/components/ui/popover.tsx +90 -0
  366. package/dist/vendor/core-src/registry/components/ui/progress.tsx +66 -0
  367. package/dist/vendor/core-src/registry/components/ui/radio-group.tsx +95 -0
  368. package/dist/vendor/core-src/registry/components/ui/rating.tsx +185 -0
  369. package/dist/vendor/core-src/registry/components/ui/resizable.tsx +195 -0
  370. package/dist/vendor/core-src/registry/components/ui/review-card.tsx +195 -0
  371. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/bubble-menu.tsx +236 -0
  372. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/editor.tsx +308 -0
  373. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/extensions.ts +116 -0
  374. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/footer.tsx +36 -0
  375. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/image-dialog.tsx +75 -0
  376. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/index.ts +11 -0
  377. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/link-dialog.tsx +48 -0
  378. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/markdown.ts +170 -0
  379. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/slash-command.tsx +301 -0
  380. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/table-controls.tsx +68 -0
  381. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/toolbar.tsx +465 -0
  382. package/dist/vendor/core-src/registry/components/ui/rich-text-editor/use-editor.ts +231 -0
  383. package/dist/vendor/core-src/registry/components/ui/scroll-area.tsx +228 -0
  384. package/dist/vendor/core-src/registry/components/ui/section-heading.tsx +108 -0
  385. package/dist/vendor/core-src/registry/components/ui/select.tsx +156 -0
  386. package/dist/vendor/core-src/registry/components/ui/separator.tsx +37 -0
  387. package/dist/vendor/core-src/registry/components/ui/sheet.tsx +220 -0
  388. package/dist/vendor/core-src/registry/components/ui/sidebar.tsx +692 -0
  389. package/dist/vendor/core-src/registry/components/ui/skeleton.tsx +24 -0
  390. package/dist/vendor/core-src/registry/components/ui/slider.tsx +153 -0
  391. package/dist/vendor/core-src/registry/components/ui/spinner.tsx +41 -0
  392. package/dist/vendor/core-src/registry/components/ui/stat.tsx +245 -0
  393. package/dist/vendor/core-src/registry/components/ui/status.tsx +121 -0
  394. package/dist/vendor/core-src/registry/components/ui/steps.tsx +198 -0
  395. package/dist/vendor/core-src/registry/components/ui/switch.tsx +68 -0
  396. package/dist/vendor/core-src/registry/components/ui/table-of-contents.tsx +131 -0
  397. package/dist/vendor/core-src/registry/components/ui/table.tsx +160 -0
  398. package/dist/vendor/core-src/registry/components/ui/tabs.tsx +204 -0
  399. package/dist/vendor/core-src/registry/components/ui/textarea.tsx +82 -0
  400. package/dist/vendor/core-src/registry/components/ui/theme-toggle.tsx +238 -0
  401. package/dist/vendor/core-src/registry/components/ui/timeline.tsx +350 -0
  402. package/dist/vendor/core-src/registry/components/ui/titlebar-tabs.tsx +773 -0
  403. package/dist/vendor/core-src/registry/components/ui/titlebar.tsx +468 -0
  404. package/dist/vendor/core-src/registry/components/ui/toast.tsx +124 -0
  405. package/dist/vendor/core-src/registry/components/ui/toggle-group.tsx +203 -0
  406. package/dist/vendor/core-src/registry/components/ui/toggle.tsx +101 -0
  407. package/dist/vendor/core-src/registry/components/ui/tooltip.tsx +41 -0
  408. package/dist/vendor/core-src/registry/components/ui/updater-modal.tsx +254 -0
  409. package/dist/vendor/core-src/registry/index.ts +50 -0
  410. package/dist/vendor/core-src/registry/metadata.ts +742 -0
  411. package/dist/vendor/core-src/registry/providers/theme-provider.tsx +216 -0
  412. package/dist/vendor/core-src/registry/providers/theme-script.tsx +78 -0
  413. package/dist/vendor/core-src/registry/providers/theme-transitions.ts +139 -0
  414. package/dist/vendor/hooks-src/create-active-element.ts +51 -0
  415. package/dist/vendor/hooks-src/create-app-updater.ts +272 -0
  416. package/dist/vendor/hooks-src/create-audio-video.ts +444 -0
  417. package/dist/vendor/hooks-src/create-battery.ts +78 -0
  418. package/dist/vendor/hooks-src/create-chat-scroll.ts +113 -0
  419. package/dist/vendor/hooks-src/create-click-outside.ts +82 -0
  420. package/dist/vendor/hooks-src/create-clipboard.ts +69 -0
  421. package/dist/vendor/hooks-src/create-color-mode.ts +115 -0
  422. package/dist/vendor/hooks-src/create-controllable-signal.ts +56 -0
  423. package/dist/vendor/hooks-src/create-debounce.ts +90 -0
  424. package/dist/vendor/hooks-src/create-disclosure.ts +82 -0
  425. package/dist/vendor/hooks-src/create-document-tabs.ts +267 -0
  426. package/dist/vendor/hooks-src/create-document-title.ts +33 -0
  427. package/dist/vendor/hooks-src/create-drop-zone.ts +317 -0
  428. package/dist/vendor/hooks-src/create-event-source.ts +126 -0
  429. package/dist/vendor/hooks-src/create-favicon.ts +52 -0
  430. package/dist/vendor/hooks-src/create-fetch.ts +93 -0
  431. package/dist/vendor/hooks-src/create-focus-trap.ts +94 -0
  432. package/dist/vendor/hooks-src/create-form.ts +200 -0
  433. package/dist/vendor/hooks-src/create-fullscreen.ts +105 -0
  434. package/dist/vendor/hooks-src/create-geolocation.ts +140 -0
  435. package/dist/vendor/hooks-src/create-global-shortcut.ts +140 -0
  436. package/dist/vendor/hooks-src/create-hover.ts +88 -0
  437. package/dist/vendor/hooks-src/create-idle.ts +109 -0
  438. package/dist/vendor/hooks-src/create-infinite-scroll.ts +90 -0
  439. package/dist/vendor/hooks-src/create-input-mask.ts +109 -0
  440. package/dist/vendor/hooks-src/create-intersection-observer.ts +82 -0
  441. package/dist/vendor/hooks-src/create-keybindings.ts +148 -0
  442. package/dist/vendor/hooks-src/create-lock-scroll.ts +97 -0
  443. package/dist/vendor/hooks-src/create-long-press.ts +85 -0
  444. package/dist/vendor/hooks-src/create-media-query.ts +94 -0
  445. package/dist/vendor/hooks-src/create-mouse-position.ts +87 -0
  446. package/dist/vendor/hooks-src/create-network-status.ts +100 -0
  447. package/dist/vendor/hooks-src/create-orientation.ts +129 -0
  448. package/dist/vendor/hooks-src/create-pagination.ts +208 -0
  449. package/dist/vendor/hooks-src/create-permission.ts +91 -0
  450. package/dist/vendor/hooks-src/create-previous.ts +21 -0
  451. package/dist/vendor/hooks-src/create-resize-observer.ts +89 -0
  452. package/dist/vendor/hooks-src/create-scroll-into-view.ts +57 -0
  453. package/dist/vendor/hooks-src/create-scroll-position.ts +129 -0
  454. package/dist/vendor/hooks-src/create-storage.ts +106 -0
  455. package/dist/vendor/hooks-src/create-tauri-window.ts +628 -0
  456. package/dist/vendor/hooks-src/create-timer.ts +150 -0
  457. package/dist/vendor/hooks-src/create-tiptap-editor.ts +326 -0
  458. package/dist/vendor/hooks-src/create-undo-redo.ts +100 -0
  459. package/dist/vendor/hooks-src/create-web-notification.ts +111 -0
  460. package/dist/vendor/hooks-src/create-websocket.ts +179 -0
  461. package/dist/vendor/hooks-src/create-window-size.ts +41 -0
  462. package/dist/vendor/hooks-src/index.ts +48 -0
  463. package/package.json +87 -0
@@ -0,0 +1,78 @@
1
+ import { createSignal, createEffect, onCleanup, type Accessor } from "solid-js";
2
+
3
+ export interface BatteryState {
4
+ /** Battery charge level ratio from 0.0 (empty) to 1.0 (full). */
5
+ level: number;
6
+ /** Whether the device battery is currently charging. */
7
+ charging: boolean;
8
+ /** Seconds remaining until fully charged (0 if already full or unknown). */
9
+ chargingTime: number;
10
+ /** Seconds remaining until fully discharged. */
11
+ dischargingTime: number;
12
+ }
13
+
14
+ export interface CreateBatteryReturn {
15
+ /** Signal accessor containing battery state metrics. */
16
+ battery: Accessor<BatteryState>;
17
+ /** Signal accessor indicating whether Battery Status API is supported in browser environment. */
18
+ isSupported: Accessor<boolean>;
19
+ }
20
+
21
+ const initialBatteryState: BatteryState = {
22
+ level: 1,
23
+ charging: true,
24
+ chargingTime: 0,
25
+ dischargingTime: Infinity,
26
+ };
27
+
28
+ /**
29
+ * SolidJS reactive primitive for observing device battery status, charge level, and charging metrics.
30
+ */
31
+ export function createBattery(): CreateBatteryReturn {
32
+ const [battery, setBattery] = createSignal<BatteryState>(initialBatteryState);
33
+
34
+ const isSupported = (): boolean =>
35
+ typeof window !== "undefined" &&
36
+ typeof navigator !== "undefined" &&
37
+ "getBattery" in navigator;
38
+
39
+ let batteryManager: any = null;
40
+
41
+ const updateBatteryStatus = (): void => {
42
+ if (!batteryManager) return;
43
+ setBattery({
44
+ level: batteryManager.level ?? 1,
45
+ charging: Boolean(batteryManager.charging),
46
+ chargingTime: batteryManager.chargingTime ?? 0,
47
+ dischargingTime: batteryManager.dischargingTime ?? Infinity,
48
+ });
49
+ };
50
+
51
+ createEffect(() => {
52
+ if (!isSupported()) return;
53
+
54
+ (navigator as any).getBattery().then((manager: any) => {
55
+ batteryManager = manager;
56
+ updateBatteryStatus();
57
+
58
+ manager.addEventListener("levelchange", updateBatteryStatus);
59
+ manager.addEventListener("chargingchange", updateBatteryStatus);
60
+ manager.addEventListener("chargingtimechange", updateBatteryStatus);
61
+ manager.addEventListener("dischargingtimechange", updateBatteryStatus);
62
+ }).catch(() => {});
63
+
64
+ onCleanup(() => {
65
+ if (batteryManager) {
66
+ batteryManager.removeEventListener("levelchange", updateBatteryStatus);
67
+ batteryManager.removeEventListener("chargingchange", updateBatteryStatus);
68
+ batteryManager.removeEventListener("chargingtimechange", updateBatteryStatus);
69
+ batteryManager.removeEventListener("dischargingtimechange", updateBatteryStatus);
70
+ }
71
+ });
72
+ });
73
+
74
+ return {
75
+ battery,
76
+ isSupported,
77
+ };
78
+ }
@@ -0,0 +1,113 @@
1
+ import { createSignal, createEffect, onCleanup, onMount, type Accessor } from "solid-js";
2
+
3
+ export interface CreateChatScrollOptions {
4
+ /** Target scrollable container element or accessor */
5
+ target: HTMLElement | Accessor<HTMLElement | undefined>;
6
+ /** Dependency accessor (e.g. messages length or content signal) that triggers auto-scroll when changed */
7
+ trigger?: Accessor<any>;
8
+ /** Threshold in pixels from bottom to consider the container "at bottom". Defaults to 40. */
9
+ threshold?: number;
10
+ /** Whether auto-scroll is enabled. Defaults to true. */
11
+ enabled?: boolean | Accessor<boolean>;
12
+ /** Scroll behavior: "smooth" or "auto". Defaults to "smooth". */
13
+ behavior?: ScrollBehavior;
14
+ }
15
+
16
+ export interface CreateChatScrollReturn {
17
+ /** Accessor indicating whether the container is currently scrolled to the bottom */
18
+ isAtBottom: Accessor<boolean>;
19
+ /** Accessor indicating whether user has manually scrolled up away from bottom */
20
+ isScrolledUp: Accessor<boolean>;
21
+ /** Programmatically scroll container directly to the bottom */
22
+ scrollToBottom: (options?: { smooth?: boolean }) => void;
23
+ }
24
+
25
+ /**
26
+ * SolidJS reactive primitive for chat and streaming message auto-scrolling with user scroll detection.
27
+ *
28
+ * @param options Chat scroll configuration options.
29
+ */
30
+ export function createChatScroll(options: CreateChatScrollOptions): CreateChatScrollReturn {
31
+ const [isAtBottom, setIsAtBottom] = createSignal<boolean>(true);
32
+ const isScrolledUp = () => !isAtBottom();
33
+
34
+ const getElement = (): HTMLElement | undefined => {
35
+ if (typeof options.target === "function") {
36
+ return (options.target as Accessor<HTMLElement | undefined>)();
37
+ }
38
+ return options.target;
39
+ };
40
+
41
+ const isEnabled = () => {
42
+ if (typeof options.enabled === "function") {
43
+ return (options.enabled as Accessor<boolean>)();
44
+ }
45
+ return options.enabled ?? true;
46
+ };
47
+
48
+ const threshold = options.threshold ?? 40;
49
+
50
+ const checkIfAtBottom = () => {
51
+ const el = getElement();
52
+ if (!el) return true;
53
+ const distanceToBottom = el.scrollHeight - el.scrollTop - el.clientHeight;
54
+ return distanceToBottom <= threshold;
55
+ };
56
+
57
+ const scrollToBottom = (opts?: { smooth?: boolean }) => {
58
+ const el = getElement();
59
+ if (!el) return;
60
+
61
+ const useSmooth = opts?.smooth ?? (options.behavior === "smooth" || options.behavior === undefined);
62
+
63
+ el.scrollTo({
64
+ top: el.scrollHeight,
65
+ behavior: useSmooth ? "smooth" : "auto",
66
+ });
67
+ setIsAtBottom(true);
68
+ };
69
+
70
+ const handleScroll = () => {
71
+ const atBottom = checkIfAtBottom();
72
+ setIsAtBottom(atBottom);
73
+ };
74
+
75
+ onMount(() => {
76
+ if (typeof window === "undefined") return;
77
+
78
+ const el = getElement();
79
+ if (el) {
80
+ el.addEventListener("scroll", handleScroll, { passive: true });
81
+ setIsAtBottom(checkIfAtBottom());
82
+ }
83
+ });
84
+
85
+ onCleanup(() => {
86
+ if (typeof window === "undefined") return;
87
+ const el = getElement();
88
+ if (el) {
89
+ el.removeEventListener("scroll", handleScroll);
90
+ }
91
+ });
92
+
93
+ // Watch trigger dependencies (e.g. messages length or stream tokens)
94
+ if (options.trigger) {
95
+ createEffect(() => {
96
+ // Track trigger dependency
97
+ options.trigger!();
98
+
99
+ if (isEnabled() && isAtBottom()) {
100
+ // Run after microtask/DOM paint
101
+ setTimeout(() => {
102
+ scrollToBottom({ smooth: true });
103
+ }, 10);
104
+ }
105
+ });
106
+ }
107
+
108
+ return {
109
+ isAtBottom,
110
+ isScrolledUp,
111
+ scrollToBottom,
112
+ };
113
+ }
@@ -0,0 +1,82 @@
1
+ import { onMount, onCleanup, type Accessor } from "solid-js";
2
+
3
+ export interface CreateClickOutsideOptions {
4
+ /** Target HTML element or accessor returning the container element */
5
+ target:
6
+ | HTMLElement
7
+ | Accessor<HTMLElement | undefined>
8
+ | (HTMLElement | Accessor<HTMLElement | undefined>)[];
9
+ /** Callback fired when a click/pointer event occurs outside the target element(s) */
10
+ onInteractOutside: (event: MouseEvent | PointerEvent | TouchEvent) => void;
11
+ /** Whether the listener is active. Defaults to true. */
12
+ enabled?: boolean | Accessor<boolean>;
13
+ /** Optional element or accessor to ignore when checking outside clicks (e.g. trigger button) */
14
+ ignore?:
15
+ | HTMLElement
16
+ | Accessor<HTMLElement | undefined>
17
+ | (HTMLElement | Accessor<HTMLElement | undefined>)[];
18
+ }
19
+
20
+ /**
21
+ * SolidJS reactive primitive for detecting user interactions outside specified element(s).
22
+ *
23
+ * @param options Configuration options including target element(s), callback, and optional ignore elements.
24
+ */
25
+ export function createClickOutside(options: CreateClickOutsideOptions): void {
26
+ const isEnabled = () => {
27
+ if (typeof options.enabled === "function") {
28
+ return options.enabled();
29
+ }
30
+ return options.enabled ?? true;
31
+ };
32
+
33
+ const getElement = (
34
+ el: HTMLElement | Accessor<HTMLElement | undefined> | undefined
35
+ ): HTMLElement | undefined => {
36
+ if (!el) return undefined;
37
+ if (typeof el === "function") {
38
+ return (el as Accessor<HTMLElement | undefined>)();
39
+ }
40
+ return el;
41
+ };
42
+
43
+ const getElements = (
44
+ targets:
45
+ | HTMLElement
46
+ | Accessor<HTMLElement | undefined>
47
+ | (HTMLElement | Accessor<HTMLElement | undefined>)[]
48
+ | undefined
49
+ ): HTMLElement[] => {
50
+ if (!targets) return [];
51
+ const list = Array.isArray(targets) ? targets : [targets];
52
+ return list.map(getElement).filter((e): e is HTMLElement => e !== undefined);
53
+ };
54
+
55
+ const handlePointerDown = (event: MouseEvent | PointerEvent | TouchEvent) => {
56
+ if (!isEnabled()) return;
57
+
58
+ const targetNode = event.target as Node | null;
59
+ if (!targetNode) return;
60
+
61
+ const mainElements = getElements(options.target);
62
+ if (mainElements.length === 0) return;
63
+
64
+ const isInsideTarget = mainElements.some((el) => el.contains(targetNode));
65
+ if (isInsideTarget) return;
66
+
67
+ const ignoreElements = getElements(options.ignore);
68
+ const isInsideIgnore = ignoreElements.some((el) => el.contains(targetNode));
69
+ if (isInsideIgnore) return;
70
+
71
+ options.onInteractOutside(event);
72
+ };
73
+
74
+ onMount(() => {
75
+ if (typeof window === "undefined") return;
76
+
77
+ window.addEventListener("pointerdown", handlePointerDown, true);
78
+ onCleanup(() => {
79
+ window.removeEventListener("pointerdown", handlePointerDown, true);
80
+ });
81
+ });
82
+ }
@@ -0,0 +1,69 @@
1
+ import { createSignal, onCleanup, type Accessor } from "solid-js";
2
+
3
+ export interface CreateClipboardOptions {
4
+ /** Time in milliseconds to maintain the copied state before resetting. Defaults to 2000ms. */
5
+ timeout?: number;
6
+ }
7
+
8
+ export interface CreateClipboardReturn {
9
+ /** Signal accessor indicating if content was recently copied */
10
+ copied: Accessor<boolean>;
11
+ /** Function to copy text to clipboard */
12
+ copy: (text: string) => Promise<boolean>;
13
+ /** Error state if clipboard write fails */
14
+ error: Accessor<Error | undefined>;
15
+ }
16
+
17
+ /**
18
+ * SolidJS reactive primitive for copying text to clipboard with automatic reset state.
19
+ *
20
+ * @param options Configuration options including copied status reset timeout duration.
21
+ */
22
+ export function createClipboard(options: CreateClipboardOptions = {}): CreateClipboardReturn {
23
+ const timeoutDuration = options.timeout ?? 2000;
24
+ const [copied, setCopied] = createSignal(false);
25
+ const [error, setError] = createSignal<Error | undefined>(undefined);
26
+ let timer: ReturnType<typeof setTimeout> | undefined;
27
+
28
+ const clearTimer = () => {
29
+ if (timer) {
30
+ clearTimeout(timer);
31
+ timer = undefined;
32
+ }
33
+ };
34
+
35
+ const copy = async (text: string): Promise<boolean> => {
36
+ clearTimer();
37
+ setError(undefined);
38
+
39
+ try {
40
+ if (typeof window !== "undefined" && navigator.clipboard && navigator.clipboard.writeText) {
41
+ await navigator.clipboard.writeText(text);
42
+ setCopied(true);
43
+
44
+ timer = setTimeout(() => {
45
+ setCopied(false);
46
+ }, timeoutDuration);
47
+
48
+ return true;
49
+ }
50
+
51
+ throw new Error("Clipboard API not supported");
52
+ } catch (err) {
53
+ const copyError = err instanceof Error ? err : new Error(String(err));
54
+ setError(copyError);
55
+ setCopied(false);
56
+ return false;
57
+ }
58
+ };
59
+
60
+ onCleanup(() => {
61
+ clearTimer();
62
+ });
63
+
64
+ return {
65
+ copied,
66
+ copy,
67
+ error,
68
+ };
69
+ }
@@ -0,0 +1,115 @@
1
+ import { createEffect, createSignal, onCleanup, onMount, type Accessor } from "solid-js";
2
+
3
+ export type ColorMode = "light" | "dark" | "system";
4
+
5
+ export interface CreateColorModeOptions {
6
+ /** Initial color mode fallback. Defaults to 'system'. */
7
+ initialValue?: ColorMode;
8
+ /** LocalStorage key for persisting color mode state. Defaults to 'nikala-color-mode'. */
9
+ storageKey?: string;
10
+ /** HTML attribute to apply dark mode class on document.documentElement. Defaults to 'class'. */
11
+ attribute?: string;
12
+ }
13
+
14
+ export interface CreateColorModeReturn {
15
+ /** Accessor for current active color mode ('light', 'dark', 'system') */
16
+ mode: Accessor<ColorMode>;
17
+ /** Function to update current color mode */
18
+ setMode: (mode: ColorMode) => void;
19
+ /** Function to toggle color mode between 'light' and 'dark' */
20
+ toggleColorMode: () => void;
21
+ /** Accessor indicating if current resolved mode is dark */
22
+ isDark: Accessor<boolean>;
23
+ }
24
+
25
+ /**
26
+ * SolidJS reactive primitive for managing dark/light color mode themes and system preferences.
27
+ *
28
+ * @param options Configuration options including storage key and initial mode.
29
+ */
30
+ export function createColorMode(
31
+ options: CreateColorModeOptions = {}
32
+ ): CreateColorModeReturn {
33
+ const initialMode = options.initialValue ?? "system";
34
+ const storageKey = options.storageKey ?? "nikala-color-mode";
35
+ const attribute = options.attribute ?? "class";
36
+
37
+ const [mode, setModeSignal] = createSignal<ColorMode>(initialMode);
38
+ const [systemDark, setSystemDark] = createSignal(false);
39
+
40
+ const isDark = () => {
41
+ const currentMode = mode();
42
+ if (currentMode === "system") return systemDark();
43
+ return currentMode === "dark";
44
+ };
45
+
46
+ const applyTheme = (dark: boolean) => {
47
+ if (typeof document === "undefined") return;
48
+ const root = document.documentElement;
49
+ if (attribute === "class") {
50
+ if (dark) root.classList.add("dark");
51
+ else root.classList.remove("dark");
52
+ } else {
53
+ root.setAttribute(attribute, dark ? "dark" : "light");
54
+ }
55
+ };
56
+
57
+ const setMode = (newMode: ColorMode) => {
58
+ setModeSignal(newMode);
59
+ if (typeof window !== "undefined") {
60
+ try {
61
+ localStorage.setItem(storageKey, newMode);
62
+ } catch (e) {
63
+ console.warn(`[nikala-ui/hooks] Error setting color mode storage:`, e);
64
+ }
65
+ }
66
+ };
67
+
68
+ const toggleColorMode = () => {
69
+ const next = isDark() ? "light" : "dark";
70
+ setMode(next);
71
+ };
72
+
73
+ createEffect(() => {
74
+ applyTheme(isDark());
75
+ });
76
+
77
+ onMount(() => {
78
+ if (typeof window === "undefined") return;
79
+
80
+ // Check system preference
81
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
82
+ setSystemDark(mediaQuery.matches);
83
+
84
+ const handleMediaChange = (e: MediaQueryListEvent) => {
85
+ setSystemDark(e.matches);
86
+ };
87
+
88
+ if (mediaQuery.addEventListener) {
89
+ mediaQuery.addEventListener("change", handleMediaChange);
90
+ }
91
+
92
+ // Check localStorage
93
+ try {
94
+ const stored = localStorage.getItem(storageKey) as ColorMode | null;
95
+ if (stored && ["light", "dark", "system"].includes(stored)) {
96
+ setModeSignal(stored);
97
+ }
98
+ } catch (e) {
99
+ console.warn(`[nikala-ui/hooks] Error reading color mode storage:`, e);
100
+ }
101
+
102
+ onCleanup(() => {
103
+ if (mediaQuery.removeEventListener) {
104
+ mediaQuery.removeEventListener("change", handleMediaChange);
105
+ }
106
+ });
107
+ });
108
+
109
+ return {
110
+ mode,
111
+ setMode,
112
+ toggleColorMode,
113
+ isDark,
114
+ };
115
+ }
@@ -0,0 +1,56 @@
1
+ import { createSignal, type Accessor } from "solid-js";
2
+
3
+ export interface CreateControllableSignalOptions<T> {
4
+ /** Controlled value accessor or raw value */
5
+ value?: Accessor<T | undefined> | T;
6
+ /** Uncontrolled default initial value */
7
+ defaultValue?: T;
8
+ /** Callback fired whenever the value changes */
9
+ onChange?: (value: T) => void;
10
+ }
11
+
12
+ /**
13
+ * SolidJS reactive primitive for managing state supporting both controlled and uncontrolled modes.
14
+ *
15
+ * @param options Configuration options for value, defaultValue, and onChange callback.
16
+ * @returns A tuple containing [valueAccessor, setValueFunction].
17
+ */
18
+ export function createControllableSignal<T>(
19
+ options: CreateControllableSignalOptions<T>
20
+ ): [Accessor<T | undefined>, (nextValue: T | ((prev: T | undefined) => T)) => void] {
21
+ const [internalValue, setInternalValue] = createSignal<T | undefined>(
22
+ options.defaultValue
23
+ );
24
+
25
+ const getValue = (): T | undefined => {
26
+ if (typeof options.value === "function") {
27
+ return (options.value as Accessor<T | undefined>)();
28
+ }
29
+ return options.value;
30
+ };
31
+
32
+ const isControlled = () => getValue() !== undefined;
33
+
34
+ const value = () => {
35
+ const controlledVal = getValue();
36
+ return controlledVal !== undefined ? controlledVal : internalValue();
37
+ };
38
+
39
+ const setValue = (nextValue: T | ((prev: T | undefined) => T)) => {
40
+ const current = value();
41
+ const resolvedNext =
42
+ typeof nextValue === "function"
43
+ ? (nextValue as (prev: T | undefined) => T)(current)
44
+ : nextValue;
45
+
46
+ if (!isControlled()) {
47
+ setInternalValue(resolvedNext as any);
48
+ }
49
+
50
+ if (typeof options.onChange === "function") {
51
+ options.onChange(resolvedNext);
52
+ }
53
+ };
54
+
55
+ return [value, setValue];
56
+ }
@@ -0,0 +1,90 @@
1
+ import { onCleanup, type Accessor } from "solid-js";
2
+
3
+ export interface DebounceThrottleReturn<T extends (...args: any[]) => any> {
4
+ (...args: Parameters<T>): void;
5
+ clear: () => void;
6
+ }
7
+
8
+ /**
9
+ * SolidJS reactive primitive for debouncing function execution.
10
+ *
11
+ * @param fn Function to debounce.
12
+ * @param delay Delay in milliseconds (number or accessor).
13
+ */
14
+ export function createDebounce<T extends (...args: any[]) => any>(
15
+ fn: T,
16
+ delay: number | Accessor<number>
17
+ ): DebounceThrottleReturn<T> {
18
+ const getDelay = (): number => (typeof delay === "function" ? delay() : delay);
19
+ let timer: ReturnType<typeof setTimeout> | undefined;
20
+
21
+ const clear = () => {
22
+ if (timer) {
23
+ clearTimeout(timer);
24
+ timer = undefined;
25
+ }
26
+ };
27
+
28
+ const debounced = (...args: Parameters<T>) => {
29
+ clear();
30
+ timer = setTimeout(() => {
31
+ fn(...args);
32
+ }, getDelay());
33
+ };
34
+
35
+ debounced.clear = clear;
36
+
37
+ onCleanup(() => {
38
+ clear();
39
+ });
40
+
41
+ return debounced;
42
+ }
43
+
44
+ /**
45
+ * SolidJS reactive primitive for throttling function execution.
46
+ *
47
+ * @param fn Function to throttle.
48
+ * @param delay Interval in milliseconds (number or accessor).
49
+ */
50
+ export function createThrottle<T extends (...args: any[]) => any>(
51
+ fn: T,
52
+ delay: number | Accessor<number>
53
+ ): DebounceThrottleReturn<T> {
54
+ const getDelay = (): number => (typeof delay === "function" ? delay() : delay);
55
+ let lastCall = 0;
56
+ let timer: ReturnType<typeof setTimeout> | undefined;
57
+
58
+ const clear = () => {
59
+ if (timer) {
60
+ clearTimeout(timer);
61
+ timer = undefined;
62
+ }
63
+ };
64
+
65
+ const throttled = (...args: Parameters<T>) => {
66
+ const now = Date.now();
67
+ const interval = getDelay();
68
+ const remaining = interval - (now - lastCall);
69
+
70
+ if (remaining <= 0) {
71
+ clear();
72
+ lastCall = now;
73
+ fn(...args);
74
+ } else if (!timer) {
75
+ timer = setTimeout(() => {
76
+ lastCall = Date.now();
77
+ timer = undefined;
78
+ fn(...args);
79
+ }, remaining);
80
+ }
81
+ };
82
+
83
+ throttled.clear = clear;
84
+
85
+ onCleanup(() => {
86
+ clear();
87
+ });
88
+
89
+ return throttled;
90
+ }
@@ -0,0 +1,82 @@
1
+ import { createSignal, type Accessor } from "solid-js";
2
+
3
+ export interface CreateDisclosureOptions {
4
+ /** Uncontrolled initial open state. Defaults to false. */
5
+ defaultIsOpen?: boolean;
6
+ /** Controlled open state accessor */
7
+ isOpen?: boolean | Accessor<boolean | undefined>;
8
+ /** Callback triggered when state transitions to open */
9
+ onOpen?: () => void;
10
+ /** Callback triggered when state transitions to closed */
11
+ onClose?: () => void;
12
+ /** Callback triggered whenever open state changes */
13
+ onChange?: (isOpen: boolean) => void;
14
+ }
15
+
16
+ export interface CreateDisclosureReturn {
17
+ /** Signal accessor indicating if disclosure is open */
18
+ isOpen: Accessor<boolean>;
19
+ /** Function to open the disclosure */
20
+ open: () => void;
21
+ /** Function to close the disclosure */
22
+ close: () => void;
23
+ /** Function to toggle the disclosure open state */
24
+ toggle: () => void;
25
+ /** Setter function to programmatically set open state */
26
+ setOpen: (open: boolean) => void;
27
+ }
28
+
29
+ /**
30
+ * SolidJS reactive primitive for managing boolean disclosure (open/close) state with controlled and uncontrolled support.
31
+ *
32
+ * @param options Configuration options including initial state and callbacks.
33
+ */
34
+ export function createDisclosure(options: CreateDisclosureOptions = {}): CreateDisclosureReturn {
35
+ const [internalOpen, setInternalOpen] = createSignal<boolean>(
36
+ options.defaultIsOpen ?? false
37
+ );
38
+
39
+ const isControlled = () => {
40
+ if (typeof options.isOpen === "function") {
41
+ return options.isOpen() !== undefined;
42
+ }
43
+ return options.isOpen !== undefined;
44
+ };
45
+
46
+ const isOpen = (): boolean => {
47
+ if (typeof options.isOpen === "function") {
48
+ const val = options.isOpen();
49
+ return val !== undefined ? val : internalOpen();
50
+ }
51
+ return options.isOpen !== undefined ? options.isOpen : internalOpen();
52
+ };
53
+
54
+ const setOpenState = (nextState: boolean) => {
55
+ const currentState = isOpen();
56
+ if (currentState === nextState) return;
57
+
58
+ if (!isControlled()) {
59
+ setInternalOpen(nextState);
60
+ }
61
+
62
+ options.onChange?.(nextState);
63
+
64
+ if (nextState) {
65
+ options.onOpen?.();
66
+ } else {
67
+ options.onClose?.();
68
+ }
69
+ };
70
+
71
+ const open = () => setOpenState(true);
72
+ const close = () => setOpenState(false);
73
+ const toggle = () => setOpenState(!isOpen());
74
+
75
+ return {
76
+ isOpen,
77
+ open,
78
+ close,
79
+ toggle,
80
+ setOpen: setOpenState,
81
+ };
82
+ }