@frontify/fondue 12.0.0-beta.334 → 12.0.0-beta.336
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/RichTextEditor/serializer/utils/serializeNodeToHtmlRecursive.es.js +51 -44
- package/dist/components/RichTextEditor/serializer/utils/serializeNodeToHtmlRecursive.es.js.map +1 -1
- package/dist/components/Tabs/Tabs.es.js +53 -56
- package/dist/components/Tabs/Tabs.es.js.map +1 -1
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,79 +1,86 @@
|
|
|
1
|
-
import { getLicElementClassNames as
|
|
2
|
-
import { LI_CLASSNAMES as f, getLiStyles as
|
|
3
|
-
import { isText as L, ELEMENT_UL as
|
|
1
|
+
import { getLicElementClassNames as u } from "../../Plugins/ListPlugin/ListItemContentMarkupElement.es.js";
|
|
2
|
+
import { LI_CLASSNAMES as f, getLiStyles as h } from "../../Plugins/ListPlugin/ListItemMarkupElement.es.js";
|
|
3
|
+
import { isText as L, ELEMENT_UL as N, ELEMENT_OL as p, ELEMENT_LI as T, ELEMENT_LIC as d, ELEMENT_LINK as g, ELEMENT_MENTION as $ } from "@udecode/plate";
|
|
4
4
|
import { merge as C } from "../../../../utilities/merge.es.js";
|
|
5
|
-
import { buttonNode as
|
|
6
|
-
import { checkItemNode as
|
|
5
|
+
import { buttonNode as M } from "../nodes/button.es.js";
|
|
6
|
+
import { checkItemNode as y } from "../nodes/checkItem.es.js";
|
|
7
7
|
import { linkNode as _ } from "../nodes/link.es.js";
|
|
8
8
|
import { mentionHtmlNode as S } from "../nodes/mentionHtmlNode.es.js";
|
|
9
9
|
import { reactCssPropsToCss as n } from "./reactCssPropsToCss.es.js";
|
|
10
10
|
import { serializeLeafToHtml as k } from "./serializeLeafToHtml.es.js";
|
|
11
|
-
import { UL_CLASSES as
|
|
12
|
-
import { getOrderedListClasses as
|
|
13
|
-
import { ELEMENT_BUTTON as H, alignmentClassnames as
|
|
14
|
-
import { TextStyles as
|
|
11
|
+
import { UL_CLASSES as x } from "../../Plugins/ListPlugin/UnorderedListPlugin/UnorderedListMarkupElement.es.js";
|
|
12
|
+
import { getOrderedListClasses as I, OL_STYLES as b } from "../../Plugins/ListPlugin/OrderedListPlugin/OrderedListMarkupElement.es.js";
|
|
13
|
+
import { ELEMENT_BUTTON as H, alignmentClassnames as v } from "../../Plugins/helper.es.js";
|
|
14
|
+
import { TextStyles as r } from "../../Plugins/TextStylePlugin/types.es.js";
|
|
15
15
|
import { ELEMENT_CHECK_ITEM as w } from "../../Plugins/CheckboxListPlugin/id.es.js";
|
|
16
|
-
const
|
|
16
|
+
const c = (t, e) => {
|
|
17
|
+
let o = 0;
|
|
18
|
+
for (const s of t) {
|
|
19
|
+
let i = 0;
|
|
20
|
+
s.type === e && (i = 1), s.children && (i += c(s.children, e)), o = Math.max(o, i);
|
|
21
|
+
}
|
|
22
|
+
return o;
|
|
23
|
+
}, O = (t, e, { mappedMentionable: o, nestingCount: s = {} }) => {
|
|
17
24
|
if (L(t))
|
|
18
25
|
return k(t);
|
|
19
|
-
const
|
|
26
|
+
const i = s[t.type] || c([t], t.type);
|
|
20
27
|
let a = "";
|
|
21
28
|
for (const l of t.children)
|
|
22
|
-
a +=
|
|
29
|
+
a += O(l, e, {
|
|
23
30
|
nestingCount: {
|
|
24
31
|
...s,
|
|
25
|
-
[l.type]:
|
|
32
|
+
[l.type]: i
|
|
26
33
|
},
|
|
27
|
-
mappedMentionable:
|
|
34
|
+
mappedMentionable: o
|
|
28
35
|
});
|
|
29
|
-
const
|
|
36
|
+
const E = A[t.type];
|
|
30
37
|
try {
|
|
31
|
-
return
|
|
38
|
+
return E({
|
|
32
39
|
classNames: U(
|
|
33
40
|
t.breakAfterColumn,
|
|
34
41
|
t.align
|
|
35
42
|
),
|
|
36
43
|
children: a,
|
|
37
|
-
rootNestingCount:
|
|
44
|
+
rootNestingCount: i,
|
|
38
45
|
node: t,
|
|
39
|
-
mappedMentionable:
|
|
46
|
+
mappedMentionable: o,
|
|
40
47
|
styles: e
|
|
41
48
|
}) ?? a;
|
|
42
49
|
} catch {
|
|
43
50
|
return console.warn(`The htmlMapper for node type: '${t.type}' does not exist.`), a;
|
|
44
51
|
}
|
|
45
52
|
}, A = {
|
|
46
|
-
[
|
|
47
|
-
[
|
|
48
|
-
[
|
|
49
|
-
[
|
|
50
|
-
[
|
|
51
|
-
[
|
|
52
|
-
[
|
|
53
|
-
[
|
|
54
|
-
[
|
|
55
|
-
[
|
|
56
|
-
[
|
|
57
|
-
[
|
|
58
|
-
[
|
|
59
|
-
const
|
|
60
|
-
return `<ol dir="auto" class="${
|
|
61
|
-
|
|
53
|
+
[r.heading1]: (t) => m(r.heading1, t, "h1"),
|
|
54
|
+
[r.heading2]: (t) => m(r.heading2, t, "h2"),
|
|
55
|
+
[r.heading3]: (t) => m(r.heading3, t, "h3"),
|
|
56
|
+
[r.heading4]: (t) => m(r.heading4, t, "h4"),
|
|
57
|
+
[r.p]: (t) => m(r.p, t, "p"),
|
|
58
|
+
[r.custom1]: (t) => m(r.custom1, t, "p"),
|
|
59
|
+
[r.custom2]: (t) => m(r.custom2, t, "p"),
|
|
60
|
+
[r.custom3]: (t) => m(r.custom3, t, "p"),
|
|
61
|
+
[r.quote]: (t) => m(r.quote, t, "p"),
|
|
62
|
+
[r.imageTitle]: (t) => m(r.imageTitle, t, "p"),
|
|
63
|
+
[r.imageCaption]: (t) => m(r.imageCaption, t, "p"),
|
|
64
|
+
[N]: (t) => `<ul dir="auto" class="${x} ${t.classNames}">${t.children}</ul>`,
|
|
65
|
+
[p]: ({ classNames: t, children: e, node: o, rootNestingCount: s }) => {
|
|
66
|
+
const i = Math.max(s - c([o], p), 0);
|
|
67
|
+
return `<ol dir="auto" class="${I(i)} ${t}" style="${n(
|
|
68
|
+
b
|
|
62
69
|
)}">${e}</ol>`;
|
|
63
70
|
},
|
|
64
|
-
[
|
|
65
|
-
|
|
71
|
+
[T]: ({ classNames: t, children: e, node: o, styles: s }) => `<li dir="auto" class="${t} ${f}" style="${n(
|
|
72
|
+
h(o, s)
|
|
66
73
|
)}">${e}</li>`,
|
|
67
|
-
[d]: ({ classNames: t, children: e, node:
|
|
68
|
-
[g]: ({ node: t, children: e, classNames:
|
|
69
|
-
[H]: ({ node: t, children: e, classNames:
|
|
70
|
-
[w]: ({ node: t, children: e, classNames:
|
|
74
|
+
[d]: ({ classNames: t, children: e, node: o }) => `<p dir="auto" class="${t} ${u(o)}"><span>${e}</span></p>`,
|
|
75
|
+
[g]: ({ node: t, children: e, classNames: o, styles: s }) => _(t, e, o, s),
|
|
76
|
+
[H]: ({ node: t, children: e, classNames: o, styles: s }) => M(t, e, o, s),
|
|
77
|
+
[w]: ({ node: t, children: e, classNames: o, styles: s }) => y(t, e, o, s),
|
|
71
78
|
[$]: ({ node: t, mappedMentionable: e }) => S(t, { mentionable: e })
|
|
72
|
-
},
|
|
73
|
-
const
|
|
74
|
-
return C([
|
|
79
|
+
}, m = (t, { classNames: e, styles: o, children: s }, i) => `<${i} dir="auto" class="${e}" style="${n(o[t])}">${s}</${i}>`, U = (t, e) => {
|
|
80
|
+
const o = "tw-break-words", s = t === "active" ? "tw-break-after-column tw-break-inside-avoid-column" : "", i = e ? v[e] : "";
|
|
81
|
+
return C([i, o, s]);
|
|
75
82
|
};
|
|
76
83
|
export {
|
|
77
|
-
|
|
84
|
+
O as serializeNodeToHtmlRecursive
|
|
78
85
|
};
|
|
79
86
|
//# sourceMappingURL=serializeNodeToHtmlRecursive.es.js.map
|
package/dist/components/RichTextEditor/serializer/utils/serializeNodeToHtmlRecursive.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serializeNodeToHtmlRecursive.es.js","sources":["../../../../../src/components/RichTextEditor/serializer/utils/serializeNodeToHtmlRecursive.ts"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {\n ELEMENT_BUTTON,\n ELEMENT_CHECK_ITEM,\n MappedMentionableItems,\n OL_STYLES,\n TextStyles,\n UL_CLASSES,\n alignmentClassnames,\n getOrderedListClasses,\n} from '@components/RichTextEditor/Plugins';\nimport { getLicElementClassNames } from '@components/RichTextEditor/Plugins/ListPlugin/ListItemContentMarkupElement';\nimport { LI_CLASSNAMES, getLiStyles } from '@components/RichTextEditor/Plugins/ListPlugin/ListItemMarkupElement';\nimport {\n ELEMENT_LI,\n ELEMENT_LIC,\n ELEMENT_LINK,\n ELEMENT_MENTION,\n ELEMENT_OL,\n ELEMENT_UL,\n TDescendant,\n TElement,\n isText,\n} from '@udecode/plate';\nimport { merge } from '@utilities/merge';\nimport { ButtonStylesType, buttonNode } from '../nodes/button';\nimport { checkItemNode } from '../nodes/checkItem';\nimport { linkNode } from '../nodes/link';\nimport { mentionHtmlNode } from '../nodes/mentionHtmlNode';\nimport { reactCssPropsToCss } from './reactCssPropsToCss';\nimport { serializeLeafToHtml } from './serializeLeafToHtml';\nimport { CSSPropertiesHover } from '../types';\n\nconst countNodesOfType = (nodes: TDescendant[], type: string): number => {\n return nodes.reduce((acc, node) => {\n if (node.type === type) {\n acc++;\n }\n if (node.children) {\n return acc + countNodesOfType(node.children as TDescendant[], type);\n }\n return acc;\n }, 0);\n};\n\ntype NestingCount = {\n [type: string]: number;\n};\n\ntype SerializeNodeToHtmlRecursiveOptions = {\n mappedMentionable?: MappedMentionableItems;\n nestingCount?: NestingCount;\n};\n\nexport const serializeNodeToHtmlRecursive = (\n node: TDescendant,\n styles: Record<string, CSSPropertiesHover> | ButtonStylesType,\n { mappedMentionable, nestingCount = {} }: SerializeNodeToHtmlRecursiveOptions,\n): string => {\n if (isText(node)) {\n return serializeLeafToHtml(node);\n }\n\n const rootNestingCount = nestingCount[node.type] || countNodesOfType([node], node.type);\n let children = '';\n for (const element of node.children) {\n children += serializeNodeToHtmlRecursive(element, styles, {\n nestingCount: {\n ...nestingCount,\n [element.type as string]: rootNestingCount,\n },\n mappedMentionable,\n });\n }\n\n const htmlMapper = MapNodeTypesToHtml[node.type];\n try {\n return (\n htmlMapper({\n classNames: getClassNames(\n node.breakAfterColumn as string | undefined,\n node.align as string | undefined,\n ),\n children,\n rootNestingCount,\n node,\n mappedMentionable,\n styles,\n }) ?? children\n );\n } catch (error) {\n console.warn(`The htmlMapper for node type: '${node.type}' does not exist.`);\n return children;\n }\n};\n\ntype Arguments = {\n classNames: string;\n children: string;\n rootNestingCount: number;\n node: TElement;\n mappedMentionable?: MappedMentionableItems;\n styles: Record<string, CSSPropertiesHover>;\n};\n\nconst MapNodeTypesToHtml: { [key: string]: ({ ...args }: Arguments) => string } = {\n [TextStyles.heading1]: (args) => getTextStyleHtml(TextStyles.heading1, args, 'h1'),\n [TextStyles.heading2]: (args) => getTextStyleHtml(TextStyles.heading2, args, 'h2'),\n [TextStyles.heading3]: (args) => getTextStyleHtml(TextStyles.heading3, args, 'h3'),\n [TextStyles.heading4]: (args) => getTextStyleHtml(TextStyles.heading4, args, 'h4'),\n [TextStyles.p]: (args) => getTextStyleHtml(TextStyles.p, args, 'p'),\n [TextStyles.custom1]: (args) => getTextStyleHtml(TextStyles.custom1, args, 'p'),\n [TextStyles.custom2]: (args) => getTextStyleHtml(TextStyles.custom2, args, 'p'),\n [TextStyles.custom3]: (args) => getTextStyleHtml(TextStyles.custom3, args, 'p'),\n [TextStyles.quote]: (args) => getTextStyleHtml(TextStyles.quote, args, 'p'),\n [TextStyles.imageTitle]: (args) => getTextStyleHtml(TextStyles.imageTitle, args, 'p'),\n [TextStyles.imageCaption]: (args) => getTextStyleHtml(TextStyles.imageCaption, args, 'p'),\n [ELEMENT_UL]: (args) => `<ul dir=\"auto\" class=\"${UL_CLASSES} ${args.classNames}\">${args.children}</ul>`,\n [ELEMENT_OL]: ({ classNames, children, node, rootNestingCount }) => {\n const nestingLevel = Math.max(rootNestingCount - countNodesOfType([node], ELEMENT_OL), 0);\n return `<ol dir=\"auto\" class=\"${getOrderedListClasses(nestingLevel)} ${classNames}\" style=\"${reactCssPropsToCss(\n OL_STYLES,\n )}\">${children}</ol>`;\n },\n [ELEMENT_LI]: ({ classNames, children, node, styles }) =>\n `<li dir=\"auto\" class=\"${classNames} ${LI_CLASSNAMES}\" style=\"${reactCssPropsToCss(\n getLiStyles(node, styles),\n )}\">${children}</li>`,\n [ELEMENT_LIC]: ({ classNames, children, node }) =>\n `<p dir=\"auto\" class=\"${classNames} ${getLicElementClassNames(node)}\"><span>${children}</span></p>`,\n [ELEMENT_LINK]: ({ node, children, classNames, styles }) => linkNode(node, children, classNames, styles),\n [ELEMENT_BUTTON]: ({ node, children, classNames, styles }) =>\n buttonNode(node, children, classNames, styles as ButtonStylesType),\n [ELEMENT_CHECK_ITEM]: ({ node, children, classNames, styles }) => checkItemNode(node, children, classNames, styles),\n [ELEMENT_MENTION]: ({ node, mappedMentionable }) => mentionHtmlNode(node, { mentionable: mappedMentionable }),\n};\n\nconst getTextStyleHtml = (\n tag: TextStyles,\n { classNames, styles, children }: Arguments,\n htmlTag: 'p' | 'h1' | 'h2' | 'h3' | 'h4',\n) => `<${htmlTag} dir=\"auto\" class=\"${classNames}\" style=\"${reactCssPropsToCss(styles[tag])}\">${children}</${htmlTag}>`;\n\nconst getClassNames = (breakAfterColumn?: string, align?: string) => {\n const breakWordsClass = 'tw-break-words';\n const columnBreakClasses =\n breakAfterColumn === 'active' ? 'tw-break-after-column tw-break-inside-avoid-column' : '';\n const alignClass = align ? alignmentClassnames[align] : '';\n return merge([alignClass, breakWordsClass, columnBreakClasses]);\n};\n"],"names":["countNodesOfType","nodes","type","acc","node","serializeNodeToHtmlRecursive","styles","mappedMentionable","nestingCount","isText","serializeLeafToHtml","rootNestingCount","children","element","htmlMapper","MapNodeTypesToHtml","getClassNames","TextStyles","args","getTextStyleHtml","ELEMENT_UL","UL_CLASSES","ELEMENT_OL","classNames","nestingLevel","getOrderedListClasses","reactCssPropsToCss","OL_STYLES","ELEMENT_LI","LI_CLASSNAMES","getLiStyles","ELEMENT_LIC","getLicElementClassNames","ELEMENT_LINK","linkNode","ELEMENT_BUTTON","buttonNode","ELEMENT_CHECK_ITEM","checkItemNode","ELEMENT_MENTION","mentionHtmlNode","tag","htmlTag","breakAfterColumn","align","breakWordsClass","columnBreakClasses","alignClass","alignmentClassnames","merge"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serializeNodeToHtmlRecursive.es.js","sources":["../../../../../src/components/RichTextEditor/serializer/utils/serializeNodeToHtmlRecursive.ts"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {\n ELEMENT_BUTTON,\n ELEMENT_CHECK_ITEM,\n MappedMentionableItems,\n OL_STYLES,\n TextStyles,\n UL_CLASSES,\n alignmentClassnames,\n getOrderedListClasses,\n} from '@components/RichTextEditor/Plugins';\nimport { getLicElementClassNames } from '@components/RichTextEditor/Plugins/ListPlugin/ListItemContentMarkupElement';\nimport { LI_CLASSNAMES, getLiStyles } from '@components/RichTextEditor/Plugins/ListPlugin/ListItemMarkupElement';\nimport {\n ELEMENT_LI,\n ELEMENT_LIC,\n ELEMENT_LINK,\n ELEMENT_MENTION,\n ELEMENT_OL,\n ELEMENT_UL,\n TDescendant,\n TElement,\n isText,\n} from '@udecode/plate';\nimport { merge } from '@utilities/merge';\nimport { ButtonStylesType, buttonNode } from '../nodes/button';\nimport { checkItemNode } from '../nodes/checkItem';\nimport { linkNode } from '../nodes/link';\nimport { mentionHtmlNode } from '../nodes/mentionHtmlNode';\nimport { reactCssPropsToCss } from './reactCssPropsToCss';\nimport { serializeLeafToHtml } from './serializeLeafToHtml';\nimport { CSSPropertiesHover } from '../types';\n\nconst getNestingLevels = (nodes: TDescendant[], type: string): number => {\n let maxDepth = 0;\n\n for (const node of nodes) {\n let currentDepth = 0;\n if (node.type === type) {\n currentDepth = 1;\n }\n if (node.children) {\n currentDepth += getNestingLevels(node.children as TDescendant[], type);\n }\n maxDepth = Math.max(maxDepth, currentDepth);\n }\n\n return maxDepth;\n};\n\ntype NestingCount = {\n [type: string]: number;\n};\n\ntype SerializeNodeToHtmlRecursiveOptions = {\n mappedMentionable?: MappedMentionableItems;\n nestingCount?: NestingCount;\n};\n\nexport const serializeNodeToHtmlRecursive = (\n node: TDescendant,\n styles: Record<string, CSSPropertiesHover> | ButtonStylesType,\n { mappedMentionable, nestingCount = {} }: SerializeNodeToHtmlRecursiveOptions,\n): string => {\n if (isText(node)) {\n return serializeLeafToHtml(node);\n }\n\n const rootNestingCount = nestingCount[node.type] || getNestingLevels([node], node.type);\n let children = '';\n for (const element of node.children) {\n children += serializeNodeToHtmlRecursive(element, styles, {\n nestingCount: {\n ...nestingCount,\n [element.type as string]: rootNestingCount,\n },\n mappedMentionable,\n });\n }\n\n const htmlMapper = MapNodeTypesToHtml[node.type];\n try {\n return (\n htmlMapper({\n classNames: getClassNames(\n node.breakAfterColumn as string | undefined,\n node.align as string | undefined,\n ),\n children,\n rootNestingCount,\n node,\n mappedMentionable,\n styles,\n }) ?? children\n );\n } catch (error) {\n console.warn(`The htmlMapper for node type: '${node.type}' does not exist.`);\n return children;\n }\n};\n\ntype Arguments = {\n classNames: string;\n children: string;\n rootNestingCount: number;\n node: TElement;\n mappedMentionable?: MappedMentionableItems;\n styles: Record<string, CSSPropertiesHover>;\n};\n\nconst MapNodeTypesToHtml: { [key: string]: ({ ...args }: Arguments) => string } = {\n [TextStyles.heading1]: (args) => getTextStyleHtml(TextStyles.heading1, args, 'h1'),\n [TextStyles.heading2]: (args) => getTextStyleHtml(TextStyles.heading2, args, 'h2'),\n [TextStyles.heading3]: (args) => getTextStyleHtml(TextStyles.heading3, args, 'h3'),\n [TextStyles.heading4]: (args) => getTextStyleHtml(TextStyles.heading4, args, 'h4'),\n [TextStyles.p]: (args) => getTextStyleHtml(TextStyles.p, args, 'p'),\n [TextStyles.custom1]: (args) => getTextStyleHtml(TextStyles.custom1, args, 'p'),\n [TextStyles.custom2]: (args) => getTextStyleHtml(TextStyles.custom2, args, 'p'),\n [TextStyles.custom3]: (args) => getTextStyleHtml(TextStyles.custom3, args, 'p'),\n [TextStyles.quote]: (args) => getTextStyleHtml(TextStyles.quote, args, 'p'),\n [TextStyles.imageTitle]: (args) => getTextStyleHtml(TextStyles.imageTitle, args, 'p'),\n [TextStyles.imageCaption]: (args) => getTextStyleHtml(TextStyles.imageCaption, args, 'p'),\n [ELEMENT_UL]: (args) => `<ul dir=\"auto\" class=\"${UL_CLASSES} ${args.classNames}\">${args.children}</ul>`,\n [ELEMENT_OL]: ({ classNames, children, node, rootNestingCount }) => {\n const nestingLevel = Math.max(rootNestingCount - getNestingLevels([node], ELEMENT_OL), 0);\n return `<ol dir=\"auto\" class=\"${getOrderedListClasses(nestingLevel)} ${classNames}\" style=\"${reactCssPropsToCss(\n OL_STYLES,\n )}\">${children}</ol>`;\n },\n [ELEMENT_LI]: ({ classNames, children, node, styles }) =>\n `<li dir=\"auto\" class=\"${classNames} ${LI_CLASSNAMES}\" style=\"${reactCssPropsToCss(\n getLiStyles(node, styles),\n )}\">${children}</li>`,\n [ELEMENT_LIC]: ({ classNames, children, node }) =>\n `<p dir=\"auto\" class=\"${classNames} ${getLicElementClassNames(node)}\"><span>${children}</span></p>`,\n [ELEMENT_LINK]: ({ node, children, classNames, styles }) => linkNode(node, children, classNames, styles),\n [ELEMENT_BUTTON]: ({ node, children, classNames, styles }) =>\n buttonNode(node, children, classNames, styles as ButtonStylesType),\n [ELEMENT_CHECK_ITEM]: ({ node, children, classNames, styles }) => checkItemNode(node, children, classNames, styles),\n [ELEMENT_MENTION]: ({ node, mappedMentionable }) => mentionHtmlNode(node, { mentionable: mappedMentionable }),\n};\n\nconst getTextStyleHtml = (\n tag: TextStyles,\n { classNames, styles, children }: Arguments,\n htmlTag: 'p' | 'h1' | 'h2' | 'h3' | 'h4',\n) => `<${htmlTag} dir=\"auto\" class=\"${classNames}\" style=\"${reactCssPropsToCss(styles[tag])}\">${children}</${htmlTag}>`;\n\nconst getClassNames = (breakAfterColumn?: string, align?: string) => {\n const breakWordsClass = 'tw-break-words';\n const columnBreakClasses =\n breakAfterColumn === 'active' ? 'tw-break-after-column tw-break-inside-avoid-column' : '';\n const alignClass = align ? alignmentClassnames[align] : '';\n return merge([alignClass, breakWordsClass, columnBreakClasses]);\n};\n"],"names":["getNestingLevels","nodes","type","maxDepth","node","currentDepth","serializeNodeToHtmlRecursive","styles","mappedMentionable","nestingCount","isText","serializeLeafToHtml","rootNestingCount","children","element","htmlMapper","MapNodeTypesToHtml","getClassNames","TextStyles","args","getTextStyleHtml","ELEMENT_UL","UL_CLASSES","ELEMENT_OL","classNames","nestingLevel","getOrderedListClasses","reactCssPropsToCss","OL_STYLES","ELEMENT_LI","LI_CLASSNAMES","getLiStyles","ELEMENT_LIC","getLicElementClassNames","ELEMENT_LINK","linkNode","ELEMENT_BUTTON","buttonNode","ELEMENT_CHECK_ITEM","checkItemNode","ELEMENT_MENTION","mentionHtmlNode","tag","htmlTag","breakAfterColumn","align","breakWordsClass","columnBreakClasses","alignClass","alignmentClassnames","merge"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { useRef as V, useState as
|
|
1
|
+
import { jsxs as m, Fragment as K, jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as V, useState as y, Children as A, isValidElement as L, useCallback as U, useEffect as T, cloneElement as W } from "react";
|
|
3
3
|
import { merge as p } from "../../utilities/merge.es.js";
|
|
4
4
|
import { motion as H } from "framer-motion";
|
|
5
5
|
import { useFocusRing as Y } from "@react-aria/focus";
|
|
@@ -7,68 +7,68 @@ import { FOCUS_STYLE as _ } from "../../utilities/focusStyle.es.js";
|
|
|
7
7
|
import { useMemoizedId as q } from "../../hooks/useMemoizedId.es.js";
|
|
8
8
|
import G from "../../foundation/Icon/Generated/IconDotsHorizontal.es.js";
|
|
9
9
|
import { Badge as B } from "../Badge/Badge.es.js";
|
|
10
|
-
var J = /* @__PURE__ */ ((
|
|
10
|
+
var J = /* @__PURE__ */ ((o) => (o.None = "None", o.XSmall = "XSmall", o.Small = "Small", o.Medium = "Medium", o.Large = "Large", o))(J || {}), P = /* @__PURE__ */ ((o) => (o.Small = "Small", o.Large = "Large", o))(P || {});
|
|
11
11
|
const Q = {
|
|
12
12
|
None: "tw-pl-0",
|
|
13
13
|
XSmall: "tw-pl-xs",
|
|
14
14
|
Small: "tw-pl-s",
|
|
15
15
|
Medium: "tw-pl-m",
|
|
16
16
|
Large: "tw-pl-l"
|
|
17
|
-
}, Z = ({
|
|
18
|
-
paddingX:
|
|
19
|
-
size:
|
|
17
|
+
}, Z = (o, g) => o.disabled ? "tw-text-text-disabled" : o.id === g ? "tw-font-medium tw-text-text" : "tw-text-text-weak hover:tw-text-text", X = ({
|
|
18
|
+
paddingX: o,
|
|
19
|
+
size: g,
|
|
20
20
|
activeItemId: i,
|
|
21
21
|
children: v,
|
|
22
22
|
onChange: N,
|
|
23
|
-
maxHeight:
|
|
24
|
-
minHeight:
|
|
23
|
+
maxHeight: $,
|
|
24
|
+
minHeight: C
|
|
25
25
|
}) => {
|
|
26
|
-
const
|
|
26
|
+
const M = q(), k = V(null), [E, D] = y(!1), [w, c] = y(!1), x = A.map(v, (t) => L(t) ? t == null ? void 0 : t.props : null) ?? [], [F, R] = y([0]), a = U(() => {
|
|
27
27
|
const t = k.current;
|
|
28
28
|
D((t && t.scrollWidth > t.clientWidth) ?? !1);
|
|
29
29
|
const r = [];
|
|
30
30
|
if (t) {
|
|
31
31
|
for (const e of t.children) {
|
|
32
|
-
const s = [...t.children].indexOf(e), f = t.getBoundingClientRect(),
|
|
33
|
-
(
|
|
32
|
+
const s = [...t.children].indexOf(e), f = t.getBoundingClientRect(), u = e.getBoundingClientRect();
|
|
33
|
+
(u.right > f.right || u.left < f.left) && r.push(s);
|
|
34
34
|
}
|
|
35
|
-
const
|
|
36
|
-
R(
|
|
35
|
+
const n = [...r].sort((e, s) => e - s);
|
|
36
|
+
R(n);
|
|
37
37
|
}
|
|
38
|
-
}, []),
|
|
39
|
-
const
|
|
40
|
-
return t.filter((e, s) => r === "next" && s >
|
|
38
|
+
}, []), b = () => F.map((t) => x[t]), S = (t, r) => {
|
|
39
|
+
const n = t.findIndex((e) => e.id === i);
|
|
40
|
+
return t.filter((e, s) => r === "next" && s > n && !e.disabled || r === "previous" && s < n && !e.disabled ? e : !1);
|
|
41
41
|
}, O = (t) => {
|
|
42
42
|
t.stopPropagation();
|
|
43
|
-
const r =
|
|
44
|
-
(t.key === "ArrowRight" || t.key === "ArrowDown") &&
|
|
43
|
+
const r = b(), n = t.target, e = n.id.includes("-m"), s = n.id.replace("-btn-m", ""), f = e ? r : x, u = S(f, "next"), h = S(f, "previous");
|
|
44
|
+
(t.key === "ArrowRight" || t.key === "ArrowDown") && u.length > 0 && d(u[0].id, e), (t.key === "ArrowLeft" || t.key === "ArrowUp") && h.length > 0 && d(h[h.length - 1].id, e), t.key === "Enter" && e && (d(s, !0), c(!1), document.getElementById(`${s}-content`).focus()), n.id.includes("-m") || c(!1);
|
|
45
45
|
}, d = (t, r) => {
|
|
46
46
|
try {
|
|
47
|
-
const
|
|
47
|
+
const n = document.getElementById(`${t}-btn`), e = document.getElementById(
|
|
48
48
|
r ? `${t}-btn-m` : `${t}-btn`
|
|
49
49
|
);
|
|
50
|
-
N && N(t), E &&
|
|
51
|
-
} catch (
|
|
52
|
-
throw
|
|
50
|
+
N && N(t), E && n.scrollIntoView({ behavior: "smooth", block: "end", inline: "end" }), e.focus();
|
|
51
|
+
} catch (n) {
|
|
52
|
+
throw n.message;
|
|
53
53
|
}
|
|
54
54
|
}, j = (t) => {
|
|
55
55
|
a();
|
|
56
|
-
const r =
|
|
56
|
+
const r = b();
|
|
57
57
|
if (t.key === "Enter" && !w && r.length > 0) {
|
|
58
|
-
const
|
|
59
|
-
|
|
58
|
+
const n = document.getElementById(`${r[0].id}-btn-m`);
|
|
59
|
+
n && n.focus();
|
|
60
60
|
}
|
|
61
61
|
w && (t.key === "ArrowRight" || t.key === "ArrowDown") && d(r[0].id, !0);
|
|
62
62
|
};
|
|
63
|
-
|
|
63
|
+
T(() => {
|
|
64
64
|
a();
|
|
65
|
-
}, [a]),
|
|
65
|
+
}, [a]), T(() => (window.addEventListener("resize", a), () => {
|
|
66
66
|
window.removeEventListener("resize", a);
|
|
67
67
|
}), [a]);
|
|
68
|
-
const { isFocusVisible: I, focusProps:
|
|
69
|
-
return /* @__PURE__ */
|
|
70
|
-
/* @__PURE__ */
|
|
71
|
-
/* @__PURE__ */
|
|
68
|
+
const { isFocusVisible: I, focusProps: z } = Y();
|
|
69
|
+
return /* @__PURE__ */ m(K, { children: [
|
|
70
|
+
/* @__PURE__ */ m("div", { "data-test-id": "tabs", className: "tw-flex tw-relative tw-border-b tw-border-line", children: [
|
|
71
|
+
/* @__PURE__ */ l(
|
|
72
72
|
"div",
|
|
73
73
|
{
|
|
74
74
|
ref: k,
|
|
@@ -76,12 +76,12 @@ const Q = {
|
|
|
76
76
|
className: p([
|
|
77
77
|
"tw-overflow-x-hidden tw-flex-shrink-0 tw-h-full tw-w-full tw-flex tw-justify-start",
|
|
78
78
|
Q[
|
|
79
|
-
|
|
79
|
+
o ?? "Small"
|
|
80
80
|
/* Small */
|
|
81
81
|
],
|
|
82
|
-
|
|
82
|
+
g === "Small" ? "tw-gap-xxs" : "tw-gap-xs "
|
|
83
83
|
]),
|
|
84
|
-
children:
|
|
84
|
+
children: x.map((t) => /* @__PURE__ */ m(
|
|
85
85
|
"button",
|
|
86
86
|
{
|
|
87
87
|
"data-test-id": "tab-item",
|
|
@@ -94,26 +94,23 @@ const Q = {
|
|
|
94
94
|
id: `${t.id}-btn`,
|
|
95
95
|
className: p([
|
|
96
96
|
"tw-group tw-relative tw-mx-0 tw-py-4 tw-px-2 tw-w-max tw-cursor-pointer tw-flex tw-items-center tw-justify-center tw-whitespace-nowrap",
|
|
97
|
-
t
|
|
98
|
-
!t.disabled && "hover:tw-text-text",
|
|
99
|
-
t.id === i ? "tw-font-medium tw-text-text" : "tw-text-text-weak",
|
|
100
|
-
y === "Small" ? "tw-text-sm" : "tw-text-md"
|
|
97
|
+
Z(t, i)
|
|
101
98
|
]),
|
|
102
99
|
onClick: () => {
|
|
103
100
|
t.disabled || (d(t.id, !1), c(!1));
|
|
104
101
|
},
|
|
105
102
|
onKeyDown: (r) => O(r),
|
|
106
103
|
children: [
|
|
107
|
-
t.decorator && /* @__PURE__ */
|
|
108
|
-
/* @__PURE__ */
|
|
109
|
-
t.badge && /* @__PURE__ */
|
|
110
|
-
t.id === i && /* @__PURE__ */
|
|
104
|
+
t.decorator && /* @__PURE__ */ l("span", { className: "tw-mr-1.5", children: t.decorator }),
|
|
105
|
+
/* @__PURE__ */ l("span", { children: t.label }),
|
|
106
|
+
t.badge && /* @__PURE__ */ l("span", { className: "tw-ml-1.5", children: /* @__PURE__ */ l(B, { disabled: t.disabled, style: t.badge.style, children: t.badge.children }) }),
|
|
107
|
+
t.id === i && /* @__PURE__ */ l(
|
|
111
108
|
H.div,
|
|
112
109
|
{
|
|
113
110
|
initial: !1,
|
|
114
111
|
layoutDependency: i,
|
|
115
112
|
"data-test-id": "tab-active-highlight",
|
|
116
|
-
layoutId:
|
|
113
|
+
layoutId: M,
|
|
117
114
|
className: "tw-absolute tw-h-[3px] tw-bg-box-selected-strong tw-rounded-t-x-large tw-w-full tw-bottom-0"
|
|
118
115
|
}
|
|
119
116
|
)
|
|
@@ -123,13 +120,13 @@ const Q = {
|
|
|
123
120
|
))
|
|
124
121
|
}
|
|
125
122
|
),
|
|
126
|
-
E && /* @__PURE__ */
|
|
123
|
+
E && /* @__PURE__ */ m(
|
|
127
124
|
"div",
|
|
128
125
|
{
|
|
129
126
|
"data-test-id": "tab-overflow",
|
|
130
127
|
className: "tw-absolute tw-z-50 tw-right-3 tw-bottom-0 tw-top-0 tw-flex tw-justify-center tw-items-center",
|
|
131
128
|
children: [
|
|
132
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ l(
|
|
133
130
|
"button",
|
|
134
131
|
{
|
|
135
132
|
className: p([
|
|
@@ -141,18 +138,18 @@ const Q = {
|
|
|
141
138
|
a(), c(!w);
|
|
142
139
|
},
|
|
143
140
|
onKeyDown: (t) => j(t),
|
|
144
|
-
...
|
|
145
|
-
children: /* @__PURE__ */
|
|
141
|
+
...z,
|
|
142
|
+
children: /* @__PURE__ */ l(G, {})
|
|
146
143
|
}
|
|
147
144
|
),
|
|
148
|
-
w && /* @__PURE__ */
|
|
145
|
+
w && /* @__PURE__ */ l(
|
|
149
146
|
"div",
|
|
150
147
|
{
|
|
151
148
|
className: "tw-absolute tw-right-0 tw-top-11 tw-px-3 tw-pt-3 tw-bg-base tw-shadow tw-w-max",
|
|
152
149
|
role: "dialog",
|
|
153
|
-
children:
|
|
154
|
-
var r,
|
|
155
|
-
return /* @__PURE__ */
|
|
150
|
+
children: b().map((t) => {
|
|
151
|
+
var r, n;
|
|
152
|
+
return /* @__PURE__ */ m(
|
|
156
153
|
"button",
|
|
157
154
|
{
|
|
158
155
|
className: p([
|
|
@@ -172,8 +169,8 @@ const Q = {
|
|
|
172
169
|
onKeyDown: (e) => O(e),
|
|
173
170
|
children: [
|
|
174
171
|
t.decorator,
|
|
175
|
-
/* @__PURE__ */
|
|
176
|
-
t.badge && /* @__PURE__ */
|
|
172
|
+
/* @__PURE__ */ l("span", { className: "tw-mr-1 tw-ml-1.5", children: t.label }),
|
|
173
|
+
t.badge && /* @__PURE__ */ l(B, { disabled: t.disabled, style: (r = t.badge) == null ? void 0 : r.style, children: (n = t.badge) == null ? void 0 : n.children })
|
|
177
174
|
]
|
|
178
175
|
},
|
|
179
176
|
t.id
|
|
@@ -185,13 +182,13 @@ const Q = {
|
|
|
185
182
|
}
|
|
186
183
|
)
|
|
187
184
|
] }),
|
|
188
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ l("div", { "data-test-id": "tab-content", className: "tw-flex tw-flex-col tw-overflow-y-auto", children: /* @__PURE__ */ l("div", { className: "tw-mr-0", style: { maxHeight: $, minHeight: C }, children: A.map(v, (t) => L(t) ? W(t, { ...t.props, active: t.props.id === i }) : null) }) })
|
|
189
186
|
] });
|
|
190
187
|
};
|
|
191
|
-
|
|
188
|
+
X.displayName = "FondueTabs";
|
|
192
189
|
export {
|
|
193
190
|
P as TabSize,
|
|
194
|
-
|
|
191
|
+
X as Tabs,
|
|
195
192
|
J as TabsPaddingX
|
|
196
193
|
};
|
|
197
194
|
//# sourceMappingURL=Tabs.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tabs.es.js","sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {\n Children,\n KeyboardEvent,\n ReactElement,\n ReactNode,\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { TabItemProps } from '@components/Tabs/TabItem';\nimport { merge } from '@utilities/merge';\nimport { IconDotsHorizontal } from '@foundation/Icon/Generated';\nimport { Badge } from '@components/Badge';\nimport { motion } from 'framer-motion';\nimport { useFocusRing } from '@react-aria/focus';\nimport { FOCUS_STYLE } from '@utilities/focusStyle';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { DimensionUnity } from '@utilities/dimensions';\n\nexport enum TabsPaddingX {\n None = 'None',\n XSmall = 'XSmall',\n Small = 'Small',\n Medium = 'Medium',\n Large = 'Large',\n}\n\nexport enum TabSize {\n Small = 'Small',\n Large = 'Large',\n}\n\nexport type TabsProps = {\n paddingX?: TabsPaddingX;\n size?: TabSize;\n activeItemId: string;\n children: ReactNode;\n onChange?: (tabId: string) => void;\n maxHeight?: `${number}${DimensionUnity}`;\n minHeight?: `${number}${DimensionUnity}`;\n};\n\nconst paddingMap: Record<TabsPaddingX, string> = {\n [TabsPaddingX.None]: 'tw-pl-0',\n [TabsPaddingX.XSmall]: 'tw-pl-xs',\n [TabsPaddingX.Small]: 'tw-pl-s',\n [TabsPaddingX.Medium]: 'tw-pl-m',\n [TabsPaddingX.Large]: 'tw-pl-l',\n};\n\nexport const Tabs = ({\n paddingX,\n size,\n activeItemId,\n children,\n onChange,\n maxHeight,\n minHeight,\n}: TabsProps): ReactElement => {\n const groupId = useMemoizedId();\n const tabNavRef = useRef<HTMLDivElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [isMenuOpened, setIsMenuOpened] = useState(false);\n\n const tabs: TabItemProps[] =\n Children.map(children, (child) => {\n if (!isValidElement<TabItemProps>(child)) {\n return null;\n }\n return child?.props;\n }) ?? [];\n\n const [overflowArray, setOverflowArray] = useState([0]);\n\n const checkIfOverflowing = useCallback(() => {\n const tabNav = tabNavRef.current;\n setIsOverflowing((tabNav && tabNav.scrollWidth > tabNav.clientWidth) ?? false);\n const overFlowIndex = [];\n if (tabNav) {\n for (const tabItem of tabNav.children) {\n const i = [...tabNav.children].indexOf(tabItem);\n const navPosition = tabNav.getBoundingClientRect();\n const tabPosition = tabItem.getBoundingClientRect();\n if (tabPosition.right > navPosition.right || tabPosition.left < navPosition.left) {\n overFlowIndex.push(i);\n }\n }\n\n const overFlowIndexInAscOrder = [...overFlowIndex].sort((a, b) => a - b);\n setOverflowArray(overFlowIndexInAscOrder);\n }\n }, []);\n\n const getOverflownTabs = () => {\n return overflowArray.map((i) => {\n return tabs[i];\n });\n };\n\n const filterTabList = (array: TabItemProps[], direction: string) => {\n const activeItemIndex = array.findIndex((tab) => tab.id === activeItemId);\n\n return array.filter((tab, index) => {\n if (direction === 'next') {\n if (index > activeItemIndex && !tab.disabled) {\n return tab;\n }\n }\n\n if (direction === 'previous') {\n if (index < activeItemIndex && !tab.disabled) {\n return tab;\n }\n }\n\n return false;\n });\n };\n\n const handleKeyboardTabChange = (event: KeyboardEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n\n const overflownTabs = getOverflownTabs();\n const target = event.target as HTMLElement;\n const fromOverflow = target.id.includes('-m');\n const currentTabId = target.id.replace('-btn-m', '');\n const currentTabsArray = fromOverflow ? overflownTabs : tabs;\n\n const nextTabs = filterTabList(currentTabsArray, 'next');\n const previousTabs = filterTabList(currentTabsArray, 'previous');\n\n if ((event.key === 'ArrowRight' || event.key === 'ArrowDown') && nextTabs.length > 0) {\n triggerTabButton(nextTabs[0].id, fromOverflow);\n }\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowUp') && previousTabs.length > 0) {\n triggerTabButton(previousTabs[previousTabs.length - 1].id, fromOverflow);\n }\n\n if (event.key === 'Enter' && fromOverflow) {\n triggerTabButton(currentTabId, true);\n setIsMenuOpened(false);\n const contentSection = document.getElementById(`${currentTabId}-content`) as HTMLDivElement;\n contentSection.focus();\n }\n\n if (!target.id.includes('-m')) {\n setIsMenuOpened(false);\n }\n };\n\n const triggerTabButton = (elementId: string, fromOverflow: boolean) => {\n try {\n const tabElement = document.getElementById(`${elementId}-btn`) as HTMLButtonElement;\n const buttonElement = document.getElementById(\n fromOverflow ? `${elementId}-btn-m` : `${elementId}-btn`,\n ) as HTMLButtonElement;\n if (onChange) {\n onChange(elementId);\n }\n if (isOverflowing) {\n tabElement.scrollIntoView({ behavior: 'smooth', block: 'end', inline: 'end' });\n }\n buttonElement.focus();\n } catch (error) {\n throw (error as Error).message;\n }\n };\n\n const triggerOverflowMenu = (event: KeyboardEvent<HTMLButtonElement>) => {\n checkIfOverflowing();\n const overflownTabs = getOverflownTabs();\n\n if (event.key === 'Enter') {\n if (!isMenuOpened && overflownTabs.length > 0) {\n const buttonElement = document.getElementById(`${overflownTabs[0].id}-btn-m`) as HTMLButtonElement;\n if (buttonElement) {\n buttonElement.focus();\n }\n }\n }\n\n if (isMenuOpened && (event.key === 'ArrowRight' || event.key === 'ArrowDown')) {\n triggerTabButton(overflownTabs[0].id, true);\n }\n };\n\n // First render\n useEffect(() => {\n checkIfOverflowing();\n }, [checkIfOverflowing]);\n\n useEffect(() => {\n window.addEventListener('resize', checkIfOverflowing);\n return () => {\n window.removeEventListener('resize', checkIfOverflowing);\n };\n }, [checkIfOverflowing]);\n\n const { isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <>\n <div data-test-id=\"tabs\" className=\"tw-flex tw-relative tw-border-b tw-border-line\">\n <div\n ref={tabNavRef}\n role=\"tablist\"\n className={merge([\n 'tw-overflow-x-hidden tw-flex-shrink-0 tw-h-full tw-w-full tw-flex tw-justify-start',\n paddingMap[paddingX ?? TabsPaddingX.Small],\n size === TabSize.Small ? 'tw-gap-xxs' : 'tw-gap-xs ',\n ])}\n >\n {tabs.map((tab) => {\n return (\n <button\n data-test-id=\"tab-item\"\n role=\"tab\"\n type=\"button\"\n aria-selected={tab.id === activeItemId}\n aria-controls={`${tab.id}-content`}\n aria-hidden={tab.disabled}\n tabIndex={tab.id === activeItemId ? 0 : -1}\n id={`${tab.id}-btn`}\n className={merge([\n 'tw-group tw-relative tw-mx-0 tw-py-4 tw-px-2 tw-w-max tw-cursor-pointer tw-flex tw-items-center tw-justify-center tw-whitespace-nowrap',\n tab.disabled && 'tw-text-text-disabled',\n !tab.disabled && 'hover:tw-text-text',\n tab.id === activeItemId ? 'tw-font-medium tw-text-text' : 'tw-text-text-weak',\n size === TabSize.Small ? 'tw-text-sm' : 'tw-text-md',\n ])}\n key={tab.id}\n onClick={() => {\n if (!tab.disabled) {\n triggerTabButton(tab.id, false);\n setIsMenuOpened(false);\n }\n }}\n onKeyDown={(event) => handleKeyboardTabChange(event)}\n >\n {tab.decorator && <span className=\"tw-mr-1.5\">{tab.decorator}</span>}\n\n <span>{tab.label}</span>\n\n {tab.badge && (\n <span className=\"tw-ml-1.5\">\n <Badge disabled={tab.disabled} style={tab.badge.style}>\n {tab.badge.children}\n </Badge>\n </span>\n )}\n {tab.id === activeItemId && (\n <motion.div\n initial={false}\n layoutDependency={activeItemId}\n data-test-id=\"tab-active-highlight\"\n layoutId={groupId}\n className=\"tw-absolute tw-h-[3px] tw-bg-box-selected-strong tw-rounded-t-x-large tw-w-full tw-bottom-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n {isOverflowing && (\n <div\n data-test-id=\"tab-overflow\"\n className=\"tw-absolute tw-z-50 tw-right-3 tw-bottom-0 tw-top-0 tw-flex tw-justify-center tw-items-center\"\n >\n <button\n className={merge([\n 'tw-w-6 tw-h-6 tw-bg-box-neutral tw-rounded tw-flex tw-justify-center tw-items-center',\n isFocusVisible ? FOCUS_STYLE : '',\n ])}\n type=\"button\"\n onClick={() => {\n checkIfOverflowing();\n setIsMenuOpened(!isMenuOpened);\n }}\n onKeyDown={(event) => triggerOverflowMenu(event)}\n {...focusProps}\n >\n <IconDotsHorizontal />\n </button>\n {isMenuOpened && (\n <div\n className=\"tw-absolute tw-right-0 tw-top-11 tw-px-3 tw-pt-3 tw-bg-base tw-shadow tw-w-max\"\n role=\"dialog\"\n >\n {getOverflownTabs().map((tab) => {\n return (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-w-full tw-mb-3 tw-text-left tw-text-text-weak',\n tab.disabled && 'tw-text-text-disabled',\n ])}\n key={tab.id}\n onClick={() => {\n if (!tab.disabled) {\n triggerTabButton(tab.id, true);\n setIsMenuOpened(false);\n }\n }}\n role=\"tab\"\n type=\"button\"\n aria-selected={tab.id === activeItemId}\n aria-controls={`${tab.id}-content`}\n aria-hidden={tab.disabled}\n tabIndex={!tab.disabled && isMenuOpened ? 0 : -1}\n id={`${tab.id}-btn-m`}\n onKeyDown={(event) => handleKeyboardTabChange(event)}\n >\n {tab.decorator}\n <span className=\"tw-mr-1 tw-ml-1.5\">{tab.label}</span>\n {tab.badge && (\n <Badge disabled={tab.disabled} style={tab.badge?.style}>\n {tab.badge?.children}\n </Badge>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n\n <div data-test-id=\"tab-content\" className=\"tw-flex tw-flex-col tw-overflow-y-auto\">\n <div className=\"tw-mr-0\" style={{ maxHeight, minHeight }}>\n {Children.map(children, (child) => {\n if (!isValidElement(child)) {\n return null;\n }\n\n return cloneElement(child, { ...child.props, active: child.props.id === activeItemId });\n })}\n </div>\n </div>\n </>\n );\n};\nTabs.displayName = 'FondueTabs';\n"],"names":["TabsPaddingX","TabSize","paddingMap","Tabs","paddingX","size","activeItemId","children","onChange","maxHeight","minHeight","groupId","useMemoizedId","tabNavRef","useRef","isOverflowing","setIsOverflowing","useState","isMenuOpened","setIsMenuOpened","tabs","Children","child","isValidElement","overflowArray","setOverflowArray","checkIfOverflowing","useCallback","tabNav","overFlowIndex","tabItem","i","navPosition","tabPosition","overFlowIndexInAscOrder","a","b","getOverflownTabs","filterTabList","array","direction","activeItemIndex","tab","index","handleKeyboardTabChange","event","overflownTabs","target","fromOverflow","currentTabId","currentTabsArray","nextTabs","previousTabs","triggerTabButton","elementId","tabElement","buttonElement","error","triggerOverflowMenu","useEffect","isFocusVisible","focusProps","useFocusRing","jsxs","Fragment","jsx","merge","Badge","motion","FOCUS_STYLE","IconDotsHorizontal","_a","_b","cloneElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tabs.es.js","sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {\n Children,\n KeyboardEvent,\n ReactElement,\n ReactNode,\n cloneElement,\n isValidElement,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { TabItemProps } from '@components/Tabs/TabItem';\nimport { merge } from '@utilities/merge';\nimport { IconDotsHorizontal } from '@foundation/Icon/Generated';\nimport { Badge } from '@components/Badge';\nimport { motion } from 'framer-motion';\nimport { useFocusRing } from '@react-aria/focus';\nimport { FOCUS_STYLE } from '@utilities/focusStyle';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { DimensionUnity } from '@utilities/dimensions';\n\nexport enum TabsPaddingX {\n None = 'None',\n XSmall = 'XSmall',\n Small = 'Small',\n Medium = 'Medium',\n Large = 'Large',\n}\n\nexport enum TabSize {\n Small = 'Small',\n Large = 'Large',\n}\n\nexport type TabsProps = {\n paddingX?: TabsPaddingX;\n size?: TabSize;\n activeItemId: string;\n children: ReactNode;\n onChange?: (tabId: string) => void;\n maxHeight?: `${number}${DimensionUnity}`;\n minHeight?: `${number}${DimensionUnity}`;\n};\n\nconst paddingMap: Record<TabsPaddingX, string> = {\n [TabsPaddingX.None]: 'tw-pl-0',\n [TabsPaddingX.XSmall]: 'tw-pl-xs',\n [TabsPaddingX.Small]: 'tw-pl-s',\n [TabsPaddingX.Medium]: 'tw-pl-m',\n [TabsPaddingX.Large]: 'tw-pl-l',\n};\n\nconst getTabButtonTextStyle = (tab: TabItemProps, activeItemId: string) => {\n if (tab.disabled) {\n return 'tw-text-text-disabled';\n }\n\n if (tab.id === activeItemId) {\n return 'tw-font-medium tw-text-text';\n }\n\n return 'tw-text-text-weak hover:tw-text-text';\n};\n\nexport const Tabs = ({\n paddingX,\n size,\n activeItemId,\n children,\n onChange,\n maxHeight,\n minHeight,\n}: TabsProps): ReactElement => {\n const groupId = useMemoizedId();\n const tabNavRef = useRef<HTMLDivElement | null>(null);\n const [isOverflowing, setIsOverflowing] = useState(false);\n const [isMenuOpened, setIsMenuOpened] = useState(false);\n\n const tabs: TabItemProps[] =\n Children.map(children, (child) => {\n if (!isValidElement<TabItemProps>(child)) {\n return null;\n }\n return child?.props;\n }) ?? [];\n\n const [overflowArray, setOverflowArray] = useState([0]);\n\n const checkIfOverflowing = useCallback(() => {\n const tabNav = tabNavRef.current;\n setIsOverflowing((tabNav && tabNav.scrollWidth > tabNav.clientWidth) ?? false);\n const overFlowIndex = [];\n if (tabNav) {\n for (const tabItem of tabNav.children) {\n const i = [...tabNav.children].indexOf(tabItem);\n const navPosition = tabNav.getBoundingClientRect();\n const tabPosition = tabItem.getBoundingClientRect();\n if (tabPosition.right > navPosition.right || tabPosition.left < navPosition.left) {\n overFlowIndex.push(i);\n }\n }\n\n const overFlowIndexInAscOrder = [...overFlowIndex].sort((a, b) => a - b);\n setOverflowArray(overFlowIndexInAscOrder);\n }\n }, []);\n\n const getOverflownTabs = () => {\n return overflowArray.map((i) => {\n return tabs[i];\n });\n };\n\n const filterTabList = (array: TabItemProps[], direction: string) => {\n const activeItemIndex = array.findIndex((tab) => tab.id === activeItemId);\n\n return array.filter((tab, index) => {\n if (direction === 'next') {\n if (index > activeItemIndex && !tab.disabled) {\n return tab;\n }\n }\n\n if (direction === 'previous') {\n if (index < activeItemIndex && !tab.disabled) {\n return tab;\n }\n }\n\n return false;\n });\n };\n\n const handleKeyboardTabChange = (event: KeyboardEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n\n const overflownTabs = getOverflownTabs();\n const target = event.target as HTMLElement;\n const fromOverflow = target.id.includes('-m');\n const currentTabId = target.id.replace('-btn-m', '');\n const currentTabsArray = fromOverflow ? overflownTabs : tabs;\n\n const nextTabs = filterTabList(currentTabsArray, 'next');\n const previousTabs = filterTabList(currentTabsArray, 'previous');\n\n if ((event.key === 'ArrowRight' || event.key === 'ArrowDown') && nextTabs.length > 0) {\n triggerTabButton(nextTabs[0].id, fromOverflow);\n }\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowUp') && previousTabs.length > 0) {\n triggerTabButton(previousTabs[previousTabs.length - 1].id, fromOverflow);\n }\n\n if (event.key === 'Enter' && fromOverflow) {\n triggerTabButton(currentTabId, true);\n setIsMenuOpened(false);\n const contentSection = document.getElementById(`${currentTabId}-content`) as HTMLDivElement;\n contentSection.focus();\n }\n\n if (!target.id.includes('-m')) {\n setIsMenuOpened(false);\n }\n };\n\n const triggerTabButton = (elementId: string, fromOverflow: boolean) => {\n try {\n const tabElement = document.getElementById(`${elementId}-btn`) as HTMLButtonElement;\n const buttonElement = document.getElementById(\n fromOverflow ? `${elementId}-btn-m` : `${elementId}-btn`,\n ) as HTMLButtonElement;\n if (onChange) {\n onChange(elementId);\n }\n if (isOverflowing) {\n tabElement.scrollIntoView({ behavior: 'smooth', block: 'end', inline: 'end' });\n }\n buttonElement.focus();\n } catch (error) {\n throw (error as Error).message;\n }\n };\n\n const triggerOverflowMenu = (event: KeyboardEvent<HTMLButtonElement>) => {\n checkIfOverflowing();\n const overflownTabs = getOverflownTabs();\n\n if (event.key === 'Enter') {\n if (!isMenuOpened && overflownTabs.length > 0) {\n const buttonElement = document.getElementById(`${overflownTabs[0].id}-btn-m`) as HTMLButtonElement;\n if (buttonElement) {\n buttonElement.focus();\n }\n }\n }\n\n if (isMenuOpened && (event.key === 'ArrowRight' || event.key === 'ArrowDown')) {\n triggerTabButton(overflownTabs[0].id, true);\n }\n };\n\n // First render\n useEffect(() => {\n checkIfOverflowing();\n }, [checkIfOverflowing]);\n\n useEffect(() => {\n window.addEventListener('resize', checkIfOverflowing);\n return () => {\n window.removeEventListener('resize', checkIfOverflowing);\n };\n }, [checkIfOverflowing]);\n\n const { isFocusVisible, focusProps } = useFocusRing();\n\n return (\n <>\n <div data-test-id=\"tabs\" className=\"tw-flex tw-relative tw-border-b tw-border-line\">\n <div\n ref={tabNavRef}\n role=\"tablist\"\n className={merge([\n 'tw-overflow-x-hidden tw-flex-shrink-0 tw-h-full tw-w-full tw-flex tw-justify-start',\n paddingMap[paddingX ?? TabsPaddingX.Small],\n size === TabSize.Small ? 'tw-gap-xxs' : 'tw-gap-xs ',\n ])}\n >\n {tabs.map((tab) => {\n return (\n <button\n data-test-id=\"tab-item\"\n role=\"tab\"\n type=\"button\"\n aria-selected={tab.id === activeItemId}\n aria-controls={`${tab.id}-content`}\n aria-hidden={tab.disabled}\n tabIndex={tab.id === activeItemId ? 0 : -1}\n id={`${tab.id}-btn`}\n className={merge([\n 'tw-group tw-relative tw-mx-0 tw-py-4 tw-px-2 tw-w-max tw-cursor-pointer tw-flex tw-items-center tw-justify-center tw-whitespace-nowrap',\n getTabButtonTextStyle(tab, activeItemId),\n ])}\n key={tab.id}\n onClick={() => {\n if (!tab.disabled) {\n triggerTabButton(tab.id, false);\n setIsMenuOpened(false);\n }\n }}\n onKeyDown={(event) => handleKeyboardTabChange(event)}\n >\n {tab.decorator && <span className=\"tw-mr-1.5\">{tab.decorator}</span>}\n\n <span>{tab.label}</span>\n\n {tab.badge && (\n <span className=\"tw-ml-1.5\">\n <Badge disabled={tab.disabled} style={tab.badge.style}>\n {tab.badge.children}\n </Badge>\n </span>\n )}\n {tab.id === activeItemId && (\n <motion.div\n initial={false}\n layoutDependency={activeItemId}\n data-test-id=\"tab-active-highlight\"\n layoutId={groupId}\n className=\"tw-absolute tw-h-[3px] tw-bg-box-selected-strong tw-rounded-t-x-large tw-w-full tw-bottom-0\"\n />\n )}\n </button>\n );\n })}\n </div>\n {isOverflowing && (\n <div\n data-test-id=\"tab-overflow\"\n className=\"tw-absolute tw-z-50 tw-right-3 tw-bottom-0 tw-top-0 tw-flex tw-justify-center tw-items-center\"\n >\n <button\n className={merge([\n 'tw-w-6 tw-h-6 tw-bg-box-neutral tw-rounded tw-flex tw-justify-center tw-items-center',\n isFocusVisible ? FOCUS_STYLE : '',\n ])}\n type=\"button\"\n onClick={() => {\n checkIfOverflowing();\n setIsMenuOpened(!isMenuOpened);\n }}\n onKeyDown={(event) => triggerOverflowMenu(event)}\n {...focusProps}\n >\n <IconDotsHorizontal />\n </button>\n {isMenuOpened && (\n <div\n className=\"tw-absolute tw-right-0 tw-top-11 tw-px-3 tw-pt-3 tw-bg-base tw-shadow tw-w-max\"\n role=\"dialog\"\n >\n {getOverflownTabs().map((tab) => {\n return (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-w-full tw-mb-3 tw-text-left tw-text-text-weak',\n tab.disabled && 'tw-text-text-disabled',\n ])}\n key={tab.id}\n onClick={() => {\n if (!tab.disabled) {\n triggerTabButton(tab.id, true);\n setIsMenuOpened(false);\n }\n }}\n role=\"tab\"\n type=\"button\"\n aria-selected={tab.id === activeItemId}\n aria-controls={`${tab.id}-content`}\n aria-hidden={tab.disabled}\n tabIndex={!tab.disabled && isMenuOpened ? 0 : -1}\n id={`${tab.id}-btn-m`}\n onKeyDown={(event) => handleKeyboardTabChange(event)}\n >\n {tab.decorator}\n <span className=\"tw-mr-1 tw-ml-1.5\">{tab.label}</span>\n {tab.badge && (\n <Badge disabled={tab.disabled} style={tab.badge?.style}>\n {tab.badge?.children}\n </Badge>\n )}\n </button>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n\n <div data-test-id=\"tab-content\" className=\"tw-flex tw-flex-col tw-overflow-y-auto\">\n <div className=\"tw-mr-0\" style={{ maxHeight, minHeight }}>\n {Children.map(children, (child) => {\n if (!isValidElement(child)) {\n return null;\n }\n\n return cloneElement(child, { ...child.props, active: child.props.id === activeItemId });\n })}\n </div>\n </div>\n </>\n );\n};\nTabs.displayName = 'FondueTabs';\n"],"names":["TabsPaddingX","TabSize","paddingMap","getTabButtonTextStyle","tab","activeItemId","Tabs","paddingX","size","children","onChange","maxHeight","minHeight","groupId","useMemoizedId","tabNavRef","useRef","isOverflowing","setIsOverflowing","useState","isMenuOpened","setIsMenuOpened","tabs","Children","child","isValidElement","overflowArray","setOverflowArray","checkIfOverflowing","useCallback","tabNav","overFlowIndex","tabItem","i","navPosition","tabPosition","overFlowIndexInAscOrder","a","b","getOverflownTabs","filterTabList","array","direction","activeItemIndex","index","handleKeyboardTabChange","event","overflownTabs","target","fromOverflow","currentTabId","currentTabsArray","nextTabs","previousTabs","triggerTabButton","elementId","tabElement","buttonElement","error","triggerOverflowMenu","useEffect","isFocusVisible","focusProps","useFocusRing","jsxs","Fragment","jsx","merge","Badge","motion","FOCUS_STYLE","IconDotsHorizontal","_a","_b","cloneElement"],"mappings":"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"}
|