@rimelight/ui 0.0.34 → 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 (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 +29 -35
  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
@@ -4,7 +4,10 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { DropdownMenuProps } from "../../types"
5
5
  import dropdownMenuThemeDefault, { createDropdownMenuTheme } from "../../themes/dropdown-menu.theme"
6
6
 
7
- const dropdownMenuTheme = dropdownMenuThemeDefault
7
+ import { getUIConfig } from "virtual:rimelight-ui"
8
+
9
+ const uiConfig = getUIConfig()
10
+ const dropdownMenuTheme = uiConfig.colors ? createDropdownMenuTheme() : dropdownMenuThemeDefault
8
11
  const dropdownMenu = scv(dropdownMenuTheme)
9
12
 
10
13
  const {
@@ -22,61 +25,85 @@ const classes = resolveClasses(dropdownMenu, {
22
25
  size
23
26
  }, useUi("dropdownMenu", uiProp), className);
24
27
  ---
25
- <div class={classes.root} data-slot="root" data-dropdown-menu>
26
- <button
27
- type="button"
28
- class={classes.trigger}
29
- data-slot="trigger"
30
- data-dropdown-trigger
31
- {...rest}
32
- >
33
- <slot name="trigger">
34
- {icon && <span class={icon} />}
35
- {label}
36
- <span class="ml-2 i-lucide-chevron-down opacity-50" />
37
- </slot>
38
- </button>
28
+ <rla-dropdown-menu {...rest}>
29
+ <div class={classes.root} data-slot="root" data-dropdown-menu>
30
+ <button
31
+ type="button"
32
+ class={classes.trigger}
33
+ data-slot="trigger"
34
+ data-dropdown-trigger
35
+ >
36
+ <slot name="trigger">
37
+ {icon && <span class={icon} />}
38
+ {label}
39
+ <span class="ml-2 i-lucide-chevron-down opacity-50" />
40
+ </slot>
41
+ </button>
39
42
 
40
- <div class={classes.content + " hidden"} data-slot="content" data-dropdown-content>
41
- <slot>
42
- {items.map(item => {
43
- if (item.type === "separator") {
44
- return <div class={classes.separator} />
45
- }
46
- if (item.type === "label") {
47
- return <div class={classes.label}>{item.label}</div>
48
- }
49
- return (
50
- <button
51
- type="button"
52
- class={classes.item}
53
- data-slot="item"
54
- disabled={item.disabled}
55
- >
56
- {item.icon && <span class={item.icon + " mr-2 size-4 text-muted-foreground"} />}
57
- <span>{item.label}</span>
58
- {item.shortcut && <span class={classes.shortcut}>{item.shortcut}</span>}
59
- </button>
60
- )
61
- })}
62
- </slot>
43
+ <div class={classes.content + " hidden"} data-slot="content" data-dropdown-content>
44
+ <slot>
45
+ {items.map(item => {
46
+ if (item.type === "separator") {
47
+ return <div class={classes.separator} />
48
+ }
49
+ if (item.type === "label") {
50
+ return <div class={classes.label}>{item.label}</div>
51
+ }
52
+ return (
53
+ <button
54
+ type="button"
55
+ class={classes.item}
56
+ data-slot="item"
57
+ disabled={item.disabled}
58
+ >
59
+ {item.icon && <span class={item.icon + " mr-2 size-4 text-muted-foreground"} />}
60
+ <span>{item.label}</span>
61
+ {item.shortcut && <span class={classes.shortcut}>{item.shortcut}</span>}
62
+ </button>
63
+ )
64
+ })}
65
+ </slot>
66
+ </div>
63
67
  </div>
64
- </div>
68
+ </rla-dropdown-menu>
65
69
 
66
70
  <script>
67
- document.querySelectorAll("[data-dropdown-menu]").forEach(menu => {
68
- const trigger = menu.querySelector("[data-dropdown-trigger]");
69
- const content = menu.querySelector("[data-dropdown-content]");
71
+ class RLADropdownMenu extends HTMLElement {
72
+ private dropdownCleanup: (() => void) | null = null;
73
+
74
+ connectedCallback() {
75
+ this.style.display = 'contents';
76
+ const trigger = this.querySelector("[data-dropdown-trigger]") as HTMLElement | null;
77
+ const content = this.querySelector("[data-dropdown-content]") as HTMLElement | null;
78
+
79
+ if (!trigger || !content) return;
80
+
81
+ const onTriggerClick = (e: MouseEvent) => {
82
+ e.stopPropagation();
83
+ content.classList.toggle("hidden");
84
+ };
85
+ trigger.addEventListener("click", onTriggerClick);
86
+
87
+ const onDocumentClick = () => {
88
+ content.classList.add("hidden");
89
+ };
90
+ document.addEventListener("click", onDocumentClick);
70
91
 
71
- if (!trigger || !content) return;
92
+ this.dropdownCleanup = () => {
93
+ trigger.removeEventListener("click", onTriggerClick);
94
+ document.removeEventListener("click", onDocumentClick);
95
+ };
96
+ }
72
97
 
73
- trigger.addEventListener("click", (e) => {
74
- e.stopPropagation();
75
- content.classList.toggle("hidden");
76
- });
98
+ disconnectedCallback() {
99
+ if (this.dropdownCleanup) {
100
+ this.dropdownCleanup();
101
+ this.dropdownCleanup = null;
102
+ }
103
+ }
104
+ }
77
105
 
78
- document.addEventListener("click", () => {
79
- content.classList.add("hidden");
80
- });
81
- });
106
+ if (!customElements.get('rla-dropdown-menu')) {
107
+ customElements.define('rla-dropdown-menu', RLADropdownMenu);
108
+ }
82
109
  </script>
@@ -4,7 +4,10 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { FieldGroupProps } from "../../types"
5
5
  import fieldGroupThemeDefault, { createFieldGroupTheme } from "../../themes/field-group.theme"
6
6
 
7
- const fieldGroupTheme = fieldGroupThemeDefault
7
+ import { getUIConfig } from "virtual:rimelight-ui"
8
+
9
+ const uiConfig = getUIConfig()
10
+ const fieldGroupTheme = uiConfig.colors ? createFieldGroupTheme() : fieldGroupThemeDefault
8
11
  const fieldGroup = scv(fieldGroupTheme)
9
12
 
10
13
  const {
@@ -4,7 +4,10 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { FileUploadProps } from "../../types"
5
5
  import fileUploadThemeDefault, { createFileUploadTheme } from "../../themes/file-upload.theme"
6
6
 
7
- const fileUploadTheme = fileUploadThemeDefault
7
+ import { getUIConfig } from "virtual:rimelight-ui"
8
+
9
+ const uiConfig = getUIConfig()
10
+ const fileUploadTheme = uiConfig.colors ? createFileUploadTheme() : fileUploadThemeDefault
8
11
  const fileUpload = scv(fileUploadTheme)
9
12
 
10
13
  const {
@@ -27,108 +30,119 @@ const classes = resolveClasses(fileUpload, {
27
30
  const inputId = `fileUpload-${Math.random().toString(36).slice(2, 9)}`
28
31
  ---
29
32
 
30
- <div
31
- class={classes.root}
32
- data-slot="root"
33
- data-fileUpload
34
- data-disabled={disabled ? "true" : undefined}
35
- role="button"
36
- tabindex={disabled ? -1 : 0}
37
- aria-label={title}
38
- {...rest}
39
- >
40
- <input
41
- id={inputId}
42
- type="file"
43
- class={classes.input}
44
- accept={accept}
45
- multiple={multiple}
46
- disabled={disabled}
47
- data-fileUpload-input
48
- aria-hidden="true"
49
- tabindex="-1"
50
- />
51
-
52
- <div class={classes.content} data-slot="content">
53
- <slot name="icon">
54
- <span class={classes.icon + " " + icon} aria-hidden="true" />
55
- </slot>
56
-
57
- <slot>
58
- <p class={classes.title} data-slot="title">{title}</p>
59
- {description && (
60
- <p class={classes.description} data-slot="description">{description}</p>
61
- )}
62
- {accept && (
63
- <p class="mt-1 text-[10px] text-muted-foreground/70">
64
- Accepted: <span class="font-mono">{accept}</span>
65
- </p>
66
- )}
67
- </slot>
68
-
69
- <div
70
- class="mt-3 hidden text-xs text-muted-foreground"
71
- data-fileUpload-filelist
72
- aria-live="polite"
33
+ <rla-file-upload {...rest}>
34
+ <div
35
+ class={classes.root}
36
+ data-slot="root"
37
+ data-fileUpload
38
+ data-disabled={disabled ? "true" : undefined}
39
+ role="button"
40
+ tabindex={disabled ? -1 : 0}
41
+ aria-label={title}
42
+ >
43
+ <input
44
+ id={inputId}
45
+ type="file"
46
+ class={classes.input}
47
+ accept={accept}
48
+ multiple={multiple}
49
+ disabled={disabled}
50
+ data-fileUpload-input
51
+ aria-hidden="true"
52
+ tabindex="-1"
73
53
  />
54
+
55
+ <div class={classes.content} data-slot="content">
56
+ <slot name="icon">
57
+ <span class={classes.icon + " " + icon} aria-hidden="true" />
58
+ </slot>
59
+
60
+ <slot>
61
+ <p class={classes.title} data-slot="title">{title}</p>
62
+ {description && (
63
+ <p class={classes.description} data-slot="description">{description}</p>
64
+ )}
65
+ {accept && (
66
+ <p class="mt-1 text-[10px] text-muted-foreground/70">
67
+ Accepted: <span class="font-mono">{accept}</span>
68
+ </p>
69
+ )}
70
+ </slot>
71
+
72
+ <div
73
+ class="mt-3 hidden text-xs text-muted-foreground"
74
+ data-fileUpload-filelist
75
+ aria-live="polite"
76
+ />
77
+ </div>
74
78
  </div>
75
- </div>
79
+ </rla-file-upload>
76
80
 
77
81
  <script>
78
- document.querySelectorAll("[data-fileUpload]").forEach(zone => {
79
- const input = zone.querySelector("[data-fileUpload-input]") as HTMLInputElement | null;
80
- const fileList = zone.querySelector("[data-fileUpload-filelist]") as HTMLElement | null;
81
- if (!input) return;
82
-
83
- const isDisabled = zone.dataset.disabled === "true";
84
- if (isDisabled) return;
85
-
86
- const showFiles = (files: FileList | null) => {
87
- if (!fileList || !files || files.length === 0) return;
88
- fileList.classList.remove("hidden");
89
- fileList.textContent =
90
- files.length === 1
91
- ? files[0]!.name
92
- : `${files.length} files selected`;
93
- };
94
-
95
- // Click anywhere on the zone to open file picker
96
- zone.addEventListener("click", () => input.click());
97
- zone.addEventListener("keydown", (e) => {
98
- if ((e as KeyboardEvent).key === "Enter" || (e as KeyboardEvent).key === " ") {
82
+ class RLAFileUpload extends HTMLElement {
83
+ connectedCallback() {
84
+ this.style.display = 'contents';
85
+ const zone = this.querySelector("[data-fileUpload]") as HTMLElement | null;
86
+ if (!zone) return;
87
+
88
+ const input = zone.querySelector("[data-fileUpload-input]") as HTMLInputElement | null;
89
+ const fileList = zone.querySelector("[data-fileUpload-filelist]") as HTMLElement | null;
90
+ if (!input) return;
91
+
92
+ const isDisabled = zone.dataset.disabled === "true";
93
+ if (isDisabled) return;
94
+
95
+ const showFiles = (files: FileList | null) => {
96
+ if (!fileList || !files || files.length === 0) return;
97
+ fileList.classList.remove("hidden");
98
+ fileList.textContent =
99
+ files.length === 1
100
+ ? files[0]!.name
101
+ : `${files.length} files selected`;
102
+ };
103
+
104
+ // Click anywhere on the zone to open file picker
105
+ zone.addEventListener("click", () => input.click());
106
+ zone.addEventListener("keydown", (e) => {
107
+ if (e.key === "Enter" || e.key === " ") {
108
+ e.preventDefault();
109
+ input.click();
110
+ }
111
+ });
112
+
113
+ input.addEventListener("change", () => showFiles(input.files));
114
+
115
+ // Drag and drop
116
+ zone.addEventListener("dragover", (e) => {
117
+ e.preventDefault();
118
+ zone.classList.add("border-primary", "bg-primary/5");
119
+ });
120
+
121
+ zone.addEventListener("dragleave", () => {
122
+ zone.classList.remove("border-primary", "bg-primary/5");
123
+ });
124
+
125
+ zone.addEventListener("drop", (e) => {
99
126
  e.preventDefault();
100
- input.click();
101
- }
102
- });
103
-
104
- input.addEventListener("change", () => showFiles(input.files));
105
-
106
- // Drag and drop
107
- zone.addEventListener("dragover", (e) => {
108
- e.preventDefault();
109
- zone.classList.add("border-primary", "bg-primary/5");
110
- });
111
-
112
- zone.addEventListener("dragleave", () => {
113
- zone.classList.remove("border-primary", "bg-primary/5");
114
- });
115
-
116
- zone.addEventListener("drop", (e) => {
117
- e.preventDefault();
118
- zone.classList.remove("border-primary", "bg-primary/5");
119
- const dt = (e as DragEvent).dataTransfer;
120
- if (!dt) return;
121
-
122
- // Transfer dropped files to the hidden input via DataTransfer trick
123
- try {
124
- const transfer = new DataTransfer();
125
- Array.from(dt.files).forEach(f => transfer.items.add(f));
126
- input.files = transfer.files;
127
- } catch {
128
- // Some browsers don't support assigning to input.files — graceful fallback
129
- }
130
-
131
- showFiles(dt.files);
132
- });
133
- });
127
+ zone.classList.remove("border-primary", "bg-primary/5");
128
+ const dt = e.dataTransfer;
129
+ if (!dt) return;
130
+
131
+ // Transfer dropped files to the hidden input via DataTransfer trick
132
+ try {
133
+ const transfer = new DataTransfer();
134
+ Array.from(dt.files).forEach(f => transfer.items.add(f));
135
+ input.files = transfer.files;
136
+ } catch {
137
+ // Some browsers don't support assigning to input.files — graceful fallback
138
+ }
139
+
140
+ showFiles(dt.files);
141
+ });
142
+ }
143
+ }
144
+
145
+ if (!customElements.get('rla-file-upload')) {
146
+ customElements.define('rla-file-upload', RLAFileUpload);
147
+ }
134
148
  </script>
@@ -23,9 +23,10 @@ const classes = resolveClasses(footer, { contain }, useUi("footer", uiProp), cla
23
23
  <footer
24
24
  class:list={[classes.root]}
25
25
  data-slot="root"
26
+ data-contain={contain ? "true" : "false"}
26
27
  {...rest}
27
28
  >
28
- <div class:list={[classes.container]}>
29
+ <div class:list={[classes.container]} data-slot="container">
29
30
  <div class:list={[classes.left]} data-slot="left">
30
31
  <slot name="left" />
31
32
  </div>
@@ -4,10 +4,14 @@ import { useUi, resolveClasses } from "../../utils"
4
4
  import type { FormFieldProps } from "../../types"
5
5
  import formFieldThemeDefault, { createFormFieldTheme } from "../../themes/form-field.theme"
6
6
 
7
- const formFieldTheme = formFieldThemeDefault
7
+ import { getUIConfig } from "virtual:rimelight-ui"
8
+
9
+ const uiConfig = getUIConfig()
10
+ const formFieldTheme = uiConfig.colors ? createFormFieldTheme() : formFieldThemeDefault
8
11
  const formField = scv(formFieldTheme)
9
12
 
10
13
  const {
14
+ id = `field-${Math.random().toString(36).substring(2, 9)}`,
11
15
  label,
12
16
  description,
13
17
  error,
@@ -16,7 +20,7 @@ const {
16
20
  ui: uiProp,
17
21
  class: className,
18
22
  ...rest
19
- } = Astro.props as FormFieldProps
23
+ } = Astro.props as FormFieldProps & { id?: string }
20
24
 
21
25
  const classes = resolveClasses(formField, {
22
26
  size
@@ -24,19 +28,19 @@ const classes = resolveClasses(formField, {
24
28
  ---
25
29
  <div class={classes.root} data-slot="root" {...rest}>
26
30
  {label && (
27
- <label class={classes.label} data-slot="label">
31
+ <label for={id} class={classes.label} data-slot="label">
28
32
  {label}
29
- {required && <span class="text-error-500 ml-0.5">*</span>}
33
+ {required && <span class="text-error-500 ml-0.5" aria-hidden="true">*</span>}
30
34
  </label>
31
35
  )}
32
36
  <slot />
33
37
  {description && (
34
- <p class={classes.description} data-slot="description">
38
+ <p id={`${id}-description`} class={classes.description} data-slot="description">
35
39
  {description}
36
40
  </p>
37
41
  )}
38
42
  {error && (
39
- <p class={classes.error} data-slot="error">
43
+ <p id={`${id}-error`} class={classes.error} data-slot="error" aria-live="assertive">
40
44
  {error}
41
45
  </p>
42
46
  )}
@@ -1,39 +1,31 @@
1
- ---
2
- interface Props {
3
- stagger?: boolean
4
- class?: string
5
- }
6
-
7
- const { stagger = false, class: className = "", ...rest } = Astro.props
8
- ---
9
-
10
- <div class:list={["rl-grid", { stagger }, className]} {...rest}>
11
- <slot />
12
- </div>
13
-
14
- <style>
15
- .rl-grid {
16
- display: grid;
17
- grid-template-columns: 100%;
18
- gap: 1rem;
19
- }
20
-
21
- .rl-grid > :global(*) {
22
- margin-top: 0 !important;
23
- }
24
-
25
- @media (min-width: 50rem) {
26
- .rl-grid {
27
- grid-template-columns: 1fr 1fr;
28
- gap: 1.5rem;
29
- }
30
- .stagger {
31
- --stagger-height: 5rem;
32
- padding-bottom: var(--stagger-height);
33
- }
34
-
35
- .stagger > :global(*):nth-child(2n) {
36
- transform: translateY(var(--stagger-height));
37
- }
38
- }
39
- </style>
1
+ ---
2
+ import { scv } from "css-variants"
3
+ import { useUi, resolveClasses } from "../../utils"
4
+ import type { GridProps } from "../../types"
5
+ import gridThemeDefault, { createGridTheme } from "../../themes/grid.theme"
6
+ import { getUIConfig } from "virtual:rimelight-ui"
7
+
8
+ const uiConfig = getUIConfig()
9
+ const gridTheme = uiConfig.colors ? createGridTheme() : gridThemeDefault
10
+
11
+ const grid = scv(gridTheme)
12
+
13
+ const {
14
+ cols = 2,
15
+ gap = "md",
16
+ stagger = false,
17
+ ui: uiProp,
18
+ class: className,
19
+ ...rest
20
+ } = Astro.props as GridProps
21
+
22
+ const classes = resolveClasses(grid, {
23
+ cols: cols as any,
24
+ gap,
25
+ stagger
26
+ }, useUi("grid", uiProp), className)
27
+ ---
28
+
29
+ <div class={classes.root} {...rest}>
30
+ <slot />
31
+ </div>