@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,59 +1,67 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { HeaderProps } from "../../types"
5
- import headerThemeDefault, { createHeaderTheme } from "../../themes/header.theme"
6
- import { getUIConfig } from "virtual:rimelight-ui"
7
-
8
- const uiConfig = getUIConfig()
9
- const headerTheme = uiConfig.colors ? createHeaderTheme() : headerThemeDefault
10
-
11
- const header = scv(headerTheme)
12
-
13
- const {
14
- contain = true,
15
- sticky = true,
16
- fixed = false,
17
- stackIndex = 0,
18
- hideOnScroll = false,
19
- ui: uiProp,
20
- class: className,
21
- ...rest
22
- } = Astro.props as HeaderProps;
23
-
24
- const classes = resolveClasses(header, {
25
- contain,
26
- sticky: fixed ? false : sticky,
27
- fixed,
28
- }, useUi("header", uiProp), className);
29
-
30
- const headerId = `rla-header-${Math.random().toString(36).slice(2, 8)}`;
31
- const zIndex = 100 - stackIndex;
32
- ---
33
-
34
- <header
35
- id={headerId}
36
- data-slot="root"
37
- class:list={[classes.root]}
38
- data-rla-header={fixed ? "true" : undefined}
39
- data-stack-index={stackIndex}
40
- data-hide-on-scroll={String(hideOnScroll)}
41
- data-header-layer-id={headerId}
42
- style={fixed ? `z-index: ${zIndex};` : undefined}
43
- {...rest}
44
- >
45
- <div class:list={[classes.content]} data-header-content>
46
- <div class:list={[classes.container]}>
47
- <div class:list={[classes.left]} data-slot="left">
48
- <slot name="left" />
49
- </div>
50
- <div class:list={[classes.center]} data-slot="center">
51
- <slot name="center" />
52
- </div>
53
- <div class:list={[classes.right]} data-slot="right">
54
- <slot name="right" />
55
- </div>
56
- </div>
57
- </div>
58
- </header>
59
-
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { HeaderProps } from "../../types"
5
+ import headerThemeDefault, { createHeaderTheme } from "../../themes/header.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const headerTheme = uiConfig.colors ? createHeaderTheme() : headerThemeDefault
10
+
11
+ const header = scv(headerTheme)
12
+
13
+ const {
14
+ contain = true,
15
+ sticky = true,
16
+ fixed = false,
17
+ stackIndex = 0,
18
+ hideOnScroll = false,
19
+ ui: uiProp,
20
+ class: className,
21
+ ...rest
22
+ } = Astro.props as HeaderProps;
23
+
24
+ const classes = resolveClasses(header, {
25
+ contain,
26
+ sticky: fixed ? false : sticky,
27
+ fixed,
28
+ }, useUi("header", uiProp), className);
29
+
30
+ const headerId = `rla-header-${Math.random().toString(36).slice(2, 8)}`;
31
+ const zIndex = 100 - stackIndex;
32
+ ---
33
+
34
+ <header
35
+ id={headerId}
36
+ data-slot="root"
37
+ class:list={[classes.root]}
38
+ data-contain={contain ? "true" : "false"}
39
+ data-rla-header={fixed ? "true" : undefined}
40
+ data-stack-index={stackIndex}
41
+ data-hide-on-scroll={String(hideOnScroll)}
42
+ data-header-layer-id={headerId}
43
+ {...rest}
44
+ >
45
+ <div class:list={[classes.content]} data-header-content>
46
+ <div class:list={[classes.container]} data-slot="container">
47
+ <div class:list={[classes.left]} data-slot="left">
48
+ <slot name="left" />
49
+ </div>
50
+ <div class:list={[classes.center]} data-slot="center">
51
+ <slot name="center" />
52
+ </div>
53
+ <div class:list={[classes.right]} data-slot="right">
54
+ <slot name="right" />
55
+ </div>
56
+ </div>
57
+ </div>
58
+ </header>
59
+
60
+ {fixed && (
61
+ <style is:inline set:html={`
62
+ #${headerId} {
63
+ z-index: ${zIndex} !important;
64
+ }
65
+ `} />
66
+ )}
67
+
@@ -1,209 +1,274 @@
1
- ---
2
- import { Image } from "astro:assets"
3
- import { scv } from "css-variants"
4
- import { useUi, resolveClasses } from "../../utils"
5
- import type { ImageProps, ImageMetadataInfo } from "../../types"
6
- import imageThemeDefault, { createImageTheme } from "../../themes/image.theme"
7
- import { getUIConfig } from "virtual:rimelight-ui"
8
-
9
- const uiConfig = getUIConfig()
10
- const imageTheme = uiConfig.colors ? createImageTheme() : imageThemeDefault
11
-
12
- const imgc = scv(imageTheme)
13
-
14
- const {
15
- src,
16
- alt = "",
17
- height,
18
- width,
19
- loading = "lazy",
20
- fit = "cover",
21
- metadata: preMetadata,
22
- open,
23
- ui: uiProp,
24
- class: className,
25
- metaSource = true,
26
- metaFormat = true,
27
- metaDimensions = true,
28
- metaSize = true,
29
- metaAlt = true,
30
- metaDownload = true,
31
- ...rest
32
- } = Astro.props as ImageProps
33
-
34
- const classes = resolveClasses(imgc, {}, useUi("image", uiProp), className)
35
-
36
- const isMetadata = typeof src !== "string"
37
- const imgWidth = width ?? (isMetadata ? src.width : undefined)
38
- const imgHeight = height ?? (isMetadata ? src.height : undefined)
39
- const imgFormat = isMetadata ? src.format : (preMetadata?.format ?? undefined)
40
- const rawName = typeof src === "string" ? src.split("/").pop() || "image" : src.src.split("/").pop() || "image"
41
- const fileName = rawName.split("?")[0]
42
- const fileExtension = imgFormat?.toUpperCase() || (fileName.includes(".") ? fileName.split(".").pop()?.toUpperCase() : "IMG")
43
- const initialSize = preMetadata?.size ?? undefined
44
- ---
45
-
46
- <div class={classes.root} data-slot="root" {...rest}>
47
- <slot name="trigger">
48
- <button
49
- type="button"
50
- class={classes.trigger}
51
- data-image-trigger
52
- >
53
- <Image src={src} alt={alt} width={imgWidth ?? 800} height={imgHeight ?? 400} loading={loading} fit={fit} />
54
- </button>
55
- </slot>
56
-
57
- <dialog
58
- class={classes.dialog}
59
- data-image-dialog
60
- >
61
- <div class="flex flex-col bg-background text-foreground max-h-[90vh]">
62
- <div class="flex-1 min-h-0 flex items-center justify-center p-4 overflow-hidden">
63
- <img
64
- src={typeof src === "string" ? src : src.src}
65
- alt={alt}
66
- class={classes.image}
67
- data-modal-img
68
- />
69
- </div>
70
-
71
- <hr class="border-border mx-4 mb-3 shrink-0" />
72
-
73
- <div class={classes.fileInfo}>
74
- <div class="flex flex-col gap-xs text-sm">
75
- {
76
- metaSource && (
77
- <div class="flex flex-row gap-xs items-center">
78
- <span class="i-lucide-image size-4 shrink-0 text-muted-foreground" />
79
- <span class="text-muted-foreground">Source:</span>
80
- <span class="text-dimmed truncate max-w-[40vw]">{fileName}</span>
81
- </div>
82
- )
83
- }
84
- {
85
- metaFormat && (
86
- <div class="flex flex-row gap-xs items-center">
87
- <span class="i-lucide-file-question-mark size-4 shrink-0 text-muted-foreground" />
88
- <span class="text-muted-foreground">Format:</span>
89
- <span class="text-dimmed" data-metadata-format>{fileExtension || "IMG"}</span>
90
- </div>
91
- )
92
- }
93
- {
94
- metaDimensions && (
95
- <div class="flex flex-row gap-xs items-center">
96
- <span class="i-lucide-image-upscale size-4 shrink-0 text-muted-foreground" />
97
- <span class="text-muted-foreground">Dimensions:</span>
98
- <span class="text-dimmed">{(imgWidth || "?")} x {(imgHeight || "?")}</span>
99
- </div>
100
- )
101
- }
102
- {
103
- metaSize && (
104
- <div class="flex flex-row gap-xs items-center">
105
- <span class="i-lucide-hard-drive size-4 shrink-0 text-muted-foreground" />
106
- <span class="text-muted-foreground">Size:</span>
107
- <span class="text-dimmed" data-metadata-size>{initialSize !== undefined ? `${initialSize} bytes` : "fetching..."}</span>
108
- </div>
109
- )
110
- }
111
- {
112
- metaAlt && (
113
- <div class="flex flex-row gap-xs items-center">
114
- <span class="i-lucide-align-left size-4 shrink-0 text-muted-foreground" />
115
- <span class="text-muted-foreground">Alt:</span>
116
- <span class="text-dimmed truncate max-w-[30vw]" class:list={{ "italic opacity-50": !alt }}>{alt || "none"}</span>
117
- </div>
118
- )
119
- }
120
- </div>
121
-
122
- {
123
- metaDownload && (
124
- <button
125
- type="button"
126
- class={classes.download}
127
- data-image-download
128
- >
129
- <span class="i-lucide-download size-4 shrink-0" />
130
- Download Original
131
- </button>
132
- )
133
- }
134
- </div>
135
-
136
- <form method="dialog" class="absolute top-2 right-2">
137
- <button
138
- type="submit"
139
- class={classes.closeButton}
140
- aria-label="Close"
141
- >
142
- <span class="i-lucide-x size-4" />
143
- </button>
144
- </form>
145
- </div>
146
- </dialog>
147
- </div>
148
-
149
- <script>
150
- const triggers = document.querySelectorAll("[data-image-trigger]")
151
- for (const trigger of triggers) {
152
- const parent = trigger.closest(".group\\/image") || trigger.parentElement
153
- const dialog = parent?.querySelector("[data-image-dialog]")
154
- if (!dialog) continue
155
-
156
- const sizeEl = parent?.querySelector("[data-metadata-size]")
157
- const formatEl = parent?.querySelector("[data-metadata-format]")
158
- let fetched = false
159
-
160
- trigger.addEventListener("click", () => {
161
- if (!fetched) {
162
- fetched = true
163
- const imgEl = dialog.querySelector("[data-modal-img]")
164
- if (imgEl) {
165
- const src = imgEl.getAttribute("src")
166
- if (src) {
167
- fetch(src).then(r => r.blob()).then(blob => {
168
- if (sizeEl) sizeEl.textContent = (blob.size / 1024).toFixed(2) + " KB"
169
- if (formatEl && blob.type) {
170
- const mime = blob.type.split("/").pop().toUpperCase()
171
- if (mime && mime !== "OCTET-STREAM") formatEl.textContent = mime
172
- }
173
- }).catch(() => { if (sizeEl) sizeEl.textContent = "unavailable" })
174
- }
175
- }
176
- }
177
- dialog.showModal()
178
- })
179
-
180
- dialog.addEventListener("click", (e) => {
181
- if (e.target === dialog) dialog.close()
182
- })
183
-
184
- const downloadBtn = dialog.querySelector("[data-image-download]")
185
- if (downloadBtn) {
186
- downloadBtn.addEventListener("click", async () => {
187
- const img = dialog.querySelector("img")
188
- const imgSrc = img?.getAttribute("src")
189
- if (!imgSrc) return
190
- try {
191
- const response = await fetch(imgSrc)
192
- const blob = await response.blob()
193
- const url = URL.createObjectURL(blob)
194
- const link = document.createElement("a")
195
- link.href = url
196
- const srcAttr = (trigger.querySelector("img") || {}).getAttribute("src") || ""
197
- const name = (srcAttr.split("/").pop() || "").split("?")[0] || `image-${Date.now()}`
198
- link.download = name
199
- document.body.appendChild(link)
200
- link.click()
201
- document.body.removeChild(link)
202
- URL.revokeObjectURL(url)
203
- } catch (err) {
204
- console.error("Download failed", err)
205
- }
206
- })
207
- }
208
- }
209
- </script>
1
+ ---
2
+ import { getImage } from "astro:assets"
3
+ import type { ImageMetadata } from "astro"
4
+ import Image from "astro/components/Image.astro"
5
+ import Picture from "astro/components/Picture.astro"
6
+ import { scv } from "css-variants"
7
+ import { useUi, resolveClasses } from "../../utils"
8
+ import type { ImageProps } from "../../types"
9
+ import imageThemeDefault, { createImageTheme } from "../../themes/image.theme"
10
+ import { getUIConfig } from "virtual:rimelight-ui"
11
+
12
+ const uiConfig = getUIConfig()
13
+ const imageTheme = uiConfig.colors ? createImageTheme() : imageThemeDefault
14
+
15
+ const img = scv(imageTheme)
16
+
17
+ const {
18
+ src,
19
+ mobileSrc,
20
+ desktopSrc,
21
+ breakpoint,
22
+ formats,
23
+ alt = "",
24
+ height,
25
+ width,
26
+ loading = "lazy",
27
+ fit = "cover",
28
+ metadata: preMetadata,
29
+ open,
30
+ ui: uiProp,
31
+ class: className,
32
+ metaSource = true,
33
+ metaFormat = true,
34
+ metaDimensions = true,
35
+ metaSize = true,
36
+ metaAlt = true,
37
+ metaDownload = true,
38
+ ...rest
39
+ } = Astro.props as ImageProps
40
+
41
+ const classes = resolveClasses(img, {}, useUi("image", uiProp), className)
42
+
43
+ const isResponsive = !!(mobileSrc && desktopSrc)
44
+ const isFormatFallback = !isResponsive && !!(formats && formats.length > 0)
45
+ const breakpointVal = breakpoint ?? 768
46
+
47
+ let mobileImg = null
48
+ let desktopImg = null
49
+
50
+ if (isResponsive) {
51
+ mobileImg = await getImage({
52
+ src: mobileSrc!,
53
+ format: "webp",
54
+ })
55
+ desktopImg = await getImage({
56
+ src: desktopSrc!,
57
+ format: "webp",
58
+ })
59
+ }
60
+
61
+ const activeSrc = isResponsive ? desktopSrc : src
62
+ const isMetadata = typeof activeSrc !== "string" && activeSrc !== undefined
63
+ const imgWidth = width ?? (isMetadata ? (activeSrc as any).width : undefined)
64
+ const imgHeight = height ?? (isMetadata ? (activeSrc as any).height : undefined)
65
+ const imgFormat = isMetadata ? (activeSrc as any).format : (preMetadata?.format ?? undefined)
66
+ const rawName = activeSrc
67
+ ? (typeof activeSrc === "string" ? activeSrc.split("/").pop() || "image" : (activeSrc as any).src.split("/").pop() || "image")
68
+ : "image"
69
+ const fileName = rawName.split("?")[0]
70
+ const fileExtension = imgFormat?.toUpperCase() || (fileName.includes(".") ? fileName.split(".").pop()?.toUpperCase() : "IMG")
71
+ const initialSize = preMetadata?.size ?? undefined
72
+ ---
73
+
74
+ <rla-image {...rest}>
75
+ <div class={classes.root} data-slot="root">
76
+ <slot name="trigger">
77
+ <button
78
+ type="button"
79
+ class={classes.trigger}
80
+ data-image-trigger
81
+ >
82
+ {isResponsive && mobileImg && desktopImg ? (
83
+ <picture>
84
+ <source media={`(max-width: ${breakpointVal - 1}px)`} srcset={mobileImg.src} />
85
+ <source media={`(min-width: ${breakpointVal}px)`} srcset={desktopImg.src} />
86
+ <img src={desktopImg.src} alt={alt} loading={loading} class="w-full h-full object-cover rounded-lg" />
87
+ </picture>
88
+ ) : isFormatFallback ? (
89
+ typeof src === "string" ? (
90
+ <Picture src={src} formats={formats!} alt={alt} width={imgWidth ?? 800} height={imgHeight ?? 400} loading={loading} class="w-full h-full object-cover rounded-lg" />
91
+ ) : (
92
+ <Picture src={src as ImageMetadata} formats={formats!} alt={alt} width={imgWidth ?? 800} height={imgHeight ?? 400} loading={loading} class="w-full h-full object-cover rounded-lg" />
93
+ )
94
+ ) : (
95
+ typeof src === "string" ? (
96
+ <Image src={src} alt={alt} width={imgWidth ?? 800} height={imgHeight ?? 400} loading={loading} class={classes.triggerImage} />
97
+ ) : (
98
+ <Image src={src as ImageMetadata} alt={alt} width={imgWidth ?? 800} height={imgHeight ?? 400} loading={loading} class={classes.triggerImage} />
99
+ )
100
+ )}
101
+ </button>
102
+ </slot>
103
+
104
+ <dialog
105
+ class={classes.dialog}
106
+ data-image-dialog
107
+ >
108
+ <div class="flex flex-col bg-background text-foreground max-h-[90vh]">
109
+ <div class="flex-1 min-h-0 flex items-center justify-center p-4 overflow-hidden">
110
+ {isResponsive && mobileImg && desktopImg ? (
111
+ <picture class="max-w-full max-h-[65vh] flex items-center justify-center overflow-hidden">
112
+ <source media={`(max-width: ${breakpointVal - 1}px)`} srcset={mobileImg.src} />
113
+ <source media={`(min-width: ${breakpointVal}px)`} srcset={desktopImg.src} />
114
+ <img src={desktopImg.src} alt={alt} class={classes.image} data-modal-img />
115
+ </picture>
116
+ ) : (
117
+ <img
118
+ src={typeof src === "string" ? src : src!.src}
119
+ alt={alt}
120
+ class={classes.image}
121
+ data-modal-img
122
+ />
123
+ )}
124
+ </div>
125
+
126
+ <hr class="border-border mx-4 mb-3 shrink-0" />
127
+
128
+ <div class={classes.fileInfo}>
129
+ <div class="flex flex-col gap-xs text-sm">
130
+ {
131
+ metaSource && (
132
+ <div class="flex flex-row gap-xs items-center">
133
+ <span class="i-lucide-image size-4 shrink-0 text-muted-foreground" />
134
+ <span class="text-muted-foreground">Source:</span>
135
+ <span class="text-dimmed truncate max-w-[40vw]">{fileName}</span>
136
+ </div>
137
+ )
138
+ }
139
+ {
140
+ metaFormat && (
141
+ <div class="flex flex-row gap-xs items-center">
142
+ <span class="i-lucide-file-question-mark size-4 shrink-0 text-muted-foreground" />
143
+ <span class="text-muted-foreground">Format:</span>
144
+ <span class="text-dimmed" data-metadata-format>{fileExtension || "IMG"}</span>
145
+ </div>
146
+ )
147
+ }
148
+ {
149
+ metaDimensions && (
150
+ <div class="flex flex-row gap-xs items-center">
151
+ <span class="i-lucide-image-upscale size-4 shrink-0 text-muted-foreground" />
152
+ <span class="text-muted-foreground">Dimensions:</span>
153
+ <span class="text-dimmed">{(imgWidth || "?")} x {(imgHeight || "?")}</span>
154
+ </div>
155
+ )
156
+ }
157
+ {
158
+ metaSize && (
159
+ <div class="flex flex-row gap-xs items-center">
160
+ <span class="i-lucide-hard-drive size-4 shrink-0 text-muted-foreground" />
161
+ <span class="text-muted-foreground">Size:</span>
162
+ <span class="text-dimmed" data-metadata-size>{initialSize !== undefined ? `${initialSize} bytes` : "fetching..."}</span>
163
+ </div>
164
+ )
165
+ }
166
+ {
167
+ metaAlt && (
168
+ <div class="flex flex-row gap-xs items-center">
169
+ <span class="i-lucide-align-left size-4 shrink-0 text-muted-foreground" />
170
+ <span class="text-muted-foreground">Alt:</span>
171
+ <span class="text-dimmed truncate max-w-[30vw]" class:list={{ "italic opacity-50": !alt }}>{alt || "none"}</span>
172
+ </div>
173
+ )
174
+ }
175
+ </div>
176
+
177
+ {
178
+ metaDownload && (
179
+ <button
180
+ type="button"
181
+ class={classes.download}
182
+ data-image-download
183
+ >
184
+ <span class="i-lucide-download size-4 shrink-0" />
185
+ Download Original
186
+ </button>
187
+ )
188
+ }
189
+ </div>
190
+
191
+ <form method="dialog" class="absolute top-2 right-2">
192
+ <button
193
+ type="submit"
194
+ class={classes.closeButton}
195
+ aria-label="Close"
196
+ >
197
+ <span class="i-lucide-x size-4" />
198
+ </button>
199
+ </form>
200
+ </div>
201
+ </dialog>
202
+ </div>
203
+ </rla-image>
204
+
205
+ <script>
206
+ class RLAImage extends HTMLElement {
207
+ connectedCallback() {
208
+ this.style.display = 'contents';
209
+ const trigger = this.querySelector("[data-image-trigger]");
210
+ if (!trigger) return;
211
+
212
+ const dialog = this.querySelector("[data-image-dialog]") as HTMLDialogElement | null;
213
+ if (!dialog) return;
214
+
215
+ const sizeEl = this.querySelector("[data-metadata-size]");
216
+ const formatEl = this.querySelector("[data-metadata-format]");
217
+ let fetched = false;
218
+
219
+ trigger.addEventListener("click", () => {
220
+ if (!fetched) {
221
+ fetched = true;
222
+ const imgEl = dialog.querySelector("[data-modal-img]");
223
+ if (imgEl) {
224
+ const src = imgEl.getAttribute("src");
225
+ if (src) {
226
+ fetch(src).then(r => r.blob()).then(blob => {
227
+ if (sizeEl) sizeEl.textContent = (blob.size / 1024).toFixed(2) + " KB";
228
+ if (formatEl && blob.type) {
229
+ const mime = blob.type.split("/").pop()?.toUpperCase();
230
+ if (mime && mime !== "OCTET-STREAM") formatEl.textContent = mime;
231
+ }
232
+ return;
233
+ }).catch(() => { if (sizeEl) sizeEl.textContent = "unavailable"; });
234
+ }
235
+ }
236
+ }
237
+ dialog.showModal();
238
+ });
239
+
240
+ dialog.addEventListener("click", (e) => {
241
+ if (e.target === dialog) dialog.close();
242
+ });
243
+
244
+ const downloadBtn = dialog.querySelector("[data-image-download]");
245
+ if (downloadBtn) {
246
+ downloadBtn.addEventListener("click", async () => {
247
+ const img = dialog.querySelector("img");
248
+ const imgSrc = img?.getAttribute("src");
249
+ if (!imgSrc) return;
250
+ try {
251
+ const response = await fetch(imgSrc);
252
+ const blob = await response.blob();
253
+ const url = URL.createObjectURL(blob);
254
+ const link = document.createElement("a");
255
+ link.href = url;
256
+ const triggerImg = trigger.querySelector("img");
257
+ const srcAttr = triggerImg ? triggerImg.getAttribute("src") || "" : "";
258
+ link.download = (srcAttr.split("/").pop() || "").split("?")[0] || `image-${Date.now()}`;
259
+ document.body.appendChild(link);
260
+ link.click();
261
+ document.body.removeChild(link);
262
+ URL.revokeObjectURL(url);
263
+ } catch (err) {
264
+ console.error("Download failed", err);
265
+ }
266
+ });
267
+ }
268
+ }
269
+ }
270
+
271
+ if (!customElements.get('rla-image')) {
272
+ customElements.define('rla-image', RLAImage);
273
+ }
274
+ </script>