or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

index.mdlayout-components.mdmenu-container.mdmenu-items.mdsubmenu-system.md

menu-container.mddocs/

0

# Menu Container

1

2

The Menu component serves as the main container for all menu functionality, providing comprehensive configuration for layout modes, selection behavior, keyboard navigation, animations, and event handling.

3

4

## Capabilities

5

6

### Menu Component

7

8

Main menu container component with extensive customization options.

9

10

```typescript { .api }

11

/**

12

* Main menu container component

13

* @param props - Menu configuration props

14

* @returns React component

15

*/

16

declare const Menu: React.ForwardRefExoticComponent<MenuProps & React.RefAttributes<HTMLUListElement>>;

17

18

interface MenuProps extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onClick' | 'onSelect' | 'dir'> {

19

// Basic Configuration

20

prefixCls?: string;

21

rootClassName?: string;

22

items?: any[]; // Array of item objects with key, label, children properties

23

children?: React.ReactNode;

24

disabled?: boolean;

25

direction?: 'ltr' | 'rtl';

26

27

// Layout Mode

28

mode?: 'horizontal' | 'vertical' | 'inline';

29

inlineCollapsed?: boolean;

30

disabledOverflow?: boolean;

31

32

// Selection Control

33

selectable?: boolean;

34

multiple?: boolean;

35

defaultSelectedKeys?: string[];

36

selectedKeys?: string[];

37

38

// Active State Control

39

activeKey?: string;

40

defaultActiveFirst?: boolean;

41

42

// Open/Close Control

43

defaultOpenKeys?: string[];

44

openKeys?: string[];

45

46

// Event Handlers

47

onSelect?: (info: { key: string; keyPath: string[]; selectedKeys: string[]; domEvent: React.MouseEvent | React.KeyboardEvent }) => void;

48

onDeselect?: (info: { key: string; keyPath: string[]; selectedKeys: string[]; domEvent: React.MouseEvent | React.KeyboardEvent }) => void;

49

onClick?: (info: { key: string; keyPath: string[]; domEvent: React.MouseEvent | React.KeyboardEvent }) => void;

50

onOpenChange?: (openKeys: string[]) => void;

51

52

// Styling & Animation

53

inlineIndent?: number;

54

motion?: any; // Animation configuration object

55

defaultMotions?: any; // Default animation configurations for different modes

56

57

// SubMenu Configuration

58

subMenuOpenDelay?: number;

59

subMenuCloseDelay?: number;

60

forceSubMenuRender?: boolean;

61

triggerSubMenuAction?: 'click' | 'hover';

62

builtinPlacements?: Record<string, any>;

63

64

// Icons

65

itemIcon?: React.ReactNode | ((props: any) => React.ReactNode);

66

expandIcon?: React.ReactNode | ((props: any) => React.ReactNode);

67

overflowedIndicator?: React.ReactNode;

68

overflowedIndicatorPopupClassName?: string;

69

70

// Container Function

71

getPopupContainer?: (node: HTMLElement) => HTMLElement;

72

}

73

```

74

75

**Usage Examples:**

76

77

```typescript

78

import Menu, { MenuItem, SubMenu } from "rc-menu";

79

80

// Basic vertical menu

81

<Menu mode="vertical" defaultSelectedKeys={['1']}>

82

<MenuItem key="1">Option 1</MenuItem>

83

<MenuItem key="2">Option 2</MenuItem>

84

</Menu>

85

86

// Horizontal menu with selection

87

<Menu

88

mode="horizontal"

89

selectable={true}

90

multiple={true}

91

onSelect={(info) => console.log('Selected:', info.selectedKeys)}

92

>

93

<MenuItem key="1">Home</MenuItem>

94

<MenuItem key="2">About</MenuItem>

95

<MenuItem key="3">Contact</MenuItem>

96

</Menu>

97

98

// Inline menu with controlled state

99

const [selectedKeys, setSelectedKeys] = useState(['1']);

100

const [openKeys, setOpenKeys] = useState(['sub1']);

101

102

<Menu

103

mode="inline"

104

selectedKeys={selectedKeys}

105

openKeys={openKeys}

106

onSelect={(info) => setSelectedKeys(info.selectedKeys)}

107

onOpenChange={setOpenKeys}

108

>

109

<MenuItem key="1">Navigation One</MenuItem>

110

<SubMenu key="sub1" title="Sub Menu">

111

<MenuItem key="2">Option 1</MenuItem>

112

<MenuItem key="3">Option 2</MenuItem>

113

</SubMenu>

114

</Menu>

115

```

116

117

### Menu Ref Interface

118

119

Reference interface for Menu component providing programmatic control.

120

121

```typescript { .api }

122

/**

123

* Reference interface for Menu component

124

*/

125

interface MenuRef {

126

/**

127

* Focus active child if any, or the first child which is not disabled

128

* @param options - Focus options

129

*/

130

focus: (options?: FocusOptions) => void;

131

/** Direct access to the underlying list element */

132

list: HTMLUListElement;

133

}

134

```

135

136

**Usage Example:**

137

138

```typescript

139

import { useRef } from 'react';

140

import Menu, { MenuItem } from 'rc-menu';

141

142

const menuRef = useRef<MenuRef>(null);

143

144

const focusMenu = () => {

145

menuRef.current?.focus();

146

};

147

148

<Menu ref={menuRef}>

149

<MenuItem key="1">Option 1</MenuItem>

150

<MenuItem key="2">Option 2</MenuItem>

151

</Menu>

152

```

153

154

### Selection Modes

155

156

Different selection behaviors and configurations.

157

158

**Single Selection (Default):**

159

160

```typescript

161

<Menu selectable={true} defaultSelectedKeys={['1']}>

162

<MenuItem key="1">Option 1</MenuItem>

163

<MenuItem key="2">Option 2</MenuItem>

164

</Menu>

165

```

166

167

**Multiple Selection:**

168

169

```typescript

170

<Menu

171

selectable={true}

172

multiple={true}

173

defaultSelectedKeys={['1', '3']}

174

onSelect={(info) => console.log('Selected:', info.selectedKeys)}

175

onDeselect={(info) => console.log('Deselected:', info.selectedKeys)}

176

>

177

<MenuItem key="1">Option 1</MenuItem>

178

<MenuItem key="2">Option 2</MenuItem>

179

<MenuItem key="3">Option 3</MenuItem>

180

</Menu>

181

```

182

183

**Non-selectable Menu:**

184

185

```typescript

186

<Menu selectable={false} onClick={(info) => console.log('Clicked:', info.key)}>

187

<MenuItem key="1">Action 1</MenuItem>

188

<MenuItem key="2">Action 2</MenuItem>

189

</Menu>

190

```

191

192

### Animation Configuration

193

194

Configure animations for different menu modes and transitions.

195

196

```typescript

197

const customMotions = {

198

inline: {

199

motionName: 'rc-menu-collapse',

200

onAppearStart: () => ({ height: 0 }),

201

onAppearActive: () => ({ height: 'auto' }),

202

onLeaveStart: () => ({ height: 'auto' }),

203

onLeaveActive: () => ({ height: 0 }),

204

},

205

vertical: {

206

motionName: 'slide-up',

207

},

208

horizontal: {

209

motionName: 'zoom-big',

210

},

211

};

212

213

<Menu mode="inline" defaultMotions={customMotions}>

214

<SubMenu key="sub1" title="Animated SubMenu">

215

<MenuItem key="1">Option 1</MenuItem>

216

<MenuItem key="2">Option 2</MenuItem>

217

</SubMenu>

218

</Menu>

219

```

220

221

### Event Handling

222

223

Comprehensive event handling for different interaction patterns.

224

225

```typescript

226

const handleClick = (info: { key: string; keyPath: string[]; domEvent: React.MouseEvent | React.KeyboardEvent }) => {

227

console.log('Clicked item:', info.key);

228

console.log('Key path:', info.keyPath);

229

console.log('DOM event:', info.domEvent);

230

};

231

232

const handleSelect = (info: { key: string; keyPath: string[]; selectedKeys: string[]; domEvent: React.MouseEvent | React.KeyboardEvent }) => {

233

console.log('Selected item:', info.key);

234

console.log('All selected keys:', info.selectedKeys);

235

};

236

237

const handleOpenChange = (openKeys: string[]) => {

238

console.log('Open submenus:', openKeys);

239

};

240

241

<Menu

242

onClick={handleClick}

243

onSelect={handleSelect}

244

onOpenChange={handleOpenChange}

245

>

246

{/* Menu items */}

247

</Menu>

248

```