@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.
@@ -1,112 +1,120 @@
1
- import { useAccordion as K, useAccordionItem as b } from "@react-aria/accordion";
2
- import { useFocusRing as D } from "@react-aria/focus";
3
- import { mergeProps as N } from "@react-aria/utils";
4
- import { Item as P } from "@react-stately/collections";
5
- import { useTreeState as R } from "@react-stately/tree";
6
- import { FOCUS_STYLE_INSET as x } from "../../utilities/focusStyle.es.js";
7
- import { merge as w } from "../../utilities/merge.es.js";
8
- import i, { useRef as E, Children as m, useEffect as F, isValidElement as C } from "react";
9
- import { AccordionHeader as O } from "./AccordionHeader.es.js";
10
- import { CollapsibleWrap as T } from "../CollapsibleWrap/CollapsibleWrap.es.js";
11
- const L = "accordion", U = "accordion-item", _ = ({
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: t,
14
- header: r,
15
- padding: c = !0,
16
- divider: o = !1,
17
- headerComponent: d = O
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 l, p;
20
- const { size: n, active: f, ...h } = r, y = E(null), { buttonProps: s, regionProps: A } = b({ item: e }, t, y), g = t.expandedKeys.has(e.key), { isFocusVisible: k, focusProps: a } = D();
21
- return /* @__PURE__ */ i.createElement(
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: w([k ? x : "", o && "tw-divide-y tw-divide-black-10"])
26
+ className: k([E ? O : "", c && "tw-divide-y tw-divide-black-10"])
26
27
  },
27
- /* @__PURE__ */ i.createElement(
28
+ /* @__PURE__ */ d.createElement(
28
29
  "button",
29
30
  {
30
- ...N(s, a),
31
- "data-test-id": U,
32
- ref: y,
33
- onClick: (u) => {
34
- r.onClick && r.onClick(), s.onClick && s.onClick(u);
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: (u) => {
37
- r.onClick && u.key === "Enter" && r.onClick(), s.onKeyUp && s.onKeyUp(u);
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__ */ i.createElement(d, { isOpen: g, size: n, ...h })
42
+ /* @__PURE__ */ d.createElement(n, { isOpen: A, ...f })
42
43
  ),
43
- /* @__PURE__ */ i.createElement(T, { isOpen: g, preventInitialAnimation: f }, /* @__PURE__ */ i.createElement("div", { ...A, className: w([c && "tw-px-8 tw-pb-6"]) }, (p = (l = e.props).children) == null ? void 0 : p.call(l)))
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
- }, M = (e) => {
46
- const t = m.map(e, (c, o) => {
47
- const { header: d, children: n } = c.props;
48
- return /* @__PURE__ */ i.createElement(P, { key: o, textValue: d.children }, n ? () => n : null);
49
- }), r = t.map((c) => c.key).filter((c, o) => {
50
- var d, n;
51
- return c && !!((n = (d = e[o]) == null ? void 0 : d.props.header) != null && n.active);
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: t, defaultExpandedKeys: r };
54
- }, S = ({ children: e }) => m.toArray(e).reduce((t, r) => C(r) && !r.props.header ? (console.warn("Use `AccordionItem` as children of `Accordion` and set the `header` prop accordingly."), t) : (C(r) && t.push(r), t), []), V = ({ children: e }) => /* @__PURE__ */ i.createElement(i.Fragment, null, e);
55
- V.displayName = "FondueAccordionItem";
56
- const W = (e) => {
57
- var r, c, o;
58
- const t = m.toArray(e);
59
- return ((o = (c = (r = t[t.length - 1]) == null ? void 0 : r.props) == null ? void 0 : c.header) == null ? void 0 : o.active) === !0;
60
- }, z = (e) => {
61
- const { divider: t = !0, border: r = !0 } = e, c = S(e), o = M(c), d = E(null), n = R(o), f = E({ firstRender: !0, childLength: m.toArray(e.children).length }), h = m.toArray(e.children).length;
62
- F(() => {
63
- W(e.children) && !f.current.firstRender && m.toArray(e.children).length > f.current.childLength && n.toggleKey(o.defaultExpandedKeys[o.defaultExpandedKeys.length - 1]), f.current = { firstRender: !1, childLength: m.toArray(e.children).length };
64
- }, [o.defaultExpandedKeys, h, e.children, n]);
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: y, onKeyDown: s, ...A }
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
- } = K({ ...o, disallowTypeAhead: !0 }, n, d), k = { ...A, onKeyDown: (a) => {
76
- const l = a.target.dataset.key, p = n.selectionManager.focusedKey === l;
77
- l && p && s && s(a);
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__ */ i.createElement(
80
+ return /* @__PURE__ */ d.createElement(
80
81
  "div",
81
82
  {
82
- ...k,
83
- ref: d,
84
- "data-test-id": L,
85
- className: w([
86
- t && "tw-divide-y tw-divide-black-10",
87
- r && "tw-border-t tw-border-b tw-border-black-10"
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
- [...n.collection].map((a, l) => {
91
- const { header: p, padding: u, headerComponent: v, divider: I } = c[l].props;
92
- return /* @__PURE__ */ i.createElement(
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: n,
98
- divider: I,
99
- header: p,
100
- padding: u,
101
- headerComponent: v
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
- z.displayName = "FondueAccordion";
115
+ j.displayName = "FondueAccordion";
108
116
  export {
109
- z as Accordion,
110
- V as AccordionItem
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, size, bold, type, }: AccordionHeaderProps): JSX.Element;
5
+ ({ isOpen, decorator, disabled, children, "data-test-id": dataTestId, }: AccordionHeaderProps): JSX.Element;
5
6
  displayName: string;
6
7
  };
@@ -1,47 +1,46 @@
1
- import e, { useState as w, isValidElement as f, cloneElement as p } from "react";
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 c } from "../../utilities/merge.es.js";
4
- import { AccordionHeaderIconSize as u } from "./types.es.js";
5
- import { AccordionHeaderIcon as E } from "./AccordionHeaderIcon.es.js";
6
- const h = ({
7
- isOpen: r = !1,
8
- decorator: n,
9
- disabled: t = !1,
10
- children: i,
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 [a, d] = w(null), o = /* @__PURE__ */ e.createElement(E, { isOpen: r, disabled: t, size: l, type: s });
16
- return /* @__PURE__ */ e.createElement("span", { "data-test-id": "accordion-header", className: "tw-block tw-px-8 tw-py-6" }, /* @__PURE__ */ e.createElement(
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": "fieldset-header",
16
+ "data-test-id": `${e}-container`,
20
17
  role: "navigation",
21
- "aria-label": `${(a == null ? void 0 : a.innerText) || ""}`,
22
- className: c([
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
- !t && r ? "tw-text-black" : "tw-text-black-80",
25
- t ? "tw-text-black-40" : "dark:tw-text-white"
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
- f(n) && /* @__PURE__ */ e.createElement("span", { "data-test-id": "accordion-header-decorator", className: "tw-shrink-0 tw-leading-4" }, p(n, {
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__ */ e.createElement(
29
+ /* @__PURE__ */ t.createElement(
32
30
  "span",
33
31
  {
34
- ref: d,
35
- "data-test-id": "accordion-header-text",
36
- className: c(["tw-text-left tw-text-m", m ? "tw-font-medium" : "tw-font-normal"])
32
+ ref: i,
33
+ "data-test-id": `${e}-text`,
34
+ className: "tw-text-left tw-text-m tw-font-normal"
37
35
  },
38
- i
36
+ l
39
37
  ),
40
- o && /* @__PURE__ */ e.createElement("span", { "data-test-id": "header-icon-container", className: "tw-ml-auto tw-shrink-0" }, o)
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
- h.displayName = "FondueAccordionHeader";
41
+ E.displayName = "FondueAccordionHeader";
44
42
  export {
45
- h as AccordionHeader
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 { AccordionHeaderIconSize, AccordionHeaderProps } from './types';\nimport { AccordionHeaderIcon } from './AccordionHeaderIcon';\n\nexport const AccordionHeader = ({\n isOpen = false,\n decorator,\n disabled = false,\n children,\n size = AccordionHeaderIconSize.Medium,\n bold = true,\n type,\n}: AccordionHeaderProps) => {\n const [headingRef, setHeadingRef] = useState<HTMLSpanElement | null>(null);\n const icon = <AccordionHeaderIcon isOpen={isOpen} disabled={disabled} size={size} type={type} />;\n\n return (\n <span data-test-id=\"accordion-header\" className=\"tw-block tw-px-8 tw-py-6\">\n <span\n data-test-id=\"fieldset-header\"\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-black' : 'tw-text-black-80',\n disabled ? 'tw-text-black-40' : 'dark:tw-text-white',\n ])}\n >\n {isValidElement(decorator) && (\n <span data-test-id=\"accordion-header-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=\"accordion-header-text\"\n className={merge(['tw-text-left tw-text-m', bold ? 'tw-font-medium' : 'tw-font-normal'])}\n >\n {children}\n </span>\n {icon && (\n <span data-test-id=\"header-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":["AccordionHeader","isOpen","decorator","disabled","children","size","AccordionHeaderIconSize","bold","type","headingRef","setHeadingRef","useState","icon","React","AccordionHeaderIcon","merge","isValidElement","cloneElement","IconSize"],"mappings":";;;;;AASO,MAAMA,IAAkB,CAAC;AAAA,EAC5B,QAAAC,IAAS;AAAA,EACT,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,UAAAC;AAAA,EACA,MAAAC,IAAOC,EAAwB;AAAA,EAC/B,MAAAC,IAAO;AAAA,EACP,MAAAC;AACJ,MAA4B;AACxB,QAAM,CAACC,GAAYC,CAAa,IAAIC,EAAiC,IAAI,GACnEC,IAAQ,gBAAAC,EAAA,cAAAC,GAAA,EAAoB,QAAAb,GAAgB,UAAAE,GAAoB,MAAAE,GAAY,MAAAG,EAAY,CAAA;AAE9F,SACK,gBAAAK,EAAA,cAAA,QAAA,EAAK,gBAAa,oBAAmB,WAAU,8BAC5C,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,gBAAa;AAAA,MACb,MAAK;AAAA,MACL,cAAY,IAAGJ,KAAA,gBAAAA,EAAY,cAAa;AAAA,MACxC,WAAWM,EAAM;AAAA,QACb;AAAA,QACA,CAACZ,KAAYF,IAAS,kBAAkB;AAAA,QACxCE,IAAW,qBAAqB;AAAA,MAAA,CACnC;AAAA,IAAA;AAAA,IAEAa,EAAed,CAAS,KACpB,gBAAAW,EAAA,cAAA,QAAA,EAAK,gBAAa,8BAA6B,WAAU,8BACrDI,EAAaf,GAAsC;AAAA,MAChD,MAAMgB,EAAS;AAAA,IAAA,CAClB,CACL;AAAA,IAEJ,gBAAAL,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAKH;AAAA,QACL,gBAAa;AAAA,QACb,WAAWK,EAAM,CAAC,0BAA0BR,IAAO,mBAAmB,gBAAgB,CAAC;AAAA,MAAA;AAAA,MAEtFH;AAAA,IACL;AAAA,IACCQ,KACI,gBAAAC,EAAA,cAAA,QAAA,EAAK,gBAAa,yBAAwB,WAAU,4BAChDD,CACL;AAAA,EAAA,CAGZ;AAER;AACAZ,EAAgB,cAAc;"}
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, disabled, type, }: AccordionHeaderIconProps): Nullable<ReactElement>;
5
+ ({ size, isOpen, "data-test-id": dataTestId, }: AccordionHeaderIconProps): ReactElement;
5
6
  displayName: string;
6
7
  };
@@ -1,13 +1,32 @@
1
- import { AccordionHeaderIconSize as e } from "./types.es.js";
2
- import { renderFieldsetHeaderIconType as i, FieldsetHeaderSize as n, FieldsetHeaderType as a } from "../FieldsetHeader/FieldsetHeader.es.js";
3
- const t = ({
4
- size: o = e.Medium,
5
- isOpen: d,
6
- disabled: r = !1,
7
- type: c = a.Accordion
8
- }) => i(c, "", n[e[o]], d, r);
9
- t.displayName = "FondueAccordionHeaderIcon";
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
- t as AccordionHeaderIcon
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 { FieldsetHeaderSize, FieldsetHeaderType, renderFieldsetHeaderIconType } from '@components/FieldsetHeader';\nimport { ReactElement } from 'react';\nimport { AccordionHeaderIconProps, AccordionHeaderIconSize } from './types';\n\nexport const AccordionHeaderIcon = ({\n size = AccordionHeaderIconSize.Medium,\n isOpen,\n disabled = false,\n type = FieldsetHeaderType.Accordion,\n}: AccordionHeaderIconProps): Nullable<ReactElement> =>\n renderFieldsetHeaderIconType(type, '', FieldsetHeaderSize[AccordionHeaderIconSize[size]], isOpen, disabled);\nAccordionHeaderIcon.displayName = 'FondueAccordionHeaderIcon';\n"],"names":["AccordionHeaderIcon","size","AccordionHeaderIconSize","isOpen","disabled","type","FieldsetHeaderType","renderFieldsetHeaderIconType","FieldsetHeaderSize"],"mappings":";;AAMO,MAAMA,IAAsB,CAAC;AAAA,EAChC,MAAAC,IAAOC,EAAwB;AAAA,EAC/B,QAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAAC,IAAOC,EAAmB;AAC9B,MACIC,EAA6BF,GAAM,IAAIG,EAAmBN,EAAwBD,CAAI,CAAC,GAAGE,GAAQC,CAAQ;AAC9GJ,EAAoB,cAAc;"}
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 declare enum AccordionHeaderIconSize {
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
- /** @deprecated use headerComponent prop for custom header styles */
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 | FieldsetHeaderSize;
54
- disabled?: boolean;
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;