@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.
- package/README.md +14 -12
- package/package.json +8 -10
- package/src/components/avatar/RLAAvatar.astro +4 -12
- package/src/components/badge/RLABadge.astro +2 -1
- package/src/components/badge/badge.theme.ts +0 -4
- package/src/components/banner/RLABanner.astro +1 -1
- package/src/components/banner/banner.theme.ts +1 -1
- package/src/components/breadcrumb/RLABreadcrumb.astro +2 -2
- package/src/components/button/RLAButton.astro +4 -1
- package/src/components/button/RLSButton.tsx +1 -1
- package/src/components/button/button.theme.ts +1 -5
- package/src/components/callout/RLACallout.astro +7 -5
- package/src/components/callout/callout.theme.ts +1 -5
- package/src/components/card/card.theme.ts +3 -3
- package/src/components/carousel/RLACarousel.astro +2 -2
- package/src/components/carousel/carousel.theme.ts +2 -2
- package/src/components/chart/RLAChart.astro +1 -1
- package/src/components/checkbox/RLACheckbox.astro +2 -1
- package/src/components/checkbox/checkbox.theme.ts +0 -4
- package/src/components/chip/RLAChip.astro +2 -1
- package/src/components/chip/chip.theme.ts +0 -4
- package/src/components/collapsible/RLACollapsible.astro +1 -1
- package/src/components/color-area/RLAColorArea.astro +1 -0
- package/src/components/color-area/color-area.theme.ts +1 -5
- package/src/components/color-field/RLAColorField.astro +1 -0
- package/src/components/color-field/color-field.theme.ts +1 -5
- package/src/components/color-slider/RLAColorSlider.astro +1 -0
- package/src/components/color-slider/color-slider.theme.ts +1 -5
- package/src/components/dashboard-group/RLADashboardGroup.astro +5 -7
- package/src/components/dashboard-group/dashboard-group.theme.ts +1 -1
- package/src/components/dashboard-group/dashboard-group.ts +1 -1
- package/src/components/dashboard-navbar/RLADashboardNavbar.astro +4 -4
- package/src/components/dashboard-navbar/dashboard-navbar.theme.ts +3 -3
- package/src/components/dashboard-navbar/dashboard-navbar.ts +1 -1
- package/src/components/dashboard-panel/RLADashboardPanel.astro +9 -8
- package/src/components/dashboard-panel/dashboard-panel.theme.ts +1 -1
- package/src/components/dashboard-sidebar/RLADashboardSidebar.astro +52 -20
- package/src/components/dashboard-sidebar/dashboard-sidebar.theme.ts +6 -5
- package/src/components/dashboard-sidebar-collapse/RLADashboardSidebarCollapse.astro +1 -0
- package/src/components/drawer/RLADrawer.astro +1 -1
- package/src/components/dropdown-menu/dropdown-menu.theme.ts +2 -2
- package/src/components/footer/RLAFooter.astro +2 -0
- package/src/components/footer/footer.theme.ts +0 -8
- package/src/components/gamepad/RLAGamepad.astro +1 -1
- package/src/components/head/UIHead.astro +1 -2
- package/src/components/header/header.theme.ts +1 -1
- package/src/components/icon/RLAIcon.astro +2 -5
- package/src/components/icon/RLSIcon.tsx +2 -2
- package/src/components/icon/RLVIcon.vue +18 -6
- package/src/components/icon/icon.theme.ts +1 -1
- package/src/components/image/image.theme.ts +1 -1
- package/src/components/input/RLAInput.astro +2 -1
- package/src/components/input/input.theme.ts +0 -4
- package/src/components/input-menu/RLAInputMenu.astro +2 -2
- package/src/components/input-menu/input-menu.theme.ts +1 -1
- package/src/components/input-rating/input-rating.theme.ts +2 -2
- package/src/components/kbd/RLAKbd.astro +2 -1
- package/src/components/kbd/kbd.theme.ts +0 -4
- package/src/components/keyboard/RLAKeyboard.astro +1 -1
- package/src/components/link/RLALink.astro +1 -0
- package/src/components/link/link.theme.ts +0 -4
- package/src/components/link-group/RLALinkGroup.astro +1 -1
- package/src/components/link-group/link-group.theme.ts +1 -10
- package/src/components/locale-selector/RLALocaleSelector.astro +4 -36
- package/src/components/locale-selector/locale-selector.theme.ts +3 -11
- package/src/components/logo/RLALogo.astro +1 -2
- package/src/components/modal/RLAModal.astro +8 -5
- package/src/components/modal/RLSModal.tsx +17 -12
- package/src/components/modal/modal.theme.ts +5 -4
- package/src/components/navigation-menu/RLANavigationMenu.astro +17 -21
- package/src/components/navigation-menu/navigation-menu.theme.ts +3 -7
- package/src/components/pagination/RLAPagination.astro +2 -2
- package/src/components/pagination/pagination.theme.ts +1 -1
- package/src/components/popover/RLAPopover.astro +39 -0
- package/src/components/progress/RLAProgress.astro +2 -0
- package/src/components/progress/progress.theme.ts +0 -4
- package/src/components/scroll-area/scroll-area.theme.ts +1 -1
- package/src/components/scroll-to-top/RLAScrollToTop.astro +6 -5
- package/src/components/scroll-to-top/RLVScrollToTop.vue +7 -7
- package/src/components/scroll-to-top/scroll-to-top.theme.ts +3 -7
- package/src/components/search/RLASearch.astro +3 -3
- package/src/components/select/RLASelect.astro +96 -528
- package/src/components/select/RLSSelect.tsx +68 -14
- package/src/components/select/RLVSelect.vue +57 -0
- package/src/components/select/select.theme.ts +11 -96
- package/src/components/shortcuts/RLAShortcuts.astro +9 -9
- package/src/components/sidebar/RLASidebar.astro +3 -3
- package/src/components/slideover/RLASlideover.astro +1 -1
- package/src/components/slider/RLASlider.astro +2 -1
- package/src/components/slider/slider.theme.ts +1 -5
- package/src/components/spinner/RLASpinner.astro +2 -1
- package/src/components/spinner/spinner.theme.ts +1 -5
- package/src/components/splitter/splitter.theme.ts +1 -1
- package/src/components/stepper/RLAStepper.astro +8 -8
- package/src/components/stepper/stepper.theme.ts +6 -7
- package/src/components/steps/RLASteps.astro +3 -3
- package/src/components/switch/RLASwitch.astro +2 -1
- package/src/components/switch/switch.theme.ts +0 -4
- package/src/components/table/table.theme.ts +1 -1
- package/src/components/table-of-contents/RLATableOfContents.astro +5 -5
- package/src/components/theme-selector/RLAThemeSelector.astro +16 -14
- package/src/components/theme-selector/theme-selector.theme.ts +2 -2
- package/src/components/toast/RLAToast.astro +6 -6
- package/src/components/toast/store.ts +1 -1
- package/src/components/tooltip/tooltip.theme.ts +1 -1
- package/src/icons.raw.ts +67 -0
- package/src/icons.ts +31 -64
- package/src/index.ts +19 -18
- package/src/preset.ts +110 -108
- package/src/resolver.ts +127 -15
- package/src/shortcuts.ts +103 -84
- package/src/stores.ts +22 -0
- package/src/types.ts +27 -9
- package/src/virtual.d.ts +4 -0
- package/src/components/editor/PageEditor.vue +0 -459
- package/src/components/editor/PageMention.vue +0 -87
- package/src/components/editor/PagePropertiesEditor.vue +0 -358
- package/src/components/editor/PagePropertiesRenderer.vue +0 -285
- package/src/components/editor/PageRenderer.vue +0 -155
- package/src/components/editor/PageSurround.vue +0 -130
- package/src/components/editor/PageVersionSelector.vue +0 -371
- package/src/components/editor/blocks/AddBlockModal.vue +0 -196
- package/src/components/editor/blocks/Block.vue +0 -142
- package/src/components/editor/blocks/BlockEditRenderer.vue +0 -26
- package/src/components/editor/blocks/BlockEditor.vue +0 -141
- package/src/components/editor/blocks/BlockViewRenderer.vue +0 -71
- package/src/components/editor/blocks/TextRenderer.vue +0 -31
- package/src/components/editor/blocks/editor/CalloutBlockEditor.vue +0 -53
- package/src/components/editor/blocks/editor/ImageBlockEditor.vue +0 -55
- package/src/components/editor/blocks/editor/ParagraphBlockEditor.vue +0 -31
- package/src/components/editor/blocks/editor/SectionBlockEditor.vue +0 -65
- package/src/components/editor/blocks/nodes/LinkNode.vue +0 -28
- package/src/components/editor/blocks/nodes/TextNode.vue +0 -22
- package/src/components/editor/blocks/renderer/CalloutBlockRenderer.vue +0 -65
- package/src/components/editor/blocks/renderer/ImageBlockRenderer.vue +0 -20
- package/src/components/editor/blocks/renderer/ParagraphBlockRenderer.vue +0 -21
- package/src/components/editor/blocks/renderer/SectionBlockRenderer.vue +0 -55
- package/src/components/editor/composables/injectionKeys.ts +0 -3
- package/src/components/editor/composables/useBlockEditor.ts +0 -261
- package/src/components/editor/composables/usePageEditor.ts +0 -97
- package/src/components/editor/modals/CreatePageModal.vue +0 -160
- package/src/components/editor/modals/DeletePageModal.vue +0 -116
- package/src/components/editor/modals/PageTreeModal.vue +0 -275
- package/src/components/editor/types/blocks.ts +0 -100
- package/src/components/editor/types/pages.ts +0 -89
- package/src/components/editor/types/schemas.ts +0 -36
- package/src/components/editor/utils/blocks.ts +0 -42
- package/src/components/editor/utils/editorHelpers.ts +0 -24
- package/src/components/editor/utils/page.ts +0 -219
- package/src/components/editor/utils/richTextHelpers.ts +0 -35
- package/src/components/editor/views/PageEditView.vue +0 -195
- package/src/components/editor/views/PageLiveView.vue +0 -90
- package/src/components/editor/views/PageReviewView.vue +0 -308
- 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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
75
|
-
mobilePanel.classList.
|
|
76
|
-
overlay.classList.
|
|
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.
|
|
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
|
-
|
|
105
|
+
const handleClick = (e: MouseEvent) => {
|
|
93
106
|
const target = e.target as Element | null;
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
|
|
144
|
+
const handleKey = (e: KeyboardEvent) => {
|
|
145
|
+
if (e.key === 'Escape') closeMobile();
|
|
146
|
+
};
|
|
116
147
|
|
|
117
|
-
(
|
|
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-
|
|
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-
|
|
9
|
-
body: "flex flex-col gap-1 flex-1 overflow-y-auto px-3 py-
|
|
10
|
-
footer:
|
|
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-
|
|
35
|
+
root: "w-16 min-w-16 max-w-16 overflow-hidden",
|
|
35
36
|
body: "overflow-hidden"
|
|
36
37
|
}
|
|
37
38
|
}
|
|
@@ -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-
|
|
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-
|
|
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">
|
|
@@ -22,8 +22,7 @@ const {
|
|
|
22
22
|
|
|
23
23
|
function applyTheme(doc: any) {
|
|
24
24
|
var pref = getThemePreference();
|
|
25
|
-
doc.documentElement.
|
|
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-
|
|
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 "
|
|
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 "
|
|
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 "
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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-
|
|
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-
|
|
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" />}
|
|
@@ -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-
|
|
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:
|
|
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:
|
|
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: [
|
|
@@ -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
|
|
121
|
-
if (target && target.
|
|
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-
|
|
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-
|
|
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-
|
|
24
|
+
select: "bg-transparent border border-transparent text-default hover:bg-accented/50"
|
|
33
25
|
}
|
|
34
26
|
},
|
|
35
27
|
size: {
|