@redis-ui/components 41.4.1 → 42.0.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 (200) hide show
  1. package/README.md +330 -0
  2. package/dist/Button/Button.style.cjs +1 -1
  3. package/dist/Button/Button.style.js +1 -1
  4. package/dist/Button/Button.types.cjs +1 -1
  5. package/dist/Button/Button.types.d.ts +1 -1
  6. package/dist/Button/Button.types.js +1 -1
  7. package/dist/Button/TextButton/TextButton.cjs +2 -0
  8. package/dist/Button/TextButton/TextButton.js +2 -0
  9. package/dist/Button/TextButton/TextButton.style.cjs +9 -3
  10. package/dist/Button/TextButton/TextButton.style.d.ts +1 -1
  11. package/dist/Button/TextButton/TextButton.style.js +9 -3
  12. package/dist/Button/TextButton/TextButton.types.d.ts +2 -0
  13. package/dist/Button/ToggleButton/ToggleButton.style.cjs +1 -1
  14. package/dist/Button/ToggleButton/ToggleButton.style.js +1 -1
  15. package/dist/Chip/Chip.cjs +3 -1
  16. package/dist/Chip/Chip.d.ts +2 -2
  17. package/dist/Chip/Chip.js +3 -1
  18. package/dist/Chip/Chip.types.d.ts +2 -1
  19. package/dist/Chip/components/CloseButton/CloseButton.cjs +2 -1
  20. package/dist/Chip/components/CloseButton/CloseButton.d.ts +1 -1
  21. package/dist/Chip/components/CloseButton/CloseButton.js +2 -1
  22. package/dist/Chip/components/CloseButton/CloseButton.types.d.ts +1 -1
  23. package/dist/ChipList/ChipList.cjs +2 -0
  24. package/dist/ChipList/ChipList.d.ts +1 -1
  25. package/dist/ChipList/ChipList.js +2 -0
  26. package/dist/ChipList/ChipList.types.d.ts +1 -0
  27. package/dist/ChipList/Components/ExtraItem.cjs +8 -7
  28. package/dist/ChipList/Components/ExtraItem.js +8 -7
  29. package/dist/Filters/components/MultiSelectFilter/MultiSelectFilter.cjs +2 -2
  30. package/dist/Filters/components/MultiSelectFilter/MultiSelectFilter.js +2 -2
  31. package/dist/Filters/components/MultiTreeSelectFilter/MultiTreeSelectFilter.cjs +2 -2
  32. package/dist/Filters/components/MultiTreeSelectFilter/MultiTreeSelectFilter.js +2 -2
  33. package/dist/FormField/FormField.context.cjs +4 -0
  34. package/dist/FormField/FormField.context.d.ts +3 -0
  35. package/dist/FormField/FormField.context.js +4 -0
  36. package/dist/FormField/components/Nested/Nested.cjs +4 -2
  37. package/dist/FormField/components/Nested/Nested.js +5 -3
  38. package/dist/Helpers/css.utils.cjs +8 -0
  39. package/dist/Helpers/css.utils.js +8 -0
  40. package/dist/Inputs/TextArea/components/TextAreaTag/TextAreaTag.cjs +6 -2
  41. package/dist/Inputs/TextArea/components/TextAreaTag/TextAreaTag.js +7 -3
  42. package/dist/Inputs/components/Compose/CommonCompose.cjs +16 -14
  43. package/dist/Inputs/components/Compose/CommonCompose.js +17 -15
  44. package/dist/Inputs/components/Context/InputValue.context.cjs +13 -9
  45. package/dist/Inputs/components/Context/InputValue.context.d.ts +270 -4
  46. package/dist/Inputs/components/Context/InputValue.context.js +13 -9
  47. package/dist/Inputs/components/Context/InputValueProvider.cjs +7 -2
  48. package/dist/Inputs/components/Context/InputValueProvider.js +8 -3
  49. package/dist/Inputs/components/Context/NumericInputValueProvider.cjs +6 -1
  50. package/dist/Inputs/components/Context/NumericInputValueProvider.js +7 -2
  51. package/dist/Inputs/components/InputTag/InputTag.cjs +6 -3
  52. package/dist/Inputs/components/InputTag/InputTag.js +7 -4
  53. package/dist/Inputs/components/InputTag/InputTag.style.cjs +1 -1
  54. package/dist/Inputs/components/InputTag/InputTag.style.js +1 -1
  55. package/dist/Inputs/components/ResetButton/ResetButton.cjs +7 -4
  56. package/dist/Inputs/components/ResetButton/ResetButton.js +7 -4
  57. package/dist/Label/components/Required/Required.cjs +8 -8
  58. package/dist/Label/components/Required/Required.js +8 -8
  59. package/dist/Layouts/FlexDivider/FlexDivider.cjs +22 -0
  60. package/dist/Layouts/FlexDivider/FlexDivider.d.ts +2 -0
  61. package/dist/Layouts/FlexDivider/FlexDivider.js +22 -0
  62. package/dist/Layouts/FlexDivider/FlexDivider.style.cjs +46 -0
  63. package/dist/Layouts/FlexDivider/FlexDivider.style.d.ts +6 -0
  64. package/dist/Layouts/FlexDivider/FlexDivider.style.js +44 -0
  65. package/dist/Layouts/FlexDivider/FlexDivider.types.d.ts +15 -0
  66. package/dist/Layouts/FlexGroup/FlexGroup.cjs +20 -0
  67. package/dist/Layouts/FlexGroup/FlexGroup.d.ts +2 -0
  68. package/dist/Layouts/FlexGroup/FlexGroup.js +20 -0
  69. package/dist/Layouts/FlexGroup/FlexGroup.style.cjs +20 -0
  70. package/dist/Layouts/FlexGroup/FlexGroup.style.d.ts +9 -0
  71. package/dist/Layouts/FlexGroup/FlexGroup.style.js +18 -0
  72. package/dist/Layouts/FlexGroup/FlexGroup.types.d.ts +19 -0
  73. package/dist/Layouts/FlexItem/FlexItem.cjs +16 -0
  74. package/dist/Layouts/FlexItem/FlexItem.d.ts +2 -0
  75. package/dist/Layouts/FlexItem/FlexItem.js +16 -0
  76. package/dist/Layouts/FlexItem/FlexItem.style.cjs +14 -0
  77. package/dist/Layouts/FlexItem/FlexItem.style.d.ts +5 -0
  78. package/dist/Layouts/FlexItem/FlexItem.style.js +12 -0
  79. package/dist/Layouts/FlexItem/FlexItem.types.d.ts +14 -0
  80. package/dist/Layouts/FlexSplit/FlexSplit.cjs +10 -0
  81. package/dist/Layouts/FlexSplit/FlexSplit.d.ts +2 -0
  82. package/dist/Layouts/FlexSplit/FlexSplit.js +10 -0
  83. package/dist/Layouts/FlexSplit/FlexSplit.style.cjs +27 -0
  84. package/dist/Layouts/FlexSplit/FlexSplit.style.d.ts +8 -0
  85. package/dist/Layouts/FlexSplit/FlexSplit.style.js +25 -0
  86. package/dist/Layouts/FlexSplit/FlexSplit.types.d.ts +8 -0
  87. package/dist/Layouts/index.d.ts +8 -0
  88. package/dist/MidBar/MidBar.cjs +30 -0
  89. package/dist/MidBar/MidBar.d.ts +22 -0
  90. package/dist/MidBar/MidBar.js +30 -0
  91. package/dist/MidBar/MidBar.types.d.ts +6 -0
  92. package/dist/MidBar/components/Header/Header.cjs +32 -0
  93. package/dist/MidBar/components/Header/Header.d.ts +15 -0
  94. package/dist/MidBar/components/Header/Header.js +32 -0
  95. package/dist/MidBar/components/Header/Header.types.d.ts +13 -0
  96. package/dist/MidBar/components/Header/components/Compose/Compose.cjs +8 -0
  97. package/dist/MidBar/components/Header/components/Compose/Compose.d.ts +3 -0
  98. package/dist/MidBar/components/Header/components/Compose/Compose.js +8 -0
  99. package/dist/MidBar/components/Header/components/Compose/Compose.style.cjs +31 -0
  100. package/dist/MidBar/components/Header/components/Compose/Compose.style.d.ts +1 -0
  101. package/dist/MidBar/components/Header/components/Compose/Compose.style.js +29 -0
  102. package/dist/MidBar/components/Header/components/Compose/Compose.types.d.ts +2 -0
  103. package/dist/MidBar/components/Header/components/Group/Group.cjs +12 -0
  104. package/dist/MidBar/components/Header/components/Group/Group.d.ts +3 -0
  105. package/dist/MidBar/components/Header/components/Group/Group.js +12 -0
  106. package/dist/MidBar/components/Header/components/Group/Group.style.cjs +22 -0
  107. package/dist/MidBar/components/Header/components/Group/Group.style.d.ts +4 -0
  108. package/dist/MidBar/components/Header/components/Group/Group.style.js +20 -0
  109. package/dist/MidBar/components/Header/components/Group/Group.types.d.ts +5 -0
  110. package/dist/MidBar/index.d.ts +2 -0
  111. package/dist/MoreInfoIcon/MoreInfoIcon.style.cjs +1 -1
  112. package/dist/MoreInfoIcon/MoreInfoIcon.style.js +1 -1
  113. package/dist/RadioGroup/RadioGroup.cjs +5 -23
  114. package/dist/RadioGroup/RadioGroup.d.ts +2 -15
  115. package/dist/RadioGroup/RadioGroup.js +5 -23
  116. package/dist/RadioGroup/RadioGroup.types.d.ts +1 -27
  117. package/dist/RadioGroup/components/Compose/Compose.cjs +23 -12
  118. package/dist/RadioGroup/components/Compose/Compose.d.ts +1 -1
  119. package/dist/RadioGroup/components/Compose/Compose.js +23 -12
  120. package/dist/RadioGroup/components/Compose/Compose.style.cjs +3 -1
  121. package/dist/RadioGroup/components/Compose/Compose.style.js +3 -1
  122. package/dist/RadioGroup/components/Item/Item.context.cjs +5 -10
  123. package/dist/RadioGroup/components/Item/Item.context.d.ts +1 -2
  124. package/dist/RadioGroup/components/Item/Item.context.js +5 -10
  125. package/dist/RadioGroup/components/Item/components/Compose/Compose.cjs +1 -1
  126. package/dist/RadioGroup/components/Item/components/Compose/Compose.js +2 -2
  127. package/dist/RadioGroup/components/Item/components/Indicator/Indicator.cjs +3 -1
  128. package/dist/RadioGroup/components/Item/components/Indicator/Indicator.js +3 -1
  129. package/dist/SearchBar/components/SearchSection/components/Actions/components/ColumnSelector/ColumnSelector.cjs +5 -7
  130. package/dist/SearchBar/components/SearchSection/components/Actions/components/ColumnSelector/ColumnSelector.js +5 -7
  131. package/dist/SearchBar/components/SearchSection/components/Actions/components/FiltersToggle/FiltersToggle.cjs +11 -9
  132. package/dist/SearchBar/components/SearchSection/components/Actions/components/FiltersToggle/FiltersToggle.js +11 -9
  133. package/dist/Select/components/Context/Context.cjs +6 -4
  134. package/dist/Select/components/Context/Context.js +7 -5
  135. package/dist/Select/components/Trigger/components/Compose/Compose.cjs +5 -0
  136. package/dist/Select/components/Trigger/components/Compose/Compose.js +6 -1
  137. package/dist/Select/components/Trigger/components/Compose/Compose.style.cjs +5 -0
  138. package/dist/Select/components/Trigger/components/Compose/Compose.style.js +5 -0
  139. package/dist/Stepper/Stepper.context.cjs +5 -10
  140. package/dist/Stepper/Stepper.context.d.ts +1 -2
  141. package/dist/Stepper/Stepper.context.js +5 -10
  142. package/dist/Stepper/Stepper.d.ts +4 -4
  143. package/dist/Stepper/components/Compose/Compose.cjs +6 -1
  144. package/dist/Stepper/components/Compose/Compose.d.ts +2 -2
  145. package/dist/Stepper/components/Compose/Compose.js +7 -2
  146. package/dist/Stepper/components/Step/Step.context.cjs +5 -10
  147. package/dist/Stepper/components/Step/Step.context.d.ts +1 -2
  148. package/dist/Stepper/components/Step/Step.context.js +5 -10
  149. package/dist/Stepper/components/Step/Step.d.ts +2 -3
  150. package/dist/Stepper/components/Step/components/Compose/Compose.cjs +1 -3
  151. package/dist/Stepper/components/Step/components/Compose/Compose.d.ts +1 -1
  152. package/dist/Stepper/components/Step/components/Compose/Compose.js +2 -4
  153. package/dist/Stepper/components/Step/components/Compose/Compose.style.cjs +2 -5
  154. package/dist/Stepper/components/Step/components/Compose/Compose.style.js +4 -7
  155. package/dist/Stepper/hooks/useStepperFocusing.cjs +31 -0
  156. package/dist/Stepper/hooks/useStepperFocusing.d.ts +16 -0
  157. package/dist/Stepper/hooks/useStepperFocusing.js +31 -0
  158. package/dist/Stepper/hooks/useStepperInteractive.cjs +30 -37
  159. package/dist/Stepper/hooks/useStepperInteractive.d.ts +2 -3
  160. package/dist/Stepper/hooks/useStepperInteractive.js +30 -37
  161. package/dist/ThemeModeSwitch/ThemeModeSwitch.cjs +64 -0
  162. package/dist/ThemeModeSwitch/ThemeModeSwitch.d.ts +2 -0
  163. package/dist/ThemeModeSwitch/ThemeModeSwitch.js +64 -0
  164. package/dist/ThemeModeSwitch/ThemeModeSwitch.style.cjs +38 -0
  165. package/dist/ThemeModeSwitch/ThemeModeSwitch.style.d.ts +4 -0
  166. package/dist/ThemeModeSwitch/ThemeModeSwitch.style.js +36 -0
  167. package/dist/ThemeModeSwitch/ThemeModeSwitch.types.d.ts +7 -0
  168. package/dist/ThemeModeSwitch/index.d.ts +3 -0
  169. package/dist/ThemeModeSwitch/useThemeModeSwitch.cjs +37 -0
  170. package/dist/ThemeModeSwitch/useThemeModeSwitch.d.ts +8 -0
  171. package/dist/ThemeModeSwitch/useThemeModeSwitch.js +37 -0
  172. package/dist/Toast/Toaster.cjs +4 -6
  173. package/dist/Toast/Toaster.d.ts +2 -1
  174. package/dist/Toast/Toaster.js +4 -6
  175. package/dist/Toast/Toaster.style.cjs +2 -2
  176. package/dist/Toast/Toaster.style.d.ts +2 -2
  177. package/dist/Toast/Toaster.style.js +3 -3
  178. package/dist/Toast/core/core.d.ts +3 -3
  179. package/dist/Toast/core/mapping.helpers.cjs +18 -2
  180. package/dist/Toast/core/mapping.helpers.d.ts +4 -3
  181. package/dist/Toast/core/mapping.helpers.js +22 -6
  182. package/dist/Toast/core/mapping.types.d.ts +3 -2
  183. package/dist/index.cjs +1092 -1
  184. package/dist/index.d.ts +3 -0
  185. package/dist/index.js +1139 -48
  186. package/dist/node_modules/clsx/dist/clsx.cjs +17 -0
  187. package/dist/node_modules/clsx/dist/clsx.js +17 -0
  188. package/dist/packages/components/node_modules/react-toastify/dist/react-toastify.esm.cjs +320 -0
  189. package/dist/packages/components/node_modules/react-toastify/dist/react-toastify.esm.js +318 -0
  190. package/dist/packages/icons/dist/multicolor/LoaderLarge.cjs +2 -2
  191. package/dist/packages/icons/dist/multicolor/LoaderLarge.js +2 -2
  192. package/dist/packages/icons/dist/multicolor/dark/LoaderLarge.cjs +3 -8
  193. package/dist/packages/icons/dist/multicolor/dark/LoaderLarge.js +3 -8
  194. package/dist/packages/icons/dist/multicolor/light/LoaderLarge.cjs +3 -8
  195. package/dist/packages/icons/dist/multicolor/light/LoaderLarge.js +3 -8
  196. package/package.json +4 -4
  197. package/dist/node_modules/clsx/dist/clsx.m.cjs +0 -15
  198. package/dist/node_modules/clsx/dist/clsx.m.js +0 -15
  199. package/dist/node_modules/react-toastify/dist/react-toastify.esm.cjs +0 -300
  200. package/dist/node_modules/react-toastify/dist/react-toastify.esm.js +0 -298
@@ -0,0 +1,16 @@
1
+ import { FocusEvent, KeyboardEvent, PointerEvent } from 'react';
2
+ export declare const useStepperFocusing: ({ isInteractive }: {
3
+ isInteractive: boolean;
4
+ }) => {
5
+ tabIndex: number;
6
+ onPointerDown: (e: PointerEvent) => void;
7
+ onFocusCapture: (e: FocusEvent) => void;
8
+ onKeyDownCapture: (e: KeyboardEvent) => void;
9
+ onBlur: (e: FocusEvent) => void;
10
+ } | {
11
+ tabIndex?: undefined;
12
+ onPointerDown?: undefined;
13
+ onFocusCapture?: undefined;
14
+ onKeyDownCapture?: undefined;
15
+ onBlur?: undefined;
16
+ };
@@ -0,0 +1,31 @@
1
+ import { useRef } from "react";
2
+ const useStepperFocusing = ({
3
+ isInteractive
4
+ }) => {
5
+ const pointerFocusRef = useRef(false);
6
+ return isInteractive ? {
7
+ tabIndex: 0,
8
+ onPointerDown: (e) => {
9
+ e.preventDefault();
10
+ pointerFocusRef.current = true;
11
+ e.currentTarget.classList.add("no-focus-visible");
12
+ e.currentTarget.focus();
13
+ },
14
+ onFocusCapture: (e) => {
15
+ if (!pointerFocusRef.current) {
16
+ e.currentTarget.classList.remove("no-focus-visible");
17
+ }
18
+ pointerFocusRef.current = false;
19
+ },
20
+ onKeyDownCapture: (e) => {
21
+ e.currentTarget.classList.remove("no-focus-visible");
22
+ },
23
+ onBlur: (e) => {
24
+ e.currentTarget.classList.remove("no-focus-visible");
25
+ pointerFocusRef.current = false;
26
+ }
27
+ } : {};
28
+ };
29
+ export {
30
+ useStepperFocusing
31
+ };
@@ -18,31 +18,36 @@ function useStepperInteractive({
18
18
  }
19
19
  return stepIndex !== currentStep;
20
20
  }, [currentStep, getIsStepInteractive, isInteractive]);
21
- const handleKeyDown = react_utils.combineHandlers(isInteractive ? (event) => {
21
+ const handleKeyDown = isInteractive ? (event) => {
22
+ const findNextInteractive = (from, to = totalSteps || 0) => {
23
+ for (let i = from; i < to; i += 1) {
24
+ if (isStepInteractive(i)) return i;
25
+ }
26
+ return void 0;
27
+ };
28
+ const findPrevInteractive = (from, to = 0) => {
29
+ for (let i = from; i >= to; i -= 1) {
30
+ if (isStepInteractive(i)) return i;
31
+ }
32
+ return void 0;
33
+ };
34
+ const handleChange = (next) => {
35
+ event.preventDefault();
36
+ if (next !== void 0) onStepChange(next);
37
+ };
22
38
  const {
23
39
  key
24
40
  } = event;
25
- if (key === "ArrowLeft" || key === "ArrowRight") {
26
- event.preventDefault();
27
- const direction = key === "ArrowRight" ? 1 : -1;
28
- const newIndex = currentStep + direction;
29
- if (direction > 0) {
30
- for (let i = newIndex; i < totalSteps || 0; i += 1) {
31
- if (isStepInteractive(i)) {
32
- onStepChange(i);
33
- break;
34
- }
35
- }
36
- } else {
37
- for (let i = newIndex; i >= 0; i -= 1) {
38
- if (isStepInteractive(i)) {
39
- onStepChange(i);
40
- break;
41
- }
42
- }
43
- }
41
+ if (key === "ArrowRight") {
42
+ handleChange(findNextInteractive(currentStep + 1));
43
+ } else if (key === "ArrowLeft") {
44
+ handleChange(findPrevInteractive(currentStep - 1));
45
+ } else if (key === "Home") {
46
+ handleChange(findNextInteractive(0, currentStep));
47
+ } else if (key === "End") {
48
+ handleChange(findPrevInteractive((totalSteps || 0) - 1, currentStep + 1));
44
49
  }
45
- } : void 0, onKeyDown);
50
+ } : void 0;
46
51
  const role = isInteractive ? "tablist" : "list";
47
52
  const label = isInteractive ? "Step navigation" : "Progress steps";
48
53
  return {
@@ -51,7 +56,7 @@ function useStepperInteractive({
51
56
  onStepChange
52
57
  },
53
58
  props: {
54
- onKeyDown: handleKeyDown,
59
+ onKeyDown: react_utils.combineHandlers(handleKeyDown, onKeyDown),
55
60
  role,
56
61
  "aria-label": label
57
62
  }
@@ -59,7 +64,6 @@ function useStepperInteractive({
59
64
  }
60
65
  function getInteractiveStepProps({
61
66
  onClick,
62
- onKeyDown,
63
67
  onStepChange,
64
68
  getIsStepInteractive,
65
69
  stepIndex,
@@ -67,29 +71,18 @@ function getInteractiveStepProps({
67
71
  }) {
68
72
  const isInteractive = !!onStepChange;
69
73
  const isClickable = isInteractive && getIsStepInteractive(stepIndex);
70
- const handleClick = react_utils.combineHandlers(isClickable ? () => onStepChange(stepIndex) : void 0, onClick);
71
- const handleKeyDown = react_utils.combineHandlers(isClickable ? (e) => {
72
- const {
73
- key
74
- } = e;
75
- if (key === "Enter" || key === " ") {
76
- e.preventDefault();
77
- onStepChange(stepIndex);
78
- }
79
- } : void 0, onKeyDown);
74
+ const handleClick = isClickable ? () => onStepChange(stepIndex) : void 0;
80
75
  const role = isInteractive ? "tab" : "listitem";
81
76
  const ariaSelected = isInteractive ? state === Step_types.StepperStepState.FOCUSED : void 0;
82
77
  const ariaCurrent = !isInteractive && state === Step_types.StepperStepState.FOCUSED ? "step" : void 0;
83
- const tabIndex = isClickable ? 0 : -1;
84
78
  const ariaDisabled = isInteractive && !isClickable ? true : void 0;
85
79
  return {
86
- onClick: handleClick,
87
- onKeyDown: handleKeyDown,
80
+ onClick: react_utils.combineHandlers(handleClick, onClick),
88
81
  role,
89
82
  "aria-selected": ariaSelected,
90
83
  "aria-current": ariaCurrent,
91
84
  "aria-disabled": ariaDisabled,
92
- tabIndex
85
+ tabIndex: -1
93
86
  };
94
87
  }
95
88
  exports.getInteractiveStepProps = getInteractiveStepProps;
@@ -16,15 +16,14 @@ export declare function useStepperInteractive({ onStepChange, onKeyDown, getIsSt
16
16
  'aria-label': string;
17
17
  };
18
18
  };
19
- export declare function getInteractiveStepProps({ onClick, onKeyDown, onStepChange, getIsStepInteractive, stepIndex, state }: Pick<ComposeProps, 'onClick' | 'onKeyDown'> & Pick<StepperContextType, 'onStepChange' | 'getIsStepInteractive'> & {
19
+ export declare function getInteractiveStepProps({ onClick, onStepChange, getIsStepInteractive, stepIndex, state }: Pick<ComposeProps, 'onClick'> & Pick<StepperContextType, 'onStepChange' | 'getIsStepInteractive'> & {
20
20
  stepIndex: number;
21
21
  state: StepperStepStateType;
22
22
  }): {
23
23
  readonly onClick: import("react").MouseEventHandler<HTMLElement> | undefined;
24
- readonly onKeyDown: import("react").KeyboardEventHandler<HTMLElement> | undefined;
25
24
  readonly role: "listitem" | "tab";
26
25
  readonly 'aria-selected': boolean | undefined;
27
26
  readonly 'aria-current': "step" | undefined;
28
27
  readonly 'aria-disabled': true | undefined;
29
- readonly tabIndex: 0 | -1;
28
+ readonly tabIndex: -1;
30
29
  };
@@ -16,31 +16,36 @@ function useStepperInteractive({
16
16
  }
17
17
  return stepIndex !== currentStep;
18
18
  }, [currentStep, getIsStepInteractive, isInteractive]);
19
- const handleKeyDown = combineHandlers(isInteractive ? (event) => {
19
+ const handleKeyDown = isInteractive ? (event) => {
20
+ const findNextInteractive = (from, to = totalSteps || 0) => {
21
+ for (let i = from; i < to; i += 1) {
22
+ if (isStepInteractive(i)) return i;
23
+ }
24
+ return void 0;
25
+ };
26
+ const findPrevInteractive = (from, to = 0) => {
27
+ for (let i = from; i >= to; i -= 1) {
28
+ if (isStepInteractive(i)) return i;
29
+ }
30
+ return void 0;
31
+ };
32
+ const handleChange = (next) => {
33
+ event.preventDefault();
34
+ if (next !== void 0) onStepChange(next);
35
+ };
20
36
  const {
21
37
  key
22
38
  } = event;
23
- if (key === "ArrowLeft" || key === "ArrowRight") {
24
- event.preventDefault();
25
- const direction = key === "ArrowRight" ? 1 : -1;
26
- const newIndex = currentStep + direction;
27
- if (direction > 0) {
28
- for (let i = newIndex; i < totalSteps || 0; i += 1) {
29
- if (isStepInteractive(i)) {
30
- onStepChange(i);
31
- break;
32
- }
33
- }
34
- } else {
35
- for (let i = newIndex; i >= 0; i -= 1) {
36
- if (isStepInteractive(i)) {
37
- onStepChange(i);
38
- break;
39
- }
40
- }
41
- }
39
+ if (key === "ArrowRight") {
40
+ handleChange(findNextInteractive(currentStep + 1));
41
+ } else if (key === "ArrowLeft") {
42
+ handleChange(findPrevInteractive(currentStep - 1));
43
+ } else if (key === "Home") {
44
+ handleChange(findNextInteractive(0, currentStep));
45
+ } else if (key === "End") {
46
+ handleChange(findPrevInteractive((totalSteps || 0) - 1, currentStep + 1));
42
47
  }
43
- } : void 0, onKeyDown);
48
+ } : void 0;
44
49
  const role = isInteractive ? "tablist" : "list";
45
50
  const label = isInteractive ? "Step navigation" : "Progress steps";
46
51
  return {
@@ -49,7 +54,7 @@ function useStepperInteractive({
49
54
  onStepChange
50
55
  },
51
56
  props: {
52
- onKeyDown: handleKeyDown,
57
+ onKeyDown: combineHandlers(handleKeyDown, onKeyDown),
53
58
  role,
54
59
  "aria-label": label
55
60
  }
@@ -57,7 +62,6 @@ function useStepperInteractive({
57
62
  }
58
63
  function getInteractiveStepProps({
59
64
  onClick,
60
- onKeyDown,
61
65
  onStepChange,
62
66
  getIsStepInteractive,
63
67
  stepIndex,
@@ -65,29 +69,18 @@ function getInteractiveStepProps({
65
69
  }) {
66
70
  const isInteractive = !!onStepChange;
67
71
  const isClickable = isInteractive && getIsStepInteractive(stepIndex);
68
- const handleClick = combineHandlers(isClickable ? () => onStepChange(stepIndex) : void 0, onClick);
69
- const handleKeyDown = combineHandlers(isClickable ? (e) => {
70
- const {
71
- key
72
- } = e;
73
- if (key === "Enter" || key === " ") {
74
- e.preventDefault();
75
- onStepChange(stepIndex);
76
- }
77
- } : void 0, onKeyDown);
72
+ const handleClick = isClickable ? () => onStepChange(stepIndex) : void 0;
78
73
  const role = isInteractive ? "tab" : "listitem";
79
74
  const ariaSelected = isInteractive ? state === StepperStepState.FOCUSED : void 0;
80
75
  const ariaCurrent = !isInteractive && state === StepperStepState.FOCUSED ? "step" : void 0;
81
- const tabIndex = isClickable ? 0 : -1;
82
76
  const ariaDisabled = isInteractive && !isClickable ? true : void 0;
83
77
  return {
84
- onClick: handleClick,
85
- onKeyDown: handleKeyDown,
78
+ onClick: combineHandlers(handleClick, onClick),
86
79
  role,
87
80
  "aria-selected": ariaSelected,
88
81
  "aria-current": ariaCurrent,
89
82
  "aria-disabled": ariaDisabled,
90
- tabIndex
83
+ tabIndex: -1
91
84
  };
92
85
  }
93
86
  export {
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("../node_modules/react/jsx-runtime.cjs");
4
+ const React = require("react");
5
+ const ThemeModeSwitch_style = require("./ThemeModeSwitch.style.cjs");
6
+ const useThemeModeSwitch = require("./useThemeModeSwitch.cjs");
7
+ const Menu = require("../Menu/Menu.cjs");
8
+ const ThemeModeSwitch = ({
9
+ onThemeModeChange,
10
+ switchTimeoutMs = 300,
11
+ ...restProps
12
+ }) => {
13
+ const {
14
+ allowSystemThemeMode,
15
+ themeMode,
16
+ setThemeMode,
17
+ toggleThemeMode
18
+ } = useThemeModeSwitch.useThemeModeSwitch({
19
+ onThemeModeChange,
20
+ switchTimeoutMs
21
+ });
22
+ const [ready, setReady] = React.useState(false);
23
+ React.useEffect(() => setReady(true), []);
24
+ const modeSwitch = jsxRuntime.jsxRuntimeExports.jsx(ThemeModeSwitch_style.ThemeModeSwitch, {
25
+ "data-theme-mode": themeMode,
26
+ "aria-label": `Theme mode switch. Current theme mode is ${themeMode || "unknown"}`,
27
+ ...restProps,
28
+ onClick: toggleThemeMode,
29
+ "data-mounting": !ready ? "" : void 0,
30
+ "$durationMs": switchTimeoutMs,
31
+ onPointerDown: allowSystemThemeMode ? (e) => {
32
+ e.currentTarget.focus();
33
+ e.preventDefault();
34
+ } : void 0,
35
+ children: jsxRuntime.jsxRuntimeExports.jsx(ThemeModeSwitch_style.Knob, {
36
+ "data-theme-mode": themeMode
37
+ })
38
+ });
39
+ if (allowSystemThemeMode) {
40
+ return jsxRuntime.jsxRuntimeExports.jsxs(Menu.default, {
41
+ children: [jsxRuntime.jsxRuntimeExports.jsx(Menu.default.Trigger, {
42
+ children: modeSwitch
43
+ }), jsxRuntime.jsxRuntimeExports.jsxs(Menu.default.Content, {
44
+ placement: "bottom",
45
+ align: "center",
46
+ children: [jsxRuntime.jsxRuntimeExports.jsx(Menu.default.Content.Item, {
47
+ text: "Light theme",
48
+ selected: themeMode === "light",
49
+ onClick: () => setThemeMode("light")
50
+ }), jsxRuntime.jsxRuntimeExports.jsx(Menu.default.Content.Item, {
51
+ text: "Dark theme",
52
+ selected: themeMode === "dark",
53
+ onClick: () => setThemeMode("dark")
54
+ }), jsxRuntime.jsxRuntimeExports.jsx(Menu.default.Content.Item, {
55
+ text: "Browser theme",
56
+ selected: themeMode === "system",
57
+ onClick: () => setThemeMode("system")
58
+ })]
59
+ })]
60
+ });
61
+ }
62
+ return modeSwitch;
63
+ };
64
+ exports.ThemeModeSwitch = ThemeModeSwitch;
@@ -0,0 +1,2 @@
1
+ import { ThemeModeSwitchProps } from './ThemeModeSwitch.types';
2
+ export declare const ThemeModeSwitch: ({ onThemeModeChange, switchTimeoutMs, ...restProps }: ThemeModeSwitchProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,64 @@
1
+ import { j as jsxRuntimeExports } from "../node_modules/react/jsx-runtime.js";
2
+ import { useState, useEffect } from "react";
3
+ import { ThemeModeSwitch as ThemeModeSwitch$1, Knob } from "./ThemeModeSwitch.style.js";
4
+ import { useThemeModeSwitch } from "./useThemeModeSwitch.js";
5
+ import Menu from "../Menu/Menu.js";
6
+ const ThemeModeSwitch = ({
7
+ onThemeModeChange,
8
+ switchTimeoutMs = 300,
9
+ ...restProps
10
+ }) => {
11
+ const {
12
+ allowSystemThemeMode,
13
+ themeMode,
14
+ setThemeMode,
15
+ toggleThemeMode
16
+ } = useThemeModeSwitch({
17
+ onThemeModeChange,
18
+ switchTimeoutMs
19
+ });
20
+ const [ready, setReady] = useState(false);
21
+ useEffect(() => setReady(true), []);
22
+ const modeSwitch = jsxRuntimeExports.jsx(ThemeModeSwitch$1, {
23
+ "data-theme-mode": themeMode,
24
+ "aria-label": `Theme mode switch. Current theme mode is ${themeMode || "unknown"}`,
25
+ ...restProps,
26
+ onClick: toggleThemeMode,
27
+ "data-mounting": !ready ? "" : void 0,
28
+ "$durationMs": switchTimeoutMs,
29
+ onPointerDown: allowSystemThemeMode ? (e) => {
30
+ e.currentTarget.focus();
31
+ e.preventDefault();
32
+ } : void 0,
33
+ children: jsxRuntimeExports.jsx(Knob, {
34
+ "data-theme-mode": themeMode
35
+ })
36
+ });
37
+ if (allowSystemThemeMode) {
38
+ return jsxRuntimeExports.jsxs(Menu, {
39
+ children: [jsxRuntimeExports.jsx(Menu.Trigger, {
40
+ children: modeSwitch
41
+ }), jsxRuntimeExports.jsxs(Menu.Content, {
42
+ placement: "bottom",
43
+ align: "center",
44
+ children: [jsxRuntimeExports.jsx(Menu.Content.Item, {
45
+ text: "Light theme",
46
+ selected: themeMode === "light",
47
+ onClick: () => setThemeMode("light")
48
+ }), jsxRuntimeExports.jsx(Menu.Content.Item, {
49
+ text: "Dark theme",
50
+ selected: themeMode === "dark",
51
+ onClick: () => setThemeMode("dark")
52
+ }), jsxRuntimeExports.jsx(Menu.Content.Item, {
53
+ text: "Browser theme",
54
+ selected: themeMode === "system",
55
+ onClick: () => setThemeMode("system")
56
+ })]
57
+ })]
58
+ });
59
+ }
60
+ return modeSwitch;
61
+ };
62
+ export {
63
+ ThemeModeSwitch
64
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const _styled = require("styled-components");
4
+ const redisUiStyles = require("@redislabsdev/redis-ui-styles");
5
+ const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
6
+ const _styled__default = /* @__PURE__ */ _interopDefault(_styled);
7
+ const ThemeModeSwitch = _styled__default.default.button.withConfig({
8
+ displayName: "ThemeModeSwitchstyle__ThemeModeSwitch",
9
+ componentId: "RedisUI__sc-6b0pvc-0"
10
+ })(["all:unset;cursor:pointer;box-sizing:border-box;transition:all ", "ms ease,outline 0ms,outline-offset 0ms;&[data-mounting]{transition:none;}", " ", ""], ({
11
+ $durationMs
12
+ }) => $durationMs, () => {
13
+ const theme = redisUiStyles.useTheme().components.themeModeSwitch;
14
+ return _styled.css`
15
+ width: ${theme.width};
16
+ height: ${theme.height};
17
+ padding: ${theme.padding};
18
+
19
+ border-radius: ${theme.borderRadius};
20
+
21
+ border: ${theme.borderColor} solid ${theme.borderWidth};
22
+ background-color: ${theme.bgColor};
23
+ `;
24
+ }, redisUiStyles.getFocusStyle());
25
+ const Knob = _styled__default.default.div.withConfig({
26
+ displayName: "ThemeModeSwitchstyle__Knob",
27
+ componentId: "RedisUI__sc-6b0pvc-1"
28
+ })(["height:100%;width:100%;background:none;transition:inherit;&[data-theme-mode='dark']{transform:translateX(100%);:before{transform:translateX(-100%);}}&[data-theme-mode='system']{transform:translateX(50%);:before{transform:translateX(-50%);}}:before{content:'';display:block;transition:inherit;height:100%;background-size:contain;background-position:center;background-repeat:no-repeat;", "}"], () => {
29
+ const theme = redisUiStyles.useTheme().components.themeModeSwitch.thumb;
30
+ return _styled.css`
31
+ border-radius: ${theme.borderRadius};
32
+ background-color: ${theme.bgColor};
33
+ background-image: ${theme.icon};
34
+ aspect-ratio: ${theme.iconAspectRatio};
35
+ `;
36
+ });
37
+ exports.Knob = Knob;
38
+ exports.ThemeModeSwitch = ThemeModeSwitch;
@@ -0,0 +1,4 @@
1
+ export declare const ThemeModeSwitch: import("styled-components").StyledComponent<"button", any, {
2
+ $durationMs: number;
3
+ }, never>;
4
+ export declare const Knob: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -0,0 +1,36 @@
1
+ import _styled, { css } from "styled-components";
2
+ import { useTheme, getFocusStyle } from "@redislabsdev/redis-ui-styles";
3
+ const ThemeModeSwitch = _styled.button.withConfig({
4
+ displayName: "ThemeModeSwitchstyle__ThemeModeSwitch",
5
+ componentId: "RedisUI__sc-6b0pvc-0"
6
+ })(["all:unset;cursor:pointer;box-sizing:border-box;transition:all ", "ms ease,outline 0ms,outline-offset 0ms;&[data-mounting]{transition:none;}", " ", ""], ({
7
+ $durationMs
8
+ }) => $durationMs, () => {
9
+ const theme = useTheme().components.themeModeSwitch;
10
+ return css`
11
+ width: ${theme.width};
12
+ height: ${theme.height};
13
+ padding: ${theme.padding};
14
+
15
+ border-radius: ${theme.borderRadius};
16
+
17
+ border: ${theme.borderColor} solid ${theme.borderWidth};
18
+ background-color: ${theme.bgColor};
19
+ `;
20
+ }, getFocusStyle());
21
+ const Knob = _styled.div.withConfig({
22
+ displayName: "ThemeModeSwitchstyle__Knob",
23
+ componentId: "RedisUI__sc-6b0pvc-1"
24
+ })(["height:100%;width:100%;background:none;transition:inherit;&[data-theme-mode='dark']{transform:translateX(100%);:before{transform:translateX(-100%);}}&[data-theme-mode='system']{transform:translateX(50%);:before{transform:translateX(-50%);}}:before{content:'';display:block;transition:inherit;height:100%;background-size:contain;background-position:center;background-repeat:no-repeat;", "}"], () => {
25
+ const theme = useTheme().components.themeModeSwitch.thumb;
26
+ return css`
27
+ border-radius: ${theme.borderRadius};
28
+ background-color: ${theme.bgColor};
29
+ background-image: ${theme.icon};
30
+ aspect-ratio: ${theme.iconAspectRatio};
31
+ `;
32
+ });
33
+ export {
34
+ Knob,
35
+ ThemeModeSwitch
36
+ };
@@ -0,0 +1,7 @@
1
+ import { UserThemeMode } from '@redislabsdev/redis-ui-styles';
2
+ import { HTMLAttributes } from 'react';
3
+ export type UseThemeModeSwitchParams = {
4
+ onThemeModeChange?: (newThemeMode: UserThemeMode) => void;
5
+ switchTimeoutMs?: number;
6
+ };
7
+ export type ThemeModeSwitchProps = Omit<HTMLAttributes<HTMLElement>, 'onClick' | 'onChange'> & UseThemeModeSwitchParams;
@@ -0,0 +1,3 @@
1
+ export * from './ThemeModeSwitch.types';
2
+ export * from './ThemeModeSwitch';
3
+ export * from './useThemeModeSwitch';
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const React = require("react");
4
+ const redisUiStyles = require("@redislabsdev/redis-ui-styles");
5
+ function useThemeModeSwitch({
6
+ onThemeModeChange,
7
+ switchTimeoutMs
8
+ }) {
9
+ const {
10
+ getNextThemeModeToToggle,
11
+ userThemeMode,
12
+ setUserThemeMode,
13
+ allowSystemThemeMode
14
+ } = redisUiStyles.useThemeModeSwitchingContext();
15
+ const [localThemeMode, setLocalThemeMode] = React.useState(userThemeMode);
16
+ React.useLayoutEffect(() => setLocalThemeMode(userThemeMode), [userThemeMode]);
17
+ const timerRef = React.useRef();
18
+ React.useEffect(() => () => clearTimeout(timerRef.current), []);
19
+ const applyThemeMode = (newThemeMode) => {
20
+ if (!newThemeMode) return;
21
+ clearTimeout(timerRef.current);
22
+ setLocalThemeMode(newThemeMode);
23
+ timerRef.current = setTimeout(() => {
24
+ if (setUserThemeMode(newThemeMode)) onThemeModeChange == null ? void 0 : onThemeModeChange(newThemeMode);
25
+ }, switchTimeoutMs);
26
+ };
27
+ const toggleThemeMode = () => {
28
+ applyThemeMode(getNextThemeModeToToggle(localThemeMode));
29
+ };
30
+ return {
31
+ allowSystemThemeMode,
32
+ themeMode: localThemeMode,
33
+ setThemeMode: applyThemeMode,
34
+ toggleThemeMode
35
+ };
36
+ }
37
+ exports.useThemeModeSwitch = useThemeModeSwitch;
@@ -0,0 +1,8 @@
1
+ import { UserThemeMode } from '@redislabsdev/redis-ui-styles';
2
+ import { UseThemeModeSwitchParams } from './ThemeModeSwitch.types';
3
+ export declare function useThemeModeSwitch({ onThemeModeChange, switchTimeoutMs }: UseThemeModeSwitchParams): {
4
+ allowSystemThemeMode: boolean | undefined;
5
+ themeMode: "light" | "dark" | "system" | undefined;
6
+ setThemeMode: (newThemeMode: UserThemeMode | undefined) => void;
7
+ toggleThemeMode: () => void;
8
+ };
@@ -0,0 +1,37 @@
1
+ import { useState, useLayoutEffect, useRef, useEffect } from "react";
2
+ import { useThemeModeSwitchingContext } from "@redislabsdev/redis-ui-styles";
3
+ function useThemeModeSwitch({
4
+ onThemeModeChange,
5
+ switchTimeoutMs
6
+ }) {
7
+ const {
8
+ getNextThemeModeToToggle,
9
+ userThemeMode,
10
+ setUserThemeMode,
11
+ allowSystemThemeMode
12
+ } = useThemeModeSwitchingContext();
13
+ const [localThemeMode, setLocalThemeMode] = useState(userThemeMode);
14
+ useLayoutEffect(() => setLocalThemeMode(userThemeMode), [userThemeMode]);
15
+ const timerRef = useRef();
16
+ useEffect(() => () => clearTimeout(timerRef.current), []);
17
+ const applyThemeMode = (newThemeMode) => {
18
+ if (!newThemeMode) return;
19
+ clearTimeout(timerRef.current);
20
+ setLocalThemeMode(newThemeMode);
21
+ timerRef.current = setTimeout(() => {
22
+ if (setUserThemeMode(newThemeMode)) onThemeModeChange == null ? void 0 : onThemeModeChange(newThemeMode);
23
+ }, switchTimeoutMs);
24
+ };
25
+ const toggleThemeMode = () => {
26
+ applyThemeMode(getNextThemeModeToToggle(localThemeMode));
27
+ };
28
+ return {
29
+ allowSystemThemeMode,
30
+ themeMode: localThemeMode,
31
+ setThemeMode: applyThemeMode,
32
+ toggleThemeMode
33
+ };
34
+ }
35
+ export {
36
+ useThemeModeSwitch
37
+ };
@@ -1,14 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const jsxRuntime = require("../node_modules/react/jsx-runtime.cjs");
4
+ const React = require("react");
4
5
  const Toaster_style = require("./Toaster.style.cjs");
5
- const Toaster = ({
6
+ const Toaster = React.forwardRef((props, ref) => jsxRuntime.jsxRuntimeExports.jsx(Toaster_style.ToasterContainer, {
6
7
  ref,
7
8
  ...props
8
- }) => jsxRuntime.jsxRuntimeExports.jsx(Toaster_style.ToasterContainer, {
9
- ref,
10
- ...props,
11
- enableMultiContainer: !!props.containerId
12
- });
9
+ }));
10
+ Toaster.displayName = "Toaster";
13
11
  const Toaster$1 = Toaster;
14
12
  exports.default = Toaster$1;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  import { ToasterProps } from './core/core.types';
2
- declare const Toaster: ({ ref, ...props }: ToasterProps) => import("react/jsx-runtime").JSX.Element;
3
+ declare const Toaster: import("react").ForwardRefExoticComponent<Omit<ToasterProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
3
4
  export default Toaster;
@@ -1,13 +1,11 @@
1
1
  import { j as jsxRuntimeExports } from "../node_modules/react/jsx-runtime.js";
2
+ import { forwardRef } from "react";
2
3
  import { ToasterContainer } from "./Toaster.style.js";
3
- const Toaster = ({
4
+ const Toaster = forwardRef((props, ref) => jsxRuntimeExports.jsx(ToasterContainer, {
4
5
  ref,
5
6
  ...props
6
- }) => jsxRuntimeExports.jsx(ToasterContainer, {
7
- ref,
8
- ...props,
9
- enableMultiContainer: !!props.containerId
10
- });
7
+ }));
8
+ Toaster.displayName = "Toaster";
11
9
  const Toaster$1 = Toaster;
12
10
  export {
13
11
  Toaster$1 as default
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const _styled = require("styled-components");
4
- const reactToastify_esm = require("../node_modules/react-toastify/dist/react-toastify.esm.cjs");
5
- ;/* empty css */
4
+ const reactToastify_esm = require("../packages/components/node_modules/react-toastify/dist/react-toastify.esm.cjs");
5
+ ;/* empty css */
6
6
  const redisUiStyles = require("@redislabsdev/redis-ui-styles");
7
7
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
8
8
  const _styled__default = /* @__PURE__ */ _interopDefault(_styled);