@rimelight/ui 0.0.43 → 0.0.45

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 (154) hide show
  1. package/README.md +14 -12
  2. package/package.json +8 -10
  3. package/src/components/avatar/RLAAvatar.astro +4 -12
  4. package/src/components/badge/RLABadge.astro +2 -1
  5. package/src/components/badge/badge.theme.ts +0 -4
  6. package/src/components/banner/RLABanner.astro +1 -1
  7. package/src/components/banner/banner.theme.ts +1 -1
  8. package/src/components/breadcrumb/RLABreadcrumb.astro +2 -2
  9. package/src/components/button/RLAButton.astro +4 -1
  10. package/src/components/button/RLSButton.tsx +1 -1
  11. package/src/components/button/button.theme.ts +1 -5
  12. package/src/components/callout/RLACallout.astro +7 -5
  13. package/src/components/callout/callout.theme.ts +1 -5
  14. package/src/components/card/card.theme.ts +3 -3
  15. package/src/components/carousel/RLACarousel.astro +2 -2
  16. package/src/components/carousel/carousel.theme.ts +2 -2
  17. package/src/components/chart/RLAChart.astro +1 -1
  18. package/src/components/checkbox/RLACheckbox.astro +2 -1
  19. package/src/components/checkbox/checkbox.theme.ts +0 -4
  20. package/src/components/chip/RLAChip.astro +2 -1
  21. package/src/components/chip/chip.theme.ts +0 -4
  22. package/src/components/collapsible/RLACollapsible.astro +1 -1
  23. package/src/components/color-area/RLAColorArea.astro +1 -0
  24. package/src/components/color-area/color-area.theme.ts +1 -5
  25. package/src/components/color-field/RLAColorField.astro +1 -0
  26. package/src/components/color-field/color-field.theme.ts +1 -5
  27. package/src/components/color-slider/RLAColorSlider.astro +1 -0
  28. package/src/components/color-slider/color-slider.theme.ts +1 -5
  29. package/src/components/dashboard-group/RLADashboardGroup.astro +5 -7
  30. package/src/components/dashboard-group/dashboard-group.theme.ts +1 -1
  31. package/src/components/dashboard-group/dashboard-group.ts +1 -1
  32. package/src/components/dashboard-navbar/RLADashboardNavbar.astro +4 -4
  33. package/src/components/dashboard-navbar/dashboard-navbar.theme.ts +3 -3
  34. package/src/components/dashboard-navbar/dashboard-navbar.ts +1 -1
  35. package/src/components/dashboard-panel/RLADashboardPanel.astro +9 -8
  36. package/src/components/dashboard-panel/dashboard-panel.theme.ts +1 -1
  37. package/src/components/dashboard-sidebar/RLADashboardSidebar.astro +52 -20
  38. package/src/components/dashboard-sidebar/dashboard-sidebar.theme.ts +6 -5
  39. package/src/components/dashboard-sidebar-collapse/RLADashboardSidebarCollapse.astro +1 -0
  40. package/src/components/drawer/RLADrawer.astro +1 -1
  41. package/src/components/dropdown-menu/dropdown-menu.theme.ts +2 -2
  42. package/src/components/footer/RLAFooter.astro +2 -0
  43. package/src/components/footer/footer.theme.ts +0 -8
  44. package/src/components/gamepad/RLAGamepad.astro +1 -1
  45. package/src/components/head/UIHead.astro +1 -2
  46. package/src/components/header/header.theme.ts +1 -1
  47. package/src/components/icon/RLAIcon.astro +2 -5
  48. package/src/components/icon/RLSIcon.tsx +2 -2
  49. package/src/components/icon/RLVIcon.vue +18 -6
  50. package/src/components/icon/icon.theme.ts +1 -1
  51. package/src/components/image/image.theme.ts +1 -1
  52. package/src/components/input/RLAInput.astro +2 -1
  53. package/src/components/input/input.theme.ts +0 -4
  54. package/src/components/input-menu/RLAInputMenu.astro +2 -2
  55. package/src/components/input-menu/input-menu.theme.ts +1 -1
  56. package/src/components/input-rating/input-rating.theme.ts +2 -2
  57. package/src/components/kbd/RLAKbd.astro +2 -1
  58. package/src/components/kbd/kbd.theme.ts +0 -4
  59. package/src/components/keyboard/RLAKeyboard.astro +1 -1
  60. package/src/components/link/RLALink.astro +1 -0
  61. package/src/components/link/link.theme.ts +0 -4
  62. package/src/components/link-group/RLALinkGroup.astro +1 -1
  63. package/src/components/link-group/link-group.theme.ts +1 -10
  64. package/src/components/locale-selector/RLALocaleSelector.astro +4 -36
  65. package/src/components/locale-selector/locale-selector.theme.ts +3 -11
  66. package/src/components/logo/RLALogo.astro +1 -2
  67. package/src/components/modal/RLAModal.astro +8 -5
  68. package/src/components/modal/RLSModal.tsx +17 -12
  69. package/src/components/modal/modal.theme.ts +5 -4
  70. package/src/components/navigation-menu/RLANavigationMenu.astro +17 -21
  71. package/src/components/navigation-menu/navigation-menu.theme.ts +3 -7
  72. package/src/components/pagination/RLAPagination.astro +2 -2
  73. package/src/components/pagination/pagination.theme.ts +1 -1
  74. package/src/components/popover/RLAPopover.astro +39 -0
  75. package/src/components/progress/RLAProgress.astro +2 -0
  76. package/src/components/progress/progress.theme.ts +0 -4
  77. package/src/components/scroll-area/scroll-area.theme.ts +1 -1
  78. package/src/components/scroll-to-top/RLAScrollToTop.astro +6 -5
  79. package/src/components/scroll-to-top/RLVScrollToTop.vue +7 -7
  80. package/src/components/scroll-to-top/scroll-to-top.theme.ts +3 -7
  81. package/src/components/search/RLASearch.astro +3 -3
  82. package/src/components/select/RLASelect.astro +96 -528
  83. package/src/components/select/RLSSelect.tsx +68 -14
  84. package/src/components/select/RLVSelect.vue +57 -0
  85. package/src/components/select/select.theme.ts +11 -96
  86. package/src/components/shortcuts/RLAShortcuts.astro +9 -9
  87. package/src/components/sidebar/RLASidebar.astro +3 -3
  88. package/src/components/slideover/RLASlideover.astro +1 -1
  89. package/src/components/slider/RLASlider.astro +2 -1
  90. package/src/components/slider/slider.theme.ts +1 -5
  91. package/src/components/spinner/RLASpinner.astro +2 -1
  92. package/src/components/spinner/spinner.theme.ts +1 -5
  93. package/src/components/splitter/splitter.theme.ts +1 -1
  94. package/src/components/stepper/RLAStepper.astro +8 -8
  95. package/src/components/stepper/stepper.theme.ts +6 -7
  96. package/src/components/steps/RLASteps.astro +3 -3
  97. package/src/components/switch/RLASwitch.astro +2 -1
  98. package/src/components/switch/switch.theme.ts +0 -4
  99. package/src/components/table/table.theme.ts +1 -1
  100. package/src/components/table-of-contents/RLATableOfContents.astro +5 -5
  101. package/src/components/theme-selector/RLAThemeSelector.astro +16 -14
  102. package/src/components/theme-selector/theme-selector.theme.ts +2 -2
  103. package/src/components/toast/RLAToast.astro +6 -6
  104. package/src/components/toast/store.ts +1 -1
  105. package/src/components/tooltip/tooltip.theme.ts +1 -1
  106. package/src/icons.raw.ts +67 -0
  107. package/src/icons.ts +31 -64
  108. package/src/index.ts +19 -18
  109. package/src/preset.ts +110 -108
  110. package/src/resolver.ts +127 -15
  111. package/src/shortcuts.ts +103 -84
  112. package/src/stores.ts +22 -0
  113. package/src/types.ts +27 -9
  114. package/src/virtual.d.ts +4 -0
  115. package/src/components/editor/PageEditor.vue +0 -459
  116. package/src/components/editor/PageMention.vue +0 -87
  117. package/src/components/editor/PagePropertiesEditor.vue +0 -358
  118. package/src/components/editor/PagePropertiesRenderer.vue +0 -285
  119. package/src/components/editor/PageRenderer.vue +0 -155
  120. package/src/components/editor/PageSurround.vue +0 -130
  121. package/src/components/editor/PageVersionSelector.vue +0 -371
  122. package/src/components/editor/blocks/AddBlockModal.vue +0 -196
  123. package/src/components/editor/blocks/Block.vue +0 -142
  124. package/src/components/editor/blocks/BlockEditRenderer.vue +0 -26
  125. package/src/components/editor/blocks/BlockEditor.vue +0 -141
  126. package/src/components/editor/blocks/BlockViewRenderer.vue +0 -71
  127. package/src/components/editor/blocks/TextRenderer.vue +0 -31
  128. package/src/components/editor/blocks/editor/CalloutBlockEditor.vue +0 -53
  129. package/src/components/editor/blocks/editor/ImageBlockEditor.vue +0 -55
  130. package/src/components/editor/blocks/editor/ParagraphBlockEditor.vue +0 -31
  131. package/src/components/editor/blocks/editor/SectionBlockEditor.vue +0 -65
  132. package/src/components/editor/blocks/nodes/LinkNode.vue +0 -28
  133. package/src/components/editor/blocks/nodes/TextNode.vue +0 -22
  134. package/src/components/editor/blocks/renderer/CalloutBlockRenderer.vue +0 -65
  135. package/src/components/editor/blocks/renderer/ImageBlockRenderer.vue +0 -20
  136. package/src/components/editor/blocks/renderer/ParagraphBlockRenderer.vue +0 -21
  137. package/src/components/editor/blocks/renderer/SectionBlockRenderer.vue +0 -55
  138. package/src/components/editor/composables/injectionKeys.ts +0 -3
  139. package/src/components/editor/composables/useBlockEditor.ts +0 -261
  140. package/src/components/editor/composables/usePageEditor.ts +0 -97
  141. package/src/components/editor/modals/CreatePageModal.vue +0 -160
  142. package/src/components/editor/modals/DeletePageModal.vue +0 -116
  143. package/src/components/editor/modals/PageTreeModal.vue +0 -275
  144. package/src/components/editor/types/blocks.ts +0 -100
  145. package/src/components/editor/types/pages.ts +0 -89
  146. package/src/components/editor/types/schemas.ts +0 -36
  147. package/src/components/editor/utils/blocks.ts +0 -42
  148. package/src/components/editor/utils/editorHelpers.ts +0 -24
  149. package/src/components/editor/utils/page.ts +0 -219
  150. package/src/components/editor/utils/richTextHelpers.ts +0 -35
  151. package/src/components/editor/views/PageEditView.vue +0 -195
  152. package/src/components/editor/views/PageLiveView.vue +0 -90
  153. package/src/components/editor/views/PageReviewView.vue +0 -308
  154. package/src/components/icon/resolver.ts +0 -23
@@ -7,6 +7,7 @@ const {
7
7
  side = "left",
8
8
  collapsible = false,
9
9
  collapsed = false,
10
+ class: className,
10
11
  ...rest
11
12
  } = Astro.props as DashboardSidebarProps
12
13
 
@@ -14,9 +15,6 @@ const classes = dashboardSidebarTheme({
14
15
  ...Astro.props,
15
16
  collapsed: collapsible && collapsed
16
17
  });
17
-
18
- const collapsedWidth = "4rem";
19
- const defaultWidth = "16rem";
20
18
  ---
21
19
 
22
20
  <div
@@ -25,9 +23,8 @@ const defaultWidth = "16rem";
25
23
  data-collapsible={collapsible ? "true" : "false"}
26
24
  data-collapsed={collapsible && collapsed ? "true" : "false"}
27
25
  data-slot="root"
28
- class={classes.root}
26
+ class:list={[classes.root, className]}
29
27
  {...rest}
30
- style={`--width: ${defaultWidth}; --collapsed-width: ${collapsedWidth}`}
31
28
  >
32
29
  <div data-slot="header" class={classes.header}>
33
30
  <slot name="header" />
@@ -47,15 +44,15 @@ const defaultWidth = "16rem";
47
44
  <div
48
45
  data-dashboard-sidebar-mobile
49
46
  data-slot="content"
50
- class={classes.content + " fixed inset-y-0 left-0 z-50 w-64 bg-default shadow-xl border-e border-default transform -translate-x-full transition-transform duration-300"}
47
+ class:list={[classes.content, "fixed inset-y-0 left-0 z-50 w-72 max-w-[85vw] bg-default shadow-2xl border-e border-default transform -translate-x-full transition-transform duration-300 flex flex-col h-full"]}
51
48
  >
52
- <div data-slot="header" class={classes.header + " " + "sm:px-6"} data-menu>
49
+ <div data-slot="header" class:list={[classes.header, "sm:px-6 shrink-0"]} data-menu>
53
50
  <slot name="header" />
54
51
  </div>
55
- <div data-slot="body" class={classes.body + " " + "sm:px-6"} data-menu>
52
+ <div data-slot="body" class:list={[classes.body, "sm:px-6 overflow-y-auto flex-1"]} data-menu>
56
53
  <slot />
57
54
  </div>
58
- <div data-slot="footer" class={classes.footer + " " + "sm:px-6"} data-menu>
55
+ <div data-slot="footer" class:list={[classes.footer, "sm:px-6 shrink-0"]} data-menu>
59
56
  <slot name="footer" />
60
57
  </div>
61
58
  </div>
@@ -69,18 +66,34 @@ const defaultWidth = "16rem";
69
66
  const mobilePanel = document.querySelector<HTMLElement>('[data-dashboard-sidebar-mobile]');
70
67
  const overlay = document.querySelector<HTMLElement>('[data-dashboard-sidebar-overlay]');
71
68
 
72
- const toggleMobile = () => {
69
+ const openMobile = () => {
70
+ if (!mobilePanel || !overlay) return;
71
+ mobilePanel.classList.remove('-translate-x-full');
72
+ mobilePanel.classList.add('translate-x-0');
73
+ overlay.classList.remove('hidden');
74
+ };
75
+
76
+ const closeMobile = () => {
73
77
  if (!mobilePanel || !overlay) return;
74
- const isOpen = mobilePanel.classList.toggle('translate-x-0');
75
- mobilePanel.classList.toggle('-translate-x-full', !isOpen);
76
- overlay.classList.toggle('hidden', !isOpen);
78
+ mobilePanel.classList.add('-translate-x-full');
79
+ mobilePanel.classList.remove('translate-x-0');
80
+ overlay.classList.add('hidden');
81
+ };
82
+
83
+ const toggleMobile = () => {
84
+ if (!mobilePanel) return;
85
+ if (mobilePanel.classList.contains('translate-x-0')) {
86
+ closeMobile();
87
+ } else {
88
+ openMobile();
89
+ }
77
90
  };
78
91
 
79
92
  const collapseSidebar = (val?: boolean) => {
80
93
  if (!collapsible) return;
81
94
  const isCollapsed = val !== undefined ? val : sidebar.dataset.collapsed !== 'true';
82
95
  sidebar.dataset.collapsed = isCollapsed ? 'true' : 'false';
83
- sidebar.style.setProperty('--width', isCollapsed ? '4rem' : '16rem');
96
+ sidebar.setAttribute('data-collapsed', isCollapsed ? 'true' : 'false');
84
97
 
85
98
  document.querySelectorAll('[data-dashboard-toggle="collapse"]').forEach(btn => {
86
99
  btn.querySelectorAll('[data-dashboard-collapse-icon]').forEach(el => {
@@ -89,16 +102,32 @@ const defaultWidth = "16rem";
89
102
  });
90
103
  };
91
104
 
92
- document.addEventListener('click', (e: MouseEvent) => {
105
+ const handleClick = (e: MouseEvent) => {
93
106
  const target = e.target as Element | null;
94
- const toggle = target?.closest<HTMLElement>('[data-dashboard-toggle]');
107
+ if (!target) return;
108
+
109
+ // Toggle buttons (mobile drawer + collapse)
110
+ const toggle = target.closest<HTMLElement>('[data-dashboard-toggle]');
95
111
  if (toggle) {
96
112
  const side = toggle.dataset.dashboardToggle;
97
113
  if (side === 'mobile') toggleMobile();
98
114
  if (side === 'collapse') collapseSidebar();
115
+ return;
116
+ }
117
+
118
+ // Backdrop overlay click
119
+ if (target.closest('[data-dashboard-sidebar-overlay]')) {
120
+ closeMobile();
121
+ return;
99
122
  }
100
123
 
101
- const navItem = target?.closest<HTMLElement>('[data-dashboard-nav]');
124
+ // Close the mobile drawer when clicking a navigation link inside it
125
+ if (target.closest('[data-dashboard-sidebar-mobile] a')) {
126
+ closeMobile();
127
+ return;
128
+ }
129
+
130
+ const navItem = target.closest<HTMLElement>('[data-dashboard-nav]');
102
131
  if (navItem) {
103
132
  const container = navItem.closest('[data-dashboard-nav-container]');
104
133
  if (container) {
@@ -110,10 +139,13 @@ const defaultWidth = "16rem";
110
139
  navItem.classList.add('bg-muted', 'text-highlighted');
111
140
  }
112
141
  }
113
- });
142
+ };
114
143
 
115
- overlay?.addEventListener('click', toggleMobile);
144
+ const handleKey = (e: KeyboardEvent) => {
145
+ if (e.key === 'Escape') closeMobile();
146
+ };
116
147
 
117
- (window as any).dashboardSidebar = { toggleMobile, collapseSidebar };
148
+ document.addEventListener('click', handleClick);
149
+ document.addEventListener('keydown', handleKey);
118
150
  })();
119
151
  </script>
@@ -3,11 +3,12 @@ import { defineTheme } from "../../resolver"
3
3
  export const dashboardSidebarTheme = defineTheme("dashboard-sidebar", {
4
4
  slots: ["root", "header", "body", "footer", "toggle", "handle", "content", "overlay"],
5
5
  base: {
6
- root: "group relative hidden lg:flex flex-col h-full min-h-0 min-w-16 w-(--width) shrink-0 transition-[width] duration-300",
6
+ root: "group relative hidden lg:flex flex-col h-full min-h-0 shrink-0 transition-[width] duration-300 w-64 min-w-64 max-w-64 data-[collapsed=true]:w-16 data-[collapsed=true]:min-w-16 data-[collapsed=true]:max-w-16 data-[collapsed=true]:overflow-hidden data-[collapsed=false]:w-64 data-[collapsed=false]:min-w-64 data-[collapsed=false]:max-w-64",
7
7
  header:
8
- "h-(--rl-header-height) shrink-0 flex items-center gap-1.5 px-3 group-data-[collapsed=true]:justify-center group-data-[collapsed=true]:gap-0 group-data-[collapsed=true]:px-0",
9
- body: "flex flex-col gap-1 flex-1 overflow-y-auto px-3 py-2",
10
- footer: "shrink-0 flex items-center gap-1.5 px-3 py-2 group-data-[collapsed=true]:px-0",
8
+ "h-16 min-h-16 shrink-0 flex items-center gap-3 px-6 py-4 border-b border-default group-data-[collapsed=true]:justify-center group-data-[collapsed=true]:items-center group-data-[collapsed=true]:gap-0 group-data-[collapsed=true]:px-0",
9
+ body: "flex flex-col gap-1 flex-1 overflow-y-auto px-3 py-3 group-data-[collapsed=true]:items-center group-data-[collapsed=true]:px-0 group-data-[collapsed=true]:overflow-hidden",
10
+ footer:
11
+ "shrink-0 flex items-center gap-1.5 px-3 py-3 border-t border-default/40 group-data-[collapsed=true]:justify-center group-data-[collapsed=true]:items-center group-data-[collapsed=true]:px-0",
11
12
  toggle: "",
12
13
  handle: "",
13
14
  content: "lg:hidden",
@@ -31,7 +32,7 @@ export const dashboardSidebarTheme = defineTheme("dashboard-sidebar", {
31
32
  },
32
33
  collapsed: {
33
34
  true: {
34
- root: "w-(--collapsed-width) overflow-hidden",
35
+ root: "w-16 min-w-16 max-w-16 overflow-hidden",
35
36
  body: "overflow-hidden"
36
37
  }
37
38
  }
@@ -6,6 +6,7 @@ import RLAIcon from "../icon/RLAIcon.astro"
6
6
 
7
7
  const {
8
8
  icon = "i-lucide-panel-left",
9
+ class: className,
9
10
  ...rest
10
11
  } = Astro.props as DashboardSidebarCollapseProps
11
12
 
@@ -48,7 +48,7 @@ const dialogId = `rla-drawer-${Math.random().toString(36).substring(2, 9)}`
48
48
  data-dialog-close={dialogId}
49
49
  aria-label="Close drawer"
50
50
  >
51
- <RLAIcon name="close" class="size-4" aria-hidden="true" />
51
+ <RLAIcon name="i-rl-close" class="size-4" aria-hidden="true" />
52
52
  </button>
53
53
 
54
54
  <div class={classes.header} data-slot="header">
@@ -26,7 +26,7 @@ export const dropdownMenuTheme = defineTheme("dropdown-menu", {
26
26
  "absolute z-50 mt-1 min-w-32 rounded-md border border-default bg-elevated p-1 text-highlighted shadow-md ring-1 ring-black/5 focus:outline-none flex flex-col gap-0.5",
27
27
  viewport: "flex flex-col gap-0.5",
28
28
  group: "p-0.5 isolate flex flex-col gap-0.5",
29
- item: "group relative flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-accent hover:text-accent-foreground cursor-pointer disabled:pointer-events-none disabled:opacity-50 select-none transition-colors",
29
+ item: "group relative flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-accented hover:text-highlighted cursor-pointer disabled:pointer-events-none disabled:opacity-50 select-none transition-colors",
30
30
  itemLeadingIcon: "shrink-0 size-4 text-muted group-hover:text-highlighted",
31
31
  itemLeadingAvatar: "shrink-0 size-4 rounded-full object-cover",
32
32
  itemLabel: "truncate flex-1 text-left",
@@ -34,7 +34,7 @@ export const dropdownMenuTheme = defineTheme("dropdown-menu", {
34
34
  itemTrailingKbds:
35
35
  "hidden lg:inline-flex items-center gap-0.5 text-[10px] font-mono opacity-70 bg-muted px-1 rounded border border-default",
36
36
  shortcut: "ml-auto text-xs tracking-widest text-muted",
37
- separator: "-mx-1 my-1 h-px bg-border",
37
+ separator: "-mx-1 my-1 h-px bg-neutral-200",
38
38
  label: "px-2 py-1.5 text-xs font-semibold tracking-wider text-muted uppercase",
39
39
  arrow: "absolute -top-1.5 left-4 size-3 rotate-45 border-l border-t border-default bg-elevated"
40
40
  },
@@ -6,6 +6,7 @@ import { footerTheme } from "./footer.theme"
6
6
 
7
7
  const {
8
8
  contain = false,
9
+ theme,
9
10
  ...rest
10
11
  } = Astro.props as FooterProps
11
12
 
@@ -16,6 +17,7 @@ const classes = footerTheme(Astro.props)
16
17
  class:list={[classes.root]}
17
18
  data-slot="root"
18
19
  data-contain={contain ? "true" : "false"}
20
+ data-theme={theme}
19
21
  {...rest}
20
22
  >
21
23
  <div class:list={[classes.container]} data-slot="container">
@@ -19,14 +19,6 @@ export const footerTheme = defineTheme("footer", {
19
19
  false: {
20
20
  container: "w-full"
21
21
  }
22
- },
23
- theme: {
24
- dark: {
25
- root: "rl-dark"
26
- },
27
- light: {
28
- root: "rl-light"
29
- }
30
22
  }
31
23
  },
32
24
  defaultVariants: {
@@ -15,7 +15,7 @@ interface Props {
15
15
  const {
16
16
  highlightedButtons = [],
17
17
  groups = [],
18
- highlightColor = 'var(--color-primary-500, #00c16a)',
18
+ highlightColor = 'var(--rl-primary-500)',
19
19
  backgroundColor = 'transparent'
20
20
  } = Astro.props
21
21
 
@@ -22,8 +22,7 @@ const {
22
22
 
23
23
  function applyTheme(doc: any) {
24
24
  var pref = getThemePreference();
25
- doc.documentElement.classList.toggle('dark', pref === 'dark');
26
- doc.documentElement.classList.toggle('light', pref === 'light');
25
+ doc.documentElement.setAttribute('data-theme', pref);
27
26
  }
28
27
 
29
28
  applyTheme(document);
@@ -6,7 +6,7 @@ export const headerTheme = defineTheme("header", {
6
6
  root: "w-full",
7
7
  content: "w-full",
8
8
  container:
9
- "flex flex-row items-center justify-between gap-4xs h-16 md:h-18 px-xs sm:px-md md:px-xl lg:px-xl",
9
+ "flex flex-row items-center justify-between gap-xs h-16 md:h-18 px-xs sm:px-md md:px-xl lg:px-xl",
10
10
  left: "flex-1 min-w-0 flex items-center justify-start",
11
11
  center: "flex-none flex items-center justify-center mx-4",
12
12
  right: "flex-1 min-w-0 flex items-center justify-end"
@@ -1,10 +1,8 @@
1
1
  ---
2
- import { resolveIcon } from "./resolver"
2
+ import { resolveIcon } from "../../icons"
3
3
  import type { IconProps } from "./icon"
4
4
  import { iconTheme } from "./icon.theme"
5
5
 
6
-
7
-
8
6
  const {
9
7
  name,
10
8
  ...rest
@@ -21,8 +19,7 @@ const resolved = resolveIcon(name)
21
19
  {...rest}
22
20
  >
23
21
  {resolved.isClass ? (
24
- <span class={resolved.content} />
25
- ) : (
22
+ <span class:list={[resolved.content, "block size-full"]} /> ) : (
26
23
  <Fragment set:html={resolved.content} />
27
24
  )}
28
25
  </span>
@@ -1,5 +1,5 @@
1
1
  import { createMemo, splitProps, type Component } from "solid-js"
2
- import { resolveIcon } from "./resolver"
2
+ import { resolveIcon } from "../../icons"
3
3
  import type { IconProps } from "./icon"
4
4
  import { iconTheme } from "./icon.theme"
5
5
 
@@ -16,7 +16,7 @@ const RLSIcon: Component<IconProps> = (allProps) => {
16
16
  return (
17
17
  <span class={classes().root} data-slot="icon" aria-hidden="true" {...rest}>
18
18
  {resolved().isClass ? (
19
- <span class={resolved().content} />
19
+ <span class={`${resolved().content} block size-full`} />
20
20
  ) : (
21
21
  <span innerHTML={resolved().content} />
22
22
  )}
@@ -1,10 +1,10 @@
1
1
  <script setup lang="ts">
2
2
  import { computed, useAttrs } from "vue"
3
- import { resolveIcon } from "./resolver"
3
+ import { resolveIcon } from "../../icons"
4
4
  import type { IconProps } from "./icon"
5
5
  import { iconTheme } from "./icon.theme"
6
6
 
7
- defineOptions({ name: "RLVIcon" })
7
+ defineOptions({ name: "RLVIcon", inheritAttrs: false })
8
8
 
9
9
  const attrs = useAttrs()
10
10
 
@@ -23,8 +23,20 @@ const resolved = computed(() => resolveIcon(props.name))
23
23
  </script>
24
24
 
25
25
  <template>
26
- <span v-bind="attrs" :class="resolvedClasses.root" data-slot="icon" aria-hidden="true">
27
- <span v-if="resolved.isClass" :class="resolved.content" />
28
- <span v-else v-html="resolved.content" />
29
- </span>
26
+ <span
27
+ v-if="resolved.isClass"
28
+ v-bind="attrs"
29
+ :class="resolvedClasses.root"
30
+ data-slot="icon"
31
+ aria-hidden="true"
32
+ ><span :class="[resolved.content, 'size-full']"
33
+ /></span>
34
+ <span
35
+ v-else
36
+ v-bind="attrs"
37
+ :class="resolvedClasses.root"
38
+ data-slot="icon"
39
+ aria-hidden="true"
40
+ v-html="resolved.content"
41
+ />
30
42
  </template>
@@ -3,7 +3,7 @@ import { defineTheme } from "../../resolver"
3
3
  export const iconTheme = defineTheme("icon", {
4
4
  slots: ["root"],
5
5
  base: {
6
- root: "shrink-0 inline-flex items-center justify-center align-middle leading-none"
6
+ root: "shrink-0 inline-block align-middle leading-none"
7
7
  },
8
8
  variants: {
9
9
  size: {
@@ -23,7 +23,7 @@ export const imageTheme = defineTheme("image", {
23
23
  download:
24
24
  "inline-flex items-center justify-center rounded-md font-medium transition-colors outline-none h-9 px-4 py-2 text-sm gap-2 text-primary-500 hover:bg-primary-500/10 active:bg-primary-500/10",
25
25
  closeButton:
26
- "inline-flex items-center justify-center size-8 rounded-full bg-default/80 hover:bg-accent text-muted hover:text-highlighted transition-colors"
26
+ "inline-flex items-center justify-center size-8 rounded-full bg-default/80 hover:bg-accented text-muted hover:text-highlighted transition-colors"
27
27
  },
28
28
  variants: {},
29
29
  defaultVariants: {}
@@ -15,6 +15,7 @@ const {
15
15
  error = false,
16
16
  leadingIcon,
17
17
  trailingIcon,
18
+ theme,
18
19
  ...rest
19
20
  } = Astro.props as InputProps
20
21
 
@@ -25,7 +26,7 @@ const classes = inputTheme({
25
26
  error: !!error
26
27
  });
27
28
  ---
28
- <div class={classes.root} data-slot="root">
29
+ <div class={classes.root} data-slot="root" data-theme={theme}>
29
30
  {(leadingIcon || Astro.slots.has("leading")) && (
30
31
  <span class={classes.leading} data-slot="leading">
31
32
  {leadingIcon ? <span class={leadingIcon} /> : <slot name="leading" />}
@@ -29,10 +29,6 @@ export const inputTheme = defineTheme("input", {
29
29
  },
30
30
  error: {
31
31
  true: { root: "border-error-500 focus-within:ring-error-500/50" }
32
- },
33
- theme: {
34
- light: { root: "rl-light" },
35
- dark: { root: "rl-dark" }
36
32
  }
37
33
  },
38
34
  defaultVariants: {
@@ -40,7 +40,7 @@ const initialLabel = selectedItem ? selectedItem.label : ""
40
40
  data-inputMenu-trigger
41
41
  >
42
42
  <span data-inputMenu-value>{initialLabel || placeholder}</span>
43
- <RLAIcon name="chevronsUpDown" class="opacity-50" />
43
+ <RLAIcon name="i-rl-chevronsUpDown" class="opacity-50" />
44
44
  </button>
45
45
 
46
46
  <div class={classes.content + " hidden"} data-inputMenu-dropdown data-slot="content">
@@ -60,7 +60,7 @@ const initialLabel = selectedItem ? selectedItem.label : ""
60
60
  data-inputMenu-item
61
61
  >
62
62
  <span class={classes.itemText}>{item.label}</span>
63
- <RLAIcon name="check" class={classes.itemIcon + " hidden"} data-check-icon />
63
+ <RLAIcon name="i-rl-check" class={classes.itemIcon + " hidden"} data-check-icon />
64
64
  </div>
65
65
  ))}
66
66
  </div>
@@ -11,7 +11,7 @@ export const inputMenuTheme = defineTheme("input-menu", {
11
11
  "flex h-9 w-full rounded-md border border-default bg-transparent px-3 py-1 text-sm shadow-sm transition-all placeholder:text-muted focus:outline-none focus:ring-2 focus:ring-ring disabled:cursor-not-allowed disabled:opacity-50",
12
12
  content:
13
13
  "absolute z-50 min-w-[8rem] overflow-hidden rounded-md border bg-elevated p-1 text-highlighted shadow-md transition-all w-full mt-1 max-h-60 overflow-y-auto",
14
- item: "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 px-2 text-sm outline-none hover:bg-accent hover:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
14
+ item: "relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 px-2 text-sm outline-none hover:bg-accented hover:text-highlighted data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
15
15
  itemText: "truncate",
16
16
  itemIcon: "ml-auto size-4"
17
17
  },
@@ -5,7 +5,7 @@ export const inputRatingTheme = defineTheme("input-rating", {
5
5
  base: {
6
6
  root: "inline-flex select-none",
7
7
  item: [
8
- "relative inline-block cursor-pointer select-none rounded-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--rl-ring)]",
8
+ "relative inline-block cursor-pointer select-none rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-[var(--rl-ring)]",
9
9
  "transition-all duration-150"
10
10
  ],
11
11
  indicator:
@@ -58,7 +58,7 @@ export const inputRatingTheme = defineTheme("input-rating", {
58
58
  color: "neutral",
59
59
  classNames: {
60
60
  indicator: "text-highlighted",
61
- item: "focus-visible:outline-inverted"
61
+ item: "focus-visible:ring-inverted"
62
62
  }
63
63
  },
64
64
  {
@@ -5,6 +5,7 @@ import { kbdTheme } from "./kbd.theme"
5
5
 
6
6
 
7
7
  const {
8
+ theme,
8
9
  ...rest
9
10
  } = Astro.props as KbdProps
10
11
 
@@ -12,6 +13,6 @@ const {
12
13
 
13
14
  const classes = kbdTheme(Astro.props)
14
15
  ---
15
- <kbd class={classes.root} data-slot="root" {...rest}>
16
+ <kbd class={classes.root} data-slot="root" data-theme={theme} {...rest}>
16
17
  <slot />
17
18
  </kbd>
@@ -19,10 +19,6 @@ export const kbdTheme = defineTheme("kbd", {
19
19
  sm: { root: "h-4 min-w-[16px] text-[10px]" },
20
20
  md: { root: "h-5 min-w-[20px] text-[11px]" },
21
21
  lg: { root: "h-6 min-w-[24px] text-[12px]" }
22
- },
23
- theme: {
24
- light: { root: "rl-light" },
25
- dark: { root: "rl-dark" }
26
22
  }
27
23
  },
28
24
  compoundVariants: [
@@ -25,7 +25,7 @@ const {
25
25
  keySize = 40,
26
26
  variant = 'full',
27
27
  os = 'windows',
28
- highlightColor = 'var(--color-primary-500, #00c16a)',
28
+ highlightColor = 'var(--rl-primary-500)',
29
29
  backgroundColor = 'transparent'
30
30
  } = Astro.props
31
31
 
@@ -43,6 +43,7 @@ const classes = raw
43
43
  aria-current={attrs.ariaCurrent}
44
44
  aria-disabled={attrs.ariaDisabled}
45
45
  data-astro-prefetch={attrs.prefetchAttr}
46
+ data-theme={theme}
46
47
  {...rest}
47
48
  >
48
49
  <slot name="leading">
@@ -16,10 +16,6 @@ export const linkTheme = defineTheme("link", {
16
16
  disabled: {
17
17
  true: { root: "cursor-not-allowed opacity-75" },
18
18
  false: {}
19
- },
20
- theme: {
21
- light: { root: "rl-light" },
22
- dark: { root: "rl-dark" }
23
19
  }
24
20
  },
25
21
  compoundVariants: [
@@ -23,7 +23,7 @@ const classes = linkGroupTheme(Astro.props);
23
23
 
24
24
  const normalizedLinks = Array.isArray(links) ? links : [links];
25
25
  ---
26
- <div class={classes.root} data-slot="root" {...rest}>
26
+ <div class={classes.root} data-slot="root" data-theme={theme} {...rest}>
27
27
  {headingLabel && (
28
28
  <h4 class={classes.title} data-slot="title">
29
29
  {headingHref ? (
@@ -9,15 +9,6 @@ export const linkGroupTheme = defineTheme("link-group", {
9
9
  item: "",
10
10
  link: "text-sm text-muted hover:text-highlighted transition-colors"
11
11
  },
12
- variants: {
13
- theme: {
14
- dark: {
15
- root: "rl-dark"
16
- },
17
- light: {
18
- root: "rl-light"
19
- }
20
- }
21
- },
12
+ variants: {},
22
13
  defaultVariants: {}
23
14
  })
@@ -4,8 +4,6 @@ import { localeSelectorTheme } from "./locale-selector.theme"
4
4
  import { getRelativeLocaleUrlList, getRelativeLocaleUrl } from "astro:i18n"
5
5
  import RLASelect from "../select/RLASelect.astro"
6
6
 
7
-
8
-
9
7
  const {
10
8
  locales,
11
9
  currentLocale: currentLocaleProp,
@@ -61,38 +59,9 @@ const items = processedLocales.map((item) => {
61
59
  });
62
60
 
63
61
  const currentLocaleUrl = items.find(item => item.code === currentLocale)?.value || "";
64
-
65
- // Prefix utility classes in classes.select with `!` to cleanly override conflicting styles in RLASelect's base trigger
66
- // Also remove `pr-` classes which were meant for absolute positioned native select icons
67
- const overrideTriggerClass = classes.select
68
- ? classes.select
69
- .split(" ")
70
- .map(cls => {
71
- if (!cls) return "";
72
- if (cls.startsWith("pr-") || cls.startsWith("!pr-")) return ""; // Strip padding-right
73
- if (cls.includes(":")) {
74
- const parts = cls.split(":");
75
- const state = parts.slice(0, -1).join(":");
76
- const baseCls = parts[parts.length - 1];
77
- return `${state}:!${baseCls}`;
78
- }
79
- return `!${cls}`;
80
- })
81
- .filter(Boolean)
82
- .join(" ")
83
- : "";
84
-
85
- const gapClass = size === "sm" ? "gap-1.5" : size === "lg" ? "gap-3" : "gap-2";
86
-
87
- const selectUi = {
88
- root: "!w-fit !inline-flex",
89
- trigger: `flex items-center justify-between !w-fit ${gapClass} ${overrideTriggerClass}`,
90
- content: "!min-w-0 !w-full !bg-default !border-default !text-default",
91
- item: "!text-default hover:!bg-muted hover:!text-highlighted"
92
- }
93
62
  ---
94
63
 
95
- <rla-locale-selector {...rest}>
64
+ <rla-locale-selector data-theme={theme} {...rest}>
96
65
  <div class:list={[classes.root]} data-locale-selector>
97
66
  {Astro.slots.has("label") && (
98
67
  <label class:list={[classes.label]}>
@@ -106,7 +75,6 @@ const selectUi = {
106
75
  value={currentLocaleUrl}
107
76
  size={size}
108
77
  theme={theme}
109
- ui={selectUi}
110
78
  />
111
79
  </div>
112
80
  </div>
@@ -117,8 +85,8 @@ const selectUi = {
117
85
  connectedCallback() {
118
86
  this.style.display = 'contents';
119
87
  this.addEventListener('change', (event) => {
120
- const target = event.target as HTMLInputElement;
121
- if (target && target.hasAttribute('data-select-hidden-input')) {
88
+ const target = event.target as HTMLSelectElement;
89
+ if (target && target.tagName === 'SELECT') {
122
90
  const targetUrl = target.value;
123
91
  if (targetUrl) {
124
92
  window.location.href = targetUrl;
@@ -131,4 +99,4 @@ const selectUi = {
131
99
  if (!customElements.get('rla-locale-selector')) {
132
100
  customElements.define('rla-locale-selector', RLALocaleSelector);
133
101
  }
134
- </script>
102
+ </script>
@@ -13,23 +13,15 @@ export const localeSelectorTheme = defineTheme("locale-selector", {
13
13
  "pointer-events-none absolute inset-y-0 right-0 flex items-center pr-3 text-current group-hover:text-default"
14
14
  },
15
15
  variants: {
16
- theme: {
17
- dark: {
18
- root: "rl-dark"
19
- },
20
- light: {
21
- root: "rl-light"
22
- }
23
- },
24
16
  variant: {
25
17
  default: {
26
- select: "bg-default text-default hover:bg-accent/50 border border-default"
18
+ select: "bg-default text-default hover:bg-accented/50 border border-default"
27
19
  },
28
20
  outline: {
29
- select: "bg-transparent border border-default text-default hover:bg-accent/50"
21
+ select: "bg-transparent border border-default text-default hover:bg-accented/50"
30
22
  },
31
23
  ghost: {
32
- select: "bg-transparent border border-transparent text-default hover:bg-accent/50"
24
+ select: "bg-transparent border border-transparent text-default hover:bg-accented/50"
33
25
  }
34
26
  },
35
27
  size: {
@@ -1,8 +1,7 @@
1
1
  ---
2
2
  import type { LogoProps } from "./logo"
3
3
  import { logoTheme } from "./logo.theme"
4
- import { uiConfig } from "../../resolver"
5
-
4
+ import uiConfig from "virtual:rimelight/ui"
6
5
 
7
6
  const {
8
7
  variant = "logomark",