@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,988 @@
1
+ # Menu
2
+
3
+ Dropdown menu with customizable placement and content.
4
+
5
+ ## Import
6
+
7
+ ```tsx
8
+ import { Menu } from '@redislabsdev/redis-ui-components';
9
+ ```
10
+
11
+ ## Props
12
+
13
+ ### Menu
14
+
15
+ | Prop | Type | Default | Description |
16
+ |------|------|---------|-------------|
17
+ | children | `React.ReactNode` | required | Trigger and content nodes rendered inside the menu |
18
+ | open | `boolean` | - | Controlled open state |
19
+ | defaultOpen | `boolean` | - | Uncontrolled initial open state |
20
+ | onOpenChange | `(open: boolean) => void` | - | Called when the menu open state changes |
21
+ | modal | `boolean` | `false` | Whether the dropdown behaves as a modal menu |
22
+ | disabled | `boolean` | `undefined` | Disables the menu and forces it closed through menu context |
23
+
24
+ ### Menu.Trigger
25
+
26
+ | Prop | Type | Default | Description |
27
+ |------|------|---------|-------------|
28
+ | withButton | `boolean` | `false` | Renders an invisible button wrapper for multi-element or custom trigger content |
29
+
30
+ `Menu.Trigger` also accepts the button-element props from `ComposeElementProps<HTMLButtonElement>`.
31
+
32
+ ### Menu.Trigger.Arrow
33
+
34
+ `Menu.Trigger.Arrow` inherits `MonochromeIconProps`. It renders the chevron icon used in the trigger and rotates with menu state. The icon defaults to a down chevron and uses size `M`.
35
+
36
+ ### Menu.Content
37
+
38
+ | Prop | Type | Default | Description |
39
+ |------|------|---------|-------------|
40
+ | children | `React.ReactNode` | required | Menu items and composition blocks rendered inside the dropdown panel |
41
+ | sideOffset | `number` | `5` | Offset from the trigger on the placement side |
42
+ | placement | `'top' \| 'bottom' \| 'left' \| 'right'` | `'bottom'` | Preferred menu side relative to the trigger |
43
+ | align | `'start' \| 'center' \| 'end'` | `'center'` | Alignment of the dropdown panel on the placement axis |
44
+ | alignOffset | `number` | - | Extra alignment offset |
45
+ | portal | `HTMLElement` | `document.body` | Portal container used for rendering the dropdown panel |
46
+ | onFocusOutside | `(event: Event) => void` | - | Called when focus leaves the dropdown content |
47
+ | onCloseAutoFocus | `(event: Event) => void` | - | Called before Radix restores focus after closing |
48
+ | onInteractOutside | `(event: Event) => void` | - | Called when the user interacts outside the dropdown |
49
+ | collisionBoundary | `DropdownMenu.DropdownMenuContentProps['collisionBoundary']` | - | Collision boundary forwarded to Radix positioning |
50
+
51
+ `Menu.Content` also accepts native `HTMLAttributes<HTMLDivElement>` props.
52
+
53
+ ### Menu.Content.Item
54
+
55
+ | Prop | Type | Default | Description |
56
+ |------|------|---------|-------------|
57
+ | text | `React.ReactNode` | required for regular items | Main item text; optional when `subHead` is used |
58
+ | subHead | `React.ReactNode` | - | Left-side header text that switches the item layout |
59
+ | icon | `IconType` | - | Leading icon for the item |
60
+ | description | `React.ReactNode` | - | Trailing description text |
61
+ | selected | `boolean` | `false` | Marks the item as selected and non-clickable |
62
+ | isSelected | `boolean` | `false` | Deprecated alias for `selected` |
63
+ | variant | `'primary' \| 'destructive'` | `'primary'` | Visual variant for the item |
64
+ | shift | `number \| string` | `0` | Adds left padding using the menu level offset |
65
+ | disabled | `boolean` | `false` | Disables the item |
66
+ | onSelect | `() => void` | - | Called when the menu item is selected |
67
+
68
+ `Menu.Content.Item` also accepts native `HTMLAttributes<HTMLDivElement>` props.
69
+
70
+ ### Menu.Content.Item.Compose
71
+
72
+ | Prop | Type | Default | Description |
73
+ |------|------|---------|-------------|
74
+ | children | `React.ReactNode` | required | Building blocks that compose the custom item layout |
75
+ | disabled | `boolean` | `false` | Disables the composed item |
76
+ | onSelect | `() => void` | - | Called when the item is selected |
77
+ | selected | `boolean` | `false` | Marks the item as selected and prevents interaction |
78
+ | isSelected | `boolean` | `false` | Deprecated alias for `selected` |
79
+ | variant | `'primary' \| 'destructive'` | `'primary'` | Visual variant for the item container |
80
+ | shift | `number \| string` | `0` | Adds left padding using the menu level offset |
81
+
82
+ `Menu.Content.Item.Compose` also accepts native `HTMLAttributes<HTMLDivElement>` props.
83
+
84
+ ### Menu.Content.Item.Text
85
+
86
+ `Menu.Content.Item.Text` inherits `Typography.Body` props.
87
+
88
+ ### Menu.Content.Item.Icon
89
+
90
+ | Prop | Type | Default | Description |
91
+ |------|------|---------|-------------|
92
+ | icon | `IconType` | required | Icon rendered inside the item |
93
+
94
+ `Menu.Content.Item.Icon` also accepts monochrome icon props such as `title`, `color`, and `customSize`.
95
+
96
+ ### Menu.Content.Item.SubHead
97
+
98
+ `Menu.Content.Item.SubHead` uses the same props as `Menu.Content.Item.Text`, but renders the text with semi-bold body typography.
99
+
100
+ ### Menu.Content.Item.Check
101
+
102
+ | Prop | Type | Default | Description |
103
+ |------|------|---------|-------------|
104
+ | icon | `IconType` | `CheckBoldIcon` | Icon rendered for the selected-state check mark |
105
+
106
+ `Menu.Content.Item.Check` also accepts monochrome icon props.
107
+
108
+ ### Menu.Content.Item.Split
109
+
110
+ | Prop | Type | Default | Description |
111
+ |------|------|---------|-------------|
112
+ | minWidth | `string \| number \| undefined` | - | Optional minimum width used when splitting item content |
113
+
114
+ `Menu.Content.Item.Split` also accepts native `HTMLAttributes<HTMLDivElement>` props.
115
+
116
+ ### Menu.Content.Label
117
+
118
+ | Prop | Type | Default | Description |
119
+ |------|------|---------|-------------|
120
+ | text | `React.ReactNode` | `children` | Label text; strings are rendered with the label text style |
121
+ | icon | `IconType` | - | Leading icon for the label |
122
+ | variant | `'header' \| 'sub'` | `'header'` | Label variant |
123
+ | shift | `number \| string` | `0` | Adds left padding using the menu label level offset |
124
+ | children | `React.ReactNode` | deprecated | Deprecated alias for `text` |
125
+
126
+ ### Menu.Content.Label.Compose
127
+
128
+ | Prop | Type | Default | Description |
129
+ |------|------|---------|-------------|
130
+ | children | `React.ReactNode` | required | Building blocks that compose the custom label layout |
131
+ | variant | `'header' \| 'sub'` | `'header'` | Label variant |
132
+ | shift | `number \| string` | `0` | Adds left padding using the menu label level offset |
133
+
134
+ `Menu.Content.Label.Compose` also accepts the shared `ComposeElementProps` surface.
135
+
136
+ ### Menu.Content.Label.Text
137
+
138
+ `Menu.Content.Label.Text` inherits `Typography.Body` props.
139
+
140
+ ### Menu.Content.Label.Icon
141
+
142
+ | Prop | Type | Default | Description |
143
+ |------|------|---------|-------------|
144
+ | icon | `IconType` | required | Icon rendered inside the label |
145
+
146
+ `Menu.Content.Label.Icon` also accepts monochrome icon props.
147
+
148
+ ### Menu.Content.Separator
149
+
150
+ | Prop | Type | Default | Description |
151
+ |------|------|---------|-------------|
152
+ | className | `string` | - | Optional class name for styling the separator |
153
+
154
+ `Menu.Content.Separator` also accepts native `HTMLAttributes<HTMLHRElement>` props, excluding `children`.
155
+
156
+ ### Menu.Content.DropdownArrow
157
+
158
+ | Prop | Type | Default | Description |
159
+ |------|------|---------|-------------|
160
+ | className | `string` | - | Optional class name for styling the arrow |
161
+
162
+ `Menu.Content.DropdownArrow` renders the menu panel arrow used inside `Menu.Content`.
163
+
164
+ ## Sub-components
165
+
166
+ - `Menu.Trigger` - Trigger wrapper that can render as a regular trigger or as an invisible button wrapper
167
+ - `Menu.Trigger.Arrow` - Chevron icon that indicates the open state of the trigger
168
+ - `Menu.Content` - Dropdown panel container and Radix portal wrapper
169
+ - `Menu.Content.Item` - Standard menu item with icon, description, selection, and `subHead` support
170
+ - `Menu.Content.Item.Compose` - Low-level item container for building custom item layouts
171
+ - `Menu.Content.Item.Text` - Typography body text used inside item compositions
172
+ - `Menu.Content.Item.Icon` - Monochrome icon building block used inside item compositions
173
+ - `Menu.Content.Item.SubHead` - Semi-bold text building block used for item sub-head layouts
174
+ - `Menu.Content.Item.Check` - Selected-state check mark building block
175
+ - `Menu.Content.Item.Split` - Spacer/split building block used between item content segments
176
+ - `Menu.Content.Label` - Menu label block with text, icon, variant, and shift support
177
+ - `Menu.Content.Label.Compose` - Low-level label container for custom label layouts
178
+ - `Menu.Content.Label.Text` - Typography body text used inside label compositions
179
+ - `Menu.Content.Label.Icon` - Monochrome icon building block used inside label compositions
180
+ - `Menu.Content.Separator` - Horizontal separator used between menu groups
181
+ - `Menu.Content.DropdownArrow` - Radix dropdown arrow rendered inside the menu panel
182
+
183
+ ## Examples
184
+
185
+ ### Menu
186
+
187
+ #### Standard
188
+
189
+ ```tsx
190
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
191
+ import { CopyIcon, MoreactionsIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
192
+
193
+ <Menu defaultOpen>
194
+ <Menu.Trigger>
195
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
196
+ </Menu.Trigger>
197
+ <Menu.Content placement="right" align="start">
198
+ <Menu.Content.Label text="Menu Label" />
199
+ <Menu.Content.Item disabled text="Disabled item" />
200
+ <Menu.Content.Separator />
201
+ <Menu.Content.Item text="Item, which is very long and we want to verify that it does not break to multi-line and instead will be shortened with ellipsis" />
202
+ <Menu.Content.Separator />
203
+ <Menu.Content.Item text="Item with description" description="description" />
204
+ <Menu.Content.Item text="Item with icon" icon={CopyIcon} />
205
+ <Menu.Content.Item text="Selected item" icon={StarsIcon} selected />
206
+ <Menu.Content.Separator />
207
+ <Menu.Content.Item subHead="Subhead" text="with text and icon" icon={StarsIcon} />
208
+ <Menu.Content.Item subHead="Subhead with icon" icon={CopyIcon} />
209
+ <Menu.Content.Item subHead="Subhead with description" description="description" />
210
+ <Menu.Content.DropdownArrow />
211
+ </Menu.Content>
212
+ </Menu>
213
+ ```
214
+
215
+ ### Menu.Trigger
216
+
217
+ #### WithButton
218
+
219
+ > Menu Trigger has property `withButton` which allows wrapping trigger elements with invisible button. Use this property if you have multiple elements or your element doesn't work as trigger.
220
+ >
221
+ > Make sure you correctly styled disabled state for custom trigger components.
222
+
223
+ ```tsx
224
+ import { Menu, Typography } from '@redislabsdev/redis-ui-components';
225
+ import { CopyIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
226
+
227
+ <Menu>
228
+ <Menu.Trigger withButton>
229
+ <Typography.Body size="L">Click to open</Typography.Body>
230
+ <Menu.Trigger.Arrow color="neutral800" />
231
+ </Menu.Trigger>
232
+ <Menu.Content>
233
+ <Menu.Content.Item text="Item 1" icon={CopyIcon} />
234
+ <Menu.Content.Item text="Item 2" icon={StarsIcon} />
235
+ <Menu.Content.DropdownArrow />
236
+ </Menu.Content>
237
+ </Menu>
238
+ ```
239
+
240
+ #### WithoutButton
241
+
242
+ > For a single element that correctly works as a trigger, `withButton` can be omitted and the trigger will render only that element.
243
+
244
+ ```tsx
245
+ import { Button, Menu } from '@redislabsdev/redis-ui-components';
246
+ import { CopyIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
247
+
248
+ <Menu>
249
+ <Menu.Trigger>
250
+ <Button>
251
+ Click to open
252
+ <Menu.Trigger.Arrow color="neutral100" />
253
+ </Button>
254
+ </Menu.Trigger>
255
+ <Menu.Content>
256
+ <Menu.Content.Item text="Item 1" icon={CopyIcon} />
257
+ <Menu.Content.Item text="Item 2" icon={StarsIcon} />
258
+ <Menu.Content.DropdownArrow />
259
+ </Menu.Content>
260
+ </Menu>
261
+ ```
262
+
263
+ ### Menu.Content
264
+
265
+ #### Playground
266
+
267
+ ```tsx
268
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
269
+ import { CopyIcon, MoreactionsIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
270
+
271
+ <Menu open>
272
+ <Menu.Trigger>
273
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
274
+ </Menu.Trigger>
275
+ <Menu.Content>
276
+ <Menu.Content.Item text="Item 1" icon={CopyIcon} />
277
+ <Menu.Content.Item text="Item 2" icon={StarsIcon} />
278
+ <Menu.Content.DropdownArrow />
279
+ </Menu.Content>
280
+ </Menu>
281
+ ```
282
+
283
+ #### Placement
284
+
285
+ > Use `placement` prop to define the preferred side of the trigger for the menu. It can be reversed if collision occurs.
286
+
287
+ ```tsx
288
+ import { Button, Menu } from '@redislabsdev/redis-ui-components';
289
+
290
+ <>
291
+ <Menu defaultOpen>
292
+ <Menu.Trigger>
293
+ <Button>Left</Button>
294
+ </Menu.Trigger>
295
+ <Menu.Content placement="left">
296
+ <Menu.Content.Item text="Left" />
297
+ <Menu.Content.DropdownArrow />
298
+ </Menu.Content>
299
+ </Menu>
300
+ <Menu defaultOpen>
301
+ <Menu.Trigger>
302
+ <Button>Top</Button>
303
+ </Menu.Trigger>
304
+ <Menu.Content placement="top">
305
+ <Menu.Content.Item text="Top" />
306
+ <Menu.Content.DropdownArrow />
307
+ </Menu.Content>
308
+ </Menu>
309
+ <Menu defaultOpen>
310
+ <Menu.Trigger>
311
+ <Button>Bottom</Button>
312
+ </Menu.Trigger>
313
+ <Menu.Content placement="bottom">
314
+ <Menu.Content.Item text="Bottom" />
315
+ <Menu.Content.DropdownArrow />
316
+ </Menu.Content>
317
+ </Menu>
318
+ <Menu defaultOpen>
319
+ <Menu.Trigger>
320
+ <Button>Right</Button>
321
+ </Menu.Trigger>
322
+ <Menu.Content placement="right">
323
+ <Menu.Content.Item text="Right" />
324
+ <Menu.Content.DropdownArrow />
325
+ </Menu.Content>
326
+ </Menu>
327
+ </>
328
+ ```
329
+
330
+ #### DropdownArrow
331
+
332
+ > Add `<Menu.Content.DropdownArrow />` inside `Menu.Content` to add the arrow.
333
+
334
+ ```tsx
335
+ import { Button, Menu } from '@redislabsdev/redis-ui-components';
336
+ import { CopyIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
337
+
338
+ <>
339
+ <Menu defaultOpen>
340
+ <Menu.Trigger>
341
+ <Button>With arrow</Button>
342
+ </Menu.Trigger>
343
+ <Menu.Content>
344
+ <Menu.Content.Item text="Item 1" icon={CopyIcon} />
345
+ <Menu.Content.Item text="Item 2" icon={StarsIcon} />
346
+ <Menu.Content.DropdownArrow />
347
+ </Menu.Content>
348
+ </Menu>
349
+ <Menu defaultOpen>
350
+ <Menu.Trigger>
351
+ <Button>Without arrow</Button>
352
+ </Menu.Trigger>
353
+ <Menu.Content>
354
+ <Menu.Content.Item text="Item 1" icon={CopyIcon} />
355
+ <Menu.Content.Item text="Item 2" icon={StarsIcon} />
356
+ </Menu.Content>
357
+ </Menu>
358
+ </>
359
+ ```
360
+
361
+ ### Menu.Content.Item
362
+
363
+ #### Playground
364
+
365
+ ```tsx
366
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
367
+ import { MoreactionsIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
368
+
369
+ <Menu open>
370
+ <Menu.Trigger>
371
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
372
+ </Menu.Trigger>
373
+ <Menu.Content placement="right" align="center">
374
+ <Menu.Content.Item text="Item" icon={StarsIcon} />
375
+ <Menu.Content.DropdownArrow />
376
+ </Menu.Content>
377
+ </Menu>
378
+ ```
379
+
380
+ #### ItemGroupsComposition
381
+
382
+ > Groups can be composed using `Menu.Content.Label` and `Menu.Content.Separator`.
383
+
384
+ ```tsx
385
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
386
+ import { MoreactionsIcon } from '@redislabsdev/redis-ui-icons';
387
+
388
+ <Menu defaultOpen>
389
+ <Menu.Trigger>
390
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
391
+ </Menu.Trigger>
392
+ <Menu.Content placement="right" align="center">
393
+ <Menu.Content.Label text="Group Label" />
394
+ <Menu.Content.Item text="Item 1" />
395
+ <Menu.Content.Item text="Item 2" />
396
+ <Menu.Content.Separator />
397
+ <Menu.Content.Label text="Other Label" />
398
+ <Menu.Content.Item text="Item 3" selected />
399
+ <Menu.Content.Item text="Item 4" />
400
+ <Menu.Content.Separator />
401
+ <Menu.Content.Item text="Item 5" />
402
+ <Menu.Content.DropdownArrow />
403
+ </Menu.Content>
404
+ </Menu>
405
+ ```
406
+
407
+ #### RegularItemExamples
408
+
409
+ > `Menu.Content.Item` regular items can use `icon`, `text`, `description` and the selected check mark. Text is mandatory for regular items. Description and the check mark align to the right.
410
+
411
+ ```tsx
412
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
413
+ import { MoreactionsIcon, CopyIcon, ShardIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
414
+
415
+ <Menu defaultOpen>
416
+ <Menu.Trigger>
417
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
418
+ </Menu.Trigger>
419
+ <Menu.Content placement="right" align="center">
420
+ <Menu.Content.Label text="Regular Items:" />
421
+ <Menu.Content.Separator />
422
+ <Menu.Content.Item text="Item with text" />
423
+ <Menu.Content.Item text="Item with text and icon" icon={StarsIcon} />
424
+ <Menu.Content.Item text="Item with text, icon and" icon={ShardIcon} description="description" />
425
+ <Menu.Content.Item text="Item with check mark" icon={CopyIcon} selected />
426
+ <Menu.Content.DropdownArrow />
427
+ </Menu.Content>
428
+ </Menu>
429
+ ```
430
+
431
+ #### ItemWithSubheadExamples
432
+
433
+ > `Menu.Content.Item` items with `subHead` can use `subHead`, `icon`, `text` and `description`. All fields are optional if `subHead` is present. Description and icon align to the right.
434
+
435
+ ```tsx
436
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
437
+ import { MoreactionsIcon, RocketIcon, ShardIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
438
+
439
+ <Menu defaultOpen>
440
+ <Menu.Trigger>
441
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
442
+ </Menu.Trigger>
443
+ <Menu.Content placement="right" align="center">
444
+ <Menu.Content.Label text="Items with SubHead:" />
445
+ <Menu.Content.Separator />
446
+ <Menu.Content.Item subHead="SubHead only" />
447
+ <Menu.Content.Item subHead="SubHead with" icon={StarsIcon} />
448
+ <Menu.Content.Item subHead="SubHead with" text="text" />
449
+ <Menu.Content.Item subHead="SubHead with" text="text" icon={ShardIcon} />
450
+ <Menu.Content.Item subHead="SubHead with" text="text" description="description" />
451
+ <Menu.Content.Item
452
+ subHead="SubHead with"
453
+ text="text"
454
+ description="description"
455
+ icon={RocketIcon}
456
+ />
457
+ <Menu.Content.DropdownArrow />
458
+ </Menu.Content>
459
+ </Menu>
460
+ ```
461
+
462
+ #### ItemVariants
463
+
464
+ > Menu items support `primary` and `destructive` variants.
465
+
466
+ ```tsx
467
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
468
+ import { MoreactionsIcon, ShardIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
469
+
470
+ <Menu defaultOpen>
471
+ <Menu.Trigger>
472
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
473
+ </Menu.Trigger>
474
+ <Menu.Content placement="right" align="center">
475
+ <Menu.Content.Label text="Regular Items" />
476
+ <Menu.Content.Item text="Variant: primary" icon={StarsIcon} variant="primary" />
477
+ <Menu.Content.Item text="Variant: destructive" icon={ShardIcon} variant="destructive" />
478
+ <Menu.Content.Separator />
479
+ <Menu.Content.Label text="Items with SubHead" />
480
+ <Menu.Content.Item subHead="Variant:" text="primary" icon={StarsIcon} variant="primary" />
481
+ <Menu.Content.Item
482
+ subHead="Variant:"
483
+ text="destructive"
484
+ icon={ShardIcon}
485
+ variant="destructive"
486
+ />
487
+ <Menu.Content.Separator />
488
+ <Menu.Content.Label text="Disabled Items" />
489
+ <Menu.Content.Item text="Variant: primary" icon={StarsIcon} variant="primary" disabled />
490
+ <Menu.Content.Item
491
+ text="Variant: destructive"
492
+ icon={ShardIcon}
493
+ variant="destructive"
494
+ disabled
495
+ />
496
+ <Menu.Content.Item
497
+ subHead="Variant:"
498
+ text="primary"
499
+ icon={StarsIcon}
500
+ variant="primary"
501
+ disabled
502
+ />
503
+ <Menu.Content.Item
504
+ subHead="Variant:"
505
+ text="destructive"
506
+ icon={ShardIcon}
507
+ variant="destructive"
508
+ disabled
509
+ />
510
+ <Menu.Content.DropdownArrow />
511
+ </Menu.Content>
512
+ </Menu>
513
+ ```
514
+
515
+ #### Shift
516
+
517
+ > Items can use `shift` to add left padding to the content. Shift can be a number for the standard menu-level offset or a string for a custom CSS unit.
518
+
519
+ ```tsx
520
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
521
+ import { MoreactionsIcon, StarsIcon, WandIcon } from '@redislabsdev/redis-ui-icons';
522
+
523
+ <Menu defaultOpen>
524
+ <Menu.Trigger>
525
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
526
+ </Menu.Trigger>
527
+ <Menu.Content placement="right" align="center">
528
+ <Menu.Content.Item text="no shift" />
529
+ <Menu.Content.Item text="shift: 1" shift={1} />
530
+ <Menu.Content.Item text="shift: 2" shift={2} />
531
+ <Menu.Content.Item text="shift: 3" shift={3} />
532
+ <Menu.Content.Item text='shift: "1rem"' shift="1rem" />
533
+ <Menu.Content.Item text='shift: "1rem"' icon={WandIcon} shift="1rem" />
534
+ <Menu.Content.DropdownArrow />
535
+ </Menu.Content>
536
+ </Menu>
537
+ ```
538
+
539
+ #### SelectedItems
540
+
541
+ > Menu items can be selected.
542
+
543
+ ```tsx
544
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
545
+ import { MoreactionsIcon, ShardIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
546
+
547
+ <Menu defaultOpen>
548
+ <Menu.Trigger>
549
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
550
+ </Menu.Trigger>
551
+ <Menu.Content placement="right" align="center">
552
+ <Menu.Content.Label text="Regular Items" />
553
+ <Menu.Content.Item text="Variant: primary" icon={StarsIcon} variant="primary" />
554
+ <Menu.Content.Item text="Variant: destructive" icon={ShardIcon} variant="destructive" />
555
+ <Menu.Content.Separator />
556
+ <Menu.Content.Label text="Selected Items" />
557
+ <Menu.Content.Item text="Variant: primary" icon={StarsIcon} variant="primary" selected />
558
+ <Menu.Content.Item text="Variant: destructive" icon={ShardIcon} variant="destructive" selected />
559
+ <Menu.Content.Separator />
560
+ <Menu.Content.Label text="Disabled Selected Items" />
561
+ <Menu.Content.Item
562
+ text="Variant: primary"
563
+ icon={StarsIcon}
564
+ variant="primary"
565
+ selected
566
+ disabled
567
+ />
568
+ <Menu.Content.Item
569
+ text="Variant: destructive"
570
+ icon={ShardIcon}
571
+ variant="destructive"
572
+ selected
573
+ disabled
574
+ />
575
+ <Menu.Content.DropdownArrow />
576
+ </Menu.Content>
577
+ </Menu>
578
+ ```
579
+
580
+ ### Menu.Content.Item.Compose
581
+
582
+ #### RegularItemComposition
583
+
584
+ > This example shows how regular items can be composed from the building blocks.
585
+
586
+ ```tsx
587
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
588
+ import { MoreactionsIcon, CopyIcon, ShardIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
589
+
590
+ <Menu defaultOpen>
591
+ <Menu.Trigger>
592
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
593
+ </Menu.Trigger>
594
+ <Menu.Content placement="right" align="center">
595
+ <Menu.Content.Label text="Custom composed Regular Items:" />
596
+ <Menu.Content.Separator />
597
+ <Menu.Content.Item.Compose>
598
+ <Menu.Content.Item.Text>Item with text</Menu.Content.Item.Text>
599
+ </Menu.Content.Item.Compose>
600
+ <Menu.Content.Item.Compose>
601
+ <Menu.Content.Item.Icon icon={StarsIcon} />
602
+ <Menu.Content.Item.Text>Item with text and icon</Menu.Content.Item.Text>
603
+ </Menu.Content.Item.Compose>
604
+ <Menu.Content.Item.Compose>
605
+ <Menu.Content.Item.Icon icon={ShardIcon} />
606
+ <Menu.Content.Item.Text>Item with text, icon and</Menu.Content.Item.Text>
607
+ <Menu.Content.Item.Split />
608
+ <Menu.Content.Item.Text>description</Menu.Content.Item.Text>
609
+ </Menu.Content.Item.Compose>
610
+ <Menu.Content.Item.Compose selected>
611
+ <Menu.Content.Item.Icon icon={CopyIcon} />
612
+ <Menu.Content.Item.Text>Item with check mark</Menu.Content.Item.Text>
613
+ <Menu.Content.Item.Split />
614
+ <Menu.Content.Item.Check />
615
+ </Menu.Content.Item.Compose>
616
+ <Menu.Content.DropdownArrow />
617
+ </Menu.Content>
618
+ </Menu>
619
+ ```
620
+
621
+ #### ItemWithSubheadComposition
622
+
623
+ > This example shows how items with `SubHead` can be composed from the building blocks.
624
+
625
+ ```tsx
626
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
627
+ import { MoreactionsIcon, RocketIcon, ShardIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
628
+
629
+ <Menu defaultOpen>
630
+ <Menu.Trigger>
631
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
632
+ </Menu.Trigger>
633
+ <Menu.Content placement="right" align="center">
634
+ <Menu.Content.Label text="Custom composed Items with SubHead:" />
635
+ <Menu.Content.Separator />
636
+ <Menu.Content.Item.Compose>
637
+ <Menu.Content.Item.SubHead>SubHead only</Menu.Content.Item.SubHead>
638
+ </Menu.Content.Item.Compose>
639
+ <Menu.Content.Item.Compose>
640
+ <Menu.Content.Item.SubHead>SubHead with</Menu.Content.Item.SubHead>
641
+ <Menu.Content.Item.Split />
642
+ <Menu.Content.Item.Icon icon={StarsIcon} />
643
+ </Menu.Content.Item.Compose>
644
+ <Menu.Content.Item.Compose>
645
+ <Menu.Content.Item.SubHead>SubHead with</Menu.Content.Item.SubHead>
646
+ <Menu.Content.Item.Text>text</Menu.Content.Item.Text>
647
+ </Menu.Content.Item.Compose>
648
+ <Menu.Content.Item.Compose>
649
+ <Menu.Content.Item.SubHead>SubHead with</Menu.Content.Item.SubHead>
650
+ <Menu.Content.Item.Text>text</Menu.Content.Item.Text>
651
+ <Menu.Content.Item.Split />
652
+ <Menu.Content.Item.Icon icon={ShardIcon} />
653
+ </Menu.Content.Item.Compose>
654
+ <Menu.Content.Item.Compose>
655
+ <Menu.Content.Item.SubHead>SubHead with</Menu.Content.Item.SubHead>
656
+ <Menu.Content.Item.Text>text</Menu.Content.Item.Text>
657
+ <Menu.Content.Item.Split />
658
+ <Menu.Content.Item.Text>description</Menu.Content.Item.Text>
659
+ </Menu.Content.Item.Compose>
660
+ <Menu.Content.Item.Compose>
661
+ <Menu.Content.Item.SubHead>SubHead with</Menu.Content.Item.SubHead>
662
+ <Menu.Content.Item.Text>text</Menu.Content.Item.Text>
663
+ <Menu.Content.Item.Split />
664
+ <Menu.Content.Item.Text>description</Menu.Content.Item.Text>
665
+ <Menu.Content.Item.Icon icon={RocketIcon} />
666
+ </Menu.Content.Item.Compose>
667
+ <Menu.Content.DropdownArrow />
668
+ </Menu.Content>
669
+ </Menu>
670
+ ```
671
+
672
+ #### ItemPropsAndComposition
673
+
674
+ > Composed items work with `disabled`, `selected` and `variant` props.
675
+
676
+ ```tsx
677
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
678
+ import { MoreactionsIcon, ModulesGeneralIcon, RocketIcon, ShardIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
679
+
680
+ <Menu defaultOpen>
681
+ <Menu.Trigger>
682
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
683
+ </Menu.Trigger>
684
+ <Menu.Content placement="right" align="center">
685
+ <Menu.Content.Item.Compose>
686
+ <Menu.Content.Item.Icon icon={ModulesGeneralIcon} />
687
+ <Menu.Content.Item.Text>Normal Item</Menu.Content.Item.Text>
688
+ </Menu.Content.Item.Compose>
689
+ <Menu.Content.Item.Compose disabled>
690
+ <Menu.Content.Item.Icon icon={StarsIcon} />
691
+ <Menu.Content.Item.Text>Disabled Item</Menu.Content.Item.Text>
692
+ </Menu.Content.Item.Compose>
693
+ <Menu.Content.Item.Compose variant="destructive">
694
+ <Menu.Content.Item.Icon icon={ShardIcon} />
695
+ <Menu.Content.Item.Text>Item variant: destructive</Menu.Content.Item.Text>
696
+ </Menu.Content.Item.Compose>
697
+ <Menu.Content.Item.Compose selected>
698
+ <Menu.Content.Item.Icon icon={RocketIcon} />
699
+ <Menu.Content.Item.Text>Item with check mark</Menu.Content.Item.Text>
700
+ <Menu.Content.Item.Split />
701
+ <Menu.Content.Item.Check />
702
+ </Menu.Content.Item.Compose>
703
+ <Menu.Content.DropdownArrow />
704
+ </Menu.Content>
705
+ </Menu>
706
+ ```
707
+
708
+ #### WildLayouts
709
+
710
+ > Examples of custom item layouts using building blocks or user-defined styles and components.
711
+
712
+ ```tsx
713
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
714
+ import {
715
+ MoreactionsIcon,
716
+ ModulesGeneralIcon,
717
+ StarsIcon,
718
+ ToastDangerIcon,
719
+ ToastInfoIcon,
720
+ ToastNotificationIcon
721
+ } from '@redislabsdev/redis-ui-icons';
722
+
723
+ <Menu defaultOpen>
724
+ <Menu.Trigger>
725
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
726
+ </Menu.Trigger>
727
+ <Menu.Content placement="right" align="center">
728
+ <Menu.Content.Label text="With building blocks" />
729
+ <Menu.Content.Item.Compose>
730
+ <Menu.Content.Item.Icon icon={ModulesGeneralIcon} />
731
+ <Menu.Content.Item.Text>Info item</Menu.Content.Item.Text>
732
+ <Menu.Content.Item.Icon
733
+ icon={ToastInfoIcon}
734
+ title="Item information tooltip"
735
+ customSize="1.7rem"
736
+ color="neutral500"
737
+ />
738
+ </Menu.Content.Item.Compose>
739
+ <Menu.Content.Item.Compose>
740
+ <Menu.Content.Item.Icon icon={StarsIcon} />
741
+ <Menu.Content.Item.Text>Danger</Menu.Content.Item.Text>
742
+ <Menu.Content.Item.Split />
743
+ <Menu.Content.Item.Icon
744
+ icon={ToastNotificationIcon}
745
+ color="attention300"
746
+ title="Something happened be careful"
747
+ />
748
+ </Menu.Content.Item.Compose>
749
+ <Menu.Content.Item.Compose variant="destructive">
750
+ <Menu.Content.Item.Icon icon={ToastDangerIcon} />
751
+ <Menu.Content.Item.Text>Alert</Menu.Content.Item.Text>
752
+ <Menu.Content.Item.Split />
753
+ <Menu.Content.Item.Icon icon={ToastDangerIcon} />
754
+ <Menu.Content.Item.Text>Alert</Menu.Content.Item.Text>
755
+ <Menu.Content.Item.Split />
756
+ <Menu.Content.Item.Icon icon={ToastDangerIcon} />
757
+ <Menu.Content.Item.Text>Alert</Menu.Content.Item.Text>
758
+ <Menu.Content.Item.Split />
759
+ </Menu.Content.Item.Compose>
760
+ <Menu.Content.Separator />
761
+ <Menu.Content.Label text="With user defined styles and components" />
762
+ <Menu.Content.Item.Compose>
763
+ <div style={{ flex: 1, display: 'flex', alignItems: 'center' }}>
764
+ <StarsIcon customColor="currentColor" />
765
+ <span style={{ marginLeft: 10 }}>Danger</span>
766
+ </div>
767
+ <ToastNotificationIcon color="attention300" title="Something happened be careful" />
768
+ </Menu.Content.Item.Compose>
769
+ <Menu.Content.Item.Compose>
770
+ <div
771
+ style={{
772
+ flex: 1,
773
+ display: 'flex',
774
+ alignItems: 'center',
775
+ justifyContent: 'space-evenly'
776
+ }}
777
+ >
778
+ <StarsIcon customColor="red" />
779
+ <StarsIcon customColor="blue" />
780
+ <StarsIcon customColor="orange" />
781
+ <StarsIcon customColor="green" />
782
+ <StarsIcon customColor="magenta" />
783
+ </div>
784
+ </Menu.Content.Item.Compose>
785
+ <Menu.Content.DropdownArrow />
786
+ </Menu.Content>
787
+ </Menu>
788
+ ```
789
+
790
+ ### Menu.Content.Label
791
+
792
+ #### Playground
793
+
794
+ ```tsx
795
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
796
+ import { MoreactionsIcon } from '@redislabsdev/redis-ui-icons';
797
+
798
+ <Menu open>
799
+ <Menu.Trigger>
800
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
801
+ </Menu.Trigger>
802
+ <Menu.Content placement="right" align="center">
803
+ <Menu.Content.Label text="Label" />
804
+ <Menu.Content.DropdownArrow />
805
+ </Menu.Content>
806
+ </Menu>
807
+ ```
808
+
809
+ #### TextAndIcon
810
+
811
+ > Use the `text` and `icon` props to provide the label content.
812
+
813
+ ```tsx
814
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
815
+ import { ContractIcon, MoreactionsIcon, WandIcon } from '@redislabsdev/redis-ui-icons';
816
+
817
+ <Menu defaultOpen>
818
+ <Menu.Trigger>
819
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
820
+ </Menu.Trigger>
821
+ <Menu.Content placement="right" align="center">
822
+ <Menu.Content.Label text="Label with text and icon" icon={ContractIcon} />
823
+ <Menu.Content.Label text="Label with text only" />
824
+ <Menu.Content.Label icon={WandIcon} title="Label with icon only" />
825
+ <Menu.Content.DropdownArrow />
826
+ </Menu.Content>
827
+ </Menu>
828
+ ```
829
+
830
+ #### Variants
831
+
832
+ > Labels support `header` and `sub` variants.
833
+
834
+ ```tsx
835
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
836
+ import { ContractIcon, MoreactionsIcon, WandIcon } from '@redislabsdev/redis-ui-icons';
837
+
838
+ <Menu defaultOpen>
839
+ <Menu.Trigger>
840
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
841
+ </Menu.Trigger>
842
+ <Menu.Content placement="right" align="center">
843
+ <Menu.Content.Label text="variant:header" icon={ContractIcon} />
844
+ <Menu.Content.Label text="variant:sub" icon={WandIcon} variant="sub" />
845
+ <Menu.Content.DropdownArrow />
846
+ </Menu.Content>
847
+ </Menu>
848
+ ```
849
+
850
+ #### Shift
851
+
852
+ > Labels can use `shift` to add left padding to the content. Shift can be a number for the standard menu-level offset or a string for a custom CSS unit.
853
+
854
+ ```tsx
855
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
856
+ import { MoreactionsIcon, WandIcon } from '@redislabsdev/redis-ui-icons';
857
+
858
+ <Menu defaultOpen>
859
+ <Menu.Trigger>
860
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
861
+ </Menu.Trigger>
862
+ <Menu.Content placement="right" align="center">
863
+ <Menu.Content.Label text="no shift" />
864
+ <Menu.Content.Label text="shift: 1" shift={1} />
865
+ <Menu.Content.Label text="shift: 2" shift={2} />
866
+ <Menu.Content.Label text="shift: 3" shift={3} />
867
+ <Menu.Content.Label text='shift: "1rem"' shift="1rem" />
868
+ <Menu.Content.Label text='shift: "1rem"' icon={WandIcon} shift="1rem" />
869
+ <Menu.Content.DropdownArrow />
870
+ </Menu.Content>
871
+ </Menu>
872
+ ```
873
+
874
+ #### LabelComposition
875
+
876
+ > This example shows how labels can be composed from the building blocks.
877
+
878
+ ```tsx
879
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
880
+ import { MoreactionsIcon, StarsIcon } from '@redislabsdev/redis-ui-icons';
881
+
882
+ <Menu defaultOpen>
883
+ <Menu.Trigger>
884
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
885
+ </Menu.Trigger>
886
+ <Menu.Content placement="right" align="center">
887
+ <Menu.Content.Label text="Custom composed Labels:" />
888
+ <Menu.Content.Separator />
889
+ <Menu.Content.Label.Compose>
890
+ <Menu.Content.Label.Text>Label with text</Menu.Content.Label.Text>
891
+ </Menu.Content.Label.Compose>
892
+ <Menu.Content.Label.Compose>
893
+ <Menu.Content.Label.Icon icon={StarsIcon} />
894
+ <Menu.Content.Label.Text>Label with text and icon</Menu.Content.Label.Text>
895
+ </Menu.Content.Label.Compose>
896
+ <Menu.Content.Label.Compose>
897
+ <Menu.Content.Label.Text>Label with text</Menu.Content.Label.Text>
898
+ <Menu.Content.Item.Split />
899
+ <Menu.Content.Label.Text variant="italic">and other text</Menu.Content.Label.Text>
900
+ </Menu.Content.Label.Compose>
901
+ <Menu.Content.DropdownArrow />
902
+ </Menu.Content>
903
+ </Menu>
904
+ ```
905
+
906
+ #### WildLayouts
907
+
908
+ > Examples of custom label layouts using building blocks or user-defined styles and components.
909
+
910
+ ```tsx
911
+ import { ActionIconButton, Menu } from '@redislabsdev/redis-ui-components';
912
+ import {
913
+ MoreactionsIcon,
914
+ ModulesGeneralIcon,
915
+ StarsIcon,
916
+ ToastInfoIcon,
917
+ ToastNotificationIcon
918
+ } from '@redislabsdev/redis-ui-icons';
919
+
920
+ <Menu defaultOpen>
921
+ <Menu.Trigger>
922
+ <ActionIconButton size="L" variant="primary" icon={MoreactionsIcon} />
923
+ </Menu.Trigger>
924
+ <Menu.Content placement="right" align="center">
925
+ <Menu.Content.Label text="With building blocks" />
926
+ <Menu.Content.Label.Compose>
927
+ <Menu.Content.Label.Icon icon={ModulesGeneralIcon} />
928
+ <Menu.Content.Label.Text>Info label</Menu.Content.Label.Text>
929
+ <Menu.Content.Label.Icon
930
+ icon={ToastInfoIcon}
931
+ title="Label information tooltip"
932
+ customSize="1.7rem"
933
+ color="neutral500"
934
+ />
935
+ </Menu.Content.Label.Compose>
936
+ <Menu.Content.Label.Compose>
937
+ <Menu.Content.Label.Icon icon={StarsIcon} />
938
+ <Menu.Content.Label.Text>Danger</Menu.Content.Label.Text>
939
+ <Menu.Content.Item.Split />
940
+ <Menu.Content.Label.Icon
941
+ icon={ToastNotificationIcon}
942
+ color="attention300"
943
+ title="Something happened be careful"
944
+ />
945
+ </Menu.Content.Label.Compose>
946
+ <Menu.Content.Separator />
947
+ <Menu.Content.Label text="With user defined styles and components" />
948
+ <Menu.Content.Label.Compose>
949
+ <div style={{ flex: 1, display: 'flex', alignItems: 'center' }}>
950
+ <StarsIcon customColor="currentColor" />
951
+ <span style={{ marginLeft: 10 }}>Danger</span>
952
+ </div>
953
+ <ToastNotificationIcon color="attention300" title="Something happened be careful" />
954
+ </Menu.Content.Label.Compose>
955
+ <Menu.Content.Label.Compose
956
+ style={{
957
+ flex: 1,
958
+ display: 'flex',
959
+ alignItems: 'center',
960
+ justifyContent: 'space-evenly'
961
+ }}
962
+ >
963
+ <StarsIcon customColor="red" />
964
+ <StarsIcon customColor="blue" />
965
+ <StarsIcon customColor="orange" />
966
+ <StarsIcon customColor="green" />
967
+ <StarsIcon customColor="magenta" />
968
+ </Menu.Content.Label.Compose>
969
+ <Menu.Content.DropdownArrow />
970
+ </Menu.Content>
971
+ </Menu>
972
+ ```
973
+
974
+ ## Notes
975
+
976
+ - `Menu` wraps the dropdown root in a disabled-field context; when `disabled` is set, the menu is forced closed and `onOpenChange` is suppressed.
977
+ - `Menu.Content` defaults to `placement="bottom"`, `align="center"`, `sideOffset={5}`, and `portal={document.body}`.
978
+ - `Menu.Trigger` can render as an invisible button wrapper when `withButton` is enabled.
979
+ - `Menu.Trigger.Arrow` uses a down-chevron icon that rotates with the menu open state.
980
+ - `Menu.Content.Item` regular items require `text`; `subHead` switches the layout and makes the text optional.
981
+ - `Menu.Content.Item` selection is handled through `selected` and `isSelected` is deprecated.
982
+ - `Menu.Content.Item.Compose` disables click handling when the item is selected.
983
+ - `Menu.Content.Item.Text` and `Menu.Content.Label.Text` inherit `Typography.Body` and render with ellipsis.
984
+ - `Menu.Content.Item.SubHead` renders the same text surface with semi-bold typography.
985
+ - `Menu.Content.Item.Check` defaults to `CheckBoldIcon`.
986
+ - `Menu.Content.Label` uses `text` as the preferred content prop and keeps `children` only as a deprecated alias.
987
+ - `Menu.Content.Label.Compose` defaults to the `header` variant.
988
+ - `Menu.Content.DropdownArrow` is optional and only needed when the menu should render the Radix arrow.