@geotab/zenith 3.15.0-beta.3 → 3.15.0-nightly.20260901.415ef01

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 (172) hide show
  1. package/dist/absolute/absolute.js +1 -1
  2. package/dist/betaPill/betaPill.js +9 -9
  3. package/dist/commonHelpers/arrowNavigation/arrowNavigationHelper.d.ts +1 -0
  4. package/dist/commonHelpers/arrowNavigation/arrowNavigationHelper.js +5 -1
  5. package/dist/commonHelpers/hooks/useTrapFocus.d.ts +9 -0
  6. package/dist/commonHelpers/hooks/useTrapFocus.js +66 -14
  7. package/dist/controlledPopup/controlledPopup.d.ts +1 -1
  8. package/dist/controlledPopup/controlledPopup.js +1 -1
  9. package/dist/dropdownRaw/dropdownSearchableTrigger.js +1 -1
  10. package/dist/filtersBar/components/filtersBarRange/filtersBarRange.d.ts +1 -1
  11. package/dist/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.d.ts +1 -1
  12. package/dist/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.js +8 -5
  13. package/dist/filtersBar/filtersContainer/filtersContainer.js +7 -4
  14. package/dist/index.css +134 -4
  15. package/dist/index.d.ts +6 -1
  16. package/dist/index.js +12 -3
  17. package/dist/modal/modal.d.ts +48 -0
  18. package/dist/modal/modal.js +37 -7
  19. package/dist/nav/navHeader/navHeaderSearch/navHeaderSearch.js +1 -1
  20. package/dist/pillExpandable/pillExpandable.js +6 -3
  21. package/dist/rangeRaw/components/rangeField.d.ts +2 -1
  22. package/dist/rangeRaw/components/rangeField.js +4 -3
  23. package/dist/rangeRaw/rangeRaw.js +8 -5
  24. package/dist/rangeRaw/types.d.ts +1 -0
  25. package/dist/sidePanel/sidePanel.js +3 -2
  26. package/dist/table/selectable/interfaces.d.ts +13 -0
  27. package/dist/table/selectable/useSelectableRows.js +46 -12
  28. package/dist/table/selectable/utils/calculateSelectionState.js +35 -0
  29. package/dist/table/selectable/utils/isRowChecked.js +12 -1
  30. package/dist/table/table.d.ts +2 -0
  31. package/dist/table/table.js +3 -1
  32. package/dist/tabs/tabs.js +14 -5
  33. package/dist/textInputRaw/textInputRaw.js +1 -1
  34. package/dist/textInputRaw/types.d.ts +1 -0
  35. package/dist/tooltip/components/inlineTrigger.d.ts +43 -0
  36. package/dist/tooltip/components/inlineTrigger.js +42 -0
  37. package/dist/tooltip/tooltip.d.ts +5 -2
  38. package/dist/tooltip/tooltip.js +15 -4
  39. package/dist/trendIndicator/trendIndicator.d.ts +47 -0
  40. package/dist/trendIndicator/trendIndicator.js +47 -0
  41. package/dist/trendIndicator/trendIndicatorUtils.d.ts +9 -0
  42. package/dist/trendIndicator/trendIndicatorUtils.js +18 -0
  43. package/dist/utils/experimentalFeatures/experimentalContext.d.ts +17 -0
  44. package/dist/utils/experimentalFeatures/experimentalContext.js +29 -0
  45. package/dist/utils/experimentalFeatures/index.d.ts +4 -0
  46. package/dist/utils/experimentalFeatures/index.js +9 -0
  47. package/dist/utils/experimentalFeatures/registry.d.ts +13 -0
  48. package/dist/utils/experimentalFeatures/registry.js +11 -0
  49. package/dist/utils/experimentalFeatures/useExperimentalFeature.d.ts +3 -0
  50. package/dist/utils/experimentalFeatures/useExperimentalFeature.js +25 -0
  51. package/dist/utils/localization/translations/ar.json +1 -1
  52. package/dist/utils/localization/translations/bg-BG.json +1 -1
  53. package/dist/utils/localization/translations/cs.json +1 -1
  54. package/dist/utils/localization/translations/da-DK.json +1 -1
  55. package/dist/utils/localization/translations/de.json +1 -1
  56. package/dist/utils/localization/translations/el-GR.json +1 -1
  57. package/dist/utils/localization/translations/en.json +1 -1
  58. package/dist/utils/localization/translations/es.json +1 -1
  59. package/dist/utils/localization/translations/et-EE.json +1 -1
  60. package/dist/utils/localization/translations/fi-FI.json +1 -1
  61. package/dist/utils/localization/translations/fr-FR.json +1 -1
  62. package/dist/utils/localization/translations/fr.json +1 -1
  63. package/dist/utils/localization/translations/hu-HU.json +1 -1
  64. package/dist/utils/localization/translations/id.json +1 -1
  65. package/dist/utils/localization/translations/it.json +1 -1
  66. package/dist/utils/localization/translations/ja.json +1 -1
  67. package/dist/utils/localization/translations/ka-GE.json +1 -1
  68. package/dist/utils/localization/translations/ko-KR.json +1 -1
  69. package/dist/utils/localization/translations/lt-LT.json +1 -1
  70. package/dist/utils/localization/translations/lv-LV.json +1 -1
  71. package/dist/utils/localization/translations/ms.json +1 -1
  72. package/dist/utils/localization/translations/nb-NO.json +1 -1
  73. package/dist/utils/localization/translations/nl.json +1 -1
  74. package/dist/utils/localization/translations/pl.json +1 -1
  75. package/dist/utils/localization/translations/pt-BR.json +1 -1
  76. package/dist/utils/localization/translations/pt-PT.json +1 -1
  77. package/dist/utils/localization/translations/ro-RO.json +1 -1
  78. package/dist/utils/localization/translations/sk-SK.json +1 -1
  79. package/dist/utils/localization/translations/sv.json +1 -1
  80. package/dist/utils/localization/translations/th.json +1 -1
  81. package/dist/utils/localization/translations/tr.json +1 -1
  82. package/dist/utils/localization/translations/zh-Hans.json +1 -1
  83. package/dist/utils/localization/translations/zh-TW.json +1 -1
  84. package/esm/absolute/absolute.js +1 -1
  85. package/esm/betaPill/betaPill.js +9 -9
  86. package/esm/commonHelpers/arrowNavigation/arrowNavigationHelper.d.ts +1 -0
  87. package/esm/commonHelpers/arrowNavigation/arrowNavigationHelper.js +3 -0
  88. package/esm/commonHelpers/hooks/useTrapFocus.d.ts +9 -0
  89. package/esm/commonHelpers/hooks/useTrapFocus.js +67 -15
  90. package/esm/controlledPopup/controlledPopup.d.ts +1 -1
  91. package/esm/controlledPopup/controlledPopup.js +1 -1
  92. package/esm/dropdownRaw/dropdownSearchableTrigger.js +1 -1
  93. package/esm/filtersBar/components/filtersBarRange/filtersBarRange.d.ts +1 -1
  94. package/esm/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.d.ts +1 -1
  95. package/esm/filtersBar/filtersBarSidePanel/components/filtersBarSidePanelRange/filtersBarSidePanelRange.js +8 -5
  96. package/esm/filtersBar/filtersContainer/filtersContainer.js +7 -4
  97. package/esm/index.d.ts +6 -1
  98. package/esm/index.js +5 -1
  99. package/esm/modal/modal.d.ts +48 -0
  100. package/esm/modal/modal.js +37 -7
  101. package/esm/nav/navHeader/navHeaderSearch/navHeaderSearch.js +1 -1
  102. package/esm/pillExpandable/pillExpandable.js +6 -3
  103. package/esm/rangeRaw/components/rangeField.d.ts +2 -1
  104. package/esm/rangeRaw/components/rangeField.js +4 -3
  105. package/esm/rangeRaw/rangeRaw.js +8 -5
  106. package/esm/rangeRaw/types.d.ts +1 -0
  107. package/esm/sidePanel/sidePanel.js +3 -2
  108. package/esm/table/selectable/interfaces.d.ts +13 -0
  109. package/esm/table/selectable/useSelectableRows.js +46 -12
  110. package/esm/table/selectable/utils/calculateSelectionState.js +35 -0
  111. package/esm/table/selectable/utils/isRowChecked.js +12 -1
  112. package/esm/table/table.d.ts +2 -0
  113. package/esm/table/table.js +2 -0
  114. package/esm/tabs/tabs.js +14 -5
  115. package/esm/testHelpers/renderWithFeatures.d.ts +4 -0
  116. package/esm/testHelpers/renderWithFeatures.js +6 -0
  117. package/esm/textInputRaw/textInputRaw.js +1 -1
  118. package/esm/textInputRaw/types.d.ts +1 -0
  119. package/esm/tooltip/components/inlineTrigger.d.ts +43 -0
  120. package/esm/tooltip/components/inlineTrigger.js +38 -0
  121. package/esm/tooltip/tooltip.d.ts +5 -2
  122. package/esm/tooltip/tooltip.js +15 -4
  123. package/esm/trendIndicator/trendIndicator.d.ts +47 -0
  124. package/esm/trendIndicator/trendIndicator.js +43 -0
  125. package/esm/trendIndicator/trendIndicatorUtils.d.ts +9 -0
  126. package/esm/trendIndicator/trendIndicatorUtils.js +14 -0
  127. package/esm/utils/experimentalFeatures/experimentalContext.d.ts +17 -0
  128. package/esm/utils/experimentalFeatures/experimentalContext.js +25 -0
  129. package/esm/utils/experimentalFeatures/index.d.ts +4 -0
  130. package/esm/utils/experimentalFeatures/index.js +3 -0
  131. package/esm/utils/experimentalFeatures/registry.d.ts +13 -0
  132. package/esm/utils/experimentalFeatures/registry.js +8 -0
  133. package/esm/utils/experimentalFeatures/useExperimentalFeature.d.ts +3 -0
  134. package/esm/utils/experimentalFeatures/useExperimentalFeature.js +21 -0
  135. package/esm/utils/localization/translations/ar.json +1 -1
  136. package/esm/utils/localization/translations/bg-BG.json +1 -1
  137. package/esm/utils/localization/translations/cs.json +1 -1
  138. package/esm/utils/localization/translations/da-DK.json +1 -1
  139. package/esm/utils/localization/translations/de.json +1 -1
  140. package/esm/utils/localization/translations/el-GR.json +1 -1
  141. package/esm/utils/localization/translations/en.json +1 -1
  142. package/esm/utils/localization/translations/es.json +1 -1
  143. package/esm/utils/localization/translations/et-EE.json +1 -1
  144. package/esm/utils/localization/translations/fi-FI.json +1 -1
  145. package/esm/utils/localization/translations/fr-FR.json +1 -1
  146. package/esm/utils/localization/translations/fr.json +1 -1
  147. package/esm/utils/localization/translations/hu-HU.json +1 -1
  148. package/esm/utils/localization/translations/id.json +1 -1
  149. package/esm/utils/localization/translations/it.json +1 -1
  150. package/esm/utils/localization/translations/ja.json +1 -1
  151. package/esm/utils/localization/translations/ka-GE.json +1 -1
  152. package/esm/utils/localization/translations/ko-KR.json +1 -1
  153. package/esm/utils/localization/translations/lt-LT.json +1 -1
  154. package/esm/utils/localization/translations/lv-LV.json +1 -1
  155. package/esm/utils/localization/translations/ms.json +1 -1
  156. package/esm/utils/localization/translations/nb-NO.json +1 -1
  157. package/esm/utils/localization/translations/nl.json +1 -1
  158. package/esm/utils/localization/translations/pl.json +1 -1
  159. package/esm/utils/localization/translations/pt-BR.json +1 -1
  160. package/esm/utils/localization/translations/pt-PT.json +1 -1
  161. package/esm/utils/localization/translations/ro-RO.json +1 -1
  162. package/esm/utils/localization/translations/sk-SK.json +1 -1
  163. package/esm/utils/localization/translations/sv.json +1 -1
  164. package/esm/utils/localization/translations/th.json +1 -1
  165. package/esm/utils/localization/translations/tr.json +1 -1
  166. package/esm/utils/localization/translations/zh-Hans.json +1 -1
  167. package/esm/utils/localization/translations/zh-TW.json +1 -1
  168. package/package.json +36 -16
  169. package/dist/banner/utils/isBannerTarget.d.ts +0 -1
  170. package/dist/banner/utils/isBannerTarget.js +0 -11
  171. package/esm/banner/utils/isBannerTarget.d.ts +0 -1
  172. package/esm/banner/utils/isBannerTarget.js +0 -7
@@ -111,7 +111,7 @@ const Absolute = ({ isOpen, id, paddingX, paddingY, className, children, trigger
111
111
  returnFocusToTrigger();
112
112
  }
113
113
  }, [isOpen, returnFocusToTrigger]);
114
- const condition = (0, react_1.useCallback)(() => (useTrapFocusWithTrigger === "off" ? false : true), [useTrapFocusWithTrigger]);
114
+ const condition = (0, react_1.useCallback)((subscriptionTrigger) => useTrapFocusWithTrigger !== "off" && !!subscriptionTrigger, [useTrapFocusWithTrigger]);
115
115
  (0, useTrapFocus_1.useTrapFocus)(popupRef, useTrapFocusWithTrigger === "withTrigger" ? triggerRef : undefined, isOpen, condition);
116
116
  (0, useEscape_1.useEscape)(popupRef, handleEscape, isOpen);
117
117
  (0, useArrowKey_1.useArrowKey)(popupRef, handleEscape, isOpen);
@@ -162,15 +162,15 @@ const BetaPill = props => {
162
162
  const isMobile = (0, useMobile_1.useMobile)();
163
163
  const pillClasses = (0, react_1.useMemo)(() => (0, classNames_1.classNames)(["zen-caption", "zen-beta-pill", isMobile ? "zen-beta-pill--mobile" : "", className !== null && className !== void 0 ? className : ""]), [isMobile, className]);
164
164
  const contextActions = (0, betaPillContext_1.useBetaPillActions)();
165
- let resolvedMainAction = feedbackAction || (contextActions === null || contextActions === void 0 ? void 0 : contextActions.feedbackAction);
166
- let resolvedSecondaryAction = betaOptionAction || (contextActions === null || contextActions === void 0 ? void 0 : contextActions.betaOptionAction);
167
- if (resolvedMainAction || resolvedSecondaryAction) {
168
- resolvedMainAction = Object.assign(Object.assign({}, resolvedMainAction), {
169
- text: (resolvedMainAction === null || resolvedMainAction === void 0 ? void 0 : resolvedMainAction.text) || translate("Send feedback")
170
- });
171
- resolvedSecondaryAction = Object.assign(Object.assign({}, resolvedSecondaryAction), {
172
- text: (resolvedSecondaryAction === null || resolvedSecondaryAction === void 0 ? void 0 : resolvedSecondaryAction.text) || translate("Manage beta option")
173
- });
165
+ const rawMainAction = feedbackAction || (contextActions === null || contextActions === void 0 ? void 0 : contextActions.feedbackAction);
166
+ const rawSecondaryAction = betaOptionAction || (contextActions === null || contextActions === void 0 ? void 0 : contextActions.betaOptionAction);
167
+ if (rawMainAction || rawSecondaryAction) {
168
+ const resolvedMainAction = rawMainAction ? Object.assign(Object.assign({}, rawMainAction), {
169
+ text: rawMainAction.text || translate("Send feedback")
170
+ }) : undefined;
171
+ const resolvedSecondaryAction = rawSecondaryAction ? Object.assign(Object.assign({}, rawSecondaryAction), {
172
+ text: rawSecondaryAction.text || translate("Manage beta option")
173
+ }) : undefined;
174
174
  return (0, jsx_runtime_1.jsx)(pillExpandable_1.PillExpandable, {
175
175
  isBeta: true,
176
176
  icon: iconLab_1.IconLab,
@@ -5,6 +5,7 @@ interface IScrollOptions {
5
5
  top: number;
6
6
  left: number;
7
7
  }
8
+ export declare const getDirectionalScrollDelta: (delta: number, isRTL: boolean) => number;
8
9
  export declare const getScrollOptions: (action: string, element: HTMLElement | null, isRTL?: boolean) => IScrollOptions;
9
10
  export declare const extractButtonAction: (event: React.MouseEvent<HTMLElement>) => TArrowsNavValue | null;
10
11
  export declare const scrollElement: (element: HTMLElement, options: IScrollOptions) => void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.scrollElement = exports.extractButtonAction = exports.getScrollOptions = exports.clearTimerTimeout = exports.clearTimerInterval = void 0;
3
+ exports.scrollElement = exports.extractButtonAction = exports.getScrollOptions = exports.getDirectionalScrollDelta = exports.clearTimerTimeout = exports.clearTimerInterval = void 0;
4
4
  const zen_1 = require("../../utils/zen");
5
5
  const clearTimerInterval = (timerId) => {
6
6
  var _a;
@@ -38,6 +38,10 @@ const getLTRScrollLeft = (action, scrollLeft, step, element) => {
38
38
  }
39
39
  return scrollLeft;
40
40
  };
41
+ // In RTL the horizontal scroll axis is inverted: scrollLeft is 0 at the right edge and goes negative
42
+ // toward the left edge, so a delta meant to move the viewport toward the arrow must flip sign.
43
+ const getDirectionalScrollDelta = (delta, isRTL) => (isRTL ? -delta : delta);
44
+ exports.getDirectionalScrollDelta = getDirectionalScrollDelta;
41
45
  const getScrollOptions = (action, element, isRTL = false) => {
42
46
  const step = (element === null || element === void 0 ? void 0 : element.offsetWidth) ? element.offsetWidth : 100;
43
47
  const scrollTop = (element === null || element === void 0 ? void 0 : element.scrollTop) || 0;
@@ -1,4 +1,13 @@
1
1
  import { RefObject } from "react";
2
2
  type TElementToBool = (element: HTMLElement) => boolean;
3
+ /**
4
+ * Traps keyboard (Tab) focus within `containerRef` (and optionally its `triggerRef`).
5
+ *
6
+ * Nested-popup contract: for correct nested-popup behaviour, a focused element that triggers an
7
+ * open child popup must expose a `data-popup-id` attribute whose value is the `id` of the child
8
+ * popup element rendered in the DOM. When present, focus is deferred to that child popup's trap.
9
+ * This contract is fulfilled automatically by `ControlledPopup`; callers using `useTrapFocus`
10
+ * directly must set `data-popup-id` themselves or nested popups will silently lose focus handling.
11
+ */
3
12
  export declare const useTrapFocus: (containerRef: RefObject<HTMLElement | null>, triggerRef: RefObject<HTMLElement | null> | undefined, subscriptionTrigger: unknown, condition?: (t: unknown) => boolean, isElementVisible?: TElementToBool) => void;
4
13
  export {};
@@ -9,18 +9,38 @@ const isChildOf_1 = require("../../utils/isChildOf");
9
9
  const isElementHidden_1 = require("../../utils/isElementHidden");
10
10
  const zen_1 = require("../../utils/zen");
11
11
  const findFirstVisible = (elems, isElementVisible) => elems.find(elem => isElementVisible(elem));
12
+ /**
13
+ * Traps keyboard (Tab) focus within `containerRef` (and optionally its `triggerRef`).
14
+ *
15
+ * Nested-popup contract: for correct nested-popup behaviour, a focused element that triggers an
16
+ * open child popup must expose a `data-popup-id` attribute whose value is the `id` of the child
17
+ * popup element rendered in the DOM. When present, focus is deferred to that child popup's trap.
18
+ * This contract is fulfilled automatically by `ControlledPopup`; callers using `useTrapFocus`
19
+ * directly must set `data-popup-id` themselves or nested popups will silently lose focus handling.
20
+ */
12
21
  const useTrapFocus = (containerRef, triggerRef, subscriptionTrigger, condition, isElementVisible) => {
13
22
  /* eslint-disable complexity */
14
23
  const handleKeyDown = (0, react_1.useCallback)(e => {
15
- var _a, _b, _c, _d, _e, _f;
24
+ var _a, _b, _c, _d, _e, _f, _g;
16
25
  /* eslint-enable complexity */
17
26
  const getChildCondition = () => {
18
- var _a, _b;
27
+ var _a, _b, _c;
28
+ const targetEl = e.target;
29
+ // If the target is a trigger for an open child popup, defer to that popup's
30
+ // focus trap. Key on data-popup-id + DOM presence so this works even when
31
+ // preventAttributesAutoSet suppresses aria-expanded.
32
+ const dataPopupId = targetEl.getAttribute("data-popup-id");
33
+ if (dataPopupId &&
34
+ ((_a = zen_1.zen.document) === null || _a === void 0 ? void 0 : _a.getElementById(dataPopupId)) &&
35
+ (0, isChildOf_1.isChildOf)(targetEl, containerRef.current) &&
36
+ targetEl !== (triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current)) {
37
+ return true;
38
+ }
19
39
  return triggerRef
20
- ? !(0, isChildOf_1.isChildOf)(e.target, containerRef.current) &&
21
- e.target !== ((_a = zen_1.zen.document) === null || _a === void 0 ? void 0 : _a.body) &&
22
- !(0, isChildOf_1.isChildOf)(e.target, triggerRef.current)
23
- : !(0, isChildOf_1.isChildOf)(e.target, containerRef.current) && e.target !== ((_b = zen_1.zen.document) === null || _b === void 0 ? void 0 : _b.body);
40
+ ? !(0, isChildOf_1.isChildOf)(targetEl, containerRef.current) &&
41
+ targetEl !== ((_b = zen_1.zen.document) === null || _b === void 0 ? void 0 : _b.body) &&
42
+ !(0, isChildOf_1.isChildOf)(targetEl, triggerRef.current)
43
+ : !(0, isChildOf_1.isChildOf)(targetEl, containerRef.current) && targetEl !== ((_c = zen_1.zen.document) === null || _c === void 0 ? void 0 : _c.body);
24
44
  };
25
45
  if (!containerRef.current || getChildCondition()) {
26
46
  return;
@@ -30,9 +50,14 @@ const useTrapFocus = (containerRef, triggerRef, subscriptionTrigger, condition,
30
50
  : !(0, dialogHelpers_1.isElementInsideContainer)(target, containerEl.current) &&
31
51
  !(0, dialogHelpers_1.isElementInsideContainer)(target, triggerEl.current);
32
52
  const isTargetOutside = e.target ? checkIsElementOutside(e.target, containerRef, triggerRef) : undefined;
33
- const triggerSelectors = ((_a = triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current) === null || _a === void 0 ? void 0 : _a.querySelectorAll(focusableSelector_1.FOCUSABLE_SELECTOR)) || [];
53
+ const triggerElement = (_a = triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current) !== null && _a !== void 0 ? _a : null;
54
+ const triggerSelf = (triggerElement === null || triggerElement === void 0 ? void 0 : triggerElement.matches(focusableSelector_1.FOCUSABLE_SELECTOR)) ? [triggerElement] : [];
55
+ const triggerChildren = Array.from((_b = triggerElement === null || triggerElement === void 0 ? void 0 : triggerElement.querySelectorAll(focusableSelector_1.FOCUSABLE_SELECTOR)) !== null && _b !== void 0 ? _b : []);
56
+ // querySelectorAll only returns descendants (never the element itself), so triggerSelf
57
+ // and triggerChildren are disjoint by definition and need no deduplication.
58
+ const triggerSelectors = [...triggerSelf, ...triggerChildren];
34
59
  const containerSelectors = containerRef.current.querySelectorAll(focusableSelector_1.FOCUSABLE_SELECTOR);
35
- const focusable = triggerRef ? [...Array.from(triggerSelectors), ...Array.from(containerSelectors)] : [...Array.from(containerSelectors)];
60
+ const focusable = triggerRef ? [...triggerSelectors, ...Array.from(containerSelectors)] : [...Array.from(containerSelectors)];
36
61
  if (!focusable.length) {
37
62
  return;
38
63
  }
@@ -49,32 +74,59 @@ const useTrapFocus = (containerRef, triggerRef, subscriptionTrigger, condition,
49
74
  return;
50
75
  }
51
76
  if (e.shiftKey) {
52
- if (((_b = zen_1.zen.document) === null || _b === void 0 ? void 0 : _b.activeElement) === first) {
77
+ if (((_c = zen_1.zen.document) === null || _c === void 0 ? void 0 : _c.activeElement) === first) {
53
78
  e.preventDefault();
54
79
  last === null || last === void 0 ? void 0 : last.focus();
55
80
  return;
56
81
  }
57
- if (firstContainerFocusable && ((_c = zen_1.zen.document) === null || _c === void 0 ? void 0 : _c.activeElement) === firstContainerFocusable) {
82
+ if (firstContainerFocusable && ((_d = zen_1.zen.document) === null || _d === void 0 ? void 0 : _d.activeElement) === firstContainerFocusable) {
58
83
  e.preventDefault();
59
84
  lastTriggerFocusable === null || lastTriggerFocusable === void 0 ? void 0 : lastTriggerFocusable.focus();
60
85
  }
61
86
  return;
62
87
  }
63
- if (((_d = zen_1.zen.document) === null || _d === void 0 ? void 0 : _d.activeElement) === last) {
88
+ if (((_e = zen_1.zen.document) === null || _e === void 0 ? void 0 : _e.activeElement) === last) {
64
89
  e.preventDefault();
65
90
  first === null || first === void 0 ? void 0 : first.focus();
66
91
  return;
67
92
  }
68
- if (lastTriggerFocusable && ((_e = zen_1.zen.document) === null || _e === void 0 ? void 0 : _e.activeElement) === lastTriggerFocusable) {
93
+ if (lastTriggerFocusable && ((_f = zen_1.zen.document) === null || _f === void 0 ? void 0 : _f.activeElement) === lastTriggerFocusable) {
69
94
  e.preventDefault();
70
95
  firstContainerFocusable === null || firstContainerFocusable === void 0 ? void 0 : firstContainerFocusable.focus();
71
96
  }
72
- else if (isLastChildOfFirst && first && (0, isChildOf_1.isChildOf)((_f = zen_1.zen.document) === null || _f === void 0 ? void 0 : _f.activeElement, first)) {
97
+ else if (isLastChildOfFirst && first && (0, isChildOf_1.isChildOf)((_g = zen_1.zen.document) === null || _g === void 0 ? void 0 : _g.activeElement, first)) {
73
98
  e.preventDefault();
74
99
  }
75
100
  return;
76
101
  }
77
- }, [containerRef, triggerRef, isElementVisible]);
102
+ },
103
+ // condition is consumed by useKeydown below, not read by handleKeyDown directly; its absence from deps is intentional.
104
+ [containerRef, triggerRef, isElementVisible]);
78
105
  (0, useKeydown_1.useKeydown)(handleKeyDown, subscriptionTrigger, condition);
106
+ // When withTrigger mode closes (condition goes false), restore focus to the trigger
107
+ // if focus landed on body (which happens when the popup's focused element is unmounted).
108
+ // This restoration is intentionally scoped to the "focused element unmounted → body" case;
109
+ // the general close case (e.g. click-outside, item selection) is handled separately by the
110
+ // returnFocusToTrigger effect in absolute.tsx. Both are idempotent, so overlap is harmless.
111
+ // Initialized to false because popups mount closed; the guard below reconciles the first
112
+ // active/inactive edge, so a popup that mounts already open still resolves correctly.
113
+ const isActiveRef = (0, react_1.useRef)(false);
114
+ (0, react_1.useEffect)(() => {
115
+ var _a, _b;
116
+ const isActive = condition ? condition(subscriptionTrigger) : !!subscriptionTrigger;
117
+ // Guard: short-circuit when the raw open/close state is unchanged to avoid spurious
118
+ // focus restoration if an unstable condition reference re-fires this effect.
119
+ if (!!subscriptionTrigger === isActiveRef.current) {
120
+ isActiveRef.current = isActive;
121
+ return;
122
+ }
123
+ if (!isActive && isActiveRef.current && (triggerRef === null || triggerRef === void 0 ? void 0 : triggerRef.current)) {
124
+ const active = (_a = zen_1.zen.document) === null || _a === void 0 ? void 0 : _a.activeElement;
125
+ if (!active || active === ((_b = zen_1.zen.document) === null || _b === void 0 ? void 0 : _b.body)) {
126
+ triggerRef.current.focus();
127
+ }
128
+ }
129
+ isActiveRef.current = isActive;
130
+ }, [condition, subscriptionTrigger, triggerRef]);
79
131
  };
80
132
  exports.useTrapFocus = useTrapFocus;
@@ -10,7 +10,7 @@ import { IAlignment } from "../utils/positioningUtils/alignments";
10
10
  export type TAlignment = "top" | "top-left" | "top-right" | "left" | "left-top" | "left-bottom" | "right" | "right-top" | "right-bottom" | "bottom" | "bottom-left" | "bottom-right";
11
11
  export interface IControlledPopup extends IZenComponentProps {
12
12
  triggerRef: RefObject<HTMLElement | null>;
13
- /** Alignment of the popup relative to its trigger. Defaults to `"bottom-left"` (flips to `"bottom-right"` in RTL). */
13
+ /** Alignment of the popup relative to its trigger. Defaults to `"bottom-start"`. */
14
14
  alignment?: TAlignmentAbsolute;
15
15
  id?: string;
16
16
  className?: string;
@@ -11,7 +11,7 @@ const ControlledPopup = ({ isOpen, id, paddingX, paddingY, triggerRef, className
11
11
  const autoId = (0, react_1.useId)();
12
12
  const popupId = id || autoId;
13
13
  const isClientReady = (0, useClientReady_1.useClientReady)();
14
- const rtlAlignment = (0, useRTLAlignment_1.useRTLAlignment)(alignment !== null && alignment !== void 0 ? alignment : "bottom-left");
14
+ const rtlAlignment = (0, useRTLAlignment_1.useRTLAlignment)(alignment !== null && alignment !== void 0 ? alignment : "bottom-start");
15
15
  (0, react_1.useEffect)(() => {
16
16
  if (!triggerRef.current || !isClientReady) {
17
17
  return;
@@ -183,7 +183,7 @@ const DropdownSearchableTrigger = _a => {
183
183
  } = _a,
184
184
  otherProps = __rest(_a, ["value", "className", "onChange", "placeholder", "isOpenPopup", "inputRef", "handleClick", "width", "title", "id", "disabled", "count", "currentSelection", "isError", "fullWidth", "ref", "name", "onBlur", "popupId", "handleFocusOnPopup", "dataAnalyticsId"])
185
185
  // eslint-disable-next-line complexity
186
- ;
186
+ ;
187
187
  const {
188
188
  isFormSection
189
189
  } = (0, react_1.useContext)(formSectionProvider_1.FormSectionContext);
@@ -3,7 +3,7 @@ import { IRange, IRangeValues } from "../../../range/range";
3
3
  export interface IFiltersBarRangeState {
4
4
  value: IRangeValues;
5
5
  }
6
- interface IFiltersBarRangeProps extends Pick<IRange, "id" | "defaultValue" | "unit" | "labelMin" | "labelMax" | "disabled" | "label" | "triggerAriaLabel" | "min" | "max" | "fullWidthTriggerButton" | "fullBounded" | "className" | "allowEqualMinMax"> {
6
+ interface IFiltersBarRangeProps extends Pick<IRange, "id" | "defaultValue" | "unit" | "labelMin" | "labelMax" | "disabled" | "label" | "triggerAriaLabel" | "min" | "max" | "fullWidthTriggerButton" | "fullBounded" | "className" | "allowEqualMinMax" | "integer"> {
7
7
  }
8
8
  export interface IFiltersBarRange extends IFiltersBarItem<IFiltersBarRangeState, IFiltersBarRangeProps> {
9
9
  className?: string;
@@ -2,4 +2,4 @@ import "./filtersBarSidePanelRange.less";
2
2
  import { IRange } from "../../../../range/range";
3
3
  export interface IFiltersBarSidePanelRange extends Omit<IRange, "label" | "fullWidthTriggerButton" | "defaultValue"> {
4
4
  }
5
- export declare const FiltersBarSidePanelRange: ({ className, id, onChange, value, unit, min, max, fullBounded, allowEqualMinMax, labelMin, labelMax, disabled }: IFiltersBarSidePanelRange) => import("react/jsx-runtime").JSX.Element;
5
+ export declare const FiltersBarSidePanelRange: ({ className, id, onChange, value, unit, min, max, fullBounded, allowEqualMinMax, labelMin, labelMax, disabled, integer }: IFiltersBarSidePanelRange) => import("react/jsx-runtime").JSX.Element;
@@ -94,7 +94,8 @@ const FiltersBarSidePanelRange = ({
94
94
  allowEqualMinMax,
95
95
  labelMin,
96
96
  labelMax,
97
- disabled
97
+ disabled,
98
+ integer
98
99
  }) => {
99
100
  const generatedId = (0, react_1.useId)();
100
101
  const intId = id || generatedId;
@@ -153,8 +154,9 @@ const FiltersBarSidePanelRange = ({
153
154
  min: min,
154
155
  isMinField: true,
155
156
  direction: directionState,
156
- disabled: disabled
157
- }), [rangeFieldClasses, labelMin, translate, unit, currentValue.min, errorType, min, max, handleChange, directionState, disabled]);
157
+ disabled: disabled,
158
+ integer: integer
159
+ }), [rangeFieldClasses, labelMin, translate, unit, currentValue.min, errorType, min, max, handleChange, directionState, disabled, integer]);
158
160
  const memoizedMaxRangeField = (0, react_1.useMemo)(() => (0, jsx_runtime_1.jsx)(rangeField_1.RangeField, {
159
161
  className: (0, classNames_1.classNames)([rangeFieldClasses, "zen-filters-bar-side-panel-range__max-field"]),
160
162
  label: labelMax || translate("Max"),
@@ -168,8 +170,9 @@ const FiltersBarSidePanelRange = ({
168
170
  min: min,
169
171
  isMinField: false,
170
172
  direction: directionState,
171
- disabled: disabled
172
- }), [rangeFieldClasses, labelMax, translate, unit, currentValue.max, errorType, min, max, handleChange, directionState, disabled]);
173
+ disabled: disabled,
174
+ integer: integer
175
+ }), [rangeFieldClasses, labelMax, translate, unit, currentValue.max, errorType, min, max, handleChange, directionState, disabled, integer]);
173
176
  return (0, jsx_runtime_1.jsxs)("div", {
174
177
  ref: setFieldsContainerRef,
175
178
  id: intId,
@@ -17,6 +17,7 @@ const useDirectionalIcon_1 = require("../../utils/localization/useDirectionalIco
17
17
  const useLanguage_1 = require("../../utils/localization/useLanguage");
18
18
  const useDriveClassName_1 = require("../../utils/theme/useDriveClassName");
19
19
  const useIsRTL_1 = require("../../utils/localization/useIsRTL");
20
+ const arrowNavigationHelper_1 = require("../../commonHelpers/arrowNavigation/arrowNavigationHelper");
20
21
  const zen_1 = require("../../utils/zen");
21
22
  injectString("cs", "Scroll to start", "P\u0159ej\xEDt na za\u010D\xE1tek");
22
23
  injectString("da-DK", "Scroll to start", "Rul til start");
@@ -92,13 +93,15 @@ const getScrollButtonType = (element, isRTL) => {
92
93
  return "";
93
94
  }
94
95
  if (isRTL) {
96
+ // scrollLeft is 0 at the start (right edge) and negative toward the end (left edge),
97
+ // so the button to offer is the mirror of the LTR case below.
95
98
  if (scrollLeft < -1 && scrollLeft > clientWidth - scrollWidth + 1) {
96
99
  return "both";
97
100
  }
98
101
  if (scrollLeft >= -1) {
99
- return "start";
102
+ return "end";
100
103
  }
101
- return "end";
104
+ return "start";
102
105
  }
103
106
  if (scrollLeft > 0 && scrollWidth > clientWidth + scrollLeft + 1) {
104
107
  return "both";
@@ -234,7 +237,7 @@ const FiltersContainer = ({
234
237
  className: (0, classNames_1.classNames)(["zen-filters-toolbar__scroller", driveClassNameScroller || "", "zen-filters-toolbar__start", showLeft ? `${scrollerClass}--visible` : "", isHiddenDisplay.left ? `${scrollerClass}--hidden` : ""]),
235
238
  icon: ScrollStartIcon,
236
239
  iconPosition: textIconButton_1.ButtonIconPosition.Start,
237
- onClick: handleScrollButtonClick(-scrollableStep)
240
+ onClick: handleScrollButtonClick((0, arrowNavigationHelper_1.getDirectionalScrollDelta)(-scrollableStep, isRTL))
238
241
  }), (0, jsx_runtime_1.jsx)("div", {
239
242
  ref: scrollableRef,
240
243
  className: (0, classNames_1.classNames)(["zen-filters-toolbar__scrollable", !isHiddenDisplay.left ? "has-left-scroller" : "", !isHiddenDisplay.right ? "has-right-scroller" : ""]),
@@ -248,7 +251,7 @@ const FiltersContainer = ({
248
251
  title: translate("Scroll to end"),
249
252
  className: (0, classNames_1.classNames)([scrollerClass, driveClassNameScroller || "", "zen-filters-toolbar__end", showRight ? `${scrollerClass}--visible` : "", isHiddenDisplay.right ? `${scrollerClass}--hidden` : ""]),
250
253
  icon: ScrollEndIcon,
251
- onClick: handleScrollButtonClick(scrollableStep),
254
+ onClick: handleScrollButtonClick((0, arrowNavigationHelper_1.getDirectionalScrollDelta)(scrollableStep, isRTL)),
252
255
  iconPosition: textIconButton_1.ButtonIconPosition.End
253
256
  })]
254
257
  }) : null;
package/dist/index.css CHANGED
@@ -3403,6 +3403,29 @@ html:lang(ar) .zen-tooltip__title {
3403
3403
  .zen-shield-faded--visible {
3404
3404
  opacity: 0.1;
3405
3405
  }
3406
+ :where(.zen-tooltip-inline-trigger) {
3407
+ font: inherit;
3408
+ }
3409
+ .zen-tooltip-inline-trigger {
3410
+ display: inline;
3411
+ cursor: pointer;
3412
+ padding: 0;
3413
+ margin: 0;
3414
+ border: none;
3415
+ background: none;
3416
+ color: inherit;
3417
+ text-decoration: underline dotted;
3418
+ text-decoration-thickness: 15%;
3419
+ text-underline-offset: 0.25rem;
3420
+ border-radius: 0.125rem;
3421
+ outline-offset: 0.125rem;
3422
+ }
3423
+ .zen-tooltip-inline-trigger:focus-visible {
3424
+ outline: 0.125rem solid currentColor;
3425
+ }
3426
+ .zen-tooltip-inline-trigger:focus:not(:focus-visible) {
3427
+ outline: none;
3428
+ }
3406
3429
  .zen-tooltip-info {
3407
3430
  align-items: center;
3408
3431
  cursor: pointer;
@@ -4145,6 +4168,15 @@ html:lang(ar) .zen-side-panel {
4145
4168
  .zen-side-panel--shown .zen-form-field--new-component {
4146
4169
  display: flex;
4147
4170
  }
4171
+ .zen-side-panel--right-positioned {
4172
+ transform: translateX(100%);
4173
+ }
4174
+ [dir="rtl"] .zen-side-panel--right-positioned {
4175
+ transform: translateX(-100%);
4176
+ }
4177
+ .zen-side-panel.zen-side-panel--right-positioned.zen-side-panel--shown {
4178
+ transform: translateX(0);
4179
+ }
4148
4180
  .zen-side-panel--left-positioned {
4149
4181
  inset-inline-start: 0;
4150
4182
  inset-inline-end: auto;
@@ -4154,6 +4186,9 @@ html:lang(ar) .zen-side-panel {
4154
4186
  border-start-end-radius: var(--border-radius-default);
4155
4187
  border-end-end-radius: var(--border-radius-default);
4156
4188
  }
4189
+ [dir="rtl"] .zen-side-panel--left-positioned {
4190
+ transform: translateX(100%);
4191
+ }
4157
4192
  .zen-side-panel.zen-side-panel--left-positioned.zen-side-panel--shown {
4158
4193
  transform: translateX(0);
4159
4194
  }
@@ -6741,6 +6776,66 @@ html:lang(ar) .zen-table-number {
6741
6776
  .zen-feedExpandControl * {
6742
6777
  box-sizing: border-box;
6743
6778
  }
6779
+ .zen-trend-indicator {
6780
+ box-sizing: border-box;
6781
+ display: inline-flex;
6782
+ align-items: center;
6783
+ padding: 0.25rem 0;
6784
+ min-width: 0;
6785
+ max-width: 100%;
6786
+ }
6787
+ .zen-trend-indicator * {
6788
+ box-sizing: border-box;
6789
+ }
6790
+ .zen-trend-indicator__icon {
6791
+ flex-shrink: 0;
6792
+ }
6793
+ .zen-trend-indicator__value {
6794
+ font-family: Roboto, "Segoe UI", Segoe, "Helvetica Neue", Helvetica, sans-serif;
6795
+ font-size: 0.75rem;
6796
+ font-style: normal;
6797
+ font-weight: 400;
6798
+ letter-spacing: 0.02rem;
6799
+ line-height: 1rem;
6800
+ text-transform: none;
6801
+ text-decoration: none;
6802
+ overflow: hidden;
6803
+ text-overflow: ellipsis;
6804
+ white-space: nowrap;
6805
+ word-wrap: normal;
6806
+ color: var(--text-primary);
6807
+ min-width: 0;
6808
+ }
6809
+ html:lang(ar) .zen-trend-indicator__value {
6810
+ font-family: "Noto Sans Arabic", Roboto, "Segoe UI", Segoe, "Helvetica Neue", Helvetica, sans-serif;
6811
+ }
6812
+ .zen-trend-indicator__delta {
6813
+ font-family: Roboto, "Segoe UI", Segoe, "Helvetica Neue", Helvetica, sans-serif;
6814
+ font-size: 0.75rem;
6815
+ font-style: normal;
6816
+ font-weight: 400;
6817
+ letter-spacing: 0.02rem;
6818
+ line-height: 1rem;
6819
+ text-transform: none;
6820
+ text-decoration: none;
6821
+ flex-shrink: 0;
6822
+ margin-inline-start: 0.25rem;
6823
+ }
6824
+ html:lang(ar) .zen-trend-indicator__delta {
6825
+ font-family: "Noto Sans Arabic", Roboto, "Segoe UI", Segoe, "Helvetica Neue", Helvetica, sans-serif;
6826
+ }
6827
+ .zen-trend-indicator--positive .zen-trend-indicator__icon,
6828
+ .zen-trend-indicator--positive .zen-trend-indicator__delta {
6829
+ color: var(--accents-success--detail);
6830
+ }
6831
+ .zen-trend-indicator--negative .zen-trend-indicator__icon,
6832
+ .zen-trend-indicator--negative .zen-trend-indicator__delta {
6833
+ color: var(--accents-error--detail);
6834
+ }
6835
+ .zen-trend-indicator--neutral .zen-trend-indicator__icon,
6836
+ .zen-trend-indicator--neutral .zen-trend-indicator__delta {
6837
+ color: var(--text-secondary);
6838
+ }
6744
6839
  .zen-summary-tile {
6745
6840
  box-sizing: border-box;
6746
6841
  font-family: Roboto, "Segoe UI", Segoe, "Helvetica Neue", Helvetica, sans-serif;
@@ -7594,8 +7689,13 @@ html:lang(ar) .zen-pill-content {
7594
7689
  outline-offset: 2px;
7595
7690
  }
7596
7691
  .zen-pill-actionable__input {
7692
+ clip: rect(0 0 0 0);
7693
+ clip-path: inset(50%);
7694
+ height: 1px;
7695
+ overflow: hidden;
7597
7696
  position: absolute;
7598
- left: -5000px;
7697
+ white-space: nowrap;
7698
+ width: 1px;
7599
7699
  }
7600
7700
  .zen-pill-actionable__content-wrapper {
7601
7701
  margin: 0;
@@ -8650,8 +8750,13 @@ html:lang(ar) .zen-chip {
8650
8750
  cursor: pointer;
8651
8751
  }
8652
8752
  .zen-chip__input {
8753
+ clip: rect(0 0 0 0);
8754
+ clip-path: inset(50%);
8755
+ height: 1px;
8756
+ overflow: hidden;
8653
8757
  position: absolute;
8654
- left: -5000px;
8758
+ white-space: nowrap;
8759
+ width: 1px;
8655
8760
  }
8656
8761
  .zen-chip__content-wrapper {
8657
8762
  margin: 0;
@@ -15268,6 +15373,9 @@ html:lang(ar) .zen-page-header--mobile .zen-page-header__page-name {
15268
15373
  inset-inline-end: calc(2.25rem - 0.375rem);
15269
15374
  background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15270
15375
  }
15376
+ [dir="rtl"] .zen-tabs__gradient--right::before {
15377
+ background: linear-gradient(270deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15378
+ }
15271
15379
  .zen-tabs__gradient--right::after {
15272
15380
  position: absolute;
15273
15381
  content: "";
@@ -15295,6 +15403,9 @@ html:lang(ar) .zen-page-header--mobile .zen-page-header__page-name {
15295
15403
  inset-inline-start: calc(2.25rem - 0.375rem);
15296
15404
  background: linear-gradient(270deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15297
15405
  }
15406
+ [dir="rtl"] .zen-tabs__gradient--left::after {
15407
+ background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15408
+ }
15298
15409
  .zen-tabs__start {
15299
15410
  margin-inline-end: 0.5rem;
15300
15411
  inset-block-end: 0;
@@ -15338,6 +15449,9 @@ html:lang(ar) .zen-page-header--mobile .zen-page-header__page-name {
15338
15449
  inset-inline-start: calc(2.875rem - 0.5rem);
15339
15450
  background: linear-gradient(270deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15340
15451
  }
15452
+ [dir="rtl"] .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--mobile.zen-tabs__gradient--left::after {
15453
+ background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15454
+ }
15341
15455
  .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--mobile.zen-tabs__gradient--right::before {
15342
15456
  position: absolute;
15343
15457
  content: "";
@@ -15347,6 +15461,9 @@ html:lang(ar) .zen-page-header--mobile .zen-page-header__page-name {
15347
15461
  inset-inline-end: calc(2.875rem - 0.5rem);
15348
15462
  background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15349
15463
  }
15464
+ [dir="rtl"] .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--mobile.zen-tabs__gradient--right::before {
15465
+ background: linear-gradient(270deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15466
+ }
15350
15467
  .zen-tabs.zen-tabs--drive,
15351
15468
  .zen-tabs.zen-tabs--drive-tablet {
15352
15469
  height: 3rem;
@@ -15366,6 +15483,10 @@ html:lang(ar) .zen-page-header--mobile .zen-page-header__page-name {
15366
15483
  inset-inline-start: calc(3rem - 0.5rem);
15367
15484
  background: linear-gradient(270deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15368
15485
  }
15486
+ [dir="rtl"] .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--drive.zen-tabs__gradient--left::after,
15487
+ [dir="rtl"] .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--drive-tablet.zen-tabs__gradient--left::after {
15488
+ background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15489
+ }
15369
15490
  .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--drive.zen-tabs__gradient--right::before,
15370
15491
  .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--drive-tablet.zen-tabs__gradient--right::before {
15371
15492
  position: absolute;
@@ -15376,6 +15497,10 @@ html:lang(ar) .zen-page-header--mobile .zen-page-header__page-name {
15376
15497
  inset-inline-end: calc(3rem - 0.5rem);
15377
15498
  background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15378
15499
  }
15500
+ [dir="rtl"] .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--drive.zen-tabs__gradient--right::before,
15501
+ [dir="rtl"] .zen-tabs .zen-tabs__gradient.zen-tabs__gradient--drive-tablet.zen-tabs__gradient--right::before {
15502
+ background: linear-gradient(270deg, rgba(255, 255, 255, 0) 0%, var(--backgrounds-content-0) 100%);
15503
+ }
15379
15504
  .zen-tab-item {
15380
15505
  box-sizing: border-box;
15381
15506
  font-family: Roboto, "Segoe UI", Segoe, "Helvetica Neue", Helvetica, sans-serif;
@@ -15564,7 +15689,7 @@ html:lang(ar) .zen-tab-item.zen-tab-item--mobile .zen-tab-item__content-text {
15564
15689
  text-decoration: none;
15565
15690
  }
15566
15691
  .zen-tab-item:focus-visible {
15567
- outline: 1px solid var(--borders-form-field--active);
15692
+ outline: 1px solid var(--borders-secondary);
15568
15693
  outline-offset: -1px;
15569
15694
  }
15570
15695
  .zen-filters-toolbar {
@@ -19045,8 +19170,13 @@ html:lang(ar) .zen-pill-actionable__block {
19045
19170
  margin-right: 8px;
19046
19171
  }
19047
19172
  .zen-pill-actionable__input {
19173
+ clip: rect(0 0 0 0);
19174
+ clip-path: inset(50%);
19175
+ height: 1px;
19176
+ overflow: hidden;
19048
19177
  position: absolute;
19049
- left: -5000px;
19178
+ white-space: nowrap;
19179
+ width: 1px;
19050
19180
  }
19051
19181
  .zen-pill-actionable__input:hover + .zen-pill-actionable__block--actionable {
19052
19182
  background-color: var(--backgrounds-content-2);
package/dist/index.d.ts CHANGED
@@ -725,7 +725,7 @@ export { isButton } from "./menu/utils/isButton";
725
725
  export { isLink } from "./menu/utils/isLink";
726
726
  export { type IMiniTabElement, MiniTabsSize, type IMiniTabs, MiniTabs } from "./miniTabs/miniTabs";
727
727
  export { type IMobileSheet, MobileSheet } from "./mobileSheet/mobileSheet";
728
- export { type TFocusElement, type IModal, Modal, type IDialogContent, DialogContentNew } from "./modal/modal";
728
+ export { MODAL_SCROLL_LOCK_CLASS, type TFocusElement, type IModal, Modal, type IDialogContent, DialogContentNew } from "./modal/modal";
729
729
  export { getPredefinedFocusableItem } from "./modal/modalHelpers";
730
730
  export { type INotificationProps, Notification } from "./notification/notification";
731
731
  export { type IPageHeader, PageHeaderDisplayName, PageHeader } from "./pageHeader/pageHeader";
@@ -778,7 +778,12 @@ export { type IToggleButtonDefaultRaw, type IToggleButtonRaw, type IToggleButton
778
778
  export { calculateArrowPosition } from "./tooltip/helpers/calculateArrowPosition";
779
779
  export { removeArrowClasses } from "./tooltip/helpers/removeArrowClasses";
780
780
  export { type TooltipSize, type TMobileView, Tooltip } from "./tooltip/tooltip";
781
+ export { type TTrendIndicatorDirection, type TTrendIndicatorTone, type ITrendIndicator } from "./trendIndicator/trendIndicator";
782
+ export { getTrendIndicatorDirection } from "./trendIndicator/trendIndicatorUtils";
781
783
  export { type IAbortablePromiseOptions, type IAbortablePromiseConstructor, AbortablePromise } from "./utils/abortablePromise";
784
+ export { ZenithExperimentalProvider } from "./utils/experimentalFeatures/experimentalContext";
785
+ export { type ExperimentalFeatureId, EXPERIMENTAL_FLAGS } from "./utils/experimentalFeatures/registry";
786
+ export { useExperimentalFeature } from "./utils/experimentalFeatures/useExperimentalFeature";
782
787
  export { HeaderButtonsProvider } from "./utils/headerButtons/headerButtonsProvider";
783
788
  export { getNewFocusableItem, getFirstFocusableItem } from "./utils/keyboardHelpers";
784
789
  export { LanguageProvider } from "./utils/localization/languageProvider";