@galaxy-io/dls 1.4.11 → 1.4.12
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/charts/BarChart.d.ts +4 -1
- package/dist/charts/BarChart.js +14 -7
- package/dist/charts/ChartCategoryTargets.d.ts +5 -12
- package/dist/charts/ChartCategoryTargets.js +1 -2
- package/dist/charts/ChartFrame.d.ts +3 -4
- package/dist/charts/ChartFrame.js +7 -20
- package/dist/charts/ChartLegend.js +26 -19
- package/dist/charts/ChartPrimitives.d.ts +37 -3
- package/dist/charts/ChartPrimitives.js +73 -53
- package/dist/charts/DashboardProvider.d.ts +14 -4
- package/dist/charts/DashboardProvider.js +5 -27
- package/dist/charts/LineChart.js +1 -1
- package/dist/charts/PieChart.js +1 -1
- package/dist/charts/constants.d.ts +16 -6
- package/dist/charts/constants.js +17 -7
- package/dist/charts/types.d.ts +10 -2
- package/dist/charts/types.js +9 -1
- package/dist/charts/useChartInteraction.d.ts +22 -12
- package/dist/charts/useChartInteraction.js +14 -9
- package/dist/styles.css +18 -17
- package/package.json +1 -1
|
@@ -13,6 +13,9 @@ export type BarChartProps<TMetric extends string, TComponentKey extends string =
|
|
|
13
13
|
groups: BarChartGroupDatum<NoInfer<TMetric>, NoInfer<TComponentKey>>[];
|
|
14
14
|
/** @default BarChartNormalization.NONE */
|
|
15
15
|
normalization?: BarChartNormalization;
|
|
16
|
+
/** Tint the active category's full band, marking the hover position even
|
|
17
|
+
* where there is no data. @default true */
|
|
18
|
+
showCursor?: boolean;
|
|
16
19
|
};
|
|
17
20
|
/**
|
|
18
21
|
* Bar chart with a three-level data model.
|
|
@@ -21,5 +24,5 @@ export type BarChartProps<TMetric extends string, TComponentKey extends string =
|
|
|
21
24
|
* `bars` in a group render side by side, several `components` in a bar stack,
|
|
22
25
|
* and a chart doing both at once needs no extra configuration.
|
|
23
26
|
*/
|
|
24
|
-
declare const BarChart: <TMetric extends string, TComponentKey extends string = string>({ series, groups, width, height, fillWidth, fillHeight, aspectRatio, margin, normalization, valueUnit, valueFormatter, labelFormatter, valueDomain, categoryLabelMode, categoryAxisTitle, valueAxisTitle, showGrid, showLegend, legendMaxItems, noTooltip, tooltipRenderer, isLoading, contentWhenEmpty, ariaLabel, ariaDescription, }: BarChartProps<TMetric, TComponentKey>) => import("react").JSX.Element;
|
|
27
|
+
declare const BarChart: <TMetric extends string, TComponentKey extends string = string>({ series, groups, width, height, fillWidth, fillHeight, aspectRatio, margin, normalization, showCursor, valueUnit, valueFormatter, labelFormatter, valueDomain, categoryLabelMode, categoryAxisTitle, valueAxisTitle, showGrid, showLegend, legendMaxItems, noTooltip, tooltipRenderer, isLoading, contentWhenEmpty, ariaLabel, ariaDescription, }: BarChartProps<TMetric, TComponentKey>) => import("react").JSX.Element;
|
|
25
28
|
export default BarChart;
|
package/dist/charts/BarChart.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { BarChartNormalization, ChartKind, ChartTargetShape } from "./types.js";
|
|
1
|
+
import { BarChartNormalization, ChartKind, ChartMarkState, ChartTargetShape } from "./types.js";
|
|
2
2
|
import { useSeriesColorResolver } from "./useSeriesColorResolver.js";
|
|
3
3
|
import { useChartInteraction } from "./useChartInteraction.js";
|
|
4
4
|
import { useCartesianChartLayout } from "./useCartesianChartLayout.js";
|
|
5
5
|
import { getBarLegendItems } from "./barChartLegend.js";
|
|
6
6
|
import { buildBarChartGeometry, getBarValueDomain, roundedRectPath } from "./barChartGeometry.js";
|
|
7
|
-
import { ChartBarPath } from "./ChartPrimitives.js";
|
|
7
|
+
import { ChartBarPath, ChartCursorBand } from "./ChartPrimitives.js";
|
|
8
8
|
import ChartFrame from "./ChartFrame.js";
|
|
9
9
|
import { ChartCategoryAxis, ChartValueAxis } from "./ChartAxis.js";
|
|
10
10
|
import { useCallback, useMemo, useRef } from "react";
|
|
@@ -17,7 +17,7 @@ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
|
17
17
|
* `bars` in a group render side by side, several `components` in a bar stack,
|
|
18
18
|
* and a chart doing both at once needs no extra configuration.
|
|
19
19
|
*/
|
|
20
|
-
var BarChart = ({ series, groups, width, height, fillWidth, fillHeight, aspectRatio, margin, normalization = BarChartNormalization.NONE, valueUnit, valueFormatter, labelFormatter, valueDomain, categoryLabelMode, categoryAxisTitle, valueAxisTitle, showGrid = true, showLegend = true, legendMaxItems, noTooltip = false, tooltipRenderer, isLoading = false, contentWhenEmpty, ariaLabel, ariaDescription }) => {
|
|
20
|
+
var BarChart = ({ series, groups, width, height, fillWidth, fillHeight, aspectRatio, margin, normalization = BarChartNormalization.NONE, showCursor = true, valueUnit, valueFormatter, labelFormatter, valueDomain, categoryLabelMode, categoryAxisTitle, valueAxisTitle, showGrid = true, showLegend = true, legendMaxItems, noTooltip = false, tooltipRenderer, isLoading = false, contentWhenEmpty, ariaLabel, ariaDescription }) => {
|
|
21
21
|
const containerRef = useRef(null);
|
|
22
22
|
const colors = useSeriesColorResolver(series);
|
|
23
23
|
/**
|
|
@@ -106,9 +106,11 @@ var BarChart = ({ series, groups, width, height, fillWidth, fillHeight, aspectRa
|
|
|
106
106
|
categoryCount: geometry.bands.length,
|
|
107
107
|
seriesKeys: legendKeys,
|
|
108
108
|
categoryKeys,
|
|
109
|
-
|
|
109
|
+
categoryMuteState: ChartMarkState.DIMMED,
|
|
110
|
+
isDisabled: noTooltip || isLoading || isEmpty,
|
|
110
111
|
isLoading
|
|
111
112
|
});
|
|
113
|
+
const activeBand = interaction.activeIndex === null ? null : geometry.bands[interaction.activeIndex] ?? null;
|
|
112
114
|
const buildCategoryTooltip = useCallback((index) => {
|
|
113
115
|
const band = geometry.bands[index];
|
|
114
116
|
const group = groups[index];
|
|
@@ -142,7 +144,7 @@ var BarChart = ({ series, groups, width, height, fillWidth, fillHeight, aspectRa
|
|
|
142
144
|
width: band.width,
|
|
143
145
|
height: band.height
|
|
144
146
|
})), [geometry.bands]);
|
|
145
|
-
return /* @__PURE__ */
|
|
147
|
+
return /* @__PURE__ */ jsxs(ChartFrame, {
|
|
146
148
|
containerRef,
|
|
147
149
|
dimensions,
|
|
148
150
|
fillWidth,
|
|
@@ -182,14 +184,19 @@ var BarChart = ({ series, groups, width, height, fillWidth, fillHeight, aspectRa
|
|
|
182
184
|
showLegend,
|
|
183
185
|
legendItems,
|
|
184
186
|
legendMaxItems,
|
|
185
|
-
children:
|
|
187
|
+
children: [showCursor && activeBand && /* @__PURE__ */ jsx(ChartCursorBand, {
|
|
188
|
+
x: activeBand.x,
|
|
189
|
+
y: activeBand.y,
|
|
190
|
+
width: activeBand.width,
|
|
191
|
+
height: activeBand.height
|
|
192
|
+
}), geometry.rects.map((rect) => /* @__PURE__ */ jsx(ChartBarPath, {
|
|
186
193
|
d: roundedRectPath(rect.x, rect.y, rect.width, rect.height, rect.radius, rect.corners),
|
|
187
194
|
fill: rect.color,
|
|
188
195
|
"data-state": interaction.getMarkState({
|
|
189
196
|
categoryIndex: rect.groupIndex,
|
|
190
197
|
seriesKey: isStacked ? rect.componentKey : rect.metric
|
|
191
198
|
})
|
|
192
|
-
}, rect.id))
|
|
199
|
+
}, rect.id))]
|
|
193
200
|
});
|
|
194
201
|
};
|
|
195
202
|
//#endregion
|
|
@@ -7,21 +7,14 @@ import type { ChartInteraction } from "./useChartInteraction";
|
|
|
7
7
|
* roles and no tab stops — the plot is `role="img"` and its accessible story is
|
|
8
8
|
* the frame's label and description, while pointer users get the tooltip.
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Every category is hoverable, including one with nothing to show: the cursor
|
|
11
|
+
* still marks where the pointer is over an empty stretch of axis, and the
|
|
12
|
+
* frame's rowless guard is what keeps a heading-only tooltip from opening
|
|
13
|
+
* there.
|
|
13
14
|
*/
|
|
14
15
|
interface ChartCategoryTargetsProps {
|
|
15
16
|
targets: ChartCategoryTarget[];
|
|
16
17
|
interaction: ChartInteraction;
|
|
17
|
-
/**
|
|
18
|
-
* Category indices whose tooltip would have no rows.
|
|
19
|
-
*
|
|
20
|
-
* Skipped entirely rather than rendered inert, so the pointer falls through
|
|
21
|
-
* to nothing. Indexing is unaffected: `targets.map` still passes the true
|
|
22
|
-
* category index for every target that does render.
|
|
23
|
-
*/
|
|
24
|
-
inertIndices?: ReadonlySet<number>;
|
|
25
18
|
}
|
|
26
|
-
declare const ChartCategoryTargets: ({ targets, interaction
|
|
19
|
+
declare const ChartCategoryTargets: ({ targets, interaction }: ChartCategoryTargetsProps) => import("react").JSX.Element;
|
|
27
20
|
export default ChartCategoryTargets;
|
|
@@ -3,8 +3,7 @@ import { ChartHitTarget, ChartHitTargetPath } from "./ChartPrimitives.js";
|
|
|
3
3
|
import { match } from "ts-pattern";
|
|
4
4
|
import { Fragment, jsx } from "react/jsx-runtime";
|
|
5
5
|
//#region src/charts/ChartCategoryTargets.tsx
|
|
6
|
-
var ChartCategoryTargets = ({ targets, interaction
|
|
7
|
-
if (inertIndices?.has(index)) return null;
|
|
6
|
+
var ChartCategoryTargets = ({ targets, interaction }) => /* @__PURE__ */ jsx(Fragment, { children: targets.map((target, index) => {
|
|
8
7
|
const shared = {
|
|
9
8
|
onMouseEnter: () => interaction.onCategoryEnter(index),
|
|
10
9
|
onMouseLeave: () => interaction.onCategoryLeave()
|
|
@@ -70,10 +70,9 @@ export interface ChartFrameProps {
|
|
|
70
70
|
/**
|
|
71
71
|
* Builds one category's tooltip, in plot coordinates.
|
|
72
72
|
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
* what makes "no tooltip rows" and "not hoverable" the same fact.
|
|
73
|
+
* A rowless model means "no data here": the category stays hoverable — the
|
|
74
|
+
* cursor should still mark the pointer over an empty stretch of axis — but
|
|
75
|
+
* no tooltip opens.
|
|
77
76
|
*
|
|
78
77
|
* Must be stable; memoize it at the call site.
|
|
79
78
|
*/
|
|
@@ -23,11 +23,15 @@ var ChartFrame = ({ containerRef, dimensions, fillWidth, fillHeight, interaction
|
|
|
23
23
|
* same situation, which is the drift this removes.
|
|
24
24
|
*/
|
|
25
25
|
const resolvedAriaLabel = ariaLabel ?? match(kind).with(ChartKind.PIE, () => `Pie chart with ${categoryCount} slices`).with(ChartKind.BAR, () => `Bar chart with ${categoryCount} categories and ${legendItems.length} series`).with(ChartKind.LINE, () => `Line chart with ${categoryCount} categories and ${legendItems.length} series`).exhaustive();
|
|
26
|
-
const tooltipModel = useMemo(() =>
|
|
26
|
+
const tooltipModel = useMemo(() => {
|
|
27
|
+
if (noTooltip || !interaction.showTooltip || interaction.activeIndex === null) return null;
|
|
28
|
+
const model = buildCategoryTooltip(interaction.activeIndex);
|
|
29
|
+
return model === null || model.rows.length === 0 ? null : model;
|
|
30
|
+
}, [
|
|
27
31
|
noTooltip,
|
|
28
32
|
buildCategoryTooltip,
|
|
29
33
|
interaction.activeIndex,
|
|
30
|
-
interaction.
|
|
34
|
+
interaction.showTooltip
|
|
31
35
|
]);
|
|
32
36
|
/**
|
|
33
37
|
* Plot space → container space, applied once, here.
|
|
@@ -48,22 +52,6 @@ var ChartFrame = ({ containerRef, dimensions, fillWidth, fillHeight, interaction
|
|
|
48
52
|
margin.left,
|
|
49
53
|
margin.top
|
|
50
54
|
]);
|
|
51
|
-
/**
|
|
52
|
-
* Categories whose tooltip would have no rows.
|
|
53
|
-
*
|
|
54
|
-
* Decided here — from the same builder that feeds the visible tooltip — so
|
|
55
|
-
* "no data at this X" means exactly one thing in every chart: an all-zero
|
|
56
|
-
* bar group and an all-null line column both produce a rowless model, and
|
|
57
|
-
* neither should be hoverable. Their targets are simply not rendered.
|
|
58
|
-
*/
|
|
59
|
-
const inertIndices = useMemo(() => {
|
|
60
|
-
const inert = /* @__PURE__ */ new Set();
|
|
61
|
-
(categoryTargets ?? []).forEach((_, index) => {
|
|
62
|
-
const model = buildCategoryTooltip(index);
|
|
63
|
-
if (!model || model.rows.length === 0) inert.add(index);
|
|
64
|
-
});
|
|
65
|
-
return inert;
|
|
66
|
-
}, [categoryTargets, buildCategoryTooltip]);
|
|
67
55
|
const hasTargets = isMeasured && !noTooltip && !isLoading && !isEmpty && (categoryTargets?.length ?? 0) > 0;
|
|
68
56
|
const legendRight = legendPlacement === ChartLegendPlacement.RIGHT;
|
|
69
57
|
return /* @__PURE__ */ jsxs(ChartRoot, {
|
|
@@ -96,8 +84,7 @@ var ChartFrame = ({ containerRef, dimensions, fillWidth, fillHeight, interaction
|
|
|
96
84
|
transform: categoryTargetsTransform,
|
|
97
85
|
children: /* @__PURE__ */ jsx(ChartCategoryTargets, {
|
|
98
86
|
targets: categoryTargets,
|
|
99
|
-
interaction
|
|
100
|
-
inertIndices
|
|
87
|
+
interaction
|
|
101
88
|
})
|
|
102
89
|
})
|
|
103
90
|
]
|
|
@@ -2,7 +2,6 @@ import Text, { TextSize, TextVariant } from "../text/Text.js";
|
|
|
2
2
|
import Tooltip, { TooltipPosition, TooltipVariant } from "../tooltip/Tooltip.js";
|
|
3
3
|
import Circle from "../shapes/Circle.js";
|
|
4
4
|
import { ChartMarkState } from "./types.js";
|
|
5
|
-
import "./constants.js";
|
|
6
5
|
import { ChartLegendItemButton, ChartLegendItemStatic, ChartLegendMeasure, ChartLegendOverflowList, ChartLegendRow } from "./ChartPrimitives.js";
|
|
7
6
|
import { useCallback, useLayoutEffect, useRef, useState } from "react";
|
|
8
7
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -38,14 +37,13 @@ var ChartLegend = ({ items, inset, hoveredKey = null, vertical = false, vertical
|
|
|
38
37
|
const rendered = Array.from(measure.children);
|
|
39
38
|
const trigger = rendered.pop();
|
|
40
39
|
if (!trigger) return;
|
|
41
|
-
const gap = vertical ? 8 : 16;
|
|
42
40
|
const available = vertical ? verticalExtent || Number.POSITIVE_INFINITY : row.clientWidth - inset;
|
|
43
41
|
const sizeOf = (el) => {
|
|
44
42
|
const rect = el.getBoundingClientRect();
|
|
45
43
|
return Math.ceil(vertical ? rect.height : rect.width);
|
|
46
44
|
};
|
|
47
45
|
const sizes = rendered.map(sizeOf);
|
|
48
|
-
if (sizes.reduce((sum, size
|
|
46
|
+
if (sizes.reduce((sum, size) => sum + size, 0) <= available) {
|
|
49
47
|
setFitCount(sizes.length);
|
|
50
48
|
return;
|
|
51
49
|
}
|
|
@@ -53,8 +51,8 @@ var ChartLegend = ({ items, inset, hoveredKey = null, vertical = false, vertical
|
|
|
53
51
|
let used = 0;
|
|
54
52
|
let count = 0;
|
|
55
53
|
for (const [i, size] of sizes.entries()) {
|
|
56
|
-
used += size
|
|
57
|
-
if (used +
|
|
54
|
+
used += size;
|
|
55
|
+
if (used + triggerSize > available) break;
|
|
58
56
|
count = i + 1;
|
|
59
57
|
}
|
|
60
58
|
setFitCount(Math.max(1, count));
|
|
@@ -80,7 +78,7 @@ var ChartLegend = ({ items, inset, hoveredKey = null, vertical = false, vertical
|
|
|
80
78
|
if (items.length === 0) return null;
|
|
81
79
|
const isInteractive = Boolean(onItemEnter);
|
|
82
80
|
const activeKey = hoveredKey;
|
|
83
|
-
const renderItem = (item) => {
|
|
81
|
+
const renderItem = (item, verticalPadding) => {
|
|
84
82
|
const state = activeKey === null || item.key === activeKey ? ChartMarkState.ACTIVE : ChartMarkState.MUTED;
|
|
85
83
|
const content = /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(Circle, {
|
|
86
84
|
size: 8,
|
|
@@ -90,11 +88,13 @@ var ChartLegend = ({ items, inset, hoveredKey = null, vertical = false, vertical
|
|
|
90
88
|
children: item.label
|
|
91
89
|
})] });
|
|
92
90
|
if (!isInteractive) return /* @__PURE__ */ jsx(ChartLegendItemStatic, {
|
|
91
|
+
$vertical: verticalPadding,
|
|
93
92
|
"data-state": state,
|
|
94
93
|
children: content
|
|
95
94
|
}, item.key);
|
|
96
95
|
return /* @__PURE__ */ jsx(ChartLegendItemButton, {
|
|
97
96
|
type: "button",
|
|
97
|
+
$vertical: verticalPadding,
|
|
98
98
|
"data-state": state,
|
|
99
99
|
onMouseEnter: () => onItemEnter?.(item.key),
|
|
100
100
|
onMouseLeave: () => onItemLeave?.(),
|
|
@@ -124,26 +124,33 @@ var ChartLegend = ({ items, inset, hoveredKey = null, vertical = false, vertical
|
|
|
124
124
|
ref: measureRef,
|
|
125
125
|
$vertical: vertical,
|
|
126
126
|
"aria-hidden": "true",
|
|
127
|
-
children: [items.map((item) => /* @__PURE__ */ jsxs(ChartLegendItemStatic, {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
127
|
+
children: [items.map((item) => /* @__PURE__ */ jsxs(ChartLegendItemStatic, {
|
|
128
|
+
$vertical: vertical,
|
|
129
|
+
children: [/* @__PURE__ */ jsx(Circle, {
|
|
130
|
+
size: 8,
|
|
131
|
+
hex: item.color
|
|
132
|
+
}), /* @__PURE__ */ jsx(Text, {
|
|
133
|
+
size: TextSize.BODY_SM,
|
|
134
|
+
children: item.label
|
|
135
|
+
})]
|
|
136
|
+
}, item.key)), /* @__PURE__ */ jsx(ChartLegendItemStatic, {
|
|
137
|
+
$vertical: vertical,
|
|
138
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
139
|
+
size: TextSize.BODY_SM,
|
|
140
|
+
variant: TextVariant.SECONDARY,
|
|
141
|
+
children: `+${items.length - 1} more`
|
|
142
|
+
})
|
|
143
|
+
})]
|
|
138
144
|
}),
|
|
139
|
-
inlineItems.map(renderItem),
|
|
145
|
+
inlineItems.map((item) => renderItem(item, vertical)),
|
|
140
146
|
overflowItems.length > 0 && /* @__PURE__ */ jsx(Tooltip, {
|
|
141
147
|
isInteractive: true,
|
|
142
148
|
position: vertical ? TooltipPosition.RIGHT : TooltipPosition.TOP,
|
|
143
149
|
variant: TooltipVariant.TERTIARY,
|
|
144
|
-
body: /* @__PURE__ */ jsx(ChartLegendOverflowList, { children: overflowItems.map(renderItem) }),
|
|
150
|
+
body: /* @__PURE__ */ jsx(ChartLegendOverflowList, { children: overflowItems.map((item) => renderItem(item, true)) }),
|
|
145
151
|
children: /* @__PURE__ */ jsx(ChartLegendItemButton, {
|
|
146
152
|
type: "button",
|
|
153
|
+
$vertical: vertical,
|
|
147
154
|
"data-state": triggerState,
|
|
148
155
|
children: /* @__PURE__ */ jsx(Text, {
|
|
149
156
|
size: TextSize.BODY_SM,
|
|
@@ -111,6 +111,29 @@ export declare const ChartCursorLine: import("react").ComponentType<Pick<import(
|
|
|
111
111
|
} & {
|
|
112
112
|
as?: React.ElementType;
|
|
113
113
|
}>, {}>;
|
|
114
|
+
/**
|
|
115
|
+
* Full-height tint over the hovered category's band on a bar chart — the bar
|
|
116
|
+
* counterpart to {@link ChartCursorLine}. A rule reads oddly threaded through
|
|
117
|
+
* wide filled marks; a quiet band behind them marks the same position without
|
|
118
|
+
* touching them. 8% of the foreground, so it survives both themes.
|
|
119
|
+
*/
|
|
120
|
+
export declare const ChartCursorBand: import("react").ComponentType<Pick<import("react").SVGProps<SVGRectElement> & {
|
|
121
|
+
theme: import("../theme").Theme;
|
|
122
|
+
} & {
|
|
123
|
+
as?: React.ElementType;
|
|
124
|
+
}, "as" | keyof import("react").SVGProps<SVGRectElement>> & {
|
|
125
|
+
theme?: import("@callstack/react-theme-provider").$DeepPartial<import("../theme").Theme> | undefined;
|
|
126
|
+
}> & import("@callstack/react-theme-provider/typings/hoist-non-react-statics").NonReactStatics<import("react").ComponentType<import("react").SVGProps<SVGRectElement> & {
|
|
127
|
+
theme: import("../theme").Theme;
|
|
128
|
+
} & {
|
|
129
|
+
as?: React.ElementType;
|
|
130
|
+
}> & {
|
|
131
|
+
__wyw_meta: unknown;
|
|
132
|
+
} & import("react").FunctionComponent<import("react").SVGProps<SVGRectElement> & {
|
|
133
|
+
theme: import("../theme").Theme;
|
|
134
|
+
} & {
|
|
135
|
+
as?: React.ElementType;
|
|
136
|
+
}>, {}>;
|
|
114
137
|
export declare const ChartAxisLabelBox: import("@linaria/react").StyledComponent<import("react").SVGProps<SVGForeignObjectElement> & Record<never, unknown>>;
|
|
115
138
|
/**
|
|
116
139
|
* Positioned from coordinates already clamped to the chart box.
|
|
@@ -235,7 +258,18 @@ export declare const ChartLegendOverflowList: import("@linaria/react").StyledCom
|
|
|
235
258
|
*
|
|
236
259
|
* Shares the mark opacity ramp via `data-state`, so an entry recedes in step
|
|
237
260
|
* with the series it names.
|
|
261
|
+
*
|
|
262
|
+
* The trailing padding is the inter-entry spacing — deliberately padding on
|
|
263
|
+
* the entry rather than a gap on the container, so the hover surfaces of
|
|
264
|
+
* adjacent entries touch and a sweep hands the isolation directly from one
|
|
265
|
+
* series to the next. Trailing only, so the first entry stays flush with the
|
|
266
|
+
* plot's left edge (or the column's top).
|
|
238
267
|
*/
|
|
239
|
-
export declare const ChartLegendItemButton: import("@linaria/react").StyledComponent<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement> &
|
|
240
|
-
|
|
241
|
-
|
|
268
|
+
export declare const ChartLegendItemButton: import("@linaria/react").StyledComponent<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
|
|
269
|
+
$vertical?: boolean;
|
|
270
|
+
}>;
|
|
271
|
+
/** The same row, when the legend is inert — no button semantics to announce.
|
|
272
|
+
* Carries the same trailing padding; see {@link ChartLegendItemButton}. */
|
|
273
|
+
export declare const ChartLegendItemStatic: import("@linaria/react").StyledComponent<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & {
|
|
274
|
+
$vertical?: boolean;
|
|
275
|
+
}>;
|
|
@@ -176,9 +176,22 @@ var ChartCursorLine = withTheme(/*#__PURE__*/ styled("line")({
|
|
|
176
176
|
propsAsIs: true,
|
|
177
177
|
vars: { "cblgiyf-0": [_exp16()] }
|
|
178
178
|
}));
|
|
179
|
+
/**
|
|
180
|
+
* Full-height tint over the hovered category's band on a bar chart — the bar
|
|
181
|
+
* counterpart to {@link ChartCursorLine}. A rule reads oddly threaded through
|
|
182
|
+
* wide filled marks; a quiet band behind them marks the same position without
|
|
183
|
+
* touching them. 8% of the foreground, so it survives both themes.
|
|
184
|
+
*/
|
|
185
|
+
var _exp17 = () => ({ theme }) => theme.color.opacity.bw8Alt;
|
|
186
|
+
var ChartCursorBand = withTheme(/*#__PURE__*/ styled("rect")({
|
|
187
|
+
name: "ChartCursorBand",
|
|
188
|
+
class: "c1lr03cc",
|
|
189
|
+
propsAsIs: true,
|
|
190
|
+
vars: { "c1lr03cc-0": [_exp17()] }
|
|
191
|
+
}));
|
|
179
192
|
var ChartAxisLabelBox = /*#__PURE__*/ styled("foreignObject")({
|
|
180
193
|
name: "ChartAxisLabelBox",
|
|
181
|
-
class: "
|
|
194
|
+
class: "cizy1s8",
|
|
182
195
|
propsAsIs: true
|
|
183
196
|
});
|
|
184
197
|
/**
|
|
@@ -188,21 +201,21 @@ var ChartAxisLabelBox = /*#__PURE__*/ styled("foreignObject")({
|
|
|
188
201
|
* than teleporting, and it stays mounted while hidden so the fade can actually
|
|
189
202
|
* run — unmounting on hide is why a fade-out never appears.
|
|
190
203
|
*/
|
|
191
|
-
var
|
|
192
|
-
var
|
|
193
|
-
var
|
|
194
|
-
var
|
|
195
|
-
var
|
|
204
|
+
var _exp18 = () => ({ $x }) => `${$x}px`;
|
|
205
|
+
var _exp19 = () => ({ $y }) => `${$y}px`;
|
|
206
|
+
var _exp22 = () => ({ theme }) => theme.color.border.primary;
|
|
207
|
+
var _exp23 = () => ({ theme }) => theme.color.background.tertiary;
|
|
208
|
+
var _exp24 = () => ({ $isVisible }) => $isVisible ? 1 : 0;
|
|
196
209
|
var ChartTooltipPositioner = withTheme(/*#__PURE__*/ styled("div")({
|
|
197
210
|
name: "ChartTooltipPositioner",
|
|
198
|
-
class: "
|
|
211
|
+
class: "c1ukq11d",
|
|
199
212
|
propsAsIs: false,
|
|
200
213
|
vars: {
|
|
201
|
-
"
|
|
202
|
-
"
|
|
203
|
-
"
|
|
204
|
-
"
|
|
205
|
-
"
|
|
214
|
+
"c1ukq11d-0": [_exp18()],
|
|
215
|
+
"c1ukq11d-1": [_exp19()],
|
|
216
|
+
"c1ukq11d-2": [_exp22()],
|
|
217
|
+
"c1ukq11d-3": [_exp23()],
|
|
218
|
+
"c1ukq11d-4": [_exp24()]
|
|
206
219
|
}
|
|
207
220
|
}));
|
|
208
221
|
/**
|
|
@@ -216,19 +229,19 @@ var ChartTooltipPositioner = withTheme(/*#__PURE__*/ styled("div")({
|
|
|
216
229
|
*/
|
|
217
230
|
var ChartTooltipGrid = /*#__PURE__*/ styled("div")({
|
|
218
231
|
name: "ChartTooltipGrid",
|
|
219
|
-
class: "
|
|
232
|
+
class: "cwcko2m",
|
|
220
233
|
propsAsIs: false
|
|
221
234
|
});
|
|
222
235
|
/** Swatch + label. `min-width: 0` is what lets the label actually ellipsize. */
|
|
223
236
|
var ChartTooltipLabelCell = /*#__PURE__*/ styled("div")({
|
|
224
237
|
name: "ChartTooltipLabelCell",
|
|
225
|
-
class: "
|
|
238
|
+
class: "cqwhvyz",
|
|
226
239
|
propsAsIs: false
|
|
227
240
|
});
|
|
228
241
|
/** Right-aligned and never wrapped — the value always shows in full. */
|
|
229
242
|
var ChartTooltipValueCell = /*#__PURE__*/ styled("div")({
|
|
230
243
|
name: "ChartTooltipValueCell",
|
|
231
|
-
class: "
|
|
244
|
+
class: "c1iaray",
|
|
232
245
|
propsAsIs: false
|
|
233
246
|
});
|
|
234
247
|
/**
|
|
@@ -239,41 +252,40 @@ var ChartTooltipValueCell = /*#__PURE__*/ styled("div")({
|
|
|
239
252
|
* of the DLS. `pointer-events: none` keeps it from stealing hover from the arc
|
|
240
253
|
* behind it.
|
|
241
254
|
*/
|
|
242
|
-
var
|
|
243
|
-
var
|
|
244
|
-
var
|
|
255
|
+
var _exp28 = () => ({ $centerX }) => `${$centerX}px`;
|
|
256
|
+
var _exp29 = () => ({ $centerY }) => `${$centerY}px`;
|
|
257
|
+
var _exp31 = () => ({ $diameter }) => `${$diameter}px`;
|
|
245
258
|
var ChartCenterBox = /*#__PURE__*/ styled("div")({
|
|
246
259
|
name: "ChartCenterBox",
|
|
247
|
-
class: "
|
|
260
|
+
class: "cz6jod1",
|
|
248
261
|
propsAsIs: false,
|
|
249
262
|
vars: {
|
|
250
|
-
"
|
|
251
|
-
"
|
|
252
|
-
"
|
|
263
|
+
"cz6jod1-0": [_exp28()],
|
|
264
|
+
"cz6jod1-1": [_exp29()],
|
|
265
|
+
"cz6jod1-2": [_exp31()]
|
|
253
266
|
}
|
|
254
267
|
});
|
|
255
268
|
/**
|
|
256
269
|
* Sits slightly above centre, over where the bars would be, so the axes stay
|
|
257
270
|
* legible underneath.
|
|
258
271
|
*/
|
|
259
|
-
var
|
|
260
|
-
var
|
|
272
|
+
var _exp32 = () => ({ theme }) => theme.color.border.primary;
|
|
273
|
+
var _exp33 = () => ({ theme }) => theme.color.background.primary;
|
|
261
274
|
var ChartEmptyOverlay = withTheme(/*#__PURE__*/ styled("div")({
|
|
262
275
|
name: "ChartEmptyOverlay",
|
|
263
|
-
class: "
|
|
276
|
+
class: "c1de5mqk",
|
|
264
277
|
propsAsIs: false,
|
|
265
278
|
vars: {
|
|
266
|
-
"
|
|
267
|
-
"
|
|
279
|
+
"c1de5mqk-0": [_exp32()],
|
|
280
|
+
"c1de5mqk-1": [_exp33()]
|
|
268
281
|
}
|
|
269
282
|
}));
|
|
270
283
|
/**
|
|
271
284
|
* Aligns the legend under the plot rather than the value-axis gutter.
|
|
272
285
|
*/
|
|
273
|
-
var
|
|
274
|
-
var
|
|
275
|
-
var
|
|
276
|
-
var _exp36 = () => ({ $vertical }) => $vertical ? `8px` : `16px`;
|
|
286
|
+
var _exp34 = () => ({ $vertical }) => $vertical ? "column" : "row";
|
|
287
|
+
var _exp35 = () => ({ $vertical }) => $vertical ? "flex-start" : "center";
|
|
288
|
+
var _exp36 = () => ({ $vertical }) => $vertical ? "center" : "flex-start";
|
|
277
289
|
var _exp37 = () => ({ $vertical }) => $vertical ? "auto" : "0";
|
|
278
290
|
var _exp38 = () => ({ $vertical }) => $vertical ? "0" : "100%";
|
|
279
291
|
var _exp39 = () => ({ $vertical, $extent }) => $vertical && $extent ? `${$extent}px` : "auto";
|
|
@@ -281,18 +293,17 @@ var _exp40 = () => ({ $vertical }) => $vertical ? "0" : "10px";
|
|
|
281
293
|
var _exp41 = () => ({ $inset }) => `${$inset}px`;
|
|
282
294
|
var ChartLegendRow = /*#__PURE__*/ styled("div")({
|
|
283
295
|
name: "ChartLegendRow",
|
|
284
|
-
class: "
|
|
296
|
+
class: "cjirv6a",
|
|
285
297
|
propsAsIs: false,
|
|
286
298
|
vars: {
|
|
287
|
-
"
|
|
288
|
-
"
|
|
289
|
-
"
|
|
290
|
-
"
|
|
291
|
-
"
|
|
292
|
-
"
|
|
293
|
-
"
|
|
294
|
-
"
|
|
295
|
-
"c1de5mqk-8": [_exp41()]
|
|
299
|
+
"cjirv6a-0": [_exp34()],
|
|
300
|
+
"cjirv6a-1": [_exp35()],
|
|
301
|
+
"cjirv6a-2": [_exp36()],
|
|
302
|
+
"cjirv6a-3": [_exp37()],
|
|
303
|
+
"cjirv6a-4": [_exp38()],
|
|
304
|
+
"cjirv6a-5": [_exp39()],
|
|
305
|
+
"cjirv6a-6": [_exp40()],
|
|
306
|
+
"cjirv6a-7": [_exp41()]
|
|
296
307
|
}
|
|
297
308
|
});
|
|
298
309
|
/**
|
|
@@ -305,15 +316,13 @@ var ChartLegendRow = /*#__PURE__*/ styled("div")({
|
|
|
305
316
|
*/
|
|
306
317
|
var _exp42 = () => ({ $vertical }) => $vertical ? "column" : "row";
|
|
307
318
|
var _exp43 = () => ({ $vertical }) => $vertical ? "flex-start" : "center";
|
|
308
|
-
var _exp44 = () => ({ $vertical }) => $vertical ? `8px` : `16px`;
|
|
309
319
|
var ChartLegendMeasure = /*#__PURE__*/ styled("div")({
|
|
310
320
|
name: "ChartLegendMeasure",
|
|
311
|
-
class: "
|
|
321
|
+
class: "c1armna5",
|
|
312
322
|
propsAsIs: false,
|
|
313
323
|
vars: {
|
|
314
|
-
"
|
|
315
|
-
"
|
|
316
|
-
"cjirv6a-2": [_exp44()]
|
|
324
|
+
"c1armna5-0": [_exp42()],
|
|
325
|
+
"c1armna5-1": [_exp43()]
|
|
317
326
|
}
|
|
318
327
|
});
|
|
319
328
|
/**
|
|
@@ -325,7 +334,7 @@ var ChartLegendMeasure = /*#__PURE__*/ styled("div")({
|
|
|
325
334
|
*/
|
|
326
335
|
var ChartLegendOverflowList = /*#__PURE__*/ styled("div")({
|
|
327
336
|
name: "ChartLegendOverflowList",
|
|
328
|
-
class: "
|
|
337
|
+
class: "cgd77rv",
|
|
329
338
|
propsAsIs: false
|
|
330
339
|
});
|
|
331
340
|
/**
|
|
@@ -339,17 +348,28 @@ var ChartLegendOverflowList = /*#__PURE__*/ styled("div")({
|
|
|
339
348
|
*
|
|
340
349
|
* Shares the mark opacity ramp via `data-state`, so an entry recedes in step
|
|
341
350
|
* with the series it names.
|
|
351
|
+
*
|
|
352
|
+
* The trailing padding is the inter-entry spacing — deliberately padding on
|
|
353
|
+
* the entry rather than a gap on the container, so the hover surfaces of
|
|
354
|
+
* adjacent entries touch and a sweep hands the isolation directly from one
|
|
355
|
+
* series to the next. Trailing only, so the first entry stays flush with the
|
|
356
|
+
* plot's left edge (or the column's top).
|
|
342
357
|
*/
|
|
358
|
+
var _exp45 = () => ({ $vertical }) => $vertical ? `0 0 8px 0` : `0 16px 0 0`;
|
|
343
359
|
var ChartLegendItemButton = /*#__PURE__*/ styled("button")({
|
|
344
360
|
name: "ChartLegendItemButton",
|
|
345
|
-
class: "
|
|
346
|
-
propsAsIs: false
|
|
361
|
+
class: "cutidpi",
|
|
362
|
+
propsAsIs: false,
|
|
363
|
+
vars: { "cutidpi-0": [_exp45()] }
|
|
347
364
|
});
|
|
348
|
-
/** The same row, when the legend is inert — no button semantics to announce.
|
|
365
|
+
/** The same row, when the legend is inert — no button semantics to announce.
|
|
366
|
+
* Carries the same trailing padding; see {@link ChartLegendItemButton}. */
|
|
367
|
+
var _exp47 = () => ({ $vertical }) => $vertical ? `0 0 8px 0` : `0 16px 0 0`;
|
|
349
368
|
var ChartLegendItemStatic = /*#__PURE__*/ styled("div")({
|
|
350
369
|
name: "ChartLegendItemStatic",
|
|
351
|
-
class: "
|
|
352
|
-
propsAsIs: false
|
|
370
|
+
class: "ccpczg",
|
|
371
|
+
propsAsIs: false,
|
|
372
|
+
vars: { "ccpczg-0": [_exp47()] }
|
|
353
373
|
});
|
|
354
374
|
//#endregion
|
|
355
|
-
export { ChartArcPath, ChartAreaPath, ChartAxisLabelBox, ChartBarPath, ChartCenterBox, ChartCursorLine, ChartEmptyOverlay, ChartGridLine, ChartHitTarget, ChartHitTargetPath, ChartLegendItemButton, ChartLegendItemStatic, ChartLegendMeasure, ChartLegendOverflowList, ChartLegendRow, ChartLinePath, ChartPlotBox, ChartPointCircle, ChartRoot, ChartSvg, ChartTooltipGrid, ChartTooltipLabelCell, ChartTooltipPositioner, ChartTooltipValueCell };
|
|
375
|
+
export { ChartArcPath, ChartAreaPath, ChartAxisLabelBox, ChartBarPath, ChartCenterBox, ChartCursorBand, ChartCursorLine, ChartEmptyOverlay, ChartGridLine, ChartHitTarget, ChartHitTargetPath, ChartLegendItemButton, ChartLegendItemStatic, ChartLegendMeasure, ChartLegendOverflowList, ChartLegendRow, ChartLinePath, ChartPlotBox, ChartPointCircle, ChartRoot, ChartSvg, ChartTooltipGrid, ChartTooltipLabelCell, ChartTooltipPositioner, ChartTooltipValueCell };
|
|
@@ -17,6 +17,8 @@ export interface DashboardContextValue {
|
|
|
17
17
|
setActive: (entry: DashboardSyncEntry) => void;
|
|
18
18
|
/** Clears only if the current entry belongs to `sourceId`. */
|
|
19
19
|
clearActive: (sourceId: string) => void;
|
|
20
|
+
/** Followers open their own tooltip at the synced category. */
|
|
21
|
+
sharedTooltip: boolean;
|
|
20
22
|
}
|
|
21
23
|
export declare const DashboardContext: import("react").Context<DashboardContextValue | null>;
|
|
22
24
|
/**
|
|
@@ -24,9 +26,13 @@ export declare const DashboardContext: import("react").Context<DashboardContextV
|
|
|
24
26
|
*
|
|
25
27
|
* Hovering a category in one chart shows the same category emphasized in every
|
|
26
28
|
* sibling — matched by raw category label, so charts whose category sets only
|
|
27
|
-
* partially overlap simply show nothing for the labels they lack.
|
|
28
|
-
* stays local to the chart under the pointer; siblings get the
|
|
29
|
-
* only (LineChart its cursor line and dots, BarChart its
|
|
29
|
+
* partially overlap simply show nothing for the labels they lack. By default
|
|
30
|
+
* the tooltip stays local to the chart under the pointer; siblings get the
|
|
31
|
+
* quiet emphasis only (LineChart its cursor line and dots, BarChart its band
|
|
32
|
+
* tint and gentle dim). `sharedTooltip` opts every synced chart into opening its
|
|
33
|
+
* own tooltip at the shared category — the tooltip anchors to the category's
|
|
34
|
+
* geometry, not the pointer, so a follower's opens exactly where a local
|
|
35
|
+
* hover's would.
|
|
30
36
|
*
|
|
31
37
|
* Scope, deliberately narrow:
|
|
32
38
|
* - Only the category axis syncs. Legend (series) hover stays local.
|
|
@@ -43,5 +49,9 @@ export declare const DashboardContext: import("react").Context<DashboardContextV
|
|
|
43
49
|
* across a chart re-renders the group a handful of times. No subscription or
|
|
44
50
|
* selector machinery is warranted.
|
|
45
51
|
*/
|
|
46
|
-
export
|
|
52
|
+
export interface DashboardProviderProps {
|
|
53
|
+
/** Every synced chart opens its own tooltip at the shared category. @default false */
|
|
54
|
+
sharedTooltip?: boolean;
|
|
55
|
+
}
|
|
56
|
+
export declare const DashboardProvider: ({ sharedTooltip, children, }: PropsWithChildren<DashboardProviderProps>) => import("react").JSX.Element;
|
|
47
57
|
export default DashboardProvider;
|
|
@@ -2,31 +2,7 @@ import { createContext, useCallback, useMemo, useState } from "react";
|
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
//#region src/charts/DashboardProvider.tsx
|
|
4
4
|
var DashboardContext = createContext(null);
|
|
5
|
-
|
|
6
|
-
* Shares the hovered category between the cartesian charts inside it.
|
|
7
|
-
*
|
|
8
|
-
* Hovering a category in one chart shows the same category emphasized in every
|
|
9
|
-
* sibling — matched by raw category label, so charts whose category sets only
|
|
10
|
-
* partially overlap simply show nothing for the labels they lack. The tooltip
|
|
11
|
-
* stays local to the chart under the pointer; siblings get the quiet emphasis
|
|
12
|
-
* only (LineChart its cursor line and dots, BarChart its category muting).
|
|
13
|
-
*
|
|
14
|
-
* Scope, deliberately narrow:
|
|
15
|
-
* - Only the category axis syncs. Legend (series) hover stays local.
|
|
16
|
-
* - PieChart never participates — it has no category axis.
|
|
17
|
-
* - There is no per-chart opt-out prop. The opt-out is rendering the chart
|
|
18
|
-
* outside the provider, and nesting a second provider isolates a subset —
|
|
19
|
-
* charts sync with their nearest ancestor.
|
|
20
|
-
*
|
|
21
|
-
* Renders no DOM and holds no layout opinion — unlike `OverlayProvider` it is
|
|
22
|
-
* not a page-root singleton, and several can coexist on a page.
|
|
23
|
-
*
|
|
24
|
-
* Plain context state is the right transport here: entries change at category
|
|
25
|
-
* granularity (once per hit band crossed, not per mousemove), so a sweep
|
|
26
|
-
* across a chart re-renders the group a handful of times. No subscription or
|
|
27
|
-
* selector machinery is warranted.
|
|
28
|
-
*/
|
|
29
|
-
var DashboardProvider = ({ children }) => {
|
|
5
|
+
var DashboardProvider = ({ sharedTooltip = false, children }) => {
|
|
30
6
|
const [activeEntry, setActiveEntry] = useState(null);
|
|
31
7
|
const setActive = useCallback((entry) => {
|
|
32
8
|
setActiveEntry((prev) => prev !== null && prev.sourceId === entry.sourceId && prev.categoryKey === entry.categoryKey ? prev : entry);
|
|
@@ -37,11 +13,13 @@ var DashboardProvider = ({ children }) => {
|
|
|
37
13
|
const contextValue = useMemo(() => ({
|
|
38
14
|
activeEntry,
|
|
39
15
|
setActive,
|
|
40
|
-
clearActive
|
|
16
|
+
clearActive,
|
|
17
|
+
sharedTooltip
|
|
41
18
|
}), [
|
|
42
19
|
activeEntry,
|
|
43
20
|
setActive,
|
|
44
|
-
clearActive
|
|
21
|
+
clearActive,
|
|
22
|
+
sharedTooltip
|
|
45
23
|
]);
|
|
46
24
|
return /* @__PURE__ */ jsx(DashboardContext.Provider, {
|
|
47
25
|
value: contextValue,
|
package/dist/charts/LineChart.js
CHANGED
|
@@ -69,7 +69,7 @@ var LineChart = ({ series, lines, categories, width, height, fillWidth, fillHeig
|
|
|
69
69
|
categoryCount: geometry.columns.length,
|
|
70
70
|
seriesKeys: legendKeys,
|
|
71
71
|
categoryKeys: geometry.categories,
|
|
72
|
-
|
|
72
|
+
isDisabled: noTooltip || isLoading || isEmpty,
|
|
73
73
|
isLoading
|
|
74
74
|
});
|
|
75
75
|
const activeColumn = interaction.activeIndex === null ? null : geometry.columns[interaction.activeIndex];
|
package/dist/charts/PieChart.js
CHANGED
|
@@ -76,7 +76,7 @@ var PieChart = ({ series, slices, width, height, fillWidth, fillHeight, aspectRa
|
|
|
76
76
|
const interaction = useChartInteraction({
|
|
77
77
|
categoryCount: geometry.arcs.length,
|
|
78
78
|
seriesKeys: legendKeys,
|
|
79
|
-
|
|
79
|
+
isDisabled: noTooltip || isLoading || isEmpty,
|
|
80
80
|
isLoading
|
|
81
81
|
});
|
|
82
82
|
const buildCategoryTooltip = useCallback((index) => {
|
|
@@ -181,6 +181,14 @@ export declare const CHART_TRANSITION_MS = 100;
|
|
|
181
181
|
*/
|
|
182
182
|
export declare const CHART_MARK_OPACITY_ACTIVE = 1;
|
|
183
183
|
export declare const CHART_MARK_OPACITY_MUTED = 0.1;
|
|
184
|
+
/**
|
|
185
|
+
* The whisper tier, for `ChartMarkState.DIMMED`.
|
|
186
|
+
*
|
|
187
|
+
* Deliberately far gentler than MUTED: it is used where another affordance —
|
|
188
|
+
* BarChart's cursor band — already marks the hovered category, so the
|
|
189
|
+
* off-category marks only need to step back, not disappear.
|
|
190
|
+
*/
|
|
191
|
+
export declare const CHART_MARK_OPACITY_DIMMED = 0.4;
|
|
184
192
|
/** Distance in px between the tooltip and its anchor. */
|
|
185
193
|
export declare const CHART_TOOLTIP_OFFSET = 10;
|
|
186
194
|
/** Minimum width of the tooltip, in px. */
|
|
@@ -190,15 +198,17 @@ export declare const CHART_TOOLTIP_MAX_WIDTH = 320;
|
|
|
190
198
|
/** Gap in px between the plot box and a side-placed legend. */
|
|
191
199
|
export declare const CHART_LEGEND_SIDE_GAP = 16;
|
|
192
200
|
/**
|
|
193
|
-
*
|
|
201
|
+
* Spacing in px between entries in a horizontal legend.
|
|
194
202
|
*
|
|
195
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
203
|
+
* Applied as each entry's *trailing padding*, not a flex gap on the row: a gap
|
|
204
|
+
* is dead space between hover targets, and sweeping across it drops the series
|
|
205
|
+
* isolation between every pair of entries. Because the padding lives inside
|
|
206
|
+
* the entries, measured entry sizes already include the spacing and the fit
|
|
207
|
+
* computation needs no separate gap term.
|
|
198
208
|
*/
|
|
199
209
|
export declare const CHART_LEGEND_COLUMN_GAP = 16;
|
|
200
|
-
/**
|
|
201
|
-
* {@link CHART_LEGEND_COLUMN_GAP}:
|
|
210
|
+
/** Spacing in px between entries in a vertical legend. Same contract as
|
|
211
|
+
* {@link CHART_LEGEND_COLUMN_GAP}: trailing padding on the entry, no flex gap. */
|
|
202
212
|
export declare const CHART_LEGEND_VERTICAL_GAP = 8;
|
|
203
213
|
/**
|
|
204
214
|
* Ceiling on the collapsed-legend popover's height, in px.
|
package/dist/charts/constants.js
CHANGED
|
@@ -191,6 +191,14 @@ var CHART_TRANSITION_MS = 100;
|
|
|
191
191
|
*/
|
|
192
192
|
var CHART_MARK_OPACITY_ACTIVE = 1;
|
|
193
193
|
var CHART_MARK_OPACITY_MUTED = .1;
|
|
194
|
+
/**
|
|
195
|
+
* The whisper tier, for `ChartMarkState.DIMMED`.
|
|
196
|
+
*
|
|
197
|
+
* Deliberately far gentler than MUTED: it is used where another affordance —
|
|
198
|
+
* BarChart's cursor band — already marks the hovered category, so the
|
|
199
|
+
* off-category marks only need to step back, not disappear.
|
|
200
|
+
*/
|
|
201
|
+
var CHART_MARK_OPACITY_DIMMED = .4;
|
|
194
202
|
/** Distance in px between the tooltip and its anchor. */
|
|
195
203
|
var CHART_TOOLTIP_OFFSET = 10;
|
|
196
204
|
/** Minimum width of the tooltip, in px. */
|
|
@@ -200,15 +208,17 @@ var CHART_TOOLTIP_MAX_WIDTH = 320;
|
|
|
200
208
|
/** Gap in px between the plot box and a side-placed legend. */
|
|
201
209
|
var CHART_LEGEND_SIDE_GAP = 16;
|
|
202
210
|
/**
|
|
203
|
-
*
|
|
211
|
+
* Spacing in px between entries in a horizontal legend.
|
|
204
212
|
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
213
|
+
* Applied as each entry's *trailing padding*, not a flex gap on the row: a gap
|
|
214
|
+
* is dead space between hover targets, and sweeping across it drops the series
|
|
215
|
+
* isolation between every pair of entries. Because the padding lives inside
|
|
216
|
+
* the entries, measured entry sizes already include the spacing and the fit
|
|
217
|
+
* computation needs no separate gap term.
|
|
208
218
|
*/
|
|
209
219
|
var CHART_LEGEND_COLUMN_GAP = 16;
|
|
210
|
-
/**
|
|
211
|
-
* {@link CHART_LEGEND_COLUMN_GAP}:
|
|
220
|
+
/** Spacing in px between entries in a vertical legend. Same contract as
|
|
221
|
+
* {@link CHART_LEGEND_COLUMN_GAP}: trailing padding on the entry, no flex gap. */
|
|
212
222
|
var CHART_LEGEND_VERTICAL_GAP = 8;
|
|
213
223
|
/**
|
|
214
224
|
* Ceiling on the collapsed-legend popover's height, in px.
|
|
@@ -266,4 +276,4 @@ var CHART_PALETTE_ORDER = [
|
|
|
266
276
|
ChartPalette.RED
|
|
267
277
|
];
|
|
268
278
|
//#endregion
|
|
269
|
-
export { AGGREGATED_SLICE_KEY, AUTO_MARGIN_LEFT_STEP, AXIS_TITLE_BAND, AXIS_TITLE_GAP, BAR_GAP_COMFORTABLE, BAR_GAP_MEDIUM, BAR_GAP_TIGHT, BAR_RADIUS, BAR_RADIUS_NARROW, BAR_WIDTH_RATIO, CAPTION_CHAR_WIDTH_PX, CATEGORY_AXIS_LABEL_GAP, CATEGORY_AXIS_LABEL_HEIGHT, CHART_LEGEND_COLUMN_GAP, CHART_LEGEND_OVERFLOW_MAX_HEIGHT, CHART_LEGEND_SIDE_GAP, CHART_LEGEND_VERTICAL_GAP, CHART_MARK_OPACITY_ACTIVE, CHART_MARK_OPACITY_MUTED, CHART_PALETTE_ORDER, CHART_TOOLTIP_MAX_WIDTH, CHART_TOOLTIP_MIN_WIDTH, CHART_TOOLTIP_OFFSET, CHART_TRANSITION_MS, DEFAULT_CHART_MARGIN, DEFAULT_LINE_STROKE_WIDTH, DEFAULT_VALUE_TICK_COUNT, GRID_LINE_BLEED, GROUP_GAP_COMFORTABLE, GROUP_GAP_MEDIUM, GROUP_GAP_TIGHT, LINE_AREA_OPACITY, LINE_POINT_RADIUS, MAX_AUTO_MARGIN_LEFT, MAX_BAR_WIDTH, MAX_GAP_SHARE, MIN_AUTO_MARGIN_LEFT, MIN_BARS_FOR_TIGHT_SPACING, MIN_BAR_LENGTH, MIN_CATEGORY_LABEL_GAP, NARROW_BAR_WIDTH, PIE_CHART_MARGIN, PIE_CORNER_RADIUS, PIE_DONUT_INNER_RATIO, PIE_MAX_AUTO_INNER_RATIO, PIE_MAX_INSET_SHARE, PIE_MIN_SLICE_SHARE, PIE_PAD_ANGLE, PIE_TOOLTIP_ANCHOR_INSET, STACK_SEGMENT_GAP, VALUE_AXIS_LABEL_HEIGHT, VALUE_AXIS_TICK_GAP, WIDTH_FOR_MEDIUM_SPACING, WIDTH_FOR_TIGHT_SPACING };
|
|
279
|
+
export { AGGREGATED_SLICE_KEY, AUTO_MARGIN_LEFT_STEP, AXIS_TITLE_BAND, AXIS_TITLE_GAP, BAR_GAP_COMFORTABLE, BAR_GAP_MEDIUM, BAR_GAP_TIGHT, BAR_RADIUS, BAR_RADIUS_NARROW, BAR_WIDTH_RATIO, CAPTION_CHAR_WIDTH_PX, CATEGORY_AXIS_LABEL_GAP, CATEGORY_AXIS_LABEL_HEIGHT, CHART_LEGEND_COLUMN_GAP, CHART_LEGEND_OVERFLOW_MAX_HEIGHT, CHART_LEGEND_SIDE_GAP, CHART_LEGEND_VERTICAL_GAP, CHART_MARK_OPACITY_ACTIVE, CHART_MARK_OPACITY_DIMMED, CHART_MARK_OPACITY_MUTED, CHART_PALETTE_ORDER, CHART_TOOLTIP_MAX_WIDTH, CHART_TOOLTIP_MIN_WIDTH, CHART_TOOLTIP_OFFSET, CHART_TRANSITION_MS, DEFAULT_CHART_MARGIN, DEFAULT_LINE_STROKE_WIDTH, DEFAULT_VALUE_TICK_COUNT, GRID_LINE_BLEED, GROUP_GAP_COMFORTABLE, GROUP_GAP_MEDIUM, GROUP_GAP_TIGHT, LINE_AREA_OPACITY, LINE_POINT_RADIUS, MAX_AUTO_MARGIN_LEFT, MAX_BAR_WIDTH, MAX_GAP_SHARE, MIN_AUTO_MARGIN_LEFT, MIN_BARS_FOR_TIGHT_SPACING, MIN_BAR_LENGTH, MIN_CATEGORY_LABEL_GAP, NARROW_BAR_WIDTH, PIE_CHART_MARGIN, PIE_CORNER_RADIUS, PIE_DONUT_INNER_RATIO, PIE_MAX_AUTO_INNER_RATIO, PIE_MAX_INSET_SHARE, PIE_MIN_SLICE_SHARE, PIE_PAD_ANGLE, PIE_TOOLTIP_ANCHOR_INSET, STACK_SEGMENT_GAP, VALUE_AXIS_LABEL_HEIGHT, VALUE_AXIS_TICK_GAP, WIDTH_FOR_MEDIUM_SPACING, WIDTH_FOR_TIGHT_SPACING };
|
package/dist/charts/types.d.ts
CHANGED
|
@@ -153,8 +153,16 @@ export declare enum ChartCategoryLabelMode {
|
|
|
153
153
|
export declare enum ChartMarkState {
|
|
154
154
|
/** Full strength — the default, and the hovered category. */
|
|
155
155
|
ACTIVE = "active",
|
|
156
|
-
/** Softened, for
|
|
157
|
-
MUTED = "muted"
|
|
156
|
+
/** Softened, for marks outside the engaged series or category. */
|
|
157
|
+
MUTED = "muted",
|
|
158
|
+
/**
|
|
159
|
+
* Barely softened — a whisper of {@link MUTED}.
|
|
160
|
+
*
|
|
161
|
+
* Used where another affordance already carries the emphasis and strong
|
|
162
|
+
* muting would be a second, louder voice: BarChart's category axis dims
|
|
163
|
+
* like this because the cursor band is the highlight.
|
|
164
|
+
*/
|
|
165
|
+
DIMMED = "dimmed"
|
|
158
166
|
}
|
|
159
167
|
/** Which pair of a rectangle's corners carries the radius. */
|
|
160
168
|
export declare enum BarCorners {
|
package/dist/charts/types.js
CHANGED
|
@@ -115,8 +115,16 @@ var ChartCategoryLabelMode = /* @__PURE__ */ function(ChartCategoryLabelMode) {
|
|
|
115
115
|
var ChartMarkState = /* @__PURE__ */ function(ChartMarkState) {
|
|
116
116
|
/** Full strength — the default, and the hovered category. */
|
|
117
117
|
ChartMarkState["ACTIVE"] = "active";
|
|
118
|
-
/** Softened, for
|
|
118
|
+
/** Softened, for marks outside the engaged series or category. */
|
|
119
119
|
ChartMarkState["MUTED"] = "muted";
|
|
120
|
+
/**
|
|
121
|
+
* Barely softened — a whisper of {@link MUTED}.
|
|
122
|
+
*
|
|
123
|
+
* Used where another affordance already carries the emphasis and strong
|
|
124
|
+
* muting would be a second, louder voice: BarChart's category axis dims
|
|
125
|
+
* like this because the cursor band is the highlight.
|
|
126
|
+
*/
|
|
127
|
+
ChartMarkState["DIMMED"] = "dimmed";
|
|
120
128
|
return ChartMarkState;
|
|
121
129
|
}({});
|
|
122
130
|
/** Which pair of a rectangle's corners carries the radius. */
|
|
@@ -11,11 +11,12 @@ import { ChartMarkState } from "./types";
|
|
|
11
11
|
*
|
|
12
12
|
* Plus one read-only source: inside a `DashboardProvider`, a chart that
|
|
13
13
|
* supplies {@link UseChartInteractionOptions.categoryKeys} follows the category
|
|
14
|
-
* hovered in a sibling chart, matched by raw label. Following emphasizes
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* share the name would
|
|
14
|
+
* hovered in a sibling chart, matched by raw label. Following emphasizes; it
|
|
15
|
+
* opens the tooltip only when the provider opts in via `sharedTooltip`, which
|
|
16
|
+
* is what {@link ChartInteraction.showTooltip} folds together. The series axis
|
|
17
|
+
* deliberately does not sync: series keys are chart-local vocabulary, and
|
|
18
|
+
* isolating "Delivered" in a chart that happens to share the name would
|
|
19
|
+
* correlate nothing.
|
|
19
20
|
*
|
|
20
21
|
* Deliberately no click layer. Clicking used to pin the hover so it survived
|
|
21
22
|
* the pointer leaving, and it read as the chart getting stuck — the emphasis
|
|
@@ -33,12 +34,21 @@ interface UseChartInteractionOptions {
|
|
|
33
34
|
* two charts formatting the same label differently must still match.
|
|
34
35
|
*/
|
|
35
36
|
categoryKeys?: string[];
|
|
37
|
+
/**
|
|
38
|
+
* How marks outside the active category recede. Defaults to
|
|
39
|
+
* {@link ChartMarkState.MUTED}; BarChart passes
|
|
40
|
+
* {@link ChartMarkState.DIMMED} because its cursor band already carries the
|
|
41
|
+
* category highlight and strong muting on top of it would shout. Only the
|
|
42
|
+
* category axis softens — series (legend) isolation always mutes fully,
|
|
43
|
+
* since there the muting *is* the affordance.
|
|
44
|
+
*/
|
|
45
|
+
categoryMuteState?: ChartMarkState;
|
|
36
46
|
/** Suppress all interaction — used while loading and when the tooltip is off. */
|
|
37
|
-
|
|
47
|
+
isDisabled?: boolean;
|
|
38
48
|
/**
|
|
39
49
|
* Render every mark muted, whatever the two axes say.
|
|
40
50
|
*
|
|
41
|
-
* Distinct from {@link
|
|
51
|
+
* Distinct from {@link isDisabled}, which suppresses *input*. Loading suppresses
|
|
42
52
|
* *emphasis*: there is nothing yet worth drawing attention to. Folded in here
|
|
43
53
|
* rather than left to each mark, because the alternative is the same
|
|
44
54
|
* `isLoading ? MUTED : getMarkState(…)` ternary hand-copied at every mark —
|
|
@@ -59,11 +69,11 @@ export interface ChartInteraction {
|
|
|
59
69
|
*/
|
|
60
70
|
activeIndex: number | null;
|
|
61
71
|
/**
|
|
62
|
-
* True when
|
|
63
|
-
*
|
|
64
|
-
*
|
|
72
|
+
* True when this chart should present its tooltip for {@link activeIndex}:
|
|
73
|
+
* its own pointer hover always, a synced sibling's only when the
|
|
74
|
+
* `DashboardProvider` opts in via `sharedTooltip`.
|
|
65
75
|
*/
|
|
66
|
-
|
|
76
|
+
showTooltip: boolean;
|
|
67
77
|
hoveredSeriesKey: string | null;
|
|
68
78
|
/**
|
|
69
79
|
* Emphasis for one mark, composed from both axes.
|
|
@@ -82,5 +92,5 @@ export interface ChartInteraction {
|
|
|
82
92
|
onSeriesEnter: (seriesKey: string) => void;
|
|
83
93
|
onSeriesLeave: () => void;
|
|
84
94
|
}
|
|
85
|
-
export declare function useChartInteraction({ categoryCount, seriesKeys, categoryKeys,
|
|
95
|
+
export declare function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, categoryMuteState, isDisabled, isLoading, }: UseChartInteractionOptions): ChartInteraction;
|
|
86
96
|
export {};
|
|
@@ -2,7 +2,7 @@ import { ChartMarkState } from "./types.js";
|
|
|
2
2
|
import { DashboardContext } from "./DashboardProvider.js";
|
|
3
3
|
import { useCallback, useContext, useEffect, useId, useMemo, useState } from "react";
|
|
4
4
|
//#region src/charts/useChartInteraction.ts
|
|
5
|
-
function useChartInteraction({ categoryCount, seriesKeys, categoryKeys,
|
|
5
|
+
function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, categoryMuteState = ChartMarkState.MUTED, isDisabled = false, isLoading = false }) {
|
|
6
6
|
const [hoveredIndex, setHoveredIndex] = useState(null);
|
|
7
7
|
const [hoveredSeriesKey, setHoveredSeriesKey] = useState(null);
|
|
8
8
|
const sync = useContext(DashboardContext);
|
|
@@ -60,14 +60,15 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, disabled
|
|
|
60
60
|
categoryKeys
|
|
61
61
|
]);
|
|
62
62
|
const effectiveIndex = safeHovered ?? followedIndex;
|
|
63
|
+
const showTooltip = safeHovered !== null || followedIndex !== null && (sync?.sharedTooltip ?? false);
|
|
63
64
|
const onCategoryEnter = useCallback((categoryIndex) => {
|
|
64
|
-
if (
|
|
65
|
+
if (isDisabled) return;
|
|
65
66
|
setHoveredIndex(categoryIndex);
|
|
66
|
-
}, [
|
|
67
|
+
}, [isDisabled]);
|
|
67
68
|
const onCategoryLeave = useCallback(() => {
|
|
68
|
-
if (
|
|
69
|
+
if (isDisabled) return;
|
|
69
70
|
setHoveredIndex(null);
|
|
70
|
-
}, [
|
|
71
|
+
}, [isDisabled]);
|
|
71
72
|
const onSeriesEnter = useCallback((seriesKey) => {
|
|
72
73
|
setHoveredSeriesKey(seriesKey);
|
|
73
74
|
}, []);
|
|
@@ -76,15 +77,19 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, disabled
|
|
|
76
77
|
}, []);
|
|
77
78
|
const getMarkState = useCallback(({ categoryIndex, seriesKey }) => {
|
|
78
79
|
if (isLoading) return ChartMarkState.MUTED;
|
|
79
|
-
|
|
80
|
+
const categoryMuted = categoryIndex !== void 0 && effectiveIndex !== null && categoryIndex !== effectiveIndex;
|
|
81
|
+
if (seriesKey !== void 0 && safeHoveredSeries !== null && seriesKey !== safeHoveredSeries) return ChartMarkState.MUTED;
|
|
82
|
+
if (categoryMuted) return categoryMuteState;
|
|
83
|
+
return ChartMarkState.ACTIVE;
|
|
80
84
|
}, [
|
|
81
85
|
isLoading,
|
|
82
86
|
effectiveIndex,
|
|
83
|
-
safeHoveredSeries
|
|
87
|
+
safeHoveredSeries,
|
|
88
|
+
categoryMuteState
|
|
84
89
|
]);
|
|
85
90
|
return useMemo(() => ({
|
|
86
91
|
activeIndex: effectiveIndex,
|
|
87
|
-
|
|
92
|
+
showTooltip,
|
|
88
93
|
hoveredSeriesKey: safeHoveredSeries,
|
|
89
94
|
getMarkState,
|
|
90
95
|
onCategoryEnter,
|
|
@@ -93,7 +98,7 @@ function useChartInteraction({ categoryCount, seriesKeys, categoryKeys, disabled
|
|
|
93
98
|
onSeriesLeave
|
|
94
99
|
}), [
|
|
95
100
|
effectiveIndex,
|
|
96
|
-
|
|
101
|
+
showTooltip,
|
|
97
102
|
safeHoveredSeries,
|
|
98
103
|
getMarkState,
|
|
99
104
|
onCategoryEnter,
|
package/dist/styles.css
CHANGED
|
@@ -24,27 +24,28 @@
|
|
|
24
24
|
.c1hcga6s{position:relative;display:var(--c1hcga6s-0);-webkit-flex-direction:var(--c1hcga6s-1);-ms-flex-direction:var(--c1hcga6s-1);flex-direction:var(--c1hcga6s-1);-webkit-align-items:var(--c1hcga6s-2);-webkit-box-align:var(--c1hcga6s-2);-ms-flex-align:var(--c1hcga6s-2);align-items:var(--c1hcga6s-2);-webkit-box-pack:var(--c1hcga6s-3);-ms-flex-pack:var(--c1hcga6s-3);-webkit-justify-content:var(--c1hcga6s-3);justify-content:var(--c1hcga6s-3);width:var(--c1hcga6s-4);min-width:0;height:var(--c1hcga6s-5);min-height:0;}
|
|
25
25
|
.c1fvbgkp{position:relative;width:var(--c1fvbgkp-0);min-width:0;aspect-ratio:var(--c1fvbgkp-1);height:var(--c1fvbgkp-2);-webkit-flex:var(--c1fvbgkp-3);-ms-flex:var(--c1fvbgkp-3);flex:var(--c1fvbgkp-3);min-height:var(--c1fvbgkp-4);}
|
|
26
26
|
.c10uj5yt{display:block;overflow:visible;}
|
|
27
|
-
.cyuty3o{opacity:1;}.cyuty3o[data-state="muted"]{opacity:0.1;}
|
|
28
|
-
.c1ob2op2{fill:none;stroke-linecap:round;stroke-linejoin:round;pointer-events:none;opacity:1;}.c1ob2op2[data-state="muted"]{opacity:0.1;}
|
|
29
|
-
.c8c506o{stroke:none;pointer-events:none;opacity:1;}.c8c506o[data-state="muted"]{opacity:0.1;}
|
|
30
|
-
.ceqlpek{pointer-events:none;opacity:1;}.ceqlpek[data-state="muted"]{opacity:0.1;}
|
|
31
|
-
.c1fcbddl{opacity:1;}.c1fcbddl[data-state="muted"]{opacity:0.1;}
|
|
27
|
+
.cyuty3o{opacity:1;}.cyuty3o[data-state="muted"]{opacity:0.1;}.cyuty3o[data-state="dimmed"]{opacity:0.4;}
|
|
28
|
+
.c1ob2op2{fill:none;stroke-linecap:round;stroke-linejoin:round;pointer-events:none;opacity:1;}.c1ob2op2[data-state="muted"]{opacity:0.1;}.c1ob2op2[data-state="dimmed"]{opacity:0.4;}
|
|
29
|
+
.c8c506o{stroke:none;pointer-events:none;opacity:1;}.c8c506o[data-state="muted"]{opacity:0.1;}.c8c506o[data-state="dimmed"]{opacity:0.4;}
|
|
30
|
+
.ceqlpek{pointer-events:none;opacity:1;}.ceqlpek[data-state="muted"]{opacity:0.1;}.ceqlpek[data-state="dimmed"]{opacity:0.4;}
|
|
31
|
+
.c1fcbddl{opacity:1;}.c1fcbddl[data-state="muted"]{opacity:0.1;}.c1fcbddl[data-state="dimmed"]{opacity:0.4;}
|
|
32
32
|
.cpcxr59{fill:transparent;outline:none;}
|
|
33
33
|
.c1wvzvu4{fill:transparent;outline:none;}
|
|
34
34
|
.c17guewt{stroke:var(--c17guewt-0);shape-rendering:crispEdges;}
|
|
35
35
|
.cblgiyf{stroke:var(--cblgiyf-0);pointer-events:none;}
|
|
36
|
-
.c1lr03cc{
|
|
37
|
-
.cizy1s8{
|
|
38
|
-
.c1ukq11d{
|
|
39
|
-
.cwcko2m{display:-
|
|
40
|
-
.cqwhvyz{
|
|
41
|
-
.c1iaray{
|
|
42
|
-
.cz6jod1{position:absolute;top:
|
|
43
|
-
.c1de5mqk{position:
|
|
44
|
-
.cjirv6a{position:
|
|
45
|
-
.c1armna5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:
|
|
46
|
-
.cgd77rv{display:-webkit-
|
|
47
|
-
.cutidpi{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:6px;opacity:1;}.cutidpi[data-state="muted"]{opacity:0.1;}
|
|
36
|
+
.c1lr03cc{fill:var(--c1lr03cc-0);pointer-events:none;}
|
|
37
|
+
.cizy1s8{overflow:visible;pointer-events:none;}
|
|
38
|
+
.c1ukq11d{position:absolute;z-index:10;pointer-events:none;left:var(--c1ukq11d-0);top:var(--c1ukq11d-1);min-width:168px;max-width:320px;padding:10px 12px;border:0.5px solid var(--c1ukq11d-2);border-radius:6px;background-color:var(--c1ukq11d-3);opacity:var(--c1ukq11d-4);-webkit-transition:opacity 100ms ease-in-out,left 100ms ease-out,top 100ms ease-out;transition:opacity 100ms ease-in-out,left 100ms ease-out,top 100ms ease-out;}@media (prefers-reduced-motion: reduce){.c1ukq11d{-webkit-transition:none;transition:none;}}
|
|
39
|
+
.cwcko2m{display:-ms-grid;display:grid;-ms-grid-columns:minmax(0, 1fr) auto;grid-template-columns:minmax(0, 1fr) auto;-webkit-column-gap:16px;column-gap:16px;row-gap:6px;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;}
|
|
40
|
+
.cqwhvyz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:6px;min-width:0;}
|
|
41
|
+
.c1iaray{text-align:right;white-space:nowrap;}
|
|
42
|
+
.cz6jod1{position:absolute;left:var(--cz6jod1-0);top:var(--cz6jod1-1);width:var(--cz6jod1-2);height:var(--cz6jod1-2);-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);pointer-events:none;text-align:center;}
|
|
43
|
+
.c1de5mqk{position:absolute;top:38%;left:50%;-webkit-transform:translate(-50%, -50%);-moz-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);max-width:60%;padding:6px 8px;border:0.5px solid var(--c1de5mqk-0);border-radius:6px;background-color:var(--c1de5mqk-1);pointer-events:none;text-align:center;}
|
|
44
|
+
.cjirv6a{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:var(--cjirv6a-0);-ms-flex-direction:var(--cjirv6a-0);flex-direction:var(--cjirv6a-0);-webkit-box-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-items:var(--cjirv6a-1);-webkit-box-align:var(--cjirv6a-1);-ms-flex-align:var(--cjirv6a-1);align-items:var(--cjirv6a-1);-webkit-box-pack:var(--cjirv6a-2);-ms-flex-pack:var(--cjirv6a-2);-webkit-justify-content:var(--cjirv6a-2);justify-content:var(--cjirv6a-2);width:var(--cjirv6a-3);min-width:var(--cjirv6a-4);height:var(--cjirv6a-5);-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding-top:var(--cjirv6a-6);padding-left:var(--cjirv6a-7);}
|
|
45
|
+
.c1armna5{position:absolute;visibility:hidden;pointer-events:none;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:var(--c1armna5-0);-ms-flex-direction:var(--c1armna5-0);flex-direction:var(--c1armna5-0);-webkit-box-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-items:var(--c1armna5-1);-webkit-box-align:var(--c1armna5-1);-ms-flex-align:var(--c1armna5-1);align-items:var(--c1armna5-1);width:-webkit-max-content;width:-moz-max-content;width:max-content;height:-webkit-max-content;height:-moz-max-content;height:max-content;white-space:nowrap;}
|
|
46
|
+
.cgd77rv{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;max-height:208px;overflow-y:auto;}
|
|
47
|
+
.cutidpi{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:6px;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;background:none;border:0;padding:var(--cutidpi-0);margin:0;font:inherit;color:inherit;cursor:default;border-radius:2px;opacity:1;}.cutidpi[data-state="muted"]{opacity:0.1;}.cutidpi[data-state="dimmed"]{opacity:0.4;}.cutidpi:focus-visible{outline:1.5px solid currentColor;outline-offset:2px;}
|
|
48
|
+
.ccpczg{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;gap:6px;padding:var(--ccpczg-0);opacity:1;}.ccpczg[data-state="muted"]{opacity:0.1;}.ccpczg[data-state="dimmed"]{opacity:0.4;}
|
|
48
49
|
.cmbdg2q{width:var(--cmbdg2q-0);height:var(--cmbdg2q-0);border-radius:50%;background-color:var(--cmbdg2q-1);}
|
|
49
50
|
.tbnx4ok{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}
|
|
50
51
|
.tjda4tq{display:inline-block;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:-webkit-max-content;max-width:-moz-max-content;max-width:max-content;padding:var(--tjda4tq-0);background-color:var(--tjda4tq-1);border:var(--tjda4tq-2);border-radius:5px;}
|