@rimelight/ui 0.0.33 → 0.0.35

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 (389) hide show
  1. package/README.md +158 -157
  2. package/package.json +100 -105
  3. package/src/components/astro/RLAAccordion.astro +94 -18
  4. package/src/components/astro/RLAAspectRatio.astro +2 -2
  5. package/src/components/astro/RLAAvatar.astro +135 -68
  6. package/src/components/astro/RLABadge.astro +4 -2
  7. package/src/components/astro/RLABanner.astro +138 -23
  8. package/src/components/astro/RLABreadcrumb.astro +13 -0
  9. package/src/components/astro/RLAButton.astro +145 -139
  10. package/src/components/astro/RLACallout.astro +112 -0
  11. package/src/components/astro/RLACard.astro +6 -5
  12. package/src/components/astro/RLACarousel.astro +104 -75
  13. package/src/components/astro/RLAChart.astro +23 -35
  14. package/src/components/astro/RLAChip.astro +11 -5
  15. package/src/components/astro/RLACollapsible.astro +4 -1
  16. package/src/components/astro/RLAColorArea.astro +432 -0
  17. package/src/components/astro/RLAColorField.astro +300 -0
  18. package/src/components/astro/RLAColorSlider.astro +413 -0
  19. package/src/components/astro/RLAConfirm.astro +13 -11
  20. package/src/components/astro/RLACopyMarkdown.astro +78 -0
  21. package/src/components/astro/RLADate.astro +30 -0
  22. package/src/components/astro/RLADrawer.astro +50 -3
  23. package/src/components/astro/RLADropdownMenu.astro +78 -51
  24. package/src/components/astro/RLAFieldGroup.astro +4 -1
  25. package/src/components/astro/RLAFileUpload.astro +114 -100
  26. package/src/components/astro/RLAFooter.astro +2 -1
  27. package/src/components/astro/RLAFormField.astro +10 -6
  28. package/src/components/astro/RLAGrid.astro +31 -39
  29. package/src/components/astro/RLAHead.astro +528 -197
  30. package/src/components/astro/RLAHeader.astro +67 -59
  31. package/src/components/astro/RLAImage.astro +274 -209
  32. package/src/components/astro/RLAInput.astro +14 -9
  33. package/src/components/astro/RLAInputMenu.astro +119 -83
  34. package/src/components/astro/RLAKbd.astro +5 -5
  35. package/src/components/astro/RLALayoutGrid.astro +395 -0
  36. package/src/components/astro/RLALink.astro +44 -23
  37. package/src/components/astro/RLALinkGroup.astro +99 -37
  38. package/src/components/astro/RLALocaleSelector.astro +130 -113
  39. package/src/components/astro/RLALogo.astro +117 -90
  40. package/src/components/astro/RLAMain.astro +8 -3
  41. package/src/components/astro/RLAMarquee.astro +9 -2
  42. package/src/components/astro/RLAModal.astro +48 -18
  43. package/src/components/astro/RLANavigationMenu.astro +381 -137
  44. package/src/components/astro/{RLADocsPackageManagers.astro → RLAPackageManagers.astro} +81 -87
  45. package/src/components/astro/RLAPageSection.astro +4 -2
  46. package/src/components/astro/RLAPagination.astro +2 -4
  47. package/src/components/astro/RLAPopover.astro +4 -3
  48. package/src/components/astro/RLAPost.astro +11 -2
  49. package/src/components/astro/RLAProgress.astro +8 -2
  50. package/src/components/astro/RLAScrollArea.astro +4 -1
  51. package/src/components/astro/RLAScrollToTop.astro +200 -172
  52. package/src/components/astro/RLASearch.astro +282 -0
  53. package/src/components/astro/RLASelect.astro +101 -64
  54. package/src/components/astro/RLASeparator.astro +11 -6
  55. package/src/components/astro/RLAShare.astro +60 -0
  56. package/src/components/astro/RLAShortcuts.astro +429 -0
  57. package/src/components/astro/RLASidebar.astro +158 -212
  58. package/src/components/astro/RLASlideover.astro +99 -4
  59. package/src/components/astro/RLASlider.astro +14 -14
  60. package/src/components/astro/RLASplitter.astro +207 -142
  61. package/src/components/astro/RLASteps.astro +118 -71
  62. package/src/components/astro/RLAStickySurface.astro +9 -2
  63. package/src/components/astro/RLASurround.astro +39 -0
  64. package/src/components/astro/RLATable.astro +4 -1
  65. package/src/components/astro/RLATableOfContents.astro +109 -23
  66. package/src/components/astro/RLATabs.astro +147 -133
  67. package/src/components/astro/RLATextarea.astro +4 -1
  68. package/src/components/astro/RLAThemeSelector.astro +105 -76
  69. package/src/components/astro/RLAToast.astro +35 -21
  70. package/src/components/vue/RLVBanner.vue +230 -0
  71. package/src/components/vue/RLVButton.vue +3 -2
  72. package/src/components/vue/RLVCheckbox.vue +70 -68
  73. package/src/components/vue/RLVFooter.vue +3 -2
  74. package/src/components/vue/RLVForm.vue +44 -44
  75. package/src/components/vue/RLVFormField.vue +58 -58
  76. package/src/components/vue/RLVHeader.vue +3 -2
  77. package/src/components/vue/RLVIcon.vue +4 -2
  78. package/src/components/vue/RLVInput.vue +94 -93
  79. package/src/components/vue/RLVLogo.vue +25 -3
  80. package/src/components/vue/RLVPlaceholder.vue +3 -2
  81. package/src/components/vue/RLVPost.vue +69 -63
  82. package/src/components/vue/RLVPosts.vue +21 -21
  83. package/src/components/vue/RLVProgress.vue +60 -0
  84. package/src/components/vue/RLVScrollToTop.vue +65 -52
  85. package/src/components/vue/RLVSection.vue +14 -13
  86. package/src/components/vue/RLVToast.vue +81 -68
  87. package/src/components/vue/RLVToaster.vue +29 -29
  88. package/src/composables/index.ts +4 -3
  89. package/src/composables/useHeaderStore.ts +14 -14
  90. package/src/composables/useScrollToTop.ts +62 -62
  91. package/src/composables/useShortcuts.ts +11 -0
  92. package/src/composables/useToast.ts +43 -42
  93. package/src/config/index.ts +1 -0
  94. package/src/config/security.ts +227 -0
  95. package/src/config/site.config.ts +1 -0
  96. package/src/docs/components/ApiChangelog.astro +147 -0
  97. package/src/{plugins/starlightDocsApi → docs}/components/ApiEmits.astro +4 -4
  98. package/src/{plugins/starlightDocsApi → docs}/components/ApiProps.astro +4 -4
  99. package/src/{plugins/starlightDocsApi → docs}/components/ApiSlots.astro +4 -4
  100. package/src/docs/components/ApiTheme.astro +100 -0
  101. package/src/docs/extractAll.ts +94 -0
  102. package/src/docs/extractors/extractAstro.ts +69 -0
  103. package/src/docs/extractors/extractTheme.ts +56 -0
  104. package/src/{plugins/starlightDocsApi/extract-vue.ts → docs/extractors/extractVue.ts} +164 -15
  105. package/src/{plugins/starlightDocsApi → docs}/utils.ts +1 -2
  106. package/src/env.d.ts +0 -12
  107. package/src/integrations/ui.ts +215 -199
  108. package/src/middleware/security.ts +145 -29
  109. package/src/presets/defaults.ts +297 -297
  110. package/src/presets/index.ts +508 -637
  111. package/src/styles/index.css +158 -160
  112. package/src/themes/3d-hover.theme.ts +13 -13
  113. package/src/themes/accordion.theme.ts +39 -13
  114. package/src/themes/app.theme.ts +13 -13
  115. package/src/themes/aspect-ratio.theme.ts +1 -1
  116. package/src/themes/audio.theme.ts +13 -13
  117. package/src/themes/avatar-group.theme.ts +1 -1
  118. package/src/themes/avatar.theme.ts +84 -84
  119. package/src/themes/badge.theme.ts +168 -163
  120. package/src/themes/banner.theme.ts +49 -13
  121. package/src/themes/breadcrumb.theme.ts +1 -1
  122. package/src/themes/browser-mockup.theme.ts +13 -13
  123. package/src/themes/button.theme.ts +223 -202
  124. package/src/themes/calendar.theme.ts +13 -13
  125. package/src/themes/{alert.theme.ts → callout.theme.ts} +104 -125
  126. package/src/themes/card.theme.ts +50 -42
  127. package/src/themes/carousel.theme.ts +1 -1
  128. package/src/themes/chart.theme.ts +22 -22
  129. package/src/themes/chat-message.theme.ts +13 -13
  130. package/src/themes/chat-messages.theme.ts +13 -13
  131. package/src/themes/chat-palette.theme.ts +13 -13
  132. package/src/themes/chat-prompt-submit.theme.ts +13 -13
  133. package/src/themes/chat-prompt.theme.ts +13 -13
  134. package/src/themes/chat-reasoning.theme.ts +13 -13
  135. package/src/themes/chat-shimmer.theme.ts +13 -13
  136. package/src/themes/chat-tool.theme.ts +13 -13
  137. package/src/themes/chat.theme.ts +13 -13
  138. package/src/themes/checkbox.theme.ts +49 -50
  139. package/src/themes/chip.theme.ts +73 -74
  140. package/src/themes/color-area.theme.ts +33 -0
  141. package/src/themes/color-field.theme.ts +32 -0
  142. package/src/themes/color-picker.theme.ts +13 -13
  143. package/src/themes/color-slider.theme.ts +34 -0
  144. package/src/themes/command-palette.theme.ts +13 -13
  145. package/src/themes/compare.theme.ts +13 -13
  146. package/src/themes/confirm.theme.ts +48 -48
  147. package/src/themes/container.theme.ts +13 -13
  148. package/src/themes/context-menu.theme.ts +13 -13
  149. package/src/themes/dashboard-group.theme.ts +13 -13
  150. package/src/themes/dashboard-navbar.theme.ts +13 -13
  151. package/src/themes/dashboard-panel.theme.ts +13 -13
  152. package/src/themes/dashboard-resize-handle.theme.ts +13 -13
  153. package/src/themes/dashboard-search-button.theme.ts +13 -13
  154. package/src/themes/dashboard-search.theme.ts +13 -13
  155. package/src/themes/dashboard-sidebar-collapse.theme.ts +13 -13
  156. package/src/themes/dashboard-sidebar-toggle.theme.ts +13 -13
  157. package/src/themes/dashboard-sidebar.theme.ts +13 -13
  158. package/src/themes/dashboard-toolbar.theme.ts +13 -13
  159. package/src/themes/dock.theme.ts +13 -13
  160. package/src/themes/drawer.theme.ts +61 -61
  161. package/src/themes/dropdown-menu.theme.ts +29 -29
  162. package/src/themes/editor.theme.ts +13 -13
  163. package/src/themes/empty.theme.ts +13 -13
  164. package/src/themes/error.theme.ts +13 -13
  165. package/src/themes/field-group.theme.ts +24 -24
  166. package/src/themes/fieldset.theme.ts +13 -13
  167. package/src/themes/floating-action.theme.ts +13 -13
  168. package/src/themes/footer.theme.ts +30 -30
  169. package/src/themes/form.theme.ts +13 -13
  170. package/src/themes/gallery.theme.ts +13 -13
  171. package/src/themes/grid.theme.ts +38 -0
  172. package/src/themes/head.theme.ts +13 -13
  173. package/src/themes/header.theme.ts +46 -46
  174. package/src/themes/hover-card.theme.ts +1 -1
  175. package/src/themes/icon.theme.ts +23 -23
  176. package/src/themes/image.theme.ts +33 -19
  177. package/src/themes/input-date.theme.ts +13 -13
  178. package/src/themes/input-menu.theme.ts +35 -35
  179. package/src/themes/input-number.theme.ts +13 -13
  180. package/src/themes/input-tags.theme.ts +13 -13
  181. package/src/themes/input-time.theme.ts +13 -13
  182. package/src/themes/input.theme.ts +48 -42
  183. package/src/themes/kbd.theme.ts +94 -89
  184. package/src/themes/knob.theme.ts +13 -13
  185. package/src/themes/label.theme.ts +1 -1
  186. package/src/themes/layout-grid.theme.ts +16 -0
  187. package/src/themes/link-group.theme.ts +28 -32
  188. package/src/themes/link.theme.ts +13 -13
  189. package/src/themes/listbox.theme.ts +13 -13
  190. package/src/themes/locale-selector.theme.ts +49 -49
  191. package/src/themes/logo.theme.ts +13 -13
  192. package/src/themes/main.theme.ts +13 -13
  193. package/src/themes/marquee.theme.ts +1 -1
  194. package/src/themes/meter.theme.ts +13 -13
  195. package/src/themes/modal.theme.ts +1 -1
  196. package/src/themes/navigation-menu.theme.ts +44 -27
  197. package/src/themes/page-aside.theme.ts +13 -13
  198. package/src/themes/page-body.theme.ts +13 -13
  199. package/src/themes/page-header.theme.ts +13 -13
  200. package/src/themes/page-section.theme.ts +189 -187
  201. package/src/themes/page.theme.ts +13 -13
  202. package/src/themes/pagination.theme.ts +1 -1
  203. package/src/themes/password.theme.ts +13 -13
  204. package/src/themes/phone-mockup.theme.ts +13 -13
  205. package/src/themes/pin-input.theme.ts +1 -1
  206. package/src/themes/placeholder.theme.ts +15 -15
  207. package/src/themes/popover.theme.ts +1 -1
  208. package/src/themes/post.theme.ts +53 -33
  209. package/src/themes/pricing-plan.theme.ts +13 -13
  210. package/src/themes/pricing-table.theme.ts +13 -13
  211. package/src/themes/progress.theme.ts +37 -38
  212. package/src/themes/prose.theme.ts +13 -13
  213. package/src/themes/qr-code.theme.ts +13 -13
  214. package/src/themes/quote.theme.ts +13 -13
  215. package/src/themes/radio-group.theme.ts +13 -13
  216. package/src/themes/rating.theme.ts +13 -13
  217. package/src/themes/scroll-area.theme.ts +26 -26
  218. package/src/themes/scroll-to-top.theme.ts +51 -52
  219. package/src/themes/search.theme.ts +64 -0
  220. package/src/themes/select.theme.ts +29 -29
  221. package/src/themes/separator.theme.ts +147 -147
  222. package/src/themes/sidebar.theme.ts +38 -38
  223. package/src/themes/skeleton.theme.ts +21 -21
  224. package/src/themes/slideover.theme.ts +5 -5
  225. package/src/themes/slider.theme.ts +35 -36
  226. package/src/themes/speed-dial.theme.ts +13 -13
  227. package/src/themes/spinner.theme.ts +33 -34
  228. package/src/themes/splitter.theme.ts +23 -23
  229. package/src/themes/spoiler.theme.ts +13 -13
  230. package/src/themes/stepper.theme.ts +13 -13
  231. package/src/themes/{megamenu.theme.ts → steps.theme.ts} +13 -13
  232. package/src/themes/sticky-surface.theme.ts +1 -1
  233. package/src/themes/switch.theme.ts +66 -67
  234. package/src/themes/table-of-contents.theme.ts +67 -48
  235. package/src/themes/tabs.theme.ts +52 -52
  236. package/src/themes/textarea.theme.ts +27 -27
  237. package/src/themes/theme-selector.theme.ts +15 -15
  238. package/src/themes/timeline.theme.ts +18 -13
  239. package/src/themes/toast.theme.ts +31 -31
  240. package/src/themes/tooltip.theme.ts +28 -28
  241. package/src/themes/tour.theme.ts +13 -13
  242. package/src/themes/tree.theme.ts +13 -13
  243. package/src/themes/user.theme.ts +13 -13
  244. package/src/themes/video.theme.ts +17 -17
  245. package/src/themes/watermark.theme.ts +13 -13
  246. package/src/themes/window-mockup.theme.ts +13 -13
  247. package/src/types/components/3d-hover.ts +11 -11
  248. package/src/types/components/accordion.ts +35 -2
  249. package/src/types/components/app.ts +11 -11
  250. package/src/types/components/audio.ts +11 -11
  251. package/src/types/components/avatar-group.ts +11 -11
  252. package/src/types/components/avatar.ts +76 -60
  253. package/src/types/components/badge.ts +2 -2
  254. package/src/types/components/banner.ts +53 -11
  255. package/src/types/components/browser-mockup.ts +11 -11
  256. package/src/types/components/button.ts +73 -81
  257. package/src/types/components/calendar.ts +11 -11
  258. package/src/types/components/{alert.ts → callout.ts} +8 -8
  259. package/src/types/components/changelog.ts +11 -11
  260. package/src/types/components/chart.ts +2 -1
  261. package/src/types/components/chat-message.ts +11 -11
  262. package/src/types/components/chat-messages.ts +11 -11
  263. package/src/types/components/chat-palette.ts +11 -11
  264. package/src/types/components/chat-prompt-submit.ts +11 -11
  265. package/src/types/components/chat-prompt.ts +11 -11
  266. package/src/types/components/chat-reasoning.ts +11 -11
  267. package/src/types/components/chat-shimmer.ts +11 -11
  268. package/src/types/components/chat-tool.ts +11 -11
  269. package/src/types/components/chat.ts +11 -11
  270. package/src/types/components/checkbox.ts +2 -2
  271. package/src/types/components/chip.ts +17 -17
  272. package/src/types/components/collapsible.ts +2 -1
  273. package/src/types/components/color-area.ts +19 -0
  274. package/src/types/components/color-field.ts +21 -0
  275. package/src/types/components/color-picker.ts +11 -11
  276. package/src/types/components/color-slider.ts +20 -0
  277. package/src/types/components/command-palette.ts +11 -11
  278. package/src/types/components/compare.ts +11 -11
  279. package/src/types/components/container.ts +17 -17
  280. package/src/types/components/context-menu.ts +11 -11
  281. package/src/types/components/dashboard-group.ts +11 -11
  282. package/src/types/components/dashboard-navbar.ts +11 -11
  283. package/src/types/components/dashboard-panel.ts +11 -11
  284. package/src/types/components/dashboard-resize-handle.ts +11 -11
  285. package/src/types/components/dashboard-search-button.ts +11 -11
  286. package/src/types/components/dashboard-search.ts +11 -11
  287. package/src/types/components/dashboard-sidebar-collapse.ts +11 -11
  288. package/src/types/components/dashboard-sidebar-toggle.ts +11 -11
  289. package/src/types/components/dashboard-sidebar.ts +11 -11
  290. package/src/types/components/dashboard-toolbar.ts +11 -11
  291. package/src/types/components/dock.ts +11 -11
  292. package/src/types/components/dropdown-menu.ts +2 -1
  293. package/src/types/components/editor.ts +11 -11
  294. package/src/types/components/empty.ts +11 -11
  295. package/src/types/components/error.ts +11 -11
  296. package/src/types/components/fieldset.ts +11 -11
  297. package/src/types/components/file-upload.ts +2 -1
  298. package/src/types/components/floating-action.ts +11 -11
  299. package/src/types/components/form.ts +19 -19
  300. package/src/types/components/gallery.ts +11 -11
  301. package/src/types/components/grid.ts +23 -0
  302. package/src/types/components/icon.ts +19 -19
  303. package/src/types/components/image.ts +32 -28
  304. package/src/types/components/input-date.ts +11 -11
  305. package/src/types/components/input-menu.ts +44 -43
  306. package/src/types/components/input-number.ts +11 -11
  307. package/src/types/components/input-pin.ts +36 -35
  308. package/src/types/components/input-tags.ts +11 -11
  309. package/src/types/components/input-time.ts +11 -11
  310. package/src/types/components/input.ts +6 -2
  311. package/src/types/components/knob.ts +11 -11
  312. package/src/types/components/layout-grid.ts +145 -0
  313. package/src/types/components/link-group.ts +47 -23
  314. package/src/types/components/link.ts +19 -0
  315. package/src/types/components/listbox.ts +11 -11
  316. package/src/types/components/locale-selector.ts +33 -33
  317. package/src/types/components/logo.ts +32 -31
  318. package/src/types/components/main.ts +17 -17
  319. package/src/types/components/meter.ts +11 -11
  320. package/src/types/components/modal.ts +39 -39
  321. package/src/types/components/navigation-menu.ts +59 -54
  322. package/src/types/components/page-aside.ts +11 -11
  323. package/src/types/components/page-body.ts +11 -11
  324. package/src/types/components/page-header.ts +11 -11
  325. package/src/types/components/page.ts +11 -11
  326. package/src/types/components/password.ts +11 -11
  327. package/src/types/components/phone-mockup.ts +5 -5
  328. package/src/types/components/pin-input.ts +11 -11
  329. package/src/types/components/popover.ts +23 -23
  330. package/src/types/components/post.ts +47 -35
  331. package/src/types/components/pricing-plan.ts +11 -11
  332. package/src/types/components/pricing-table.ts +11 -11
  333. package/src/types/components/progress.ts +33 -33
  334. package/src/types/components/prose.ts +11 -11
  335. package/src/types/components/qr-code.ts +11 -11
  336. package/src/types/components/radio-group.ts +11 -11
  337. package/src/types/components/rating.ts +11 -11
  338. package/src/types/components/scroll-area.ts +23 -23
  339. package/src/types/components/scroll-to-top.ts +2 -2
  340. package/src/types/components/search.ts +29 -0
  341. package/src/types/components/select.ts +2 -1
  342. package/src/types/components/separator.ts +19 -19
  343. package/src/types/components/sidebar.ts +83 -72
  344. package/src/types/components/slideover.ts +31 -31
  345. package/src/types/components/slider.ts +2 -2
  346. package/src/types/components/speed-dial.ts +11 -11
  347. package/src/types/components/spinner.ts +25 -25
  348. package/src/types/components/splitter.ts +19 -19
  349. package/src/types/components/spoiler.ts +11 -11
  350. package/src/types/components/stepper.ts +11 -11
  351. package/src/types/components/{megamenu.ts → steps.ts} +17 -11
  352. package/src/types/components/sticky-surface.ts +19 -19
  353. package/src/types/components/switch.ts +41 -41
  354. package/src/types/components/table-of-contents.ts +39 -17
  355. package/src/types/components/tabs.ts +2 -1
  356. package/src/types/components/textarea.ts +2 -1
  357. package/src/types/components/theme-selector.ts +15 -15
  358. package/src/types/components/timeline.ts +11 -11
  359. package/src/types/components/toast.ts +6 -1
  360. package/src/types/components/tooltip.ts +23 -23
  361. package/src/types/components/tour.ts +11 -11
  362. package/src/types/components/tree.ts +11 -11
  363. package/src/types/components/user.ts +11 -11
  364. package/src/types/components/watermark.ts +11 -11
  365. package/src/types/components/window-mockup.ts +11 -11
  366. package/src/types/docs.ts +40 -0
  367. package/src/types/index.ts +151 -1
  368. package/src/types/theme.ts +11 -1
  369. package/src/utils/color.ts +165 -0
  370. package/src/utils/docs.ts +365 -189
  371. package/src/utils/headerStack.ts +115 -95
  372. package/src/utils/index.ts +7 -5
  373. package/src/utils/shortcuts.ts +322 -0
  374. package/src/components/TableOfContents.astro +0 -107
  375. package/src/components/astro/RLAAlert.astro +0 -93
  376. package/src/components/astro/RLABlogPost.astro +0 -7
  377. package/src/components/astro/RLABlogPosts.astro +0 -9
  378. package/src/components/astro/RLAChangelog.astro +0 -23
  379. package/src/components/astro/RLAMegamenu.astro +0 -23
  380. package/src/components/astro/RLAPosts.astro +0 -23
  381. package/src/plugins/index.ts +0 -2
  382. package/src/plugins/starlightDocsApi/components/ApiTheme.astro +0 -27
  383. package/src/plugins/starlightDocsApi/index.ts +0 -272
  384. package/src/styles/prism.css +0 -42
  385. package/src/themes/changelog.theme.ts +0 -13
  386. package/src/themes/posts.theme.ts +0 -13
  387. package/src/types/components/index.ts +0 -135
  388. package/src/types/components/posts.ts +0 -11
  389. /package/src/{plugins/starlightDocsApi → docs}/types.ts +0 -0
package/src/utils/docs.ts CHANGED
@@ -1,189 +1,365 @@
1
- import type { DocsConfig, BadgeConfig } from "../types"
2
-
3
- export function defineDocsConfig(config: DocsConfig): DocsConfig {
4
- return config
5
- }
6
-
7
- /** Strip a leading numeric sort prefix from a filename id, e.g. "01.getting-started" → "getting-started" */
8
- function stripNumericPrefix(id: string): string {
9
- return id.replace(/^(\d+\.)+/, "")
10
- }
11
-
12
- /** Extract a numeric sort key from a doc id for numeric-prefix sorting */
13
- function numericPrefixOrder(id: string): number {
14
- const segment = id.split("/").pop() ?? id
15
- const m = segment.match(/^(\d+)\./)
16
- return m ? parseInt(m[1], 10) : Infinity
17
- }
18
-
19
- export interface ResolvedSidebarItem {
20
- label: string
21
- href?: string
22
- icon?: string
23
- badge?: string | BadgeConfig
24
- active?: boolean
25
- children?: ResolvedSidebarItem[]
26
- collapsed?: boolean
27
- }
28
-
29
- export interface ResolvedScope {
30
- id: string
31
- label: string
32
- href: string
33
- icon?: string
34
- active?: boolean
35
- }
36
-
37
- export async function getDocsSidebar(
38
- config: DocsConfig,
39
- locale: string,
40
- currentPath: string,
41
- getCollection: (name: string) => Promise<any[]>
42
- ): Promise<{
43
- items: ResolvedSidebarItem[]
44
- scopes: ResolvedScope[]
45
- activeScope?: ResolvedScope
46
- }> {
47
- const docs = await getCollection("docs")
48
- const normPath = currentPath.replace(/\/$/, "").toLowerCase()
49
- const docsBase = `/${locale}/docs`
50
-
51
- const scopes: ResolvedScope[] = config.sidebar
52
- .filter((item): item is import("../types").SidebarScope => "id" in item)
53
- .map(scope => ({
54
- id: scope.id,
55
- label: scope.label,
56
- href: scope.href.replace("{locale}", locale),
57
- icon: scope.icon
58
- }))
59
-
60
- function isDocInItems(items: import("../types").SidebarItem[], docId: string | undefined, href: string): boolean {
61
- for (const item of items) {
62
- if (item.href && item.href.toLowerCase().replace(/\/$/, "") === href) return true
63
- if (item.autogenerate && docId) {
64
- const dir = item.autogenerate.directory.replace(/\/$/, "")
65
- if (dir === "") {
66
- if (!docId.includes("/")) return true
67
- } else if (docId.startsWith(dir + "/") || docId === dir) {
68
- return true
69
- }
70
- }
71
- if (item.children && isDocInItems(item.children, docId, href)) return true
72
- }
73
- return false
74
- }
75
-
76
- // Find active scope — most-specific prefix match, fallback to scanning scope items
77
- let activeScope = scopes.find(s => normPath === s.href.replace(/\/$/, "").toLowerCase())
78
- if (!activeScope) {
79
- const currentDoc = docs.find(d => `${docsBase}/${d.id}`.toLowerCase() === normPath)
80
- const scopeMatch = config.sidebar.find(s => {
81
- if (!("id" in s)) return false
82
- return isDocInItems(s.items || [], currentDoc?.id, normPath)
83
- }) as import("../types").SidebarScope | undefined
84
-
85
- if (scopeMatch) {
86
- activeScope = scopes.find(s => s.id === scopeMatch.id)
87
- }
88
- }
89
- if (!activeScope) {
90
- activeScope = [...scopes]
91
- .sort((a, b) => b.href.length - a.href.length)
92
- .find(s => normPath.startsWith(s.href.toLowerCase()))
93
- }
94
- if (activeScope) activeScope.active = true
95
-
96
- const sidebarConfig = config.sidebar.find(item =>
97
- "id" in item && activeScope && item.id === activeScope.id
98
- ) as import("../types").SidebarScope | undefined
99
-
100
- const items = sidebarConfig?.items || []
101
-
102
- async function resolveItem(item: import("../types").SidebarItem): Promise<ResolvedSidebarItem[]> {
103
- if (item.autogenerate) {
104
- const dir = item.autogenerate.directory
105
- // Match docs whose id starts with the directory
106
- const prefix = dir.replace(/\/$/, "")
107
- const filteredDocs = docs.filter(d => {
108
- if (d.data.sidebar?.hidden === true) return false
109
- if (prefix === "") return !d.id.includes("/")
110
- return d.id.startsWith(prefix + "/") || d.id === prefix
111
- })
112
-
113
- filteredDocs.sort((a, b) => {
114
- // 1. Frontmatter `order` takes priority
115
- const aOrder = a.data.sidebar?.order ?? a.data.order ?? numericPrefixOrder(a.id)
116
- const bOrder = b.data.sidebar?.order ?? b.data.order ?? numericPrefixOrder(b.id)
117
- if (aOrder !== bOrder) return aOrder - bOrder
118
- // 2. Fall back to alphabetical by stripped label
119
- const aLabel = a.data.sidebar?.label ?? a.data.title
120
- const bLabel = b.data.sidebar?.label ?? b.data.title
121
- return stripNumericPrefix(aLabel).localeCompare(stripNumericPrefix(bLabel))
122
- })
123
-
124
- return filteredDocs.map(doc => {
125
- const href = `${docsBase}/${doc.id}/`
126
- const badge = doc.data.sidebar?.badge ?? doc.data.badge as string | BadgeConfig | undefined
127
- return {
128
- label: doc.data.sidebar?.label ?? doc.data.title,
129
- href,
130
- badge,
131
- active: normPath === href.replace(/\/$/, "").toLowerCase()
132
- }
133
- })
134
- }
135
-
136
- const resolved: ResolvedSidebarItem = {
137
- label: item.label,
138
- href: item.href ? item.href.replace("{locale}", locale) : undefined,
139
- icon: item.icon,
140
- badge: item.badge,
141
- collapsed: item.collapsed
142
- }
143
-
144
- if (resolved.href) {
145
- resolved.active = normPath === resolved.href.replace(/\/$/, "").toLowerCase()
146
- }
147
-
148
- if (item.children) {
149
- const children: ResolvedSidebarItem[] = []
150
- for (const child of item.children) {
151
- children.push(...(await resolveItem(child)))
152
- }
153
- resolved.children = children
154
- if (!resolved.active) {
155
- resolved.active = children.some(c => c.active)
156
- }
157
- }
158
-
159
- return [resolved]
160
- }
161
-
162
- const resolvedItems: ResolvedSidebarItem[] = []
163
- for (const item of items) {
164
- resolvedItems.push(...(await resolveItem(item)))
165
- }
166
-
167
- return { items: resolvedItems, scopes, activeScope }
168
- }
169
-
170
- export function getSurroundItems(sidebar: ResolvedSidebarItem[], currentPath: string) {
171
- const flatItems: { label: string, href: string }[] = []
172
-
173
- function flatten(items: ResolvedSidebarItem[]) {
174
- for (const item of items) {
175
- if (item.href) flatItems.push({ label: item.label, href: item.href })
176
- if (item.children) flatten(item.children)
177
- }
178
- }
179
-
180
- flatten(sidebar)
181
-
182
- const normPath = currentPath.replace(/\/$/, "").toLowerCase()
183
- const currentIndex = flatItems.findIndex(item => item.href.replace(/\/$/, "").toLowerCase() === normPath)
184
-
185
- return {
186
- prev: currentIndex > 0 ? flatItems[currentIndex - 1] : null,
187
- next: currentIndex >= 0 && currentIndex < flatItems.length - 1 ? flatItems[currentIndex + 1] : null
188
- }
189
- }
1
+ import type {
2
+ DocsConfig,
3
+ BadgeConfig,
4
+ PropMeta,
5
+ ThemeMeta,
6
+ SidebarItem,
7
+ SidebarScope
8
+ } from "../types"
9
+
10
+ export function defineDocsConfig(config: DocsConfig): DocsConfig {
11
+ return config
12
+ }
13
+
14
+ export interface ResolvedSidebarItem {
15
+ label: string
16
+ href?: string | undefined
17
+ icon?: string | undefined
18
+ badge?: string | BadgeConfig | undefined
19
+ active?: boolean | undefined
20
+ children?: ResolvedSidebarItem[] | undefined
21
+ collapsed?: boolean | undefined
22
+ }
23
+
24
+ export interface ResolvedScope {
25
+ id: string
26
+ label: string
27
+ href: string
28
+ icon?: string | undefined
29
+ active?: boolean | undefined
30
+ }
31
+
32
+ export function formatDocsUrl(
33
+ href: string,
34
+ locale: string,
35
+ activeVersion?: string,
36
+ includeVersionInUrl?: boolean
37
+ ): string {
38
+ let url = href.replace("{locale}", locale)
39
+ if (activeVersion && includeVersionInUrl) {
40
+ if (url.includes(`/${activeVersion}/`) || url.endsWith(`/${activeVersion}`)) {
41
+ return url
42
+ }
43
+ const docsPattern = new RegExp(`(/${locale}/docs)(/|$)`)
44
+ const companyDocsPattern = new RegExp(`(/${locale}/company/docs)(/|$)`)
45
+
46
+ if (companyDocsPattern.test(url)) {
47
+ url = url.replace(companyDocsPattern, `$1/${activeVersion}$2`)
48
+ } else if (docsPattern.test(url)) {
49
+ url = url.replace(docsPattern, `$1/${activeVersion}$2`)
50
+ }
51
+
52
+ url = url.replace(/\/{2,}/g, "/")
53
+ }
54
+ return url
55
+ }
56
+
57
+ export interface DocEntry {
58
+ id: string
59
+ [key: string]: any
60
+ }
61
+
62
+ export function getDocsVersions(entries: DocEntry[], locale: string): string[] {
63
+ const versions = new Set<string>()
64
+ for (const entry of entries) {
65
+ const id = entry.id.replace(/\\/g, "/")
66
+ const parts = id.split("/")
67
+ // File structure is: [version]/[locale]/[...slug]
68
+ if (parts[1] === locale && parts[0]?.startsWith("v")) {
69
+ versions.add(parts[0])
70
+ }
71
+ }
72
+ return Array.from(versions).toSorted((a, b) => {
73
+ return b.localeCompare(a, undefined, { numeric: true, sensitivity: "base" })
74
+ })
75
+ }
76
+
77
+ export function parseDocsSlug(slug: string | undefined, versions: string[]) {
78
+ if (versions.length === 0) {
79
+ return {
80
+ activeVersion: "",
81
+ contentPath: slug || "index",
82
+ includeVersionInUrl: false
83
+ }
84
+ }
85
+
86
+ const defaultVersion = versions[0]
87
+ const isMultiVersion = versions.length > 1
88
+
89
+ if (!slug) {
90
+ return {
91
+ activeVersion: defaultVersion,
92
+ contentPath: "index",
93
+ includeVersionInUrl: isMultiVersion
94
+ }
95
+ }
96
+
97
+ const parts = slug.split("/")
98
+ const firstPart = parts[0]
99
+
100
+ if (firstPart && versions.includes(firstPart)) {
101
+ return {
102
+ activeVersion: firstPart,
103
+ contentPath: parts.slice(1).join("/") || "index",
104
+ includeVersionInUrl: isMultiVersion
105
+ }
106
+ }
107
+
108
+ return {
109
+ activeVersion: defaultVersion,
110
+ contentPath: slug || "index",
111
+ includeVersionInUrl: isMultiVersion
112
+ }
113
+ }
114
+
115
+ function findFirstHref(
116
+ items: SidebarItem[],
117
+ locale: string,
118
+ activeVersion?: string,
119
+ includeVersionInUrl?: boolean
120
+ ): string | undefined {
121
+ for (const item of items) {
122
+ if (item.href) return formatDocsUrl(item.href, locale, activeVersion, includeVersionInUrl)
123
+ const childItems = item.children || item.items
124
+ if (childItems) {
125
+ const found = findFirstHref(childItems, locale, activeVersion, includeVersionInUrl)
126
+ if (found) return found
127
+ }
128
+ }
129
+ return undefined
130
+ }
131
+
132
+ function getScopePrefix(
133
+ items: SidebarItem[],
134
+ locale: string,
135
+ activeVersion?: string,
136
+ includeVersionInUrl?: boolean
137
+ ): string {
138
+ const allHrefs: string[] = []
139
+
140
+ function collect(item: SidebarItem) {
141
+ if (item.href)
142
+ allHrefs.push(formatDocsUrl(item.href, locale, activeVersion, includeVersionInUrl))
143
+ const childItems = item.children || item.items
144
+ if (childItems) childItems.forEach(collect)
145
+ }
146
+
147
+ items.forEach(collect)
148
+ if (allHrefs.length === 0) return ""
149
+
150
+ const parts = allHrefs.map((h) => h.split("/").filter(Boolean))
151
+ let commonLen = 0
152
+ const firstPart = parts[0]
153
+ if (!firstPart) return ""
154
+ for (let i = 0; i < firstPart.length; i++) {
155
+ if (parts.every((p) => p[i] === firstPart[i])) commonLen++
156
+ else break
157
+ }
158
+
159
+ return "/" + firstPart.slice(0, commonLen).join("/") + "/"
160
+ }
161
+
162
+ function hasPath(
163
+ items: SidebarItem[],
164
+ locale: string,
165
+ normPath: string,
166
+ activeVersion?: string,
167
+ includeVersionInUrl?: boolean
168
+ ): boolean {
169
+ for (const item of items) {
170
+ if (
171
+ item.href &&
172
+ formatDocsUrl(item.href, locale, activeVersion, includeVersionInUrl)
173
+ .replace(/\/$/, "")
174
+ .toLowerCase() === normPath
175
+ ) {
176
+ return true
177
+ }
178
+ const childItems = item.children || item.items
179
+ if (childItems && hasPath(childItems, locale, normPath, activeVersion, includeVersionInUrl)) {
180
+ return true
181
+ }
182
+ }
183
+ return false
184
+ }
185
+
186
+ export async function getDocsSidebar(
187
+ config: DocsConfig,
188
+ locale: string,
189
+ currentPath: string,
190
+ activeVersion?: string,
191
+ includeVersionInUrl?: boolean
192
+ ): Promise<{
193
+ items: ResolvedSidebarItem[]
194
+ scopes: ResolvedScope[]
195
+ activeScope?: ResolvedScope | undefined
196
+ }> {
197
+ const normPath = currentPath.replace(/\/$/, "").toLowerCase()
198
+
199
+ const sidebarScopes: SidebarScope[] = Array.isArray(config.sidebar)
200
+ ? config.sidebar.filter((item): item is SidebarScope => "id" in item || "scopes" in item)
201
+ : config.sidebar.scopes || []
202
+
203
+ const scopes: ResolvedScope[] = sidebarScopes.map((scope) => {
204
+ const id = scope.id || scope.label
205
+ let href = scope.href || ""
206
+ if (!href && scope.items && scope.items.length > 0) {
207
+ href = findFirstHref(scope.items, locale, activeVersion, includeVersionInUrl) || ""
208
+ }
209
+ return {
210
+ id,
211
+ label: scope.label,
212
+ href: formatDocsUrl(href, locale, activeVersion, includeVersionInUrl),
213
+ icon: scope.icon
214
+ }
215
+ })
216
+
217
+ // Compute scope prefixes for active detection (separate from clickable hrefs)
218
+ const scopePrefixes: string[] = sidebarScopes.map((scope) =>
219
+ scope.items ? getScopePrefix(scope.items, locale, activeVersion, includeVersionInUrl) : ""
220
+ )
221
+
222
+ let activeScope = scopes.find((s) => normPath === s.href.replace(/\/$/, "").toLowerCase())
223
+ if (!activeScope) {
224
+ for (let i = 0; i < sidebarScopes.length; i++) {
225
+ const scope = sidebarScopes[i]
226
+ if (
227
+ scope &&
228
+ scope.items &&
229
+ hasPath(scope.items, locale, normPath, activeVersion, includeVersionInUrl)
230
+ ) {
231
+ activeScope = scopes[i]
232
+ break
233
+ }
234
+ }
235
+ }
236
+ if (!activeScope) {
237
+ const sorted = [...scopePrefixes.entries()]
238
+ .filter(([, p]) => p)
239
+ .toSorted(([, a], [, b]) => b.length - a.length)
240
+ for (const [i] of sorted) {
241
+ const prefix = scopePrefixes[i]
242
+ if (prefix && normPath.startsWith(prefix.toLowerCase())) {
243
+ activeScope = scopes[i]
244
+ break
245
+ }
246
+ }
247
+ }
248
+ if (!activeScope && scopes.length > 0) {
249
+ activeScope = scopes[0]
250
+ }
251
+ if (activeScope) activeScope.active = true
252
+
253
+ const sidebarConfig = sidebarScopes.find(
254
+ (item) => activeScope && (item.id === activeScope.id || item.label === activeScope.id)
255
+ )
256
+
257
+ const items = sidebarConfig?.items || []
258
+
259
+ async function resolveItem(item: SidebarItem): Promise<ResolvedSidebarItem[]> {
260
+ const resolved: ResolvedSidebarItem = {
261
+ label: item.label || "",
262
+ href: item.href
263
+ ? formatDocsUrl(item.href, locale, activeVersion, includeVersionInUrl)
264
+ : undefined,
265
+ icon: item.icon,
266
+ badge: item.badge,
267
+ collapsed: item.collapsed
268
+ }
269
+
270
+ if (resolved.href) {
271
+ resolved.active = normPath === resolved.href.replace(/\/$/, "").toLowerCase()
272
+ }
273
+
274
+ const childItems = item.children || item.items
275
+ if (childItems) {
276
+ const children: ResolvedSidebarItem[] = []
277
+ const resolvedChildren = await Promise.all(childItems.map((child) => resolveItem(child)))
278
+ for (const res of resolvedChildren) {
279
+ children.push(...res)
280
+ }
281
+ resolved.children = children
282
+ if (!resolved.active) {
283
+ resolved.active = children.some((c) => c.active)
284
+ }
285
+ }
286
+
287
+ return [resolved]
288
+ }
289
+
290
+ const resolvedItems: ResolvedSidebarItem[] = []
291
+ const resolvedAllItems = await Promise.all(items.map((item) => resolveItem(item)))
292
+ for (const res of resolvedAllItems) {
293
+ resolvedItems.push(...res)
294
+ }
295
+
296
+ return { items: resolvedItems, scopes, activeScope }
297
+ }
298
+
299
+ export function getSurroundItems(sidebar: ResolvedSidebarItem[], currentPath: string) {
300
+ const flatItems: { label: string; href: string }[] = []
301
+
302
+ function flatten(items: ResolvedSidebarItem[]) {
303
+ for (const item of items) {
304
+ if (item.href) flatItems.push({ label: item.label, href: item.href })
305
+ if (item.children) flatten(item.children)
306
+ }
307
+ }
308
+
309
+ flatten(sidebar)
310
+
311
+ const normPath = currentPath.replace(/\/$/, "").toLowerCase()
312
+ const currentIndex = flatItems.findIndex(
313
+ (item) => item.href.replace(/\/$/, "").toLowerCase() === normPath
314
+ )
315
+
316
+ return {
317
+ prev: currentIndex > 0 ? flatItems[currentIndex - 1] : null,
318
+ next:
319
+ currentIndex >= 0 && currentIndex < flatItems.length - 1 ? flatItems[currentIndex + 1] : null
320
+ }
321
+ }
322
+
323
+ export function kebabToPascal(name: string): string {
324
+ return name
325
+ .split("-")
326
+ .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))
327
+ .join("")
328
+ }
329
+
330
+ export function filterProps(
331
+ props: PropMeta[],
332
+ options: { hide?: string[]; show?: string[] }
333
+ ): PropMeta[] {
334
+ if (options.show?.length) {
335
+ return props.filter((p) => options.show!.includes(p.name))
336
+ }
337
+ if (options.hide?.length) {
338
+ return props.filter((p) => !options.hide!.includes(p.name))
339
+ }
340
+ return props
341
+ }
342
+
343
+ export function generateThemeCode(componentName: string, theme: ThemeMeta): string {
344
+ const componentConfig: Record<string, unknown> = {
345
+ ...(theme.slots.length ? { slots: theme.slots } : {}),
346
+ ...(Object.keys(theme.base).length ? { base: theme.base } : {}),
347
+ ...(Object.keys(theme.variants).length ? { variants: theme.variants } : {}),
348
+ ...(theme.compoundVariants.length ? { compoundVariants: theme.compoundVariants } : {}),
349
+ ...(Object.keys(theme.defaultVariants).length ? { defaultVariants: theme.defaultVariants } : {})
350
+ }
351
+
352
+ return `// astro.config.ts
353
+ import { ui } from "@rimelight/ui"
354
+ import { defineConfig } from "astro/config"
355
+
356
+ export default defineConfig({
357
+ integrations: [
358
+ ui({
359
+ components: {
360
+ ${componentName}: ${JSON.stringify(componentConfig, null, 6).replace(/\n/g, "\n ")}
361
+ }
362
+ })
363
+ ]
364
+ })`
365
+ }