@frontify/fondue 12.0.0-beta.335 → 12.0.0-beta.337
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/Plugins/AutoformatPlugin/index.es.js +32 -25
- package/dist/components/RichTextEditor/Plugins/AutoformatPlugin/index.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 +2 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.umd.js +4 -4
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,86 +1,93 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { TextStyles as
|
|
5
|
-
import { ELEMENT_CHECK_ITEM as
|
|
6
|
-
class
|
|
1
|
+
import { Plugin as p } from "../Plugin.es.js";
|
|
2
|
+
import { AUTOFORMAT_PLUGIN as i } from "./id.es.js";
|
|
3
|
+
import { createAutoformatPlugin as u, autoformatPunctuation as c, autoformatArrow as n, autoformatLegal as s, autoformatSubscriptNumbers as l, autoformatSubscriptSymbols as d, autoformatSuperscriptNumbers as y, autoformatSuperscriptSymbols as f, MARK_UNDERLINE as g, MARK_BOLD as h, MARK_ITALIC as E, MARK_STRIKETHROUGH as T, MARK_CODE as b, ELEMENT_UL as r, unwrapList as m, toggleList as e, ELEMENT_OL as a } from "@udecode/plate";
|
|
4
|
+
import { TextStyles as o } from "../TextStylePlugin/types.es.js";
|
|
5
|
+
import { ELEMENT_CHECK_ITEM as k } from "../CheckboxListPlugin/id.es.js";
|
|
6
|
+
class S extends p {
|
|
7
7
|
constructor(t) {
|
|
8
|
-
super(
|
|
8
|
+
super(i, {
|
|
9
9
|
...t
|
|
10
10
|
});
|
|
11
11
|
}
|
|
12
12
|
plugins() {
|
|
13
13
|
return [
|
|
14
|
-
|
|
14
|
+
u({
|
|
15
15
|
options: {
|
|
16
16
|
rules: [
|
|
17
|
+
...c,
|
|
18
|
+
...n,
|
|
19
|
+
...s,
|
|
20
|
+
...l,
|
|
21
|
+
...d,
|
|
22
|
+
...y,
|
|
23
|
+
...f,
|
|
17
24
|
{
|
|
18
25
|
mode: "mark",
|
|
19
|
-
type: [
|
|
26
|
+
type: [g],
|
|
20
27
|
match: ["_", "_"],
|
|
21
28
|
ignoreTrim: !0
|
|
22
29
|
},
|
|
23
30
|
{
|
|
24
31
|
mode: "mark",
|
|
25
|
-
type: [
|
|
32
|
+
type: [h],
|
|
26
33
|
match: ["**", "**"],
|
|
27
34
|
ignoreTrim: !0
|
|
28
35
|
},
|
|
29
36
|
{
|
|
30
37
|
mode: "mark",
|
|
31
|
-
type: [
|
|
38
|
+
type: [E],
|
|
32
39
|
match: ["*", "*"],
|
|
33
40
|
ignoreTrim: !0
|
|
34
41
|
},
|
|
35
42
|
{
|
|
36
43
|
mode: "mark",
|
|
37
|
-
type: [
|
|
44
|
+
type: [T],
|
|
38
45
|
match: ["~~", "~~"],
|
|
39
46
|
ignoreTrim: !0
|
|
40
47
|
},
|
|
41
48
|
{
|
|
42
49
|
mode: "mark",
|
|
43
|
-
type: [
|
|
50
|
+
type: [b],
|
|
44
51
|
match: ["`", "`"],
|
|
45
52
|
ignoreTrim: !0
|
|
46
53
|
},
|
|
47
54
|
{
|
|
48
55
|
mode: "block",
|
|
49
56
|
match: ["# "],
|
|
50
|
-
type:
|
|
57
|
+
type: o.heading1
|
|
51
58
|
},
|
|
52
59
|
{
|
|
53
60
|
mode: "block",
|
|
54
61
|
match: ["## "],
|
|
55
|
-
type:
|
|
62
|
+
type: o.heading2
|
|
56
63
|
},
|
|
57
64
|
{
|
|
58
65
|
mode: "block",
|
|
59
66
|
match: ["### "],
|
|
60
|
-
type:
|
|
67
|
+
type: o.heading3
|
|
61
68
|
},
|
|
62
69
|
{
|
|
63
70
|
mode: "block",
|
|
64
71
|
match: ["#### "],
|
|
65
|
-
type:
|
|
72
|
+
type: o.heading4
|
|
66
73
|
},
|
|
67
74
|
{
|
|
68
75
|
mode: "block",
|
|
69
|
-
type:
|
|
76
|
+
type: r,
|
|
70
77
|
match: ["- "],
|
|
71
|
-
preFormat:
|
|
72
|
-
format: (t) =>
|
|
78
|
+
preFormat: m,
|
|
79
|
+
format: (t) => e(t, { type: r })
|
|
73
80
|
},
|
|
74
81
|
{
|
|
75
82
|
mode: "block",
|
|
76
83
|
type: a,
|
|
77
|
-
match: ["1. "],
|
|
78
|
-
preFormat:
|
|
79
|
-
format: (t) =>
|
|
84
|
+
match: ["1. ", "1) "],
|
|
85
|
+
preFormat: m,
|
|
86
|
+
format: (t) => e(t, { type: a })
|
|
80
87
|
},
|
|
81
88
|
{
|
|
82
89
|
mode: "block",
|
|
83
|
-
type:
|
|
90
|
+
type: k,
|
|
84
91
|
match: ["[] "]
|
|
85
92
|
}
|
|
86
93
|
]
|
|
@@ -90,6 +97,6 @@ class L extends u {
|
|
|
90
97
|
}
|
|
91
98
|
}
|
|
92
99
|
export {
|
|
93
|
-
|
|
100
|
+
S as AutoformatPlugin
|
|
94
101
|
};
|
|
95
102
|
//# sourceMappingURL=index.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../../../../../src/components/RichTextEditor/Plugins/AutoformatPlugin/index.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../../../src/components/RichTextEditor/Plugins/AutoformatPlugin/index.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { Plugin, PluginProps } from '../Plugin';\nimport { AUTOFORMAT_PLUGIN } from './id';\nimport {\n ELEMENT_OL,\n ELEMENT_UL,\n MARK_BOLD,\n MARK_CODE,\n MARK_ITALIC,\n MARK_STRIKETHROUGH,\n MARK_UNDERLINE,\n autoformatArrow,\n autoformatLegal,\n autoformatPunctuation,\n autoformatSubscriptNumbers,\n autoformatSubscriptSymbols,\n autoformatSuperscriptNumbers,\n autoformatSuperscriptSymbols,\n createAutoformatPlugin,\n toggleList,\n unwrapList,\n} from '@udecode/plate';\nimport { TextStyles } from '../TextStylePlugin';\nimport { ELEMENT_CHECK_ITEM } from '../CheckboxListPlugin';\n\nexport class AutoformatPlugin extends Plugin {\n constructor(props?: PluginProps) {\n super(AUTOFORMAT_PLUGIN, {\n ...props,\n });\n }\n\n plugins() {\n return [\n createAutoformatPlugin({\n options: {\n rules: [\n ...autoformatPunctuation,\n ...autoformatArrow,\n ...autoformatLegal,\n ...autoformatSubscriptNumbers,\n ...autoformatSubscriptSymbols,\n ...autoformatSuperscriptNumbers,\n ...autoformatSuperscriptSymbols,\n {\n mode: 'mark',\n type: [MARK_UNDERLINE],\n match: ['_', '_'],\n ignoreTrim: true,\n },\n {\n mode: 'mark',\n type: [MARK_BOLD],\n match: ['**', '**'],\n ignoreTrim: true,\n },\n {\n mode: 'mark',\n type: [MARK_ITALIC],\n match: ['*', '*'],\n ignoreTrim: true,\n },\n {\n mode: 'mark',\n type: [MARK_STRIKETHROUGH],\n match: ['~~', '~~'],\n ignoreTrim: true,\n },\n {\n mode: 'mark',\n type: [MARK_CODE],\n match: ['`', '`'],\n ignoreTrim: true,\n },\n {\n mode: 'block',\n match: ['# '],\n type: TextStyles.heading1,\n },\n {\n mode: 'block',\n match: ['## '],\n type: TextStyles.heading2,\n },\n {\n mode: 'block',\n match: ['### '],\n type: TextStyles.heading3,\n },\n {\n mode: 'block',\n match: ['#### '],\n type: TextStyles.heading4,\n },\n {\n mode: 'block',\n type: ELEMENT_UL,\n match: ['- '],\n preFormat: unwrapList,\n format: (editor) => toggleList(editor, { type: ELEMENT_UL }),\n },\n {\n mode: 'block',\n type: ELEMENT_OL,\n match: ['1. ', '1) '],\n preFormat: unwrapList,\n format: (editor) => toggleList(editor, { type: ELEMENT_OL }),\n },\n {\n mode: 'block',\n type: ELEMENT_CHECK_ITEM,\n match: ['[] '],\n },\n ],\n },\n }),\n ];\n }\n}\n"],"names":["AutoformatPlugin","Plugin","props","AUTOFORMAT_PLUGIN","createAutoformatPlugin","autoformatPunctuation","autoformatArrow","autoformatLegal","autoformatSubscriptNumbers","autoformatSubscriptSymbols","autoformatSuperscriptNumbers","autoformatSuperscriptSymbols","MARK_UNDERLINE","MARK_BOLD","MARK_ITALIC","MARK_STRIKETHROUGH","MARK_CODE","TextStyles","ELEMENT_UL","unwrapList","editor","toggleList","ELEMENT_OL","ELEMENT_CHECK_ITEM"],"mappings":";;;;;AA0BO,MAAMA,UAAyBC,EAAO;AAAA,EACzC,YAAYC,GAAqB;AAC7B,UAAMC,GAAmB;AAAA,MACrB,GAAGD;AAAA,IAAA,CACN;AAAA,EACL;AAAA,EAEA,UAAU;AACC,WAAA;AAAA,MACHE,EAAuB;AAAA,QACnB,SAAS;AAAA,UACL,OAAO;AAAA,YACH,GAAGC;AAAA,YACH,GAAGC;AAAA,YACH,GAAGC;AAAA,YACH,GAAGC;AAAA,YACH,GAAGC;AAAA,YACH,GAAGC;AAAA,YACH,GAAGC;AAAA,YACH;AAAA,cACI,MAAM;AAAA,cACN,MAAM,CAACC,CAAc;AAAA,cACrB,OAAO,CAAC,KAAK,GAAG;AAAA,cAChB,YAAY;AAAA,YAChB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,MAAM,CAACC,CAAS;AAAA,cAChB,OAAO,CAAC,MAAM,IAAI;AAAA,cAClB,YAAY;AAAA,YAChB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,MAAM,CAACC,CAAW;AAAA,cAClB,OAAO,CAAC,KAAK,GAAG;AAAA,cAChB,YAAY;AAAA,YAChB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,MAAM,CAACC,CAAkB;AAAA,cACzB,OAAO,CAAC,MAAM,IAAI;AAAA,cAClB,YAAY;AAAA,YAChB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,MAAM,CAACC,CAAS;AAAA,cAChB,OAAO,CAAC,KAAK,GAAG;AAAA,cAChB,YAAY;AAAA,YAChB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,OAAO,CAAC,IAAI;AAAA,cACZ,MAAMC,EAAW;AAAA,YACrB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,OAAO,CAAC,KAAK;AAAA,cACb,MAAMA,EAAW;AAAA,YACrB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,OAAO,CAAC,MAAM;AAAA,cACd,MAAMA,EAAW;AAAA,YACrB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,OAAO,CAAC,OAAO;AAAA,cACf,MAAMA,EAAW;AAAA,YACrB;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,MAAMC;AAAA,cACN,OAAO,CAAC,IAAI;AAAA,cACZ,WAAWC;AAAA,cACX,QAAQ,CAACC,MAAWC,EAAWD,GAAQ,EAAE,MAAMF,GAAY;AAAA,YAC/D;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,MAAMI;AAAA,cACN,OAAO,CAAC,OAAO,KAAK;AAAA,cACpB,WAAWH;AAAA,cACX,QAAQ,CAACC,MAAWC,EAAWD,GAAQ,EAAE,MAAME,GAAY;AAAA,YAC/D;AAAA,YACA;AAAA,cACI,MAAM;AAAA,cACN,MAAMC;AAAA,cACN,OAAO,CAAC,KAAK;AAAA,YACjB;AAAA,UACJ;AAAA,QACJ;AAAA,MAAA,CACH;AAAA,IAAA;AAAA,EAET;AACJ;"}
|
|
@@ -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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"}
|