@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.
@@ -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;
@@ -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
- disabled: noTooltip || isLoading || isEmpty,
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__ */ jsx(ChartFrame, {
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: geometry.rects.map((rect) => /* @__PURE__ */ jsx(ChartBarPath, {
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
- * A category with nothing to show gets no target at all: hovering an all-zero
11
- * bar group or an all-null line column must not open a tooltip with a heading
12
- * and no rows, so the empty stretch of plot is simply not hoverable.
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, inertIndices, }: ChartCategoryTargetsProps) => import("react").JSX.Element;
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, inertIndices }) => /* @__PURE__ */ jsx(Fragment, { children: targets.map((target, index) => {
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
- * Taken as a function rather than a finished model because the frame needs it
74
- * twice: once for the category under the pointer, and once per category to
75
- * decide which categories are inert. Deriving both from the same builder is
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(() => noTooltip || !interaction.hasLocalHover || interaction.activeIndex === null ? null : buildCategoryTooltip(interaction.activeIndex), [
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.hasLocalHover
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, i) => sum + size + (i > 0 ? gap : 0), 0) <= available) {
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 + (i > 0 ? gap : 0);
57
- if (used + gap + triggerSize > available) break;
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, { children: [/* @__PURE__ */ jsx(Circle, {
128
- size: 8,
129
- hex: item.color
130
- }), /* @__PURE__ */ jsx(Text, {
131
- size: TextSize.BODY_SM,
132
- children: item.label
133
- })] }, item.key)), /* @__PURE__ */ jsx(ChartLegendItemStatic, { children: /* @__PURE__ */ jsx(Text, {
134
- size: TextSize.BODY_SM,
135
- variant: TextVariant.SECONDARY,
136
- children: `+${items.length - 1} more`
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> & Record<never, unknown>>;
240
- /** The same row, when the legend is inert — no button semantics to announce. */
241
- export declare const ChartLegendItemStatic: import("@linaria/react").StyledComponent<import("react").ClassAttributes<HTMLDivElement> & import("react").HTMLAttributes<HTMLDivElement> & Record<never, unknown>>;
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: "c1lr03cc",
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 _exp17 = () => ({ $x }) => `${$x}px`;
192
- var _exp18 = () => ({ $y }) => `${$y}px`;
193
- var _exp21 = () => ({ theme }) => theme.color.border.primary;
194
- var _exp22 = () => ({ theme }) => theme.color.background.tertiary;
195
- var _exp23 = () => ({ $isVisible }) => $isVisible ? 1 : 0;
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: "cizy1s8",
211
+ class: "c1ukq11d",
199
212
  propsAsIs: false,
200
213
  vars: {
201
- "cizy1s8-0": [_exp17()],
202
- "cizy1s8-1": [_exp18()],
203
- "cizy1s8-2": [_exp21()],
204
- "cizy1s8-3": [_exp22()],
205
- "cizy1s8-4": [_exp23()]
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: "c1ukq11d",
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: "cwcko2m",
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: "cqwhvyz",
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 _exp27 = () => ({ $centerX }) => `${$centerX}px`;
243
- var _exp28 = () => ({ $centerY }) => `${$centerY}px`;
244
- var _exp30 = () => ({ $diameter }) => `${$diameter}px`;
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: "c1iaray",
260
+ class: "cz6jod1",
248
261
  propsAsIs: false,
249
262
  vars: {
250
- "c1iaray-0": [_exp27()],
251
- "c1iaray-1": [_exp28()],
252
- "c1iaray-2": [_exp30()]
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 _exp31 = () => ({ theme }) => theme.color.border.primary;
260
- var _exp32 = () => ({ theme }) => theme.color.background.primary;
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: "cz6jod1",
276
+ class: "c1de5mqk",
264
277
  propsAsIs: false,
265
278
  vars: {
266
- "cz6jod1-0": [_exp31()],
267
- "cz6jod1-1": [_exp32()]
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 _exp33 = () => ({ $vertical }) => $vertical ? "column" : "row";
274
- var _exp34 = () => ({ $vertical }) => $vertical ? "flex-start" : "center";
275
- var _exp35 = () => ({ $vertical }) => $vertical ? "center" : "flex-start";
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: "c1de5mqk",
296
+ class: "cjirv6a",
285
297
  propsAsIs: false,
286
298
  vars: {
287
- "c1de5mqk-0": [_exp33()],
288
- "c1de5mqk-1": [_exp34()],
289
- "c1de5mqk-2": [_exp35()],
290
- "c1de5mqk-3": [_exp36()],
291
- "c1de5mqk-4": [_exp37()],
292
- "c1de5mqk-5": [_exp38()],
293
- "c1de5mqk-6": [_exp39()],
294
- "c1de5mqk-7": [_exp40()],
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: "cjirv6a",
321
+ class: "c1armna5",
312
322
  propsAsIs: false,
313
323
  vars: {
314
- "cjirv6a-0": [_exp42()],
315
- "cjirv6a-1": [_exp43()],
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: "c1armna5",
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: "cgd77rv",
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: "cutidpi",
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. The tooltip
28
- * stays local to the chart under the pointer; siblings get the quiet emphasis
29
- * only (LineChart its cursor line and dots, BarChart its category muting).
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 declare const DashboardProvider: ({ children }: PropsWithChildren) => import("react").JSX.Element;
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,
@@ -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
- disabled: noTooltip || isLoading || isEmpty,
72
+ isDisabled: noTooltip || isLoading || isEmpty,
73
73
  isLoading
74
74
  });
75
75
  const activeColumn = interaction.activeIndex === null ? null : geometry.columns[interaction.activeIndex];
@@ -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
- disabled: noTooltip || isLoading || isEmpty,
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
- * Gap in px between entries in a horizontal legend.
201
+ * Spacing in px between entries in a horizontal legend.
194
202
  *
195
- * Also the number the fit computation adds between measured entries, so the
196
- * CSS and the arithmetic cannot disagree which is what makes the collapse
197
- * exact rather than "usually right".
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
- /** Gap in px between entries in a vertical legend. Same contract as
201
- * {@link CHART_LEGEND_COLUMN_GAP}: shared by the CSS and the fit arithmetic. */
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.
@@ -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
- * Gap in px between entries in a horizontal legend.
211
+ * Spacing in px between entries in a horizontal legend.
204
212
  *
205
- * Also the number the fit computation adds between measured entries, so the
206
- * CSS and the arithmetic cannot disagree which is what makes the collapse
207
- * exact rather than "usually right".
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
- /** Gap in px between entries in a vertical legend. Same contract as
211
- * {@link CHART_LEGEND_COLUMN_GAP}: shared by the CSS and the fit arithmetic. */
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 };
@@ -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 categories other than the hovered one. */
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 {
@@ -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 categories other than the hovered one. */
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 it
15
- * never opens the tooltip, which is what {@link ChartInteraction.hasLocalHover}
16
- * distinguishes. The series axis deliberately does not sync: series keys are
17
- * chart-local vocabulary, and isolating "Delivered" in a chart that happens to
18
- * share the name would correlate nothing.
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
- disabled?: boolean;
47
+ isDisabled?: boolean;
38
48
  /**
39
49
  * Render every mark muted, whatever the two axes say.
40
50
  *
41
- * Distinct from {@link disabled}, which suppresses *input*. Loading suppresses
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 {@link activeIndex} comes from this chart's own pointer rather
63
- * than a synced sibling. Gates the tooltip: only the chart under the pointer
64
- * opens one.
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
- hasLocalHover: boolean;
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, disabled, isLoading, }: UseChartInteractionOptions): ChartInteraction;
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, disabled = false, isLoading = false }) {
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 (disabled) return;
65
+ if (isDisabled) return;
65
66
  setHoveredIndex(categoryIndex);
66
- }, [disabled]);
67
+ }, [isDisabled]);
67
68
  const onCategoryLeave = useCallback(() => {
68
- if (disabled) return;
69
+ if (isDisabled) return;
69
70
  setHoveredIndex(null);
70
- }, [disabled]);
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
- return categoryIndex !== void 0 && effectiveIndex !== null && categoryIndex !== effectiveIndex || seriesKey !== void 0 && safeHoveredSeries !== null && seriesKey !== safeHoveredSeries ? ChartMarkState.MUTED : ChartMarkState.ACTIVE;
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
- hasLocalHover: safeHovered !== null,
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
- safeHovered,
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{overflow:visible;pointer-events:none;}
37
- .cizy1s8{position:absolute;z-index:10;pointer-events:none;left:var(--cizy1s8-0);top:var(--cizy1s8-1);min-width:168px;max-width:320px;padding:10px 12px;border:0.5px solid var(--cizy1s8-2);border-radius:6px;background-color:var(--cizy1s8-3);opacity:var(--cizy1s8-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){.cizy1s8{-webkit-transition:none;transition:none;}}
38
- .c1ukq11d{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%;}
39
- .cwcko2m{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;}
40
- .cqwhvyz{text-align:right;white-space:nowrap;}
41
- .c1iaray{position:absolute;left:var(--c1iaray-0);top:var(--c1iaray-1);width:var(--c1iaray-2);height:var(--c1iaray-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;}
42
- .cz6jod1{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(--cz6jod1-0);border-radius:6px;background-color:var(--cz6jod1-1);pointer-events:none;text-align:center;}
43
- .c1de5mqk{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:var(--c1de5mqk-0);-ms-flex-direction:var(--c1de5mqk-0);flex-direction:var(--c1de5mqk-0);-webkit-box-flex-wrap:nowrap;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-align-items:var(--c1de5mqk-1);-webkit-box-align:var(--c1de5mqk-1);-ms-flex-align:var(--c1de5mqk-1);align-items:var(--c1de5mqk-1);-webkit-box-pack:var(--c1de5mqk-2);-ms-flex-pack:var(--c1de5mqk-2);-webkit-justify-content:var(--c1de5mqk-2);justify-content:var(--c1de5mqk-2);gap:var(--c1de5mqk-3);width:var(--c1de5mqk-4);min-width:var(--c1de5mqk-5);height:var(--c1de5mqk-6);-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding-top:var(--c1de5mqk-7);padding-left:var(--c1de5mqk-8);}
44
- .cjirv6a{position:absolute;visibility:hidden;pointer-events:none;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);gap:var(--cjirv6a-2);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;}
45
- .c1armna5{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;gap:8px;max-height:208px;overflow-y:auto;}
46
- .cgd77rv{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:0;margin:0;font:inherit;color:inherit;cursor:default;border-radius:2px;opacity:1;}.cgd77rv[data-state="muted"]{opacity:0.1;}.cgd77rv:focus-visible{outline:1.5px solid currentColor;outline-offset:2px;}
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;}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galaxy-io/dls",
3
- "version": "1.4.11",
3
+ "version": "1.4.12",
4
4
  "description": "Galaxy Design Language System",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",