@fuf-stack/pixels 0.29.3 → 0.31.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.
Files changed (98) hide show
  1. package/dist/Accordion/index.cjs +3 -3
  2. package/dist/Accordion/index.js +2 -2
  3. package/dist/Avatar/index.cjs +1 -1
  4. package/dist/Avatar/index.js +1 -1
  5. package/dist/AvatarGroup/index.cjs +3 -3
  6. package/dist/AvatarGroup/index.js +2 -2
  7. package/dist/Badge/index.cjs +1 -1
  8. package/dist/Badge/index.js +1 -1
  9. package/dist/Breadcrumb/index.cjs +3 -3
  10. package/dist/Breadcrumb/index.js +2 -2
  11. package/dist/Button/index.cjs +1 -1
  12. package/dist/Button/index.js +1 -1
  13. package/dist/Card/index.cjs +3 -3
  14. package/dist/Card/index.js +2 -2
  15. package/dist/Drawer/index.cjs +77 -0
  16. package/dist/Drawer/index.cjs.map +1 -0
  17. package/dist/Drawer/index.d.cts +142 -0
  18. package/dist/Drawer/index.d.ts +142 -0
  19. package/dist/Drawer/index.js +77 -0
  20. package/dist/Drawer/index.js.map +1 -0
  21. package/dist/Json/index.cjs +3 -3
  22. package/dist/Json/index.d.cts +3 -2
  23. package/dist/Json/index.d.ts +3 -2
  24. package/dist/Json/index.js +2 -2
  25. package/dist/Json-DZue23GO.d.cts +24 -0
  26. package/dist/Json-DZue23GO.d.ts +24 -0
  27. package/dist/Label/index.cjs +1 -1
  28. package/dist/Label/index.js +1 -1
  29. package/dist/Menu/index.cjs +3 -3
  30. package/dist/Menu/index.js +2 -2
  31. package/dist/Modal/index.cjs +1 -1
  32. package/dist/Modal/index.js +1 -1
  33. package/dist/Popover/index.cjs +3 -3
  34. package/dist/Popover/index.js +2 -2
  35. package/dist/ScrollShadow/index.cjs +1 -1
  36. package/dist/ScrollShadow/index.js +1 -1
  37. package/dist/Table/index.cjs +112 -0
  38. package/dist/Table/index.cjs.map +1 -0
  39. package/dist/Table/index.d.cts +244 -0
  40. package/dist/Table/index.d.ts +244 -0
  41. package/dist/Table/index.js +112 -0
  42. package/dist/Table/index.js.map +1 -0
  43. package/dist/Tabs/index.cjs +1 -1
  44. package/dist/Tabs/index.js +1 -1
  45. package/dist/Tooltip/index.cjs +1 -1
  46. package/dist/Tooltip/index.js +1 -1
  47. package/dist/{chunk-37C63OKM.cjs → chunk-2WDAJ6ER.cjs} +9 -5
  48. package/dist/chunk-2WDAJ6ER.cjs.map +1 -0
  49. package/dist/{chunk-EIOL2HNA.js → chunk-33DBA7U2.js} +8 -5
  50. package/dist/{chunk-EIOL2HNA.js.map → chunk-33DBA7U2.js.map} +1 -1
  51. package/dist/{chunk-JDLU5AUA.js → chunk-3QI2ODV2.js} +9 -5
  52. package/dist/{chunk-JDLU5AUA.js.map → chunk-3QI2ODV2.js.map} +1 -1
  53. package/dist/{chunk-L2RCVUXK.js → chunk-7LABJBKF.js} +2 -2
  54. package/dist/{chunk-L2RCVUXK.js.map → chunk-7LABJBKF.js.map} +1 -1
  55. package/dist/{chunk-OP6ST4KB.cjs → chunk-7XJHVFT3.cjs} +16 -14
  56. package/dist/chunk-7XJHVFT3.cjs.map +1 -0
  57. package/dist/{chunk-JPALSO5E.cjs → chunk-AVYWDZ7X.cjs} +8 -4
  58. package/dist/chunk-AVYWDZ7X.cjs.map +1 -0
  59. package/dist/{chunk-APEDJG3R.js → chunk-CZJKT7IC.js} +7 -3
  60. package/dist/{chunk-APEDJG3R.js.map → chunk-CZJKT7IC.js.map} +1 -1
  61. package/dist/chunk-D4TLDLEX.cjs +63 -0
  62. package/dist/chunk-D4TLDLEX.cjs.map +1 -0
  63. package/dist/{chunk-5WRI5ZAA.js → chunk-J7N2552D.js} +33 -1
  64. package/dist/{chunk-C2BIHVLT.js → chunk-LCSYN3DI.js} +180 -96
  65. package/dist/chunk-LCSYN3DI.js.map +1 -0
  66. package/dist/{chunk-RMLPCTDU.js → chunk-LPCCBJ2T.js} +8 -5
  67. package/dist/{chunk-RMLPCTDU.js.map → chunk-LPCCBJ2T.js.map} +1 -1
  68. package/dist/{chunk-5HEZFVFG.cjs → chunk-LY45VQ2E.cjs} +3 -3
  69. package/dist/chunk-LY45VQ2E.cjs.map +1 -0
  70. package/dist/{chunk-RJAVAHBK.cjs → chunk-NVNT4PMS.cjs} +9 -6
  71. package/dist/chunk-NVNT4PMS.cjs.map +1 -0
  72. package/dist/{chunk-XFUHF75Z.cjs → chunk-OLKLIWBE.cjs} +213 -129
  73. package/dist/chunk-OLKLIWBE.cjs.map +1 -0
  74. package/dist/{chunk-337S7HUF.js → chunk-XVCKJE3P.js} +14 -12
  75. package/dist/{chunk-337S7HUF.js.map → chunk-XVCKJE3P.js.map} +1 -1
  76. package/dist/{chunk-VHEIRVBB.cjs → chunk-ZXGEK67F.cjs} +9 -6
  77. package/dist/chunk-ZXGEK67F.cjs.map +1 -0
  78. package/dist/hooks/index.cjs +1 -1
  79. package/dist/hooks/index.js +1 -1
  80. package/dist/index.cjs +15 -15
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.d.cts +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.js +16 -16
  85. package/package.json +34 -22
  86. package/dist/Json-BbMeuEvE.d.cts +0 -18
  87. package/dist/Json-BbMeuEvE.d.ts +0 -18
  88. package/dist/chunk-37C63OKM.cjs.map +0 -1
  89. package/dist/chunk-5HEZFVFG.cjs.map +0 -1
  90. package/dist/chunk-C2BIHVLT.js.map +0 -1
  91. package/dist/chunk-DZUJEN5N.cjs +0 -31
  92. package/dist/chunk-DZUJEN5N.cjs.map +0 -1
  93. package/dist/chunk-JPALSO5E.cjs.map +0 -1
  94. package/dist/chunk-OP6ST4KB.cjs.map +0 -1
  95. package/dist/chunk-RJAVAHBK.cjs.map +0 -1
  96. package/dist/chunk-VHEIRVBB.cjs.map +0 -1
  97. package/dist/chunk-XFUHF75Z.cjs.map +0 -1
  98. /package/dist/{chunk-5WRI5ZAA.js.map → chunk-J7N2552D.js.map} +0 -0
@@ -0,0 +1,244 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as tailwind_variants from 'tailwind-variants';
3
+ import * as tailwind_variants_dist_config_js from 'tailwind-variants/dist/config.js';
4
+ import { TVProps, TVClassName } from '@fuf-stack/pixel-utils';
5
+ import { ReactNode } from 'react';
6
+
7
+ declare const tableVariants: tailwind_variants.TVReturnType<{
8
+ separation: {
9
+ divider: {
10
+ tr: string;
11
+ };
12
+ 'divider-x': {
13
+ tr: string;
14
+ };
15
+ 'divider-y': {
16
+ tr: string;
17
+ };
18
+ 'striped-divider-x': {
19
+ tr: string;
20
+ th: string;
21
+ td: string;
22
+ };
23
+ striped: {
24
+ tr: string;
25
+ td: string;
26
+ };
27
+ none: {};
28
+ };
29
+ }, {
30
+ base: string;
31
+ wrapper: string;
32
+ table: string;
33
+ thead: string;
34
+ tbody: string;
35
+ tr: string;
36
+ th: string;
37
+ td: string;
38
+ tfoot: string;
39
+ sortIcon: string;
40
+ emptyWrapper: string;
41
+ loadingWrapper: string;
42
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<{
43
+ separation: {
44
+ divider: {
45
+ tr: string;
46
+ };
47
+ 'divider-x': {
48
+ tr: string;
49
+ };
50
+ 'divider-y': {
51
+ tr: string;
52
+ };
53
+ 'striped-divider-x': {
54
+ tr: string;
55
+ th: string;
56
+ td: string;
57
+ };
58
+ striped: {
59
+ tr: string;
60
+ td: string;
61
+ };
62
+ none: {};
63
+ };
64
+ }, {
65
+ separation: {
66
+ divider: {
67
+ tr: string;
68
+ };
69
+ 'divider-x': {
70
+ tr: string;
71
+ };
72
+ 'divider-y': {
73
+ tr: string;
74
+ };
75
+ 'striped-divider-x': {
76
+ tr: string;
77
+ th: string;
78
+ td: string;
79
+ };
80
+ striped: {
81
+ tr: string;
82
+ td: string;
83
+ };
84
+ none: {};
85
+ };
86
+ }>, {
87
+ separation: {
88
+ divider: {
89
+ tr: string;
90
+ };
91
+ 'divider-x': {
92
+ tr: string;
93
+ };
94
+ 'divider-y': {
95
+ tr: string;
96
+ };
97
+ 'striped-divider-x': {
98
+ tr: string;
99
+ th: string;
100
+ td: string;
101
+ };
102
+ striped: {
103
+ tr: string;
104
+ td: string;
105
+ };
106
+ none: {};
107
+ };
108
+ }, {
109
+ base: string;
110
+ wrapper: string;
111
+ table: string;
112
+ thead: string;
113
+ tbody: string;
114
+ tr: string;
115
+ th: string;
116
+ td: string;
117
+ tfoot: string;
118
+ sortIcon: string;
119
+ emptyWrapper: string;
120
+ loadingWrapper: string;
121
+ }, tailwind_variants.TVReturnType<{
122
+ separation: {
123
+ divider: {
124
+ tr: string;
125
+ };
126
+ 'divider-x': {
127
+ tr: string;
128
+ };
129
+ 'divider-y': {
130
+ tr: string;
131
+ };
132
+ 'striped-divider-x': {
133
+ tr: string;
134
+ th: string;
135
+ td: string;
136
+ };
137
+ striped: {
138
+ tr: string;
139
+ td: string;
140
+ };
141
+ none: {};
142
+ };
143
+ }, {
144
+ base: string;
145
+ wrapper: string;
146
+ table: string;
147
+ thead: string;
148
+ tbody: string;
149
+ tr: string;
150
+ th: string;
151
+ td: string;
152
+ tfoot: string;
153
+ sortIcon: string;
154
+ emptyWrapper: string;
155
+ loadingWrapper: string;
156
+ }, undefined, tailwind_variants_dist_config_js.TVConfig<{
157
+ separation: {
158
+ divider: {
159
+ tr: string;
160
+ };
161
+ 'divider-x': {
162
+ tr: string;
163
+ };
164
+ 'divider-y': {
165
+ tr: string;
166
+ };
167
+ 'striped-divider-x': {
168
+ tr: string;
169
+ th: string;
170
+ td: string;
171
+ };
172
+ striped: {
173
+ tr: string;
174
+ td: string;
175
+ };
176
+ none: {};
177
+ };
178
+ }, {
179
+ separation: {
180
+ divider: {
181
+ tr: string;
182
+ };
183
+ 'divider-x': {
184
+ tr: string;
185
+ };
186
+ 'divider-y': {
187
+ tr: string;
188
+ };
189
+ 'striped-divider-x': {
190
+ tr: string;
191
+ th: string;
192
+ td: string;
193
+ };
194
+ striped: {
195
+ tr: string;
196
+ td: string;
197
+ };
198
+ none: {};
199
+ };
200
+ }>, unknown, unknown, undefined>>;
201
+ type VariantProps = TVProps<typeof tableVariants>;
202
+ type ClassName = TVClassName<typeof tableVariants>;
203
+ interface TableColumnProps {
204
+ key: string;
205
+ label: ReactNode;
206
+ }
207
+ interface TableRowProps {
208
+ key: string | number;
209
+ [key: string | number]: ReactNode;
210
+ }
211
+ interface TableProps extends VariantProps {
212
+ /** Aria label for the Table. */
213
+ ariaLabel?: string;
214
+ /** Component to display at the bottom of the Table. */
215
+ bottomContent?: ReactNode;
216
+ /** CSS class name */
217
+ className?: ClassName;
218
+ /** Objects with table data */
219
+ columns: TableColumnProps[];
220
+ /** Component to display if there are no rows! */
221
+ emptyContent?: ReactNode;
222
+ /** Determine if the Table should have a card like wrapper. */
223
+ hasWrapper?: boolean;
224
+ /** remove header */
225
+ hideHeader?: boolean;
226
+ /** Tells the Table to show the loading component. */
227
+ loading?: boolean;
228
+ /** Loading animation component. */
229
+ loadingContent?: ReactNode;
230
+ /** Items displayed as rows in the Table. Should have key-value pair for each column. */
231
+ rows?: TableRowProps[];
232
+ /** Separation style for the rows & columns. */
233
+ separation?: 'none' | 'striped' | 'striped-divider-x' | 'divider-x' | 'divider-y' | 'divider';
234
+ /** Keeps the header of the Table in view while scrolling a height limited Table. */
235
+ stickyHeader?: boolean;
236
+ /** HTML data-testid attribute used in e2e tests */
237
+ testId?: string;
238
+ }
239
+ /**
240
+ * Table component based on [NextUI Table](https://nextui.org/docs/components/table)
241
+ */
242
+ declare const Table: ({ ariaLabel, bottomContent, className, columns, emptyContent, hasWrapper, hideHeader, loading, loadingContent, rows, separation, stickyHeader, testId, }: TableProps) => react_jsx_runtime.JSX.Element;
243
+
244
+ export { Table as default };
@@ -0,0 +1,112 @@
1
+ import "../chunk-J7N2552D.js";
2
+
3
+ // src/Table/Table.tsx
4
+ import {
5
+ getKeyValue,
6
+ Table as NextTable,
7
+ TableBody,
8
+ TableCell,
9
+ TableColumn,
10
+ TableHeader,
11
+ TableRow
12
+ } from "@nextui-org/table";
13
+ import { tv, variantsToClassNames } from "@fuf-stack/pixel-utils";
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+ var tableVariants = tv({
16
+ slots: {
17
+ base: "",
18
+ wrapper: "",
19
+ table: "",
20
+ thead: "",
21
+ tbody: "",
22
+ tr: "",
23
+ th: "bg-content2",
24
+ td: "",
25
+ tfoot: "",
26
+ sortIcon: "",
27
+ emptyWrapper: "",
28
+ loadingWrapper: ""
29
+ },
30
+ variants: {
31
+ separation: {
32
+ divider: {
33
+ tr: 'divide-x rounded-lg border-b data-[last=true]:border-none [&:first-child:not([data-first="true"])]:border-none'
34
+ },
35
+ "divider-x": {
36
+ tr: "divide-x"
37
+ },
38
+ "divider-y": {
39
+ tr: 'rounded-lg border-b data-[last=true]:border-none [&:first-child:not([data-first="true"])]:border-none'
40
+ },
41
+ "striped-divider-x": {
42
+ tr: "divide-x",
43
+ th: "border-divider",
44
+ td: "border-divider first:rounded-s-lg last:rounded-e-lg group-data-[odd=true]:bg-content2"
45
+ },
46
+ striped: {
47
+ tr: "",
48
+ td: "first:rounded-s-lg last:rounded-e-lg group-data-[odd=true]:bg-content2"
49
+ },
50
+ none: {}
51
+ }
52
+ }
53
+ });
54
+ var Table = ({
55
+ ariaLabel = void 0,
56
+ bottomContent = void 0,
57
+ className = void 0,
58
+ columns,
59
+ emptyContent = "No rows to display.",
60
+ hasWrapper = false,
61
+ hideHeader = false,
62
+ loading = false,
63
+ loadingContent = void 0,
64
+ rows = [],
65
+ separation = "none",
66
+ stickyHeader = false,
67
+ testId = void 0
68
+ }) => {
69
+ const variants = tableVariants({ separation });
70
+ const classNames = variantsToClassNames(variants, className, "base");
71
+ return /* @__PURE__ */ jsxs(
72
+ NextTable,
73
+ {
74
+ "aria-label": ariaLabel,
75
+ bottomContent,
76
+ classNames,
77
+ "data-testid": testId,
78
+ hideHeader,
79
+ isHeaderSticky: stickyHeader,
80
+ isStriped: separation === "striped" || separation === "striped-divider-x",
81
+ removeWrapper: !hasWrapper,
82
+ children: [
83
+ /* @__PURE__ */ jsx(TableHeader, { columns, children: (column) => /* @__PURE__ */ jsx(TableColumn, { children: column.label }, column.key) }),
84
+ /* @__PURE__ */ jsx(
85
+ TableBody,
86
+ {
87
+ isLoading: loading,
88
+ loadingContent: loadingContent || "...",
89
+ emptyContent,
90
+ items: rows,
91
+ children: (item) => /* @__PURE__ */ jsx(
92
+ TableRow,
93
+ {
94
+ "data-testid": testId && ((item == null ? void 0 : item.testId) || (item == null ? void 0 : item.key)) && `${testId || "table"}_item_${JSON.stringify(item.testId || item.key)}`,
95
+ children: (columnKey) => /* @__PURE__ */ jsx(TableCell, { children: getKeyValue(item, columnKey) })
96
+ },
97
+ item.key
98
+ )
99
+ }
100
+ )
101
+ ]
102
+ }
103
+ );
104
+ };
105
+ var Table_default = Table;
106
+
107
+ // src/Table/index.ts
108
+ var Table_default2 = Table_default;
109
+ export {
110
+ Table_default2 as default
111
+ };
112
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Table/Table.tsx","../../src/Table/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { ReactNode } from 'react';\n\nimport {\n getKeyValue,\n Table as NextTable,\n TableBody,\n TableCell,\n TableColumn,\n TableHeader,\n TableRow,\n} from '@nextui-org/table';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\n// import { slugify } from '../helpers';\n\n// table styling variants\nexport const tableVariants = tv({\n slots: {\n base: '',\n wrapper: '',\n table: '',\n thead: '',\n tbody: '',\n tr: '',\n th: 'bg-content2',\n td: '',\n tfoot: '',\n sortIcon: '',\n emptyWrapper: '',\n loadingWrapper: '',\n },\n variants: {\n separation: {\n divider: {\n tr: 'divide-x rounded-lg border-b data-[last=true]:border-none [&:first-child:not([data-first=\"true\"])]:border-none',\n },\n 'divider-x': {\n tr: 'divide-x',\n },\n 'divider-y': {\n tr: 'rounded-lg border-b data-[last=true]:border-none [&:first-child:not([data-first=\"true\"])]:border-none',\n },\n 'striped-divider-x': {\n tr: 'divide-x',\n th: 'border-divider',\n td: 'border-divider first:rounded-s-lg last:rounded-e-lg group-data-[odd=true]:bg-content2',\n },\n striped: {\n tr: '',\n td: 'first:rounded-s-lg last:rounded-e-lg group-data-[odd=true]:bg-content2',\n },\n none: {},\n },\n },\n});\n\ntype VariantProps = TVProps<typeof tableVariants>;\ntype ClassName = TVClassName<typeof tableVariants>;\n\nexport interface TableColumnProps {\n key: string;\n label: ReactNode;\n}\n\ninterface TableRowProps {\n key: string | number;\n [key: string | number]: ReactNode;\n}\n\nexport interface TableProps extends VariantProps {\n /** Aria label for the Table. */\n ariaLabel?: string;\n /** Component to display at the bottom of the Table. */\n bottomContent?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** Objects with table data */\n columns: TableColumnProps[];\n /** Component to display if there are no rows! */\n emptyContent?: ReactNode;\n /** Determine if the Table should have a card like wrapper. */\n hasWrapper?: boolean;\n /** remove header */\n hideHeader?: boolean;\n /** Tells the Table to show the loading component. */\n loading?: boolean;\n /** Loading animation component. */\n loadingContent?: ReactNode;\n /** Items displayed as rows in the Table. Should have key-value pair for each column. */\n rows?: TableRowProps[];\n /** Separation style for the rows & columns. */\n separation?:\n | 'none'\n | 'striped'\n | 'striped-divider-x'\n | 'divider-x'\n | 'divider-y'\n | 'divider';\n /** Keeps the header of the Table in view while scrolling a height limited Table. */\n stickyHeader?: boolean;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n}\n\n/**\n * Table component based on [NextUI Table](https://nextui.org/docs/components/table)\n */\nconst Table = ({\n ariaLabel = undefined,\n bottomContent = undefined,\n className = undefined,\n columns,\n emptyContent = 'No rows to display.',\n hasWrapper = false,\n hideHeader = false,\n loading = false,\n loadingContent = undefined,\n rows = [],\n separation = 'none',\n stickyHeader = false,\n testId = undefined,\n}: TableProps) => {\n const variants = tableVariants({ separation });\n const classNames = variantsToClassNames(variants, className, 'base');\n\n return (\n <NextTable\n aria-label={ariaLabel}\n bottomContent={bottomContent}\n classNames={classNames}\n data-testid={testId} // TODO: should we use slugify here? && slugify(testId)\n hideHeader={hideHeader}\n isHeaderSticky={stickyHeader}\n isStriped={separation === 'striped' || separation === 'striped-divider-x'}\n removeWrapper={!hasWrapper}\n >\n <TableHeader columns={columns}>\n {(column: TableColumnProps) => (\n <TableColumn key={column.key}>{column.label}</TableColumn>\n )}\n </TableHeader>\n <TableBody\n isLoading={loading}\n loadingContent={loadingContent || '...'} // TODO: use future spinner/loading component\n emptyContent={emptyContent}\n items={rows}\n >\n {(item: TableRowProps) => (\n <TableRow\n key={item.key}\n data-testid={\n testId &&\n (item?.testId || item?.key) &&\n `${testId || 'table'}_item_${JSON.stringify(item.testId || item.key)}`\n }\n // TODO: sluggify? data-testid={`${slugify(testId || 'table')}_item_${slugify(JSON.stringify(item.testId || item.key))}`}\n >\n {(columnKey) => (\n <TableCell>{getKeyValue(item, columnKey)}</TableCell>\n )}\n </TableRow>\n )}\n </TableBody>\n </NextTable>\n );\n};\n\nexport default Table;\n","import Table from './Table';\n\nexport default Table;\n"],"mappings":";;;AAGA;AAAA,EACE;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,IAAI,4BAA4B;AAmHrC,SAYM,KAZN;AA9GG,IAAM,gBAAgB,GAAG;AAAA,EAC9B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AAAA,MACV,SAAS;AAAA,QACP,IAAI;AAAA,MACN;AAAA,MACA,aAAa;AAAA,QACX,IAAI;AAAA,MACN;AAAA,MACA,aAAa;AAAA,QACX,IAAI;AAAA,MACN;AAAA,MACA,qBAAqB;AAAA,QACnB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,SAAS;AAAA,QACP,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAAA,MACA,MAAM,CAAC;AAAA,IACT;AAAA,EACF;AACF,CAAC;AAqDD,IAAM,QAAQ,CAAC;AAAA,EACb,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,OAAO,CAAC;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,SAAS;AACX,MAAkB;AAChB,QAAM,WAAW,cAAc,EAAE,WAAW,CAAC;AAC7C,QAAM,aAAa,qBAAqB,UAAU,WAAW,MAAM;AAEnE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,cAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,eAAa;AAAA,MACb;AAAA,MACA,gBAAgB;AAAA,MAChB,WAAW,eAAe,aAAa,eAAe;AAAA,MACtD,eAAe,CAAC;AAAA,MAEhB;AAAA,4BAAC,eAAY,SACV,WAAC,WACA,oBAAC,eAA8B,iBAAO,SAApB,OAAO,GAAmB,GAEhD;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,YACX,gBAAgB,kBAAkB;AAAA,YAClC;AAAA,YACA,OAAO;AAAA,YAEN,WAAC,SACA;AAAA,cAAC;AAAA;AAAA,gBAEC,eACE,YACC,6BAAM,YAAU,6BAAM,SACvB,GAAG,UAAU,OAAO,SAAS,KAAK,UAAU,KAAK,UAAU,KAAK,GAAG,CAAC;AAAA,gBAIrE,WAAC,cACA,oBAAC,aAAW,sBAAY,MAAM,SAAS,GAAE;AAAA;AAAA,cATtC,KAAK;AAAA,YAWZ;AAAA;AAAA,QAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,IAAO,gBAAQ;;;ACvKf,IAAOA,iBAAQ;","names":["Table_default"]}
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
  var _chunkZ5OFNBWIcjs = require('../chunk-Z5OFNBWI.cjs');
6
- require('../chunk-DZUJEN5N.cjs');
6
+ require('../chunk-D4TLDLEX.cjs');
7
7
 
8
8
 
9
9
 
@@ -3,7 +3,7 @@ import {
3
3
  Tabs_default2,
4
4
  tabsVariants
5
5
  } from "../chunk-NCSINRHM.js";
6
- import "../chunk-5WRI5ZAA.js";
6
+ import "../chunk-J7N2552D.js";
7
7
  export {
8
8
  Tabs_default as Tabs,
9
9
  Tabs_default2 as default,
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
  var _chunkRMA57Q6Kcjs = require('../chunk-RMA57Q6K.cjs');
6
- require('../chunk-DZUJEN5N.cjs');
6
+ require('../chunk-D4TLDLEX.cjs');
7
7
 
8
8
 
9
9
 
@@ -3,7 +3,7 @@ import {
3
3
  Tooltip_default2,
4
4
  tooltipPlacementOptions
5
5
  } from "../chunk-MJE4MLZY.js";
6
- import "../chunk-5WRI5ZAA.js";
6
+ import "../chunk-J7N2552D.js";
7
7
  export {
8
8
  Tooltip_default as Tooltip,
9
9
  Tooltip_default2 as default,
@@ -2,6 +2,10 @@
2
2
 
3
3
  var _chunkBXPBP3PCcjs = require('./chunk-BXPBP3PC.cjs');
4
4
 
5
+
6
+
7
+ var _chunkD4TLDLEXcjs = require('./chunk-D4TLDLEX.cjs');
8
+
5
9
  // src/Popover/Popover.tsx
6
10
  var _popover = require('@nextui-org/popover');
7
11
  var _pixelutils = require('@fuf-stack/pixel-utils');
@@ -32,14 +36,14 @@ var Popover_default = ({
32
36
  const className = _pixelutils.variantsToClassNames.call(void 0, variants, _className, "trigger");
33
37
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
34
38
  _popover.Popover,
35
- {
39
+ _chunkD4TLDLEXcjs.__spreadProps.call(void 0, _chunkD4TLDLEXcjs.__spreadValues.call(void 0, {
36
40
  classNames: className,
37
41
  placement,
38
42
  portalContainer,
39
43
  radius: "sm",
40
44
  shouldBlockScroll,
41
- showArrow: true,
42
- ...openControlled ? { isOpen: openControlled.open, onOpenChange: openControlled.setOpen } : {},
45
+ showArrow: true
46
+ }, openControlled ? { isOpen: openControlled.open, onOpenChange: openControlled.setOpen } : {}), {
43
47
  children: [
44
48
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _popover.PopoverTrigger, { "data-testid": testId, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "button", { children }) }),
45
49
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _popover.PopoverContent, { "data-testid": contentTestId, children: [
@@ -54,7 +58,7 @@ var Popover_default = ({
54
58
  ] })
55
59
  ] })
56
60
  ]
57
- }
61
+ })
58
62
  );
59
63
  };
60
64
 
@@ -65,4 +69,4 @@ var Popover_default2 = Popover_default;
65
69
 
66
70
 
67
71
  exports.Popover_default = Popover_default; exports.Popover_default2 = Popover_default2;
68
- //# sourceMappingURL=chunk-37C63OKM.cjs.map
72
+ //# sourceMappingURL=chunk-2WDAJ6ER.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/pixels/pixels/packages/pixels/dist/chunk-2WDAJ6ER.cjs","../src/Popover/Popover.tsx","../src/Popover/index.ts"],"names":["Popover_default"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACJA,8CAAwD;AAExD,oDAAyC;AA+EjC,+CAAA;AA1ED,IAAM,gBAAA,EAAkB,4BAAA;AAAG,EAChC,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,oBAAA;AAAA,IACN,OAAA,EAAS,gCAAA;AAAA,IACT,MAAA,EAAQ,oBAAA;AAAA,IACR,MAAA,EAAQ,oBAAA;AAAA,IACR,OAAA,EAAS;AAAA,EACX;AACF,CAAC,CAAA;AAiCD,IAAO,gBAAA,EAAQ,CAAC;AAAA,EACd,SAAA,EAAW,IAAA;AAAA,EACX,SAAA,EAAW,WAAA,EAAa,KAAA,CAAA;AAAA,EACxB,OAAA;AAAA,EACA,cAAA,EAAgB,KAAA,CAAA;AAAA,EAChB,OAAA,EAAS,KAAA,CAAA;AAAA,EACT,eAAA,EAAiB,KAAA,CAAA;AAAA,EACjB,UAAA,EAAY,KAAA;AAAA,EACZ,gBAAA,EAAkB,KAAA,CAAA;AAAA,EAClB,kBAAA,EAAoB,KAAA,CAAA;AAAA,EACpB,OAAA,EAAS,KAAA,CAAA;AAAA,EACT,MAAA,EAAQ,KAAA;AACV,CAAA,EAAA,GAAoB;AAElB,EAAA,MAAM,SAAA,EAAW,eAAA,CAAgB,CAAA;AACjC,EAAA,MAAM,UAAA,EAAY,8CAAA,QAAqB,EAAU,UAAA,EAAY,SAAS,CAAA;AAEtE,EAAA,uBACE,8BAAA;AAAA,IAAC,gBAAA;AAAA,IAAA,6CAAA,8CAAA;AAAA,MACC,UAAA,EAAY,SAAA;AAAA,MACZ,SAAA;AAAA,MACA,eAAA;AAAA,MACA,MAAA,EAAO,IAAA;AAAA,MACP,iBAAA;AAAA,MACA,SAAA,EAAS;AAAA,IAAA,CAAA,EAEJ,eAAA,EACD,EAAE,MAAA,EAAQ,cAAA,CAAe,IAAA,EAAM,YAAA,EAAc,cAAA,CAAe,QAAQ,EAAA,EACpE,CAAC,CAAA,CAAA,EAVN;AAAA,MAYC,QAAA,EAAA;AAAA,wBAAA,6BAAA,uBAAC,EAAA,EAAe,aAAA,EAAa,MAAA,EAG3B,QAAA,kBAAA,6BAAA,QAAC,EAAA,EAAQ,SAAA,CAAS,EAAA,CACpB,CAAA;AAAA,wBACA,8BAAA,uBAAC,EAAA,EAAe,aAAA,EAAa,aAAA,EAC1B,QAAA,EAAA;AAAA,UAAA,MAAA,mBACC,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,SAAA,CAAU,MAAA,EACvB,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,4BACD,6BAAA,IAAC,EAAA,CAAA,CAAG;AAAA,UAAA,EAAA,CACN,CAAA;AAAA,0BAEF,6BAAA,sCAAC,EAAA,EAAa,SAAA,EAAW,SAAA,CAAU,IAAA,EAAO,QAAA,EAAA,QAAA,CAAQ,CAAA;AAAA,UACjD,OAAA,mBACC,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,SAAA,CAAU,MAAA,EACxB,QAAA,EAAA;AAAA,4BAAA,6BAAA,IAAC,EAAA,CAAA,CAAG,CAAA;AAAA,YACH;AAAA,UAAA,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA,CAAA;AAAA,EACF,CAAA;AAEJ,CAAA;ADzCA;AACA;AE1DA,IAAOA,iBAAAA,EAAQ,eAAA;AF4Df;AACA;AACE;AACA;AACF,uFAAC","file":"/home/runner/work/pixels/pixels/packages/pixels/dist/chunk-2WDAJ6ER.cjs","sourcesContent":[null,"import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { PopoverProps as NextPopoverProps } from '@nextui-org/popover';\nimport type { ReactNode } from 'react';\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@nextui-org/popover';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport ScrollShadow from '../ScrollShadow/ScrollShadow';\n\n// popover styling variants\nexport const popoverVariants = tv({\n slots: {\n body: 'w-full px-2.5 py-1',\n content: 'flex max-h-[80vh] flex-col p-0',\n footer: 'w-full px-2.5 py-1',\n header: 'w-full px-2.5 py-1',\n trigger: '',\n },\n});\n\ntype VariantProps = TVProps<typeof popoverVariants>;\ntype ClassName = TVClassName<typeof popoverVariants>;\n\nexport interface PopoverProps extends VariantProps {\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** content of the popover */\n content: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n contentTestId?: string;\n /** popover footer */\n footer?: ReactNode;\n /** use as controlled component */\n openControlled?: { open: boolean; setOpen: (open: boolean) => void };\n /** placement of the popover relative to its trigger reference */\n placement?: NextPopoverProps['placement'];\n /** The container element in which the overlay portal will be placed. */\n portalContainer?: NextPopoverProps['portalContainer'];\n /** Whether to block scrolling outside the popover */\n shouldBlockScroll?: boolean;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** popover title */\n title?: ReactNode;\n}\n\n/**\n * Popover component based on [NextUI Card](https://nextui.org/docs/components/popover)\n */\nexport default ({\n children = null,\n className: _className = undefined,\n content,\n contentTestId = undefined,\n footer = undefined,\n openControlled = undefined,\n placement = 'top',\n portalContainer = undefined,\n shouldBlockScroll = undefined,\n testId = undefined,\n title = undefined,\n}: PopoverProps) => {\n // className from slots\n const variants = popoverVariants();\n const className = variantsToClassNames(variants, _className, 'trigger');\n\n return (\n <Popover\n classNames={className}\n placement={placement}\n portalContainer={portalContainer}\n radius=\"sm\"\n shouldBlockScroll={shouldBlockScroll}\n showArrow\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...(openControlled\n ? { isOpen: openControlled.open, onOpenChange: openControlled.setOpen }\n : {})}\n >\n <PopoverTrigger data-testid={testId}>\n {/* NOTE: type and aria properties are injected by PopoverTrigger */}\n {/* eslint-disable-next-line react/button-has-type */}\n <button>{children}</button>\n </PopoverTrigger>\n <PopoverContent data-testid={contentTestId}>\n {title && (\n <div className={className.header}>\n {title}\n <hr />\n </div>\n )}\n <ScrollShadow className={className.body}>{content}</ScrollShadow>\n {footer && (\n <div className={className.footer}>\n <hr />\n {footer}\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n};\n","import Popover from './Popover';\n\nexport type { PopoverProps } from './Popover';\n\nexport { Popover };\n\nexport default Popover;\n"]}
@@ -1,3 +1,7 @@
1
+ import {
2
+ __spreadValues
3
+ } from "./chunk-J7N2552D.js";
4
+
1
5
  // src/Accordion/Accordion.tsx
2
6
  import {
3
7
  Accordion as NextAccordion,
@@ -77,10 +81,9 @@ var Accordion = ({
77
81
  variant,
78
82
  children: accordionItems.map((item, index) => /* @__PURE__ */ jsx(
79
83
  NextAccordionItem,
80
- {
81
- isDisabled: disabled || item?.disabled,
82
- ...item
83
- },
84
+ __spreadValues({
85
+ isDisabled: disabled || (item == null ? void 0 : item.disabled)
86
+ }, item),
84
87
  index
85
88
  ))
86
89
  }
@@ -96,4 +99,4 @@ export {
96
99
  Accordion_default,
97
100
  Accordion_default2
98
101
  };
99
- //# sourceMappingURL=chunk-EIOL2HNA.js.map
102
+ //# sourceMappingURL=chunk-33DBA7U2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Accordion/Accordion.tsx","../src/Accordion/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { DividerProps } from '@nextui-org/divider';\nimport type { ReactNode } from 'react';\n\nimport {\n Accordion as NextAccordion,\n AccordionItem as NextAccordionItem,\n} from '@nextui-org/accordion';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\n// accordion styling variants\n// see: https://nextui.org/docs/components/accordion#accordion-item-slots\nexport const accordionVariants = tv({\n slots: {\n base: '',\n content: 'px-4',\n heading: 'px-4',\n indicator: '',\n startContent: '',\n subtitle: '',\n title: '',\n titleWrapper: '',\n trigger: '',\n // outer accordion wrapper\n wrapper: 'px-0',\n },\n variants: {\n indicatorLeft: {\n true: {\n content: 'pl-7',\n indicator: '-rotate-180 data-[open=true]:-rotate-90',\n trigger: 'flex-row-reverse',\n },\n },\n showDivider: {\n true: {\n wrapper: 'divide-y divide-solid divide-divider',\n },\n },\n showBottomTopDivider: {\n true: {\n wrapper: 'border-b border-t border-solid border-divider',\n },\n },\n },\n});\n\nexport interface AccordionItemProps {\n /** Content of the accordion item */\n children: ReactNode;\n /** Disables the accordion item */\n disabled?: boolean;\n /** Accordion item title */\n title: ReactNode;\n /** Accordion item subtitle */\n subtitle?: ReactNode;\n}\n\ntype VariantProps = TVProps<typeof accordionVariants>;\ntype ClassName = TVClassName<typeof accordionVariants>;\n\nexport interface AccordionProps extends VariantProps {\n /** Props for AccordionItems, will render the accordion items programmatically */\n accordionItems: AccordionItemProps[];\n /** CSS class name */\n className?: ClassName;\n /** Array of keys for the AccordionItem(s) to be expanded by default */\n defaultSelectedKeys?: undefined | 'all' | Iterable<number | string>;\n /** Disables the Accordion */\n disabled?: boolean;\n /** Array of keys for the AccordionItems to disable */\n disabledKeys?: Iterable<number | string>;\n /** Force always one AccordionItem to be open. */\n disallowEmptySelection?: boolean;\n /** props for styling the Divider */\n dividerProps?: DividerProps;\n /** Hide the expanded/collapsed indicator icon */\n hideIndicator?: boolean;\n /** Callback function for when a Accordion Item is expanded or collapsed */\n onSelectionChange?: (keys: 'all' | Iterable<number | string>) => unknown;\n /** Selected keys (controlled) */\n selectedKeys?: undefined | 'all' | Iterable<number | string>;\n /** Set whether multiple or only a single AccordionItems can be expanded */\n selectionMode?: 'single' | 'multiple';\n /** Enable or disable the divider between each AccordionItem */\n showDivider?: boolean;\n /** Style variant of the Accordion */\n variant?: 'light' | 'shadow' | 'bordered' | 'splitted';\n}\n\n/**\n * Accordion component based on [NextUI Accordion](https://nextui.org/docs/components/accordion)\n */\nconst Accordion = ({\n accordionItems,\n className: _className = undefined,\n defaultSelectedKeys = [],\n disabled = false,\n disabledKeys = [],\n disallowEmptySelection = false,\n dividerProps = {},\n indicatorLeft = false,\n onSelectionChange = undefined,\n selectedKeys = undefined,\n selectionMode = 'multiple',\n showDivider = true,\n variant = 'light',\n}: AccordionProps) => {\n // itemClasses from className slots\n const variants = accordionVariants({\n indicatorLeft,\n showDivider: showDivider && variant !== 'splitted',\n showBottomTopDivider: showDivider && variant === 'light',\n });\n const classNames = variantsToClassNames(variants, _className, 'wrapper');\n\n return (\n <NextAccordion\n className={classNames.wrapper}\n defaultSelectedKeys={defaultSelectedKeys}\n disabledKeys={disabledKeys}\n disallowEmptySelection={disallowEmptySelection}\n dividerProps={dividerProps}\n isDisabled={disabled}\n itemClasses={classNames}\n onSelectionChange={onSelectionChange}\n selectedKeys={selectedKeys}\n selectionMode={selectionMode}\n showDivider={false}\n variant={variant}\n >\n {accordionItems.map((item, index) => (\n <NextAccordionItem\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n isDisabled={disabled || item?.disabled}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...item}\n />\n ))}\n </NextAccordion>\n );\n};\n\nexport default Accordion;\n","import Accordion, { accordionVariants } from './Accordion';\n\nexport type { AccordionProps, AccordionItemProps } from './Accordion';\n\nexport { Accordion, accordionVariants };\n\nexport default Accordion;\n"],"mappings":";AAIA;AAAA,EACE,aAAa;AAAA,EACb,iBAAiB;AAAA,OACZ;AAEP,SAAS,IAAI,4BAA4B;AA4HjC;AAxHD,IAAM,oBAAoB,GAAG;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,OAAO;AAAA,IACP,cAAc;AAAA,IACd,SAAS;AAAA;AAAA,IAET,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,MACb,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,QACJ,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,sBAAsB;AAAA,MACpB,MAAM;AAAA,QACJ,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAgDD,IAAM,YAAY,CAAC;AAAA,EACjB;AAAA,EACA,WAAW,aAAa;AAAA,EACxB,sBAAsB,CAAC;AAAA,EACvB,WAAW;AAAA,EACX,eAAe,CAAC;AAAA,EAChB,yBAAyB;AAAA,EACzB,eAAe,CAAC;AAAA,EAChB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,UAAU;AACZ,MAAsB;AAEpB,QAAM,WAAW,kBAAkB;AAAA,IACjC;AAAA,IACA,aAAa,eAAe,YAAY;AAAA,IACxC,sBAAsB,eAAe,YAAY;AAAA,EACnD,CAAC;AACD,QAAM,aAAa,qBAAqB,UAAU,YAAY,SAAS;AAEvE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,WAAW;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MAEC,yBAAe,IAAI,CAAC,MAAM,UACzB;AAAA,QAAC;AAAA;AAAA,UAGC,YAAY,YAAY,MAAM;AAAA,UAE7B,GAAG;AAAA;AAAA,QAHC;AAAA,MAIP,CACD;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,oBAAQ;;;AC3If,IAAOA,qBAAQ;","names":["Accordion_default"]}
1
+ {"version":3,"sources":["../src/Accordion/Accordion.tsx","../src/Accordion/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { DividerProps } from '@nextui-org/divider';\nimport type { ReactNode } from 'react';\n\nimport {\n Accordion as NextAccordion,\n AccordionItem as NextAccordionItem,\n} from '@nextui-org/accordion';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\n// accordion styling variants\n// see: https://nextui.org/docs/components/accordion#accordion-item-slots\nexport const accordionVariants = tv({\n slots: {\n base: '',\n content: 'px-4',\n heading: 'px-4',\n indicator: '',\n startContent: '',\n subtitle: '',\n title: '',\n titleWrapper: '',\n trigger: '',\n // outer accordion wrapper\n wrapper: 'px-0',\n },\n variants: {\n indicatorLeft: {\n true: {\n content: 'pl-7',\n indicator: '-rotate-180 data-[open=true]:-rotate-90',\n trigger: 'flex-row-reverse',\n },\n },\n showDivider: {\n true: {\n wrapper: 'divide-y divide-solid divide-divider',\n },\n },\n showBottomTopDivider: {\n true: {\n wrapper: 'border-b border-t border-solid border-divider',\n },\n },\n },\n});\n\nexport interface AccordionItemProps {\n /** Content of the accordion item */\n children: ReactNode;\n /** Disables the accordion item */\n disabled?: boolean;\n /** Accordion item title */\n title: ReactNode;\n /** Accordion item subtitle */\n subtitle?: ReactNode;\n}\n\ntype VariantProps = TVProps<typeof accordionVariants>;\ntype ClassName = TVClassName<typeof accordionVariants>;\n\nexport interface AccordionProps extends VariantProps {\n /** Props for AccordionItems, will render the accordion items programmatically */\n accordionItems: AccordionItemProps[];\n /** CSS class name */\n className?: ClassName;\n /** Array of keys for the AccordionItem(s) to be expanded by default */\n defaultSelectedKeys?: undefined | 'all' | Iterable<number | string>;\n /** Disables the Accordion */\n disabled?: boolean;\n /** Array of keys for the AccordionItems to disable */\n disabledKeys?: Iterable<number | string>;\n /** Force always one AccordionItem to be open. */\n disallowEmptySelection?: boolean;\n /** props for styling the Divider */\n dividerProps?: DividerProps;\n /** Hide the expanded/collapsed indicator icon */\n hideIndicator?: boolean;\n /** Callback function for when a Accordion Item is expanded or collapsed */\n onSelectionChange?: (keys: 'all' | Iterable<number | string>) => unknown;\n /** Selected keys (controlled) */\n selectedKeys?: undefined | 'all' | Iterable<number | string>;\n /** Set whether multiple or only a single AccordionItems can be expanded */\n selectionMode?: 'single' | 'multiple';\n /** Enable or disable the divider between each AccordionItem */\n showDivider?: boolean;\n /** Style variant of the Accordion */\n variant?: 'light' | 'shadow' | 'bordered' | 'splitted';\n}\n\n/**\n * Accordion component based on [NextUI Accordion](https://nextui.org/docs/components/accordion)\n */\nconst Accordion = ({\n accordionItems,\n className: _className = undefined,\n defaultSelectedKeys = [],\n disabled = false,\n disabledKeys = [],\n disallowEmptySelection = false,\n dividerProps = {},\n indicatorLeft = false,\n onSelectionChange = undefined,\n selectedKeys = undefined,\n selectionMode = 'multiple',\n showDivider = true,\n variant = 'light',\n}: AccordionProps) => {\n // itemClasses from className slots\n const variants = accordionVariants({\n indicatorLeft,\n showDivider: showDivider && variant !== 'splitted',\n showBottomTopDivider: showDivider && variant === 'light',\n });\n const classNames = variantsToClassNames(variants, _className, 'wrapper');\n\n return (\n <NextAccordion\n className={classNames.wrapper}\n defaultSelectedKeys={defaultSelectedKeys}\n disabledKeys={disabledKeys}\n disallowEmptySelection={disallowEmptySelection}\n dividerProps={dividerProps}\n isDisabled={disabled}\n itemClasses={classNames}\n onSelectionChange={onSelectionChange}\n selectedKeys={selectedKeys}\n selectionMode={selectionMode}\n showDivider={false}\n variant={variant}\n >\n {accordionItems.map((item, index) => (\n <NextAccordionItem\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n isDisabled={disabled || item?.disabled}\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...item}\n />\n ))}\n </NextAccordion>\n );\n};\n\nexport default Accordion;\n","import Accordion, { accordionVariants } from './Accordion';\n\nexport type { AccordionProps, AccordionItemProps } from './Accordion';\n\nexport { Accordion, accordionVariants };\n\nexport default Accordion;\n"],"mappings":";;;;;AAIA;AAAA,EACE,aAAa;AAAA,EACb,iBAAiB;AAAA,OACZ;AAEP,SAAS,IAAI,4BAA4B;AA4HjC;AAxHD,IAAM,oBAAoB,GAAG;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,SAAS;AAAA,IACT,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU;AAAA,IACV,OAAO;AAAA,IACP,cAAc;AAAA,IACd,SAAS;AAAA;AAAA,IAET,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,MACb,MAAM;AAAA,QACJ,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,aAAa;AAAA,MACX,MAAM;AAAA,QACJ,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,sBAAsB;AAAA,MACpB,MAAM;AAAA,QACJ,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAgDD,IAAM,YAAY,CAAC;AAAA,EACjB;AAAA,EACA,WAAW,aAAa;AAAA,EACxB,sBAAsB,CAAC;AAAA,EACvB,WAAW;AAAA,EACX,eAAe,CAAC;AAAA,EAChB,yBAAyB;AAAA,EACzB,eAAe,CAAC;AAAA,EAChB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,UAAU;AACZ,MAAsB;AAEpB,QAAM,WAAW,kBAAkB;AAAA,IACjC;AAAA,IACA,aAAa,eAAe,YAAY;AAAA,IACxC,sBAAsB,eAAe,YAAY;AAAA,EACnD,CAAC;AACD,QAAM,aAAa,qBAAqB,UAAU,YAAY,SAAS;AAEvE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,WAAW;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,MAEC,yBAAe,IAAI,CAAC,MAAM,UACzB;AAAA,QAAC;AAAA;AAAA,UAGC,YAAY,aAAY,6BAAM;AAAA,WAE1B;AAAA,QAHC;AAAA,MAIP,CACD;AAAA;AAAA,EACH;AAEJ;AAEA,IAAO,oBAAQ;;;AC3If,IAAOA,qBAAQ;","names":["Accordion_default"]}
@@ -1,6 +1,10 @@
1
1
  import {
2
2
  ScrollShadow_default
3
3
  } from "./chunk-BUWMLU3E.js";
4
+ import {
5
+ __spreadProps,
6
+ __spreadValues
7
+ } from "./chunk-J7N2552D.js";
4
8
 
5
9
  // src/Popover/Popover.tsx
6
10
  import { Popover, PopoverContent, PopoverTrigger } from "@nextui-org/popover";
@@ -32,14 +36,14 @@ var Popover_default = ({
32
36
  const className = variantsToClassNames(variants, _className, "trigger");
33
37
  return /* @__PURE__ */ jsxs(
34
38
  Popover,
35
- {
39
+ __spreadProps(__spreadValues({
36
40
  classNames: className,
37
41
  placement,
38
42
  portalContainer,
39
43
  radius: "sm",
40
44
  shouldBlockScroll,
41
- showArrow: true,
42
- ...openControlled ? { isOpen: openControlled.open, onOpenChange: openControlled.setOpen } : {},
45
+ showArrow: true
46
+ }, openControlled ? { isOpen: openControlled.open, onOpenChange: openControlled.setOpen } : {}), {
43
47
  children: [
44
48
  /* @__PURE__ */ jsx(PopoverTrigger, { "data-testid": testId, children: /* @__PURE__ */ jsx("button", { children }) }),
45
49
  /* @__PURE__ */ jsxs(PopoverContent, { "data-testid": contentTestId, children: [
@@ -54,7 +58,7 @@ var Popover_default = ({
54
58
  ] })
55
59
  ] })
56
60
  ]
57
- }
61
+ })
58
62
  );
59
63
  };
60
64
 
@@ -65,4 +69,4 @@ export {
65
69
  Popover_default,
66
70
  Popover_default2
67
71
  };
68
- //# sourceMappingURL=chunk-JDLU5AUA.js.map
72
+ //# sourceMappingURL=chunk-3QI2ODV2.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Popover/Popover.tsx","../src/Popover/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { PopoverProps as NextPopoverProps } from '@nextui-org/popover';\nimport type { ReactNode } from 'react';\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@nextui-org/popover';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport ScrollShadow from '../ScrollShadow/ScrollShadow';\n\n// popover styling variants\nexport const popoverVariants = tv({\n slots: {\n body: 'w-full px-2.5 py-1',\n content: 'flex max-h-[80vh] flex-col p-0',\n footer: 'w-full px-2.5 py-1',\n header: 'w-full px-2.5 py-1',\n trigger: '',\n },\n});\n\ntype VariantProps = TVProps<typeof popoverVariants>;\ntype ClassName = TVClassName<typeof popoverVariants>;\n\nexport interface PopoverProps extends VariantProps {\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** content of the popover */\n content: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n contentTestId?: string;\n /** popover footer */\n footer?: ReactNode;\n /** use as controlled component */\n openControlled?: { open: boolean; setOpen: (open: boolean) => void };\n /** placement of the popover relative to its trigger reference */\n placement?: NextPopoverProps['placement'];\n /** The container element in which the overlay portal will be placed. */\n portalContainer?: NextPopoverProps['portalContainer'];\n /** Whether to block scrolling outside the popover */\n shouldBlockScroll?: boolean;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** popover title */\n title?: ReactNode;\n}\n\n/**\n * Popover component based on [NextUI Card](https://nextui.org/docs/components/popover)\n */\nexport default ({\n children = null,\n className: _className = undefined,\n content,\n contentTestId = undefined,\n footer = undefined,\n openControlled = undefined,\n placement = 'top',\n portalContainer = undefined,\n shouldBlockScroll = undefined,\n testId = undefined,\n title = undefined,\n}: PopoverProps) => {\n // className from slots\n const variants = popoverVariants();\n const className = variantsToClassNames(variants, _className, 'trigger');\n\n return (\n <Popover\n classNames={className}\n placement={placement}\n portalContainer={portalContainer}\n radius=\"sm\"\n shouldBlockScroll={shouldBlockScroll}\n showArrow\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...(openControlled\n ? { isOpen: openControlled.open, onOpenChange: openControlled.setOpen }\n : {})}\n >\n <PopoverTrigger data-testid={testId}>\n {/* NOTE: type and aria properties are injected by PopoverTrigger */}\n {/* eslint-disable-next-line react/button-has-type */}\n <button>{children}</button>\n </PopoverTrigger>\n <PopoverContent data-testid={contentTestId}>\n {title && (\n <div className={className.header}>\n {title}\n <hr />\n </div>\n )}\n <ScrollShadow className={className.body}>{content}</ScrollShadow>\n {footer && (\n <div className={className.footer}>\n <hr />\n {footer}\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n};\n","import Popover from './Popover';\n\nexport type { PopoverProps } from './Popover';\n\nexport { Popover };\n\nexport default Popover;\n"],"mappings":";;;;;AAIA,SAAS,SAAS,gBAAgB,sBAAsB;AAExD,SAAS,IAAI,4BAA4B;AA+EjC,cAIE,YAJF;AA1ED,IAAM,kBAAkB,GAAG;AAAA,EAChC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF,CAAC;AAiCD,IAAO,kBAAQ,CAAC;AAAA,EACd,WAAW;AAAA,EACX,WAAW,aAAa;AAAA,EACxB;AAAA,EACA,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,QAAQ;AACV,MAAoB;AAElB,QAAM,WAAW,gBAAgB;AACjC,QAAM,YAAY,qBAAqB,UAAU,YAAY,SAAS;AAEtE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,QAAO;AAAA,MACP;AAAA,MACA,WAAS;AAAA,MAER,GAAI,iBACD,EAAE,QAAQ,eAAe,MAAM,cAAc,eAAe,QAAQ,IACpE,CAAC;AAAA,MAEL;AAAA,4BAAC,kBAAe,eAAa,QAG3B,8BAAC,YAAQ,UAAS,GACpB;AAAA,QACA,qBAAC,kBAAe,eAAa,eAC1B;AAAA,mBACC,qBAAC,SAAI,WAAW,UAAU,QACvB;AAAA;AAAA,YACD,oBAAC,QAAG;AAAA,aACN;AAAA,UAEF,oBAAC,wBAAa,WAAW,UAAU,MAAO,mBAAQ;AAAA,UACjD,UACC,qBAAC,SAAI,WAAW,UAAU,QACxB;AAAA,gCAAC,QAAG;AAAA,YACH;AAAA,aACH;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;AClGA,IAAOA,mBAAQ;","names":["Popover_default"]}
1
+ {"version":3,"sources":["../src/Popover/Popover.tsx","../src/Popover/index.ts"],"sourcesContent":["import type { TVClassName, TVProps } from '@fuf-stack/pixel-utils';\nimport type { PopoverProps as NextPopoverProps } from '@nextui-org/popover';\nimport type { ReactNode } from 'react';\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@nextui-org/popover';\n\nimport { tv, variantsToClassNames } from '@fuf-stack/pixel-utils';\n\nimport ScrollShadow from '../ScrollShadow/ScrollShadow';\n\n// popover styling variants\nexport const popoverVariants = tv({\n slots: {\n body: 'w-full px-2.5 py-1',\n content: 'flex max-h-[80vh] flex-col p-0',\n footer: 'w-full px-2.5 py-1',\n header: 'w-full px-2.5 py-1',\n trigger: '',\n },\n});\n\ntype VariantProps = TVProps<typeof popoverVariants>;\ntype ClassName = TVClassName<typeof popoverVariants>;\n\nexport interface PopoverProps extends VariantProps {\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: ClassName;\n /** content of the popover */\n content: ReactNode;\n /** HTML data-testid attribute used in e2e tests */\n contentTestId?: string;\n /** popover footer */\n footer?: ReactNode;\n /** use as controlled component */\n openControlled?: { open: boolean; setOpen: (open: boolean) => void };\n /** placement of the popover relative to its trigger reference */\n placement?: NextPopoverProps['placement'];\n /** The container element in which the overlay portal will be placed. */\n portalContainer?: NextPopoverProps['portalContainer'];\n /** Whether to block scrolling outside the popover */\n shouldBlockScroll?: boolean;\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** popover title */\n title?: ReactNode;\n}\n\n/**\n * Popover component based on [NextUI Card](https://nextui.org/docs/components/popover)\n */\nexport default ({\n children = null,\n className: _className = undefined,\n content,\n contentTestId = undefined,\n footer = undefined,\n openControlled = undefined,\n placement = 'top',\n portalContainer = undefined,\n shouldBlockScroll = undefined,\n testId = undefined,\n title = undefined,\n}: PopoverProps) => {\n // className from slots\n const variants = popoverVariants();\n const className = variantsToClassNames(variants, _className, 'trigger');\n\n return (\n <Popover\n classNames={className}\n placement={placement}\n portalContainer={portalContainer}\n radius=\"sm\"\n shouldBlockScroll={shouldBlockScroll}\n showArrow\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...(openControlled\n ? { isOpen: openControlled.open, onOpenChange: openControlled.setOpen }\n : {})}\n >\n <PopoverTrigger data-testid={testId}>\n {/* NOTE: type and aria properties are injected by PopoverTrigger */}\n {/* eslint-disable-next-line react/button-has-type */}\n <button>{children}</button>\n </PopoverTrigger>\n <PopoverContent data-testid={contentTestId}>\n {title && (\n <div className={className.header}>\n {title}\n <hr />\n </div>\n )}\n <ScrollShadow className={className.body}>{content}</ScrollShadow>\n {footer && (\n <div className={className.footer}>\n <hr />\n {footer}\n </div>\n )}\n </PopoverContent>\n </Popover>\n );\n};\n","import Popover from './Popover';\n\nexport type { PopoverProps } from './Popover';\n\nexport { Popover };\n\nexport default Popover;\n"],"mappings":";;;;;;;;;AAIA,SAAS,SAAS,gBAAgB,sBAAsB;AAExD,SAAS,IAAI,4BAA4B;AA+EjC,cAIE,YAJF;AA1ED,IAAM,kBAAkB,GAAG;AAAA,EAChC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF,CAAC;AAiCD,IAAO,kBAAQ,CAAC;AAAA,EACd,WAAW;AAAA,EACX,WAAW,aAAa;AAAA,EACxB;AAAA,EACA,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,SAAS;AAAA,EACT,QAAQ;AACV,MAAoB;AAElB,QAAM,WAAW,gBAAgB;AACjC,QAAM,YAAY,qBAAqB,UAAU,YAAY,SAAS;AAEtE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,YAAY;AAAA,MACZ;AAAA,MACA;AAAA,MACA,QAAO;AAAA,MACP;AAAA,MACA,WAAS;AAAA,OAEJ,iBACD,EAAE,QAAQ,eAAe,MAAM,cAAc,eAAe,QAAQ,IACpE,CAAC,IAVN;AAAA,MAYC;AAAA,4BAAC,kBAAe,eAAa,QAG3B,8BAAC,YAAQ,UAAS,GACpB;AAAA,QACA,qBAAC,kBAAe,eAAa,eAC1B;AAAA,mBACC,qBAAC,SAAI,WAAW,UAAU,QACvB;AAAA;AAAA,YACD,oBAAC,QAAG;AAAA,aACN;AAAA,UAEF,oBAAC,wBAAa,WAAW,UAAU,MAAO,mBAAQ;AAAA,UACjD,UACC,qBAAC,SAAI,WAAW,UAAU,QACxB;AAAA,gCAAC,QAAG;AAAA,YACH;AAAA,aACH;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;;;AClGA,IAAOA,mBAAQ;","names":["Popover_default"]}
@@ -11,7 +11,7 @@ import {
11
11
  import { cn } from "@fuf-stack/pixel-utils";
12
12
  import { jsx, jsxs } from "react/jsx-runtime";
13
13
  var getDisabledKeys = (items) => {
14
- return items.map((item) => typeof item?.items === "undefined" ? item : item.items).flat().filter((item) => {
14
+ return items.map((item) => typeof (item == null ? void 0 : item.items) === "undefined" ? item : item.items).flat().filter((item) => {
15
15
  return Object.hasOwn(item, "disabled") && item.disabled === true;
16
16
  }).map((item) => item.key);
17
17
  };
@@ -78,4 +78,4 @@ export {
78
78
  Menu_default,
79
79
  Menu_default2
80
80
  };
81
- //# sourceMappingURL=chunk-L2RCVUXK.js.map
81
+ //# sourceMappingURL=chunk-7LABJBKF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Menu/Menu.tsx","../src/Menu/index.ts"],"sourcesContent":["import type { DropdownSectionProps } from '@nextui-org/dropdown';\nimport type { Key, MouseEventHandler, ReactNode } from 'react';\n\nimport { FaEllipsisVertical } from 'react-icons/fa6';\n\nimport { Button } from '@nextui-org/button';\nimport {\n Dropdown as NextDropdown,\n DropdownItem as NextDropdownItem,\n DropdownMenu as NextDropdownMenu,\n DropdownSection as NextDropdownSection,\n DropdownTrigger as NextDropdownTrigger,\n} from '@nextui-org/dropdown';\n\nimport { cn } 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?: MouseEventHandler<HTMLLIElement>;\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\nexport interface MenuProps {\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: string | string[];\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** menu item structure */\n items: (MenuSection | MenuItem)[];\n /** disable menu trigger */\n isDisabled?: boolean;\n /** called if item is selected */\n onAction?: (key: Key) => void;\n}\n\n/** returns String[] of disabled items/keys */\nconst getDisabledKeys = (items: (MenuSection | MenuItem)[]) => {\n return (\n items\n // @ts-expect-error typing issue with MenuSection | MenuItem\n .map((item) => (typeof item?.items === 'undefined' ? item : item.items))\n .flat<MenuItem[]>()\n .filter((item) => {\n return Object.hasOwn(item, 'disabled') && item.disabled === true;\n })\n .map((item) => item.key)\n );\n};\n\nconst renderMenuItem = (item: MenuItem) => (\n <NextDropdownItem\n className={item.className}\n data-testid={item.testId || item.key}\n description={item.description}\n key={item.key}\n onClick={item.onClick}\n startContent={item.icon}\n >\n {item.label}\n </NextDropdownItem>\n);\n\n/**\n * Dropdown menu component based on [NextUI Dropdown](https://nextui.org/docs/components/dropdown)\n */\nconst Menu = ({\n children = null,\n className = undefined,\n onAction = undefined,\n testId = undefined,\n isDisabled = false,\n items,\n}: MenuProps) => {\n return (\n <NextDropdown isDisabled={isDisabled}>\n <NextDropdownTrigger className={cn(className)} data-testid={testId}>\n {children ? (\n // eslint-disable-next-line react/button-has-type\n <button>{children}</button>\n ) : (\n // INFO: we use next button here so that ref passing works\n <Button size=\"sm\" variant=\"flat\" className=\"min-w-0\">\n <FaEllipsisVertical />\n </Button>\n )}\n </NextDropdownTrigger>\n <NextDropdownMenu\n // aria-label=\"Dynamic Actions\"\n items={items}\n disabledKeys={getDisabledKeys(items)}\n onAction={onAction}\n >\n {(item) => {\n if ('items' in item) {\n return (\n <NextDropdownSection\n items={item.items as MenuSection['items']}\n title={item.label as DropdownSectionProps['title']}\n key={item.key}\n >\n {(sectionItem) => {\n return renderMenuItem(sectionItem);\n }}\n </NextDropdownSection>\n );\n }\n return renderMenuItem(item);\n }}\n </NextDropdownMenu>\n </NextDropdown>\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":";AAGA,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,UAAU;AAkEjB,cAwBE,YAxBF;AAdF,IAAM,kBAAkB,CAAC,UAAsC;AAC7D,SACE,MAEG,IAAI,CAAC,SAAU,OAAO,MAAM,UAAU,cAAc,OAAO,KAAK,KAAM,EACtE,KAAiB,EACjB,OAAO,CAAC,SAAS;AAChB,WAAO,OAAO,OAAO,MAAM,UAAU,KAAK,KAAK,aAAa;AAAA,EAC9D,CAAC,EACA,IAAI,CAAC,SAAS,KAAK,GAAG;AAE7B;AAEA,IAAM,iBAAiB,CAAC,SACtB;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,KAAK;AAAA,IAChB,eAAa,KAAK,UAAU,KAAK;AAAA,IACjC,aAAa,KAAK;AAAA,IAElB,SAAS,KAAK;AAAA,IACd,cAAc,KAAK;AAAA,IAElB,eAAK;AAAA;AAAA,EAJD,KAAK;AAKZ;AAMF,IAAM,OAAO,CAAC;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,aAAa;AAAA,EACb;AACF,MAAiB;AACf,SACE,qBAAC,gBAAa,YACZ;AAAA,wBAAC,uBAAoB,WAAW,GAAG,SAAS,GAAG,eAAa,QACzD;AAAA;AAAA,MAEC,oBAAC,YAAQ,UAAS;AAAA;AAAA;AAAA,MAGlB,oBAAC,UAAO,MAAK,MAAK,SAAQ,QAAO,WAAU,WACzC,8BAAC,sBAAmB,GACtB;AAAA,OAEJ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA,cAAc,gBAAgB,KAAK;AAAA,QACnC;AAAA,QAEC,WAAC,SAAS;AACT,cAAI,WAAW,MAAM;AACnB,mBACE;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,KAAK;AAAA,gBACZ,OAAO,KAAK;AAAA,gBAGX,WAAC,gBAAgB;AAChB,yBAAO,eAAe,WAAW;AAAA,gBACnC;AAAA;AAAA,cAJK,KAAK;AAAA,YAKZ;AAAA,UAEJ;AACA,iBAAO,eAAe,IAAI;AAAA,QAC5B;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,IAAO,eAAQ;;;ACzIf,IAAOA,gBAAQ;","names":["Menu_default"]}
1
+ {"version":3,"sources":["../src/Menu/Menu.tsx","../src/Menu/index.ts"],"sourcesContent":["import type { DropdownSectionProps } from '@nextui-org/dropdown';\nimport type { Key, MouseEventHandler, ReactNode } from 'react';\n\nimport { FaEllipsisVertical } from 'react-icons/fa6';\n\nimport { Button } from '@nextui-org/button';\nimport {\n Dropdown as NextDropdown,\n DropdownItem as NextDropdownItem,\n DropdownMenu as NextDropdownMenu,\n DropdownSection as NextDropdownSection,\n DropdownTrigger as NextDropdownTrigger,\n} from '@nextui-org/dropdown';\n\nimport { cn } 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?: MouseEventHandler<HTMLLIElement>;\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\nexport interface MenuProps {\n /** child components */\n children?: ReactNode;\n /** CSS class name */\n className?: string | string[];\n /** HTML data-testid attribute used in e2e tests */\n testId?: string;\n /** menu item structure */\n items: (MenuSection | MenuItem)[];\n /** disable menu trigger */\n isDisabled?: boolean;\n /** called if item is selected */\n onAction?: (key: Key) => void;\n}\n\n/** returns String[] of disabled items/keys */\nconst getDisabledKeys = (items: (MenuSection | MenuItem)[]) => {\n return (\n items\n // @ts-expect-error typing issue with MenuSection | MenuItem\n .map((item) => (typeof item?.items === 'undefined' ? item : item.items))\n .flat<MenuItem[]>()\n .filter((item) => {\n return Object.hasOwn(item, 'disabled') && item.disabled === true;\n })\n .map((item) => item.key)\n );\n};\n\nconst renderMenuItem = (item: MenuItem) => (\n <NextDropdownItem\n className={item.className}\n data-testid={item.testId || item.key}\n description={item.description}\n key={item.key}\n onClick={item.onClick}\n startContent={item.icon}\n >\n {item.label}\n </NextDropdownItem>\n);\n\n/**\n * Dropdown menu component based on [NextUI Dropdown](https://nextui.org/docs/components/dropdown)\n */\nconst Menu = ({\n children = null,\n className = undefined,\n onAction = undefined,\n testId = undefined,\n isDisabled = false,\n items,\n}: MenuProps) => {\n return (\n <NextDropdown isDisabled={isDisabled}>\n <NextDropdownTrigger className={cn(className)} data-testid={testId}>\n {children ? (\n // eslint-disable-next-line react/button-has-type\n <button>{children}</button>\n ) : (\n // INFO: we use next button here so that ref passing works\n <Button size=\"sm\" variant=\"flat\" className=\"min-w-0\">\n <FaEllipsisVertical />\n </Button>\n )}\n </NextDropdownTrigger>\n <NextDropdownMenu\n // aria-label=\"Dynamic Actions\"\n items={items}\n disabledKeys={getDisabledKeys(items)}\n onAction={onAction}\n >\n {(item) => {\n if ('items' in item) {\n return (\n <NextDropdownSection\n items={item.items as MenuSection['items']}\n title={item.label as DropdownSectionProps['title']}\n key={item.key}\n >\n {(sectionItem) => {\n return renderMenuItem(sectionItem);\n }}\n </NextDropdownSection>\n );\n }\n return renderMenuItem(item);\n }}\n </NextDropdownMenu>\n </NextDropdown>\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":";AAGA,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,UAAU;AAkEjB,cAwBE,YAxBF;AAdF,IAAM,kBAAkB,CAAC,UAAsC;AAC7D,SACE,MAEG,IAAI,CAAC,SAAU,QAAO,6BAAM,WAAU,cAAc,OAAO,KAAK,KAAM,EACtE,KAAiB,EACjB,OAAO,CAAC,SAAS;AAChB,WAAO,OAAO,OAAO,MAAM,UAAU,KAAK,KAAK,aAAa;AAAA,EAC9D,CAAC,EACA,IAAI,CAAC,SAAS,KAAK,GAAG;AAE7B;AAEA,IAAM,iBAAiB,CAAC,SACtB;AAAA,EAAC;AAAA;AAAA,IACC,WAAW,KAAK;AAAA,IAChB,eAAa,KAAK,UAAU,KAAK;AAAA,IACjC,aAAa,KAAK;AAAA,IAElB,SAAS,KAAK;AAAA,IACd,cAAc,KAAK;AAAA,IAElB,eAAK;AAAA;AAAA,EAJD,KAAK;AAKZ;AAMF,IAAM,OAAO,CAAC;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,aAAa;AAAA,EACb;AACF,MAAiB;AACf,SACE,qBAAC,gBAAa,YACZ;AAAA,wBAAC,uBAAoB,WAAW,GAAG,SAAS,GAAG,eAAa,QACzD;AAAA;AAAA,MAEC,oBAAC,YAAQ,UAAS;AAAA;AAAA;AAAA,MAGlB,oBAAC,UAAO,MAAK,MAAK,SAAQ,QAAO,WAAU,WACzC,8BAAC,sBAAmB,GACtB;AAAA,OAEJ;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QAEC;AAAA,QACA,cAAc,gBAAgB,KAAK;AAAA,QACnC;AAAA,QAEC,WAAC,SAAS;AACT,cAAI,WAAW,MAAM;AACnB,mBACE;AAAA,cAAC;AAAA;AAAA,gBACC,OAAO,KAAK;AAAA,gBACZ,OAAO,KAAK;AAAA,gBAGX,WAAC,gBAAgB;AAChB,yBAAO,eAAe,WAAW;AAAA,gBACnC;AAAA;AAAA,cAJK,KAAK;AAAA,YAKZ;AAAA,UAEJ;AACA,iBAAO,eAAe,IAAI;AAAA,QAC5B;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEA,IAAO,eAAQ;;;ACzIf,IAAOA,gBAAQ;","names":["Menu_default"]}