@rimelight/ui 0.0.34 → 0.0.36

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 (185) hide show
  1. package/README.md +1 -0
  2. package/package.json +19 -24
  3. package/src/components/astro/RLAAccordion.astro +94 -18
  4. package/src/components/astro/RLAAvatar.astro +135 -68
  5. package/src/components/astro/RLABadge.astro +4 -2
  6. package/src/components/astro/RLABanner.astro +138 -23
  7. package/src/components/astro/RLABreadcrumb.astro +13 -0
  8. package/src/components/astro/RLAButton.astro +8 -4
  9. package/src/components/astro/RLACallout.astro +112 -0
  10. package/src/components/astro/RLACard.astro +6 -5
  11. package/src/components/astro/RLACarousel.astro +104 -75
  12. package/src/components/astro/RLAChart.astro +4 -1
  13. package/src/components/astro/RLAChip.astro +11 -5
  14. package/src/components/astro/RLACollapsible.astro +4 -1
  15. package/src/components/astro/RLAColorArea.astro +432 -0
  16. package/src/components/astro/RLAColorField.astro +300 -0
  17. package/src/components/astro/RLAColorSlider.astro +413 -0
  18. package/src/components/astro/RLAConfirm.astro +13 -11
  19. package/src/components/astro/RLACopyMarkdown.astro +78 -0
  20. package/src/components/astro/RLADate.astro +30 -0
  21. package/src/components/astro/RLADrawer.astro +50 -3
  22. package/src/components/astro/RLADropdownMenu.astro +78 -51
  23. package/src/components/astro/RLAFieldGroup.astro +4 -1
  24. package/src/components/astro/RLAFileUpload.astro +114 -100
  25. package/src/components/astro/RLAFooter.astro +2 -1
  26. package/src/components/astro/RLAFormField.astro +10 -6
  27. package/src/components/astro/RLAGrid.astro +31 -39
  28. package/src/components/astro/RLAHead.astro +139 -39
  29. package/src/components/astro/RLAHeader.astro +2 -1
  30. package/src/components/astro/RLAImage.astro +274 -251
  31. package/src/components/astro/RLAInput.astro +14 -9
  32. package/src/components/astro/RLAInputMenu.astro +119 -83
  33. package/src/components/astro/RLAKbd.astro +5 -5
  34. package/src/components/astro/RLALayoutGrid.astro +395 -0
  35. package/src/components/astro/RLALink.astro +23 -1
  36. package/src/components/astro/RLALinkGroup.astro +99 -99
  37. package/src/components/astro/RLALocaleSelector.astro +34 -41
  38. package/src/components/astro/RLALogo.astro +117 -90
  39. package/src/components/astro/RLAModal.astro +48 -18
  40. package/src/components/astro/RLANavigationMenu.astro +381 -326
  41. package/src/components/astro/{RLADocsPackageManagers.astro → RLAPackageManagers.astro} +81 -87
  42. package/src/components/astro/RLAPageSection.astro +4 -2
  43. package/src/components/astro/RLAPopover.astro +4 -3
  44. package/src/components/astro/RLAPost.astro +11 -2
  45. package/src/components/astro/RLAScrollArea.astro +4 -1
  46. package/src/components/astro/RLAScrollToTop.astro +200 -172
  47. package/src/components/astro/RLASearch.astro +282 -0
  48. package/src/components/astro/RLASelect.astro +78 -55
  49. package/src/components/astro/RLASeparator.astro +11 -6
  50. package/src/components/astro/RLAShare.astro +60 -0
  51. package/src/components/astro/RLAShortcuts.astro +429 -0
  52. package/src/components/astro/RLASidebar.astro +158 -212
  53. package/src/components/astro/RLASlideover.astro +47 -17
  54. package/src/components/astro/RLASplitter.astro +194 -141
  55. package/src/components/astro/RLASteps.astro +118 -71
  56. package/src/components/astro/RLASurround.astro +39 -0
  57. package/src/components/astro/RLATable.astro +4 -1
  58. package/src/components/astro/RLATableOfContents.astro +109 -23
  59. package/src/components/astro/RLATabs.astro +147 -133
  60. package/src/components/astro/RLATextarea.astro +4 -1
  61. package/src/components/astro/RLAThemeSelector.astro +105 -76
  62. package/src/components/astro/RLAToast.astro +35 -21
  63. package/src/components/vue/RLVBanner.vue +230 -0
  64. package/src/components/vue/RLVButton.vue +3 -2
  65. package/src/components/vue/RLVCheckbox.vue +4 -2
  66. package/src/components/vue/RLVFooter.vue +3 -2
  67. package/src/components/vue/RLVHeader.vue +3 -2
  68. package/src/components/vue/RLVIcon.vue +4 -2
  69. package/src/components/vue/RLVInput.vue +5 -4
  70. package/src/components/vue/RLVLogo.vue +25 -3
  71. package/src/components/vue/RLVPlaceholder.vue +3 -2
  72. package/src/components/vue/RLVPost.vue +8 -2
  73. package/src/components/vue/RLVProgress.vue +60 -0
  74. package/src/components/vue/RLVScrollToTop.vue +65 -52
  75. package/src/components/vue/RLVSection.vue +14 -13
  76. package/src/components/vue/RLVToast.vue +17 -4
  77. package/src/composables/index.ts +1 -0
  78. package/src/composables/useHeaderStore.ts +1 -0
  79. package/src/composables/useShortcuts.ts +11 -0
  80. package/src/config/security.ts +43 -36
  81. package/src/config/site.config.ts +1 -0
  82. package/src/docs/components/ApiChangelog.astro +147 -0
  83. package/src/{plugins/starlightDocsApi → docs}/components/ApiEmits.astro +4 -4
  84. package/src/{plugins/starlightDocsApi → docs}/components/ApiProps.astro +4 -4
  85. package/src/{plugins/starlightDocsApi → docs}/components/ApiSlots.astro +4 -4
  86. package/src/docs/components/ApiTheme.astro +100 -0
  87. package/src/docs/extractAll.ts +94 -0
  88. package/src/docs/extractors/extractAstro.ts +69 -0
  89. package/src/docs/extractors/extractTheme.ts +56 -0
  90. package/src/{plugins/starlightDocsApi/extract-vue.ts → docs/extractors/extractVue.ts} +164 -15
  91. package/src/{plugins/starlightDocsApi → docs}/utils.ts +1 -2
  92. package/src/env.d.ts +0 -12
  93. package/src/integrations/ui.ts +35 -19
  94. package/src/middleware/security.ts +75 -19
  95. package/src/presets/index.ts +118 -293
  96. package/src/styles/index.css +0 -2
  97. package/src/themes/accordion.theme.ts +29 -3
  98. package/src/themes/aspect-ratio.theme.ts +1 -1
  99. package/src/themes/avatar-group.theme.ts +1 -1
  100. package/src/themes/avatar.theme.ts +2 -2
  101. package/src/themes/badge.theme.ts +2 -3
  102. package/src/themes/banner.theme.ts +40 -4
  103. package/src/themes/breadcrumb.theme.ts +1 -1
  104. package/src/themes/button.theme.ts +21 -22
  105. package/src/themes/{alert.theme.ts → callout.theme.ts} +12 -39
  106. package/src/themes/card.theme.ts +17 -9
  107. package/src/themes/carousel.theme.ts +1 -1
  108. package/src/themes/checkbox.theme.ts +1 -2
  109. package/src/themes/chip.theme.ts +2 -3
  110. package/src/themes/color-area.theme.ts +33 -0
  111. package/src/themes/color-field.theme.ts +32 -0
  112. package/src/themes/color-slider.theme.ts +34 -0
  113. package/src/themes/confirm.theme.ts +1 -1
  114. package/src/themes/container.theme.ts +1 -1
  115. package/src/themes/drawer.theme.ts +1 -1
  116. package/src/themes/footer.theme.ts +2 -2
  117. package/src/themes/grid.theme.ts +38 -0
  118. package/src/themes/header.theme.ts +4 -3
  119. package/src/themes/hover-card.theme.ts +1 -1
  120. package/src/themes/image.theme.ts +11 -1
  121. package/src/themes/input.theme.ts +7 -1
  122. package/src/themes/kbd.theme.ts +2 -3
  123. package/src/themes/label.theme.ts +1 -1
  124. package/src/themes/layout-grid.theme.ts +16 -0
  125. package/src/themes/link-group.theme.ts +0 -4
  126. package/src/themes/marquee.theme.ts +1 -1
  127. package/src/themes/modal.theme.ts +1 -1
  128. package/src/themes/navigation-menu.theme.ts +2 -2
  129. package/src/themes/page-section.theme.ts +4 -2
  130. package/src/themes/pagination.theme.ts +1 -1
  131. package/src/themes/pin-input.theme.ts +1 -1
  132. package/src/themes/popover.theme.ts +1 -1
  133. package/src/themes/post.theme.ts +23 -3
  134. package/src/themes/progress.theme.ts +1 -2
  135. package/src/themes/scroll-to-top.theme.ts +2 -3
  136. package/src/themes/search.theme.ts +64 -0
  137. package/src/themes/separator.theme.ts +1 -1
  138. package/src/themes/slideover.theme.ts +1 -1
  139. package/src/themes/slider.theme.ts +1 -2
  140. package/src/themes/spinner.theme.ts +1 -2
  141. package/src/themes/{megamenu.theme.ts → steps.theme.ts} +3 -3
  142. package/src/themes/sticky-surface.theme.ts +1 -1
  143. package/src/themes/switch.theme.ts +1 -2
  144. package/src/themes/table-of-contents.theme.ts +21 -2
  145. package/src/themes/timeline.theme.ts +7 -2
  146. package/src/themes/toast.theme.ts +1 -1
  147. package/src/types/components/accordion.ts +35 -2
  148. package/src/types/components/avatar.ts +16 -0
  149. package/src/types/components/banner.ts +42 -0
  150. package/src/types/components/button.ts +3 -4
  151. package/src/types/components/{alert.ts → callout.ts} +6 -6
  152. package/src/types/components/color-area.ts +19 -0
  153. package/src/types/components/color-field.ts +21 -0
  154. package/src/types/components/color-slider.ts +20 -0
  155. package/src/types/components/grid.ts +23 -0
  156. package/src/types/components/input.ts +4 -0
  157. package/src/types/components/layout-grid.ts +145 -0
  158. package/src/types/components/link-group.ts +4 -2
  159. package/src/types/components/link.ts +15 -0
  160. package/src/types/components/logo.ts +3 -3
  161. package/src/types/components/post.ts +12 -0
  162. package/src/types/components/search.ts +29 -0
  163. package/src/types/components/sidebar.ts +2 -6
  164. package/src/types/components/{megamenu.ts → steps.ts} +7 -1
  165. package/src/types/components/table-of-contents.ts +22 -0
  166. package/src/types/components/toast.ts +4 -0
  167. package/src/types/docs.ts +40 -0
  168. package/src/types/index.ts +151 -1
  169. package/src/types/theme.ts +6 -6
  170. package/src/utils/color.ts +165 -0
  171. package/src/utils/docs.ts +260 -110
  172. package/src/utils/headerStack.ts +24 -4
  173. package/src/utils/index.ts +2 -0
  174. package/src/utils/shortcuts.ts +322 -0
  175. package/src/components/TableOfContents.astro +0 -107
  176. package/src/components/astro/RLAAlert.astro +0 -93
  177. package/src/components/astro/RLAChangelog.astro +0 -23
  178. package/src/components/astro/RLAMegamenu.astro +0 -23
  179. package/src/plugins/index.ts +0 -2
  180. package/src/plugins/starlightDocsApi/components/ApiTheme.astro +0 -27
  181. package/src/plugins/starlightDocsApi/index.ts +0 -272
  182. package/src/styles/prism.css +0 -42
  183. package/src/themes/changelog.theme.ts +0 -13
  184. package/src/types/components/index.ts +0 -134
  185. /package/src/{plugins/starlightDocsApi → docs}/types.ts +0 -0
package/README.md CHANGED
@@ -8,6 +8,7 @@
8
8
  [![NPM Version](https://img.shields.io/npm/v/@rimelight/ui?style=for-the-badge&logo=npm&logoColor=white&color=A682FF)](https://www.npmjs.com/package/@rimelight/ui)  
9
9
  [![NPM Downloads](https://img.shields.io/npm/dt/@rimelight/ui?style=for-the-badge&color=A682FF&logo=npm&logoColor=white)](https://www.npmjs.com/package/@rimelight/ui)  
10
10
  [![View on npmx](https://img.shields.io/badge/VIEW%20ON%20NPMX-A682FF?style=for-the-badge&logo=npm&logoColor=white)](https://npmx.dev/package/@rimelight/ui)  
11
+ [![pkg.pr.new](https://pkg.pr.new/badge/Rimelight-Entertainment/rimelight)](https://pkg.pr.new/~/Rimelight-Entertainment/rimelight)  
11
12
 
12
13
  Rimelight UI is a comprehensive component library for [Astro](https://astro.build) websites used and maintained by [Rimelight Entertainment](https://rimelight.com).
13
14
  It offers a suite of accessible and highly performant components as [Astro Components](https://docs.astro.build/basics/astro-components/) and [Vue Components](https://vuejs.org), and is available as a free and open source project for any to use.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rimelight/ui",
3
- "version": "0.0.34",
3
+ "version": "0.0.36",
4
4
  "private": false,
5
5
  "description": "Rimelight Entertainment UI Library.",
6
6
  "keywords": [
@@ -42,6 +42,8 @@
42
42
  "./utils/*": "./src/utils/*",
43
43
  "./integrations": "./src/integrations/index.ts",
44
44
  "./integrations/*": "./src/integrations/*",
45
+ "./docs": "./src/docs/extractAll.ts",
46
+ "./docs/*": "./src/docs/*",
45
47
  "./plugins": "./src/plugins/index.ts",
46
48
  "./plugins/*": "./src/plugins/*",
47
49
  "./middleware": "./src/middleware/index.ts",
@@ -56,50 +58,43 @@
56
58
  "access": "public"
57
59
  },
58
60
  "scripts": {
59
- "prepare": "vp config",
60
- "knip": "knip",
61
61
  "astro": "astro",
62
62
  "docs:meta": "tsx scripts/extract-meta.ts"
63
63
  },
64
64
  "dependencies": {
65
- "@astrojs/prism": "^4.0.2",
66
- "@astrojs/vue": "7.0.0-alpha.0",
67
- "@iconify-json/lucide": "^1.2.109",
68
- "@unocss/astro": "^66.7.0",
65
+ "@astrojs/vue": "6.0.1",
66
+ "@iconify-json/lucide": "1.2.113",
67
+ "@unocss/astro": "^66.7.2",
69
68
  "css-variants": "2.3.5",
70
69
  "defu": "6.1.7",
71
70
  "embla-carousel": "8.6.0",
72
71
  "nanostores": "1.3.0",
73
72
  "picomatch": "^4.0.4",
74
- "prismjs": "^1.29.0",
75
- "turndown": "^7.2.4",
76
- "turndown-plugin-gfm": "^1.0.2",
77
- "vite-plugin-virtual": "^0.5.0"
73
+ "vite-plugin-virtual": "^0.5.0",
74
+ "vue": "3.5.38"
78
75
  },
79
76
  "devDependencies": {
80
77
  "@astrojs/check": "0.9.9",
81
78
  "@astrojs/ts-plugin": "1.10.9",
82
- "@e18e/eslint-plugin": "0.5.0",
83
- "@types/node": "25.9.1",
79
+ "@e18e/eslint-plugin": "0.5.1",
80
+ "@types/node": "25.9.3",
84
81
  "@types/picomatch": "^4.0.3",
85
- "@unocss/eslint-plugin": "66.7.0",
86
- "astro": "7.0.0-alpha.0",
82
+ "@unocss/eslint-plugin": "66.7.2",
83
+ "astro": "6.4.8",
87
84
  "eslint-plugin-regexp": "3.1.0",
88
- "knip": "6.14.2",
89
- "tsx": "4.22.3",
85
+ "tsx": "4.22.4",
90
86
  "typescript": "6.0.3",
91
- "unocss": "66.7.0",
92
- "vite-plus": "catalog:"
87
+ "unocss": "66.7.2",
88
+ "vite-plus": "0.2.1"
93
89
  },
94
90
  "peerDependencies": {
95
- "@astrojs/starlight": ">=0.5.0",
96
- "astro": ">=6.0.0",
97
- "vue": ">=3.4.0"
91
+ "@rimelight/i18n": "workspace:^0.0.1",
92
+ "astro": ">=6.0.0"
98
93
  },
99
94
  "peerDependenciesMeta": {
100
- "vue": {
95
+ "@rimelight/i18n": {
101
96
  "optional": true
102
97
  }
103
98
  },
104
- "packageManager": "pnpm@11.3.0"
99
+ "packageManager": "pnpm@11.8.0"
105
100
  }
@@ -1,18 +1,94 @@
1
- ---
2
- import type { AccordionProps } from "../../types";
3
-
4
- const { summary, class: className, ...attrs } = Astro.props as AccordionProps;
5
- ---
6
-
7
- <details class:list={['group', className]} {...attrs}>
8
- <summary
9
- class="accordion code flex cursor-pointer list-none items-center justify-between text-astro-gray-200"
10
- >
11
- <span>{summary}</span>
12
- <span class="i-lucide-chevron s-4 rotate-0 transition-transform duration-300 ease-in-out group-open:-rotate-180" />
13
- </summary>
14
-
15
- <div class="pt-4">
16
- <slot />
17
- </div>
18
- </details>
1
+ ---
2
+ import { scv, cx } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { AccordionProps } from "../../types"
5
+ import accordionThemeDefault, { createAccordionTheme } from "../../themes/accordion.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const accordionTheme = uiConfig.colors ? createAccordionTheme() : accordionThemeDefault
10
+ const accordion = scv(accordionTheme)
11
+
12
+ const {
13
+ items,
14
+ summary,
15
+ multiple = false,
16
+ trailingIcon = "i-lucide-chevron-down",
17
+ disabled = false,
18
+ name,
19
+ ui: uiProp,
20
+ class: className,
21
+ ...rest
22
+ } = Astro.props as AccordionProps
23
+
24
+ const classes = resolveClasses(accordion, {
25
+ disabled
26
+ }, useUi("accordion", uiProp), className)
27
+
28
+ // Generate a unique name for HTML details grouping if single-open mode (multiple=false) is active
29
+ const groupName = name || (!multiple ? `accordion-${Math.random().toString(36).substring(2, 9)}` : undefined)
30
+ ---
31
+
32
+ {items ? (
33
+ <div class={classes.root} data-slot="root" {...rest}>
34
+ {items.map((item) => {
35
+ const itemDisabled = disabled || item.disabled
36
+ const itemTrailingIcon = item.trailingIcon || trailingIcon
37
+
38
+ return (
39
+ <details
40
+ class={classes.item}
41
+ data-slot="item"
42
+ name={groupName}
43
+ >
44
+ <summary
45
+ class={cx(classes.trigger, itemDisabled && "pointer-events-none opacity-50 select-none")}
46
+ data-slot="trigger"
47
+ >
48
+ {item.icon && (
49
+ <span class={classes.leadingIcon} data-slot="leading-icon">
50
+ <span class={cx(item.icon)} aria-hidden="true" />
51
+ </span>
52
+ )}
53
+
54
+ <span class={classes.label} data-slot="label">
55
+ {item.label}
56
+ </span>
57
+
58
+ {itemTrailingIcon && (
59
+ <span class={classes.trailingIcon} data-slot="trailing-icon">
60
+ <span class={cx(itemTrailingIcon)} aria-hidden="true" />
61
+ </span>
62
+ )}
63
+ </summary>
64
+
65
+ <div class={classes.content} data-slot="content">
66
+ <div class={classes.body} data-slot="body">
67
+ {item.content}
68
+ </div>
69
+ </div>
70
+ </details>
71
+ )
72
+ })}
73
+ </div>
74
+ ) : (
75
+ <details class:list={[classes.root, classes.item]} data-slot="root" name={name} {...rest}>
76
+ <summary
77
+ class={cx(classes.trigger, disabled && "pointer-events-none opacity-50 select-none")}
78
+ data-slot="trigger"
79
+ >
80
+ <span class={classes.label} data-slot="label">{summary}</span>
81
+ {trailingIcon && (
82
+ <span class={classes.trailingIcon} data-slot="trailing-icon">
83
+ <span class={cx(trailingIcon)} aria-hidden="true" />
84
+ </span>
85
+ )}
86
+ </summary>
87
+
88
+ <div class={classes.content} data-slot="content">
89
+ <div class={classes.body} data-slot="body">
90
+ <slot />
91
+ </div>
92
+ </div>
93
+ </details>
94
+ )}
@@ -1,68 +1,135 @@
1
- ---
2
- import { scv, cx } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { AvatarProps } from "../../types"
5
- import avatarThemeDefault, { createAvatarTheme } from "../../themes/avatar.theme"
6
- import { getUIConfig } from "virtual:rimelight-ui"
7
-
8
- const uiConfig = getUIConfig()
9
- const avatarTheme = uiConfig.colors ? createAvatarTheme(uiConfig.colors) : avatarThemeDefault
10
-
11
- const avatar = scv(avatarTheme)
12
-
13
- const {
14
- src,
15
- alt = "",
16
- fallback,
17
- size = "md",
18
- badge = false,
19
- badgeColor = "success",
20
- badgePosition = "bottom-right",
21
- ui: uiProp,
22
- class: className,
23
- ...rest
24
- } = Astro.props as AvatarProps
25
-
26
- const classes = resolveClasses(avatar, {
27
- size,
28
- color: Astro.props.color || "neutral",
29
- badgePosition,
30
- hasBadge: !!badge
31
- }, useUi("avatar", uiProp), className)
32
- ---
33
- <span
34
- class={classes.root}
35
- data-slot="root"
36
- {...rest}
37
- >
38
- <slot>
39
- {src ? (
40
- <img
41
- src={src}
42
- alt={alt}
43
- class={classes.image}
44
- data-slot="image"
45
- />
46
- ) : (
47
- <span class={classes.fallback} data-slot="fallback">
48
- <slot name="fallback">
49
- {fallback}
50
- </slot>
51
- {!fallback && !Astro.slots.has("fallback") && (
52
- <span class={cx(classes.icon, "i-lucide-user")} aria-hidden="true" />
53
- )}
54
- </span>
55
- )}
56
- </slot>
57
-
58
- <slot name="badge">
59
- {badge && (
60
- <span
61
- class={cx(classes.badge, badgeColor && (badgeColor.startsWith('bg-') ? badgeColor : `bg-${badgeColor}-500`))}
62
- data-slot="badge"
63
- >
64
- {typeof badge === 'string' || typeof badge === 'number' ? badge : null}
65
- </span>
66
- )}
67
- </slot>
68
- </span>
1
+ ---
2
+ import { scv, cx } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { AvatarProps } from "../../types"
5
+ import avatarThemeDefault, { createAvatarTheme } from "../../themes/avatar.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const avatarTheme = uiConfig.colors ? createAvatarTheme(uiConfig.colors) : avatarThemeDefault
10
+
11
+ const avatar = scv(avatarTheme)
12
+
13
+ const {
14
+ src,
15
+ alt = "",
16
+ fallback,
17
+ initials,
18
+ title,
19
+ subtitle,
20
+ label,
21
+ size = "md",
22
+ badge = false,
23
+ badgeColor = "success",
24
+ badgePosition = "bottom-right",
25
+ ui: uiProp,
26
+ class: className,
27
+ ...rest
28
+ } = Astro.props as AvatarProps & {
29
+ badgePosition?: "top-right" | "bottom-right" | "top-left" | "bottom-left"
30
+ badgeColor?: string
31
+ }
32
+
33
+ const classes = resolveClasses(avatar, {
34
+ size,
35
+ color: (Astro.props.color || "neutral") as "neutral",
36
+ badgePosition: badgePosition as "bottom-right"
37
+ }, useUi("avatar", uiProp), className)
38
+
39
+ const avatarFallback = fallback || initials
40
+ const hasTextLayout = !!(title || subtitle)
41
+ ---
42
+ {hasTextLayout ? (
43
+ <div class="flex items-center gap-3" data-slot="profile-wrapper">
44
+ <span
45
+ class={classes.root}
46
+ data-slot="root"
47
+ aria-label={label || title}
48
+ role={label || title ? "img" : undefined}
49
+ {...rest}
50
+ >
51
+ <slot>
52
+ {src ? (
53
+ <img
54
+ src={src}
55
+ alt={alt}
56
+ class={classes.image}
57
+ data-slot="image"
58
+ />
59
+ ) : (
60
+ <span class={classes.fallback} data-slot="fallback">
61
+ <slot name="fallback">
62
+ {avatarFallback}
63
+ </slot>
64
+ {!avatarFallback && !Astro.slots.has("fallback") && (
65
+ <span class={cx(classes.icon, "i-lucide-user")} aria-hidden="true" />
66
+ )}
67
+ </span>
68
+ )}
69
+ </slot>
70
+
71
+ <slot name="badge">
72
+ {badge && (
73
+ <span
74
+ class={cx(classes.badge, badgeColor && (typeof badgeColor === 'string' && badgeColor.startsWith('bg-') ? badgeColor : `bg-${badgeColor}-500`))}
75
+ data-slot="badge"
76
+ >
77
+ {typeof badge === 'string' || typeof badge === 'number' ? badge : null}
78
+ </span>
79
+ )}
80
+ </slot>
81
+ </span>
82
+ <div class="flex flex-col leading-tight">
83
+ {title && (
84
+ <span class="font-medium text-sm text-[var(--foreground)]" data-slot="title">
85
+ {title}
86
+ </span>
87
+ )}
88
+ {subtitle && (
89
+ <span class="text-xs text-[var(--muted-foreground)]" data-slot="subtitle">
90
+ {subtitle}
91
+ </span>
92
+ )}
93
+ </div>
94
+ </div>
95
+ ) : (
96
+ <span
97
+ class={classes.root}
98
+ data-slot="root"
99
+ aria-label={label}
100
+ role={label ? "img" : undefined}
101
+ {...rest}
102
+ >
103
+ <slot>
104
+ {src ? (
105
+ <img
106
+ src={src}
107
+ alt={alt}
108
+ class={classes.image}
109
+ data-slot="image"
110
+ />
111
+ ) : (
112
+ <span class={classes.fallback} data-slot="fallback">
113
+ <slot name="fallback">
114
+ {avatarFallback}
115
+ </slot>
116
+ {!avatarFallback && !Astro.slots.has("fallback") && (
117
+ <span class={cx(classes.icon, "i-lucide-user")} aria-hidden="true" />
118
+ )}
119
+ </span>
120
+ )}
121
+ </slot>
122
+
123
+ <slot name="badge">
124
+ {badge && (
125
+ <span
126
+ class={cx(classes.badge, badgeColor && (typeof badgeColor === 'string' && badgeColor.startsWith('bg-') ? badgeColor : `bg-${badgeColor}-500`))}
127
+ data-slot="badge"
128
+ >
129
+ {typeof badge === 'string' || typeof badge === 'number' ? badge : null}
130
+ </span>
131
+ )}
132
+ </slot>
133
+ </span>
134
+ )}
135
+
@@ -21,9 +21,11 @@ const {
21
21
  ...rest
22
22
  } = Astro.props as BadgeProps & { label?: string }
23
23
 
24
+ const resolvedVariant = (variant === "ghost") ? "soft" : ((variant === "solid" || variant === "outline" || variant === "soft" || variant === "subtle") ? variant : "solid")
25
+
24
26
  const classes = resolveClasses(badge, {
25
- variant,
26
- color,
27
+ variant: resolvedVariant as "solid",
28
+ color: color as "neutral",
27
29
  size,
28
30
  shape,
29
31
  theme
@@ -1,23 +1,138 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { BannerProps } from "../../types"
5
- import bannerThemeDefault, { createBannerTheme } from "../../themes/banner.theme"
6
- import { getUIConfig } from "virtual:rimelight-ui"
7
-
8
- const uiConfig = getUIConfig()
9
- const bannerTheme = uiConfig.colors ? createBannerTheme() : bannerThemeDefault
10
-
11
- const banner = scv(bannerTheme)
12
-
13
- const {
14
- ui: uiProp,
15
- class: className,
16
- ...rest
17
- } = Astro.props as BannerProps
18
-
19
- const classes = resolveClasses(banner, {}, useUi("banner", uiProp), className);
20
- ---
21
- <div class={classes.root} data-slot="root" {...rest}>
22
- <slot />
23
- </div>
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { BannerProps } from "../../types"
5
+ import bannerThemeDefault, { createBannerTheme } from "../../themes/banner.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const bannerTheme = uiConfig.colors ? createBannerTheme() : bannerThemeDefault
10
+
11
+ const banner = scv(bannerTheme)
12
+
13
+ const {
14
+ contain = true,
15
+ sticky = false,
16
+ fixed = true,
17
+ stackIndex = 0,
18
+ hideOnScroll = true,
19
+ dismissable = false,
20
+ dismissId,
21
+ actions = [],
22
+ ui: uiProp,
23
+ class: className,
24
+ ...rest
25
+ } = Astro.props as BannerProps
26
+
27
+ const classes = resolveClasses(banner, {
28
+ contain,
29
+ sticky: fixed ? false : sticky,
30
+ fixed,
31
+ }, useUi("banner", uiProp), className);
32
+
33
+ const bannerId = `rla-banner-${Math.random().toString(36).slice(2, 8)}`;
34
+ const storageKey = dismissId || bannerId;
35
+ const zIndex = 200 - stackIndex;
36
+ ---
37
+
38
+ <div
39
+ id={bannerId}
40
+ data-slot="root"
41
+ class:list={[classes.root]}
42
+ data-rla-banner="true"
43
+ data-stack-index={stackIndex}
44
+ data-hide-on-scroll={String(hideOnScroll)}
45
+ data-header-layer-id={bannerId}
46
+ data-layer-type="banner"
47
+ data-dismiss-key={`rl-banner-dismiss-${storageKey}`}
48
+ {...rest}
49
+ >
50
+ <div class:list={[classes.content]} data-header-content>
51
+ <div class:list={[classes.container]}>
52
+ <div class:list={[classes.left, "actions-open-hidden"]} data-slot="left">
53
+ <slot name="left" />
54
+ </div>
55
+ <div class:list={[classes.center, "actions-open-hidden"]} data-slot="center">
56
+ <slot name="center">
57
+ <slot />
58
+ </slot>
59
+ </div>
60
+
61
+ {actions.length > 0 && (
62
+ <input
63
+ type="checkbox"
64
+ id={`${bannerId}-act`}
65
+ class="peer sr-only shrink-0"
66
+ />
67
+ )}
68
+
69
+ <div class="flex-1"></div>
70
+
71
+ <div class:list={[classes.side]}>
72
+ <slot name="right" />
73
+ </div>
74
+
75
+ {actions.length > 0 && (
76
+ <label
77
+ for={`${bannerId}-act`}
78
+ class="flex-none flex items-center justify-center size-7 rounded-md hover:bg-black/10 dark:hover:bg-white/10 cursor-pointer md:hidden text-sm leading-none peer-checked:order-first"
79
+ aria-label="Show actions"
80
+ >···</label>
81
+ )}
82
+
83
+ {actions.length > 0 && (
84
+ <div
85
+ class:list={[
86
+ classes.actions,
87
+ "hidden peer-checked:flex md:flex flex-row items-center justify-center gap-2 peer-checked:order-first"
88
+ ]}
89
+ >
90
+ {actions.map((action) => (
91
+ <a
92
+ href={action.href || "#"}
93
+ class:list={[
94
+ "inline-flex items-center justify-center gap-1 px-3 py-1 rounded-md text-xs font-semibold transition-colors no-underline cursor-pointer shrink-0",
95
+ action.variant === "solid" || !action.variant
96
+ ? "bg-foreground text-background hover:opacity-90"
97
+ : "bg-white/20 text-white hover:bg-white/30",
98
+ action.class
99
+ ]}
100
+ data-banner-action
101
+ >
102
+ {action.label}
103
+ </a>
104
+ ))}
105
+ </div>
106
+ )}
107
+
108
+ {dismissable && (
109
+ <button
110
+ class:list={[classes.dismiss]}
111
+ data-banner-close
112
+ aria-label="Close banner"
113
+ type="button"
114
+ >
115
+ <svg
116
+ xmlns="http://www.w3.org/2000/svg"
117
+ width="14"
118
+ height="14"
119
+ viewBox="0 0 24 24"
120
+ fill="none"
121
+ stroke="currentColor"
122
+ stroke-width="2"
123
+ stroke-linecap="round"
124
+ stroke-linejoin="round"
125
+ >
126
+ <line x1="18" y1="6" x2="6" y2="18" />
127
+ <line x1="6" y1="6" x2="18" y2="18" />
128
+ </svg>
129
+ </button>
130
+ )}
131
+ </div>
132
+ </div>
133
+ </div>
134
+
135
+ <style is:inline set:html={`
136
+ ${actions.length > 0 ? `#${bannerId}:has(#${bannerId}-act:checked) .actions-open-hidden { display: none !important; }` : ''}
137
+ ${fixed ? `#${bannerId} { z-index: ${zIndex} !important; }` : ''}
138
+ `} />
@@ -46,3 +46,16 @@ const classes = resolveClasses(breadcrumb, {}, useUi("breadcrumb", uiProp), clas
46
46
  )}
47
47
  </ol>
48
48
  </nav>
49
+
50
+ {items && (
51
+ <script type="application/ld+json" is:inline set:html={JSON.stringify({
52
+ "@context": "https://schema.org",
53
+ "@type": "BreadcrumbList",
54
+ "itemListElement": items.map((item, idx) => ({
55
+ "@type": "ListItem",
56
+ "position": idx + 1,
57
+ "name": item.label,
58
+ "item": item.href ? new URL(item.href, Astro.site || "https://starter.rimelight.com").toString() : undefined
59
+ }))
60
+ })} />
61
+ )}
@@ -32,7 +32,11 @@ const {
32
32
  ui: uiProp,
33
33
  class: className,
34
34
  ...rest
35
- } = Astro.props as ButtonProps
35
+ } = Astro.props as ButtonProps & {
36
+ rounded?: boolean
37
+ activeColor?: string
38
+ activeVariant?: string
39
+ }
36
40
 
37
41
  const isLeading = !!(leadingIcon || avatar || Astro.slots.has("leading")) || loading
38
42
  const isTrailing = !!(trailingIcon || Astro.slots.has("trailing")) || (loading && !isLeading)
@@ -49,8 +53,8 @@ const leadingIconClass = loading ? "animate-spin" : ""
49
53
  const trailingIconClass = loading ? "animate-spin" : ""
50
54
 
51
55
  const classes = resolveClasses(button, {
52
- variant: active && activeVariant ? activeVariant : variant,
53
- color: active && activeColor ? activeColor : color,
56
+ variant: (active && activeVariant ? activeVariant : variant) as "solid",
57
+ color: (active && activeColor ? activeColor : color) as "neutral",
54
58
  size,
55
59
  block,
56
60
  square: square || (!label && !Astro.slots.has("default")),
@@ -109,7 +113,7 @@ const loadingAutoProps = loadingAuto ? { 'data-loading-auto': '' } : {};
109
113
  {loadingAuto && (
110
114
  <script>
111
115
  document.querySelectorAll('button[data-loading-auto]').forEach((button) => {
112
- button.addEventListener('click', async (event) => {
116
+ button.addEventListener('click', async (_event) => {
113
117
  // Find if there are any other click listeners that return a promise
114
118
  // This is tricky in vanilla JS, but we can assume if it's data-loading-auto,
115
119
  // the user wants us to track the click.