livemark 0.10.5 → 0.11.1

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 (448) hide show
  1. package/build/actions/changelog/build.d.ts +22 -0
  2. package/build/actions/changelog/build.js +198 -0
  3. package/build/actions/config/load.d.ts +12 -0
  4. package/build/actions/config/load.js +41 -0
  5. package/build/actions/config/load.unit.js +39 -0
  6. package/build/actions/target/build.d.ts +29 -0
  7. package/build/actions/target/build.js +87 -0
  8. package/build/commands/build.js +15 -0
  9. package/{target → build}/commands/escape.d.ts +1 -1
  10. package/build/commands/escape.js +62 -0
  11. package/build/commands/preview.js +19 -0
  12. package/build/commands/start.js +20 -0
  13. package/build/components/Breadcrumbs.js +14 -0
  14. package/build/components/Layout.js +66 -0
  15. package/build/components/SidebarArticles.js +46 -0
  16. package/build/components/SidebarLinks.js +27 -0
  17. package/build/components/SidebarSections.js +37 -0
  18. package/build/components/SiteTitle.js +13 -0
  19. package/build/content/article.js +55 -0
  20. package/build/content/tag.js +31 -0
  21. package/build/content-collections.js +218 -0
  22. package/{target → build}/models/config.d.ts +17 -1
  23. package/build/models/config.js +38 -0
  24. package/build/plugins/vite-livemark.d.ts +12 -0
  25. package/build/plugins/vite-livemark.js +165 -0
  26. package/build/routes/__root.js +68 -0
  27. package/build/settings.d.ts +9 -0
  28. package/build/settings.js +25 -0
  29. package/build/vite.config.js +30 -0
  30. package/package.json +9 -7
  31. package/source/actions/changelog/build.ts +26 -9
  32. package/source/actions/config/load.ts +21 -6
  33. package/source/actions/config/load.unit.ts +19 -2
  34. package/source/actions/target/build.ts +89 -0
  35. package/source/commands/build.ts +1 -0
  36. package/source/commands/escape.ts +18 -11
  37. package/source/commands/preview.ts +1 -0
  38. package/source/commands/start.ts +1 -0
  39. package/source/components/Breadcrumbs.tsx +2 -1
  40. package/source/components/Layout.tsx +3 -2
  41. package/source/components/SidebarArticles.tsx +2 -1
  42. package/source/components/SidebarLinks.tsx +2 -1
  43. package/source/components/SidebarSections.tsx +2 -1
  44. package/source/components/SiteTitle.tsx +5 -10
  45. package/source/content/article.ts +2 -1
  46. package/source/content/tag.ts +2 -1
  47. package/source/content-collections.ts +1 -1
  48. package/source/env.d.ts +2 -2
  49. package/source/models/config.ts +22 -1
  50. package/source/plugins/vite-livemark.ts +168 -94
  51. package/source/routeTree.gen.ts +86 -0
  52. package/source/routes/__root.tsx +7 -9
  53. package/source/settings.ts +13 -2
  54. package/source/vite.config.ts +4 -78
  55. package/target/actions/changelog/build.d.ts +0 -15
  56. package/target/actions/changelog/build.js +0 -187
  57. package/target/actions/config/load.d.ts +0 -5
  58. package/target/actions/config/load.js +0 -25
  59. package/target/actions/config/load.unit.js +0 -25
  60. package/target/commands/build.js +0 -14
  61. package/target/commands/escape.js +0 -56
  62. package/target/commands/preview.js +0 -18
  63. package/target/commands/start.js +0 -19
  64. package/target/components/Breadcrumbs.js +0 -13
  65. package/target/components/Layout.js +0 -65
  66. package/target/components/SidebarArticles.js +0 -45
  67. package/target/components/SidebarLinks.js +0 -26
  68. package/target/components/SidebarSections.js +0 -36
  69. package/target/components/SiteTitle.js +0 -12
  70. package/target/content/article.js +0 -54
  71. package/target/content/tag.js +0 -30
  72. package/target/content-collections.js +0 -218
  73. package/target/models/config.js +0 -34
  74. package/target/plugins/vite-livemark.d.ts +0 -18
  75. package/target/plugins/vite-livemark.js +0 -111
  76. package/target/routes/__root.js +0 -69
  77. package/target/settings.d.ts +0 -5
  78. package/target/settings.js +0 -15
  79. package/target/vite.config.js +0 -89
  80. package/{target → build}/actions/changelog/build.unit.d.ts +0 -0
  81. package/{target → build}/actions/changelog/build.unit.js +0 -0
  82. package/{target → build}/actions/config/define.d.ts +0 -0
  83. package/{target → build}/actions/config/define.js +0 -0
  84. package/{target → build}/actions/config/define.unit.d.ts +0 -0
  85. package/{target → build}/actions/config/define.unit.js +0 -0
  86. package/{target → build}/actions/config/load.unit.d.ts +0 -0
  87. package/{target → build}/client.d.ts +0 -0
  88. package/{target → build}/client.js +0 -0
  89. package/{target → build}/commands/build.d.ts +0 -0
  90. package/{target → build}/commands/preview.d.ts +0 -0
  91. package/{target → build}/commands/start.d.ts +0 -0
  92. package/{target → build}/components/Abbr.d.ts +0 -0
  93. package/{target → build}/components/Abbr.js +0 -0
  94. package/{target → build}/components/AnsiCode.d.ts +0 -0
  95. package/{target → build}/components/AnsiCode.js +0 -0
  96. package/{target → build}/components/Article.d.ts +0 -0
  97. package/{target → build}/components/Article.js +0 -0
  98. package/{target → build}/components/BackToTop.d.ts +0 -0
  99. package/{target → build}/components/BackToTop.js +0 -0
  100. package/{target → build}/components/Banner.d.ts +0 -0
  101. package/{target → build}/components/Banner.js +0 -0
  102. package/{target → build}/components/BlogIndex.d.ts +0 -0
  103. package/{target → build}/components/BlogIndex.js +0 -0
  104. package/{target → build}/components/Breadcrumbs.d.ts +0 -0
  105. package/{target → build}/components/Callout.d.ts +0 -0
  106. package/{target → build}/components/Callout.js +0 -0
  107. package/{target → build}/components/Card.d.ts +0 -0
  108. package/{target → build}/components/Card.js +0 -0
  109. package/{target → build}/components/Cards.d.ts +0 -0
  110. package/{target → build}/components/Cards.js +0 -0
  111. package/{target → build}/components/ChangelogIndex.d.ts +0 -0
  112. package/{target → build}/components/ChangelogIndex.js +0 -0
  113. package/{target → build}/components/CodeBlock.d.ts +0 -0
  114. package/{target → build}/components/CodeBlock.js +0 -0
  115. package/{target → build}/components/CodeTabs.d.ts +0 -0
  116. package/{target → build}/components/CodeTabs.js +0 -0
  117. package/{target → build}/components/Column.d.ts +0 -0
  118. package/{target → build}/components/Column.js +0 -0
  119. package/{target → build}/components/Columns.d.ts +0 -0
  120. package/{target → build}/components/Columns.js +0 -0
  121. package/{target → build}/components/Content.d.ts +0 -0
  122. package/{target → build}/components/Content.js +0 -0
  123. package/{target → build}/components/ContentTab.d.ts +0 -0
  124. package/{target → build}/components/ContentTab.js +0 -0
  125. package/{target → build}/components/ContentTabs.d.ts +0 -0
  126. package/{target → build}/components/ContentTabs.js +0 -0
  127. package/{target → build}/components/DefaultCatchBoundary.d.ts +0 -0
  128. package/{target → build}/components/DefaultCatchBoundary.js +0 -0
  129. package/{target → build}/components/DefinitionList.d.ts +0 -0
  130. package/{target → build}/components/DefinitionList.js +0 -0
  131. package/{target → build}/components/Details.d.ts +0 -0
  132. package/{target → build}/components/Details.js +0 -0
  133. package/{target → build}/components/FileTree.d.ts +0 -0
  134. package/{target → build}/components/FileTree.js +0 -0
  135. package/{target → build}/components/Footer.d.ts +0 -0
  136. package/{target → build}/components/Footer.js +0 -0
  137. package/{target → build}/components/FootnoteRef.d.ts +0 -0
  138. package/{target → build}/components/FootnoteRef.js +0 -0
  139. package/{target → build}/components/Heading.d.ts +0 -0
  140. package/{target → build}/components/Heading.js +0 -0
  141. package/{target → build}/components/InlineBadge.d.ts +0 -0
  142. package/{target → build}/components/InlineBadge.js +0 -0
  143. package/{target → build}/components/InlineIcon.d.ts +0 -0
  144. package/{target → build}/components/InlineIcon.js +0 -0
  145. package/{target → build}/components/InlineToc.d.ts +0 -0
  146. package/{target → build}/components/InlineToc.js +0 -0
  147. package/{target → build}/components/Layout.d.ts +0 -0
  148. package/{target → build}/components/LinkButton.d.ts +0 -0
  149. package/{target → build}/components/LinkButton.js +0 -0
  150. package/{target → build}/components/Mermaid.d.ts +0 -0
  151. package/{target → build}/components/Mermaid.js +0 -0
  152. package/{target → build}/components/MermaidRenderer.d.ts +0 -0
  153. package/{target → build}/components/MermaidRenderer.js +0 -0
  154. package/{target → build}/components/NotFound.d.ts +0 -0
  155. package/{target → build}/components/NotFound.js +0 -0
  156. package/{target → build}/components/PackageTabs.d.ts +0 -0
  157. package/{target → build}/components/PackageTabs.js +0 -0
  158. package/{target → build}/components/PageToolbar.d.ts +0 -0
  159. package/{target → build}/components/PageToolbar.js +0 -0
  160. package/{target → build}/components/PrevNext.d.ts +0 -0
  161. package/{target → build}/components/PrevNext.js +0 -0
  162. package/{target → build}/components/Search.d.ts +0 -0
  163. package/{target → build}/components/Search.js +0 -0
  164. package/{target → build}/components/SearchDialog.d.ts +0 -0
  165. package/{target → build}/components/SearchDialog.js +0 -0
  166. package/{target → build}/components/Section.d.ts +0 -0
  167. package/{target → build}/components/Section.js +0 -0
  168. package/{target → build}/components/SectionHeader.d.ts +0 -0
  169. package/{target → build}/components/SectionHeader.js +0 -0
  170. package/{target → build}/components/Sidebar.d.ts +0 -0
  171. package/{target → build}/components/Sidebar.js +0 -0
  172. package/{target → build}/components/SidebarArticles.d.ts +0 -0
  173. package/{target → build}/components/SidebarLinks.d.ts +0 -0
  174. package/{target → build}/components/SidebarPosts.d.ts +0 -0
  175. package/{target → build}/components/SidebarPosts.js +0 -0
  176. package/{target → build}/components/SidebarReleases.d.ts +0 -0
  177. package/{target → build}/components/SidebarReleases.js +0 -0
  178. package/{target → build}/components/SidebarSections.d.ts +0 -0
  179. package/{target → build}/components/SiteTitle.d.ts +0 -0
  180. package/{target → build}/components/SortableTable.d.ts +0 -0
  181. package/{target → build}/components/SortableTable.js +0 -0
  182. package/{target → build}/components/SoundCloud.d.ts +0 -0
  183. package/{target → build}/components/SoundCloud.js +0 -0
  184. package/{target → build}/components/TagIndex.d.ts +0 -0
  185. package/{target → build}/components/TagIndex.js +0 -0
  186. package/{target → build}/components/Theme.d.ts +0 -0
  187. package/{target → build}/components/Theme.js +0 -0
  188. package/{target → build}/components/Toc.d.ts +0 -0
  189. package/{target → build}/components/Toc.js +0 -0
  190. package/{target → build}/components/YouTube.d.ts +0 -0
  191. package/{target → build}/components/YouTube.js +0 -0
  192. package/{target → build}/components/ZoomImage.d.ts +0 -0
  193. package/{target → build}/components/ZoomImage.js +0 -0
  194. package/{target → build}/content/article.d.ts +5 -5
  195. /package/{target → build}/content/tag.d.ts +0 -0
  196. /package/{target → build}/content-collections.d.ts +0 -0
  197. /package/{target → build}/elements/accordion.d.ts +0 -0
  198. /package/{target → build}/elements/accordion.js +0 -0
  199. /package/{target → build}/elements/alert-dialog.d.ts +0 -0
  200. /package/{target → build}/elements/alert-dialog.js +0 -0
  201. /package/{target → build}/elements/alert.d.ts +0 -0
  202. /package/{target → build}/elements/alert.js +0 -0
  203. /package/{target → build}/elements/aspect-ratio.d.ts +0 -0
  204. /package/{target → build}/elements/aspect-ratio.js +0 -0
  205. /package/{target → build}/elements/avatar.d.ts +0 -0
  206. /package/{target → build}/elements/avatar.js +0 -0
  207. /package/{target → build}/elements/badge.d.ts +0 -0
  208. /package/{target → build}/elements/badge.js +0 -0
  209. /package/{target → build}/elements/breadcrumb.d.ts +0 -0
  210. /package/{target → build}/elements/breadcrumb.js +0 -0
  211. /package/{target → build}/elements/button-group.d.ts +0 -0
  212. /package/{target → build}/elements/button-group.js +0 -0
  213. /package/{target → build}/elements/button.d.ts +0 -0
  214. /package/{target → build}/elements/button.js +0 -0
  215. /package/{target → build}/elements/calendar.d.ts +0 -0
  216. /package/{target → build}/elements/calendar.js +0 -0
  217. /package/{target → build}/elements/card.d.ts +0 -0
  218. /package/{target → build}/elements/card.js +0 -0
  219. /package/{target → build}/elements/carousel.d.ts +0 -0
  220. /package/{target → build}/elements/carousel.js +0 -0
  221. /package/{target → build}/elements/chart.d.ts +0 -0
  222. /package/{target → build}/elements/chart.js +0 -0
  223. /package/{target → build}/elements/checkbox.d.ts +0 -0
  224. /package/{target → build}/elements/checkbox.js +0 -0
  225. /package/{target → build}/elements/collapsible.d.ts +0 -0
  226. /package/{target → build}/elements/collapsible.js +0 -0
  227. /package/{target → build}/elements/command.d.ts +0 -0
  228. /package/{target → build}/elements/command.js +0 -0
  229. /package/{target → build}/elements/context-menu.d.ts +0 -0
  230. /package/{target → build}/elements/context-menu.js +0 -0
  231. /package/{target → build}/elements/dialog.d.ts +0 -0
  232. /package/{target → build}/elements/dialog.js +0 -0
  233. /package/{target → build}/elements/direction.d.ts +0 -0
  234. /package/{target → build}/elements/direction.js +0 -0
  235. /package/{target → build}/elements/drawer.d.ts +0 -0
  236. /package/{target → build}/elements/drawer.js +0 -0
  237. /package/{target → build}/elements/dropdown-menu.d.ts +0 -0
  238. /package/{target → build}/elements/dropdown-menu.js +0 -0
  239. /package/{target → build}/elements/empty.d.ts +0 -0
  240. /package/{target → build}/elements/empty.js +0 -0
  241. /package/{target → build}/elements/field.d.ts +0 -0
  242. /package/{target → build}/elements/field.js +0 -0
  243. /package/{target → build}/elements/hover-card.d.ts +0 -0
  244. /package/{target → build}/elements/hover-card.js +0 -0
  245. /package/{target → build}/elements/input-group.d.ts +0 -0
  246. /package/{target → build}/elements/input-group.js +0 -0
  247. /package/{target → build}/elements/input-otp.d.ts +0 -0
  248. /package/{target → build}/elements/input-otp.js +0 -0
  249. /package/{target → build}/elements/input.d.ts +0 -0
  250. /package/{target → build}/elements/input.js +0 -0
  251. /package/{target → build}/elements/item.d.ts +0 -0
  252. /package/{target → build}/elements/item.js +0 -0
  253. /package/{target → build}/elements/kbd.d.ts +0 -0
  254. /package/{target → build}/elements/kbd.js +0 -0
  255. /package/{target → build}/elements/label.d.ts +0 -0
  256. /package/{target → build}/elements/label.js +0 -0
  257. /package/{target → build}/elements/menubar.d.ts +0 -0
  258. /package/{target → build}/elements/menubar.js +0 -0
  259. /package/{target → build}/elements/native-select.d.ts +0 -0
  260. /package/{target → build}/elements/native-select.js +0 -0
  261. /package/{target → build}/elements/navigation-menu.d.ts +0 -0
  262. /package/{target → build}/elements/navigation-menu.js +0 -0
  263. /package/{target → build}/elements/pagination.d.ts +0 -0
  264. /package/{target → build}/elements/pagination.js +0 -0
  265. /package/{target → build}/elements/popover.d.ts +0 -0
  266. /package/{target → build}/elements/popover.js +0 -0
  267. /package/{target → build}/elements/progress.d.ts +0 -0
  268. /package/{target → build}/elements/progress.js +0 -0
  269. /package/{target → build}/elements/radio-group.d.ts +0 -0
  270. /package/{target → build}/elements/radio-group.js +0 -0
  271. /package/{target → build}/elements/resizable.d.ts +0 -0
  272. /package/{target → build}/elements/resizable.js +0 -0
  273. /package/{target → build}/elements/scroll-area.d.ts +0 -0
  274. /package/{target → build}/elements/scroll-area.js +0 -0
  275. /package/{target → build}/elements/select.d.ts +0 -0
  276. /package/{target → build}/elements/select.js +0 -0
  277. /package/{target → build}/elements/separator.d.ts +0 -0
  278. /package/{target → build}/elements/separator.js +0 -0
  279. /package/{target → build}/elements/sheet.d.ts +0 -0
  280. /package/{target → build}/elements/sheet.js +0 -0
  281. /package/{target → build}/elements/sidebar.d.ts +0 -0
  282. /package/{target → build}/elements/sidebar.js +0 -0
  283. /package/{target → build}/elements/skeleton.d.ts +0 -0
  284. /package/{target → build}/elements/skeleton.js +0 -0
  285. /package/{target → build}/elements/slider.d.ts +0 -0
  286. /package/{target → build}/elements/slider.js +0 -0
  287. /package/{target → build}/elements/sonner.d.ts +0 -0
  288. /package/{target → build}/elements/sonner.js +0 -0
  289. /package/{target → build}/elements/spinner.d.ts +0 -0
  290. /package/{target → build}/elements/spinner.js +0 -0
  291. /package/{target → build}/elements/switch.d.ts +0 -0
  292. /package/{target → build}/elements/switch.js +0 -0
  293. /package/{target → build}/elements/table.d.ts +0 -0
  294. /package/{target → build}/elements/table.js +0 -0
  295. /package/{target → build}/elements/tabs.d.ts +0 -0
  296. /package/{target → build}/elements/tabs.js +0 -0
  297. /package/{target → build}/elements/textarea.d.ts +0 -0
  298. /package/{target → build}/elements/textarea.js +0 -0
  299. /package/{target → build}/elements/toggle-group.d.ts +0 -0
  300. /package/{target → build}/elements/toggle-group.js +0 -0
  301. /package/{target → build}/elements/toggle.d.ts +0 -0
  302. /package/{target → build}/elements/toggle.js +0 -0
  303. /package/{target → build}/elements/tooltip.d.ts +0 -0
  304. /package/{target → build}/elements/tooltip.js +0 -0
  305. /package/{target → build}/entrypoints/main.d.ts +0 -0
  306. /package/{target → build}/entrypoints/main.js +0 -0
  307. /package/{target → build}/helpers/article-icon.d.ts +0 -0
  308. /package/{target → build}/helpers/article-icon.js +0 -0
  309. /package/{target → build}/helpers/article.d.ts +0 -0
  310. /package/{target → build}/helpers/article.js +0 -0
  311. /package/{target → build}/helpers/changelog-source.d.ts +0 -0
  312. /package/{target → build}/helpers/changelog-source.js +0 -0
  313. /package/{target → build}/helpers/changelog-source.unit.d.ts +0 -0
  314. /package/{target → build}/helpers/changelog-source.unit.js +0 -0
  315. /package/{target → build}/helpers/dynamic-icon-resolver.d.ts +0 -0
  316. /package/{target → build}/helpers/dynamic-icon-resolver.js +0 -0
  317. /package/{target → build}/helpers/dynamic-icon.d.ts +0 -0
  318. /package/{target → build}/helpers/dynamic-icon.js +0 -0
  319. /package/{target → build}/helpers/favicon.d.ts +0 -0
  320. /package/{target → build}/helpers/favicon.js +0 -0
  321. /package/{target → build}/helpers/model.d.ts +0 -0
  322. /package/{target → build}/helpers/model.js +0 -0
  323. /package/{target → build}/helpers/program.d.ts +0 -0
  324. /package/{target → build}/helpers/program.js +0 -0
  325. /package/{target → build}/helpers/resolve-asset-path.d.ts +0 -0
  326. /package/{target → build}/helpers/resolve-asset-path.js +0 -0
  327. /package/{target → build}/helpers/resolve-includes.d.ts +0 -0
  328. /package/{target → build}/helpers/resolve-includes.js +0 -0
  329. /package/{target → build}/helpers/resolve-includes.unit.d.ts +0 -0
  330. /package/{target → build}/helpers/resolve-includes.unit.js +0 -0
  331. /package/{target → build}/helpers/search-text.d.ts +0 -0
  332. /package/{target → build}/helpers/search-text.js +0 -0
  333. /package/{target → build}/helpers/section.d.ts +0 -0
  334. /package/{target → build}/helpers/section.js +0 -0
  335. /package/{target → build}/helpers/section.unit.d.ts +0 -0
  336. /package/{target → build}/helpers/section.unit.js +0 -0
  337. /package/{target → build}/helpers/theme.d.ts +0 -0
  338. /package/{target → build}/helpers/theme.js +0 -0
  339. /package/{target → build}/helpers/toc-context.d.ts +0 -0
  340. /package/{target → build}/helpers/toc-context.js +0 -0
  341. /package/{target → build}/helpers/toc.d.ts +0 -0
  342. /package/{target → build}/helpers/toc.js +0 -0
  343. /package/{target → build}/helpers/toc.unit.d.ts +0 -0
  344. /package/{target → build}/helpers/toc.unit.js +0 -0
  345. /package/{target → build}/hooks/in-view.d.ts +0 -0
  346. /package/{target → build}/hooks/in-view.js +0 -0
  347. /package/{target → build}/hooks/media.d.ts +0 -0
  348. /package/{target → build}/hooks/media.js +0 -0
  349. /package/{target → build}/index.d.ts +0 -0
  350. /package/{target → build}/index.js +0 -0
  351. /package/{target → build}/models/article.d.ts +0 -0
  352. /package/{target → build}/models/article.js +0 -0
  353. /package/{target → build}/models/link.d.ts +0 -0
  354. /package/{target → build}/models/link.js +0 -0
  355. /package/{target → build}/models/patch.d.ts +0 -0
  356. /package/{target → build}/models/patch.js +0 -0
  357. /package/{target → build}/models/section.d.ts +0 -0
  358. /package/{target → build}/models/section.js +0 -0
  359. /package/{target → build}/models/theme.d.ts +0 -0
  360. /package/{target → build}/models/theme.js +0 -0
  361. /package/{target → build}/models/toc.d.ts +0 -0
  362. /package/{target → build}/models/toc.js +0 -0
  363. /package/{target → build}/plugins/rehype-inline-code.d.ts +0 -0
  364. /package/{target → build}/plugins/rehype-inline-code.js +0 -0
  365. /package/{target → build}/plugins/rehype-task-list-a11y.d.ts +0 -0
  366. /package/{target → build}/plugins/rehype-task-list-a11y.js +0 -0
  367. /package/{target → build}/plugins/remark-abbr.d.ts +0 -0
  368. /package/{target → build}/plugins/remark-abbr.js +0 -0
  369. /package/{target → build}/plugins/remark-abbr.unit.d.ts +0 -0
  370. /package/{target → build}/plugins/remark-abbr.unit.js +0 -0
  371. /package/{target → build}/plugins/remark-ansi.d.ts +0 -0
  372. /package/{target → build}/plugins/remark-ansi.js +0 -0
  373. /package/{target → build}/plugins/remark-ansi.unit.d.ts +0 -0
  374. /package/{target → build}/plugins/remark-ansi.unit.js +0 -0
  375. /package/{target → build}/plugins/remark-badge.d.ts +0 -0
  376. /package/{target → build}/plugins/remark-badge.js +0 -0
  377. /package/{target → build}/plugins/remark-badge.unit.d.ts +0 -0
  378. /package/{target → build}/plugins/remark-badge.unit.js +0 -0
  379. /package/{target → build}/plugins/remark-button.d.ts +0 -0
  380. /package/{target → build}/plugins/remark-button.js +0 -0
  381. /package/{target → build}/plugins/remark-button.unit.d.ts +0 -0
  382. /package/{target → build}/plugins/remark-button.unit.js +0 -0
  383. /package/{target → build}/plugins/remark-callout.d.ts +0 -0
  384. /package/{target → build}/plugins/remark-callout.js +0 -0
  385. /package/{target → build}/plugins/remark-card.d.ts +0 -0
  386. /package/{target → build}/plugins/remark-card.js +0 -0
  387. /package/{target → build}/plugins/remark-code-tabs.d.ts +0 -0
  388. /package/{target → build}/plugins/remark-code-tabs.js +0 -0
  389. /package/{target → build}/plugins/remark-columns.d.ts +0 -0
  390. /package/{target → build}/plugins/remark-columns.js +0 -0
  391. /package/{target → build}/plugins/remark-custom-heading-id.d.ts +0 -0
  392. /package/{target → build}/plugins/remark-custom-heading-id.js +0 -0
  393. /package/{target → build}/plugins/remark-custom-heading-id.unit.d.ts +0 -0
  394. /package/{target → build}/plugins/remark-custom-heading-id.unit.js +0 -0
  395. /package/{target → build}/plugins/remark-deflist.d.ts +0 -0
  396. /package/{target → build}/plugins/remark-deflist.js +0 -0
  397. /package/{target → build}/plugins/remark-details.d.ts +0 -0
  398. /package/{target → build}/plugins/remark-details.js +0 -0
  399. /package/{target → build}/plugins/remark-filetree.d.ts +0 -0
  400. /package/{target → build}/plugins/remark-filetree.js +0 -0
  401. /package/{target → build}/plugins/remark-filetree.unit.d.ts +0 -0
  402. /package/{target → build}/plugins/remark-filetree.unit.js +0 -0
  403. /package/{target → build}/plugins/remark-github-callout.d.ts +0 -0
  404. /package/{target → build}/plugins/remark-github-callout.js +0 -0
  405. /package/{target → build}/plugins/remark-icon.d.ts +0 -0
  406. /package/{target → build}/plugins/remark-icon.js +0 -0
  407. /package/{target → build}/plugins/remark-image.d.ts +0 -0
  408. /package/{target → build}/plugins/remark-image.js +0 -0
  409. /package/{target → build}/plugins/remark-media.d.ts +0 -0
  410. /package/{target → build}/plugins/remark-media.js +0 -0
  411. /package/{target → build}/plugins/remark-media.unit.d.ts +0 -0
  412. /package/{target → build}/plugins/remark-media.unit.js +0 -0
  413. /package/{target → build}/plugins/remark-mermaid.d.ts +0 -0
  414. /package/{target → build}/plugins/remark-mermaid.js +0 -0
  415. /package/{target → build}/plugins/remark-npm.d.ts +0 -0
  416. /package/{target → build}/plugins/remark-npm.js +0 -0
  417. /package/{target → build}/plugins/remark-passthrough-directive.d.ts +0 -0
  418. /package/{target → build}/plugins/remark-passthrough-directive.js +0 -0
  419. /package/{target → build}/plugins/remark-steps.d.ts +0 -0
  420. /package/{target → build}/plugins/remark-steps.js +0 -0
  421. /package/{target → build}/plugins/remark-steps.unit.d.ts +0 -0
  422. /package/{target → build}/plugins/remark-steps.unit.js +0 -0
  423. /package/{target → build}/plugins/remark-tab.d.ts +0 -0
  424. /package/{target → build}/plugins/remark-tab.js +0 -0
  425. /package/{target → build}/plugins/remark-tab.unit.d.ts +0 -0
  426. /package/{target → build}/plugins/remark-tab.unit.js +0 -0
  427. /package/{target → build}/plugins/remark-toc.d.ts +0 -0
  428. /package/{target → build}/plugins/remark-toc.js +0 -0
  429. /package/{target → build}/plugins/remark-toc.unit.d.ts +0 -0
  430. /package/{target → build}/plugins/remark-toc.unit.js +0 -0
  431. /package/{target → build}/plugins/shiki-icon.d.ts +0 -0
  432. /package/{target → build}/plugins/shiki-icon.js +0 -0
  433. /package/{target → build}/plugins/shiki-line-highlight.d.ts +0 -0
  434. /package/{target → build}/plugins/shiki-line-highlight.js +0 -0
  435. /package/{target → build}/program.d.ts +0 -0
  436. /package/{target → build}/program.js +0 -0
  437. /package/{target → build}/routeTree.gen.d.ts +0 -0
  438. /package/{target → build}/routeTree.gen.js +0 -0
  439. /package/{target → build}/router.d.ts +0 -0
  440. /package/{target → build}/router.js +0 -0
  441. /package/{target → build}/routes/$.d.ts +0 -0
  442. /package/{target → build}/routes/$.js +0 -0
  443. /package/{target → build}/routes/__root.d.ts +0 -0
  444. /package/{target → build}/server.d.ts +0 -0
  445. /package/{target → build}/server.js +0 -0
  446. /package/{target → build}/utils/style.d.ts +0 -0
  447. /package/{target → build}/utils/style.js +0 -0
  448. /package/{target → build}/vite.config.d.ts +0 -0
@@ -0,0 +1,20 @@
1
+ import { join } from "node:path";
2
+ import { Command } from "commander";
3
+ import { createServer } from "vite";
4
+ const configFile = join(import.meta.dirname, "..", "..", "source", "vite.config.ts");
5
+ /**
6
+ * Start a development server.
7
+ */
8
+ export const start = new Command("start")
9
+ .description("Start a live server")
10
+ .option("--clear", "Wipe and fully rebuild the runtime target dir")
11
+ .action(async () => {
12
+ const server = await createServer({
13
+ configFile,
14
+ server: { port: 8000, host: true },
15
+ });
16
+ await server.listen();
17
+ server.printUrls();
18
+ server.bindCLIShortcuts({ print: true });
19
+ });
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tbWFuZHMvc3RhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ25DLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUNyQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQ25CLElBQUksRUFDSixJQUFJLEVBQ0osUUFBUSxFQUNSLGdCQUFnQixDQUNqQixDQUFBO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO0tBQ3RDLFdBQVcsQ0FBQyxxQkFBcUIsQ0FBQztLQUNsQyxNQUFNLENBQUMsU0FBUyxFQUFFLCtDQUErQyxDQUFDO0tBQ2xFLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQztRQUNoQyxVQUFVO1FBQ1YsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0tBQ25DLENBQUMsQ0FBQTtJQUNGLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFBO0lBQ3JCLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQTtJQUNsQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtBQUMxQyxDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCJcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCJcbmltcG9ydCB7IGNyZWF0ZVNlcnZlciB9IGZyb20gXCJ2aXRlXCJcblxuY29uc3QgY29uZmlnRmlsZSA9IGpvaW4oXG4gIGltcG9ydC5tZXRhLmRpcm5hbWUsXG4gIFwiLi5cIixcbiAgXCIuLlwiLFxuICBcInNvdXJjZVwiLFxuICBcInZpdGUuY29uZmlnLnRzXCIsXG4pXG5cbi8qKlxuICogU3RhcnQgYSBkZXZlbG9wbWVudCBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzdGFydCA9IG5ldyBDb21tYW5kKFwic3RhcnRcIilcbiAgLmRlc2NyaXB0aW9uKFwiU3RhcnQgYSBsaXZlIHNlcnZlclwiKVxuICAub3B0aW9uKFwiLS1jbGVhclwiLCBcIldpcGUgYW5kIGZ1bGx5IHJlYnVpbGQgdGhlIHJ1bnRpbWUgdGFyZ2V0IGRpclwiKVxuICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBjcmVhdGVTZXJ2ZXIoe1xuICAgICAgY29uZmlnRmlsZSxcbiAgICAgIHNlcnZlcjogeyBwb3J0OiA4MDAwLCBob3N0OiB0cnVlIH0sXG4gICAgfSlcbiAgICBhd2FpdCBzZXJ2ZXIubGlzdGVuKClcbiAgICBzZXJ2ZXIucHJpbnRVcmxzKClcbiAgICBzZXJ2ZXIuYmluZENMSVNob3J0Y3V0cyh7IHByaW50OiB0cnVlIH0pXG4gIH0pXG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { config } from "livemark:virtual";
3
+ import { Link, useLocation, useMatches } from "@tanstack/react-router";
4
+ import { currentSection } from "../content/article.js";
5
+ export function Breadcrumbs() {
6
+ const matches = useMatches();
7
+ const last = matches[matches.length - 1];
8
+ const loaderData = last?.loaderData;
9
+ const pathname = useLocation({ select: l => l.pathname });
10
+ const section = currentSection(`/${pathname.replace(/^\/|\/$/g, "")}/`);
11
+ return (_jsxs("nav", { className: "flex items-center gap-1.5 text-sm text-muted-foreground", children: [
12
+ _jsx(Link, { to: "/", className: "hover:text-foreground transition-colors", children: section?.title ?? config.title }), _jsx("span", { children: "/" }), loaderData?.title && (_jsx("span", { className: "text-foreground font-medium", children: loaderData.title }))] }));
13
+ }
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJlYWRjcnVtYnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zb3VyY2UvY29tcG9uZW50cy9CcmVhZGNydW1icy50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFdEQsTUFBTSxVQUFVLFdBQVc7SUFDekIsTUFBTSxPQUFPLEdBQUcsVUFBVSxFQUFFLENBQUE7SUFDNUIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUE7SUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxFQUFFLFVBQTRDLENBQUE7SUFDckUsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDekQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBRXZFLE9BQU8sQ0FDTCxlQUFLLFNBQVMsRUFBQyx5REFBeUQ7WUFDdEUsS0FBQyxJQUFJLElBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxTQUFTLEVBQUMseUNBQXlDLFlBQzdELE9BQU8sRUFBRSxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssR0FDMUIsRUFDUCwrQkFBYyxFQUNiLFVBQVUsRUFBRSxLQUFLLElBQUksQ0FDcEIsZUFBTSxTQUFTLEVBQUMsNkJBQTZCLFlBQUUsVUFBVSxDQUFDLEtBQUssR0FBUSxDQUN4RSxJQUNHLENBQ1AsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25maWcgfSBmcm9tIFwibGl2ZW1hcms6dmlydHVhbFwiXG5pbXBvcnQgeyBMaW5rLCB1c2VMb2NhdGlvbiwgdXNlTWF0Y2hlcyB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyXCJcbmltcG9ydCB7IGN1cnJlbnRTZWN0aW9uIH0gZnJvbSBcIi4uL2NvbnRlbnQvYXJ0aWNsZS50c1wiXG5cbmV4cG9ydCBmdW5jdGlvbiBCcmVhZGNydW1icygpIHtcbiAgY29uc3QgbWF0Y2hlcyA9IHVzZU1hdGNoZXMoKVxuICBjb25zdCBsYXN0ID0gbWF0Y2hlc1ttYXRjaGVzLmxlbmd0aCAtIDFdXG4gIGNvbnN0IGxvYWRlckRhdGEgPSBsYXN0Py5sb2FkZXJEYXRhIGFzIHsgdGl0bGU/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZFxuICBjb25zdCBwYXRobmFtZSA9IHVzZUxvY2F0aW9uKHsgc2VsZWN0OiBsID0+IGwucGF0aG5hbWUgfSlcbiAgY29uc3Qgc2VjdGlvbiA9IGN1cnJlbnRTZWN0aW9uKGAvJHtwYXRobmFtZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIil9L2ApXG5cbiAgcmV0dXJuIChcbiAgICA8bmF2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC1zbSB0ZXh0LW11dGVkLWZvcmVncm91bmRcIj5cbiAgICAgIDxMaW5rIHRvPVwiL1wiIGNsYXNzTmFtZT1cImhvdmVyOnRleHQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9yc1wiPlxuICAgICAgICB7c2VjdGlvbj8udGl0bGUgPz8gY29uZmlnLnRpdGxlfVxuICAgICAgPC9MaW5rPlxuICAgICAgPHNwYW4+Lzwvc3Bhbj5cbiAgICAgIHtsb2FkZXJEYXRhPy50aXRsZSAmJiAoXG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtZm9yZWdyb3VuZCBmb250LW1lZGl1bVwiPntsb2FkZXJEYXRhLnRpdGxlfTwvc3Bhbj5cbiAgICAgICl9XG4gICAgPC9uYXY+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,66 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { config } from "livemark:virtual";
3
+ import { Link, useLocation, useMatch } from "@tanstack/react-router";
4
+ import { useHotkey } from "@tanstack/react-hotkeys";
5
+ import { ExternalLink } from "lucide-react";
6
+ import { currentSection, sectionFirstArticle, sectionFlatArticles, sortedArticles, } from "../content/article.js";
7
+ import { DynamicIcon } from "../helpers/dynamic-icon.js";
8
+ import { sectionIcon } from "../helpers/section.js";
9
+ import { SidebarInset, SidebarProvider, SidebarTrigger, useSidebar, } from "../elements/sidebar.js";
10
+ import { BackToTop } from "./BackToTop.js";
11
+ import { Banner } from "./Banner.js";
12
+ import { Sidebar } from "./Sidebar.js";
13
+ import { SiteTitle } from "./SiteTitle.js";
14
+ function splatFor(pathname) {
15
+ return { _splat: pathname.replace(/^\/|\/$/g, "") };
16
+ }
17
+ export function Layout(props) {
18
+ const pathname = useLocation({ select: l => l.pathname });
19
+ const articleRoute = useMatch({ from: "/$", shouldThrow: false });
20
+ const activeSection = articleRoute
21
+ ? currentSection(`/${pathname.replace(/^\/|\/$/g, "")}/`)
22
+ : undefined;
23
+ useHotkey("J", () => window.scrollBy({ top: window.innerHeight * 0.8, behavior: "smooth" }));
24
+ useHotkey("K", () => window.scrollBy({ top: -window.innerHeight * 0.8, behavior: "smooth" }));
25
+ const sections = config.sections;
26
+ const header = (_jsxs("header", { className: "sticky top-0 z-20 flex h-16 shrink-0 items-center border-b bg-background", children: [
27
+ _jsx("div", { className: `flex items-center self-stretch pl-4 ${props.withSidebar ? "pr-4" : "md:pr-20"}`, children: props.withSidebar ? (_jsxs(_Fragment, { children: [
28
+ _jsx("div", { className: "hidden md:flex", children: _jsx(SidebarTrigger, {}) }), _jsx(Link, { to: "/", className: "md:hidden flex items-center gap-2", children: _jsx(SiteTitle, {}) })
29
+ ] })) : (_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
30
+ .filter(section => section.position === "header")
31
+ .map(section => {
32
+ const isActive = activeSection?.prefix === section.prefix;
33
+ const target = section.type === "blog" || section.type === "changelog"
34
+ ? section.prefix
35
+ : sectionFirstArticle.get(section.prefix);
36
+ const latestVersion = section.type === "changelog" && section.version
37
+ ? sortedArticles.find(a => a.path === sectionFlatArticles.get(section.prefix)?.[0])?.title
38
+ : undefined;
39
+ return (_jsxs(Link, { to: target === "/" ? "/" : "/$", params: target && target !== "/" ? splatFor(target) : {}, className: `inline-flex items-center gap-1.5 text-foreground ${isActive
40
+ ? "font-medium border-b-2 border-foreground pb-0.5 -mb-0.5"
41
+ : "opacity-80 hover:opacity-100 transition-opacity"}`, children: [
42
+ _jsx(DynamicIcon, { name: sectionIcon(section), className: "size-3.5" }), _jsxs("span", { children: [section.title, latestVersion && (_jsxs("span", { className: "opacity-80", children: [" (", latestVersion, ")"] }))] })
43
+ ] }, section.prefix));
44
+ })) : (_jsx(Link, { to: "/", className: "text-foreground font-medium underline underline-offset-4", children: "Docs" })), config.links
45
+ ?.filter(link => link.position === "header" &&
46
+ (!link.prefix || link.prefix === activeSection?.prefix))
47
+ .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]" })
48
+ ] }, link.url))), _jsx(Banner, {})
49
+ ] }), _jsx("div", { className: "md:hidden ml-auto pr-2", children: _jsx(SidebarTrigger, {}) })
50
+ ] }));
51
+ return (_jsx(SidebarProvider, { defaultOpen: !!props.withSidebar, children: _jsx(SidebarShell, { withSidebar: props.withSidebar, header: header, children: props.children }) }, props.withSidebar ? "sidebar" : "mini"));
52
+ }
53
+ function SidebarShell(props) {
54
+ const { isMobile, setOpenMobile } = useSidebar();
55
+ const onClick = (event) => {
56
+ if (!isMobile)
57
+ return;
58
+ if (event.target.closest("a"))
59
+ setOpenMobile(false);
60
+ };
61
+ return (_jsxs("div", { style: { display: "contents" }, onClick: onClick, children: [
62
+ _jsx(Sidebar, { withSidebar: props.withSidebar }), _jsxs(SidebarInset, { children: [props.header, _jsx("main", { className: "flex-1", children: props.children }), _jsx(BackToTop, {})
63
+ ] })
64
+ ] }));
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvTGF5b3V0LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQTtBQUM5QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTZCLENBQUE7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUNmLGNBQWMsRUFDZCxVQUFVLEdBQ1gsTUFBTSx3QkFBeUIsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWlCLENBQUE7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWMsQ0FBQTtBQUNyQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sY0FBZSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBaUIsQ0FBQTtBQUUzQyxTQUFTLFFBQVEsQ0FBQyxRQUFnQjtJQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUE7QUFDckQsQ0FBQztBQUVELE1BQU0sVUFBVSxNQUFNLENBQUMsS0FHdEI7SUFDQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsRUFBRSxNQUFN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QyxRQUFRLEdBQVEsRUFDaEQsS0FBQyxTQUFTLEtBQUc7b0JBQ0E7WUFDWCxDQUNQLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuaW1wb3J0IHsgTGluaywgdXNlTG9jYXRpb24sIHVzZU1hdGNoIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIlxuaW1wb3J0IHsgdXNlSG90a2V5IH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1ob3RrZXlzXCJcbmltcG9ydCB7IEV4dGVybmFsTGluayB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIlxuaW1wb3J0IHtcbiAgY3VycmVudFNlY3Rpb24sXG4gIHNlY3Rpb25GaXJzdEFydGljbGUsXG4gIHNlY3Rpb25GbGF0QXJ0aWNsZXMsXG4gIHNvcnRlZEFydGljbGVzLFxufSBmcm9tIFwiLi4vY29udGVudC9hcnRpY2xlLnRzXCJcbmltcG9ydCB7IER5bmFtaWNJY29uIH0gZnJvbSBcIi4uL2hlbHBlcnMvZHluYW1pYy1pY29uLnRzeFwiXG5pbXBvcnQgeyBzZWN0aW9uSWNvbiB9IGZyb20gXCIuLi9oZWxwZXJzL3NlY3Rpb24udHNcIlxuaW1wb3J0IHtcbiAgU2lkZWJhckluc2V0LFxuICBTaWRlYmFyUHJvdmlkZXIsXG4gIFNpZGViYXJUcmlnZ2VyLFxuICB1c2VTaWRlYmFyLFxufSBmcm9tIFwiLi4vZWxlbWVudHMvc2lkZWJhci50c3hcIlxuaW1wb3J0IHsgQmFja1RvVG9wIH0gZnJvbSBcIi4vQmFja1RvVG9wLnRzeFwiXG5pbXBvcnQgeyBCYW5uZXIgfSBmcm9tIFwiLi9CYW5uZXIudHN4XCJcbmltcG9ydCB7IFNpZGViYXIgfSBmcm9tIFwiLi9TaWRlYmFyLnRzeFwiXG5pbXBvcnQgeyBTaXRlVGl0bGUgfSBmcm9tIFwiLi9TaXRlVGl0bGUudHN4XCJcblxuZnVuY3Rpb24gc3BsYXRGb3IocGF0aG5hbWU6IHN0cmluZykge1xuICByZXR1cm4geyBfc3BsYXQ6IHBhdGhuYW1lLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKSB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBMYXlvdXQocHJvcHM6IHtcbiAgd2l0aFNpZGViYXI/OiBib29sZWFuXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG59KSB7XG4gIGNvbnN0IHBhdGhuYW1lID0gdXNlTG9jYXRpb24oeyBzZWxlY3Q6IGwgPT4gbC5wYXRobmFtZSB9KVxuICBjb25zdCBhcnRpY2xlUm91dGUgPSB1c2VNYXRjaCh7IGZyb206IFwiLyRcIiwgc2hvdWxkVGhyb3c6IGZhbHNlIH0pXG4gIGNvbnN0IGFjdGl2ZVNlY3Rpb24gPSBhcnRpY2xlUm91dGVcbiAgICA/IGN1cnJlbnRTZWN0aW9uKGAvJHtwYXRobmFtZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIil9L2ApXG4gICAgOiB1bmRlZmluZWRcblxuICB1c2VIb3RrZXkoXCJKXCIsICgpID0+XG4gICAgd2luZG93LnNjcm9sbEJ5KHsgdG9wOiB3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjgsIGJlaGF2aW9yOiBcInNtb290aFwiIH0pLFxuICApXG4gIHVzZUhvdGtleShcIktcIiwgKCkgPT5cbiAgICB3aW5kb3cuc2Nyb2xsQnkoeyB0b3A6IC13aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjgsIGJlaGF2aW9yOiBcInNtb290aFwiIH0pLFxuICApXG5cbiAgY29uc3Qgc2VjdGlvbnMgPSBjb25maWcuc2VjdGlvbnNcblxuICBjb25zdCBoZWFkZXIgPSAoXG4gICAgPGhlYWRlciBjbGFzc05hbWU9XCJzdGlja3kgdG9wLTAgei0yMCBmbGV4IGgtMTYgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGJvcmRlci1iIGJnLWJhY2tncm91bmRcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtgZmxleCBpdGVtcy1jZW50ZXIgc2VsZi1zdHJldGNoIHBsLTQgJHtwcm9wcy53aXRoU2lkZWJhciA/IFwicHItNFwiIDogXCJtZDpwci0yMFwifWB9XG4gICAgICA+XG4gICAgICAgIHtwcm9wcy53aXRoU2lkZWJhciA/IChcbiAgICAgICAgICA8PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6ZmxleFwiPlxuICAgICAgICAgICAgICA8U2lkZWJhclRyaWdnZXIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPExpbmsgdG89XCIvXCIgY2xhc3NOYW1lPVwibWQ6aGlkZGVuIGZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxTaXRlVGl0bGUgLz5cbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8Lz5cbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8TGluayB0bz1cIi9cIiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPFNpdGVUaXRsZSAvPlxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6ZmxleCBmbGV4LTEgaXRlbXMtY2VudGVyIGdhcC04IHNlbGYtc3RyZXRjaCBweC02IHRleHQtc21cIj5cbiAgICAgICAge3NlY3Rpb25zPy5sZW5ndGggPyAoXG4gICAgICAgICAgc2VjdGlvbnNcbiAgICAgICAgICAgIC5maWx0ZXIoc2VjdGlvbiA9PiBzZWN0aW9uLnBvc2l0aW9uID09PSBcImhlYWRlclwiKVxuICAgICAgICAgICAgLm1hcChzZWN0aW9uID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSBhY3RpdmVTZWN0aW9uPy5wcmVmaXggPT09IHNlY3Rpb24ucHJlZml4XG4gICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgICAgc2VjdGlvbi50eXBlID09PSBcImJsb2dcIiB8fCBzZWN0aW9uLnR5cGUgPT09IFwiY2hhbmdlbG9nXCJcbiAgICAgICAgICAgICAgICAgID8gc2VjdGlvbi5wcmVmaXhcbiAgICAgICAgICAgICAgICAgIDogc2VjdGlvbkZpcnN0QXJ0aWNsZS5nZXQoc2VjdGlvbi5wcmVmaXgpXG4gICAgICAgICAgICAgIGNvbnN0IGxhdGVzdFZlcnNpb24gPVxuICAgICAgICAgICAgICAgIHNlY3Rpb24udHlwZSA9PT0gXCJjaGFuZ2Vsb2dcIiAmJiBzZWN0aW9uLnZlcnNpb25cbiAgICAgICAgICAgICAgICAgID8gc29ydGVkQXJ0aWNsZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICBhID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBhLnBhdGggPT09IHNlY3Rpb25GbGF0QXJ0aWNsZXMuZ2V0KHNlY3Rpb24ucHJlZml4KT8uWzBdLFxuICAgICAgICAgICAgICAgICAgICApPy50aXRsZVxuICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAga2V5PXtzZWN0aW9uLnByZWZpeH1cbiAgICAgICAgICAgICAgICAgIHRvPXt0YXJnZXQgPT09IFwiL1wiID8gXCIvXCIgOiBcIi8kXCJ9XG4gICAgICAgICAgICAgICAgICBwYXJhbXM9e3RhcmdldCAmJiB0YXJnZXQgIT09IFwiL1wiID8gc3BsYXRGb3IodGFyZ2V0KSA6IHt9fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xLjUgdGV4dC1mb3JlZ3JvdW5kICR7XG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImZvbnQtbWVkaXVtIGJvcmRlci1iLTIgYm9yZGVyLWZvcmVncm91bmQgcGItMC41IC1tYi0wLjVcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJvcGFjaXR5LTgwIGhvdmVyOm9wYWNpdHktMTAwIHRyYW5zaXRpb24tb3BhY2l0eVwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8RHluYW1pY0ljb25cbiAgICAgICAgICAgICAgICAgICAgbmFtZT17c2VjdGlvbkljb24oc2VjdGlvbil9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInNpemUtMy41XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3NlY3Rpb24udGl0bGV9XG4gICAgICAgICAgICAgICAgICAgIHtsYXRlc3RWZXJzaW9uICYmIChcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJvcGFjaXR5LTgwXCI+ICh7bGF0ZXN0VmVyc2lvbn0pPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKSA6IChcbiAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgdG89XCIvXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtZm9yZWdyb3VuZCBmb250LW1lZGl1bSB1bmRlcmxpbmUgdW5kZXJsaW5lLW9mZnNldC00XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBEb2NzXG4gICAgICAgICAgPC9MaW5rPlxuICAgICAgICApfVxuICAgICAgICB7Y29uZmlnLmxpbmtzXG4gICAgICAgICAgPy5maWx0ZXIoXG4gICAgICAgICAgICBsaW5rID0+XG4gICAgICAgICAgICAgIGxpbmsucG9zaXRpb24gPT09IFwiaGVhZGVyXCIgJiZcbiAgICAgICAgICAgICAgKCFsaW5rLnByZWZpeCB8fCBsaW5rLnByZWZpeCA9PT0gYWN0aXZlU2VjdGlvbj8ucHJlZml4KSxcbiAgICAgICAgICApXG4gICAgICAgICAgLm1hcChsaW5rID0+IChcbiAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgIGtleT17bGluay51cmx9XG4gICAgICAgICAgICAgIGhyZWY9e2xpbmsudXJsfVxuICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxuICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1mb3JlZ3JvdW5kIG9wYWNpdHktODAgaG92ZXI6b3BhY2l0eS0xMDAgdHJhbnNpdGlvbi1vcGFjaXR5XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2xpbmsuaWNvbiAmJiAoXG4gICAgICAgICAgICAgICAgPER5bmFtaWNJY29uXG4gICAgICAgICAgICAgICAgICBuYW1lPXtsaW5rLmljb259XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUgc2l6ZS0zLjUgYWxpZ24tWy0wLjEyNWVtXVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKX17XCIgXCJ9XG4gICAgICAgICAgICAgIHtsaW5rLnRpdGxlfXtcIiBcIn1cbiAgICAgICAgICAgICAgPEV4dGVybmFsTGluayBjbGFzc05hbWU9XCJpbmxpbmUgc2l6ZS0zIGFsaWduLVstMC4xMjVlbV1cIiAvPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICkpfVxuICAgICAgICA8QmFubmVyIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWQ6aGlkZGVuIG1sLWF1dG8gcHItMlwiPlxuICAgICAgICA8U2lkZWJhclRyaWdnZXIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvaGVhZGVyPlxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8U2lkZWJhclByb3ZpZGVyXG4gICAgICBrZXk9e3Byb3BzLndpdGhTaWRlYmFyID8gXCJzaWRlYmFyXCIgOiBcIm1pbmlcIn1cbiAgICAgIGRlZmF1bHRPcGVuPXshIXByb3BzLndpdGhTaWRlYmFyfVxuICAgID5cbiAgICAgIDxTaWRlYmFyU2hlbGwgd2l0aFNpZGViYXI9e3Byb3BzLndpdGhTaWRlYmFyfSBoZWFkZXI9e2hlYWRlcn0+XG4gICAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICAgIDwvU2lkZWJhclNoZWxsPlxuICAgIDwvU2lkZWJhclByb3ZpZGVyPlxuICApXG59XG5cbmZ1bmN0aW9uIFNpZGViYXJTaGVsbChwcm9wczoge1xuICB3aXRoU2lkZWJhcj86IGJvb2xlYW5cbiAgaGVhZGVyOiBSZWFjdC5SZWFjdE5vZGVcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbn0pIHtcbiAgY29uc3QgeyBpc01vYmlsZSwgc2V0T3Blbk1vYmlsZSB9ID0gdXNlU2lkZWJhcigpXG4gIGNvbnN0IG9uQ2xpY2sgPSAoZXZlbnQ6IFJlYWN0Lk1vdXNlRXZlbnQ8SFRNTERpdkVsZW1lbnQ+KSA9PiB7XG4gICAgaWYgKCFpc01vYmlsZSkgcmV0dXJuXG4gICAgaWYgKChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCJhXCIpKSBzZXRPcGVuTW9iaWxlKGZhbHNlKVxuICB9XG4gIHJldHVybiAoXG4gICAgPGRpdiBzdHlsZT17eyBkaXNwbGF5OiBcImNvbnRlbnRzXCIgfX0gb25DbGljaz17b25DbGlja30+XG4gICAgICA8U2lkZWJhciB3aXRoU2lkZWJhcj17cHJvcHMud2l0aFNpZGViYXJ9IC8+XG4gICAgICA8U2lkZWJhckluc2V0PlxuICAgICAgICB7cHJvcHMuaGVhZGVyfVxuICAgICAgICA8bWFpbiBjbGFzc05hbWU9XCJmbGV4LTFcIj57cHJvcHMuY2hpbGRyZW59PC9tYWluPlxuICAgICAgICA8QmFja1RvVG9wIC8+XG4gICAgICA8L1NpZGViYXJJbnNldD5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIl19
@@ -0,0 +1,46 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { config } from "livemark:virtual";
3
+ import { Link, useLocation } from "@tanstack/react-router";
4
+ import { ChevronRight } from "lucide-react";
5
+ import { articleGroups, currentSection, sectionArticleGroups, } from "../content/article.js";
6
+ import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "../elements/collapsible.js";
7
+ import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, } from "../elements/sidebar.js";
8
+ import { resolveArticleIcon } from "../helpers/article-icon.js";
9
+ /** Article-tree body slot for the Sidebar shell */
10
+ export function SidebarArticles() {
11
+ const pathname = useLocation({ select: l => l.pathname });
12
+ const configSections = config.sections;
13
+ const section = currentSection(`/${pathname.replace(/^\/|\/$/g, "")}/`);
14
+ const groups = configSections?.length
15
+ ? (sectionArticleGroups.get(section?.prefix ?? "__default__") ??
16
+ articleGroups)
17
+ : articleGroups;
18
+ return (_jsx(_Fragment, { children: groups.map((group, index) => (_jsxs(SidebarGroup, { children: [group.name && (_jsx(SidebarGroupLabel, { className: "uppercase font-mono text-xs tracking-widest", children: group.name })), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: group.nodes.map(node => (_jsx(NavNode, { node: node, currentPath: pathname }, node.path))) }) })
19
+ ] }, group.name ?? `__unnamed-${index}`))) }));
20
+ }
21
+ function splatFor(pathname) {
22
+ return { _splat: pathname.replace(/^\/|\/$/g, "") };
23
+ }
24
+ function isActive(articlePathname, currentPath) {
25
+ const normalized = `/${currentPath.replace(/^\/|\/$/g, "")}/`;
26
+ return articlePathname === normalized;
27
+ }
28
+ function NavNode(props) {
29
+ const { node, currentPath } = props;
30
+ const Icon = resolveArticleIcon(node.icon);
31
+ const active = isActive(node.path, currentPath);
32
+ if (node.children.length === 0) {
33
+ return (_jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { isActive: active, className: active ? "" : "opacity-75", render: _jsx(Link, { to: "/$", params: splatFor(node.path) }), children: [
34
+ _jsx(Icon, { className: "size-4" }), _jsx("span", { children: node.label ?? node.title })
35
+ ] }) }));
36
+ }
37
+ return (_jsx(SidebarMenuItem, { children: _jsxs(Collapsible, { defaultOpen: true, className: "group/collapsible", children: [
38
+ _jsxs(SidebarMenuButton, { isActive: active, className: active ? "" : "opacity-75", render: _jsx(Link, { to: "/$", params: splatFor(node.path) }), children: [
39
+ _jsx(Icon, { className: "size-4" }), _jsx("span", { children: node.label ?? node.title })
40
+ ] }), _jsx(CollapsibleTrigger, { "aria-label": `Toggle ${node.label ?? node.title} submenu`, className: "absolute right-1 top-1.5 p-1 rounded-md hover:bg-sidebar-accent", children: _jsx(ChevronRight, { className: "size-3.5 transition-transform group-data-[open]/collapsible:rotate-90" }) }), _jsx(CollapsibleContent, { children: _jsx(SidebarMenuSub, { children: node.children.map(child => {
41
+ const childIsActive = isActive(child.path, currentPath);
42
+ return (_jsx(SidebarMenuSubItem, { children: _jsx(SidebarMenuSubButton, { isActive: childIsActive, className: childIsActive ? "" : "opacity-75", render: _jsx(Link, { to: "/$", params: splatFor(child.path) }), children: _jsx("span", { children: child.label ?? child.title }) }) }, child.path));
43
+ }) }) })
44
+ ] }) }));
45
+ }
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lkZWJhckFydGljbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvU2lkZWJhckFydGljbGVzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzQyxPQUFPLEVBQ0wsYUFBYSxFQUNiLGNBQWMsRUFDZCxvQkFBb0IsR0FDckIsTUFBTSx1QkFBdUIsQ0FBQTtBQUM5QixPQUFPLEVBQ0wsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixrQkFBa0IsR0FDbkIsTUFBTSw0QkFBNkIsQ0FBQTtBQUNwQyxPQUFPLEVBQ0wsWUFBWSxFQUNaLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSx3QkFBeUIsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUcvRCxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFFekQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQTtJQUN0QyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUE7SUFDdkUsTUFBTSxNQUFNLEdBQUcsY0FBYyxFQUFFLE1BQU07UUFDbkMsQ0FB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SyxHQUFRO3dCQUNyQixFQUNwQixLQUFDLGtCQUFrQixrQkFDTCxVQUFVLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssVUFBVSxFQUN4RCxTQUFTLEVBQUMsaUVBQWlFLFlBRTNFLEtBQUMsWUFBWSxJQUFDLFNBQVMsRUFBQyx1RUFBdUUsR0FBRyxHQUMvRSxFQUNyQixLQUFDLGtCQUFrQixjQUNqQixLQUFDLGNBQWMsY0FDWixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTs0QkFDekIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUE7NEJBQ3ZELE9BQU8sQ0FDTCxLQUFDLGtCQUFrQixjQUNqQixLQUFDLG9CQUFvQixJQUNuQixRQUFRLEVBQUUsYUFBYSxFQUN2QixTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksRUFDNUMsTUFBTSxFQUFFLEtBQUMsSUFBSSxJQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUksWUFFdEQseUJBQU8sS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxHQUFRLEdBQ3BCLElBUEEsS0FBSyxDQUFDLElBQUksQ0FRZCxDQUN0QixDQUFBO3dCQUNILENBQUMsQ0FBQyxHQUNhLEdBQ0U7Z0JBQ1QsR0FDRSxDQUNuQixDQUFBO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbmZpZyB9IGZyb20gXCJsaXZlbWFyazp2aXJ0dWFsXCJcbmltcG9ydCB7IExpbmssIHVzZUxvY2F0aW9uIH0gZnJvbSBcIkB0YW5zdGFjay9yZWFjdC1yb3V0ZXJcIlxuaW1wb3J0IHsgQ2hldnJvblJpZ2h0IH0gZnJvbSBcImx1Y2lkZS1yZWFjdFwiXG5pbXBvcnQge1xuICBhcnRpY2xlR3JvdXBzLFxuICBjdXJyZW50U2VjdGlvbixcbiAgc2VjdGlvbkFydGljbGVHcm91cHMsXG59IGZyb20gXCIuLi9jb250ZW50L2FydGljbGUudHNcIlxuaW1wb3J0IHtcbiAgQ29sbGFwc2libGUsXG4gIENvbGxhcHNpYmxlQ29udGVudCxcbiAgQ29sbGFwc2libGVUcmlnZ2VyLFxufSBmcm9tIFwiLi4vZWxlbWVudHMvY29sbGFwc2libGUudHN4XCJcbmltcG9ydCB7XG4gIFNpZGViYXJHcm91cCxcbiAgU2lkZWJhckdyb3VwQ29udGVudCxcbiAgU2lkZWJhckdyb3VwTGFiZWwsXG4gIFNpZGViYXJNZW51LFxuICBTaWRlYmFyTWVudUJ1dHRvbixcbiAgU2lkZWJhck1lbnVJdGVtLFxuICBTaWRlYmFyTWVudVN1YixcbiAgU2lkZWJhck1lbnVTdWJCdXR0b24sXG4gIFNpZGViYXJNZW51U3ViSXRlbSxcbn0gZnJvbSBcIi4uL2VsZW1lbnRzL3NpZGViYXIudHN4XCJcbmltcG9ydCB7IHJlc29sdmVBcnRpY2xlSWNvbiB9IGZyb20gXCIuLi9oZWxwZXJzL2FydGljbGUtaWNvbi50c1wiXG5pbXBvcnQgdHlwZSB7IEFydGljbGVOb2RlIH0gZnJvbSBcIi4uL21vZGVscy9hcnRpY2xlLnRzXCJcblxuLyoqIEFydGljbGUtdHJlZSBib2R5IHNsb3QgZm9yIHRoZSBTaWRlYmFyIHNoZWxsICovXG5leHBvcnQgZnVuY3Rpb24gU2lkZWJhckFydGljbGVzKCkge1xuICBjb25zdCBwYXRobmFtZSA9IHVzZUxvY2F0aW9uKHsgc2VsZWN0OiBsID0+IGwucGF0aG5hbWUgfSlcblxuICBjb25zdCBjb25maWdTZWN0aW9ucyA9IGNvbmZpZy5zZWN0aW9uc1xuICBjb25zdCBzZWN0aW9uID0gY3VycmVudFNlY3Rpb24oYC8ke3BhdGhuYW1lLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKX0vYClcbiAgY29uc3QgZ3JvdXBzID0gY29uZmlnU2VjdGlvbnM/Lmxlbmd0aFxuICAgID8gKHNlY3Rpb25BcnRpY2xlR3JvdXBzLmdldChzZWN0aW9uPy5wcmVmaXggPz8gXCJfX2RlZmF1bHRfX1wiKSA/P1xuICAgICAgYXJ0aWNsZUdyb3VwcylcbiAgICA6IGFydGljbGVHcm91cHNcblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7Z3JvdXBzLm1hcCgoZ3JvdXAsIGluZGV4KSA9PiAoXG4gICAgICAgIDxTaWRlYmFyR3JvdXAga2V5PXtncm91cC5uYW1lID8/IGBfX3VubmFtZWQtJHtpbmRleH1gfT5cbiAgICAgICAgICB7Z3JvdXAubmFtZSAmJiAoXG4gICAgICAgICAgICA8U2lkZWJhckdyb3VwTGFiZWwgY2xhc3NOYW1lPVwidXBwZXJjYXNlIGZvbnQtbW9ubyB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdFwiPlxuICAgICAgICAgICAgICB7Z3JvdXAubmFtZX1cbiAgICAgICAgICAgIDwvU2lkZWJhckdyb3VwTGFiZWw+XG4gICAgICAgICAgKX1cbiAgICAgICAgICA8U2lkZWJhckdyb3VwQ29udGVudD5cbiAgICAgICAgICAgIDxTaWRlYmFyTWVudT5cbiAgICAgICAgICAgICAge2dyb3VwLm5vZGVzLm1hcChub2RlID0+IChcbiAgICAgICAgICAgICAgICA8TmF2Tm9kZSBrZXk9e25vZGUucGF0aH0gbm9kZT17bm9kZX0gY3VycmVudFBhdGg9e3BhdGhuYW1lfSAvPlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvU2lkZWJhck1lbnU+XG4gICAgICAgICAgPC9TaWRlYmFyR3JvdXBDb250ZW50PlxuICAgICAgICA8L1NpZGViYXJHcm91cD5cbiAgICAgICkpfVxuICAgIDwvPlxuICApXG59XG5cbmZ1bmN0aW9uIHNwbGF0Rm9yKHBhdGhuYW1lOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHsgX3NwbGF0OiBwYXRobmFtZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIikgfVxufVxuXG5mdW5jdGlvbiBpc0FjdGl2ZShhcnRpY2xlUGF0aG5hbWU6IHN0cmluZywgY3VycmVudFBhdGg6IHN0cmluZykge1xuICBjb25zdCBub3JtYWxpemVkID0gYC8ke2N1cnJlbnRQYXRoLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKX0vYFxuICByZXR1cm4gYXJ0aWNsZVBhdGhuYW1lID09PSBub3JtYWxpemVkXG59XG5cbmZ1bmN0aW9uIE5hdk5vZGUocHJvcHM6IHsgbm9kZTogQXJ0aWNsZU5vZGU7IGN1cnJlbnRQYXRoOiBzdHJpbmcgfSkge1xuICBjb25zdCB7IG5vZGUsIGN1cnJlbnRQYXRoIH0gPSBwcm9wc1xuICBjb25zdCBJY29uID0gcmVzb2x2ZUFydGljbGVJY29uKG5vZGUuaWNvbilcbiAgY29uc3QgYWN0aXZlID0gaXNBY3RpdmUobm9kZS5wYXRoLCBjdXJyZW50UGF0aClcblxuICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgPFNpZGViYXJNZW51SXRlbT5cbiAgICAgICAgPFNpZGViYXJNZW51QnV0dG9uXG4gICAgICAgICAgaXNBY3RpdmU9e2FjdGl2ZX1cbiAgICAgICAgICBjbGFzc05hbWU9e2FjdGl2ZSA/IFwiXCIgOiBcIm9wYWNpdHktNzVcIn1cbiAgICAgICAgICByZW5kZXI9ezxMaW5rIHRvPVwiLyRcIiBwYXJhbXM9e3NwbGF0Rm9yKG5vZGUucGF0aCl9IC8+fVxuICAgICAgICA+XG4gICAgICAgICAgPEljb24gY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgICA8c3Bhbj57bm9kZS5sYWJlbCA/PyBub2RlLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgPC9TaWRlYmFyTWVudUJ1dHRvbj5cbiAgICAgIDwvU2lkZWJhck1lbnVJdGVtPlxuICAgIClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPFNpZGViYXJNZW51SXRlbT5cbiAgICAgIDxDb2xsYXBzaWJsZSBkZWZhdWx0T3BlbiBjbGFzc05hbWU9XCJncm91cC9jb2xsYXBzaWJsZVwiPlxuICAgICAgICA8U2lkZWJhck1lbnVCdXR0b25cbiAgICAgICAgICBpc0FjdGl2ZT17YWN0aXZlfVxuICAgICAgICAgIGNsYXNzTmFtZT17YWN0aXZlID8gXCJcIiA6IFwib3BhY2l0eS03NVwifVxuICAgICAgICAgIHJlbmRlcj17PExpbmsgdG89XCIvJFwiIHBhcmFtcz17c3BsYXRGb3Iobm9kZS5wYXRoKX0gLz59XG4gICAgICAgID5cbiAgICAgICAgICA8SWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICAgIDxzcGFuPntub2RlLmxhYmVsID8/IG5vZGUudGl0bGV9PC9zcGFuPlxuICAgICAgICA8L1NpZGViYXJNZW51QnV0dG9uPlxuICAgICAgICA8Q29sbGFwc2libGVUcmlnZ2VyXG4gICAgICAgICAgYXJpYS1sYWJlbD17YFRvZ2dsZSAke25vZGUubGFiZWwgPz8gbm9kZS50aXRsZX0gc3VibWVudWB9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS41IHAtMSByb3VuZGVkLW1kIGhvdmVyOmJnLXNpZGViYXItYWNjZW50XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxDaGV2cm9uUmlnaHQgY2xhc3NOYW1lPVwic2l6ZS0zLjUgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZ3JvdXAtZGF0YS1bb3Blbl0vY29sbGFwc2libGU6cm90YXRlLTkwXCIgLz5cbiAgICAgICAgPC9Db2xsYXBzaWJsZVRyaWdnZXI+XG4gICAgICAgIDxDb2xsYXBzaWJsZUNvbnRlbnQ+XG4gICAgICAgICAgPFNpZGViYXJNZW51U3ViPlxuICAgICAgICAgICAge25vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGRJc0FjdGl2ZSA9IGlzQWN0aXZlKGNoaWxkLnBhdGgsIGN1cnJlbnRQYXRoKVxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudVN1Ykl0ZW0ga2V5PXtjaGlsZC5wYXRofT5cbiAgICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudVN1YkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZT17Y2hpbGRJc0FjdGl2ZX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjaGlsZElzQWN0aXZlID8gXCJcIiA6IFwib3BhY2l0eS03NVwifVxuICAgICAgICAgICAgICAgICAgICByZW5kZXI9ezxMaW5rIHRvPVwiLyRcIiBwYXJhbXM9e3NwbGF0Rm9yKGNoaWxkLnBhdGgpfSAvPn1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2NoaWxkLmxhYmVsID8/IGNoaWxkLnRpdGxlfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVTdWJCdXR0b24+XG4gICAgICAgICAgICAgICAgPC9TaWRlYmFyTWVudVN1Ykl0ZW0+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvU2lkZWJhck1lbnVTdWI+XG4gICAgICAgIDwvQ29sbGFwc2libGVDb250ZW50PlxuICAgICAgPC9Db2xsYXBzaWJsZT5cbiAgICA8L1NpZGViYXJNZW51SXRlbT5cbiAgKVxufVxuIl19
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { config } from "livemark:virtual";
3
+ import { useLocation } from "@tanstack/react-router";
4
+ import { ExternalLink } from "lucide-react";
5
+ import { currentSection } from "../content/article.js";
6
+ import { DynamicIcon } from "../helpers/dynamic-icon.js";
7
+ import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, } from "../elements/sidebar.js";
8
+ /** Shared Links group. Renders sidebar-positioned links always, and
9
+ * header-positioned links only on mobile (mobile collapses all chrome
10
+ * links into the sidebar since the header strip is hidden below `md`). */
11
+ export function SidebarLinks() {
12
+ const pathname = useLocation({ select: l => l.pathname });
13
+ const section = currentSection(`/${pathname.replace(/^\/|\/$/g, "")}/`);
14
+ const links = config.links?.filter(link => !link.prefix || link.prefix === section?.prefix) ?? [];
15
+ if (!links.length)
16
+ return null;
17
+ const hasDesktopItems = links.some(l => l.position === "sidebar");
18
+ return (_jsxs(SidebarGroup, { className: hasDesktopItems ? undefined : "md:hidden", children: [
19
+ _jsx(SidebarGroupLabel, { className: "uppercase font-mono text-xs tracking-widest", children: "Links" }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: links.map(link => {
20
+ const mobileOnly = link.position !== "sidebar";
21
+ return (_jsx(SidebarMenuItem, { className: mobileOnly ? "md:hidden" : undefined, children: _jsxs(SidebarMenuButton, { className: "text-muted-foreground", render: _jsx("a", { href: link.url, target: "_blank", rel: "noopener noreferrer" }), children: [link.icon && (_jsx(DynamicIcon, { name: link.icon, className: "size-4" })), _jsxs("span", { children: [link.title, " ", _jsx(ExternalLink, { className: "inline -mt-0.5 opacity-75", style: { width: 12, height: 12 } })
22
+ ] })
23
+ ] }) }, link.url));
24
+ }) }) })
25
+ ] }));
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lkZWJhckxpbmtzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvU2lkZWJhckxpbmtzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQzNDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTZCLENBQUE7QUFDekQsT0FBTyxFQUNMLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxpQkFBaUIsRUFDakIsZUFBZSxHQUNoQixNQUFNLHdCQUF5QixDQUFBO0FBRWhDOzswRUFFMEU7QUFDMUUsTUFBTSxVQUFVLFlBQVk7SUFDMUIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDekQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3ZFLE1BQU0sS0FBSyxHQUNULE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUNsQixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRSxNQUFNLENBQ3hELElBQUksRUFBRSxDQUFBO0lBRVQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDOUIsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUE7SUFFakUsT0FBTyxDQUNMLE1BQUMsWUFBWSxJQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVztZQUNoRSxLQUFDLGlCQUFpQixJQUFDLFNBQVMsRUFBQyw2Q0FBNkMsc0JBRXRELEVBQ3BCLEtBQUMsbUJBQW1CLGNBQ2xCLEtBQUMsV0FBVyxjQUNULEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ2hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFBO3dCQUM5QyxPQUFPLENBQ0wsS0FBQyxlQUFlLElBRWQsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLFlBRS9DLE1BQUMsaUJBQWlCLElBQ2hCLFNBQVMsRUFBQyx1QkFBdUIsRUFDakMsTUFBTSxFQUNKLFlBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQ2QsTUFBTSxFQUFDLFFBQVEsRUFDZixHQUFHLEVBQUMscUJBQXFCLEdBQ3pCLGFBR0gsSUFBSSxDQUFDLElBQUksSUFBSSxDQUNaLEtBQUMsV0FBVyxJQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBQyxRQUFRLEdBQUcsQ0FDcEQsRUFDRCwyQkFDRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFDaEIsS0FBQyxZQUFZLElBQ1gsU0FBUyxFQUFDLDJCQUEyQixFQUNyQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsR0FDaEM7NENBQ0c7b0NBQ1csSUF2QmYsSUFBSSxDQUFDLEdBQUcsQ0F3QkcsQ0FDbkIsQ0FBQTtvQkFDSCxDQUFDLENBQUMsR0FDVSxHQUNNO1lBQ1QsQ0FDaEIsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25maWcgfSBmcm9tIFwibGl2ZW1hcms6dmlydHVhbFwiXG5pbXBvcnQgeyB1c2VMb2NhdGlvbiB9IGZyb20gXCJAdGFuc3RhY2svcmVhY3Qtcm91dGVyXCJcbmltcG9ydCB7IEV4dGVybmFsTGluayB9IGZyb20gXCJsdWNpZGUtcmVhY3RcIlxuaW1wb3J0IHsgY3VycmVudFNlY3Rpb24gfSBmcm9tIFwiLi4vY29udGVudC9hcnRpY2xlLnRzXCJcbmltcG9ydCB7IER5bmFtaWNJY29uIH0gZnJvbSBcIi4uL2hlbHBlcnMvZHluYW1pYy1pY29uLnRzeFwiXG5pbXBvcnQge1xuICBTaWRlYmFyR3JvdXAsXG4gIFNpZGViYXJHcm91cENvbnRlbnQsXG4gIFNpZGViYXJHcm91cExhYmVsLFxuICBTaWRlYmFyTWVudSxcbiAgU2lkZWJhck1lbnVCdXR0b24sXG4gIFNpZGViYXJNZW51SXRlbSxcbn0gZnJvbSBcIi4uL2VsZW1lbnRzL3NpZGViYXIudHN4XCJcblxuLyoqIFNoYXJlZCBMaW5rcyBncm91cC4gUmVuZGVycyBzaWRlYmFyLXBvc2l0aW9uZWQgbGlua3MgYWx3YXlzLCBhbmRcbiAqIGhlYWRlci1wb3NpdGlvbmVkIGxpbmtzIG9ubHkgb24gbW9iaWxlIChtb2JpbGUgY29sbGFwc2VzIGFsbCBjaHJvbWVcbiAqIGxpbmtzIGludG8gdGhlIHNpZGViYXIgc2luY2UgdGhlIGhlYWRlciBzdHJpcCBpcyBoaWRkZW4gYmVsb3cgYG1kYCkuICovXG5leHBvcnQgZnVuY3Rpb24gU2lkZWJhckxpbmtzKCkge1xuICBjb25zdCBwYXRobmFtZSA9IHVzZUxvY2F0aW9uKHsgc2VsZWN0OiBsID0+IGwucGF0aG5hbWUgfSlcbiAgY29uc3Qgc2VjdGlvbiA9IGN1cnJlbnRTZWN0aW9uKGAvJHtwYXRobmFtZS5yZXBsYWNlKC9eXFwvfFxcLyQvZywgXCJcIil9L2ApXG4gIGNvbnN0IGxpbmtzID1cbiAgICBjb25maWcubGlua3M/LmZpbHRlcihcbiAgICAgIGxpbmsgPT4gIWxpbmsucHJlZml4IHx8IGxpbmsucHJlZml4ID09PSBzZWN0aW9uPy5wcmVmaXgsXG4gICAgKSA/PyBbXVxuXG4gIGlmICghbGlua3MubGVuZ3RoKSByZXR1cm4gbnVsbFxuICBjb25zdCBoYXNEZXNrdG9wSXRlbXMgPSBsaW5rcy5zb21lKGwgPT4gbC5wb3NpdGlvbiA9PT0gXCJzaWRlYmFyXCIpXG5cbiAgcmV0dXJuIChcbiAgICA8U2lkZWJhckdyb3VwIGNsYXNzTmFtZT17aGFzRGVza3RvcEl0ZW1zID8gdW5kZWZpbmVkIDogXCJtZDpoaWRkZW5cIn0+XG4gICAgICA8U2lkZWJhckdyb3VwTGFiZWwgY2xhc3NOYW1lPVwidXBwZXJjYXNlIGZvbnQtbW9ubyB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdFwiPlxuICAgICAgICBMaW5rc1xuICAgICAgPC9TaWRlYmFyR3JvdXBMYWJlbD5cbiAgICAgIDxTaWRlYmFyR3JvdXBDb250ZW50PlxuICAgICAgICA8U2lkZWJhck1lbnU+XG4gICAgICAgICAge2xpbmtzLm1hcChsaW5rID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1vYmlsZU9ubHkgPSBsaW5rLnBvc2l0aW9uICE9PSBcInNpZGViYXJcIlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPFNpZGViYXJNZW51SXRlbVxuICAgICAgICAgICAgICAgIGtleT17bGluay51cmx9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXttb2JpbGVPbmx5ID8gXCJtZDpoaWRkZW5cIiA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudUJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHJlbmRlcj17XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgaHJlZj17bGluay51cmx9XG4gICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7bGluay5pY29uICYmIChcbiAgICAgICAgICAgICAgICAgICAgPER5bmFtaWNJY29uIG5hbWU9e2xpbmsuaWNvbn0gY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge2xpbmsudGl0bGV9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICA8RXh0ZXJuYWxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaW5saW5lIC1tdC0wLjUgb3BhY2l0eS03NVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6IDEyLCBoZWlnaHQ6IDEyIH19XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9TaWRlYmFyTWVudUJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9TaWRlYmFyTWVudUl0ZW0+XG4gICAgICAgICAgICApXG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvU2lkZWJhck1lbnU+XG4gICAgICA8L1NpZGViYXJHcm91cENvbnRlbnQ+XG4gICAgPC9TaWRlYmFyR3JvdXA+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { config } from "livemark:virtual";
3
+ import { Link, useLocation, useMatch } from "@tanstack/react-router";
4
+ import { currentSection, sectionFirstArticle } from "../content/article.js";
5
+ import { DynamicIcon } from "../helpers/dynamic-icon.js";
6
+ import { sectionIcon } from "../helpers/section.js";
7
+ import { SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarMenu, SidebarMenuButton, SidebarMenuItem, } from "../elements/sidebar.js";
8
+ function splatFor(pathname) {
9
+ return { _splat: pathname.replace(/^\/|\/$/g, "") };
10
+ }
11
+ /** Shared Sections group. Renders sidebar-positioned sections always, and
12
+ * header-positioned sections only on mobile (mobile collapses all sections
13
+ * into the sidebar since the header nav strip is hidden below `md`). */
14
+ export function SidebarSections() {
15
+ const pathname = useLocation({ select: l => l.pathname });
16
+ const articleRoute = useMatch({ from: "/$", shouldThrow: false });
17
+ const section = articleRoute
18
+ ? currentSection(`/${pathname.replace(/^\/|\/$/g, "")}/`)
19
+ : undefined;
20
+ const sections = config.sections ?? [];
21
+ if (!sections.length)
22
+ return null;
23
+ const hasDesktopItems = sections.some(s => s.position === "sidebar");
24
+ return (_jsxs(SidebarGroup, { className: hasDesktopItems ? undefined : "md:hidden", children: [
25
+ _jsx(SidebarGroupLabel, { className: "uppercase font-mono text-xs tracking-widest", children: "Sections" }), _jsx(SidebarGroupContent, { children: _jsx(SidebarMenu, { children: sections.map(s => {
26
+ const target = s.type === "blog" || s.type === "changelog"
27
+ ? s.prefix
28
+ : (sectionFirstArticle.get(s.prefix) ?? s.prefix);
29
+ const active = section?.prefix === s.prefix;
30
+ const mobileOnly = s.position !== "sidebar";
31
+ return (_jsx(SidebarMenuItem, { className: mobileOnly ? "md:hidden" : undefined, children: _jsxs(SidebarMenuButton, { isActive: active, className: active ? "" : "opacity-75", render: _jsx(Link, { to: target === "/" ? "/" : "/$", params: target && target !== "/" ? splatFor(target) : {} }), children: [
32
+ _jsx(DynamicIcon, { name: sectionIcon(s), className: "size-4" }), _jsx("span", { children: s.title })
33
+ ] }) }, s.prefix));
34
+ }) }) })
35
+ ] }));
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lkZWJhclNlY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvU2lkZWJhclNlY3Rpb25zLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQTtBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTZCLENBQUE7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ25ELE9BQU8sRUFDTCxZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLGVBQWUsR0FDaEIsTUFBTSx3QkFBeUIsQ0FBQTtBQUVoQyxTQUFTLFFBQVEsQ0FBQyxRQUFnQjtJQUNoQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUE7QUFDckQsQ0FBQztBQUVEOzt3RUFFd0U7QUFDeEUsTUFBTSxVQUFVLGVBQWU7SUFDN0IsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7SUFDekQsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUNqRSxNQUFNLE9BQU8sR0FBRyxZQUFZO1FBQzFCLENBQUMsQ0FBQyxjQUFjLENBQUMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxTQUFTLENBQUE7SUFDYixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQTtJQUV0QyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07UUFBRSxPQUFPLElBQUksQ0FBQTtJQUNqQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUMsQ0FBQTtJQUVwRSxPQUFPLENBQ0wsTUFBQyxZQUFZLElBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxXQUFXO1lBQ2hFLEtBQUMsaUJBQWlCLElBQUMsU0FBUyxFQUFDLDZDQUE2Qyx5QkFFdEQsRUFDcEIsS0FBQyxtQkFBbUIsY0FDbEIsS0FBQyxXQUFXLGNBQ1QsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTt3QkFDaEIsTUFBTSxNQUFNLEdBQ1YsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxXQUFXOzRCQUN6QyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07NEJBQ1YsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7d0JBQ3JELE1BQU0sTUFBTSxHQUFHLE9BQU8sRUFBRSxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQTt3QkFDM0MsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUE7d0JBQzNDLE9BQU8sQ0FDTCxLQUFDLGVBQWUsSUFFZCxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsWUFFL0MsTUFBQyxpQkFBaUIsSUFDaEIsUUFBUSxFQUFFLE1BQU0sRUFDaEIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQ3JDLE1BQU0sRUFDSixLQUFDLElBQUksSUFDSCxFQUFFLEVBQUUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQy9CLE1BQU0sRUFBRSxNQUFNLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQ3hEO29DQUdKLEtBQUMsV0FBVyxJQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFDLFFBQVEsR0FBRyxFQUN4RCx5QkFBTyxDQUFDLENBQUMsS0FBSyxHQUFRO29DQUNKLElBZmYsQ0FBQyxDQUFDLE1BQU0sQ0FnQkcsQ0FDbkIsQ0FBQTtvQkFDSCxDQUFDLENBQUMsR0FDVSxHQUNNO1lBQ1QsQ0FDaEIsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25maWcgfSBmcm9tIFwibGl2ZW1hcms6dmlydHVhbFwiXG5pbXBvcnQgeyBMaW5rLCB1c2VMb2NhdGlvbiwgdXNlTWF0Y2ggfSBmcm9tIFwiQHRhbnN0YWNrL3JlYWN0LXJvdXRlclwiXG5pbXBvcnQgeyBjdXJyZW50U2VjdGlvbiwgc2VjdGlvbkZpcnN0QXJ0aWNsZSB9IGZyb20gXCIuLi9jb250ZW50L2FydGljbGUudHNcIlxuaW1wb3J0IHsgRHluYW1pY0ljb24gfSBmcm9tIFwiLi4vaGVscGVycy9keW5hbWljLWljb24udHN4XCJcbmltcG9ydCB7IHNlY3Rpb25JY29uIH0gZnJvbSBcIi4uL2hlbHBlcnMvc2VjdGlvbi50c1wiXG5pbXBvcnQge1xuICBTaWRlYmFyR3JvdXAsXG4gIFNpZGViYXJHcm91cENvbnRlbnQsXG4gIFNpZGViYXJHcm91cExhYmVsLFxuICBTaWRlYmFyTWVudSxcbiAgU2lkZWJhck1lbnVCdXR0b24sXG4gIFNpZGViYXJNZW51SXRlbSxcbn0gZnJvbSBcIi4uL2VsZW1lbnRzL3NpZGViYXIudHN4XCJcblxuZnVuY3Rpb24gc3BsYXRGb3IocGF0aG5hbWU6IHN0cmluZykge1xuICByZXR1cm4geyBfc3BsYXQ6IHBhdGhuYW1lLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKSB9XG59XG5cbi8qKiBTaGFyZWQgU2VjdGlvbnMgZ3JvdXAuIFJlbmRlcnMgc2lkZWJhci1wb3NpdGlvbmVkIHNlY3Rpb25zIGFsd2F5cywgYW5kXG4gKiBoZWFkZXItcG9zaXRpb25lZCBzZWN0aW9ucyBvbmx5IG9uIG1vYmlsZSAobW9iaWxlIGNvbGxhcHNlcyBhbGwgc2VjdGlvbnNcbiAqIGludG8gdGhlIHNpZGViYXIgc2luY2UgdGhlIGhlYWRlciBuYXYgc3RyaXAgaXMgaGlkZGVuIGJlbG93IGBtZGApLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIFNpZGViYXJTZWN0aW9ucygpIHtcbiAgY29uc3QgcGF0aG5hbWUgPSB1c2VMb2NhdGlvbih7IHNlbGVjdDogbCA9PiBsLnBhdGhuYW1lIH0pXG4gIGNvbnN0IGFydGljbGVSb3V0ZSA9IHVzZU1hdGNoKHsgZnJvbTogXCIvJFwiLCBzaG91bGRUaHJvdzogZmFsc2UgfSlcbiAgY29uc3Qgc2VjdGlvbiA9IGFydGljbGVSb3V0ZVxuICAgID8gY3VycmVudFNlY3Rpb24oYC8ke3BhdGhuYW1lLnJlcGxhY2UoL15cXC98XFwvJC9nLCBcIlwiKX0vYClcbiAgICA6IHVuZGVmaW5lZFxuICBjb25zdCBzZWN0aW9ucyA9IGNvbmZpZy5zZWN0aW9ucyA/PyBbXVxuXG4gIGlmICghc2VjdGlvbnMubGVuZ3RoKSByZXR1cm4gbnVsbFxuICBjb25zdCBoYXNEZXNrdG9wSXRlbXMgPSBzZWN0aW9ucy5zb21lKHMgPT4gcy5wb3NpdGlvbiA9PT0gXCJzaWRlYmFyXCIpXG5cbiAgcmV0dXJuIChcbiAgICA8U2lkZWJhckdyb3VwIGNsYXNzTmFtZT17aGFzRGVza3RvcEl0ZW1zID8gdW5kZWZpbmVkIDogXCJtZDpoaWRkZW5cIn0+XG4gICAgICA8U2lkZWJhckdyb3VwTGFiZWwgY2xhc3NOYW1lPVwidXBwZXJjYXNlIGZvbnQtbW9ubyB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdFwiPlxuICAgICAgICBTZWN0aW9uc1xuICAgICAgPC9TaWRlYmFyR3JvdXBMYWJlbD5cbiAgICAgIDxTaWRlYmFyR3JvdXBDb250ZW50PlxuICAgICAgICA8U2lkZWJhck1lbnU+XG4gICAgICAgICAge3NlY3Rpb25zLm1hcChzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9XG4gICAgICAgICAgICAgIHMudHlwZSA9PT0gXCJibG9nXCIgfHwgcy50eXBlID09PSBcImNoYW5nZWxvZ1wiXG4gICAgICAgICAgICAgICAgPyBzLnByZWZpeFxuICAgICAgICAgICAgICAgIDogKHNlY3Rpb25GaXJzdEFydGljbGUuZ2V0KHMucHJlZml4KSA/PyBzLnByZWZpeClcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9IHNlY3Rpb24/LnByZWZpeCA9PT0gcy5wcmVmaXhcbiAgICAgICAgICAgIGNvbnN0IG1vYmlsZU9ubHkgPSBzLnBvc2l0aW9uICE9PSBcInNpZGViYXJcIlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPFNpZGViYXJNZW51SXRlbVxuICAgICAgICAgICAgICAgIGtleT17cy5wcmVmaXh9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXttb2JpbGVPbmx5ID8gXCJtZDpoaWRkZW5cIiA6IHVuZGVmaW5lZH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxTaWRlYmFyTWVudUJ1dHRvblxuICAgICAgICAgICAgICAgICAgaXNBY3RpdmU9e2FjdGl2ZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YWN0aXZlID8gXCJcIiA6IFwib3BhY2l0eS03NVwifVxuICAgICAgICAgICAgICAgICAgcmVuZGVyPXtcbiAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICB0bz17dGFyZ2V0ID09PSBcIi9cIiA/IFwiL1wiIDogXCIvJFwifVxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz17dGFyZ2V0ICYmIHRhcmdldCAhPT0gXCIvXCIgPyBzcGxhdEZvcih0YXJnZXQpIDoge319XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPER5bmFtaWNJY29uIG5hbWU9e3NlY3Rpb25JY29uKHMpfSBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3MudGl0bGV9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVCdXR0b24+XG4gICAgICAgICAgICAgIDwvU2lkZWJhck1lbnVJdGVtPlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pfVxuICAgICAgICA8L1NpZGViYXJNZW51PlxuICAgICAgPC9TaWRlYmFyR3JvdXBDb250ZW50PlxuICAgIDwvU2lkZWJhckdyb3VwPlxuICApXG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { config } from "livemark:virtual";
3
+ import defaultLogo from "../assets/logo.svg";
4
+ /** Renders the site logo, title, and description in the sidebar header */
5
+ export function SiteTitle() {
6
+ const logo = config.logo ?? defaultLogo;
7
+ return (_jsxs("div", { className: "flex items-end gap-2.5 text-sm", children: [
8
+ _jsx("img", { src: logo, alt: config.title, className: "size-6.5 mb-1.25" }), _jsxs("div", { className: "flex flex-col gap-0.5 leading-none", children: [
9
+ _jsx("span", { className: "font-semibold", children: config.title }), _jsx("span", { className: "text-xs opacity-80", children: config.description })
10
+ ] })
11
+ ] }));
12
+ }
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2l0ZVRpdGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbXBvbmVudHMvU2l0ZVRpdGxlLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sV0FBVyxNQUFNLG9CQUFvQixDQUFBO0FBRTVDLDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsU0FBUztJQUN2QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxJQUFJLFdBQVcsQ0FBQTtJQUN2QyxPQUFPLENBQ0wsZUFBSyxTQUFTLEVBQUMsZ0NBQWdDO1lBQzdDLGNBQUssR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsa0JBQWtCLEdBQUcsRUFDbEUsZUFBSyxTQUFTLEVBQUMsb0NBQW9DO29CQUNqRCxlQUFNLFNBQVMsRUFBQyxlQUFlLFlBQUUsTUFBTSxDQUFDLEtBQUssR0FBUSxFQUNyRCxlQUFNLFNBQVMsRUFBQyxvQkFBb0IsWUFBRSxNQUFNLENBQUMsV0FBVyxHQUFRO29CQUM1RDtZQUNGLENBQ1AsQ0FBQTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25maWcgfSBmcm9tIFwibGl2ZW1hcms6dmlydHVhbFwiXG5pbXBvcnQgZGVmYXVsdExvZ28gZnJvbSBcIi4uL2Fzc2V0cy9sb2dvLnN2Z1wiXG5cbi8qKiBSZW5kZXJzIHRoZSBzaXRlIGxvZ28sIHRpdGxlLCBhbmQgZGVzY3JpcHRpb24gaW4gdGhlIHNpZGViYXIgaGVhZGVyICovXG5leHBvcnQgZnVuY3Rpb24gU2l0ZVRpdGxlKCkge1xuICBjb25zdCBsb2dvID0gY29uZmlnLmxvZ28gPz8gZGVmYXVsdExvZ29cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtZW5kIGdhcC0yLjUgdGV4dC1zbVwiPlxuICAgICAgPGltZyBzcmM9e2xvZ299IGFsdD17Y29uZmlnLnRpdGxlfSBjbGFzc05hbWU9XCJzaXplLTYuNSBtYi0xLjI1XCIgLz5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMC41IGxlYWRpbmctbm9uZVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LXNlbWlib2xkXCI+e2NvbmZpZy50aXRsZX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgb3BhY2l0eS04MFwiPntjb25maWcuZGVzY3JpcHRpb259PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiJdfQ==
@@ -0,0 +1,55 @@
1
+ import { config } from "livemark:virtual";
2
+ import { allArticles } from "content-collections";
3
+ import { buildArticleTree, flattenArticleTree, groupArticleTree, } from "../helpers/article.js";
4
+ import { matchSection, partitionBySection } from "../helpers/section.js";
5
+ /**
6
+ * Articles sorted by frontmatter `order`:
7
+ * positive values first (ascending), then unordered, then negative values
8
+ * (so `order: -1` lands at the very end, `-2` just before it, and so on).
9
+ */
10
+ export const sortedArticles = [...allArticles].sort((a, b) => orderKey(a.order) - orderKey(b.order));
11
+ /** The article whose path is `/`, if any (rendered in place at the root) */
12
+ export const homeArticle = sortedArticles.find(a => a.path === "/");
13
+ /** Sidebar sections derived from the path tree, partitioned by `group` */
14
+ export const articleGroups = groupArticleTree(buildArticleTree(sortedArticles), sortedArticles);
15
+ /** Articles in depth-first order across all sections (matches sidebar walk) */
16
+ export const flatArticles = articleGroups.flatMap(group => flattenArticleTree(group.nodes));
17
+ /** The first article in sidebar order, used as the default landing page */
18
+ export const firstArticle = sortedArticles.find(a => a.path === flatArticles[0]);
19
+ function orderKey(order) {
20
+ if (order === undefined)
21
+ return Number.MAX_SAFE_INTEGER / 2;
22
+ if (order < 0)
23
+ return Number.MAX_SAFE_INTEGER + order;
24
+ return order;
25
+ }
26
+ const configSections = config.sections;
27
+ /** Per-section article groups, keyed by section prefix */
28
+ export const sectionArticleGroups = new Map();
29
+ /** Per-section flat article lists, keyed by section prefix */
30
+ export const sectionFlatArticles = new Map();
31
+ /** Per-section first article path, keyed by section prefix */
32
+ export const sectionFirstArticle = new Map();
33
+ if (configSections?.length) {
34
+ const sectionByPrefix = new Map(configSections.map(s => [s.prefix, s]));
35
+ const buckets = partitionBySection(sortedArticles, configSections);
36
+ for (const [key, bucket] of buckets) {
37
+ const section = sectionByPrefix.get(key);
38
+ const sorted = section?.type === "blog" || section?.type === "changelog"
39
+ ? [...bucket].sort((a, b) => new Date(b.date ?? 0).getTime() - new Date(a.date ?? 0).getTime())
40
+ : bucket;
41
+ const tree = buildArticleTree(sorted);
42
+ const groups = groupArticleTree(tree, sorted);
43
+ const flat = groups.flatMap(g => flattenArticleTree(g.nodes));
44
+ sectionArticleGroups.set(key, groups);
45
+ sectionFlatArticles.set(key, flat);
46
+ sectionFirstArticle.set(key, flat[0]);
47
+ }
48
+ }
49
+ /** Find which config section an article path belongs to */
50
+ export function currentSection(path) {
51
+ if (!configSections?.length)
52
+ return undefined;
53
+ return matchSection(path, configSections);
54
+ }
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWNsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NvdXJjZS9jb250ZW50L2FydGljbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFBO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUVqRCxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixnQkFBZ0IsR0FDakIsTUFBTSx1QkFBdUIsQ0FBQTtBQUM5QixPQUFPLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFeEU7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUNqRCxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FDaEQsQ0FBQTtBQUVELDRFQUE0RTtBQUM1RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUE7QUFFbkUsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FDM0MsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEVBQ2hDLGNBQWMsQ0FDZixDQUFBO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQ3hELGtCQUFrQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FDaEMsQ0FBQTtBQUVELDJFQUEyRTtBQUMzRSxNQUFNLENBQUMsTUFBTSxZ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dWFsXCJcbmltcG9ydCB7IGFsbEFydGljbGVzIH0gZnJvbSBcImNvbnRlbnQtY29sbGVjdGlvbnNcIlxuaW1wb3J0IHR5cGUgeyBBcnRpY2xlR3JvdXAgfSBmcm9tIFwiLi4vbW9kZWxzL2FydGljbGUudHNcIlxuaW1wb3J0IHtcbiAgYnVpbGRBcnRpY2xlVHJlZSxcbiAgZmxhdHRlbkFydGljbGVUcmVlLFxuICBncm91cEFydGljbGVUcmVlLFxufSBmcm9tIFwiLi4vaGVscGVycy9hcnRpY2xlLnRzXCJcbmltcG9ydCB7IG1hdGNoU2VjdGlvbiwgcGFydGl0aW9uQnlTZWN0aW9uIH0gZnJvbSBcIi4uL2hlbHBlcnMvc2VjdGlvbi50c1wiXG5cbi8qKlxuICogQXJ0aWNsZXMgc29ydGVkIGJ5IGZyb250bWF0dGVyIGBvcmRlcmA6XG4gKiBwb3NpdGl2ZSB2YWx1ZXMgZmlyc3QgKGFzY2VuZGluZyksIHRoZW4gdW5vcmRlcmVkLCB0aGVuIG5lZ2F0aXZlIHZhbHVlc1xuICogKHNvIGBvcmRlcjogLTFgIGxhbmRzIGF0IHRoZSB2ZXJ5IGVuZCwgYC0yYCBqdXN0IGJlZm9yZSBpdCwgYW5kIHNvIG9uKS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNvcnRlZEFydGljbGVzID0gWy4uLmFsbEFydGljbGVzXS5zb3J0KFxuICAoYSwgYikgPT4gb3JkZXJLZXkoYS5vcmRlcikgLSBvcmRlcktleShiLm9yZGVyKSxcbilcblxuLyoqIFRoZSBhcnRpY2xlIHdob3NlIHBhdGggaXMgYC9gLCBpZiBhbnkgKHJlbmRlcmVkIGluIHBsYWNlIGF0IHRoZSByb290KSAqL1xuZXhwb3J0IGNvbnN0IGhvbWVBcnRpY2xlID0gc29ydGVkQXJ0aWNsZXMuZmluZChhID0+IGEucGF0aCA9PT0gXCIvXCIpXG5cbi8qKiBTaWRlYmFyIHNlY3Rpb25zIGRlcml2ZWQgZnJvbSB0aGUgcGF0aCB0cmVlLCBwYXJ0aXRpb25lZCBieSBgZ3JvdXBgICovXG5leHBvcnQgY29uc3QgYXJ0aWNsZUdyb3VwcyA9IGdyb3VwQXJ0aWNsZVRyZWUoXG4gIGJ1aWxkQXJ0aWNsZVRyZWUoc29ydGVkQXJ0aWNsZXMpLFxuICBzb3J0ZWRBcnRpY2xlcyxcbilcblxuLyoqIEFydGljbGVzIGluIGRlcHRoLWZpcnN0IG9yZGVyIGFjcm9zcyBhbGwgc2VjdGlvbnMgKG1hdGNoZXMgc2lkZWJhciB3YWxrKSAqL1xuZXhwb3J0IGNvbnN0IGZsYXRBcnRpY2xlcyA9IGFydGljbGVHcm91cHMuZmxhdE1hcChncm91cCA9PlxuICBmbGF0dGVuQXJ0aWNsZVRyZWUoZ3JvdXAubm9kZXMpLFxuKVxuXG4vKiogVGhlIGZpcnN0IGFydGljbGUgaW4gc2lkZWJhciBvcmRlciwgdXNlZCBhcyB0aGUgZGVmYXVsdCBsYW5kaW5nIHBhZ2UgKi9cbmV4cG9ydCBjb25zdCBmaXJzdEFydGljbGUgPSBzb3J0ZWRBcnRpY2xlcy5maW5kKGEgPT4gYS5wYXRoID09PSBmbGF0QXJ0aWNsZXNbMF0pXG5cbmZ1bmN0aW9uIG9yZGVyS2V5KG9yZGVyPzogbnVtYmVyKSB7XG4gIGlmIChvcmRlciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgLyAyXG4gIGlmIChvcmRlciA8IDApIHJldHVybiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiArIG9yZGVyXG4gIHJldHVybiBvcmRlclxufVxuXG5jb25zdCBjb25maWdTZWN0aW9ucyA9IGNvbmZpZy5zZWN0aW9uc1xuXG4vKiogUGVyLXNlY3Rpb24gYXJ0aWNsZSBncm91cHMsIGtleWVkIGJ5IHNlY3Rpb24gcHJlZml4ICovXG5leHBvcnQgY29uc3Qgc2VjdGlvbkFydGljbGVHcm91cHMgPSBuZXcgTWFwPHN0cmluZywgQXJ0aWNsZUdyb3VwW10+KClcblxuLyoqIFBlci1zZWN0aW9uIGZsYXQgYXJ0aWNsZSBsaXN0cywga2V5ZWQgYnkgc2VjdGlvbiBwcmVmaXggKi9cbmV4cG9ydCBjb25zdCBzZWN0aW9uRmxhdEFydGljbGVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpXG5cbi8qKiBQZXItc2VjdGlvbiBmaXJzdCBhcnRpY2xlIHBhdGgsIGtleWVkIGJ5IHNlY3Rpb24gcHJlZml4ICovXG5leHBvcnQgY29uc3Qgc2VjdGlvbkZpcnN0QXJ0aWNsZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KClcblxuaWYgKGNvbmZpZ1NlY3Rpb25zPy5sZW5ndGgpIHtcbiAgY29uc3Qgc2VjdGlvbkJ5UHJlZml4ID0gbmV3IE1hcChjb25maWdTZWN0aW9ucy5tYXAocyA9PiBbcy5wcmVmaXgsIHNdKSlcbiAgY29uc3QgYnVja2V0cyA9IHBhcnRpdGlvbkJ5U2VjdGlvbihzb3J0ZWRBcnRpY2xlcywgY29uZmlnU2VjdGlvbnMpXG4gIGZvciAoY29uc3QgW2tleSwgYnVja2V0XSBvZiBidWNrZXRzKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHNlY3Rpb25CeVByZWZpeC5nZXQoa2V5KVxuICAgIGNvbnN0IHNvcnRlZCA9XG4gICAgICBzZWN0aW9uPy50eXBlID09PSBcImJsb2dcIiB8fCBzZWN0aW9uPy50eXBlID09PSBcImNoYW5nZWxvZ1wiXG4gICAgICAgID8gWy4uLmJ1Y2tldF0uc29ydChcbiAgICAgICAgICAgIChhLCBiKSA9PlxuICAgICAgICAgICAgICBuZXcgRGF0ZShiLmRhdGUgPz8gMCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5kYXRlID8/IDApLmdldFRpbWUoKSxcbiAgICAgICAgICApXG4gICAgICAgIDogYnVja2V0XG4gICAgY29uc3QgdHJlZSA9IGJ1aWxkQXJ0aWNsZVRyZWUoc29ydGVkKVxuICAgIGNvbnN0IGdyb3VwcyA9IGdyb3VwQXJ0aWNsZVRyZWUodHJlZSwgc29ydGVkKVxuICAgIGNvbnN0IGZsYXQgPSBncm91cHMuZmxhdE1hcChnID0+IGZsYXR0ZW5BcnRpY2xlVHJlZShnLm5vZGVzKSlcbiAgICBzZWN0aW9uQXJ0aWNsZUdyb3Vwcy5zZXQoa2V5LCBncm91cHMpXG4gICAgc2VjdGlvbkZsYXRBcnRpY2xlcy5zZXQoa2V5LCBmbGF0KVxuICAgIHNlY3Rpb25GaXJzdEFydGljbGUuc2V0KGtleSwgZmxhdFswXSlcbiAgfVxufVxuXG4vKiogRmluZCB3aGljaCBjb25maWcgc2VjdGlvbiBhbiBhcnRpY2xlIHBhdGggYmVsb25ncyB0byAqL1xuZXhwb3J0IGZ1bmN0aW9uIGN1cnJlbnRTZWN0aW9uKHBhdGg6IHN0cmluZykge1xuICBpZiAoIWNvbmZpZ1NlY3Rpb25zPy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWRcbiAgcmV0dXJuIG1hdGNoU2VjdGlvbihwYXRoLCBjb25maWdTZWN0aW9ucylcbn1cbiJdfQ==
@@ -0,0 +1,31 @@
1
+ import { config } from "livemark:virtual";
2
+ import { sectionFlatArticles, sortedArticles } from "./article.js";
3
+ const configSections = config.sections;
4
+ /** Per-section tag → article paths mapping. Articles sorted by date descending. */
5
+ export const sectionTags = new Map();
6
+ if (configSections?.length) {
7
+ for (const section of configSections) {
8
+ if (section.type !== "blog")
9
+ continue;
10
+ const flat = sectionFlatArticles.get(section.prefix) ?? [];
11
+ const tagMap = new Map();
12
+ for (const path of flat) {
13
+ const article = sortedArticles.find(a => a.path === path);
14
+ if (!article?.tags)
15
+ continue;
16
+ for (const tag of article.tags) {
17
+ const list = tagMap.get(tag);
18
+ if (list) {
19
+ list.push(path);
20
+ }
21
+ else {
22
+ tagMap.set(tag, [path]);
23
+ }
24
+ }
25
+ }
26
+ if (tagMap.size > 0) {
27
+ sectionTags.set(section.prefix, tagMap);
28
+ }
29
+ }
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc291cmNlL2NvbnRlbnQvdGFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRWxFLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7QUFFdEMsbUZBQW1GO0FBQ25GLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsRUFBaUMsQ0FBQTtBQUVuRSxJQUFJLGNBQWMsRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUMzQixLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNO1lBQUUsU0FBUTtRQUNyQyxNQUFNLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQTtRQUMxQyxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFBO1lBQ3pELElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSTtnQkFBRSxTQUFRO1lBQzVCLEtBQUssTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUM1QixJQUFJLElBQUksRUFBRSxDQUFDO29CQUNULElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ2pCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7Z0JBQ3pCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNwQixXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDekMsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcImxpdmVtYXJrOnZpcnR1YWxcIlxuaW1wb3J0IHsgc2VjdGlvbkZsYXRBcnRpY2xlcywgc29ydGVkQXJ0aWNsZXMgfSBmcm9tIFwiLi9hcnRpY2xlLnRzXCJcblxuY29uc3QgY29uZmlnU2VjdGlvbnMgPSBjb25maWcuc2VjdGlvbnNcblxuLyoqIFBlci1zZWN0aW9uIHRhZyDihpIgYXJ0aWNsZSBwYXRocyBtYXBwaW5nLiBBcnRpY2xlcyBzb3J0ZWQgYnkgZGF0ZSBkZXNjZW5kaW5nLiAqL1xuZXhwb3J0IGNvbnN0IHNlY3Rpb25UYWdzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZ1tdPj4oKVxuXG5pZiAoY29uZmlnU2VjdGlvbnM/Lmxlbmd0aCkge1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgY29uZmlnU2VjdGlvbnMpIHtcbiAgICBpZiAoc2VjdGlvbi50eXBlICE9PSBcImJsb2dcIikgY29udGludWVcbiAgICBjb25zdCBmbGF0ID0gc2VjdGlvbkZsYXRBcnRpY2xlcy5nZXQoc2VjdGlvbi5wcmVmaXgpID8/IFtdXG4gICAgY29uc3QgdGFnTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpXG4gICAgZm9yIChjb25zdCBwYXRoIG9mIGZsYXQpIHtcbiAgICAgIGNvbnN0IGFydGljbGUgPSBzb3J0ZWRBcnRpY2xlcy5maW5kKGEgPT4gYS5wYXRoID09PSBwYXRoKVxuICAgICAgaWYgKCFhcnRpY2xlPy50YWdzKSBjb250aW51ZVxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgYXJ0aWNsZS50YWdzKSB7XG4gICAgICAgIGNvbnN0IGxpc3QgPSB0YWdNYXAuZ2V0KHRhZylcbiAgICAgICAgaWYgKGxpc3QpIHtcbiAgICAgICAgICBsaXN0LnB1c2gocGF0aClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YWdNYXAuc2V0KHRhZywgW3BhdGhdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0YWdNYXAuc2l6ZSA+IDApIHtcbiAgICAgIHNlY3Rpb25UYWdzLnNldChzZWN0aW9uLnByZWZpeCwgdGFnTWFwKVxuICAgIH1cbiAgfVxufVxuIl19