@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,148 @@
1
+ import { onMount, onCleanup, type Accessor } from "solid-js";
2
+
3
+ export interface KeybindingDefinition {
4
+ /** Key combination string, e.g. "meta+k", "ctrl+k", "Escape", "Shift+Enter" */
5
+ key: string | string[];
6
+ /** Callback handler invoked when the key combination is triggered */
7
+ handler: (event: KeyboardEvent) => void;
8
+ /** Whether to prevent default browser action. Defaults to false. */
9
+ preventDefault?: boolean;
10
+ /** Whether to stop event propagation. Defaults to false. */
11
+ stopPropagation?: boolean;
12
+ }
13
+
14
+ export interface CreateKeybindingsOptions {
15
+ /** Event target to attach listener to. Defaults to window. */
16
+ target?: HTMLElement | Window | Accessor<HTMLElement | Window | undefined>;
17
+ /** Event type: "keydown" (default) or "keyup" */
18
+ eventType?: "keydown" | "keyup";
19
+ /** Whether keybinding listeners are active. Defaults to true. */
20
+ enabled?: boolean | Accessor<boolean>;
21
+ }
22
+
23
+ /**
24
+ * Normalizes key string into standardized combination signature (e.g. "ctrl+meta+k").
25
+ */
26
+ function normalizeKeyCombination(keyStr: string): string {
27
+ const parts = keyStr.toLowerCase().split("+").map((p) => p.trim());
28
+ const modifiers = new Set<string>();
29
+ let mainKey = "";
30
+
31
+ for (const part of parts) {
32
+ if (part === "meta" || part === "cmd" || part === "command" || part === "⌘") {
33
+ modifiers.add("meta");
34
+ } else if (part === "ctrl" || part === "control") {
35
+ modifiers.add("ctrl");
36
+ } else if (part === "alt" || part === "option" || part === "⌥") {
37
+ modifiers.add("alt");
38
+ } else if (part === "shift" || part === "⇧") {
39
+ modifiers.add("shift");
40
+ } else {
41
+ mainKey = part;
42
+ }
43
+ }
44
+
45
+ const sortedMods = Array.from(modifiers).sort();
46
+ return [...sortedMods, mainKey].join("+");
47
+ }
48
+
49
+ /**
50
+ * Checks if a KeyboardEvent matches a normalized key combination.
51
+ */
52
+ function isEventMatch(event: KeyboardEvent, targetCombination: string): boolean {
53
+ const modifiers = new Set<string>();
54
+ if (event.metaKey) modifiers.add("meta");
55
+ if (event.ctrlKey) modifiers.add("ctrl");
56
+ if (event.altKey) modifiers.add("alt");
57
+ if (event.shiftKey) modifiers.add("shift");
58
+
59
+ const mainKey = event.key.toLowerCase();
60
+ const eventCombination = [...Array.from(modifiers).sort(), mainKey].join("+");
61
+
62
+ return eventCombination === targetCombination;
63
+ }
64
+
65
+ /**
66
+ * SolidJS reactive primitive for listening to single or multiple keyboard shortcuts.
67
+ *
68
+ * @param bindings Array of keybinding definitions or single definition object.
69
+ * @param options Configuration options including target, event type, and enabled state.
70
+ */
71
+ export function createKeybindings(
72
+ bindings: KeybindingDefinition | KeybindingDefinition[],
73
+ options: CreateKeybindingsOptions = {}
74
+ ): void {
75
+ const bindingList = Array.isArray(bindings) ? bindings : [bindings];
76
+
77
+ const isEnabled = () => {
78
+ if (typeof options.enabled === "function") {
79
+ return options.enabled();
80
+ }
81
+ return options.enabled ?? true;
82
+ };
83
+
84
+ const getTargetElement = (): HTMLElement | Window | undefined => {
85
+ if (!options.target) {
86
+ return typeof window !== "undefined" ? window : undefined;
87
+ }
88
+ if (typeof options.target === "function") {
89
+ return (options.target as Accessor<HTMLElement | Window | undefined>)();
90
+ }
91
+ return options.target;
92
+ };
93
+
94
+ const handleKeyboardEvent = (event: KeyboardEvent) => {
95
+ if (!isEnabled()) return;
96
+
97
+ for (const binding of bindingList) {
98
+ const keys = Array.isArray(binding.key) ? binding.key : [binding.key];
99
+
100
+ for (const keyCombo of keys) {
101
+ const normalizedCombo = normalizeKeyCombination(keyCombo);
102
+
103
+ if (isEventMatch(event, normalizedCombo)) {
104
+ if (binding.preventDefault) {
105
+ event.preventDefault();
106
+ }
107
+ if (binding.stopPropagation) {
108
+ event.stopPropagation();
109
+ }
110
+ binding.handler(event);
111
+ break;
112
+ }
113
+ }
114
+ }
115
+ };
116
+
117
+ onMount(() => {
118
+ const target = getTargetElement();
119
+ if (!target) return;
120
+
121
+ const eventType = options.eventType || "keydown";
122
+ target.addEventListener(eventType, handleKeyboardEvent as EventListener);
123
+
124
+ onCleanup(() => {
125
+ target.removeEventListener(eventType, handleKeyboardEvent as EventListener);
126
+ });
127
+ });
128
+ }
129
+
130
+ /**
131
+ * SolidJS primitive specialized for handling Escape key presses.
132
+ *
133
+ * @param handler Callback invoked when Escape key is pressed.
134
+ * @param options Keybindings options.
135
+ */
136
+ export function createEscapeKey(
137
+ handler: (event: KeyboardEvent) => void,
138
+ options: CreateKeybindingsOptions = {}
139
+ ): void {
140
+ createKeybindings(
141
+ {
142
+ key: "Escape",
143
+ handler,
144
+ preventDefault: true,
145
+ },
146
+ options
147
+ );
148
+ }
@@ -0,0 +1,97 @@
1
+ import { createEffect, createSignal, onCleanup, type Accessor } from "solid-js";
2
+
3
+ export interface CreateLockScrollOptions {
4
+ /** Target element to lock scroll for. Defaults to document.body. */
5
+ target?: HTMLElement | Accessor<HTMLElement | undefined>;
6
+ /** Initial lock state. Defaults to true. */
7
+ enabled?: boolean | Accessor<boolean>;
8
+ }
9
+
10
+ export interface CreateLockScrollReturn {
11
+ /** Accessor indicating whether scroll is currently locked */
12
+ isLocked: Accessor<boolean>;
13
+ /** Setter function to programmatically lock or unlock scroll */
14
+ setLocked: (locked: boolean) => void;
15
+ }
16
+
17
+ /**
18
+ * SolidJS reactive primitive for locking target element (or document.body) scroll.
19
+ *
20
+ * @param options Configuration options including target element and initial enabled state.
21
+ */
22
+ export function createLockScroll(options: CreateLockScrollOptions = {}): CreateLockScrollReturn {
23
+ const [internalLocked, setInternalLocked] = createSignal(false);
24
+
25
+ const getTarget = (): HTMLElement | undefined => {
26
+ if (typeof window === "undefined") return undefined;
27
+
28
+ if (!options.target) {
29
+ return document.body;
30
+ }
31
+ if (typeof options.target === "function") {
32
+ return (options.target as Accessor<HTMLElement | undefined>)();
33
+ }
34
+ return options.target;
35
+ };
36
+
37
+ const isEnabled = (): boolean => {
38
+ if (typeof options.enabled === "function") {
39
+ return options.enabled();
40
+ }
41
+ return options.enabled ?? true;
42
+ };
43
+
44
+ let originalOverflow: string | undefined;
45
+
46
+ const applyLock = (element: HTMLElement) => {
47
+ if (originalOverflow === undefined) {
48
+ originalOverflow = element.style.overflow;
49
+ }
50
+ element.style.overflow = "hidden";
51
+ setInternalLocked(true);
52
+ };
53
+
54
+ const removeLock = (element: HTMLElement) => {
55
+ if (originalOverflow !== undefined) {
56
+ element.style.overflow = originalOverflow;
57
+ originalOverflow = undefined;
58
+ } else {
59
+ element.style.overflow = "";
60
+ }
61
+ setInternalLocked(false);
62
+ };
63
+
64
+ createEffect(() => {
65
+ const el = getTarget();
66
+ if (!el) return;
67
+
68
+ if (isEnabled()) {
69
+ applyLock(el);
70
+ } else {
71
+ removeLock(el);
72
+ }
73
+ });
74
+
75
+ onCleanup(() => {
76
+ const el = getTarget();
77
+ if (el) {
78
+ removeLock(el);
79
+ }
80
+ });
81
+
82
+ const setLocked = (locked: boolean) => {
83
+ const el = getTarget();
84
+ if (!el) return;
85
+
86
+ if (locked) {
87
+ applyLock(el);
88
+ } else {
89
+ removeLock(el);
90
+ }
91
+ };
92
+
93
+ return {
94
+ isLocked: internalLocked,
95
+ setLocked,
96
+ };
97
+ }
@@ -0,0 +1,89 @@
1
+ import { createEffect, createSignal, onCleanup, type Accessor } from "solid-js";
2
+
3
+ export interface CreateResizeObserverOptions extends ResizeObserverOptions {
4
+ /** Whether the observer is active. Defaults to true. */
5
+ enabled?: boolean | Accessor<boolean>;
6
+ }
7
+
8
+ /**
9
+ * SolidJS reactive primitive for observing element size changes via ResizeObserver.
10
+ *
11
+ * @param target Target element or accessor returning HTML element.
12
+ * @param callback Observer callback invoked on element resize events.
13
+ * @param options ResizeObserver options (box, enabled).
14
+ */
15
+ export function createResizeObserver(
16
+ target: HTMLElement | Accessor<HTMLElement | undefined>,
17
+ callback: ResizeObserverCallback,
18
+ options: CreateResizeObserverOptions = {}
19
+ ): void {
20
+ const getTarget = (): HTMLElement | undefined => {
21
+ if (typeof target === "function") {
22
+ return (target as Accessor<HTMLElement | undefined>)();
23
+ }
24
+ return target;
25
+ };
26
+
27
+ const isEnabled = (): boolean => {
28
+ if (typeof options.enabled === "function") {
29
+ return options.enabled();
30
+ }
31
+ return options.enabled ?? true;
32
+ };
33
+
34
+ createEffect(() => {
35
+ if (typeof window === "undefined" || !window.ResizeObserver) {
36
+ return;
37
+ }
38
+
39
+ if (!isEnabled()) return;
40
+
41
+ const el = getTarget();
42
+ if (!el) return;
43
+
44
+ const observer = new ResizeObserver(callback);
45
+ observer.observe(el, { box: options.box });
46
+
47
+ onCleanup(() => {
48
+ observer.disconnect();
49
+ });
50
+ });
51
+ }
52
+
53
+ export interface CreateElementSizeReturn {
54
+ /** Accessor for element width in pixels */
55
+ width: Accessor<number>;
56
+ /** Accessor for element height in pixels */
57
+ height: Accessor<number>;
58
+ }
59
+
60
+ /**
61
+ * SolidJS reactive primitive returning width and height accessors for a target HTML element.
62
+ *
63
+ * @param target Target element or accessor returning HTML element.
64
+ * @param options ResizeObserver options.
65
+ */
66
+ export function createElementSize(
67
+ target: HTMLElement | Accessor<HTMLElement | undefined>,
68
+ options: CreateResizeObserverOptions = {}
69
+ ): CreateElementSizeReturn {
70
+ const [width, setWidth] = createSignal(0);
71
+ const [height, setHeight] = createSignal(0);
72
+
73
+ createResizeObserver(
74
+ target,
75
+ (entries) => {
76
+ const entry = entries[0];
77
+ if (entry) {
78
+ setWidth(entry.contentRect.width);
79
+ setHeight(entry.contentRect.height);
80
+ }
81
+ },
82
+ options
83
+ );
84
+
85
+ return {
86
+ width,
87
+ height,
88
+ };
89
+ }
@@ -0,0 +1,129 @@
1
+ import { createEffect, createSignal, onCleanup, type Accessor } from "solid-js";
2
+
3
+ export type ScrollDirection = "up" | "down" | "left" | "right" | "none";
4
+
5
+ export interface CreateScrollPositionOptions {
6
+ /** Target element to observe scroll events on. Defaults to window. */
7
+ target?: HTMLElement | Window | Accessor<HTMLElement | Window | undefined>;
8
+ }
9
+
10
+ export interface CreateScrollPositionReturn {
11
+ /** Accessor for horizontal scroll position (scrollLeft / pageXOffset) */
12
+ x: Accessor<number>;
13
+ /** Accessor for vertical scroll position (scrollTop / pageYOffset) */
14
+ y: Accessor<number>;
15
+ /** Accessor indicating if element is actively scrolling */
16
+ isScrolling: Accessor<boolean>;
17
+ /** Accessor for current scroll direction ('up', 'down', 'left', 'right', 'none') */
18
+ direction: Accessor<ScrollDirection>;
19
+ /** Accessor indicating if scroll is at top (y <= 0) */
20
+ isAtTop: Accessor<boolean>;
21
+ /** Accessor indicating if scroll is at bottom of container */
22
+ isAtBottom: Accessor<boolean>;
23
+ /** Function to programmatically scroll target element */
24
+ scrollTo: (options: ScrollToOptions) => void;
25
+ }
26
+
27
+ /**
28
+ * SolidJS reactive primitive for tracking target element or window scroll position and scroll metrics.
29
+ *
30
+ * @param options Configuration options including target element.
31
+ */
32
+ export function createScrollPosition(
33
+ options: CreateScrollPositionOptions = {}
34
+ ): CreateScrollPositionReturn {
35
+ const [x, setX] = createSignal(0);
36
+ const [y, setY] = createSignal(0);
37
+ const [isScrolling, setIsScrolling] = createSignal(false);
38
+ const [direction, setDirection] = createSignal<ScrollDirection>("none");
39
+ const [isAtTop, setIsAtTop] = createSignal(true);
40
+ const [isAtBottom, setIsAtBottom] = createSignal(false);
41
+
42
+ let scrollTimeout: ReturnType<typeof setTimeout> | undefined;
43
+ let lastX = 0;
44
+ let lastY = 0;
45
+
46
+ const getTarget = (): HTMLElement | Window | undefined => {
47
+ if (typeof window === "undefined") return undefined;
48
+ if (!options.target) return window;
49
+ if (typeof options.target === "function") {
50
+ return (options.target as Accessor<HTMLElement | Window | undefined>)();
51
+ }
52
+ return options.target;
53
+ };
54
+
55
+ const updateScroll = () => {
56
+ const target = getTarget();
57
+ if (!target) return;
58
+
59
+ let currentX = 0;
60
+ let currentY = 0;
61
+ let maxScrollY = 0;
62
+
63
+ if (target === window) {
64
+ currentX = window.scrollX || window.pageXOffset;
65
+ currentY = window.scrollY || window.pageYOffset;
66
+ maxScrollY = document.documentElement.scrollHeight - window.innerHeight;
67
+ } else {
68
+ const el = target as HTMLElement;
69
+ currentX = el.scrollLeft;
70
+ currentY = el.scrollTop;
71
+ maxScrollY = el.scrollHeight - el.clientHeight;
72
+ }
73
+
74
+ // Determine direction
75
+ const deltaX = currentX - lastX;
76
+ const deltaY = currentY - lastY;
77
+
78
+ if (Math.abs(deltaY) > Math.abs(deltaX)) {
79
+ if (deltaY > 0) setDirection("down");
80
+ else if (deltaY < 0) setDirection("up");
81
+ } else if (Math.abs(deltaX) > 0) {
82
+ if (deltaX > 0) setDirection("right");
83
+ else if (deltaX < 0) setDirection("left");
84
+ }
85
+
86
+ lastX = currentX;
87
+ lastY = currentY;
88
+
89
+ setX(currentX);
90
+ setY(currentY);
91
+ setIsAtTop(currentY <= 0);
92
+ setIsAtBottom(maxScrollY > 0 && currentY >= maxScrollY - 1);
93
+ setIsScrolling(true);
94
+
95
+ if (scrollTimeout) clearTimeout(scrollTimeout);
96
+ scrollTimeout = setTimeout(() => {
97
+ setIsScrolling(false);
98
+ }, 150);
99
+ };
100
+
101
+ createEffect(() => {
102
+ const target = getTarget();
103
+ if (!target) return;
104
+
105
+ updateScroll();
106
+
107
+ target.addEventListener("scroll", updateScroll, { passive: true });
108
+ onCleanup(() => {
109
+ target.removeEventListener("scroll", updateScroll);
110
+ if (scrollTimeout) clearTimeout(scrollTimeout);
111
+ });
112
+ });
113
+
114
+ const scrollTo = (scrollOptions: ScrollToOptions) => {
115
+ const target = getTarget();
116
+ if (!target) return;
117
+ target.scrollTo(scrollOptions);
118
+ };
119
+
120
+ return {
121
+ x,
122
+ y,
123
+ isScrolling,
124
+ direction,
125
+ isAtTop,
126
+ isAtBottom,
127
+ scrollTo,
128
+ };
129
+ }
@@ -0,0 +1,9 @@
1
+ import { clsx, type ClassValue } from "clsx";
2
+ import { twMerge } from "tailwind-merge";
3
+
4
+ /**
5
+ * Combines multiple class names and resolves Tailwind CSS conflicts.
6
+ */
7
+ export function cn(...inputs: ClassValue[]) {
8
+ return twMerge(clsx(inputs));
9
+ }
@@ -0,0 +1,203 @@
1
+ import {
2
+ createContext,
3
+ createEffect,
4
+ createSignal,
5
+ onCleanup,
6
+ onMount,
7
+ useContext,
8
+ type ParentComponent,
9
+ type Accessor,
10
+ } from "solid-js";
11
+ import {
12
+ getAccentCssVariables,
13
+ isDocsAccentColor,
14
+ type DocsAccentColor,
15
+ } from "../theme-accent.js";
16
+
17
+ export type Theme = "light" | "dark" | "system";
18
+ export type AccentColor = DocsAccentColor;
19
+ export type Radius = "0" | "0.3" | "0.5" | "0.75" | "1.0";
20
+
21
+ export interface ThemeProviderProps {
22
+ /** Initial default theme mode if no saved preference is found in localStorage */
23
+ defaultTheme?: Theme;
24
+ /** Initial default accent color override if needed */
25
+ defaultAccent?: AccentColor;
26
+ /** Initial default border radius override if needed */
27
+ defaultRadius?: Radius;
28
+ /** Key used to store theme preferences in localStorage */
29
+ storageKey?: string;
30
+ }
31
+
32
+ interface ThemeProviderContextValue {
33
+ theme: Accessor<Theme>;
34
+ setTheme: (theme: Theme) => void;
35
+ accent: Accessor<AccentColor | undefined>;
36
+ setAccent: (accent: AccentColor) => void;
37
+ radius: Accessor<Radius | undefined>;
38
+ setRadius: (radius: Radius) => void;
39
+ }
40
+
41
+ const ThemeProviderContext = createContext<ThemeProviderContextValue>();
42
+
43
+ /**
44
+ * Context provider managing application theme state (light/dark/system), accent colors, and border radius.
45
+ */
46
+ export const ThemeProvider: ParentComponent<ThemeProviderProps> = (props) => {
47
+ const storageKey = props.storageKey || "nikala-theme";
48
+ const defaultTheme = props.defaultTheme || "system";
49
+
50
+ // Safely read saved values from localStorage without forcing unnecessary fallbacks
51
+ const getInitialTheme = (): Theme => {
52
+ if (typeof window === "undefined") return defaultTheme;
53
+ try {
54
+ const saved = localStorage.getItem(`${storageKey}-mode`);
55
+ if (saved === "light" || saved === "dark" || saved === "system") return saved;
56
+ } catch { }
57
+ return defaultTheme;
58
+ };
59
+
60
+ const getInitialAccent = (): AccentColor | undefined => {
61
+ if (typeof window === "undefined") return props.defaultAccent;
62
+ try {
63
+ const saved = localStorage.getItem(`${storageKey}-accent`);
64
+ if (isDocsAccentColor(saved)) return saved;
65
+ } catch { }
66
+ return props.defaultAccent;
67
+ };
68
+
69
+ const getInitialRadius = (): Radius | undefined => {
70
+ if (typeof window === "undefined") return props.defaultRadius;
71
+ try {
72
+ const saved = localStorage.getItem(`${storageKey}-radius`);
73
+ if (saved) return saved as Radius;
74
+ } catch { }
75
+ return props.defaultRadius;
76
+ };
77
+
78
+ const [theme, setThemeSignal] = createSignal<Theme>(getInitialTheme());
79
+ const [accent, setAccentSignal] = createSignal<AccentColor | undefined>(getInitialAccent());
80
+ const [radius, setRadiusSignal] = createSignal<Radius | undefined>(getInitialRadius());
81
+
82
+ // Applies classes and CSS custom properties when custom overrides are explicitly set
83
+ const applyTheme = (
84
+ targetTheme: Theme,
85
+ currentAccent: AccentColor | undefined,
86
+ currentRadius: Radius | undefined
87
+ ) => {
88
+ if (typeof window === "undefined") return;
89
+
90
+ const root = document.documentElement;
91
+ root.classList.remove("light", "dark");
92
+
93
+ let resolvedDark = false;
94
+ if (targetTheme === "system") {
95
+ resolvedDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
96
+ root.classList.add(resolvedDark ? "dark" : "light");
97
+ } else {
98
+ resolvedDark = targetTheme === "dark";
99
+ root.classList.add(targetTheme);
100
+ }
101
+ root.style.colorScheme = resolvedDark ? "dark" : "light";
102
+
103
+ // Override --primary CSS variables ONLY if explicitly chosen
104
+ if (currentAccent && isDocsAccentColor(currentAccent)) {
105
+ const accentTokens = getAccentCssVariables(currentAccent, resolvedDark);
106
+ root.style.setProperty("--primary", accentTokens.primary);
107
+ root.style.setProperty("--primary-foreground", accentTokens.foreground);
108
+ } else {
109
+ root.style.removeProperty("--primary");
110
+ root.style.removeProperty("--primary-foreground");
111
+ }
112
+
113
+ // Override --radius CSS variable ONLY if explicitly chosen
114
+ if (currentRadius) {
115
+ root.style.setProperty("--radius", `${currentRadius}rem`);
116
+ } else {
117
+ root.style.removeProperty("--radius");
118
+ }
119
+ };
120
+
121
+ // Reactively apply theme updates and store preferences in localStorage
122
+ createEffect(() => {
123
+ const t = theme();
124
+ const a = accent();
125
+ const r = radius();
126
+
127
+ applyTheme(t, a, r);
128
+
129
+ if (typeof window !== "undefined") {
130
+ try {
131
+ localStorage.setItem(`${storageKey}-mode`, t);
132
+ if (a) localStorage.setItem(`${storageKey}-accent`, a);
133
+ else localStorage.removeItem(`${storageKey}-accent`);
134
+ if (r) localStorage.setItem(`${storageKey}-radius`, r);
135
+ else localStorage.removeItem(`${storageKey}-radius`);
136
+ } catch { }
137
+ }
138
+ });
139
+
140
+ onMount(() => {
141
+ if (typeof window === "undefined") return;
142
+
143
+ const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)");
144
+
145
+ const handleSystemChange = (e: MediaQueryListEvent) => {
146
+ if (theme() === "system") {
147
+ const root = document.documentElement;
148
+ root.classList.remove("light", "dark");
149
+ root.classList.add(e.matches ? "dark" : "light");
150
+ root.style.colorScheme = e.matches ? "dark" : "light";
151
+
152
+ const currentAccent = accent();
153
+ if (currentAccent && isDocsAccentColor(currentAccent)) {
154
+ const accentTokens = getAccentCssVariables(currentAccent, e.matches);
155
+ root.style.setProperty("--primary", accentTokens.primary);
156
+ root.style.setProperty("--primary-foreground", accentTokens.foreground);
157
+ }
158
+ }
159
+ };
160
+
161
+ if (mediaQuery.addEventListener) {
162
+ mediaQuery.addEventListener("change", handleSystemChange);
163
+ } else if ("addListener" in mediaQuery) {
164
+ (mediaQuery as any).addListener(handleSystemChange);
165
+ }
166
+
167
+ onCleanup(() => {
168
+ if (mediaQuery.removeEventListener) {
169
+ mediaQuery.removeEventListener("change", handleSystemChange);
170
+ } else if ("removeListener" in mediaQuery) {
171
+ (mediaQuery as any).removeListener(handleSystemChange);
172
+ }
173
+ });
174
+ });
175
+
176
+ const value: ThemeProviderContextValue = {
177
+ theme,
178
+ setTheme: (newTheme: Theme) => setThemeSignal(newTheme),
179
+ accent,
180
+ setAccent: (newAccent: AccentColor) => setAccentSignal(newAccent),
181
+ radius,
182
+ setRadius: (newRadius: Radius) => setRadiusSignal(newRadius),
183
+ };
184
+
185
+ return (
186
+ <ThemeProviderContext.Provider value={value}>
187
+ {props.children}
188
+ </ThemeProviderContext.Provider>
189
+ );
190
+ };
191
+
192
+ /**
193
+ * Accesses Nikala UI theme state, accent colors, border radius, and update functions.
194
+ */
195
+ export function useTheme(): ThemeProviderContextValue {
196
+ const context = useContext(ThemeProviderContext);
197
+ if (!context) {
198
+ throw new Error("useTheme must be used within a ThemeProvider");
199
+ }
200
+ return context;
201
+ }
202
+
203
+ export { ThemeScript, type ThemeScriptProps } from "./theme-script";