@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
@@ -1,199 +1,215 @@
1
- import type { AstroIntegration } from "astro"
2
- import UnoCSS from "unocss/astro"
3
- import vue from "@astrojs/vue"
4
- import defu from "defu"
5
- import { defaultUIConfig } from "../themes"
6
- import type { ComponentTheme } from "../utils/defineTheme"
7
- import rimelightUiPreset, {
8
- uiSrcGlob,
9
- uiFilesystemGlob,
10
- type ColorConfigValue,
11
- type RimelightPresetOptions
12
- } from "../presets"
13
-
14
- /**
15
- * Shape of the `ui` config that can be passed to the integration.
16
- */
17
- export type UIConfigOverrides = Record<string, Partial<ComponentTheme>>
18
-
19
- export interface UIOptions {
20
- /**
21
- * Configuration for the Logo component variants.
22
- */
23
- logos?: Record<
24
- string,
25
- | string
26
- | {
27
- light?: string
28
- dark?: string
29
- color?: string
30
- white?: string
31
- black?: string
32
- [key: string]: string | undefined
33
- }
34
- >
35
- /**
36
- * Global UI overrides applied to all components. Merged with defaults via `defu` (first arg
37
- * wins).
38
- */
39
- ui?: UIConfigOverrides
40
- /**
41
- * Custom colors. Each color can be:
42
- *
43
- * - **Flat format**: `{ "500": "#7146ff", "600": "#6222ff" }` — used in all modes. No mode-specific
44
- * buckets needed.
45
- * - **Mode format**: flat shades at root define the base; `light`, `dark`, `flat` buckets layer on
46
- * top:
47
- *
48
- * ```ts
49
- * { "500": "base", light: { "600": "light-blue" }, dark: { "500": "dark-blue" } }
50
- * ```
51
- *
52
- * Each shade falls back through: **mode bucket → flat → unthemed → light → dark**. Defining a
53
- * single source (e.g. only `dark`) propagates to all modes.
54
- *
55
- * Use the `theme` prop on components to pin colors: `<Button theme="flat">` forces the flat
56
- * bucket regardless of current mode.
57
- */
58
- colors?: Record<
59
- string,
60
- | Record<string, string>
61
- | {
62
- light?: Record<string, string>
63
- dark?: Record<string, string>
64
- flat?: Record<string, string>
65
- }
66
- >
67
- /**
68
- * When `true`, auto-generates missing `light`/`dark` mode buckets from flat color values using
69
- * `color-mix(in oklch, ...)`. Explicitly provided buckets always take precedence. Defaults to
70
- * `true`.
71
- */
72
- autogenerateColorModes?: boolean
73
- }
74
-
75
- /**
76
- * Astro integration for `@rimelight/ui`.
77
- *
78
- * Provides global UI configuration via a virtual module. Components import `virtual:rimelight-ui`
79
- * to access the merged config.
80
- *
81
- * @example
82
- * // astro.config.mjs
83
- * import { ui } from "@rimelight/ui/integrations"
84
- *
85
- * export default defineConfig({
86
- * integrations: [
87
- * ui({
88
- * ui: {
89
- * button: {
90
- * defaultVariants: { variant: "primary" }
91
- * }
92
- * }
93
- * })
94
- * ]
95
- * })
96
- */
97
- export function ui(options: UIOptions = {}): AstroIntegration[] {
98
- const resolvedUI = defu(options.ui ?? {}, defaultUIConfig)
99
- const coreColors = [
100
- "primary",
101
- "secondary",
102
- "info",
103
- "success",
104
- "warning",
105
- "error",
106
- "commentary",
107
- "ideation",
108
- "source"
109
- ]
110
- const userColors = (options.colors ?? {}) as Record<string, ColorConfigValue>
111
- const userColorNames = Object.keys(userColors)
112
- const mergedColors = [...new Set([...coreColors, ...userColorNames])]
113
- const presetOptions: RimelightPresetOptions = {
114
- colors: userColors
115
- }
116
- if (options.autogenerateColorModes !== undefined) {
117
- presetOptions.autogenerateColorModes = options.autogenerateColorModes
118
- }
119
- const resolvedConfig = {
120
- ...resolvedUI,
121
- logos: options.logos ?? {},
122
- colors: mergedColors
123
- }
124
-
125
- const virtualModuleId = "virtual:rimelight-ui"
126
- const resolvedVirtualModuleId = "\0" + virtualModuleId
127
-
128
- function setViteConfig(updateConfig: (config: Record<string, unknown>) => void) {
129
- updateConfig({
130
- vite: {
131
- optimizeDeps: {
132
- exclude: ["@rimelight/ui"]
133
- },
134
- ssr: {
135
- noExternal: ["@rimelight/ui"]
136
- },
137
- plugins: [
138
- {
139
- name: "vite-plugin-rimelight-ui-config",
140
- enforce: "pre",
141
- resolveId(id: string) {
142
- if (id === virtualModuleId) return resolvedVirtualModuleId
143
- return null
144
- },
145
- load(id: string) {
146
- if (id === resolvedVirtualModuleId) {
147
- return `export const getUIConfig = () => (${JSON.stringify(resolvedConfig)});`
148
- }
149
- return null
150
- }
151
- }
152
- ]
153
- }
154
- })
155
- }
156
-
157
- const rimelightUIIntegration: AstroIntegration = {
158
- name: "@rimelight/ui",
159
- hooks: {
160
- "astro:config:setup": ({ updateConfig, logger }) => {
161
- logger.info("Initializing @rimelight/ui core")
162
- setViteConfig(updateConfig)
163
- }
164
- }
165
- }
166
-
167
- return [
168
- UnoCSS({
169
- presets: [rimelightUiPreset(presetOptions)],
170
- content: {
171
- pipeline: {
172
- include: [
173
- /\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html)($|\?)/,
174
- "src/**/*.{js,ts,jsx,tsx,vue,svelte,astro}",
175
- uiSrcGlob,
176
- "../ui/src/**/*.{js,ts,jsx,tsx,vue,svelte,astro}"
177
- ]
178
- },
179
- filesystem: [uiFilesystemGlob, "../ui/src/**/*", "src/components/**/*", "src/pages/**/*"]
180
- },
181
- configResolved(config) {
182
- if (process.env.NODE_ENV === "development" && !process.env.UNO_CONFIG_LOGGED) {
183
- process.env.UNO_CONFIG_LOGGED = "true"
184
- console.log(`[UnoCSS] Presets: ${config.presets.map((p) => p.name).join(", ")}`)
185
- console.log(`[UnoCSS] Rules: ${config.rules.length}`)
186
- console.log(`[UnoCSS] Shortcuts: ${Object.keys(config.shortcuts).length}`)
187
- const ruleNames = config.rules.map((r) =>
188
- Array.isArray(r) ? r[0].toString() : "dynamic"
189
- )
190
- const duplicates = ruleNames.filter((item, index) => ruleNames.indexOf(item) !== index)
191
- const filtered = duplicates.filter((d) => d !== "/^(.+?)-(\\$.+)$/")
192
- if (filtered.length > 0) console.warn(`[UnoCSS] Rule collisions: ${filtered.join(", ")}`)
193
- }
194
- }
195
- }),
196
- vue(),
197
- rimelightUIIntegration
198
- ]
199
- }
1
+ import type { AstroIntegration } from "astro"
2
+ import UnoCSS from "unocss/astro"
3
+ import vue from "@astrojs/vue"
4
+ import defu from "defu"
5
+ import { defaultUIConfig } from "../themes"
6
+ import type { ComponentTheme } from "../utils/defineTheme"
7
+ import rimelightUiPreset, {
8
+ uiSrcGlob,
9
+ uiFilesystemGlob,
10
+ type ColorConfigValue,
11
+ type RimelightPresetOptions
12
+ } from "../presets"
13
+ import { extractAllMeta } from "../docs/extractAll"
14
+ import virtual from "vite-plugin-virtual"
15
+
16
+ export interface CategoryConfig {
17
+ label: string
18
+ }
19
+
20
+ export interface UIConfigOverrides {
21
+ [key: string]: Partial<ComponentTheme>
22
+ }
23
+
24
+ export interface UIOptions {
25
+ /**
26
+ * Configuration for keyboard shortcuts.
27
+ */
28
+ shortcuts?: {
29
+ categories?: Record<string, CategoryConfig>
30
+ }
31
+ /**
32
+ * Configuration for the Logo component variants.
33
+ */
34
+ logos?: Record<
35
+ string,
36
+ | string
37
+ | {
38
+ light?: string
39
+ dark?: string
40
+ color?: string
41
+ white?: string
42
+ black?: string
43
+ [key: string]: string | undefined
44
+ }
45
+ >
46
+ /**
47
+ * Global UI overrides applied to all components. Merged with defaults via `defu` (first arg
48
+ * wins).
49
+ */
50
+ ui?: UIConfigOverrides
51
+ /**
52
+ * Custom colors. Each color can be:
53
+ *
54
+ * - **Flat format**: `{ "500": "#7146ff", "600": "#6222ff" }` — used as the base for autogenerated
55
+ * light and dark shades via `color-mix(in oklch, ...)`.
56
+ * - **Mode format**: provide explicit `light` and/or `dark` buckets to control each scheme
57
+ * independently:
58
+ *
59
+ * ```ts
60
+ * { light: { "500": "#0064d7" }, dark: { "500": "#60a5fa" } }
61
+ * ```
62
+ *
63
+ * Shades fall back through: **mode bucket → flat → light → dark**. Defining only one side
64
+ * autogenerates the other when `autogenerateColorModes` is enabled.
65
+ *
66
+ * To pin a component to a specific scheme, use `theme="light"` or `theme="dark"` on the component
67
+ * — this sets `color-scheme` natively on the element, causing all `light-dark()` variables to
68
+ * resolve to the correct side.
69
+ */
70
+ colors?: Record<
71
+ string,
72
+ | Record<string, string>
73
+ | {
74
+ light?: Record<string, string>
75
+ dark?: Record<string, string>
76
+ }
77
+ >
78
+ /**
79
+ * When `true`, auto-generates missing `light`/`dark` mode buckets from flat color values using
80
+ * `color-mix(in oklch, ...)`. Explicitly provided buckets always take precedence. Defaults to
81
+ * `true`.
82
+ */
83
+ autogenerateColorModes?: boolean
84
+ }
85
+
86
+ /**
87
+ * Astro integration for `@rimelight/ui`.
88
+ *
89
+ * Provides global UI configuration via a virtual module. Components import `virtual:rimelight-ui`
90
+ * to access the merged config.
91
+ *
92
+ * @example
93
+ * // astro.config.mjs
94
+ * import { ui } from "@rimelight/ui/integrations"
95
+ *
96
+ * export default defineConfig({
97
+ * integrations: [
98
+ * ui({
99
+ * ui: {
100
+ * button: {
101
+ * defaultVariants: { variant: "primary" }
102
+ * }
103
+ * }
104
+ * })
105
+ * ]
106
+ * })
107
+ */
108
+ export function ui(options: UIOptions = {}): AstroIntegration[] {
109
+ const resolvedUI = defu(options.ui ?? {}, defaultUIConfig)
110
+ const coreColors = [
111
+ "primary",
112
+ "secondary",
113
+ "info",
114
+ "success",
115
+ "warning",
116
+ "error",
117
+ "commentary",
118
+ "ideation",
119
+ "source"
120
+ ]
121
+ const userColors = (options.colors ?? {}) as Record<string, ColorConfigValue>
122
+ const userColorNames = Object.keys(userColors)
123
+ const mergedColors = [...new Set([...coreColors, ...userColorNames])]
124
+ const presetOptions: RimelightPresetOptions = {
125
+ colors: userColors
126
+ }
127
+ if (options.autogenerateColorModes !== undefined) {
128
+ presetOptions.autogenerateColorModes = options.autogenerateColorModes
129
+ }
130
+ const resolvedConfig = {
131
+ ...resolvedUI,
132
+ logos: options.logos ?? {},
133
+ colors: mergedColors,
134
+ shortcuts: options.shortcuts ?? {}
135
+ }
136
+
137
+ const virtualModuleId = "virtual:rimelight-ui"
138
+ const resolvedVirtualModuleId = "\0" + virtualModuleId
139
+
140
+ async function setViteConfig(updateConfig: (config: Record<string, unknown>) => void) {
141
+ const docsMeta = await extractAllMeta()
142
+ updateConfig({
143
+ vite: {
144
+ optimizeDeps: {
145
+ exclude: ["@rimelight/ui"]
146
+ },
147
+ ssr: {
148
+ noExternal: ["@rimelight/ui"]
149
+ },
150
+ plugins: [
151
+ {
152
+ name: "vite-plugin-rimelight-ui-config",
153
+ enforce: "pre",
154
+ resolveId(id: string) {
155
+ if (id === virtualModuleId) return resolvedVirtualModuleId
156
+ return null
157
+ },
158
+ load(id: string) {
159
+ if (id === resolvedVirtualModuleId) {
160
+ return `export const getUIConfig = () => (${JSON.stringify(resolvedConfig)});`
161
+ }
162
+ return null
163
+ }
164
+ },
165
+ virtual({
166
+ "virtual:rimelight-ui-docs-meta": `export default ${JSON.stringify(docsMeta)}`
167
+ })
168
+ ]
169
+ }
170
+ })
171
+ }
172
+
173
+ const rimelightUIIntegration: AstroIntegration = {
174
+ name: "@rimelight/ui",
175
+ hooks: {
176
+ "astro:config:setup": async ({ updateConfig, logger }) => {
177
+ logger.info("Initializing @rimelight/ui core")
178
+ await setViteConfig(updateConfig)
179
+ }
180
+ }
181
+ }
182
+
183
+ return [
184
+ UnoCSS({
185
+ presets: [rimelightUiPreset(presetOptions)],
186
+ content: {
187
+ pipeline: {
188
+ include: [
189
+ /\.(vue|svelte|[jt]sx|mdx?|astro|elm|php|phtml|html)($|\?)/,
190
+ "src/**/*.{js,ts,jsx,tsx,vue,svelte,astro}",
191
+ uiSrcGlob,
192
+ "../ui/src/**/*.{js,ts,jsx,tsx,vue,svelte,astro}"
193
+ ]
194
+ },
195
+ filesystem: [uiFilesystemGlob, "../ui/src/**/*", "src/components/**/*", "src/pages/**/*"]
196
+ },
197
+ configResolved(config) {
198
+ if (process.env.NODE_ENV === "development" && !process.env.UNO_CONFIG_LOGGED) {
199
+ process.env.UNO_CONFIG_LOGGED = "true"
200
+ console.log(`[UnoCSS] Presets: ${config.presets.map((p) => p.name).join(", ")}`)
201
+ console.log(`[UnoCSS] Rules: ${config.rules.length}`)
202
+ console.log(`[UnoCSS] Shortcuts: ${Object.keys(config.shortcuts).length}`)
203
+ const ruleNames = config.rules.map((r) =>
204
+ Array.isArray(r) ? r[0].toString() : "dynamic"
205
+ )
206
+ const duplicates = ruleNames.filter((item, index) => ruleNames.indexOf(item) !== index)
207
+ const filtered = duplicates.filter((d) => d !== "/^(.+?)-(\\$.+)$/")
208
+ if (filtered.length > 0) console.warn(`[UnoCSS] Rule collisions: ${filtered.join(", ")}`)
209
+ }
210
+ }
211
+ }),
212
+ vue(),
213
+ rimelightUIIntegration
214
+ ]
215
+ }
@@ -8,17 +8,30 @@ function assertManifest(obj: unknown): asserts obj is Record<string, string> {
8
8
  if (!obj || typeof obj !== "object") throw new Error("Expected manifest")
9
9
  }
10
10
 
11
- function addSecurityHeaders(response: Response): Response {
12
- const newResponse = new Response(response.body, response)
13
- newResponse.headers.set("Referrer-Policy", "strict-origin-when-cross-origin")
14
- newResponse.headers.set("X-Content-Type-Options", "nosniff")
15
- newResponse.headers.set("X-Frame-Options", "DENY")
16
- newResponse.headers.set("Cross-Origin-Resource-Policy", "same-origin")
17
- newResponse.headers.set(
18
- "Strict-Transport-Security",
19
- "max-age=31536000; includeSubDomains; preload"
20
- )
21
- return newResponse
11
+ function addSecurityHeaders(response: Response, origin?: string): Response {
12
+ const headers = new Headers(response.headers)
13
+ headers.set("Referrer-Policy", "strict-origin-when-cross-origin")
14
+ headers.set("X-Content-Type-Options", "nosniff")
15
+ headers.set("X-Frame-Options", "DENY")
16
+ headers.set("Cross-Origin-Resource-Policy", "same-origin")
17
+ headers.set("Strict-Transport-Security", "max-age=31536000; includeSubDomains; preload")
18
+ headers.set("Permissions-Policy", "camera=(), microphone=(), geolocation=(), payment=(), usb=()")
19
+ if (origin) {
20
+ headers.set(
21
+ "Link",
22
+ [
23
+ `<${origin}/sitemap-index.xml>; rel="sitemap"`,
24
+ `<${origin}/llms.txt>; rel="llms"`,
25
+ `<${origin}/.well-known/api-catalog>; rel="api-catalog"`,
26
+ `<${origin}/rss.xml>; rel="alternate"; type="application/rss+xml"`
27
+ ].join(", ")
28
+ )
29
+ }
30
+ return new Response(response.body, {
31
+ status: response.status,
32
+ statusText: response.statusText,
33
+ headers
34
+ })
22
35
  }
23
36
 
24
37
  /**
@@ -34,37 +47,124 @@ export const security = defineMiddleware(async (context, next) => {
34
47
  const response = await next()
35
48
  const contentType = response.headers.get("content-type") || ""
36
49
 
37
- if (!contentType.includes("text/html")) {
38
- return addSecurityHeaders(response)
50
+ if (import.meta.env.DEV) {
51
+ if (!contentType.includes("text/html")) {
52
+ return addSecurityHeaders(response, context.url.origin)
53
+ }
54
+ const cleanHeaders = new Headers(response.headers)
55
+ cleanHeaders.delete("content-security-policy")
56
+ let modifiedHtml = await response.text()
57
+ modifiedHtml = modifiedHtml.replace(
58
+ /<meta\s[^>]*http-equiv\s*=\s*["']?content-security-policy[^>]*>/gi,
59
+ ""
60
+ )
61
+ return addSecurityHeaders(
62
+ new Response(modifiedHtml, {
63
+ status: response.status,
64
+ statusText: response.statusText,
65
+ headers: cleanHeaders
66
+ }),
67
+ context.url.origin
68
+ )
69
+ }
70
+
71
+ let cspHeader = response.headers.get("content-security-policy")
72
+ const newHeaders = new Headers(response.headers)
73
+
74
+ if (cspHeader) {
75
+ // Unescape HTML entities (like &#39; or &#x27; to ') that Astro's native CSP generation mistakenly puts in the header
76
+ cspHeader = cspHeader
77
+ .replace(/&#0*39;/g, "'")
78
+ .replace(/&#x0*27;/gi, "'")
79
+ .replace(/&quot;/g, '"')
80
+ .replace(/&amp;/g, "&")
81
+ newHeaders.set("content-security-policy", cspHeader)
82
+ }
83
+
84
+ const nonceValue = cspHeader ? crypto.randomUUID().replace(/-/g, "") : null
85
+
86
+ if (cspHeader && nonceValue) {
87
+ let newCsp = cspHeader
88
+ if (newCsp.includes("script-src ")) {
89
+ newCsp = newCsp.replace("script-src ", `script-src 'nonce-${nonceValue}' `)
90
+ } else {
91
+ newCsp = newCsp + `; script-src 'nonce-${nonceValue}'`
92
+ }
93
+ if (newCsp.includes("style-src ")) {
94
+ newCsp = newCsp.replace("style-src ", `style-src 'nonce-${nonceValue}' `)
95
+ } else {
96
+ newCsp = newCsp + `; style-src 'nonce-${nonceValue}'`
97
+ }
98
+ newHeaders.set("content-security-policy", newCsp)
39
99
  }
40
100
 
41
101
  if (typeof HTMLRewriter !== "undefined") {
42
- return addSecurityHeaders(
43
- new HTMLRewriter()
44
- .on("script[src]", {
102
+ let rewriter = new HTMLRewriter()
103
+ .on("script[src]", {
104
+ element(el: any) {
105
+ const src = el.getAttribute("src")
106
+ if (src && manifest[src]) {
107
+ el.setAttribute("integrity", manifest[src])
108
+ el.setAttribute("crossorigin", "anonymous")
109
+ }
110
+ }
111
+ })
112
+ .on('link[rel="stylesheet"][href]', {
113
+ element(el: any) {
114
+ const href = el.getAttribute("href")
115
+ if (href && manifest[href]) {
116
+ el.setAttribute("integrity", manifest[href])
117
+ el.setAttribute("crossorigin", "anonymous")
118
+ }
119
+ }
120
+ })
121
+ .on('meta[http-equiv="content-security-policy" i]', {
122
+ element(el: any) {
123
+ el.remove()
124
+ }
125
+ })
126
+
127
+ if (nonceValue) {
128
+ rewriter = rewriter
129
+ .on("head", {
45
130
  element(el: any) {
46
- const src = el.getAttribute("src")
47
- if (src && manifest[src]) {
48
- el.setAttribute("integrity", manifest[src])
49
- el.setAttribute("crossorigin", "anonymous")
50
- }
131
+ el.append(`<meta name="csp-nonce" content="${nonceValue}">`, { html: true })
51
132
  }
52
133
  })
53
- .on('link[rel="stylesheet"][href]', {
134
+ .on("script", {
54
135
  element(el: any) {
55
- const href = el.getAttribute("href")
56
- if (href && manifest[href]) {
57
- el.setAttribute("integrity", manifest[href])
58
- el.setAttribute("crossorigin", "anonymous")
136
+ if (!el.getAttribute("nonce")) {
137
+ el.setAttribute("nonce", nonceValue)
59
138
  }
60
139
  }
61
140
  })
62
- .transform(response)
141
+ .on("style", {
142
+ element(el: any) {
143
+ el.setAttribute("nonce", nonceValue)
144
+ }
145
+ })
146
+ }
147
+
148
+ return addSecurityHeaders(
149
+ rewriter.transform(
150
+ new Response(response.body, {
151
+ status: response.status,
152
+ statusText: response.statusText,
153
+ headers: newHeaders
154
+ })
155
+ ),
156
+ context.url.origin
63
157
  )
64
158
  }
65
159
 
66
160
  let modifiedHtml = await response.text()
67
161
 
162
+ // Remove Astro-injected CSP meta tag to prevent duplicate CSP headers and HTML escaping errors
163
+ modifiedHtml = modifiedHtml.replace(
164
+ /<meta\s[^>]*http-equiv\s*=\s*["']?content-security-policy[^>]*>/gi,
165
+ ""
166
+ )
167
+
68
168
  assertManifest(manifest)
69
169
 
70
170
  const entries = Object.entries(manifest)
@@ -84,11 +184,27 @@ export const security = defineMiddleware(async (context, next) => {
84
184
  )
85
185
  }
86
186
 
187
+ if (nonceValue) {
188
+ modifiedHtml = modifiedHtml.replace(
189
+ /<head([^>]*)>/i,
190
+ `<head$1>\n<meta name="csp-nonce" content="${nonceValue}">`
191
+ )
192
+ modifiedHtml = modifiedHtml.replace(
193
+ /<script(?![^>]*nonce=)([^>]*)>/gi,
194
+ `<script$1 nonce="${nonceValue}">`
195
+ )
196
+ modifiedHtml = modifiedHtml.replace(
197
+ /<style(?![^>]*nonce=)([^>]*)>/gi,
198
+ `<style$1 nonce="${nonceValue}">`
199
+ )
200
+ }
201
+
87
202
  return addSecurityHeaders(
88
203
  new Response(modifiedHtml, {
89
204
  status: response.status,
90
205
  statusText: response.statusText,
91
- headers: new Headers(response.headers)
92
- })
206
+ headers: newHeaders
207
+ }),
208
+ context.url.origin
93
209
  )
94
210
  })