livemark 0.7.1 → 0.8.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 (624) hide show
  1. package/package.json +14 -14
  2. package/source/actions/changelog/build.ts +245 -0
  3. package/source/actions/changelog/build.unit.ts +69 -0
  4. package/source/actions/config/define.ts +11 -0
  5. package/source/actions/config/define.unit.ts +33 -0
  6. package/source/actions/config/load.ts +22 -0
  7. package/source/actions/config/load.unit.ts +30 -0
  8. package/source/commands/build.ts +21 -0
  9. package/source/commands/escape.ts +77 -0
  10. package/source/commands/preview.ts +25 -0
  11. package/source/commands/start.ts +26 -0
  12. package/{build/website → source}/components/Article.tsx +12 -2
  13. package/{build/website → source}/components/Callout.tsx +1 -1
  14. package/{build/website → source}/components/Layout.tsx +3 -14
  15. package/{build/website → source}/components/LinkButton.tsx +1 -1
  16. package/{build/website → source}/components/PageToolbar.tsx +21 -8
  17. package/{build/website → source}/components/Section.tsx +1 -1
  18. package/{build/website → source}/components/SectionHeader.tsx +1 -1
  19. package/{build/website/components/MiniSidebar.tsx → source/components/Sidebar.tsx} +21 -5
  20. package/{build/website/components/Sidebar.tsx → source/components/SidebarArticles.tsx} +22 -55
  21. package/source/components/SidebarPosts.tsx +129 -0
  22. package/source/components/SidebarReleases.tsx +85 -0
  23. package/{build/website → source}/content-collections.ts +2 -2
  24. package/{build/website → source}/elements/accordion.tsx +1 -1
  25. package/{build/website → source}/elements/alert-dialog.tsx +1 -1
  26. package/{build/website → source}/elements/alert.tsx +1 -1
  27. package/{build/website → source}/elements/aspect-ratio.tsx +1 -1
  28. package/{build/website → source}/elements/avatar.tsx +1 -1
  29. package/{build/website → source}/elements/badge.tsx +1 -1
  30. package/{build/website → source}/elements/breadcrumb.tsx +1 -1
  31. package/{build/website → source}/elements/button-group.tsx +1 -1
  32. package/{build/website → source}/elements/button.tsx +1 -1
  33. package/{build/website → source}/elements/calendar.tsx +1 -1
  34. package/{build/website → source}/elements/card.tsx +1 -1
  35. package/{build/website → source}/elements/carousel.tsx +1 -1
  36. package/{build/website → source}/elements/chart.tsx +1 -1
  37. package/{build/website → source}/elements/checkbox.tsx +1 -1
  38. package/{build/website → source}/elements/command.tsx +1 -1
  39. package/{build/website → source}/elements/context-menu.tsx +1 -1
  40. package/{build/website → source}/elements/dialog.tsx +1 -1
  41. package/{build/website → source}/elements/drawer.tsx +1 -1
  42. package/{build/website → source}/elements/dropdown-menu.tsx +1 -1
  43. package/{build/website → source}/elements/empty.tsx +1 -1
  44. package/{build/website → source}/elements/field.tsx +1 -1
  45. package/{build/website → source}/elements/hover-card.tsx +1 -1
  46. package/{build/website → source}/elements/input-group.tsx +1 -1
  47. package/{build/website → source}/elements/input-otp.tsx +1 -1
  48. package/{build/website → source}/elements/input.tsx +1 -1
  49. package/{build/website → source}/elements/item.tsx +1 -1
  50. package/{build/website → source}/elements/kbd.tsx +1 -1
  51. package/{build/website → source}/elements/label.tsx +1 -1
  52. package/{build/website → source}/elements/menubar.tsx +1 -1
  53. package/{build/website → source}/elements/native-select.tsx +1 -1
  54. package/{build/website → source}/elements/navigation-menu.tsx +1 -1
  55. package/{build/website → source}/elements/pagination.tsx +1 -1
  56. package/{build/website → source}/elements/popover.tsx +1 -1
  57. package/{build/website → source}/elements/progress.tsx +1 -1
  58. package/{build/website → source}/elements/radio-group.tsx +1 -1
  59. package/{build/website → source}/elements/resizable.tsx +1 -1
  60. package/{build/website → source}/elements/scroll-area.tsx +1 -1
  61. package/{build/website → source}/elements/select.tsx +1 -1
  62. package/{build/website → source}/elements/separator.tsx +1 -1
  63. package/{build/website → source}/elements/sheet.tsx +1 -1
  64. package/{build/website → source}/elements/sidebar.tsx +7 -4
  65. package/{build/website → source}/elements/skeleton.tsx +1 -1
  66. package/{build/website → source}/elements/slider.tsx +1 -1
  67. package/{build/website → source}/elements/spinner.tsx +1 -1
  68. package/{build/website → source}/elements/switch.tsx +1 -1
  69. package/{build/website → source}/elements/table.tsx +1 -1
  70. package/{build/website → source}/elements/tabs.tsx +1 -1
  71. package/{build/website → source}/elements/textarea.tsx +1 -1
  72. package/{build/website → source}/elements/toggle-group.tsx +1 -1
  73. package/{build/website → source}/elements/toggle.tsx +1 -1
  74. package/{build/website → source}/elements/tooltip.tsx +1 -1
  75. package/source/entrypoints/main.ts +12 -0
  76. package/{build/website → source}/env.d.ts +1 -1
  77. package/source/helpers/program.ts +6 -0
  78. package/{build/website → source}/helpers/section.ts +1 -1
  79. package/source/hooks/media.ts +29 -0
  80. package/source/index.ts +1 -0
  81. package/{build/website → source}/models/article.ts +4 -0
  82. package/source/models/config.ts +51 -0
  83. package/source/models/link.ts +11 -0
  84. package/source/models/patch.ts +9 -0
  85. package/source/models/section.ts +45 -0
  86. package/source/models/theme.ts +74 -0
  87. package/{build/website → source}/plugins/vite-livemark.ts +0 -7
  88. package/source/program.ts +18 -0
  89. package/source/settings.ts +6 -0
  90. package/{build/website → source}/vite.config.ts +4 -3
  91. package/{build → target}/actions/changelog/build.d.ts +1 -0
  92. package/target/actions/changelog/build.js +187 -0
  93. package/target/actions/changelog/build.unit.js +66 -0
  94. package/target/actions/config/define.js +8 -0
  95. package/target/actions/config/define.unit.js +29 -0
  96. package/target/actions/config/load.js +25 -0
  97. package/target/actions/config/load.unit.js +23 -0
  98. package/target/client.d.ts +1 -0
  99. package/target/client.js +6 -0
  100. package/target/commands/build.js +14 -0
  101. package/target/commands/escape.js +56 -0
  102. package/target/commands/preview.js +18 -0
  103. package/target/commands/start.js +19 -0
  104. package/target/components/Abbr.d.ts +5 -0
  105. package/target/components/Abbr.js +9 -0
  106. package/target/components/AnsiCode.d.ts +4 -0
  107. package/target/components/AnsiCode.js +6 -0
  108. package/target/components/Article.d.ts +5 -0
  109. package/target/components/Article.js +105 -0
  110. package/target/components/BackToTop.d.ts +3 -0
  111. package/target/components/BackToTop.js +19 -0
  112. package/target/components/Banner.d.ts +2 -0
  113. package/target/components/Banner.js +12 -0
  114. package/target/components/BlogIndex.d.ts +4 -0
  115. package/target/components/BlogIndex.js +62 -0
  116. package/target/components/Breadcrumbs.d.ts +1 -0
  117. package/target/components/Breadcrumbs.js +13 -0
  118. package/target/components/Callout.d.ts +8 -0
  119. package/target/components/Callout.js +43 -0
  120. package/target/components/Card.d.ts +7 -0
  121. package/target/components/Card.js +17 -0
  122. package/target/components/Cards.d.ts +4 -0
  123. package/target/components/Cards.js +6 -0
  124. package/target/components/ChangelogIndex.d.ts +4 -0
  125. package/target/components/ChangelogIndex.js +57 -0
  126. package/target/components/CodeBlock.d.ts +1 -0
  127. package/target/components/CodeBlock.js +47 -0
  128. package/target/components/CodeTabs.d.ts +6 -0
  129. package/target/components/CodeTabs.js +49 -0
  130. package/target/components/Column.d.ts +4 -0
  131. package/target/components/Column.js +6 -0
  132. package/target/components/Columns.d.ts +5 -0
  133. package/target/components/Columns.js +10 -0
  134. package/target/components/Content.d.ts +3 -0
  135. package/target/components/Content.js +5 -0
  136. package/target/components/ContentTab.d.ts +5 -0
  137. package/target/components/ContentTab.js +6 -0
  138. package/target/components/ContentTabs.d.ts +5 -0
  139. package/target/components/ContentTabs.js +47 -0
  140. package/target/components/DefaultCatchBoundary.d.ts +2 -0
  141. package/target/components/DefaultCatchBoundary.js +20 -0
  142. package/target/components/DefinitionList.d.ts +7 -0
  143. package/target/components/DefinitionList.js +14 -0
  144. package/target/components/Details.d.ts +5 -0
  145. package/target/components/Details.js +13 -0
  146. package/target/components/FileTree.d.ts +4 -0
  147. package/target/components/FileTree.js +17 -0
  148. package/target/components/Footer.d.ts +2 -0
  149. package/target/components/Footer.js +9 -0
  150. package/target/components/FootnoteRef.d.ts +3 -0
  151. package/target/components/FootnoteRef.js +31 -0
  152. package/target/components/Heading.d.ts +8 -0
  153. package/target/components/Heading.js +18 -0
  154. package/target/components/InlineBadge.d.ts +5 -0
  155. package/target/components/InlineBadge.js +7 -0
  156. package/target/components/InlineIcon.d.ts +5 -0
  157. package/target/components/InlineIcon.js +10 -0
  158. package/target/components/InlineToc.d.ts +4 -0
  159. package/target/components/InlineToc.js +14 -0
  160. package/target/components/Layout.d.ts +4 -0
  161. package/target/components/Layout.js +65 -0
  162. package/target/components/LinkButton.d.ts +7 -0
  163. package/target/components/LinkButton.js +11 -0
  164. package/target/components/Mermaid.d.ts +4 -0
  165. package/target/components/Mermaid.js +8 -0
  166. package/target/components/MermaidRenderer.d.ts +4 -0
  167. package/target/components/MermaidRenderer.js +32 -0
  168. package/target/components/NotFound.d.ts +3 -0
  169. package/target/components/NotFound.js +10 -0
  170. package/target/components/PackageTabs.d.ts +9 -0
  171. package/target/components/PackageTabs.js +28 -0
  172. package/target/components/PageToolbar.d.ts +7 -0
  173. package/target/components/PageToolbar.js +34 -0
  174. package/target/components/PrevNext.d.ts +4 -0
  175. package/target/components/PrevNext.js +34 -0
  176. package/target/components/Search.d.ts +2 -0
  177. package/target/components/Search.js +16 -0
  178. package/target/components/SearchDialog.d.ts +5 -0
  179. package/target/components/SearchDialog.js +139 -0
  180. package/target/components/Section.d.ts +5 -0
  181. package/target/components/Section.js +8 -0
  182. package/target/components/SectionHeader.d.ts +7 -0
  183. package/target/components/SectionHeader.js +7 -0
  184. package/target/components/Sidebar.d.ts +4 -0
  185. package/target/components/Sidebar.js +33 -0
  186. package/target/components/SidebarArticles.d.ts +2 -0
  187. package/target/components/SidebarArticles.js +45 -0
  188. package/target/components/SidebarLinks.d.ts +4 -0
  189. package/target/components/SidebarLinks.js +26 -0
  190. package/target/components/SidebarPosts.d.ts +2 -0
  191. package/target/components/SidebarPosts.js +53 -0
  192. package/target/components/SidebarReleases.d.ts +2 -0
  193. package/target/components/SidebarReleases.js +35 -0
  194. package/target/components/SidebarSections.d.ts +4 -0
  195. package/target/components/SidebarSections.js +36 -0
  196. package/target/components/SiteTitle.d.ts +2 -0
  197. package/target/components/SiteTitle.js +12 -0
  198. package/target/components/SortableTable.d.ts +5 -0
  199. package/target/components/SortableTable.js +63 -0
  200. package/target/components/SoundCloud.d.ts +4 -0
  201. package/target/components/SoundCloud.js +7 -0
  202. package/target/components/TagIndex.d.ts +5 -0
  203. package/target/components/TagIndex.js +64 -0
  204. package/target/components/Theme.d.ts +1 -0
  205. package/target/components/Theme.js +21 -0
  206. package/target/components/Toc.d.ts +12 -0
  207. package/target/components/Toc.js +128 -0
  208. package/target/components/YouTube.d.ts +4 -0
  209. package/target/components/YouTube.js +6 -0
  210. package/target/components/ZoomImage.d.ts +4 -0
  211. package/target/components/ZoomImage.js +26 -0
  212. package/target/content/article.d.ts +43 -0
  213. package/target/content/article.js +54 -0
  214. package/target/content/tag.d.ts +2 -0
  215. package/target/content/tag.js +30 -0
  216. package/target/content-collections.d.ts +2 -0
  217. package/target/content-collections.js +192 -0
  218. package/target/elements/accordion.d.ts +6 -0
  219. package/target/elements/accordion.js +19 -0
  220. package/target/elements/alert-dialog.d.ts +18 -0
  221. package/target/elements/alert-dialog.js +44 -0
  222. package/target/elements/alert.d.ts +9 -0
  223. package/target/elements/alert.js +28 -0
  224. package/target/elements/aspect-ratio.d.ts +4 -0
  225. package/target/elements/aspect-ratio.js +9 -0
  226. package/target/elements/avatar.d.ts +11 -0
  227. package/target/elements/avatar.js +23 -0
  228. package/target/elements/badge.d.ts +7 -0
  229. package/target/elements/badge.js +34 -0
  230. package/target/elements/breadcrumb.d.ts +9 -0
  231. package/target/elements/breadcrumb.js +39 -0
  232. package/target/elements/button-group.d.ts +10 -0
  233. package/target/elements/button-group.js +37 -0
  234. package/target/elements/button.d.ts +8 -0
  235. package/target/elements/button.js +35 -0
  236. package/target/elements/calendar.d.ts +10 -0
  237. package/target/elements/calendar.js +76 -0
  238. package/target/elements/card.d.ts +11 -0
  239. package/target/elements/card.js +25 -0
  240. package/target/elements/carousel.d.ts +28 -0
  241. package/target/elements/carousel.js +95 -0
  242. package/target/elements/chart.d.ts +44 -0
  243. package/target/elements/chart.js +140 -0
  244. package/target/elements/checkbox.d.ts +3 -0
  245. package/target/elements/checkbox.js +9 -0
  246. package/target/elements/collapsible.d.ts +5 -0
  247. package/target/elements/collapsible.js +13 -0
  248. package/target/elements/command.d.ts +23 -0
  249. package/target/elements/command.js +42 -0
  250. package/target/elements/context-menu.d.ts +29 -0
  251. package/target/elements/context-menu.js +54 -0
  252. package/target/elements/dialog.d.ts +16 -0
  253. package/target/elements/dialog.js +41 -0
  254. package/target/elements/direction.d.ts +1 -0
  255. package/target/elements/direction.js +2 -0
  256. package/target/elements/drawer.d.ts +12 -0
  257. package/target/elements/drawer.js +38 -0
  258. package/target/elements/dropdown-menu.d.ts +24 -0
  259. package/target/elements/dropdown-menu.js +54 -0
  260. package/target/elements/empty.d.ts +11 -0
  261. package/target/elements/empty.js +34 -0
  262. package/target/elements/field.d.ts +24 -0
  263. package/target/elements/field.js +69 -0
  264. package/target/elements/hover-card.d.ts +5 -0
  265. package/target/elements/hover-card.js +14 -0
  266. package/target/elements/input-group.d.ts +18 -0
  267. package/target/elements/input-group.js +60 -0
  268. package/target/elements/input-otp.d.ts +11 -0
  269. package/target/elements/input-otp.js +21 -0
  270. package/target/elements/input.d.ts +2 -0
  271. package/target/elements/input.js +8 -0
  272. package/target/elements/item.d.ts +21 -0
  273. package/target/elements/item.js +79 -0
  274. package/target/elements/kbd.d.ts +3 -0
  275. package/target/elements/kbd.js +10 -0
  276. package/target/elements/label.d.ts +2 -0
  277. package/target/elements/label.js +8 -0
  278. package/target/elements/menubar.d.ts +29 -0
  279. package/target/elements/menubar.js +58 -0
  280. package/target/elements/native-select.d.ts +8 -0
  281. package/target/elements/native-select.js +16 -0
  282. package/target/elements/navigation-menu.d.ts +11 -0
  283. package/target/elements/navigation-menu.js +34 -0
  284. package/target/elements/pagination.d.ts +17 -0
  285. package/target/elements/pagination.js +33 -0
  286. package/target/elements/popover.d.ts +9 -0
  287. package/target/elements/popover.js +23 -0
  288. package/target/elements/progress.d.ts +7 -0
  289. package/target/elements/progress.js +21 -0
  290. package/target/elements/radio-group.d.ts +5 -0
  291. package/target/elements/radio-group.js +12 -0
  292. package/target/elements/resizable.d.ts +7 -0
  293. package/target/elements/resizable.js +14 -0
  294. package/target/elements/scroll-area.d.ts +4 -0
  295. package/target/elements/scroll-area.js +13 -0
  296. package/target/elements/select.d.ts +15 -0
  297. package/target/elements/select.js +39 -0
  298. package/target/elements/separator.d.ts +3 -0
  299. package/target/elements/separator.js +8 -0
  300. package/target/elements/sheet.d.ts +13 -0
  301. package/target/elements/sheet.js +41 -0
  302. package/target/elements/sidebar.d.ts +63 -0
  303. package/target/elements/sidebar.js +272 -0
  304. package/target/elements/skeleton.d.ts +2 -0
  305. package/target/elements/skeleton.js +7 -0
  306. package/target/elements/slider.d.ts +3 -0
  307. package/target/elements/slider.js +15 -0
  308. package/target/elements/sonner.d.ts +3 -0
  309. package/target/elements/sonner.js +23 -0
  310. package/target/elements/spinner.d.ts +2 -0
  311. package/target/elements/spinner.js +8 -0
  312. package/target/elements/switch.d.ts +5 -0
  313. package/target/elements/switch.js +8 -0
  314. package/target/elements/table.d.ts +9 -0
  315. package/target/elements/table.js +28 -0
  316. package/target/elements/tabs.d.ts +10 -0
  317. package/target/elements/tabs.js +29 -0
  318. package/target/elements/textarea.d.ts +2 -0
  319. package/target/elements/textarea.js +7 -0
  320. package/target/elements/toggle-group.d.ts +10 -0
  321. package/target/elements/toggle-group.js +24 -0
  322. package/target/elements/toggle.d.ts +8 -0
  323. package/target/elements/toggle.js +26 -0
  324. package/target/elements/tooltip.d.ts +6 -0
  325. package/target/elements/tooltip.js +18 -0
  326. package/target/entrypoints/main.js +12 -0
  327. package/target/helpers/article-icon.d.ts +3 -0
  328. package/target/helpers/article-icon.js +34 -0
  329. package/target/helpers/article.d.ts +24 -0
  330. package/target/helpers/article.js +73 -0
  331. package/target/helpers/changelog-source.d.ts +7 -0
  332. package/target/helpers/changelog-source.js +16 -0
  333. package/target/helpers/changelog-source.unit.d.ts +1 -0
  334. package/target/helpers/changelog-source.unit.js +33 -0
  335. package/target/helpers/dynamic-icon-resolver.d.ts +5 -0
  336. package/target/helpers/dynamic-icon-resolver.js +17 -0
  337. package/target/helpers/dynamic-icon.d.ts +5 -0
  338. package/target/helpers/dynamic-icon.js +8 -0
  339. package/target/helpers/favicon.d.ts +2 -0
  340. package/target/helpers/favicon.js +11 -0
  341. package/target/helpers/model.d.ts +3 -0
  342. package/target/helpers/model.js +4 -0
  343. package/target/helpers/program.js +5 -0
  344. package/target/helpers/resolve-asset-path.d.ts +2 -0
  345. package/target/helpers/resolve-asset-path.js +9 -0
  346. package/target/helpers/resolve-includes.d.ts +2 -0
  347. package/target/helpers/resolve-includes.js +113 -0
  348. package/target/helpers/resolve-includes.unit.d.ts +1 -0
  349. package/target/helpers/resolve-includes.unit.js +76 -0
  350. package/target/helpers/search-text.d.ts +2 -0
  351. package/target/helpers/search-text.js +16 -0
  352. package/target/helpers/section.d.ts +13 -0
  353. package/target/helpers/section.js +39 -0
  354. package/target/helpers/section.unit.d.ts +1 -0
  355. package/target/helpers/section.unit.js +62 -0
  356. package/target/helpers/theme.d.ts +5 -0
  357. package/target/helpers/theme.js +23 -0
  358. package/target/helpers/toc-context.d.ts +5 -0
  359. package/target/helpers/toc-context.js +8 -0
  360. package/target/helpers/toc.d.ts +3 -0
  361. package/target/helpers/toc.js +41 -0
  362. package/target/helpers/toc.unit.d.ts +1 -0
  363. package/target/helpers/toc.unit.js +65 -0
  364. package/target/hooks/in-view.d.ts +4 -0
  365. package/target/hooks/in-view.js +23 -0
  366. package/target/hooks/media.d.ts +6 -0
  367. package/target/hooks/media.js +25 -0
  368. package/target/index.js +2 -0
  369. package/target/models/article.d.ts +57 -0
  370. package/target/models/article.js +21 -0
  371. package/{build → target}/models/config.d.ts +10 -0
  372. package/target/models/config.js +34 -0
  373. package/target/models/link.js +9 -0
  374. package/{build → target}/models/patch.d.ts +5 -0
  375. package/target/models/patch.js +7 -0
  376. package/target/models/section.js +26 -0
  377. package/target/models/theme.js +73 -0
  378. package/target/models/toc.d.ts +5 -0
  379. package/target/models/toc.js +2 -0
  380. package/target/plugins/rehype-inline-code.d.ts +19 -0
  381. package/target/plugins/rehype-inline-code.js +55 -0
  382. package/target/plugins/rehype-task-list-a11y.d.ts +10 -0
  383. package/target/plugins/rehype-task-list-a11y.js +29 -0
  384. package/target/plugins/remark-abbr.d.ts +6 -0
  385. package/target/plugins/remark-abbr.js +39 -0
  386. package/target/plugins/remark-abbr.unit.d.ts +1 -0
  387. package/target/plugins/remark-abbr.unit.js +79 -0
  388. package/target/plugins/remark-ansi.d.ts +8 -0
  389. package/target/plugins/remark-ansi.js +239 -0
  390. package/target/plugins/remark-ansi.unit.d.ts +1 -0
  391. package/target/plugins/remark-ansi.unit.js +134 -0
  392. package/target/plugins/remark-badge.d.ts +6 -0
  393. package/target/plugins/remark-badge.js +43 -0
  394. package/target/plugins/remark-badge.unit.d.ts +1 -0
  395. package/target/plugins/remark-badge.unit.js +76 -0
  396. package/target/plugins/remark-button.d.ts +6 -0
  397. package/target/plugins/remark-button.js +52 -0
  398. package/target/plugins/remark-button.unit.d.ts +1 -0
  399. package/target/plugins/remark-button.unit.js +105 -0
  400. package/target/plugins/remark-callout.d.ts +4 -0
  401. package/target/plugins/remark-callout.js +39 -0
  402. package/target/plugins/remark-card.d.ts +4 -0
  403. package/target/plugins/remark-card.js +66 -0
  404. package/target/plugins/remark-code-tabs.d.ts +4 -0
  405. package/target/plugins/remark-code-tabs.js +72 -0
  406. package/target/plugins/remark-columns.d.ts +4 -0
  407. package/target/plugins/remark-columns.js +54 -0
  408. package/target/plugins/remark-custom-heading-id.d.ts +14 -0
  409. package/target/plugins/remark-custom-heading-id.js +54 -0
  410. package/target/plugins/remark-custom-heading-id.unit.d.ts +1 -0
  411. package/target/plugins/remark-custom-heading-id.unit.js +91 -0
  412. package/target/plugins/remark-deflist.d.ts +4 -0
  413. package/target/plugins/remark-deflist.js +31 -0
  414. package/target/plugins/remark-details.d.ts +4 -0
  415. package/target/plugins/remark-details.js +33 -0
  416. package/target/plugins/remark-filetree.d.ts +12 -0
  417. package/target/plugins/remark-filetree.js +61 -0
  418. package/target/plugins/remark-filetree.unit.d.ts +1 -0
  419. package/target/plugins/remark-filetree.unit.js +87 -0
  420. package/target/plugins/remark-github-callout.d.ts +4 -0
  421. package/target/plugins/remark-github-callout.js +62 -0
  422. package/target/plugins/remark-icon.d.ts +4 -0
  423. package/target/plugins/remark-icon.js +36 -0
  424. package/target/plugins/remark-image.d.ts +9 -0
  425. package/target/plugins/remark-image.js +26 -0
  426. package/target/plugins/remark-media.d.ts +6 -0
  427. package/target/plugins/remark-media.js +52 -0
  428. package/target/plugins/remark-media.unit.d.ts +1 -0
  429. package/target/plugins/remark-media.unit.js +54 -0
  430. package/target/plugins/remark-mermaid.d.ts +4 -0
  431. package/target/plugins/remark-mermaid.js +20 -0
  432. package/target/plugins/remark-npm.d.ts +4 -0
  433. package/target/plugins/remark-npm.js +32 -0
  434. package/target/plugins/remark-steps.d.ts +6 -0
  435. package/target/plugins/remark-steps.js +30 -0
  436. package/target/plugins/remark-steps.unit.d.ts +1 -0
  437. package/target/plugins/remark-steps.unit.js +65 -0
  438. package/target/plugins/remark-tab.d.ts +6 -0
  439. package/target/plugins/remark-tab.js +76 -0
  440. package/target/plugins/remark-tab.unit.d.ts +1 -0
  441. package/target/plugins/remark-tab.unit.js +156 -0
  442. package/target/plugins/remark-toc.d.ts +6 -0
  443. package/target/plugins/remark-toc.js +33 -0
  444. package/target/plugins/remark-toc.unit.d.ts +1 -0
  445. package/target/plugins/remark-toc.unit.js +57 -0
  446. package/target/plugins/shiki-icon.d.ts +16 -0
  447. package/target/plugins/shiki-icon.js +66 -0
  448. package/target/plugins/shiki-line-highlight.d.ts +27 -0
  449. package/target/plugins/shiki-line-highlight.js +140 -0
  450. package/target/plugins/vite-livemark.d.ts +13 -0
  451. package/target/plugins/vite-livemark.js +76 -0
  452. package/target/program.js +18 -0
  453. package/target/routeTree.gen.d.ts +57 -0
  454. package/target/routeTree.gen.js +27 -0
  455. package/target/router.d.ts +6 -0
  456. package/target/router.js +26 -0
  457. package/target/routes/$.d.ts +1 -0
  458. package/target/routes/$.js +85 -0
  459. package/target/routes/__root.d.ts +1 -0
  460. package/target/routes/__root.js +69 -0
  461. package/target/server.d.ts +2 -0
  462. package/target/server.js +7 -0
  463. package/target/settings.d.ts +2 -0
  464. package/target/settings.js +7 -0
  465. package/target/utils/style.d.ts +2 -0
  466. package/target/utils/style.js +6 -0
  467. package/target/vite.config.d.ts +2 -0
  468. package/target/vite.config.js +64 -0
  469. package/build/actions/changelog/build.js +0 -158
  470. package/build/actions/changelog/build.unit.js +0 -66
  471. package/build/actions/config/define.js +0 -8
  472. package/build/actions/config/define.unit.js +0 -29
  473. package/build/actions/config/load.js +0 -25
  474. package/build/actions/config/load.unit.js +0 -23
  475. package/build/commands/build.js +0 -14
  476. package/build/commands/escape.js +0 -56
  477. package/build/commands/preview.js +0 -18
  478. package/build/commands/start.js +0 -19
  479. package/build/docs/markdown/includes/example.d.ts +0 -58
  480. package/build/docs/markdown/includes/example.js +0 -5
  481. package/build/entrypoints/main.js +0 -12
  482. package/build/helpers/program.js +0 -5
  483. package/build/index.js +0 -2
  484. package/build/livemark.config.d.ts +0 -58
  485. package/build/livemark.config.js +0 -25
  486. package/build/models/config.js +0 -34
  487. package/build/models/link.js +0 -9
  488. package/build/models/patch.js +0 -7
  489. package/build/models/section.js +0 -26
  490. package/build/models/theme.js +0 -73
  491. package/build/program.js +0 -16
  492. package/build/vite.config.d.ts +0 -2
  493. package/build/vite.config.js +0 -48
  494. package/build/website/components/BlogSidebar.tsx +0 -162
  495. package/build/website/components/ChangelogSidebar.tsx +0 -120
  496. package/build/website/hooks/media.ts +0 -19
  497. /package/{build/website → source}/assets/logo.svg +0 -0
  498. /package/{build/website → source}/client.tsx +0 -0
  499. /package/{build/website → source}/components/Abbr.tsx +0 -0
  500. /package/{build/website → source}/components/AnsiCode.tsx +0 -0
  501. /package/{build/website → source}/components/BackToTop.tsx +0 -0
  502. /package/{build/website → source}/components/Banner.tsx +0 -0
  503. /package/{build/website → source}/components/BlogIndex.tsx +0 -0
  504. /package/{build/website → source}/components/Breadcrumbs.tsx +0 -0
  505. /package/{build/website → source}/components/Card.tsx +0 -0
  506. /package/{build/website → source}/components/Cards.tsx +0 -0
  507. /package/{build/website → source}/components/ChangelogIndex.tsx +0 -0
  508. /package/{build/website → source}/components/CodeBlock.tsx +0 -0
  509. /package/{build/website → source}/components/CodeTabs.tsx +0 -0
  510. /package/{build/website → source}/components/Column.tsx +0 -0
  511. /package/{build/website → source}/components/Columns.tsx +0 -0
  512. /package/{build/website → source}/components/Content.tsx +0 -0
  513. /package/{build/website → source}/components/ContentTab.tsx +0 -0
  514. /package/{build/website → source}/components/ContentTabs.tsx +0 -0
  515. /package/{build/website → source}/components/DefaultCatchBoundary.tsx +0 -0
  516. /package/{build/website → source}/components/DefinitionList.tsx +0 -0
  517. /package/{build/website → source}/components/Details.tsx +0 -0
  518. /package/{build/website → source}/components/FileTree.tsx +0 -0
  519. /package/{build/website → source}/components/Footer.tsx +0 -0
  520. /package/{build/website → source}/components/FootnoteRef.tsx +0 -0
  521. /package/{build/website → source}/components/Heading.tsx +0 -0
  522. /package/{build/website → source}/components/InlineBadge.tsx +0 -0
  523. /package/{build/website → source}/components/InlineIcon.tsx +0 -0
  524. /package/{build/website → source}/components/InlineToc.tsx +0 -0
  525. /package/{build/website → source}/components/Mermaid.tsx +0 -0
  526. /package/{build/website → source}/components/MermaidRenderer.tsx +0 -0
  527. /package/{build/website → source}/components/NotFound.tsx +0 -0
  528. /package/{build/website → source}/components/PackageTabs.tsx +0 -0
  529. /package/{build/website → source}/components/PrevNext.tsx +0 -0
  530. /package/{build/website → source}/components/Search.tsx +0 -0
  531. /package/{build/website → source}/components/SearchDialog.tsx +0 -0
  532. /package/{build/website → source}/components/SidebarLinks.tsx +0 -0
  533. /package/{build/website → source}/components/SidebarSections.tsx +0 -0
  534. /package/{build/website → source}/components/SiteTitle.tsx +0 -0
  535. /package/{build/website → source}/components/SortableTable.tsx +0 -0
  536. /package/{build/website → source}/components/SoundCloud.tsx +0 -0
  537. /package/{build/website → source}/components/TagIndex.tsx +0 -0
  538. /package/{build/website → source}/components/Theme.tsx +0 -0
  539. /package/{build/website → source}/components/Toc.tsx +0 -0
  540. /package/{build/website → source}/components/YouTube.tsx +0 -0
  541. /package/{build/website → source}/components/ZoomImage.tsx +0 -0
  542. /package/{build/website → source}/content/article.ts +0 -0
  543. /package/{build/website → source}/content/tag.ts +0 -0
  544. /package/{build/website → source}/elements/collapsible.tsx +0 -0
  545. /package/{build/website → source}/elements/direction.tsx +0 -0
  546. /package/{build/website → source}/elements/sonner.tsx +0 -0
  547. /package/{build/website → source}/helpers/article-icon.ts +0 -0
  548. /package/{build/website → source}/helpers/article.ts +0 -0
  549. /package/{build/website → source}/helpers/changelog-source.ts +0 -0
  550. /package/{build/website → source}/helpers/changelog-source.unit.ts +0 -0
  551. /package/{build/website → source}/helpers/dynamic-icon-resolver.tsx +0 -0
  552. /package/{build/website → source}/helpers/dynamic-icon.tsx +0 -0
  553. /package/{build/website → source}/helpers/favicon.ts +0 -0
  554. /package/{build/website → source}/helpers/model.ts +0 -0
  555. /package/{build/website → source}/helpers/resolve-asset-path.ts +0 -0
  556. /package/{build/website → source}/helpers/resolve-includes.ts +0 -0
  557. /package/{build/website → source}/helpers/resolve-includes.unit.ts +0 -0
  558. /package/{build/website → source}/helpers/search-text.ts +0 -0
  559. /package/{build/website → source}/helpers/section.unit.ts +0 -0
  560. /package/{build/website → source}/helpers/theme.ts +0 -0
  561. /package/{build/website → source}/helpers/toc-context.ts +0 -0
  562. /package/{build/website → source}/helpers/toc.ts +0 -0
  563. /package/{build/website → source}/helpers/toc.unit.ts +0 -0
  564. /package/{build/website → source}/hooks/in-view.ts +0 -0
  565. /package/{build/website → source}/models/toc.ts +0 -0
  566. /package/{build/website → source}/plugins/rehype-inline-code.ts +0 -0
  567. /package/{build/website → source}/plugins/rehype-task-list-a11y.ts +0 -0
  568. /package/{build/website → source}/plugins/remark-abbr.ts +0 -0
  569. /package/{build/website → source}/plugins/remark-abbr.unit.ts +0 -0
  570. /package/{build/website → source}/plugins/remark-ansi.ts +0 -0
  571. /package/{build/website → source}/plugins/remark-ansi.unit.ts +0 -0
  572. /package/{build/website → source}/plugins/remark-badge.ts +0 -0
  573. /package/{build/website → source}/plugins/remark-badge.unit.ts +0 -0
  574. /package/{build/website → source}/plugins/remark-button.ts +0 -0
  575. /package/{build/website → source}/plugins/remark-button.unit.ts +0 -0
  576. /package/{build/website → source}/plugins/remark-callout.ts +0 -0
  577. /package/{build/website → source}/plugins/remark-card.ts +0 -0
  578. /package/{build/website → source}/plugins/remark-code-tabs.ts +0 -0
  579. /package/{build/website → source}/plugins/remark-columns.ts +0 -0
  580. /package/{build/website → source}/plugins/remark-custom-heading-id.ts +0 -0
  581. /package/{build/website → source}/plugins/remark-custom-heading-id.unit.ts +0 -0
  582. /package/{build/website → source}/plugins/remark-deflist.ts +0 -0
  583. /package/{build/website → source}/plugins/remark-details.ts +0 -0
  584. /package/{build/website → source}/plugins/remark-filetree.ts +0 -0
  585. /package/{build/website → source}/plugins/remark-filetree.unit.ts +0 -0
  586. /package/{build/website → source}/plugins/remark-github-callout.ts +0 -0
  587. /package/{build/website → source}/plugins/remark-icon.ts +0 -0
  588. /package/{build/website → source}/plugins/remark-image.ts +0 -0
  589. /package/{build/website → source}/plugins/remark-media.ts +0 -0
  590. /package/{build/website → source}/plugins/remark-media.unit.ts +0 -0
  591. /package/{build/website → source}/plugins/remark-mermaid.ts +0 -0
  592. /package/{build/website → source}/plugins/remark-npm.ts +0 -0
  593. /package/{build/website → source}/plugins/remark-steps.ts +0 -0
  594. /package/{build/website → source}/plugins/remark-steps.unit.ts +0 -0
  595. /package/{build/website → source}/plugins/remark-tab.ts +0 -0
  596. /package/{build/website → source}/plugins/remark-tab.unit.ts +0 -0
  597. /package/{build/website → source}/plugins/remark-toc.ts +0 -0
  598. /package/{build/website → source}/plugins/remark-toc.unit.ts +0 -0
  599. /package/{build/website → source}/plugins/shiki-icon.ts +0 -0
  600. /package/{build/website → source}/plugins/shiki-line-highlight.ts +0 -0
  601. /package/{build/website → source}/routeTree.gen.ts +0 -0
  602. /package/{build/website → source}/router.tsx +0 -0
  603. /package/{build/website → source}/routes/$.tsx +0 -0
  604. /package/{build/website → source}/routes/__root.tsx +0 -0
  605. /package/{build/website → source}/server.ts +0 -0
  606. /package/{build/website → source}/styles/general.css +0 -0
  607. /package/{build/website → source}/styles/markdown.css +0 -0
  608. /package/{build/website/helpers → source/utils}/style.ts +0 -0
  609. /package/{build → target}/actions/changelog/build.unit.d.ts +0 -0
  610. /package/{build → target}/actions/config/define.d.ts +0 -0
  611. /package/{build → target}/actions/config/define.unit.d.ts +0 -0
  612. /package/{build → target}/actions/config/load.d.ts +0 -0
  613. /package/{build → target}/actions/config/load.unit.d.ts +0 -0
  614. /package/{build → target}/commands/build.d.ts +0 -0
  615. /package/{build → target}/commands/escape.d.ts +0 -0
  616. /package/{build → target}/commands/preview.d.ts +0 -0
  617. /package/{build → target}/commands/start.d.ts +0 -0
  618. /package/{build → target}/entrypoints/main.d.ts +0 -0
  619. /package/{build → target}/helpers/program.d.ts +0 -0
  620. /package/{build → target}/index.d.ts +0 -0
  621. /package/{build → target}/models/link.d.ts +0 -0
  622. /package/{build → target}/models/section.d.ts +0 -0
  623. /package/{build → target}/models/theme.d.ts +0 -0
  624. /package/{build → target}/program.d.ts +0 -0
@@ -0,0 +1,65 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link, useLocation, useMatch } from "@tanstack/react-router";
3
+ import { useHotkey } from "@tanstack/react-hotkeys";
4
+ import { ExternalLink } from "lucide-react";
5
+ import { currentSection, sectionFirstArticle, sectionFlatArticles, sortedArticles, } from "../content/article.js";
6
+ import { DynamicIcon } from "../helpers/dynamic-icon.js";
7
+ import { sectionIcon } from "../helpers/section.js";
8
+ import { SidebarInset, SidebarProvider, SidebarTrigger, useSidebar, } from "../elements/sidebar.js";
9
+ import { BackToTop } from "./BackToTop.js";
10
+ import { Banner } from "./Banner.js";
11
+ import { Sidebar } from "./Sidebar.js";
12
+ import { SiteTitle } from "./SiteTitle.js";
13
+ function splatFor(pathname) {
14
+ return { _splat: pathname.replace(/^\/|\/$/g, "") };
15
+ }
16
+ export function Layout(props) {
17
+ const pathname = useLocation({ select: l => l.pathname });
18
+ const articleRoute = useMatch({ from: "/$", shouldThrow: false });
19
+ const activeSection = articleRoute
20
+ ? currentSection(`/${pathname.replace(/^\/|\/$/g, "")}/`)
21
+ : undefined;
22
+ useHotkey("J", () => window.scrollBy({ top: window.innerHeight * 0.8, behavior: "smooth" }));
23
+ useHotkey("K", () => window.scrollBy({ top: -window.innerHeight * 0.8, behavior: "smooth" }));
24
+ const sections = import.meta.env.CONFIG.sections;
25
+ const header = (_jsxs("header", { className: "sticky top-0 z-20 flex h-16 shrink-0 items-center border-b bg-background", children: [
26
+ _jsx("div", { className: `flex items-center self-stretch pl-4 ${props.withSidebar ? "pr-4" : "md:pr-20"}`, children: props.withSidebar ? (_jsxs(_Fragment, { children: [
27
+ _jsx("div", { className: "hidden md:flex", children: _jsx(SidebarTrigger, {}) }), _jsx(Link, { to: "/", className: "md:hidden flex items-center gap-2", children: _jsx(SiteTitle, {}) })
28
+ ] })) : (_jsx(Link, { to: "/", className: "flex items-center gap-2", children: _jsx(SiteTitle, {}) })) }), _jsxs("div", { className: "hidden md:flex flex-1 items-center gap-8 self-stretch px-6 text-sm", children: [sections?.length ? (sections
29
+ .filter(section => section.position === "header")
30
+ .map(section => {
31
+ const isActive = activeSection?.prefix === section.prefix;
32
+ const target = section.type === "blog" || section.type === "changelog"
33
+ ? section.prefix
34
+ : sectionFirstArticle.get(section.prefix);
35
+ const latestVersion = section.type === "changelog" && section.version
36
+ ? sortedArticles.find(a => a.path === sectionFlatArticles.get(section.prefix)?.[0])?.title
37
+ : undefined;
38
+ return (_jsxs(Link, { to: target === "/" ? "/" : "/$", params: target && target !== "/" ? splatFor(target) : {}, className: `inline-flex items-center gap-1.5 text-foreground ${isActive
39
+ ? "font-medium border-b-2 border-foreground pb-0.5 -mb-0.5"
40
+ : "opacity-80 hover:opacity-100 transition-opacity"}`, children: [
41
+ _jsx(DynamicIcon, { name: sectionIcon(section), className: "size-3.5" }), _jsxs("span", { children: [section.title, latestVersion && (_jsxs("span", { className: "opacity-80", children: [" (", latestVersion, ")"] }))] })
42
+ ] }, section.prefix));
43
+ })) : (_jsx(Link, { to: "/", className: "text-foreground font-medium underline underline-offset-4", children: "Docs" })), import.meta.env.CONFIG.links
44
+ ?.filter(link => link.position === "header" &&
45
+ (!link.prefix || link.prefix === activeSection?.prefix))
46
+ .map(link => (_jsxs("a", { href: link.url, target: "_blank", rel: "noopener noreferrer", className: "text-foreground opacity-80 hover:opacity-100 transition-opacity", children: [link.icon && (_jsx(DynamicIcon, { name: link.icon, className: "inline size-3.5 align-[-0.125em]" })), " ", link.title, " ", _jsx(ExternalLink, { className: "inline size-3 align-[-0.125em]" })
47
+ ] }, link.url))), _jsx(Banner, {})
48
+ ] }), _jsx("div", { className: "md:hidden ml-auto pr-2", children: _jsx(SidebarTrigger, {}) })
49
+ ] }));
50
+ return (_jsx(SidebarProvider, { defaultOpen: !!props.withSidebar, children: _jsx(SidebarShell, { withSidebar: props.withSidebar, header: header, children: props.children }) }, props.withSidebar ? "sidebar" : "mini"));
51
+ }
52
+ function SidebarShell(props) {
53
+ const { isMobile, setOpenMobile } = useSidebar();
54
+ const onClick = (event) => {
55
+ if (!isMobile)
56
+ return;
57
+ if (event.target.closest("a"))
58
+ setOpenMobile(false);
59
+ };
60
+ return (_jsxs("div", { style: { display: "contents" }, onClick: onClick, children: [
61
+ _jsx(Sidebar, { withSidebar: props.withSidebar }), _jsxs(SidebarInset, { children: [props.header, _jsx("main", { className: "flex-1", children: props.children }), _jsx(BackToTop, {})
62
+ ] })
63
+ ] }));
64
+ }
65
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvTGF5b3V0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDcEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFBO0FBQ25ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDM0MsT0FBTyxFQUNMLGNBQWMsRUFDZCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBQ25CLGNBQWMsR0FDZixNQUFNLHVCQUF1QixDQUFBO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNkIsQ0FBQTtBQUN6RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFDbkQsT0FBTyxFQUNMLFlBQVksRUFDWixlQUFlLEVBQ2YsY0FBYyxFQUNkLFVBQVUsR0FDWCxNQUFNLHdCQUF5QixDQUFBO0FBQ2hDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBaUIsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYyxDQUFBO0FBQ3JDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFlLENBQUE7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFpQixDQUFBO0FBRTNDLFNBQVMsUUFBUSxDQUFDLFFBQWdCO0lBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQTtBQUNyRCxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUd0QjtJQUNDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVB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S0FBSyxDQUFDLFFBQVEsR0FBUSxFQUNoRCxLQUFDLFNBQVMsS0FBRztvQkFDQTtZQUNYLENBQ1AsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMaW5rLCB1c2VMb2NhdGlvbiwgdXNlTWF0Y2ggfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiXG5pbXBvcnQgeyB1c2VIb3RrZXkgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LWhvdGtleXNcIlxuaW1wb3J0IHsgRXh0ZXJuYWxMaW5rIH0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiXG5pbXBvcnQge1xuICBjdXJyZW50U2VjdGlvbixcbiAgc2VjdGlvbkZpcnN0QXJ0aWNsZSxcbiAgc2VjdGlvbkZsYXRBcnRpY2xlcyxcbiAgc29ydGVkQXJ0aWNsZXMsXG59IGZyb20gXCIuLi9jb250ZW50L2FydGljbGUudHNcIlxuaW1wb3J0IHsgRHluYW1pY0ljb24gfSBmcm9tIFwiLi4vaGVscGVycy9keW5hbWljLWljb24udHN4XCJcbmltcG9ydCB7IHNlY3Rpb25JY29uIH0gZnJvbSBcIi4uL2hlbHBlcnMvc2VjdGlvbi50c1wiXG5pbXBvcnQge1xuICBTaWRlYmFySW5zZXQsXG4gIFNpZGViYXJQcm92aWRlcixcbiAgU2lkZWJhclRyaWdnZXIsXG4gIHVzZVNpZGViYXIsXG59IGZyb20gXCIuLi9lbGVtZW50cy9zaWRlYmFyLnRzeFwiXG5pbXBvcnQgeyBCYWNrVG9Ub3AgfSBmcm9tIFwiLi9CYWNrVG9Ub3AudHN4XCJcbmltcG9ydCB7IEJhbm5lciB9IGZyb20gXCIuL0Jhbm5lci50c3hcIlxuaW1wb3J0IHsgU2lkZWJhciB9IGZyb20gXCIuL1NpZGViYXIudHN4XCJcbmltcG9ydCB7IFNpdGVUaXRsZSB9IGZyb20gXCIuL1NpdGVUaXRsZS50c3hcIlxuXG5mdW5jdGlvbiBzcGxhdEZvcihwYXRobmFtZTogc3RyaW5nKSB7XG4gIHJldHVybiB7IF9zcGxhdDogcGF0aG5hbWUucmVwbGFjZSgvXlxcL3xcXC8kL2csIFwiXCIpIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIExheW91dChwcm9wczoge1xuICB3aXRoU2lkZWJhcj86IGJvb2xlYW5cbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbn0pIHtcbiAgY29uc3QgcGF0aG5hbWUgPSB1c2VMb2NhdGlvbih7IHNlbGVjdDogbCA9PiBsLnBhdGhuYW1lIH0pXG4gIGNvbnN0IGFydGljbGVSb3V0ZSA9IHVzZU1hdGNoKHsgZnJvbTogXCIvJFwiLCBzaG91bGRUaHJvdzogZmFsc2UgfSlcbiAgY29uc3QgYWN0aXZlU2VjdGlvbiA9IGFydGljbGVSb3V0ZVxuICAgID8gY3VycmVudFNlY3Rpb24oYC8ke3BhdGhuYW1lLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKX0vYClcbiAgICA6IHVuZGVmaW5lZFxuXG4gIHVzZUhvdGtleShcIkpcIiwgKCkgPT5cbiAgICB3aW5kb3cuc2Nyb2xsQnkoeyB0b3A6IHdpbmRvdy5pbm5lckhlaWdodCAqIDAuOCwgYmVoYXZpb3I6IFwic21vb3RoXCIgfSksXG4gIClcbiAgdXNlSG90a2V5KFwiS1wiLCAoKSA9PlxuICAgIHdpbmRvdy5zY3JvbGxCeSh7IHRvcDogLXdpbmRvdy5pbm5lckhlaWdodCAqIDAuOCwgYmVoYXZpb3I6IFwic21vb3RoXCIgfSksXG4gIClcblxuICBjb25zdCBzZWN0aW9ucyA9IGltcG9ydC5tZXRhLmVudi5DT05GSUcuc2VjdGlvbnNcblxuICBjb25zdCBoZWFkZXIgPSAoXG4gICAgPGhlYWRlciBjbGFzc05hbWU9XCJzdGlja3kgdG9wLTAgei0yMCBmbGV4IGgtMTYgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGJvcmRlci1iIGJnLWJhY2tncm91bmRcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtgZmxleCBpdGVtcy1jZW50ZXIgc2VsZi1zdHJldGNoIHBsLTQgJHtwcm9wcy53aXRoU2lkZWJhciA/IFwicHItNFwiIDogXCJtZDpwci0yMFwifWB9XG4gICAgICA+XG4gICAgICAgIHtwcm9wcy53aXRoU2lkZWJhciA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6ZmxleFwiPlxuICAgICAgICAgICAgICA8U2lkZWJhclRyaWdnZXIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPExpbmsgdG89XCIvXCIgY2xhc3NOYW1lPVwibWQ6aGlkZGVuIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxTaXRlVGl0bGUgLz5cbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8TGluayB0bz1cIi9cIiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPFNpdGVUaXRsZSAvPlxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6ZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIGdhcC04IHNlbGYtc3RyZXRjaCBweC02IHRleHQtc21cIj5cbiAgICAgICAge3NlY3Rpb25zPy5sZW5ndGggPyAoXG4gICAgICAgICAgc2VjdGlvbnNcbiAgICAgICAgICAgIC5maWx0ZXIoc2VjdGlvbiA9PiBzZWN0aW9uLnBvc2l0aW9uID09PSBcImhlYWRlclwiKVxuICAgICAgICAgICAgLm1hcChzZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVTZWN0aW9uPy5wcmVmaXggPT09IHNlY3Rpb24ucHJlZml4XG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgc2VjdGlvbi50eXBlID09PSBcImJsb2dcIiB8fCBzZWN0aW9uLnR5cGUgPT09IFwiY2hhbmdlbG9nXCJcbiAgICAgICAgICAgICAgICAgID8gc2VjdGlvbi5wcmVmaXhcbiAgICAgICAgICAgICAgICAgIDogc2VjdGlvbkZpcnN0QXJ0aWNsZS5nZXQoc2VjdGlvbi5wcmVmaXgpXG4gICAgICAgICAgICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPVxuICAgICAgICAgICAgICAgIHNlY3Rpb24udHlwZSA9PT0gXCJjaGFuZ2Vsb2dcIiAmJiBzZWN0aW9uLnZlcnNpb25cbiAgICAgICAgICAgICAgICAgID8gc29ydGVkQXJ0aWNsZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICBhID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBhLnBhdGggPT09IHNlY3Rpb25GbGF0QXJ0aWNsZXMuZ2V0KHNlY3Rpb24ucHJlZml4KT8uWzBdLFxuICAgICAgICAgICAgICAgICAgICApPy50aXRsZVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAga2V5PXtzZWN0aW9uLnByZWZpeH1cbiAgICAgICAgICAgICAgICAgIHRvPXt0YXJnZXQgPT09IFwiL1wiID8gXCIvXCIgOiBcIi8kXCJ9XG4gICAgICAgICAgICAgICAgICBwYXJhbXM9e3RhcmdldCAmJiB0YXJnZXQgIT09IFwiL1wiID8gc3BsYXRGb3IodGFyZ2V0KSA6IHt9fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC1mb3JlZ3JvdW5kICR7XG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImZvbnQtbWVkaXVtIGJvcmRlci1iLTIgYm9yZGVyLWZvcmVncm91bmQgcGItMC41IC1tYi0wLjVcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJvcGFjaXR5LTgwIGhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eVwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8RHluYW1pY0ljb25cbiAgICAgICAgICAgICAgICAgICAgbmFtZT17c2VjdGlvbkljb24oc2VjdGlvbil9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNpemUtMy41XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3NlY3Rpb24udGl0bGV9XG4gICAgICAgICAgICAgICAgICAgIHtsYXRlc3RWZXJzaW9uICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJvcGFjaXR5LTgwXCI+ICh7bGF0ZXN0VmVyc2lvbn0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgdG89XCIvXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtZm9yZWdyb3VuZCBmb250LW1lZGl1bSB1bmRlcmxpbmUgdW5kZXJsaW5lLW9mZnNldC00XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBEb2NzXG4gICAgICAgICAgPC9MaW5rPlxuICAgICAgICApfVxuICAgICAgICB7aW1wb3J0Lm1ldGEuZW52LkNPTkZJRy5saW5rc1xuICAgICAgICAgID8uZmlsdGVyKFxuICAgICAgICAgICAgbGluayA9PlxuICAgICAgICAgICAgICBsaW5rLnBvc2l0aW9uID09PSBcImhlYWRlclwiICYmXG4gICAgICAgICAgICAgICghbGluay5wcmVmaXggfHwgbGluay5wcmVmaXggPT09IGFjdGl2ZVNlY3Rpb24/LnByZWZpeCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAobGluayA9PiAoXG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBrZXk9e2xpbmsudXJsfVxuICAgICAgICAgICAgICBocmVmPXtsaW5rLnVybH1cbiAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtZm9yZWdyb3VuZCBvcGFjaXR5LTgwIGhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtsaW5rLmljb24gJiYgKFxuICAgICAgICAgICAgICAgIDxEeW5hbWljSWNvblxuICAgICAgICAgICAgICAgICAgbmFtZT17bGluay5pY29ufVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lIHNpemUtMy41IGFsaWduLVstMC4xMjVlbV1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICl9e1wiIFwifVxuICAgICAgICAgICAgICB7bGluay50aXRsZX17XCIgXCJ9XG4gICAgICAgICAgICAgIDxFeHRlcm5hbExpbmsgY2xhc3NOYW1lPVwiaW5saW5lIHNpemUtMyBhbGlnbi1bLTAuMTI1ZW1dXCIgLz5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICApKX1cbiAgICAgICAgPEJhbm5lciAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1kOmhpZGRlbiBtbC1hdXRvIHByLTJcIj5cbiAgICAgICAgPFNpZGViYXJUcmlnZ2VyIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2hlYWRlcj5cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPFNpZGViYXJQcm92aWRlclxuICAgICAga2V5PXtwcm9wcy53aXRoU2lkZWJhciA/IFwic2lkZWJhclwiIDogXCJtaW5pXCJ9XG4gICAgICBkZWZhdWx0T3Blbj17ISFwcm9wcy53aXRoU2lkZWJhcn1cbiAgICA+XG4gICAgICA8U2lkZWJhclNoZWxsIHdpdGhTaWRlYmFyPXtwcm9wcy53aXRoU2lkZWJhcn0gaGVhZGVyPXtoZWFkZXJ9PlxuICAgICAgICB7cHJvcHMuY2hpbGRyZW59XG4gICAgICA8L1NpZGViYXJTaGVsbD5cbiAgICA8L1NpZGViYXJQcm92aWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaWRlYmFyU2hlbGwocHJvcHM6IHtcbiAgd2l0aFNpZGViYXI/OiBib29sZWFuXG4gIGhlYWRlcjogUmVhY3QuUmVhY3ROb2RlXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG59KSB7XG4gIGNvbnN0IHsgaXNNb2JpbGUsIHNldE9wZW5Nb2JpbGUgfSA9IHVzZVNpZGViYXIoKVxuICBjb25zdCBvbkNsaWNrID0gKGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50PEhUTUxEaXZFbGVtZW50PikgPT4ge1xuICAgIGlmICghaXNNb2JpbGUpIHJldHVyblxuICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiYVwiKSkgc2V0T3Blbk1vYmlsZShmYWxzZSlcbiAgfVxuICByZXR1cm4gKFxuICAgIDxkaXYgc3R5bGU9e3sgZGlzcGxheTogXCJjb250ZW50c1wiIH19IG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgPFNpZGViYXIgd2l0aFNpZGViYXI9e3Byb3BzLndpdGhTaWRlYmFyfSAvPlxuICAgICAgPFNpZGViYXJJbnNldD5cbiAgICAgICAge3Byb3BzLmhlYWRlcn1cbiAgICAgICAgPG1haW4gY2xhc3NOYW1lPVwiZmxleC0xXCI+e3Byb3BzLmNoaWxkcmVufTwvbWFpbj5cbiAgICAgICAgPEJhY2tUb1RvcCAvPlxuICAgICAgPC9TaWRlYmFySW5zZXQ+XG4gICAgPC9kaXY+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ /** Styled link button rendered from ::button leaf directives */
2
+ export declare function LinkButton(props: {
3
+ href: string;
4
+ label: string;
5
+ variant?: "default" | "outline" | "secondary" | "ghost" | "destructive" | "link";
6
+ size?: "default" | "sm" | "lg";
7
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { buttonVariants } from "../elements/button.js";
3
+ import { cn } from "../utils/style.js";
4
+ /** Styled link button rendered from ::button leaf directives */
5
+ export function LinkButton(props) {
6
+ return (_jsx("a", { href: props.href, className: cn(buttonVariants({
7
+ variant: props.variant,
8
+ size: props.size,
9
+ }), "no-underline"), children: props.label }));
10
+ }
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGlua0J1dHRvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL0xpbmtCdXR0b24udHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXdCLENBQUE7QUFDdkQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRXRDLGdFQUFnRTtBQUNoRSxNQUFNLFVBQVUsVUFBVSxDQUFDLEtBVzFCO0lBQ0MsT0FBTyxDQUNMLFlBQ0UsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQ2hCLFNBQVMsRUFBRSxFQUFFLENBQ1gsY0FBYyxDQUFDO1lBQ2IsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtTQUNqQixDQUFDLEVBQ0YsY0FBYyxDQUNmLFlBRUEsS0FBSyxDQUFDLEtBQUssR0FDVixDQUNMLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYnV0dG9uVmFyaWFudHMgfSBmcm9tIFwiLi4vZWxlbWVudHMvYnV0dG9uLnRzeFwiXG5pbXBvcnQgeyBjbiB9IGZyb20gXCIuLi91dGlscy9zdHlsZS50c1wiXG5cbi8qKiBTdHlsZWQgbGluayBidXR0b24gcmVuZGVyZWQgZnJvbSA6OmJ1dHRvbiBsZWFmIGRpcmVjdGl2ZXMgKi9cbmV4cG9ydCBmdW5jdGlvbiBMaW5rQnV0dG9uKHByb3BzOiB7XG4gIGhyZWY6IHN0cmluZ1xuICBsYWJlbDogc3RyaW5nXG4gIHZhcmlhbnQ/OlxuICAgIHwgXCJkZWZhdWx0XCJcbiAgICB8IFwib3V0bGluZVwiXG4gICAgfCBcInNlY29uZGFyeVwiXG4gICAgfCBcImdob3N0XCJcbiAgICB8IFwiZGVzdHJ1Y3RpdmVcIlxuICAgIHwgXCJsaW5rXCJcbiAgc2l6ZT86IFwiZGVmYXVsdFwiIHwgXCJzbVwiIHwgXCJsZ1wiXG59KSB7XG4gIHJldHVybiAoXG4gICAgPGFcbiAgICAgIGhyZWY9e3Byb3BzLmhyZWZ9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICBidXR0b25WYXJpYW50cyh7XG4gICAgICAgICAgdmFyaWFudDogcHJvcHMudmFyaWFudCxcbiAgICAgICAgICBzaXplOiBwcm9wcy5zaXplLFxuICAgICAgICB9KSxcbiAgICAgICAgXCJuby11bmRlcmxpbmVcIixcbiAgICAgICl9XG4gICAgPlxuICAgICAge3Byb3BzLmxhYmVsfVxuICAgIDwvYT5cbiAgKVxufVxuIl19
@@ -0,0 +1,4 @@
1
+ /** Lazily loads and renders a Mermaid diagram */
2
+ export declare function Mermaid(props: {
3
+ children: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Suspense, lazy } from "react";
3
+ const MermaidRenderer = lazy(() => import("./MermaidRenderer.js"));
4
+ /** Lazily loads and renders a Mermaid diagram */
5
+ export function Mermaid(props) {
6
+ return (_jsx(Suspense, { fallback: _jsx("div", { className: "not-prose mermaid flex justify-center", children: "Loading diagram\u2026" }), children: _jsx(MermaidRenderer, { children: props.children }) }));
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVybWFpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL01lcm1haWQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUV0QyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLHNCQUF1QixDQUFDLENBQUMsQ0FBQTtBQUVuRSxpREFBaUQ7QUFDakQsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUEyQjtJQUNqRCxPQUFPLENBQ0wsS0FBQyxRQUFRLElBQ1AsUUFBUSxFQUNOLGNBQUssU0FBUyxFQUFDLHVDQUF1QyxzQ0FFaEQsWUFHUixLQUFDLGVBQWUsY0FBRSxLQUFLLENBQUMsUUFBUSxHQUFtQixHQUMxQyxDQUNaLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3VzcGVuc2UsIGxhenkgfSBmcm9tIFwicmVhY3RcIlxuXG5jb25zdCBNZXJtYWlkUmVuZGVyZXIgPSBsYXp5KCgpID0+IGltcG9ydChcIi4vTWVybWFpZFJlbmRlcmVyLnRzeFwiKSlcblxuLyoqIExhemlseSBsb2FkcyBhbmQgcmVuZGVycyBhIE1lcm1haWQgZGlhZ3JhbSAqL1xuZXhwb3J0IGZ1bmN0aW9uIE1lcm1haWQocHJvcHM6IHsgY2hpbGRyZW46IHN0cmluZyB9KSB7XG4gIHJldHVybiAoXG4gICAgPFN1c3BlbnNlXG4gICAgICBmYWxsYmFjaz17XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibm90LXByb3NlIG1lcm1haWQgZmxleCBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgIExvYWRpbmcgZGlhZ3JhbeKAplxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA+XG4gICAgICA8TWVybWFpZFJlbmRlcmVyPntwcm9wcy5jaGlsZHJlbn08L01lcm1haWRSZW5kZXJlcj5cbiAgICA8L1N1c3BlbnNlPlxuICApXG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ /** Renders a Mermaid diagram from a chart definition string */
2
+ export default function MermaidRenderer(props: {
3
+ children: string;
4
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,32 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import mermaid from "mermaid";
4
+ mermaid.initialize({ startOnLoad: false });
5
+ /** Renders a Mermaid diagram from a chart definition string */
6
+ export default function MermaidRenderer(props) {
7
+ const ref = useRef(null);
8
+ useEffect(() => {
9
+ const el = ref.current;
10
+ if (!el)
11
+ return;
12
+ const render = () => {
13
+ const isDark = document.documentElement.classList.contains("dark");
14
+ mermaid.initialize({
15
+ startOnLoad: false,
16
+ theme: isDark ? "dark" : "default",
17
+ });
18
+ el.textContent = props.children;
19
+ el.removeAttribute("data-processed");
20
+ mermaid.run({ nodes: [el] });
21
+ };
22
+ render();
23
+ const observer = new MutationObserver(render);
24
+ observer.observe(document.documentElement, {
25
+ attributes: true,
26
+ attributeFilter: ["class"],
27
+ });
28
+ return () => observer.disconnect();
29
+ }, [props.children]);
30
+ return _jsx("div", { ref: ref, className: "not-prose mermaid flex justify-center" });
31
+ }
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVybWFpZFJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvTWVybWFpZFJlbmRlcmVyLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDekMsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFBO0FBRTdCLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtBQUUxQywrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE9BQU8sVUFBVSxlQUFlLENBQUMsS0FBMkI7SUFDakUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFpQixJQUFJLENBQUMsQ0FBQTtJQUV4QyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQTtRQUN0QixJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU07UUFFZixNQUFNLE1BQU0sR0FBRyxHQUFHLEVBQUU7WUFDbEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ2xFLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ2pCLFdBQVcsRUFBRSxLQUFLO2dCQUNsQixLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDbkMsQ0FBQyxDQUFBO1lBQ0YsRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFBO1lBQy9CLEVBQUUsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtZQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQzlCLENBQUMsQ0FBQTtRQUVELE1BQU0sRUFBRSxDQUFBO1FBRVIsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM3QyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7WUFDekMsVUFBVSxFQUFFLElBQUk7WUFDaEIsZUFBZSxFQUFFLENBQUMsT0FBTyxDQUFDO1NBQzNCLENBQUMsQ0FBQTtRQUVGLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFBO0lBQ3BDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0lBRXBCLE9BQU8sY0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyx1Q0FBdUMsR0FBRyxDQUFBO0FBQzVFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgbWVybWFpZCBmcm9tIFwibWVybWFpZFwiXG5cbm1lcm1haWQuaW5pdGlhbGl6ZSh7IHN0YXJ0T25Mb2FkOiBmYWxzZSB9KVxuXG4vKiogUmVuZGVycyBhIE1lcm1haWQgZGlhZ3JhbSBmcm9tIGEgY2hhcnQgZGVmaW5pdGlvbiBzdHJpbmcgKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIE1lcm1haWRSZW5kZXJlcihwcm9wczogeyBjaGlsZHJlbjogc3RyaW5nIH0pIHtcbiAgY29uc3QgcmVmID0gdXNlUmVmPEhUTUxEaXZFbGVtZW50PihudWxsKVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZWwgPSByZWYuY3VycmVudFxuICAgIGlmICghZWwpIHJldHVyblxuXG4gICAgY29uc3QgcmVuZGVyID0gKCkgPT4ge1xuICAgICAgY29uc3QgaXNEYXJrID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImRhcmtcIilcbiAgICAgIG1lcm1haWQuaW5pdGlhbGl6ZSh7XG4gICAgICAgIHN0YXJ0T25Mb2FkOiBmYWxzZSxcbiAgICAgICAgdGhlbWU6IGlzRGFyayA/IFwiZGFya1wiIDogXCJkZWZhdWx0XCIsXG4gICAgICB9KVxuICAgICAgZWwudGV4dENvbnRlbnQgPSBwcm9wcy5jaGlsZHJlblxuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1wcm9jZXNzZWRcIilcbiAgICAgIG1lcm1haWQucnVuKHsgbm9kZXM6IFtlbF0gfSlcbiAgICB9XG5cbiAgICByZW5kZXIoKVxuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihyZW5kZXIpXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICBhdHRyaWJ1dGVGaWx0ZXI6IFtcImNsYXNzXCJdLFxuICAgIH0pXG5cbiAgICByZXR1cm4gKCkgPT4gb2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gIH0sIFtwcm9wcy5jaGlsZHJlbl0pXG5cbiAgcmV0dXJuIDxkaXYgcmVmPXtyZWZ9IGNsYXNzTmFtZT1cIm5vdC1wcm9zZSBtZXJtYWlkIGZsZXgganVzdGlmeS1jZW50ZXJcIiAvPlxufVxuIl19
@@ -0,0 +1,3 @@
1
+ export declare function NotFound({ children }: {
2
+ children?: any;
3
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link } from "@tanstack/react-router";
3
+ export function NotFound({ children }) {
4
+ return (_jsxs("div", { className: "min-h-[60vh] flex flex-col items-center justify-center text-center px-4", children: [
5
+ _jsx("h1", { className: "font-sans text-6xl font-semibold mb-4", children: "404" }), _jsx("div", { className: "text-muted-foreground mb-6", children: children || _jsx("p", { children: "The page you're looking for doesn't exist." }) }), _jsxs("div", { className: "flex items-center gap-4", children: [
6
+ _jsx("button", { type: "button", onClick: () => window.history.back(), className: "bg-primary text-primary-foreground px-4 py-2 text-sm font-medium hover:bg-primary/80 transition-colors", children: "Go Back" }), _jsx(Link, { to: "/", className: "border border-border px-4 py-2 text-sm font-medium hover:bg-card transition-colors", children: "Home" })
7
+ ] })
8
+ ] }));
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90Rm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9Ob3RGb3VuZC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUU3QyxNQUFNLFVBQVUsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFzQjtJQUN2RCxPQUFPLENBQ0wsZUFBSyxTQUFTLEVBQUMseUVBQXlFO1lBQ3RGLGFBQUksU0FBUyxFQUFDLHVDQUF1QyxvQkFBUyxFQUM5RCxjQUFLLFNBQVMsRUFBQyw0QkFBNEIsWUFDeEMsUUFBUSxJQUFJLHFFQUFpRCxHQUMxRCxFQUNOLGVBQUssU0FBUyxFQUFDLHlCQUF5QjtvQkFDdEMsaUJBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFDcEMsU0FBUyxFQUFDLHdHQUF3Ryx3QkFHM0csRUFDVCxLQUFDLElBQUksSUFDSCxFQUFFLEVBQUMsR0FBRyxFQUNOLFNBQVMsRUFBQyxvRkFBb0YscUJBR3pGO29CQUNIO1lBQ0YsQ0FDUCxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpbmsgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiXG5cbmV4cG9ydCBmdW5jdGlvbiBOb3RGb3VuZCh7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW4/OiBhbnkgfSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLWgtWzYwdmhdIGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHRleHQtY2VudGVyIHB4LTRcIj5cbiAgICAgIDxoMSBjbGFzc05hbWU9XCJmb250LXNhbnMgdGV4dC02eGwgZm9udC1zZW1pYm9sZCBtYi00XCI+NDA0PC9oMT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG1iLTZcIj5cbiAgICAgICAge2NoaWxkcmVuIHx8IDxwPlRoZSBwYWdlIHlvdSdyZSBsb29raW5nIGZvciBkb2Vzbid0IGV4aXN0LjwvcD59XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHdpbmRvdy5oaXN0b3J5LmJhY2soKX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOmJnLXByaW1hcnkvODAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICA+XG4gICAgICAgICAgR28gQmFja1xuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPExpbmtcbiAgICAgICAgICB0bz1cIi9cIlxuICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlciBib3JkZXItYm9yZGVyIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIGhvdmVyOmJnLWNhcmQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICA+XG4gICAgICAgICAgSG9tZVxuICAgICAgICA8L0xpbms+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIl19
@@ -0,0 +1,9 @@
1
+ interface PackageTabsProps {
2
+ npm: string;
3
+ pnpm: string;
4
+ yarn: string;
5
+ bun: string;
6
+ }
7
+ /** Tabbed code block showing a command for each package manager */
8
+ export declare function PackageTabs(props: PackageTabsProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Check, Clipboard } from "lucide-react";
3
+ import { useState } from "react";
4
+ const managers = ["npm", "pnpm", "yarn", "bun"];
5
+ /** Tabbed code block showing a command for each package manager */
6
+ export function PackageTabs(props) {
7
+ const [active, setActive] = useState("npm");
8
+ const [copied, setCopied] = useState(false);
9
+ const commands = {
10
+ npm: props.npm,
11
+ pnpm: props.pnpm,
12
+ yarn: props.yarn,
13
+ bun: props.bun,
14
+ };
15
+ const handleCopy = () => {
16
+ navigator.clipboard.writeText(commands[active]);
17
+ setCopied(true);
18
+ setTimeout(() => setCopied(false), 2000);
19
+ };
20
+ return (_jsxs("figure", { className: "not-prose my-4 relative rounded-xl border shadow-sm overflow-hidden text-sm bg-sidebar dark:bg-sidebar", children: [
21
+ _jsxs("div", { className: "flex items-center border-b", children: [
22
+ _jsx("div", { className: "flex flex-1 items-center", children: managers.map(pm => (_jsx("button", { type: "button", onClick: () => setActive(pm), className: `px-3 py-2 text-xs font-medium transition-colors ${pm === active
23
+ ? "text-foreground border-b-2 border-foreground"
24
+ : "text-muted-foreground hover:text-foreground"}`, children: pm }, pm))) }), _jsx("button", { type: "button", onClick: handleCopy, className: "me-2 p-1 rounded-md text-muted-foreground hover:text-foreground transition-colors", "aria-label": "Copy code", children: copied ? (_jsx(Check, { className: "size-3.5" })) : (_jsx(Clipboard, { className: "size-3.5" })) })
25
+ ] }), _jsx("div", { className: "text-[0.8125rem] py-3.5 overflow-auto max-h-[600px]", children: _jsx("pre", { className: "min-w-full w-max", children: _jsx("code", { className: "flex flex-col", children: _jsx("span", { className: "px-4", children: commands[active] }) }) }) })
26
+ ] }));
27
+ }
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja2FnZVRhYnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9QYWNrYWdlVGFicy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFJaEMsTUFBTSxRQUFRLEdBQWMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTtBQVMxRCxtRUFBbUU7QUFDbkUsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUF1QjtJQUNqRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBVSxLQUFLLENBQUMsQ0FBQTtJQUNwRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUUzQyxNQUFNLFFBQVEsR0FBNEI7UUFDeEMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ2QsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtRQUNoQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7S0FDZixDQUFBO0lBRUQsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO1FBQ3RCLFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQy9DLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDMUMsQ0FBQyxDQUFBO0lBRUQsT0FBTyxDQUNMLGtCQUFRLFNBQVMsRUFBQyx3R0FBd0c7WUFDeEgsZUFBSyxTQUFTLEVBQUMsNEJBQTRCO29CQUN6QyxjQUFLLFNBQVMsRUFBQywwQkFBMEIsWUFDdEMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQ2xCLGlCQUVFLElBQUksRUFBQyxRQUFRLEVBQ2IsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFDNUIsU0FBUyxFQUFFLG1EQUNULEVBQUUsS0FBSyxNQUFNO2dDQUNYLENBQUMsQ0FBQyw4Q0FBOEM7Z0NBQ2hELENBQUMsQ0FBQyw2Q0FDTixFQUFFLFlBRUQsRUFBRSxJQVRFLEVBQUUsQ0FVQSxDQUNWLENBQUMsR0FDRSxFQUNOLGlCQUNFLElBQUksRUFBQyxRQUFRLEVBQ2IsT0FBTyxFQUFFLFVBQVUsRUFDbkIsU0FBUyxFQUFDLG1GQUFtRixnQkFDbEYsV0FBVyxZQUVyQixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ1IsS0FBQyxLQUFLLElBQUMsU0FBUyxFQUFDLFVBQVUsR0FBRyxDQUMvQixDQUFDLENBQUMsQ0FBQyxDQUNGLEtBQUMsU0FBUyxJQUFDLFNBQVMsRUFBQyxVQUFVLEdBQUcsQ0FDbkMsR0FDTTtvQkFDTCxFQUNOLGNBQUssU0FBUyxFQUFDLHFEQUFxRCxZQUNsRSxjQUFLLFNBQVMsRUFBQyxrQkFBa0IsWUFDL0IsZUFBTSxTQUFTLEVBQUMsZUFBZSxZQUM3QixlQUFNLFNBQVMsRUFBQyxNQUFNLFlBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFRLEdBQzNDLEdBQ0gsR0FDRjtZQUNDLENBQ1YsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGVjaywgQ2xpcGJvYXJkIH0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiXG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiXG5cbnR5cGUgTWFuYWdlciA9IFwibnBtXCIgfCBcInBucG1cIiB8IFwieWFyblwiIHwgXCJidW5cIlxuXG5jb25zdCBtYW5hZ2VyczogTWFuYWdlcltdID0gW1wibnBtXCIsIFwicG5wbVwiLCBcInlhcm5cIiwgXCJidW5cIl1cblxuaW50ZXJmYWNlIFBhY2thZ2VUYWJzUHJvcHMge1xuICBucG06IHN0cmluZ1xuICBwbnBtOiBzdHJpbmdcbiAgeWFybjogc3RyaW5nXG4gIGJ1bjogc3RyaW5nXG59XG5cbi8qKiBUYWJiZWQgY29kZSBibG9jayBzaG93aW5nIGEgY29tbWFuZCBmb3IgZWFjaCBwYWNrYWdlIG1hbmFnZXIgKi9cbmV4cG9ydCBmdW5jdGlvbiBQYWNrYWdlVGFicyhwcm9wczogUGFja2FnZVRhYnNQcm9wcykge1xuICBjb25zdCBbYWN0aXZlLCBzZXRBY3RpdmVdID0gdXNlU3RhdGU8TWFuYWdlcj4oXCJucG1cIilcbiAgY29uc3QgW2NvcGllZCwgc2V0Q29waWVkXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIGNvbnN0IGNvbW1hbmRzOiBSZWNvcmQ8TWFuYWdlciwgc3RyaW5nPiA9IHtcbiAgICBucG06IHByb3BzLm5wbSxcbiAgICBwbnBtOiBwcm9wcy5wbnBtLFxuICAgIHlhcm46IHByb3BzLnlhcm4sXG4gICAgYnVuOiBwcm9wcy5idW4sXG4gIH1cblxuICBjb25zdCBoYW5kbGVDb3B5ID0gKCkgPT4ge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbW1hbmRzW2FjdGl2ZV0pXG4gICAgc2V0Q29waWVkKHRydWUpXG4gICAgc2V0VGltZW91dCgoKSA9PiBzZXRDb3BpZWQoZmFsc2UpLCAyMDAwKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZmlndXJlIGNsYXNzTmFtZT1cIm5vdC1wcm9zZSBteS00IHJlbGF0aXZlIHJvdW5kZWQteGwgYm9yZGVyIHNoYWRvdy1zbSBvdmVyZmxvdy1oaWRkZW4gdGV4dC1zbSBiZy1zaWRlYmFyIGRhcms6Ymctc2lkZWJhclwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBib3JkZXItYlwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgIHttYW5hZ2Vycy5tYXAocG0gPT4gKFxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBrZXk9e3BtfVxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0QWN0aXZlKHBtKX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICBwbSA9PT0gYWN0aXZlXG4gICAgICAgICAgICAgICAgICA/IFwidGV4dC1mb3JlZ3JvdW5kIGJvcmRlci1iLTIgYm9yZGVyLWZvcmVncm91bmRcIlxuICAgICAgICAgICAgICAgICAgOiBcInRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmRcIlxuICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge3BtfVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgKSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgb25DbGljaz17aGFuZGxlQ29weX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJtZS0yIHAtMSByb3VuZGVkLW1kIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb3B5IGNvZGVcIlxuICAgICAgICA+XG4gICAgICAgICAge2NvcGllZCA/IChcbiAgICAgICAgICAgIDxDaGVjayBjbGFzc05hbWU9XCJzaXplLTMuNVwiIC8+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDxDbGlwYm9hcmQgY2xhc3NOYW1lPVwic2l6ZS0zLjVcIiAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzAuODEyNXJlbV0gcHktMy41IG92ZXJmbG93LWF1dG8gbWF4LWgtWzYwMHB4XVwiPlxuICAgICAgICA8cHJlIGNsYXNzTmFtZT1cIm1pbi13LWZ1bGwgdy1tYXhcIj5cbiAgICAgICAgICA8Y29kZSBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJweC00XCI+e2NvbW1hbmRzW2FjdGl2ZV19PC9zcGFuPlxuICAgICAgICAgIDwvY29kZT5cbiAgICAgICAgPC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2ZpZ3VyZT5cbiAgKVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ /** Toolbar with action buttons displayed for the article content */
2
+ export declare function PageToolbar(props: {
3
+ file?: string;
4
+ sourceUrl?: string;
5
+ sourceAction?: "edit" | "view";
6
+ content: string;
7
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,34 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useCallback } from "react";
3
+ import { Eye, Pencil, Copy, Check, ExternalLink } from "lucide-react";
4
+ /** Toolbar with action buttons displayed for the article content */
5
+ export function PageToolbar(props) {
6
+ const [copied, setCopied] = useState(false);
7
+ const sourceHref = props.sourceUrl ??
8
+ (props.file
9
+ ? `https://github.com/datisthq/livemark/edit/main/${props.file}`
10
+ : undefined);
11
+ const isView = props.sourceAction === "view";
12
+ const sourceLabel = isView ? "View on GitHub" : "Edit on GitHub";
13
+ const SourceIcon = isView ? Eye : Pencil;
14
+ const handleCopy = useCallback(() => {
15
+ navigator.clipboard.writeText(props.content);
16
+ setCopied(true);
17
+ setTimeout(() => setCopied(false), 2000);
18
+ }, [props.content]);
19
+ const handleOpenIn = useCallback((url) => {
20
+ navigator.clipboard.writeText(props.content);
21
+ window.open(url, "_blank", "noopener,noreferrer");
22
+ }, [props.content]);
23
+ const buttonClass = "flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors";
24
+ return (_jsx(_Fragment, { children: _jsxs("div", { className: "mb-6 flex flex-col gap-2 text-sm", children: [
25
+ _jsx("p", { className: "text-sm font-medium mb-1", children: "Actions" }), sourceHref ? (_jsxs("a", { href: sourceHref, target: "_blank", rel: "noopener noreferrer", className: buttonClass, children: [
26
+ _jsx(SourceIcon, { className: "size-3.5" }), sourceLabel] })) : (_jsxs("span", { className: `${buttonClass} opacity-50 cursor-not-allowed hover:text-muted-foreground`, "aria-disabled": "true", children: [
27
+ _jsx(SourceIcon, { className: "size-3.5" }), sourceLabel] })), _jsxs("button", { type: "button", onClick: handleCopy, className: buttonClass, children: [copied ? (_jsx(Check, { className: "size-3.5" })) : (_jsx(Copy, { className: "size-3.5" })), "Copy Markdown"] }), _jsxs("button", { type: "button", onClick: () => handleOpenIn("https://chatgpt.com/"), className: buttonClass, children: [
28
+ _jsx(ExternalLink, { className: "size-3.5" }),
29
+ "Open in ChatGPT"] }), _jsxs("button", { type: "button", onClick: () => handleOpenIn("https://claude.ai/"), className: buttonClass, children: [
30
+ _jsx(ExternalLink, { className: "size-3.5" }),
31
+ "Open in Claude"] })
32
+ ] }) }));
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFnZVRvb2xiYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9QYWdlVG9vbGJhci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBQzdDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXJFLG9FQUFvRTtBQUNwRSxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBSzNCO0lBQ0MsTUFBTSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDM0MsTUFBTSxVQUFVLEdBQ2QsS0FBSyxDQUFDLFNBQVM7UUFDZixDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQ1QsQ0FBQyxDQUFDLGtEQUFrRCxLQUFLLENBQUMsSUFBSSxFQUFFO1lBQ2hFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxLQUFLLE1BQU0sQ0FBQTtJQUM1QyxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQTtJQUNoRSxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBO0lBRXhDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7UUFDbEMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzVDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNmLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFDMUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFFbkIsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUM5QixDQUFDLEdBQVcsRUFBRSxFQUFFO1FBQ2QsU0FBUyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFBO0lBQ25ELENBQUMsRUFDRCxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FDaEIsQ0FBQTtJQUVELE1BQU0sV0FBVyxHQUNmLGlHQUFpRyxDQUFBO0lBRW5HLE9BQU8sQ0FDTCw0QkFDRSxlQUFLLFNBQVMsRUFBQyxrQ0FBa0M7Z0JBQy9DLFlBQUcsU0FBUyxFQUFDLDBCQUEwQix3QkFBWSxFQUNsRCxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQ1osYUFDRSxJQUFJLEVBQUUsVUFBVSxFQUNoQixNQUFNLEVBQUMsUUFBUSxFQUNmLEdBQUcsRUFBQyxxQkFBcUIsRUFDekIsU0FBUyxFQUFFLFdBQVc7d0JBRXRCLEtBQUMsVUFBVSxJQUFDLFNBQVMsRUFBQyxVQUFVLEdBQUcsRUFDbEMsV0FBVyxJQUNWLENBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FDRixnQkFDRSxTQUFTLEVBQUUsR0FBRyxXQUFXLDREQUE0RCxtQkFDdkUsTUFBTTt3QkFFcEIsS0FBQyxVQUFVLElBQUMsU0FBUyxFQUFDLFVBQVUsR0FBRyxFQUNsQyxXQUFXLElBQ1AsQ0FDUixFQUNELGtCQUFRLElBQUksRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxhQUM5RCxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQ1IsS0FBQyxLQUFLLElBQUMsU0FBUyxFQUFDLFVBQVUsR0FBRyxDQUMvQixDQUFDLENBQUMsQ0FBQyxDQUNGLEtBQUMsSUFBSSxJQUFDLFNBQVMsRUFBQyxVQUFVLEdBQUcsQ0FDOUIscUJBRU0sRUFDVCxrQkFDRSxJQUFJLEVBQUMsUUFBUSxFQUNiLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFDbkQsU0FBUyxFQUFFLFdBQVc7d0JBRXRCLEtBQUMsWUFBWSxJQUFDLFNBQVMsRUFBQyxVQUFVLEdBQUc7NkNBRTlCLEVBQ1Qsa0JBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLEVBQ2pELFNBQVMsRUFBRSxXQUFXO3dCQUV0QixLQUFDLFlBQVksSUFBQyxTQUFTLEVBQUMsVUFBVSxHQUFHOzRDQUU5QjtnQkFDTCxHQUNMLENBQ0osQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1c2VTdGF0ZSwgdXNlQ2FsbGJhY2sgfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgRXllLCBQZW5jaWwsIENvcHksIENoZWNrLCBFeHRlcm5hbExpbmsgfSBmcm9tIFwibHVjaWRlLXJlYWN0XCJcblxuLyoqIFRvb2xiYXIgd2l0aCBhY3Rpb24gYnV0dG9ucyBkaXNwbGF5ZWQgZm9yIHRoZSBhcnRpY2xlIGNvbnRlbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBQYWdlVG9vbGJhcihwcm9wczoge1xuICBmaWxlPzogc3RyaW5nXG4gIHNvdXJjZVVybD86IHN0cmluZ1xuICBzb3VyY2VBY3Rpb24/OiBcImVkaXRcIiB8IFwidmlld1wiXG4gIGNvbnRlbnQ6IHN0cmluZ1xufSkge1xuICBjb25zdCBbY29waWVkLCBzZXRDb3BpZWRdID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IHNvdXJjZUhyZWYgPVxuICAgIHByb3BzLnNvdXJjZVVybCA/P1xuICAgIChwcm9wcy5maWxlXG4gICAgICA/IGBodHRwczovL2dpdGh1Yi5jb20vZGF0aXN0aHEvbGl2ZW1hcmsvZWRpdC9tYWluLyR7cHJvcHMuZmlsZX1gXG4gICAgICA6IHVuZGVmaW5lZClcbiAgY29uc3QgaXNWaWV3ID0gcHJvcHMuc291cmNlQWN0aW9uID09PSBcInZpZXdcIlxuICBjb25zdCBzb3VyY2VMYWJlbCA9IGlzVmlldyA/IFwiVmlldyBvbiBHaXRIdWJcIiA6IFwiRWRpdCBvbiBHaXRIdWJcIlxuICBjb25zdCBTb3VyY2VJY29uID0gaXNWaWV3ID8gRXllIDogUGVuY2lsXG5cbiAgY29uc3QgaGFuZGxlQ29weSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChwcm9wcy5jb250ZW50KVxuICAgIHNldENvcGllZCh0cnVlKVxuICAgIHNldFRpbWVvdXQoKCkgPT4gc2V0Q29waWVkKGZhbHNlKSwgMjAwMClcbiAgfSwgW3Byb3BzLmNvbnRlbnRdKVxuXG4gIGNvbnN0IGhhbmRsZU9wZW5JbiA9IHVzZUNhbGxiYWNrKFxuICAgICh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQocHJvcHMuY29udGVudClcbiAgICAgIHdpbmRvdy5vcGVuKHVybCwgXCJfYmxhbmtcIiwgXCJub29wZW5lcixub3JlZmVycmVyXCIpXG4gICAgfSxcbiAgICBbcHJvcHMuY29udGVudF0sXG4gIClcblxuICBjb25zdCBidXR0b25DbGFzcyA9XG4gICAgXCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41IHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9yc1wiXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTIgdGV4dC1zbVwiPlxuICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtbWVkaXVtIG1iLTFcIj5BY3Rpb25zPC9wPlxuICAgICAgICB7c291cmNlSHJlZiA/IChcbiAgICAgICAgICA8YVxuICAgICAgICAgICAgaHJlZj17c291cmNlSHJlZn1cbiAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17YnV0dG9uQ2xhc3N9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPFNvdXJjZUljb24gY2xhc3NOYW1lPVwic2l6ZS0zLjVcIiAvPlxuICAgICAgICAgICAge3NvdXJjZUxhYmVsfVxuICAgICAgICAgIDwvYT5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3NOYW1lPXtgJHtidXR0b25DbGFzc30gb3BhY2l0eS01MCBjdXJzb3Itbm90LWFsbG93ZWQgaG92ZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kYH1cbiAgICAgICAgICAgIGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8U291cmNlSWNvbiBjbGFzc05hbWU9XCJzaXplLTMuNVwiIC8+XG4gICAgICAgICAgICB7c291cmNlTGFiZWx9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICApfVxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBvbkNsaWNrPXtoYW5kbGVDb3B5fSBjbGFzc05hbWU9e2J1dHRvbkNsYXNzfT5cbiAgICAgICAgICB7Y29waWVkID8gKFxuICAgICAgICAgICAgPENoZWNrIGNsYXNzTmFtZT1cInNpemUtMy41XCIgLz5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPENvcHkgY2xhc3NOYW1lPVwic2l6ZS0zLjVcIiAvPlxuICAgICAgICAgICl9XG4gICAgICAgICAgQ29weSBNYXJrZG93blxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZU9wZW5JbihcImh0dHBzOi8vY2hhdGdwdC5jb20vXCIpfVxuICAgICAgICAgIGNsYXNzTmFtZT17YnV0dG9uQ2xhc3N9XG4gICAgICAgID5cbiAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGNsYXNzTmFtZT1cInNpemUtMy41XCIgLz5cbiAgICAgICAgICBPcGVuIGluIENoYXRHUFRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVPcGVuSW4oXCJodHRwczovL2NsYXVkZS5haS9cIil9XG4gICAgICAgICAgY2xhc3NOYW1lPXtidXR0b25DbGFzc31cbiAgICAgICAgPlxuICAgICAgICAgIDxFeHRlcm5hbExpbmsgY2xhc3NOYW1lPVwic2l6ZS0zLjVcIiAvPlxuICAgICAgICAgIE9wZW4gaW4gQ2xhdWRlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC8+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,4 @@
1
+ /** Previous/next article navigation shown at the bottom of each article page */
2
+ export declare function PrevNext(props: {
3
+ path: string;
4
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link } from "@tanstack/react-router";
3
+ import { ChevronLeft, ChevronRight } from "lucide-react";
4
+ import { sortedArticles, flatArticles, currentSection, sectionFlatArticles, } from "../content/article.js";
5
+ /** Previous/next article navigation shown at the bottom of each article page */
6
+ export function PrevNext(props) {
7
+ const section = currentSection(props.path);
8
+ const flat = section
9
+ ? (sectionFlatArticles.get(section.prefix) ?? flatArticles)
10
+ : flatArticles;
11
+ const index = flat.indexOf(props.path);
12
+ if (index < 0)
13
+ return null;
14
+ const prevPath = index > 0 ? flat[index - 1] : undefined;
15
+ const nextPath = index < flat.length - 1 ? flat[index + 1] : undefined;
16
+ const prev = prevPath
17
+ ? sortedArticles.find(a => a.path === prevPath)
18
+ : undefined;
19
+ const next = nextPath
20
+ ? sortedArticles.find(a => a.path === nextPath)
21
+ : undefined;
22
+ if (!prev && !next)
23
+ return null;
24
+ return (_jsxs("nav", { className: "not-prose mt-10 flex gap-4", children: [prev && (_jsxs(Link, { to: "/$", params: { _splat: prev.path.replace(/^\/|\/$/g, "") }, className: "flex-1 rounded-xl border shadow-sm p-4 hover:bg-muted/50 transition-colors", children: [
25
+ _jsxs("span", { className: "flex items-center gap-1 text-sm text-muted-foreground", children: [
26
+ _jsx(ChevronLeft, { className: "size-4" }),
27
+ "Previous"] }), _jsx("span", { className: "mt-1 block font-medium", children: prev.title })
28
+ ] })), next && (_jsxs(Link, { to: "/$", params: { _splat: next.path.replace(/^\/|\/$/g, "") }, className: "flex-1 rounded-xl border shadow-sm p-4 hover:bg-muted/50 transition-colors text-right", children: [
29
+ _jsxs("span", { className: "flex items-center justify-end gap-1 text-sm text-muted-foreground", children: ["Next",
30
+ _jsx(ChevronRight, { className: "size-4" })
31
+ ] }), _jsx("span", { className: "mt-1 block font-medium", children: next.title })
32
+ ] }))] }));
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJldk5leHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9QcmV2TmV4dC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN4RCxPQUFPLEVBQ0wsY0FBYyxFQUNkLFlBQVksRUFDWixjQUFjLEVBQ2QsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUE7QUFFOUIsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxRQUFRLENBQUMsS0FBdUI7SUFDOUMsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMxQyxNQUFNLElBQUksR0FBRyxPQUFPO1FBQ2xCLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxDQUFDO1FBQzNELENBQUMsQ0FBQyxZQUFZLENBQUE7SUFDaEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdEMsSUFBSSxLQUFLLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFBO0lBRTFCLE1BQU0sUUFBUSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUN4RCxNQUFNLFFBQVEsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUN0RSxNQUFNLElBQUksR0FBRyxRQUFRO1FBQ25CLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7UUFDL0MsQ0FBQyxDQUFDLFNBQVMsQ0FBQTtJQUNiLE1BQU0sSUFBSSxHQUFHLFFBQVE7UUFDbkIsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztRQUMvQyxDQUFDLENBQUMsU0FBUyxDQUFBO0lBRWIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUUvQixPQUFPLENBQ0wsZUFBSyxTQUFTLEVBQUMsNEJBQTRCLGFBQ3hDLElBQUksSUFBSSxDQUNQLE1BQUMsSUFBSSxJQUNILEVBQUUsRUFBQyxJQUFJLEVBQ1AsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUNyRCxTQUFTLEVBQUMsNEVBQTRFO29CQUV0RixnQkFBTSxTQUFTLEVBQUMsdURBQXVEOzRCQUNyRSxLQUFDLFdBQVcsSUFBQyxTQUFTLEVBQUMsUUFBUSxHQUFHOzBDQUU3QixFQUNQLGVBQU0sU0FBUyxFQUFDLHdCQUF3QixZQUFFLElBQUksQ0FBQyxLQUFLLEdBQVE7b0JBQ3ZELENBQ1IsRUFDQSxJQUFJLElBQUksQ0FDUCxNQUFDLElBQUksSUFDSCxFQUFFLEVBQUMsSUFBSSxFQUNQLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFDckQsU0FBUyxFQUFDLHVGQUF1RjtvQkFFakcsZ0JBQU0sU0FBUyxFQUFDLG1FQUFtRTs0QkFFakYsS0FBQyxZQUFZLElBQUMsU0FBUyxFQUFDLFFBQVEsR0FBRzs0QkFDOUIsRUFDUCxlQUFNLFNBQVMsRUFBQyx3QkFBd0IsWUFBRSxJQUFJLENBQUMsS0FBSyxHQUFRO29CQUN2RCxDQUNSLElBQ0csQ0FDUCxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExpbmsgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiXG5pbXBvcnQgeyBDaGV2cm9uTGVmdCwgQ2hldnJvblJpZ2h0IH0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiXG5pbXBvcnQge1xuICBzb3J0ZWRBcnRpY2xlcyxcbiAgZmxhdEFydGljbGVzLFxuICBjdXJyZW50U2VjdGlvbixcbiAgc2VjdGlvbkZsYXRBcnRpY2xlcyxcbn0gZnJvbSBcIi4uL2NvbnRlbnQvYXJ0aWNsZS50c1wiXG5cbi8qKiBQcmV2aW91cy9uZXh0IGFydGljbGUgbmF2aWdhdGlvbiBzaG93biBhdCB0aGUgYm90dG9tIG9mIGVhY2ggYXJ0aWNsZSBwYWdlICovXG5leHBvcnQgZnVuY3Rpb24gUHJldk5leHQocHJvcHM6IHsgcGF0aDogc3RyaW5nIH0pIHtcbiAgY29uc3Qgc2VjdGlvbiA9IGN1cnJlbnRTZWN0aW9uKHByb3BzLnBhdGgpXG4gIGNvbnN0IGZsYXQgPSBzZWN0aW9uXG4gICAgPyAoc2VjdGlvbkZsYXRBcnRpY2xlcy5nZXQoc2VjdGlvbi5wcmVmaXgpID8/IGZsYXRBcnRpY2xlcylcbiAgICA6IGZsYXRBcnRpY2xlc1xuICBjb25zdCBpbmRleCA9IGZsYXQuaW5kZXhPZihwcm9wcy5wYXRoKVxuICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IHByZXZQYXRoID0gaW5kZXggPiAwID8gZmxhdFtpbmRleCAtIDFdIDogdW5kZWZpbmVkXG4gIGNvbnN0IG5leHRQYXRoID0gaW5kZXggPCBmbGF0Lmxlbmd0aCAtIDEgPyBmbGF0W2luZGV4ICsgMV0gOiB1bmRlZmluZWRcbiAgY29uc3QgcHJldiA9IHByZXZQYXRoXG4gICAgPyBzb3J0ZWRBcnRpY2xlcy5maW5kKGEgPT4gYS5wYXRoID09PSBwcmV2UGF0aClcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCBuZXh0ID0gbmV4dFBhdGhcbiAgICA/IHNvcnRlZEFydGljbGVzLmZpbmQoYSA9PiBhLnBhdGggPT09IG5leHRQYXRoKVxuICAgIDogdW5kZWZpbmVkXG5cbiAgaWYgKCFwcmV2ICYmICFuZXh0KSByZXR1cm4gbnVsbFxuXG4gIHJldHVybiAoXG4gICAgPG5hdiBjbGFzc05hbWU9XCJub3QtcHJvc2UgbXQtMTAgZmxleCBnYXAtNFwiPlxuICAgICAge3ByZXYgJiYgKFxuICAgICAgICA8TGlua1xuICAgICAgICAgIHRvPVwiLyRcIlxuICAgICAgICAgIHBhcmFtcz17eyBfc3BsYXQ6IHByZXYucGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIikgfX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTEgcm91bmRlZC14bCBib3JkZXIgc2hhZG93LXNtIHAtNCBob3ZlcjpiZy1tdXRlZC81MCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMSB0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZFwiPlxuICAgICAgICAgICAgPENoZXZyb25MZWZ0IGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgICAgICAgICBQcmV2aW91c1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJtdC0xIGJsb2NrIGZvbnQtbWVkaXVtXCI+e3ByZXYudGl0bGV9PC9zcGFuPlxuICAgICAgICA8L0xpbms+XG4gICAgICApfVxuICAgICAge25leHQgJiYgKFxuICAgICAgICA8TGlua1xuICAgICAgICAgIHRvPVwiLyRcIlxuICAgICAgICAgIHBhcmFtcz17eyBfc3BsYXQ6IG5leHQucGF0aC5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIikgfX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTEgcm91bmRlZC14bCBib3JkZXIgc2hhZG93LXNtIHAtNCBob3ZlcjpiZy1tdXRlZC81MCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0xIHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgICAgICBOZXh0XG4gICAgICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm10LTEgYmxvY2sgZm9udC1tZWRpdW1cIj57bmV4dC50aXRsZX08L3NwYW4+XG4gICAgICAgIDwvTGluaz5cbiAgICAgICl9XG4gICAgPC9uYXY+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ /** Search button with "/" keyboard shortcut and command palette dialog */
2
+ export declare function Search(): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,16 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { useHotkey } from "@tanstack/react-hotkeys";
4
+ import { Search as SearchIcon } from "lucide-react";
5
+ import { SearchDialog } from "./SearchDialog.js";
6
+ /** Search button with "/" keyboard shortcut and command palette dialog */
7
+ export function Search() {
8
+ const [open, setOpen] = useState(false);
9
+ useHotkey("/", () => setOpen(true));
10
+ return (_jsxs(_Fragment, { children: [
11
+ _jsxs("button", { type: "button", onClick: () => setOpen(true), className: "flex w-full items-center gap-2 rounded-xl border border-border bg-sidebar-accent/70 px-3 py-2 text-sm text-muted-foreground shadow-xs hover:bg-background transition-colors cursor-pointer", children: [
12
+ _jsx(SearchIcon, { className: "size-4" }), _jsx("span", { className: "flex-1 text-left", children: "Search..." }), _jsx("kbd", { className: "rounded border border-border bg-muted px-1.5 py-0.5 text-[10px] font-mono", children: "/" })
13
+ ] }), _jsx(SearchDialog, { open: open, onOpenChange: setOpen })
14
+ ] }));
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvU2VhcmNoLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUE7QUFDbkQsT0FBTyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFvQixDQUFBO0FBRWpELDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsTUFBTTtJQUNwQixNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUV2QyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBRW5DLE9BQU8sQ0FDTDtZQUNFLGtCQUNFLElBQUksRUFBQyxRQUFRLEVBQ2IsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDNUIsU0FBUyxFQUFDLDRMQUE0TDtvQkFFdE0sS0FBQyxVQUFVLElBQUMsU0FBUyxFQUFDLFFBQVEsR0FBRyxFQUNqQyxlQUFNLFNBQVMsRUFBQyxrQkFBa0IsMEJBQWlCLEVBQ25ELGNBQUssU0FBUyxFQUFDLDJFQUEyRSxrQkFFcEY7b0JBQ0MsRUFDVCxLQUFDLFlBQVksSUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEdBQUk7WUFDbEQsQ0FDSixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IHVzZUhvdGtleSB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3QtaG90a2V5c1wiXG5pbXBvcnQgeyBTZWFyY2ggYXMgU2VhcmNoSWNvbiB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIlxuaW1wb3J0IHsgU2VhcmNoRGlhbG9nIH0gZnJvbSBcIi4vU2VhcmNoRGlhbG9nLnRzeFwiXG5cbi8qKiBTZWFyY2ggYnV0dG9uIHdpdGggXCIvXCIga2V5Ym9hcmQgc2hvcnRjdXQgYW5kIGNvbW1hbmQgcGFsZXR0ZSBkaWFsb2cgKi9cbmV4cG9ydCBmdW5jdGlvbiBTZWFyY2goKSB7XG4gIGNvbnN0IFtvcGVuLCBzZXRPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuXG4gIHVzZUhvdGtleShcIi9cIiwgKCkgPT4gc2V0T3Blbih0cnVlKSlcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRPcGVuKHRydWUpfVxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLWJvcmRlciBiZy1zaWRlYmFyLWFjY2VudC83MCBweC0zIHB5LTIgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmQgc2hhZG93LXhzIGhvdmVyOmJnLWJhY2tncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMgY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgPlxuICAgICAgICA8U2VhcmNoSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmbGV4LTEgdGV4dC1sZWZ0XCI+U2VhcmNoLi4uPC9zcGFuPlxuICAgICAgICA8a2JkIGNsYXNzTmFtZT1cInJvdW5kZWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctbXV0ZWQgcHgtMS41IHB5LTAuNSB0ZXh0LVsxMHB4XSBmb250LW1vbm9cIj5cbiAgICAgICAgICAvXG4gICAgICAgIDwva2JkPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8U2VhcmNoRGlhbG9nIG9wZW49e29wZW59IG9uT3BlbkNoYW5nZT17c2V0T3Blbn0gLz5cbiAgICA8Lz5cbiAgKVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /** Full-text search dialog powered by Orama */
2
+ export declare function SearchDialog(props: {
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,139 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useRef, useCallback, useMemo } from "react";
3
+ import { useNavigate } from "@tanstack/react-router";
4
+ import { FileText } from "lucide-react";
5
+ import { create, insertMultiple, search } from "@orama/orama";
6
+ import { sortedArticles } from "../content/article.js";
7
+ import { articleIcons } from "../helpers/article-icon.js";
8
+ import { CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from "../elements/command.js";
9
+ /** Full-text search dialog powered by Orama */
10
+ export function SearchDialog(props) {
11
+ const [results, setResults] = useState([]);
12
+ const [query, setQuery] = useState("");
13
+ const dbRef = useRef(null);
14
+ const navigate = useNavigate();
15
+ const ensureIndex = useCallback(async () => {
16
+ if (dbRef.current)
17
+ return dbRef.current;
18
+ const db = await create({
19
+ schema: {
20
+ title: "string",
21
+ description: "string",
22
+ searchText: "string",
23
+ },
24
+ });
25
+ await insertMultiple(db, sortedArticles.map(a => ({
26
+ title: a.title,
27
+ description: a.description ?? "",
28
+ searchText: a.searchText,
29
+ })));
30
+ dbRef.current = db;
31
+ return db;
32
+ }, []);
33
+ const toResult = useCallback((article, term) => ({
34
+ title: article.title,
35
+ path: article.path,
36
+ icon: article.icon,
37
+ snippet: term
38
+ ? extractSnippet(article.searchText, term)
39
+ : (article.description ?? ""),
40
+ group: groupFor(article.path),
41
+ }), []);
42
+ const handleSearch = useCallback(async (term) => {
43
+ setQuery(term);
44
+ if (!term.trim()) {
45
+ setResults([]);
46
+ return;
47
+ }
48
+ const db = await ensureIndex();
49
+ const hits = await search(db, {
50
+ term,
51
+ properties: ["title", "description", "searchText"],
52
+ tolerance: 1,
53
+ boost: { title: 3, description: 2 },
54
+ });
55
+ setResults(hits.hits.map(hit => {
56
+ const article = sortedArticles.find(a => a.title === hit.document.title);
57
+ if (!article)
58
+ return toResult({
59
+ ...sortedArticles[0],
60
+ title: hit.document.title,
61
+ path: "",
62
+ searchText: hit.document.description,
63
+ description: hit.document.description,
64
+ icon: "",
65
+ }, term);
66
+ return toResult(article, term);
67
+ }));
68
+ }, [ensureIndex, toResult]);
69
+ const handleSelect = useCallback((path) => {
70
+ props.onOpenChange(false);
71
+ setQuery("");
72
+ setResults([]);
73
+ navigate({
74
+ to: "/$",
75
+ params: { _splat: path.replace(/^\/|\/$/g, "") },
76
+ });
77
+ }, [navigate, props.onOpenChange]);
78
+ const grouped = useMemo(() => {
79
+ const groups = new Map();
80
+ for (const r of results) {
81
+ const list = groups.get(r.group) ?? [];
82
+ list.push(r);
83
+ groups.set(r.group, list);
84
+ }
85
+ return groups;
86
+ }, [results]);
87
+ return (_jsxs(CommandDialog, { title: "Search", description: "Search documentation", open: props.open, onOpenChange: props.onOpenChange, shouldFilter: false, loop: true, children: [
88
+ _jsx(CommandInput, { placeholder: "Search docs...", value: query, onValueChange: handleSearch, onClear: () => handleSearch("") }), _jsxs(CommandList, { className: "max-h-80", children: [
89
+ _jsx(CommandEmpty, { children: query.trim()
90
+ ? "No results found."
91
+ : "Type to search across all documentation." }), [...grouped.entries()].map(([group, items]) => (_jsx(CommandGroup, { heading: group, children: items.map(result => {
92
+ const Icon = articleIcons[result.icon] ?? FileText;
93
+ return (_jsxs(CommandItem, { value: result.path, onSelect: () => handleSelect(result.path), className: "py-2.5", children: [
94
+ _jsx(Icon, { className: "size-5 shrink-0 mt-0.5 self-start opacity-60" }), _jsxs("div", { className: "flex flex-col gap-0.5 min-w-0", children: [
95
+ _jsx("span", { className: "text-base font-medium", children: result.title }), result.snippet && (_jsx("span", { className: "text-sm text-muted-foreground line-clamp-1", children: _jsx(HighlightedText, { text: result.snippet, term: query }) }))] })
96
+ ] }, result.path));
97
+ }) }, group)))] }), _jsxs("div", { className: "flex items-center gap-4 border-t mt-2 px-4 py-2.5 text-sm text-muted-foreground", children: [
98
+ _jsxs("span", { className: "flex items-center gap-1.5", children: [
99
+ _jsx("kbd", { className: "rounded border border-border bg-muted px-1.5 py-0.5 text-xs font-mono", children: "\u2191\u2193" }),
100
+ "navigate"] }), _jsxs("span", { className: "flex items-center gap-1.5", children: [
101
+ _jsx("kbd", { className: "rounded border border-border bg-muted px-1.5 py-0.5 text-xs font-mono", children: "\u21B5" }),
102
+ "select"] }), _jsxs("span", { className: "flex items-center gap-1.5", children: [
103
+ _jsx("kbd", { className: "rounded border border-border bg-muted px-1.5 py-0.5 text-xs font-mono", children: "esc" }),
104
+ "close"] })
105
+ ] })
106
+ ] }));
107
+ }
108
+ function groupFor(pathname) {
109
+ const segments = pathname.replace(/^\/|\/$/g, "").split("/");
110
+ if (segments.length <= 2)
111
+ return "Pages";
112
+ return segments
113
+ .slice(1, -1)
114
+ .map(s => s
115
+ .split("-")
116
+ .map(w => w.charAt(0).toUpperCase() + w.slice(1))
117
+ .join(" "))
118
+ .join(" › ");
119
+ }
120
+ function extractSnippet(text, term) {
121
+ const lower = text.toLowerCase();
122
+ const idx = lower.indexOf(term.toLowerCase());
123
+ if (idx === -1)
124
+ return text.slice(0, 120);
125
+ const start = Math.max(0, idx - 40);
126
+ const end = Math.min(text.length, idx + term.length + 80);
127
+ const prefix = start > 0 ? "…" : "";
128
+ const suffix = end < text.length ? "…" : "";
129
+ return `${prefix}${text.slice(start, end)}${suffix}`;
130
+ }
131
+ function HighlightedText(props) {
132
+ if (!props.term.trim())
133
+ return _jsx(_Fragment, { children: props.text });
134
+ const escaped = props.term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
135
+ const regex = new RegExp(`(${escaped})`, "gi");
136
+ const parts = props.text.split(regex);
137
+ return (_jsx(_Fragment, { children: parts.map((part, i) => regex.test(part) ? (_jsx("span", { className: "text-foreground font-medium", children: part }, i)) : (part)) }));
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoRGlhbG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvU2VhcmNoRGlhbG9nLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQTtBQUM5RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN2QyxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDN0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ3RELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUN6RCxPQUFPLEVBQ0wsYUFBYSxFQUNiLFlBQVksRUFDWixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxXQUFXLEdBQ1osTUFBTSx3QkFBeUIsQ0FBQTtBQVVoQywrQ0FBK0M7QUFDL0MsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUc1QjtJQUNDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFpQixFQUFFLENBQUMsQ0FBQTtJQUMxRCxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUN0QyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQTRDLElBQUksQ0FBQyxDQUFBO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLFdBQVcsRUFBRSxDQUFBO0lBRTlCLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxLQUFLLElBQUksRUFBRTtRQUN6QyxJQUFJLEtBQUssQ0FBQyxPQUFPO1lBQUUsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFBO1FBQ3ZDLE1BQU0s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LEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNyQyxPQUFPLENBQ0wsNEJBQ0csS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNyQixLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNqQixlQUFjLFNBQVMsRUFBQyw2QkFBNkIsWUFDbEQsSUFBSSxJQURJLENBQUMsQ0FFTCxDQUNSLENBQUMsQ0FBQyxDQUFDLENBQ0YsSUFBSSxDQUNMLENBQ0YsR0FDQSxDQUNKLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXNlU3RhdGUsIHVzZVJlZiwgdXNlQ2FsbGJhY2ssIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgdXNlTmF2aWdhdGUgfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiXG5pbXBvcnQgeyBGaWxlVGV4dCB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIlxuaW1wb3J0IHsgY3JlYXRlLCBpbnNlcnRNdWx0aXBsZSwgc2VhcmNoIH0gZnJvbSBcIkBvcmFtYS9vcmFtYVwiXG5pbXBvcnQgeyBzb3J0ZWRBcnRpY2xlcyB9IGZyb20gXCIuLi9jb250ZW50L2FydGljbGUudHNcIlxuaW1wb3J0IHsgYXJ0aWNsZUljb25zIH0gZnJvbSBcIi4uL2hlbHBlcnMvYXJ0aWNsZS1pY29uLnRzXCJcbmltcG9ydCB7XG4gIENvbW1hbmREaWFsb2csXG4gIENvbW1hbmRFbXB0eSxcbiAgQ29tbWFuZEdyb3VwLFxuICBDb21tYW5kSW5wdXQsXG4gIENvbW1hbmRJdGVtLFxuICBDb21tYW5kTGlzdCxcbn0gZnJvbSBcIi4uL2VsZW1lbnRzL2NvbW1hbmQudHN4XCJcblxuaW50ZXJmYWNlIFNlYXJjaFJlc3VsdCB7XG4gIHRpdGxlOiBzdHJpbmdcbiAgcGF0aDogc3RyaW5nXG4gIGljb246IHN0cmluZ1xuICBzbmlwcGV0OiBzdHJpbmdcbiAgZ3JvdXA6IHN0cmluZ1xufVxuXG4vKiogRnVsbC10ZXh0IHNlYXJjaCBkaWFsb2cgcG93ZXJlZCBieSBPcmFtYSAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNlYXJjaERpYWxvZyhwcm9wczoge1xuICBvcGVuOiBib29sZWFuXG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWRcbn0pIHtcbiAgY29uc3QgW3Jlc3VsdHMsIHNldFJlc3VsdHNdID0gdXNlU3RhdGU8U2VhcmNoUmVzdWx0W10+KFtdKVxuICBjb25zdCBbcXVlcnksIHNldFF1ZXJ5XSA9IHVzZVN0YXRlKFwiXCIpXG4gIGNvbnN0IGRiUmVmID0gdXNlUmVmPEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlPj4gfCBudWxsPihudWxsKVxuICBjb25zdCBuYXZpZ2F0ZSA9IHVzZU5hdmlnYXRlKClcblxuICBjb25zdCBlbnN1cmVJbmRleCA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAoZGJSZWYuY3VycmVudCkgcmV0dXJuIGRiUmVmLmN1cnJlbnRcbiAgICBjb25zdCBkYiA9IGF3YWl0IGNyZWF0ZSh7XG4gICAgICBzY2hlbWE6IHtcbiAgICAgICAgdGl0bGU6IFwic3RyaW5nXCIsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBcInN0cmluZ1wiLFxuICAgICAgICBzZWFyY2hUZXh0OiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICB9KVxuICAgIGF3YWl0IGluc2VydE11bHRpcGxlKFxuICAgICAgZGIsXG4gICAgICBzb3J0ZWRBcnRpY2xlcy5tYXAoYSA9PiAoe1xuICAgICAgICB0aXRsZTogYS50aXRsZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGEuZGVzY3JpcHRpb24gPz8gXCJcIixcbiAgICAgICAgc2VhcmNoVGV4dDogYS5zZWFyY2hUZXh0LFxuICAgICAgfSkpLFxuICAgIClcbiAgICBkYlJlZi5jdXJyZW50ID0gZGJcbiAgICByZXR1cm4gZGJcbiAgfSwgW10pXG5cbiAgY29uc3QgdG9SZXN1bHQgPSB1c2VDYWxsYmFjayhcbiAgICAoYXJ0aWNsZTogKHR5cGVvZiBzb3J0ZWRBcnRpY2xlcylbbnVtYmVyXSwgdGVybTogc3RyaW5nKTogU2VhcmNoUmVzdWx0ID0+ICh7XG4gICAgICB0aXRsZTogYXJ0aWNsZS50aXRsZSxcbiAgICAgIHBhdGg6IGFydGljbGUucGF0aCxcbiAgICAgIGljb246IGFydGljbGUuaWNvbixcbiAgICAgIHNuaXBwZXQ6IHRlcm1cbiAgICAgICAgPyBleHRyYWN0U25pcHBldChhcnRpY2xlLnNlYXJjaFRleHQsIHRlcm0pXG4gICAgICAgIDogKGFydGljbGUuZGVzY3JpcHRpb24gPz8gXCJcIiksXG4gICAgICBncm91cDogZ3JvdXBGb3IoYXJ0aWNsZS5wYXRoKSxcbiAgICB9KSxcbiAgICBbXSxcbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlYXJjaCA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jICh0ZXJtOiBzdHJpbmcpID0+IHtcbiAgICAgIHNldFF1ZXJ5KHRlcm0pXG4gICAgICBpZiAoIXRlcm0udHJpbSgpKSB7XG4gICAgICAgIHNldFJlc3VsdHMoW10pXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY29uc3QgZGIgPSBhd2FpdCBlbnN1cmVJbmRleCgpXG4gICAgICBjb25zdCBoaXRzID0gYXdhaXQgc2VhcmNoKGRiLCB7XG4gICAgICAgIHRlcm0sXG4gICAgICAgIHByb3BlcnRpZXM6IFtcInRpdGxlXCIsIFwiZGVzY3JpcHRpb25cIiwgXCJzZWFyY2hUZXh0XCJdLFxuICAgICAgICB0b2xlcmFuY2U6IDEsXG4gICAgICAgIGJvb3N0OiB7IHRpdGxlOiAzLCBkZXNjcmlwdGlvbjogMiB9LFxuICAgICAgfSlcbiAgICAgIHNldFJlc3VsdHMoXG4gICAgICAgIGhpdHMuaGl0cy5tYXAoaGl0ID0+IHtcbiAgICAgICAgICBjb25zdCBhcnRpY2xlID0gc29ydGVkQXJ0aWNsZXMuZmluZChcbiAgICAgICAgICAgIGEgPT4gYS50aXRsZSA9PT0gaGl0LmRvY3VtZW50LnRpdGxlLFxuICAgICAgICAgIClcbiAgICAgICAgICBpZiAoIWFydGljbGUpXG4gICAgICAgICAgICByZXR1cm4gdG9SZXN1bHQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5zb3J0ZWRBcnRpY2xlc1swXSxcbiAgICAgICAgICAgICAgICB0aXRsZTogaGl0LmRvY3VtZW50LnRpdGxlLFxuICAgICAgICAgICAgICAgIHBhdGg6IFwiXCIsXG4gICAgICAgICAgICAgICAgc2VhcmNoVGV4dDogaGl0LmRvY3VtZW50LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBoaXQuZG9jdW1lbnQuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgaWNvbjogXCJcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGVybSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICByZXR1cm4gdG9SZXN1bHQoYXJ0aWNsZSwgdGVybSlcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSxcbiAgICBbZW5zdXJlSW5kZXgsIHRvUmVzdWx0XSxcbiAgKVxuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdCA9IHVzZUNhbGxiYWNrKFxuICAgIChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgIHByb3BzLm9uT3BlbkNoYW5nZShmYWxzZSlcbiAgICAgIHNldFF1ZXJ5KFwiXCIpXG4gICAgICBzZXRSZXN1bHRzKFtdKVxuICAgICAgbmF2aWdhdGUoe1xuICAgICAgICB0bzogXCIvJFwiLFxuICAgICAgICBwYXJhbXM6IHsgX3NwbGF0OiBwYXRoLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKSB9LFxuICAgICAgfSlcbiAgICB9LFxuICAgIFtuYXZpZ2F0ZSwgcHJvcHMub25PcGVuQ2hhbmdlXSxcbiAgKVxuXG4gIGNvbnN0IGdyb3VwZWQgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgU2VhcmNoUmVzdWx0W10+KClcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVzdWx0cykge1xuICAgICAgY29uc3QgbGlzdCA9IGdyb3Vwcy5nZXQoci5ncm91cCkgPz8gW11cbiAgICAgIGxpc3QucHVzaChyKVxuICAgICAgZ3JvdXBzLnNldChyLmdyb3VwLCBsaXN0KVxuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBzXG4gIH0sIFtyZXN1bHRzXSlcblxuICByZXR1cm4gKFxuICAgIDxDb21tYW5kRGlhbG9nXG4gICAgICB0aXRsZT1cIlNlYXJjaFwiXG4gICAgICBkZXNjcmlwdGlvbj1cIlNlYXJjaCBkb2N1bWVudGF0aW9uXCJcbiAgICAgIG9wZW49e3Byb3BzLm9wZW59XG4gICAgICBvbk9wZW5DaGFuZ2U9e3Byb3BzLm9uT3BlbkNoYW5nZX1cbiAgICAgIHNob3VsZEZpbHRlcj17ZmFsc2V9XG4gICAgICBsb29wXG4gICAgPlxuICAgICAgPENvbW1hbmRJbnB1dFxuICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBkb2NzLi4uXCJcbiAgICAgICAgdmFsdWU9e3F1ZXJ5fVxuICAgICAgICBvblZhbHVlQ2hhbmdlPXtoYW5kbGVTZWFyY2h9XG4gICAgICAgIG9uQ2xlYXI9eygpID0+IGhhbmRsZVNlYXJjaChcIlwiKX1cbiAgICAgIC8+XG4gICAgICA8Q29tbWFuZExpc3QgY2xhc3NOYW1lPVwibWF4LWgtODBcIj5cbiAgICAgICAgPENvbW1hbmRFbXB0eT5cbiAgICAgICAgICB7cXVlcnkudHJpbSgpXG4gICAgICAgICAgICA/IFwiTm8gcmVzdWx0cyBmb3VuZC5cIlxuICAgICAgICAgICAgOiBcIlR5cGUgdG8gc2VhcmNoIGFjcm9zcyBhbGwgZG9jdW1lbnRhdGlvbi5cIn1cbiAgICAgICAgPC9Db21tYW5kRW1wdHk+XG4gICAgICAgIHtbLi4uZ3JvdXBlZC5lbnRyaWVzKCldLm1hcCgoW2dyb3VwLCBpdGVtc10pID0+IChcbiAgICAgICAgICA8Q29tbWFuZEdyb3VwIGtleT17Z3JvdXB9IGhlYWRpbmc9e2dyb3VwfT5cbiAgICAgICAgICAgIHtpdGVtcy5tYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgSWNvbiA9IGFydGljbGVJY29uc1tyZXN1bHQuaWNvbl0gPz8gRmlsZVRleHRcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8Q29tbWFuZEl0ZW1cbiAgICAgICAgICAgICAgICAgIGtleT17cmVzdWx0LnBhdGh9XG4gICAgICAgICAgICAgICAgICB2YWx1ZT17cmVzdWx0LnBhdGh9XG4gICAgICAgICAgICAgICAgICBvblNlbGVjdD17KCkgPT4gaGFuZGxlU2VsZWN0KHJlc3VsdC5wYXRoKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInB5LTIuNVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPEljb24gY2xhc3NOYW1lPVwic2l6ZS01IHNocmluay0wIG10LTAuNSBzZWxmLXN0YXJ0IG9wYWNpdHktNjBcIiAvPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0wLjUgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWJhc2UgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICB7cmVzdWx0LnRpdGxlfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIHtyZXN1bHQuc25pcHBldCAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmQgbGluZS1jbGFtcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8SGlnaGxpZ2h0ZWRUZXh0IHRleHQ9e3Jlc3VsdC5zbmlwcGV0fSB0ZXJtPXtxdWVyeX0gLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L0NvbW1hbmRJdGVtPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KX1cbiAgICAgICAgICA8L0NvbW1hbmRHcm91cD5cbiAgICAgICAgKSl9XG4gICAgICA8L0NvbW1hbmRMaXN0PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBib3JkZXItdCBtdC0yIHB4LTQgcHktMi41IHRleHQtc20gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjVcIj5cbiAgICAgICAgICA8a2JkIGNsYXNzTmFtZT1cInJvdW5kZWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctbXV0ZWQgcHgtMS41IHB5LTAuNSB0ZXh0LXhzIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAg4oaR4oaTXG4gICAgICAgICAgPC9rYmQ+XG4gICAgICAgICAgbmF2aWdhdGVcbiAgICAgICAgPC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMS41XCI+XG4gICAgICAgICAgPGtiZCBjbGFzc05hbWU9XCJyb3VuZGVkIGJvcmRlciBib3JkZXItYm9yZGVyIGJnLW11dGVkIHB4LTEuNSBweS0wLjUgdGV4dC14cyBmb250LW1vbm9cIj5cbiAgICAgICAgICAgIOKGtVxuICAgICAgICAgIDwva2JkPlxuICAgICAgICAgIHNlbGVjdFxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjVcIj5cbiAgICAgICAgICA8a2JkIGNsYXNzTmFtZT1cInJvdW5kZWQgYm9yZGVyIGJvcmRlci1ib3JkZXIgYmctbXV0ZWQgcHgtMS41IHB5LTAuNSB0ZXh0LXhzIGZvbnQtbW9ub1wiPlxuICAgICAgICAgICAgZXNjXG4gICAgICAgICAgPC9rYmQ+XG4gICAgICAgICAgY2xvc2VcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9Db21tYW5kRGlhbG9nPlxuICApXG59XG5cbmZ1bmN0aW9uIGdyb3VwRm9yKHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3Qgc2VnbWVudHMgPSBwYXRobmFtZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIikuc3BsaXQoXCIvXCIpXG4gIGlmIChzZWdtZW50cy5sZW5ndGggPD0gMikgcmV0dXJuIFwiUGFnZXNcIlxuICByZXR1cm4gc2VnbWVudHNcbiAgICAuc2xpY2UoMSwgLTEpXG4gICAgLm1hcChzID0+XG4gICAgICBzXG4gICAgICAgIC5zcGxpdChcIi1cIilcbiAgICAgICAgLm1hcCh3ID0+IHcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3LnNsaWNlKDEpKVxuICAgICAgICAuam9pbihcIiBcIiksXG4gICAgKVxuICAgIC5qb2luKFwiIOKAuiBcIilcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFNuaXBwZXQodGV4dDogc3RyaW5nLCB0ZXJtOiBzdHJpbmcpIHtcbiAgY29uc3QgbG93ZXIgPSB0ZXh0LnRvTG93ZXJDYXNlKClcbiAgY29uc3QgaWR4ID0gbG93ZXIuaW5kZXhPZih0ZXJtLnRvTG93ZXJDYXNlKCkpXG4gIGlmIChpZHggPT09IC0xKSByZXR1cm4gdGV4dC5zbGljZSgwLCAxMjApXG4gIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaWR4IC0gNDApXG4gIGNvbnN0IGVuZCA9IE1hdGgubWluKHRleHQubGVuZ3RoLCBpZHggKyB0ZXJtLmxlbmd0aCArIDgwKVxuICBjb25zdCBwcmVmaXggPSBzdGFydCA+IDAgPyBcIuKAplwiIDogXCJcIlxuICBjb25zdCBzdWZmaXggPSBlbmQgPCB0ZXh0Lmxlbmd0aCA/IFwi4oCmXCIgOiBcIlwiXG4gIHJldHVybiBgJHtwcmVmaXh9JHt0ZXh0LnNsaWNlKHN0YXJ0LCBlbmQpfSR7c3VmZml4fWBcbn1cblxuZnVuY3Rpb24gSGlnaGxpZ2h0ZWRUZXh0KHByb3BzOiB7IHRleHQ6IHN0cmluZzsgdGVybTogc3RyaW5nIH0pIHtcbiAgaWYgKCFwcm9wcy50ZXJtLnRyaW0oKSkgcmV0dXJuIDw+e3Byb3BzLnRleHR9PC8+XG4gIGNvbnN0IGVzY2FwZWQgPSBwcm9wcy50ZXJtLnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXF1cXFxcXS9nLCBcIlxcXFwkJlwiKVxuICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoYCgke2VzY2FwZWR9KWAsIFwiZ2lcIilcbiAgY29uc3QgcGFydHMgPSBwcm9wcy50ZXh0LnNwbGl0KHJlZ2V4KVxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7cGFydHMubWFwKChwYXJ0LCBpKSA9PlxuICAgICAgICByZWdleC50ZXN0KHBhcnQpID8gKFxuICAgICAgICAgIDxzcGFuIGtleT17aX0gY2xhc3NOYW1lPVwidGV4dC1mb3JlZ3JvdW5kIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICB7cGFydH1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgcGFydFxuICAgICAgICApLFxuICAgICAgKX1cbiAgICA8Lz5cbiAgKVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ export declare function Section(props: {
2
+ children: React.ReactNode;
3
+ className?: string;
4
+ id?: string;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from "../utils/style.js";
3
+ import { useInView } from "../hooks/in-view.js";
4
+ export function Section(props) {
5
+ const { ref, isVisible } = useInView();
6
+ return (_jsx("section", { ref: ref, id: props.id, className: cn("py-16 md:py-24 transition-all duration-700", isVisible ? "opacity-100 translate-y-0" : "opacity-0 translate-y-8", props.className), children: props.children }));
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb21wb25lbnRzL1NlY3Rpb24udHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFBO0FBRS9DLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FJdkI7SUFDQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLFNBQVMsRUFBRSxDQUFBO0lBRXRDLE9BQU8sQ0FDTCxrQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUNSLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUNaLFNBQVMsRUFBRSxFQUFFLENBQ1gsNENBQTRDLEVBQzVDLFNBQVMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixFQUNuRSxLQUFLLENBQUMsU0FBUyxDQUNoQixZQUVBLEtBQUssQ0FBQyxRQUFRLEdBQ1AsQ0FDWCxDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNuIH0gZnJvbSBcIi4uL3V0aWxzL3N0eWxlLnRzXCJcbmltcG9ydCB7IHVzZUluVmlldyB9IGZyb20gXCIuLi9ob29rcy9pbi12aWV3LnRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIFNlY3Rpb24ocHJvcHM6IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZVxuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgaWQ/OiBzdHJpbmdcbn0pIHtcbiAgY29uc3QgeyByZWYsIGlzVmlzaWJsZSB9ID0gdXNlSW5WaWV3KClcblxuICByZXR1cm4gKFxuICAgIDxzZWN0aW9uXG4gICAgICByZWY9e3JlZn1cbiAgICAgIGlkPXtwcm9wcy5pZH1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIFwicHktMTYgbWQ6cHktMjQgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tNzAwXCIsXG4gICAgICAgIGlzVmlzaWJsZSA/IFwib3BhY2l0eS0xMDAgdHJhbnNsYXRlLXktMFwiIDogXCJvcGFjaXR5LTAgdHJhbnNsYXRlLXktOFwiLFxuICAgICAgICBwcm9wcy5jbGFzc05hbWUsXG4gICAgICApfVxuICAgID5cbiAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICA8L3NlY3Rpb24+XG4gIClcbn1cbiJdfQ==