@czi-sds/data-viz 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -237,6 +237,30 @@ interface StackedBarChartProps extends HTMLAttributes<HTMLDivElement> {
237
237
  * Callback when legend selection changes
238
238
  */
239
239
  onSelectionChange?: (selectedIndices: number[], selectedData: StackedBarChartDataItem[]) => void;
240
+ /**
241
+ * Callback when mouse enters a bar segment
242
+ */
243
+ onSegmentMouseEnter?: (item: StackedBarChartDataItem, index: number) => void;
244
+ /**
245
+ * Callback when mouse leaves a bar segment
246
+ */
247
+ onSegmentMouseLeave?: (item: StackedBarChartDataItem, index: number) => void;
248
+ /**
249
+ * Callback when mouse enters a legend item
250
+ */
251
+ onLegendItemMouseEnter?: (item: StackedBarChartDataItem, index: number) => void;
252
+ /**
253
+ * Callback when mouse leaves a legend item
254
+ */
255
+ onLegendItemMouseLeave?: (item: StackedBarChartDataItem, index: number) => void;
256
+ /**
257
+ * Callback when a bar segment is clicked
258
+ */
259
+ onSegmentClick?: (item: StackedBarChartDataItem, index: number) => void;
260
+ /**
261
+ * Callback when a legend item is clicked
262
+ */
263
+ onLegendItemClick?: (item: StackedBarChartDataItem, index: number) => void;
240
264
  /**
241
265
  * Behavior to apply when items are selected
242
266
  * - "dim": Non-selected segments become semi-transparent (20% opacity)
package/dist/index.cjs.js CHANGED
@@ -1761,6 +1761,7 @@ function makeThemeOptions(appTheme, mode) {
1761
1761
  appTheme.spacing.l,
1762
1762
  appTheme.spacing.xl,
1763
1763
  appTheme.spacing.xxl,
1764
+ appTheme.spacing.xxxl,
1764
1765
  ],
1765
1766
  transitions: {
1766
1767
  duration: {
@@ -19216,7 +19217,7 @@ function useNavigationState() {
19216
19217
  };
19217
19218
  }
19218
19219
 
19219
- function NavigationHeaderPrimaryNav({ menuProps, hasInvertedStyle, isNarrow, items, onChange, value, sdsStyle = "dropdown", expandedAccordion, setExpandedAccordion, accordionRefs, scrollToAccordion, onDrawerStateChange, topOffset = 0, onClose: onCloseProp, }) {
19220
+ function NavigationHeaderPrimaryNav({ menuProps, hasInvertedStyle, isNarrow, items, onChange, value, sdsStyle = "dropdown", expandedAccordion, setExpandedAccordion, accordionRefs, scrollToAccordion, onDrawerStateChange, topOffset = 0, onClose: onCloseProp, onDrawerStyleNavItemHover, }) {
19220
19221
  const theme = material.useTheme();
19221
19222
  const { anchorEl, activeDropdownKey, activeDrawerKey, contentKey, isContentFading, open, drawerOpen, buttonRef, menuWidth, setAnchorEl, setActiveDropdownKey, setActiveDrawerKey, setContentKey, onClose: handleClose, onDrawerClose, onDrawerOpen, cancelDrawerClose, } = useNavigationState();
19222
19223
  const [clickedDrawerKey, setClickedDrawerKey] = React.useState(null);
@@ -19265,6 +19266,7 @@ function NavigationHeaderPrimaryNav({ menuProps, hasInvertedStyle, isNarrow, ite
19265
19266
  }
19266
19267
  };
19267
19268
  return (jsxRuntime.jsx(StyledHoverDrawerContainer, { onMouseEnter: () => {
19269
+ onDrawerStyleNavItemHover?.(item);
19268
19270
  if (clickedDrawerKey !== key) {
19269
19271
  onDrawerOpen(key);
19270
19272
  }
@@ -19516,7 +19518,7 @@ const StyledTag = styled$2__default.default(Tag) `
19516
19518
  margin: 0;
19517
19519
  `;
19518
19520
 
19519
- function NavigationHeaderSecondaryNav({ menuProps, items, hasInvertedStyle, isNarrow, sdsStyle = "dropdown", expandedAccordion, setExpandedAccordion, accordionRefs, scrollToAccordion, onDrawerStateChange, topOffset = 0, onClose: onCloseProp, }) {
19521
+ function NavigationHeaderSecondaryNav({ menuProps, items, hasInvertedStyle, isNarrow, sdsStyle = "dropdown", expandedAccordion, setExpandedAccordion, accordionRefs, scrollToAccordion, onDrawerStateChange, topOffset = 0, onClose: onCloseProp, onDrawerStyleNavItemHover, }) {
19520
19522
  const theme = material.useTheme();
19521
19523
  const { anchorEl, activeDropdownKey, activeDrawerKey, contentKey, isContentFading, open, drawerOpen, buttonRef, menuWidth, setAnchorEl, setActiveDropdownKey, setActiveDrawerKey, setContentKey, onClose: handleClose, onDrawerClose, onDrawerOpen, cancelDrawerClose, } = useNavigationState();
19522
19524
  function onClose() {
@@ -19540,7 +19542,10 @@ function NavigationHeaderSecondaryNav({ menuProps, items, hasInvertedStyle, isNa
19540
19542
  const handleClick = (e) => {
19541
19543
  parentOnClick?.(e);
19542
19544
  };
19543
- return (jsxRuntime.jsx(StyledHoverDrawerContainer, { onMouseEnter: () => onDrawerOpen(key), onMouseLeave: onDrawerClose, children: jsxRuntime.jsxs(UnifiedNavItem, __assign({}, rest, { hasInvertedStyle: hasInvertedStyle, active: isDrawerOpen, isNarrow: isNarrow, sdsStyle: "minimal", innerSdsStyle: sdsStyle, navVariant: "secondary", onClick: handleClick, component: componentProp, href: defaultUrl, target: target, rel: rel, children: [jsxRuntime.jsx(StyledLabelTextWrapper$1, { active: isDrawerOpen, isNarrow: isNarrow, children: label }), jsxRuntime.jsx(StyledLabelTextWrapperShadow$1, { "aria-hidden": "true", isNarrow: isNarrow, children: label }), jsxRuntime.jsx(Icon, { sdsIcon: isDrawerOpen ? "ChevronUp" : "ChevronDown", sdsSize: "xs" })] })) }, key));
19545
+ return (jsxRuntime.jsx(StyledHoverDrawerContainer, { onMouseEnter: () => {
19546
+ onDrawerStyleNavItemHover?.(item);
19547
+ onDrawerOpen(key);
19548
+ }, onMouseLeave: onDrawerClose, children: jsxRuntime.jsxs(UnifiedNavItem, __assign({}, rest, { hasInvertedStyle: hasInvertedStyle, active: isDrawerOpen, isNarrow: isNarrow, sdsStyle: "minimal", innerSdsStyle: sdsStyle, navVariant: "secondary", onClick: handleClick, component: componentProp, href: defaultUrl, target: target, rel: rel, children: [jsxRuntime.jsx(StyledLabelTextWrapper$1, { active: isDrawerOpen, isNarrow: isNarrow, children: label }), jsxRuntime.jsx(StyledLabelTextWrapperShadow$1, { "aria-hidden": "true", isNarrow: isNarrow, children: label }), jsxRuntime.jsx(Icon, { sdsIcon: isDrawerOpen ? "ChevronUp" : "ChevronDown", sdsSize: "xs" })] })) }, key));
19544
19549
  };
19545
19550
  const renderDropdownItem = (item, key, label, parentOnClick, rest) => {
19546
19551
  const isDropdownOpen = open && activeDropdownKey === key;
@@ -19712,7 +19717,7 @@ React.forwardRef((props, ref) => {
19712
19717
  const { activePrimaryNavKey: controlledActivePrimaryNavKey, buttons, sdsStyle = "dropdown", menuProps = {
19713
19718
  disableScrollLock: true,
19714
19719
  disablePortal: true
19715
- }, backgroundAppearance = "matchBackground", logo, logoUrl, logoLinkComponent = "a", logoLinkProps, scrollElevation = true, primaryNavItems, primaryNavPosition = "left", searchProps, secondaryNavItems, setActivePrimaryNavKey: onActivePrimaryNavKeyChange, showSearch = true, tag, tagColor, title, drawerOpen: controlledDrawerOpen, setDrawerOpen: onDrawerOpenChange, isSticky = true, topComponentSlot, ...rest } = props;
19720
+ }, backgroundAppearance = "matchBackground", logo, logoUrl, logoLinkComponent = "a", logoLinkProps, scrollElevation = true, primaryNavItems, primaryNavPosition = "left", searchProps, secondaryNavItems, setActivePrimaryNavKey: onActivePrimaryNavKeyChange, showSearch = true, tag, tagColor, title, drawerOpen: controlledDrawerOpen, setDrawerOpen: onDrawerOpenChange, isSticky = true, topComponentSlot, onDrawerStyleNavItemHover, ...rest } = props;
19716
19721
  const navRef = React.useRef(null);
19717
19722
  const topSlotRef = React.useRef(null);
19718
19723
  const [topOffset, setTopOffset] = React.useState(0);
@@ -19865,11 +19870,11 @@ React.forwardRef((props, ref) => {
19865
19870
  };
19866
19871
  const renderPrimaryNav = () => {
19867
19872
  return (primaryNavItems &&
19868
- primaryNavItems.length > 0 && (jsxRuntime.jsx(NavigationHeaderPrimaryNav, { items: primaryNavItems, value: activePrimaryNavKey, onChange: setActivePrimaryNavKey, hasInvertedStyle: hasInvertedStyle, isNarrow: dimensions.isNarrow, menuProps: menuProps, sdsStyle: sdsStyle, expandedAccordion: expandedAccordion, setExpandedAccordion: setExpandedAccordion, accordionRefs: accordionRefs, scrollToAccordion: scrollToAccordion, onDrawerStateChange: handlePrimaryDrawerStateChange, topOffset: topOffset, onClose: () => setDrawerOpen(false) })));
19873
+ primaryNavItems.length > 0 && (jsxRuntime.jsx(NavigationHeaderPrimaryNav, { items: primaryNavItems, value: activePrimaryNavKey, onChange: setActivePrimaryNavKey, hasInvertedStyle: hasInvertedStyle, isNarrow: dimensions.isNarrow, menuProps: menuProps, sdsStyle: sdsStyle, expandedAccordion: expandedAccordion, setExpandedAccordion: setExpandedAccordion, accordionRefs: accordionRefs, scrollToAccordion: scrollToAccordion, onDrawerStateChange: handlePrimaryDrawerStateChange, topOffset: topOffset, onClose: () => setDrawerOpen(false), onDrawerStyleNavItemHover: onDrawerStyleNavItemHover })));
19869
19874
  };
19870
19875
  const renderSecondaryNav = () => {
19871
19876
  return (secondaryNavItems &&
19872
- secondaryNavItems.length > 0 && (jsxRuntime.jsx(NavigationHeaderSecondaryNav, { items: secondaryNavItems, hasInvertedStyle: hasInvertedStyle, isNarrow: dimensions.isNarrow, menuProps: menuProps, sdsStyle: sdsStyle, expandedAccordion: expandedAccordion, setExpandedAccordion: setExpandedAccordion, accordionRefs: accordionRefs, scrollToAccordion: scrollToAccordion, onDrawerStateChange: handleSecondaryDrawerStateChange, topOffset: topOffset, onClose: () => setDrawerOpen(false) })));
19877
+ secondaryNavItems.length > 0 && (jsxRuntime.jsx(NavigationHeaderSecondaryNav, { items: secondaryNavItems, hasInvertedStyle: hasInvertedStyle, isNarrow: dimensions.isNarrow, menuProps: menuProps, sdsStyle: sdsStyle, expandedAccordion: expandedAccordion, setExpandedAccordion: setExpandedAccordion, accordionRefs: accordionRefs, scrollToAccordion: scrollToAccordion, onDrawerStateChange: handleSecondaryDrawerStateChange, topOffset: topOffset, onClose: () => setDrawerOpen(false), onDrawerStyleNavItemHover: onDrawerStyleNavItemHover })));
19873
19878
  };
19874
19879
  const renderButtonsNode = () => {
19875
19880
  if (!buttons || buttons.length === 0)
@@ -24999,7 +25004,7 @@ var renderBarSegment = function (item, index, options) {
24999
25004
  };
25000
25005
  var StackedBarChart = function (props) {
25001
25006
  var _a, _b, _c;
25002
- var title = props.title, badge = props.badge, _d = props.hideBadge, hideBadge = _d === void 0 ? false : _d, data = props.data, _e = props.width, width = _e === void 0 ? "100%" : _e, _f = props.barHeight, barHeightProp = _f === void 0 ? 16 : _f, _g = props.showLegend, showLegend = _g === void 0 ? true : _g, _h = props.showLegendValues, showLegendValues = _h === void 0 ? true : _h, _j = props.legendValueFormat, legendValueFormat = _j === void 0 ? "percentage" : _j, _k = props.selectedIndices, selectedIndices = _k === void 0 ? [] : _k, onSelectionChange = props.onSelectionChange, _l = props.selectionBehavior, selectionBehavior = _l === void 0 ? "dim" : _l, _m = props.mode, mode = _m === void 0 ? "proportional" : _m, maxAmount = props.maxAmount, _o = props.remainingLabel, remainingLabel = _o === void 0 ? "Remaining" : _o, remainingUnit = props.remainingUnit, unit = props.unit, colorGeneratorOptions = props.colorGeneratorOptions, rest = __rest(props, ["title", "badge", "hideBadge", "data", "width", "barHeight", "showLegend", "showLegendValues", "legendValueFormat", "selectedIndices", "onSelectionChange", "selectionBehavior", "mode", "maxAmount", "remainingLabel", "remainingUnit", "unit", "colorGeneratorOptions"]);
25007
+ var title = props.title, badge = props.badge, _d = props.hideBadge, hideBadge = _d === void 0 ? false : _d, data = props.data, _e = props.width, width = _e === void 0 ? "100%" : _e, _f = props.barHeight, barHeightProp = _f === void 0 ? 16 : _f, _g = props.showLegend, showLegend = _g === void 0 ? true : _g, _h = props.showLegendValues, showLegendValues = _h === void 0 ? true : _h, _j = props.legendValueFormat, legendValueFormat = _j === void 0 ? "percentage" : _j, _k = props.selectedIndices, selectedIndices = _k === void 0 ? [] : _k, onSelectionChange = props.onSelectionChange, onSegmentMouseEnter = props.onSegmentMouseEnter, onSegmentMouseLeave = props.onSegmentMouseLeave, onLegendItemMouseEnter = props.onLegendItemMouseEnter, onLegendItemMouseLeave = props.onLegendItemMouseLeave, onSegmentClick = props.onSegmentClick, onLegendItemClick = props.onLegendItemClick, _l = props.selectionBehavior, selectionBehavior = _l === void 0 ? "dim" : _l, _m = props.mode, mode = _m === void 0 ? "proportional" : _m, maxAmount = props.maxAmount, _o = props.remainingLabel, remainingLabel = _o === void 0 ? "Remaining" : _o, remainingUnit = props.remainingUnit, unit = props.unit, colorGeneratorOptions = props.colorGeneratorOptions, rest = __rest(props, ["title", "badge", "hideBadge", "data", "width", "barHeight", "showLegend", "showLegendValues", "legendValueFormat", "selectedIndices", "onSelectionChange", "onSegmentMouseEnter", "onSegmentMouseLeave", "onLegendItemMouseEnter", "onLegendItemMouseLeave", "onSegmentClick", "onLegendItemClick", "selectionBehavior", "mode", "maxAmount", "remainingLabel", "remainingUnit", "unit", "colorGeneratorOptions"]);
25003
25008
  // Ensure barHeight is at least 1px
25004
25009
  var barHeight = Math.max(1, barHeightProp);
25005
25010
  var theme = material.useTheme();
@@ -25232,8 +25237,24 @@ var StackedBarChart = function (props) {
25232
25237
  theme,
25233
25238
  ]);
25234
25239
  // Handle legend item hover and leave
25235
- var handleLegendItemHover = React.useCallback(function (_item, index) { return setHoveredIndex(index); }, []);
25236
- var handleLegendItemLeave = React.useCallback(function () { return setHoveredIndex(null); }, []);
25240
+ var handleLegendItemHover = React.useCallback(function (_item, index) {
25241
+ setHoveredIndex(index);
25242
+ if (onLegendItemMouseEnter && data[index]) {
25243
+ onLegendItemMouseEnter(data[index], index);
25244
+ }
25245
+ }, [onLegendItemMouseEnter, data]);
25246
+ var handleLegendItemLeave = React.useCallback(function (_item, index) {
25247
+ setHoveredIndex(null);
25248
+ if (onLegendItemMouseLeave && data[index]) {
25249
+ onLegendItemMouseLeave(data[index], index);
25250
+ }
25251
+ }, [onLegendItemMouseLeave, data]);
25252
+ // Handle legend item click
25253
+ var handleLegendItemClickInternal = React.useCallback(function (_item, index) {
25254
+ if (onLegendItemClick && data[index]) {
25255
+ onLegendItemClick(data[index], index);
25256
+ }
25257
+ }, [onLegendItemClick, data]);
25237
25258
  // Handle selection change - reusable logic for both segment and legend
25238
25259
  var handleSelectionChange = React.useCallback(function (newSelectedIndices) {
25239
25260
  if (!onSelectionChange)
@@ -25243,8 +25264,13 @@ var StackedBarChart = function (props) {
25243
25264
  });
25244
25265
  onSelectionChange(newSelectedIndices, selectedData);
25245
25266
  }, [onSelectionChange, data]);
25246
- // Handle segment click - toggle selection
25267
+ // Handle segment click - toggle selection and call onSegmentClick
25247
25268
  var handleSegmentClick = React.useCallback(function (index) {
25269
+ // Call onSegmentClick callback if provided
25270
+ if (onSegmentClick && data[index]) {
25271
+ onSegmentClick(data[index], index);
25272
+ }
25273
+ // Handle selection change
25248
25274
  if (!onSelectionChange)
25249
25275
  return;
25250
25276
  var isSelected = selectedIndicesSet.has(index);
@@ -25254,6 +25280,8 @@ var StackedBarChart = function (props) {
25254
25280
  handleSelectionChange(newSelectedIndices);
25255
25281
  }, [
25256
25282
  onSelectionChange,
25283
+ onSegmentClick,
25284
+ data,
25257
25285
  selectedIndices,
25258
25286
  selectedIndicesSet,
25259
25287
  handleSelectionChange,
@@ -25276,14 +25304,24 @@ var StackedBarChart = function (props) {
25276
25304
  selectionBehavior: selectionBehavior,
25277
25305
  isLast: isLastVisible,
25278
25306
  onMouseEnter: function () {
25279
- return !item.isExiting && setHoveredIndex(item.originalIndex);
25307
+ if (!item.isExiting) {
25308
+ setHoveredIndex(item.originalIndex);
25309
+ if (onSegmentMouseEnter && data[item.originalIndex]) {
25310
+ onSegmentMouseEnter(data[item.originalIndex], item.originalIndex);
25311
+ }
25312
+ }
25313
+ },
25314
+ onMouseLeave: function () {
25315
+ setHoveredIndex(null);
25316
+ if (onSegmentMouseLeave && data[item.originalIndex]) {
25317
+ onSegmentMouseLeave(data[item.originalIndex], item.originalIndex);
25318
+ }
25280
25319
  },
25281
- onMouseLeave: function () { return setHoveredIndex(null); },
25282
25320
  onClick: function () {
25283
25321
  return !item.isExiting && handleSegmentClick(item.originalIndex);
25284
25322
  },
25285
25323
  });
25286
- }), hasRemaining && (jsxRuntime.jsx(BarSegment, { color: (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _a === void 0 ? void 0 : _a.sds) === null || _b === void 0 ? void 0 : _b.base) === null || _c === void 0 ? void 0 : _c.backgroundTertiary, percentage: displayRemainingPercentage, height: barHeight, isLast: true, opacity: 1, disabled: true }, "remaining"))] }), showLegend && (jsxRuntime.jsx(Legend, { items: legendItems, showValues: showLegendValues, onItemMouseEnter: handleLegendItemHover, onItemMouseLeave: handleLegendItemLeave, selectedIndices: selectedIndices, onSelectionChange: onSelectionChange ? handleSelectionChange : undefined, hoveredIndex: hoveredIndex }))] }));
25324
+ }), hasRemaining && (jsxRuntime.jsx(BarSegment, { color: (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _a === void 0 ? void 0 : _a.sds) === null || _b === void 0 ? void 0 : _b.base) === null || _c === void 0 ? void 0 : _c.backgroundTertiary, percentage: displayRemainingPercentage, height: barHeight, isLast: true, opacity: 1, disabled: true }, "remaining"))] }), showLegend && (jsxRuntime.jsx(Legend, { items: legendItems, showValues: showLegendValues, onItemMouseEnter: handleLegendItemHover, onItemMouseLeave: handleLegendItemLeave, onItemClick: onLegendItemClick ? handleLegendItemClickInternal : undefined, selectedIndices: selectedIndices, onSelectionChange: onSelectionChange ? handleSelectionChange : undefined, hoveredIndex: hoveredIndex }))] }));
25287
25325
  // If no title, render chart and optional legend without wrapper
25288
25326
  if (!title) {
25289
25327
  return (jsxRuntime.jsx(ChartWrapper, __assign$1({ width: width }, rest, { children: chartContent })));
@@ -237,6 +237,30 @@ interface StackedBarChartProps extends HTMLAttributes<HTMLDivElement> {
237
237
  * Callback when legend selection changes
238
238
  */
239
239
  onSelectionChange?: (selectedIndices: number[], selectedData: StackedBarChartDataItem[]) => void;
240
+ /**
241
+ * Callback when mouse enters a bar segment
242
+ */
243
+ onSegmentMouseEnter?: (item: StackedBarChartDataItem, index: number) => void;
244
+ /**
245
+ * Callback when mouse leaves a bar segment
246
+ */
247
+ onSegmentMouseLeave?: (item: StackedBarChartDataItem, index: number) => void;
248
+ /**
249
+ * Callback when mouse enters a legend item
250
+ */
251
+ onLegendItemMouseEnter?: (item: StackedBarChartDataItem, index: number) => void;
252
+ /**
253
+ * Callback when mouse leaves a legend item
254
+ */
255
+ onLegendItemMouseLeave?: (item: StackedBarChartDataItem, index: number) => void;
256
+ /**
257
+ * Callback when a bar segment is clicked
258
+ */
259
+ onSegmentClick?: (item: StackedBarChartDataItem, index: number) => void;
260
+ /**
261
+ * Callback when a legend item is clicked
262
+ */
263
+ onLegendItemClick?: (item: StackedBarChartDataItem, index: number) => void;
240
264
  /**
241
265
  * Behavior to apply when items are selected
242
266
  * - "dim": Non-selected segments become semi-transparent (20% opacity)
package/dist/index.esm.js CHANGED
@@ -1737,6 +1737,7 @@ function makeThemeOptions(appTheme, mode) {
1737
1737
  appTheme.spacing.l,
1738
1738
  appTheme.spacing.xl,
1739
1739
  appTheme.spacing.xxl,
1740
+ appTheme.spacing.xxxl,
1740
1741
  ],
1741
1742
  transitions: {
1742
1743
  duration: {
@@ -19192,7 +19193,7 @@ function useNavigationState() {
19192
19193
  };
19193
19194
  }
19194
19195
 
19195
- function NavigationHeaderPrimaryNav({ menuProps, hasInvertedStyle, isNarrow, items, onChange, value, sdsStyle = "dropdown", expandedAccordion, setExpandedAccordion, accordionRefs, scrollToAccordion, onDrawerStateChange, topOffset = 0, onClose: onCloseProp, }) {
19196
+ function NavigationHeaderPrimaryNav({ menuProps, hasInvertedStyle, isNarrow, items, onChange, value, sdsStyle = "dropdown", expandedAccordion, setExpandedAccordion, accordionRefs, scrollToAccordion, onDrawerStateChange, topOffset = 0, onClose: onCloseProp, onDrawerStyleNavItemHover, }) {
19196
19197
  const theme = useTheme$4();
19197
19198
  const { anchorEl, activeDropdownKey, activeDrawerKey, contentKey, isContentFading, open, drawerOpen, buttonRef, menuWidth, setAnchorEl, setActiveDropdownKey, setActiveDrawerKey, setContentKey, onClose: handleClose, onDrawerClose, onDrawerOpen, cancelDrawerClose, } = useNavigationState();
19198
19199
  const [clickedDrawerKey, setClickedDrawerKey] = useState(null);
@@ -19241,6 +19242,7 @@ function NavigationHeaderPrimaryNav({ menuProps, hasInvertedStyle, isNarrow, ite
19241
19242
  }
19242
19243
  };
19243
19244
  return (jsx(StyledHoverDrawerContainer, { onMouseEnter: () => {
19245
+ onDrawerStyleNavItemHover?.(item);
19244
19246
  if (clickedDrawerKey !== key) {
19245
19247
  onDrawerOpen(key);
19246
19248
  }
@@ -19492,7 +19494,7 @@ const StyledTag = styled$2(Tag) `
19492
19494
  margin: 0;
19493
19495
  `;
19494
19496
 
19495
- function NavigationHeaderSecondaryNav({ menuProps, items, hasInvertedStyle, isNarrow, sdsStyle = "dropdown", expandedAccordion, setExpandedAccordion, accordionRefs, scrollToAccordion, onDrawerStateChange, topOffset = 0, onClose: onCloseProp, }) {
19497
+ function NavigationHeaderSecondaryNav({ menuProps, items, hasInvertedStyle, isNarrow, sdsStyle = "dropdown", expandedAccordion, setExpandedAccordion, accordionRefs, scrollToAccordion, onDrawerStateChange, topOffset = 0, onClose: onCloseProp, onDrawerStyleNavItemHover, }) {
19496
19498
  const theme = useTheme$4();
19497
19499
  const { anchorEl, activeDropdownKey, activeDrawerKey, contentKey, isContentFading, open, drawerOpen, buttonRef, menuWidth, setAnchorEl, setActiveDropdownKey, setActiveDrawerKey, setContentKey, onClose: handleClose, onDrawerClose, onDrawerOpen, cancelDrawerClose, } = useNavigationState();
19498
19500
  function onClose() {
@@ -19516,7 +19518,10 @@ function NavigationHeaderSecondaryNav({ menuProps, items, hasInvertedStyle, isNa
19516
19518
  const handleClick = (e) => {
19517
19519
  parentOnClick?.(e);
19518
19520
  };
19519
- return (jsx(StyledHoverDrawerContainer, { onMouseEnter: () => onDrawerOpen(key), onMouseLeave: onDrawerClose, children: jsxs(UnifiedNavItem, __assign({}, rest, { hasInvertedStyle: hasInvertedStyle, active: isDrawerOpen, isNarrow: isNarrow, sdsStyle: "minimal", innerSdsStyle: sdsStyle, navVariant: "secondary", onClick: handleClick, component: componentProp, href: defaultUrl, target: target, rel: rel, children: [jsx(StyledLabelTextWrapper$1, { active: isDrawerOpen, isNarrow: isNarrow, children: label }), jsx(StyledLabelTextWrapperShadow$1, { "aria-hidden": "true", isNarrow: isNarrow, children: label }), jsx(Icon, { sdsIcon: isDrawerOpen ? "ChevronUp" : "ChevronDown", sdsSize: "xs" })] })) }, key));
19521
+ return (jsx(StyledHoverDrawerContainer, { onMouseEnter: () => {
19522
+ onDrawerStyleNavItemHover?.(item);
19523
+ onDrawerOpen(key);
19524
+ }, onMouseLeave: onDrawerClose, children: jsxs(UnifiedNavItem, __assign({}, rest, { hasInvertedStyle: hasInvertedStyle, active: isDrawerOpen, isNarrow: isNarrow, sdsStyle: "minimal", innerSdsStyle: sdsStyle, navVariant: "secondary", onClick: handleClick, component: componentProp, href: defaultUrl, target: target, rel: rel, children: [jsx(StyledLabelTextWrapper$1, { active: isDrawerOpen, isNarrow: isNarrow, children: label }), jsx(StyledLabelTextWrapperShadow$1, { "aria-hidden": "true", isNarrow: isNarrow, children: label }), jsx(Icon, { sdsIcon: isDrawerOpen ? "ChevronUp" : "ChevronDown", sdsSize: "xs" })] })) }, key));
19520
19525
  };
19521
19526
  const renderDropdownItem = (item, key, label, parentOnClick, rest) => {
19522
19527
  const isDropdownOpen = open && activeDropdownKey === key;
@@ -19688,7 +19693,7 @@ forwardRef((props, ref) => {
19688
19693
  const { activePrimaryNavKey: controlledActivePrimaryNavKey, buttons, sdsStyle = "dropdown", menuProps = {
19689
19694
  disableScrollLock: true,
19690
19695
  disablePortal: true
19691
- }, backgroundAppearance = "matchBackground", logo, logoUrl, logoLinkComponent = "a", logoLinkProps, scrollElevation = true, primaryNavItems, primaryNavPosition = "left", searchProps, secondaryNavItems, setActivePrimaryNavKey: onActivePrimaryNavKeyChange, showSearch = true, tag, tagColor, title, drawerOpen: controlledDrawerOpen, setDrawerOpen: onDrawerOpenChange, isSticky = true, topComponentSlot, ...rest } = props;
19696
+ }, backgroundAppearance = "matchBackground", logo, logoUrl, logoLinkComponent = "a", logoLinkProps, scrollElevation = true, primaryNavItems, primaryNavPosition = "left", searchProps, secondaryNavItems, setActivePrimaryNavKey: onActivePrimaryNavKeyChange, showSearch = true, tag, tagColor, title, drawerOpen: controlledDrawerOpen, setDrawerOpen: onDrawerOpenChange, isSticky = true, topComponentSlot, onDrawerStyleNavItemHover, ...rest } = props;
19692
19697
  const navRef = useRef(null);
19693
19698
  const topSlotRef = useRef(null);
19694
19699
  const [topOffset, setTopOffset] = useState(0);
@@ -19841,11 +19846,11 @@ forwardRef((props, ref) => {
19841
19846
  };
19842
19847
  const renderPrimaryNav = () => {
19843
19848
  return (primaryNavItems &&
19844
- primaryNavItems.length > 0 && (jsx(NavigationHeaderPrimaryNav, { items: primaryNavItems, value: activePrimaryNavKey, onChange: setActivePrimaryNavKey, hasInvertedStyle: hasInvertedStyle, isNarrow: dimensions.isNarrow, menuProps: menuProps, sdsStyle: sdsStyle, expandedAccordion: expandedAccordion, setExpandedAccordion: setExpandedAccordion, accordionRefs: accordionRefs, scrollToAccordion: scrollToAccordion, onDrawerStateChange: handlePrimaryDrawerStateChange, topOffset: topOffset, onClose: () => setDrawerOpen(false) })));
19849
+ primaryNavItems.length > 0 && (jsx(NavigationHeaderPrimaryNav, { items: primaryNavItems, value: activePrimaryNavKey, onChange: setActivePrimaryNavKey, hasInvertedStyle: hasInvertedStyle, isNarrow: dimensions.isNarrow, menuProps: menuProps, sdsStyle: sdsStyle, expandedAccordion: expandedAccordion, setExpandedAccordion: setExpandedAccordion, accordionRefs: accordionRefs, scrollToAccordion: scrollToAccordion, onDrawerStateChange: handlePrimaryDrawerStateChange, topOffset: topOffset, onClose: () => setDrawerOpen(false), onDrawerStyleNavItemHover: onDrawerStyleNavItemHover })));
19845
19850
  };
19846
19851
  const renderSecondaryNav = () => {
19847
19852
  return (secondaryNavItems &&
19848
- secondaryNavItems.length > 0 && (jsx(NavigationHeaderSecondaryNav, { items: secondaryNavItems, hasInvertedStyle: hasInvertedStyle, isNarrow: dimensions.isNarrow, menuProps: menuProps, sdsStyle: sdsStyle, expandedAccordion: expandedAccordion, setExpandedAccordion: setExpandedAccordion, accordionRefs: accordionRefs, scrollToAccordion: scrollToAccordion, onDrawerStateChange: handleSecondaryDrawerStateChange, topOffset: topOffset, onClose: () => setDrawerOpen(false) })));
19853
+ secondaryNavItems.length > 0 && (jsx(NavigationHeaderSecondaryNav, { items: secondaryNavItems, hasInvertedStyle: hasInvertedStyle, isNarrow: dimensions.isNarrow, menuProps: menuProps, sdsStyle: sdsStyle, expandedAccordion: expandedAccordion, setExpandedAccordion: setExpandedAccordion, accordionRefs: accordionRefs, scrollToAccordion: scrollToAccordion, onDrawerStateChange: handleSecondaryDrawerStateChange, topOffset: topOffset, onClose: () => setDrawerOpen(false), onDrawerStyleNavItemHover: onDrawerStyleNavItemHover })));
19849
19854
  };
19850
19855
  const renderButtonsNode = () => {
19851
19856
  if (!buttons || buttons.length === 0)
@@ -24975,7 +24980,7 @@ var renderBarSegment = function (item, index, options) {
24975
24980
  };
24976
24981
  var StackedBarChart = function (props) {
24977
24982
  var _a, _b, _c;
24978
- var title = props.title, badge = props.badge, _d = props.hideBadge, hideBadge = _d === void 0 ? false : _d, data = props.data, _e = props.width, width = _e === void 0 ? "100%" : _e, _f = props.barHeight, barHeightProp = _f === void 0 ? 16 : _f, _g = props.showLegend, showLegend = _g === void 0 ? true : _g, _h = props.showLegendValues, showLegendValues = _h === void 0 ? true : _h, _j = props.legendValueFormat, legendValueFormat = _j === void 0 ? "percentage" : _j, _k = props.selectedIndices, selectedIndices = _k === void 0 ? [] : _k, onSelectionChange = props.onSelectionChange, _l = props.selectionBehavior, selectionBehavior = _l === void 0 ? "dim" : _l, _m = props.mode, mode = _m === void 0 ? "proportional" : _m, maxAmount = props.maxAmount, _o = props.remainingLabel, remainingLabel = _o === void 0 ? "Remaining" : _o, remainingUnit = props.remainingUnit, unit = props.unit, colorGeneratorOptions = props.colorGeneratorOptions, rest = __rest(props, ["title", "badge", "hideBadge", "data", "width", "barHeight", "showLegend", "showLegendValues", "legendValueFormat", "selectedIndices", "onSelectionChange", "selectionBehavior", "mode", "maxAmount", "remainingLabel", "remainingUnit", "unit", "colorGeneratorOptions"]);
24983
+ var title = props.title, badge = props.badge, _d = props.hideBadge, hideBadge = _d === void 0 ? false : _d, data = props.data, _e = props.width, width = _e === void 0 ? "100%" : _e, _f = props.barHeight, barHeightProp = _f === void 0 ? 16 : _f, _g = props.showLegend, showLegend = _g === void 0 ? true : _g, _h = props.showLegendValues, showLegendValues = _h === void 0 ? true : _h, _j = props.legendValueFormat, legendValueFormat = _j === void 0 ? "percentage" : _j, _k = props.selectedIndices, selectedIndices = _k === void 0 ? [] : _k, onSelectionChange = props.onSelectionChange, onSegmentMouseEnter = props.onSegmentMouseEnter, onSegmentMouseLeave = props.onSegmentMouseLeave, onLegendItemMouseEnter = props.onLegendItemMouseEnter, onLegendItemMouseLeave = props.onLegendItemMouseLeave, onSegmentClick = props.onSegmentClick, onLegendItemClick = props.onLegendItemClick, _l = props.selectionBehavior, selectionBehavior = _l === void 0 ? "dim" : _l, _m = props.mode, mode = _m === void 0 ? "proportional" : _m, maxAmount = props.maxAmount, _o = props.remainingLabel, remainingLabel = _o === void 0 ? "Remaining" : _o, remainingUnit = props.remainingUnit, unit = props.unit, colorGeneratorOptions = props.colorGeneratorOptions, rest = __rest(props, ["title", "badge", "hideBadge", "data", "width", "barHeight", "showLegend", "showLegendValues", "legendValueFormat", "selectedIndices", "onSelectionChange", "onSegmentMouseEnter", "onSegmentMouseLeave", "onLegendItemMouseEnter", "onLegendItemMouseLeave", "onSegmentClick", "onLegendItemClick", "selectionBehavior", "mode", "maxAmount", "remainingLabel", "remainingUnit", "unit", "colorGeneratorOptions"]);
24979
24984
  // Ensure barHeight is at least 1px
24980
24985
  var barHeight = Math.max(1, barHeightProp);
24981
24986
  var theme = useTheme$4();
@@ -25208,8 +25213,24 @@ var StackedBarChart = function (props) {
25208
25213
  theme,
25209
25214
  ]);
25210
25215
  // Handle legend item hover and leave
25211
- var handleLegendItemHover = useCallback(function (_item, index) { return setHoveredIndex(index); }, []);
25212
- var handleLegendItemLeave = useCallback(function () { return setHoveredIndex(null); }, []);
25216
+ var handleLegendItemHover = useCallback(function (_item, index) {
25217
+ setHoveredIndex(index);
25218
+ if (onLegendItemMouseEnter && data[index]) {
25219
+ onLegendItemMouseEnter(data[index], index);
25220
+ }
25221
+ }, [onLegendItemMouseEnter, data]);
25222
+ var handleLegendItemLeave = useCallback(function (_item, index) {
25223
+ setHoveredIndex(null);
25224
+ if (onLegendItemMouseLeave && data[index]) {
25225
+ onLegendItemMouseLeave(data[index], index);
25226
+ }
25227
+ }, [onLegendItemMouseLeave, data]);
25228
+ // Handle legend item click
25229
+ var handleLegendItemClickInternal = useCallback(function (_item, index) {
25230
+ if (onLegendItemClick && data[index]) {
25231
+ onLegendItemClick(data[index], index);
25232
+ }
25233
+ }, [onLegendItemClick, data]);
25213
25234
  // Handle selection change - reusable logic for both segment and legend
25214
25235
  var handleSelectionChange = useCallback(function (newSelectedIndices) {
25215
25236
  if (!onSelectionChange)
@@ -25219,8 +25240,13 @@ var StackedBarChart = function (props) {
25219
25240
  });
25220
25241
  onSelectionChange(newSelectedIndices, selectedData);
25221
25242
  }, [onSelectionChange, data]);
25222
- // Handle segment click - toggle selection
25243
+ // Handle segment click - toggle selection and call onSegmentClick
25223
25244
  var handleSegmentClick = useCallback(function (index) {
25245
+ // Call onSegmentClick callback if provided
25246
+ if (onSegmentClick && data[index]) {
25247
+ onSegmentClick(data[index], index);
25248
+ }
25249
+ // Handle selection change
25224
25250
  if (!onSelectionChange)
25225
25251
  return;
25226
25252
  var isSelected = selectedIndicesSet.has(index);
@@ -25230,6 +25256,8 @@ var StackedBarChart = function (props) {
25230
25256
  handleSelectionChange(newSelectedIndices);
25231
25257
  }, [
25232
25258
  onSelectionChange,
25259
+ onSegmentClick,
25260
+ data,
25233
25261
  selectedIndices,
25234
25262
  selectedIndicesSet,
25235
25263
  handleSelectionChange,
@@ -25252,14 +25280,24 @@ var StackedBarChart = function (props) {
25252
25280
  selectionBehavior: selectionBehavior,
25253
25281
  isLast: isLastVisible,
25254
25282
  onMouseEnter: function () {
25255
- return !item.isExiting && setHoveredIndex(item.originalIndex);
25283
+ if (!item.isExiting) {
25284
+ setHoveredIndex(item.originalIndex);
25285
+ if (onSegmentMouseEnter && data[item.originalIndex]) {
25286
+ onSegmentMouseEnter(data[item.originalIndex], item.originalIndex);
25287
+ }
25288
+ }
25289
+ },
25290
+ onMouseLeave: function () {
25291
+ setHoveredIndex(null);
25292
+ if (onSegmentMouseLeave && data[item.originalIndex]) {
25293
+ onSegmentMouseLeave(data[item.originalIndex], item.originalIndex);
25294
+ }
25256
25295
  },
25257
- onMouseLeave: function () { return setHoveredIndex(null); },
25258
25296
  onClick: function () {
25259
25297
  return !item.isExiting && handleSegmentClick(item.originalIndex);
25260
25298
  },
25261
25299
  });
25262
- }), hasRemaining && (jsx(BarSegment, { color: (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _a === void 0 ? void 0 : _a.sds) === null || _b === void 0 ? void 0 : _b.base) === null || _c === void 0 ? void 0 : _c.backgroundTertiary, percentage: displayRemainingPercentage, height: barHeight, isLast: true, opacity: 1, disabled: true }, "remaining"))] }), showLegend && (jsx(Legend, { items: legendItems, showValues: showLegendValues, onItemMouseEnter: handleLegendItemHover, onItemMouseLeave: handleLegendItemLeave, selectedIndices: selectedIndices, onSelectionChange: onSelectionChange ? handleSelectionChange : undefined, hoveredIndex: hoveredIndex }))] }));
25300
+ }), hasRemaining && (jsx(BarSegment, { color: (_c = (_b = (_a = theme === null || theme === void 0 ? void 0 : theme.palette) === null || _a === void 0 ? void 0 : _a.sds) === null || _b === void 0 ? void 0 : _b.base) === null || _c === void 0 ? void 0 : _c.backgroundTertiary, percentage: displayRemainingPercentage, height: barHeight, isLast: true, opacity: 1, disabled: true }, "remaining"))] }), showLegend && (jsx(Legend, { items: legendItems, showValues: showLegendValues, onItemMouseEnter: handleLegendItemHover, onItemMouseLeave: handleLegendItemLeave, onItemClick: onLegendItemClick ? handleLegendItemClickInternal : undefined, selectedIndices: selectedIndices, onSelectionChange: onSelectionChange ? handleSelectionChange : undefined, hoveredIndex: hoveredIndex }))] }));
25263
25301
  // If no title, render chart and optional legend without wrapper
25264
25302
  if (!title) {
25265
25303
  return (jsx(ChartWrapper, __assign$1({ width: width }, rest, { children: chartContent })));