@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
@@ -0,0 +1,300 @@
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import colorFieldThemeDefault, { createColorFieldTheme } from "../../themes/color-field.theme"
5
+ import { getUIConfig } from "virtual:rimelight-ui"
6
+
7
+ const uiConfig = getUIConfig()
8
+ const colorFieldTheme = uiConfig.colors ? createColorFieldTheme(uiConfig.colors) : colorFieldThemeDefault
9
+ const colorField = scv(colorFieldTheme)
10
+
11
+ export interface Props {
12
+ channel?: "hue" | "saturation" | "red" | "green" | "blue" | "alpha" | "lightness" | "brightness"
13
+ colorSpace?: "hsl" | "rgb" | "hsb"
14
+ defaultValue?: string
15
+ disabled?: boolean
16
+ disableWheelChange?: boolean
17
+ locale?: string
18
+ modelValue?: string
19
+ name?: string
20
+ placeholder?: string
21
+ readonly?: boolean
22
+ required?: boolean
23
+ step?: number
24
+ color?: any
25
+ theme?: any
26
+ ui?: any
27
+ class?: string
28
+ }
29
+
30
+ const {
31
+ channel,
32
+ colorSpace = "hsl",
33
+ defaultValue = "#000000",
34
+ disabled = false,
35
+ disableWheelChange = false,
36
+ locale,
37
+ modelValue,
38
+ name,
39
+ placeholder,
40
+ readonly = false,
41
+ required,
42
+ step = 1,
43
+ color = "primary",
44
+ theme,
45
+ ui: uiProp,
46
+ class: className,
47
+ ...rest
48
+ } = Astro.props as Props
49
+
50
+ const classes = resolveClasses(colorField, {
51
+ color,
52
+ theme
53
+ }, useUi("colorField", uiProp), className)
54
+
55
+ const initialValue = modelValue || defaultValue
56
+ ---
57
+ <rla-color-field
58
+ data-channel={channel}
59
+ data-color-space={colorSpace}
60
+ data-value={initialValue}
61
+ data-disabled={disabled ? "true" : "false"}
62
+ data-disable-wheel={disableWheelChange ? "true" : "false"}
63
+ data-readonly={readonly ? "true" : "false"}
64
+ data-step={step}
65
+ {...rest}
66
+ >
67
+ <div class={classes.root} data-slot="root">
68
+ <div class="w-5 h-5 rounded border border-border mr-2 shrink-0 shadow-sm" data-slot="swatch"></div>
69
+ <input
70
+ type="text"
71
+ class={classes.input}
72
+ placeholder={placeholder}
73
+ required={required}
74
+ data-slot="input"
75
+ />
76
+ {name && <input type="hidden" name={name} value={initialValue} data-main-input />}
77
+ </div>
78
+ </rla-color-field>
79
+
80
+ <script>
81
+ import {
82
+ hexToRgb,
83
+ rgbToHex,
84
+ rgbToHsl,
85
+ hslToRgb,
86
+ rgbToHsb,
87
+ hsbToRgb,
88
+ getChannelRange,
89
+ clamp
90
+ } from "../../utils/color"
91
+
92
+ if (typeof HTMLElement !== 'undefined') {
93
+ class RLAColorField extends HTMLElement {
94
+ private cleanup: (() => void) | null = null
95
+ private channel: string | null = null
96
+ private colorSpace: string = "hsl"
97
+ private value: string = "#000000"
98
+ private stepValue: number = 1
99
+
100
+ connectedCallback() {
101
+ this.style.display = 'contents'
102
+ this.channel = this.getAttribute("data-channel")
103
+ this.colorSpace = this.getAttribute("data-color-space") || "hsl"
104
+ this.value = this.getAttribute("data-value") || "#000000"
105
+ this.stepValue = parseFloat(this.getAttribute("data-step") || "1")
106
+
107
+ const input = this.querySelector('[data-slot="input"]') as HTMLInputElement
108
+ if (!input) return
109
+
110
+ const getDisplayValue = () => {
111
+ if (!this.channel) {
112
+ return this.value
113
+ }
114
+ const rgb = hexToRgb(this.value)
115
+ if (this.colorSpace === "hsl") {
116
+ const hsl = rgbToHsl(rgb[0], rgb[1], rgb[2])
117
+ const index = ["hue", "saturation", "lightness"].indexOf(this.channel)
118
+ return index !== -1 ? hsl[index]!.toString() : "0"
119
+ } else if (this.colorSpace === "hsb") {
120
+ const hsb = rgbToHsb(rgb[0], rgb[1], rgb[2])
121
+ const index = ["hue", "saturation", "brightness"].indexOf(this.channel)
122
+ return index !== -1 ? hsb[index]!.toString() : "0"
123
+ } else if (this.colorSpace === "rgb") {
124
+ const index = ["red", "green", "blue"].indexOf(this.channel)
125
+ return index !== -1 ? rgb[index]!.toString() : "0"
126
+ }
127
+ return "0"
128
+ }
129
+
130
+ const updateInput = () => {
131
+ input.value = getDisplayValue()
132
+ input.disabled = this.getAttribute("data-disabled") === "true"
133
+ input.readOnly = this.getAttribute("data-readonly") === "true"
134
+
135
+ const mainInput = this.querySelector("[data-main-input]") as HTMLInputElement
136
+ if (mainInput) mainInput.value = this.value
137
+
138
+ const swatch = this.querySelector('[data-slot="swatch"]') as HTMLElement
139
+ if (swatch) {
140
+ swatch.style.backgroundColor = this.value
141
+ }
142
+ }
143
+
144
+ updateInput()
145
+
146
+ const observer = new MutationObserver((mutations) => {
147
+ mutations.forEach((mutation) => {
148
+ if (mutation.type === "attributes" && mutation.attributeName === "data-value") {
149
+ this.value = this.getAttribute("data-value") || "#000000"
150
+ updateInput()
151
+ }
152
+ })
153
+ })
154
+ observer.observe(this, { attributes: true })
155
+
156
+ const updateColorFromChannelValue = (val: number) => {
157
+ if (!this.channel) return
158
+ const range = getChannelRange(this.channel)
159
+ const clampedVal = clamp(val, range.min, range.max)
160
+
161
+ const rgb = hexToRgb(this.value)
162
+ let hsl = rgbToHsl(rgb[0], rgb[1], rgb[2]) as number[]
163
+ let hsb = rgbToHsb(rgb[0], rgb[1], rgb[2]) as number[]
164
+ let newRgb = [...rgb] as number[]
165
+
166
+ if (this.colorSpace === "hsl") {
167
+ const index = ["hue", "saturation", "lightness"].indexOf(this.channel)
168
+ if (index !== -1) hsl[index] = clampedVal
169
+ newRgb = hslToRgb(hsl[0]!, hsl[1]!, hsl[2]!)
170
+ } else if (this.colorSpace === "hsb") {
171
+ const index = ["hue", "saturation", "brightness"].indexOf(this.channel)
172
+ if (index !== -1) hsb[index] = clampedVal
173
+ newRgb = hsbToRgb(hsb[0]!, hsb[1]!, hsb[2]!)
174
+ } else if (this.colorSpace === "rgb") {
175
+ const index = ["red", "green", "blue"].indexOf(this.channel)
176
+ if (index !== -1) newRgb[index] = clampedVal
177
+ }
178
+
179
+ const newHex = rgbToHex(newRgb[0]!, newRgb[1]!, newRgb[2]!)
180
+ if (newHex !== this.value) {
181
+ this.value = newHex
182
+ this.setAttribute("data-value", newHex)
183
+ updateInput()
184
+ this.dispatchEvent(new CustomEvent("change", { detail: newHex }))
185
+ this.dispatchEvent(new CustomEvent("update:modelValue", { detail: newHex }))
186
+
187
+ const rootId = this.getAttribute("id")
188
+ if (rootId) {
189
+ document.querySelectorAll(`[data-color-link="${rootId}"]`).forEach((el) => {
190
+ el.setAttribute("data-value", newHex)
191
+ })
192
+ }
193
+ }
194
+ }
195
+
196
+ const handleInput = () => {
197
+ if (this.getAttribute("data-disabled") === "true" || this.getAttribute("data-readonly") === "true") return
198
+ const raw = input.value.trim()
199
+ if (!this.channel) {
200
+ if (/^#[0-9A-F]{6}$/i.test(raw)) {
201
+ this.value = raw
202
+ this.setAttribute("data-value", raw)
203
+ updateInput()
204
+ this.dispatchEvent(new CustomEvent("change", { detail: raw }))
205
+ this.dispatchEvent(new CustomEvent("update:modelValue", { detail: raw }))
206
+
207
+ const rootId = this.getAttribute("id")
208
+ if (rootId) {
209
+ document.querySelectorAll(`[data-color-link="${rootId}"]`).forEach((el) => {
210
+ el.setAttribute("data-value", raw)
211
+ })
212
+ }
213
+ }
214
+ } else {
215
+ const num = parseFloat(raw)
216
+ if (!isNaN(num)) {
217
+ updateColorFromChannelValue(num)
218
+ }
219
+ }
220
+ }
221
+
222
+ const onKeyDown = (e: KeyboardEvent) => {
223
+ if (this.getAttribute("data-disabled") === "true" || this.getAttribute("data-readonly") === "true") return
224
+ const isShift = e.shiftKey
225
+ const stepSize = (isShift ? 10 : 1) * this.stepValue
226
+
227
+ if (this.channel) {
228
+ const currentVal = parseFloat(getDisplayValue())
229
+ let handled = false
230
+ let newVal = currentVal
231
+
232
+ if (e.key === "ArrowUp") {
233
+ newVal = currentVal + stepSize
234
+ handled = true
235
+ } else if (e.key === "ArrowDown") {
236
+ newVal = currentVal - stepSize
237
+ handled = true
238
+ } else if (e.key === "PageUp") {
239
+ newVal = currentVal + stepSize * 10
240
+ handled = true
241
+ } else if (e.key === "PageDown") {
242
+ newVal = currentVal - stepSize * 10
243
+ handled = true
244
+ } else if (e.key === "Home") {
245
+ newVal = getChannelRange(this.channel).min
246
+ handled = true
247
+ } else if (e.key === "End") {
248
+ newVal = getChannelRange(this.channel).max
249
+ handled = true
250
+ }
251
+
252
+ if (handled) {
253
+ e.preventDefault()
254
+ updateColorFromChannelValue(newVal)
255
+ }
256
+ }
257
+
258
+ if (e.key === "Enter") {
259
+ e.preventDefault()
260
+ handleInput()
261
+ }
262
+ }
263
+
264
+ const onWheel = (e: WheelEvent) => {
265
+ if (this.getAttribute("data-disable-wheel") === "true") return
266
+ if (this.getAttribute("data-disabled") === "true" || this.getAttribute("data-readonly") === "true") return
267
+ if (!this.channel) return
268
+ e.preventDefault()
269
+
270
+ const direction = e.deltaY < 0 ? 1 : -1
271
+ const stepSize = this.stepValue * direction
272
+ const currentVal = parseFloat(getDisplayValue())
273
+ updateColorFromChannelValue(currentVal + stepSize)
274
+ }
275
+
276
+ input.addEventListener("input", handleInput)
277
+ input.addEventListener("keydown", onKeyDown)
278
+ input.addEventListener("wheel", onWheel, { passive: false })
279
+
280
+ this.cleanup = () => {
281
+ input.removeEventListener("input", handleInput)
282
+ input.removeEventListener("keydown", onKeyDown)
283
+ input.removeEventListener("wheel", onWheel)
284
+ observer.disconnect()
285
+ }
286
+ }
287
+
288
+ disconnectedCallback() {
289
+ if (this.cleanup) {
290
+ this.cleanup()
291
+ this.cleanup = null
292
+ }
293
+ }
294
+ }
295
+
296
+ if (!customElements.get("rla-color-field")) {
297
+ customElements.define("rla-color-field", RLAColorField)
298
+ }
299
+ }
300
+ </script>