@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.
- package/dist/index.cjs.d.ts +24 -0
- package/dist/index.cjs.js +51 -13
- package/dist/index.esm.d.ts +24 -0
- package/dist/index.esm.js +51 -13
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
package/dist/index.cjs.d.ts
CHANGED
|
@@ -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: () =>
|
|
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) {
|
|
25236
|
-
|
|
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
|
-
|
|
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 })));
|
package/dist/index.esm.d.ts
CHANGED
|
@@ -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: () =>
|
|
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) {
|
|
25212
|
-
|
|
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
|
-
|
|
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 })));
|