@nikala-ui/folio 0.13.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 (454) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +221 -0
  3. package/dist/cli/commands/build.d.ts +5 -0
  4. package/dist/cli/commands/build.d.ts.map +1 -0
  5. package/dist/cli/commands/build.js +28 -0
  6. package/dist/cli/commands/build.js.map +1 -0
  7. package/dist/cli/commands/dev.d.ts +7 -0
  8. package/dist/cli/commands/dev.d.ts.map +1 -0
  9. package/dist/cli/commands/dev.js +33 -0
  10. package/dist/cli/commands/dev.js.map +1 -0
  11. package/dist/cli/commands/init.d.ts +2 -0
  12. package/dist/cli/commands/init.d.ts.map +1 -0
  13. package/dist/cli/commands/init.js +359 -0
  14. package/dist/cli/commands/init.js.map +1 -0
  15. package/dist/cli/commands/preview.d.ts +7 -0
  16. package/dist/cli/commands/preview.d.ts.map +1 -0
  17. package/dist/cli/commands/preview.js +25 -0
  18. package/dist/cli/commands/preview.js.map +1 -0
  19. package/dist/cli/commands/serve.d.ts +7 -0
  20. package/dist/cli/commands/serve.d.ts.map +1 -0
  21. package/dist/cli/commands/serve.js +34 -0
  22. package/dist/cli/commands/serve.js.map +1 -0
  23. package/dist/cli/index.d.ts +3 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +55 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/client/app-types.d.ts +18 -0
  28. package/dist/client/app-types.d.ts.map +1 -0
  29. package/dist/client/app-types.js +2 -0
  30. package/dist/client/app-types.js.map +1 -0
  31. package/dist/client/app.d.ts +5 -0
  32. package/dist/client/app.d.ts.map +1 -0
  33. package/dist/client/app.jsx +51 -0
  34. package/dist/client/app.jsx.map +1 -0
  35. package/dist/client/base.css +90 -0
  36. package/dist/client/components/docs-layout-shell.d.ts +23 -0
  37. package/dist/client/components/docs-layout-shell.d.ts.map +1 -0
  38. package/dist/client/components/docs-layout-shell.jsx +15 -0
  39. package/dist/client/components/docs-layout-shell.jsx.map +1 -0
  40. package/dist/client/components/docs-page-content.d.ts +9 -0
  41. package/dist/client/components/docs-page-content.d.ts.map +1 -0
  42. package/dist/client/components/docs-page-content.jsx +10 -0
  43. package/dist/client/components/docs-page-content.jsx.map +1 -0
  44. package/dist/client/entry.d.ts +2 -0
  45. package/dist/client/entry.d.ts.map +1 -0
  46. package/dist/client/entry.jsx +32 -0
  47. package/dist/client/entry.jsx.map +1 -0
  48. package/dist/client/index.html +23 -0
  49. package/dist/client/navigation/page-navigation.d.ts +9 -0
  50. package/dist/client/navigation/page-navigation.d.ts.map +1 -0
  51. package/dist/client/navigation/page-navigation.js +51 -0
  52. package/dist/client/navigation/page-navigation.js.map +1 -0
  53. package/dist/client/page-actions.d.ts +10 -0
  54. package/dist/client/page-actions.d.ts.map +1 -0
  55. package/dist/client/page-actions.js +63 -0
  56. package/dist/client/page-actions.js.map +1 -0
  57. package/dist/client/public/favicon.ico +0 -0
  58. package/dist/client/routing/use-docs-router.d.ts +17 -0
  59. package/dist/client/routing/use-docs-router.d.ts.map +1 -0
  60. package/dist/client/routing/use-docs-router.js +87 -0
  61. package/dist/client/routing/use-docs-router.js.map +1 -0
  62. package/dist/client/ssr-entry.d.ts +3 -0
  63. package/dist/client/ssr-entry.d.ts.map +1 -0
  64. package/dist/client/ssr-entry.jsx +13 -0
  65. package/dist/client/ssr-entry.jsx.map +1 -0
  66. package/dist/client/style.css +186 -0
  67. package/dist/client/utils/sidebar.d.ts +2 -0
  68. package/dist/client/utils/sidebar.d.ts.map +1 -0
  69. package/dist/client/utils/sidebar.js +2 -0
  70. package/dist/client/utils/sidebar.js.map +1 -0
  71. package/dist/components/mdx-components.d.ts +65 -0
  72. package/dist/components/mdx-components.d.ts.map +1 -0
  73. package/dist/components/mdx-components.jsx +133 -0
  74. package/dist/components/mdx-components.jsx.map +1 -0
  75. package/dist/components/ui/api-table.d.ts +29 -0
  76. package/dist/components/ui/api-table.d.ts.map +1 -0
  77. package/dist/components/ui/api-table.jsx +66 -0
  78. package/dist/components/ui/api-table.jsx.map +1 -0
  79. package/dist/components/ui/badge.d.ts +17 -0
  80. package/dist/components/ui/badge.d.ts.map +1 -0
  81. package/dist/components/ui/badge.jsx +33 -0
  82. package/dist/components/ui/badge.jsx.map +1 -0
  83. package/dist/components/ui/breadcrumb.d.ts +51 -0
  84. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  85. package/dist/components/ui/breadcrumb.jsx +62 -0
  86. package/dist/components/ui/breadcrumb.jsx.map +1 -0
  87. package/dist/components/ui/button.d.ts +19 -0
  88. package/dist/components/ui/button.d.ts.map +1 -0
  89. package/dist/components/ui/button.jsx +54 -0
  90. package/dist/components/ui/button.jsx.map +1 -0
  91. package/dist/components/ui/callout.d.ts +21 -0
  92. package/dist/components/ui/callout.d.ts.map +1 -0
  93. package/dist/components/ui/callout.jsx +76 -0
  94. package/dist/components/ui/callout.jsx.map +1 -0
  95. package/dist/components/ui/card.d.ts +44 -0
  96. package/dist/components/ui/card.d.ts.map +1 -0
  97. package/dist/components/ui/card.jsx +45 -0
  98. package/dist/components/ui/card.jsx.map +1 -0
  99. package/dist/components/ui/code-block.d.ts +23 -0
  100. package/dist/components/ui/code-block.d.ts.map +1 -0
  101. package/dist/components/ui/code-block.jsx +263 -0
  102. package/dist/components/ui/code-block.jsx.map +1 -0
  103. package/dist/components/ui/collapsible.d.ts +27 -0
  104. package/dist/components/ui/collapsible.d.ts.map +1 -0
  105. package/dist/components/ui/collapsible.jsx +29 -0
  106. package/dist/components/ui/collapsible.jsx.map +1 -0
  107. package/dist/components/ui/command.d.ts +57 -0
  108. package/dist/components/ui/command.d.ts.map +1 -0
  109. package/dist/components/ui/command.jsx +224 -0
  110. package/dist/components/ui/command.jsx.map +1 -0
  111. package/dist/components/ui/component-viewer.d.ts +33 -0
  112. package/dist/components/ui/component-viewer.d.ts.map +1 -0
  113. package/dist/components/ui/component-viewer.jsx +210 -0
  114. package/dist/components/ui/component-viewer.jsx.map +1 -0
  115. package/dist/components/ui/container.d.ts +13 -0
  116. package/dist/components/ui/container.d.ts.map +1 -0
  117. package/dist/components/ui/container.jsx +29 -0
  118. package/dist/components/ui/container.jsx.map +1 -0
  119. package/dist/components/ui/dropdown-menu.d.ts +58 -0
  120. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  121. package/dist/components/ui/dropdown-menu.jsx +112 -0
  122. package/dist/components/ui/dropdown-menu.jsx.map +1 -0
  123. package/dist/components/ui/input-group.d.ts +16 -0
  124. package/dist/components/ui/input-group.d.ts.map +1 -0
  125. package/dist/components/ui/input-group.jsx +33 -0
  126. package/dist/components/ui/input-group.jsx.map +1 -0
  127. package/dist/components/ui/kbd.d.ts +15 -0
  128. package/dist/components/ui/kbd.d.ts.map +1 -0
  129. package/dist/components/ui/kbd.jsx +42 -0
  130. package/dist/components/ui/kbd.jsx.map +1 -0
  131. package/dist/components/ui/list.d.ts +36 -0
  132. package/dist/components/ui/list.d.ts.map +1 -0
  133. package/dist/components/ui/list.jsx +131 -0
  134. package/dist/components/ui/list.jsx.map +1 -0
  135. package/dist/components/ui/logo.d.ts +9 -0
  136. package/dist/components/ui/logo.d.ts.map +1 -0
  137. package/dist/components/ui/logo.jsx +31 -0
  138. package/dist/components/ui/logo.jsx.map +1 -0
  139. package/dist/components/ui/navbar.d.ts +57 -0
  140. package/dist/components/ui/navbar.d.ts.map +1 -0
  141. package/dist/components/ui/navbar.jsx +174 -0
  142. package/dist/components/ui/navbar.jsx.map +1 -0
  143. package/dist/components/ui/package-manager-tabs.d.ts +21 -0
  144. package/dist/components/ui/package-manager-tabs.d.ts.map +1 -0
  145. package/dist/components/ui/package-manager-tabs.jsx +167 -0
  146. package/dist/components/ui/package-manager-tabs.jsx.map +1 -0
  147. package/dist/components/ui/pager.d.ts +27 -0
  148. package/dist/components/ui/pager.d.ts.map +1 -0
  149. package/dist/components/ui/pager.jsx +50 -0
  150. package/dist/components/ui/pager.jsx.map +1 -0
  151. package/dist/components/ui/scroll-area.d.ts +9 -0
  152. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  153. package/dist/components/ui/scroll-area.jsx +160 -0
  154. package/dist/components/ui/scroll-area.jsx.map +1 -0
  155. package/dist/components/ui/section-heading.d.ts +23 -0
  156. package/dist/components/ui/section-heading.d.ts.map +1 -0
  157. package/dist/components/ui/section-heading.jsx +82 -0
  158. package/dist/components/ui/section-heading.jsx.map +1 -0
  159. package/dist/components/ui/separator.d.ts +13 -0
  160. package/dist/components/ui/separator.d.ts.map +1 -0
  161. package/dist/components/ui/separator.jsx +16 -0
  162. package/dist/components/ui/separator.jsx.map +1 -0
  163. package/dist/components/ui/sidebar.d.ts +103 -0
  164. package/dist/components/ui/sidebar.d.ts.map +1 -0
  165. package/dist/components/ui/sidebar.jsx +315 -0
  166. package/dist/components/ui/sidebar.jsx.map +1 -0
  167. package/dist/components/ui/skeleton.d.ts +9 -0
  168. package/dist/components/ui/skeleton.d.ts.map +1 -0
  169. package/dist/components/ui/skeleton.jsx +11 -0
  170. package/dist/components/ui/skeleton.jsx.map +1 -0
  171. package/dist/components/ui/spinner.d.ts +11 -0
  172. package/dist/components/ui/spinner.d.ts.map +1 -0
  173. package/dist/components/ui/spinner.jsx +21 -0
  174. package/dist/components/ui/spinner.jsx.map +1 -0
  175. package/dist/components/ui/table-of-contents.d.ts +20 -0
  176. package/dist/components/ui/table-of-contents.d.ts.map +1 -0
  177. package/dist/components/ui/table-of-contents.jsx +77 -0
  178. package/dist/components/ui/table-of-contents.jsx.map +1 -0
  179. package/dist/components/ui/table.d.ts +58 -0
  180. package/dist/components/ui/table.d.ts.map +1 -0
  181. package/dist/components/ui/table.jsx +61 -0
  182. package/dist/components/ui/table.jsx.map +1 -0
  183. package/dist/components/ui/tabs.d.ts +42 -0
  184. package/dist/components/ui/tabs.d.ts.map +1 -0
  185. package/dist/components/ui/tabs.jsx +93 -0
  186. package/dist/components/ui/tabs.jsx.map +1 -0
  187. package/dist/components/ui/theme-toggle.d.ts +19 -0
  188. package/dist/components/ui/theme-toggle.d.ts.map +1 -0
  189. package/dist/components/ui/theme-toggle.jsx +142 -0
  190. package/dist/components/ui/theme-toggle.jsx.map +1 -0
  191. package/dist/components/ui/tooltip.d.ts +10 -0
  192. package/dist/components/ui/tooltip.d.ts.map +1 -0
  193. package/dist/components/ui/tooltip.jsx +18 -0
  194. package/dist/components/ui/tooltip.jsx.map +1 -0
  195. package/dist/config.d.ts +6 -0
  196. package/dist/config.d.ts.map +1 -0
  197. package/dist/config.js +105 -0
  198. package/dist/config.js.map +1 -0
  199. package/dist/core/content-scanner.d.ts +10 -0
  200. package/dist/core/content-scanner.d.ts.map +1 -0
  201. package/dist/core/content-scanner.js +218 -0
  202. package/dist/core/content-scanner.js.map +1 -0
  203. package/dist/core/route-tree.d.ts +24 -0
  204. package/dist/core/route-tree.d.ts.map +1 -0
  205. package/dist/core/route-tree.js +221 -0
  206. package/dist/core/route-tree.js.map +1 -0
  207. package/dist/hooks/create-click-outside.d.ts +18 -0
  208. package/dist/hooks/create-click-outside.d.ts.map +1 -0
  209. package/dist/hooks/create-click-outside.js +55 -0
  210. package/dist/hooks/create-click-outside.js.map +1 -0
  211. package/dist/hooks/create-clipboard.d.ts +20 -0
  212. package/dist/hooks/create-clipboard.d.ts.map +1 -0
  213. package/dist/hooks/create-clipboard.js +48 -0
  214. package/dist/hooks/create-clipboard.js.map +1 -0
  215. package/dist/hooks/create-color-mode.d.ts +27 -0
  216. package/dist/hooks/create-color-mode.d.ts.map +1 -0
  217. package/dist/hooks/create-color-mode.js +86 -0
  218. package/dist/hooks/create-color-mode.js.map +1 -0
  219. package/dist/hooks/create-controllable-signal.d.ts +17 -0
  220. package/dist/hooks/create-controllable-signal.d.ts.map +1 -0
  221. package/dist/hooks/create-controllable-signal.js +35 -0
  222. package/dist/hooks/create-controllable-signal.js.map +1 -0
  223. package/dist/hooks/create-focus-trap.d.ts +15 -0
  224. package/dist/hooks/create-focus-trap.d.ts.map +1 -0
  225. package/dist/hooks/create-focus-trap.js +72 -0
  226. package/dist/hooks/create-focus-trap.js.map +1 -0
  227. package/dist/hooks/create-keybindings.d.ts +34 -0
  228. package/dist/hooks/create-keybindings.d.ts.map +1 -0
  229. package/dist/hooks/create-keybindings.js +113 -0
  230. package/dist/hooks/create-keybindings.js.map +1 -0
  231. package/dist/hooks/create-lock-scroll.d.ts +20 -0
  232. package/dist/hooks/create-lock-scroll.d.ts.map +1 -0
  233. package/dist/hooks/create-lock-scroll.js +77 -0
  234. package/dist/hooks/create-lock-scroll.js.map +1 -0
  235. package/dist/hooks/create-resize-observer.d.ts +27 -0
  236. package/dist/hooks/create-resize-observer.d.ts.map +1 -0
  237. package/dist/hooks/create-resize-observer.js +59 -0
  238. package/dist/hooks/create-resize-observer.js.map +1 -0
  239. package/dist/hooks/create-scroll-position.d.ts +29 -0
  240. package/dist/hooks/create-scroll-position.d.ts.map +1 -0
  241. package/dist/hooks/create-scroll-position.js +101 -0
  242. package/dist/hooks/create-scroll-position.js.map +1 -0
  243. package/dist/index.d.ts +13 -0
  244. package/dist/index.d.ts.map +1 -0
  245. package/dist/index.js +14 -0
  246. package/dist/index.js.map +1 -0
  247. package/dist/lib/cn.d.ts +6 -0
  248. package/dist/lib/cn.d.ts.map +1 -0
  249. package/dist/lib/cn.js +9 -0
  250. package/dist/lib/cn.js.map +1 -0
  251. package/dist/mdx/compiler.d.ts +13 -0
  252. package/dist/mdx/compiler.d.ts.map +1 -0
  253. package/dist/mdx/compiler.js +38 -0
  254. package/dist/mdx/compiler.js.map +1 -0
  255. package/dist/mdx/highlighter.d.ts +22 -0
  256. package/dist/mdx/highlighter.d.ts.map +1 -0
  257. package/dist/mdx/highlighter.js +190 -0
  258. package/dist/mdx/highlighter.js.map +1 -0
  259. package/dist/mdx/rehype-shiki.d.ts +3 -0
  260. package/dist/mdx/rehype-shiki.d.ts.map +1 -0
  261. package/dist/mdx/rehype-shiki.js +83 -0
  262. package/dist/mdx/rehype-shiki.js.map +1 -0
  263. package/dist/navigation/index.d.ts +3 -0
  264. package/dist/navigation/index.d.ts.map +1 -0
  265. package/dist/navigation/index.js +3 -0
  266. package/dist/navigation/index.js.map +1 -0
  267. package/dist/navigation/repository-links.d.ts +3 -0
  268. package/dist/navigation/repository-links.d.ts.map +1 -0
  269. package/dist/navigation/repository-links.js +35 -0
  270. package/dist/navigation/repository-links.js.map +1 -0
  271. package/dist/navigation/sidebar-state.d.ts +6 -0
  272. package/dist/navigation/sidebar-state.d.ts.map +1 -0
  273. package/dist/navigation/sidebar-state.js +20 -0
  274. package/dist/navigation/sidebar-state.js.map +1 -0
  275. package/dist/navigation/sidebar-tree.d.ts +7 -0
  276. package/dist/navigation/sidebar-tree.d.ts.map +1 -0
  277. package/dist/navigation/sidebar-tree.js +11 -0
  278. package/dist/navigation/sidebar-tree.js.map +1 -0
  279. package/dist/providers/theme-provider.d.ts +33 -0
  280. package/dist/providers/theme-provider.d.ts.map +1 -0
  281. package/dist/providers/theme-provider.jsx +158 -0
  282. package/dist/providers/theme-provider.jsx.map +1 -0
  283. package/dist/providers/theme-script.d.ts +16 -0
  284. package/dist/providers/theme-script.d.ts.map +1 -0
  285. package/dist/providers/theme-script.jsx +41 -0
  286. package/dist/providers/theme-script.jsx.map +1 -0
  287. package/dist/providers/theme-transitions.d.ts +12 -0
  288. package/dist/providers/theme-transitions.d.ts.map +1 -0
  289. package/dist/providers/theme-transitions.js +115 -0
  290. package/dist/providers/theme-transitions.js.map +1 -0
  291. package/dist/registry/api-table.json +21 -0
  292. package/dist/registry/badge.json +18 -0
  293. package/dist/registry/breadcrumb.json +17 -0
  294. package/dist/registry/button.json +21 -0
  295. package/dist/registry/callout.json +19 -0
  296. package/dist/registry/card.json +17 -0
  297. package/dist/registry/code-block.json +28 -0
  298. package/dist/registry/collapsible.json +18 -0
  299. package/dist/registry/command.json +27 -0
  300. package/dist/registry/component-viewer.json +25 -0
  301. package/dist/registry/container.json +18 -0
  302. package/dist/registry/create-click-outside.json +13 -0
  303. package/dist/registry/create-clipboard.json +13 -0
  304. package/dist/registry/create-color-mode.json +13 -0
  305. package/dist/registry/create-controllable-signal.json +13 -0
  306. package/dist/registry/create-focus-trap.json +13 -0
  307. package/dist/registry/create-keybindings.json +13 -0
  308. package/dist/registry/create-lock-scroll.json +13 -0
  309. package/dist/registry/create-resize-observer.json +13 -0
  310. package/dist/registry/create-scroll-position.json +13 -0
  311. package/dist/registry/dropdown-menu.json +22 -0
  312. package/dist/registry/input-group.json +21 -0
  313. package/dist/registry/kbd.json +18 -0
  314. package/dist/registry/list.json +20 -0
  315. package/dist/registry/logo.json +17 -0
  316. package/dist/registry/navbar.json +19 -0
  317. package/dist/registry/package-manager-tabs.json +24 -0
  318. package/dist/registry/pager.json +21 -0
  319. package/dist/registry/scroll-area.json +21 -0
  320. package/dist/registry/section-heading.json +21 -0
  321. package/dist/registry/separator.json +17 -0
  322. package/dist/registry/sidebar.json +24 -0
  323. package/dist/registry/skeleton.json +17 -0
  324. package/dist/registry/spinner.json +18 -0
  325. package/dist/registry/table-of-contents.json +23 -0
  326. package/dist/registry/table.json +17 -0
  327. package/dist/registry/tabs.json +20 -0
  328. package/dist/registry/theme-manager.json +39 -0
  329. package/dist/registry/tooltip.json +18 -0
  330. package/dist/search/provider.d.ts +14 -0
  331. package/dist/search/provider.d.ts.map +1 -0
  332. package/dist/search/provider.js +14 -0
  333. package/dist/search/provider.js.map +1 -0
  334. package/dist/server/index.d.ts +18 -0
  335. package/dist/server/index.d.ts.map +1 -0
  336. package/dist/server/index.js +565 -0
  337. package/dist/server/index.js.map +1 -0
  338. package/dist/server/plugin.d.ts +10 -0
  339. package/dist/server/plugin.d.ts.map +1 -0
  340. package/dist/server/plugin.js +522 -0
  341. package/dist/server/plugin.js.map +1 -0
  342. package/dist/theme-accent.d.ts +8 -0
  343. package/dist/theme-accent.d.ts.map +1 -0
  344. package/dist/theme-accent.js +18 -0
  345. package/dist/theme-accent.js.map +1 -0
  346. package/dist/theme-mode.d.ts +4 -0
  347. package/dist/theme-mode.d.ts.map +1 -0
  348. package/dist/theme-mode.js +5 -0
  349. package/dist/theme-mode.js.map +1 -0
  350. package/dist/themes/default/content/breadcrumbs.d.ts +4 -0
  351. package/dist/themes/default/content/breadcrumbs.d.ts.map +1 -0
  352. package/dist/themes/default/content/breadcrumbs.jsx +31 -0
  353. package/dist/themes/default/content/breadcrumbs.jsx.map +1 -0
  354. package/dist/themes/default/content/pager.d.ts +5 -0
  355. package/dist/themes/default/content/pager.d.ts.map +1 -0
  356. package/dist/themes/default/content/pager.jsx +9 -0
  357. package/dist/themes/default/content/pager.jsx.map +1 -0
  358. package/dist/themes/default/content/table-of-contents.d.ts +4 -0
  359. package/dist/themes/default/content/table-of-contents.d.ts.map +1 -0
  360. package/dist/themes/default/content/table-of-contents.jsx +19 -0
  361. package/dist/themes/default/content/table-of-contents.jsx.map +1 -0
  362. package/dist/themes/default/icons.d.ts +3 -0
  363. package/dist/themes/default/icons.d.ts.map +1 -0
  364. package/dist/themes/default/icons.js +15 -0
  365. package/dist/themes/default/icons.js.map +1 -0
  366. package/dist/themes/default/index.d.ts +12 -0
  367. package/dist/themes/default/index.d.ts.map +1 -0
  368. package/dist/themes/default/index.js +30 -0
  369. package/dist/themes/default/index.js.map +1 -0
  370. package/dist/themes/default/layout.d.ts +4 -0
  371. package/dist/themes/default/layout.d.ts.map +1 -0
  372. package/dist/themes/default/layout.jsx +194 -0
  373. package/dist/themes/default/layout.jsx.map +1 -0
  374. package/dist/themes/default/navbar.d.ts +4 -0
  375. package/dist/themes/default/navbar.d.ts.map +1 -0
  376. package/dist/themes/default/navbar.jsx +83 -0
  377. package/dist/themes/default/navbar.jsx.map +1 -0
  378. package/dist/themes/default/navigation/mobile-table-of-contents.d.ts +4 -0
  379. package/dist/themes/default/navigation/mobile-table-of-contents.d.ts.map +1 -0
  380. package/dist/themes/default/navigation/mobile-table-of-contents.jsx +38 -0
  381. package/dist/themes/default/navigation/mobile-table-of-contents.jsx.map +1 -0
  382. package/dist/themes/default/navigation/sidebar-tree.d.ts +8 -0
  383. package/dist/themes/default/navigation/sidebar-tree.d.ts.map +1 -0
  384. package/dist/themes/default/navigation/sidebar-tree.jsx +124 -0
  385. package/dist/themes/default/navigation/sidebar-tree.jsx.map +1 -0
  386. package/dist/themes/default/overlays/search-dialog.d.ts +4 -0
  387. package/dist/themes/default/overlays/search-dialog.d.ts.map +1 -0
  388. package/dist/themes/default/overlays/search-dialog.jsx +52 -0
  389. package/dist/themes/default/overlays/search-dialog.jsx.map +1 -0
  390. package/dist/themes/default/sidebar.d.ts +4 -0
  391. package/dist/themes/default/sidebar.d.ts.map +1 -0
  392. package/dist/themes/default/sidebar.jsx +92 -0
  393. package/dist/themes/default/sidebar.jsx.map +1 -0
  394. package/dist/themes/index.d.ts +4 -0
  395. package/dist/themes/index.d.ts.map +1 -0
  396. package/dist/themes/index.js +5 -0
  397. package/dist/themes/index.js.map +1 -0
  398. package/dist/themes/types.d.ts +91 -0
  399. package/dist/themes/types.d.ts.map +1 -0
  400. package/dist/themes/types.js +2 -0
  401. package/dist/themes/types.js.map +1 -0
  402. package/dist/types.d.ts +132 -0
  403. package/dist/types.d.ts.map +1 -0
  404. package/dist/types.js +3 -0
  405. package/dist/types.js.map +1 -0
  406. package/dist/vendor/docs-src/components/mdx-components.tsx +144 -0
  407. package/dist/vendor/docs-src/components/ui/api-table.tsx +117 -0
  408. package/dist/vendor/docs-src/components/ui/badge.tsx +56 -0
  409. package/dist/vendor/docs-src/components/ui/breadcrumb.tsx +136 -0
  410. package/dist/vendor/docs-src/components/ui/button.tsx +82 -0
  411. package/dist/vendor/docs-src/components/ui/callout.tsx +137 -0
  412. package/dist/vendor/docs-src/components/ui/card.tsx +113 -0
  413. package/dist/vendor/docs-src/components/ui/code-block.tsx +347 -0
  414. package/dist/vendor/docs-src/components/ui/collapsible.tsx +73 -0
  415. package/dist/vendor/docs-src/components/ui/command.tsx +382 -0
  416. package/dist/vendor/docs-src/components/ui/component-viewer.tsx +363 -0
  417. package/dist/vendor/docs-src/components/ui/container.tsx +45 -0
  418. package/dist/vendor/docs-src/components/ui/dropdown-menu.tsx +298 -0
  419. package/dist/vendor/docs-src/components/ui/input-group.tsx +80 -0
  420. package/dist/vendor/docs-src/components/ui/kbd.tsx +73 -0
  421. package/dist/vendor/docs-src/components/ui/list.tsx +222 -0
  422. package/dist/vendor/docs-src/components/ui/logo.tsx +68 -0
  423. package/dist/vendor/docs-src/components/ui/navbar.tsx +375 -0
  424. package/dist/vendor/docs-src/components/ui/package-manager-tabs.tsx +226 -0
  425. package/dist/vendor/docs-src/components/ui/pager.tsx +102 -0
  426. package/dist/vendor/docs-src/components/ui/scroll-area.tsx +228 -0
  427. package/dist/vendor/docs-src/components/ui/section-heading.tsx +115 -0
  428. package/dist/vendor/docs-src/components/ui/separator.tsx +37 -0
  429. package/dist/vendor/docs-src/components/ui/sidebar.tsx +712 -0
  430. package/dist/vendor/docs-src/components/ui/skeleton.tsx +24 -0
  431. package/dist/vendor/docs-src/components/ui/spinner.tsx +41 -0
  432. package/dist/vendor/docs-src/components/ui/table-of-contents.tsx +131 -0
  433. package/dist/vendor/docs-src/components/ui/table.tsx +160 -0
  434. package/dist/vendor/docs-src/components/ui/tabs.tsx +204 -0
  435. package/dist/vendor/docs-src/components/ui/theme-toggle.tsx +238 -0
  436. package/dist/vendor/docs-src/components/ui/tooltip.tsx +41 -0
  437. package/dist/vendor/docs-src/hooks/create-click-outside.ts +82 -0
  438. package/dist/vendor/docs-src/hooks/create-clipboard.ts +69 -0
  439. package/dist/vendor/docs-src/hooks/create-color-mode.ts +115 -0
  440. package/dist/vendor/docs-src/hooks/create-controllable-signal.ts +56 -0
  441. package/dist/vendor/docs-src/hooks/create-focus-trap.ts +94 -0
  442. package/dist/vendor/docs-src/hooks/create-keybindings.ts +148 -0
  443. package/dist/vendor/docs-src/hooks/create-lock-scroll.ts +97 -0
  444. package/dist/vendor/docs-src/hooks/create-resize-observer.ts +89 -0
  445. package/dist/vendor/docs-src/hooks/create-scroll-position.ts +129 -0
  446. package/dist/vendor/docs-src/lib/cn.ts +9 -0
  447. package/dist/vendor/docs-src/providers/theme-provider.tsx +203 -0
  448. package/dist/vendor/docs-src/providers/theme-script.tsx +54 -0
  449. package/dist/vendor/docs-src/providers/theme-transitions.ts +139 -0
  450. package/dist/version.d.ts +2 -0
  451. package/dist/version.d.ts.map +1 -0
  452. package/dist/version.js +2 -0
  453. package/dist/version.js.map +1 -0
  454. package/package.json +95 -0
@@ -0,0 +1,712 @@
1
+ import {
2
+ createContext,
3
+ createSignal,
4
+ createMemo,
5
+ createEffect,
6
+ useContext,
7
+ splitProps,
8
+ onMount,
9
+ onCleanup,
10
+ type Component,
11
+ type JSX,
12
+ type ParentComponent,
13
+ type Accessor,
14
+ Show,
15
+ } from "solid-js";
16
+ import { cva, type VariantProps } from "class-variance-authority";
17
+ import { PanelLeft, PanelRight } from "lucide-solid";
18
+ import { Tooltip, TooltipTrigger, TooltipContent } from "@/components/ui/tooltip";
19
+ import { Skeleton } from "@/components/ui/skeleton";
20
+ import { Separator } from "@/components/ui/separator";
21
+ import { cn } from "@/lib/cn";
22
+
23
+ /* --- Constants --- */
24
+ const SIDEBAR_COOKIE_NAME = "nikala_sidebar_state";
25
+ const SIDEBAR_WIDTH = "17rem";
26
+ const SIDEBAR_WIDTH_ICON = "3.5rem";
27
+ const SIDEBAR_KEYBOARD_SHORTCUT = "b";
28
+
29
+ /* --- 1. Context & Types --- */
30
+ export type SidebarState = "expanded" | "collapsed";
31
+ export type SidebarSide = "left" | "right";
32
+
33
+ export interface SidebarContextValue {
34
+ state: Accessor<SidebarState>;
35
+ open: Accessor<boolean>;
36
+ setOpen: (open: boolean) => void;
37
+ openMobile: Accessor<boolean>;
38
+ setOpenMobile: (open: boolean) => void;
39
+ isMobile: Accessor<boolean>;
40
+ toggleSidebar: () => void;
41
+ side: Accessor<SidebarSide>;
42
+ setSide: (side: SidebarSide) => void;
43
+ }
44
+
45
+ const SidebarContext = createContext<SidebarContextValue>();
46
+
47
+ const fallbackSidebarContext: SidebarContextValue = {
48
+ state: () => "expanded",
49
+ open: () => true,
50
+ setOpen: () => {},
51
+ openMobile: () => false,
52
+ setOpenMobile: () => {},
53
+ isMobile: () => false,
54
+ toggleSidebar: () => {},
55
+ side: () => "left",
56
+ setSide: () => {},
57
+ };
58
+
59
+ export function useSidebar() {
60
+ const context = useContext(SidebarContext);
61
+ return context ?? fallbackSidebarContext;
62
+ }
63
+
64
+ /* --- 2. SidebarProvider --- */
65
+ export interface SidebarProviderProps extends JSX.HTMLAttributes<HTMLDivElement> {
66
+ defaultOpen?: boolean;
67
+ open?: Accessor<boolean>;
68
+ onOpenChange?: (open: boolean) => void;
69
+ side?: SidebarSide;
70
+ class?: string;
71
+ style?: JSX.CSSProperties;
72
+ }
73
+
74
+ export const SidebarProvider: ParentComponent<SidebarProviderProps> = (props) => {
75
+ const [local, rest] = splitProps(props, [
76
+ "defaultOpen",
77
+ "open",
78
+ "onOpenChange",
79
+ "side",
80
+ "class",
81
+ "style",
82
+ "children",
83
+ ]);
84
+
85
+ const [internalOpen, setInternalOpen] = createSignal<boolean>(local.defaultOpen ?? true);
86
+ const [openMobile, setOpenMobile] = createSignal<boolean>(false);
87
+ const [isMobile, setIsMobile] = createSignal<boolean>(false);
88
+ const [side, setSide] = createSignal<SidebarSide>(local.side ?? "left");
89
+
90
+ createEffect(() => {
91
+ if (local.side) {
92
+ setSide(local.side);
93
+ }
94
+ });
95
+
96
+ const open = () => (local.open !== undefined ? local.open() : internalOpen());
97
+
98
+ const setOpen = (value: boolean) => {
99
+ if (local.open === undefined) {
100
+ setInternalOpen(value);
101
+ }
102
+ local.onOpenChange?.(value);
103
+
104
+ if (typeof document !== "undefined") {
105
+ document.cookie = `${SIDEBAR_COOKIE_NAME}=${value}; path=/; max-age=${60 * 60 * 24 * 7}`;
106
+ }
107
+ };
108
+
109
+ const toggleSidebar = () => {
110
+ setOpen(!open());
111
+ };
112
+
113
+ const state = createMemo<SidebarState>(() => (open() ? "expanded" : "collapsed"));
114
+
115
+ onMount(() => {
116
+ if (typeof window === "undefined") return;
117
+
118
+ const checkMobile = () => {
119
+ setIsMobile(window.innerWidth < 768);
120
+ };
121
+
122
+ checkMobile();
123
+ window.addEventListener("resize", checkMobile, { passive: true });
124
+
125
+ // Keyboard shortcut (⌘B / Ctrl+B)
126
+ const handleKeyDown = (e: KeyboardEvent) => {
127
+ if (
128
+ (e.metaKey || e.ctrlKey) &&
129
+ e.key.toLowerCase() === SIDEBAR_KEYBOARD_SHORTCUT &&
130
+ !e.defaultPrevented
131
+ ) {
132
+ e.preventDefault();
133
+ toggleSidebar();
134
+ }
135
+ };
136
+
137
+ window.addEventListener("keydown", handleKeyDown);
138
+
139
+ onCleanup(() => {
140
+ window.removeEventListener("resize", checkMobile);
141
+ window.removeEventListener("keydown", handleKeyDown);
142
+ });
143
+ });
144
+
145
+ const contextValue: SidebarContextValue = {
146
+ state,
147
+ open,
148
+ setOpen,
149
+ openMobile,
150
+ setOpenMobile,
151
+ isMobile,
152
+ toggleSidebar,
153
+ side,
154
+ setSide,
155
+ };
156
+
157
+ return (
158
+ <SidebarContext.Provider value={contextValue}>
159
+ <div
160
+ style={{
161
+ "--sidebar-width": SIDEBAR_WIDTH,
162
+ "--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
163
+ ...(typeof local.style === "object" ? local.style : {}),
164
+ } as JSX.CSSProperties}
165
+ class={cn(
166
+ "group/sidebar-wrapper relative flex w-full max-w-full",
167
+ local.class
168
+ )}
169
+ {...rest}
170
+ >
171
+ {local.children}
172
+ </div>
173
+ </SidebarContext.Provider>
174
+ );
175
+ };
176
+
177
+ /* --- 3. Sidebar Root --- */
178
+ export interface SidebarProps extends JSX.HTMLAttributes<HTMLDivElement> {
179
+ side?: SidebarSide;
180
+ variant?: "sidebar" | "floating" | "inset";
181
+ collapsible?: "offcanvas" | "icon" | "none";
182
+ class?: string;
183
+ }
184
+
185
+ export const Sidebar: ParentComponent<SidebarProps> = (props) => {
186
+ const [local, rest] = splitProps(props, [
187
+ "side",
188
+ "variant",
189
+ "collapsible",
190
+ "class",
191
+ "children",
192
+ ]);
193
+
194
+ const sidebar = useSidebar();
195
+ const side = () => local.side ?? sidebar.side();
196
+ const variant = () => local.variant ?? "sidebar";
197
+ const collapsible = () => local.collapsible ?? "icon";
198
+
199
+ createEffect(() => {
200
+ if (local.side) {
201
+ sidebar.setSide(local.side);
202
+ }
203
+ });
204
+
205
+ const isCollapsed = () => sidebar.state() === "collapsed" && collapsible() !== "none";
206
+
207
+ return (
208
+ <div
209
+ data-state={isCollapsed() ? "collapsed" : "expanded"}
210
+ data-collapsible={isCollapsed() ? collapsible() : ""}
211
+ data-variant={variant()}
212
+ data-side={side()}
213
+ class={cn(
214
+ "group relative flex flex-col bg-card text-card-foreground transition-[width,opacity] duration-200 ease-in-out shrink-0",
215
+ !isCollapsed()
216
+ ? "w-[var(--sidebar-width,17rem)]"
217
+ : collapsible() === "icon"
218
+ ? "w-[var(--sidebar-width-icon,3.5rem)]"
219
+ : "w-0 overflow-hidden opacity-0 border-none",
220
+ // Side borders
221
+ variant() === "sidebar" && (side() === "left" ? "border-r border-border" : "border-l border-border"),
222
+ // Floating variant
223
+ variant() === "floating" && "m-2 rounded-lg border border-border shadow-md",
224
+ // Inset variant
225
+ variant() === "inset" && "m-2 rounded-lg border border-border/80 bg-card shadow-2xs",
226
+ local.class
227
+ )}
228
+ {...rest}
229
+ >
230
+ <div
231
+ data-sidebar="sidebar"
232
+ class="flex h-full w-full flex-col overflow-hidden"
233
+ >
234
+ {local.children}
235
+ </div>
236
+ </div>
237
+ );
238
+ };
239
+
240
+ /* --- 4. SidebarTrigger --- */
241
+ export interface SidebarTriggerProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
242
+ class?: string;
243
+ }
244
+
245
+ export const SidebarTrigger: Component<SidebarTriggerProps> = (props) => {
246
+ const [local, rest] = splitProps(props, ["class", "onClick"]);
247
+ const { toggleSidebar, side, isMobile, openMobile, setOpenMobile } = useSidebar();
248
+
249
+ return (
250
+ <button
251
+ type="button"
252
+ aria-label="Toggle Sidebar"
253
+ onClick={(e) => {
254
+ if (typeof local.onClick === "function") local.onClick(e);
255
+ if (isMobile()) setOpenMobile(!openMobile());
256
+ else toggleSidebar();
257
+ }}
258
+ class={cn(
259
+ "inline-flex size-7 items-center justify-center rounded-md border border-border/60 bg-background text-foreground hover:bg-muted focus-visible:outline-hidden focus-visible:ring-1 focus-visible:ring-ring cursor-pointer transition-colors shadow-2xs",
260
+ local.class
261
+ )}
262
+ {...rest}
263
+ >
264
+ <Show when={side() === "right"} fallback={<PanelLeft class="size-4" />}>
265
+ <PanelRight class="size-4" />
266
+ </Show>
267
+ <span class="sr-only">Toggle Sidebar</span>
268
+ </button>
269
+ );
270
+ };
271
+
272
+ /* --- 5. SidebarRail --- */
273
+ export interface SidebarRailProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
274
+ class?: string;
275
+ }
276
+
277
+ export const SidebarRail: Component<SidebarRailProps> = (props) => {
278
+ const [local, rest] = splitProps(props, ["class"]);
279
+ const { toggleSidebar } = useSidebar();
280
+
281
+ return (
282
+ <button
283
+ type="button"
284
+ data-sidebar="rail"
285
+ aria-label="Toggle Sidebar Rail"
286
+ tabIndex={-1}
287
+ onClick={toggleSidebar}
288
+ title="Toggle Sidebar"
289
+ class={cn(
290
+ "absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex cursor-w-resize",
291
+ local.class
292
+ )}
293
+ {...rest}
294
+ />
295
+ );
296
+ };
297
+
298
+ /* --- 6. SidebarInset --- */
299
+ export interface SidebarInsetProps extends JSX.HTMLAttributes<HTMLElement> {
300
+ class?: string;
301
+ }
302
+
303
+ export const SidebarInset: ParentComponent<SidebarInsetProps> = (props) => {
304
+ const [local, rest] = splitProps(props, ["class", "children"]);
305
+
306
+ return (
307
+ <main
308
+ class={cn(
309
+ "relative flex min-h-0 flex-1 flex-col bg-background",
310
+ local.class
311
+ )}
312
+ {...rest}
313
+ >
314
+ {local.children}
315
+ </main>
316
+ );
317
+ };
318
+
319
+ /* --- 7. Sidebar Structural Sections --- */
320
+ export interface SidebarSectionProps extends JSX.HTMLAttributes<HTMLDivElement> {
321
+ class?: string;
322
+ }
323
+
324
+ export const SidebarHeader: ParentComponent<SidebarSectionProps> = (props) => {
325
+ const [local, rest] = splitProps(props, ["class", "children"]);
326
+
327
+ return (
328
+ <div
329
+ data-sidebar="header"
330
+ class={cn("flex flex-col gap-2 p-3 border-b border-border/40 shrink-0 group-data-[collapsible=icon]:p-2 group-data-[collapsible=icon]:items-center", local.class)}
331
+ {...rest}
332
+ >
333
+ {local.children}
334
+ </div>
335
+ );
336
+ };
337
+
338
+ export const SidebarFooter: ParentComponent<SidebarSectionProps> = (props) => {
339
+ const [local, rest] = splitProps(props, ["class", "children"]);
340
+
341
+ return (
342
+ <div
343
+ data-sidebar="footer"
344
+ class={cn("flex flex-col gap-2 p-3 mt-auto border-t border-border/40 shrink-0 group-data-[collapsible=icon]:p-2 group-data-[collapsible=icon]:items-center", local.class)}
345
+ {...rest}
346
+ >
347
+ {local.children}
348
+ </div>
349
+ );
350
+ };
351
+
352
+ export const SidebarSeparator: Component<SidebarSectionProps> = (props) => {
353
+ const [local, rest] = splitProps(props, ["class"]);
354
+
355
+ return (
356
+ <Separator
357
+ data-sidebar="separator"
358
+ class={cn("mx-2 w-auto bg-border/50 my-1 group-data-[collapsible=icon]:mx-1", local.class)}
359
+ {...rest}
360
+ />
361
+ );
362
+ };
363
+
364
+ export const SidebarContent: ParentComponent<SidebarSectionProps> = (props) => {
365
+ const [local, rest] = splitProps(props, ["class", "children"]);
366
+
367
+ return (
368
+ <div
369
+ data-sidebar="content"
370
+ class={cn(
371
+ "flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto p-2 group-data-[collapsible=icon]:p-1 group-data-[collapsible=icon]:overflow-hidden group-data-[collapsible=icon]:items-center",
372
+ local.class
373
+ )}
374
+ {...rest}
375
+ >
376
+ {local.children}
377
+ </div>
378
+ );
379
+ };
380
+
381
+ /* --- 8. Sidebar Groups --- */
382
+ export const SidebarGroup: ParentComponent<SidebarSectionProps> = (props) => {
383
+ const [local, rest] = splitProps(props, ["class", "children"]);
384
+
385
+ return (
386
+ <div
387
+ data-sidebar="group"
388
+ class={cn("relative flex w-full min-w-0 flex-col p-1 group-data-[collapsible=icon]:p-0 group-data-[collapsible=icon]:items-center", local.class)}
389
+ {...rest}
390
+ >
391
+ {local.children}
392
+ </div>
393
+ );
394
+ };
395
+
396
+ export interface SidebarGroupLabelProps extends JSX.HTMLAttributes<HTMLDivElement> {
397
+ class?: string;
398
+ }
399
+
400
+ export const SidebarGroupLabel: ParentComponent<SidebarGroupLabelProps> = (props) => {
401
+ const [local, rest] = splitProps(props, ["class", "children"]);
402
+
403
+ return (
404
+ <div
405
+ data-sidebar="group-label"
406
+ class={cn(
407
+ "flex h-7 shrink-0 items-center rounded-md px-2 text-[11px] font-semibold uppercase tracking-wider text-muted-foreground outline-hidden transition-all duration-200 ease-linear group-data-[collapsible=icon]:hidden",
408
+ local.class
409
+ )}
410
+ {...rest}
411
+ >
412
+ {local.children}
413
+ </div>
414
+ );
415
+ };
416
+
417
+ export interface SidebarGroupActionProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
418
+ class?: string;
419
+ }
420
+
421
+ export const SidebarGroupAction: ParentComponent<SidebarGroupActionProps> = (props) => {
422
+ const [local, rest] = splitProps(props, ["class", "children"]);
423
+
424
+ return (
425
+ <button
426
+ type="button"
427
+ data-sidebar="group-action"
428
+ class={cn(
429
+ "absolute right-3 top-3 flex size-5 items-center justify-center rounded-md p-0 text-muted-foreground outline-hidden transition-transform hover:bg-muted hover:text-foreground cursor-pointer group-data-[collapsible=icon]:hidden",
430
+ local.class
431
+ )}
432
+ {...rest}
433
+ >
434
+ {local.children}
435
+ </button>
436
+ );
437
+ };
438
+
439
+ export const SidebarGroupContent: ParentComponent<SidebarSectionProps> = (props) => {
440
+ const [local, rest] = splitProps(props, ["class", "children"]);
441
+
442
+ return (
443
+ <div
444
+ data-sidebar="group-content"
445
+ class={cn("w-full text-sm", local.class)}
446
+ {...rest}
447
+ >
448
+ {local.children}
449
+ </div>
450
+ );
451
+ };
452
+
453
+ /* --- 9. Sidebar Menu --- */
454
+ export interface SidebarMenuProps extends JSX.HTMLAttributes<HTMLUListElement> {
455
+ class?: string;
456
+ }
457
+
458
+ export const SidebarMenu: ParentComponent<SidebarMenuProps> = (props) => {
459
+ const [local, rest] = splitProps(props, ["class", "children"]);
460
+
461
+ return (
462
+ <ul
463
+ data-sidebar="menu"
464
+ class={cn("flex w-full min-w-0 flex-col gap-1 list-none p-0 m-0 group-data-[collapsible=icon]:items-center", local.class)}
465
+ {...rest}
466
+ >
467
+ {local.children}
468
+ </ul>
469
+ );
470
+ };
471
+
472
+ export interface SidebarMenuItemProps extends JSX.HTMLAttributes<HTMLLIElement> {
473
+ class?: string;
474
+ }
475
+
476
+ export const SidebarMenuItem: ParentComponent<SidebarMenuItemProps> = (props) => {
477
+ const [local, rest] = splitProps(props, ["class", "children"]);
478
+
479
+ return (
480
+ <li
481
+ data-sidebar="menu-item"
482
+ class={cn("group/menu-item relative flex w-full justify-center", local.class)}
483
+ {...rest}
484
+ >
485
+ {local.children}
486
+ </li>
487
+ );
488
+ };
489
+
490
+ /* --- 10. SidebarMenuButton --- */
491
+ export const sidebarMenuButtonVariants = cva(
492
+ "peer/menu-button flex w-full items-center gap-2.5 overflow-hidden rounded-md p-2 text-left text-sm font-medium outline-hidden ring-sidebar-ring transition-colors hover:bg-muted hover:text-foreground focus-visible:ring-2 active:bg-muted disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-muted data-[active=true]:font-semibold data-[active=true]:text-foreground group-data-[collapsible=icon]:size-9 group-data-[collapsible=icon]:p-0 group-data-[collapsible=icon]:justify-center group-data-[collapsible=icon]:[&>span]:hidden cursor-pointer select-none",
493
+ {
494
+ variants: {
495
+ variant: {
496
+ default: "hover:bg-muted hover:text-foreground",
497
+ outline: "bg-background shadow-2xs hover:bg-muted hover:text-foreground border border-border",
498
+ },
499
+ size: {
500
+ default: "h-8 text-sm",
501
+ sm: "h-7 text-xs",
502
+ lg: "h-10 text-sm",
503
+ },
504
+ },
505
+ defaultVariants: {
506
+ variant: "default",
507
+ size: "default",
508
+ },
509
+ }
510
+ );
511
+
512
+ export interface SidebarMenuButtonProps
513
+ extends JSX.ButtonHTMLAttributes<HTMLButtonElement>,
514
+ VariantProps<typeof sidebarMenuButtonVariants> {
515
+ isActive?: boolean;
516
+ tooltip?: string;
517
+ href?: string;
518
+ class?: string;
519
+ }
520
+
521
+ export const SidebarMenuButton: ParentComponent<SidebarMenuButtonProps> = (props) => {
522
+ const [local, rest] = splitProps(props, [
523
+ "isActive",
524
+ "tooltip",
525
+ "variant",
526
+ "size",
527
+ "href",
528
+ "class",
529
+ "children",
530
+ ]);
531
+
532
+ const sidebar = useSidebar();
533
+ const isCollapsed = () => sidebar.state() === "collapsed";
534
+ const tooltipPlacement = () => (sidebar.side() === "right" ? "left" : "right");
535
+
536
+ const buttonElement = () => (
537
+ <Show
538
+ when={local.href}
539
+ fallback={
540
+ <button
541
+ type="button"
542
+ data-sidebar="menu-button"
543
+ data-size={local.size}
544
+ data-active={local.isActive ? "true" : "false"}
545
+ class={cn(
546
+ sidebarMenuButtonVariants({ variant: local.variant, size: local.size }),
547
+ local.class
548
+ )}
549
+ {...rest}
550
+ >
551
+ {local.children}
552
+ </button>
553
+ }
554
+ >
555
+ <a
556
+ href={local.href}
557
+ data-sidebar="menu-button"
558
+ data-size={local.size}
559
+ data-active={local.isActive ? "true" : "false"}
560
+ class={cn(
561
+ sidebarMenuButtonVariants({ variant: local.variant, size: local.size }),
562
+ local.class
563
+ )}
564
+ {...(rest as unknown as JSX.AnchorHTMLAttributes<HTMLAnchorElement>)}
565
+ >
566
+ {local.children}
567
+ </a>
568
+ </Show>
569
+ );
570
+
571
+ return (
572
+ <Show
573
+ when={local.tooltip && isCollapsed() && !sidebar.isMobile()}
574
+ fallback={buttonElement()}
575
+ >
576
+ <Tooltip placement={tooltipPlacement()} gutter={8} openDelay={100}>
577
+ <TooltipTrigger as="div" class="w-full flex items-center justify-center">
578
+ {buttonElement()}
579
+ </TooltipTrigger>
580
+ <TooltipContent>
581
+ {local.tooltip}
582
+ </TooltipContent>
583
+ </Tooltip>
584
+ </Show>
585
+ );
586
+ };
587
+
588
+ /* --- 11. SidebarMenuAction & Badge --- */
589
+ export interface SidebarMenuActionProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
590
+ showOnHover?: boolean;
591
+ class?: string;
592
+ }
593
+
594
+ export const SidebarMenuAction: ParentComponent<SidebarMenuActionProps> = (props) => {
595
+ const [local, rest] = splitProps(props, ["showOnHover", "class", "children"]);
596
+
597
+ return (
598
+ <button
599
+ type="button"
600
+ data-sidebar="menu-action"
601
+ class={cn(
602
+ "absolute right-1 top-1.5 flex size-5 items-center justify-center rounded-md p-0 text-muted-foreground outline-hidden transition-transform hover:bg-muted hover:text-foreground cursor-pointer group-data-[collapsible=icon]:hidden",
603
+ local.showOnHover && "opacity-0 group-hover/menu-item:opacity-100 transition-opacity",
604
+ local.class
605
+ )}
606
+ {...rest}
607
+ >
608
+ {local.children}
609
+ </button>
610
+ );
611
+ };
612
+
613
+ export interface SidebarMenuBadgeProps extends JSX.HTMLAttributes<HTMLDivElement> {
614
+ class?: string;
615
+ }
616
+
617
+ export const SidebarMenuBadge: ParentComponent<SidebarMenuBadgeProps> = (props) => {
618
+ const [local, rest] = splitProps(props, ["class", "children"]);
619
+
620
+ return (
621
+ <div
622
+ data-sidebar="menu-badge"
623
+ class={cn(
624
+ "pointer-events-none absolute right-1.5 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1.5 text-[11px] font-medium tabular-nums bg-muted text-muted-foreground group-data-[collapsible=icon]:hidden",
625
+ local.class
626
+ )}
627
+ {...rest}
628
+ >
629
+ {local.children}
630
+ </div>
631
+ );
632
+ };
633
+
634
+ export interface SidebarMenuSkeletonProps extends JSX.HTMLAttributes<HTMLDivElement> {
635
+ showIcon?: boolean;
636
+ class?: string;
637
+ }
638
+
639
+ export const SidebarMenuSkeleton: Component<SidebarMenuSkeletonProps> = (props) => {
640
+ const [local, rest] = splitProps(props, ["showIcon", "class"]);
641
+
642
+ return (
643
+ <div
644
+ data-sidebar="menu-skeleton"
645
+ class={cn("flex h-8 items-center gap-2 rounded-md px-2 group-data-[collapsible=icon]:p-0 group-data-[collapsible=icon]:justify-center", local.class)}
646
+ {...rest}
647
+ >
648
+ <Show when={local.showIcon ?? true}>
649
+ <Skeleton class="size-4 rounded-md shrink-0" />
650
+ </Show>
651
+ <Skeleton class="h-4 flex-1 max-w-[80%] group-data-[collapsible=icon]:hidden" />
652
+ </div>
653
+ );
654
+ };
655
+
656
+ /* --- 12. Nested Submenus --- */
657
+ export interface SidebarMenuSubProps extends JSX.HTMLAttributes<HTMLUListElement> {
658
+ class?: string;
659
+ }
660
+
661
+ export const SidebarMenuSub: ParentComponent<SidebarMenuSubProps> = (props) => {
662
+ const [local, rest] = splitProps(props, ["class", "children"]);
663
+
664
+ return (
665
+ <ul
666
+ data-sidebar="menu-sub"
667
+ class={cn(
668
+ "mx-3.5 flex min-w-0 flex-col gap-1 border-l border-border/60 px-2.5 py-0.5 list-none group-data-[collapsible=icon]:hidden",
669
+ local.class
670
+ )}
671
+ {...rest}
672
+ >
673
+ {local.children}
674
+ </ul>
675
+ );
676
+ };
677
+
678
+ export const SidebarMenuSubItem: ParentComponent<SidebarMenuItemProps> = (props) => {
679
+ const [local, rest] = splitProps(props, ["class", "children"]);
680
+
681
+ return (
682
+ <li class={cn("relative", local.class)} {...rest}>
683
+ {local.children}
684
+ </li>
685
+ );
686
+ };
687
+
688
+ export interface SidebarMenuSubButtonProps extends JSX.AnchorHTMLAttributes<HTMLAnchorElement> {
689
+ isActive?: boolean;
690
+ size?: "sm" | "md";
691
+ class?: string;
692
+ }
693
+
694
+ export const SidebarMenuSubButton: ParentComponent<SidebarMenuSubButtonProps> = (props) => {
695
+ const [local, rest] = splitProps(props, ["isActive", "size", "class", "children"]);
696
+
697
+ return (
698
+ <a
699
+ data-sidebar="menu-sub-button"
700
+ data-size={local.size ?? "md"}
701
+ data-active={local.isActive ? "true" : "false"}
702
+ class={cn(
703
+ "flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-xs text-muted-foreground outline-hidden hover:bg-muted hover:text-foreground focus-visible:ring-1 focus-visible:ring-ring data-[active=true]:bg-muted data-[active=true]:font-medium data-[active=true]:text-foreground",
704
+ local.size === "sm" && "text-[11px]",
705
+ local.class
706
+ )}
707
+ {...rest}
708
+ >
709
+ {local.children}
710
+ </a>
711
+ );
712
+ };