@mindlogic-ai/logician-ui 3.0.0-alpha.18 → 3.0.0-alpha.19

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 (45) hide show
  1. package/README.md +19 -0
  2. package/dist/components/Menu/Menu.d.ts +24 -0
  3. package/dist/components/Menu/Menu.d.ts.map +1 -0
  4. package/dist/components/Menu/Menu.js +30 -0
  5. package/dist/components/Menu/Menu.js.map +1 -0
  6. package/dist/components/Menu/Menu.mjs +28 -0
  7. package/dist/components/Menu/Menu.mjs.map +1 -0
  8. package/dist/components/Menu/Menu.types.d.ts +11 -0
  9. package/dist/components/Menu/Menu.types.d.ts.map +1 -0
  10. package/dist/components/Menu/Menu.types.js +13 -0
  11. package/dist/components/Menu/Menu.types.js.map +1 -0
  12. package/dist/components/Menu/Menu.types.mjs +10 -0
  13. package/dist/components/Menu/Menu.types.mjs.map +1 -0
  14. package/dist/components/Menu/MenuItem.js +1 -1
  15. package/dist/components/Menu/MenuItem.js.map +1 -1
  16. package/dist/components/Menu/MenuItem.mjs +1 -1
  17. package/dist/components/Menu/MenuItem.mjs.map +1 -1
  18. package/dist/components/Menu/MenuList.d.ts +7 -4
  19. package/dist/components/Menu/MenuList.d.ts.map +1 -1
  20. package/dist/components/Menu/MenuList.js +9 -3
  21. package/dist/components/Menu/MenuList.js.map +1 -1
  22. package/dist/components/Menu/MenuList.mjs +10 -4
  23. package/dist/components/Menu/MenuList.mjs.map +1 -1
  24. package/dist/components/Menu/index.d.ts +2 -3
  25. package/dist/components/Menu/index.d.ts.map +1 -1
  26. package/dist/index.js +11 -15
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +2 -2
  29. package/package.json +1 -1
  30. package/src/components/Menu/Menu.stories.tsx +105 -219
  31. package/src/components/Menu/Menu.tsx +29 -0
  32. package/src/components/Menu/Menu.types.ts +18 -0
  33. package/src/components/Menu/MenuItem.tsx +2 -2
  34. package/src/components/Menu/MenuList.tsx +22 -14
  35. package/src/components/Menu/index.ts +2 -3
  36. package/dist/components/Menu/MenuButton.d.ts +0 -3
  37. package/dist/components/Menu/MenuButton.d.ts.map +0 -1
  38. package/dist/components/Menu/MenuButton.js +0 -12
  39. package/dist/components/Menu/MenuButton.js.map +0 -1
  40. package/dist/components/Menu/MenuButton.mjs +0 -10
  41. package/dist/components/Menu/MenuButton.mjs.map +0 -1
  42. package/dist/components/Menu/MenuButton.types.d.ts +0 -20
  43. package/dist/components/Menu/MenuButton.types.d.ts.map +0 -1
  44. package/src/components/Menu/MenuButton.tsx +0 -16
  45. package/src/components/Menu/MenuButton.types.ts +0 -30
package/README.md CHANGED
@@ -228,6 +228,25 @@ Available aliases:
228
228
  - `index.tsx` - Exports
229
229
  3. Add export to main `index.ts`
230
230
 
231
+ ## Technical Notes & TODOs
232
+
233
+ ### `createScaledContext()` factory
234
+
235
+ `Popover`, `Menu`, and similar floating components each define a structurally identical context (`{ baseFontSize }`) to pass a font size down to their content wrapper for use with `ScaledContext`. This is currently duplicated across `Popover.types.ts` and `Menu.types.ts`.
236
+
237
+ If a third component (e.g. Tooltip, Dialog) adopts this pattern, extract a shared factory:
238
+
239
+ ```ts
240
+ // utils/createScaledContext.ts
241
+ export function createScaledContext(defaultFontSize: string | number = '14px') {
242
+ const Context = React.createContext({ baseFontSize: defaultFontSize });
243
+ const useContext = () => React.useContext(Context);
244
+ return { Context, useContext };
245
+ }
246
+ ```
247
+
248
+ This is intentionally deferred — two instances don't justify the abstraction yet.
249
+
231
250
  ## Contributing
232
251
 
233
252
  1. Fork the repository
@@ -0,0 +1,24 @@
1
+ import { Menu as ChakraMenu } from '@chakra-ui/react';
2
+ import { MenuProps } from './Menu.types';
3
+ export declare const Menu: {
4
+ ({ baseFontSize, children, ...props }: MenuProps): import("react/jsx-runtime").JSX.Element;
5
+ displayName: string;
6
+ } & {
7
+ Trigger: import("react").ForwardRefExoticComponent<ChakraMenu.TriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
8
+ TriggerItem: import("react").ForwardRefExoticComponent<ChakraMenu.TriggerItemProps & import("react").RefAttributes<HTMLDivElement>>;
9
+ ContextTrigger: import("react").ForwardRefExoticComponent<ChakraMenu.ContextTriggerProps & import("react").RefAttributes<HTMLElement>>;
10
+ List: import("react").ForwardRefExoticComponent<ChakraMenu.ContentProps & {
11
+ portalled?: boolean;
12
+ } & import("react").RefAttributes<HTMLDivElement>>;
13
+ Item: ({ variant, value, children, icon, rightIcon, ...rest }: import("./MenuItem.types").MenuItemProps) => import("react/jsx-runtime").JSX.Element;
14
+ ItemGroup: import("react").ForwardRefExoticComponent<ChakraMenu.ItemGroupProps & import("react").RefAttributes<HTMLDivElement>>;
15
+ ItemGroupLabel: import("react").ForwardRefExoticComponent<ChakraMenu.ItemGroupLabelProps & import("react").RefAttributes<HTMLDivElement>>;
16
+ ItemCommand: import("react").ForwardRefExoticComponent<ChakraMenu.CommandProps & import("react").RefAttributes<HTMLElement>>;
17
+ CheckboxItem: import("react").ForwardRefExoticComponent<ChakraMenu.CheckboxItemProps & import("react").RefAttributes<HTMLDivElement>>;
18
+ RadioItem: import("react").ForwardRefExoticComponent<ChakraMenu.RadioItemProps & import("react").RefAttributes<HTMLDivElement>>;
19
+ RadioItemGroup: import("react").ForwardRefExoticComponent<ChakraMenu.RadioItemGroupProps & import("react").RefAttributes<HTMLDivElement>>;
20
+ Separator: import("react").ForwardRefExoticComponent<ChakraMenu.SeparatorProps & import("react").RefAttributes<HTMLDivElement>>;
21
+ Arrow: import("react").ForwardRefExoticComponent<ChakraMenu.ArrowProps & import("react").RefAttributes<HTMLDivElement>>;
22
+ ArrowTip: import("react").ForwardRefExoticComponent<ChakraMenu.ArrowTipProps & import("react").RefAttributes<HTMLDivElement>>;
23
+ };
24
+ //# sourceMappingURL=Menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/Menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAe,SAAS,EAAE,MAAM,cAAc,CAAC;AAUtD,eAAO,MAAM,IAAI;2CAPgD,SAAS;;;;;;;;;;;;;;;;;;;CAsBxE,CAAC"}
@@ -0,0 +1,30 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var jsxRuntime = require('react/jsx-runtime');
5
+ var react = require('@chakra-ui/react');
6
+ var MenuItem = require('./MenuItem.js');
7
+ var Menu_types = require('./Menu.types.js');
8
+ var MenuList = require('./MenuList.js');
9
+
10
+ const MenuBase = ({ baseFontSize = '14px', children, ...props }) => (jsxRuntime.jsx(Menu_types.MenuContext.Provider, { value: { baseFontSize }, children: jsxRuntime.jsx(react.Menu.Root, { ...props, children: children }) }));
11
+ MenuBase.displayName = 'Menu';
12
+ const Menu = Object.assign(MenuBase, {
13
+ Trigger: react.Menu.Trigger,
14
+ TriggerItem: react.Menu.TriggerItem,
15
+ ContextTrigger: react.Menu.ContextTrigger,
16
+ List: MenuList.MenuList,
17
+ Item: MenuItem.MenuItem,
18
+ ItemGroup: react.Menu.ItemGroup,
19
+ ItemGroupLabel: react.Menu.ItemGroupLabel,
20
+ ItemCommand: react.Menu.ItemCommand,
21
+ CheckboxItem: react.Menu.CheckboxItem,
22
+ RadioItem: react.Menu.RadioItem,
23
+ RadioItemGroup: react.Menu.RadioItemGroup,
24
+ Separator: react.Menu.Separator,
25
+ Arrow: react.Menu.Arrow,
26
+ ArrowTip: react.Menu.ArrowTip,
27
+ });
28
+
29
+ exports.Menu = Menu;
30
+ //# sourceMappingURL=Menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.js","sources":["../../../src/components/Menu/Menu.tsx"],"sourcesContent":[null],"names":["_jsx","MenuContext","ChakraMenu","MenuList","MenuItem"],"mappings":";;;;;;;;;AAMA,MAAM,QAAQ,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAa,MACxEA,cAAA,CAACC,sBAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,YAAY,EAAE,YAC3CD,cAAA,CAACE,UAAU,CAAC,IAAI,OAAK,KAAK,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAmB,EAAA,CACnC,CACxB;AACD,QAAQ,CAAC,WAAW,GAAG,MAAM;MAEhB,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAEA,UAAU,CAAC,OAAO;IAC3B,WAAW,EAAEA,UAAU,CAAC,WAAW;IACnC,cAAc,EAAEA,UAAU,CAAC,cAAc;AACzC,IAAA,IAAI,EAAEC,iBAAQ;AACd,IAAA,IAAI,EAAEC,iBAAQ;IACd,SAAS,EAAEF,UAAU,CAAC,SAAS;IAC/B,cAAc,EAAEA,UAAU,CAAC,cAAc;IACzC,WAAW,EAAEA,UAAU,CAAC,WAAW;IACnC,YAAY,EAAEA,UAAU,CAAC,YAAY;IACrC,SAAS,EAAEA,UAAU,CAAC,SAAS;IAC/B,cAAc,EAAEA,UAAU,CAAC,cAAc;IACzC,SAAS,EAAEA,UAAU,CAAC,SAAS;IAC/B,KAAK,EAAEA,UAAU,CAAC,KAAK;IACvB,QAAQ,EAAEA,UAAU,CAAC,QAAQ;AAC9B,CAAA;;;;"}
@@ -0,0 +1,28 @@
1
+ "use client";
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { Menu as Menu$1 } from '@chakra-ui/react';
4
+ import { MenuItem } from './MenuItem.mjs';
5
+ import { MenuContext } from './Menu.types.mjs';
6
+ import { MenuList } from './MenuList.mjs';
7
+
8
+ const MenuBase = ({ baseFontSize = '14px', children, ...props }) => (jsx(MenuContext.Provider, { value: { baseFontSize }, children: jsx(Menu$1.Root, { ...props, children: children }) }));
9
+ MenuBase.displayName = 'Menu';
10
+ const Menu = Object.assign(MenuBase, {
11
+ Trigger: Menu$1.Trigger,
12
+ TriggerItem: Menu$1.TriggerItem,
13
+ ContextTrigger: Menu$1.ContextTrigger,
14
+ List: MenuList,
15
+ Item: MenuItem,
16
+ ItemGroup: Menu$1.ItemGroup,
17
+ ItemGroupLabel: Menu$1.ItemGroupLabel,
18
+ ItemCommand: Menu$1.ItemCommand,
19
+ CheckboxItem: Menu$1.CheckboxItem,
20
+ RadioItem: Menu$1.RadioItem,
21
+ RadioItemGroup: Menu$1.RadioItemGroup,
22
+ Separator: Menu$1.Separator,
23
+ Arrow: Menu$1.Arrow,
24
+ ArrowTip: Menu$1.ArrowTip,
25
+ });
26
+
27
+ export { Menu };
28
+ //# sourceMappingURL=Menu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.mjs","sources":["../../../src/components/Menu/Menu.tsx"],"sourcesContent":[null],"names":["_jsx","ChakraMenu"],"mappings":";;;;;;;AAMA,MAAM,QAAQ,GAAG,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAa,MACxEA,GAAA,CAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,EAAE,YAAY,EAAE,YAC3CA,GAAA,CAACC,MAAU,CAAC,IAAI,OAAK,KAAK,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAmB,EAAA,CACnC,CACxB;AACD,QAAQ,CAAC,WAAW,GAAG,MAAM;MAEhB,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE;IAC1C,OAAO,EAAEA,MAAU,CAAC,OAAO;IAC3B,WAAW,EAAEA,MAAU,CAAC,WAAW;IACnC,cAAc,EAAEA,MAAU,CAAC,cAAc;AACzC,IAAA,IAAI,EAAE,QAAQ;AACd,IAAA,IAAI,EAAE,QAAQ;IACd,SAAS,EAAEA,MAAU,CAAC,SAAS;IAC/B,cAAc,EAAEA,MAAU,CAAC,cAAc;IACzC,WAAW,EAAEA,MAAU,CAAC,WAAW;IACnC,YAAY,EAAEA,MAAU,CAAC,YAAY;IACrC,SAAS,EAAEA,MAAU,CAAC,SAAS;IAC/B,cAAc,EAAEA,MAAU,CAAC,cAAc;IACzC,SAAS,EAAEA,MAAU,CAAC,SAAS;IAC/B,KAAK,EAAEA,MAAU,CAAC,KAAK;IACvB,QAAQ,EAAEA,MAAU,CAAC,QAAQ;AAC9B,CAAA;;;;"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { Menu as ChakraMenu } from '@chakra-ui/react';
3
+ export interface MenuContextValue {
4
+ baseFontSize: string | number;
5
+ }
6
+ export declare const MenuContext: React.Context<MenuContextValue>;
7
+ export declare const useMenuContext: () => MenuContextValue;
8
+ export type MenuProps = React.ComponentPropsWithoutRef<typeof ChakraMenu.Root> & {
9
+ baseFontSize?: string | number;
10
+ };
11
+ //# sourceMappingURL=Menu.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.types.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/Menu.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B;AAED,eAAO,MAAM,WAAW,iCAEtB,CAAC;AAEH,eAAO,MAAM,cAAc,wBAAsC,CAAC;AAElE,MAAM,MAAM,SAAS,GAAG,KAAK,CAAC,wBAAwB,CACpD,OAAO,UAAU,CAAC,IAAI,CACvB,GAAG;IACF,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var React = require('react');
5
+
6
+ const MenuContext = React.createContext({
7
+ baseFontSize: '14px',
8
+ });
9
+ const useMenuContext = () => React.useContext(MenuContext);
10
+
11
+ exports.MenuContext = MenuContext;
12
+ exports.useMenuContext = useMenuContext;
13
+ //# sourceMappingURL=Menu.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.types.js","sources":["../../../src/components/Menu/Menu.types.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;AAOO,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAmB;AAC/D,IAAA,YAAY,EAAE,MAAM;AACrB,CAAA;AAEM,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,WAAW;;;;;"}
@@ -0,0 +1,10 @@
1
+ "use client";
2
+ import React__default from 'react';
3
+
4
+ const MenuContext = React__default.createContext({
5
+ baseFontSize: '14px',
6
+ });
7
+ const useMenuContext = () => React__default.useContext(MenuContext);
8
+
9
+ export { MenuContext, useMenuContext };
10
+ //# sourceMappingURL=Menu.types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.types.mjs","sources":["../../../src/components/Menu/Menu.types.ts"],"sourcesContent":[null],"names":["React"],"mappings":";;;AAOO,MAAM,WAAW,GAAGA,cAAK,CAAC,aAAa,CAAmB;AAC/D,IAAA,YAAY,EAAE,MAAM;AACrB,CAAA;AAEM,MAAM,cAAc,GAAG,MAAMA,cAAK,CAAC,UAAU,CAAC,WAAW;;;;"}
@@ -11,7 +11,7 @@ const MenuItem = ({ variant = MenuItem_types.ItemVariant.Default, value, childre
11
11
  return (jsxRuntime.jsxs(react.Menu.Item, { value: value, color: isDangerVariant ? 'danger.main' : 'gray.1000', py: 2, minW: "fit-content", fontWeight: "semibold", gap: 3, cursor: "pointer", _hover: {
12
12
  color: isDangerVariant ? 'danger.main' : 'gray.1500',
13
13
  backgroundColor: isDangerVariant ? 'danger.lightest' : 'gray.50',
14
- }, ...focusRing.focusRing, ...rest, children: [icon && icon, children, rightIcon && jsxRuntime.jsx(react.Spacer, {}), rightIcon && rightIcon] }));
14
+ }, ...focusRing.focusRing, ...rest, children: [icon, children, rightIcon && jsxRuntime.jsx(react.Spacer, {}), rightIcon] }));
15
15
  };
16
16
 
17
17
  exports.MenuItem = MenuItem;
@@ -1 +1 @@
1
- {"version":3,"file":"MenuItem.js","sources":["../../../src/components/Menu/MenuItem.tsx"],"sourcesContent":[null],"names":["ItemVariant","_jsxs","Menu","focusRing","_jsx","Spacer"],"mappings":";;;;;;;;AAMO,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,GAAGA,0BAAW,CAAC,OAAO,EAC7B,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,GAAG,IAAI,EACO,KAAI;AAClB,IAAA,MAAM,eAAe,GAAG,OAAO,KAAKA,0BAAW,CAAC,MAAM;AAEtD,IAAA,QACEC,eAAA,CAACC,UAAI,CAAC,IAAI,EAAA,EACR,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,WAAW,EACpD,EAAE,EAAE,CAAC,EACL,IAAI,EAAC,aAAa,EAClB,UAAU,EAAC,UAAU,EACrB,GAAG,EAAE,CAAC,EACN,MAAM,EAAC,SAAS,EAChB,MAAM,EAAE;YACN,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,WAAW;YACpD,eAAe,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;SACjE,EAAA,GACGC,mBAAS,KACT,IAAI,EAAA,QAAA,EAAA,CAEP,IAAI,IAAI,IAAI,EACZ,QAAQ,EACR,SAAS,IAAIC,cAAA,CAACC,YAAM,EAAA,EAAA,CAAG,EACvB,SAAS,IAAI,SAAS,CAAA,EAAA,CACb;AAEhB;;;;"}
1
+ {"version":3,"file":"MenuItem.js","sources":["../../../src/components/Menu/MenuItem.tsx"],"sourcesContent":[null],"names":["ItemVariant","_jsxs","Menu","focusRing","_jsx","Spacer"],"mappings":";;;;;;;;AAMO,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,GAAGA,0BAAW,CAAC,OAAO,EAC7B,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,GAAG,IAAI,EACO,KAAI;AAClB,IAAA,MAAM,eAAe,GAAG,OAAO,KAAKA,0BAAW,CAAC,MAAM;AAEtD,IAAA,QACEC,eAAA,CAACC,UAAI,CAAC,IAAI,EAAA,EACR,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,WAAW,EACpD,EAAE,EAAE,CAAC,EACL,IAAI,EAAC,aAAa,EAClB,UAAU,EAAC,UAAU,EACrB,GAAG,EAAE,CAAC,EACN,MAAM,EAAC,SAAS,EAChB,MAAM,EAAE;YACN,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,WAAW;YACpD,eAAe,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;AACjE,SAAA,EAAA,GACGC,mBAAS,EAAA,GACT,IAAI,EAAA,QAAA,EAAA,CAEP,IAAI,EACJ,QAAQ,EACR,SAAS,IAAIC,eAACC,YAAM,EAAA,EAAA,CAAG,EACvB,SAAS,CAAA,EAAA,CACA;AAEhB;;;;"}
@@ -9,7 +9,7 @@ const MenuItem = ({ variant = ItemVariant.Default, value, children, icon, rightI
9
9
  return (jsxs(Menu.Item, { value: value, color: isDangerVariant ? 'danger.main' : 'gray.1000', py: 2, minW: "fit-content", fontWeight: "semibold", gap: 3, cursor: "pointer", _hover: {
10
10
  color: isDangerVariant ? 'danger.main' : 'gray.1500',
11
11
  backgroundColor: isDangerVariant ? 'danger.lightest' : 'gray.50',
12
- }, ...focusRing, ...rest, children: [icon && icon, children, rightIcon && jsx(Spacer, {}), rightIcon && rightIcon] }));
12
+ }, ...focusRing, ...rest, children: [icon, children, rightIcon && jsx(Spacer, {}), rightIcon] }));
13
13
  };
14
14
 
15
15
  export { MenuItem };
@@ -1 +1 @@
1
- {"version":3,"file":"MenuItem.mjs","sources":["../../../src/components/Menu/MenuItem.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":";;;;;;AAMO,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,GAAG,WAAW,CAAC,OAAO,EAC7B,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,GAAG,IAAI,EACO,KAAI;AAClB,IAAA,MAAM,eAAe,GAAG,OAAO,KAAK,WAAW,CAAC,MAAM;AAEtD,IAAA,QACEA,IAAA,CAAC,IAAI,CAAC,IAAI,EAAA,EACR,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,WAAW,EACpD,EAAE,EAAE,CAAC,EACL,IAAI,EAAC,aAAa,EAClB,UAAU,EAAC,UAAU,EACrB,GAAG,EAAE,CAAC,EACN,MAAM,EAAC,SAAS,EAChB,MAAM,EAAE;YACN,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,WAAW;YACpD,eAAe,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;SACjE,EAAA,GACG,SAAS,KACT,IAAI,EAAA,QAAA,EAAA,CAEP,IAAI,IAAI,IAAI,EACZ,QAAQ,EACR,SAAS,IAAIC,GAAA,CAAC,MAAM,EAAA,EAAA,CAAG,EACvB,SAAS,IAAI,SAAS,CAAA,EAAA,CACb;AAEhB;;;;"}
1
+ {"version":3,"file":"MenuItem.mjs","sources":["../../../src/components/Menu/MenuItem.tsx"],"sourcesContent":[null],"names":["_jsxs","_jsx"],"mappings":";;;;;;AAMO,MAAM,QAAQ,GAAG,CAAC,EACvB,OAAO,GAAG,WAAW,CAAC,OAAO,EAC7B,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,GAAG,IAAI,EACO,KAAI;AAClB,IAAA,MAAM,eAAe,GAAG,OAAO,KAAK,WAAW,CAAC,MAAM;AAEtD,IAAA,QACEA,IAAA,CAAC,IAAI,CAAC,IAAI,EAAA,EACR,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,WAAW,EACpD,EAAE,EAAE,CAAC,EACL,IAAI,EAAC,aAAa,EAClB,UAAU,EAAC,UAAU,EACrB,GAAG,EAAE,CAAC,EACN,MAAM,EAAC,SAAS,EAChB,MAAM,EAAE;YACN,KAAK,EAAE,eAAe,GAAG,aAAa,GAAG,WAAW;YACpD,eAAe,EAAE,eAAe,GAAG,iBAAiB,GAAG,SAAS;AACjE,SAAA,EAAA,GACG,SAAS,EAAA,GACT,IAAI,EAAA,QAAA,EAAA,CAEP,IAAI,EACJ,QAAQ,EACR,SAAS,IAAIC,IAAC,MAAM,EAAA,EAAA,CAAG,EACvB,SAAS,CAAA,EAAA,CACA;AAEhB;;;;"}
@@ -1,5 +1,8 @@
1
- import { MenuContentProps as ChakraMenuContentProps } from '@chakra-ui/react';
2
- export interface MenuListProps extends ChakraMenuContentProps {
3
- }
4
- export declare const MenuList: ({ children, ...rest }: MenuListProps) => import("react/jsx-runtime").JSX.Element;
1
+ import { Menu, MenuContentProps as ChakraMenuContentProps } from '@chakra-ui/react';
2
+ export type MenuListProps = ChakraMenuContentProps & {
3
+ portalled?: boolean;
4
+ };
5
+ export declare const MenuList: import("react").ForwardRefExoticComponent<Menu.ContentProps & {
6
+ portalled?: boolean;
7
+ } & import("react").RefAttributes<HTMLDivElement>>;
5
8
  //# sourceMappingURL=MenuList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MenuList.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/MenuList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,IAAI,sBAAsB,EAE3C,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,aAAc,SAAQ,sBAAsB;CAAG;AAEhE,eAAO,MAAM,QAAQ,GAAI,uBAAuB,aAAa,4CAiB5D,CAAC"}
1
+ {"version":3,"file":"MenuList.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/MenuList.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,gBAAgB,IAAI,sBAAsB,EAAU,MAAM,kBAAkB,CAAC;AAK5F,MAAM,MAAM,aAAa,GAAG,sBAAsB,GAAG;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,QAAQ;gBAHP,OAAO;kDAyBpB,CAAC"}
@@ -2,11 +2,17 @@
2
2
  'use strict';
3
3
 
4
4
  var jsxRuntime = require('react/jsx-runtime');
5
+ var React = require('react');
5
6
  var react = require('@chakra-ui/react');
7
+ var ScaledContext = require('../ScaledContext/ScaledContext.js');
8
+ var Menu_types = require('./Menu.types.js');
6
9
 
7
- const MenuList = ({ children, ...rest }) => {
8
- return (jsxRuntime.jsx(react.Portal, { children: jsxRuntime.jsx(react.Menu.Positioner, { children: jsxRuntime.jsx(react.Menu.Content, { border: "1px solid", borderColor: "gray.200", borderRadius: "md", boxShadow: "0 5px 20px 1px var(--chakra-colors-gray-50)", p: "1.5", ...rest, children: children }) }) }));
9
- };
10
+ const MenuList = React.forwardRef(({ children, portalled = true, ...rest }, ref) => {
11
+ const { baseFontSize } = Menu_types.useMenuContext();
12
+ const content = (jsxRuntime.jsx(react.Menu.Positioner, { children: jsxRuntime.jsx(react.Menu.Content, { ref: ref, border: "1px solid", borderColor: "gray.200", borderRadius: "md", boxShadow: "0 5px 20px 1px {colors.gray.50}", p: "1.5", ...rest, children: jsxRuntime.jsx(ScaledContext.ScaledContext, { fontSize: baseFontSize, children: children }) }) }));
13
+ return portalled ? jsxRuntime.jsx(react.Portal, { children: content }) : content;
14
+ });
15
+ MenuList.displayName = 'Menu.List';
10
16
 
11
17
  exports.MenuList = MenuList;
12
18
  //# sourceMappingURL=MenuList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MenuList.js","sources":["../../../src/components/Menu/MenuList.tsx"],"sourcesContent":[null],"names":["_jsx","Portal","Menu"],"mappings":";;;;;;AAQO,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAiB,KAAI;AAC/D,IAAA,QACEA,cAAA,CAACC,YAAM,cACLD,cAAA,CAACE,UAAI,CAAC,UAAU,EAAA,EAAA,QAAA,EACdF,cAAA,CAACE,UAAI,CAAC,OAAO,EAAA,EACX,MAAM,EAAC,WAAW,EAClB,WAAW,EAAC,UAAU,EACtB,YAAY,EAAC,IAAI,EACjB,SAAS,EAAC,6CAA6C,EACvD,CAAC,EAAC,KAAK,EAAA,GACH,IAAI,EAAA,QAAA,EAEP,QAAQ,GACI,EAAA,CACC,EAAA,CACX;AAEb;;;;"}
1
+ {"version":3,"file":"MenuList.js","sources":["../../../src/components/Menu/MenuList.tsx"],"sourcesContent":[null],"names":["forwardRef","useMenuContext","_jsx","Menu","ScaledContext","Portal"],"mappings":";;;;;;;;;MAUa,QAAQ,GAAGA,gBAAU,CAChC,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,KAAI;AAC/C,IAAA,MAAM,EAAE,YAAY,EAAE,GAAGC,yBAAc,EAAE;IAEzC,MAAM,OAAO,IACXC,cAAA,CAACC,UAAI,CAAC,UAAU,EAAA,EAAA,QAAA,EACdD,cAAA,CAACC,UAAI,CAAC,OAAO,EAAA,EACX,GAAG,EAAE,GAAG,EACR,MAAM,EAAC,WAAW,EAClB,WAAW,EAAC,UAAU,EACtB,YAAY,EAAC,IAAI,EACjB,SAAS,EAAC,iCAAiC,EAC3C,CAAC,EAAC,KAAK,EAAA,GACH,IAAI,EAAA,QAAA,EAERD,eAACE,2BAAa,EAAA,EAAC,QAAQ,EAAE,YAAY,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAiB,EAAA,CACpD,EAAA,CACC,CACnB;AAED,IAAA,OAAO,SAAS,GAAGF,cAAA,CAACG,YAAM,EAAA,EAAA,QAAA,EAAE,OAAO,EAAA,CAAU,GAAG,OAAO;AACzD,CAAC;AAEH,QAAQ,CAAC,WAAW,GAAG,WAAW;;;;"}
@@ -1,10 +1,16 @@
1
1
  "use client";
2
2
  import { jsx } from 'react/jsx-runtime';
3
- import { Portal, Menu } from '@chakra-ui/react';
3
+ import { forwardRef } from 'react';
4
+ import { Menu, Portal } from '@chakra-ui/react';
5
+ import { ScaledContext } from '../ScaledContext/ScaledContext.mjs';
6
+ import { useMenuContext } from './Menu.types.mjs';
4
7
 
5
- const MenuList = ({ children, ...rest }) => {
6
- return (jsx(Portal, { children: jsx(Menu.Positioner, { children: jsx(Menu.Content, { border: "1px solid", borderColor: "gray.200", borderRadius: "md", boxShadow: "0 5px 20px 1px var(--chakra-colors-gray-50)", p: "1.5", ...rest, children: children }) }) }));
7
- };
8
+ const MenuList = forwardRef(({ children, portalled = true, ...rest }, ref) => {
9
+ const { baseFontSize } = useMenuContext();
10
+ const content = (jsx(Menu.Positioner, { children: jsx(Menu.Content, { ref: ref, border: "1px solid", borderColor: "gray.200", borderRadius: "md", boxShadow: "0 5px 20px 1px {colors.gray.50}", p: "1.5", ...rest, children: jsx(ScaledContext, { fontSize: baseFontSize, children: children }) }) }));
11
+ return portalled ? jsx(Portal, { children: content }) : content;
12
+ });
13
+ MenuList.displayName = 'Menu.List';
8
14
 
9
15
  export { MenuList };
10
16
  //# sourceMappingURL=MenuList.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"MenuList.mjs","sources":["../../../src/components/Menu/MenuList.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;AAQO,MAAM,QAAQ,GAAG,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAiB,KAAI;AAC/D,IAAA,QACEA,GAAA,CAAC,MAAM,cACLA,GAAA,CAAC,IAAI,CAAC,UAAU,EAAA,EAAA,QAAA,EACdA,GAAA,CAAC,IAAI,CAAC,OAAO,EAAA,EACX,MAAM,EAAC,WAAW,EAClB,WAAW,EAAC,UAAU,EACtB,YAAY,EAAC,IAAI,EACjB,SAAS,EAAC,6CAA6C,EACvD,CAAC,EAAC,KAAK,EAAA,GACH,IAAI,EAAA,QAAA,EAEP,QAAQ,GACI,EAAA,CACC,EAAA,CACX;AAEb;;;;"}
1
+ {"version":3,"file":"MenuList.mjs","sources":["../../../src/components/Menu/MenuList.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;;;;MAUa,QAAQ,GAAG,UAAU,CAChC,CAAC,EAAE,QAAQ,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,GAAG,KAAI;AAC/C,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE;IAEzC,MAAM,OAAO,IACXA,GAAA,CAAC,IAAI,CAAC,UAAU,EAAA,EAAA,QAAA,EACdA,GAAA,CAAC,IAAI,CAAC,OAAO,EAAA,EACX,GAAG,EAAE,GAAG,EACR,MAAM,EAAC,WAAW,EAClB,WAAW,EAAC,UAAU,EACtB,YAAY,EAAC,IAAI,EACjB,SAAS,EAAC,iCAAiC,EAC3C,CAAC,EAAC,KAAK,EAAA,GACH,IAAI,EAAA,QAAA,EAERA,IAAC,aAAa,EAAA,EAAC,QAAQ,EAAE,YAAY,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAiB,EAAA,CACpD,EAAA,CACC,CACnB;AAED,IAAA,OAAO,SAAS,GAAGA,GAAA,CAAC,MAAM,EAAA,EAAA,QAAA,EAAE,OAAO,EAAA,CAAU,GAAG,OAAO;AACzD,CAAC;AAEH,QAAQ,CAAC,WAAW,GAAG,WAAW;;;;"}
@@ -1,7 +1,6 @@
1
- export { MenuButton } from './MenuButton';
2
- export type * from './MenuButton.types';
1
+ export { Menu } from './Menu';
2
+ export type { MenuProps } from './Menu.types';
3
3
  export { MenuItem } from './MenuItem';
4
4
  export type * from './MenuItem.types';
5
5
  export { MenuList } from './MenuList';
6
- export { Menu } from '@chakra-ui/react';
7
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,mBAAmB,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,mBAAmB,kBAAkB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,mBAAmB,kBAAkB,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -52,10 +52,9 @@ var Markdown = require('./components/Markdown/Markdown.js');
52
52
  var Masonry = require('./components/Masonry/Masonry.js');
53
53
  var MaxLengthIndicator = require('./components/MaxLengthIndicator/MaxLengthIndicator.js');
54
54
  var MDXEditor = require('./components/MDXEditor/MDXEditor.js');
55
- var MenuButton = require('./components/Menu/MenuButton.js');
55
+ var Menu = require('./components/Menu/Menu.js');
56
56
  var MenuItem = require('./components/Menu/MenuItem.js');
57
57
  var MenuList = require('./components/Menu/MenuList.js');
58
- var react = require('@chakra-ui/react');
59
58
  var Modal = require('./components/Modal/Modal.js');
60
59
  var ModalBody = require('./components/Modal/ModalBody.js');
61
60
  var ModalCloseButton = require('./components/Modal/ModalCloseButton.js');
@@ -101,6 +100,7 @@ var TabList = require('./components/Tabs/TabList/TabList.js');
101
100
  var TabPanel = require('./components/Tabs/TabPanel.js');
102
101
  var TabPanels = require('./components/Tabs/TabPanels.js');
103
102
  var Tabs = require('./components/Tabs/Tabs.js');
103
+ var react = require('@chakra-ui/react');
104
104
  var Tag = require('./components/Tag/Tag.js');
105
105
  var Tag_styles = require('./components/Tag/Tag.styles.js');
106
106
  var TagCloseButton = require('./components/Tag/TagCloseButton/TagCloseButton.js');
@@ -187,21 +187,9 @@ exports.baseMarkdownComponents = Markdown.baseMarkdownComponents;
187
187
  exports.Masonry = Masonry.Masonry;
188
188
  exports.MaxLengthIndicator = MaxLengthIndicator.MaxLengthIndicator;
189
189
  exports.MDXEditor = MDXEditor.MDXEditor;
190
- exports.MenuButton = MenuButton.MenuButton;
190
+ exports.Menu = Menu.Menu;
191
191
  exports.MenuItem = MenuItem.MenuItem;
192
192
  exports.MenuList = MenuList.MenuList;
193
- Object.defineProperty(exports, "Menu", {
194
- enumerable: true,
195
- get: function () { return react.Menu; }
196
- });
197
- Object.defineProperty(exports, "TagLeftIcon", {
198
- enumerable: true,
199
- get: function () { return react.Icon; }
200
- });
201
- Object.defineProperty(exports, "TagRightIcon", {
202
- enumerable: true,
203
- get: function () { return react.Icon; }
204
- });
205
193
  exports.Modal = Modal.Modal;
206
194
  exports.ModalBody = ModalBody.ModalBody;
207
195
  exports.ModalCloseButton = ModalCloseButton.ModalCloseButton;
@@ -252,6 +240,14 @@ exports.TabList = TabList.TabList;
252
240
  exports.TabPanel = TabPanel.TabPanel;
253
241
  exports.TabPanels = TabPanels.TabPanels;
254
242
  exports.Tabs = Tabs.Tabs;
243
+ Object.defineProperty(exports, "TagLeftIcon", {
244
+ enumerable: true,
245
+ get: function () { return react.Icon; }
246
+ });
247
+ Object.defineProperty(exports, "TagRightIcon", {
248
+ enumerable: true,
249
+ get: function () { return react.Icon; }
250
+ });
255
251
  exports.Tag = Tag.Tag;
256
252
  exports.getTagStyles = Tag_styles.getTagStyles;
257
253
  exports.tagColorPaletteStyles = Tag_styles.tagColorPaletteStyles;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.mjs CHANGED
@@ -50,10 +50,9 @@ export { Markdown, baseMarkdownComponents } from './components/Markdown/Markdown
50
50
  export { Masonry } from './components/Masonry/Masonry.mjs';
51
51
  export { MaxLengthIndicator } from './components/MaxLengthIndicator/MaxLengthIndicator.mjs';
52
52
  export { MDXEditor } from './components/MDXEditor/MDXEditor.mjs';
53
- export { MenuButton } from './components/Menu/MenuButton.mjs';
53
+ export { Menu } from './components/Menu/Menu.mjs';
54
54
  export { MenuItem } from './components/Menu/MenuItem.mjs';
55
55
  export { MenuList } from './components/Menu/MenuList.mjs';
56
- export { Menu, Icon as TagLeftIcon, Icon as TagRightIcon } from '@chakra-ui/react';
57
56
  export { Modal } from './components/Modal/Modal.mjs';
58
57
  export { ModalBody } from './components/Modal/ModalBody.mjs';
59
58
  export { ModalCloseButton } from './components/Modal/ModalCloseButton.mjs';
@@ -99,6 +98,7 @@ export { TabList } from './components/Tabs/TabList/TabList.mjs';
99
98
  export { TabPanel } from './components/Tabs/TabPanel.mjs';
100
99
  export { TabPanels } from './components/Tabs/TabPanels.mjs';
101
100
  export { Tabs } from './components/Tabs/Tabs.mjs';
101
+ export { Icon as TagLeftIcon, Icon as TagRightIcon } from '@chakra-ui/react';
102
102
  export { Tag } from './components/Tag/Tag.mjs';
103
103
  export { getTagStyles, tagColorPaletteStyles, tagColorPalettes, tagVariants } from './components/Tag/Tag.styles.mjs';
104
104
  export { TagCloseButton } from './components/Tag/TagCloseButton/TagCloseButton.mjs';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindlogic-ai/logician-ui",
3
- "version": "3.0.0-alpha.18",
3
+ "version": "3.0.0-alpha.19",
4
4
  "description": "A comprehensive React design system built on Chakra UI",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -3,12 +3,11 @@ import { useState } from 'react';
3
3
 
4
4
  import { IoChevronDownOutline, SlSettings } from '../Icon';
5
5
  import { IconButton } from '../IconButton';
6
- import { Menu, MenuButton, MenuItem, MenuList } from '.';
7
- import { MenuItemProps } from './MenuItem.types';
8
6
  import { Button } from '../Button/Button';
7
+ import { Menu } from './Menu';
8
+ import { MenuItemProps } from './MenuItem.types';
9
9
 
10
- // Interface for story-specific menu item data
11
- interface StoryMenuItemProps {
10
+ interface StoryMenuItemData {
12
11
  label: string;
13
12
  onClick?: () => void;
14
13
  itemIcon?: React.ReactElement;
@@ -16,24 +15,26 @@ interface StoryMenuItemProps {
16
15
  variant?: MenuItemProps['variant'];
17
16
  }
18
17
 
19
- // Props for the story templates
20
18
  interface MenuStoryProps {
21
19
  label?: string;
22
- menuItems: StoryMenuItemProps[];
20
+ baseFontSize?: string;
21
+ menuItems: StoryMenuItemData[];
23
22
  }
24
23
 
25
24
  const meta = {
26
25
  title: 'Components/Menu',
27
- // @ts-expect-error - Menu is a namespace, not a component
28
26
  component: Menu,
27
+ parameters: { layout: 'centered' },
29
28
  args: {
30
29
  label: 'Trigger',
30
+ baseFontSize: '14px',
31
31
  menuItems: [
32
32
  { label: 'Profile', onClick: () => alert('Profile clicked') },
33
33
  { label: 'Settings', onClick: () => alert('Settings clicked') },
34
34
  ],
35
35
  },
36
36
  argTypes: {
37
+ baseFontSize: { control: 'text' },
37
38
  menuItems: { control: 'object' },
38
39
  },
39
40
  } satisfies Meta<MenuStoryProps>;
@@ -42,260 +43,145 @@ export default meta;
42
43
 
43
44
  type Story = StoryObj<MenuStoryProps>;
44
45
 
45
- export const DefaultMenu: Story = {
46
- args: {
47
- menuItems: [
48
- { label: 'Profile', onClick: () => alert('Profile clicked') },
49
- {
50
- label: 'Settings',
51
- onClick: () => alert('Settings clicked'),
52
- },
53
- ],
54
- },
55
- render: ({ label, menuItems }) => (
56
- <Menu.Root>
57
- <MenuButton aria-label={'storybook button menu'} as={Button}>
58
- {label} <IoChevronDownOutline />
59
- </MenuButton>
60
- <MenuList>
61
- {menuItems.map((item: StoryMenuItemProps) => (
62
- <MenuItem
63
- key={item.label}
64
- value={item.label}
65
- variant={item.variant}
66
- icon={item.itemIcon}
67
- onClick={item.onClick}
68
- >
69
- {item.label}
70
- </MenuItem>
71
- ))}
72
- </MenuList>
73
- </Menu.Root>
46
+ const renderItems = (items: StoryMenuItemData[]) =>
47
+ items.map(item => (
48
+ <Menu.Item
49
+ key={item.label}
50
+ value={item.label}
51
+ variant={item.variant}
52
+ icon={item.itemIcon}
53
+ rightIcon={item.rightItemIcon}
54
+ onClick={item.onClick}
55
+ >
56
+ {item.label}
57
+ </Menu.Item>
58
+ ));
59
+
60
+ export const Default: Story = {
61
+ render: ({ label, baseFontSize, menuItems }) => (
62
+ <Menu baseFontSize={baseFontSize}>
63
+ <Menu.Trigger asChild>
64
+ <Button variant="outline">
65
+ {label} <IoChevronDownOutline />
66
+ </Button>
67
+ </Menu.Trigger>
68
+ <Menu.List>{renderItems(menuItems)}</Menu.List>
69
+ </Menu>
74
70
  ),
75
71
  };
76
72
 
77
- export const IconMenu: Story = {
73
+ export const WithIcons: Story = {
78
74
  args: {
79
75
  menuItems: [
80
- {
81
- label: 'Profile',
82
- onClick: () => alert('Profile clicked'),
83
- itemIcon: <SlSettings />,
84
- },
85
- {
86
- label: 'Settings',
87
- onClick: () => alert('Settings clicked'),
88
- itemIcon: <SlSettings />,
89
- },
76
+ { label: 'Profile', onClick: () => alert('Profile clicked'), itemIcon: <SlSettings /> },
77
+ { label: 'Settings', onClick: () => alert('Settings clicked'), itemIcon: <SlSettings /> },
90
78
  ],
91
79
  },
92
- render: ({ label, menuItems }) => (
93
- <Menu.Root>
94
- <MenuButton aria-label={'storybook button menu'} as={Button}>
95
- {label} <IoChevronDownOutline />
96
- </MenuButton>
97
- <MenuList>
98
- {menuItems.map((item: StoryMenuItemProps) => (
99
- <MenuItem
100
- key={item.label}
101
- value={item.label}
102
- variant={item.variant}
103
- icon={item.itemIcon}
104
- onClick={item.onClick}
105
- >
106
- {item.label}
107
- </MenuItem>
108
- ))}
109
- </MenuList>
110
- </Menu.Root>
80
+ render: ({ label, baseFontSize, menuItems }) => (
81
+ <Menu baseFontSize={baseFontSize}>
82
+ <Menu.Trigger asChild>
83
+ <Button variant="outline">
84
+ {label} <IoChevronDownOutline />
85
+ </Button>
86
+ </Menu.Trigger>
87
+ <Menu.List>{renderItems(menuItems)}</Menu.List>
88
+ </Menu>
111
89
  ),
112
90
  };
113
91
 
114
- export const RightIconMenu: Story = {
92
+ export const WithRightIcons: Story = {
115
93
  args: {
116
94
  menuItems: [
117
- {
118
- label: 'Profile',
119
- onClick: () => alert('Profile clicked'),
120
- rightItemIcon: <SlSettings />,
121
- },
122
- {
123
- label: 'Settings',
124
- onClick: () => alert('Settings clicked'),
125
- rightItemIcon: <SlSettings />,
126
- },
95
+ { label: 'Profile', onClick: () => alert('Profile clicked'), rightItemIcon: <SlSettings /> },
96
+ { label: 'Settings', onClick: () => alert('Settings clicked'), rightItemIcon: <SlSettings /> },
127
97
  ],
128
98
  },
129
- render: ({ label, menuItems }) => (
130
- <Menu.Root>
131
- <MenuButton aria-label={'storybook button menu'} as={Button}>
132
- {label} <IoChevronDownOutline />
133
- </MenuButton>
134
- <MenuList>
135
- {menuItems.map((item: StoryMenuItemProps) => (
136
- <MenuItem
137
- key={item.label}
138
- value={item.label}
139
- variant={item.variant}
140
- rightIcon={item.rightItemIcon}
141
- onClick={item.onClick}
142
- >
143
- {item.label}
144
- </MenuItem>
145
- ))}
146
- </MenuList>
147
- </Menu.Root>
99
+ render: ({ label, baseFontSize, menuItems }) => (
100
+ <Menu baseFontSize={baseFontSize}>
101
+ <Menu.Trigger asChild>
102
+ <Button variant="outline">
103
+ {label} <IoChevronDownOutline />
104
+ </Button>
105
+ </Menu.Trigger>
106
+ <Menu.List>{renderItems(menuItems)}</Menu.List>
107
+ </Menu>
148
108
  ),
149
109
  };
150
110
 
151
- export const BothSideIconMenu: Story = {
111
+ export const WithBothIcons: Story = {
152
112
  args: {
153
113
  menuItems: [
154
- {
155
- label: 'Profile',
156
- onClick: () => alert('Profile clicked'),
157
- itemIcon: <SlSettings />,
158
- rightItemIcon: <IoChevronDownOutline />,
159
- },
160
- {
161
- label: 'Settings',
162
- onClick: () => alert('Settings clicked'),
163
- itemIcon: <SlSettings />,
164
- rightItemIcon: <IoChevronDownOutline />,
165
- },
114
+ { label: 'Profile', itemIcon: <SlSettings />, rightItemIcon: <IoChevronDownOutline />, onClick: () => alert('Profile clicked') },
115
+ { label: 'Settings', itemIcon: <SlSettings />, rightItemIcon: <IoChevronDownOutline />, onClick: () => alert('Settings clicked') },
166
116
  ],
167
117
  },
168
- render: ({ label, menuItems }) => (
169
- <Menu.Root>
170
- <MenuButton aria-label={'storybook button menu'} as={Button}>
171
- {label} <IoChevronDownOutline />
172
- </MenuButton>
173
- <MenuList>
174
- {menuItems.map((item: StoryMenuItemProps) => (
175
- <MenuItem
176
- key={item.label}
177
- value={item.label}
178
- variant={item.variant}
179
- icon={item.itemIcon}
180
- rightIcon={item.rightItemIcon}
181
- onClick={item.onClick}
182
- >
183
- {item.label}
184
- </MenuItem>
185
- ))}
186
- </MenuList>
187
- </Menu.Root>
118
+ render: ({ label, baseFontSize, menuItems }) => (
119
+ <Menu baseFontSize={baseFontSize}>
120
+ <Menu.Trigger asChild>
121
+ <Button variant="outline">
122
+ {label} <IoChevronDownOutline />
123
+ </Button>
124
+ </Menu.Trigger>
125
+ <Menu.List>{renderItems(menuItems)}</Menu.List>
126
+ </Menu>
188
127
  ),
189
128
  };
190
129
 
191
- export const DangerMenu: Story = {
130
+ export const WithDangerItem: Story = {
192
131
  args: {
193
132
  menuItems: [
194
133
  { label: 'Profile', onClick: () => alert('Profile clicked') },
195
- {
196
- label: 'Settings',
197
- onClick: () => alert('Settings clicked'),
198
- itemIcon: <SlSettings />,
199
- variant: 'danger',
200
- },
134
+ { label: 'Delete', onClick: () => alert('Delete clicked'), itemIcon: <SlSettings />, variant: 'danger' },
201
135
  ],
202
136
  },
203
- render: ({ label, menuItems }) => (
204
- <Menu.Root>
205
- <MenuButton aria-label={'storybook button menu'} as={Button}>
206
- {label} <IoChevronDownOutline />
207
- </MenuButton>
208
- <MenuList>
209
- {menuItems.map((item: StoryMenuItemProps) => (
210
- <MenuItem
211
- key={item.label}
212
- value={item.label}
213
- variant={item.variant}
214
- icon={item.itemIcon}
215
- onClick={item.onClick}
216
- >
217
- {item.label}
218
- </MenuItem>
219
- ))}
220
- </MenuList>
221
- </Menu.Root>
137
+ render: ({ label, baseFontSize, menuItems }) => (
138
+ <Menu baseFontSize={baseFontSize}>
139
+ <Menu.Trigger asChild>
140
+ <Button variant="outline">
141
+ {label} <IoChevronDownOutline />
142
+ </Button>
143
+ </Menu.Trigger>
144
+ <Menu.List>{renderItems(menuItems)}</Menu.List>
145
+ </Menu>
222
146
  ),
223
147
  };
224
148
 
225
- export const IconButtonTriggerMenu: Story = {
226
- args: {
227
- menuItems: [
228
- { label: 'Profile', onClick: () => alert('Profile clicked') },
229
- {
230
- label: 'Settings',
231
- onClick: () => alert('Settings clicked'),
232
- itemIcon: <SlSettings />,
233
- },
234
- ],
235
- },
236
- argTypes: {
237
- label: { table: { disable: true } },
238
- },
239
- render: ({ menuItems }) => (
240
- <Menu.Root>
241
- <MenuButton aria-label="storybook icon button menu" as={IconButton}>
242
- <IoChevronDownOutline />
243
- </MenuButton>
244
- <MenuList>
245
- {menuItems.map((item: StoryMenuItemProps) => (
246
- <MenuItem
247
- key={item.label}
248
- value={item.label}
249
- variant={item.variant}
250
- icon={item.itemIcon}
251
- onClick={item.onClick}
252
- >
253
- {item.label}
254
- </MenuItem>
255
- ))}
256
- </MenuList>
257
- </Menu.Root>
149
+ export const IconButtonTrigger: Story = {
150
+ argTypes: { label: { table: { disable: true } } },
151
+ render: ({ baseFontSize, menuItems }) => (
152
+ <Menu baseFontSize={baseFontSize}>
153
+ <Menu.Trigger asChild>
154
+ <IconButton aria-label="Open menu"><IoChevronDownOutline /></IconButton>
155
+ </Menu.Trigger>
156
+ <Menu.List>{renderItems(menuItems)}</Menu.List>
157
+ </Menu>
258
158
  ),
259
159
  };
260
160
 
261
- export const SelectiveIconMenu: Story = {
262
- args: {
263
- menuItems: [
264
- { label: 'Profile', onClick: () => alert('Profile clicked') },
265
- { label: 'Settings', onClick: () => alert('Settings clicked') },
266
- { label: 'Logout', onClick: () => alert('Logout clicked') },
267
- ],
268
- },
269
- render: function SelectiveIconRender({ label, menuItems }) {
270
- const [selectedLabel, setSelectedLabel] = useState<string | null>(
271
- menuItems[0].label
272
- );
273
-
274
- const handleItemClick = (label: string, onClick?: () => void) => {
275
- setSelectedLabel(label);
276
- onClick && onClick();
277
- };
161
+ export const SelectiveIcon: Story = {
162
+ render: function SelectiveIconRender({ label, baseFontSize, menuItems }) {
163
+ const [selectedLabel, setSelectedLabel] = useState<string | null>(menuItems[0].label);
278
164
 
279
165
  return (
280
- <Menu.Root>
281
- <MenuButton aria-label={'storybook button menu'} as={Button}>
282
- {label} <IoChevronDownOutline />
283
- </MenuButton>
284
- <MenuList>
285
- {menuItems.map((item: StoryMenuItemProps) => (
286
- <MenuItem
166
+ <Menu baseFontSize={baseFontSize}>
167
+ <Menu.Trigger asChild>
168
+ <Button variant="outline">
169
+ {label} <IoChevronDownOutline />
170
+ </Button>
171
+ </Menu.Trigger>
172
+ <Menu.List>
173
+ {menuItems.map(item => (
174
+ <Menu.Item
287
175
  key={item.label}
288
176
  value={item.label}
289
- onClick={() => handleItemClick(item.label, item.onClick)}
290
- icon={
291
- selectedLabel === item.label ? <SlSettings /> : undefined
292
- }
177
+ onClick={() => { setSelectedLabel(item.label); item.onClick?.(); }}
178
+ icon={selectedLabel === item.label ? <SlSettings /> : undefined}
293
179
  >
294
180
  {item.label}
295
- </MenuItem>
181
+ </Menu.Item>
296
182
  ))}
297
- </MenuList>
298
- </Menu.Root>
183
+ </Menu.List>
184
+ </Menu>
299
185
  );
300
186
  },
301
187
  };
@@ -0,0 +1,29 @@
1
+ import { Menu as ChakraMenu } from '@chakra-ui/react';
2
+
3
+ import { MenuItem } from './MenuItem';
4
+ import { MenuContext, MenuProps } from './Menu.types';
5
+ import { MenuList } from './MenuList';
6
+
7
+ const MenuBase = ({ baseFontSize = '14px', children, ...props }: MenuProps) => (
8
+ <MenuContext.Provider value={{ baseFontSize }}>
9
+ <ChakraMenu.Root {...props}>{children}</ChakraMenu.Root>
10
+ </MenuContext.Provider>
11
+ );
12
+ MenuBase.displayName = 'Menu';
13
+
14
+ export const Menu = Object.assign(MenuBase, {
15
+ Trigger: ChakraMenu.Trigger,
16
+ TriggerItem: ChakraMenu.TriggerItem,
17
+ ContextTrigger: ChakraMenu.ContextTrigger,
18
+ List: MenuList,
19
+ Item: MenuItem,
20
+ ItemGroup: ChakraMenu.ItemGroup,
21
+ ItemGroupLabel: ChakraMenu.ItemGroupLabel,
22
+ ItemCommand: ChakraMenu.ItemCommand,
23
+ CheckboxItem: ChakraMenu.CheckboxItem,
24
+ RadioItem: ChakraMenu.RadioItem,
25
+ RadioItemGroup: ChakraMenu.RadioItemGroup,
26
+ Separator: ChakraMenu.Separator,
27
+ Arrow: ChakraMenu.Arrow,
28
+ ArrowTip: ChakraMenu.ArrowTip,
29
+ });
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { Menu as ChakraMenu } from '@chakra-ui/react';
3
+
4
+ export interface MenuContextValue {
5
+ baseFontSize: string | number;
6
+ }
7
+
8
+ export const MenuContext = React.createContext<MenuContextValue>({
9
+ baseFontSize: '14px',
10
+ });
11
+
12
+ export const useMenuContext = () => React.useContext(MenuContext);
13
+
14
+ export type MenuProps = React.ComponentPropsWithoutRef<
15
+ typeof ChakraMenu.Root
16
+ > & {
17
+ baseFontSize?: string | number;
18
+ };
@@ -30,10 +30,10 @@ export const MenuItem = ({
30
30
  {...focusRing}
31
31
  {...rest}
32
32
  >
33
- {icon && icon}
33
+ {icon}
34
34
  {children}
35
35
  {rightIcon && <Spacer />}
36
- {rightIcon && rightIcon}
36
+ {rightIcon}
37
37
  </Menu.Item>
38
38
  );
39
39
  };
@@ -1,26 +1,34 @@
1
- import {
2
- Menu,
3
- MenuContentProps as ChakraMenuContentProps,
4
- Portal,
5
- } from '@chakra-ui/react';
1
+ import { forwardRef } from 'react';
2
+ import { Menu, MenuContentProps as ChakraMenuContentProps, Portal } from '@chakra-ui/react';
6
3
 
7
- export interface MenuListProps extends ChakraMenuContentProps {}
4
+ import { ScaledContext } from '../ScaledContext';
5
+ import { useMenuContext } from './Menu.types';
8
6
 
9
- export const MenuList = ({ children, ...rest }: MenuListProps) => {
10
- return (
11
- <Portal>
7
+ export type MenuListProps = ChakraMenuContentProps & {
8
+ portalled?: boolean;
9
+ };
10
+
11
+ export const MenuList = forwardRef<HTMLDivElement, MenuListProps>(
12
+ ({ children, portalled = true, ...rest }, ref) => {
13
+ const { baseFontSize } = useMenuContext();
14
+
15
+ const content = (
12
16
  <Menu.Positioner>
13
17
  <Menu.Content
18
+ ref={ref}
14
19
  border="1px solid"
15
20
  borderColor="gray.200"
16
21
  borderRadius="md"
17
- boxShadow="0 5px 20px 1px var(--chakra-colors-gray-50)"
22
+ boxShadow="0 5px 20px 1px {colors.gray.50}"
18
23
  p="1.5"
19
24
  {...rest}
20
25
  >
21
- {children}
26
+ <ScaledContext fontSize={baseFontSize}>{children}</ScaledContext>
22
27
  </Menu.Content>
23
28
  </Menu.Positioner>
24
- </Portal>
25
- );
26
- };
29
+ );
30
+
31
+ return portalled ? <Portal>{content}</Portal> : content;
32
+ }
33
+ );
34
+ MenuList.displayName = 'Menu.List';
@@ -1,6 +1,5 @@
1
- export { MenuButton } from './MenuButton';
2
- export type * from './MenuButton.types';
1
+ export { Menu } from './Menu';
2
+ export type { MenuProps } from './Menu.types';
3
3
  export { MenuItem } from './MenuItem';
4
4
  export type * from './MenuItem.types';
5
5
  export { MenuList } from './MenuList';
6
- export { Menu } from '@chakra-ui/react';
@@ -1,3 +0,0 @@
1
- import { CustomMenuButtonProps } from './MenuButton.types';
2
- export declare const MenuButton: ({ as: Component, children, ...rest }: CustomMenuButtonProps) => import("react/jsx-runtime").JSX.Element;
3
- //# sourceMappingURL=MenuButton.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MenuButton.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/MenuButton.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,eAAO,MAAM,UAAU,GAAI,sCAIxB,qBAAqB,4CAMvB,CAAC"}
@@ -1,12 +0,0 @@
1
- "use client";
2
- 'use strict';
3
-
4
- var jsxRuntime = require('react/jsx-runtime');
5
- var react = require('@chakra-ui/react');
6
-
7
- const MenuButton = ({ as: Component, children, ...rest }) => {
8
- return (jsxRuntime.jsx(react.Menu.Trigger, { asChild: true, children: jsxRuntime.jsx(Component, { ...rest, children: children }) }));
9
- };
10
-
11
- exports.MenuButton = MenuButton;
12
- //# sourceMappingURL=MenuButton.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MenuButton.js","sources":["../../../src/components/Menu/MenuButton.tsx"],"sourcesContent":[null],"names":["_jsx","Menu"],"mappings":";;;;;;AAKO,MAAM,UAAU,GAAG,CAAC,EACzB,EAAE,EAAE,SAAS,EACb,QAAQ,EACR,GAAG,IAAI,EACe,KAAI;AAC1B,IAAA,QACEA,cAAA,CAACC,UAAI,CAAC,OAAO,IAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EACnBD,cAAA,CAAC,SAAS,OAAK,IAAI,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAa,EAAA,CAC9B;AAEnB;;;;"}
@@ -1,10 +0,0 @@
1
- "use client";
2
- import { jsx } from 'react/jsx-runtime';
3
- import { Menu } from '@chakra-ui/react';
4
-
5
- const MenuButton = ({ as: Component, children, ...rest }) => {
6
- return (jsx(Menu.Trigger, { asChild: true, children: jsx(Component, { ...rest, children: children }) }));
7
- };
8
-
9
- export { MenuButton };
10
- //# sourceMappingURL=MenuButton.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MenuButton.mjs","sources":["../../../src/components/Menu/MenuButton.tsx"],"sourcesContent":[null],"names":["_jsx"],"mappings":";;;;AAKO,MAAM,UAAU,GAAG,CAAC,EACzB,EAAE,EAAE,SAAS,EACb,QAAQ,EACR,GAAG,IAAI,EACe,KAAI;AAC1B,IAAA,QACEA,GAAA,CAAC,IAAI,CAAC,OAAO,IAAC,OAAO,EAAA,IAAA,EAAA,QAAA,EACnBA,GAAA,CAAC,SAAS,OAAK,IAAI,EAAA,QAAA,EAAG,QAAQ,EAAA,CAAa,EAAA,CAC9B;AAEnB;;;;"}
@@ -1,20 +0,0 @@
1
- import { Button } from '@/components/Button';
2
- import type { ButtonProps } from '@/components/Button/Button.types';
3
- import { IconButton } from '@/components/IconButton';
4
- import type { IconButtonProps as CustomIconButtonProps } from '@/components/IconButton/IconButton.types';
5
- interface ButtonMenuButtonProps extends Omit<ButtonProps, 'as' | 'colorScheme'> {
6
- as: typeof Button;
7
- rightIcon?: React.ReactElement;
8
- icon?: never;
9
- children?: React.ReactNode;
10
- }
11
- interface IconButtonMenuButtonProps extends Omit<CustomIconButtonProps, 'as' | 'colorScheme'> {
12
- as: typeof IconButton;
13
- icon?: React.ReactElement;
14
- rightIcon?: never;
15
- 'aria-label': string;
16
- children?: React.ReactNode;
17
- }
18
- export type CustomMenuButtonProps = ButtonMenuButtonProps | IconButtonMenuButtonProps;
19
- export {};
20
- //# sourceMappingURL=MenuButton.types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MenuButton.types.d.ts","sourceRoot":"","sources":["../../../src/components/Menu/MenuButton.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,IAAI,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAGzG,UAAU,qBAAsB,SAAQ,IAAI,CAC1C,WAAW,EACX,IAAI,GAAG,aAAa,CACrB;IACC,EAAE,EAAE,OAAO,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC/B,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,UAAU,yBAA0B,SAAQ,IAAI,CAC9C,qBAAqB,EACrB,IAAI,GAAG,aAAa,CACrB;IACC,EAAE,EAAE,OAAO,UAAU,CAAC;IACtB,IAAI,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC;IAC1B,SAAS,CAAC,EAAE,KAAK,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,MAAM,MAAM,qBAAqB,GAC7B,qBAAqB,GACrB,yBAAyB,CAAC"}
@@ -1,16 +0,0 @@
1
- import React from 'react';
2
- import { Menu } from '@chakra-ui/react';
3
-
4
- import { CustomMenuButtonProps } from './MenuButton.types';
5
-
6
- export const MenuButton = ({
7
- as: Component,
8
- children,
9
- ...rest
10
- }: CustomMenuButtonProps) => {
11
- return (
12
- <Menu.Trigger asChild>
13
- <Component {...rest}>{children}</Component>
14
- </Menu.Trigger>
15
- );
16
- };
@@ -1,30 +0,0 @@
1
- import { Button } from '@/components/Button';
2
- import type { ButtonProps } from '@/components/Button/Button.types';
3
- import { IconButton } from '@/components/IconButton';
4
- import type { IconButtonProps as CustomIconButtonProps } from '@/components/IconButton/IconButton.types';
5
-
6
- // as 속성에 들어갈 `Button`과 `IconButton`에 따른 조건부 타입
7
- interface ButtonMenuButtonProps extends Omit<
8
- ButtonProps,
9
- 'as' | 'colorScheme'
10
- > {
11
- as: typeof Button;
12
- rightIcon?: React.ReactElement;
13
- icon?: never;
14
- children?: React.ReactNode;
15
- }
16
-
17
- interface IconButtonMenuButtonProps extends Omit<
18
- CustomIconButtonProps,
19
- 'as' | 'colorScheme'
20
- > {
21
- as: typeof IconButton;
22
- icon?: React.ReactElement;
23
- rightIcon?: never;
24
- 'aria-label': string;
25
- children?: React.ReactNode;
26
- }
27
-
28
- export type CustomMenuButtonProps =
29
- | ButtonMenuButtonProps
30
- | IconButtonMenuButtonProps;