@schemavaults/ui 0.99.3 → 0.101.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/dist/components/layout/dashboard-layout/DashboardLayoutProps.d.ts +13 -0
- package/dist/components/layout/dashboard-layout/dashboard-layout.d.ts +1 -1
- package/dist/components/layout/dashboard-layout/dashboard-layout.js +13 -4
- package/dist/components/layout/dashboard-layout/dashboard-layout.js.map +1 -1
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-context-provider.d.ts +10 -1
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-context-provider.js +7 -1
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-context-provider.js.map +1 -1
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-sizing.d.ts +16 -3
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-sizing.js +22 -4
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-sizing.js.map +1 -1
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/index.d.ts +1 -0
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/index.js +1 -0
- package/dist/components/layout/dashboard-layout/dashboard-sidebar/index.js.map +1 -1
- package/dist/components/layout/dashboard-layout/index.d.ts +1 -0
- package/dist/components/layout/dashboard-layout/index.js +1 -0
- package/dist/components/layout/dashboard-layout/index.js.map +1 -1
- package/dist/components/ui/index.d.ts +2 -0
- package/dist/components/ui/index.js +1 -0
- package/dist/components/ui/index.js.map +1 -1
- package/dist/components/ui/scatter-plot/index.d.ts +3 -0
- package/dist/components/ui/scatter-plot/index.js +3 -0
- package/dist/components/ui/scatter-plot/index.js.map +1 -0
- package/dist/components/ui/scatter-plot/scatter-plot.d.ts +169 -0
- package/dist/components/ui/scatter-plot/scatter-plot.js +385 -0
- package/dist/components/ui/scatter-plot/scatter-plot.js.map +1 -0
- package/package.json +1 -1
|
@@ -12,6 +12,19 @@ export interface DashboardLayoutProps extends PropsWithChildren {
|
|
|
12
12
|
sidebarFooterContent?: CustomizableDashboardLayoutComponent;
|
|
13
13
|
sidebarItems: DashboardSidebarItemsAndGroupsDefinitions;
|
|
14
14
|
sizing?: DashboardLayoutSidebarSizing;
|
|
15
|
+
/**
|
|
16
|
+
* Width of the sidebar while it is open (expanded) on desktop viewports, as
|
|
17
|
+
* any CSS length (e.g. `"18rem"`, `"260px"`, `"20vw"`). Defaults to
|
|
18
|
+
* `14rem`. Use a wider value to fit long link titles on one line, or a
|
|
19
|
+
* narrower one for compact menus.
|
|
20
|
+
*
|
|
21
|
+
* The value is applied through the `--dashboard-sidebar-open-width` CSS
|
|
22
|
+
* custom property, so any length works without a matching Tailwind class
|
|
23
|
+
* having to exist. The main content area shifts to match. The collapsed
|
|
24
|
+
* (icon-only) desktop width and the mobile Sheet width are unaffected; use
|
|
25
|
+
* `sizing` to change those.
|
|
26
|
+
*/
|
|
27
|
+
sidebarOpenWidth?: string;
|
|
15
28
|
onOpenSidebar?: () => void;
|
|
16
29
|
onCloseSidebar?: () => void;
|
|
17
30
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ReactElement } from "react";
|
|
2
2
|
import type { DashboardLayoutProps } from "./DashboardLayoutProps";
|
|
3
3
|
export type { DashboardLayoutProps };
|
|
4
|
-
export declare function DashboardLayout({ children, wordmark, logo, Link, brandHref, topBarTitle, usePathname, printHidden, ...props }: DashboardLayoutProps): ReactElement;
|
|
4
|
+
export declare function DashboardLayout({ children, wordmark, logo, Link, brandHref, topBarTitle, usePathname, printHidden, sidebarOpenWidth, ...props }: DashboardLayoutProps): ReactElement;
|
|
5
5
|
export default DashboardLayout;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import DashboardSidebar, { DashboardLayoutSidebarTrigger, DashboardSidebarContextProvider, useCloseDashboardSidebarOnRouteChange, useDashboardSidebarOpenState, useDashboardSidebarSizing, } from "./dashboard-sidebar";
|
|
3
|
+
import DashboardSidebar, { DashboardLayoutSidebarTrigger, DashboardSidebarContextProvider, useCloseDashboardSidebarOnRouteChange, useDashboardSidebarOpenState, useDashboardSidebarSizing, DASHBOARD_SIDEBAR_OPEN_WIDTH_CSS_VARIABLE, } from "./dashboard-sidebar";
|
|
4
4
|
import { Separator } from "../../ui/separator";
|
|
5
5
|
import DashboardLayoutMainContentContainer from "./dashboard-layout-main-content-container";
|
|
6
6
|
import { cn } from "../../../lib/utils";
|
|
@@ -18,8 +18,17 @@ function AutoCloseSidebarOnNavigation({ usePathname, }) {
|
|
|
18
18
|
useCloseDashboardSidebarOnRouteChange(usePathname);
|
|
19
19
|
return null;
|
|
20
20
|
}
|
|
21
|
-
export function DashboardLayout({ children, wordmark, logo, Link, brandHref, topBarTitle, usePathname, printHidden = false, ...props }) {
|
|
21
|
+
export function DashboardLayout({ children, wordmark, logo, Link, brandHref, topBarTitle, usePathname, printHidden = false, sidebarOpenWidth, ...props }) {
|
|
22
22
|
const size = useDashboardSidebarSizing();
|
|
23
|
+
// The open-width override travels as a CSS custom property on the root
|
|
24
|
+
// container. The default sizing classnames for the expanded sidebar and the
|
|
25
|
+
// content container's open-state width/offset read it with a 14rem
|
|
26
|
+
// fallback, so an unset prop leaves the layout exactly as before.
|
|
27
|
+
const containerStyle = typeof sidebarOpenWidth === "string" && sidebarOpenWidth.length > 0
|
|
28
|
+
? {
|
|
29
|
+
[DASHBOARD_SIDEBAR_OPEN_WIDTH_CSS_VARIABLE]: sidebarOpenWidth,
|
|
30
|
+
}
|
|
31
|
+
: undefined;
|
|
23
32
|
function HeaderBarPageIdentifierComponent() {
|
|
24
33
|
if (typeof topBarTitle === "string") {
|
|
25
34
|
return _jsx("h2", { className: "font-bold text-lg", children: topBarTitle });
|
|
@@ -30,11 +39,11 @@ export function DashboardLayout({ children, wordmark, logo, Link, brandHref, top
|
|
|
30
39
|
}
|
|
31
40
|
}
|
|
32
41
|
const TopBarButtonsComponent = props.topBarButtons;
|
|
33
|
-
return (_jsxs(DashboardSidebarContextProvider, { sidebarItems: props.sidebarItems, sizing: props.sizing, onOpenSidebar: props.onOpenSidebar, onCloseSidebar: props.onCloseSidebar, children: [typeof usePathname === "function" && (_jsx(AutoCloseSidebarOnNavigation, { usePathname: usePathname })), _jsxs("div", { id: "dashboard-layout-container", className: cn("w-full h-dvh min-h-dvh",
|
|
42
|
+
return (_jsxs(DashboardSidebarContextProvider, { sidebarItems: props.sidebarItems, sizing: props.sizing, sidebarOpenWidth: sidebarOpenWidth, onOpenSidebar: props.onOpenSidebar, onCloseSidebar: props.onCloseSidebar, children: [typeof usePathname === "function" && (_jsx(AutoCloseSidebarOnNavigation, { usePathname: usePathname })), _jsxs("div", { id: "dashboard-layout-container", className: cn("w-full h-dvh min-h-dvh",
|
|
34
43
|
// When hiding chrome for print, let the container grow to fit all
|
|
35
44
|
// page content across printed pages instead of clamping to the
|
|
36
45
|
// on-screen viewport height.
|
|
37
|
-
printHidden && "print:h-auto print:min-h-0"), children: [_jsx(DashboardSidebar, { wordmark: wordmark, Link: Link, brandHref: brandHref, logo: logo, sidebarFooterContent: props.sidebarFooterContent, className: cn(printHidden && "print:hidden") }), _jsxs(DashboardLayoutMainContentContainer, { printHidden: printHidden, children: [_jsx("header", { id: "dashboard-layout-main-content-header", className: cn("sticky top-0", "flex shrink-0 items-center gap-2", "transition-[width,height] ease-linear", "bg-background", "border-b border-border", size.sidebar_and_header_z_index_classname, printHidden && "print:hidden"), style: {
|
|
46
|
+
printHidden && "print:h-auto print:min-h-0"), style: containerStyle, children: [_jsx(DashboardSidebar, { wordmark: wordmark, Link: Link, brandHref: brandHref, logo: logo, sidebarFooterContent: props.sidebarFooterContent, className: cn(printHidden && "print:hidden") }), _jsxs(DashboardLayoutMainContentContainer, { printHidden: printHidden, children: [_jsx("header", { id: "dashboard-layout-main-content-header", className: cn("sticky top-0", "flex shrink-0 items-center gap-2", "transition-[width,height] ease-linear", "bg-background", "border-b border-border", size.sidebar_and_header_z_index_classname, printHidden && "print:hidden"), style: {
|
|
38
47
|
height: size.header_height,
|
|
39
48
|
}, children: _jsxs("div", { className: "flex flex-row justify-between items-center gap-2 px-4 w-full", children: [_jsx(DashboardLayoutSidebarTrigger, {}), _jsx(Separator, { orientation: "vertical", className: "mr-2 data-[orientation=vertical]:h-4" }), _jsx(HeaderBarPageIdentifierComponent, {}), _jsx("div", { role: "none", className: "grow" }), typeof TopBarButtonsComponent === "function" && (_jsx(TopBarButtonsComponent, { useDashboardSidebarSizing: useDashboardSidebarSizing, useDashboardSidebarOpenState: useDashboardSidebarOpenState, Link: Link }))] }) }), children] })] })] }));
|
|
40
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-layout.js","sourceRoot":"","sources":["../../../../src/components/layout/dashboard-layout/dashboard-layout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAGb,OAAO,gBAAgB,EAAE,EACvB,6BAA6B,EAC7B,+BAA+B,EAC/B,qCAAqC,EACrC,4BAA4B,EAC5B,yBAAyB,
|
|
1
|
+
{"version":3,"file":"dashboard-layout.js","sourceRoot":"","sources":["../../../../src/components/layout/dashboard-layout/dashboard-layout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type PropsWithChildren, type ReactElement } from "react";
|
|
2
2
|
import { type DashboardSidebarItemsAndGroupsDefinitions } from "./dashboard-sidebar-items-and-groups-context";
|
|
3
3
|
import { type DashboardLayoutSidebarSizing } from "./dashboard-sidebar-sizing";
|
|
4
4
|
interface DashboardLayoutContextProviderProps extends PropsWithChildren {
|
|
5
5
|
sidebarItems: DashboardSidebarItemsAndGroupsDefinitions;
|
|
6
6
|
sizing?: DashboardLayoutSidebarSizing;
|
|
7
|
+
/**
|
|
8
|
+
* Desktop open (expanded) sidebar width, as any CSS length. When provided,
|
|
9
|
+
* it is reflected into the sizing context's `desktop_expanded_width` so
|
|
10
|
+
* that consumer components reading `useDashboardSidebarSizing()` see the
|
|
11
|
+
* effective value. The actual layout width is driven by the
|
|
12
|
+
* `--dashboard-sidebar-open-width` custom property, which `DashboardLayout`
|
|
13
|
+
* sets on its root container.
|
|
14
|
+
*/
|
|
15
|
+
sidebarOpenWidth?: string;
|
|
7
16
|
onOpenSidebar?: () => void;
|
|
8
17
|
onCloseSidebar?: () => void;
|
|
9
18
|
}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo } from "react";
|
|
3
4
|
import { DashboardSidebarItemsAndGroupsContext, } from "./dashboard-sidebar-items-and-groups-context";
|
|
4
5
|
import DashboardSidebarOpenStateProvider from "./dashboard-sidebar-open-state-provider";
|
|
5
6
|
import { DashboardLayoutSidebarSizeContext, DEFAULT_DASHBOARD_SIDEBAR_SIZE, } from "./dashboard-sidebar-sizing";
|
|
6
7
|
export function DashboardSidebarContextProvider({ children, sidebarItems, ...props }) {
|
|
7
|
-
|
|
8
|
+
const baseSizing = props.sizing ?? DEFAULT_DASHBOARD_SIDEBAR_SIZE;
|
|
9
|
+
const sidebarOpenWidth = props.sidebarOpenWidth;
|
|
10
|
+
const sizing = useMemo(() => typeof sidebarOpenWidth === "string" && sidebarOpenWidth.length > 0
|
|
11
|
+
? { ...baseSizing, desktop_expanded_width: sidebarOpenWidth }
|
|
12
|
+
: baseSizing, [baseSizing, sidebarOpenWidth]);
|
|
13
|
+
return (_jsx(DashboardSidebarOpenStateProvider, { onOpenSidebar: props.onOpenSidebar, onCloseSidebar: props.onCloseSidebar, children: _jsx(DashboardSidebarItemsAndGroupsContext.Provider, { value: sidebarItems, children: _jsx(DashboardLayoutSidebarSizeContext.Provider, { value: sizing, children: children }) }) }));
|
|
8
14
|
}
|
|
9
15
|
export default DashboardSidebarContextProvider;
|
|
10
16
|
//# sourceMappingURL=dashboard-sidebar-context-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-sidebar-context-provider.js","sourceRoot":"","sources":["../../../../../src/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-context-provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"dashboard-sidebar-context-provider.js","sourceRoot":"","sources":["../../../../../src/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-context-provider.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,OAAO,EAA6C,MAAM,OAAO,CAAC;AAC3E,OAAO,EACL,qCAAqC,GAEtC,MAAM,8CAA8C,CAAC;AACtD,OAAO,iCAAiC,MAAM,yCAAyC,CAAC;AACxF,OAAO,EACL,iCAAiC,EACjC,8BAA8B,GAE/B,MAAM,4BAA4B,CAAC;AAkBpC,MAAM,UAAU,+BAA+B,CAAC,EAC9C,QAAQ,EACR,YAAY,EACZ,GAAG,KAAK,EAC4B;IACpC,MAAM,UAAU,GACd,KAAK,CAAC,MAAM,IAAI,8BAA8B,CAAC;IACjD,MAAM,gBAAgB,GAAuB,KAAK,CAAC,gBAAgB,CAAC;IACpE,MAAM,MAAM,GAAiC,OAAO,CAClD,GAAiC,EAAE,CACjC,OAAO,gBAAgB,KAAK,QAAQ,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC;QACjE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,sBAAsB,EAAE,gBAAgB,EAAE;QAC7D,CAAC,CAAC,UAAU,EAChB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAC/B,CAAC;IACF,OAAO,CACL,KAAC,iCAAiC,IAChC,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,cAAc,EAAE,KAAK,CAAC,cAAc,YAEpC,KAAC,qCAAqC,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,YACjE,KAAC,iCAAiC,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YACtD,QAAQ,GACkC,GACE,GACf,CACrC,CAAC;AACJ,CAAC;AAED,eAAe,+BAA+B,CAAC"}
|
package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-sizing.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS custom property that carries the desktop *open* (expanded) sidebar
|
|
3
|
+
* width. `DashboardLayout` sets it on its root container from the
|
|
4
|
+
* `sidebarOpenWidth` prop, and the default sizing classnames below read it
|
|
5
|
+
* with a `14rem` fallback — so a consumer can pick any width without needing
|
|
6
|
+
* Tailwind to have generated a matching arbitrary-value class for it.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DASHBOARD_SIDEBAR_OPEN_WIDTH_CSS_VARIABLE = "--dashboard-sidebar-open-width";
|
|
9
|
+
/**
|
|
10
|
+
* The desktop open (expanded) sidebar width used when `sidebarOpenWidth` is
|
|
11
|
+
* not supplied to `DashboardLayout`.
|
|
12
|
+
*/
|
|
13
|
+
export declare const DEFAULT_DASHBOARD_SIDEBAR_OPEN_WIDTH = "14rem";
|
|
1
14
|
export interface DashboardLayoutSidebarSizing {
|
|
2
15
|
desktop_collapsed_width: string;
|
|
3
16
|
desktop_collapsed_width_classname: string;
|
|
@@ -45,13 +58,13 @@ export declare const DEFAULT_DASHBOARD_SIDEBAR_SIZE: {
|
|
|
45
58
|
readonly desktop_collapsed_width: "4rem";
|
|
46
59
|
readonly desktop_collapsed_width_classname: "w-[4rem]";
|
|
47
60
|
readonly desktop_expanded_width: "14rem";
|
|
48
|
-
readonly desktop_expanded_width_classname: "w-[14rem]";
|
|
61
|
+
readonly desktop_expanded_width_classname: "w-[var(--dashboard-sidebar-open-width,14rem)]";
|
|
49
62
|
readonly mobile_expanded_width: "16rem";
|
|
50
63
|
readonly mobile_expanded_width_classname: "w-[16rem]";
|
|
51
64
|
readonly header_height: "4rem";
|
|
52
65
|
readonly header_height_classname: "h-[4rem]";
|
|
53
|
-
readonly content_container_desktop_sidebar_open_width_classname: "md:w-[calc(100%-14rem)]";
|
|
54
|
-
readonly content_container_desktop_sidebar_open_left_classname: "md:left-[14rem]";
|
|
66
|
+
readonly content_container_desktop_sidebar_open_width_classname: "md:w-[calc(100%-var(--dashboard-sidebar-open-width,14rem))]";
|
|
67
|
+
readonly content_container_desktop_sidebar_open_left_classname: "md:left-[var(--dashboard-sidebar-open-width,14rem)]";
|
|
55
68
|
readonly content_container_desktop_sidebar_closed_width_classname: "md:w-[calc(100%-4rem)]";
|
|
56
69
|
readonly content_container_desktop_sidebar_closed_left_classname: "md:left-[4rem]";
|
|
57
70
|
readonly sidebar_menu_item_height: "2.5rem";
|
package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-sizing.js
CHANGED
|
@@ -1,15 +1,33 @@
|
|
|
1
1
|
import { createContext } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* CSS custom property that carries the desktop *open* (expanded) sidebar
|
|
4
|
+
* width. `DashboardLayout` sets it on its root container from the
|
|
5
|
+
* `sidebarOpenWidth` prop, and the default sizing classnames below read it
|
|
6
|
+
* with a `14rem` fallback — so a consumer can pick any width without needing
|
|
7
|
+
* Tailwind to have generated a matching arbitrary-value class for it.
|
|
8
|
+
*/
|
|
9
|
+
export const DASHBOARD_SIDEBAR_OPEN_WIDTH_CSS_VARIABLE = "--dashboard-sidebar-open-width";
|
|
10
|
+
/**
|
|
11
|
+
* The desktop open (expanded) sidebar width used when `sidebarOpenWidth` is
|
|
12
|
+
* not supplied to `DashboardLayout`.
|
|
13
|
+
*/
|
|
14
|
+
export const DEFAULT_DASHBOARD_SIDEBAR_OPEN_WIDTH = "14rem";
|
|
2
15
|
export const DEFAULT_DASHBOARD_SIDEBAR_SIZE = {
|
|
3
16
|
desktop_collapsed_width: `4rem`,
|
|
4
17
|
desktop_collapsed_width_classname: `w-[4rem]`,
|
|
5
|
-
desktop_expanded_width:
|
|
6
|
-
|
|
18
|
+
desktop_expanded_width: DEFAULT_DASHBOARD_SIDEBAR_OPEN_WIDTH,
|
|
19
|
+
// Reads the `--dashboard-sidebar-open-width` custom property (falling back
|
|
20
|
+
// to 14rem) so `DashboardLayout`'s `sidebarOpenWidth` prop can override the
|
|
21
|
+
// expanded width with an inline CSS variable. Keep this, the two
|
|
22
|
+
// `content_container_desktop_sidebar_open_*` classnames below, and
|
|
23
|
+
// `DEFAULT_DASHBOARD_SIDEBAR_OPEN_WIDTH` in sync.
|
|
24
|
+
desktop_expanded_width_classname: `w-[var(--dashboard-sidebar-open-width,14rem)]`,
|
|
7
25
|
mobile_expanded_width: `16rem`,
|
|
8
26
|
mobile_expanded_width_classname: `w-[16rem]`,
|
|
9
27
|
header_height: `4rem`,
|
|
10
28
|
header_height_classname: `h-[4rem]`,
|
|
11
|
-
content_container_desktop_sidebar_open_width_classname: "md:w-[calc(100%-14rem)]",
|
|
12
|
-
content_container_desktop_sidebar_open_left_classname: "md:left-[14rem]",
|
|
29
|
+
content_container_desktop_sidebar_open_width_classname: "md:w-[calc(100%-var(--dashboard-sidebar-open-width,14rem))]",
|
|
30
|
+
content_container_desktop_sidebar_open_left_classname: "md:left-[var(--dashboard-sidebar-open-width,14rem)]",
|
|
13
31
|
content_container_desktop_sidebar_closed_width_classname: "md:w-[calc(100%-4rem)]",
|
|
14
32
|
content_container_desktop_sidebar_closed_left_classname: "md:left-[4rem]",
|
|
15
33
|
sidebar_menu_item_height: "2.5rem",
|
package/dist/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-sizing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-sidebar-sizing.js","sourceRoot":"","sources":["../../../../../src/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-sizing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"dashboard-sidebar-sizing.js","sourceRoot":"","sources":["../../../../../src/components/layout/dashboard-layout/dashboard-sidebar/dashboard-sidebar-sizing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,yCAAyC,GACpD,gCAAgC,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,OAAO,CAAC;AA8C5D,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,uBAAuB,EAAE,MAAM;IAC/B,iCAAiC,EAAE,UAAU;IAC7C,sBAAsB,EAAE,oCAAoC;IAC5D,2EAA2E;IAC3E,4EAA4E;IAC5E,iEAAiE;IACjE,mEAAmE;IACnE,kDAAkD;IAClD,gCAAgC,EAAE,+CAA+C;IACjF,qBAAqB,EAAE,OAAO;IAC9B,+BAA+B,EAAE,WAAW;IAC5C,aAAa,EAAE,MAAM;IACrB,uBAAuB,EAAE,UAAU;IACnC,sDAAsD,EACpD,6DAA6D;IAC/D,qDAAqD,EACnD,qDAAqD;IACvD,wDAAwD,EACtD,wBAAwB;IAC1B,uDAAuD,EAAE,gBAAgB;IACzE,wBAAwB,EAAE,QAAQ;IAClC,kCAAkC,EAAE,YAAY;IAChD,4EAA4E;IAC5E,4CAA4C;IAC5C,gDAAgD,EAAE,CAAC;IACnD,oCAAoC,EAAE,MAAM;IAC5C,+BAA+B,EAAE,OAAO;IACxC,oCAAoC,EAAE,MAAM;CACG,CAAC;AAElD,MAAM,CAAC,MAAM,iCAAiC,GAC5C,aAAa,CAA+B,8BAA8B,CAAC,CAAC"}
|
|
@@ -9,4 +9,5 @@ export type { DashboardSidebarItemDefinition } from "./dashboard-sidebar-item-de
|
|
|
9
9
|
export type { DashboardSidebarItemGroupDefinition } from "./dashboard-sidebar-item-group";
|
|
10
10
|
export type { DashboardSidebarItemsAndGroupsDefinitions } from "./dashboard-sidebar-items-and-groups-context";
|
|
11
11
|
export type { DashboardLayoutSidebarSizing } from "./dashboard-sidebar-sizing";
|
|
12
|
+
export { DASHBOARD_SIDEBAR_OPEN_WIDTH_CSS_VARIABLE, DEFAULT_DASHBOARD_SIDEBAR_OPEN_WIDTH, } from "./dashboard-sidebar-sizing";
|
|
12
13
|
export type { IDashboardSidebarOpenStateContextType } from "./dashboard-sidebar-open-state";
|
|
@@ -5,4 +5,5 @@ export { useDashboardSidebarSizing } from "./useDashboardSidebarSizing";
|
|
|
5
5
|
export { useDashboardSidebarOpenStateDispatch } from "./useDashboardSidebarOpenStateDispatch";
|
|
6
6
|
export { useCloseDashboardSidebarOnRouteChange } from "./useCloseDashboardSidebarOnRouteChange";
|
|
7
7
|
export { DashboardSidebarContextProvider } from "./dashboard-sidebar-context-provider";
|
|
8
|
+
export { DASHBOARD_SIDEBAR_OPEN_WIDTH_CSS_VARIABLE, DEFAULT_DASHBOARD_SIDEBAR_OPEN_WIDTH, } from "./dashboard-sidebar-sizing";
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/layout/dashboard-layout/dashboard-sidebar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,IAAI,OAAO,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAC;AAC9F,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAEhG,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/components/layout/dashboard-layout/dashboard-sidebar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,IAAI,OAAO,GAC5B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,oCAAoC,EAAE,MAAM,wCAAwC,CAAC;AAC9F,OAAO,EAAE,qCAAqC,EAAE,MAAM,yCAAyC,CAAC;AAEhG,OAAO,EAAE,+BAA+B,EAAE,MAAM,sCAAsC,CAAC;AAMvF,OAAO,EACL,yCAAyC,EACzC,oCAAoC,GACrC,MAAM,4BAA4B,CAAC"}
|
|
@@ -4,3 +4,4 @@ export { DashboardLayout as default } from "./dashboard-layout";
|
|
|
4
4
|
export type * from "./customizable-dashboard-component-type";
|
|
5
5
|
export { useDashboardSidebarOpenState, useDashboardSidebarOpenStateDispatch, useCloseDashboardSidebarOnRouteChange, } from "./dashboard-sidebar";
|
|
6
6
|
export type { DashboardSidebarItemDefinition, DashboardSidebarItemGroupDefinition, DashboardSidebarItemsAndGroupsDefinitions, } from "./dashboard-sidebar";
|
|
7
|
+
export { DASHBOARD_SIDEBAR_OPEN_WIDTH_CSS_VARIABLE, DEFAULT_DASHBOARD_SIDEBAR_OPEN_WIDTH, } from "./dashboard-sidebar";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export * from "./dashboard-layout";
|
|
2
2
|
export { DashboardLayout as default } from "./dashboard-layout";
|
|
3
3
|
export { useDashboardSidebarOpenState, useDashboardSidebarOpenStateDispatch, useCloseDashboardSidebarOnRouteChange, } from "./dashboard-sidebar";
|
|
4
|
+
export { DASHBOARD_SIDEBAR_OPEN_WIDTH_CSS_VARIABLE, DEFAULT_DASHBOARD_SIDEBAR_OPEN_WIDTH, } from "./dashboard-sidebar";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/layout/dashboard-layout/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIhE,OAAO,EACL,4BAA4B,EAC5B,oCAAoC,EACpC,qCAAqC,GACtC,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/layout/dashboard-layout/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AAEnC,OAAO,EAAE,eAAe,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIhE,OAAO,EACL,4BAA4B,EAC5B,oCAAoC,EACpC,qCAAqC,GACtC,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EACL,yCAAyC,EACzC,oCAAoC,GACrC,MAAM,qBAAqB,CAAC"}
|
|
@@ -196,6 +196,8 @@ export * from "./line-chart";
|
|
|
196
196
|
export type * from "./line-chart";
|
|
197
197
|
export * from "./radar-chart";
|
|
198
198
|
export type * from "./radar-chart";
|
|
199
|
+
export * from "./scatter-plot";
|
|
200
|
+
export type * from "./scatter-plot";
|
|
199
201
|
export * from "./comparison-slider";
|
|
200
202
|
export type * from "./comparison-slider";
|
|
201
203
|
export * from "./theme-selector";
|
|
@@ -97,6 +97,7 @@ export * from "./pie-chart";
|
|
|
97
97
|
export * from "./bar-chart";
|
|
98
98
|
export * from "./line-chart";
|
|
99
99
|
export * from "./radar-chart";
|
|
100
|
+
export * from "./scatter-plot";
|
|
100
101
|
export * from "./comparison-slider";
|
|
101
102
|
export * from "./theme-selector";
|
|
102
103
|
export * from "./tree-view";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/ui/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/ui/scatter-plot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,WAAW,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { type VariantProps } from "class-variance-authority";
|
|
2
|
+
import type { HTMLAttributes, KeyboardEvent, MouseEvent, ReactElement, ReactNode, Ref } from "react";
|
|
3
|
+
export declare const scatterPlotSizeIds: ["sm", "md", "lg", "xl"];
|
|
4
|
+
export type ScatterPlotSizeId = (typeof scatterPlotSizeIds)[number];
|
|
5
|
+
export declare const scatterPlotColorIds: ["default", "primary", "positive", "warning", "destructive", "muted"];
|
|
6
|
+
export type ScatterPlotColorId = (typeof scatterPlotColorIds)[number];
|
|
7
|
+
export declare const scatterPlotShapeIds: ["circle", "square", "triangle", "diamond"];
|
|
8
|
+
export type ScatterPlotShapeId = (typeof scatterPlotShapeIds)[number];
|
|
9
|
+
export declare const scatterPlotVariants: (props?: ({
|
|
10
|
+
size?: "sm" | "lg" | "xl" | "md" | null | undefined;
|
|
11
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
12
|
+
export interface ScatterPlotPoint {
|
|
13
|
+
/** X value in domain units. Non-finite values are skipped. */
|
|
14
|
+
x: number;
|
|
15
|
+
/** Y value in domain units. Non-finite values are skipped. */
|
|
16
|
+
y: number;
|
|
17
|
+
/**
|
|
18
|
+
* Optional magnitude used to scale the marker (bubble chart mode). Values
|
|
19
|
+
* are mapped through a square-root scale onto `sizeRange` so that marker
|
|
20
|
+
* *area* -- not radius -- is proportional to the value. Ignored when the
|
|
21
|
+
* chart has no `sizeRange`-eligible data.
|
|
22
|
+
*/
|
|
23
|
+
size?: number;
|
|
24
|
+
/** Human-readable label for the point (used in aria-labels and tooltips). */
|
|
25
|
+
label?: string;
|
|
26
|
+
/** Stable identifier for the point. Defaults to the index. */
|
|
27
|
+
id?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface ScatterPlotSeries {
|
|
30
|
+
/** Stable identifier for the series. Used as React key and click payload. */
|
|
31
|
+
id: string;
|
|
32
|
+
/** Display name for the series. */
|
|
33
|
+
label?: string;
|
|
34
|
+
/** Points to plot. Order is irrelevant except for paint order. */
|
|
35
|
+
points: ReadonlyArray<ScatterPlotPoint>;
|
|
36
|
+
/** Preset color id from the chart palette. Ignored if `color` is provided. */
|
|
37
|
+
colorId?: ScatterPlotColorId;
|
|
38
|
+
/**
|
|
39
|
+
* Override the marker color with a raw CSS color (e.g. `"#ff0080"` or
|
|
40
|
+
* `"hsl(var(--chart-1))"`). Takes precedence over `colorId`.
|
|
41
|
+
*/
|
|
42
|
+
color?: string;
|
|
43
|
+
/** Marker shape. Defaults to a rotation based on the series index. */
|
|
44
|
+
shape?: ScatterPlotShapeId;
|
|
45
|
+
/** Override the chart-level `pointRadius` for this series. */
|
|
46
|
+
pointRadius?: number;
|
|
47
|
+
/** Override the chart-level `pointOpacity` for this series. */
|
|
48
|
+
pointOpacity?: number;
|
|
49
|
+
/** Render a least-squares trend line for this series. Defaults to `false`. */
|
|
50
|
+
trendLine?: boolean;
|
|
51
|
+
/** Extra classes applied to this series' markers. */
|
|
52
|
+
className?: string;
|
|
53
|
+
/** Fired when a point in this series is clicked or activated via keyboard. */
|
|
54
|
+
onPointClick?: (point: ScatterPlotPoint, series: ScatterPlotSeries, event: MouseEvent<SVGPathElement> | KeyboardEvent<SVGPathElement>) => void;
|
|
55
|
+
}
|
|
56
|
+
export interface ScatterPlotValueLabelContext {
|
|
57
|
+
series: ScatterPlotSeries;
|
|
58
|
+
point: ScatterPlotPoint;
|
|
59
|
+
index: number;
|
|
60
|
+
}
|
|
61
|
+
export interface ScatterPlotReferenceLine {
|
|
62
|
+
/** Position of the line in domain units. */
|
|
63
|
+
value: number;
|
|
64
|
+
/** Optional label rendered next to the line. */
|
|
65
|
+
label?: string;
|
|
66
|
+
/** Extra classes applied to the line element. */
|
|
67
|
+
className?: string;
|
|
68
|
+
}
|
|
69
|
+
export interface ScatterPlotProps extends Omit<HTMLAttributes<HTMLDivElement>, "onClick">, VariantProps<typeof scatterPlotVariants> {
|
|
70
|
+
/** Series to render, in order (later series are drawn on top). */
|
|
71
|
+
series: ReadonlyArray<ScatterPlotSeries>;
|
|
72
|
+
/** Accessible label describing what the chart represents. */
|
|
73
|
+
label: string;
|
|
74
|
+
/** Override the rendered canvas width in pixels (defaults are size-aware). */
|
|
75
|
+
width?: number;
|
|
76
|
+
/** Override the rendered canvas height in pixels (defaults are size-aware). */
|
|
77
|
+
height?: number;
|
|
78
|
+
/** Lower bound of the x-axis. Defaults to the smallest x across series. */
|
|
79
|
+
xMin?: number;
|
|
80
|
+
/** Upper bound of the x-axis. Defaults to the largest x across series. */
|
|
81
|
+
xMax?: number;
|
|
82
|
+
/** Lower bound of the y-axis. Defaults to the smallest y across series. */
|
|
83
|
+
yMin?: number;
|
|
84
|
+
/** Upper bound of the y-axis. Defaults to the largest y across series. */
|
|
85
|
+
yMax?: number;
|
|
86
|
+
/** Marker radius in pixels when points carry no `size`. Defaults to `4`. */
|
|
87
|
+
pointRadius?: number;
|
|
88
|
+
/**
|
|
89
|
+
* Min/max marker radius in pixels for points that carry a `size`. Defaults
|
|
90
|
+
* to `[4, 14]`.
|
|
91
|
+
*/
|
|
92
|
+
sizeRange?: readonly [number, number];
|
|
93
|
+
/** Marker fill opacity, useful for dense/overlapping data. Defaults to `0.8`. */
|
|
94
|
+
pointOpacity?: number;
|
|
95
|
+
/** Render the x/y axis lines. Defaults to `true`. */
|
|
96
|
+
showAxis?: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Number of evenly-spaced horizontal gridlines drawn across the y-axis. `0`
|
|
99
|
+
* disables them. Defaults to `0`.
|
|
100
|
+
*/
|
|
101
|
+
gridLineCount?: number;
|
|
102
|
+
/**
|
|
103
|
+
* Number of evenly-spaced vertical gridlines drawn across the x-axis. `0`
|
|
104
|
+
* disables them. Defaults to `0`.
|
|
105
|
+
*/
|
|
106
|
+
verticalGridLineCount?: number;
|
|
107
|
+
/**
|
|
108
|
+
* Format an x-axis tick label. Return `null` to skip the tick. When omitted,
|
|
109
|
+
* ticks render only if `showXAxisLabels` is `true` (raw values).
|
|
110
|
+
*/
|
|
111
|
+
xTickFormatter?: (x: number, index: number) => string | null;
|
|
112
|
+
/** Number of evenly-spaced x-axis ticks, endpoints included. Defaults to `5`. */
|
|
113
|
+
xTickCount?: number;
|
|
114
|
+
/** Render raw-value x-axis ticks. Ignored when `xTickFormatter` is set. */
|
|
115
|
+
showXAxisLabels?: boolean;
|
|
116
|
+
/**
|
|
117
|
+
* Format a y-axis tick label. Return `null` to skip the tick. When omitted,
|
|
118
|
+
* ticks render only if `showYAxisLabels` is `true` (raw values).
|
|
119
|
+
*/
|
|
120
|
+
yTickFormatter?: (y: number, index: number) => string | null;
|
|
121
|
+
/** Number of evenly-spaced y-axis ticks, endpoints included. Defaults to `5`. */
|
|
122
|
+
yTickCount?: number;
|
|
123
|
+
/** Render raw-value y-axis ticks. Ignored when `yTickFormatter` is set. */
|
|
124
|
+
showYAxisLabels?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Width in pixels reserved for y-axis tick labels (the left gutter).
|
|
127
|
+
* Defaults to `36`. Only applied when y-axis labels are visible.
|
|
128
|
+
*/
|
|
129
|
+
yTickLabelWidth?: number;
|
|
130
|
+
/** Axis title rendered under the x-axis. */
|
|
131
|
+
xAxisTitle?: string;
|
|
132
|
+
/** Axis title rendered (rotated) alongside the y-axis. */
|
|
133
|
+
yAxisTitle?: string;
|
|
134
|
+
/** Vertical reference line(s) at fixed x positions. */
|
|
135
|
+
xReferenceLines?: ReadonlyArray<ScatterPlotReferenceLine>;
|
|
136
|
+
/** Horizontal reference line(s) at fixed y positions. */
|
|
137
|
+
yReferenceLines?: ReadonlyArray<ScatterPlotReferenceLine>;
|
|
138
|
+
/** Render a text label next to every point. Defaults to `false`. */
|
|
139
|
+
showValueLabels?: boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Customize the point-label text. Return `null` to skip a point. Defaults to
|
|
142
|
+
* the point's `label`, falling back to `(x, y)`.
|
|
143
|
+
*/
|
|
144
|
+
valueLabelFormatter?: (context: ScatterPlotValueLabelContext) => string | null;
|
|
145
|
+
/**
|
|
146
|
+
* Fallback handler invoked for any point that doesn't have its own
|
|
147
|
+
* series-level `onPointClick`.
|
|
148
|
+
*/
|
|
149
|
+
onPointClick?: (point: ScatterPlotPoint, series: ScatterPlotSeries, event: MouseEvent<SVGPathElement> | KeyboardEvent<SVGPathElement>) => void;
|
|
150
|
+
/** Text rendered when no finite data points are supplied. */
|
|
151
|
+
emptyMessage?: string;
|
|
152
|
+
/** Optional content overlaid on top of the plot area. */
|
|
153
|
+
children?: ReactNode;
|
|
154
|
+
/** Extra classes for the overlay content wrapper. */
|
|
155
|
+
overlayClassName?: string;
|
|
156
|
+
/** Extra classes applied to every point-label `<text>` element. */
|
|
157
|
+
valueLabelClassName?: string;
|
|
158
|
+
/** Extra classes applied to every axis tick `<text>` element. */
|
|
159
|
+
tickLabelClassName?: string;
|
|
160
|
+
/** Extra classes applied to the axis / gridline `<line>` elements. */
|
|
161
|
+
axisClassName?: string;
|
|
162
|
+
/** Optional ref forwarded to the wrapper element. */
|
|
163
|
+
ref?: Ref<HTMLDivElement>;
|
|
164
|
+
}
|
|
165
|
+
declare function ScatterPlot({ series, label, size, width, height, xMin, xMax, yMin, yMax, pointRadius, sizeRange, pointOpacity, showAxis, gridLineCount, verticalGridLineCount, xTickFormatter, xTickCount, showXAxisLabels, yTickFormatter, yTickCount, showYAxisLabels, yTickLabelWidth, xAxisTitle, yAxisTitle, xReferenceLines, yReferenceLines, showValueLabels, valueLabelFormatter, onPointClick, emptyMessage, children, className, overlayClassName, valueLabelClassName, tickLabelClassName, axisClassName, ref, ...props }: ScatterPlotProps): ReactElement;
|
|
166
|
+
declare namespace ScatterPlot {
|
|
167
|
+
var displayName: string;
|
|
168
|
+
}
|
|
169
|
+
export { ScatterPlot };
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { useId } from "react";
|
|
5
|
+
import { cn } from "../../../lib/utils";
|
|
6
|
+
export const scatterPlotSizeIds = [
|
|
7
|
+
"sm",
|
|
8
|
+
"md",
|
|
9
|
+
"lg",
|
|
10
|
+
"xl",
|
|
11
|
+
];
|
|
12
|
+
export const scatterPlotColorIds = [
|
|
13
|
+
"default",
|
|
14
|
+
"primary",
|
|
15
|
+
"positive",
|
|
16
|
+
"warning",
|
|
17
|
+
"destructive",
|
|
18
|
+
"muted",
|
|
19
|
+
];
|
|
20
|
+
export const scatterPlotShapeIds = [
|
|
21
|
+
"circle",
|
|
22
|
+
"square",
|
|
23
|
+
"triangle",
|
|
24
|
+
"diamond",
|
|
25
|
+
];
|
|
26
|
+
/** Default canvas dimensions per size. Either axis can be overridden via the
|
|
27
|
+
* `width` / `height` props. */
|
|
28
|
+
const SIZE_TO_CANVAS = {
|
|
29
|
+
sm: { width: 240, height: 180 },
|
|
30
|
+
md: { width: 360, height: 260 },
|
|
31
|
+
lg: { width: 480, height: 340 },
|
|
32
|
+
xl: { width: 640, height: 440 },
|
|
33
|
+
};
|
|
34
|
+
const FILL_CLASSES = {
|
|
35
|
+
default: "fill-schemavaults-brand-blue",
|
|
36
|
+
primary: "fill-primary",
|
|
37
|
+
positive: "fill-emerald-500 dark:fill-emerald-400",
|
|
38
|
+
warning: "fill-warning",
|
|
39
|
+
destructive: "fill-destructive",
|
|
40
|
+
muted: "fill-muted-foreground",
|
|
41
|
+
};
|
|
42
|
+
const STROKE_CLASSES = {
|
|
43
|
+
default: "stroke-schemavaults-brand-blue",
|
|
44
|
+
primary: "stroke-primary",
|
|
45
|
+
positive: "stroke-emerald-500 dark:stroke-emerald-400",
|
|
46
|
+
warning: "stroke-warning",
|
|
47
|
+
destructive: "stroke-destructive",
|
|
48
|
+
muted: "stroke-muted-foreground",
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Fallback color/shape rotation when a series doesn't specify its own. Index
|
|
52
|
+
* is the series position in the input array, modulo the palette length. Shapes
|
|
53
|
+
* rotate alongside colors so overlapping series stay distinguishable without
|
|
54
|
+
* relying on color alone.
|
|
55
|
+
*/
|
|
56
|
+
const DEFAULT_COLOR_ROTATION = [
|
|
57
|
+
"default",
|
|
58
|
+
"positive",
|
|
59
|
+
"warning",
|
|
60
|
+
"destructive",
|
|
61
|
+
"primary",
|
|
62
|
+
"muted",
|
|
63
|
+
];
|
|
64
|
+
const DEFAULT_SHAPE_ROTATION = [
|
|
65
|
+
"circle",
|
|
66
|
+
"triangle",
|
|
67
|
+
"square",
|
|
68
|
+
"diamond",
|
|
69
|
+
];
|
|
70
|
+
export const scatterPlotVariants = cva("relative inline-flex shrink-0 items-center justify-center", {
|
|
71
|
+
variants: {
|
|
72
|
+
size: {
|
|
73
|
+
sm: "text-[10px]",
|
|
74
|
+
md: "text-[11px]",
|
|
75
|
+
lg: "text-xs",
|
|
76
|
+
xl: "text-sm",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
defaultVariants: {
|
|
80
|
+
size: "md",
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
function isFiniteNumber(value) {
|
|
84
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
85
|
+
}
|
|
86
|
+
function round(value) {
|
|
87
|
+
return value.toFixed(2);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Build the `d` attribute for a marker centered at (cx, cy). Every shape is
|
|
91
|
+
* drawn as a path so markers share one element type (and therefore one set of
|
|
92
|
+
* event handlers and focus semantics).
|
|
93
|
+
*/
|
|
94
|
+
function buildMarkerPath(shape, cx, cy, r) {
|
|
95
|
+
switch (shape) {
|
|
96
|
+
case "square": {
|
|
97
|
+
// Half-side chosen so the square's area approximates the circle's.
|
|
98
|
+
const h = r * 0.886;
|
|
99
|
+
return `M ${round(cx - h)} ${round(cy - h)} H ${round(cx + h)} V ${round(cy + h)} H ${round(cx - h)} Z`;
|
|
100
|
+
}
|
|
101
|
+
case "triangle": {
|
|
102
|
+
// Equilateral triangle with circumradius scaled for equal visual weight.
|
|
103
|
+
const R = r * 1.2;
|
|
104
|
+
const points = [-90, 30, 150]
|
|
105
|
+
.map((deg) => {
|
|
106
|
+
const rad = (deg * Math.PI) / 180;
|
|
107
|
+
return `${round(cx + R * Math.cos(rad))} ${round(cy + R * Math.sin(rad))}`;
|
|
108
|
+
})
|
|
109
|
+
.join(" L ");
|
|
110
|
+
return `M ${points} Z`;
|
|
111
|
+
}
|
|
112
|
+
case "diamond": {
|
|
113
|
+
const R = r * 1.25;
|
|
114
|
+
return `M ${round(cx)} ${round(cy - R)} L ${round(cx + R)} ${round(cy)} L ${round(cx)} ${round(cy + R)} L ${round(cx - R)} ${round(cy)} Z`;
|
|
115
|
+
}
|
|
116
|
+
case "circle":
|
|
117
|
+
default:
|
|
118
|
+
return `M ${round(cx - r)} ${round(cy)} a ${round(r)} ${round(r)} 0 1 0 ${round(r * 2)} 0 a ${round(r)} ${round(r)} 0 1 0 ${round(-r * 2)} 0 Z`;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Ordinary least-squares fit over the supplied domain points. Returns `null`
|
|
123
|
+
* when a line can't be determined (fewer than two points, or all x identical).
|
|
124
|
+
*/
|
|
125
|
+
function computeTrendLine(points) {
|
|
126
|
+
if (points.length < 2)
|
|
127
|
+
return null;
|
|
128
|
+
let sumX = 0;
|
|
129
|
+
let sumY = 0;
|
|
130
|
+
let sumXY = 0;
|
|
131
|
+
let sumXX = 0;
|
|
132
|
+
for (const p of points) {
|
|
133
|
+
sumX += p.x;
|
|
134
|
+
sumY += p.y;
|
|
135
|
+
sumXY += p.x * p.y;
|
|
136
|
+
sumXX += p.x * p.x;
|
|
137
|
+
}
|
|
138
|
+
const n = points.length;
|
|
139
|
+
const denominator = n * sumXX - sumX * sumX;
|
|
140
|
+
if (denominator === 0)
|
|
141
|
+
return null;
|
|
142
|
+
const slope = (n * sumXY - sumX * sumY) / denominator;
|
|
143
|
+
const intercept = (sumY - slope * sumX) / n;
|
|
144
|
+
if (!Number.isFinite(slope) || !Number.isFinite(intercept))
|
|
145
|
+
return null;
|
|
146
|
+
return { slope, intercept };
|
|
147
|
+
}
|
|
148
|
+
function ScatterPlot({ series, label, size, width, height, xMin, xMax, yMin, yMax, pointRadius = 4, sizeRange = [4, 14], pointOpacity = 0.8, showAxis = true, gridLineCount = 0, verticalGridLineCount = 0, xTickFormatter, xTickCount = 5, showXAxisLabels = false, yTickFormatter, yTickCount = 5, showYAxisLabels = false, yTickLabelWidth = 36, xAxisTitle, yAxisTitle, xReferenceLines, yReferenceLines, showValueLabels = false, valueLabelFormatter, onPointClick, emptyMessage = "No data", children, className, overlayClassName, valueLabelClassName, tickLabelClassName, axisClassName, ref, ...props }) {
|
|
149
|
+
const resolvedSize = size ?? "md";
|
|
150
|
+
const canvas = SIZE_TO_CANVAS[resolvedSize];
|
|
151
|
+
const W = width ?? canvas.width;
|
|
152
|
+
const H = height ?? canvas.height;
|
|
153
|
+
const titleId = useId();
|
|
154
|
+
const hasXAxisLabels = typeof xTickFormatter === "function" || showXAxisLabels;
|
|
155
|
+
const hasYAxisLabels = typeof yTickFormatter === "function" || showYAxisLabels;
|
|
156
|
+
// Reserve gutters for axis labels / titles.
|
|
157
|
+
const padTop = showValueLabels ? 16 : 8;
|
|
158
|
+
const padBottom = (hasXAxisLabels ? 20 : 8) + (xAxisTitle ? 16 : 0);
|
|
159
|
+
const padLeft = (hasYAxisLabels ? Math.max(8, yTickLabelWidth) : 8) +
|
|
160
|
+
(yAxisTitle ? 16 : 0);
|
|
161
|
+
const padRight = 10;
|
|
162
|
+
const plotX0 = padLeft;
|
|
163
|
+
const plotY0 = padTop;
|
|
164
|
+
const plotW = Math.max(0, W - padLeft - padRight);
|
|
165
|
+
const plotH = Math.max(0, H - padTop - padBottom);
|
|
166
|
+
// Determine the domain across all series, ignoring non-finite coordinates.
|
|
167
|
+
let domainXMin = Number.POSITIVE_INFINITY;
|
|
168
|
+
let domainXMax = Number.NEGATIVE_INFINITY;
|
|
169
|
+
let domainYMin = Number.POSITIVE_INFINITY;
|
|
170
|
+
let domainYMax = Number.NEGATIVE_INFINITY;
|
|
171
|
+
let domainSizeMin = Number.POSITIVE_INFINITY;
|
|
172
|
+
let domainSizeMax = Number.NEGATIVE_INFINITY;
|
|
173
|
+
let totalFinitePoints = 0;
|
|
174
|
+
for (const s of series) {
|
|
175
|
+
for (const p of s.points) {
|
|
176
|
+
if (!isFiniteNumber(p.x) || !isFiniteNumber(p.y))
|
|
177
|
+
continue;
|
|
178
|
+
totalFinitePoints += 1;
|
|
179
|
+
if (p.x < domainXMin)
|
|
180
|
+
domainXMin = p.x;
|
|
181
|
+
if (p.x > domainXMax)
|
|
182
|
+
domainXMax = p.x;
|
|
183
|
+
if (p.y < domainYMin)
|
|
184
|
+
domainYMin = p.y;
|
|
185
|
+
if (p.y > domainYMax)
|
|
186
|
+
domainYMax = p.y;
|
|
187
|
+
if (isFiniteNumber(p.size)) {
|
|
188
|
+
if (p.size < domainSizeMin)
|
|
189
|
+
domainSizeMin = p.size;
|
|
190
|
+
if (p.size > domainSizeMax)
|
|
191
|
+
domainSizeMax = p.size;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
const hasData = totalFinitePoints > 0;
|
|
196
|
+
const hasSizedPoints = Number.isFinite(domainSizeMin) && Number.isFinite(domainSizeMax);
|
|
197
|
+
const effectiveXMin = isFiniteNumber(xMin)
|
|
198
|
+
? xMin
|
|
199
|
+
: hasData
|
|
200
|
+
? domainXMin
|
|
201
|
+
: 0;
|
|
202
|
+
const effectiveXMax = isFiniteNumber(xMax)
|
|
203
|
+
? xMax
|
|
204
|
+
: hasData
|
|
205
|
+
? domainXMax
|
|
206
|
+
: 1;
|
|
207
|
+
const effectiveYMin = isFiniteNumber(yMin)
|
|
208
|
+
? yMin
|
|
209
|
+
: hasData
|
|
210
|
+
? domainYMin
|
|
211
|
+
: 0;
|
|
212
|
+
const effectiveYMax = isFiniteNumber(yMax)
|
|
213
|
+
? yMax
|
|
214
|
+
: hasData
|
|
215
|
+
? domainYMax
|
|
216
|
+
: 1;
|
|
217
|
+
const xSpan = effectiveXMax > effectiveXMin ? effectiveXMax - effectiveXMin : 1;
|
|
218
|
+
const ySpan = effectiveYMax > effectiveYMin ? effectiveYMax - effectiveYMin : 1;
|
|
219
|
+
const [minRadius, maxRadius] = sizeRange;
|
|
220
|
+
// Inset the data area so markers sitting on the domain edges aren't clipped.
|
|
221
|
+
const markerPad = hasSizedPoints
|
|
222
|
+
? Math.max(minRadius, maxRadius) + 2
|
|
223
|
+
: pointRadius + 2;
|
|
224
|
+
const innerW = Math.max(0, plotW - markerPad * 2);
|
|
225
|
+
const innerH = Math.max(0, plotH - markerPad * 2);
|
|
226
|
+
const projectX = (x) => plotX0 + markerPad + ((x - effectiveXMin) / xSpan) * innerW;
|
|
227
|
+
const projectY = (y) => plotY0 + markerPad + innerH - ((y - effectiveYMin) / ySpan) * innerH;
|
|
228
|
+
const sizeSpan = hasSizedPoints
|
|
229
|
+
? domainSizeMax - domainSizeMin
|
|
230
|
+
: 0;
|
|
231
|
+
const resolveRadius = (point, seriesRadius) => {
|
|
232
|
+
if (!hasSizedPoints || !isFiniteNumber(point.size))
|
|
233
|
+
return seriesRadius;
|
|
234
|
+
if (sizeSpan <= 0)
|
|
235
|
+
return maxRadius;
|
|
236
|
+
// Square-root scale: marker *area* tracks the value, not the radius.
|
|
237
|
+
const t = (point.size - domainSizeMin) / sizeSpan;
|
|
238
|
+
return minRadius + (maxRadius - minRadius) * Math.sqrt(t);
|
|
239
|
+
};
|
|
240
|
+
const resolved = series.map((s, seriesIndex) => {
|
|
241
|
+
const colorId = s.colorId ??
|
|
242
|
+
DEFAULT_COLOR_ROTATION[seriesIndex % DEFAULT_COLOR_ROTATION.length];
|
|
243
|
+
const shape = s.shape ??
|
|
244
|
+
DEFAULT_SHAPE_ROTATION[seriesIndex % DEFAULT_SHAPE_ROTATION.length];
|
|
245
|
+
const seriesRadius = s.pointRadius ?? pointRadius;
|
|
246
|
+
const points = [];
|
|
247
|
+
s.points.forEach((p, index) => {
|
|
248
|
+
if (!isFiniteNumber(p.x) || !isFiniteNumber(p.y))
|
|
249
|
+
return;
|
|
250
|
+
points.push({
|
|
251
|
+
point: p,
|
|
252
|
+
x: projectX(p.x),
|
|
253
|
+
y: projectY(p.y),
|
|
254
|
+
r: resolveRadius(p, seriesRadius),
|
|
255
|
+
index,
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
series: s,
|
|
260
|
+
points,
|
|
261
|
+
colorId,
|
|
262
|
+
shape,
|
|
263
|
+
opacity: s.pointOpacity ?? pointOpacity,
|
|
264
|
+
};
|
|
265
|
+
});
|
|
266
|
+
const horizontalGridLines = (() => {
|
|
267
|
+
if (gridLineCount <= 0)
|
|
268
|
+
return [];
|
|
269
|
+
const lines = [];
|
|
270
|
+
for (let i = 1; i <= gridLineCount; i += 1) {
|
|
271
|
+
lines.push(i / (gridLineCount + 1));
|
|
272
|
+
}
|
|
273
|
+
return lines;
|
|
274
|
+
})();
|
|
275
|
+
const verticalGridLines = (() => {
|
|
276
|
+
if (verticalGridLineCount <= 0)
|
|
277
|
+
return [];
|
|
278
|
+
const lines = [];
|
|
279
|
+
for (let i = 1; i <= verticalGridLineCount; i += 1) {
|
|
280
|
+
lines.push(i / (verticalGridLineCount + 1));
|
|
281
|
+
}
|
|
282
|
+
return lines;
|
|
283
|
+
})();
|
|
284
|
+
const xTicks = (() => {
|
|
285
|
+
if (!hasXAxisLabels || !hasData)
|
|
286
|
+
return [];
|
|
287
|
+
const count = Math.max(2, xTickCount);
|
|
288
|
+
const ticks = [];
|
|
289
|
+
for (let i = 0; i < count; i += 1) {
|
|
290
|
+
const t = i / (count - 1);
|
|
291
|
+
const value = effectiveXMin + t * xSpan;
|
|
292
|
+
const text = typeof xTickFormatter === "function"
|
|
293
|
+
? xTickFormatter(value, i)
|
|
294
|
+
: String(value);
|
|
295
|
+
if (text === null || text === "")
|
|
296
|
+
continue;
|
|
297
|
+
ticks.push({ x: projectX(value), text });
|
|
298
|
+
}
|
|
299
|
+
return ticks;
|
|
300
|
+
})();
|
|
301
|
+
const yTicks = (() => {
|
|
302
|
+
if (!hasYAxisLabels || !hasData)
|
|
303
|
+
return [];
|
|
304
|
+
const count = Math.max(2, yTickCount);
|
|
305
|
+
const ticks = [];
|
|
306
|
+
for (let i = 0; i < count; i += 1) {
|
|
307
|
+
// Iterate top-down (i = 0 -> yMax) so the first call to a custom
|
|
308
|
+
// formatter receives the largest value -- the order most consumers
|
|
309
|
+
// expect.
|
|
310
|
+
const t = i / (count - 1);
|
|
311
|
+
const value = effectiveYMax - t * ySpan;
|
|
312
|
+
const text = typeof yTickFormatter === "function"
|
|
313
|
+
? yTickFormatter(value, i)
|
|
314
|
+
: String(value);
|
|
315
|
+
if (text === null || text === "")
|
|
316
|
+
continue;
|
|
317
|
+
ticks.push({ y: projectY(value), text });
|
|
318
|
+
}
|
|
319
|
+
return ticks;
|
|
320
|
+
})();
|
|
321
|
+
return (_jsxs("div", { ref: ref, role: "img", "aria-labelledby": titleId, "data-slot": "scatter-plot", className: cn(scatterPlotVariants({ size }), className), style: { width: W, height: H }, ...props, children: [_jsxs("svg", { width: W, height: H, viewBox: `0 0 ${W} ${H}`, "aria-hidden": children ? "true" : undefined, className: "h-full w-full overflow-visible", children: [_jsx("title", { id: titleId, children: label }), horizontalGridLines.length > 0 || verticalGridLines.length > 0 ? (_jsxs("g", { "aria-hidden": "true", "data-slot": "scatter-plot-gridlines", className: "pointer-events-none", children: [horizontalGridLines.map((t) => {
|
|
322
|
+
const y = plotY0 + plotH - t * plotH;
|
|
323
|
+
return (_jsx("line", { x1: plotX0, y1: y, x2: plotX0 + plotW, y2: y, strokeWidth: 1, className: cn("stroke-border/60", axisClassName) }, `h-grid-${t}`));
|
|
324
|
+
}), verticalGridLines.map((t) => {
|
|
325
|
+
const x = plotX0 + t * plotW;
|
|
326
|
+
return (_jsx("line", { x1: x, y1: plotY0, x2: x, y2: plotY0 + plotH, strokeWidth: 1, className: cn("stroke-border/60", axisClassName) }, `v-grid-${t}`));
|
|
327
|
+
})] })) : null, showAxis ? (_jsxs("g", { "aria-hidden": "true", "data-slot": "scatter-plot-axis", className: "pointer-events-none", children: [_jsx("line", { x1: plotX0, y1: plotY0, x2: plotX0, y2: plotY0 + plotH, strokeWidth: 1, className: cn("stroke-border", axisClassName) }), _jsx("line", { x1: plotX0, y1: plotY0 + plotH, x2: plotX0 + plotW, y2: plotY0 + plotH, strokeWidth: 1, className: cn("stroke-border", axisClassName) })] })) : null, hasData && xReferenceLines && xReferenceLines.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "scatter-plot-x-reference-lines", className: "pointer-events-none select-none", children: xReferenceLines.map((line, index) => {
|
|
328
|
+
const x = projectX(line.value);
|
|
329
|
+
return (_jsxs("g", { children: [_jsx("line", { x1: x, y1: plotY0, x2: x, y2: plotY0 + plotH, strokeWidth: 1, strokeDasharray: "4 3", className: cn("stroke-muted-foreground/70", line.className) }), line.label ? (_jsx("text", { x: x + 4, y: plotY0 + 8, className: "fill-muted-foreground", children: line.label })) : null] }, `x-ref-${index}-${line.value}`));
|
|
330
|
+
}) })) : null, hasData && yReferenceLines && yReferenceLines.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "scatter-plot-y-reference-lines", className: "pointer-events-none select-none", children: yReferenceLines.map((line, index) => {
|
|
331
|
+
const y = projectY(line.value);
|
|
332
|
+
return (_jsxs("g", { children: [_jsx("line", { x1: plotX0, y1: y, x2: plotX0 + plotW, y2: y, strokeWidth: 1, strokeDasharray: "4 3", className: cn("stroke-muted-foreground/70", line.className) }), line.label ? (_jsx("text", { x: plotX0 + plotW - 4, y: y - 4, textAnchor: "end", className: "fill-muted-foreground", children: line.label })) : null] }, `y-ref-${index}-${line.value}`));
|
|
333
|
+
}) })) : null, !hasData ? (_jsx("text", { x: W / 2, y: H / 2, textAnchor: "middle", dominantBaseline: "central", className: "fill-muted-foreground", children: emptyMessage })) : (resolved.map((rs) => {
|
|
334
|
+
const rawColor = rs.series.color;
|
|
335
|
+
const fillClass = rawColor
|
|
336
|
+
? undefined
|
|
337
|
+
: FILL_CLASSES[rs.colorId];
|
|
338
|
+
const strokeClass = rawColor
|
|
339
|
+
? undefined
|
|
340
|
+
: STROKE_CLASSES[rs.colorId];
|
|
341
|
+
const handler = rs.series.onPointClick ?? onPointClick;
|
|
342
|
+
const isInteractive = typeof handler === "function";
|
|
343
|
+
const trend = rs.series.trendLine
|
|
344
|
+
? computeTrendLine(rs.series.points.filter((p) => isFiniteNumber(p.x) && isFiniteNumber(p.y)))
|
|
345
|
+
: null;
|
|
346
|
+
return (_jsxs("g", { "data-slot": "scatter-plot-series", "data-series-id": rs.series.id, children: [trend ? (_jsx("line", { "aria-hidden": "true", "data-slot": "scatter-plot-trend-line", x1: projectX(effectiveXMin), y1: projectY(trend.slope * effectiveXMin + trend.intercept), x2: projectX(effectiveXMax), y2: projectY(trend.slope * effectiveXMax + trend.intercept), stroke: rawColor, strokeWidth: 1.5, strokeDasharray: "5 4", strokeLinecap: "round", className: cn("pointer-events-none", strokeClass) })) : null, rs.points.map((rp) => {
|
|
347
|
+
const pointKey = rp.point.id ?? `${rs.series.id}-${rp.index}`;
|
|
348
|
+
const seriesName = rs.series.label ?? rs.series.id;
|
|
349
|
+
const ariaLabel = rp.point.label
|
|
350
|
+
? `${seriesName} – ${rp.point.label}: (${rp.point.x}, ${rp.point.y})`
|
|
351
|
+
: `${seriesName}: (${rp.point.x}, ${rp.point.y})`;
|
|
352
|
+
return (_jsx("path", { d: buildMarkerPath(rs.shape, rp.x, rp.y, rp.r), fill: rawColor ?? "currentColor", fillOpacity: rs.opacity, stroke: "hsl(var(--background))", strokeWidth: 1, "data-point-index": rp.index, "data-testid": `scatter-plot-point-${pointKey}`, role: isInteractive ? "button" : undefined, tabIndex: isInteractive ? 0 : undefined, "aria-label": ariaLabel, onClick: isInteractive
|
|
353
|
+
? (event) => {
|
|
354
|
+
handler(rp.point, rs.series, event);
|
|
355
|
+
}
|
|
356
|
+
: undefined, onKeyDown: isInteractive
|
|
357
|
+
? (event) => {
|
|
358
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
359
|
+
event.preventDefault();
|
|
360
|
+
handler(rp.point, rs.series, event);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
: undefined, className: cn("transition-opacity", fillClass, isInteractive &&
|
|
364
|
+
"cursor-pointer hover:opacity-80 focus:outline-none focus-visible:opacity-60", rs.series.className), children: _jsx("title", { children: ariaLabel }) }, pointKey));
|
|
365
|
+
}), showValueLabels
|
|
366
|
+
? rs.points.map((rp) => {
|
|
367
|
+
const text = valueLabelFormatter
|
|
368
|
+
? valueLabelFormatter({
|
|
369
|
+
series: rs.series,
|
|
370
|
+
point: rp.point,
|
|
371
|
+
index: rp.index,
|
|
372
|
+
})
|
|
373
|
+
: (rp.point.label ??
|
|
374
|
+
`(${rp.point.x}, ${rp.point.y})`);
|
|
375
|
+
if (text === null || text === "")
|
|
376
|
+
return null;
|
|
377
|
+
const labelKey = (rp.point.id ?? `${rs.series.id}-${rp.index}`) + "-val";
|
|
378
|
+
return (_jsx("text", { x: rp.x, y: rp.y - rp.r - 4, textAnchor: "middle", className: cn("pointer-events-none select-none fill-foreground font-medium", valueLabelClassName), children: text }, labelKey));
|
|
379
|
+
})
|
|
380
|
+
: null] }, rs.series.id));
|
|
381
|
+
})), xTicks.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "scatter-plot-x-ticks", className: "pointer-events-none select-none", children: xTicks.map((tick, index) => (_jsxs("g", { children: [_jsx("line", { x1: tick.x, x2: tick.x, y1: plotY0 + plotH, y2: plotY0 + plotH + 3, strokeWidth: 1, className: cn("stroke-border", axisClassName) }), _jsx("text", { x: tick.x, y: plotY0 + plotH + 14, textAnchor: "middle", className: cn("fill-muted-foreground", tickLabelClassName), children: tick.text })] }, `xtick-${index}-${tick.text}`))) })) : null, yTicks.length > 0 ? (_jsx("g", { "aria-hidden": "true", "data-slot": "scatter-plot-y-ticks", className: "pointer-events-none select-none", children: yTicks.map((tick, index) => (_jsxs("g", { children: [_jsx("line", { x1: plotX0 - 3, x2: plotX0, y1: tick.y, y2: tick.y, strokeWidth: 1, className: cn("stroke-border", axisClassName) }), _jsx("text", { x: plotX0 - 6, y: tick.y, textAnchor: "end", dominantBaseline: "central", className: cn("fill-muted-foreground", tickLabelClassName), children: tick.text })] }, `ytick-${index}-${tick.text}`))) })) : null, xAxisTitle ? (_jsx("text", { "aria-hidden": "true", "data-slot": "scatter-plot-x-axis-title", x: plotX0 + plotW / 2, y: H - 2, textAnchor: "middle", className: "pointer-events-none select-none fill-muted-foreground font-medium", children: xAxisTitle })) : null, yAxisTitle ? (_jsx("text", { "aria-hidden": "true", "data-slot": "scatter-plot-y-axis-title", x: 10, y: plotY0 + plotH / 2, textAnchor: "middle", transform: `rotate(-90 10 ${plotY0 + plotH / 2})`, className: "pointer-events-none select-none fill-muted-foreground font-medium", children: yAxisTitle })) : null] }), children ? (_jsx("div", { className: cn("pointer-events-none absolute inset-0 flex items-center justify-center text-center", overlayClassName), children: children })) : null] }));
|
|
382
|
+
}
|
|
383
|
+
ScatterPlot.displayName = "ScatterPlot";
|
|
384
|
+
export { ScatterPlot };
|
|
385
|
+
//# sourceMappingURL=scatter-plot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scatter-plot.js","sourceRoot":"","sources":["../../../../src/components/ui/scatter-plot/scatter-plot.tsx"],"names":[],"mappings":"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"}
|