@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
@@ -1,212 +1,158 @@
1
- ---
2
- import { scv } from "css-variants"
3
- import { useUi, resolveClasses } from "../../utils"
4
- import type { SidebarProps, SidebarItem } from "../../types"
5
- import sidebarThemeDefault, { createSidebarTheme } from "../../themes/sidebar.theme"
6
- import RLABadge from "./RLABadge.astro"
7
-
8
- const sidebarTheme = sidebarThemeDefault
9
- const sidebar = scv(sidebarTheme)
10
-
11
- const {
12
- items = [],
13
- side = "left",
14
- collapsible = "none",
15
- logo,
16
- ui: uiProp,
17
- class: className,
18
- t = (key: string) => key,
19
- ...rest
20
- } = Astro.props as SidebarProps & { t?: (key: string) => string }
21
-
22
- const classes = resolveClasses(sidebar, {
23
- side,
24
- collapsible
25
- }, useUi("sidebar", uiProp), className)
26
-
27
- // Recursive helper to render sidebar items with children
28
- const hasActiveChild = (item: SidebarItem): boolean => {
29
- if (item.active) return true
30
- return (item.children ?? []).some(c => hasActiveChild(c))
31
- }
32
-
33
- function normalizeBadge(badge: any) {
34
- if (!badge) return null
35
- if (typeof badge === "string") {
36
- return {
37
- text: badge,
38
- color: "primary",
39
- variant: "soft" as const,
40
- class: ""
41
- }
42
- }
43
-
44
- let color = badge.color || "primary"
45
- let variant = badge.variant || "soft"
46
-
47
- if (badge.variant) {
48
- const v = badge.variant.toLowerCase()
49
- if (v === "tip" || v === "success") {
50
- color = "success"
51
- variant = "soft"
52
- } else if (v === "caution" || v === "warning") {
53
- color = "warning"
54
- variant = "soft"
55
- } else if (v === "danger") {
56
- color = "danger"
57
- variant = "soft"
58
- } else if (v === "note") {
59
- color = "primary"
60
- variant = "soft"
61
- } else if (v === "default") {
62
- color = "primary"
63
- variant = "soft"
64
- }
65
- }
66
-
67
- return {
68
- text: badge.text || "",
69
- color,
70
- variant: variant as "solid" | "outline" | "soft",
71
- class: badge.class || ""
72
- }
73
- }
74
- ---
75
-
76
- <aside class={classes.root} data-slot="root" data-sidebar {...rest}>
77
- {/* Header */}
78
- <div class={classes.header} data-slot="header">
79
- <slot name="header">
80
- {logo && (
81
- <span data-slot="sidebar-logo" class="flex items-center gap-2">
82
- <span class="i-lucide-layers size-5 text-primary" />
83
- <span class="truncate">{logo}</span>
84
- </span>
85
- )}
86
- </slot>
87
- </div>
88
-
89
- {/* Body */}
90
- <div class={classes.content} data-slot="content">
91
- <slot>
92
- {items.map((item) => {
93
- const hasChildren = item.children && item.children.length > 0
94
- const isActive = item.active || hasActiveChild(item)
95
- return (
96
- <div class={classes.item} data-slot="item">
97
- {hasChildren ? (
98
- <details open={isActive} class="group/details">
99
- <summary
100
- class={classes.itemLink + (isActive ? " text-foreground bg-muted" : "") + " list-none cursor-pointer"}
101
- data-slot="item-summary"
102
- >
103
- {item.icon && (
104
- <span
105
- class={classes.itemIcon + " " + item.icon}
106
- aria-hidden="true"
107
- />
108
- )}
109
- <span data-slot="item-text" class="truncate flex-1">{t(item.label)}</span>
110
- {(() => {
111
- const b = normalizeBadge(item.badge);
112
- return b && (
113
- <RLABadge
114
- variant={b.variant}
115
- color={b.color}
116
- size="xs"
117
- class={"ml-auto select-none " + b.class}
118
- data-slot="item-badge"
119
- >
120
- {t(b.text)}
121
- </RLABadge>
122
- );
123
- })()}
124
- <span class="i-lucide-chevron-right size-3.5 ml-auto transition-transform group-open/details:rotate-90" />
125
- </summary>
126
- <div class="mt-0.5 ml-6 flex flex-col gap-0.5">
127
- {item.children!.map(child => (
128
- <a
129
- href={child.href ?? "#"}
130
- class={classes.itemLink + (child.active ? " text-foreground bg-muted" : "") + " text-xs pl-2"}
131
- >
132
- {child.icon && <span class={classes.itemIcon + " " + child.icon} aria-hidden="true" />}
133
- <span data-slot="item-text" class="truncate flex-1">{t(child.label)}</span>
134
- {(() => {
135
- const b = normalizeBadge(child.badge);
136
- return b && (
137
- <RLABadge
138
- variant={b.variant}
139
- color={b.color}
140
- size="xs"
141
- class={"ml-auto select-none " + b.class}
142
- data-slot="item-badge"
143
- >
144
- {t(b.text)}
145
- </RLABadge>
146
- );
147
- })()}
148
- </a>
149
- ))}
150
- </div>
151
- </details>
152
- ) : (
153
- <a
154
- href={item.href ?? "#"}
155
- class={classes.itemLink + (isActive ? " text-foreground bg-muted" : "")}
156
- aria-current={isActive ? "page" : undefined}
157
- >
158
- {item.icon && (
159
- <span
160
- class={classes.itemIcon + " " + item.icon}
161
- aria-hidden="true"
162
- />
163
- )}
164
- <span data-slot="item-text" class="truncate flex-1">{t(item.label)}</span>
165
- {(() => {
166
- const b = normalizeBadge(item.badge);
167
- return b && (
168
- <RLABadge
169
- variant={b.variant}
170
- color={b.color}
171
- size="xs"
172
- class={"ml-auto select-none " + b.class}
173
- data-slot="item-badge"
174
- >
175
- {t(b.text)}
176
- </RLABadge>
177
- );
178
- })()}
179
- </a>
180
- )}
181
- </div>
182
- )
183
- })}
184
- </slot>
185
- </div>
186
-
187
- {/* Footer */}
188
- <div class={classes.footer} data-slot="footer">
189
- <slot name="footer" />
190
- </div>
191
- </aside>
192
-
193
- {collapsible === "offcanvas" && (
194
- <button
195
- type="button"
196
- data-sidebar-toggle
197
- class="fixed top-4 left-4 z-50 flex size-9 items-center justify-center rounded-md bg-background border border-border shadow-sm hover:bg-muted transition-colors"
198
- aria-label="Toggle sidebar"
199
- >
200
- <span class="i-lucide-panel-left size-4" />
201
- </button>
202
- )}
203
-
204
- <script>
205
- document.querySelectorAll("[data-sidebar-toggle]").forEach(toggle => {
206
- toggle.addEventListener("click", () => {
207
- const sidebar = document.querySelector("[data-sidebar]");
208
- if (!sidebar) return;
209
- sidebar.classList.toggle("-translate-x-full");
210
- });
211
- });
212
- </script>
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { SidebarProps, SidebarItem } from "../../types"
5
+ import sidebarThemeDefault from "../../themes/sidebar.theme"
6
+ import RLABadge from "./RLABadge.astro"
7
+
8
+ const sidebarTheme = sidebarThemeDefault
9
+ const sidebar = scv(sidebarTheme)
10
+
11
+ const {
12
+ items = [],
13
+ side = "left",
14
+ collapsible = "none",
15
+ logo,
16
+ ui: uiProp,
17
+ class: className,
18
+ t = (key: string) => key,
19
+ _depth = 0,
20
+ ...rest
21
+ } = Astro.props as SidebarProps & { t?: (key: string) => string; _depth?: number }
22
+
23
+ const classes = resolveClasses(sidebar, {
24
+ side,
25
+ collapsible
26
+ }, useUi("sidebar", uiProp), className)
27
+
28
+ const hasActiveChild = (item: SidebarItem): boolean => {
29
+ if (item.active) return true
30
+ return (item.children ?? []).some(c => hasActiveChild(c))
31
+ }
32
+
33
+ function normalizeBadge(badge: any) {
34
+ if (!badge) return null
35
+ if (typeof badge === "string") {
36
+ return { text: badge, color: "primary", variant: "soft" as const, class: "" }
37
+ }
38
+ let color = badge.color || "primary"
39
+ let variant = badge.variant || "soft"
40
+ if (badge.variant) {
41
+ const v = badge.variant.toLowerCase()
42
+ if (v === "tip" || v === "success") { color = "success"; variant = "soft" }
43
+ else if (v === "caution" || v === "warning") { color = "warning"; variant = "soft" }
44
+ else if (v === "danger") { color = "danger"; variant = "soft" }
45
+ else if (v === "note" || v === "default") { color = "primary"; variant = "soft" }
46
+ }
47
+ return { text: badge.text || "", color, variant: variant as "solid" | "outline" | "soft", class: badge.class || "" }
48
+ }
49
+
50
+ const isRoot = _depth === 0
51
+ // Indentation per depth level
52
+ const indentClass = _depth === 0 ? "ml-6" : _depth === 1 ? "ml-4" : "ml-3"
53
+ const textSizeClass = _depth === 0 ? "" : "text-xs"
54
+ ---
55
+
56
+ {isRoot ? (
57
+ <>
58
+ <aside class={classes.root} data-slot="root" data-sidebar {...rest}>
59
+ <!-- Header -->
60
+ <div class={classes.header} data-slot="header">
61
+ <slot name="header">
62
+ {logo && (
63
+ <span data-slot="sidebar-logo" class="flex items-center gap-2">
64
+ <span class="i-lucide-layers size-5 text-primary" />
65
+ <span class="truncate">{logo}</span>
66
+ </span>
67
+ )}
68
+ </slot>
69
+ </div>
70
+
71
+ <!-- Body -->
72
+ <div class={classes.content} data-slot="content">
73
+ <slot>
74
+ <Astro.self items={items} t={t} _depth={1} ui={uiProp} />
75
+ </slot>
76
+ </div>
77
+
78
+ <!-- Footer -->
79
+ <div class={classes.footer} data-slot="footer">
80
+ <slot name="footer" />
81
+ </div>
82
+ </aside>
83
+
84
+ {collapsible === "offcanvas" && (
85
+ <button
86
+ type="button"
87
+ data-sidebar-toggle
88
+ class="fixed top-4 left-4 z-50 flex size-9 items-center justify-center rounded-md bg-background border border-border shadow-sm hover:bg-muted transition-colors"
89
+ aria-label="Toggle sidebar"
90
+ >
91
+ <span class="i-lucide-panel-left size-4" />
92
+ </button>
93
+ )}
94
+
95
+ <script>
96
+ document.querySelectorAll("[data-sidebar-toggle]").forEach(toggle => {
97
+ toggle.addEventListener("click", () => {
98
+ const sidebar = document.querySelector("[data-sidebar]");
99
+ if (!sidebar) return;
100
+ sidebar.classList.toggle("-translate-x-full");
101
+ });
102
+ });
103
+ </script>
104
+ </>
105
+ ) : (
106
+ <div class="flex flex-col gap-0.5">
107
+ {items.map((item: SidebarItem) => {
108
+ const hasChildren = item.children && item.children.length > 0
109
+ const isActive = item.active || hasActiveChild(item)
110
+ const b = normalizeBadge(item.badge)
111
+ return (
112
+ <div class={_depth === 1 ? classes.item : ""} data-slot={_depth === 1 ? "item" : undefined}>
113
+ {hasChildren ? (
114
+ <details open={isActive} class="group/details">
115
+ <summary
116
+ class={
117
+ (_depth === 1 ? classes.itemLink : `flex items-center gap-1.5 w-full px-2 py-1 rounded-md text-muted-foreground hover:text-foreground hover:bg-muted transition-colors ${textSizeClass}`) +
118
+ (isActive ? " text-foreground bg-muted" : "") +
119
+ " list-none cursor-pointer"
120
+ }
121
+ data-slot="item-summary"
122
+ >
123
+ {item.icon && <span class={(_depth === 1 ? classes.itemIcon : "size-3.5 shrink-0") + " " + item.icon} aria-hidden="true" />}
124
+ <span data-slot="item-text" class="truncate flex-1">{t(item.label)}</span>
125
+ {b && (
126
+ <RLABadge variant={b.variant} color={b.color} size="xs" class={"ml-auto select-none " + b.class} data-slot="item-badge">
127
+ {t(b.text)}
128
+ </RLABadge>
129
+ )}
130
+ <span class="i-lucide-chevron-right size-3 ml-auto transition-transform group-open/details:rotate-90" />
131
+ </summary>
132
+ <div class={`mt-0.5 ${indentClass} flex flex-col gap-0.5`}>
133
+ <Astro.self items={item.children} t={t} _depth={_depth + 1} />
134
+ </div>
135
+ </details>
136
+ ) : (
137
+ <a
138
+ href={item.href ?? "#"}
139
+ class={
140
+ (_depth === 1 ? classes.itemLink : `flex items-center gap-1.5 w-full px-2 py-1 rounded-md text-muted-foreground hover:text-foreground hover:bg-muted transition-colors ${textSizeClass}`) +
141
+ (isActive ? " text-foreground bg-muted" : "")
142
+ }
143
+ aria-current={isActive ? "page" : undefined}
144
+ >
145
+ {item.icon && <span class={(_depth === 1 ? classes.itemIcon : "size-3.5 shrink-0") + " " + item.icon} aria-hidden="true" />}
146
+ <span data-slot="item-text" class="truncate flex-1">{t(item.label)}</span>
147
+ {b && (
148
+ <RLABadge variant={b.variant} color={b.color} size="xs" class={"ml-auto select-none " + b.class} data-slot="item-badge">
149
+ {t(b.text)}
150
+ </RLABadge>
151
+ )}
152
+ </a>
153
+ )}
154
+ </div>
155
+ )
156
+ })}
157
+ </div>
158
+ )}
@@ -32,12 +32,12 @@ const dialogId = `rla-slideover-${Math.random().toString(36).substring(2, 9)}`
32
32
  class={classes.trigger}
33
33
  data-slot="trigger"
34
34
  type="button"
35
- onclick={`document.getElementById('${dialogId}').showModal()`}
35
+ data-dialog-show={dialogId}
36
36
  >
37
37
  {triggerLabel}
38
38
  </button>
39
39
  ) : (
40
- <span onclick={`document.getElementById('${dialogId}').showModal()`}>
40
+ <span data-dialog-show={dialogId}>
41
41
  <slot name="trigger" />
42
42
  </span>
43
43
  )}
@@ -53,7 +53,7 @@ const dialogId = `rla-slideover-${Math.random().toString(36).substring(2, 9)}`
53
53
  class={classes.closeButton}
54
54
  data-slot="close-button"
55
55
  type="button"
56
- onclick={`document.getElementById('${dialogId}').close()`}
56
+ data-dialog-close={dialogId}
57
57
  aria-label="Close slideover"
58
58
  >
59
59
  <span class="i-lucide-x size-4" aria-hidden="true" />
@@ -122,20 +122,50 @@ const dialogId = `rla-slideover-${Math.random().toString(36).substring(2, 9)}`
122
122
  }
123
123
  </style>
124
124
 
125
- <script is:inline>
126
- document.addEventListener('click', (e) => {
127
- if (e.target && e.target.tagName === 'DIALOG' && e.target.getAttribute('data-close-on-click-outside') === 'true') {
128
- const rect = e.target.getBoundingClientRect();
129
- const isInModal = (
130
- rect.top <= e.clientY &&
131
- e.clientY <= rect.top + rect.height &&
132
- rect.left <= e.clientX &&
133
- e.clientX <= rect.left + rect.width
134
- );
135
- if (!isInModal) {
136
- e.target.close();
125
+ <script>
126
+ if (!(window as any).rlaDialogListenerActive) {
127
+ (window as any).rlaDialogListenerActive = true;
128
+ document.addEventListener('click', (e) => {
129
+ const target = e.target as HTMLElement | null;
130
+ if (!target) return;
131
+
132
+ const showTrigger = target.closest('[data-dialog-show]');
133
+ if (showTrigger) {
134
+ const dialogId = showTrigger.getAttribute('data-dialog-show');
135
+ if (dialogId) {
136
+ const dialog = document.getElementById(dialogId) as HTMLDialogElement | null;
137
+ if (dialog) {
138
+ if (typeof dialog.showModal === 'function') {
139
+ dialog.showModal();
140
+ } else if (typeof (dialog as any).showmodal === 'function') {
141
+ (dialog as any).showmodal();
142
+ }
143
+ }
144
+ }
137
145
  }
138
- }
139
- });
146
+
147
+ const closeTrigger = target.closest('[data-dialog-close]');
148
+ if (closeTrigger) {
149
+ const dialogId = closeTrigger.getAttribute('data-dialog-close');
150
+ if (dialogId) {
151
+ const dialog = document.getElementById(dialogId) as HTMLDialogElement | null;
152
+ dialog?.close();
153
+ }
154
+ }
155
+
156
+ if (target.tagName === 'DIALOG' && target.getAttribute('data-close-on-click-outside') === 'true') {
157
+ const rect = target.getBoundingClientRect();
158
+ const isInModal = (
159
+ rect.top <= e.clientY &&
160
+ e.clientY <= rect.top + rect.height &&
161
+ rect.left <= e.clientX &&
162
+ e.clientX <= rect.left + rect.width
163
+ );
164
+ if (!isInModal) {
165
+ (target as HTMLDialogElement).close();
166
+ }
167
+ }
168
+ });
169
+ }
140
170
  </script>
141
171