@emara/ui 1.1.0
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/components/ui/.gitkeep +0 -0
- package/components/ui/accordion.stories.tsx +231 -0
- package/components/ui/accordion.tsx +250 -0
- package/components/ui/app-shell.stories.tsx +270 -0
- package/components/ui/app-shell.tsx +491 -0
- package/components/ui/avatar.stories.tsx +174 -0
- package/components/ui/avatar.tsx +257 -0
- package/components/ui/badge.stories.tsx +127 -0
- package/components/ui/badge.tsx +146 -0
- package/components/ui/breadcrumb.stories.tsx +92 -0
- package/components/ui/breadcrumb.tsx +302 -0
- package/components/ui/button.stories.tsx +186 -0
- package/components/ui/button.tsx +128 -0
- package/components/ui/card.stories.tsx +279 -0
- package/components/ui/card.tsx +250 -0
- package/components/ui/checkbox.stories.tsx +93 -0
- package/components/ui/checkbox.tsx +131 -0
- package/components/ui/combobox.stories.tsx +489 -0
- package/components/ui/combobox.tsx +874 -0
- package/components/ui/context-menu.stories.tsx +202 -0
- package/components/ui/context-menu.tsx +309 -0
- package/components/ui/data-table.stories.tsx +227 -0
- package/components/ui/data-table.tsx +539 -0
- package/components/ui/date-picker.stories.tsx +225 -0
- package/components/ui/date-picker.tsx +597 -0
- package/components/ui/dialog.stories.tsx +193 -0
- package/components/ui/dialog.tsx +262 -0
- package/components/ui/divider.stories.tsx +84 -0
- package/components/ui/divider.tsx +135 -0
- package/components/ui/drawer.stories.tsx +218 -0
- package/components/ui/drawer.tsx +329 -0
- package/components/ui/dropdown-menu.stories.tsx +270 -0
- package/components/ui/dropdown-menu.tsx +353 -0
- package/components/ui/empty-state.stories.tsx +121 -0
- package/components/ui/empty-state.tsx +289 -0
- package/components/ui/field-group.stories.tsx +201 -0
- package/components/ui/field-group.tsx +276 -0
- package/components/ui/form.stories.tsx +219 -0
- package/components/ui/form.tsx +542 -0
- package/components/ui/input.stories.tsx +154 -0
- package/components/ui/input.tsx +208 -0
- package/components/ui/label.stories.tsx +84 -0
- package/components/ui/label.tsx +98 -0
- package/components/ui/page-header.stories.tsx +136 -0
- package/components/ui/page-header.tsx +315 -0
- package/components/ui/pagination.stories.tsx +136 -0
- package/components/ui/pagination.tsx +427 -0
- package/components/ui/popover.stories.tsx +212 -0
- package/components/ui/popover.tsx +167 -0
- package/components/ui/radio-group.stories.tsx +96 -0
- package/components/ui/radio-group.tsx +250 -0
- package/components/ui/select.stories.tsx +203 -0
- package/components/ui/select.tsx +318 -0
- package/components/ui/sidebar.stories.tsx +186 -0
- package/components/ui/sidebar.tsx +623 -0
- package/components/ui/skeleton.stories.tsx +131 -0
- package/components/ui/skeleton.tsx +311 -0
- package/components/ui/switch.stories.tsx +74 -0
- package/components/ui/switch.tsx +186 -0
- package/components/ui/table.stories.tsx +107 -0
- package/components/ui/table.tsx +285 -0
- package/components/ui/tabs.stories.tsx +222 -0
- package/components/ui/tabs.tsx +287 -0
- package/components/ui/textarea.stories.tsx +96 -0
- package/components/ui/textarea.tsx +182 -0
- package/components/ui/toast.stories.tsx +169 -0
- package/components/ui/toast.tsx +250 -0
- package/components/ui/tooltip.stories.tsx +146 -0
- package/components/ui/tooltip.tsx +156 -0
- package/components/ui/top-bar.stories.tsx +182 -0
- package/components/ui/top-bar.tsx +155 -0
- package/dist/components/ui/accordion.d.ts +45 -0
- package/dist/components/ui/accordion.d.ts.map +1 -0
- package/dist/components/ui/accordion.js +99 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/components/ui/app-shell.d.ts +70 -0
- package/dist/components/ui/app-shell.d.ts.map +1 -0
- package/dist/components/ui/app-shell.js +199 -0
- package/dist/components/ui/app-shell.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +41 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +104 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +27 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +65 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +35 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.js +88 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button.d.ts +26 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +73 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/card.d.ts +52 -0
- package/dist/components/ui/card.d.ts.map +1 -0
- package/dist/components/ui/card.js +96 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/checkbox.d.ts +18 -0
- package/dist/components/ui/checkbox.d.ts.map +1 -0
- package/dist/components/ui/checkbox.js +59 -0
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/combobox.d.ts +194 -0
- package/dist/components/ui/combobox.d.ts.map +1 -0
- package/dist/components/ui/combobox.js +361 -0
- package/dist/components/ui/combobox.js.map +1 -0
- package/dist/components/ui/context-menu.d.ts +46 -0
- package/dist/components/ui/context-menu.d.ts.map +1 -0
- package/dist/components/ui/context-menu.js +95 -0
- package/dist/components/ui/context-menu.js.map +1 -0
- package/dist/components/ui/data-table.d.ts +53 -0
- package/dist/components/ui/data-table.d.ts.map +1 -0
- package/dist/components/ui/data-table.js +163 -0
- package/dist/components/ui/data-table.js.map +1 -0
- package/dist/components/ui/date-picker.d.ts +103 -0
- package/dist/components/ui/date-picker.d.ts.map +1 -0
- package/dist/components/ui/date-picker.js +306 -0
- package/dist/components/ui/date-picker.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +40 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/dialog.js +110 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/divider.d.ts +30 -0
- package/dist/components/ui/divider.d.ts.map +1 -0
- package/dist/components/ui/divider.js +62 -0
- package/dist/components/ui/divider.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +56 -0
- package/dist/components/ui/drawer.d.ts.map +1 -0
- package/dist/components/ui/drawer.js +147 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +63 -0
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
- package/dist/components/ui/dropdown-menu.js +116 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/empty-state.d.ts +43 -0
- package/dist/components/ui/empty-state.d.ts.map +1 -0
- package/dist/components/ui/empty-state.js +128 -0
- package/dist/components/ui/empty-state.js.map +1 -0
- package/dist/components/ui/field-group.d.ts +38 -0
- package/dist/components/ui/field-group.d.ts.map +1 -0
- package/dist/components/ui/field-group.js +107 -0
- package/dist/components/ui/field-group.js.map +1 -0
- package/dist/components/ui/form.d.ts +67 -0
- package/dist/components/ui/form.d.ts.map +1 -0
- package/dist/components/ui/form.js +286 -0
- package/dist/components/ui/form.js.map +1 -0
- package/dist/components/ui/input.d.ts +36 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +99 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.d.ts +37 -0
- package/dist/components/ui/label.d.ts.map +1 -0
- package/dist/components/ui/label.js +34 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/page-header.d.ts +65 -0
- package/dist/components/ui/page-header.d.ts.map +1 -0
- package/dist/components/ui/page-header.js +140 -0
- package/dist/components/ui/page-header.js.map +1 -0
- package/dist/components/ui/pagination.d.ts +67 -0
- package/dist/components/ui/pagination.d.ts.map +1 -0
- package/dist/components/ui/pagination.js +109 -0
- package/dist/components/ui/pagination.js.map +1 -0
- package/dist/components/ui/popover.d.ts +28 -0
- package/dist/components/ui/popover.d.ts.map +1 -0
- package/dist/components/ui/popover.js +85 -0
- package/dist/components/ui/popover.js.map +1 -0
- package/dist/components/ui/radio-group.d.ts +35 -0
- package/dist/components/ui/radio-group.d.ts.map +1 -0
- package/dist/components/ui/radio-group.js +103 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/select.d.ts +42 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/select.js +86 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/sidebar.d.ts +59 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sidebar.js +189 -0
- package/dist/components/ui/sidebar.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +77 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +115 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/switch.d.ts +26 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/components/ui/switch.js +84 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.d.ts +52 -0
- package/dist/components/ui/table.d.ts.map +1 -0
- package/dist/components/ui/table.js +109 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.d.ts +42 -0
- package/dist/components/ui/tabs.d.ts.map +1 -0
- package/dist/components/ui/tabs.js +163 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +26 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +96 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toast.d.ts +77 -0
- package/dist/components/ui/toast.d.ts.map +1 -0
- package/dist/components/ui/toast.js +141 -0
- package/dist/components/ui/toast.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +31 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +71 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/components/ui/top-bar.d.ts +30 -0
- package/dist/components/ui/top-bar.d.ts.map +1 -0
- package/dist/components/ui/top-bar.js +64 -0
- package/dist/components/ui/top-bar.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/lib/utils.ts +6 -0
- package/package.json +112 -0
- package/styles/globals.css +685 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
type AppShellVariant = "default" | "header-only" | "sidebar-only" | "minimal";
|
|
4
|
+
type SidebarPosition = "start" | "end";
|
|
5
|
+
type SidebarWidthToken = "sm" | "md" | "lg";
|
|
6
|
+
type HeaderHeightToken = "sm" | "md" | "lg";
|
|
7
|
+
type Breakpoint = "sm" | "md" | "lg";
|
|
8
|
+
interface AppShellContextValue {
|
|
9
|
+
variant: AppShellVariant;
|
|
10
|
+
sidebarPosition: SidebarPosition;
|
|
11
|
+
sidebarWidthPx: number;
|
|
12
|
+
collapsedWidthPx: number;
|
|
13
|
+
headerHeightPx: number;
|
|
14
|
+
sidebarBreakpoint: Breakpoint;
|
|
15
|
+
stickyHeader: boolean;
|
|
16
|
+
bordered: boolean;
|
|
17
|
+
/** True when inline sidebar is in icon-only mode (desktop). */
|
|
18
|
+
sidebarCollapsed: boolean;
|
|
19
|
+
setSidebarCollapsed: (collapsed: boolean) => void;
|
|
20
|
+
/** True when mobile drawer is open. */
|
|
21
|
+
sidebarOpen: boolean;
|
|
22
|
+
setSidebarOpen: (open: boolean) => void;
|
|
23
|
+
mainId: string;
|
|
24
|
+
}
|
|
25
|
+
/** Read AppShell state from any descendant. */
|
|
26
|
+
declare function useAppShell(): AppShellContextValue;
|
|
27
|
+
declare const appShellRootVariants: (props?: ({
|
|
28
|
+
bordered?: boolean | null | undefined;
|
|
29
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
30
|
+
type AppShellRootVariants = VariantProps<typeof appShellRootVariants>;
|
|
31
|
+
type AppShellProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & AppShellRootVariants & {
|
|
32
|
+
variant?: AppShellVariant;
|
|
33
|
+
sidebarPosition?: SidebarPosition;
|
|
34
|
+
sidebarWidth?: SidebarWidthToken | number;
|
|
35
|
+
headerHeight?: HeaderHeightToken | number;
|
|
36
|
+
sidebarCollapsed?: boolean;
|
|
37
|
+
defaultSidebarCollapsed?: boolean;
|
|
38
|
+
onSidebarCollapsedChange?: (collapsed: boolean) => void;
|
|
39
|
+
sidebarBreakpoint?: Breakpoint;
|
|
40
|
+
stickyHeader?: boolean;
|
|
41
|
+
/** aria-label for the auto-injected hamburger button. Default "Open navigation". */
|
|
42
|
+
sidebarOpenLabel?: string;
|
|
43
|
+
/** Localized text for the skip link. Default "Skip to main content". */
|
|
44
|
+
skipLinkLabel?: string;
|
|
45
|
+
children?: ReactNode;
|
|
46
|
+
};
|
|
47
|
+
declare const AppShell: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & AppShellRootVariants & {
|
|
48
|
+
variant?: AppShellVariant;
|
|
49
|
+
sidebarPosition?: SidebarPosition;
|
|
50
|
+
sidebarWidth?: SidebarWidthToken | number;
|
|
51
|
+
headerHeight?: HeaderHeightToken | number;
|
|
52
|
+
sidebarCollapsed?: boolean;
|
|
53
|
+
defaultSidebarCollapsed?: boolean;
|
|
54
|
+
onSidebarCollapsedChange?: (collapsed: boolean) => void;
|
|
55
|
+
sidebarBreakpoint?: Breakpoint;
|
|
56
|
+
stickyHeader?: boolean;
|
|
57
|
+
/** aria-label for the auto-injected hamburger button. Default "Open navigation". */
|
|
58
|
+
sidebarOpenLabel?: string;
|
|
59
|
+
/** Localized text for the skip link. Default "Skip to main content". */
|
|
60
|
+
skipLinkLabel?: string;
|
|
61
|
+
children?: ReactNode;
|
|
62
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
63
|
+
declare const AppShellHeader: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & import("react").RefAttributes<HTMLElement>>;
|
|
64
|
+
declare const AppShellSidebar: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & import("react").RefAttributes<HTMLElement>>;
|
|
65
|
+
declare const AppShellMain: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & import("react").RefAttributes<HTMLElement>>;
|
|
66
|
+
declare const AppShellFooter: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & import("react").RefAttributes<HTMLElement>>;
|
|
67
|
+
declare const AppShellLayout: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLDivElement> & import("react").RefAttributes<HTMLDivElement>>;
|
|
68
|
+
export { AppShell, AppShellHeader, AppShellSidebar, AppShellMain, AppShellFooter, AppShellLayout, useAppShell, };
|
|
69
|
+
export type { AppShellProps, AppShellVariant, SidebarPosition, AppShellContextValue };
|
|
70
|
+
//# sourceMappingURL=app-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../components/ui/app-shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useMemo, useState, } from "react";
|
|
4
|
+
import { RiMenuLine } from "@remixicon/react";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import { cn } from "@/lib/utils";
|
|
7
|
+
import { Button } from "./button";
|
|
8
|
+
import { Drawer, DrawerContent, DrawerOverlay, DrawerPortal } from "./drawer";
|
|
9
|
+
import { TooltipProvider } from "./tooltip";
|
|
10
|
+
// Resolved px sizes (kept in TS so we can drive CSS variables for use in
|
|
11
|
+
// transitions and Drawer fallback width).
|
|
12
|
+
const SIDEBAR_WIDTH_PX = {
|
|
13
|
+
sm: 200,
|
|
14
|
+
md: 240,
|
|
15
|
+
lg: 280,
|
|
16
|
+
};
|
|
17
|
+
const SIDEBAR_COLLAPSED_WIDTH_PX = 64;
|
|
18
|
+
const HEADER_HEIGHT_PX = {
|
|
19
|
+
sm: 48,
|
|
20
|
+
md: 56,
|
|
21
|
+
lg: 64,
|
|
22
|
+
};
|
|
23
|
+
// Tailwind class fragments for each breakpoint (typed to keep `min-w-` arbitrary
|
|
24
|
+
// values out so the JIT only emits what we use).
|
|
25
|
+
const BREAKPOINT_MIN_WIDTH_CLASS = {
|
|
26
|
+
sm: "min-[640px]:flex",
|
|
27
|
+
md: "min-[768px]:flex",
|
|
28
|
+
lg: "min-[1024px]:flex",
|
|
29
|
+
};
|
|
30
|
+
const BREAKPOINT_HIDE_BELOW_CLASS = {
|
|
31
|
+
sm: "max-[639px]:hidden",
|
|
32
|
+
md: "max-[767px]:hidden",
|
|
33
|
+
lg: "max-[1023px]:hidden",
|
|
34
|
+
};
|
|
35
|
+
const BREAKPOINT_SHOW_TRIGGER_BELOW_CLASS = {
|
|
36
|
+
// Hamburger button appears below the breakpoint.
|
|
37
|
+
sm: "min-[640px]:hidden",
|
|
38
|
+
md: "min-[768px]:hidden",
|
|
39
|
+
lg: "min-[1024px]:hidden",
|
|
40
|
+
};
|
|
41
|
+
const AppShellContext = createContext(null);
|
|
42
|
+
/** Read AppShell state from any descendant. */
|
|
43
|
+
function useAppShell() {
|
|
44
|
+
const ctx = useContext(AppShellContext);
|
|
45
|
+
if (!ctx)
|
|
46
|
+
throw new Error("useAppShell must be used inside <AppShell>");
|
|
47
|
+
return ctx;
|
|
48
|
+
}
|
|
49
|
+
// ===========================================================================
|
|
50
|
+
// Skip link
|
|
51
|
+
// ===========================================================================
|
|
52
|
+
function SkipLink({ targetId, label = "Skip to main content", }) {
|
|
53
|
+
return (_jsx("a", { href: `#${targetId}`, className: cn("sr-only focus:not-sr-only", "focus:z-overlay focus:fixed focus:inset-s-2 focus:top-2", "focus:bg-primary focus:rounded-md focus:px-3 focus:py-2", "focus:text-primary-foreground focus:shadow-md", "focus:ring-ring focus:ring-offset-background focus:ring-2 focus:ring-offset-2 focus:outline-none"), children: label }));
|
|
54
|
+
}
|
|
55
|
+
// ===========================================================================
|
|
56
|
+
// Root
|
|
57
|
+
// ===========================================================================
|
|
58
|
+
const appShellRootVariants = cva("min-h-dvh w-full bg-background text-foreground", {
|
|
59
|
+
variants: {
|
|
60
|
+
bordered: { true: "", false: "" },
|
|
61
|
+
},
|
|
62
|
+
defaultVariants: { bordered: false },
|
|
63
|
+
});
|
|
64
|
+
const AppShell = forwardRef(function AppShell({ className, variant = "default", sidebarPosition = "start", sidebarWidth = "md", headerHeight = "md", sidebarCollapsed: controlledCollapsed, defaultSidebarCollapsed = false, onSidebarCollapsedChange, sidebarBreakpoint = "md", stickyHeader = true, bordered = false, sidebarOpenLabel = "Open navigation", skipLinkLabel = "Skip to main content", children, ...props }, ref) {
|
|
65
|
+
const mainId = useId();
|
|
66
|
+
// Collapsed state (controlled / uncontrolled)
|
|
67
|
+
const [uncontrolledCollapsed, setUncontrolledCollapsed] = useState(defaultSidebarCollapsed);
|
|
68
|
+
const collapsedIsControlled = controlledCollapsed !== undefined;
|
|
69
|
+
const sidebarCollapsed = collapsedIsControlled ? controlledCollapsed : uncontrolledCollapsed;
|
|
70
|
+
const setSidebarCollapsed = useCallback((next) => {
|
|
71
|
+
if (!collapsedIsControlled)
|
|
72
|
+
setUncontrolledCollapsed(next);
|
|
73
|
+
onSidebarCollapsedChange?.(next);
|
|
74
|
+
}, [collapsedIsControlled, onSidebarCollapsedChange]);
|
|
75
|
+
// Mobile drawer open state
|
|
76
|
+
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
77
|
+
// Resolve widths/heights to px values
|
|
78
|
+
const sidebarWidthPx = typeof sidebarWidth === "number" ? sidebarWidth : SIDEBAR_WIDTH_PX[sidebarWidth];
|
|
79
|
+
const headerHeightPx = typeof headerHeight === "number" ? headerHeight : HEADER_HEIGHT_PX[headerHeight];
|
|
80
|
+
const ctx = useMemo(() => ({
|
|
81
|
+
variant,
|
|
82
|
+
sidebarPosition,
|
|
83
|
+
sidebarWidthPx,
|
|
84
|
+
collapsedWidthPx: SIDEBAR_COLLAPSED_WIDTH_PX,
|
|
85
|
+
headerHeightPx,
|
|
86
|
+
sidebarBreakpoint,
|
|
87
|
+
stickyHeader,
|
|
88
|
+
bordered: Boolean(bordered),
|
|
89
|
+
sidebarCollapsed,
|
|
90
|
+
setSidebarCollapsed,
|
|
91
|
+
sidebarOpen,
|
|
92
|
+
setSidebarOpen,
|
|
93
|
+
mainId,
|
|
94
|
+
}), [
|
|
95
|
+
variant,
|
|
96
|
+
sidebarPosition,
|
|
97
|
+
sidebarWidthPx,
|
|
98
|
+
headerHeightPx,
|
|
99
|
+
sidebarBreakpoint,
|
|
100
|
+
stickyHeader,
|
|
101
|
+
bordered,
|
|
102
|
+
sidebarCollapsed,
|
|
103
|
+
setSidebarCollapsed,
|
|
104
|
+
sidebarOpen,
|
|
105
|
+
mainId,
|
|
106
|
+
]);
|
|
107
|
+
// Auto-close the mobile drawer when the viewport widens above the breakpoint.
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function")
|
|
110
|
+
return;
|
|
111
|
+
const min = sidebarBreakpoint === "sm" ? 640 : sidebarBreakpoint === "md" ? 768 : 1024;
|
|
112
|
+
const mql = window.matchMedia(`(min-width: ${min}px)`);
|
|
113
|
+
const onChange = () => {
|
|
114
|
+
if (mql.matches)
|
|
115
|
+
setSidebarOpen(false);
|
|
116
|
+
};
|
|
117
|
+
mql.addEventListener("change", onChange);
|
|
118
|
+
return () => mql.removeEventListener("change", onChange);
|
|
119
|
+
}, [sidebarBreakpoint]);
|
|
120
|
+
const hasSidebar = variant === "default" || variant === "sidebar-only";
|
|
121
|
+
const hasHeader = variant === "default" || variant === "header-only";
|
|
122
|
+
// Style: CSS variables for inline sidebar/header sizing so children can
|
|
123
|
+
// refer to them (e.g. drawer fallback width, content offset).
|
|
124
|
+
const style = {
|
|
125
|
+
"--app-shell-sidebar-width": `${sidebarWidthPx}px`,
|
|
126
|
+
"--app-shell-sidebar-collapsed-width": `${SIDEBAR_COLLAPSED_WIDTH_PX}px`,
|
|
127
|
+
"--app-shell-header-height": `${headerHeightPx}px`,
|
|
128
|
+
...props.style,
|
|
129
|
+
};
|
|
130
|
+
return (_jsx(AppShellContext.Provider, { value: ctx, children: _jsx(TooltipProvider, { delayDuration: 200, children: _jsxs("div", { ref: ref, "data-slot": "app-shell", "data-variant": variant, "data-sidebar-position": hasSidebar ? sidebarPosition : undefined, className: cn(appShellRootVariants({ bordered }), className), style: style, ...props, children: [_jsx(SkipLink, { targetId: mainId, label: skipLinkLabel }), children, hasSidebar && hasHeader ? (_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": sidebarOpenLabel, onClick: () => setSidebarOpen(true), className: cn("z-fixed fixed top-2", sidebarPosition === "start" ? "inset-s-2" : "inset-e-2", BREAKPOINT_SHOW_TRIGGER_BELOW_CLASS[sidebarBreakpoint]), children: _jsx(RiMenuLine, {}) })) : null] }) }) }));
|
|
131
|
+
});
|
|
132
|
+
AppShell.displayName = "AppShell";
|
|
133
|
+
// ===========================================================================
|
|
134
|
+
// Slots
|
|
135
|
+
// ===========================================================================
|
|
136
|
+
const AppShellHeader = forwardRef(function AppShellHeader({ className, ...props }, ref) {
|
|
137
|
+
const { stickyHeader, bordered, headerHeightPx, variant } = useAppShell();
|
|
138
|
+
if (variant === "sidebar-only" || variant === "minimal")
|
|
139
|
+
return null;
|
|
140
|
+
return (_jsx("header", { ref: ref, role: "banner", "data-slot": "app-shell-header", className: cn("bg-background z-sticky flex w-full items-center", stickyHeader && "sticky top-0", bordered && "border-border border-b", className), style: { height: headerHeightPx }, ...props }));
|
|
141
|
+
});
|
|
142
|
+
AppShellHeader.displayName = "AppShellHeader";
|
|
143
|
+
const AppShellSidebar = forwardRef(function AppShellSidebar({ className, children, ...props }, ref) {
|
|
144
|
+
const { variant, sidebarPosition, sidebarCollapsed, sidebarBreakpoint, bordered, sidebarWidthPx, collapsedWidthPx, sidebarOpen, setSidebarOpen, headerHeightPx, stickyHeader, } = useAppShell();
|
|
145
|
+
if (variant === "header-only" || variant === "minimal")
|
|
146
|
+
return null;
|
|
147
|
+
const widthPx = sidebarCollapsed ? collapsedWidthPx : sidebarWidthPx;
|
|
148
|
+
const showInlineAtClass = BREAKPOINT_MIN_WIDTH_CLASS[sidebarBreakpoint];
|
|
149
|
+
const hideBelowClass = BREAKPOINT_HIDE_BELOW_CLASS[sidebarBreakpoint];
|
|
150
|
+
return (_jsxs(_Fragment, { children: [_jsx("aside", { ref: ref, "data-slot": "app-shell-sidebar", "data-position": sidebarPosition, className: cn("hidden flex-col",
|
|
151
|
+
// Show inline only above the breakpoint.
|
|
152
|
+
showInlineAtClass, hideBelowClass,
|
|
153
|
+
// Pinned to the side; respects sticky header by offsetting top.
|
|
154
|
+
stickyHeader ? "sticky" : "", bordered &&
|
|
155
|
+
(sidebarPosition === "start" ? "border-border border-e" : "border-border border-s"), className), style: {
|
|
156
|
+
width: widthPx,
|
|
157
|
+
transition: "width var(--duration-normal)",
|
|
158
|
+
...(stickyHeader
|
|
159
|
+
? { top: headerHeightPx, height: `calc(100dvh - ${headerHeightPx}px)` }
|
|
160
|
+
: { height: "100dvh" }),
|
|
161
|
+
// Use logical order to put sidebar on the start/end side.
|
|
162
|
+
order: sidebarPosition === "start" ? 0 : 2,
|
|
163
|
+
}, ...props, children: children }), _jsx(MobileSidebarPortal, { open: sidebarOpen, onOpenChange: setSidebarOpen, position: sidebarPosition, children: children })] }));
|
|
164
|
+
});
|
|
165
|
+
AppShellSidebar.displayName = "AppShellSidebar";
|
|
166
|
+
function MobileSidebarPortal({ open, onOpenChange, position, children, }) {
|
|
167
|
+
return (_jsx(Drawer, { open: open, onOpenChange: onOpenChange, children: _jsxs(DrawerPortal, { children: [_jsx(DrawerOverlay, {}), _jsx(DrawerContent, { position: position, size: "sm", "aria-label": "Navigation", className: "p-0", children: children })] }) }));
|
|
168
|
+
}
|
|
169
|
+
const AppShellMain = forwardRef(function AppShellMain({ className, ...props }, ref) {
|
|
170
|
+
const { mainId, sidebarPosition, variant } = useAppShell();
|
|
171
|
+
const hasSidebar = variant === "default" || variant === "sidebar-only";
|
|
172
|
+
return (_jsx("main", { ref: ref, id: mainId, role: "main", "data-slot": "app-shell-main", className: cn("min-w-0 flex-1 overflow-x-hidden focus:outline-none", className), style: hasSidebar ? { order: sidebarPosition === "start" ? 1 : 1 } : undefined,
|
|
173
|
+
// Focus the main on programmatic navigation (skip link target).
|
|
174
|
+
tabIndex: -1, ...props }));
|
|
175
|
+
});
|
|
176
|
+
AppShellMain.displayName = "AppShellMain";
|
|
177
|
+
const AppShellFooter = forwardRef(function AppShellFooter({ className, ...props }, ref) {
|
|
178
|
+
const { variant, bordered } = useAppShell();
|
|
179
|
+
if (variant === "minimal") {
|
|
180
|
+
// Minimal still allows a footer.
|
|
181
|
+
}
|
|
182
|
+
return (_jsx("footer", { ref: ref, role: "contentinfo", "data-slot": "app-shell-footer", className: cn("bg-background w-full", bordered && "border-border border-t", className), style: { order: 3 }, ...props }));
|
|
183
|
+
});
|
|
184
|
+
AppShellFooter.displayName = "AppShellFooter";
|
|
185
|
+
// ===========================================================================
|
|
186
|
+
// Layout container (auto-injected: when AppShell variants need it, consumers
|
|
187
|
+
// can wrap their Header+Sidebar+Main+Footer in <AppShellLayout> for proper
|
|
188
|
+
// flex/grid composition).
|
|
189
|
+
// ===========================================================================
|
|
190
|
+
const AppShellLayout = forwardRef(function AppShellLayout({ className, ...props }, ref) {
|
|
191
|
+
const { variant } = useAppShell();
|
|
192
|
+
// For default/sidebar-only: lay out header on top + (sidebar | main) row.
|
|
193
|
+
// We use a simple flex column with header sticky and a row inside via order tricks.
|
|
194
|
+
// Easiest: grid template based on variant.
|
|
195
|
+
return (_jsx("div", { ref: ref, "data-slot": "app-shell-layout", className: cn("flex w-full", variant === "header-only" || variant === "minimal" ? "min-h-dvh flex-col" : "min-h-dvh", className), ...props }));
|
|
196
|
+
});
|
|
197
|
+
AppShellLayout.displayName = "AppShellLayout";
|
|
198
|
+
export { AppShell, AppShellHeader, AppShellSidebar, AppShellMain, AppShellFooter, AppShellLayout, useAppShell, };
|
|
199
|
+
//# sourceMappingURL=app-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-shell.js","sourceRoot":"","sources":["../../../components/ui/app-shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
type Size = "xs" | "sm" | "md" | "lg" | "xl" | "2xl";
|
|
4
|
+
declare const avatarVariants: (props?: ({
|
|
5
|
+
shape?: "circle" | "rounded" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
type Status = "online" | "offline" | "busy" | "away" | "none";
|
|
8
|
+
type AvatarProps = Omit<React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>, "asChild"> & VariantProps<typeof avatarVariants> & {
|
|
9
|
+
size?: Size;
|
|
10
|
+
status?: Status;
|
|
11
|
+
statusPosition?: "top-end" | "bottom-end";
|
|
12
|
+
};
|
|
13
|
+
declare const Avatar: import("react").ForwardRefExoticComponent<Omit<Omit<AvatarPrimitive.AvatarProps & import("react").RefAttributes<HTMLSpanElement>, "ref">, "asChild"> & VariantProps<(props?: ({
|
|
14
|
+
shape?: "circle" | "rounded" | null | undefined;
|
|
15
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
|
|
16
|
+
size?: Size;
|
|
17
|
+
status?: Status;
|
|
18
|
+
statusPosition?: "top-end" | "bottom-end";
|
|
19
|
+
} & import("react").RefAttributes<HTMLSpanElement>>;
|
|
20
|
+
declare const AvatarImage: import("react").ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & import("react").RefAttributes<HTMLImageElement>, "ref"> & import("react").RefAttributes<HTMLImageElement>>;
|
|
21
|
+
type AvatarFallbackProps = React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> & {
|
|
22
|
+
size?: Size;
|
|
23
|
+
};
|
|
24
|
+
declare const AvatarFallback: import("react").ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & import("react").RefAttributes<HTMLSpanElement>, "ref"> & {
|
|
25
|
+
size?: Size;
|
|
26
|
+
} & import("react").RefAttributes<HTMLSpanElement>>;
|
|
27
|
+
type AvatarGroupProps = Omit<React.HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
28
|
+
size?: Size;
|
|
29
|
+
spacing?: "tight" | "normal" | "loose";
|
|
30
|
+
max?: number;
|
|
31
|
+
children: React.ReactNode;
|
|
32
|
+
};
|
|
33
|
+
declare const AvatarGroup: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLDivElement>, "children"> & {
|
|
34
|
+
size?: Size;
|
|
35
|
+
spacing?: "tight" | "normal" | "loose";
|
|
36
|
+
max?: number;
|
|
37
|
+
children: React.ReactNode;
|
|
38
|
+
} & import("react").RefAttributes<HTMLDivElement>>;
|
|
39
|
+
export { Avatar, AvatarImage, AvatarFallback, AvatarGroup };
|
|
40
|
+
export type { AvatarProps, AvatarFallbackProps, AvatarGroupProps };
|
|
41
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../components/ui/avatar.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAWlE,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;AAwDrD,QAAA,MAAM,cAAc;;8EAanB,CAAC;AAEF,KAAK,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAgB9D,KAAK,WAAW,GAAG,IAAI,CACrB,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,EAC3D,SAAS,CACV,GACC,YAAY,CAAC,OAAO,cAAc,CAAC,GAAG;IACpC,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CAC3C,CAAC;AAEJ,QAAA,MAAM,MAAM;;;WALD,IAAI;aACF,MAAM;qBACE,SAAS,GAAG,YAAY;mDA0C3C,CAAC;AAOH,QAAA,MAAM,WAAW,8LAYf,CAAC;AAGH,KAAK,mBAAmB,GAAG,KAAK,CAAC,wBAAwB,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,GAAG;IAC3F,IAAI,CAAC,EAAE,IAAI,CAAC;CACb,CAAC;AAEF,QAAA,MAAM,cAAc;WAHX,IAAI;mDAoBX,CAAC;AAOH,KAAK,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,GAAG;IAC/E,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AASF,QAAA,MAAM,WAAW;WAbR,IAAI;cACD,OAAO,GAAG,QAAQ,GAAG,OAAO;UAChC,MAAM;cACF,KAAK,CAAC,SAAS;kDA+CzB,CAAC;AAGH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { createContext, forwardRef, useContext, useMemo } from "react";
|
|
4
|
+
import * as AvatarPrimitive from "@radix-ui/react-avatar";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
import { cn } from "@/lib/utils";
|
|
7
|
+
const SIZE_TO_DIM = {
|
|
8
|
+
xs: 24,
|
|
9
|
+
sm: 32,
|
|
10
|
+
md: 40,
|
|
11
|
+
lg: 48,
|
|
12
|
+
xl: 64,
|
|
13
|
+
"2xl": 96,
|
|
14
|
+
};
|
|
15
|
+
const avatarSizeClass = {
|
|
16
|
+
xs: "size-6",
|
|
17
|
+
sm: "size-8",
|
|
18
|
+
md: "size-10",
|
|
19
|
+
lg: "size-12",
|
|
20
|
+
xl: "size-16",
|
|
21
|
+
"2xl": "size-24",
|
|
22
|
+
};
|
|
23
|
+
const statusDotSize = {
|
|
24
|
+
xs: "size-1.5",
|
|
25
|
+
sm: "size-2",
|
|
26
|
+
md: "size-2.5",
|
|
27
|
+
lg: "size-3",
|
|
28
|
+
xl: "size-3.5",
|
|
29
|
+
"2xl": "size-4",
|
|
30
|
+
};
|
|
31
|
+
const fallbackTextSize = {
|
|
32
|
+
xs: "text-[10px]",
|
|
33
|
+
sm: "text-xs",
|
|
34
|
+
md: "text-sm",
|
|
35
|
+
lg: "text-base",
|
|
36
|
+
xl: "text-lg",
|
|
37
|
+
"2xl": "text-2xl",
|
|
38
|
+
};
|
|
39
|
+
const AvatarGroupContext = createContext(null);
|
|
40
|
+
function useAvatarGroupSize() {
|
|
41
|
+
return useContext(AvatarGroupContext)?.size;
|
|
42
|
+
}
|
|
43
|
+
// ----------------------------------------------------------------------------
|
|
44
|
+
// Avatar (root)
|
|
45
|
+
// ----------------------------------------------------------------------------
|
|
46
|
+
const avatarVariants = cva("relative inline-flex shrink-0 overflow-hidden border-2 border-background bg-muted text-muted-foreground", {
|
|
47
|
+
variants: {
|
|
48
|
+
shape: {
|
|
49
|
+
circle: "rounded-full",
|
|
50
|
+
rounded: "rounded-md",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
defaultVariants: {
|
|
54
|
+
shape: "circle",
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
const statusLabel = {
|
|
58
|
+
online: "Online",
|
|
59
|
+
offline: "Offline",
|
|
60
|
+
busy: "Busy",
|
|
61
|
+
away: "Away",
|
|
62
|
+
};
|
|
63
|
+
const statusBgClass = {
|
|
64
|
+
online: "bg-success",
|
|
65
|
+
offline: "bg-muted-foreground",
|
|
66
|
+
busy: "bg-destructive",
|
|
67
|
+
away: "bg-warning",
|
|
68
|
+
};
|
|
69
|
+
const Avatar = forwardRef(function Avatar({ className, size, shape, status = "none", statusPosition = "bottom-end", children, ...props }, ref) {
|
|
70
|
+
const groupSize = useAvatarGroupSize();
|
|
71
|
+
const resolvedSize = size ?? groupSize ?? "md";
|
|
72
|
+
return (_jsxs(AvatarPrimitive.Root, { ref: ref, className: cn(avatarVariants({ shape }), avatarSizeClass[resolvedSize], className), ...props, children: [children, status !== "none" ? (_jsx("span", { "aria-hidden": "true", className: cn("absolute block rounded-full ring-2 ring-background", statusBgClass[status], statusDotSize[resolvedSize], statusPosition === "top-end" ? "top-0 end-0" : "bottom-0 end-0") })) : null, status !== "none" ? _jsx("span", { className: "sr-only", children: statusLabel[status] }) : null] }));
|
|
73
|
+
});
|
|
74
|
+
Avatar.displayName = "Avatar";
|
|
75
|
+
// ----------------------------------------------------------------------------
|
|
76
|
+
// AvatarImage / AvatarFallback — thin Radix wrappers with default classes.
|
|
77
|
+
// ----------------------------------------------------------------------------
|
|
78
|
+
const AvatarImage = forwardRef(function AvatarImage({ className, alt, ...props }, ref) {
|
|
79
|
+
return (_jsx(AvatarPrimitive.Image, { ref: ref, alt: alt, className: cn("aspect-square h-full w-full object-cover", className), ...props }));
|
|
80
|
+
});
|
|
81
|
+
AvatarImage.displayName = "AvatarImage";
|
|
82
|
+
const AvatarFallback = forwardRef(function AvatarFallback({ className, size, ...props }, ref) {
|
|
83
|
+
const groupSize = useAvatarGroupSize();
|
|
84
|
+
const resolved = size ?? groupSize ?? "md";
|
|
85
|
+
return (_jsx(AvatarPrimitive.Fallback, { ref: ref, className: cn("flex h-full w-full items-center justify-center bg-muted font-medium text-muted-foreground select-none", fallbackTextSize[resolved], className), ...props }));
|
|
86
|
+
});
|
|
87
|
+
AvatarFallback.displayName = "AvatarFallback";
|
|
88
|
+
const spacingMargin = {
|
|
89
|
+
// Negative margin-inline-start — RTL flips automatically.
|
|
90
|
+
tight: "[&>*+*]:-ms-3",
|
|
91
|
+
normal: "[&>*+*]:-ms-2",
|
|
92
|
+
loose: "[&>*+*]:-ms-1",
|
|
93
|
+
};
|
|
94
|
+
const AvatarGroup = forwardRef(function AvatarGroup({ className, size, spacing = "normal", max, children, ...props }, ref) {
|
|
95
|
+
const ctx = useMemo(() => ({ size }), [size]);
|
|
96
|
+
const items = (Array.isArray(children) ? children : [children]).filter(Boolean);
|
|
97
|
+
const visible = max !== undefined ? items.slice(0, max) : items;
|
|
98
|
+
const hidden = max !== undefined ? Math.max(0, items.length - max) : 0;
|
|
99
|
+
const dim = SIZE_TO_DIM[size ?? "md"];
|
|
100
|
+
return (_jsx(AvatarGroupContext.Provider, { value: ctx, children: _jsxs("div", { ref: ref, className: cn("inline-flex isolate", spacingMargin[spacing], className), ...props, children: [visible, hidden > 0 ? (_jsxs("span", { role: "status", "aria-label": `${hidden} more`, className: cn("relative inline-flex shrink-0 items-center justify-center rounded-full", "border-2 border-background bg-muted text-muted-foreground font-medium", avatarSizeClass[size ?? "md"], fallbackTextSize[size ?? "md"]), style: { width: dim, height: dim }, children: ["+", hidden] })) : null] }) }));
|
|
101
|
+
});
|
|
102
|
+
AvatarGroup.displayName = "AvatarGroup";
|
|
103
|
+
export { Avatar, AvatarImage, AvatarFallback, AvatarGroup };
|
|
104
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../components/ui/avatar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAWjC,MAAM,WAAW,GAAyB;IACxC,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,KAAK,EAAE,EAAE;CACV,CAAC;AAEF,MAAM,eAAe,GAAyB;IAC5C,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,MAAM,aAAa,GAAyB;IAC1C,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,UAAU;IACd,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,UAAU;IACd,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,MAAM,gBAAgB,GAAyB;IAC7C,EAAE,EAAE,aAAa;IACjB,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,SAAS;IACb,EAAE,EAAE,WAAW;IACf,EAAE,EAAE,SAAS;IACb,KAAK,EAAE,UAAU;CAClB,CAAC;AAUF,MAAM,kBAAkB,GAAG,aAAa,CAAiC,IAAI,CAAC,CAAC;AAE/E,SAAS,kBAAkB;IACzB,OAAO,UAAU,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC;AAC9C,CAAC;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,MAAM,cAAc,GAAG,GAAG,CACxB,yGAAyG,EACzG;IACE,QAAQ,EAAE;QACR,KAAK,EAAE;YACL,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,YAAY;SACtB;KACF;IACD,eAAe,EAAE;QACf,KAAK,EAAE,QAAQ;KAChB;CACF,CACF,CAAC;AAIF,MAAM,WAAW,GAA4C;IAC3D,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAC;AAEF,MAAM,aAAa,GAA4C;IAC7D,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,qBAAqB;IAC9B,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,YAAY;CACnB,CAAC;AAYF,MAAM,MAAM,GAAG,UAAU,CAGvB,SAAS,MAAM,CACf,EACE,SAAS,EACT,IAAI,EACJ,KAAK,EACL,MAAM,GAAG,MAAM,EACf,cAAc,GAAG,YAAY,EAC7B,QAAQ,EACR,GAAG,KAAK,EACT,EACD,GAAG;IAEH,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,YAAY,GAAS,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC;IAErD,OAAO,CACL,MAAC,eAAe,CAAC,IAAI,IACnB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,KAC9E,KAAK,aAER,QAAQ,EACR,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CACnB,8BACc,MAAM,EAClB,SAAS,EAAE,EAAE,CACX,oDAAoD,EACpD,aAAa,CAAC,MAAM,CAAC,EACrB,aAAa,CAAC,YAAY,CAAC,EAC3B,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,gBAAgB,CAChE,GACD,CACH,CAAC,CAAC,CAAC,IAAI,EACP,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,SAAS,YAAE,WAAW,CAAC,MAAM,CAAC,GAAQ,CAAC,CAAC,CAAC,IAAI,IAC7D,CACxB,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC;AAE9B,+EAA+E;AAC/E,2EAA2E;AAC3E,+EAA+E;AAE/E,MAAM,WAAW,GAAG,UAAU,CAG5B,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IACtD,OAAO,CACL,KAAC,eAAe,CAAC,KAAK,IACpB,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,0CAA0C,EAAE,SAAS,CAAC,KAChE,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAMxC,MAAM,cAAc,GAAG,UAAU,CAG/B,SAAS,cAAc,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG;IAC1D,MAAM,SAAS,GAAG,kBAAkB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAS,IAAI,IAAI,SAAS,IAAI,IAAI,CAAC;IACjD,OAAO,CACL,KAAC,eAAe,CAAC,QAAQ,IACvB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,uGAAuG,EACvG,gBAAgB,CAAC,QAAQ,CAAC,EAC1B,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC;AAa9C,MAAM,aAAa,GAAiD;IAClE,0DAA0D;IAC1D,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,eAAe;IACvB,KAAK,EAAE,eAAe;CACvB,CAAC;AAEF,MAAM,WAAW,GAAG,UAAU,CAAmC,SAAS,WAAW,CACnF,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAChE,GAAG;IAEH,MAAM,GAAG,GAAG,OAAO,CAA0B,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,MAAM,MAAM,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAEtC,OAAO,CACL,KAAC,kBAAkB,CAAC,QAAQ,IAAC,KAAK,EAAE,GAAG,YACrC,eACE,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,qBAAqB,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,KACnE,KAAK,aAER,OAAO,EACP,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACZ,gBACE,IAAI,EAAC,QAAQ,gBACD,GAAG,MAAM,OAAO,EAC5B,SAAS,EAAE,EAAE,CACX,wEAAwE,EACxE,uEAAuE,EACvE,eAAe,CAAC,IAAI,IAAI,IAAI,CAAC,EAC7B,gBAAgB,CAAC,IAAI,IAAI,IAAI,CAAC,CAC/B,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,kBAEhC,MAAM,IACH,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,GACsB,CAC/B,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,WAAW,CAAC,WAAW,GAAG,aAAa,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
declare const badgeVariants: (props?: ({
|
|
3
|
+
variant?: "default" | "secondary" | "outline" | "destructive" | "success" | "warning" | "info" | null | undefined;
|
|
4
|
+
size?: "sm" | "md" | "lg" | "xs" | null | undefined;
|
|
5
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
6
|
+
type BadgeVariants = VariantProps<typeof badgeVariants>;
|
|
7
|
+
type BadgeProps = Omit<React.HTMLAttributes<HTMLSpanElement>, "children"> & BadgeVariants & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
dot?: boolean;
|
|
10
|
+
icon?: React.ReactNode;
|
|
11
|
+
removable?: boolean;
|
|
12
|
+
onRemove?: () => void;
|
|
13
|
+
pulse?: boolean;
|
|
14
|
+
children?: React.ReactNode;
|
|
15
|
+
};
|
|
16
|
+
declare const Badge: import("react").ForwardRefExoticComponent<Omit<import("react").HTMLAttributes<HTMLSpanElement>, "children"> & BadgeVariants & {
|
|
17
|
+
asChild?: boolean;
|
|
18
|
+
dot?: boolean;
|
|
19
|
+
icon?: React.ReactNode;
|
|
20
|
+
removable?: boolean;
|
|
21
|
+
onRemove?: () => void;
|
|
22
|
+
pulse?: boolean;
|
|
23
|
+
children?: React.ReactNode;
|
|
24
|
+
} & import("react").RefAttributes<HTMLSpanElement>>;
|
|
25
|
+
export { Badge, badgeVariants };
|
|
26
|
+
export type { BadgeProps };
|
|
27
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../../components/ui/badge.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAMlE,QAAA,MAAM,aAAa;;;8EA0BlB,CAAC;AAyBF,KAAK,aAAa,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAExD,KAAK,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC,EAAE,UAAU,CAAC,GACvE,aAAa,GAAG;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEJ,QAAA,MAAM,KAAK;cATG,OAAO;UACX,OAAO;WACN,KAAK,CAAC,SAAS;gBACV,OAAO;eACR,MAAM,IAAI;YACb,OAAO;eACJ,KAAK,CAAC,SAAS;mDAqE5B,CAAC;AAGH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;AAChC,YAAY,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { forwardRef } from "react";
|
|
4
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
5
|
+
import { RiCloseLine } from "@remixicon/react";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import { cn } from "@/lib/utils";
|
|
8
|
+
// Per docs/emara-ui-phase-1-components.md §6.
|
|
9
|
+
const badgeVariants = cva([
|
|
10
|
+
"inline-flex items-center gap-1 font-medium select-none",
|
|
11
|
+
"rounded-full border whitespace-nowrap",
|
|
12
|
+
"transition-colors",
|
|
13
|
+
].join(" "), {
|
|
14
|
+
variants: {
|
|
15
|
+
variant: {
|
|
16
|
+
default: "border-transparent bg-primary text-primary-foreground",
|
|
17
|
+
secondary: "border-transparent bg-secondary text-secondary-foreground",
|
|
18
|
+
destructive: "border-transparent bg-destructive text-destructive-foreground",
|
|
19
|
+
outline: "border-border text-foreground",
|
|
20
|
+
success: "border-transparent bg-success text-primary-foreground",
|
|
21
|
+
warning: "border-transparent bg-warning text-primary-foreground",
|
|
22
|
+
info: "border-transparent bg-info text-primary-foreground",
|
|
23
|
+
},
|
|
24
|
+
size: {
|
|
25
|
+
xs: "h-4 px-1.5 text-[10px] leading-none",
|
|
26
|
+
sm: "h-5 px-2 text-xs leading-none",
|
|
27
|
+
md: "h-6 px-2.5 text-xs leading-none",
|
|
28
|
+
lg: "h-7 px-3 text-sm leading-none",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
defaultVariants: { variant: "default", size: "md" },
|
|
32
|
+
});
|
|
33
|
+
// Per-variant dot color (the dot inherits the variant's foreground for
|
|
34
|
+
// outline; otherwise uses currentColor at full opacity).
|
|
35
|
+
const dotVariants = cva("inline-block size-1.5 rounded-full me-1", {
|
|
36
|
+
variants: {
|
|
37
|
+
variant: {
|
|
38
|
+
default: "bg-primary-foreground/90",
|
|
39
|
+
secondary: "bg-secondary-foreground/80",
|
|
40
|
+
destructive: "bg-destructive-foreground/90",
|
|
41
|
+
outline: "bg-foreground/80",
|
|
42
|
+
success: "bg-primary-foreground/90",
|
|
43
|
+
warning: "bg-primary-foreground/90",
|
|
44
|
+
info: "bg-primary-foreground/90",
|
|
45
|
+
},
|
|
46
|
+
size: {
|
|
47
|
+
xs: "size-1",
|
|
48
|
+
sm: "size-1.5",
|
|
49
|
+
md: "size-1.5",
|
|
50
|
+
lg: "size-2",
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
defaultVariants: { variant: "default", size: "md" },
|
|
54
|
+
});
|
|
55
|
+
const Badge = forwardRef(function Badge({ className, variant, size, asChild = false, dot = false, icon, removable = false, onRemove, pulse = false, children, ...props }, ref) {
|
|
56
|
+
const Comp = asChild ? Slot : "span";
|
|
57
|
+
const innerContent = (_jsxs(_Fragment, { children: [dot ? (_jsxs("span", { "aria-hidden": "true", className: "relative inline-flex", children: [_jsx("span", { className: cn(dotVariants({ variant, size })) }), pulse ? (_jsx("span", { "aria-hidden": "true", className: cn(dotVariants({ variant, size }), "absolute inset-0 me-0 animate-ping opacity-75") })) : null] })) : null, icon ? (_jsx("span", { "aria-hidden": "true", className: "me-1 inline-flex [&_svg]:size-3.5 [&_svg]:shrink-0", children: icon })) : null, _jsx("span", { children: children }), removable ? (_jsx("button", { type: "button", "aria-label": "Remove", onClick: (e) => {
|
|
58
|
+
e.stopPropagation();
|
|
59
|
+
onRemove?.();
|
|
60
|
+
}, className: cn("ms-1 inline-flex items-center justify-center rounded-full p-0.5", "hover:bg-foreground/10", "focus-visible:ring-ring focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:outline-none", "[&_svg]:size-3 [&_svg]:shrink-0"), children: _jsx(RiCloseLine, {}) })) : null] }));
|
|
61
|
+
return (_jsx(Comp, { ref: ref, className: cn(badgeVariants({ variant, size }), className), ...props, children: asChild ? children : innerContent }));
|
|
62
|
+
});
|
|
63
|
+
Badge.displayName = "Badge";
|
|
64
|
+
export { Badge, badgeVariants };
|
|
65
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../../components/ui/badge.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
declare const breadcrumbVariants: (props?: ({
|
|
3
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
4
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
5
|
+
type BreadcrumbVariants = VariantProps<typeof breadcrumbVariants>;
|
|
6
|
+
type BreadcrumbProps = React.HTMLAttributes<HTMLElement> & BreadcrumbVariants;
|
|
7
|
+
declare const Breadcrumb: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLElement> & BreadcrumbVariants & import("react").RefAttributes<HTMLElement>>;
|
|
8
|
+
declare const BreadcrumbList: import("react").ForwardRefExoticComponent<import("react").OlHTMLAttributes<HTMLOListElement> & import("react").RefAttributes<HTMLOListElement>>;
|
|
9
|
+
declare const BreadcrumbItem: import("react").ForwardRefExoticComponent<import("react").LiHTMLAttributes<HTMLLIElement> & import("react").RefAttributes<HTMLLIElement>>;
|
|
10
|
+
type BreadcrumbLinkProps = React.AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
11
|
+
asChild?: boolean;
|
|
12
|
+
};
|
|
13
|
+
declare const BreadcrumbLink: import("react").ForwardRefExoticComponent<import("react").AnchorHTMLAttributes<HTMLAnchorElement> & {
|
|
14
|
+
asChild?: boolean;
|
|
15
|
+
} & import("react").RefAttributes<HTMLAnchorElement>>;
|
|
16
|
+
declare const BreadcrumbPage: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLSpanElement> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
17
|
+
declare const BreadcrumbSeparator: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLLIElement> & import("react").RefAttributes<HTMLLIElement>>;
|
|
18
|
+
declare const BreadcrumbEllipsis: import("react").ForwardRefExoticComponent<import("react").HTMLAttributes<HTMLSpanElement> & import("react").RefAttributes<HTMLSpanElement>>;
|
|
19
|
+
interface BreadcrumbsItem {
|
|
20
|
+
label: React.ReactNode;
|
|
21
|
+
href?: string;
|
|
22
|
+
icon?: React.ReactNode;
|
|
23
|
+
}
|
|
24
|
+
interface BreadcrumbsProps extends BreadcrumbVariants {
|
|
25
|
+
items: BreadcrumbsItem[];
|
|
26
|
+
separator?: React.ReactNode;
|
|
27
|
+
maxItems?: number;
|
|
28
|
+
itemsBeforeCollapse?: number;
|
|
29
|
+
itemsAfterCollapse?: number;
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
declare const Breadcrumbs: import("react").ForwardRefExoticComponent<BreadcrumbsProps & import("react").RefAttributes<HTMLElement>>;
|
|
33
|
+
export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, Breadcrumbs, breadcrumbVariants, };
|
|
34
|
+
export type { BreadcrumbProps, BreadcrumbLinkProps, BreadcrumbsItem, BreadcrumbsProps, };
|
|
35
|
+
//# sourceMappingURL=breadcrumb.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumb.d.ts","sourceRoot":"","sources":["../../../components/ui/breadcrumb.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAgBlE,QAAA,MAAM,kBAAkB;;8EAStB,CAAC;AAEH,KAAK,kBAAkB,GAAG,YAAY,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAElE,KAAK,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,kBAAkB,CAAC;AAE9E,QAAA,MAAM,UAAU,0JAYd,CAAC;AAGH,QAAA,MAAM,cAAc,iJAanB,CAAC;AAGF,QAAA,MAAM,cAAc,2IAUnB,CAAC;AAGF,KAAK,mBAAmB,GAAG,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,QAAA,MAAM,cAAc;cAHR,OAAO;qDAkBlB,CAAC;AAGF,QAAA,MAAM,cAAc,6IAiBnB,CAAC;AAGF,QAAA,MAAM,mBAAmB,yIAiBxB,CAAC;AAGF,QAAA,MAAM,kBAAkB,6IAkBvB,CAAC;AAOF,UAAU,eAAe;IACvB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,UAAU,gBAAiB,SAAQ,kBAAkB;IACnD,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,WAAW,0GAoGf,CAAC;AAGH,OAAO,EACL,UAAU,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,kBAAkB,GACnB,CAAC;AACF,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,GACjB,CAAC"}
|