@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,318 @@
1
+ import { createSignal, Show, type Component } from "solid-js";
2
+ import { createForm } from "@nikala-ui/hooks";
3
+ import {
4
+ Card,
5
+ CardHeader,
6
+ CardTitle,
7
+ CardDescription,
8
+ CardContent,
9
+ CardFooter,
10
+ } from "../components/ui/card";
11
+ import { Form } from "../components/ui/form";
12
+ import { Field, FieldLabel } from "../components/ui/field";
13
+ import { FormMessage } from "../components/ui/form-message";
14
+ import { Button } from "../components/ui/button";
15
+ import { Input } from "../components/ui/input";
16
+ import { Checkbox } from "../components/ui/checkbox";
17
+ import { Label } from "../components/ui/label";
18
+ import { Progress } from "../components/ui/progress";
19
+ import { Badge } from "../components/ui/badge";
20
+ import { Separator } from "../components/ui/separator";
21
+ import { Eye, EyeOff, Check, X, ArrowRight, ShieldCheck } from "lucide-solid";
22
+
23
+ export const Register01: Component = () => {
24
+ const [showPassword, setShowPassword] = createSignal(false);
25
+
26
+ const form = createForm({
27
+ initialValues: {
28
+ fullName: "",
29
+ email: "",
30
+ password: "",
31
+ agreeTerms: false,
32
+ },
33
+ validate: (values) => {
34
+ const errors: Record<string, string> = {};
35
+ if (!values.fullName.trim()) {
36
+ errors.fullName = "Full name is required";
37
+ }
38
+ if (!values.email.trim()) {
39
+ errors.email = "Email is required";
40
+ } else if (!values.email.includes("@")) {
41
+ errors.email = "Please enter a valid email address";
42
+ }
43
+ if (!values.password) {
44
+ errors.password = "Password is required";
45
+ } else if (values.password.length < 8) {
46
+ errors.password = "Password must be at least 8 characters";
47
+ }
48
+ if (!values.agreeTerms) {
49
+ errors.agreeTerms = "You must agree to the terms and privacy policy";
50
+ }
51
+ return errors;
52
+ },
53
+ onSubmit: async (values) => {
54
+ // Simulate API registration request
55
+ await new Promise((resolve) => setTimeout(resolve, 1200));
56
+ },
57
+ });
58
+
59
+ const password = () => form.values().password;
60
+
61
+ // Reactive password criteria calculations
62
+ const hasMinLength = () => password().length >= 8;
63
+ const hasNumber = () => /\d/.test(password());
64
+ const hasSpecial = () => /[^A-Za-z0-9]/.test(password());
65
+ const hasUpperLower = () => /[a-z]/.test(password()) && /[A-Z]/.test(password());
66
+
67
+ const strengthScore = () => {
68
+ let score = 0;
69
+ if (password().length === 0) return 0;
70
+ if (hasMinLength()) score += 25;
71
+ if (hasNumber()) score += 25;
72
+ if (hasSpecial()) score += 25;
73
+ if (hasUpperLower()) score += 25;
74
+ return score;
75
+ };
76
+
77
+ const strengthLabel = () => {
78
+ const score = strengthScore();
79
+ if (score === 0) return "None";
80
+ if (score <= 25) return "Weak";
81
+ if (score <= 50) return "Fair";
82
+ if (score <= 75) return "Good";
83
+ return "Strong";
84
+ };
85
+
86
+ const strengthColorClass = () => {
87
+ const score = strengthScore();
88
+ if (score <= 25) return "bg-destructive";
89
+ if (score <= 50) return "bg-amber-500";
90
+ if (score <= 75) return "bg-blue-500";
91
+ return "bg-emerald-500";
92
+ };
93
+
94
+ const strengthBadgeVariant = () => {
95
+ const score = strengthScore();
96
+ if (score <= 25) return "destructive";
97
+ if (score <= 50) return "outline";
98
+ return "secondary";
99
+ };
100
+
101
+ const isFormValid = () =>
102
+ form.values().fullName.trim() !== "" &&
103
+ form.values().email.trim() !== "" &&
104
+ form.values().agreeTerms &&
105
+ strengthScore() >= 50;
106
+
107
+ return (
108
+ <div class="@container w-full min-h-[600px] flex items-center justify-center p-4 sm:p-6 md:p-10">
109
+ <Card class="w-full max-w-lg border-border shadow-md bg-card">
110
+ {/* Card Header */}
111
+ <CardHeader class="space-y-2 text-center pb-6">
112
+ <div class="mx-auto size-10 rounded-lg bg-primary/10 text-primary flex items-center justify-center mb-1">
113
+ <ShieldCheck class="size-5" />
114
+ </div>
115
+ <CardTitle class="text-2xl font-bold tracking-tight">Create your account</CardTitle>
116
+ <CardDescription class="text-xs sm:text-sm">
117
+ Join thousands of developers building fast SolidJS interfaces
118
+ </CardDescription>
119
+ </CardHeader>
120
+
121
+ <CardContent class="space-y-6">
122
+ {/* Social OAuth Buttons */}
123
+ <div class="grid grid-cols-1 @xs:grid-cols-2 gap-2.5">
124
+ <Button variant="outline" class="w-full justify-center text-xs h-9">
125
+ <svg class="size-4 mr-2 shrink-0" viewBox="0 0 24 24" fill="currentColor">
126
+ <path d="M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0024 12c0-6.63-5.37-12-12-12z" />
127
+ </svg>
128
+ GitHub
129
+ </Button>
130
+ <Button variant="outline" class="w-full justify-center text-xs h-9">
131
+ <svg class="size-4 mr-2 shrink-0" viewBox="0 0 24 24">
132
+ <path
133
+ fill="#4285F4"
134
+ d="M23.745 12.27c0-.7-.06-1.4-.19-2.07H12v4.51h6.6c-.29 1.52-1.14 2.82-2.4 3.68v3.05h3.88c2.27-2.09 3.66-5.17 3.66-9.17z"
135
+ />
136
+ <path
137
+ fill="#34A853"
138
+ d="M12 24c3.24 0 5.95-1.08 7.93-2.91l-3.88-3.05c-1.08.72-2.45 1.16-4.05 1.16-3.12 0-5.77-2.1-6.72-4.93H1.25v3.15C3.26 21.36 7.33 24 12 24z"
139
+ />
140
+ <path
141
+ fill="#FBBC05"
142
+ d="M5.28 14.27c-.25-.72-.38-1.49-.38-2.27s.13-1.55.38-2.27V6.58H1.25C.45 8.18 0 10.03 0 12s.45 3.82 1.25 5.42l4.03-3.15z"
143
+ />
144
+ <path
145
+ fill="#EA4335"
146
+ d="M12 4.75c1.77 0 3.35.61 4.6 1.8l3.42-3.42C17.95 1.19 15.24 0 12 0 7.33 0 3.26 2.64 1.25 6.58l4.03 3.15c.95-2.83 3.6-4.98 6.72-4.98z"
147
+ />
148
+ </svg>
149
+ Google
150
+ </Button>
151
+ </div>
152
+
153
+ <div class="relative">
154
+ <div class="absolute inset-0 flex items-center">
155
+ <Separator />
156
+ </div>
157
+ <div class="relative flex justify-center text-xs uppercase">
158
+ <span class="bg-card px-3 text-muted-foreground font-medium text-[11px]">
159
+ Or register with email
160
+ </span>
161
+ </div>
162
+ </div>
163
+
164
+ {/* Registration Form with Nikala UI Form & Field ecosystem */}
165
+ <Form onSubmit={form.handleSubmit} loading={form.isSubmitting()} class="space-y-4">
166
+ <Field>
167
+ <FieldLabel for="reg-name" class="text-xs sm:text-sm">Full Name</FieldLabel>
168
+ <Input
169
+ id="reg-name"
170
+ type="text"
171
+ placeholder="Niko Pirosmani"
172
+ value={form.values().fullName}
173
+ onInput={form.handleChange("fullName")}
174
+ onBlur={form.handleBlur("fullName")}
175
+ autocomplete="name"
176
+ />
177
+ <FormMessage form={form} name="fullName" />
178
+ </Field>
179
+
180
+ <Field>
181
+ <FieldLabel for="reg-email" class="text-xs sm:text-sm">Email Address</FieldLabel>
182
+ <Input
183
+ id="reg-email"
184
+ type="email"
185
+ placeholder="niko@nikala.dev"
186
+ value={form.values().email}
187
+ onInput={form.handleChange("email")}
188
+ onBlur={form.handleBlur("email")}
189
+ autocomplete="email"
190
+ />
191
+ <FormMessage form={form} name="email" />
192
+ </Field>
193
+
194
+ {/* Password with Strength Meter */}
195
+ <Field class="space-y-1.5">
196
+ <div class="flex items-center justify-between">
197
+ <FieldLabel for="reg-password" class="text-xs sm:text-sm">Password</FieldLabel>
198
+ <Show when={password().length > 0}>
199
+ <Badge variant={strengthBadgeVariant()} class="text-[10px] px-1.5 py-0 font-mono">
200
+ {strengthLabel()}
201
+ </Badge>
202
+ </Show>
203
+ </div>
204
+
205
+ <div class="relative">
206
+ <Input
207
+ id="reg-password"
208
+ type={showPassword() ? "text" : "password"}
209
+ placeholder="Create a strong password"
210
+ value={form.values().password}
211
+ onInput={form.handleChange("password")}
212
+ onBlur={form.handleBlur("password")}
213
+ autocomplete="new-password"
214
+ class="pr-10"
215
+ />
216
+ <button
217
+ type="button"
218
+ onClick={() => setShowPassword(!showPassword())}
219
+ class="absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors p-1 cursor-pointer"
220
+ aria-label={showPassword() ? "Hide password" : "Show password"}
221
+ >
222
+ <Show when={showPassword()} fallback={<Eye class="size-4" />}>
223
+ <EyeOff class="size-4" />
224
+ </Show>
225
+ </button>
226
+ </div>
227
+ <FormMessage form={form} name="password" />
228
+
229
+ {/* Reactive Password Strength Progress Bar */}
230
+ <Show when={password().length > 0}>
231
+ <Progress
232
+ value={strengthScore()}
233
+ class="h-1.5 mt-2"
234
+ indicatorClass={strengthColorClass()}
235
+ />
236
+
237
+ {/* Validation Checklist */}
238
+ <div class="grid grid-cols-2 gap-1.5 pt-1 text-[11px] text-muted-foreground">
239
+ <div class={`flex items-center gap-1.5 ${hasMinLength() ? "text-emerald-500 font-medium" : ""}`}>
240
+ <Show when={hasMinLength()} fallback={<X class="size-3 text-muted-foreground/60" />}>
241
+ <Check class="size-3" />
242
+ </Show>
243
+ <span>8+ characters</span>
244
+ </div>
245
+ <div class={`flex items-center gap-1.5 ${hasNumber() ? "text-emerald-500 font-medium" : ""}`}>
246
+ <Show when={hasNumber()} fallback={<X class="size-3 text-muted-foreground/60" />}>
247
+ <Check class="size-3" />
248
+ </Show>
249
+ <span>At least 1 number</span>
250
+ </div>
251
+ <div class={`flex items-center gap-1.5 ${hasUpperLower() ? "text-emerald-500 font-medium" : ""}`}>
252
+ <Show when={hasUpperLower()} fallback={<X class="size-3 text-muted-foreground/60" />}>
253
+ <Check class="size-3" />
254
+ </Show>
255
+ <span>Uppercase & lowercase</span>
256
+ </div>
257
+ <div class={`flex items-center gap-1.5 ${hasSpecial() ? "text-emerald-500 font-medium" : ""}`}>
258
+ <Show when={hasSpecial()} fallback={<X class="size-3 text-muted-foreground/60" />}>
259
+ <Check class="size-3" />
260
+ </Show>
261
+ <span>1 special symbol</span>
262
+ </div>
263
+ </div>
264
+ </Show>
265
+ </Field>
266
+
267
+ {/* Terms of Service Agreement */}
268
+ <div class="space-y-1 pt-1">
269
+ <div class="flex items-start space-x-2.5">
270
+ <Checkbox
271
+ id="reg-terms"
272
+ checked={form.values().agreeTerms}
273
+ onChange={(checked) => form.setFieldValue("agreeTerms", checked)}
274
+ class="mt-0.5"
275
+ />
276
+ <Label
277
+ for="reg-terms"
278
+ class="text-xs font-normal text-muted-foreground cursor-pointer select-none leading-tight"
279
+ >
280
+ I agree to the{" "}
281
+ <a href="#terms" class="text-primary font-medium underline hover:text-primary/80">
282
+ Terms of Service
283
+ </a>{" "}
284
+ and{" "}
285
+ <a href="#privacy" class="text-primary font-medium underline hover:text-primary/80">
286
+ Privacy Policy
287
+ </a>.
288
+ </Label>
289
+ </div>
290
+ <FormMessage form={form} name="agreeTerms" />
291
+ </div>
292
+
293
+ {/* Submit Button */}
294
+ <Button
295
+ type="submit"
296
+ class="w-full mt-3 font-medium"
297
+ disabled={form.isSubmitting() || !isFormValid()}
298
+ >
299
+ <Show when={form.isSubmitting()} fallback={<>Create Account <ArrowRight class="ml-2 size-4" /></>}>
300
+ Creating account...
301
+ </Show>
302
+ </Button>
303
+ </Form>
304
+ </CardContent>
305
+
306
+ {/* Card Footer */}
307
+ <CardFooter class="justify-center border-t border-border/50 py-4 text-xs text-muted-foreground">
308
+ Already have an account?{" "}
309
+ <a href="/blocks/login-01" class="text-primary font-semibold hover:underline ml-1">
310
+ Sign in
311
+ </a>
312
+ </CardFooter>
313
+ </Card>
314
+ </div>
315
+ );
316
+ };
317
+
318
+ export default Register01;
@@ -0,0 +1,128 @@
1
+ import { splitProps, type JSX, type ValidComponent } from "solid-js";
2
+ import * as AccordionPrimitive from "@kobalte/core/accordion";
3
+ import type { PolymorphicProps } from "@kobalte/core/polymorphic";
4
+ import { cn } from "@/lib/cn";
5
+
6
+ export type AccordionRootProps<T extends ValidComponent = "div"> = Omit<
7
+ AccordionPrimitive.AccordionRootProps<T>,
8
+ "value" | "defaultValue"
9
+ > & {
10
+ /** Accordion mode: "single" allows one open item, "multiple" allows many */
11
+ type?: "single" | "multiple";
12
+ /** Controlled value (single string or array of strings) */
13
+ value?: string | string[];
14
+ /** Default initial value (single string or array of strings) */
15
+ defaultValue?: string | string[];
16
+ class?: string;
17
+ };
18
+
19
+ /**
20
+ * Root Accordion component built on top of Kobalte headless primitives.
21
+ */
22
+ export const Accordion = <T extends ValidComponent = "div">(
23
+ props: PolymorphicProps<T, AccordionRootProps<T>>
24
+ ) => {
25
+ const [local, rest] = splitProps(props as AccordionRootProps, [
26
+ "class",
27
+ "type",
28
+ "multiple",
29
+ ]);
30
+
31
+ // Support both `type="multiple"` and `multiple={true}`
32
+ const isMultiple = () => local.multiple ?? local.type === "multiple";
33
+
34
+ return (
35
+ <AccordionPrimitive.Root
36
+ multiple={isMultiple()}
37
+ class={cn("w-full divide-y divide-border", local.class)}
38
+ {...(rest as any)}
39
+ />
40
+ );
41
+ };
42
+
43
+ export type AccordionItemProps<T extends ValidComponent = "div"> =
44
+ AccordionPrimitive.AccordionItemProps<T> & {
45
+ class?: string;
46
+ value: string;
47
+ };
48
+
49
+ /**
50
+ * Individual Accordion section item wrapper.
51
+ */
52
+ export const AccordionItem = <T extends ValidComponent = "div">(
53
+ props: PolymorphicProps<T, AccordionItemProps<T>>
54
+ ) => {
55
+ const [local, rest] = splitProps(props as AccordionItemProps, ["class"]);
56
+
57
+ return (
58
+ <AccordionPrimitive.Item
59
+ class={cn("border-b border-border", local.class)}
60
+ {...rest}
61
+ />
62
+ );
63
+ };
64
+
65
+ export type AccordionTriggerProps<T extends ValidComponent = "button"> =
66
+ AccordionPrimitive.AccordionTriggerProps<T> & {
67
+ class?: string;
68
+ children?: JSX.Element;
69
+ };
70
+
71
+ /**
72
+ * Header trigger button toggling the expansion of an AccordionItem.
73
+ */
74
+ export const AccordionTrigger = <T extends ValidComponent = "button">(
75
+ props: PolymorphicProps<T, AccordionTriggerProps<T>>
76
+ ) => {
77
+ const [local, rest] = splitProps(props as AccordionTriggerProps, ["class", "children"]);
78
+
79
+ return (
80
+ <AccordionPrimitive.Header class="flex">
81
+ <AccordionPrimitive.Trigger
82
+ class={cn(
83
+ "flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-expanded]>svg]:rotate-180 cursor-pointer text-foreground",
84
+ local.class
85
+ )}
86
+ {...rest}
87
+ >
88
+ {local.children}
89
+ <svg
90
+ class="h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200"
91
+ viewBox="0 0 24 24"
92
+ fill="none"
93
+ stroke="currentColor"
94
+ stroke-width="2"
95
+ >
96
+ <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" />
97
+ </svg>
98
+ </AccordionPrimitive.Trigger>
99
+ </AccordionPrimitive.Header>
100
+ );
101
+ };
102
+
103
+ export type AccordionContentProps<T extends ValidComponent = "div"> =
104
+ AccordionPrimitive.AccordionContentProps<T> & {
105
+ class?: string;
106
+ children?: JSX.Element;
107
+ };
108
+
109
+ /**
110
+ * Collapsible content panel revealed when the associated AccordionItem is open.
111
+ */
112
+ export const AccordionContent = <T extends ValidComponent = "div">(
113
+ props: PolymorphicProps<T, AccordionContentProps<T>>
114
+ ) => {
115
+ const [local, rest] = splitProps(props as AccordionContentProps, ["class", "children"]);
116
+
117
+ return (
118
+ <AccordionPrimitive.Content
119
+ class={cn(
120
+ "overflow-hidden text-sm text-muted-foreground transition-all",
121
+ local.class
122
+ )}
123
+ {...rest}
124
+ >
125
+ <div class="pb-4 pt-0">{local.children}</div>
126
+ </AccordionPrimitive.Content>
127
+ );
128
+ };
@@ -0,0 +1,155 @@
1
+ import {
2
+ createSignal,
3
+ splitProps,
4
+ onMount,
5
+ onCleanup,
6
+ Show,
7
+ type Component,
8
+ type JSX,
9
+ } from "solid-js";
10
+ import { cva, type VariantProps } from "class-variance-authority";
11
+ import { cn } from "@/lib/cn";
12
+
13
+ /**
14
+ * CVA variants for Alert status styles and color themes.
15
+ */
16
+ export const alertVariants = cva(
17
+ "relative w-full rounded-lg border p-4 transition-all duration-200 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground",
18
+ {
19
+ variants: {
20
+ variant: {
21
+ default:
22
+ "bg-background text-foreground border-border",
23
+ info:
24
+ "bg-blue-50 text-blue-900 border-blue-200 dark:bg-blue-950/50 dark:text-blue-200 dark:border-blue-900/50",
25
+ success:
26
+ "bg-emerald-50 text-emerald-900 border-emerald-200 dark:bg-emerald-950/50 dark:text-emerald-200 dark:border-emerald-900/50",
27
+ warning:
28
+ "bg-amber-50 text-amber-900 border-amber-200 dark:bg-amber-950/50 dark:text-amber-200 dark:border-amber-950/50",
29
+ destructive:
30
+ "bg-destructive/15 text-destructive border-destructive/30",
31
+ },
32
+ },
33
+ defaultVariants: {
34
+ variant: "default",
35
+ },
36
+ }
37
+ );
38
+
39
+ export interface AlertProps
40
+ extends JSX.HTMLAttributes<HTMLDivElement>,
41
+ VariantProps<typeof alertVariants> {
42
+ /** Display an interactive close (X) button */
43
+ closable?: boolean;
44
+ /** Auto-dismiss timer duration in milliseconds */
45
+ duration?: number;
46
+ /** Callback fired when the alert is dismissed */
47
+ onClose?: () => void;
48
+ class?: string;
49
+ }
50
+
51
+ /**
52
+ * Nikala UI Alert notification banner with auto-dismiss timer and theme variants.
53
+ */
54
+ export const Alert: Component<AlertProps> = (props) => {
55
+ const [local, rest] = splitProps(props, [
56
+ "variant",
57
+ "closable",
58
+ "duration",
59
+ "onClose",
60
+ "class",
61
+ "children",
62
+ ]);
63
+
64
+ const [isVisible, setIsVisible] = createSignal(true);
65
+ let timer: ReturnType<typeof setTimeout> | undefined;
66
+
67
+ const handleClose = () => {
68
+ setIsVisible(false);
69
+ if (typeof local.onClose === "function") {
70
+ local.onClose();
71
+ }
72
+ };
73
+
74
+ onMount(() => {
75
+ if (local.duration && local.duration > 0) {
76
+ timer = setTimeout(() => {
77
+ handleClose();
78
+ }, local.duration);
79
+ }
80
+ });
81
+
82
+ onCleanup(() => {
83
+ if (timer) clearTimeout(timer);
84
+ });
85
+
86
+ return (
87
+ <Show when={isVisible()}>
88
+ <div
89
+ role="alert"
90
+ class={cn(
91
+ alertVariants({ variant: local.variant }),
92
+ "animate-in fade-in-0 duration-200",
93
+ local.class
94
+ )}
95
+ {...rest}
96
+ >
97
+ {local.children}
98
+ <Show when={local.closable || typeof local.onClose === "function"}>
99
+ <button
100
+ type="button"
101
+ aria-label="Close alert"
102
+ onClick={handleClose}
103
+ class="absolute right-3 top-3 rounded-md p-1 text-zinc-500 hover:bg-zinc-100 hover:text-zinc-900 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-50 transition-colors cursor-pointer"
104
+ >
105
+ <svg
106
+ class="h-4 w-4"
107
+ viewBox="0 0 24 24"
108
+ fill="none"
109
+ stroke="currentColor"
110
+ stroke-width="2"
111
+ >
112
+ <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
113
+ </svg>
114
+ </button>
115
+ </Show>
116
+ </div>
117
+ </Show>
118
+ );
119
+ };
120
+
121
+ export interface AlertTitleProps extends JSX.HTMLAttributes<HTMLHeadingElement> {
122
+ class?: string;
123
+ }
124
+
125
+ /**
126
+ * Header title element for the Alert banner.
127
+ */
128
+ export const AlertTitle: Component<AlertTitleProps> = (props) => {
129
+ const [local, rest] = splitProps(props, ["class"]);
130
+
131
+ return (
132
+ <h5
133
+ class={cn("mb-1 font-medium leading-none tracking-tight text-foreground", local.class)}
134
+ {...rest}
135
+ />
136
+ );
137
+ };
138
+
139
+ export interface AlertDescriptionProps extends JSX.HTMLAttributes<HTMLDivElement> {
140
+ class?: string;
141
+ }
142
+
143
+ /**
144
+ * Body text content for the Alert banner.
145
+ */
146
+ export const AlertDescription: Component<AlertDescriptionProps> = (props) => {
147
+ const [local, rest] = splitProps(props, ["class"]);
148
+
149
+ return (
150
+ <div
151
+ class={cn("text-sm [&_p]:leading-relaxed text-muted-foreground", local.class)}
152
+ {...rest}
153
+ />
154
+ );
155
+ };