@ltht-react/menu 2.0.168 → 2.0.170

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.
package/lib/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
- import ActionMenu, { ActionMenuOption } from './molecules/action-menu';
1
+ import ActionMenu, { ActionMenuOption, DefaultTrigger } from './molecules/action-menu';
2
+ import { Menu, MenuItem } from './molecules/menu';
2
3
  export default ActionMenu;
3
- export { ActionMenuOption };
4
+ export { Menu, MenuItem };
5
+ export { ActionMenuOption, DefaultTrigger };
package/lib/index.js CHANGED
@@ -1,8 +1,33 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
4
24
  };
5
25
  Object.defineProperty(exports, "__esModule", { value: true });
6
- var action_menu_1 = __importDefault(require("./molecules/action-menu"));
26
+ exports.DefaultTrigger = exports.MenuItem = exports.Menu = void 0;
27
+ var action_menu_1 = __importStar(require("./molecules/action-menu"));
28
+ Object.defineProperty(exports, "DefaultTrigger", { enumerable: true, get: function () { return action_menu_1.DefaultTrigger; } });
29
+ var menu_1 = require("./molecules/menu");
30
+ Object.defineProperty(exports, "Menu", { enumerable: true, get: function () { return menu_1.Menu; } });
31
+ Object.defineProperty(exports, "MenuItem", { enumerable: true, get: function () { return menu_1.MenuItem; } });
7
32
  exports.default = action_menu_1.default;
8
33
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;;;;AAAA,wEAAsE;AAEtE,kBAAe,qBAAU,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qEAAsF;AAK3D,+FALY,4BAAc,OAKZ;AAJzC,yCAAiD;AAGxC,qFAHA,WAAI,OAGA;AAAE,yFAHA,eAAQ,OAGA;AADvB,kBAAe,qBAAU,CAAA"}
@@ -1,27 +1,30 @@
1
- import { ButtonProps } from '@ltht-react/button/lib/atoms/button';
2
- import { IconProps } from '@ltht-react/icon';
3
1
  import { FC, HTMLAttributes } from 'react';
4
- declare const ActionMenu: FC<IProps>;
2
+ import { IconProps } from '@ltht-react/icon';
3
+ import { ButtonProps } from '@ltht-react/button';
5
4
  interface IProps extends HTMLAttributes<HTMLButtonElement> {
6
5
  actions: ActionMenuOption[];
7
6
  menuButtonOptions?: IconButtonMenuProps | ButtonMenuProps;
8
- popupStyle?: React.CSSProperties;
9
- popupPlacement?: 'bottom-start' | 'right-start';
7
+ disabled?: boolean;
10
8
  }
11
9
  interface IconButtonMenuProps {
12
10
  type: 'icon';
13
11
  iconProps: IconProps;
14
12
  text?: string;
13
+ disabled?: boolean;
15
14
  }
16
15
  interface ButtonMenuProps {
17
16
  type: 'button';
18
17
  buttonProps: ButtonProps;
19
18
  text: string;
20
19
  }
21
- export interface ActionMenuOption {
20
+ export interface ActionMenuOption extends HTMLAttributes<HTMLButtonElement> {
22
21
  text: string;
23
- clickHandler: () => void;
22
+ clickHandler?: VoidFunction;
24
23
  leftIcon?: IconProps;
25
24
  rightIcon?: IconProps;
25
+ disabled?: boolean;
26
+ actions?: ActionMenuOption[];
26
27
  }
28
+ export declare const DefaultTrigger: IconButtonMenuProps;
29
+ declare const ActionMenu: FC<IProps>;
27
30
  export default ActionMenu;
@@ -1,8 +1,4 @@
1
1
  "use strict";
2
- var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
- if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
- return cooked;
5
- };
6
2
  var __assign = (this && this.__assign) || function () {
7
3
  __assign = Object.assign || function(t) {
8
4
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -14,29 +10,6 @@ var __assign = (this && this.__assign) || function () {
14
10
  };
15
11
  return __assign.apply(this, arguments);
16
12
  };
17
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
- if (k2 === undefined) k2 = k;
19
- var desc = Object.getOwnPropertyDescriptor(m, k);
20
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
- desc = { enumerable: true, get: function() { return m[k]; } };
22
- }
23
- Object.defineProperty(o, k2, desc);
24
- }) : (function(o, m, k, k2) {
25
- if (k2 === undefined) k2 = k;
26
- o[k2] = m[k];
27
- }));
28
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
- Object.defineProperty(o, "default", { enumerable: true, value: v });
30
- }) : function(o, v) {
31
- o["default"] = v;
32
- });
33
- var __importStar = (this && this.__importStar) || function (mod) {
34
- if (mod && mod.__esModule) return mod;
35
- var result = {};
36
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
37
- __setModuleDefault(result, mod);
38
- return result;
39
- };
40
13
  var __rest = (this && this.__rest) || function (s, e) {
41
14
  var t = {};
42
15
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
@@ -52,79 +25,31 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
52
25
  return (mod && mod.__esModule) ? mod : { "default": mod };
53
26
  };
54
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.DefaultTrigger = void 0;
55
29
  var jsx_runtime_1 = require("react/jsx-runtime");
56
- var styled_1 = __importDefault(require("@emotion/styled"));
57
- var button_1 = __importDefault(require("@ltht-react/button/lib/atoms/button"));
58
- var icon_1 = __importStar(require("@ltht-react/icon"));
59
- var styles_1 = require("@ltht-react/styles");
60
- var focus_trap_react_1 = __importDefault(require("focus-trap-react"));
61
- var react_1 = require("react");
62
- var react_popper_1 = require("react-popper");
30
+ var icon_1 = __importDefault(require("@ltht-react/icon"));
63
31
  var utils_1 = require("@ltht-react/utils");
64
- var defaultMenuButtonProps = {
32
+ var menu_1 = require("./menu");
33
+ exports.DefaultTrigger = {
65
34
  type: 'icon',
66
35
  iconProps: {
67
36
  type: 'ellipsis-vertical',
68
37
  size: 'large',
69
38
  },
70
39
  };
71
- var StyledUnorderedList = styled_1.default.ul(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n ", "\n list-style-type: none;\n padding: 0;\n margin: 0;\n"], ["\n ", "\n list-style-type: none;\n padding: 0;\n margin: 0;\n"])), styles_1.CSS_RESET);
72
- var StyledListItem = styled_1.default.li(templateObject_2 || (templateObject_2 = __makeTemplateObject(["\n ", "\n background-color: 'white';\n padding: 0.5rem;\n line-height: 1em;\n display: flex;\n border-radius: 4px;\n\n &:hover {\n background: ", ";\n cursor: pointer;\n color: white;\n }\n"], ["\n ", "\n background-color: 'white';\n padding: 0.5rem;\n line-height: 1em;\n display: flex;\n border-radius: 4px;\n\n &:hover {\n background: ", ";\n cursor: pointer;\n color: white;\n }\n"])), styles_1.CSS_RESET, styles_1.BTN_COLOURS.PRIMARY.VALUE);
73
- var StyledListItemIcon = styled_1.default.div(templateObject_3 || (templateObject_3 = __makeTemplateObject(["\n flex-basis: 25%;\n"], ["\n flex-basis: 25%;\n"])));
74
- var StyledListItemContent = styled_1.default.div(templateObject_4 || (templateObject_4 = __makeTemplateObject(["\n flex: 1;\n text-align: left;\n"], ["\n flex: 1;\n text-align: left;\n"])));
75
- var StyledCard = styled_1.default.div(templateObject_5 || (templateObject_5 = __makeTemplateObject(["\n ", "\n display: inline-block;\n min-width: 10rem;\n z-index: 1;\n background: white;\n border-radius: 4px;\n box-shadow: 0px 1px 10px rgba(0, 0, 0, 0.04), 0px 4px 5px rgba(0, 0, 0, 0.06), 0px 2px 4px -1px rgba(0, 0, 0, 0.09);\n"], ["\n ", "\n display: inline-block;\n min-width: 10rem;\n z-index: 1;\n background: white;\n border-radius: 4px;\n box-shadow: 0px 1px 10px rgba(0, 0, 0, 0.04), 0px 4px 5px rgba(0, 0, 0, 0.06), 0px 2px 4px -1px rgba(0, 0, 0, 0.09);\n"])), styles_1.CSS_RESET);
76
- var StyledRightIcon = (0, styled_1.default)(icon_1.default)(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n margin-right: 0.5rem;\n margin-left: 3rem;\n"], ["\n margin-right: 0.5rem;\n margin-left: 3rem;\n"])));
77
- var StyledLeftIcon = (0, styled_1.default)(icon_1.default)(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n margin-right: 0.5rem;\n margin-left: 0.5rem;\n"], ["\n margin-right: 0.5rem;\n margin-left: 0.5rem;\n"])));
78
- var StyledMenuButtonWrapper = styled_1.default.div(templateObject_8 || (templateObject_8 = __makeTemplateObject(["\n display: inline-block;\n"], ["\n display: inline-block;\n"])));
79
40
  var ActionMenu = function (_a) {
80
- var actions = _a.actions, _b = _a.menuButtonOptions, menuButtonOptions = _b === void 0 ? defaultMenuButtonProps : _b, _c = _a.id, id = _c === void 0 ? 'action-menu-button' : _c, _d = _a.popupStyle, popupStyle = _d === void 0 ? {} : _d, _e = _a.popupPlacement, popupPlacement = _e === void 0 ? 'bottom-start' : _e, rest = __rest(_a, ["actions", "menuButtonOptions", "id", "popupStyle", "popupPlacement"]);
41
+ var _b = _a.id, id = _b === void 0 ? 'action-menu-button' : _b, actions = _a.actions, disabled = _a.disabled, _c = _a.menuButtonOptions, menuButtonOptions = _c === void 0 ? __assign(__assign({}, exports.DefaultTrigger), { disabled: disabled }) : _c, rest = __rest(_a, ["id", "actions", "disabled", "menuButtonOptions"]);
81
42
  var menuItemIdPrefix = id ? "".concat(id, "-") : '';
82
- var popperRef = (0, react_1.useRef)(null);
83
- var _f = (0, react_1.useState)(null), popperElement = _f[0], setPopperElement = _f[1];
84
- var _g = (0, react_1.useState)(null), containerElement = _g[0], setContainerElement = _g[1];
85
- var popper = (0, react_popper_1.usePopper)(popperRef.current, popperElement, {
86
- placement: popupPlacement,
87
- strategy: 'fixed',
88
- });
89
- var closePopper = function () {
90
- setShowMenu(false);
91
- };
92
- var _h = (0, react_1.useState)(false), showMenu = _h[0], setShowMenu = _h[1];
93
- (0, react_1.useEffect)(function () {
94
- var _a;
95
- if ((_a = containerElement === null || containerElement === void 0 ? void 0 : containerElement.parentElement) === null || _a === void 0 ? void 0 : _a.style) {
96
- containerElement.parentElement.style.zIndex = showMenu
97
- ? "".concat((0, styles_1.getZIndex)(styles_1.PopUp))
98
- : "".concat((0, styles_1.getZIndex)(styles_1.TableDataWithPopUp));
99
- }
100
- }, [containerElement, showMenu]);
101
- var menuButtonClickHandler = function () {
102
- setShowMenu(!showMenu);
103
- };
104
- return ((0, jsx_runtime_1.jsx)("div", { ref: setContainerElement, children: (0, jsx_runtime_1.jsx)(focus_trap_react_1.default, { active: showMenu, focusTrapOptions: {
105
- tabbableOptions: {
106
- displayCheck: 'none',
107
- },
108
- initialFocus: false,
109
- allowOutsideClick: false,
110
- clickOutsideDeactivates: true,
111
- onDeactivate: closePopper,
112
- }, children: (0, jsx_runtime_1.jsxs)(StyledMenuButtonWrapper, { ref: popperRef, children: [menuButtonOptions.type === 'icon' && ((0, jsx_runtime_1.jsx)(icon_1.IconButton, __assign({ iconProps: menuButtonOptions.iconProps, text: menuButtonOptions.text }, rest, { onClick: function (e) {
113
- e.stopPropagation();
114
- menuButtonClickHandler();
115
- }, id: id, "data-testid": id }))), menuButtonOptions.type === 'button' && ((0, jsx_runtime_1.jsx)(button_1.default, __assign({}, menuButtonOptions.buttonProps, rest, { onClick: function (e) {
116
- e.stopPropagation();
117
- menuButtonClickHandler();
118
- }, id: id, "data-testid": id, children: menuButtonOptions.text }))), showMenu && ((0, jsx_runtime_1.jsx)(StyledCard, __assign({ tabIndex: -1, ref: setPopperElement, style: __assign(__assign({}, popper.styles.popper), popupStyle) }, popper.attributes.popper, { children: (0, jsx_runtime_1.jsx)(StyledUnorderedList, { role: "menu", "aria-labelledby": id, children: actions.map(function (action, idx) {
119
- var textId = (0, utils_1.stringToHtmlId)(action.text);
120
- var actionMenuItemId = "".concat(menuItemIdPrefix, "action-menu-item-").concat(textId, "-").concat(idx);
121
- return ((0, jsx_runtime_1.jsxs)(StyledListItem, { "data-testid": actionMenuItemId, id: actionMenuItemId, role: "menuitem", onClick: function (e) {
122
- e.stopPropagation();
123
- menuButtonClickHandler();
124
- action.clickHandler();
125
- }, children: [(0, jsx_runtime_1.jsx)(StyledListItemIcon, { children: action.leftIcon && (0, jsx_runtime_1.jsx)(StyledLeftIcon, __assign({}, action.leftIcon)) }), (0, jsx_runtime_1.jsx)(StyledListItemContent, { children: action.text }), (0, jsx_runtime_1.jsx)(StyledListItemIcon, { children: action.rightIcon && (0, jsx_runtime_1.jsx)(StyledRightIcon, __assign({}, action.rightIcon)) })] }, "menu-action-".concat(idx)));
126
- }) }) })))] }) }) }));
43
+ return ((0, jsx_runtime_1.jsx)(menu_1.Menu, __assign({ rootTrigger: menuButtonOptions, "data-testid": id }, rest, { children: actions.map(function (action, index) { return renderAction(menuItemIdPrefix, action, index); }) })));
44
+ };
45
+ var renderAction = function (idPrefix, _a, index) {
46
+ var text = _a.text, leftIcon = _a.leftIcon, rightIcon = _a.rightIcon, clickHandler = _a.clickHandler, onClick = _a.onClick, actions = _a.actions, rest = __rest(_a, ["text", "leftIcon", "rightIcon", "clickHandler", "onClick", "actions"]);
47
+ var textId = (0, utils_1.stringToHtmlId)(text);
48
+ var actionMenuItemId = "".concat(idPrefix, "action-menu-item-").concat(textId, "-").concat(index);
49
+ if (!!(actions === null || actions === void 0 ? void 0 : actions.length) && actions.length > 0) {
50
+ return ((0, jsx_runtime_1.jsx)(menu_1.Menu, __assign({ id: actionMenuItemId, "data-testid": actionMenuItemId, label: text, leftIcon: leftIcon ? (0, jsx_runtime_1.jsx)(icon_1.default, __assign({}, leftIcon)) : null, rightIcon: rightIcon ? (0, jsx_runtime_1.jsx)(icon_1.default, __assign({}, rightIcon)) : null }, rest, { children: actions.map(function (action, index) { return renderAction(actionMenuItemId, action, index); }) }), actionMenuItemId));
51
+ }
52
+ return ((0, jsx_runtime_1.jsx)(menu_1.MenuItem, __assign({ id: actionMenuItemId, "data-testid": actionMenuItemId, label: text, leftIcon: leftIcon ? (0, jsx_runtime_1.jsx)(icon_1.default, __assign({}, leftIcon)) : null, rightIcon: rightIcon ? (0, jsx_runtime_1.jsx)(icon_1.default, __assign({}, rightIcon)) : null, onClick: clickHandler !== null && clickHandler !== void 0 ? clickHandler : onClick }, rest), actionMenuItemId));
127
53
  };
128
54
  exports.default = ActionMenu;
129
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8;
130
55
  //# sourceMappingURL=action-menu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"action-menu.js","sourceRoot":"","sources":["../../src/molecules/action-menu.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"action-menu.js","sourceRoot":"","sources":["../../src/molecules/action-menu.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,0DAAkD;AAClD,2CAAkD;AAGlD,+BAAuC;AA8B1B,QAAA,cAAc,GAAwB;IACjD,IAAI,EAAE,MAAM;IACZ,SAAS,EAAE;QACT,IAAI,EAAE,mBAAmB;QACzB,IAAI,EAAE,OAAO;KACd;CACF,CAAA;AAED,IAAM,UAAU,GAAe,UAAC,EAM/B;IALC,IAAA,UAAyB,EAAzB,EAAE,mBAAG,oBAAoB,KAAA,EACzB,OAAO,aAAA,EACP,QAAQ,cAAA,EACR,yBAAmD,EAAnD,iBAAiB,yCAAQ,sBAAc,KAAE,QAAQ,UAAA,QAAE,EAChD,IAAI,cALuB,kDAM/B,CADQ;IAEP,IAAM,gBAAgB,GAAG,EAAE,CAAC,CAAC,CAAC,UAAG,EAAE,MAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAE3C,OAAO,CACL,uBAAC,WAAI,aAAC,WAAW,EAAE,iBAAiB,iBAAe,EAAE,IAAM,IAAI,cAC5D,OAAO,CAAC,GAAG,CAAC,UAAC,MAAM,EAAE,KAAK,IAAK,OAAA,YAAY,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,EAA7C,CAA6C,CAAC,IACzE,CACR,CAAA;AACH,CAAC,CAAA;AAED,IAAM,YAAY,GAAG,UACnB,QAAgB,EAChB,EAAwF,EACxF,KAAa;IADX,IAAA,IAAI,UAAA,EAAE,QAAQ,cAAA,EAAE,SAAS,eAAA,EAAE,YAAY,kBAAA,EAAE,OAAO,aAAA,EAAE,OAAO,aAAA,EAAK,IAAI,cAApE,uEAAsE,CAAF;IAGpE,IAAM,MAAM,GAAG,IAAA,sBAAc,EAAC,IAAI,CAAC,CAAA;IACnC,IAAM,gBAAgB,GAAG,UAAG,QAAQ,8BAAoB,MAAM,cAAI,KAAK,CAAE,CAAA;IAEzE,IAAI,CAAC,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAA,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,CACL,uBAAC,WAAI,aAEH,EAAE,EAAE,gBAAgB,iBACP,gBAAgB,EAC7B,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,uBAAC,cAAI,eAAK,QAAQ,EAAI,CAAC,CAAC,CAAC,IAAI,EAClD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,uBAAC,cAAI,eAAK,SAAS,EAAI,CAAC,CAAC,CAAC,IAAI,IACjD,IAAI,cAEP,OAAO,CAAC,GAAG,CAAC,UAAC,MAAM,EAAE,KAAK,IAAK,OAAA,YAAY,CAAC,gBAAgB,EAAE,MAAM,EAAE,KAAK,CAAC,EAA7C,CAA6C,CAAC,KARzE,gBAAgB,CAShB,CACR,CAAA;IACH,CAAC;IAED,OAAO,CACL,uBAAC,eAAQ,aAEP,EAAE,EAAE,gBAAgB,iBACP,gBAAgB,EAC7B,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,uBAAC,cAAI,eAAK,QAAQ,EAAI,CAAC,CAAC,CAAC,IAAI,EAClD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,uBAAC,cAAI,eAAK,SAAS,EAAI,CAAC,CAAC,CAAC,IAAI,EACrD,OAAO,EAAE,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,OAAO,IAC5B,IAAI,GAPH,gBAAgB,CAQrB,CACH,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,UAAU,CAAA"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * @packageDocumentation
3
+ *
4
+ * @module Menu
5
+ *
6
+ * This module provides a fully accessible, composable Menu component system using React and Floating UI.
7
+ * It supports root menus, nested submenus, keyboard navigation, focus management, and customizable triggers.
8
+ *
9
+ * ## Usage
10
+ *
11
+ * ```tsx
12
+ * import { Menu, MenuItem } from './menu'
13
+ * import { Icon } from '@ltht-react/icon'
14
+ *
15
+ * <Menu
16
+ * label="Options"
17
+ * leftIcon={<Icon name="menu" />}
18
+ * >
19
+ * <MenuItem label="Profile" />
20
+ * <MenuItem label="Settings" />
21
+ * <Menu label="More" leftIcon={<Icon name="more" />}>
22
+ * <MenuItem label="Subitem 1" />
23
+ * <MenuItem label="Subitem 2" />
24
+ * </Menu>
25
+ * <MenuItem label="Logout" />
26
+ * </Menu>
27
+ * ```
28
+ *
29
+ * - Use `<Menu>` as the root or nested menu container.
30
+ * - Use `<MenuItem>` for selectable menu items.
31
+ * - Pass `label`, `leftIcon`, and `rightIcon` props for customization.
32
+ * - For root menus, you can use the `rootTrigger` prop to provide a custom button or icon trigger.
33
+ * - Supports keyboard navigation, focus management, and accessibility out of the box.
34
+ */
35
+ import { ExtendedRefs } from '@floating-ui/react';
36
+ import * as React from 'react';
37
+ import { ReactNode } from 'react';
38
+ import { IconProps } from '@ltht-react/icon';
39
+ import { ButtonProps } from '@ltht-react/button';
40
+ /**
41
+ * Props for the MenuComponent, which renders a menu trigger and its associated menu.
42
+ * @property label - Optional label for the menu trigger.
43
+ * @property leftIcon - Optional icon to display on the left of the label.
44
+ * @property rightIcon - Optional icon to display on the right of the label.
45
+ * @property nested - If true, indicates this menu is a nested submenu.
46
+ * @property children - The menu items or submenus to render.
47
+ * @property rootTrigger - The trigger component for the root menu (icon or button).
48
+ * @property disabled - If true, disables the menu trigger.
49
+ */
50
+ interface MenuProps {
51
+ label?: string;
52
+ leftIcon?: ReactNode;
53
+ rightIcon?: ReactNode;
54
+ nested?: boolean;
55
+ children?: ReactNode;
56
+ rootTrigger?: RootMenuTrigger;
57
+ disabled?: boolean;
58
+ }
59
+ /**
60
+ * RootMenuTrigger defines the type of trigger for the root menu.
61
+ * Can be either IconButtonMenuProps or ButtonMenuProps.
62
+ */
63
+ type RootMenuTrigger = IconButtonMenuProps | ButtonMenuProps;
64
+ /**
65
+ * Props for an icon button menu trigger.
66
+ * @property type - Must be 'icon'.
67
+ * @property iconProps - Props for the icon to display.
68
+ * @property text - Optional text to display alongside the icon.
69
+ * @property disabled - If true, disables the icon button.
70
+ */
71
+ interface IconButtonMenuProps {
72
+ type: 'icon';
73
+ iconProps: IconProps;
74
+ text?: string;
75
+ disabled?: boolean;
76
+ }
77
+ /**
78
+ * Props for a button menu trigger.
79
+ * @property type - Must be 'button'.
80
+ * @property buttonProps - Props for the button component.
81
+ * @property text - Text to display on the button.
82
+ */
83
+ interface ButtonMenuProps {
84
+ type: 'button';
85
+ buttonProps: ButtonProps;
86
+ text: string;
87
+ }
88
+ /**
89
+ * MenuComponent renders a menu trigger (button or icon) and its associated floating menu.
90
+ * Handles open/close state, keyboard navigation, focus management, and nested submenus.
91
+ * Integrates with Floating UI for positioning and accessibility.
92
+ * @param props - MenuProps and HTML button attributes.
93
+ * @param forwardedRef - Ref to the trigger element.
94
+ * @returns The menu trigger and its floating menu.
95
+ */
96
+ export declare const MenuComponent: React.ForwardRefExoticComponent<MenuProps & React.HTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
97
+ interface MenuTriggerProps extends React.HTMLAttributes<HTMLElement> {
98
+ refs: ExtendedRefs<HTMLButtonElement>;
99
+ isNested: boolean;
100
+ leftIcon?: React.ReactNode;
101
+ rightIcon?: React.ReactNode;
102
+ label?: string;
103
+ rootTrigger?: RootMenuTrigger;
104
+ }
105
+ /**
106
+ * MenuTrigger renders the trigger element for a menu or submenu.
107
+ * It handles both root and nested menu triggers, supporting icon buttons, standard buttons, or custom triggers.
108
+ * For nested menus or when no rootTrigger is provided, it renders a styled menu trigger with optional icons and label.
109
+ * For root menus, it renders either an IconButton or Button based on the rootTrigger type.
110
+ *
111
+ * @param props - MenuTriggerProps including refs, trigger configuration, icons, label, and additional HTML attributes.
112
+ * @param props.refs - Floating UI and list item refs for positioning and focus management.
113
+ * @param props.isNested - Indicates if this trigger is for a nested submenu.
114
+ * @param props.leftIcon - Optional icon to display on the left of the label.
115
+ * @param props.rightIcon - Optional icon to display on the right of the label.
116
+ * @param props.label - Optional label text for the trigger.
117
+ * @param props.rootTrigger - Configuration for the root menu trigger (icon or button).
118
+ * @param forwardedRef - Ref to the trigger element.
119
+ * @returns The trigger element for the menu or submenu.
120
+ */
121
+ export declare const MenuTrigger: React.ForwardRefExoticComponent<MenuTriggerProps & React.HTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
122
+ /**
123
+ * Props for a MenuItem component.
124
+ * @property label - Optional label for the menu item.
125
+ * @property leftIcon - Optional icon to display on the left.
126
+ * @property rightIcon - Optional icon to display on the right.
127
+ * @property disabled - If true, disables the menu item.
128
+ */
129
+ interface MenuItemProps {
130
+ label?: string;
131
+ leftIcon?: ReactNode;
132
+ rightIcon?: ReactNode;
133
+ disabled?: boolean;
134
+ }
135
+ /**
136
+ * MenuItem renders a single item within a menu.
137
+ * Handles focus, keyboard navigation, and click events.
138
+ * Integrates with the menu context for accessibility and state management.
139
+ * @param props - MenuItemProps and HTML button attributes.
140
+ * @param forwardedRef - Ref to the menu item element.
141
+ * @returns The styled menu item.
142
+ *
143
+ *
144
+ * ## Usage
145
+ *
146
+ * ```tsx
147
+ * import { Menu, MenuItem } from './menu'
148
+ * import { Icon } from '@ltht-react/icon'
149
+ *
150
+ * <Menu
151
+ * label="Options"
152
+ * leftIcon={<Icon name="menu" />}
153
+ * >
154
+ * <MenuItem label="Profile" />
155
+ * <MenuItem label="Settings" />
156
+ * <Menu label="More" leftIcon={<Icon name="more" />}>
157
+ * <MenuItem label="Subitem 1" />
158
+ * <MenuItem label="Subitem 2" />
159
+ * </Menu>
160
+ * <MenuItem label="Logout" />
161
+ * </Menu>
162
+ * ```
163
+ */
164
+ export declare const MenuItem: React.ForwardRefExoticComponent<MenuItemProps & React.HTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
165
+ /**
166
+ * Menu is the main entry point for rendering a menu or submenu.
167
+ * Automatically wraps the root menu in a FloatingTree for context management.
168
+ * @param props - MenuProps and HTML button attributes.
169
+ * @param ref - Ref to the menu trigger element.
170
+ * @returns The menu trigger and its floating menu.
171
+ *
172
+ * ## Usage
173
+ *
174
+ * ```tsx
175
+ * import { Menu, MenuItem } from './menu'
176
+ * import { Icon } from '@ltht-react/icon'
177
+ *
178
+ * <Menu
179
+ * label="Options"
180
+ * leftIcon={<Icon name="menu" />}
181
+ * >
182
+ * <MenuItem label="Profile" />
183
+ * <MenuItem label="Settings" />
184
+ * <Menu label="More" leftIcon={<Icon name="more" />}>
185
+ * <MenuItem label="Subitem 1" />
186
+ * <MenuItem label="Subitem 2" />
187
+ * </Menu>
188
+ * <MenuItem label="Logout" />
189
+ * </Menu>
190
+ * ```
191
+ */
192
+ export declare const Menu: React.ForwardRefExoticComponent<MenuProps & React.HTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
193
+ export {};