@geotab/zenith 1.26.0 → 1.26.1-beta.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.
Files changed (89) hide show
  1. package/README.md +10 -0
  2. package/dist/card/card.d.ts +1 -1
  3. package/dist/card/card.js +6 -2
  4. package/dist/chart/lineChart/getDefaultDatasetStyle.js +4 -0
  5. package/dist/dataGrid/columns/checkboxColumn/checkboxColumnWrapper.js +2 -2
  6. package/dist/dataGrid/withSelectableRows/components/bulkActions/bulkActions.d.ts +1 -0
  7. package/dist/dataGrid/withSelectableRows/components/bulkActions/bulkActions.js +8 -5
  8. package/dist/dataGrid/withSelectableRows/withSelectableRows.js +16 -2
  9. package/dist/dropdown/dropdownPopup.js +5 -2
  10. package/dist/filtersBar/filtersContainer/filtersContainer.js +8 -7
  11. package/dist/formStepperButtons/formStepperButtons.d.ts +2 -1
  12. package/dist/formStepperButtons/formStepperButtons.js +2 -2
  13. package/dist/header/components/collapsedItemsControl/collapsedItemsControl.js +1 -4
  14. package/dist/header/header.js +1 -1
  15. package/dist/index.css +36 -25
  16. package/dist/inputAdornments/inputAdornments.d.ts +2 -0
  17. package/dist/inputAdornments/inputAdornments.js +2 -2
  18. package/dist/lineChart/utils.js +5 -0
  19. package/dist/menu/menu.d.ts +1 -0
  20. package/dist/menu/menu.js +3 -2
  21. package/dist/mobileSheet/mobileSheet.d.ts +1 -0
  22. package/dist/mobileSheet/mobileSheet.js +2 -2
  23. package/dist/nav/navFooter/navFooterAction/navFooterAction.d.ts +13 -0
  24. package/dist/nav/navFooter/navFooterAction/navFooterAction.js +29 -0
  25. package/dist/nav/navItem/navItem.d.ts +1 -1
  26. package/dist/nav/navItem/navItem.js +15 -8
  27. package/dist/pillExpandable/pillExpandable.d.ts +1 -0
  28. package/dist/pillExpandable/pillExpandable.js +2 -2
  29. package/dist/searchInputRaw/searchInputRaw.d.ts +2 -0
  30. package/dist/searchInputRaw/searchInputRaw.js +2 -2
  31. package/dist/selectRaw/selectRaw.js +1 -1
  32. package/dist/table/children/useTableChildren.d.ts +1 -1
  33. package/dist/table/children/useTableChildren.js +3 -3
  34. package/dist/table/selectable/selectableHeader.js +1 -1
  35. package/dist/table/selectable/useSelectableRows.js +28 -82
  36. package/dist/table/selectable/{calculateSelectionState.d.ts → utils/calculateSelectionState.d.ts} +4 -4
  37. package/dist/table/selectable/{calculateSelectionState.js → utils/calculateSelectionState.js} +1 -1
  38. package/dist/table/selectable/utils/checkRow.d.ts +4 -0
  39. package/dist/table/selectable/utils/checkRow.js +28 -0
  40. package/dist/table/selectable/utils/getCurrentPageSelection.d.ts +4 -0
  41. package/dist/table/selectable/utils/getCurrentPageSelection.js +28 -0
  42. package/dist/table/selectable/{getSelection.d.ts → utils/getSelection.d.ts} +1 -1
  43. package/dist/table/selectable/utils/isRowChecked.d.ts +8 -0
  44. package/dist/table/selectable/utils/isRowChecked.js +20 -0
  45. package/dist/table/table.js +4 -1
  46. package/dist/textInputRaw/textInputRaw.d.ts +1 -0
  47. package/dist/textInputRaw/textInputRaw.js +1 -1
  48. package/dist/utils/localization/translations/cs-json.d.ts +1 -0
  49. package/dist/utils/localization/translations/cs-json.js +2 -1
  50. package/dist/utils/localization/translations/de-json.d.ts +1 -0
  51. package/dist/utils/localization/translations/de-json.js +2 -1
  52. package/dist/utils/localization/translations/en-json.d.ts +2 -0
  53. package/dist/utils/localization/translations/en-json.js +3 -1
  54. package/dist/utils/localization/translations/es-json.d.ts +1 -0
  55. package/dist/utils/localization/translations/es-json.js +2 -1
  56. package/dist/utils/localization/translations/fr-FR-json.d.ts +1 -0
  57. package/dist/utils/localization/translations/fr-FR-json.js +2 -1
  58. package/dist/utils/localization/translations/fr-json.d.ts +1 -0
  59. package/dist/utils/localization/translations/fr-json.js +2 -1
  60. package/dist/utils/localization/translations/id-json.d.ts +1 -0
  61. package/dist/utils/localization/translations/id-json.js +2 -1
  62. package/dist/utils/localization/translations/it-json.d.ts +1 -0
  63. package/dist/utils/localization/translations/it-json.js +2 -1
  64. package/dist/utils/localization/translations/ja-json.d.ts +1 -0
  65. package/dist/utils/localization/translations/ja-json.js +2 -1
  66. package/dist/utils/localization/translations/ko-KR-json.d.ts +1 -0
  67. package/dist/utils/localization/translations/ko-KR-json.js +2 -1
  68. package/dist/utils/localization/translations/ms-json.d.ts +1 -0
  69. package/dist/utils/localization/translations/ms-json.js +2 -1
  70. package/dist/utils/localization/translations/nl-json.d.ts +1 -0
  71. package/dist/utils/localization/translations/nl-json.js +2 -1
  72. package/dist/utils/localization/translations/pl-json.d.ts +1 -0
  73. package/dist/utils/localization/translations/pl-json.js +2 -1
  74. package/dist/utils/localization/translations/pt-BR-json.d.ts +1 -0
  75. package/dist/utils/localization/translations/pt-BR-json.js +2 -1
  76. package/dist/utils/localization/translations/sv-json.d.ts +1 -0
  77. package/dist/utils/localization/translations/sv-json.js +2 -1
  78. package/dist/utils/localization/translations/th-json.d.ts +1 -0
  79. package/dist/utils/localization/translations/th-json.js +2 -1
  80. package/dist/utils/localization/translations/tr-json.d.ts +1 -0
  81. package/dist/utils/localization/translations/tr-json.js +2 -1
  82. package/dist/utils/localization/translations/zh-Hans-json.d.ts +1 -0
  83. package/dist/utils/localization/translations/zh-Hans-json.js +2 -1
  84. package/dist/utils/localization/translations/zh-TW-json.d.ts +1 -0
  85. package/dist/utils/localization/translations/zh-TW-json.js +2 -1
  86. package/dist/utils/useScrollWithAndroidKeyboard.d.ts +5 -0
  87. package/dist/utils/useScrollWithAndroidKeyboard.js +37 -0
  88. package/package.json +1 -1
  89. /package/dist/table/selectable/{getSelection.js → utils/getSelection.js} +0 -0
package/README.md CHANGED
@@ -40,6 +40,16 @@ Zenith library provides components defined in Zenith Design System. It includes
40
40
 
41
41
  ## Change log
42
42
 
43
+ ### 1.26.1
44
+
45
+ * Allow disabling next/submit buttons in `FormStepperButtons`
46
+ * Fix scrolling dropdown on mobile
47
+ * Make title optional in `Card`
48
+ * Fix point hover size in `Chart`
49
+ * Update the logic of selecting rows in `Table`
50
+ * Allow custom icon in `PillExpandable`
51
+ * Header toolbar updates (reduce max number of visible buttons, make "More" button to be an icon button)
52
+
43
53
  ### 1.26.0
44
54
 
45
55
  * Nested rows in `Table`
@@ -18,7 +18,7 @@ export interface ICard extends IZenComponentProps, IZenGridItem {
18
18
  * @param status - will be removed in the next major release
19
19
  */
20
20
  status?: TCardStatus;
21
- title: string;
21
+ title?: string;
22
22
  icon?: FunctionComponent<IIcon>;
23
23
  iconType?: TIconType;
24
24
  secondary?: string;
package/dist/card/card.js CHANGED
@@ -55,7 +55,9 @@ const getIconFromStatus_1 = require("./helpers/getIconFromStatus");
55
55
  const getIconTypeFromStatus_1 = require("./helpers/getIconTypeFromStatus");
56
56
  exports.DEFAULT_CARD_SIZE = "S";
57
57
  // eslint-disable-next-line @typescript-eslint/naming-convention, react/prop-types
58
- const Card = (props) => {
58
+ const Card =
59
+ // eslint-disable-next-line complexity
60
+ (props) => {
59
61
  const { size, children, title, icon, iconType, secondary, status, date, tooltip, className = "", link, cardContentClasses = "", tooltipAlignment, tooltipSize, fullWidth, scrollableContent = true, autoHeight = false, fullHeight = false } = props;
60
62
  const { translate } = (0, useLanguage_1.useLanguage)();
61
63
  const [deviceType, setDeviceType] = (0, react_1.useState)(deviceType_1.DeviceType.Mobile);
@@ -148,7 +150,9 @@ const Card = (props) => {
148
150
  titleIconType: iconType
149
151
  };
150
152
  }, [icon, iconType, status]);
151
- return (0, jsx_runtime_1.jsxs)(cardContainer_1.CardContainer, { isMobile: isMobile, fullWidth: isFullWidth, fullHeight: isFullHeight, autoHeight: isAutoHeight, scrollable: isScrollable, ref: containerRef, size: size || "S", className: (0, classNames_1.classNames)(["zen-card", className]), children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-card__header", ref: headerRef, children: [(0, jsx_runtime_1.jsxs)("div", { className: "zen-card__header-primary", children: [(0, jsx_runtime_1.jsx)(title_1.Title, { id: titleId, link: link, isMobile: isMobile, title: title, icon: titleIcon, iconType: titleIconType }), (0, jsx_runtime_1.jsxs)("div", { className: "zen-card__header-right", children: [!!headerActions.length && headerActions, date ? (0, jsx_runtime_1.jsx)("span", { className: dateClassName, children: date }) : null, favoriteButton, tooltip && (0, jsx_runtime_1.jsx)(status_1.Status, { title: title, status: status, isMobile: isMobile, tooltip: tooltip, tooltipAlignment: tooltipAlignment, tooltipSize: tooltipSize }), !!menuActions.length && (0, jsx_runtime_1.jsx)(menu_1.Menu, { trigger: menuTrigger, title: title, children: menuActions.map(action => (0, react_1.createElement)(menu_1.Menu.Item, Object.assign({ key: action.props.id }, action.props))) })] })] }), secondary ? (0, jsx_runtime_1.jsx)("div", { className: "zen-card__secondary", children: secondary }) : null] }), (0, jsx_runtime_1.jsx)("div", { className: cardContentClassName, children: content })] });
153
+ const isHeaderPrimaryVisible = title || icon || link || !!headerActions.length || date || !!favoriteButton || !!tooltip || !!menuActions.length;
154
+ const isHeaderVisible = isHeaderPrimaryVisible || secondary;
155
+ return (0, jsx_runtime_1.jsxs)(cardContainer_1.CardContainer, { isMobile: isMobile, fullWidth: isFullWidth, fullHeight: isFullHeight, autoHeight: isAutoHeight, scrollable: isScrollable, ref: containerRef, size: size || "S", className: (0, classNames_1.classNames)(["zen-card", !isHeaderVisible ? "zen-card--no-header" : "", className]), children: [isHeaderVisible ? (0, jsx_runtime_1.jsxs)("div", { className: "zen-card__header", ref: headerRef, children: [isHeaderPrimaryVisible && (0, jsx_runtime_1.jsxs)("div", { className: "zen-card__header-primary", children: [title && (0, jsx_runtime_1.jsx)(title_1.Title, { id: titleId, link: link, isMobile: isMobile, title: title, icon: titleIcon, iconType: titleIconType }), (0, jsx_runtime_1.jsxs)("div", { className: "zen-card__header-right", children: [!!headerActions.length && headerActions, date ? (0, jsx_runtime_1.jsx)("span", { className: dateClassName, children: date }) : null, favoriteButton, tooltip && (0, jsx_runtime_1.jsx)(status_1.Status, { title: title, status: status, isMobile: isMobile, tooltip: tooltip, tooltipAlignment: tooltipAlignment, tooltipSize: tooltipSize }), !!menuActions.length && (0, jsx_runtime_1.jsx)(menu_1.Menu, { trigger: menuTrigger, title: title || translate("Actions"), children: menuActions.map(action => (0, react_1.createElement)(menu_1.Menu.Item, Object.assign({ key: action.props.id }, action.props))) })] })] }), secondary ? (0, jsx_runtime_1.jsx)("div", { className: "zen-card__secondary", children: secondary }) : null] }) : null, (0, jsx_runtime_1.jsx)("div", { className: cardContentClassName, children: content })] });
152
156
  };
153
157
  exports.Card = Card;
154
158
  exports.TRANSLATIONS = [
@@ -6,6 +6,7 @@ const getDatasetColor_1 = require("./getDatasetColor");
6
6
  const defaultLineOptions = {
7
7
  borderWidth: 2,
8
8
  pointRadius: 5,
9
+ pointHoverRadius: 7,
9
10
  pointHitRadius: 10
10
11
  };
11
12
  const getDefaultDatasetStyle = (dataSet, dsIndex) => {
@@ -20,8 +21,11 @@ const getDefaultDatasetStyle = (dataSet, dsIndex) => {
20
21
  }
21
22
  if (!dataSet.pointRadius) {
22
23
  const pointRs = Array(dataSet.data.length).fill(0);
24
+ const pointHoverRs = Array(dataSet.data.length).fill(lineStyle.pointRadius);
23
25
  pointRs[pointRs.length - 1] = lineStyle.pointRadius;
24
26
  newDataSet.pointRadius = pointRs;
27
+ pointHoverRs[pointHoverRs.length - 1] = lineStyle.pointHoverRadius;
28
+ newDataSet.pointHoverRadius = pointHoverRs;
25
29
  newDataSet.pointHitRadius = lineStyle.pointHitRadius;
26
30
  newDataSet.pointBackgroundColor = dataSet.pointBackgroundColor || baseColor;
27
31
  }
@@ -72,7 +72,7 @@ class CheckboxColumnWrapper extends simpleEventHandler_1.SimpleEventHandler {
72
72
  configurable: true,
73
73
  writable: true,
74
74
  value: (checked) => {
75
- this.selectionState = checked ? SelectionState.CurrentPage : SelectionState.None;
75
+ this.selectionState = checked ? SelectionState.All : SelectionState.None;
76
76
  this.fire("change-all", [checked]);
77
77
  }
78
78
  });
@@ -99,7 +99,7 @@ class CheckboxColumnWrapper extends simpleEventHandler_1.SimpleEventHandler {
99
99
  if (this.options.header === false) {
100
100
  return title;
101
101
  }
102
- const cell = (0, jsx_runtime_1.jsxs)(checkboxHeaderCell_1.CheckboxHeaderCell, { label: this.options.headerTitle || "", actions: true, checked: this.state === SelectionState.CurrentPage || this.state === SelectionState.All, indeterminate: this.state === SelectionState.Partial, disabled: this.state === SelectionState.All, onChange: this.changeHandlerAll, children: [(0, jsx_runtime_1.jsx)(checkboxHeaderCell_1.CheckboxHeaderCell.Actions, { ref: this.menuTriggerRef, onClick: this.actionsClickHandler }), (0, jsx_runtime_1.jsx)(checkboxHeaderCell_1.CheckboxHeaderCell.Content, { children: title })] });
102
+ const cell = (0, jsx_runtime_1.jsxs)(checkboxHeaderCell_1.CheckboxHeaderCell, { label: this.options.headerTitle || "", actions: true, checked: this.state === SelectionState.CurrentPage || this.state === SelectionState.All, indeterminate: this.state === SelectionState.Partial, onChange: this.changeHandlerAll, children: [(0, jsx_runtime_1.jsx)(checkboxHeaderCell_1.CheckboxHeaderCell.Actions, { ref: this.menuTriggerRef, onClick: this.actionsClickHandler }), (0, jsx_runtime_1.jsx)(checkboxHeaderCell_1.CheckboxHeaderCell.Content, { children: title })] });
103
103
  return cell;
104
104
  }
105
105
  }
@@ -10,6 +10,7 @@ export interface IBulkActionsProps extends IZenComponentProps {
10
10
  selected: number;
11
11
  allSelected?: boolean;
12
12
  onClearSelection: () => void;
13
+ onSelectAll?: () => void;
13
14
  gridType?: DeviceType;
14
15
  children?: ReactElement<TBulkAction> | null | (ReactElement<TBulkAction> | null)[];
15
16
  /**
@@ -14,7 +14,8 @@ const useNonFittingElements_1 = require("../../../../header/hooks/useNonFittingE
14
14
  const useResizeObserver_1 = require("../../../../commonHelpers/hooks/useResizeObserver");
15
15
  const menu_1 = require("../../../../menu/menu");
16
16
  const iconDotVertical_1 = require("../../../../icons/iconDotVertical");
17
- const BulkActions = ({ selected, allSelected, className, onClearSelection, gridType = deviceType_1.DeviceType.Desktop, children }) => {
17
+ const button_1 = require("../../../../button/button");
18
+ const BulkActions = ({ selected, allSelected, className, onClearSelection, onSelectAll, gridType = deviceType_1.DeviceType.Desktop, children }) => {
18
19
  var _a;
19
20
  const { translate } = (0, useLanguage_1.useLanguage)();
20
21
  const childrenArray = (0, react_1.useMemo)(() => react_1.Children.toArray(children), [children]);
@@ -26,10 +27,12 @@ const BulkActions = ({ selected, allSelected, className, onClearSelection, gridT
26
27
  const maxWidth = (result === null || result === void 0 ? void 0 : result.contentRect.width) || 1000;
27
28
  const { visibleElements, nonFittingElements, hiddenContainerRef } = (0, useNonFittingElements_1.useNonFittingElements)({ maxWidth, data: childrenArray, hiddenElementsCountToRender: 10, widthDelta });
28
29
  const isMobile = gridType === deviceType_1.DeviceType.Mobile;
29
- const text = isMobile && selected === 0
30
- ? translate("Selecting...")
31
- : translate("{1} selected").replace("{1}", allSelected ? translate("All") : selected.toFixed());
32
- return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-bulk-actions", className || "", isMobile ? "zen-bulk-actions--condensed" : ""]), ref: bulkActionsElement, children: [(0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { className: "zen-bulk-actions__button-clear", icon: iconClose_1.IconClose, iconPosition: textIconButton_1.ButtonIconPosition.Start, iconSize: "large", type: "tertiary-black", title: translate("Clear selection"), "aria-label": translate("Clear selection"), onClick: onClearSelection }), (0, jsx_runtime_1.jsx)("span", { className: "zen-bulk-actions__number-of-selected ellipsis", children: text }), (0, jsx_runtime_1.jsxs)("div", { className: "zen-bulk-actions__action-button-holder", ref: buttonHolder, children: [visibleElements, nonFittingElements.length > 0
30
+ const text = translate("{1} selected").replace("{1}", allSelected ? translate("All") : selected.toFixed());
31
+ return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-bulk-actions", className || "", isMobile ? "zen-bulk-actions--condensed" : ""]), ref: bulkActionsElement, children: [(0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { className: "zen-bulk-actions__button-clear", icon: iconClose_1.IconClose, iconPosition: textIconButton_1.ButtonIconPosition.Start, iconSize: "large", type: "tertiary-black", title: translate("Clear selection"), "aria-label": translate("Clear selection"), onClick: onClearSelection }), (0, jsx_runtime_1.jsx)("span", { className: "zen-bulk-actions__number-of-selected ellipsis", children: text }), onSelectAll
32
+ ? (0, jsx_runtime_1.jsx)(button_1.Button, { type: "tertiary", className: "zen-bulk-actions__select-all", disabled: allSelected, onClick: onSelectAll, children: translate("Select all") })
33
+ : null, (0, jsx_runtime_1.jsxs)("div", { className: "zen-bulk-actions__action-button-holder", ref: buttonHolder, children: [react_1.Children.map(visibleElements, element => (0, react_1.cloneElement)(element, {
34
+ disabled: selected > 0 || allSelected ? element.props.disabled : true
35
+ })), nonFittingElements.length > 0
33
36
  ? (0, jsx_runtime_1.jsx)(menu_1.Menu, { title: translate("More"), trigger: (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { ref: moreButtonRef, className: "zen-bulk-actions__action-button zen-bulk-actions__action-button-more", icon: iconDotVertical_1.IconDotVertical, iconPosition: textIconButton_1.ButtonIconPosition.Start, iconSize: "large", type: isMobile ? "tertiary-black" : "secondary", title: translate("More"), "aria-label": translate("More") }), children: nonFittingElements.filter(el => el.props).map(child => (0, jsx_runtime_1.jsx)(menu_1.Menu.Item, { id: child.props.id, name: child.props.title, icon: child.props.icon, disabled: child.props.disabled, onClick: child.props.clickHandler, link: child.props.link }, child.props.id)) })
34
37
  : null, (0, jsx_runtime_1.jsx)("div", { className: "zen-bulk-actions__hidden-elements", ref: hiddenContainerRef, children: childrenArray })] })] });
35
38
  };
@@ -115,6 +115,16 @@ function InnerList(props, ref) {
115
115
  });
116
116
  }, [selections, entities, options, onSelect, selection === null || selection === void 0 ? void 0 : selection.turnOffSelectAll]);
117
117
  const onSelectListener = (0, react_1.useCallback)(([id, checked]) => {
118
+ if (allSelected) {
119
+ const newSelection = new Set(entities.map(entity => entity.id));
120
+ newSelection.delete(id);
121
+ onSelect({
122
+ selected: [...newSelection],
123
+ allSelected: false,
124
+ turnOffSelectAll: selection.turnOffSelectAll
125
+ });
126
+ return;
127
+ }
118
128
  if (checked) {
119
129
  selections.add(id);
120
130
  }
@@ -129,8 +139,12 @@ function InnerList(props, ref) {
129
139
  });
130
140
  }, [entities, selections, allSelected, options, onSelect, selection === null || selection === void 0 ? void 0 : selection.turnOffSelectAll]);
131
141
  const onSelectAll = (0, react_1.useCallback)(([checked]) => {
132
- selectAll(checked);
133
- }, [selectAll]);
142
+ onSelect({
143
+ selected: [],
144
+ allSelected: checked,
145
+ turnOffSelectAll: selection === null || selection === void 0 ? void 0 : selection.turnOffSelectAll
146
+ });
147
+ }, [onSelect, selection === null || selection === void 0 ? void 0 : selection.turnOffSelectAll]);
134
148
  const onTriggerClick = (0, react_1.useCallback)(() => {
135
149
  setIsOpen(!isOpen);
136
150
  }, [isOpen]);
@@ -12,20 +12,23 @@ const searchInput_1 = require("../searchInput/searchInput");
12
12
  const useLanguage_1 = require("../utils/localization/useLanguage");
13
13
  const footerButtons_1 = require("../footerButtons/footerButtons");
14
14
  const checkbox_1 = require("../checkbox/checkbox");
15
+ const useScrollWithAndroidKeyboard_1 = require("../utils/useScrollWithAndroidKeyboard");
15
16
  const DropdownPopup = ({ alignment, triggerRef, classNamePopup, isMobile, inputValue, dialogAriaLabel, disabled, filterName, handleApplyClick, handleClearClick, handleTriggerClick, onInputChange, hasApplyButton, inputId, isClearButtonDisabled, isWithFooter, placeholder, searchField, isApplyButtonDisabled, isOpenCombo, inputRef, contentRef, children, onReadyForFocus, handleCheckboxChange, checkboxLabel, isChecked }) => {
16
17
  const { translate } = (0, useLanguage_1.useLanguage)();
17
18
  const triggerId = (0, react_1.useId)();
19
+ const { handleFocus, handleBlur, wrapperClass } = (0, useScrollWithAndroidKeyboard_1.useScrollWithAndroidKeyboard)();
18
20
  const memoizedHandleHide = (0, react_1.useCallback)(() => {
19
21
  handleTriggerClick(false);
20
22
  }, [handleTriggerClick]);
21
- const memoizedMobileContent = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [searchField ? (0, jsx_runtime_1.jsx)("div", { className: "zen-dropdown-mobile-sheet__search-container", children: (0, jsx_runtime_1.jsx)(searchInput_1.SearchInput, { className: "zen-dropdown-mobile-sheet__search", onChange: onInputChange, value: inputValue || "", ref: inputRef, id: inputId || triggerId, disabled: disabled, placeholder: placeholder || translate("Filter by group") }) }) : null, handleCheckboxChange ? (0, jsx_runtime_1.jsx)("div", { className: "zen-dropdown-mobile-sheet__checkbox-container", children: (0, jsx_runtime_1.jsx)(checkbox_1.Checkbox, { checked: isChecked, onChange: handleCheckboxChange, children: checkboxLabel }) }) : null, (0, jsx_runtime_1.jsx)("div", { ref: contentRef, children: children })] }), [checkboxLabel, children, contentRef, disabled, handleCheckboxChange, inputId, inputRef, inputValue, isChecked, onInputChange, placeholder, searchField, translate, triggerId]);
23
+ const memoizedMobileContent = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [searchField ? (0, jsx_runtime_1.jsx)("div", { className: "zen-dropdown-mobile-sheet__search-container", children: (0, jsx_runtime_1.jsx)(searchInput_1.SearchInput, { className: "zen-dropdown-mobile-sheet__search", onChange: onInputChange, onBlur: handleBlur, onFocus: handleFocus, value: inputValue || "", ref: inputRef, id: inputId || triggerId, disabled: disabled, placeholder: placeholder || translate("Filter by group") }) }) : null, handleCheckboxChange ? (0, jsx_runtime_1.jsx)("div", { className: "zen-dropdown-mobile-sheet__checkbox-container", children: (0, jsx_runtime_1.jsx)(checkbox_1.Checkbox, { checked: isChecked, onChange: handleCheckboxChange, children: checkboxLabel }) }) : null, (0, jsx_runtime_1.jsx)("div", { ref: contentRef, children: children })] }), [searchField, onInputChange, handleBlur, handleFocus, inputValue, inputRef, inputId, triggerId, disabled, placeholder,
24
+ translate, handleCheckboxChange, isChecked, checkboxLabel, contentRef, children]);
22
25
  const memoizedMobileFooter = (0, react_1.useMemo)(() => {
23
26
  if (!isWithFooter) {
24
27
  return null;
25
28
  }
26
29
  return (0, jsx_runtime_1.jsxs)(footerButtons_1.FooterButtons, { children: [hasApplyButton ? (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: handleApplyClick, type: buttonType_1.ButtonType.Primary, disabled: isApplyButtonDisabled, className: "zen-ellipsis", title: translate("Apply"), children: translate("Apply") }) : null, (0, jsx_runtime_1.jsx)(button_1.Button, { onClick: handleClearClick, disabled: isClearButtonDisabled, className: "zen-ellipsis", type: buttonType_1.ButtonType.Tertiary, title: translate("Clear"), children: translate("Clear") })] });
27
30
  }, [handleApplyClick, handleClearClick, hasApplyButton, isApplyButtonDisabled, isClearButtonDisabled, isWithFooter, translate]);
28
- const memoizedMobileView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsxs)(mobileSheet_1.MobileSheet, { className: (0, classNames_1.classNames)(["zen-dropdown--mobile", classNamePopup || ""]), label: "label", triggerRef: triggerRef, isOpen: isOpenCombo, onHidePanel: memoizedHandleHide, onCloseClick: memoizedHandleHide, useTrapFocusWithTrigger: true, onReadyForFocus: onReadyForFocus, children: [(0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Title, { className: "zen-dropdown-mobile-sheet__title", children: filterName || placeholder || "" }), (0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Content, { children: memoizedMobileContent }), (0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Footer, { children: memoizedMobileFooter })] }), [classNamePopup, filterName, isOpenCombo, onReadyForFocus, memoizedHandleHide, memoizedMobileContent, memoizedMobileFooter, placeholder, triggerRef]);
31
+ const memoizedMobileView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsxs)(mobileSheet_1.MobileSheet, { className: (0, classNames_1.classNames)(["zen-dropdown--mobile", classNamePopup || ""]), wrapperClassName: wrapperClass, label: "label", triggerRef: triggerRef, isOpen: isOpenCombo, onHidePanel: memoizedHandleHide, onCloseClick: memoizedHandleHide, useTrapFocusWithTrigger: true, onReadyForFocus: onReadyForFocus, children: [(0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Title, { className: "zen-dropdown-mobile-sheet__title", children: filterName || placeholder || "" }), (0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Content, { children: memoizedMobileContent }), (0, jsx_runtime_1.jsx)(mobileSheet_1.MobileSheet.Footer, { children: memoizedMobileFooter })] }), [classNamePopup, wrapperClass, triggerRef, isOpenCombo, memoizedHandleHide, onReadyForFocus, filterName, placeholder, memoizedMobileContent, memoizedMobileFooter]);
29
32
  const memoizedDesktopView = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(controlledPopup_1.ControlledPopup, { isOpen: isOpenCombo, className: (0, classNames_1.classNames)(["zen-dropdown-popup zen-shadow-dropdown-default", classNamePopup || ""]), onOpenChange: handleTriggerClick, useTrapFocusWithTrigger: "withTrigger", alignment: alignment, shouldHoldScroll: true, triggerRef: triggerRef, ariaLabel: dialogAriaLabel || placeholder || translate("Filter by group"), recalculateOnScroll: true, children: (0, jsx_runtime_1.jsx)("div", { ref: contentRef, children: children }) }), [alignment, children, classNamePopup, contentRef, dialogAriaLabel, handleTriggerClick, isOpenCombo, placeholder, translate, triggerRef]);
30
33
  return isMobile ? memoizedMobileView : memoizedDesktopView;
31
34
  };
@@ -95,13 +95,14 @@ const FiltersContainer = ({ className, children, getDefaultFiltersState, ignoreN
95
95
  window.requestAnimationFrame(animateScroll);
96
96
  }
97
97
  }, []);
98
- return (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__filters-container", className !== null && className !== void 0 ? className : "", `zen-filters-toolbar__filters-container--${scrollButtonType || "none"}`]), children: [scrollButtonType === "start" || scrollButtonType === "both" ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__gradient", driveClassNameGradient || "", "zen-filters-toolbar__gradient--left"]) }), (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { title: translate("Scroll left"), className: (0, classNames_1.classNames)(["zen-filters-toolbar__scroller", driveClassNameScroller || "", "zen-filters-toolbar__start"]), icon: iconChevronRight_1.IconChevronRight, iconPosition: textIconButton_1.ButtonIconPosition.Start, onClick: handleScrollButtonClick(scrollableRef.current, -scrollableStep), iconClasses: "zen-filters-toolbar__start-icon" })] }) : null, (0, jsx_runtime_1.jsx)("div", { ref: scrollableRef, className: "zen-filters-toolbar__scrollable", children: (0, jsx_runtime_1.jsx)("div", { className: "zen-filters-toolbar__filters", children: react_1.Children.map(children, (child, index) => {
99
- if (child.props.hideInBar && !isFilterStateChanged(child.props.id, child.props.state) || (child.props.hideInBar && ignoreNewFunctionality)) {
100
- return null;
101
- }
102
- const childComponent = (0, react_1.cloneElement)(child, { useSidePanelView: false });
103
- return (0, jsx_runtime_1.jsx)("div", { className: "zen-filters-toolbar__filters-item", children: childComponent }, `filtersBarItem_${index}`);
104
- }) }) }), scrollButtonType === "end" || scrollButtonType === "both" ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__gradient", driveClassNameGradient || "", "zen-filters-toolbar__gradient--right"]) }), (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { title: translate("Scroll right"), className: (0, classNames_1.classNames)(["zen-filters-toolbar__scroller", driveClassNameScroller || "", "zen-filters-toolbar__end"]), icon: iconChevronRight_1.IconChevronRight, onClick: handleScrollButtonClick(scrollableRef.current, scrollableStep), iconPosition: textIconButton_1.ButtonIconPosition.End })] }) : null] });
98
+ const filtersForRender = react_1.Children.map(children, (child, index) => {
99
+ if (child.props.hideInBar && !isFilterStateChanged(child.props.id, child.props.state) || (child.props.hideInBar && ignoreNewFunctionality)) {
100
+ return null;
101
+ }
102
+ const childComponent = (0, react_1.cloneElement)(child, { useSidePanelView: false });
103
+ return (0, jsx_runtime_1.jsx)("div", { className: "zen-filters-toolbar__filters-item", children: childComponent }, `filtersBarItem_${index}`);
104
+ });
105
+ return filtersForRender.length ? (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__filters-container", className !== null && className !== void 0 ? className : "", `zen-filters-toolbar__filters-container--${scrollButtonType || "none"}`]), children: [scrollButtonType === "start" || scrollButtonType === "both" ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__gradient", driveClassNameGradient || "", "zen-filters-toolbar__gradient--left"]) }), (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { title: translate("Scroll left"), className: (0, classNames_1.classNames)(["zen-filters-toolbar__scroller", driveClassNameScroller || "", "zen-filters-toolbar__start"]), icon: iconChevronRight_1.IconChevronRight, iconPosition: textIconButton_1.ButtonIconPosition.Start, onClick: handleScrollButtonClick(scrollableRef.current, -scrollableStep), iconClasses: "zen-filters-toolbar__start-icon" })] }) : null, (0, jsx_runtime_1.jsx)("div", { ref: scrollableRef, className: "zen-filters-toolbar__scrollable", children: (0, jsx_runtime_1.jsx)("div", { className: "zen-filters-toolbar__filters", children: filtersForRender }) }), scrollButtonType === "end" || scrollButtonType === "both" ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)(["zen-filters-toolbar__gradient", driveClassNameGradient || "", "zen-filters-toolbar__gradient--right"]) }), (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { title: translate("Scroll right"), className: (0, classNames_1.classNames)(["zen-filters-toolbar__scroller", driveClassNameScroller || "", "zen-filters-toolbar__end"]), icon: iconChevronRight_1.IconChevronRight, onClick: handleScrollButtonClick(scrollableRef.current, scrollableStep), iconPosition: textIconButton_1.ButtonIconPosition.End })] }) : null] }) : null;
105
106
  };
106
107
  exports.FiltersContainer = FiltersContainer;
107
108
  exports.TRANSLATIONS = [
@@ -6,5 +6,6 @@ export interface IFormStepperButtons extends Pick<IFormStepper, "current" | "set
6
6
  onCancel: () => void;
7
7
  onPrevious?: () => void;
8
8
  onContinue?: () => void;
9
+ isNextDisabled?: boolean;
9
10
  }
10
- export declare const FormStepperButtons: ({ onPrevious, onCancel, onContinue, onSubmit, current, setCurrent, steps, className }: IFormStepperButtons) => import("react/jsx-runtime").JSX.Element;
11
+ export declare const FormStepperButtons: ({ onPrevious, onCancel, onContinue, onSubmit, current, setCurrent, steps, isNextDisabled, className }: IFormStepperButtons) => import("react/jsx-runtime").JSX.Element;
@@ -7,7 +7,7 @@ const button_1 = require("../button/button");
7
7
  const iconChevronLeft_1 = require("../icons/iconChevronLeft");
8
8
  const textIconButton_1 = require("../textIconButton/textIconButton");
9
9
  const useLanguage_1 = require("../utils/localization/useLanguage");
10
- const FormStepperButtons = ({ onPrevious, onCancel, onContinue, onSubmit, current, setCurrent, steps, className = "" }) => {
10
+ const FormStepperButtons = ({ onPrevious, onCancel, onContinue, onSubmit, current, setCurrent, steps, isNextDisabled, className = "" }) => {
11
11
  const { translate } = (0, useLanguage_1.useLanguage)();
12
12
  const onPreviousHandler = (0, react_1.useCallback)(() => {
13
13
  setCurrent((prev) => {
@@ -31,6 +31,6 @@ const FormStepperButtons = ({ onPrevious, onCancel, onContinue, onSubmit, curren
31
31
  }, [onContinue, setCurrent, steps]);
32
32
  const isFirstStep = steps[0].id === current;
33
33
  const isLastStep = steps[steps.length - 1].id === current;
34
- return ((0, jsx_runtime_1.jsxs)("div", { className: `zen-form-step-buttons ${className}`, children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-form-step-buttons__left", children: !isFirstStep && (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { className: "zen-form-step-buttons__previous", icon: iconChevronLeft_1.IconChevronLeft, type: "tertiary-black", onClick: onPreviousHandler, children: translate("Previous step") }) }), (0, jsx_runtime_1.jsxs)("div", { className: "zen-form-step-buttons__right", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-form-step-buttons__cancel", type: "secondary", onClick: onCancel, children: translate("Cancel") }), isLastStep ? ((0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-form-step-buttons__submit", type: "primary", onClick: onSubmit, children: translate("Submit") })) : ((0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-form-step-buttons__continue", type: "primary", onClick: onContinueHandler, children: translate("Continue") }))] })] }));
34
+ return ((0, jsx_runtime_1.jsxs)("div", { className: `zen-form-step-buttons ${className}`, children: [(0, jsx_runtime_1.jsx)("div", { className: "zen-form-step-buttons__left", children: !isFirstStep && (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { className: "zen-form-step-buttons__previous", icon: iconChevronLeft_1.IconChevronLeft, type: "tertiary-black", onClick: onPreviousHandler, children: translate("Previous step") }) }), (0, jsx_runtime_1.jsxs)("div", { className: "zen-form-step-buttons__right", children: [(0, jsx_runtime_1.jsx)(button_1.Button, { className: "zen-form-step-buttons__cancel", type: "secondary", onClick: onCancel, children: translate("Cancel") }), isLastStep ? ((0, jsx_runtime_1.jsx)(button_1.Button, { disabled: isNextDisabled, className: "zen-form-step-buttons__submit", type: "primary", onClick: onSubmit, children: translate("Submit") })) : ((0, jsx_runtime_1.jsx)(button_1.Button, { disabled: isNextDisabled, className: "zen-form-step-buttons__continue", type: "primary", onClick: onContinueHandler, children: translate("Continue") }))] })] }));
35
35
  };
36
36
  exports.FormStepperButtons = FormStepperButtons;
@@ -12,8 +12,6 @@ const headerButton_1 = require("../../headerButton");
12
12
  const headerMenu_1 = require("../../headerMenu");
13
13
  const headerHelpers_1 = require("../../headerHelpers");
14
14
  const iconDotVertical_1 = require("../../../icons/iconDotVertical");
15
- const useMobile_1 = require("../../../commonHelpers/hooks/useMobile");
16
- const iconChevronDownSmall_1 = require("../../../icons/iconChevronDownSmall");
17
15
  const useDrive_1 = require("../../../utils/theme/useDrive");
18
16
  const handleCustomMenuWrapper_1 = require("./utils/handleCustomMenuWrapper");
19
17
  exports.HeaderCustomContent = (0, react_1.createContext)({
@@ -25,9 +23,8 @@ exports.HeaderCustomContentProvider = HeaderCustomContentProvider;
25
23
  const PageToolbarCollapsedItemsControl = ({ children }) => {
26
24
  const { translate } = (0, useLanguage_1.useLanguage)();
27
25
  const isDrive = (0, useDrive_1.useDrive)();
28
- const isMobile = (0, useMobile_1.useMobile)();
29
26
  const { content } = (0, react_1.useContext)(exports.HeaderCustomContent);
30
- const adjustmentButton = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { className: "zen-header-more-button", title: translate("More"), type: buttonType_1.ButtonType.TertiaryBlack, iconPosition: textIconButton_1.ButtonIconPosition.End, iconSize: isDrive ? svgIconSize_1.SvgIconSize.Huge : svgIconSize_1.SvgIconSize.Large, icon: isMobile ? iconDotVertical_1.IconDotVertical : iconChevronDownSmall_1.IconChevronDownSmall, children: isMobile ? null : translate("More") }), [isDrive, isMobile, translate]);
27
+ const adjustmentButton = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { "aria-label": translate("More"), className: "zen-header-more-button", type: buttonType_1.ButtonType.TertiaryBlack, iconPosition: textIconButton_1.ButtonIconPosition.End, iconSize: isDrive ? svgIconSize_1.SvgIconSize.Huge : svgIconSize_1.SvgIconSize.Large, icon: iconDotVertical_1.IconDotVertical }), [isDrive, translate]);
31
28
  const items = [];
32
29
  const clickHandler = (0, react_1.useCallback)((propsOnClick) => ((_, e) => { propsOnClick(e); }), []);
33
30
  react_1.Children.forEach(children, (child) => {
@@ -142,7 +142,7 @@ const Header = ({ children, className, onFiltersBarOpen }) => {
142
142
  const maxWidth = middleWidth || ((_b = toolbarRef.current) === null || _b === void 0 ? void 0 : _b.getBoundingClientRect().width) || 0;
143
143
  const actionCount = (0, react_1.useMemo)(() => {
144
144
  if (!isMobile) {
145
- return 4;
145
+ return 2;
146
146
  }
147
147
  if (memoizedFiltersBar && !searchComponent) {
148
148
  return 1;
package/dist/index.css CHANGED
@@ -3142,6 +3142,9 @@
3142
3142
  max-width: 100%;
3143
3143
  }
3144
3144
  }
3145
+ .zen-side-panel--shown-keyboard.zen-side-panel--bottom-positioned {
3146
+ top: 0;
3147
+ }
3145
3148
  .zen-side-panel-cell {
3146
3149
  box-sizing: border-box;
3147
3150
  padding: 16px;
@@ -3285,6 +3288,10 @@
3285
3288
  flex: 1 1 auto;
3286
3289
  overflow-y: auto;
3287
3290
  }
3291
+ .zen-mobile-sheet--mobile-android {
3292
+ overflow-y: hidden;
3293
+ position: fixed;
3294
+ }
3288
3295
  .zen-mobile-sheet-wrapper--drive.zen-mobile-sheet-wrapper--drive,
3289
3296
  .zen-mobile-sheet-wrapper--drive-tablet.zen-mobile-sheet-wrapper--drive-tablet {
3290
3297
  max-width: 520px;
@@ -6288,6 +6295,9 @@
6288
6295
  display: flex;
6289
6296
  justify-content: flex-end;
6290
6297
  }
6298
+ .zen-card--no-header {
6299
+ grid-template-rows: 1fr;
6300
+ }
6291
6301
  .zen-menu-button {
6292
6302
  box-sizing: border-box;
6293
6303
  width: 100%;
@@ -6354,7 +6364,6 @@
6354
6364
  .zen-menu-button__action-text {
6355
6365
  overflow: hidden;
6356
6366
  text-overflow: ellipsis;
6357
- max-width: 90%;
6358
6367
  white-space: nowrap;
6359
6368
  margin-left: 0;
6360
6369
  margin-right: auto;
@@ -7563,7 +7572,7 @@ button.zen-summary__clickable {
7563
7572
  }
7564
7573
  .zen-feed-item__values {
7565
7574
  display: grid;
7566
- grid-template-columns: minmax(104px, auto) 1fr;
7575
+ grid-template-columns: minmax(104px, 104px) 1fr;
7567
7576
  align-items: baseline;
7568
7577
  gap: 4px;
7569
7578
  overflow-wrap: break-word;
@@ -7650,7 +7659,7 @@ button.zen-summary__clickable {
7650
7659
  display: flex;
7651
7660
  align-items: center;
7652
7661
  }
7653
- .zen-checkbox-column--no-checkbox .zen-checkbox-column__checkbox-input {
7662
+ .zen-checkbox-column--no-checkbox .zen-checkbox-column__checkbox {
7654
7663
  display: none;
7655
7664
  }
7656
7665
  .zen-main-column,
@@ -7814,7 +7823,7 @@ button.zen-summary__clickable {
7814
7823
  display: flex;
7815
7824
  align-items: center;
7816
7825
  }
7817
- .zen-selectable-column--no-checkbox .zen-checkbox-column__checkbox-input {
7826
+ .zen-selectable-column--no-checkbox .zen-checkbox-column__checkbox {
7818
7827
  visibility: hidden;
7819
7828
  }
7820
7829
  .zen-sortable-column {
@@ -8134,8 +8143,6 @@ button.zen-summary__clickable {
8134
8143
  line-height: 16px;
8135
8144
  text-transform: none;
8136
8145
  flex: 0 1 auto;
8137
- margin-left: 4px;
8138
- margin-right: 16px;
8139
8146
  overflow: hidden;
8140
8147
  text-overflow: ellipsis;
8141
8148
  white-space: nowrap;
@@ -9332,7 +9339,7 @@ button.zen-summary__clickable {
9332
9339
  .zen-filters-toolbar {
9333
9340
  box-sizing: border-box;
9334
9341
  display: flex;
9335
- justify-content: space-between;
9342
+ justify-content: flex-start;
9336
9343
  height: 56px;
9337
9344
  align-items: center;
9338
9345
  border-bottom: 1px solid var(--borders-general);
@@ -12769,27 +12776,10 @@ button.zen-summary__clickable {
12769
12776
  background: linear-gradient(to right, transparent 0%, color-mix(in srgb, var(--borders-general) 40%, transparent) 10%, var(--borders-general) 50%, color-mix(in srgb, var(--borders-general) 40%, transparent) 90%, transparent 100%);
12770
12777
  border: none;
12771
12778
  }
12772
- .zen-nav-header {
12773
- box-sizing: border-box;
12774
- display: flex;
12775
- gap: 16px;
12776
- justify-content: space-between;
12777
- align-items: center;
12778
- }
12779
- .zen-nav-header__actions-icon {
12780
- border-radius: 50%;
12781
- }
12782
- .zen-nav-header__actions {
12779
+ .nav-footer-action {
12783
12780
  display: flex;
12784
12781
  flex-direction: column;
12785
12782
  }
12786
- .zen-nav-header__action {
12787
- display: flex;
12788
- }
12789
- .zen-nav-header--collapsed {
12790
- align-items: center;
12791
- flex-direction: column;
12792
- }
12793
12783
  .zen-nav-item {
12794
12784
  box-sizing: border-box;
12795
12785
  width: 100%;
@@ -12926,6 +12916,27 @@ button.zen-summary__clickable {
12926
12916
  border: 1px solid var(--backgrounds-content-0);
12927
12917
  border-radius: 50%;
12928
12918
  }
12919
+ .zen-nav-header {
12920
+ box-sizing: border-box;
12921
+ display: flex;
12922
+ gap: 16px;
12923
+ justify-content: space-between;
12924
+ align-items: center;
12925
+ }
12926
+ .zen-nav-header__actions-icon {
12927
+ border-radius: 50%;
12928
+ }
12929
+ .zen-nav-header__actions {
12930
+ display: flex;
12931
+ flex-direction: column;
12932
+ }
12933
+ .zen-nav-header__action {
12934
+ display: flex;
12935
+ }
12936
+ .zen-nav-header--collapsed {
12937
+ align-items: center;
12938
+ flex-direction: column;
12939
+ }
12929
12940
  .zen-push {
12930
12941
  box-sizing: border-box;
12931
12942
  font-family: var(--main-font);
@@ -7,6 +7,8 @@ export interface IInputAdornments {
7
7
  disabled?: boolean;
8
8
  onChange: React.ChangeEventHandler<HTMLInputElement>;
9
9
  onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
10
+ onFocus?: React.FocusEventHandler<HTMLInputElement>;
11
+ onBlur?: React.FocusEventHandler<HTMLInputElement>;
10
12
  endAdornment?: ReactNode;
11
13
  startAdornment?: ReactNode;
12
14
  placeholder?: string;
@@ -30,7 +30,7 @@ const react_1 = require("react");
30
30
  const classNames_1 = require("../commonHelpers/classNames/classNames");
31
31
  const textInputRaw_1 = require("../textInputRaw/textInputRaw");
32
32
  const useDriveClassName_1 = require("../utils/theme/useDriveClassName");
33
- exports.InputAdornments = React.forwardRef(({ id, value, className = "", disabled, isError, maxLength, onChange, onKeyDown, startAdornment, endAdornment, placeholder, inputType = "text", autoFocus }, ref) => {
33
+ exports.InputAdornments = React.forwardRef(({ id, value, className = "", disabled, isError, maxLength, onChange, onKeyDown, onFocus, onBlur, startAdornment, endAdornment, placeholder, inputType = "text", autoFocus }, ref) => {
34
34
  const disabledClassName = disabled ? "zen-input-adornments--disabled" : "";
35
35
  const driveComponentClass = (0, useDriveClassName_1.useDriveClassName)("zen-input-adornments");
36
36
  const classes = (0, react_1.useMemo)(() => (0, classNames_1.classNames)([
@@ -45,6 +45,6 @@ exports.InputAdornments = React.forwardRef(({ id, value, className = "", disable
45
45
  !value ? "zen-input-adornments__wrapper--empty" : "",
46
46
  className
47
47
  ]), [className, endAdornment, value]);
48
- return ((0, jsx_runtime_1.jsxs)("div", { className: classes, children: [!!startAdornment && ((0, jsx_runtime_1.jsx)("div", { className: "zen-input-adornments__adornment zen-input-adornments__adornment--start", children: startAdornment })), (0, jsx_runtime_1.jsx)("div", { className: wrapperClasses, children: (0, jsx_runtime_1.jsx)(textInputRaw_1.TextInputRaw, { ref: ref, id: id, value: value, maxLength: maxLength, isError: isError, placeholder: placeholder, onChange: onChange, onKeyDown: onKeyDown, disabled: disabled, type: inputType, autoFocus: autoFocus, className: "zen-input-adornments__input zen-input-adornments__input--border-none" }) }), !!endAdornment && ((0, jsx_runtime_1.jsx)("div", { className: "zen-input-adornments__adornment zen-input-adornments__adornment--end", children: endAdornment }))] }));
48
+ return ((0, jsx_runtime_1.jsxs)("div", { className: classes, children: [!!startAdornment && ((0, jsx_runtime_1.jsx)("div", { className: "zen-input-adornments__adornment zen-input-adornments__adornment--start", children: startAdornment })), (0, jsx_runtime_1.jsx)("div", { className: wrapperClasses, children: (0, jsx_runtime_1.jsx)(textInputRaw_1.TextInputRaw, { ref: ref, id: id, value: value, maxLength: maxLength, isError: isError, placeholder: placeholder, onChange: onChange, onKeyDown: onKeyDown, onBlur: onBlur, onFocus: onFocus, disabled: disabled, type: inputType, autoFocus: autoFocus, className: "zen-input-adornments__input zen-input-adornments__input--border-none" }) }), !!endAdornment && ((0, jsx_runtime_1.jsx)("div", { className: "zen-input-adornments__adornment zen-input-adornments__adornment--end", children: endAdornment }))] }));
49
49
  });
50
50
  exports.InputAdornments.displayName = "InputAdornments";
@@ -5,11 +5,13 @@ const colorUtils_1 = require("../commonHelpers/colorUtils");
5
5
  const defaultLineOptions = {
6
6
  borderWidth: 2,
7
7
  pointRadius: 5,
8
+ pointHoverRadius: 7,
8
9
  pointHitRadius: 10
9
10
  };
10
11
  const defaultThinLineOptions = {
11
12
  borderWidth: 1,
12
13
  pointRadius: 3,
14
+ pointHoverRadius: 5,
13
15
  pointHitRadius: 6
14
16
  };
15
17
  const baseColors = [
@@ -32,8 +34,11 @@ const getDefaultDatasetStyle = (dataSet, dsIndex, useThinLines = false) => {
32
34
  }
33
35
  if (!dataSet.pointRadius) {
34
36
  const poinRs = Array(dataSet.data.length).fill(0);
37
+ const pointHoverRs = Array(dataSet.data.length).fill(lineStyle.pointRadius);
35
38
  poinRs[poinRs.length - 1] = lineStyle.pointRadius;
36
39
  newDataSet.pointRadius = poinRs;
40
+ pointHoverRs[pointHoverRs.length - 1] = lineStyle.pointHoverRadius;
41
+ newDataSet.pointHoverRadius = pointHoverRs;
37
42
  newDataSet.pointHitRadius = lineStyle.pointHitRadius;
38
43
  newDataSet.pointBackgroundColor = dataSet.pointBackgroundColor || baseColor;
39
44
  }
@@ -10,6 +10,7 @@ export interface IMenu extends Pick<IZenComponentProps, "children"> {
10
10
  alignment?: TAlignment;
11
11
  ariaLabel?: string;
12
12
  ariaLabelledBy?: string;
13
+ className?: string;
13
14
  }
14
15
  export declare const Menu: FC<IMenu> & {
15
16
  Item: FC<IMenuItem>;
package/dist/menu/menu.js CHANGED
@@ -6,10 +6,11 @@ const react_1 = require("react");
6
6
  const controlledMenu_1 = require("./controlledMenu");
7
7
  const menuItem_1 = require("./components/menuItem");
8
8
  const menuSeparator_1 = require("./components/menuSeparator");
9
+ const classNames_1 = require("../commonHelpers/classNames/classNames");
9
10
  // eslint-disable-next-line @typescript-eslint/naming-convention
10
11
  const Menu =
11
12
  // eslint-disable-next-line react/prop-types
12
- ({ children, title, trigger, triggerRef, ariaLabel, ariaLabelledBy, alignment = "bottom-left" }) => {
13
+ ({ children, title, trigger, triggerRef, ariaLabel, ariaLabelledBy, alignment = "bottom-left", className }) => {
13
14
  const [isOpen, setIsOpen] = (0, react_1.useState)(false);
14
15
  const innerRef = (0, react_1.useRef)(null);
15
16
  const shouldRenderTrigger = !!trigger;
@@ -30,7 +31,7 @@ const Menu =
30
31
  }
31
32
  }, [triggerRef, isOpen, shouldRenderTrigger]);
32
33
  const triggerComp = shouldRenderTrigger ? renderTrigger() : null;
33
- return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [triggerComp, (0, jsx_runtime_1.jsx)(controlledMenu_1.ControlledMenu, { alignment: alignment, ariaLabel: ariaLabel, ariaLabelledby: ariaLabelledBy || (triggerComp === null || triggerComp === void 0 ? void 0 : triggerComp.props.id), isOpen: isOpen, setIsOpen: setIsOpen, triggerRef: ref, title: title, className: "zen-menu", children: children })] });
34
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [triggerComp, (0, jsx_runtime_1.jsx)(controlledMenu_1.ControlledMenu, { alignment: alignment, ariaLabel: ariaLabel, ariaLabelledby: ariaLabelledBy || (triggerComp === null || triggerComp === void 0 ? void 0 : triggerComp.props.id), isOpen: isOpen, setIsOpen: setIsOpen, triggerRef: ref, title: title, className: (0, classNames_1.classNames)(["zen-menu", className || ""]), children: children })] });
34
35
  };
35
36
  exports.Menu = Menu;
36
37
  exports.Menu.Item = menuItem_1.MenuItem;
@@ -18,6 +18,7 @@ export interface IMobileSheet extends IZenComponentProps, Pick<ISidePanel, "trig
18
18
  */
19
19
  translate?: (s: string) => string;
20
20
  onReadyForFocus?: (currentIsOpen: boolean) => void;
21
+ wrapperClassName?: string;
21
22
  }
22
23
  export declare const MobileSheet: FC<IMobileSheet> & {
23
24
  Footer: FC<IMobileSheetFooter>;
@@ -22,7 +22,7 @@ const useFadeComponent_1 = require("../utils/useFadeComponent");
22
22
  // eslint-disable-next-line @typescript-eslint/naming-convention
23
23
  const MobileSheet =
24
24
  // eslint-disable-next-line react/prop-types
25
- ({ triggerRef, label, isOpen, onHidePanel, className = "", panelPosition = "bottom", onBackClick, onCloseClick, isBackVisible, backButtonAriaLabel, children, useTrapFocusWithTrigger, onReadyForFocus }) => {
25
+ ({ triggerRef, label, isOpen, onHidePanel, className = "", panelPosition = "bottom", onBackClick, onCloseClick, isBackVisible, backButtonAriaLabel, children, useTrapFocusWithTrigger, onReadyForFocus, wrapperClassName }) => {
26
26
  var _a, _b;
27
27
  const { renderComponent, showContent, readyForFocus, setIsOpen, handleTransitionEnd } = (0, useFadeComponent_1.useFadeComponent)(isOpen, onReadyForFocus);
28
28
  const dataShieldId = (0, useUniqueId_1.useUniqueId)();
@@ -78,7 +78,7 @@ const MobileSheet =
78
78
  if (!renderComponent && !isOpen) {
79
79
  return null;
80
80
  }
81
- return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(shield_1.Shield, { className: "zen-mobile-sheet-shield", dataShieldId: dataShieldId, isVisible: showContent }), (0, jsx_runtime_1.jsx)(sidePanel_1.SidePanel, { className: (0, classNames_1.classNames)(["zen-mobile-sheet-wrapper", driveWrapperMobileSheetClassName || ""]), panelPosition: panelPosition, triggerRef: triggerRef, label: label, isOpen: showContent, useTrapFocusWithTrigger: useTrapFocusWithTrigger, onHidePanel: onHidePanelAction, onTransitionEnd: handleTransitionEnd, children: (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-mobile-sheet", className]), ref: ref, children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-mobile-sheet__title", driveTitleClassName || ""]), children: [isBackVisible ?
81
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(shield_1.Shield, { className: "zen-mobile-sheet-shield", dataShieldId: dataShieldId, isVisible: showContent }), (0, jsx_runtime_1.jsx)(sidePanel_1.SidePanel, { className: (0, classNames_1.classNames)(["zen-mobile-sheet-wrapper", wrapperClassName || "", driveWrapperMobileSheetClassName || ""]), panelPosition: panelPosition, triggerRef: triggerRef, label: label, isOpen: showContent, useTrapFocusWithTrigger: useTrapFocusWithTrigger, onHidePanel: onHidePanelAction, onTransitionEnd: handleTransitionEnd, children: (0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-mobile-sheet", className]), ref: ref, children: [(0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)(["zen-mobile-sheet__title", driveTitleClassName || ""]), children: [isBackVisible ?
82
82
  (0, jsx_runtime_1.jsx)(textIconButton_1.TextIconButton, { onClick: (e) => {
83
83
  e.stopPropagation();
84
84
  onBackClick === null || onBackClick === void 0 ? void 0 : onBackClick();
@@ -0,0 +1,13 @@
1
+ import "./navFooterAction.less";
2
+ interface INavFooterActionLink {
3
+ title: string;
4
+ link: string;
5
+ }
6
+ interface INavFooterActionProps {
7
+ title: string;
8
+ links: INavFooterActionLink[];
9
+ }
10
+ export declare const NavFooterAction: (({ links, title }: INavFooterActionProps) => import("react/jsx-runtime").JSX.Element) & {
11
+ translations: string[];
12
+ };
13
+ export {};
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NavFooterAction = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const useLanguage_1 = require("../../../utils/localization/useLanguage");
6
+ const navItem_1 = require("../../navItem/navItem");
7
+ const react_1 = require("react");
8
+ const controlledMenu_1 = require("../../../menu/controlledMenu");
9
+ const iconSettings4_1 = require("../../../icons/iconSettings4");
10
+ const NavFooterActionInner = ({ links, title }) => {
11
+ const triggerRef = (0, react_1.useRef)(null);
12
+ const [isOpen, setIsOpen] = (0, react_1.useState)(false);
13
+ const { translate } = (0, useLanguage_1.useLanguage)();
14
+ const handlerTriggerClick = (0, react_1.useCallback)(() => setIsOpen(!isOpen), [isOpen, setIsOpen]);
15
+ const handleStateChange = (0, react_1.useCallback)(() => {
16
+ setIsOpen(!isOpen);
17
+ }, [isOpen]);
18
+ const menuItems = (0, react_1.useMemo)(() => links.map(link => {
19
+ const itemId = `${link.title}${link.link}`;
20
+ return (0, jsx_runtime_1.jsx)(controlledMenu_1.ControlledMenu.Item, { name: link.title, link: link.link, id: itemId }, itemId);
21
+ }), [links]);
22
+ if (links.length === 0) {
23
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
24
+ }
25
+ return (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(navItem_1.NavItem, { active: isOpen, primaryIcon: iconSettings4_1.IconSettings4, hasSubmenu: true, ref: triggerRef, onClick: handlerTriggerClick, title: translate("Configure") }), (0, jsx_runtime_1.jsx)(controlledMenu_1.ControlledMenu, { setIsOpen: handleStateChange, title: title, triggerRef: triggerRef, className: "nav-footer-action", isOpen: isOpen, alignment: "right-bottom", children: menuItems })] });
26
+ };
27
+ exports.NavFooterAction = Object.assign(NavFooterActionInner, { translations: [
28
+ "Configure"
29
+ ] });
@@ -19,5 +19,5 @@ interface ILinkNavItem extends INavItemCommon {
19
19
  interface IButtonNavItem extends INavItemCommon {
20
20
  onClick: () => void;
21
21
  }
22
- export declare const NavItem: FC<ILinkNavItem | IButtonNavItem>;
22
+ export declare const NavItem: import("react").ForwardRefExoticComponent<(ILinkNavItem | IButtonNavItem) & import("react").RefAttributes<HTMLButtonElement | HTMLAnchorElement>>;
23
23
  export {};