@rimelight/ui 0.0.33 → 0.0.34

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 (282) hide show
  1. package/README.md +157 -157
  2. package/package.json +105 -105
  3. package/src/components/astro/RLAAspectRatio.astro +2 -2
  4. package/src/components/astro/RLAButton.astro +141 -139
  5. package/src/components/astro/RLAChart.astro +19 -34
  6. package/src/components/astro/RLAHead.astro +427 -196
  7. package/src/components/astro/RLAHeader.astro +66 -59
  8. package/src/components/astro/RLAImage.astro +61 -19
  9. package/src/components/astro/RLALink.astro +22 -23
  10. package/src/components/astro/RLALinkGroup.astro +66 -4
  11. package/src/components/astro/RLALocaleSelector.astro +136 -113
  12. package/src/components/astro/RLAMain.astro +8 -3
  13. package/src/components/astro/RLAMarquee.astro +9 -2
  14. package/src/components/astro/RLANavigationMenu.astro +245 -56
  15. package/src/components/astro/RLAPagination.astro +2 -4
  16. package/src/components/astro/RLAProgress.astro +8 -2
  17. package/src/components/astro/RLASelect.astro +38 -24
  18. package/src/components/astro/RLASlideover.astro +66 -1
  19. package/src/components/astro/RLASlider.astro +14 -14
  20. package/src/components/astro/RLASplitter.astro +14 -2
  21. package/src/components/astro/RLAStickySurface.astro +9 -2
  22. package/src/components/vue/RLVCheckbox.vue +68 -68
  23. package/src/components/vue/RLVForm.vue +44 -44
  24. package/src/components/vue/RLVFormField.vue +58 -58
  25. package/src/components/vue/RLVInput.vue +93 -93
  26. package/src/components/vue/RLVPost.vue +63 -63
  27. package/src/components/vue/RLVPosts.vue +21 -21
  28. package/src/components/vue/RLVToast.vue +68 -68
  29. package/src/components/vue/RLVToaster.vue +29 -29
  30. package/src/composables/index.ts +3 -3
  31. package/src/composables/useHeaderStore.ts +13 -14
  32. package/src/composables/useScrollToTop.ts +62 -62
  33. package/src/composables/useToast.ts +43 -42
  34. package/src/config/index.ts +1 -0
  35. package/src/config/security.ts +220 -0
  36. package/src/integrations/ui.ts +199 -199
  37. package/src/middleware/security.ts +75 -15
  38. package/src/plugins/index.ts +2 -2
  39. package/src/plugins/starlightDocsApi/index.ts +272 -272
  40. package/src/presets/defaults.ts +297 -297
  41. package/src/presets/index.ts +683 -637
  42. package/src/styles/index.css +160 -160
  43. package/src/themes/3d-hover.theme.ts +13 -13
  44. package/src/themes/accordion.theme.ts +13 -13
  45. package/src/themes/alert.theme.ts +131 -125
  46. package/src/themes/app.theme.ts +13 -13
  47. package/src/themes/audio.theme.ts +13 -13
  48. package/src/themes/avatar.theme.ts +84 -84
  49. package/src/themes/badge.theme.ts +169 -163
  50. package/src/themes/banner.theme.ts +13 -13
  51. package/src/themes/browser-mockup.theme.ts +13 -13
  52. package/src/themes/button.theme.ts +224 -202
  53. package/src/themes/calendar.theme.ts +13 -13
  54. package/src/themes/card.theme.ts +42 -42
  55. package/src/themes/changelog.theme.ts +13 -13
  56. package/src/themes/chart.theme.ts +22 -22
  57. package/src/themes/chat-message.theme.ts +13 -13
  58. package/src/themes/chat-messages.theme.ts +13 -13
  59. package/src/themes/chat-palette.theme.ts +13 -13
  60. package/src/themes/chat-prompt-submit.theme.ts +13 -13
  61. package/src/themes/chat-prompt.theme.ts +13 -13
  62. package/src/themes/chat-reasoning.theme.ts +13 -13
  63. package/src/themes/chat-shimmer.theme.ts +13 -13
  64. package/src/themes/chat-tool.theme.ts +13 -13
  65. package/src/themes/chat.theme.ts +13 -13
  66. package/src/themes/checkbox.theme.ts +50 -50
  67. package/src/themes/chip.theme.ts +74 -74
  68. package/src/themes/color-picker.theme.ts +13 -13
  69. package/src/themes/command-palette.theme.ts +13 -13
  70. package/src/themes/compare.theme.ts +13 -13
  71. package/src/themes/confirm.theme.ts +48 -48
  72. package/src/themes/container.theme.ts +13 -13
  73. package/src/themes/context-menu.theme.ts +13 -13
  74. package/src/themes/dashboard-group.theme.ts +13 -13
  75. package/src/themes/dashboard-navbar.theme.ts +13 -13
  76. package/src/themes/dashboard-panel.theme.ts +13 -13
  77. package/src/themes/dashboard-resize-handle.theme.ts +13 -13
  78. package/src/themes/dashboard-search-button.theme.ts +13 -13
  79. package/src/themes/dashboard-search.theme.ts +13 -13
  80. package/src/themes/dashboard-sidebar-collapse.theme.ts +13 -13
  81. package/src/themes/dashboard-sidebar-toggle.theme.ts +13 -13
  82. package/src/themes/dashboard-sidebar.theme.ts +13 -13
  83. package/src/themes/dashboard-toolbar.theme.ts +13 -13
  84. package/src/themes/dock.theme.ts +13 -13
  85. package/src/themes/drawer.theme.ts +61 -61
  86. package/src/themes/dropdown-menu.theme.ts +29 -29
  87. package/src/themes/editor.theme.ts +13 -13
  88. package/src/themes/empty.theme.ts +13 -13
  89. package/src/themes/error.theme.ts +13 -13
  90. package/src/themes/field-group.theme.ts +24 -24
  91. package/src/themes/fieldset.theme.ts +13 -13
  92. package/src/themes/floating-action.theme.ts +13 -13
  93. package/src/themes/footer.theme.ts +30 -30
  94. package/src/themes/form.theme.ts +13 -13
  95. package/src/themes/gallery.theme.ts +13 -13
  96. package/src/themes/head.theme.ts +13 -13
  97. package/src/themes/header.theme.ts +45 -46
  98. package/src/themes/icon.theme.ts +23 -23
  99. package/src/themes/image.theme.ts +23 -19
  100. package/src/themes/input-date.theme.ts +13 -13
  101. package/src/themes/input-menu.theme.ts +35 -35
  102. package/src/themes/input-number.theme.ts +13 -13
  103. package/src/themes/input-tags.theme.ts +13 -13
  104. package/src/themes/input-time.theme.ts +13 -13
  105. package/src/themes/input.theme.ts +42 -42
  106. package/src/themes/kbd.theme.ts +95 -89
  107. package/src/themes/knob.theme.ts +13 -13
  108. package/src/themes/link-group.theme.ts +32 -32
  109. package/src/themes/link.theme.ts +13 -13
  110. package/src/themes/listbox.theme.ts +13 -13
  111. package/src/themes/locale-selector.theme.ts +49 -49
  112. package/src/themes/logo.theme.ts +13 -13
  113. package/src/themes/main.theme.ts +13 -13
  114. package/src/themes/megamenu.theme.ts +13 -13
  115. package/src/themes/meter.theme.ts +13 -13
  116. package/src/themes/navigation-menu.theme.ts +44 -27
  117. package/src/themes/page-aside.theme.ts +13 -13
  118. package/src/themes/page-body.theme.ts +13 -13
  119. package/src/themes/page-header.theme.ts +13 -13
  120. package/src/themes/page-section.theme.ts +187 -187
  121. package/src/themes/page.theme.ts +13 -13
  122. package/src/themes/password.theme.ts +13 -13
  123. package/src/themes/phone-mockup.theme.ts +13 -13
  124. package/src/themes/placeholder.theme.ts +15 -15
  125. package/src/themes/post.theme.ts +33 -33
  126. package/src/themes/pricing-plan.theme.ts +13 -13
  127. package/src/themes/pricing-table.theme.ts +13 -13
  128. package/src/themes/progress.theme.ts +38 -38
  129. package/src/themes/prose.theme.ts +13 -13
  130. package/src/themes/qr-code.theme.ts +13 -13
  131. package/src/themes/quote.theme.ts +13 -13
  132. package/src/themes/radio-group.theme.ts +13 -13
  133. package/src/themes/rating.theme.ts +13 -13
  134. package/src/themes/scroll-area.theme.ts +26 -26
  135. package/src/themes/scroll-to-top.theme.ts +52 -52
  136. package/src/themes/select.theme.ts +29 -29
  137. package/src/themes/separator.theme.ts +147 -147
  138. package/src/themes/sidebar.theme.ts +38 -38
  139. package/src/themes/skeleton.theme.ts +21 -21
  140. package/src/themes/slideover.theme.ts +4 -4
  141. package/src/themes/slider.theme.ts +36 -36
  142. package/src/themes/speed-dial.theme.ts +13 -13
  143. package/src/themes/spinner.theme.ts +34 -34
  144. package/src/themes/splitter.theme.ts +23 -23
  145. package/src/themes/spoiler.theme.ts +13 -13
  146. package/src/themes/stepper.theme.ts +13 -13
  147. package/src/themes/switch.theme.ts +67 -67
  148. package/src/themes/table-of-contents.theme.ts +48 -48
  149. package/src/themes/tabs.theme.ts +52 -52
  150. package/src/themes/textarea.theme.ts +27 -27
  151. package/src/themes/theme-selector.theme.ts +15 -15
  152. package/src/themes/timeline.theme.ts +13 -13
  153. package/src/themes/toast.theme.ts +31 -31
  154. package/src/themes/tooltip.theme.ts +28 -28
  155. package/src/themes/tour.theme.ts +13 -13
  156. package/src/themes/tree.theme.ts +13 -13
  157. package/src/themes/user.theme.ts +13 -13
  158. package/src/themes/video.theme.ts +17 -17
  159. package/src/themes/watermark.theme.ts +13 -13
  160. package/src/themes/window-mockup.theme.ts +13 -13
  161. package/src/types/components/3d-hover.ts +11 -11
  162. package/src/types/components/alert.ts +2 -2
  163. package/src/types/components/app.ts +11 -11
  164. package/src/types/components/audio.ts +11 -11
  165. package/src/types/components/avatar-group.ts +11 -11
  166. package/src/types/components/avatar.ts +60 -60
  167. package/src/types/components/badge.ts +2 -2
  168. package/src/types/components/banner.ts +11 -11
  169. package/src/types/components/browser-mockup.ts +11 -11
  170. package/src/types/components/button.ts +74 -81
  171. package/src/types/components/calendar.ts +11 -11
  172. package/src/types/components/changelog.ts +11 -11
  173. package/src/types/components/chart.ts +2 -1
  174. package/src/types/components/chat-message.ts +11 -11
  175. package/src/types/components/chat-messages.ts +11 -11
  176. package/src/types/components/chat-palette.ts +11 -11
  177. package/src/types/components/chat-prompt-submit.ts +11 -11
  178. package/src/types/components/chat-prompt.ts +11 -11
  179. package/src/types/components/chat-reasoning.ts +11 -11
  180. package/src/types/components/chat-shimmer.ts +11 -11
  181. package/src/types/components/chat-tool.ts +11 -11
  182. package/src/types/components/chat.ts +11 -11
  183. package/src/types/components/checkbox.ts +2 -2
  184. package/src/types/components/chip.ts +17 -17
  185. package/src/types/components/collapsible.ts +2 -1
  186. package/src/types/components/color-picker.ts +11 -11
  187. package/src/types/components/command-palette.ts +11 -11
  188. package/src/types/components/compare.ts +11 -11
  189. package/src/types/components/container.ts +17 -17
  190. package/src/types/components/context-menu.ts +11 -11
  191. package/src/types/components/dashboard-group.ts +11 -11
  192. package/src/types/components/dashboard-navbar.ts +11 -11
  193. package/src/types/components/dashboard-panel.ts +11 -11
  194. package/src/types/components/dashboard-resize-handle.ts +11 -11
  195. package/src/types/components/dashboard-search-button.ts +11 -11
  196. package/src/types/components/dashboard-search.ts +11 -11
  197. package/src/types/components/dashboard-sidebar-collapse.ts +11 -11
  198. package/src/types/components/dashboard-sidebar-toggle.ts +11 -11
  199. package/src/types/components/dashboard-sidebar.ts +11 -11
  200. package/src/types/components/dashboard-toolbar.ts +11 -11
  201. package/src/types/components/dock.ts +11 -11
  202. package/src/types/components/dropdown-menu.ts +2 -1
  203. package/src/types/components/editor.ts +11 -11
  204. package/src/types/components/empty.ts +11 -11
  205. package/src/types/components/error.ts +11 -11
  206. package/src/types/components/fieldset.ts +11 -11
  207. package/src/types/components/file-upload.ts +2 -1
  208. package/src/types/components/floating-action.ts +11 -11
  209. package/src/types/components/form.ts +19 -19
  210. package/src/types/components/gallery.ts +11 -11
  211. package/src/types/components/icon.ts +19 -19
  212. package/src/types/components/image.ts +32 -28
  213. package/src/types/components/index.ts +134 -135
  214. package/src/types/components/input-date.ts +11 -11
  215. package/src/types/components/input-menu.ts +44 -43
  216. package/src/types/components/input-number.ts +11 -11
  217. package/src/types/components/input-pin.ts +36 -35
  218. package/src/types/components/input-tags.ts +11 -11
  219. package/src/types/components/input-time.ts +11 -11
  220. package/src/types/components/input.ts +2 -2
  221. package/src/types/components/knob.ts +11 -11
  222. package/src/types/components/link-group.ts +45 -23
  223. package/src/types/components/link.ts +4 -0
  224. package/src/types/components/listbox.ts +11 -11
  225. package/src/types/components/locale-selector.ts +33 -33
  226. package/src/types/components/logo.ts +32 -31
  227. package/src/types/components/main.ts +17 -17
  228. package/src/types/components/megamenu.ts +11 -11
  229. package/src/types/components/meter.ts +11 -11
  230. package/src/types/components/modal.ts +39 -39
  231. package/src/types/components/navigation-menu.ts +59 -54
  232. package/src/types/components/page-aside.ts +11 -11
  233. package/src/types/components/page-body.ts +11 -11
  234. package/src/types/components/page-header.ts +11 -11
  235. package/src/types/components/page.ts +11 -11
  236. package/src/types/components/password.ts +11 -11
  237. package/src/types/components/phone-mockup.ts +5 -5
  238. package/src/types/components/pin-input.ts +11 -11
  239. package/src/types/components/popover.ts +23 -23
  240. package/src/types/components/post.ts +35 -35
  241. package/src/types/components/pricing-plan.ts +11 -11
  242. package/src/types/components/pricing-table.ts +11 -11
  243. package/src/types/components/progress.ts +33 -33
  244. package/src/types/components/prose.ts +11 -11
  245. package/src/types/components/qr-code.ts +11 -11
  246. package/src/types/components/radio-group.ts +11 -11
  247. package/src/types/components/rating.ts +11 -11
  248. package/src/types/components/scroll-area.ts +23 -23
  249. package/src/types/components/scroll-to-top.ts +2 -2
  250. package/src/types/components/select.ts +2 -1
  251. package/src/types/components/separator.ts +19 -19
  252. package/src/types/components/sidebar.ts +87 -72
  253. package/src/types/components/slideover.ts +31 -31
  254. package/src/types/components/slider.ts +2 -2
  255. package/src/types/components/speed-dial.ts +11 -11
  256. package/src/types/components/spinner.ts +25 -25
  257. package/src/types/components/splitter.ts +19 -19
  258. package/src/types/components/spoiler.ts +11 -11
  259. package/src/types/components/stepper.ts +11 -11
  260. package/src/types/components/sticky-surface.ts +19 -19
  261. package/src/types/components/switch.ts +41 -41
  262. package/src/types/components/table-of-contents.ts +17 -17
  263. package/src/types/components/tabs.ts +2 -1
  264. package/src/types/components/textarea.ts +2 -1
  265. package/src/types/components/theme-selector.ts +15 -15
  266. package/src/types/components/timeline.ts +11 -11
  267. package/src/types/components/toast.ts +2 -1
  268. package/src/types/components/tooltip.ts +23 -23
  269. package/src/types/components/tour.ts +11 -11
  270. package/src/types/components/tree.ts +11 -11
  271. package/src/types/components/user.ts +11 -11
  272. package/src/types/components/watermark.ts +11 -11
  273. package/src/types/components/window-mockup.ts +11 -11
  274. package/src/types/theme.ts +10 -0
  275. package/src/utils/docs.ts +215 -189
  276. package/src/utils/headerStack.ts +95 -95
  277. package/src/utils/index.ts +5 -5
  278. package/src/components/astro/RLABlogPost.astro +0 -7
  279. package/src/components/astro/RLABlogPosts.astro +0 -9
  280. package/src/components/astro/RLAPosts.astro +0 -23
  281. package/src/themes/posts.theme.ts +0 -13
  282. package/src/types/components/posts.ts +0 -11
@@ -1,11 +1,11 @@
1
- export interface TimelineProps {
2
- /**
3
- * Slot-specific CSS class overrides.
4
- */
5
- ui?: any
6
- /**
7
- * Additional CSS classes to apply to the root element.
8
- */
9
- class?: any
10
- [key: string]: unknown
11
- }
1
+ export interface TimelineProps {
2
+ /**
3
+ * Slot-specific CSS class overrides.
4
+ */
5
+ ui?: any
6
+ /**
7
+ * Additional CSS classes to apply to the root element.
8
+ */
9
+ class?: any
10
+ [key: string]: unknown
11
+ }
@@ -1,3 +1,4 @@
1
+ import type { ThemeColor } from "../theme"
1
2
  export interface ToastProps {
2
3
  /**
3
4
  * Main toast title.
@@ -22,7 +23,7 @@ export interface ToastProps {
22
23
  /**
23
24
  * Color theme.
24
25
  */
25
- color?: "primary" | "secondary" | "success" | "warning" | "error" | "info"
26
+ color?: ThemeColor
26
27
  /**
27
28
  * Slot-specific CSS class overrides.
28
29
  */
@@ -1,23 +1,23 @@
1
- export interface TooltipProps {
2
- /**
3
- * The text content to display inside the tooltip.
4
- */
5
- content?: string
6
- /**
7
- * Controlled open state.
8
- */
9
- open?: boolean
10
- /**
11
- * Placement of the tooltip relative to the trigger.
12
- */
13
- placement?: "top" | "bottom" | "left" | "right"
14
- /**
15
- * Slot-specific CSS class overrides.
16
- */
17
- ui?: any
18
- /**
19
- * Additional CSS classes to apply to the root element.
20
- */
21
- class?: any
22
- [key: string]: unknown
23
- }
1
+ export interface TooltipProps {
2
+ /**
3
+ * The text content to display inside the tooltip.
4
+ */
5
+ content?: string
6
+ /**
7
+ * Controlled open state.
8
+ */
9
+ open?: boolean
10
+ /**
11
+ * Placement of the tooltip relative to the trigger.
12
+ */
13
+ placement?: "top" | "bottom" | "left" | "right"
14
+ /**
15
+ * Slot-specific CSS class overrides.
16
+ */
17
+ ui?: any
18
+ /**
19
+ * Additional CSS classes to apply to the root element.
20
+ */
21
+ class?: any
22
+ [key: string]: unknown
23
+ }
@@ -1,11 +1,11 @@
1
- export interface TourProps {
2
- /**
3
- * Slot-specific CSS class overrides.
4
- */
5
- ui?: any
6
- /**
7
- * Additional CSS classes to apply to the root element.
8
- */
9
- class?: any
10
- [key: string]: unknown
11
- }
1
+ export interface TourProps {
2
+ /**
3
+ * Slot-specific CSS class overrides.
4
+ */
5
+ ui?: any
6
+ /**
7
+ * Additional CSS classes to apply to the root element.
8
+ */
9
+ class?: any
10
+ [key: string]: unknown
11
+ }
@@ -1,11 +1,11 @@
1
- export interface TreeProps {
2
- /**
3
- * Slot-specific CSS class overrides.
4
- */
5
- ui?: any
6
- /**
7
- * Additional CSS classes to apply to the root element.
8
- */
9
- class?: any
10
- [key: string]: unknown
11
- }
1
+ export interface TreeProps {
2
+ /**
3
+ * Slot-specific CSS class overrides.
4
+ */
5
+ ui?: any
6
+ /**
7
+ * Additional CSS classes to apply to the root element.
8
+ */
9
+ class?: any
10
+ [key: string]: unknown
11
+ }
@@ -1,11 +1,11 @@
1
- export interface UserProps {
2
- /**
3
- * Slot-specific CSS class overrides.
4
- */
5
- ui?: any
6
- /**
7
- * Additional CSS classes to apply to the root element.
8
- */
9
- class?: any
10
- [key: string]: unknown
11
- }
1
+ export interface UserProps {
2
+ /**
3
+ * Slot-specific CSS class overrides.
4
+ */
5
+ ui?: any
6
+ /**
7
+ * Additional CSS classes to apply to the root element.
8
+ */
9
+ class?: any
10
+ [key: string]: unknown
11
+ }
@@ -1,11 +1,11 @@
1
- export interface WatermarkProps {
2
- /**
3
- * Slot-specific CSS class overrides.
4
- */
5
- ui?: any
6
- /**
7
- * Additional CSS classes to apply to the root element.
8
- */
9
- class?: any
10
- [key: string]: unknown
11
- }
1
+ export interface WatermarkProps {
2
+ /**
3
+ * Slot-specific CSS class overrides.
4
+ */
5
+ ui?: any
6
+ /**
7
+ * Additional CSS classes to apply to the root element.
8
+ */
9
+ class?: any
10
+ [key: string]: unknown
11
+ }
@@ -1,11 +1,11 @@
1
- export interface WindowMockupProps {
2
- /**
3
- * Slot-specific CSS class overrides.
4
- */
5
- ui?: any
6
- /**
7
- * Additional CSS classes to apply to the root element.
8
- */
9
- class?: any
10
- [key: string]: unknown
11
- }
1
+ export interface WindowMockupProps {
2
+ /**
3
+ * Slot-specific CSS class overrides.
4
+ */
5
+ ui?: any
6
+ /**
7
+ * Additional CSS classes to apply to the root element.
8
+ */
9
+ class?: any
10
+ [key: string]: unknown
11
+ }
@@ -1 +1,11 @@
1
+ import { defaultColors } from "../presets/defaults"
2
+
1
3
  export type Theme = "flat" | "light" | "dark"
4
+
5
+ export interface CustomColors {}
6
+
7
+ export type ThemeColor =
8
+ | typeof defaultColors[number]
9
+ | "neutral"
10
+ | keyof CustomColors
11
+
package/src/utils/docs.ts CHANGED
@@ -1,189 +1,215 @@
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 { DocsConfig, BadgeConfig } from "../types"
2
+
3
+ export function defineDocsConfig(config: DocsConfig): DocsConfig {
4
+ return config
5
+ }
6
+
7
+ /**
8
+ * Strip a leading numeric sort prefix from a filename id, e.g. "01.getting-started"
9
+ * "getting-started"
10
+ */
11
+ function stripNumericPrefix(id: string): string {
12
+ return id.replace(/^(\d+\.)+/, "")
13
+ }
14
+
15
+ /**
16
+ * Extract a numeric sort key from a doc id for numeric-prefix sorting
17
+ */
18
+ function numericPrefixOrder(id: string): number {
19
+ const segment = id.split("/").pop() ?? id
20
+ const m = segment.match(/^(\d+)\./)
21
+ return m ? parseInt(m[1], 10) : Infinity
22
+ }
23
+
24
+ export interface ResolvedSidebarItem {
25
+ label: string
26
+ href?: string
27
+ icon?: string
28
+ badge?: string | BadgeConfig
29
+ active?: boolean
30
+ children?: ResolvedSidebarItem[]
31
+ collapsed?: boolean
32
+ }
33
+
34
+ export interface ResolvedScope {
35
+ id: string
36
+ label: string
37
+ href: string
38
+ icon?: string
39
+ active?: boolean
40
+ }
41
+
42
+ export async function getDocsSidebar(
43
+ config: DocsConfig,
44
+ locale: string,
45
+ currentPath: string,
46
+ getCollection: (name: string) => Promise<any[]>
47
+ ): Promise<{
48
+ items: ResolvedSidebarItem[]
49
+ scopes: ResolvedScope[]
50
+ activeScope?: ResolvedScope
51
+ }> {
52
+ const docs = await getCollection("docs")
53
+ const normPath = currentPath.replace(/\/$/, "").toLowerCase()
54
+ const docsBase = `/${locale}/docs`
55
+
56
+ const sidebarScopes: import("../types").SidebarScope[] = Array.isArray(config.sidebar)
57
+ ? config.sidebar.filter(
58
+ (item): item is import("../types").SidebarScope => "id" in item || "scopes" in item
59
+ )
60
+ : (config.sidebar as any)?.scopes || []
61
+
62
+ const scopes: ResolvedScope[] = sidebarScopes.map((scope) => {
63
+ const id = scope.id || scope.label
64
+ let href = scope.href || ""
65
+ if (!href && scope.items && scope.items.length > 0) {
66
+ href = scope.items[0].href || ""
67
+ }
68
+ return {
69
+ id,
70
+ label: scope.label,
71
+ href: href.replace("{locale}", locale),
72
+ icon: scope.icon
73
+ }
74
+ })
75
+
76
+ function isDocInItems(
77
+ items: import("../types").SidebarItem[],
78
+ docId: string | undefined,
79
+ href: string
80
+ ): boolean {
81
+ for (const item of items) {
82
+ if (item.href && item.href.toLowerCase().replace(/\/$/, "") === href) return true
83
+ if (item.autogenerate && docId) {
84
+ const dir = item.autogenerate.directory.replace(/\/$/, "")
85
+ if (dir === "") {
86
+ if (!docId.includes("/")) return true
87
+ } else if (docId.startsWith(dir + "/") || docId === dir) {
88
+ return true
89
+ }
90
+ }
91
+ const childItems = item.children || item.items
92
+ if (childItems && isDocInItems(childItems, docId, href)) return true
93
+ }
94
+ return false
95
+ }
96
+
97
+ // Find active scope most-specific prefix match, fallback to scanning scope items
98
+ let activeScope = scopes.find((s) => normPath === s.href.replace(/\/$/, "").toLowerCase())
99
+ if (!activeScope) {
100
+ const currentDoc = docs.find((d) => `${docsBase}/${d.id}`.toLowerCase() === normPath)
101
+ const scopeMatch = sidebarScopes.find((s) => {
102
+ return isDocInItems(s.items || [], currentDoc?.id, normPath)
103
+ })
104
+
105
+ if (scopeMatch) {
106
+ const matchId = scopeMatch.id || scopeMatch.label
107
+ activeScope = scopes.find((s) => s.id === matchId)
108
+ }
109
+ }
110
+ if (!activeScope) {
111
+ activeScope = [...scopes]
112
+ .toSorted((a, b) => b.href.length - a.href.length)
113
+ .find((s) => normPath.startsWith(s.href.toLowerCase()))
114
+ }
115
+ if (activeScope) activeScope.active = true
116
+
117
+ const sidebarConfig = sidebarScopes.find(
118
+ (item) => activeScope && (item.id === activeScope.id || item.label === activeScope.id)
119
+ )
120
+
121
+ const items = sidebarConfig?.items || []
122
+
123
+ async function resolveItem(item: import("../types").SidebarItem): Promise<ResolvedSidebarItem[]> {
124
+ if (item.autogenerate) {
125
+ const dir = item.autogenerate.directory
126
+ // Match docs whose id starts with the directory
127
+ const prefix = dir.replace(/\/$/, "")
128
+ const filteredDocs = docs.filter((d) => {
129
+ if (d.data.sidebar?.hidden === true) return false
130
+ if (prefix === "") return !d.id.includes("/")
131
+ return d.id.startsWith(prefix + "/") || d.id === prefix
132
+ })
133
+
134
+ filteredDocs.sort((a, b) => {
135
+ // 1. Frontmatter `order` takes priority
136
+ const aOrder = a.data.sidebar?.order ?? a.data.order ?? numericPrefixOrder(a.id)
137
+ const bOrder = b.data.sidebar?.order ?? b.data.order ?? numericPrefixOrder(b.id)
138
+ if (aOrder !== bOrder) return aOrder - bOrder
139
+ // 2. Fall back to alphabetical by stripped label
140
+ const aLabel = a.data.sidebar?.label ?? a.data.title
141
+ const bLabel = b.data.sidebar?.label ?? b.data.title
142
+ return stripNumericPrefix(aLabel).localeCompare(stripNumericPrefix(bLabel))
143
+ })
144
+
145
+ return filteredDocs.map((doc) => {
146
+ const href = `${docsBase}/${doc.id}/`
147
+ const badge =
148
+ doc.data.sidebar?.badge ?? (doc.data.badge as string | BadgeConfig | undefined)
149
+ return {
150
+ label: doc.data.sidebar?.label ?? doc.data.title,
151
+ href,
152
+ badge,
153
+ active: normPath === href.replace(/\/$/, "").toLowerCase()
154
+ }
155
+ })
156
+ }
157
+
158
+ const resolved: ResolvedSidebarItem = {
159
+ label: item.label,
160
+ href: item.href ? item.href.replace("{locale}", locale) : undefined,
161
+ icon: item.icon,
162
+ badge: item.badge,
163
+ collapsed: item.collapsed
164
+ }
165
+
166
+ if (resolved.href) {
167
+ resolved.active = normPath === resolved.href.replace(/\/$/, "").toLowerCase()
168
+ }
169
+
170
+ const childItems = item.children || item.items
171
+ if (childItems) {
172
+ const children: ResolvedSidebarItem[] = []
173
+ for (const child of childItems) {
174
+ children.push(...(await resolveItem(child)))
175
+ }
176
+ resolved.children = children
177
+ if (!resolved.active) {
178
+ resolved.active = children.some((c) => c.active)
179
+ }
180
+ }
181
+
182
+ return [resolved]
183
+ }
184
+
185
+ const resolvedItems: ResolvedSidebarItem[] = []
186
+ for (const item of items) {
187
+ resolvedItems.push(...(await resolveItem(item)))
188
+ }
189
+
190
+ return { items: resolvedItems, scopes, activeScope }
191
+ }
192
+
193
+ export function getSurroundItems(sidebar: ResolvedSidebarItem[], currentPath: string) {
194
+ const flatItems: { label: string; href: string }[] = []
195
+
196
+ function flatten(items: ResolvedSidebarItem[]) {
197
+ for (const item of items) {
198
+ if (item.href) flatItems.push({ label: item.label, href: item.href })
199
+ if (item.children) flatten(item.children)
200
+ }
201
+ }
202
+
203
+ flatten(sidebar)
204
+
205
+ const normPath = currentPath.replace(/\/$/, "").toLowerCase()
206
+ const currentIndex = flatItems.findIndex(
207
+ (item) => item.href.replace(/\/$/, "").toLowerCase() === normPath
208
+ )
209
+
210
+ return {
211
+ prev: currentIndex > 0 ? flatItems[currentIndex - 1] : null,
212
+ next:
213
+ currentIndex >= 0 && currentIndex < flatItems.length - 1 ? flatItems[currentIndex + 1] : null
214
+ }
215
+ }