@skylab-kulubu/skylcn-ui 0.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/LICENSE +21 -0
- package/README.md +100 -0
- package/dist/assets/skylab-mark.d.ts +5 -0
- package/dist/assets/skylab-mark.d.ts.map +1 -0
- package/dist/assets/skylab-mark.js +29 -0
- package/dist/assets/skylab-mark.js.map +1 -0
- package/dist/charts/chart-frame.d.ts +42 -0
- package/dist/charts/chart-frame.d.ts.map +1 -0
- package/dist/charts/chart-frame.js +33 -0
- package/dist/charts/chart-frame.js.map +1 -0
- package/dist/charts/charts.d.ts +84 -0
- package/dist/charts/charts.d.ts.map +1 -0
- package/dist/charts/charts.js +194 -0
- package/dist/charts/charts.js.map +1 -0
- package/dist/charts/index.d.ts +3 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +3 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/components/accordion.d.ts +7 -0
- package/dist/components/accordion.d.ts.map +1 -0
- package/dist/components/accordion.js +17 -0
- package/dist/components/accordion.js.map +1 -0
- package/dist/components/app-shell.d.ts +96 -0
- package/dist/components/app-shell.d.ts.map +1 -0
- package/dist/components/app-shell.js +191 -0
- package/dist/components/app-shell.js.map +1 -0
- package/dist/components/avatar.d.ts +28 -0
- package/dist/components/avatar.d.ts.map +1 -0
- package/dist/components/avatar.js +26 -0
- package/dist/components/avatar.js.map +1 -0
- package/dist/components/badge.d.ts +41 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +42 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/bar-list.d.ts +33 -0
- package/dist/components/bar-list.d.ts.map +1 -0
- package/dist/components/bar-list.js +31 -0
- package/dist/components/bar-list.js.map +1 -0
- package/dist/components/breadcrumbs.d.ts +16 -0
- package/dist/components/breadcrumbs.d.ts.map +1 -0
- package/dist/components/breadcrumbs.js +21 -0
- package/dist/components/breadcrumbs.js.map +1 -0
- package/dist/components/button.d.ts +30 -0
- package/dist/components/button.d.ts.map +1 -0
- package/dist/components/button.js +51 -0
- package/dist/components/button.js.map +1 -0
- package/dist/components/calendar.d.ts +44 -0
- package/dist/components/calendar.d.ts.map +1 -0
- package/dist/components/calendar.js +93 -0
- package/dist/components/calendar.js.map +1 -0
- package/dist/components/card.d.ts +38 -0
- package/dist/components/card.d.ts.map +1 -0
- package/dist/components/card.js +38 -0
- package/dist/components/card.js.map +1 -0
- package/dist/components/carousel.d.ts +42 -0
- package/dist/components/carousel.d.ts.map +1 -0
- package/dist/components/carousel.js +92 -0
- package/dist/components/carousel.js.map +1 -0
- package/dist/components/checkbox.d.ts +3 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +9 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/command.d.ts +31 -0
- package/dist/components/command.d.ts.map +1 -0
- package/dist/components/command.js +91 -0
- package/dist/components/command.js.map +1 -0
- package/dist/components/copy-button.d.ts +10 -0
- package/dist/components/copy-button.d.ts.map +1 -0
- package/dist/components/copy-button.js +23 -0
- package/dist/components/copy-button.js.map +1 -0
- package/dist/components/data-list.d.ts +70 -0
- package/dist/components/data-list.d.ts.map +1 -0
- package/dist/components/data-list.js +119 -0
- package/dist/components/data-list.js.map +1 -0
- package/dist/components/dialog.d.ts +41 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +49 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/display-extra.d.ts +91 -0
- package/dist/components/display-extra.d.ts.map +1 -0
- package/dist/components/display-extra.js +91 -0
- package/dist/components/display-extra.js.map +1 -0
- package/dist/components/drawer.d.ts +22 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +50 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/feedback.d.ts +63 -0
- package/dist/components/feedback.d.ts.map +1 -0
- package/dist/components/feedback.js +59 -0
- package/dist/components/feedback.js.map +1 -0
- package/dist/components/field.d.ts +21 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +38 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/form-extra.d.ts +58 -0
- package/dist/components/form-extra.d.ts.map +1 -0
- package/dist/components/form-extra.js +51 -0
- package/dist/components/form-extra.js.map +1 -0
- package/dist/components/icon-swap.d.ts +15 -0
- package/dist/components/icon-swap.d.ts.map +1 -0
- package/dist/components/icon-swap.js +13 -0
- package/dist/components/icon-swap.js.map +1 -0
- package/dist/components/list.d.ts +43 -0
- package/dist/components/list.d.ts.map +1 -0
- package/dist/components/list.js +30 -0
- package/dist/components/list.js.map +1 -0
- package/dist/components/menu.d.ts +41 -0
- package/dist/components/menu.d.ts.map +1 -0
- package/dist/components/menu.js +67 -0
- package/dist/components/menu.js.map +1 -0
- package/dist/components/month-calendar.d.ts +38 -0
- package/dist/components/month-calendar.d.ts.map +1 -0
- package/dist/components/month-calendar.js +64 -0
- package/dist/components/month-calendar.js.map +1 -0
- package/dist/components/motion.d.ts +43 -0
- package/dist/components/motion.d.ts.map +1 -0
- package/dist/components/motion.js +56 -0
- package/dist/components/motion.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +28 -0
- package/dist/components/navigation-menu.d.ts.map +1 -0
- package/dist/components/navigation-menu.js +26 -0
- package/dist/components/navigation-menu.js.map +1 -0
- package/dist/components/page-header.d.ts +45 -0
- package/dist/components/page-header.d.ts.map +1 -0
- package/dist/components/page-header.js +37 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/pagination.d.ts +19 -0
- package/dist/components/pagination.d.ts.map +1 -0
- package/dist/components/pagination.js +70 -0
- package/dist/components/pagination.js.map +1 -0
- package/dist/components/popover.d.ts +10 -0
- package/dist/components/popover.d.ts.map +1 -0
- package/dist/components/popover.js +15 -0
- package/dist/components/popover.js.map +1 -0
- package/dist/components/preview-card.d.ts +11 -0
- package/dist/components/preview-card.d.ts.map +1 -0
- package/dist/components/preview-card.js +18 -0
- package/dist/components/preview-card.js.map +1 -0
- package/dist/components/proportion-bar.d.ts +16 -0
- package/dist/components/proportion-bar.d.ts.map +1 -0
- package/dist/components/proportion-bar.js +20 -0
- package/dist/components/proportion-bar.js.map +1 -0
- package/dist/components/radio-group.d.ts +11 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +13 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/reveal.d.ts +19 -0
- package/dist/components/reveal.d.ts.map +1 -0
- package/dist/components/reveal.js +25 -0
- package/dist/components/reveal.js.map +1 -0
- package/dist/components/segmented-control.d.ts +16 -0
- package/dist/components/segmented-control.d.ts.map +1 -0
- package/dist/components/segmented-control.js +21 -0
- package/dist/components/segmented-control.js.map +1 -0
- package/dist/components/select.d.ts +25 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +33 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/side-nav.d.ts +33 -0
- package/dist/components/side-nav.d.ts.map +1 -0
- package/dist/components/side-nav.js +52 -0
- package/dist/components/side-nav.js.map +1 -0
- package/dist/components/skeleton.d.ts +4 -0
- package/dist/components/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton.js +7 -0
- package/dist/components/skeleton.js.map +1 -0
- package/dist/components/skylab-loader.d.ts +10 -0
- package/dist/components/skylab-loader.d.ts.map +1 -0
- package/dist/components/skylab-loader.js +12 -0
- package/dist/components/skylab-loader.js.map +1 -0
- package/dist/components/sparkline.d.ts +12 -0
- package/dist/components/sparkline.d.ts.map +1 -0
- package/dist/components/sparkline.js +26 -0
- package/dist/components/sparkline.js.map +1 -0
- package/dist/components/state-card.d.ts +27 -0
- package/dist/components/state-card.d.ts.map +1 -0
- package/dist/components/state-card.js +17 -0
- package/dist/components/state-card.js.map +1 -0
- package/dist/components/switch.d.ts +15 -0
- package/dist/components/switch.d.ts.map +1 -0
- package/dist/components/switch.js +12 -0
- package/dist/components/switch.js.map +1 -0
- package/dist/components/tabs.d.ts +8 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +17 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/toast.d.ts +17 -0
- package/dist/components/toast.d.ts.map +1 -0
- package/dist/components/toast.js +30 -0
- package/dist/components/toast.js.map +1 -0
- package/dist/components/tooltip.d.ts +15 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +13 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/tree.d.ts +26 -0
- package/dist/components/tree.d.ts.map +1 -0
- package/dist/components/tree.js +92 -0
- package/dist/components/tree.js.map +1 -0
- package/dist/components/trend-badge.d.ts +13 -0
- package/dist/components/trend-badge.d.ts.map +1 -0
- package/dist/components/trend-badge.js +22 -0
- package/dist/components/trend-badge.js.map +1 -0
- package/dist/data-table/data-table.d.ts +59 -0
- package/dist/data-table/data-table.d.ts.map +1 -0
- package/dist/data-table/data-table.js +207 -0
- package/dist/data-table/data-table.js.map +1 -0
- package/dist/data-table/index.d.ts +2 -0
- package/dist/data-table/index.d.ts.map +1 -0
- package/dist/data-table/index.js +2 -0
- package/dist/data-table/index.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.d.ts +2 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +2 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/motion-preference.d.ts +11 -0
- package/dist/lib/motion-preference.d.ts.map +1 -0
- package/dist/lib/motion-preference.js +42 -0
- package/dist/lib/motion-preference.js.map +1 -0
- package/dist/lib/motion-tokens.d.ts +55 -0
- package/dist/lib/motion-tokens.d.ts.map +1 -0
- package/dist/lib/motion-tokens.js +26 -0
- package/dist/lib/motion-tokens.js.map +1 -0
- package/dist/lib/motion.d.ts +3 -0
- package/dist/lib/motion.d.ts.map +1 -0
- package/dist/lib/motion.js +19 -0
- package/dist/lib/motion.js.map +1 -0
- package/dist/lib/provider.d.ts +160 -0
- package/dist/lib/provider.d.ts.map +1 -0
- package/dist/lib/provider.js +156 -0
- package/dist/lib/provider.js.map +1 -0
- package/dist/lib/theme-script.d.ts +15 -0
- package/dist/lib/theme-script.d.ts.map +1 -0
- package/dist/lib/theme-script.js +15 -0
- package/dist/lib/theme-script.js.map +1 -0
- package/dist/lib/theme.d.ts +13 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +78 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/use-pending-indicator.d.ts +7 -0
- package/dist/lib/use-pending-indicator.d.ts.map +1 -0
- package/dist/lib/use-pending-indicator.js +27 -0
- package/dist/lib/use-pending-indicator.js.map +1 -0
- package/dist/lib/use-reduced-motion.d.ts +7 -0
- package/dist/lib/use-reduced-motion.d.ts.map +1 -0
- package/dist/lib/use-reduced-motion.js +28 -0
- package/dist/lib/use-reduced-motion.js.map +1 -0
- package/dist/styles/theme.css +368 -0
- package/dist/styles/tokens.css +248 -0
- package/package.json +90 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Accordion as AccordionPrimitive } from '@base-ui/react/accordion';
|
|
2
|
+
export declare function Accordion({ className, ...props }: AccordionPrimitive.Root.Props): import("react").JSX.Element;
|
|
3
|
+
export declare const AccordionItem: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").AccordionItemProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
|
|
4
|
+
export declare function AccordionTrigger({ className, children, ...props }: AccordionPrimitive.Trigger.Props): import("react").JSX.Element;
|
|
5
|
+
/** Opens to its natural height; reduced motion leaves the fade. */
|
|
6
|
+
export declare function AccordionPanel({ className, children, ...props }: AccordionPrimitive.Panel.Props): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=accordion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../src/components/accordion.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAI3E,wBAAgB,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,+BAQ/E;AAED,eAAO,MAAM,aAAa,qJAA0B,CAAC;AAErD,wBAAgB,gBAAgB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,kBAAkB,CAAC,OAAO,CAAC,KAAK,+BAgBlC;AAED,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,KAAK,+BAW/F"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Accordion as AccordionPrimitive } from '@base-ui/react/accordion';
|
|
4
|
+
import { ChevronDown } from 'lucide-react';
|
|
5
|
+
import { cn } from '../lib/cn.js';
|
|
6
|
+
export function Accordion({ className, ...props }) {
|
|
7
|
+
return (_jsx(AccordionPrimitive.Root, { "data-slot": "accordion", className: cn('flex flex-col divide-y divide-border-subtle', className), ...props }));
|
|
8
|
+
}
|
|
9
|
+
export const AccordionItem = AccordionPrimitive.Item;
|
|
10
|
+
export function AccordionTrigger({ className, children, ...props }) {
|
|
11
|
+
return (_jsx(AccordionPrimitive.Header, { children: _jsxs(AccordionPrimitive.Trigger, { className: cn('group flex w-full items-center justify-between gap-3 py-3 text-left text-sm font-medium text-foreground outline-hidden', 'rounded-md focus-visible:ring-2 focus-visible:ring-ring', className), ...props, children: [children, _jsx(ChevronDown, { className: "size-4 shrink-0 text-subtle-foreground transition-transform duration-(--motion-duration-base) ease-enter group-data-panel-open:rotate-180" })] }) }));
|
|
12
|
+
}
|
|
13
|
+
/** Opens to its natural height; reduced motion leaves the fade. */
|
|
14
|
+
export function AccordionPanel({ className, children, ...props }) {
|
|
15
|
+
return (_jsx(AccordionPrimitive.Panel, { className: "h-(--accordion-panel-height) overflow-hidden transition-[height,opacity] duration-(--motion-duration-slow) ease-enter data-ending-style:h-0 data-ending-style:opacity-0 data-starting-style:h-0 data-starting-style:opacity-0 motion-reduce:duration-(--motion-duration-base)", ...props, children: _jsx("div", { className: cn('pb-3 text-xs leading-relaxed text-muted-foreground', className), children: children }) }));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=accordion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accordion.js","sourceRoot":"","sources":["../../src/components/accordion.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAiC;IAC9E,OAAO,CACL,KAAC,kBAAkB,CAAC,IAAI,iBACZ,WAAW,EACrB,SAAS,EAAE,EAAE,CAAC,6CAA6C,EAAE,SAAS,CAAC,KACnE,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC;AAErD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACyB;IACjC,OAAO,CACL,KAAC,kBAAkB,CAAC,MAAM,cACxB,MAAC,kBAAkB,CAAC,OAAO,IACzB,SAAS,EAAE,EAAE,CACX,wHAAwH,EACxH,yDAAyD,EACzD,SAAS,CACV,KACG,KAAK,aAER,QAAQ,EACT,KAAC,WAAW,IAAC,SAAS,EAAC,2IAA2I,GAAG,IAC1I,GACH,CAC7B,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAkC;IAC9F,OAAO,CACL,KAAC,kBAAkB,CAAC,KAAK,IACvB,SAAS,EAAC,+QAA+Q,KACrR,KAAK,YAET,cAAK,SAAS,EAAE,EAAE,CAAC,oDAAoD,EAAE,SAAS,CAAC,YAChF,QAAQ,GACL,GACmB,CAC5B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { type LucideIcon } from 'lucide-react';
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
/** Whether the sidebar is drawn as an icon rail, and whether it sits in the mobile drawer. */
|
|
4
|
+
export declare function useSidebar(): {
|
|
5
|
+
setCollapsed: (next: boolean) => void;
|
|
6
|
+
closeDrawer: () => void;
|
|
7
|
+
collapsed: boolean;
|
|
8
|
+
inDrawer: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type AppShellProps = {
|
|
11
|
+
/** The sidebar content: brand, sections, items, footer. Drawn on desktop and in the mobile drawer. */
|
|
12
|
+
sidebar: ReactNode;
|
|
13
|
+
/** The header row content, usually breadcrumbs. */
|
|
14
|
+
header?: ReactNode;
|
|
15
|
+
defaultCollapsed?: boolean;
|
|
16
|
+
/** Where the collapsed choice is remembered; `null` turns remembering off. */
|
|
17
|
+
storageKey?: string | null;
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* The admin frame shared by every console: a sidebar that collapses to an icon
|
|
22
|
+
* rail (Ctrl/⌘+B), a rounded content panel with a header row, and on phones a
|
|
23
|
+
* sticky top bar with the sidebar in a drawer.
|
|
24
|
+
*/
|
|
25
|
+
export declare function AppShell({ sidebar, header, defaultCollapsed, storageKey, children, }: AppShellProps): import("react").JSX.Element;
|
|
26
|
+
/** Renders page actions into the shell header, on desktop and on phones alike. */
|
|
27
|
+
export declare function AppShellActions({ children }: {
|
|
28
|
+
children: ReactNode;
|
|
29
|
+
}): import("react").ReactPortal | null;
|
|
30
|
+
/** The SKY LAB mark as a still image, for brand slots. */
|
|
31
|
+
export declare function SkylabMark({ size, className }: {
|
|
32
|
+
size?: number;
|
|
33
|
+
className?: string;
|
|
34
|
+
}): import("react").JSX.Element;
|
|
35
|
+
export type ClubConsole = {
|
|
36
|
+
id: string;
|
|
37
|
+
label: string;
|
|
38
|
+
href: string;
|
|
39
|
+
icon?: LucideIcon;
|
|
40
|
+
/** A short line under the name, such as what the console is for. */
|
|
41
|
+
description?: string;
|
|
42
|
+
};
|
|
43
|
+
export type SidebarBrandProps = {
|
|
44
|
+
name: ReactNode;
|
|
45
|
+
subtitle?: ReactNode;
|
|
46
|
+
href?: string;
|
|
47
|
+
/** The club consoles; the brand becomes a switcher with the current one ticked. */
|
|
48
|
+
consoles?: readonly ClubConsole[];
|
|
49
|
+
/** The id of this console among `consoles`. */
|
|
50
|
+
current?: string;
|
|
51
|
+
};
|
|
52
|
+
export declare function SidebarBrand({ name, subtitle, href, consoles, current }: SidebarBrandProps): import("react").JSX.Element;
|
|
53
|
+
export declare function SidebarContent({ children }: {
|
|
54
|
+
children: ReactNode;
|
|
55
|
+
}): import("react").JSX.Element;
|
|
56
|
+
export declare function SidebarSection({ label, children }: {
|
|
57
|
+
label?: ReactNode;
|
|
58
|
+
children: ReactNode;
|
|
59
|
+
}): import("react").JSX.Element;
|
|
60
|
+
export type SidebarItemProps = {
|
|
61
|
+
href: string;
|
|
62
|
+
label: string;
|
|
63
|
+
icon?: LucideIcon;
|
|
64
|
+
active?: boolean;
|
|
65
|
+
/** A count or short tag after the label; a dot on the icon rail. */
|
|
66
|
+
badge?: ReactNode;
|
|
67
|
+
/** Opens outside the app (another console); renders a plain anchor. */
|
|
68
|
+
external?: boolean;
|
|
69
|
+
};
|
|
70
|
+
export declare function SidebarItem({ href, label, icon: Icon, active, badge, external, }: SidebarItemProps): import("react").JSX.Element;
|
|
71
|
+
export type SidebarGroupProps = {
|
|
72
|
+
label: string;
|
|
73
|
+
icon: LucideIcon;
|
|
74
|
+
/** True while one of its items is the current page; opens the group. */
|
|
75
|
+
active?: boolean;
|
|
76
|
+
defaultOpen?: boolean;
|
|
77
|
+
children: ReactNode;
|
|
78
|
+
};
|
|
79
|
+
/** A collapsible run of nested items. On the icon rail it opens the sidebar instead. */
|
|
80
|
+
export declare function SidebarGroup({ label, icon: Icon, active, defaultOpen, children, }: SidebarGroupProps): import("react").JSX.Element;
|
|
81
|
+
export declare function SidebarFooter({ children }: {
|
|
82
|
+
children: ReactNode;
|
|
83
|
+
}): import("react").JSX.Element;
|
|
84
|
+
export type SidebarUserProps = {
|
|
85
|
+
name: string;
|
|
86
|
+
email?: string | null;
|
|
87
|
+
/** A second line under the name, such as the role. */
|
|
88
|
+
subtitle?: ReactNode;
|
|
89
|
+
avatarSrc?: string | null;
|
|
90
|
+
/** A button at the end of the row, such as sign-out. Ignored when `menu` is set. */
|
|
91
|
+
action?: ReactNode;
|
|
92
|
+
/** Menu items (MenuItem, MenuLinkItem, …); the row becomes the trigger of a profile menu. */
|
|
93
|
+
menu?: ReactNode;
|
|
94
|
+
};
|
|
95
|
+
export declare function SidebarUser({ name, email, subtitle, avatarSrc, action, menu }: SidebarUserProps): import("react").JSX.Element;
|
|
96
|
+
//# sourceMappingURL=app-shell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../src/components/app-shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { Collapsible } from '@base-ui/react/collapsible';
|
|
4
|
+
import { Drawer as DrawerPrimitive } from '@base-ui/react/drawer';
|
|
5
|
+
import { Check, ChevronDown, ChevronRight, ChevronsLeft, ChevronsUpDown, Menu, PanelLeftClose, PanelLeftOpen, } from 'lucide-react';
|
|
6
|
+
import { createContext, useCallback, useContext, useEffect, useState, useSyncExternalStore, } from 'react';
|
|
7
|
+
import { createPortal } from 'react-dom';
|
|
8
|
+
import { LayoutGroup, m } from 'motion/react';
|
|
9
|
+
import { SKYLAB_MARK_PATHS, SKYLAB_MARK_VIEWBOX } from '../assets/skylab-mark.js';
|
|
10
|
+
import { cn } from '../lib/cn.js';
|
|
11
|
+
import { transitions } from '../lib/motion-tokens.js';
|
|
12
|
+
import { useSkylcn } from '../lib/provider.js';
|
|
13
|
+
import { Avatar } from './avatar.js';
|
|
14
|
+
import { IconSwap } from './icon-swap.js';
|
|
15
|
+
import { AnimatedNumber } from './motion.js';
|
|
16
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, MenuGroup, MenuItem, MenuLinkItem, } from './menu.js';
|
|
17
|
+
import { Tooltip } from './tooltip.js';
|
|
18
|
+
const ShellContext = createContext(null);
|
|
19
|
+
const SidebarScopeContext = createContext({ collapsed: false, inDrawer: false });
|
|
20
|
+
const NestedContext = createContext(false);
|
|
21
|
+
function useShell() {
|
|
22
|
+
const shell = useContext(ShellContext);
|
|
23
|
+
if (!shell)
|
|
24
|
+
throw new Error('AppShell parts must be used inside <AppShell>.');
|
|
25
|
+
return shell;
|
|
26
|
+
}
|
|
27
|
+
/** Whether the sidebar is drawn as an icon rail, and whether it sits in the mobile drawer. */
|
|
28
|
+
export function useSidebar() {
|
|
29
|
+
const shell = useShell();
|
|
30
|
+
const scope = useContext(SidebarScopeContext);
|
|
31
|
+
return {
|
|
32
|
+
...scope,
|
|
33
|
+
setCollapsed: shell.setCollapsed,
|
|
34
|
+
closeDrawer: () => shell.setMobileOpen(false),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const DESKTOP_QUERY = '(min-width: 48rem)';
|
|
38
|
+
function useIsDesktop() {
|
|
39
|
+
return useSyncExternalStore((onChange) => {
|
|
40
|
+
const query = window.matchMedia(DESKTOP_QUERY);
|
|
41
|
+
query.addEventListener('change', onChange);
|
|
42
|
+
return () => query.removeEventListener('change', onChange);
|
|
43
|
+
}, () => window.matchMedia(DESKTOP_QUERY).matches, () => true);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The admin frame shared by every console: a sidebar that collapses to an icon
|
|
47
|
+
* rail (Ctrl/⌘+B), a rounded content panel with a header row, and on phones a
|
|
48
|
+
* sticky top bar with the sidebar in a drawer.
|
|
49
|
+
*/
|
|
50
|
+
export function AppShell({ sidebar, header, defaultCollapsed = false, storageKey = 'skylcn:sidebar-collapsed', children, }) {
|
|
51
|
+
const { messages } = useSkylcn();
|
|
52
|
+
const [collapsed, setCollapsedState] = useState(defaultCollapsed);
|
|
53
|
+
const [mobileOpen, setMobileOpen] = useState(false);
|
|
54
|
+
const [desktopSlot, setDesktopSlot] = useState(null);
|
|
55
|
+
const [mobileSlot, setMobileSlot] = useState(null);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (!storageKey)
|
|
58
|
+
return;
|
|
59
|
+
try {
|
|
60
|
+
const saved = window.localStorage.getItem(storageKey);
|
|
61
|
+
if (saved !== null)
|
|
62
|
+
setCollapsedState(saved === 'true');
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Storage can be unavailable (private mode); the default stays.
|
|
66
|
+
}
|
|
67
|
+
}, [storageKey]);
|
|
68
|
+
const setCollapsed = useCallback((next) => {
|
|
69
|
+
setCollapsedState(next);
|
|
70
|
+
if (!storageKey)
|
|
71
|
+
return;
|
|
72
|
+
try {
|
|
73
|
+
window.localStorage.setItem(storageKey, String(next));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Not remembering is fine.
|
|
77
|
+
}
|
|
78
|
+
}, [storageKey]);
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
const onKey = (event) => {
|
|
81
|
+
const target = event.target;
|
|
82
|
+
// Leave Ctrl+B to text fields and editors, where it means bold.
|
|
83
|
+
if (target?.closest('input, textarea, select, [contenteditable=""], [contenteditable="true"]'))
|
|
84
|
+
return;
|
|
85
|
+
if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'b') {
|
|
86
|
+
event.preventDefault();
|
|
87
|
+
setCollapsed(!collapsed);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
window.addEventListener('keydown', onKey);
|
|
91
|
+
return () => window.removeEventListener('keydown', onKey);
|
|
92
|
+
}, [collapsed, setCollapsed]);
|
|
93
|
+
return (_jsx(ShellContext.Provider, { value: { collapsed, setCollapsed, mobileOpen, setMobileOpen, desktopSlot, mobileSlot }, children: _jsxs("div", { "data-slot": "app-shell", "data-collapsed": collapsed || undefined, className: cn(
|
|
94
|
+
// Sticky parts inside the page (list headers) stick below the phone's top bar
|
|
95
|
+
'min-h-dvh bg-background [--skylcn-sticky-top:3.5rem] md:h-dvh md:bg-sidebar md:py-2 md:pr-2 md:[--skylcn-sticky-top:0px]', 'transition-[padding] duration-(--motion-duration-base) ease-enter', collapsed ? 'md:pl-18' : 'md:pl-66'), children: [_jsx("a", { href: "#skylcn-main", className: "fixed top-2 left-2 z-60 -translate-y-16 rounded-md border border-border bg-popover px-3 py-2 text-sm text-foreground shadow-overlay outline-hidden focus-visible:translate-y-0 focus-visible:ring-2 focus-visible:ring-ring", children: messages.skipToContent }), _jsx("aside", { "aria-label": messages.navigation, className: cn('fixed inset-y-0 left-0 z-30 hidden overflow-hidden bg-sidebar md:flex', 'transition-[width] duration-(--motion-duration-base) ease-enter', collapsed ? 'w-16' : 'w-64'), children: _jsx(SidebarScopeContext.Provider, { value: { collapsed, inDrawer: false }, children: _jsx(SidebarFrame, { children: sidebar }) }) }), _jsx("div", { className: "sticky top-0 z-40 border-b border-border-subtle bg-sidebar/70 backdrop-blur md:hidden", children: _jsxs("div", { className: "flex h-14 items-center gap-2 px-3", children: [_jsx("button", { type: "button", onClick: () => setMobileOpen(true), "aria-label": messages.openMenu, className: "grid size-10 place-items-center rounded-md text-secondary-foreground outline-hidden hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(Menu, { className: "size-5" }) }), _jsx("div", { className: "min-w-0 flex-1", children: header }), _jsx("div", { ref: setMobileSlot, className: "flex shrink-0 items-center gap-1.5" })] }) }), _jsx(DrawerPrimitive.Root, { open: mobileOpen, onOpenChange: setMobileOpen, swipeDirection: "left", children: _jsxs(DrawerPrimitive.Portal, { children: [_jsx(DrawerPrimitive.Backdrop, { className: "fixed inset-0 z-50 bg-black opacity-[calc(0.4*(1-var(--drawer-swipe-progress)))] transition-opacity duration-(--motion-duration-slow) ease-enter data-ending-style:opacity-0 data-starting-style:opacity-0 data-swiping:duration-0 md:hidden" }), _jsx(DrawerPrimitive.Viewport, { className: "fixed inset-0 z-50 md:hidden", children: _jsxs(DrawerPrimitive.Popup, { "aria-label": messages.navigation, className: cn('absolute inset-y-0 left-0 flex outline-hidden', '[transform:translateX(var(--drawer-swipe-movement-x))] transition-[transform,opacity] duration-(--motion-duration-spring) ease-spring data-swiping:duration-0', 'data-ending-style:[transform:translateX(-100%)] data-ending-style:duration-[calc(var(--drawer-swipe-strength,1)*var(--motion-duration-base))] data-ending-style:ease-exit data-starting-style:[transform:translateX(-100%)]', 'motion-reduce:data-ending-style:[transform:none] motion-reduce:data-ending-style:opacity-0 motion-reduce:data-starting-style:[transform:none] motion-reduce:data-starting-style:opacity-0'), children: [_jsx("div", { className: "flex h-full w-72 border-r border-border bg-sidebar pb-[env(safe-area-inset-bottom)] shadow-overlay", children: _jsx(SidebarScopeContext.Provider, { value: { collapsed: false, inDrawer: true }, children: _jsx(SidebarFrame, { children: sidebar }) }) }), _jsx(DrawerPrimitive.Close, { "aria-label": messages.close, title: messages.close, className: "group -ml-px flex h-full w-5 items-center justify-center rounded-r-full border-y border-r border-border bg-sidebar text-subtle-foreground outline-hidden transition-colors hover:text-secondary-foreground", children: _jsx(ChevronsLeft, { className: "size-3.5 opacity-60 transition-transform duration-(--motion-duration-base) group-hover:scale-110 group-hover:opacity-100", strokeWidth: 2.5 }) })] }) })] }) }), _jsxs("div", { className: "md:flex md:h-full md:min-h-0 md:flex-col md:overflow-hidden md:rounded-xl md:border md:border-border-subtle md:bg-background", children: [_jsxs("div", { className: "hidden h-10 shrink-0 items-center gap-3 border-b border-border-subtle pr-6 pl-3 md:flex", children: [_jsx(CollapseToggle, { collapsed: collapsed, onToggle: () => setCollapsed(!collapsed) }), _jsx("span", { "aria-hidden": true, className: "h-4 w-px bg-border" }), _jsx("div", { className: "min-w-0 flex-1", children: header }), _jsx("div", { ref: setDesktopSlot, className: "flex shrink-0 items-center gap-1.5" })] }), _jsx("main", { id: "skylcn-main", tabIndex: -1, className: "scrollbar outline-hidden md:min-h-0 md:flex-1 md:scroll-pt-12 md:overflow-y-auto", children: _jsx("div", { className: "mx-auto w-full max-w-400 p-4 sm:p-6", children: children }) })] })] }) }));
|
|
96
|
+
}
|
|
97
|
+
function SidebarFrame({ children }) {
|
|
98
|
+
const { collapsed, inDrawer } = useContext(SidebarScopeContext);
|
|
99
|
+
return (
|
|
100
|
+
// The drawer and the desktop sidebar each keep their own sliding highlight
|
|
101
|
+
_jsx(LayoutGroup, { id: inDrawer ? 'skylcn-sidebar-drawer' : 'skylcn-sidebar', children: _jsx("div", { className: cn('flex h-full w-full min-w-0 flex-col py-5', collapsed ? 'gap-3 px-2' : 'gap-4 px-4'), children: children }) }));
|
|
102
|
+
}
|
|
103
|
+
/** Renders page actions into the shell header, on desktop and on phones alike. */
|
|
104
|
+
export function AppShellActions({ children }) {
|
|
105
|
+
const { desktopSlot, mobileSlot } = useShell();
|
|
106
|
+
const desktop = useIsDesktop();
|
|
107
|
+
const target = desktop ? desktopSlot : mobileSlot;
|
|
108
|
+
return target ? createPortal(children, target) : null;
|
|
109
|
+
}
|
|
110
|
+
/** The SKY LAB mark as a still image, for brand slots. */
|
|
111
|
+
export function SkylabMark({ size = 24, className }) {
|
|
112
|
+
return (_jsx("svg", { viewBox: SKYLAB_MARK_VIEWBOX, width: size, height: size, fill: "currentColor", "aria-hidden": true, className: cn('shrink-0', className), children: _jsx("g", { fillRule: "evenodd", children: SKYLAB_MARK_PATHS.map((d, i) => (_jsx("path", { d: d }, i))) }) }));
|
|
113
|
+
}
|
|
114
|
+
function ConsoleRow({ app, current }) {
|
|
115
|
+
const Icon = app.icon;
|
|
116
|
+
return (_jsxs(_Fragment, { children: [_jsx("span", { className: cn('grid size-8 shrink-0 place-items-center rounded-md border', current
|
|
117
|
+
? 'border-skylab-400/40 bg-skylab-500/10 text-skylab-300'
|
|
118
|
+
: 'border-border bg-muted text-muted-foreground'), children: Icon ? (_jsx(Icon, { className: "size-4!", strokeWidth: 1.75 })) : (_jsx("span", { className: "text-2xs font-semibold", children: app.label.slice(0, 1) })) }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: cn('block truncate text-xs font-medium', current ? 'text-foreground' : 'text-secondary-foreground'), children: app.label }), app.description ? (_jsx("span", { className: "block truncate text-3xs text-subtle-foreground", children: app.description })) : null] }), current ? _jsx(Check, { className: "size-3.5! shrink-0 text-skylab-400" }) : null] }));
|
|
119
|
+
}
|
|
120
|
+
export function SidebarBrand({ name, subtitle, href, consoles, current }) {
|
|
121
|
+
const { collapsed } = useSidebar();
|
|
122
|
+
const { Link, messages } = useSkylcn();
|
|
123
|
+
const body = (_jsxs(_Fragment, { children: [_jsx("span", { className: "grid size-8 shrink-0 place-items-center text-foreground-strong", children: _jsx(SkylabMark, { size: 24 }) }), collapsed ? null : (_jsxs("span", { className: "min-w-0 flex-1 text-left", children: [_jsx("span", { className: "block truncate text-sm font-semibold text-foreground", children: name }), subtitle ? (_jsx("span", { className: "block truncate text-3xs text-subtle-foreground", children: subtitle })) : null] }))] }));
|
|
124
|
+
const base = cn('flex w-full items-center gap-2.5 rounded-lg outline-hidden focus-visible:ring-2 focus-visible:ring-ring', collapsed ? 'justify-center p-1' : 'p-1.5');
|
|
125
|
+
if (consoles?.length) {
|
|
126
|
+
return (_jsxs(DropdownMenu, { children: [_jsxs(DropdownMenuTrigger, { "aria-label": messages.consoles, className: cn(base, 'transition-colors duration-(--motion-duration-fast) hover:bg-accent data-popup-open:bg-accent'), children: [body, collapsed ? null : _jsx(ChevronsUpDown, { className: "size-4 shrink-0 text-subtle-foreground" })] }), _jsx(DropdownMenuContent, { side: collapsed ? 'right' : 'bottom', align: "start", sideOffset: 6, className: collapsed ? 'w-56' : 'w-(--anchor-width) min-w-56', children: _jsx(MenuGroup, { label: messages.consoles, children: consoles.map((app) => app.id === current ? (_jsx(MenuItem, { className: "gap-2.5 py-1.5", children: _jsx(ConsoleRow, { app: app, current: true }) }, app.id)) : (_jsx(MenuLinkItem, { href: app.href, className: "gap-2.5 py-1.5", children: _jsx(ConsoleRow, { app: app, current: false }) }, app.id))) }) })] }));
|
|
127
|
+
}
|
|
128
|
+
return href ? (_jsx(Link, { href: href, className: base, children: body })) : (_jsx("div", { className: base, children: body }));
|
|
129
|
+
}
|
|
130
|
+
export function SidebarContent({ children }) {
|
|
131
|
+
const { collapsed } = useSidebar();
|
|
132
|
+
return (_jsx("nav", { className: cn('scrollbar-hidden flex min-h-0 flex-1 flex-col overflow-y-auto', collapsed ? 'gap-3' : 'gap-5'), children: children }));
|
|
133
|
+
}
|
|
134
|
+
export function SidebarSection({ label, children }) {
|
|
135
|
+
const { collapsed } = useSidebar();
|
|
136
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [label ? (collapsed ? (_jsx("div", { className: "mx-auto my-2 h-px w-6 bg-border", "aria-hidden": true })) : (_jsx("div", { className: "px-2 pb-1 text-xs font-medium tracking-wide text-muted-foreground select-none", children: label }))) : null, children] }));
|
|
137
|
+
}
|
|
138
|
+
export function SidebarItem({ href, label, icon: Icon, active = false, badge, external = false, }) {
|
|
139
|
+
const { collapsed, inDrawer, closeDrawer } = useSidebar();
|
|
140
|
+
const nested = useContext(NestedContext);
|
|
141
|
+
const { Link } = useSkylcn();
|
|
142
|
+
const className = cn('group/item relative isolate flex items-center rounded-md outline-hidden', 'transition-[color,background-color] duration-(--motion-duration-fast) ease-enter focus-visible:ring-2 focus-visible:ring-ring', nested
|
|
143
|
+
? 'gap-2 px-2 py-1 text-xs pointer-coarse:py-1.5'
|
|
144
|
+
: 'gap-3 px-3 py-2 text-sm pointer-coarse:py-2.5', collapsed && !nested && 'justify-center px-0', active ? 'text-foreground' : 'text-muted-foreground hover:bg-accent hover:text-foreground');
|
|
145
|
+
const content = (_jsxs(_Fragment, { children: [active && !nested ? (
|
|
146
|
+
// One highlight that glides to the active item when the page changes
|
|
147
|
+
_jsx(m.span, { layoutId: "active-item", "aria-hidden": true, className: "absolute inset-0 -z-10 rounded-md bg-accent-strong", transition: transitions.layout })) : null, Icon ? (_jsxs("span", { className: "relative", children: [_jsx(Icon, { className: cn(nested ? 'size-4' : 'size-5', 'shrink-0', active && 'text-skylab-300'), strokeWidth: 1.75 }), collapsed && badge ? (_jsx("span", { className: "absolute -top-0.5 -right-0.5 size-1.5 rounded-full bg-skylab-400 ring-2 ring-sidebar" })) : null] })) : null, collapsed && !nested ? null : (_jsxs(_Fragment, { children: [_jsx("span", { className: "min-w-0 flex-1 truncate font-medium", children: label }), badge ? (_jsx("span", { className: "shrink-0 rounded-md bg-muted px-1.5 text-3xs text-muted-foreground tabular-nums", children: typeof badge === 'number' ? _jsx(AnimatedNumber, { value: badge, tabular: true }) : badge })) : nested ? null : (_jsx(ChevronRight, { className: cn('size-4 shrink-0 transition-[opacity,transform] duration-(--motion-duration-fast) group-hover/item:translate-x-0.5', active ? 'opacity-60' : 'opacity-0 group-hover/item:opacity-60') }))] }))] }));
|
|
148
|
+
const onClick = inDrawer ? closeDrawer : undefined;
|
|
149
|
+
const link = external ? (_jsx("a", { href: href, className: className, "aria-label": collapsed ? label : undefined, onClick: onClick, children: content })) : (_jsxs(Link, { href: href, className: className, "aria-current": active ? 'page' : undefined, onClick: onClick, children: [content, collapsed && !nested ? _jsx("span", { className: "sr-only", children: label }) : null] }));
|
|
150
|
+
return collapsed && !nested ? (_jsx(Tooltip, { label: label, side: "right", children: link })) : (link);
|
|
151
|
+
}
|
|
152
|
+
/** A collapsible run of nested items. On the icon rail it opens the sidebar instead. */
|
|
153
|
+
export function SidebarGroup({ label, icon: Icon, active = false, defaultOpen, children, }) {
|
|
154
|
+
const { collapsed, setCollapsed } = useSidebar();
|
|
155
|
+
const [open, setOpen] = useState(defaultOpen ?? active);
|
|
156
|
+
const [wasActive, setWasActive] = useState(active);
|
|
157
|
+
if (active !== wasActive) {
|
|
158
|
+
setWasActive(active);
|
|
159
|
+
if (active)
|
|
160
|
+
setOpen(true);
|
|
161
|
+
}
|
|
162
|
+
const rowClass = cn('group/group flex w-full items-center rounded-md text-sm outline-hidden', 'transition-[color,background-color] duration-(--motion-duration-fast) ease-enter focus-visible:ring-2 focus-visible:ring-ring', active ? 'text-foreground' : 'text-muted-foreground hover:bg-accent hover:text-foreground', collapsed ? 'justify-center py-2' : 'gap-3 px-3 py-2 pointer-coarse:py-2.5');
|
|
163
|
+
if (collapsed) {
|
|
164
|
+
return (_jsx(Tooltip, { label: label, side: "right", children: _jsx("button", { type: "button", className: rowClass, "aria-label": label, onClick: () => {
|
|
165
|
+
setOpen(true);
|
|
166
|
+
setCollapsed(false);
|
|
167
|
+
}, children: _jsx(Icon, { className: cn('size-5 shrink-0', active && 'text-skylab-300'), strokeWidth: 1.75 }) }) }));
|
|
168
|
+
}
|
|
169
|
+
return (_jsxs(Collapsible.Root, { open: open, onOpenChange: setOpen, children: [_jsxs(Collapsible.Trigger, { className: rowClass, children: [_jsx(Icon, { className: cn('size-5 shrink-0', active && 'text-skylab-300'), strokeWidth: 1.75 }), _jsx("span", { className: "min-w-0 flex-1 truncate text-left font-medium", children: label }), _jsx(ChevronDown, { className: cn('size-4 shrink-0 transition-transform duration-(--motion-duration-base) ease-enter', open ? 'rotate-180' : 'rotate-0') })] }), _jsx(Collapsible.Panel, { className: "h-(--collapsible-panel-height) overflow-hidden transition-[height,opacity] duration-(--motion-duration-base) ease-enter data-ending-style:h-0 data-ending-style:opacity-0 data-starting-style:h-0 data-starting-style:opacity-0", children: _jsx(NestedContext.Provider, { value: true, children: _jsx("div", { className: "mt-1 ml-5 flex flex-col gap-1 border-l border-border pl-3", children: children }) }) })] }));
|
|
170
|
+
}
|
|
171
|
+
export function SidebarFooter({ children }) {
|
|
172
|
+
return _jsx("div", { className: "mt-auto flex flex-col gap-2", children: children });
|
|
173
|
+
}
|
|
174
|
+
export function SidebarUser({ name, email, subtitle, avatarSrc, action, menu }) {
|
|
175
|
+
const { collapsed } = useSidebar();
|
|
176
|
+
const avatar = (_jsx(Avatar, { name: name, email: email, src: avatarSrc, size: collapsed ? 'md' : 'lg' }));
|
|
177
|
+
const text = (_jsxs("span", { className: "min-w-0 flex-1 text-left", children: [_jsx("span", { className: "block truncate text-sm font-medium text-foreground", children: name }), subtitle ? (_jsx("span", { className: "block truncate text-3xs tracking-label text-subtle-foreground uppercase", children: subtitle })) : null] }));
|
|
178
|
+
if (menu) {
|
|
179
|
+
return (_jsxs(DropdownMenu, { children: [_jsxs(DropdownMenuTrigger, { "aria-label": name, className: cn('flex w-full items-center rounded-lg outline-hidden', 'transition-colors duration-(--motion-duration-fast) hover:bg-accent focus-visible:ring-2 focus-visible:ring-ring data-popup-open:bg-accent', collapsed ? 'justify-center p-1' : 'gap-3 p-2'), children: [avatar, collapsed ? null : (_jsxs(_Fragment, { children: [text, _jsx(ChevronsUpDown, { className: "size-4 shrink-0 text-subtle-foreground" })] }))] }), _jsx(DropdownMenuContent, { side: collapsed ? 'right' : 'top', align: collapsed ? 'end' : 'start', sideOffset: 8, className: collapsed ? 'w-56' : 'w-(--anchor-width) min-w-56', children: menu })] }));
|
|
180
|
+
}
|
|
181
|
+
if (collapsed) {
|
|
182
|
+
return (_jsxs("div", { className: "flex flex-col items-center gap-1", children: [_jsx(Tooltip, { label: name, children: _jsx("span", { className: "inline-flex", children: avatar }) }), action] }));
|
|
183
|
+
}
|
|
184
|
+
return (_jsxs("div", { className: "flex items-center gap-3 px-2", children: [avatar, text, action ? _jsx("div", { className: "shrink-0", children: action }) : null] }));
|
|
185
|
+
}
|
|
186
|
+
function CollapseToggle({ collapsed, onToggle }) {
|
|
187
|
+
const { messages } = useSkylcn();
|
|
188
|
+
const label = collapsed ? messages.expandSidebar : messages.collapseSidebar;
|
|
189
|
+
return (_jsx(Tooltip, { label: `${label} · Ctrl+B`, children: _jsx("button", { type: "button", onClick: onToggle, "aria-label": label, "aria-expanded": !collapsed, className: "grid size-7 shrink-0 place-items-center rounded-md text-subtle-foreground outline-hidden transition-colors duration-(--motion-duration-fast) hover:bg-accent hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring", children: _jsx(IconSwap, { swapped: collapsed, icon: PanelLeftClose, swappedIcon: PanelLeftOpen, className: "size-4", strokeWidth: 1.75 }) }) }));
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=app-shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-shell.js","sourceRoot":"","sources":["../../src/components/app-shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
declare const SIZES: {
|
|
2
|
+
readonly sm: {
|
|
3
|
+
readonly box: "size-7 text-3xs";
|
|
4
|
+
readonly icon: "size-3";
|
|
5
|
+
};
|
|
6
|
+
readonly md: {
|
|
7
|
+
readonly box: "size-9 text-xs";
|
|
8
|
+
readonly icon: "size-4";
|
|
9
|
+
};
|
|
10
|
+
readonly lg: {
|
|
11
|
+
readonly box: "size-11 text-sm";
|
|
12
|
+
readonly icon: "size-5";
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
export declare function initialsOf(name?: string | null, email?: string | null): string;
|
|
16
|
+
export type AvatarProps = {
|
|
17
|
+
name?: string | null;
|
|
18
|
+
email?: string | null;
|
|
19
|
+
src?: string | null;
|
|
20
|
+
size?: keyof typeof SIZES;
|
|
21
|
+
/** `circle` for people; `square` for teams, groups and other organisations. */
|
|
22
|
+
shape?: 'circle' | 'square';
|
|
23
|
+
className?: string;
|
|
24
|
+
};
|
|
25
|
+
/** A photo, else the initials of the name or e-mail, else a person icon. */
|
|
26
|
+
export declare function Avatar({ name, email, src, size, shape, className, }: AvatarProps): import("react").JSX.Element;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"AAMA,QAAA,MAAM,KAAK;;;;;;;;;;;;;CAID,CAAC;AAEX,wBAAgB,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAM9E;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,OAAO,KAAK,CAAC;IAC1B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,4EAA4E;AAC5E,wBAAgB,MAAM,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAW,EACX,KAAgB,EAChB,SAAS,GACV,EAAE,WAAW,+BAqBb"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Avatar as AvatarPrimitive } from '@base-ui/react/avatar';
|
|
4
|
+
import { User2 } from 'lucide-react';
|
|
5
|
+
import { cn } from '../lib/cn.js';
|
|
6
|
+
const SIZES = {
|
|
7
|
+
sm: { box: 'size-7 text-3xs', icon: 'size-3' },
|
|
8
|
+
md: { box: 'size-9 text-xs', icon: 'size-4' },
|
|
9
|
+
lg: { box: 'size-11 text-sm', icon: 'size-5' },
|
|
10
|
+
};
|
|
11
|
+
export function initialsOf(name, email) {
|
|
12
|
+
const source = (name || email || '').trim();
|
|
13
|
+
if (!source)
|
|
14
|
+
return '';
|
|
15
|
+
const parts = source.split(/\s+/).filter(Boolean);
|
|
16
|
+
if (parts.length === 1)
|
|
17
|
+
return parts[0].slice(0, 2).toLocaleUpperCase('tr-TR');
|
|
18
|
+
return (parts[0][0] + parts[1][0]).toLocaleUpperCase('tr-TR');
|
|
19
|
+
}
|
|
20
|
+
/** A photo, else the initials of the name or e-mail, else a person icon. */
|
|
21
|
+
export function Avatar({ name, email, src, size = 'md', shape = 'circle', className, }) {
|
|
22
|
+
const s = SIZES[size];
|
|
23
|
+
const initials = initialsOf(name, email);
|
|
24
|
+
return (_jsxs(AvatarPrimitive.Root, { "data-slot": "avatar", className: cn('inline-grid shrink-0 place-items-center overflow-hidden border border-border bg-muted font-semibold text-secondary-foreground select-none', shape === 'circle' ? 'rounded-full' : 'rounded-lg', s.box, className), children: [src ? (_jsx(AvatarPrimitive.Image, { src: src, alt: name ?? '', className: "size-full object-cover" })) : null, _jsx(AvatarPrimitive.Fallback, { className: "grid size-full place-items-center", children: initials || _jsx(User2, { className: cn('text-subtle-foreground', s.icon) }) })] }));
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../src/components/avatar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,KAAK,GAAG;IACZ,EAAE,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC9C,EAAE,EAAE,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE;IAC7C,EAAE,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE;CACtC,CAAC;AAEX,MAAM,UAAU,UAAU,CAAC,IAAoB,EAAE,KAAqB;IACpE,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAChF,OAAO,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC;AAYD,4EAA4E;AAC5E,MAAM,UAAU,MAAM,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,GAAG,EACH,IAAI,GAAG,IAAI,EACX,KAAK,GAAG,QAAQ,EAChB,SAAS,GACG;IACZ,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CACL,MAAC,eAAe,CAAC,IAAI,iBACT,QAAQ,EAClB,SAAS,EAAE,EAAE,CACX,2IAA2I,EAC3I,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,EAClD,CAAC,CAAC,GAAG,EACL,SAAS,CACV,aAEA,GAAG,CAAC,CAAC,CAAC,CACL,KAAC,eAAe,CAAC,KAAK,IAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,SAAS,EAAC,wBAAwB,GAAG,CACxF,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,eAAe,CAAC,QAAQ,IAAC,SAAS,EAAC,mCAAmC,YACpE,QAAQ,IAAI,KAAC,KAAK,IAAC,SAAS,EAAE,EAAE,CAAC,wBAAwB,EAAE,CAAC,CAAC,IAAI,CAAC,GAAI,GAC9C,IACN,CACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type VariantProps } from 'class-variance-authority';
|
|
2
|
+
import type { ComponentProps } from 'react';
|
|
3
|
+
declare const TONES: {
|
|
4
|
+
readonly neutral: "border-border text-muted-foreground";
|
|
5
|
+
readonly strong: "border-border-strong bg-accent-strong text-secondary-foreground";
|
|
6
|
+
readonly brand: "border-skylab-400/40 bg-skylab-500/10 text-skylab-300";
|
|
7
|
+
readonly success: "border-success/35 bg-success/10 text-success";
|
|
8
|
+
readonly warning: "border-warning/35 bg-warning/10 text-warning";
|
|
9
|
+
readonly danger: "border-destructive/35 bg-destructive/10 text-destructive";
|
|
10
|
+
readonly info: "border-info/35 bg-info/10 text-info";
|
|
11
|
+
};
|
|
12
|
+
declare const badgeVariants: (props?: ({
|
|
13
|
+
tone?: "strong" | "info" | "success" | "warning" | "danger" | "neutral" | "brand" | null | undefined;
|
|
14
|
+
size?: "sm" | "md" | "xs" | "pill" | null | undefined;
|
|
15
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
16
|
+
export type BadgeTone = keyof typeof TONES;
|
|
17
|
+
export type BadgeProps = ComponentProps<'span'> & VariantProps<typeof badgeVariants>;
|
|
18
|
+
/** A small label: a role, a count, a state. `pill` is the uppercase section status. */
|
|
19
|
+
export declare function Badge({ className, tone, size, ...props }: BadgeProps): import("react").JSX.Element;
|
|
20
|
+
declare const DOT_TONES: {
|
|
21
|
+
readonly neutral: "bg-subtle-foreground";
|
|
22
|
+
readonly brand: "bg-skylab-400 shadow-skylab-400/40";
|
|
23
|
+
readonly success: "bg-success shadow-success/40";
|
|
24
|
+
readonly warning: "bg-warning shadow-warning/40";
|
|
25
|
+
readonly danger: "bg-destructive shadow-destructive/40";
|
|
26
|
+
readonly info: "bg-info shadow-info/40";
|
|
27
|
+
};
|
|
28
|
+
export type StatusDotProps = ComponentProps<'span'> & {
|
|
29
|
+
tone?: keyof typeof DOT_TONES;
|
|
30
|
+
/** Adds the soft glow used for live states. */
|
|
31
|
+
glow?: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* What the state is, such as "Açık". Colour alone does not reach everyone, so
|
|
34
|
+
* give it unless the same words already sit next to the dot.
|
|
35
|
+
*/
|
|
36
|
+
label?: string;
|
|
37
|
+
};
|
|
38
|
+
/** A 6px state dot, glowing for live states. */
|
|
39
|
+
export declare function StatusDot({ tone, glow, label, className, ...props }: StatusDotProps): import("react").JSX.Element;
|
|
40
|
+
export { badgeVariants };
|
|
41
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/components/badge.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAG5C,QAAA,MAAM,KAAK;;;;;;;;CAQD,CAAC;AAEX,QAAA,MAAM,aAAa;;;8EAclB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,KAAK,CAAC;AAE3C,MAAM,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,CAAC;AAErF,uFAAuF;AACvF,wBAAgB,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,UAAU,+BAIpE;AAED,QAAA,MAAM,SAAS;;;;;;;CAOL,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG;IACpD,IAAI,CAAC,EAAE,MAAM,OAAO,SAAS,CAAC;IAC9B,+CAA+C;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,gDAAgD;AAChD,wBAAgB,SAAS,CAAC,EACxB,IAAgB,EAChB,IAAyB,EACzB,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACT,EAAE,cAAc,+BAiBhB;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { cn } from '../lib/cn.js';
|
|
4
|
+
const TONES = {
|
|
5
|
+
neutral: 'border-border text-muted-foreground',
|
|
6
|
+
strong: 'border-border-strong bg-accent-strong text-secondary-foreground',
|
|
7
|
+
brand: 'border-skylab-400/40 bg-skylab-500/10 text-skylab-300',
|
|
8
|
+
success: 'border-success/35 bg-success/10 text-success',
|
|
9
|
+
warning: 'border-warning/35 bg-warning/10 text-warning',
|
|
10
|
+
danger: 'border-destructive/35 bg-destructive/10 text-destructive',
|
|
11
|
+
info: 'border-info/35 bg-info/10 text-info',
|
|
12
|
+
};
|
|
13
|
+
const badgeVariants = cva('inline-flex shrink-0 items-center gap-1 border font-medium whitespace-nowrap [&_svg]:size-3 [&_svg]:shrink-0', {
|
|
14
|
+
variants: {
|
|
15
|
+
tone: TONES,
|
|
16
|
+
size: {
|
|
17
|
+
xs: 'rounded-md px-1 py-px text-3xs leading-3.5 tracking-wide uppercase',
|
|
18
|
+
sm: 'rounded-md px-1.5 py-0.5 text-3xs',
|
|
19
|
+
md: 'rounded-md px-2 py-0.5 text-2xs',
|
|
20
|
+
pill: 'rounded-full px-3 py-0.5 text-3xs font-semibold tracking-label uppercase',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
defaultVariants: { tone: 'neutral', size: 'sm' },
|
|
24
|
+
});
|
|
25
|
+
/** A small label: a role, a count, a state. `pill` is the uppercase section status. */
|
|
26
|
+
export function Badge({ className, tone, size, ...props }) {
|
|
27
|
+
return (_jsx("span", { "data-slot": "badge", className: cn(badgeVariants({ tone, size }), className), ...props }));
|
|
28
|
+
}
|
|
29
|
+
const DOT_TONES = {
|
|
30
|
+
neutral: 'bg-subtle-foreground',
|
|
31
|
+
brand: 'bg-skylab-400 shadow-skylab-400/40',
|
|
32
|
+
success: 'bg-success shadow-success/40',
|
|
33
|
+
warning: 'bg-warning shadow-warning/40',
|
|
34
|
+
danger: 'bg-destructive shadow-destructive/40',
|
|
35
|
+
info: 'bg-info shadow-info/40',
|
|
36
|
+
};
|
|
37
|
+
/** A 6px state dot, glowing for live states. */
|
|
38
|
+
export function StatusDot({ tone = 'neutral', glow = tone !== 'neutral', label, className, ...props }) {
|
|
39
|
+
return (_jsx("span", { "data-slot": "status-dot", role: label ? 'img' : undefined, "aria-label": label, "aria-hidden": label ? undefined : true, title: label, className: cn('inline-block size-1.5 shrink-0 rounded-full', DOT_TONES[tone], glow && 'shadow-[0_0_6px]', className), ...props }));
|
|
40
|
+
}
|
|
41
|
+
export { badgeVariants };
|
|
42
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/components/badge.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,MAAM,KAAK,GAAG;IACZ,OAAO,EAAE,qCAAqC;IAC9C,MAAM,EAAE,iEAAiE;IACzE,KAAK,EAAE,uDAAuD;IAC9D,OAAO,EAAE,8CAA8C;IACvD,OAAO,EAAE,8CAA8C;IACvD,MAAM,EAAE,0DAA0D;IAClE,IAAI,EAAE,qCAAqC;CACnC,CAAC;AAEX,MAAM,aAAa,GAAG,GAAG,CACvB,8GAA8G,EAC9G;IACE,QAAQ,EAAE;QACR,IAAI,EAAE,KAAK;QACX,IAAI,EAAE;YACJ,EAAE,EAAE,oEAAoE;YACxE,EAAE,EAAE,mCAAmC;YACvC,EAAE,EAAE,iCAAiC;YACrC,IAAI,EAAE,0EAA0E;SACjF;KACF;IACD,eAAe,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE;CACjD,CACF,CAAC;AAMF,uFAAuF;AACvF,MAAM,UAAU,KAAK,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,EAAc;IACnE,OAAO,CACL,4BAAgB,OAAO,EAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAC/F,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG;IAChB,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,oCAAoC;IAC3C,OAAO,EAAE,8BAA8B;IACvC,OAAO,EAAE,8BAA8B;IACvC,MAAM,EAAE,sCAAsC;IAC9C,IAAI,EAAE,wBAAwB;CACtB,CAAC;AAaX,gDAAgD;AAChD,MAAM,UAAU,SAAS,CAAC,EACxB,IAAI,GAAG,SAAS,EAChB,IAAI,GAAG,IAAI,KAAK,SAAS,EACzB,KAAK,EACL,SAAS,EACT,GAAG,KAAK,EACO;IACf,OAAO,CACL,4BACY,YAAY,EACtB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,gBACnB,KAAK,iBACJ,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EACrC,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,EAAE,CACX,6CAA6C,EAC7C,SAAS,CAAC,IAAI,CAAC,EACf,IAAI,IAAI,kBAAkB,EAC1B,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export type BarListItem = {
|
|
3
|
+
key: string;
|
|
4
|
+
label: ReactNode;
|
|
5
|
+
value: number;
|
|
6
|
+
/** Replaces the value on the right, such as "412 · %38". */
|
|
7
|
+
detail?: ReactNode;
|
|
8
|
+
/** A row that cannot be chosen, drawn dimmed. */
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
};
|
|
11
|
+
export type BarListProps = {
|
|
12
|
+
items: readonly BarListItem[];
|
|
13
|
+
/**
|
|
14
|
+
* What 100% is: the total of the values by default, which suits shares of
|
|
15
|
+
* one answer; pass a number for rates against a separate total.
|
|
16
|
+
*/
|
|
17
|
+
max?: number;
|
|
18
|
+
/** Shows each row's share after its value. */
|
|
19
|
+
showPercent?: boolean;
|
|
20
|
+
/** Makes the rows pressable, such as picking the questions to chart. */
|
|
21
|
+
onSelect?: (key: string) => void;
|
|
22
|
+
/** Keys of the rows that are chosen. */
|
|
23
|
+
selected?: readonly string[];
|
|
24
|
+
formatValue?: (value: number) => string;
|
|
25
|
+
className?: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Categories as labelled rows over thin bars: the answers to a question, the
|
|
29
|
+
* reply rate of each question, the members of each team. Reads better than a
|
|
30
|
+
* chart when the labels are long, and doubles as a pick list.
|
|
31
|
+
*/
|
|
32
|
+
export declare function BarList({ items, max, showPercent, onSelect, selected, formatValue, className, }: BarListProps): import("react").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=bar-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bar-list.d.ts","sourceRoot":"","sources":["../../src/components/bar-list.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,wCAAwC;IACxC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EACtB,KAAK,EACL,GAAG,EACH,WAAkB,EAClB,QAAQ,EACR,QAAa,EACb,WAAW,EACX,SAAS,GACV,EAAE,YAAY,+BA+Ed"}
|