@fuf-stack/pixels 1.2.5 → 1.3.0

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.
@@ -1,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
- var _chunkYLJW375Ycjs = require('../chunk-YLJW375Y.cjs');
4
+ var _chunkC43BKEAScjs = require('../chunk-C43BKEAS.cjs');
5
5
  require('../chunk-AHEA4IJV.cjs');
6
6
 
7
7
 
8
8
 
9
- exports.Menu = _chunkYLJW375Ycjs.Menu_default; exports.default = _chunkYLJW375Ycjs.Menu_default2;
9
+ exports.Menu = _chunkC43BKEAScjs.Menu_default; exports.default = _chunkC43BKEAScjs.Menu_default2;
10
10
  //# sourceMappingURL=index.cjs.map
@@ -1,5 +1,5 @@
1
- import { M as Menu } from '../Menu-CF5f9mfu.cjs';
2
- export { b as MenuItem, a as MenuProps, c as MenuSection } from '../Menu-CF5f9mfu.cjs';
1
+ import { M as Menu } from '../Menu-DDKcN7N3.cjs';
2
+ export { b as MenuItem, a as MenuProps, c as MenuSection } from '../Menu-DDKcN7N3.cjs';
3
3
  import 'react/jsx-runtime';
4
4
  import 'tailwind-variants';
5
5
  import '@fuf-stack/pixel-utils';
@@ -1,5 +1,5 @@
1
- import { M as Menu } from '../Menu-CF5f9mfu.js';
2
- export { b as MenuItem, a as MenuProps, c as MenuSection } from '../Menu-CF5f9mfu.js';
1
+ import { M as Menu } from '../Menu-DDKcN7N3.js';
2
+ export { b as MenuItem, a as MenuProps, c as MenuSection } from '../Menu-DDKcN7N3.js';
3
3
  import 'react/jsx-runtime';
4
4
  import 'tailwind-variants';
5
5
  import '@fuf-stack/pixel-utils';
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Menu_default,
3
3
  Menu_default2
4
- } from "../chunk-324TSAWD.js";
4
+ } from "../chunk-3VAWRUPR.js";
5
5
  import "../chunk-OAIRL2FN.js";
6
6
  export {
7
7
  Menu_default as Menu,
@@ -6,7 +6,7 @@ import { DropdownItemProps, DropdownProps } from '@heroui/dropdown';
6
6
  import { ReactNode, Key } from 'react';
7
7
 
8
8
  /**
9
- * Menu item type
9
+ * Menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)
10
10
  */
11
11
  interface MenuItem {
12
12
  /** unique identifier */
@@ -6,7 +6,7 @@ import { DropdownItemProps, DropdownProps } from '@heroui/dropdown';
6
6
  import { ReactNode, Key } from 'react';
7
7
 
8
8
  /**
9
- * Menu item type
9
+ * Menu component based on [HeroUI Dropdown](https://www.heroui.com//docs/components/dropdown)
10
10
  */
11
11
  interface MenuItem {
12
12
  /** unique identifier */
@@ -0,0 +1,71 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-AHEA4IJV.cjs');
2
+
3
+ // src/SearchInput/SearchInput.tsx
4
+ var _fa = require('react-icons/fa');
5
+ var _input = require('@heroui/input');
6
+ var _pixelutils = require('@fuf-stack/pixel-utils');
7
+ var _jsxruntime = require('react/jsx-runtime');
8
+ var inputVariants = _pixelutils.tv.call(void 0, {
9
+ slots: {
10
+ /** wrapper around the whole input */
11
+ base: "",
12
+ /** clear button */
13
+ clearButton: "",
14
+ /** actual input element */
15
+ input: "",
16
+ /** inner wrapper (HeroUI inputWrapper slot) */
17
+ inputWrapper: "bg-content1 group-data-[focus=true]:border-focus"
18
+ }
19
+ });
20
+ var SearchInput = ({
21
+ className: _className = void 0,
22
+ clearable = false,
23
+ disabled = false,
24
+ endContent = void 0,
25
+ onChange,
26
+ onClear = void 0,
27
+ placeholder = void 0,
28
+ size = void 0,
29
+ startContent = void 0,
30
+ testId = void 0,
31
+ value = void 0
32
+ }) => {
33
+ const variants = inputVariants();
34
+ const classNames = _pixelutils.variantsToClassNames.call(void 0, variants, _className, "base");
35
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
36
+ _input.Input,
37
+ {
38
+ "data-testid": testId ? _pixelutils.slugify.call(void 0, testId) : void 0,
39
+ endContent,
40
+ isClearable: clearable,
41
+ isDisabled: disabled,
42
+ placeholder,
43
+ radius: "sm",
44
+ size,
45
+ startContent: startContent != null ? startContent : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _fa.FaSearch, { className: "opacity-50" }),
46
+ value,
47
+ variant: "bordered",
48
+ classNames: {
49
+ base: classNames.base,
50
+ clearButton: classNames.clearButton,
51
+ input: classNames.input,
52
+ inputWrapper: classNames.inputWrapper
53
+ },
54
+ onChange: (e) => {
55
+ onChange(e.target.value);
56
+ },
57
+ onClear: onClear ? () => {
58
+ onClear();
59
+ } : void 0
60
+ }
61
+ );
62
+ };
63
+ var SearchInput_default = SearchInput;
64
+
65
+ // src/SearchInput/index.ts
66
+ var SearchInput_default2 = SearchInput_default;
67
+
68
+
69
+
70
+ exports.SearchInput = SearchInput_default; exports.default = SearchInput_default2;
71
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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,oCAAyB;AAEzB,sCAAmC;AAEnC,oDAAkD;AAyEd,+CAAA;AAtE7B,IAAM,cAAA,EAAgB,4BAAA;AAAG,EAC9B,KAAA,EAAO;AAAA;AAAA,IAEL,IAAA,EAAM,EAAA;AAAA;AAAA,IAEN,WAAA,EAAa,EAAA;AAAA;AAAA,IAEb,KAAA,EAAO,EAAA;AAAA;AAAA,IAEP,YAAA,EAAc;AAAA,EAChB;AACF,CAAC,CAAA;AAiCD,IAAM,YAAA,EAAc,CAAC;AAAA,EACnB,SAAA,EAAW,WAAA,EAAa,KAAA,CAAA;AAAA,EACxB,UAAA,EAAY,KAAA;AAAA,EACZ,SAAA,EAAW,KAAA;AAAA,EACX,WAAA,EAAa,KAAA,CAAA;AAAA,EACb,QAAA;AAAA,EACA,QAAA,EAAU,KAAA,CAAA;AAAA,EACV,YAAA,EAAc,KAAA,CAAA;AAAA,EACd,KAAA,EAAO,KAAA,CAAA;AAAA,EACP,aAAA,EAAe,KAAA,CAAA;AAAA,EACf,OAAA,EAAS,KAAA,CAAA;AAAA,EACT,MAAA,EAAQ,KAAA;AACV,CAAA,EAAA,GAAwB;AAEtB,EAAA,MAAM,SAAA,EAAW,aAAA,CAAc,CAAA;AAC/B,EAAA,MAAM,WAAA,EAAa,8CAAA,QAAqB,EAAU,UAAA,EAAY,MAAM,CAAA;AAEpE,EAAA,uBACE,6BAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAa,OAAA,EAAS,iCAAA,MAAc,EAAA,EAAI,KAAA,CAAA;AAAA,MACxC,UAAA;AAAA,MACA,WAAA,EAAa,SAAA;AAAA,MACb,UAAA,EAAY,QAAA;AAAA,MACZ,WAAA;AAAA,MACA,MAAA,EAAO,IAAA;AAAA,MACP,IAAA;AAAA,MACA,YAAA,EAAc,aAAA,GAAA,KAAA,EAAA,aAAA,kBAAgB,6BAAA,YAAC,EAAA,EAAS,SAAA,EAAU,aAAA,CAAa,CAAA;AAAA,MAC/D,KAAA;AAAA,MACA,OAAA,EAAQ,UAAA;AAAA,MACR,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,UAAA,CAAW,IAAA;AAAA,QACjB,WAAA,EAAa,UAAA,CAAW,WAAA;AAAA,QACxB,KAAA,EAAO,UAAA,CAAW,KAAA;AAAA,QAClB,YAAA,EAAc,UAAA,CAAW;AAAA,MAC3B,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,CAAA,EAAA,GAAM;AACf,QAAA,QAAA,CAAS,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AAAA,MACzB,CAAA;AAAA,MACA,OAAA,EACE,QAAA,EACI,CAAA,EAAA,GAAM;AACJ,QAAA,OAAA,CAAQ,CAAA;AAAA,MACV,EAAA,EACA,KAAA;AAAA,IAAA;AAAA,EAER,CAAA;AAEJ,CAAA;AAEA,IAAO,oBAAA,EAAQ,WAAA;ADxCf;AACA;AE1DA,IAAOA,qBAAAA,EAAQ,mBAAA;AF4Df;AACE;AACA;AACF,kFAAC","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 { ReactNode } from 'react';\n\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 /** shows clear button when input has value */\n clearable?: boolean;\n /** input field is disabled */\n disabled?: boolean;\n /** added content to the end of the input Field. */\n endContent?: ReactNode;\n /** callback that is fired when the value is cleared */\n onClear?: () => void;\n /** callback that is fired when the value is changed */\n onChange: (value?: string) => 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 /** value of the input */\n value?: 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 clearable = false,\n disabled = false,\n endContent = undefined,\n onChange,\n onClear = undefined,\n placeholder = undefined,\n size = undefined,\n startContent = undefined,\n testId = undefined,\n value = undefined,\n}: SearchInputProps) => {\n // classNames from slots\n const variants = inputVariants();\n const classNames = variantsToClassNames(variants, _className, 'base');\n\n return (\n <HeroInput\n data-testid={testId ? slugify(testId) : undefined}\n endContent={endContent}\n isClearable={clearable}\n isDisabled={disabled}\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 onChange={(e) => {\n onChange(e.target.value);\n }}\n onClear={\n onClear\n ? () => {\n onClear();\n }\n : undefined\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"]}
@@ -0,0 +1,92 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as tailwind_variants from 'tailwind-variants';
3
+ import { TVProps, TVClassName } from '@fuf-stack/pixel-utils';
4
+ import { ReactNode } from 'react';
5
+
6
+ declare const inputVariants: tailwind_variants.TVReturnType<{
7
+ [key: string]: {
8
+ [key: string]: tailwind_variants.ClassValue | {
9
+ base?: tailwind_variants.ClassValue;
10
+ clearButton?: tailwind_variants.ClassValue;
11
+ input?: tailwind_variants.ClassValue;
12
+ inputWrapper?: tailwind_variants.ClassValue;
13
+ };
14
+ };
15
+ } | {
16
+ [x: string]: {
17
+ [x: string]: tailwind_variants.ClassValue | {
18
+ base?: tailwind_variants.ClassValue;
19
+ clearButton?: tailwind_variants.ClassValue;
20
+ input?: tailwind_variants.ClassValue;
21
+ inputWrapper?: tailwind_variants.ClassValue;
22
+ };
23
+ };
24
+ } | {}, {
25
+ /** wrapper around the whole input */
26
+ base: string;
27
+ /** clear button */
28
+ clearButton: string;
29
+ /** actual input element */
30
+ input: string;
31
+ /** inner wrapper (HeroUI inputWrapper slot) */
32
+ inputWrapper: string;
33
+ }, undefined, {
34
+ [key: string]: {
35
+ [key: string]: tailwind_variants.ClassValue | {
36
+ base?: tailwind_variants.ClassValue;
37
+ clearButton?: tailwind_variants.ClassValue;
38
+ input?: tailwind_variants.ClassValue;
39
+ inputWrapper?: tailwind_variants.ClassValue;
40
+ };
41
+ };
42
+ } | {}, {
43
+ /** wrapper around the whole input */
44
+ base: string;
45
+ /** clear button */
46
+ clearButton: string;
47
+ /** actual input element */
48
+ input: string;
49
+ /** inner wrapper (HeroUI inputWrapper slot) */
50
+ inputWrapper: string;
51
+ }, tailwind_variants.TVReturnType<unknown, {
52
+ /** wrapper around the whole input */
53
+ base: string;
54
+ /** clear button */
55
+ clearButton: string;
56
+ /** actual input element */
57
+ input: string;
58
+ /** inner wrapper (HeroUI inputWrapper slot) */
59
+ inputWrapper: string;
60
+ }, undefined, unknown, unknown, undefined>>;
61
+ type VariantProps = TVProps<typeof inputVariants>;
62
+ type ClassName = TVClassName<typeof inputVariants>;
63
+ interface SearchInputProps extends VariantProps {
64
+ /** CSS class name */
65
+ className?: ClassName;
66
+ /** shows clear button when input has value */
67
+ clearable?: boolean;
68
+ /** input field is disabled */
69
+ disabled?: boolean;
70
+ /** added content to the end of the input Field. */
71
+ endContent?: ReactNode;
72
+ /** callback that is fired when the value is cleared */
73
+ onClear?: () => void;
74
+ /** callback that is fired when the value is changed */
75
+ onChange: (value?: string) => void;
76
+ /** form field placeholder */
77
+ placeholder?: string;
78
+ /** size of the input */
79
+ size?: 'sm' | 'md' | 'lg';
80
+ /** content added to the start of the input field */
81
+ startContent?: ReactNode;
82
+ /** HTML data-testid attribute used in e2e tests */
83
+ testId?: string;
84
+ /** value of the input */
85
+ value?: string;
86
+ }
87
+ /**
88
+ * SearchInput component based on [HeroUI Input](https://www.heroui.com//docs/components/input)
89
+ */
90
+ declare const SearchInput: ({ className: _className, clearable, disabled, endContent, onChange, onClear, placeholder, size, startContent, testId, value, }: SearchInputProps) => react_jsx_runtime.JSX.Element;
91
+
92
+ export { SearchInput, type SearchInputProps, SearchInput as default };
@@ -0,0 +1,92 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as tailwind_variants from 'tailwind-variants';
3
+ import { TVProps, TVClassName } from '@fuf-stack/pixel-utils';
4
+ import { ReactNode } from 'react';
5
+
6
+ declare const inputVariants: tailwind_variants.TVReturnType<{
7
+ [key: string]: {
8
+ [key: string]: tailwind_variants.ClassValue | {
9
+ base?: tailwind_variants.ClassValue;
10
+ clearButton?: tailwind_variants.ClassValue;
11
+ input?: tailwind_variants.ClassValue;
12
+ inputWrapper?: tailwind_variants.ClassValue;
13
+ };
14
+ };
15
+ } | {
16
+ [x: string]: {
17
+ [x: string]: tailwind_variants.ClassValue | {
18
+ base?: tailwind_variants.ClassValue;
19
+ clearButton?: tailwind_variants.ClassValue;
20
+ input?: tailwind_variants.ClassValue;
21
+ inputWrapper?: tailwind_variants.ClassValue;
22
+ };
23
+ };
24
+ } | {}, {
25
+ /** wrapper around the whole input */
26
+ base: string;
27
+ /** clear button */
28
+ clearButton: string;
29
+ /** actual input element */
30
+ input: string;
31
+ /** inner wrapper (HeroUI inputWrapper slot) */
32
+ inputWrapper: string;
33
+ }, undefined, {
34
+ [key: string]: {
35
+ [key: string]: tailwind_variants.ClassValue | {
36
+ base?: tailwind_variants.ClassValue;
37
+ clearButton?: tailwind_variants.ClassValue;
38
+ input?: tailwind_variants.ClassValue;
39
+ inputWrapper?: tailwind_variants.ClassValue;
40
+ };
41
+ };
42
+ } | {}, {
43
+ /** wrapper around the whole input */
44
+ base: string;
45
+ /** clear button */
46
+ clearButton: string;
47
+ /** actual input element */
48
+ input: string;
49
+ /** inner wrapper (HeroUI inputWrapper slot) */
50
+ inputWrapper: string;
51
+ }, tailwind_variants.TVReturnType<unknown, {
52
+ /** wrapper around the whole input */
53
+ base: string;
54
+ /** clear button */
55
+ clearButton: string;
56
+ /** actual input element */
57
+ input: string;
58
+ /** inner wrapper (HeroUI inputWrapper slot) */
59
+ inputWrapper: string;
60
+ }, undefined, unknown, unknown, undefined>>;
61
+ type VariantProps = TVProps<typeof inputVariants>;
62
+ type ClassName = TVClassName<typeof inputVariants>;
63
+ interface SearchInputProps extends VariantProps {
64
+ /** CSS class name */
65
+ className?: ClassName;
66
+ /** shows clear button when input has value */
67
+ clearable?: boolean;
68
+ /** input field is disabled */
69
+ disabled?: boolean;
70
+ /** added content to the end of the input Field. */
71
+ endContent?: ReactNode;
72
+ /** callback that is fired when the value is cleared */
73
+ onClear?: () => void;
74
+ /** callback that is fired when the value is changed */
75
+ onChange: (value?: string) => void;
76
+ /** form field placeholder */
77
+ placeholder?: string;
78
+ /** size of the input */
79
+ size?: 'sm' | 'md' | 'lg';
80
+ /** content added to the start of the input field */
81
+ startContent?: ReactNode;
82
+ /** HTML data-testid attribute used in e2e tests */
83
+ testId?: string;
84
+ /** value of the input */
85
+ value?: string;
86
+ }
87
+ /**
88
+ * SearchInput component based on [HeroUI Input](https://www.heroui.com//docs/components/input)
89
+ */
90
+ declare const SearchInput: ({ className: _className, clearable, disabled, endContent, onChange, onClear, placeholder, size, startContent, testId, value, }: SearchInputProps) => react_jsx_runtime.JSX.Element;
91
+
92
+ export { SearchInput, type SearchInputProps, SearchInput as default };
@@ -0,0 +1,71 @@
1
+ import "../chunk-OAIRL2FN.js";
2
+
3
+ // src/SearchInput/SearchInput.tsx
4
+ import { FaSearch } from "react-icons/fa";
5
+ import { Input as HeroInput } from "@heroui/input";
6
+ import { slugify, tv, variantsToClassNames } from "@fuf-stack/pixel-utils";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var inputVariants = tv({
9
+ slots: {
10
+ /** wrapper around the whole input */
11
+ base: "",
12
+ /** clear button */
13
+ clearButton: "",
14
+ /** actual input element */
15
+ input: "",
16
+ /** inner wrapper (HeroUI inputWrapper slot) */
17
+ inputWrapper: "bg-content1 group-data-[focus=true]:border-focus"
18
+ }
19
+ });
20
+ var SearchInput = ({
21
+ className: _className = void 0,
22
+ clearable = false,
23
+ disabled = false,
24
+ endContent = void 0,
25
+ onChange,
26
+ onClear = void 0,
27
+ placeholder = void 0,
28
+ size = void 0,
29
+ startContent = void 0,
30
+ testId = void 0,
31
+ value = void 0
32
+ }) => {
33
+ const variants = inputVariants();
34
+ const classNames = variantsToClassNames(variants, _className, "base");
35
+ return /* @__PURE__ */ jsx(
36
+ HeroInput,
37
+ {
38
+ "data-testid": testId ? slugify(testId) : void 0,
39
+ endContent,
40
+ isClearable: clearable,
41
+ isDisabled: disabled,
42
+ placeholder,
43
+ radius: "sm",
44
+ size,
45
+ startContent: startContent != null ? startContent : /* @__PURE__ */ jsx(FaSearch, { className: "opacity-50" }),
46
+ value,
47
+ variant: "bordered",
48
+ classNames: {
49
+ base: classNames.base,
50
+ clearButton: classNames.clearButton,
51
+ input: classNames.input,
52
+ inputWrapper: classNames.inputWrapper
53
+ },
54
+ onChange: (e) => {
55
+ onChange(e.target.value);
56
+ },
57
+ onClear: onClear ? () => {
58
+ onClear();
59
+ } : void 0
60
+ }
61
+ );
62
+ };
63
+ var SearchInput_default = SearchInput;
64
+
65
+ // src/SearchInput/index.ts
66
+ var SearchInput_default2 = SearchInput_default;
67
+ export {
68
+ SearchInput_default as SearchInput,
69
+ SearchInput_default2 as default
70
+ };
71
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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 { ReactNode } from 'react';\n\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 /** shows clear button when input has value */\n clearable?: boolean;\n /** input field is disabled */\n disabled?: boolean;\n /** added content to the end of the input Field. */\n endContent?: ReactNode;\n /** callback that is fired when the value is cleared */\n onClear?: () => void;\n /** callback that is fired when the value is changed */\n onChange: (value?: string) => 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 /** value of the input */\n value?: 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 clearable = false,\n disabled = false,\n endContent = undefined,\n onChange,\n onClear = undefined,\n placeholder = undefined,\n size = undefined,\n startContent = undefined,\n testId = undefined,\n value = undefined,\n}: SearchInputProps) => {\n // classNames from slots\n const variants = inputVariants();\n const classNames = variantsToClassNames(variants, _className, 'base');\n\n return (\n <HeroInput\n data-testid={testId ? slugify(testId) : undefined}\n endContent={endContent}\n isClearable={clearable}\n isDisabled={disabled}\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 onChange={(e) => {\n onChange(e.target.value);\n }}\n onClear={\n onClear\n ? () => {\n onClear();\n }\n : undefined\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;AAEzB,SAAS,SAAS,iBAAiB;AAEnC,SAAS,SAAS,IAAI,4BAA4B;AAyEd;AAtE7B,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;AAiCD,IAAM,cAAc,CAAC;AAAA,EACnB,WAAW,aAAa;AAAA,EACxB,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AAAA,EACA,UAAU;AAAA,EACV,cAAc;AAAA,EACd,OAAO;AAAA,EACP,eAAe;AAAA,EACf,SAAS;AAAA,EACT,QAAQ;AACV,MAAwB;AAEtB,QAAM,WAAW,cAAc;AAC/B,QAAM,aAAa,qBAAqB,UAAU,YAAY,MAAM;AAEpE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa,SAAS,QAAQ,MAAM,IAAI;AAAA,MACxC;AAAA,MACA,aAAa;AAAA,MACb,YAAY;AAAA,MACZ;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,MACA,UAAU,CAAC,MAAM;AACf,iBAAS,EAAE,OAAO,KAAK;AAAA,MACzB;AAAA,MACA,SACE,UACI,MAAM;AACJ,gBAAQ;AAAA,MACV,IACA;AAAA;AAAA,EAER;AAEJ;AAEA,IAAO,sBAAQ;;;ACjGf,IAAOA,uBAAQ;","names":["SearchInput_default"]}
@@ -1,10 +1,10 @@
1
1
  import {
2
+ __objRest,
2
3
  __spreadProps,
3
4
  __spreadValues
4
5
  } from "./chunk-OAIRL2FN.js";
5
6
 
6
7
  // src/Menu/Menu.tsx
7
- import { FaEllipsisVertical } from "react-icons/fa6";
8
8
  import { Button } from "@heroui/button";
9
9
  import {
10
10
  Dropdown as HeroDropdown,
@@ -14,25 +14,71 @@ import {
14
14
  DropdownTrigger as HeroDropdownTrigger
15
15
  } from "@heroui/dropdown";
16
16
  import { cn, tv, variantsToClassNames } from "@fuf-stack/pixel-utils";
17
- import { jsx, jsxs } from "react/jsx-runtime";
17
+
18
+ // src/Menu/VerticalDotsIcon.tsx
19
+ import { jsx } from "react/jsx-runtime";
20
+ var VerticalDotsIcon = (_a) => {
21
+ var _b = _a, {
22
+ size = 24,
23
+ width,
24
+ height
25
+ } = _b, props = __objRest(_b, [
26
+ "size",
27
+ "width",
28
+ "height"
29
+ ]);
30
+ return /* @__PURE__ */ jsx(
31
+ "svg",
32
+ __spreadProps(__spreadValues({
33
+ "aria-hidden": "true",
34
+ fill: "none",
35
+ focusable: "false",
36
+ height: size != null ? size : height,
37
+ role: "presentation",
38
+ viewBox: "0 0 24 24",
39
+ width: size != null ? size : width
40
+ }, props), {
41
+ children: /* @__PURE__ */ jsx(
42
+ "path",
43
+ {
44
+ 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",
45
+ fill: "currentColor"
46
+ }
47
+ )
48
+ })
49
+ );
50
+ };
51
+ var VerticalDotsIcon_default = VerticalDotsIcon;
52
+
53
+ // src/Menu/Menu.tsx
54
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
18
55
  var menuVariants = tv({
19
56
  slots: {
20
57
  item: "",
21
58
  trigger: ""
22
59
  }
23
60
  });
61
+ var isMenuSection = (item) => {
62
+ return "items" in item;
63
+ };
24
64
  var getDisabledKeys = (items) => {
25
- return items.map((item) => {
26
- return typeof (item == null ? void 0 : item.items) === "undefined" ? item : item.items;
27
- }).flat().filter((item) => {
28
- return Object.hasOwn(item, "disabled") && item.disabled === true;
65
+ const flatItems = items.reduce((acc, item) => {
66
+ if (isMenuSection(item)) {
67
+ acc.push(...item.items);
68
+ } else {
69
+ acc.push(item);
70
+ }
71
+ return acc;
72
+ }, []);
73
+ return flatItems.filter((item) => {
74
+ return item.disabled === true;
29
75
  }).map((item) => {
30
76
  return item.key;
31
77
  });
32
78
  };
33
79
  var renderMenuItem = (item, itemClassName) => {
34
80
  var _a;
35
- return /* @__PURE__ */ jsx(
81
+ return /* @__PURE__ */ jsx2(
36
82
  HeroDropdownItem,
37
83
  {
38
84
  className: cn(itemClassName, item.className),
@@ -58,20 +104,22 @@ var Menu = ({
58
104
  }) => {
59
105
  const variants = menuVariants();
60
106
  const className = variantsToClassNames(variants, _className, "trigger");
61
- let triggerButton = /* @__PURE__ */ jsx("button", { className: className.trigger, type: "button", children });
107
+ let triggerButton = /* @__PURE__ */ jsx2("button", { className: className.trigger, type: "button", children });
62
108
  if (!children) {
63
- triggerButton = /* @__PURE__ */ jsx(
109
+ triggerButton = /* @__PURE__ */ jsx2(
64
110
  Button,
65
111
  __spreadProps(__spreadValues({
66
- className: cn("min-w-0", className.trigger),
112
+ isIconOnly: true,
113
+ className: cn("outline-divider min-w-0 outline", className.trigger),
114
+ radius: "full",
67
115
  size: "sm",
68
- variant: "flat"
116
+ variant: "light"
69
117
  }, triggerButtonProps), {
70
- children: /* @__PURE__ */ jsx(FaEllipsisVertical, {})
118
+ children: /* @__PURE__ */ jsx2(VerticalDotsIcon_default, {})
71
119
  })
72
120
  );
73
121
  } else if (triggerButtonProps) {
74
- triggerButton = /* @__PURE__ */ jsx(Button, __spreadProps(__spreadValues({ className: className.trigger }, triggerButtonProps), { children }));
122
+ triggerButton = /* @__PURE__ */ jsx2(Button, __spreadProps(__spreadValues({ className: className.trigger }, triggerButtonProps), { children }));
75
123
  }
76
124
  return /* @__PURE__ */ jsxs(
77
125
  HeroDropdown,
@@ -80,8 +128,8 @@ var Menu = ({
80
128
  isDisabled,
81
129
  placement,
82
130
  children: [
83
- /* @__PURE__ */ jsx(HeroDropdownTrigger, { "data-testid": testId, children: triggerButton }),
84
- /* @__PURE__ */ jsx(
131
+ /* @__PURE__ */ jsx2(HeroDropdownTrigger, { "data-testid": testId, children: triggerButton }),
132
+ /* @__PURE__ */ jsx2(
85
133
  HeroDropdownMenu,
86
134
  {
87
135
  disabledKeys: getDisabledKeys(items),
@@ -89,7 +137,7 @@ var Menu = ({
89
137
  onAction,
90
138
  children: (item) => {
91
139
  if ("items" in item) {
92
- return /* @__PURE__ */ jsx(
140
+ return /* @__PURE__ */ jsx2(
93
141
  HeroDropdownSection,
94
142
  {
95
143
  items: item.items,
@@ -118,4 +166,4 @@ export {
118
166
  Menu_default,
119
167
  Menu_default2
120
168
  };
121
- //# sourceMappingURL=chunk-324TSAWD.js.map
169
+ //# sourceMappingURL=chunk-3VAWRUPR.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, 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,10 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
3
 
4
+
4
5
  var _chunkAHEA4IJVcjs = require('./chunk-AHEA4IJV.cjs');
5
6
 
6
7
  // src/Menu/Menu.tsx
7
- var _fa6 = require('react-icons/fa6');
8
8
  var _button = require('@heroui/button');
9
9
 
10
10
 
@@ -14,18 +14,64 @@ var _button = require('@heroui/button');
14
14
 
15
15
  var _dropdown = require('@heroui/dropdown');
16
16
  var _pixelutils = require('@fuf-stack/pixel-utils');
17
+
18
+ // src/Menu/VerticalDotsIcon.tsx
17
19
  var _jsxruntime = require('react/jsx-runtime');
20
+ var VerticalDotsIcon = (_a) => {
21
+ var _b = _a, {
22
+ size = 24,
23
+ width,
24
+ height
25
+ } = _b, props = _chunkAHEA4IJVcjs.__objRest.call(void 0, _b, [
26
+ "size",
27
+ "width",
28
+ "height"
29
+ ]);
30
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
31
+ "svg",
32
+ _chunkAHEA4IJVcjs.__spreadProps.call(void 0, _chunkAHEA4IJVcjs.__spreadValues.call(void 0, {
33
+ "aria-hidden": "true",
34
+ fill: "none",
35
+ focusable: "false",
36
+ height: size != null ? size : height,
37
+ role: "presentation",
38
+ viewBox: "0 0 24 24",
39
+ width: size != null ? size : width
40
+ }, props), {
41
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
42
+ "path",
43
+ {
44
+ 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",
45
+ fill: "currentColor"
46
+ }
47
+ )
48
+ })
49
+ );
50
+ };
51
+ var VerticalDotsIcon_default = VerticalDotsIcon;
52
+
53
+ // src/Menu/Menu.tsx
54
+
18
55
  var menuVariants = _pixelutils.tv.call(void 0, {
19
56
  slots: {
20
57
  item: "",
21
58
  trigger: ""
22
59
  }
23
60
  });
61
+ var isMenuSection = (item) => {
62
+ return "items" in item;
63
+ };
24
64
  var getDisabledKeys = (items) => {
25
- return items.map((item) => {
26
- return typeof (item == null ? void 0 : item.items) === "undefined" ? item : item.items;
27
- }).flat().filter((item) => {
28
- return Object.hasOwn(item, "disabled") && item.disabled === true;
65
+ const flatItems = items.reduce((acc, item) => {
66
+ if (isMenuSection(item)) {
67
+ acc.push(...item.items);
68
+ } else {
69
+ acc.push(item);
70
+ }
71
+ return acc;
72
+ }, []);
73
+ return flatItems.filter((item) => {
74
+ return item.disabled === true;
29
75
  }).map((item) => {
30
76
  return item.key;
31
77
  });
@@ -63,11 +109,13 @@ var Menu = ({
63
109
  triggerButton = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
64
110
  _button.Button,
65
111
  _chunkAHEA4IJVcjs.__spreadProps.call(void 0, _chunkAHEA4IJVcjs.__spreadValues.call(void 0, {
66
- className: _pixelutils.cn.call(void 0, "min-w-0", className.trigger),
112
+ isIconOnly: true,
113
+ className: _pixelutils.cn.call(void 0, "outline-divider min-w-0 outline", className.trigger),
114
+ radius: "full",
67
115
  size: "sm",
68
- variant: "flat"
116
+ variant: "light"
69
117
  }, triggerButtonProps), {
70
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _fa6.FaEllipsisVertical, {})
118
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, VerticalDotsIcon_default, {})
71
119
  })
72
120
  );
73
121
  } else if (triggerButtonProps) {
@@ -118,4 +166,4 @@ var Menu_default2 = Menu_default;
118
166
 
119
167
 
120
168
  exports.Menu_default = Menu_default; exports.Menu_default2 = Menu_default2;
121
- //# sourceMappingURL=chunk-YLJW375Y.cjs.map
169
+ //# sourceMappingURL=chunk-C43BKEAS.cjs.map
@@ -0,0 +1 @@
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"]}
package/dist/index.cjs CHANGED
@@ -9,25 +9,25 @@ var _chunkAZ7VMRHXcjs = require('./chunk-AZ7VMRHX.cjs');
9
9
 
10
10
 
11
11
 
12
- var _chunkTFRAQ6OQcjs = require('./chunk-TFRAQ6OQ.cjs');
13
12
 
13
+ var _chunkOLI32URUcjs = require('./chunk-OLI32URU.cjs');
14
14
 
15
15
 
16
- var _chunkG3YTOGEGcjs = require('./chunk-G3YTOGEG.cjs');
17
16
 
17
+ var _chunkTFRAQ6OQcjs = require('./chunk-TFRAQ6OQ.cjs');
18
18
 
19
19
 
20
20
 
21
+ var _chunkG3YTOGEGcjs = require('./chunk-G3YTOGEG.cjs');
21
22
 
22
- var _chunkLX5LJN3Icjs = require('./chunk-LX5LJN3I.cjs');
23
23
 
24
24
 
25
- var _chunkJ2LI4ONScjs = require('./chunk-J2LI4ONS.cjs');
26
25
 
27
26
 
27
+ var _chunkLX5LJN3Icjs = require('./chunk-LX5LJN3I.cjs');
28
28
 
29
29
 
30
- var _chunkOLI32URUcjs = require('./chunk-OLI32URU.cjs');
30
+ var _chunkJ2LI4ONScjs = require('./chunk-J2LI4ONS.cjs');
31
31
 
32
32
 
33
33
  var _chunkY3RSI2KVcjs = require('./chunk-Y3RSI2KV.cjs');
@@ -52,7 +52,7 @@ var _chunkERSNLQGGcjs = require('./chunk-ERSNLQGG.cjs');
52
52
  var _chunkBPBEZCSPcjs = require('./chunk-BPBEZCSP.cjs');
53
53
 
54
54
 
55
- var _chunkYLJW375Ycjs = require('./chunk-YLJW375Y.cjs');
55
+ var _chunkC43BKEAScjs = require('./chunk-C43BKEAS.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 = _chunkYLJW375Ycjs.Menu_default; exports.Modal = _chunkHPZBCSP3cjs.Modal_default; exports.Popover = _chunkYW4S32XVcjs.Popover_default; exports.Progress = _chunkIY2NXW6Xcjs.Progress_default; exports.ProgressCircular = _chunkAZ7VMRHXcjs.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 = _chunkAZ7VMRHXcjs.progressCircularVariants; exports.progressVariants = _chunkIY2NXW6Xcjs.progressVariants; exports.tableVariants = _chunkTFRAQ6OQcjs.tableVariants; exports.tabsVariants = _chunkG3YTOGEGcjs.tabsVariants; exports.toastVariants = _chunkLX5LJN3Icjs.toastVariants; exports.useDebounce = _chunkOLI32URUcjs.useDebounce; exports.useIsInitialRenderCycle = _chunkOLI32URUcjs.useIsInitialRenderCycle; exports.useLocalStorage = _chunkOLI32URUcjs.useLocalStorage;
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 = _chunkC43BKEAScjs.Menu_default; exports.Modal = _chunkHPZBCSP3cjs.Modal_default; exports.Popover = _chunkYW4S32XVcjs.Popover_default; exports.Progress = _chunkIY2NXW6Xcjs.Progress_default; exports.ProgressCircular = _chunkAZ7VMRHXcjs.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 = _chunkAZ7VMRHXcjs.progressCircularVariants; exports.progressVariants = _chunkIY2NXW6Xcjs.progressVariants; exports.tableVariants = _chunkTFRAQ6OQcjs.tableVariants; exports.tabsVariants = _chunkG3YTOGEGcjs.tabsVariants; exports.toastVariants = _chunkLX5LJN3Icjs.toastVariants; exports.useDebounce = _chunkOLI32URUcjs.useDebounce; exports.useIsInitialRenderCycle = _chunkOLI32URUcjs.useIsInitialRenderCycle; exports.useLocalStorage = _chunkOLI32URUcjs.useLocalStorage;
135
135
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/pixels/dist/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,g3EAAC","file":"/home/runner/work/pixels/pixels/packages/pixels/dist/index.cjs"}
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/pixels/dist/index.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B,gCAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,g3EAAC","file":"/home/runner/work/pixels/pixels/packages/pixels/dist/index.cjs"}
package/dist/index.d.cts CHANGED
@@ -10,7 +10,7 @@ export { C as Card, a as CardProps, c as cardVariants } from './Card-OBRZ-ssX.cj
10
10
  export { D as Drawer, f as DrawerProps, d as drawerBackdrops, a as drawerPlacements, b as drawerRadii, c as drawerSizes, e as drawerVariants } from './Drawer-JpihbwKl.cjs';
11
11
  export { J as Json, a as JsonProps } from './Json-Dny90Wml.cjs';
12
12
  export { L as Label, a as LabelProps, l as labelVariants } from './Label-B5fd7vp_.cjs';
13
- export { M as Menu, b as MenuItem, a as MenuProps, c as MenuSection } from './Menu-CF5f9mfu.cjs';
13
+ export { M as Menu, b as MenuItem, a as MenuProps, c as MenuSection } from './Menu-DDKcN7N3.cjs';
14
14
  export { M as Modal, a as ModalProps, m as modalVariants } from './Modal-BwFQz60I.cjs';
15
15
  export { P as Popover, a as PopoverProps } from './Popover-Bf192yqn.cjs';
16
16
  export { P as ProgressCircular, a as ProgressCircularProps, p as progressCircularVariants } from './ProgressCircular-CkZsOW4R.cjs';
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export { C as Card, a as CardProps, c as cardVariants } from './Card-OBRZ-ssX.js
10
10
  export { D as Drawer, f as DrawerProps, d as drawerBackdrops, a as drawerPlacements, b as drawerRadii, c as drawerSizes, e as drawerVariants } from './Drawer-JpihbwKl.js';
11
11
  export { J as Json, a as JsonProps } from './Json-Dny90Wml.js';
12
12
  export { L as Label, a as LabelProps, l as labelVariants } from './Label-B5fd7vp_.js';
13
- export { M as Menu, b as MenuItem, a as MenuProps, c as MenuSection } from './Menu-CF5f9mfu.js';
13
+ export { M as Menu, b as MenuItem, a as MenuProps, c as MenuSection } from './Menu-DDKcN7N3.js';
14
14
  export { M as Modal, a as ModalProps, m as modalVariants } from './Modal-BwFQz60I.js';
15
15
  export { P as Popover, a as PopoverProps } from './Popover-Bf192yqn.js';
16
16
  export { P as ProgressCircular, a as ProgressCircularProps, p as progressCircularVariants } from './ProgressCircular-CkZsOW4R.js';
package/dist/index.js CHANGED
@@ -6,6 +6,11 @@ import {
6
6
  ProgressCircular_default,
7
7
  progressCircularVariants
8
8
  } from "./chunk-2O3IUQR4.js";
9
+ import {
10
+ useDebounce,
11
+ useIsInitialRenderCycle,
12
+ useLocalStorage
13
+ } from "./chunk-B3XKBNXD.js";
9
14
  import {
10
15
  Table_default,
11
16
  tableVariants
@@ -23,11 +28,6 @@ import {
23
28
  import {
24
29
  Tooltip_default
25
30
  } from "./chunk-BGGRVPBR.js";
26
- import {
27
- useDebounce,
28
- useIsInitialRenderCycle,
29
- useLocalStorage
30
- } from "./chunk-B3XKBNXD.js";
31
31
  import {
32
32
  ButtonGroup_default
33
33
  } from "./chunk-FNQ7VO32.js";
@@ -52,7 +52,7 @@ import {
52
52
  } from "./chunk-4AXE6KZW.js";
53
53
  import {
54
54
  Menu_default
55
- } from "./chunk-324TSAWD.js";
55
+ } from "./chunk-3VAWRUPR.js";
56
56
  import {
57
57
  Modal_default,
58
58
  modalVariants
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.2.5",
5
+ "version": "1.3.0",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
8
8
  "module": "./dist/index.js",
@@ -113,6 +113,11 @@
113
113
  "import": "./dist/ScrollShadow/index.js",
114
114
  "require": "./dist/ScrollShadow/index.cjs"
115
115
  },
116
+ "./SearchInput": {
117
+ "types": "./dist/SearchInput/index.d.ts",
118
+ "import": "./dist/SearchInput/index.js",
119
+ "require": "./dist/SearchInput/index.cjs"
120
+ },
116
121
  "./Table": {
117
122
  "types": "./dist/Table/index.d.ts",
118
123
  "import": "./dist/Table/index.js",
@@ -170,6 +175,7 @@
170
175
  "@heroui/divider": "2.2.17",
171
176
  "@heroui/drawer": "2.2.21",
172
177
  "@heroui/dropdown": "2.3.24",
178
+ "@heroui/input": "2.4.25",
173
179
  "@heroui/modal": "2.2.21",
174
180
  "@heroui/popover": "2.3.24",
175
181
  "@heroui/progress": "2.2.20",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/Menu/Menu.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 { FaEllipsisVertical } from 'react-icons/fa6';\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\n/**\n * Menu item type\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/** returns String[] of disabled items/keys */\nconst getDisabledKeys = (items: (MenuSection | MenuItem)[]) => {\n return items\n .map((item) => {\n // @ts-expect-error typing issue with MenuSection | MenuItem\n return typeof item?.items === 'undefined' ? item : item.items;\n })\n .flat<MenuItem[]>()\n .filter((item) => {\n return Object.hasOwn(item, 'disabled') && 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 className={cn('min-w-0', className.trigger)}\n size=\"sm\"\n variant=\"flat\"\n {...triggerButtonProps}\n >\n <FaEllipsisVertical />\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 Menu from './Menu';\n\nexport type { MenuProps, MenuItem, MenuSection } from './Menu';\n\nexport { Menu };\n\nexport default Menu;\n"],"mappings":";;;;;;AASA,SAAS,0BAA0B;AAEnC,SAAS,cAAc;AACvB;AAAA,EACE,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,OACd;AAEP,SAAS,IAAI,IAAI,4BAA4B;AAgGzC,cA2DA,YA3DA;AA3DG,IAAM,eAAe,GAAG;AAAA,EAC7B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF,CAAC;AAqCD,IAAM,kBAAkB,CAAC,UAAsC;AAC7D,SAAO,MACJ,IAAI,CAAC,SAAS;AAEb,WAAO,QAAO,6BAAM,WAAU,cAAc,OAAO,KAAK;AAAA,EAC1D,CAAC,EACA,KAAiB,EACjB,OAAO,CAAC,SAAS;AAChB,WAAO,OAAO,OAAO,MAAM,UAAU,KAAK,KAAK,aAAa;AAAA,EAC9D,CAAC,EACA,IAAI,CAAC,SAAS;AACb,WAAO,KAAK;AAAA,EACd,CAAC;AACL;AAEA,IAAM,iBAAiB,CAAC,MAAgB,kBAA2B;AAlHnE;AAmHE,SACE;AAAA,IAAC;AAAA;AAAA,MAEC,WAAW,GAAG,eAAe,KAAK,SAAS;AAAA,MAC3C,gBAAa,UAAK,WAAL,YAAe,KAAK;AAAA,MACjC,aAAa,KAAK;AAAA,MAClB,SAAS,KAAK;AAAA,MACd,cAAc,KAAK;AAAA,MAElB,eAAK;AAAA;AAAA,IAPD,KAAK;AAAA,EAQZ;AAEJ;AAKA,IAAM,OAAO,CAAC;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW,aAAa;AAAA,EACxB,aAAa;AAAA,EACb;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,qBAAqB;AACvB,MAAiB;AAEf,QAAM,WAAW,aAAa;AAC9B,QAAM,YAAY,qBAAqB,UAAU,YAAY,SAAS;AAGtE,MAAI,gBACF,oBAAC,YAAO,WAAW,UAAU,SAAS,MAAK,UACxC,UACH;AAEF,MAAI,CAAC,UAAU;AAEb,oBACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,WAAW,UAAU,OAAO;AAAA,QAC1C,MAAK;AAAA,QACL,SAAQ;AAAA,SACJ,qBAJL;AAAA,QAMC,8BAAC,sBAAmB;AAAA;AAAA,IACtB;AAAA,EAEJ,WAAW,oBAAoB;AAE7B,oBACE,oBAAC,uCAAO,WAAW,UAAU,WAAa,qBAAzC,EACE,WACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ;AAAA,MACA;AAAA,MAEA;AAAA,4BAAC,uBAAoB,eAAa,QAE/B,yBACH;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,cAAc,gBAAgB,KAAK;AAAA,YACnC;AAAA,YACA;AAAA,YAEC,WAAC,SAAS;AACT,kBAAI,WAAW,MAAM;AACnB,uBACE;AAAA,kBAAC;AAAA;AAAA,oBAEC,OAAO,KAAK;AAAA,oBACZ,OAAO,KAAK;AAAA,oBAEX,WAAC,gBAAgB;AAChB,6BAAO,eAAe,aAAa,UAAU,IAAI;AAAA,oBACnD;AAAA;AAAA,kBANK,KAAK;AAAA,gBAOZ;AAAA,cAEJ;AACA,qBAAO,eAAe,MAAM,UAAU,IAAI;AAAA,YAC5C;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,eAAQ;;;AC5Mf,IAAOA,gBAAQ;","names":["Menu_default"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/pixels/dist/chunk-YLJW375Y.cjs","../src/Menu/Menu.tsx","../src/Menu/index.ts"],"names":["Menu_default"],"mappings":"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","file":"/home/runner/work/pixels/pixels/packages/pixels/dist/chunk-YLJW375Y.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 { FaEllipsisVertical } from 'react-icons/fa6';\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\n/**\n * Menu item type\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/** returns String[] of disabled items/keys */\nconst getDisabledKeys = (items: (MenuSection | MenuItem)[]) => {\n return items\n .map((item) => {\n // @ts-expect-error typing issue with MenuSection | MenuItem\n return typeof item?.items === 'undefined' ? item : item.items;\n })\n .flat<MenuItem[]>()\n .filter((item) => {\n return Object.hasOwn(item, 'disabled') && 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 className={cn('min-w-0', className.trigger)}\n size=\"sm\"\n variant=\"flat\"\n {...triggerButtonProps}\n >\n <FaEllipsisVertical />\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 Menu from './Menu';\n\nexport type { MenuProps, MenuItem, MenuSection } from './Menu';\n\nexport { Menu };\n\nexport default Menu;\n"]}