@frontify/fondue 12.0.0-beta.165 → 12.0.0-beta.166
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Accordion/Accordion.es.js +80 -72
- package/dist/components/Accordion/Accordion.es.js.map +1 -1
- package/dist/components/Accordion/AccordionHeader.d.ts +2 -1
- package/dist/components/Accordion/AccordionHeader.es.js +27 -28
- package/dist/components/Accordion/AccordionHeader.es.js.map +1 -1
- package/dist/components/Accordion/AccordionHeaderIcon.d.ts +2 -1
- package/dist/components/Accordion/AccordionHeaderIcon.es.js +29 -10
- package/dist/components/Accordion/AccordionHeaderIcon.es.js.map +1 -1
- package/dist/components/Accordion/types.d.ts +7 -21
- package/dist/components/LinkChooser/utils/helpers.d.ts +2 -2
- package/dist/index.cjs.js +30 -30
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +516 -516
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +31 -31
- package/dist/index.umd.js.map +1 -1
- package/package.json +3 -2
- package/dist/components/Accordion/types.es.js +0 -5
- package/dist/components/Accordion/types.es.js.map +0 -1
|
@@ -1,112 +1,120 @@
|
|
|
1
|
-
import { useAccordion as
|
|
2
|
-
import { useFocusRing as
|
|
3
|
-
import { mergeProps as
|
|
4
|
-
import { Item as
|
|
5
|
-
import { useTreeState as
|
|
6
|
-
import { FOCUS_STYLE_INSET as
|
|
7
|
-
import { merge as
|
|
8
|
-
import
|
|
9
|
-
import { AccordionHeader as
|
|
10
|
-
import { CollapsibleWrap as
|
|
11
|
-
const
|
|
1
|
+
import { useAccordion as N, useAccordionItem as P } from "@react-aria/accordion";
|
|
2
|
+
import { useFocusRing as R } from "@react-aria/focus";
|
|
3
|
+
import { mergeProps as x } from "@react-aria/utils";
|
|
4
|
+
import { Item as T } from "@react-stately/collections";
|
|
5
|
+
import { useTreeState as F } from "@react-stately/tree";
|
|
6
|
+
import { FOCUS_STYLE_INSET as O } from "../../utilities/focusStyle.es.js";
|
|
7
|
+
import { merge as k } from "../../utilities/merge.es.js";
|
|
8
|
+
import d, { useRef as w, Children as u, useEffect as L, isValidElement as C } from "react";
|
|
9
|
+
import { AccordionHeader as U } from "./AccordionHeader.es.js";
|
|
10
|
+
import { CollapsibleWrap as _ } from "../CollapsibleWrap/CollapsibleWrap.es.js";
|
|
11
|
+
const M = "fondue-accordion", I = "fondue-accordion-item", S = ({
|
|
12
12
|
item: e,
|
|
13
|
-
state:
|
|
14
|
-
header:
|
|
15
|
-
padding:
|
|
16
|
-
divider:
|
|
17
|
-
headerComponent:
|
|
13
|
+
state: r,
|
|
14
|
+
header: t,
|
|
15
|
+
padding: o = !0,
|
|
16
|
+
divider: c = !1,
|
|
17
|
+
headerComponent: n = U,
|
|
18
|
+
"data-test-id": i = I
|
|
18
19
|
}) => {
|
|
19
|
-
var
|
|
20
|
-
const {
|
|
21
|
-
return /* @__PURE__ */
|
|
20
|
+
var a, m;
|
|
21
|
+
const { active: s, ...f } = t, h = w(null), { buttonProps: p, regionProps: y } = P({ item: e }, r, h), A = r.expandedKeys.has(e.key), { isFocusVisible: E, focusProps: g } = R();
|
|
22
|
+
return /* @__PURE__ */ d.createElement(
|
|
22
23
|
"div",
|
|
23
24
|
{
|
|
24
25
|
key: e.key,
|
|
25
|
-
className:
|
|
26
|
+
className: k([E ? O : "", c && "tw-divide-y tw-divide-black-10"])
|
|
26
27
|
},
|
|
27
|
-
/* @__PURE__ */
|
|
28
|
+
/* @__PURE__ */ d.createElement(
|
|
28
29
|
"button",
|
|
29
30
|
{
|
|
30
|
-
...
|
|
31
|
-
"data-test-id":
|
|
32
|
-
ref:
|
|
33
|
-
onClick: (
|
|
34
|
-
|
|
31
|
+
...x(p, g),
|
|
32
|
+
"data-test-id": i,
|
|
33
|
+
ref: h,
|
|
34
|
+
onClick: (l) => {
|
|
35
|
+
t.onClick && t.onClick(), p.onClick && p.onClick(l);
|
|
35
36
|
},
|
|
36
|
-
onKeyUp: (
|
|
37
|
-
|
|
37
|
+
onKeyUp: (l) => {
|
|
38
|
+
t.onClick && l.key === "Enter" && t.onClick(), p.onKeyUp && p.onKeyUp(l);
|
|
38
39
|
},
|
|
39
40
|
className: "tw-w-full focus-visible:tw-outline-none"
|
|
40
41
|
},
|
|
41
|
-
/* @__PURE__ */
|
|
42
|
+
/* @__PURE__ */ d.createElement(n, { isOpen: A, ...f })
|
|
42
43
|
),
|
|
43
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ d.createElement(_, { isOpen: A, preventInitialAnimation: s }, /* @__PURE__ */ d.createElement("div", { ...y, className: k([o && "tw-px-8 tw-pb-6"]) }, (m = (a = e.props).children) == null ? void 0 : m.call(a)))
|
|
44
45
|
);
|
|
45
|
-
},
|
|
46
|
-
const
|
|
47
|
-
const { header:
|
|
48
|
-
return /* @__PURE__ */
|
|
49
|
-
}),
|
|
50
|
-
var
|
|
51
|
-
return
|
|
46
|
+
}, V = (e) => {
|
|
47
|
+
const r = u.map(e, (o, c) => {
|
|
48
|
+
const { header: n, children: i } = o.props;
|
|
49
|
+
return /* @__PURE__ */ d.createElement(T, { key: c, textValue: n.children }, i ? () => i : null);
|
|
50
|
+
}), t = r.map((o) => o.key).filter((o, c) => {
|
|
51
|
+
var n, i;
|
|
52
|
+
return o && !!((i = (n = e[c]) == null ? void 0 : n.props.header) != null && i.active);
|
|
52
53
|
}) || [];
|
|
53
|
-
return { children:
|
|
54
|
-
},
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
var
|
|
58
|
-
const
|
|
59
|
-
return ((
|
|
60
|
-
},
|
|
61
|
-
const { divider:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}, [
|
|
54
|
+
return { children: r, defaultExpandedKeys: t };
|
|
55
|
+
}, W = ({ children: e }) => u.toArray(e).reduce((r, t) => C(t) && !t.props.header ? (console.warn("Use `AccordionItem` as children of `Accordion` and set the `header` prop accordingly."), r) : (C(t) && r.push(t), r), []), H = ({ children: e }) => /* @__PURE__ */ d.createElement(d.Fragment, null, e);
|
|
56
|
+
H.displayName = "FondueAccordionItem";
|
|
57
|
+
const Y = (e) => {
|
|
58
|
+
var t, o, c;
|
|
59
|
+
const r = u.toArray(e);
|
|
60
|
+
return ((c = (o = (t = r[r.length - 1]) == null ? void 0 : t.props) == null ? void 0 : o.header) == null ? void 0 : c.active) === !0;
|
|
61
|
+
}, j = (e) => {
|
|
62
|
+
const { divider: r = !0, border: t = !0, "data-test-id": o = M } = e, c = W(e), n = V(c), i = w(null), s = F(n), f = w({ firstRender: !0, childLength: u.toArray(e.children).length }), h = u.toArray(e.children).length;
|
|
63
|
+
L(() => {
|
|
64
|
+
Y(e.children) && !f.current.firstRender && u.toArray(e.children).length > f.current.childLength && s.toggleKey(n.defaultExpandedKeys[n.defaultExpandedKeys.length - 1]), f.current = { firstRender: !1, childLength: u.toArray(e.children).length };
|
|
65
|
+
}, [n.defaultExpandedKeys, h, e.children, s]);
|
|
65
66
|
const {
|
|
66
67
|
// @react-aria prevents default action for onMouseDown as implemented here: https://github.com/adobe/react-spectrum/blob/e14523fedd93ac1a4ede355aed70988af572ae74/packages/%40react-aria/selection/src/useSelectableCollection.ts#L370
|
|
67
68
|
// This makes it impossible to edit or select text in input fields inside the accordion
|
|
68
69
|
// onKeydown automatically navigates away from child elements, including dropdown menus etc.
|
|
69
70
|
// Focus should only be passed if the accordion item itself is focused
|
|
70
71
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
71
|
-
accordionProps: { onMouseDown:
|
|
72
|
+
accordionProps: { onMouseDown: p, onKeyDown: y, ...A }
|
|
72
73
|
// @react-aria enable by default typeahead which result in an event fired up on keypress and select the section
|
|
73
74
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
74
75
|
//@ts-ignore
|
|
75
|
-
} =
|
|
76
|
-
const
|
|
77
|
-
|
|
76
|
+
} = N({ ...n, disallowTypeAhead: !0 }, s, i), g = { ...A, onKeyDown: (a) => {
|
|
77
|
+
const m = a.target.dataset.key, l = s.selectionManager.focusedKey === m;
|
|
78
|
+
m && l && y && y(a);
|
|
78
79
|
} };
|
|
79
|
-
return /* @__PURE__ */
|
|
80
|
+
return /* @__PURE__ */ d.createElement(
|
|
80
81
|
"div",
|
|
81
82
|
{
|
|
82
|
-
...
|
|
83
|
-
ref:
|
|
84
|
-
"data-test-id":
|
|
85
|
-
className:
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
...g,
|
|
84
|
+
ref: i,
|
|
85
|
+
"data-test-id": o,
|
|
86
|
+
className: k([
|
|
87
|
+
r && "tw-divide-y tw-divide-black-10",
|
|
88
|
+
t && "tw-border-t tw-border-b tw-border-black-10"
|
|
88
89
|
])
|
|
89
90
|
},
|
|
90
|
-
[...
|
|
91
|
-
const {
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
[...s.collection].map((a, m) => {
|
|
92
|
+
const {
|
|
93
|
+
header: l,
|
|
94
|
+
padding: v,
|
|
95
|
+
headerComponent: K,
|
|
96
|
+
divider: b,
|
|
97
|
+
"data-test-id": D = I
|
|
98
|
+
} = c[m].props;
|
|
99
|
+
return /* @__PURE__ */ d.createElement(
|
|
100
|
+
S,
|
|
94
101
|
{
|
|
95
102
|
key: a.key,
|
|
96
103
|
item: a,
|
|
97
|
-
state:
|
|
98
|
-
divider:
|
|
99
|
-
header:
|
|
100
|
-
padding:
|
|
101
|
-
headerComponent:
|
|
104
|
+
state: s,
|
|
105
|
+
divider: b,
|
|
106
|
+
header: l,
|
|
107
|
+
padding: v,
|
|
108
|
+
headerComponent: K,
|
|
109
|
+
"data-test-id": D
|
|
102
110
|
}
|
|
103
111
|
);
|
|
104
112
|
})
|
|
105
113
|
);
|
|
106
114
|
};
|
|
107
|
-
|
|
115
|
+
j.displayName = "FondueAccordion";
|
|
108
116
|
export {
|
|
109
|
-
|
|
110
|
-
|
|
117
|
+
j as Accordion,
|
|
118
|
+
H as AccordionItem
|
|
111
119
|
};
|
|
112
120
|
//# sourceMappingURL=Accordion.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Accordion.es.js","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { CollapsibleWrap } from '@components/CollapsibleWrap';\nimport { useAccordion, useAccordionItem } from '@react-aria/accordion';\nimport { useFocusRing } from '@react-aria/focus';\nimport { mergeProps } from '@react-aria/utils';\nimport { Item as StatelyItem } from '@react-stately/collections';\nimport { useTreeState } from '@react-stately/tree';\nimport { FOCUS_STYLE_INSET } from '@utilities/focusStyle';\nimport { merge } from '@utilities/merge';\nimport React, { Children, Key, KeyboardEvent, ReactElement, isValidElement, useEffect, useRef } from 'react';\nimport { AccordionHeader } from './AccordionHeader';\nimport { AccordionItemProps, AccordionProps, AriaAccordionItemProps } from './types';\n\nconst ACCORDION_ID = 'accordion';\nconst ACCORDION_ITEM_ID = 'accordion-item';\n\nconst AriaAccordionItem = ({\n item,\n state,\n header,\n padding = true,\n divider = false,\n headerComponent: HeaderComponent = AccordionHeader,\n}: AriaAccordionItemProps): ReactElement => {\n const { size, active, ...headerProps } = header;\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const { buttonProps, regionProps } = useAccordionItem({ item }, state, triggerRef);\n const isOpen = state.expandedKeys.has(item.key);\n const { isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <div\n key={item.key}\n className={merge([isFocusVisible ? FOCUS_STYLE_INSET : '', divider && 'tw-divide-y tw-divide-black-10'])}\n >\n <button\n {...mergeProps(buttonProps, focusProps)}\n data-test-id={ACCORDION_ITEM_ID}\n ref={triggerRef}\n onClick={(event) => {\n if (header.onClick) {\n header.onClick();\n }\n\n if (buttonProps.onClick) {\n buttonProps.onClick(event);\n }\n }}\n onKeyUp={(event) => {\n if (header.onClick && event.key === 'Enter') {\n header.onClick();\n }\n\n if (buttonProps.onKeyUp) {\n buttonProps.onKeyUp(event);\n }\n }}\n className=\"tw-w-full focus-visible:tw-outline-none\"\n >\n <HeaderComponent isOpen={isOpen} size={size} {...headerProps} />\n </button>\n <CollapsibleWrap isOpen={isOpen} preventInitialAnimation={active}>\n <div {...regionProps} className={merge([padding && 'tw-px-8 tw-pb-6'])}>\n {item.props.children?.()}\n </div>\n </CollapsibleWrap>\n </div>\n );\n};\n\nconst mapToAriaProps = (children: ReactElement<AccordionItemProps>[]) => {\n const ariaChildren = Children.map(children, (child, index) => {\n const { header, children } = child.props;\n\n return (\n <StatelyItem key={index} textValue={header.children}>\n {children ? () => children : null}\n </StatelyItem>\n );\n });\n\n const defaultExpandedKeys = (ariaChildren\n .map((item) => item.key)\n .filter((key, index) => key && !!children[index]?.props.header?.active) || []) as Key[];\n\n return { children: ariaChildren, defaultExpandedKeys };\n};\n\nconst filterValidChildren = ({ children }: AccordionProps): ReactElement<AccordionItemProps>[] =>\n Children.toArray(children).reduce<ReactElement<AccordionItemProps>[]>((validChildren, child) => {\n if (isValidElement(child) && !child.props.header) {\n console.warn('Use `AccordionItem` as children of `Accordion` and set the `header` prop accordingly.');\n return validChildren;\n }\n\n if (isValidElement(child)) {\n validChildren.push(child as ReactElement<AccordionItemProps>);\n }\n\n return validChildren;\n }, []);\n\nexport const AccordionItem = ({ children }: AccordionItemProps): ReactElement => <>{children}</>;\nAccordionItem.displayName = 'FondueAccordionItem';\n\nconst lastChildrenActive = (children: React.ReactNode | undefined): boolean | undefined => {\n const childrenArray = Children.toArray(children) as { key: string; props?: { header?: { active?: boolean } } }[];\n return childrenArray[childrenArray.length - 1]?.props?.header?.active === true;\n};\n\nexport const Accordion = (props: AccordionProps): ReactElement => {\n const { divider = true, border = true } = props;\n const children = filterValidChildren(props);\n const ariaProps = mapToAriaProps(children);\n\n const ref = useRef<HTMLDivElement | null>(null);\n const state = useTreeState<AccordionItemProps>(ariaProps);\n\n // We need to detect the firstRender and childrenLength to not toggle any panel\n const accordionChildren = useRef({ firstRender: true, childLength: Children.toArray(props.children).length });\n const childrenLength = Children.toArray(props.children).length;\n useEffect(() => {\n /**\n * Checks if the last child in the Array is active\n * Only works when adding Children to end of Accordion\n */\n const childrenIsActive = lastChildrenActive(props.children);\n if (\n !!childrenIsActive &&\n !accordionChildren.current.firstRender &&\n Children.toArray(props.children).length > accordionChildren.current.childLength\n ) {\n state.toggleKey(ariaProps.defaultExpandedKeys[ariaProps.defaultExpandedKeys.length - 1]);\n }\n accordionChildren.current = { firstRender: false, childLength: Children.toArray(props.children).length };\n }, [ariaProps.defaultExpandedKeys, childrenLength, props.children, state]);\n\n const {\n // @react-aria prevents default action for onMouseDown as implemented here: https://github.com/adobe/react-spectrum/blob/e14523fedd93ac1a4ede355aed70988af572ae74/packages/%40react-aria/selection/src/useSelectableCollection.ts#L370\n // This makes it impossible to edit or select text in input fields inside the accordion\n // onKeydown automatically navigates away from child elements, including dropdown menus etc.\n // Focus should only be passed if the accordion item itself is focused\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n accordionProps: { onMouseDown, onKeyDown, ...accordionProps },\n // @react-aria enable by default typeahead which result in an event fired up on keypress and select the section\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n } = useAccordion({ ...ariaProps, disallowTypeAhead: true }, state, ref);\n\n const accordionKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const key = (event.target as HTMLButtonElement).dataset.key;\n const isFocused = state.selectionManager.focusedKey === key;\n if (key && isFocused) {\n onKeyDown && onKeyDown(event);\n }\n };\n\n const propsWithModifiedKeyDown = { ...accordionProps, onKeyDown: accordionKeyDown };\n\n return (\n <div\n {...propsWithModifiedKeyDown}\n ref={ref}\n data-test-id={ACCORDION_ID}\n className={merge([\n divider && 'tw-divide-y tw-divide-black-10',\n border && 'tw-border-t tw-border-b tw-border-black-10',\n ])}\n >\n {[...state.collection].map((item, index) => {\n const { header, padding, headerComponent, divider } = children[index].props;\n return (\n <AriaAccordionItem\n key={item.key}\n item={item}\n state={state}\n divider={divider}\n header={header}\n padding={padding}\n headerComponent={headerComponent}\n />\n );\n })}\n </div>\n );\n};\nAccordion.displayName = 'FondueAccordion';\n"],"names":["ACCORDION_ID","ACCORDION_ITEM_ID","AriaAccordionItem","item","state","header","padding","divider","HeaderComponent","AccordionHeader","size","active","headerProps","triggerRef","useRef","buttonProps","regionProps","useAccordionItem","isOpen","isFocusVisible","focusProps","useFocusRing","React","merge","FOCUS_STYLE_INSET","mergeProps","event","CollapsibleWrap","_b","_a","mapToAriaProps","children","ariaChildren","Children","child","index","StatelyItem","defaultExpandedKeys","key","filterValidChildren","validChildren","isValidElement","AccordionItem","lastChildrenActive","childrenArray","_c","Accordion","props","border","ariaProps","ref","useTreeState","accordionChildren","childrenLength","useEffect","onMouseDown","onKeyDown","accordionProps","useAccordion","propsWithModifiedKeyDown","isFocused","headerComponent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Accordion.es.js","sources":["../../../src/components/Accordion/Accordion.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { CollapsibleWrap } from '@components/CollapsibleWrap';\nimport { useAccordion, useAccordionItem } from '@react-aria/accordion';\nimport { useFocusRing } from '@react-aria/focus';\nimport { mergeProps } from '@react-aria/utils';\nimport { Item as StatelyItem } from '@react-stately/collections';\nimport { useTreeState } from '@react-stately/tree';\nimport { FOCUS_STYLE_INSET } from '@utilities/focusStyle';\nimport { merge } from '@utilities/merge';\nimport React, { Children, Key, KeyboardEvent, ReactElement, isValidElement, useEffect, useRef } from 'react';\nimport { AccordionHeader } from './AccordionHeader';\nimport { AccordionItemProps, AccordionProps, AriaAccordionItemProps } from './types';\n\nconst ACCORDION_ID = 'fondue-accordion';\nconst ACCORDION_ITEM_ID = 'fondue-accordion-item';\n\nconst AriaAccordionItem = ({\n item,\n state,\n header,\n padding = true,\n divider = false,\n headerComponent: HeaderComponent = AccordionHeader,\n 'data-test-id': dataTestId = ACCORDION_ITEM_ID,\n}: AriaAccordionItemProps): ReactElement => {\n const { active, ...headerProps } = header;\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const { buttonProps, regionProps } = useAccordionItem({ item }, state, triggerRef);\n const isOpen = state.expandedKeys.has(item.key);\n const { isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <div\n key={item.key}\n className={merge([isFocusVisible ? FOCUS_STYLE_INSET : '', divider && 'tw-divide-y tw-divide-black-10'])}\n >\n <button\n {...mergeProps(buttonProps, focusProps)}\n data-test-id={dataTestId}\n ref={triggerRef}\n onClick={(event) => {\n if (header.onClick) {\n header.onClick();\n }\n\n if (buttonProps.onClick) {\n buttonProps.onClick(event);\n }\n }}\n onKeyUp={(event) => {\n if (header.onClick && event.key === 'Enter') {\n header.onClick();\n }\n\n if (buttonProps.onKeyUp) {\n buttonProps.onKeyUp(event);\n }\n }}\n className=\"tw-w-full focus-visible:tw-outline-none\"\n >\n <HeaderComponent isOpen={isOpen} {...headerProps} />\n </button>\n <CollapsibleWrap isOpen={isOpen} preventInitialAnimation={active}>\n <div {...regionProps} className={merge([padding && 'tw-px-8 tw-pb-6'])}>\n {item.props.children?.()}\n </div>\n </CollapsibleWrap>\n </div>\n );\n};\n\nconst mapToAriaProps = (children: ReactElement<AccordionItemProps>[]) => {\n const ariaChildren = Children.map(children, (child, index) => {\n const { header, children } = child.props;\n\n return (\n <StatelyItem key={index} textValue={header.children}>\n {children ? () => children : null}\n </StatelyItem>\n );\n });\n\n const defaultExpandedKeys = (ariaChildren\n .map((item) => item.key)\n .filter((key, index) => key && !!children[index]?.props.header?.active) || []) as Key[];\n\n return { children: ariaChildren, defaultExpandedKeys };\n};\n\nconst filterValidChildren = ({ children }: AccordionProps): ReactElement<AccordionItemProps>[] =>\n Children.toArray(children).reduce<ReactElement<AccordionItemProps>[]>((validChildren, child) => {\n if (isValidElement(child) && !child.props.header) {\n console.warn('Use `AccordionItem` as children of `Accordion` and set the `header` prop accordingly.');\n return validChildren;\n }\n\n if (isValidElement(child)) {\n validChildren.push(child as ReactElement<AccordionItemProps>);\n }\n\n return validChildren;\n }, []);\n\nexport const AccordionItem = ({ children }: AccordionItemProps): ReactElement => <>{children}</>;\nAccordionItem.displayName = 'FondueAccordionItem';\n\nconst lastChildrenActive = (children: React.ReactNode | undefined): boolean | undefined => {\n const childrenArray = Children.toArray(children) as { key: string; props?: { header?: { active?: boolean } } }[];\n return childrenArray[childrenArray.length - 1]?.props?.header?.active === true;\n};\n\nexport const Accordion = (props: AccordionProps): ReactElement => {\n const { divider = true, border = true, 'data-test-id': dataTestId = ACCORDION_ID } = props;\n const children = filterValidChildren(props);\n const ariaProps = mapToAriaProps(children);\n\n const ref = useRef<HTMLDivElement | null>(null);\n const state = useTreeState<AccordionItemProps>(ariaProps);\n\n // We need to detect the firstRender and childrenLength to not toggle any panel\n const accordionChildren = useRef({ firstRender: true, childLength: Children.toArray(props.children).length });\n const childrenLength = Children.toArray(props.children).length;\n useEffect(() => {\n /**\n * Checks if the last child in the Array is active\n * Only works when adding Children to end of Accordion\n */\n const childrenIsActive = lastChildrenActive(props.children);\n if (\n !!childrenIsActive &&\n !accordionChildren.current.firstRender &&\n Children.toArray(props.children).length > accordionChildren.current.childLength\n ) {\n state.toggleKey(ariaProps.defaultExpandedKeys[ariaProps.defaultExpandedKeys.length - 1]);\n }\n accordionChildren.current = { firstRender: false, childLength: Children.toArray(props.children).length };\n }, [ariaProps.defaultExpandedKeys, childrenLength, props.children, state]);\n\n const {\n // @react-aria prevents default action for onMouseDown as implemented here: https://github.com/adobe/react-spectrum/blob/e14523fedd93ac1a4ede355aed70988af572ae74/packages/%40react-aria/selection/src/useSelectableCollection.ts#L370\n // This makes it impossible to edit or select text in input fields inside the accordion\n // onKeydown automatically navigates away from child elements, including dropdown menus etc.\n // Focus should only be passed if the accordion item itself is focused\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n accordionProps: { onMouseDown, onKeyDown, ...accordionProps },\n // @react-aria enable by default typeahead which result in an event fired up on keypress and select the section\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n //@ts-ignore\n } = useAccordion({ ...ariaProps, disallowTypeAhead: true }, state, ref);\n\n const accordionKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n const key = (event.target as HTMLButtonElement).dataset.key;\n const isFocused = state.selectionManager.focusedKey === key;\n if (key && isFocused) {\n onKeyDown && onKeyDown(event);\n }\n };\n\n const propsWithModifiedKeyDown = { ...accordionProps, onKeyDown: accordionKeyDown };\n\n return (\n <div\n {...propsWithModifiedKeyDown}\n ref={ref}\n data-test-id={dataTestId}\n className={merge([\n divider && 'tw-divide-y tw-divide-black-10',\n border && 'tw-border-t tw-border-b tw-border-black-10',\n ])}\n >\n {[...state.collection].map((item, index) => {\n const {\n header,\n padding,\n headerComponent,\n divider,\n 'data-test-id': itemDataTestId = ACCORDION_ITEM_ID,\n } = children[index].props;\n return (\n <AriaAccordionItem\n key={item.key}\n item={item}\n state={state}\n divider={divider}\n header={header}\n padding={padding}\n headerComponent={headerComponent}\n data-test-id={itemDataTestId}\n />\n );\n })}\n </div>\n );\n};\nAccordion.displayName = 'FondueAccordion';\n"],"names":["ACCORDION_ID","ACCORDION_ITEM_ID","AriaAccordionItem","item","state","header","padding","divider","HeaderComponent","AccordionHeader","dataTestId","active","headerProps","triggerRef","useRef","buttonProps","regionProps","useAccordionItem","isOpen","isFocusVisible","focusProps","useFocusRing","React","merge","FOCUS_STYLE_INSET","mergeProps","event","CollapsibleWrap","_b","_a","mapToAriaProps","children","ariaChildren","Children","child","index","StatelyItem","defaultExpandedKeys","key","filterValidChildren","validChildren","isValidElement","AccordionItem","lastChildrenActive","childrenArray","_c","Accordion","props","border","ariaProps","ref","useTreeState","accordionChildren","childrenLength","useEffect","onMouseDown","onKeyDown","accordionProps","useAccordion","propsWithModifiedKeyDown","isFocused","headerComponent","itemDataTestId"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import { AccordionHeaderProps } from './types';
|
|
3
|
+
export declare const ACCORDION_HEADER_TEST_ID = "fondue-accordion-header";
|
|
3
4
|
export declare const AccordionHeader: {
|
|
4
|
-
({ isOpen, decorator, disabled, children,
|
|
5
|
+
({ isOpen, decorator, disabled, children, "data-test-id": dataTestId, }: AccordionHeaderProps): JSX.Element;
|
|
5
6
|
displayName: string;
|
|
6
7
|
};
|
|
@@ -1,47 +1,46 @@
|
|
|
1
|
-
import
|
|
1
|
+
import t, { useState as s, isValidElement as m, cloneElement as w } from "react";
|
|
2
2
|
import { IconSize as x } from "../../foundation/Icon/IconSize.es.js";
|
|
3
|
-
import { merge as
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
size: l = u.Medium,
|
|
12
|
-
bold: m = !0,
|
|
13
|
-
type: s
|
|
3
|
+
import { merge as d } from "../../utilities/merge.es.js";
|
|
4
|
+
import { AccordionHeaderIcon as f } from "./AccordionHeaderIcon.es.js";
|
|
5
|
+
const p = "fondue-accordion-header", E = ({
|
|
6
|
+
isOpen: a = !1,
|
|
7
|
+
decorator: r,
|
|
8
|
+
disabled: n = !1,
|
|
9
|
+
children: l,
|
|
10
|
+
"data-test-id": e = p
|
|
14
11
|
}) => {
|
|
15
|
-
const [
|
|
16
|
-
return /* @__PURE__ */
|
|
12
|
+
const [o, i] = s(null), c = /* @__PURE__ */ t.createElement(f, { isOpen: a });
|
|
13
|
+
return /* @__PURE__ */ t.createElement("span", { "data-test-id": e, className: "tw-block tw-px-8 tw-py-6" }, /* @__PURE__ */ t.createElement(
|
|
17
14
|
"span",
|
|
18
15
|
{
|
|
19
|
-
"data-test-id":
|
|
16
|
+
"data-test-id": `${e}-container`,
|
|
20
17
|
role: "navigation",
|
|
21
|
-
"aria-label": `${(
|
|
22
|
-
className:
|
|
18
|
+
"aria-label": `${(o == null ? void 0 : o.innerText) || ""}`,
|
|
19
|
+
className: d([
|
|
23
20
|
"tw-flex tw-items-center tw-gap-x-1.5 tw-w-full tw-flex-row",
|
|
24
|
-
!
|
|
25
|
-
|
|
21
|
+
!n && a && "tw-text-text",
|
|
22
|
+
!n && !a && "tw-text-text-weak hover:tw-text-text",
|
|
23
|
+
n && "tw-text-text-disabled"
|
|
26
24
|
])
|
|
27
25
|
},
|
|
28
|
-
|
|
26
|
+
m(r) && /* @__PURE__ */ t.createElement("span", { "data-test-id": `${e}-decorator`, className: "tw-shrink-0 tw-leading-4" }, w(r, {
|
|
29
27
|
size: x.Size16
|
|
30
28
|
})),
|
|
31
|
-
/* @__PURE__ */
|
|
29
|
+
/* @__PURE__ */ t.createElement(
|
|
32
30
|
"span",
|
|
33
31
|
{
|
|
34
|
-
ref:
|
|
35
|
-
"data-test-id":
|
|
36
|
-
className:
|
|
32
|
+
ref: i,
|
|
33
|
+
"data-test-id": `${e}-text`,
|
|
34
|
+
className: "tw-text-left tw-text-m tw-font-normal"
|
|
37
35
|
},
|
|
38
|
-
|
|
36
|
+
l
|
|
39
37
|
),
|
|
40
|
-
|
|
38
|
+
c && /* @__PURE__ */ t.createElement("span", { "data-test-id": `${e}-icon-container`, className: "tw-ml-auto tw-shrink-0" }, c)
|
|
41
39
|
));
|
|
42
40
|
};
|
|
43
|
-
|
|
41
|
+
E.displayName = "FondueAccordionHeader";
|
|
44
42
|
export {
|
|
45
|
-
|
|
43
|
+
p as ACCORDION_HEADER_TEST_ID,
|
|
44
|
+
E as AccordionHeader
|
|
46
45
|
};
|
|
47
46
|
//# sourceMappingURL=AccordionHeader.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccordionHeader.es.js","sources":["../../../src/components/Accordion/AccordionHeader.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, { ReactElement, cloneElement, isValidElement, useState } from 'react';\nimport { IconSize } from '@foundation/Icon/IconSize';\nimport { IconProps } from '@foundation/Icon/IconProps';\nimport { merge } from '@utilities/merge';\nimport {
|
|
1
|
+
{"version":3,"file":"AccordionHeader.es.js","sources":["../../../src/components/Accordion/AccordionHeader.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, { ReactElement, cloneElement, isValidElement, useState } from 'react';\nimport { IconSize } from '@foundation/Icon/IconSize';\nimport { IconProps } from '@foundation/Icon/IconProps';\nimport { merge } from '@utilities/merge';\nimport { AccordionHeaderProps } from './types';\nimport { AccordionHeaderIcon } from './AccordionHeaderIcon';\n\nexport const ACCORDION_HEADER_TEST_ID = 'fondue-accordion-header';\n\nexport const AccordionHeader = ({\n isOpen = false,\n decorator,\n disabled = false,\n children,\n 'data-test-id': dataTestId = ACCORDION_HEADER_TEST_ID,\n}: AccordionHeaderProps) => {\n const [headingRef, setHeadingRef] = useState<HTMLSpanElement | null>(null);\n const icon = <AccordionHeaderIcon isOpen={isOpen} />;\n\n return (\n <span data-test-id={dataTestId} className=\"tw-block tw-px-8 tw-py-6\">\n <span\n data-test-id={`${dataTestId}-container`}\n role=\"navigation\"\n aria-label={`${headingRef?.innerText || ''}`}\n className={merge([\n 'tw-flex tw-items-center tw-gap-x-1.5 tw-w-full tw-flex-row',\n !disabled && isOpen && 'tw-text-text',\n !disabled && !isOpen && 'tw-text-text-weak hover:tw-text-text',\n disabled && 'tw-text-text-disabled',\n ])}\n >\n {isValidElement(decorator) && (\n <span data-test-id={`${dataTestId}-decorator`} className=\"tw-shrink-0 tw-leading-4\">\n {cloneElement(decorator as ReactElement<IconProps>, {\n size: IconSize.Size16,\n })}\n </span>\n )}\n <span\n ref={setHeadingRef}\n data-test-id={`${dataTestId}-text`}\n className=\"tw-text-left tw-text-m tw-font-normal\"\n >\n {children}\n </span>\n {icon && (\n <span data-test-id={`${dataTestId}-icon-container`} className=\"tw-ml-auto tw-shrink-0\">\n {icon}\n </span>\n )}\n </span>\n </span>\n );\n};\nAccordionHeader.displayName = 'FondueAccordionHeader';\n"],"names":["ACCORDION_HEADER_TEST_ID","AccordionHeader","isOpen","decorator","disabled","children","dataTestId","headingRef","setHeadingRef","useState","icon","React","AccordionHeaderIcon","merge","isValidElement","cloneElement","IconSize"],"mappings":";;;;AASO,MAAMA,IAA2B,2BAE3BC,IAAkB,CAAC;AAAA,EAC5B,QAAAC,IAAS;AAAA,EACT,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC;AAAA,EACA,gBAAgBC,IAAaN;AACjC,MAA4B;AACxB,QAAM,CAACO,GAAYC,CAAa,IAAIC,EAAiC,IAAI,GACnEC,IAAQ,gBAAAC,EAAA,cAAAC,GAAA,EAAoB,QAAAV,EAAgB,CAAA;AAElD,SACK,gBAAAS,EAAA,cAAA,QAAA,EAAK,gBAAcL,GAAY,WAAU,8BACtC,gBAAAK,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,gBAAc,GAAGL;AAAA,MACjB,MAAK;AAAA,MACL,cAAY,IAAGC,KAAA,gBAAAA,EAAY,cAAa;AAAA,MACxC,WAAWM,EAAM;AAAA,QACb;AAAA,QACA,CAACT,KAAYF,KAAU;AAAA,QACvB,CAACE,KAAY,CAACF,KAAU;AAAA,QACxBE,KAAY;AAAA,MAAA,CACf;AAAA,IAAA;AAAA,IAEAU,EAAeX,CAAS,KACpB,gBAAAQ,EAAA,cAAA,QAAA,EAAK,gBAAc,GAAGL,eAAwB,WAAU,2BACpD,GAAAS,EAAaZ,GAAsC;AAAA,MAChD,MAAMa,EAAS;AAAA,IAAA,CAClB,CACL;AAAA,IAEJ,gBAAAL,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAKH;AAAA,QACL,gBAAc,GAAGF;AAAA,QACjB,WAAU;AAAA,MAAA;AAAA,MAETD;AAAA,IACL;AAAA,IACCK,qCACI,QAAK,EAAA,gBAAc,GAAGJ,oBAA6B,WAAU,4BACzDI,CACL;AAAA,EAAA,CAGZ;AAER;AACAT,EAAgB,cAAc;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReactElement } from 'react';
|
|
2
2
|
import { AccordionHeaderIconProps } from './types';
|
|
3
|
+
export declare const ACCORDION_HEADER_ICON_ID = "fondue-accordion-header-icon";
|
|
3
4
|
export declare const AccordionHeaderIcon: {
|
|
4
|
-
({ size, isOpen,
|
|
5
|
+
({ size, isOpen, "data-test-id": dataTestId, }: AccordionHeaderIconProps): ReactElement;
|
|
5
6
|
displayName: string;
|
|
6
7
|
};
|
|
@@ -1,13 +1,32 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import e from "react";
|
|
2
|
+
import { merge as i } from "../../utilities/merge.es.js";
|
|
3
|
+
import { IconSize as t } from "../../foundation/Icon/IconSize.es.js";
|
|
4
|
+
import c from "../../foundation/Icon/Generated/IconCaretDown.es.js";
|
|
5
|
+
const m = "fondue-accordion-header-icon", s = {
|
|
6
|
+
small: t.Size12,
|
|
7
|
+
medium: t.Size16,
|
|
8
|
+
large: t.Size20
|
|
9
|
+
}, d = ({
|
|
10
|
+
size: a = "medium",
|
|
11
|
+
isOpen: r,
|
|
12
|
+
"data-test-id": o = m
|
|
13
|
+
}) => {
|
|
14
|
+
const n = {
|
|
15
|
+
"aria-labelledby": "",
|
|
16
|
+
size: s[a]
|
|
17
|
+
};
|
|
18
|
+
return /* @__PURE__ */ e.createElement("span", { "data-test-id": `${o}-wrapper`, className: "tw-block" }, /* @__PURE__ */ e.createElement(
|
|
19
|
+
"span",
|
|
20
|
+
{
|
|
21
|
+
"data-test-id": o,
|
|
22
|
+
className: i(["tw-block tw-transition-transform", r && "tw-rotate-180 tw-duration-300"])
|
|
23
|
+
},
|
|
24
|
+
/* @__PURE__ */ e.createElement(c, { ...n })
|
|
25
|
+
));
|
|
26
|
+
};
|
|
27
|
+
d.displayName = "FondueAccordionHeaderIcon";
|
|
10
28
|
export {
|
|
11
|
-
|
|
29
|
+
m as ACCORDION_HEADER_ICON_ID,
|
|
30
|
+
d as AccordionHeaderIcon
|
|
12
31
|
};
|
|
13
32
|
//# sourceMappingURL=AccordionHeaderIcon.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccordionHeaderIcon.es.js","sources":["../../../src/components/Accordion/AccordionHeaderIcon.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {
|
|
1
|
+
{"version":3,"file":"AccordionHeaderIcon.es.js","sources":["../../../src/components/Accordion/AccordionHeaderIcon.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, { ReactElement } from 'react';\nimport { merge } from '@utilities/merge';\nimport { IconCaretDown } from '@foundation/Icon/Generated';\nimport { IconSize } from '@foundation/Icon/IconSize';\nimport { AccordionHeaderIconProps, AccordionHeaderIconSize } from './types';\n\nexport const ACCORDION_HEADER_ICON_ID = 'fondue-accordion-header-icon';\n\nconst sizeMap: Record<AccordionHeaderIconSize, IconSize> = {\n small: IconSize.Size12,\n medium: IconSize.Size16,\n large: IconSize.Size20,\n};\n\nexport const AccordionHeaderIcon = ({\n size = 'medium',\n isOpen,\n 'data-test-id': dataTestId = ACCORDION_HEADER_ICON_ID,\n}: AccordionHeaderIconProps): ReactElement => {\n const props = {\n 'aria-labelledby': '',\n size: sizeMap[size],\n };\n\n return (\n <span data-test-id={`${dataTestId}-wrapper`} className=\"tw-block\">\n <span\n data-test-id={dataTestId}\n className={merge(['tw-block tw-transition-transform', isOpen && 'tw-rotate-180 tw-duration-300'])}\n >\n <IconCaretDown {...props} />\n </span>\n </span>\n );\n};\nAccordionHeaderIcon.displayName = 'FondueAccordionHeaderIcon';\n"],"names":["ACCORDION_HEADER_ICON_ID","sizeMap","IconSize","AccordionHeaderIcon","size","isOpen","dataTestId","props","React","merge","IconCaretDown"],"mappings":";;;;AAQO,MAAMA,IAA2B,gCAElCC,IAAqD;AAAA,EACvD,OAAOC,EAAS;AAAA,EAChB,QAAQA,EAAS;AAAA,EACjB,OAAOA,EAAS;AACpB,GAEaC,IAAsB,CAAC;AAAA,EAChC,MAAAC,IAAO;AAAA,EACP,QAAAC;AAAA,EACA,gBAAgBC,IAAaN;AACjC,MAA8C;AAC1C,QAAMO,IAAQ;AAAA,IACV,mBAAmB;AAAA,IACnB,MAAMN,EAAQG,CAAI;AAAA,EAAA;AAGtB,yCACK,QAAK,EAAA,gBAAc,GAAGE,aAAsB,WAAU,WACnD,GAAA,gBAAAE,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,gBAAcF;AAAA,MACd,WAAWG,EAAM,CAAC,oCAAoCJ,KAAU,+BAA+B,CAAC;AAAA,IAAA;AAAA,IAEhG,gBAAAG,EAAA,cAACE,GAAe,EAAA,GAAGH,EAAO,CAAA;AAAA,EAAA,CAElC;AAER;AACAJ,EAAoB,cAAc;"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { TreeState } from '@react-stately/tree';
|
|
2
2
|
import { ReactElement, ReactNode } from 'react';
|
|
3
3
|
import { Node } from '@react-types/shared';
|
|
4
|
-
import { FieldsetHeaderSize, FieldsetHeaderType } from '../FieldsetHeader';
|
|
5
4
|
export type AccordionProps = {
|
|
6
5
|
children?: ReactNode;
|
|
7
6
|
divider?: boolean;
|
|
8
7
|
border?: boolean;
|
|
8
|
+
'data-test-id'?: string;
|
|
9
9
|
};
|
|
10
10
|
export type AriaAccordionItemProps = {
|
|
11
11
|
item: Node<AccordionItemProps>;
|
|
@@ -17,6 +17,7 @@ export type AriaAccordionItemProps = {
|
|
|
17
17
|
padding?: boolean;
|
|
18
18
|
divider?: boolean;
|
|
19
19
|
headerComponent?: (props: AccordionHeaderProps) => ReactElement;
|
|
20
|
+
'data-test-id'?: string;
|
|
20
21
|
};
|
|
21
22
|
export type AccordionItemProps = {
|
|
22
23
|
header: Omit<AccordionHeaderProps, 'isOpen'> & {
|
|
@@ -26,34 +27,19 @@ export type AccordionItemProps = {
|
|
|
26
27
|
padding?: boolean;
|
|
27
28
|
divider?: boolean;
|
|
28
29
|
headerComponent?: (props: AccordionHeaderProps) => ReactElement;
|
|
30
|
+
'data-test-id'?: string;
|
|
29
31
|
children?: ReactNode;
|
|
30
32
|
};
|
|
31
|
-
export
|
|
32
|
-
Small = "Small",
|
|
33
|
-
Medium = "Medium",
|
|
34
|
-
Large = "Large"
|
|
35
|
-
}
|
|
33
|
+
export type AccordionHeaderIconSize = 'small' | 'medium' | 'large';
|
|
36
34
|
export type AccordionHeaderProps = {
|
|
37
35
|
decorator?: ReactNode;
|
|
38
36
|
children: string;
|
|
39
37
|
disabled?: boolean;
|
|
40
38
|
isOpen: boolean;
|
|
41
|
-
|
|
42
|
-
size?: AccordionHeaderIconSize | FieldsetHeaderSize;
|
|
43
|
-
/** @deprecated use headerComponent prop for custom header styles */
|
|
44
|
-
bold?: boolean;
|
|
45
|
-
/** @deprecated Icon type will be fixed to FieldsetHeaderType.Accordion.
|
|
46
|
-
Use headerComponent prop for custom header styles */
|
|
47
|
-
type?: FieldsetHeaderType;
|
|
48
|
-
/** @deprecated use headerComponent prop for custom header styles */
|
|
49
|
-
as?: keyof JSX.IntrinsicElements;
|
|
39
|
+
'data-test-id'?: string;
|
|
50
40
|
};
|
|
51
41
|
export type AccordionHeaderIconProps = {
|
|
52
42
|
isOpen: boolean;
|
|
53
|
-
size?: AccordionHeaderIconSize
|
|
54
|
-
|
|
55
|
-
/** @deprecated Icon type will be fixed to FieldsetHeaderType.Accordion.
|
|
56
|
-
Use headerComponent prop for custom header styles */
|
|
57
|
-
type?: FieldsetHeaderType;
|
|
58
|
-
children?: ReactNode;
|
|
43
|
+
size?: AccordionHeaderIconSize;
|
|
44
|
+
'data-test-id'?: string;
|
|
59
45
|
};
|
|
@@ -9,11 +9,11 @@ export declare const decoratedResults: (results: SearchResult[]) => {
|
|
|
9
9
|
style?: import("../..").MenuItemStyle | undefined;
|
|
10
10
|
children?: import("react").ReactNode;
|
|
11
11
|
disabled?: boolean | undefined;
|
|
12
|
-
size?: import("../..").MenuItemContentSize | undefined;
|
|
13
|
-
type?: string | undefined;
|
|
14
12
|
active?: boolean | undefined;
|
|
15
13
|
onClick?: (<T extends HTMLButtonElement | HTMLAnchorElement>(event: import("react").MouseEvent<T, MouseEvent>) => void) | undefined;
|
|
16
14
|
id: string | number;
|
|
15
|
+
type?: string | undefined;
|
|
16
|
+
size?: import("../..").MenuItemContentSize | undefined;
|
|
17
17
|
checked?: boolean | undefined;
|
|
18
18
|
subtitle?: string | undefined;
|
|
19
19
|
ariaProps?: import("react").HTMLAttributes<HTMLElement> | undefined;
|