@fuf-stack/pixels 1.3.2 → 1.3.4
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/dist/Menu/index.cjs +2 -2
- package/dist/Menu/index.js +1 -1
- package/dist/SearchInput/index.cjs +1 -0
- package/dist/SearchInput/index.cjs.map +1 -1
- package/dist/SearchInput/index.js +1 -0
- package/dist/SearchInput/index.js.map +1 -1
- package/dist/{chunk-3VAWRUPR.js → chunk-DBECHNB6.js} +3 -3
- package/dist/chunk-DBECHNB6.js.map +1 -0
- package/dist/{chunk-C43BKEAS.cjs → chunk-T5TNFSDI.cjs} +2 -2
- package/dist/chunk-T5TNFSDI.cjs.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-3VAWRUPR.js.map +0 -1
- package/dist/chunk-C43BKEAS.cjs.map +0 -1
package/dist/Menu/index.cjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkT5TNFSDIcjs = require('../chunk-T5TNFSDI.cjs');
|
|
5
5
|
require('../chunk-AHEA4IJV.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
exports.Menu =
|
|
9
|
+
exports.Menu = _chunkT5TNFSDIcjs.Menu_default; exports.default = _chunkT5TNFSDIcjs.Menu_default2;
|
|
10
10
|
//# sourceMappingURL=index.cjs.map
|
package/dist/Menu/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/pixels/pixels/packages/pixels/dist/SearchInput/index.cjs","../../src/SearchInput/SearchInput.tsx","../../src/SearchInput/index.ts"],"names":["SearchInput_default"],"mappings":"AAAA,0GAA8B;AAC9B;AACA;ACCA,8BAAyB;AACzB,oCAAyB;AAEzB,sCAAmC;AAEnC,oDAAkD;
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/pixels/pixels/packages/pixels/dist/SearchInput/index.cjs","../../src/SearchInput/SearchInput.tsx","../../src/SearchInput/index.ts"],"names":["SearchInput_default"],"mappings":"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","file":"/home/runner/work/pixels/pixels/packages/pixels/dist/SearchInput/index.cjs","sourcesContent":[null,"import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { useState } from 'react';\nimport { FaSearch } from 'react-icons/fa';\n\nimport { Input as HeroInput } from '@heroui/input';\n\nimport { slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\n// input variants\nexport const inputVariants = tv({\n slots: {\n /** wrapper around the whole input */\n base: '',\n /** clear button */\n clearButton: '',\n /** actual input element */\n input: '',\n /** inner wrapper (HeroUI inputWrapper slot) */\n inputWrapper: 'bg-content1 group-data-[focus=true]:border-focus',\n },\n});\n\ntype VariantProps = TVProps<typeof inputVariants>;\ntype ClassName = TVClassName<typeof inputVariants>;\n\nexport interface SearchInputProps extends VariantProps {\n /** CSS class name */\n className?: ClassName;\n /** input field is disabled */\n disabled?: boolean;\n /** added content to the end of the input Field. */\n endContent?: ReactNode;\n /** optional initial value of the input */\n initialValue?: string;\n /** callback that is fired when the value is changed or cleared */\n onChange: (value: string | null) => void;\n /** form field placeholder */\n placeholder?: string;\n /** size of the input */\n size?: 'sm' | 'md' | 'lg';\n /** content added to the start of the input field */\n startContent?: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\n/**\n * SearchInput component based on [HeroUI Input](https://www.heroui.com//docs/components/input)\n */\nconst SearchInput = ({\n className: _className = undefined,\n disabled = false,\n endContent = undefined,\n onChange,\n placeholder = undefined,\n size = undefined,\n startContent = undefined,\n testId = undefined,\n initialValue = undefined,\n}: SearchInputProps) => {\n // handle controlled value with initial value\n const [value, setValue] = useState(initialValue ?? '');\n\n const handleChange = (e?: ChangeEvent<HTMLInputElement>) => {\n setValue(e?.target?.value ?? '');\n onChange(e?.target?.value ?? null);\n };\n\n // classNames from slots\n const variants = inputVariants();\n const classNames = variantsToClassNames(variants, _className, 'base');\n\n return (\n <HeroInput\n isClearable\n // disable password manager integrations\n autoComplete=\"off\"\n data-testid={testId ? slugify(testId) : undefined}\n endContent={endContent}\n isDisabled={disabled}\n onChange={handleChange}\n onClear={handleChange}\n placeholder={placeholder}\n radius=\"sm\"\n size={size}\n startContent={startContent ?? <FaSearch className=\"opacity-50\" />}\n value={value}\n variant=\"bordered\"\n classNames={{\n base: classNames.base,\n clearButton: classNames.clearButton,\n input: classNames.input,\n inputWrapper: classNames.inputWrapper,\n }}\n />\n );\n};\n\nexport default SearchInput;\n","import SearchInput from './SearchInput';\n\nexport type { SearchInputProps } from './SearchInput';\n\nexport { SearchInput };\n\nexport default SearchInput;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/SearchInput/SearchInput.tsx","../../src/SearchInput/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { useState } from 'react';\nimport { FaSearch } from 'react-icons/fa';\n\nimport { Input as HeroInput } from '@heroui/input';\n\nimport { slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\n// input variants\nexport const inputVariants = tv({\n slots: {\n /** wrapper around the whole input */\n base: '',\n /** clear button */\n clearButton: '',\n /** actual input element */\n input: '',\n /** inner wrapper (HeroUI inputWrapper slot) */\n inputWrapper: 'bg-content1 group-data-[focus=true]:border-focus',\n },\n});\n\ntype VariantProps = TVProps<typeof inputVariants>;\ntype ClassName = TVClassName<typeof inputVariants>;\n\nexport interface SearchInputProps extends VariantProps {\n /** CSS class name */\n className?: ClassName;\n /** input field is disabled */\n disabled?: boolean;\n /** added content to the end of the input Field. */\n endContent?: ReactNode;\n /** optional initial value of the input */\n initialValue?: string;\n /** callback that is fired when the value is changed or cleared */\n onChange: (value: string | null) => void;\n /** form field placeholder */\n placeholder?: string;\n /** size of the input */\n size?: 'sm' | 'md' | 'lg';\n /** content added to the start of the input field */\n startContent?: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\n/**\n * SearchInput component based on [HeroUI Input](https://www.heroui.com//docs/components/input)\n */\nconst SearchInput = ({\n className: _className = undefined,\n disabled = false,\n endContent = undefined,\n onChange,\n placeholder = undefined,\n size = undefined,\n startContent = undefined,\n testId = undefined,\n initialValue = undefined,\n}: SearchInputProps) => {\n // handle controlled value with initial value\n const [value, setValue] = useState(initialValue ?? '');\n\n const handleChange = (e?: ChangeEvent<HTMLInputElement>) => {\n setValue(e?.target?.value ?? '');\n onChange(e?.target?.value ?? null);\n };\n\n // classNames from slots\n const variants = inputVariants();\n const classNames = variantsToClassNames(variants, _className, 'base');\n\n return (\n <HeroInput\n isClearable\n data-testid={testId ? slugify(testId) : undefined}\n endContent={endContent}\n isDisabled={disabled}\n onChange={handleChange}\n onClear={handleChange}\n placeholder={placeholder}\n radius=\"sm\"\n size={size}\n startContent={startContent ?? <FaSearch className=\"opacity-50\" />}\n value={value}\n variant=\"bordered\"\n classNames={{\n base: classNames.base,\n clearButton: classNames.clearButton,\n input: classNames.input,\n inputWrapper: classNames.inputWrapper,\n }}\n />\n );\n};\n\nexport default SearchInput;\n","import SearchInput from './SearchInput';\n\nexport type { SearchInputProps } from './SearchInput';\n\nexport { SearchInput };\n\nexport default SearchInput;\n"],"mappings":";;;AAGA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAEzB,SAAS,SAAS,iBAAiB;AAEnC,SAAS,SAAS,IAAI,4BAA4B;
|
|
1
|
+
{"version":3,"sources":["../../src/SearchInput/SearchInput.tsx","../../src/SearchInput/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ChangeEvent, ReactNode } from 'react';\n\nimport { useState } from 'react';\nimport { FaSearch } from 'react-icons/fa';\n\nimport { Input as HeroInput } from '@heroui/input';\n\nimport { slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\n// input variants\nexport const inputVariants = tv({\n slots: {\n /** wrapper around the whole input */\n base: '',\n /** clear button */\n clearButton: '',\n /** actual input element */\n input: '',\n /** inner wrapper (HeroUI inputWrapper slot) */\n inputWrapper: 'bg-content1 group-data-[focus=true]:border-focus',\n },\n});\n\ntype VariantProps = TVProps<typeof inputVariants>;\ntype ClassName = TVClassName<typeof inputVariants>;\n\nexport interface SearchInputProps extends VariantProps {\n /** CSS class name */\n className?: ClassName;\n /** input field is disabled */\n disabled?: boolean;\n /** added content to the end of the input Field. */\n endContent?: ReactNode;\n /** optional initial value of the input */\n initialValue?: string;\n /** callback that is fired when the value is changed or cleared */\n onChange: (value: string | null) => void;\n /** form field placeholder */\n placeholder?: string;\n /** size of the input */\n size?: 'sm' | 'md' | 'lg';\n /** content added to the start of the input field */\n startContent?: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\n/**\n * SearchInput component based on [HeroUI Input](https://www.heroui.com//docs/components/input)\n */\nconst SearchInput = ({\n className: _className = undefined,\n disabled = false,\n endContent = undefined,\n onChange,\n placeholder = undefined,\n size = undefined,\n startContent = undefined,\n testId = undefined,\n initialValue = undefined,\n}: SearchInputProps) => {\n // handle controlled value with initial value\n const [value, setValue] = useState(initialValue ?? '');\n\n const handleChange = (e?: ChangeEvent<HTMLInputElement>) => {\n setValue(e?.target?.value ?? '');\n onChange(e?.target?.value ?? null);\n };\n\n // classNames from slots\n const variants = inputVariants();\n const classNames = variantsToClassNames(variants, _className, 'base');\n\n return (\n <HeroInput\n isClearable\n // disable password manager integrations\n autoComplete=\"off\"\n data-testid={testId ? slugify(testId) : undefined}\n endContent={endContent}\n isDisabled={disabled}\n onChange={handleChange}\n onClear={handleChange}\n placeholder={placeholder}\n radius=\"sm\"\n size={size}\n startContent={startContent ?? <FaSearch className=\"opacity-50\" />}\n value={value}\n variant=\"bordered\"\n classNames={{\n base: classNames.base,\n clearButton: classNames.clearButton,\n input: classNames.input,\n inputWrapper: classNames.inputWrapper,\n }}\n />\n );\n};\n\nexport default SearchInput;\n","import SearchInput from './SearchInput';\n\nexport type { SearchInputProps } from './SearchInput';\n\nexport { SearchInput };\n\nexport default SearchInput;\n"],"mappings":";;;AAGA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAEzB,SAAS,SAAS,iBAAiB;AAEnC,SAAS,SAAS,IAAI,4BAA4B;AA+Ed;AA5E7B,IAAM,gBAAgB,GAAG;AAAA,EAC9B,OAAO;AAAA;AAAA,IAEL,MAAM;AAAA;AAAA,IAEN,aAAa;AAAA;AAAA,IAEb,OAAO;AAAA;AAAA,IAEP,cAAc;AAAA,EAChB;AACF,CAAC;AA6BD,IAAM,cAAc,CAAC;AAAA,EACnB,WAAW,aAAa;AAAA,EACxB,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AAAA,EACA,cAAc;AAAA,EACd,OAAO;AAAA,EACP,eAAe;AAAA,EACf,SAAS;AAAA,EACT,eAAe;AACjB,MAAwB;AAEtB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,sCAAgB,EAAE;AAErD,QAAM,eAAe,CAAC,MAAsC;AAjE9D;AAkEI,cAAS,kCAAG,WAAH,mBAAW,UAAX,YAAoB,EAAE;AAC/B,cAAS,kCAAG,WAAH,mBAAW,UAAX,YAAoB,IAAI;AAAA,EACnC;AAGA,QAAM,WAAW,cAAc;AAC/B,QAAM,aAAa,qBAAqB,UAAU,YAAY,MAAM;AAEpE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAW;AAAA,MAEX,cAAa;AAAA,MACb,eAAa,SAAS,QAAQ,MAAM,IAAI;AAAA,MACxC;AAAA,MACA,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT;AAAA,MACA,QAAO;AAAA,MACP;AAAA,MACA,cAAc,sCAAgB,oBAAC,YAAS,WAAU,cAAa;AAAA,MAC/D;AAAA,MACA,SAAQ;AAAA,MACR,YAAY;AAAA,QACV,MAAM,WAAW;AAAA,QACjB,aAAa,WAAW;AAAA,QACxB,OAAO,WAAW;AAAA,QAClB,cAAc,WAAW;AAAA,MAC3B;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,sBAAQ;;;AC9Ff,IAAOA,uBAAQ;","names":["SearchInput_default"]}
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
DropdownSection as HeroDropdownSection,
|
|
14
14
|
DropdownTrigger as HeroDropdownTrigger
|
|
15
15
|
} from "@heroui/dropdown";
|
|
16
|
-
import { cn, tv, variantsToClassNames } from "@fuf-stack/pixel-utils";
|
|
16
|
+
import { cn, slugify, tv, variantsToClassNames } from "@fuf-stack/pixel-utils";
|
|
17
17
|
|
|
18
18
|
// src/Menu/VerticalDotsIcon.tsx
|
|
19
19
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -82,7 +82,7 @@ var renderMenuItem = (item, itemClassName) => {
|
|
|
82
82
|
HeroDropdownItem,
|
|
83
83
|
{
|
|
84
84
|
className: cn(itemClassName, item.className),
|
|
85
|
-
"data-testid": (_a = item.testId) != null ? _a : item.key,
|
|
85
|
+
"data-testid": slugify((_a = item.testId) != null ? _a : item.key),
|
|
86
86
|
description: item.description,
|
|
87
87
|
onPress: item.onClick,
|
|
88
88
|
startContent: item.icon,
|
|
@@ -166,4 +166,4 @@ export {
|
|
|
166
166
|
Menu_default,
|
|
167
167
|
Menu_default2
|
|
168
168
|
};
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
169
|
+
//# sourceMappingURL=chunk-DBECHNB6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Menu/Menu.tsx","../src/Menu/VerticalDotsIcon.tsx","../src/Menu/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ButtonProps } from '@heroui/button';\nimport type {\n DropdownItemProps as HeroDropdownItemProps,\n DropdownProps as HeroDropdownProps,\n DropdownSectionProps as HeroDropdownSectionProps,\n} from '@heroui/dropdown';\nimport type { Key, ReactNode } from 'react';\n\nimport { Button } from '@heroui/button';\nimport {\n Dropdown as HeroDropdown,\n DropdownItem as HeroDropdownItem,\n DropdownMenu as HeroDropdownMenu,\n DropdownSection as HeroDropdownSection,\n DropdownTrigger as HeroDropdownTrigger,\n} from '@heroui/dropdown';\n\nimport { cn, slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport VerticalDotsIcon from './VerticalDotsIcon';\n\n/**\n * Menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)\n */\nexport interface MenuItem {\n /** unique identifier */\n key: string;\n /** CSS class name */\n className?: string;\n /** additional description shown under the label */\n description?: string;\n /** disables the menu item */\n disabled?: boolean;\n /** menu item icon */\n icon?: ReactNode;\n /** menu item name */\n label: ReactNode;\n /** click event handler */\n onClick?: HeroDropdownItemProps['onPress'];\n /** e2e test identifier */\n testId?: string;\n}\n\n/**\n * Menu section type\n */\nexport interface MenuSection {\n /** unique identifier */\n key: string;\n /** section label */\n label: ReactNode;\n /** section items (array of MenuItem) */\n items: MenuItem[];\n}\n\n// menu styling variants\nexport const menuVariants = tv({\n slots: {\n item: '',\n trigger: '',\n },\n});\n\ntype VariantProps = TVProps<typeof menuVariants>;\ntype ClassName = TVClassName<typeof menuVariants>;\n\nexport interface MenuProps extends VariantProps {\n /** sets HTML aria-label attribute */\n ariaLabel?: string;\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** menu item structure */\n items: (MenuSection | MenuItem)[];\n /** disable menu trigger */\n isDisabled?: boolean;\n /** placement of the menu */\n placement?: HeroDropdownProps['placement'];\n /** called if item is selected */\n onAction?: (key: Key) => void;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** When defined a Button will be rendered as trigger (with provided props) instead of unstyled html button */\n triggerButtonProps?: Pick<\n ButtonProps,\n | 'aria-label'\n | 'className'\n | 'color'\n | 'disableAnimation'\n | 'disableRipple'\n | 'disabled'\n | 'size'\n | 'variant'\n >;\n}\n\n// type guard for MenuSection\nconst isMenuSection = (item: MenuSection | MenuItem): item is MenuSection => {\n return 'items' in item;\n};\n\n// returns String[] of disabled items/keys\nconst getDisabledKeys = (items: (MenuSection | MenuItem)[]): string[] => {\n const flatItems = items.reduce<MenuItem[]>((acc, item) => {\n if (isMenuSection(item)) {\n acc.push(...item.items);\n } else {\n acc.push(item);\n }\n return acc;\n }, []);\n return flatItems\n .filter((item) => {\n return item.disabled === true;\n })\n .map((item) => {\n return item.key;\n });\n};\n\nconst renderMenuItem = (item: MenuItem, itemClassName?: string) => {\n return (\n <HeroDropdownItem\n key={item.key}\n className={cn(itemClassName, item.className)}\n data-testid={slugify(item.testId ?? item.key)}\n description={item.description}\n onPress={item.onClick}\n startContent={item.icon}\n >\n {item.label}\n </HeroDropdownItem>\n );\n};\n\n/**\n * Dropdown menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)\n */\nconst Menu = ({\n ariaLabel = undefined,\n children = null,\n className: _className = undefined,\n isDisabled = false,\n items,\n onAction = undefined,\n placement = undefined,\n testId = undefined,\n triggerButtonProps = undefined,\n}: MenuProps) => {\n // className from slots\n const variants = menuVariants();\n const className = variantsToClassNames(variants, _className, 'trigger');\n\n // determine trigger button variant\n let triggerButton = (\n <button className={className.trigger} type=\"button\">\n {children}\n </button>\n );\n if (!children) {\n // default to ellipsis icon when no children are provided\n triggerButton = (\n <Button\n isIconOnly\n className={cn('outline-divider min-w-0 outline', className.trigger)}\n radius=\"full\"\n size=\"sm\"\n variant=\"light\"\n {...triggerButtonProps}\n >\n <VerticalDotsIcon />\n </Button>\n );\n } else if (triggerButtonProps) {\n // use provided triggerButtonProps with hero button\n triggerButton = (\n <Button className={className.trigger} {...triggerButtonProps}>\n {children}\n </Button>\n );\n }\n\n return (\n <HeroDropdown\n aria-label={ariaLabel}\n isDisabled={isDisabled}\n placement={placement}\n >\n <HeroDropdownTrigger data-testid={testId}>\n {/* NOTE: type and aria properties are injected by HeroDropdownTrigger */}\n {triggerButton}\n </HeroDropdownTrigger>\n <HeroDropdownMenu\n disabledKeys={getDisabledKeys(items)}\n items={items}\n onAction={onAction}\n >\n {(item) => {\n if ('items' in item) {\n return (\n <HeroDropdownSection\n key={item.key}\n items={item.items}\n title={item.label as HeroDropdownSectionProps['title']}\n >\n {(sectionItem) => {\n return renderMenuItem(sectionItem, className.item);\n }}\n </HeroDropdownSection>\n );\n }\n return renderMenuItem(item, className.item);\n }}\n </HeroDropdownMenu>\n </HeroDropdown>\n );\n};\n\nexport default Menu;\n","import type { SVGProps } from 'react';\n\n// Default Icon for Menu button\nconst VerticalDotsIcon = ({\n size = 24,\n width,\n height,\n ...props\n}: SVGProps<SVGSVGElement> & { size?: number }) => {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n focusable=\"false\"\n height={size ?? height}\n role=\"presentation\"\n viewBox=\"0 0 24 24\"\n width={size ?? width}\n {...props}\n >\n <path\n d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport default VerticalDotsIcon;\n","import Menu from './Menu';\n\nexport type { MenuProps, MenuItem, MenuSection } from './Menu';\n\nexport { Menu };\n\nexport default Menu;\n"],"mappings":"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","names":["jsx","Menu_default"]}
|
|
@@ -82,7 +82,7 @@ var renderMenuItem = (item, itemClassName) => {
|
|
|
82
82
|
_dropdown.DropdownItem,
|
|
83
83
|
{
|
|
84
84
|
className: _pixelutils.cn.call(void 0, itemClassName, item.className),
|
|
85
|
-
"data-testid": (_a = item.testId) != null ? _a : item.key,
|
|
85
|
+
"data-testid": _pixelutils.slugify.call(void 0, (_a = item.testId) != null ? _a : item.key),
|
|
86
86
|
description: item.description,
|
|
87
87
|
onPress: item.onClick,
|
|
88
88
|
startContent: item.icon,
|
|
@@ -166,4 +166,4 @@ var Menu_default2 = Menu_default;
|
|
|
166
166
|
|
|
167
167
|
|
|
168
168
|
exports.Menu_default = Menu_default; exports.Menu_default2 = Menu_default2;
|
|
169
|
-
//# sourceMappingURL=chunk-
|
|
169
|
+
//# sourceMappingURL=chunk-T5TNFSDI.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/pixels/pixels/packages/pixels/dist/chunk-T5TNFSDI.cjs","../src/Menu/Menu.tsx","../src/Menu/VerticalDotsIcon.tsx","../src/Menu/index.ts"],"names":["jsx","Menu_default"],"mappings":"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","file":"/home/runner/work/pixels/pixels/packages/pixels/dist/chunk-T5TNFSDI.cjs","sourcesContent":[null,"import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ButtonProps } from '@heroui/button';\nimport type {\n DropdownItemProps as HeroDropdownItemProps,\n DropdownProps as HeroDropdownProps,\n DropdownSectionProps as HeroDropdownSectionProps,\n} from '@heroui/dropdown';\nimport type { Key, ReactNode } from 'react';\n\nimport { Button } from '@heroui/button';\nimport {\n Dropdown as HeroDropdown,\n DropdownItem as HeroDropdownItem,\n DropdownMenu as HeroDropdownMenu,\n DropdownSection as HeroDropdownSection,\n DropdownTrigger as HeroDropdownTrigger,\n} from '@heroui/dropdown';\n\nimport { cn, slugify, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport VerticalDotsIcon from './VerticalDotsIcon';\n\n/**\n * Menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)\n */\nexport interface MenuItem {\n /** unique identifier */\n key: string;\n /** CSS class name */\n className?: string;\n /** additional description shown under the label */\n description?: string;\n /** disables the menu item */\n disabled?: boolean;\n /** menu item icon */\n icon?: ReactNode;\n /** menu item name */\n label: ReactNode;\n /** click event handler */\n onClick?: HeroDropdownItemProps['onPress'];\n /** e2e test identifier */\n testId?: string;\n}\n\n/**\n * Menu section type\n */\nexport interface MenuSection {\n /** unique identifier */\n key: string;\n /** section label */\n label: ReactNode;\n /** section items (array of MenuItem) */\n items: MenuItem[];\n}\n\n// menu styling variants\nexport const menuVariants = tv({\n slots: {\n item: '',\n trigger: '',\n },\n});\n\ntype VariantProps = TVProps<typeof menuVariants>;\ntype ClassName = TVClassName<typeof menuVariants>;\n\nexport interface MenuProps extends VariantProps {\n /** sets HTML aria-label attribute */\n ariaLabel?: string;\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** menu item structure */\n items: (MenuSection | MenuItem)[];\n /** disable menu trigger */\n isDisabled?: boolean;\n /** placement of the menu */\n placement?: HeroDropdownProps['placement'];\n /** called if item is selected */\n onAction?: (key: Key) => void;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** When defined a Button will be rendered as trigger (with provided props) instead of unstyled html button */\n triggerButtonProps?: Pick<\n ButtonProps,\n | 'aria-label'\n | 'className'\n | 'color'\n | 'disableAnimation'\n | 'disableRipple'\n | 'disabled'\n | 'size'\n | 'variant'\n >;\n}\n\n// type guard for MenuSection\nconst isMenuSection = (item: MenuSection | MenuItem): item is MenuSection => {\n return 'items' in item;\n};\n\n// returns String[] of disabled items/keys\nconst getDisabledKeys = (items: (MenuSection | MenuItem)[]): string[] => {\n const flatItems = items.reduce<MenuItem[]>((acc, item) => {\n if (isMenuSection(item)) {\n acc.push(...item.items);\n } else {\n acc.push(item);\n }\n return acc;\n }, []);\n return flatItems\n .filter((item) => {\n return item.disabled === true;\n })\n .map((item) => {\n return item.key;\n });\n};\n\nconst renderMenuItem = (item: MenuItem, itemClassName?: string) => {\n return (\n <HeroDropdownItem\n key={item.key}\n className={cn(itemClassName, item.className)}\n data-testid={slugify(item.testId ?? item.key)}\n description={item.description}\n onPress={item.onClick}\n startContent={item.icon}\n >\n {item.label}\n </HeroDropdownItem>\n );\n};\n\n/**\n * Dropdown menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)\n */\nconst Menu = ({\n ariaLabel = undefined,\n children = null,\n className: _className = undefined,\n isDisabled = false,\n items,\n onAction = undefined,\n placement = undefined,\n testId = undefined,\n triggerButtonProps = undefined,\n}: MenuProps) => {\n // className from slots\n const variants = menuVariants();\n const className = variantsToClassNames(variants, _className, 'trigger');\n\n // determine trigger button variant\n let triggerButton = (\n <button className={className.trigger} type=\"button\">\n {children}\n </button>\n );\n if (!children) {\n // default to ellipsis icon when no children are provided\n triggerButton = (\n <Button\n isIconOnly\n className={cn('outline-divider min-w-0 outline', className.trigger)}\n radius=\"full\"\n size=\"sm\"\n variant=\"light\"\n {...triggerButtonProps}\n >\n <VerticalDotsIcon />\n </Button>\n );\n } else if (triggerButtonProps) {\n // use provided triggerButtonProps with hero button\n triggerButton = (\n <Button className={className.trigger} {...triggerButtonProps}>\n {children}\n </Button>\n );\n }\n\n return (\n <HeroDropdown\n aria-label={ariaLabel}\n isDisabled={isDisabled}\n placement={placement}\n >\n <HeroDropdownTrigger data-testid={testId}>\n {/* NOTE: type and aria properties are injected by HeroDropdownTrigger */}\n {triggerButton}\n </HeroDropdownTrigger>\n <HeroDropdownMenu\n disabledKeys={getDisabledKeys(items)}\n items={items}\n onAction={onAction}\n >\n {(item) => {\n if ('items' in item) {\n return (\n <HeroDropdownSection\n key={item.key}\n items={item.items}\n title={item.label as HeroDropdownSectionProps['title']}\n >\n {(sectionItem) => {\n return renderMenuItem(sectionItem, className.item);\n }}\n </HeroDropdownSection>\n );\n }\n return renderMenuItem(item, className.item);\n }}\n </HeroDropdownMenu>\n </HeroDropdown>\n );\n};\n\nexport default Menu;\n","import type { SVGProps } from 'react';\n\n// Default Icon for Menu button\nconst VerticalDotsIcon = ({\n size = 24,\n width,\n height,\n ...props\n}: SVGProps<SVGSVGElement> & { size?: number }) => {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n focusable=\"false\"\n height={size ?? height}\n role=\"presentation\"\n viewBox=\"0 0 24 24\"\n width={size ?? width}\n {...props}\n >\n <path\n d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport default VerticalDotsIcon;\n","import Menu from './Menu';\n\nexport type { MenuProps, MenuItem, MenuSection } from './Menu';\n\nexport { Menu };\n\nexport default Menu;\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -52,7 +52,7 @@ var _chunkERSNLQGGcjs = require('./chunk-ERSNLQGG.cjs');
|
|
|
52
52
|
var _chunkBPBEZCSPcjs = require('./chunk-BPBEZCSP.cjs');
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
var
|
|
55
|
+
var _chunkT5TNFSDIcjs = require('./chunk-T5TNFSDI.cjs');
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
|
|
@@ -131,5 +131,5 @@ require('./chunk-AHEA4IJV.cjs');
|
|
|
131
131
|
|
|
132
132
|
|
|
133
133
|
|
|
134
|
-
exports.Accordion = _chunkPF4VI6L7cjs.Accordion_default; exports.Alert = _chunkUECUQP2Bcjs.Alert_default; exports.Avatar = _chunk77J7NZYBcjs.Avatar_default; exports.AvatarGroup = _chunkS4O4KDC3cjs.AvatarGroup_default; exports.Badge = _chunkHG7AE6Q2cjs.Badge_default; exports.Breadcrumb = _chunkIBX6A72Pcjs.Breadcrumb_default; exports.Button = _chunkKB6PZSJ5cjs.Button_default; exports.ButtonGroup = _chunkY3RSI2KVcjs.ButtonGroup_default; exports.Card = _chunkZ363QVXWcjs.Card_default; exports.Drawer = _chunkOLU26V56cjs.Drawer_default; exports.Json = _chunkERSNLQGGcjs.Json_default; exports.Label = _chunkBPBEZCSPcjs.Label_default; exports.Menu =
|
|
134
|
+
exports.Accordion = _chunkPF4VI6L7cjs.Accordion_default; exports.Alert = _chunkUECUQP2Bcjs.Alert_default; exports.Avatar = _chunk77J7NZYBcjs.Avatar_default; exports.AvatarGroup = _chunkS4O4KDC3cjs.AvatarGroup_default; exports.Badge = _chunkHG7AE6Q2cjs.Badge_default; exports.Breadcrumb = _chunkIBX6A72Pcjs.Breadcrumb_default; exports.Button = _chunkKB6PZSJ5cjs.Button_default; exports.ButtonGroup = _chunkY3RSI2KVcjs.ButtonGroup_default; exports.Card = _chunkZ363QVXWcjs.Card_default; exports.Drawer = _chunkOLU26V56cjs.Drawer_default; exports.Json = _chunkERSNLQGGcjs.Json_default; exports.Label = _chunkBPBEZCSPcjs.Label_default; exports.Menu = _chunkT5TNFSDIcjs.Menu_default; exports.Modal = _chunkHPZBCSP3cjs.Modal_default; exports.Popover = _chunkYW4S32XVcjs.Popover_default; exports.Progress = _chunkKM3PZ3GHcjs.Progress_default; exports.ProgressCircular = _chunkRZGLEDWNcjs.ProgressCircular_default; exports.Table = _chunkTFRAQ6OQcjs.Table_default; exports.Tabs = _chunkG3YTOGEGcjs.Tabs_default; exports.Toast = _chunkLX5LJN3Icjs.Toast; exports.ToastProvider = _chunkLX5LJN3Icjs.ToastProvider_default; exports.Tooltip = _chunkJ2LI4ONScjs.Tooltip_default; exports.accordionVariants = _chunkPF4VI6L7cjs.accordionVariants; exports.addToast = _chunkLX5LJN3Icjs.addToast; exports.alertVariants = _chunkUECUQP2Bcjs.alertVariants; exports.breadcrumbVariants = _chunkIBX6A72Pcjs.breadcrumbVariants; exports.buttonVariants = _chunkKB6PZSJ5cjs.buttonVariants; exports.cardVariants = _chunkZ363QVXWcjs.cardVariants; exports.drawerBackdrops = _chunkOLU26V56cjs.drawerBackdrops; exports.drawerPlacements = _chunkOLU26V56cjs.drawerPlacements; exports.drawerRadii = _chunkOLU26V56cjs.drawerRadii; exports.drawerSizes = _chunkOLU26V56cjs.drawerSizes; exports.drawerVariants = _chunkOLU26V56cjs.drawerVariants; exports.labelVariants = _chunkBPBEZCSPcjs.labelVariants; exports.modalVariants = _chunkHPZBCSP3cjs.modalVariants; exports.progressCircularVariants = _chunkRZGLEDWNcjs.progressCircularVariants; exports.progressVariants = _chunkKM3PZ3GHcjs.progressVariants; exports.tableVariants = _chunkTFRAQ6OQcjs.tableVariants; exports.tabsVariants = _chunkG3YTOGEGcjs.tabsVariants; exports.toastVariants = _chunkLX5LJN3Icjs.toastVariants; exports.useDebounce = _chunk7ZIK4LWCcjs.useDebounce; exports.useIsInitialRenderCycle = _chunk7ZIK4LWCcjs.useIsInitialRenderCycle; exports.useLocalStorage = _chunk7ZIK4LWCcjs.useLocalStorage;
|
|
135
135
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@fuf-stack/pixels",
|
|
3
3
|
"description": "fuf core react component library",
|
|
4
4
|
"author": "Fröhlich ∧ Frei",
|
|
5
|
-
"version": "1.3.
|
|
5
|
+
"version": "1.3.4",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./dist/index.cjs",
|
|
8
8
|
"module": "./dist/index.js",
|
|
@@ -186,7 +186,7 @@
|
|
|
186
186
|
"@heroui/tabs": "2.2.21",
|
|
187
187
|
"@heroui/toast": "2.0.14",
|
|
188
188
|
"@heroui/tooltip": "2.2.21",
|
|
189
|
-
"framer-motion": "12.23.
|
|
189
|
+
"framer-motion": "12.23.18",
|
|
190
190
|
"next-themes": "0.4.6",
|
|
191
191
|
"react-icons": "5.5.0",
|
|
192
192
|
"@fuf-stack/pixel-utils": "1.0.5"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Menu/Menu.tsx","../src/Menu/VerticalDotsIcon.tsx","../src/Menu/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ButtonProps } from '@heroui/button';\nimport type {\n DropdownItemProps as HeroDropdownItemProps,\n DropdownProps as HeroDropdownProps,\n DropdownSectionProps as HeroDropdownSectionProps,\n} from '@heroui/dropdown';\nimport type { Key, ReactNode } from 'react';\n\nimport { Button } from '@heroui/button';\nimport {\n Dropdown as HeroDropdown,\n DropdownItem as HeroDropdownItem,\n DropdownMenu as HeroDropdownMenu,\n DropdownSection as HeroDropdownSection,\n DropdownTrigger as HeroDropdownTrigger,\n} from '@heroui/dropdown';\n\nimport { cn, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport VerticalDotsIcon from './VerticalDotsIcon';\n\n/**\n * Menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)\n */\nexport interface MenuItem {\n /** unique identifier */\n key: string;\n /** CSS class name */\n className?: string;\n /** additional description shown under the label */\n description?: string;\n /** disables the menu item */\n disabled?: boolean;\n /** menu item icon */\n icon?: ReactNode;\n /** menu item name */\n label: ReactNode;\n /** click event handler */\n onClick?: HeroDropdownItemProps['onPress'];\n /** e2e test identifier */\n testId?: string;\n}\n\n/**\n * Menu section type\n */\nexport interface MenuSection {\n /** unique identifier */\n key: string;\n /** section label */\n label: ReactNode;\n /** section items (array of MenuItem) */\n items: MenuItem[];\n}\n\n// menu styling variants\nexport const menuVariants = tv({\n slots: {\n item: '',\n trigger: '',\n },\n});\n\ntype VariantProps = TVProps<typeof menuVariants>;\ntype ClassName = TVClassName<typeof menuVariants>;\n\nexport interface MenuProps extends VariantProps {\n /** sets HTML aria-label attribute */\n ariaLabel?: string;\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** menu item structure */\n items: (MenuSection | MenuItem)[];\n /** disable menu trigger */\n isDisabled?: boolean;\n /** placement of the menu */\n placement?: HeroDropdownProps['placement'];\n /** called if item is selected */\n onAction?: (key: Key) => void;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** When defined a Button will be rendered as trigger (with provided props) instead of unstyled html button */\n triggerButtonProps?: Pick<\n ButtonProps,\n | 'aria-label'\n | 'className'\n | 'color'\n | 'disableAnimation'\n | 'disableRipple'\n | 'disabled'\n | 'size'\n | 'variant'\n >;\n}\n\n// type guard for MenuSection\nconst isMenuSection = (item: MenuSection | MenuItem): item is MenuSection => {\n return 'items' in item;\n};\n\n// returns String[] of disabled items/keys\nconst getDisabledKeys = (items: (MenuSection | MenuItem)[]): string[] => {\n const flatItems = items.reduce<MenuItem[]>((acc, item) => {\n if (isMenuSection(item)) {\n acc.push(...item.items);\n } else {\n acc.push(item);\n }\n return acc;\n }, []);\n return flatItems\n .filter((item) => {\n return item.disabled === true;\n })\n .map((item) => {\n return item.key;\n });\n};\n\nconst renderMenuItem = (item: MenuItem, itemClassName?: string) => {\n return (\n <HeroDropdownItem\n key={item.key}\n className={cn(itemClassName, item.className)}\n data-testid={item.testId ?? item.key}\n description={item.description}\n onPress={item.onClick}\n startContent={item.icon}\n >\n {item.label}\n </HeroDropdownItem>\n );\n};\n\n/**\n * Dropdown menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)\n */\nconst Menu = ({\n ariaLabel = undefined,\n children = null,\n className: _className = undefined,\n isDisabled = false,\n items,\n onAction = undefined,\n placement = undefined,\n testId = undefined,\n triggerButtonProps = undefined,\n}: MenuProps) => {\n // className from slots\n const variants = menuVariants();\n const className = variantsToClassNames(variants, _className, 'trigger');\n\n // determine trigger button variant\n let triggerButton = (\n <button className={className.trigger} type=\"button\">\n {children}\n </button>\n );\n if (!children) {\n // default to ellipsis icon when no children are provided\n triggerButton = (\n <Button\n isIconOnly\n className={cn('outline-divider min-w-0 outline', className.trigger)}\n radius=\"full\"\n size=\"sm\"\n variant=\"light\"\n {...triggerButtonProps}\n >\n <VerticalDotsIcon />\n </Button>\n );\n } else if (triggerButtonProps) {\n // use provided triggerButtonProps with hero button\n triggerButton = (\n <Button className={className.trigger} {...triggerButtonProps}>\n {children}\n </Button>\n );\n }\n\n return (\n <HeroDropdown\n aria-label={ariaLabel}\n isDisabled={isDisabled}\n placement={placement}\n >\n <HeroDropdownTrigger data-testid={testId}>\n {/* NOTE: type and aria properties are injected by HeroDropdownTrigger */}\n {triggerButton}\n </HeroDropdownTrigger>\n <HeroDropdownMenu\n disabledKeys={getDisabledKeys(items)}\n items={items}\n onAction={onAction}\n >\n {(item) => {\n if ('items' in item) {\n return (\n <HeroDropdownSection\n key={item.key}\n items={item.items}\n title={item.label as HeroDropdownSectionProps['title']}\n >\n {(sectionItem) => {\n return renderMenuItem(sectionItem, className.item);\n }}\n </HeroDropdownSection>\n );\n }\n return renderMenuItem(item, className.item);\n }}\n </HeroDropdownMenu>\n </HeroDropdown>\n );\n};\n\nexport default Menu;\n","import type { SVGProps } from 'react';\n\n// Default Icon for Menu button\nconst VerticalDotsIcon = ({\n size = 24,\n width,\n height,\n ...props\n}: SVGProps<SVGSVGElement> & { size?: number }) => {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n focusable=\"false\"\n height={size ?? height}\n role=\"presentation\"\n viewBox=\"0 0 24 24\"\n width={size ?? width}\n {...props}\n >\n <path\n d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport default VerticalDotsIcon;\n","import Menu from './Menu';\n\nexport type { MenuProps, MenuItem, MenuSection } from './Menu';\n\nexport { Menu };\n\nexport default Menu;\n"],"mappings":"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","names":["jsx","Menu_default"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/pixels/pixels/packages/pixels/dist/chunk-C43BKEAS.cjs","../src/Menu/Menu.tsx","../src/Menu/VerticalDotsIcon.tsx","../src/Menu/index.ts"],"names":["jsx","Menu_default"],"mappings":"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","file":"/home/runner/work/pixels/pixels/packages/pixels/dist/chunk-C43BKEAS.cjs","sourcesContent":[null,"import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ButtonProps } from '@heroui/button';\nimport type {\n DropdownItemProps as HeroDropdownItemProps,\n DropdownProps as HeroDropdownProps,\n DropdownSectionProps as HeroDropdownSectionProps,\n} from '@heroui/dropdown';\nimport type { Key, ReactNode } from 'react';\n\nimport { Button } from '@heroui/button';\nimport {\n Dropdown as HeroDropdown,\n DropdownItem as HeroDropdownItem,\n DropdownMenu as HeroDropdownMenu,\n DropdownSection as HeroDropdownSection,\n DropdownTrigger as HeroDropdownTrigger,\n} from '@heroui/dropdown';\n\nimport { cn, tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport VerticalDotsIcon from './VerticalDotsIcon';\n\n/**\n * Menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)\n */\nexport interface MenuItem {\n /** unique identifier */\n key: string;\n /** CSS class name */\n className?: string;\n /** additional description shown under the label */\n description?: string;\n /** disables the menu item */\n disabled?: boolean;\n /** menu item icon */\n icon?: ReactNode;\n /** menu item name */\n label: ReactNode;\n /** click event handler */\n onClick?: HeroDropdownItemProps['onPress'];\n /** e2e test identifier */\n testId?: string;\n}\n\n/**\n * Menu section type\n */\nexport interface MenuSection {\n /** unique identifier */\n key: string;\n /** section label */\n label: ReactNode;\n /** section items (array of MenuItem) */\n items: MenuItem[];\n}\n\n// menu styling variants\nexport const menuVariants = tv({\n slots: {\n item: '',\n trigger: '',\n },\n});\n\ntype VariantProps = TVProps<typeof menuVariants>;\ntype ClassName = TVClassName<typeof menuVariants>;\n\nexport interface MenuProps extends VariantProps {\n /** sets HTML aria-label attribute */\n ariaLabel?: string;\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** menu item structure */\n items: (MenuSection | MenuItem)[];\n /** disable menu trigger */\n isDisabled?: boolean;\n /** placement of the menu */\n placement?: HeroDropdownProps['placement'];\n /** called if item is selected */\n onAction?: (key: Key) => void;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** When defined a Button will be rendered as trigger (with provided props) instead of unstyled html button */\n triggerButtonProps?: Pick<\n ButtonProps,\n | 'aria-label'\n | 'className'\n | 'color'\n | 'disableAnimation'\n | 'disableRipple'\n | 'disabled'\n | 'size'\n | 'variant'\n >;\n}\n\n// type guard for MenuSection\nconst isMenuSection = (item: MenuSection | MenuItem): item is MenuSection => {\n return 'items' in item;\n};\n\n// returns String[] of disabled items/keys\nconst getDisabledKeys = (items: (MenuSection | MenuItem)[]): string[] => {\n const flatItems = items.reduce<MenuItem[]>((acc, item) => {\n if (isMenuSection(item)) {\n acc.push(...item.items);\n } else {\n acc.push(item);\n }\n return acc;\n }, []);\n return flatItems\n .filter((item) => {\n return item.disabled === true;\n })\n .map((item) => {\n return item.key;\n });\n};\n\nconst renderMenuItem = (item: MenuItem, itemClassName?: string) => {\n return (\n <HeroDropdownItem\n key={item.key}\n className={cn(itemClassName, item.className)}\n data-testid={item.testId ?? item.key}\n description={item.description}\n onPress={item.onClick}\n startContent={item.icon}\n >\n {item.label}\n </HeroDropdownItem>\n );\n};\n\n/**\n * Dropdown menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)\n */\nconst Menu = ({\n ariaLabel = undefined,\n children = null,\n className: _className = undefined,\n isDisabled = false,\n items,\n onAction = undefined,\n placement = undefined,\n testId = undefined,\n triggerButtonProps = undefined,\n}: MenuProps) => {\n // className from slots\n const variants = menuVariants();\n const className = variantsToClassNames(variants, _className, 'trigger');\n\n // determine trigger button variant\n let triggerButton = (\n <button className={className.trigger} type=\"button\">\n {children}\n </button>\n );\n if (!children) {\n // default to ellipsis icon when no children are provided\n triggerButton = (\n <Button\n isIconOnly\n className={cn('outline-divider min-w-0 outline', className.trigger)}\n radius=\"full\"\n size=\"sm\"\n variant=\"light\"\n {...triggerButtonProps}\n >\n <VerticalDotsIcon />\n </Button>\n );\n } else if (triggerButtonProps) {\n // use provided triggerButtonProps with hero button\n triggerButton = (\n <Button className={className.trigger} {...triggerButtonProps}>\n {children}\n </Button>\n );\n }\n\n return (\n <HeroDropdown\n aria-label={ariaLabel}\n isDisabled={isDisabled}\n placement={placement}\n >\n <HeroDropdownTrigger data-testid={testId}>\n {/* NOTE: type and aria properties are injected by HeroDropdownTrigger */}\n {triggerButton}\n </HeroDropdownTrigger>\n <HeroDropdownMenu\n disabledKeys={getDisabledKeys(items)}\n items={items}\n onAction={onAction}\n >\n {(item) => {\n if ('items' in item) {\n return (\n <HeroDropdownSection\n key={item.key}\n items={item.items}\n title={item.label as HeroDropdownSectionProps['title']}\n >\n {(sectionItem) => {\n return renderMenuItem(sectionItem, className.item);\n }}\n </HeroDropdownSection>\n );\n }\n return renderMenuItem(item, className.item);\n }}\n </HeroDropdownMenu>\n </HeroDropdown>\n );\n};\n\nexport default Menu;\n","import type { SVGProps } from 'react';\n\n// Default Icon for Menu button\nconst VerticalDotsIcon = ({\n size = 24,\n width,\n height,\n ...props\n}: SVGProps<SVGSVGElement> & { size?: number }) => {\n return (\n <svg\n aria-hidden=\"true\"\n fill=\"none\"\n focusable=\"false\"\n height={size ?? height}\n role=\"presentation\"\n viewBox=\"0 0 24 24\"\n width={size ?? width}\n {...props}\n >\n <path\n d=\"M12 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 12c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport default VerticalDotsIcon;\n","import Menu from './Menu';\n\nexport type { MenuProps, MenuItem, MenuSection } from './Menu';\n\nexport { Menu };\n\nexport default Menu;\n"]}
|