@redis-ui/components 42.8.0 → 43.2.1

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 (228) hide show
  1. package/dist/AutoCompleteSelect/AutoCompleteSelect.cjs +7 -1
  2. package/dist/AutoCompleteSelect/AutoCompleteSelect.js +7 -1
  3. package/dist/AutoCompleteSelect/hooks/useAutoCompleteSelect.cjs +7 -1
  4. package/dist/AutoCompleteSelect/hooks/useAutoCompleteSelect.d.ts +8 -1
  5. package/dist/AutoCompleteSelect/hooks/useAutoCompleteSelect.js +7 -1
  6. package/dist/BoxSelectionGroup/components/Item/components/BoxStateIndicator/BoxStateIndicator.cjs +8 -4
  7. package/dist/BoxSelectionGroup/components/Item/components/BoxStateIndicator/BoxStateIndicator.js +8 -4
  8. package/dist/BoxSelectionGroup/components/Item/components/Compose/Compose.style.cjs +18 -4
  9. package/dist/BoxSelectionGroup/components/Item/components/Compose/Compose.style.js +18 -4
  10. package/dist/BoxSelectionGroup/hooks/useBoxSelectionGroup.cjs +3 -1
  11. package/dist/BoxSelectionGroup/hooks/useBoxSelectionGroup.js +3 -1
  12. package/dist/Button/Button.style.cjs +4 -1
  13. package/dist/Button/Button.style.js +4 -1
  14. package/dist/Button/Button.style.utils.cjs +16 -1
  15. package/dist/Button/Button.style.utils.js +16 -1
  16. package/dist/Button/Button.types.cjs +1 -1
  17. package/dist/Button/Button.types.d.ts +1 -1
  18. package/dist/Button/Button.types.js +1 -1
  19. package/dist/Button/CopyToClipboardButton/CopyToClipboardButton.cjs +59 -0
  20. package/dist/Button/CopyToClipboardButton/CopyToClipboardButton.d.ts +4 -0
  21. package/dist/Button/CopyToClipboardButton/CopyToClipboardButton.js +57 -0
  22. package/dist/Button/CopyToClipboardButton/CopyToClipboardButton.style.cjs +40 -0
  23. package/dist/Button/CopyToClipboardButton/CopyToClipboardButton.style.d.ts +8 -0
  24. package/dist/Button/CopyToClipboardButton/CopyToClipboardButton.style.js +38 -0
  25. package/dist/Button/CopyToClipboardButton/CopyToClipboardButton.types.d.ts +5 -0
  26. package/dist/Button/TextButton/TextButton.style.cjs +4 -1
  27. package/dist/Button/TextButton/TextButton.style.js +4 -1
  28. package/dist/Button/TextButton/TextButton.types.cjs +1 -1
  29. package/dist/Button/TextButton/TextButton.types.d.ts +1 -1
  30. package/dist/Button/TextButton/TextButton.types.js +1 -1
  31. package/dist/Button/index.d.ts +2 -0
  32. package/dist/Checkbox/components/Label/Label.style.cjs +15 -3
  33. package/dist/Checkbox/components/Label/Label.style.js +15 -3
  34. package/dist/Chip/components/CloseButton/CloseButton.cjs +3 -1
  35. package/dist/Chip/components/CloseButton/CloseButton.js +3 -1
  36. package/dist/Chip/components/Compose/Compose.style.cjs +4 -1
  37. package/dist/Chip/components/Compose/Compose.style.js +4 -1
  38. package/dist/Drawer/components/Description/Description.cjs +3 -1
  39. package/dist/Drawer/components/Description/Description.js +3 -1
  40. package/dist/Helpers/contexts/Popper/PopperCollisionBoundaryManager.cjs +3 -1
  41. package/dist/Helpers/contexts/Popper/PopperCollisionBoundaryManager.js +3 -1
  42. package/dist/Helpers/contexts/PrimitiveContextState.cjs +28 -16
  43. package/dist/Helpers/contexts/PrimitiveContextState.js +28 -16
  44. package/dist/Helpers/contexts/SharedId.context.cjs +9 -5
  45. package/dist/Helpers/contexts/SharedId.context.js +9 -5
  46. package/dist/Helpers/css.utils.cjs +18 -4
  47. package/dist/Helpers/css.utils.d.ts +15 -3
  48. package/dist/Helpers/css.utils.js +18 -4
  49. package/dist/Helpers/hooks/useScrollable.cjs +3 -1
  50. package/dist/Helpers/hooks/useScrollable.js +3 -1
  51. package/dist/Helpers/react.utils.cjs +6 -2
  52. package/dist/Helpers/react.utils.js +6 -2
  53. package/dist/HighlightedIcon/HighlightedIcon.cjs +26 -0
  54. package/dist/HighlightedIcon/HighlightedIcon.d.ts +3 -0
  55. package/dist/HighlightedIcon/HighlightedIcon.js +26 -0
  56. package/dist/HighlightedIcon/HighlightedIcon.style.cjs +49 -0
  57. package/dist/HighlightedIcon/HighlightedIcon.style.d.ts +5 -0
  58. package/dist/HighlightedIcon/HighlightedIcon.style.js +47 -0
  59. package/dist/HighlightedIcon/HighlightedIcon.types.d.ts +8 -0
  60. package/dist/HighlightedIcon/index.d.ts +3 -0
  61. package/dist/Inputs/QuantityCounter/components/InputGroup/components/ValueLabel/ValueLabel.cjs +9 -5
  62. package/dist/Inputs/QuantityCounter/components/InputGroup/components/ValueLabel/ValueLabel.js +9 -5
  63. package/dist/Inputs/components/Compose/Compose.style.cjs +29 -6
  64. package/dist/Inputs/components/Compose/Compose.style.js +29 -6
  65. package/dist/Inputs/hooks/numericInput/numericInput.utils.cjs +12 -4
  66. package/dist/Inputs/hooks/numericInput/numericInput.utils.js +12 -4
  67. package/dist/Inputs/hooks/numericInput/useNumericInput.cjs +15 -3
  68. package/dist/Inputs/hooks/numericInput/useNumericInput.js +15 -3
  69. package/dist/Loader/Loader.cjs +1 -0
  70. package/dist/Loader/Loader.js +1 -0
  71. package/dist/Menu/components/Content/components/Item/Components/Compose/Compose.style.cjs +19 -4
  72. package/dist/Menu/components/Content/components/Item/Components/Compose/Compose.style.js +19 -4
  73. package/dist/Menu/components/Content/components/Label/components/Compose/Compose.style.cjs +4 -1
  74. package/dist/Menu/components/Content/components/Label/components/Compose/Compose.style.js +4 -1
  75. package/dist/Modal/components/Content/components/Compose/Compose.cjs +3 -1
  76. package/dist/Modal/components/Content/components/Compose/Compose.js +3 -1
  77. package/dist/Modal/components/Content/components/Description/Description.cjs +3 -1
  78. package/dist/Modal/components/Content/components/Description/Description.js +3 -1
  79. package/dist/MultiSelect/components/Compose/hooks/useMultiSelectContextApi.cjs +3 -1
  80. package/dist/MultiSelect/components/Compose/hooks/useMultiSelectContextApi.js +3 -1
  81. package/dist/MultiSelect/components/Trigger/components/MultiValue/MultiValue.cjs +3 -1
  82. package/dist/MultiSelect/components/Trigger/components/MultiValue/MultiValue.js +3 -1
  83. package/dist/Overflow/Overflow.cjs +3 -1
  84. package/dist/Overflow/Overflow.js +3 -1
  85. package/dist/Overflow/Overflow.utils.cjs +15 -6
  86. package/dist/Overflow/Overflow.utils.js +15 -6
  87. package/dist/Overflow/components/OverflowContainer/OverflowContainer.cjs +3 -1
  88. package/dist/Overflow/components/OverflowContainer/OverflowContainer.js +3 -1
  89. package/dist/Pagination/components/PageSizeSelect.cjs +3 -1
  90. package/dist/Pagination/components/PageSizeSelect.js +3 -1
  91. package/dist/Popover/components/Content/Content.cjs +3 -1
  92. package/dist/Popover/components/Content/Content.js +3 -1
  93. package/dist/Popover/components/Content/components/Footer/Footer.cjs +3 -1
  94. package/dist/Popover/components/Content/components/Footer/Footer.js +3 -1
  95. package/dist/RadioGroup/components/Item/components/Label/Label.style.cjs +15 -3
  96. package/dist/RadioGroup/components/Item/components/Label/Label.style.js +15 -3
  97. package/dist/ScreenReaderAnnounce/ScreenReaderAnnounce.cjs +3 -1
  98. package/dist/ScreenReaderAnnounce/ScreenReaderAnnounce.js +3 -1
  99. package/dist/Section/components/Header/components/CollapseButton/CollapseButton.cjs +3 -1
  100. package/dist/Section/components/Header/components/CollapseButton/CollapseButton.js +3 -1
  101. package/dist/Select/components/Content/components/Option/components/Compose/Compose.style.cjs +16 -4
  102. package/dist/Select/components/Content/components/Option/components/Compose/Compose.style.js +16 -4
  103. package/dist/Select/components/Content/components/OptionList/OptionList.cjs +6 -4
  104. package/dist/Select/components/Content/components/OptionList/OptionList.js +6 -4
  105. package/dist/Select/components/Content/components/OptionList/Virtual.cjs +9 -5
  106. package/dist/Select/components/Content/components/OptionList/Virtual.js +9 -5
  107. package/dist/Select/components/Context/hooks/useSearch.cjs +3 -1
  108. package/dist/Select/components/Context/hooks/useSearch.js +3 -1
  109. package/dist/Select/components/Trigger/components/Compose/Compose.style.cjs +33 -7
  110. package/dist/Select/components/Trigger/components/Compose/Compose.style.js +33 -7
  111. package/dist/SideBar/components/Item/Item.style.cjs +14 -3
  112. package/dist/SideBar/components/Item/Item.style.js +14 -3
  113. package/dist/Skeleton/components/Circle/Circle.cjs +1 -1
  114. package/dist/Skeleton/components/Circle/Circle.js +1 -1
  115. package/dist/Skeleton/components/Square/Square.cjs +1 -1
  116. package/dist/Skeleton/components/Square/Square.js +1 -1
  117. package/dist/Slider/components/Label/Compose/Compose.cjs +3 -1
  118. package/dist/Slider/components/Label/Compose/Compose.js +3 -1
  119. package/dist/Slider/components/Mark/Compose/Compose.cjs +3 -1
  120. package/dist/Slider/components/Mark/Compose/Compose.js +3 -1
  121. package/dist/Slider/hooks/useOffset.cjs +3 -1
  122. package/dist/Slider/hooks/useOffset.js +3 -1
  123. package/dist/Stepper/Stepper.cjs +14 -5
  124. package/dist/Stepper/Stepper.d.ts +2 -0
  125. package/dist/Stepper/Stepper.js +14 -5
  126. package/dist/Stepper/Stepper.utils.cjs +12 -0
  127. package/dist/Stepper/Stepper.utils.d.ts +2 -0
  128. package/dist/Stepper/Stepper.utils.js +12 -0
  129. package/dist/Stepper/components/Compose/Compose.d.ts +1 -0
  130. package/dist/Stepper/components/Step/Step.cjs +2 -0
  131. package/dist/Stepper/components/Step/Step.d.ts +1 -0
  132. package/dist/Stepper/components/Step/Step.js +2 -0
  133. package/dist/Stepper/components/Step/components/Compose/Compose.cjs +5 -10
  134. package/dist/Stepper/components/Step/components/Compose/Compose.js +5 -10
  135. package/dist/Stepper/components/Step/components/Separator/Separator.cjs +15 -0
  136. package/dist/Stepper/components/Step/components/Separator/Separator.d.ts +3 -0
  137. package/dist/Stepper/components/Step/components/Separator/Separator.js +15 -0
  138. package/dist/Stepper/components/Step/components/Separator/Separator.style.cjs +24 -0
  139. package/dist/Stepper/components/Step/components/Separator/Separator.style.d.ts +1 -0
  140. package/dist/Stepper/components/Step/components/Separator/Separator.style.js +22 -0
  141. package/dist/Stepper/components/Step/components/Separator/Separator.types.d.ts +5 -0
  142. package/dist/Stepper/hooks/useStepperInteractive.cjs +12 -4
  143. package/dist/Stepper/hooks/useStepperInteractive.js +12 -4
  144. package/dist/Switch/components/Switcher/Switcher.cjs +3 -1
  145. package/dist/Switch/components/Switcher/Switcher.js +3 -1
  146. package/dist/Switch/components/Switcher/Switcher.style.cjs +31 -8
  147. package/dist/Switch/components/Switcher/Switcher.style.js +31 -8
  148. package/dist/Tabs/components/TabBar/components/Trigger/components/Marker/Marker.style.cjs +24 -5
  149. package/dist/Tabs/components/TabBar/components/Trigger/components/Marker/Marker.style.js +24 -5
  150. package/dist/Tabs/components/TabBar/components/Trigger/components/Tab/Tab.style.cjs +24 -5
  151. package/dist/Tabs/components/TabBar/components/Trigger/components/Tab/Tab.style.js +24 -5
  152. package/dist/ThemeModeSwitch/useThemeModeSwitch.cjs +6 -2
  153. package/dist/ThemeModeSwitch/useThemeModeSwitch.js +6 -2
  154. package/dist/Toast/core/content.helper.cjs +8 -4
  155. package/dist/Toast/core/content.helper.js +8 -4
  156. package/dist/Tooltip/components/Content/Content.cjs +3 -1
  157. package/dist/Tooltip/components/Content/Content.js +3 -1
  158. package/dist/TreeView/TreeView.cjs +3 -1
  159. package/dist/TreeView/TreeView.js +3 -1
  160. package/dist/TreeView/components/TreeItem/components/Compose/Compose.cjs +6 -4
  161. package/dist/TreeView/components/TreeItem/components/Compose/Compose.js +6 -4
  162. package/dist/Typography/Typography.types.cjs +4 -0
  163. package/dist/Typography/Typography.types.d.ts +2 -1
  164. package/dist/Typography/Typography.types.js +4 -0
  165. package/dist/index.cjs +8 -0
  166. package/dist/index.d.ts +1 -0
  167. package/dist/index.js +98 -90
  168. package/package.json +10 -9
  169. package/skills/redis-ui-components/SKILL.md +126 -0
  170. package/skills/redis-ui-components/references/ActionIconButton.md +96 -0
  171. package/skills/redis-ui-components/references/AppBar.md +161 -0
  172. package/skills/redis-ui-components/references/AppSelectionMenu.md +184 -0
  173. package/skills/redis-ui-components/references/AutoCompleteSelect.md +193 -0
  174. package/skills/redis-ui-components/references/Badge.md +77 -0
  175. package/skills/redis-ui-components/references/Banner.md +563 -0
  176. package/skills/redis-ui-components/references/BoxSelectionGroup.md +487 -0
  177. package/skills/redis-ui-components/references/Breadcrumbs.md +214 -0
  178. package/skills/redis-ui-components/references/Button.md +169 -0
  179. package/skills/redis-ui-components/references/ButtonGroup.md +126 -0
  180. package/skills/redis-ui-components/references/Card.md +56 -0
  181. package/skills/redis-ui-components/references/Checkbox.md +171 -0
  182. package/skills/redis-ui-components/references/Chip.md +154 -0
  183. package/skills/redis-ui-components/references/ChipList.md +307 -0
  184. package/skills/redis-ui-components/references/CopyToClipboardButton.md +47 -0
  185. package/skills/redis-ui-components/references/CountryFlag.md +57 -0
  186. package/skills/redis-ui-components/references/Drawer.md +298 -0
  187. package/skills/redis-ui-components/references/Filters.md +162 -0
  188. package/skills/redis-ui-components/references/FlexDivider.md +152 -0
  189. package/skills/redis-ui-components/references/FlexGroup.md +149 -0
  190. package/skills/redis-ui-components/references/FlexItem.md +58 -0
  191. package/skills/redis-ui-components/references/FlexSplit.md +37 -0
  192. package/skills/redis-ui-components/references/FormField.md +678 -0
  193. package/skills/redis-ui-components/references/IconButton.md +63 -0
  194. package/skills/redis-ui-components/references/Input.md +295 -0
  195. package/skills/redis-ui-components/references/KeyValueList.md +501 -0
  196. package/skills/redis-ui-components/references/Label.md +238 -0
  197. package/skills/redis-ui-components/references/Link.md +402 -0
  198. package/skills/redis-ui-components/references/Loader.md +100 -0
  199. package/skills/redis-ui-components/references/Menu.md +988 -0
  200. package/skills/redis-ui-components/references/MidBar.md +358 -0
  201. package/skills/redis-ui-components/references/Modal.md +525 -0
  202. package/skills/redis-ui-components/references/MoreInfoIcon.md +119 -0
  203. package/skills/redis-ui-components/references/MultiSelect.md +558 -0
  204. package/skills/redis-ui-components/references/NumericInput.md +322 -0
  205. package/skills/redis-ui-components/references/Overflow.md +127 -0
  206. package/skills/redis-ui-components/references/Pagination.md +151 -0
  207. package/skills/redis-ui-components/references/PasswordInput.md +262 -0
  208. package/skills/redis-ui-components/references/Popover.md +868 -0
  209. package/skills/redis-ui-components/references/ProfileIcon.md +65 -0
  210. package/skills/redis-ui-components/references/ProgressBar.md +103 -0
  211. package/skills/redis-ui-components/references/QuantityCounter.md +555 -0
  212. package/skills/redis-ui-components/references/RadioGroup.md +265 -0
  213. package/skills/redis-ui-components/references/ScreenReaderAnnounce.md +147 -0
  214. package/skills/redis-ui-components/references/SearchBar.md +242 -0
  215. package/skills/redis-ui-components/references/SearchInput.md +213 -0
  216. package/skills/redis-ui-components/references/Section.md +349 -0
  217. package/skills/redis-ui-components/references/Select.md +517 -0
  218. package/skills/redis-ui-components/references/SideBar.md +468 -0
  219. package/skills/redis-ui-components/references/Slider.md +398 -0
  220. package/skills/redis-ui-components/references/Stepper.md +288 -0
  221. package/skills/redis-ui-components/references/Switch.md +193 -0
  222. package/skills/redis-ui-components/references/Tabs.md +383 -0
  223. package/skills/redis-ui-components/references/TextArea.md +139 -0
  224. package/skills/redis-ui-components/references/TextButton.md +217 -0
  225. package/skills/redis-ui-components/references/Toast.md +399 -0
  226. package/skills/redis-ui-components/references/ToggleButton.md +163 -0
  227. package/skills/redis-ui-components/references/Tooltip.md +636 -0
  228. package/skills/redis-ui-components/references/Typography.md +323 -0
@@ -0,0 +1,487 @@
1
+ # BoxSelectionGroup
2
+
3
+ Single- and multi-select box groups with compound item builders for custom icons, state indicators, and interactive child content.
4
+
5
+ ## Import
6
+
7
+ ```tsx
8
+ import {
9
+ BoxSelectionGroup,
10
+ MultiBoxSelectionGroup,
11
+ BoxSelectionGroupBox
12
+ } from '@redislabsdev/redis-ui-components';
13
+ ```
14
+
15
+ > Story examples also use `Checkbox`, `Switch`, and `Typography` from `@redislabsdev/redis-ui-components`, plus `RocketIcon` and `WandIcon` from `@redislabsdev/redis-ui-icons`.
16
+
17
+ ## Props
18
+
19
+ ### `BoxSelectionGroup`
20
+
21
+ | Prop | Type | Default | Description |
22
+ |------|------|---------|-------------|
23
+ | boxes | `BoxSelectionGroupBox[]` | required | Boxes rendered by the single-select wrapper |
24
+ | defaultValue | `string` | - | Initial selected box value for uncontrolled usage |
25
+ | value | `string` | - | Controlled selected box value |
26
+ | onChange | `(newValue: string) => void` | - | Called when the selected box changes |
27
+
28
+ `BoxSelectionGroup` also forwards standard `<div>` attributes through the compose wrapper.
29
+
30
+ ### `MultiBoxSelectionGroup`
31
+
32
+ | Prop | Type | Default | Description |
33
+ |------|------|---------|-------------|
34
+ | boxes | `BoxSelectionGroupBox[]` | required | Boxes rendered by the multi-select wrapper |
35
+ | defaultValue | `string[]` | - | Initial selected box values for uncontrolled usage |
36
+ | value | `string[]` | - | Controlled selected box values |
37
+ | onChange | `(newValue: string[]) => void` | - | Called when the selected boxes changes |
38
+
39
+ `MultiBoxSelectionGroup` also forwards standard `<div>` attributes through the compose wrapper.
40
+
41
+ ### `BoxSelectionGroupBox`
42
+
43
+ | Prop | Type | Default | Description |
44
+ |------|------|---------|-------------|
45
+ | value | `TValue` | required | Unique box value |
46
+ | label | `string` | - | Label rendered in the item |
47
+ | icon | `IconType` | - | Optional icon rendered by `Item.Icon` |
48
+ | disabled | `boolean` | - | Disables the box |
49
+ | disabledMessage | `string` | - | Tooltip text shown when the box is disabled |
50
+
51
+ `BoxSelectionGroupBox` also accepts custom fields via `Record<string, unknown>`, so story data can carry values such as `text`.
52
+
53
+ ### `BoxSelectionGroup.Compose` / `MultiBoxSelectionGroup.Compose`
54
+
55
+ | Prop | Type | Default | Description |
56
+ |------|------|---------|-------------|
57
+ | defaultValue | `string` / `string[]` | - | Initial selected value(s) |
58
+ | value | `string` / `string[]` | - | Controlled selected value(s) |
59
+ | onChange | `(newValue: string) => void` / `(newValue: string[]) => void` | - | Called when selection changes |
60
+ | children | `React.ReactNode` | required | Box items or custom composed content |
61
+
62
+ Both compose wrappers also accept standard `<div>` attributes.
63
+
64
+ ### `BoxSelectionGroup.Item.Compose` / `MultiBoxSelectionGroup.Item.Compose`
65
+
66
+ | Prop | Type | Default | Description |
67
+ |------|------|---------|-------------|
68
+ | box | `BoxSelectionGroupBox` | required | Box definition used to drive selection, disabled state, and tooltip content |
69
+ | tooltipProps | `Omit<TooltipContentProps, 'content'>` | - | Additional tooltip props for the disabled tooltip |
70
+ | children | `React.ReactNode` | required | Custom item content rendered inside the toggle root |
71
+
72
+ Both compose item wrappers also accept standard `<button>` attributes.
73
+
74
+ ### `BoxSelectionGroup.Item.Icon` / `MultiBoxSelectionGroup.Item.Icon`
75
+
76
+ | Prop | Type | Default | Description |
77
+ |------|------|---------|-------------|
78
+ | icon | `IconType` | - | Overrides the box icon; falls back to `box.icon` |
79
+
80
+ The icon renderer also accepts the standard monochrome icon props from `@redislabsdev/redis-ui-icons`.
81
+
82
+ ### `BoxSelectionGroup.Item.StateIndicator` / `MultiBoxSelectionGroup.Item.StateIndicator`
83
+
84
+ | Prop | Type | Default | Description |
85
+ |------|------|---------|-------------|
86
+ | children | `(props: { checked: boolean; tabIndex: number; disabled: boolean }) => React.ReactNode` | required | Render prop used to render the state indicator |
87
+ | noninteractive | `boolean` | `false` | Returns the rendered indicator without the click-blocking wrapper |
88
+
89
+ ### `BoxSelectionGroup.Item.Interactive` / `MultiBoxSelectionGroup.Item.Interactive`
90
+
91
+ | Prop | Type | Default | Description |
92
+ |------|------|---------|-------------|
93
+ | children | `React.ReactNode` | required | Wraps interactive children and stops click propagation |
94
+
95
+ ## Sub-components
96
+
97
+ - `BoxSelectionGroup.Compose` - Single-select compose wrapper.
98
+ - `BoxSelectionGroup.Item` - Default single-select item renderer.
99
+ - `BoxSelectionGroup.Item.Compose` - Custom single-select item wrapper with tooltip support.
100
+ - `BoxSelectionGroup.Item.Icon` - Renders the box icon and adapts color and size to the current state.
101
+ - `BoxSelectionGroup.Item.StateIndicator` - Render-prop wrapper for checkbox-like or read-only state indicators.
102
+ - `BoxSelectionGroup.Item.Interactive` - Wrapper for interactive children that should not toggle the box.
103
+ - `BoxSelectionGroup.Item.useItemContext` - Access the current item context from custom item content.
104
+ - `BoxSelectionGroup.Item.ItemContextConsumer` - React context consumer for the item state.
105
+ - `MultiBoxSelectionGroup.Compose` - Multi-select compose wrapper.
106
+ - `MultiBoxSelectionGroup.Item` - Default multi-select item renderer.
107
+ - `MultiBoxSelectionGroup.Item.Compose` - Custom multi-select item wrapper with tooltip support.
108
+ - `MultiBoxSelectionGroup.Item.Icon` - Renders the box icon and adapts color and size to the current state.
109
+ - `MultiBoxSelectionGroup.Item.StateIndicator` - Render-prop wrapper for checkbox-like or read-only state indicators.
110
+ - `MultiBoxSelectionGroup.Item.Interactive` - Wrapper for interactive children that should not toggle the box.
111
+ - `MultiBoxSelectionGroup.Item.useItemContext` - Access the current item context from custom item content.
112
+ - `MultiBoxSelectionGroup.Item.ItemContextConsumer` - React context consumer for the item state.
113
+
114
+ ## Examples
115
+
116
+ ### BoxSelectionGroup
117
+
118
+ #### Playground
119
+
120
+ ```tsx
121
+ import { BoxSelectionGroup } from '@redislabsdev/redis-ui-components';
122
+ import { boxes } from './BoxSelectionGroup.data';
123
+
124
+ <BoxSelectionGroup boxes={boxes} style={{ minHeight: 140 }} />
125
+ ```
126
+
127
+ #### ControlledMode
128
+
129
+ > Set `value` and `onChange` props to use controlled mode
130
+
131
+ ```tsx
132
+ import { useState } from 'react';
133
+ import { BoxSelectionGroup } from '@redislabsdev/redis-ui-components';
134
+ import { boxes } from './BoxSelectionGroup.data';
135
+
136
+ function Render() {
137
+ const [value, setValue] = useState(boxes[0].value);
138
+
139
+ const handleChange = (newValue: string) => {
140
+ setValue(newValue as (typeof boxes)[0]['value']);
141
+ };
142
+
143
+ return (
144
+ <>
145
+ <BoxSelectionGroup
146
+ boxes={boxes}
147
+ onChange={handleChange}
148
+ value={value}
149
+ style={{ minHeight: 140 }}
150
+ />
151
+ <div>Value: {JSON.stringify(value)}</div>
152
+ </>
153
+ );
154
+ }
155
+ ```
156
+
157
+ #### DisabledBoxes
158
+
159
+ > Each Box item can be disabled by adding `disabled` parameter to Box parameters
160
+
161
+ ```tsx
162
+ import { BoxSelectionGroup } from '@redislabsdev/redis-ui-components';
163
+ import { disabledBoxes } from './BoxSelectionGroup.data';
164
+
165
+ <BoxSelectionGroup
166
+ boxes={disabledBoxes}
167
+ defaultValue={disabledBoxes[0].value}
168
+ style={{ minHeight: 140 }}
169
+ />
170
+ ```
171
+
172
+ #### ComposeItemsAndIndicators
173
+
174
+ > The component and each box can be composed, using their own and custom elements.<br/>
175
+ > Use `BoxSelectionGroup.Item.StateIndicator` to wrap box's state indicator component.<br/>
176
+ > This wrapper also prevents unnecessary interaction with form components,
177
+ > such as `Checkbox` or `Switch`, that can cause unexpected behavior or even crash when used inside a form.<br/>
178
+
179
+ ```tsx
180
+ import { BoxSelectionGroup, Checkbox, Switch, Typography } from '@redislabsdev/redis-ui-components';
181
+ import { boxes } from './BoxSelectionGroup.data';
182
+ import { StoryGroupTitle, StoryHList } from '../../helpers/Story.style';
183
+
184
+ <form>
185
+ <BoxSelectionGroup.Compose defaultValue={boxes[0].value} style={{ minHeight: 140 }}>
186
+ {boxes.map((box) => (
187
+ <BoxSelectionGroup.Item.Compose
188
+ key={box.value}
189
+ box={box}
190
+ style={{ padding: '2rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}
191
+ >
192
+ <StoryHList>
193
+ <BoxSelectionGroup.Item.Icon color="neutral700" customSize="32px" />
194
+ <Typography.Heading size="L">{box.label}</Typography.Heading>
195
+ {box.text && <p>{box.text}</p>}
196
+ </StoryHList>
197
+ <StoryGroupTitle>Box State Indicators:</StoryGroupTitle>
198
+ <BoxSelectionGroup.Item.StateIndicator>
199
+ {(props) => <Checkbox {...props} label={box.label} />}
200
+ </BoxSelectionGroup.Item.StateIndicator>
201
+ <BoxSelectionGroup.Item.StateIndicator>
202
+ {(props) => <Switch {...props} />}
203
+ </BoxSelectionGroup.Item.StateIndicator>
204
+ <BoxSelectionGroup.Item.StateIndicator noninteractive>
205
+ {({ checked }) => (checked ? 'on' : 'off')}
206
+ </BoxSelectionGroup.Item.StateIndicator>
207
+ </BoxSelectionGroup.Item.Compose>
208
+ ))}
209
+ </BoxSelectionGroup.Compose>
210
+ </form>
211
+ ```
212
+
213
+ #### ComposeDisabledItems
214
+
215
+ > All top level components will have opacity to appear disabled.<br/>
216
+ > Wrapping interactive components that have own disabled state
217
+ > with `BoxSelectionGroup.Item.StateIndicator` allows using the
218
+ > own component's disable look instead of the box opacity.<br/>
219
+ > If the wrapped state component doesn't have own disable look, you will need to add it manually.
220
+ > If the state component is not interactive, you can set the `noninteractive` flag on the wrapper.
221
+
222
+ ```tsx
223
+ import { BoxSelectionGroup, Checkbox, Switch, Typography } from '@redislabsdev/redis-ui-components';
224
+ import { disabledBoxes } from './BoxSelectionGroup.data';
225
+ import { StoryGroupTitle, StoryHList } from '../../helpers/Story.style';
226
+
227
+ <BoxSelectionGroup.Compose defaultValue={disabledBoxes[0].value} style={{ minHeight: 140 }}>
228
+ {disabledBoxes.map((box) => (
229
+ <BoxSelectionGroup.Item.Compose
230
+ key={box.value}
231
+ box={box}
232
+ style={{ padding: '2rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}
233
+ >
234
+ <StoryHList>
235
+ <BoxSelectionGroup.Item.Icon color="neutral700" customSize="32px" />
236
+ <Typography.Heading size="L">{box.label}</Typography.Heading>
237
+ </StoryHList>
238
+ <StoryGroupTitle>Box State Indicators:</StoryGroupTitle>
239
+ <BoxSelectionGroup.Item.StateIndicator>
240
+ {(props) => <Checkbox {...props} label={box.label} disabled={box.disabled} />}
241
+ </BoxSelectionGroup.Item.StateIndicator>
242
+ <BoxSelectionGroup.Item.StateIndicator>
243
+ {(props) => <Switch {...props} disabled={box.disabled} />}
244
+ </BoxSelectionGroup.Item.StateIndicator>
245
+ <BoxSelectionGroup.Item.StateIndicator noninteractive>
246
+ {({ checked }) => <span>{checked ? 'on' : 'off'}</span>}
247
+ </BoxSelectionGroup.Item.StateIndicator>
248
+ </BoxSelectionGroup.Item.Compose>
249
+ ))}
250
+ </BoxSelectionGroup.Compose>
251
+ ```
252
+
253
+ #### ComposeWithInteractiveElements
254
+
255
+ > Composing boxes with custom interactive components can be made easier
256
+ > by wrapping the components with `BoxSelectionGroup.Item.Interactive`.<br/>
257
+ > If interactive component has its own disabled state, it will be used instead of the disabled box's opacity.<br/>
258
+ > Wrapped components without their own disabled state require additional manual styling for box's disabled state.
259
+
260
+ ```tsx
261
+ import { BoxSelectionGroup, Checkbox, Switch, Typography } from '@redislabsdev/redis-ui-components';
262
+ import { disabledBoxes } from './BoxSelectionGroup.data';
263
+ import { StoryGroupTitle, StoryHList } from '../../helpers/Story.style';
264
+
265
+ <BoxSelectionGroup.Compose defaultValue={disabledBoxes[0].value} style={{ minHeight: 140 }}>
266
+ {disabledBoxes.map((box) => (
267
+ <BoxSelectionGroup.Item.Compose
268
+ key={box.value}
269
+ box={box}
270
+ style={{ padding: '2rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}
271
+ >
272
+ <StoryHList>
273
+ <BoxSelectionGroup.Item.Icon color="neutral700" customSize="32px" />
274
+ <Typography.Heading size="L">{box.label}</Typography.Heading>
275
+ </StoryHList>
276
+ <StoryGroupTitle>Interactive Elements:</StoryGroupTitle>
277
+ <BoxSelectionGroup.Item.Interactive>
278
+ <Checkbox
279
+ defaultChecked={box.value === 'box2'}
280
+ label="custom checkbox"
281
+ disabled={box.disabled}
282
+ />
283
+ </BoxSelectionGroup.Item.Interactive>
284
+ <StoryHList>
285
+ custom switch
286
+ <BoxSelectionGroup.Item.Interactive>
287
+ <Switch defaultChecked={box.value === 'box2'} disabled={box.disabled} />
288
+ </BoxSelectionGroup.Item.Interactive>
289
+ </StoryHList>
290
+ <BoxSelectionGroup.Item.Interactive>
291
+ <Checkbox defaultChecked={box.value === 'box2'} disabled label="always disabled" />
292
+ </BoxSelectionGroup.Item.Interactive>
293
+ </BoxSelectionGroup.Item.Compose>
294
+ ))}
295
+ </BoxSelectionGroup.Compose>
296
+ ```
297
+
298
+ ### MultiBoxSelectionGroup
299
+
300
+ #### Playground
301
+
302
+ ```tsx
303
+ import { MultiBoxSelectionGroup } from '@redislabsdev/redis-ui-components';
304
+ import { boxes } from '../BoxSelectionGroup.data';
305
+
306
+ <MultiBoxSelectionGroup boxes={boxes} style={{ minHeight: 140 }} />
307
+ ```
308
+
309
+ #### ControlledMode
310
+
311
+ > Set `value` and `onChange` props to use controlled mode
312
+
313
+ ```tsx
314
+ import { useState } from 'react';
315
+ import { MultiBoxSelectionGroup } from '@redislabsdev/redis-ui-components';
316
+ import { boxes } from '../BoxSelectionGroup.data';
317
+
318
+ function Render() {
319
+ const [value, onChange] = useState([boxes[0].value]);
320
+
321
+ return (
322
+ <>
323
+ <MultiBoxSelectionGroup
324
+ boxes={boxes}
325
+ onChange={onChange}
326
+ value={value}
327
+ style={{ minHeight: 140 }}
328
+ />
329
+ <div>Value: {JSON.stringify(value)}</div>
330
+ </>
331
+ );
332
+ }
333
+ ```
334
+
335
+ #### DisabledBoxes
336
+
337
+ > Each Box item can be disabled by adding `disabled` parameter to Box parameters
338
+
339
+ ```tsx
340
+ import { MultiBoxSelectionGroup } from '@redislabsdev/redis-ui-components';
341
+ import { disabledBoxes } from '../BoxSelectionGroup.data';
342
+
343
+ <MultiBoxSelectionGroup
344
+ boxes={disabledBoxes}
345
+ defaultValue={[disabledBoxes[0].value]}
346
+ style={{ minHeight: 140 }}
347
+ />
348
+ ```
349
+
350
+ #### ComposeItemsAndIndicators
351
+
352
+ > The component and each box can be composed, using their own and custom elements.<br/>
353
+ > Use `MultiBoxSelectionGroup.Item.StateIndicator` to wrap box's state indicator component.<br/>
354
+ > This wrapper also prevents unnecessary interaction with form components,
355
+ > such as `Checkbox` or `Switch`, that can cause unexpected behavior or even crash when used inside a form.<br/>
356
+
357
+ ```tsx
358
+ import { MultiBoxSelectionGroup, Checkbox, Switch, Typography } from '@redislabsdev/redis-ui-components';
359
+ import { boxes } from '../BoxSelectionGroup.data';
360
+ import { StoryGroupTitle, StoryHList } from '../../../helpers/Story.style';
361
+
362
+ <form>
363
+ <MultiBoxSelectionGroup.Compose defaultValue={[boxes[0].value]} style={{ minHeight: 140 }}>
364
+ {boxes.map((box) => (
365
+ <MultiBoxSelectionGroup.Item.Compose
366
+ key={box.value}
367
+ box={box}
368
+ style={{ padding: '2rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}
369
+ >
370
+ <StoryHList>
371
+ <MultiBoxSelectionGroup.Item.Icon color="neutral700" customSize="32px" />
372
+ <Typography.Heading size="L">{box.label}</Typography.Heading>
373
+ {box.text && <p>{box.text}</p>}
374
+ </StoryHList>
375
+ <StoryGroupTitle>Box State Indicators:</StoryGroupTitle>
376
+ <MultiBoxSelectionGroup.Item.StateIndicator>
377
+ {(props) => <Checkbox {...props} label={box.label} />}
378
+ </MultiBoxSelectionGroup.Item.StateIndicator>
379
+ <MultiBoxSelectionGroup.Item.StateIndicator>
380
+ {(props) => <Switch {...props} />}
381
+ </MultiBoxSelectionGroup.Item.StateIndicator>
382
+ <MultiBoxSelectionGroup.Item.StateIndicator noninteractive>
383
+ {({ checked }) => (checked ? 'on' : 'off')}
384
+ </MultiBoxSelectionGroup.Item.StateIndicator>
385
+ </MultiBoxSelectionGroup.Item.Compose>
386
+ ))}
387
+ </MultiBoxSelectionGroup.Compose>
388
+ </form>
389
+ ```
390
+
391
+ #### ComposeDisabledItems
392
+
393
+ > All top level components will have opacity to appear disabled.<br/>
394
+ > Wrapping interactive components that have own disabled state
395
+ > with `MultiBoxSelectionGroup.Item.StateIndicator` allows using the
396
+ > own component's disable look instead of the box opacity.<br/>
397
+ > If the wrapped state component doesn't have own disable look, you will need to add it manually.
398
+ > If the state component is not interactive, you can set the `noninteractive` flag on the wrapper.
399
+
400
+ ```tsx
401
+ import { MultiBoxSelectionGroup, Checkbox, Switch, Typography } from '@redislabsdev/redis-ui-components';
402
+ import { disabledBoxes } from '../BoxSelectionGroup.data';
403
+ import { StoryGroupTitle, StoryHList } from '../../../helpers/Story.style';
404
+
405
+ <MultiBoxSelectionGroup.Compose defaultValue={[disabledBoxes[0].value]} style={{ minHeight: 140 }}>
406
+ {disabledBoxes.map((box) => (
407
+ <MultiBoxSelectionGroup.Item.Compose
408
+ key={box.value}
409
+ box={box}
410
+ style={{ padding: '2rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}
411
+ >
412
+ <StoryHList>
413
+ <MultiBoxSelectionGroup.Item.Icon color="neutral700" customSize="32px" />
414
+ <Typography.Heading size="L">{box.label}</Typography.Heading>
415
+ </StoryHList>
416
+ <StoryGroupTitle>Box State Indicators:</StoryGroupTitle>
417
+ <MultiBoxSelectionGroup.Item.StateIndicator>
418
+ {(props) => <Checkbox {...props} label={box.label} disabled={box.disabled} />}
419
+ </MultiBoxSelectionGroup.Item.StateIndicator>
420
+ <MultiBoxSelectionGroup.Item.StateIndicator>
421
+ {(props) => <Switch {...props} disabled={box.disabled} />}
422
+ </MultiBoxSelectionGroup.Item.StateIndicator>
423
+ <MultiBoxSelectionGroup.Item.StateIndicator noninteractive>
424
+ {({ checked }) => <span>{checked ? 'on' : 'off'}</span>}
425
+ </MultiBoxSelectionGroup.Item.StateIndicator>
426
+ </MultiBoxSelectionGroup.Item.Compose>
427
+ ))}
428
+ </MultiBoxSelectionGroup.Compose>
429
+ ```
430
+
431
+ #### ComposeWithInteractiveElements
432
+
433
+ > Composing boxes with custom interactive components can be made easier
434
+ > by wrapping the components with `MultiBoxSelectionGroup.Item.Interactive`.<br/>
435
+ > If interactive component has its own disabled state, it will be used instead of the disabled box's opacity.<br/>
436
+ > Wrapped components without their own disabled state require additional manual styling for box's disabled state.
437
+
438
+ ```tsx
439
+ import { MultiBoxSelectionGroup, Checkbox, Switch, Typography } from '@redislabsdev/redis-ui-components';
440
+ import { disabledBoxes } from '../BoxSelectionGroup.data';
441
+ import { StoryGroupTitle, StoryHList } from '../../../helpers/Story.style';
442
+
443
+ <MultiBoxSelectionGroup.Compose
444
+ defaultValue={[disabledBoxes[0].value]}
445
+ style={{ minHeight: 140 }}
446
+ >
447
+ {disabledBoxes.map((box) => (
448
+ <MultiBoxSelectionGroup.Item.Compose
449
+ key={box.value}
450
+ box={box}
451
+ style={{ padding: '2rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}
452
+ >
453
+ <StoryHList>
454
+ <MultiBoxSelectionGroup.Item.Icon color="neutral700" customSize="32px" />
455
+ <Typography.Heading size="L">{box.label}</Typography.Heading>
456
+ </StoryHList>
457
+ <StoryGroupTitle>Interactive Elements:</StoryGroupTitle>
458
+ <MultiBoxSelectionGroup.Item.Interactive>
459
+ <Checkbox
460
+ defaultChecked={box.value === 'box2'}
461
+ label="custom checkbox"
462
+ disabled={box.disabled}
463
+ />
464
+ </MultiBoxSelectionGroup.Item.Interactive>
465
+ <StoryHList>
466
+ custom switch
467
+ <MultiBoxSelectionGroup.Item.Interactive>
468
+ <Switch defaultChecked={box.value === 'box2'} disabled={box.disabled} />
469
+ </MultiBoxSelectionGroup.Item.Interactive>
470
+ </StoryHList>
471
+ <MultiBoxSelectionGroup.Item.Interactive>
472
+ <Checkbox defaultChecked={box.value === 'box2'} disabled label="always disabled" />
473
+ </MultiBoxSelectionGroup.Item.Interactive>
474
+ </MultiBoxSelectionGroup.Item.Compose>
475
+ ))}
476
+ </MultiBoxSelectionGroup.Compose>
477
+ ```
478
+
479
+ ## Notes
480
+
481
+ - `BoxSelectionGroup` is the single-select variant; `MultiBoxSelectionGroup` is the multi-select variant.
482
+ - `BoxSelectionGroupBox` can carry custom fields because it extends `Record<string, unknown>`; the stories use `text` for composed content.
483
+ - `ControlledMode` in both story files uses `value` and `onChange` to switch the components into controlled mode.
484
+ - `DisabledBoxes` shows that individual boxes can be disabled by setting `disabled` on the box definition.
485
+ - `BoxSelectionGroup.Item.StateIndicator` and `MultiBoxSelectionGroup.Item.StateIndicator` are behavior wrappers, not styling wrappers. Use `noninteractive` for non-interactive state content.
486
+ - Wrapping interactive children with `BoxSelectionGroup.Item.Interactive` or `MultiBoxSelectionGroup.Item.Interactive` prevents selection clicks from bubbling into the box.
487
+ - When a wrapped interactive child already has a disabled state, it can show its own disabled look instead of relying on the box opacity; otherwise add the disabled styling manually.