@frontify/fondue 12.0.0-beta.115 → 12.0.0-beta.117

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.
@@ -15,6 +15,7 @@ export type ButtonProps = {
15
15
  onClick?: (event?: MouseEvent<HTMLButtonElement>) => void;
16
16
  hugWidth?: boolean;
17
17
  'aria-label'?: string;
18
+ 'aria-describedby'?: string;
18
19
  formId?: string;
19
20
  /** @deprecated use emphasis with ButtonEmphasis.Weak */
20
21
  solid?: boolean;
@@ -1,79 +1,81 @@
1
- import i, { forwardRef as I, cloneElement as M } from "react";
2
- import { useButton as P } from "@react-aria/button";
1
+ import l, { forwardRef as M, cloneElement as P } from "react";
2
+ import { useButton as T } from "@react-aria/button";
3
3
  import { merge as r } from "../../utilities/merge.es.js";
4
- import { useForwardedRef as T } from "../../utilities/useForwardedRef.es.js";
5
- import { ButtonStyle as o, ButtonEmphasis as u, ButtonType as O, ButtonSize as U, ButtonRounding as V } from "./ButtonTypes.es.js";
6
- import { UpdatedButtonStyle as nt } from "./ButtonTypes.es.js";
7
- import { ButtonCommonClasses as _, ButtonRoundingClasses as k, ButtonSizeClasses as B, IconSpacingClasses as z, ButtonStyleClasses as W, ButtonDisabledClasses as Y } from "./ButtonClasses.es.js";
8
- import { FOCUS_VISIBLE_STYLE as $ } from "../../utilities/focusStyle.es.js";
9
- import { buttonTypeMap as j, buttonIconSizeMap as q } from "./mappings.es.js";
10
- import { useFocusRing as v } from "@react-aria/focus";
11
- const A = ({
12
- type: S = O.Button,
4
+ import { useForwardedRef as O } from "../../utilities/useForwardedRef.es.js";
5
+ import { ButtonStyle as o, ButtonEmphasis as u, ButtonType as U, ButtonSize as V, ButtonRounding as _ } from "./ButtonTypes.es.js";
6
+ import { UpdatedButtonStyle as at } from "./ButtonTypes.es.js";
7
+ import { ButtonCommonClasses as k, ButtonRoundingClasses as z, ButtonSizeClasses as d, IconSpacingClasses as W, ButtonStyleClasses as Y, ButtonDisabledClasses as $ } from "./ButtonClasses.es.js";
8
+ import { FOCUS_VISIBLE_STYLE as j } from "../../utilities/focusStyle.es.js";
9
+ import { buttonTypeMap as q, buttonIconSizeMap as v } from "./mappings.es.js";
10
+ import { useFocusRing as A } from "@react-aria/focus";
11
+ const G = ({
12
+ type: B = U.Button,
13
13
  style: t = o.Default,
14
- size: e = U.Medium,
15
- rounding: d = V.Medium,
14
+ size: e = V.Medium,
15
+ rounding: b = _.Medium,
16
16
  emphasis: n = u.Strong,
17
17
  hideLabel: m = !1,
18
18
  disabled: a = !1,
19
19
  icon: f,
20
20
  children: s,
21
21
  onClick: p,
22
- hugWidth: b = !0,
23
- "aria-label": C,
22
+ hugWidth: S = !0,
23
+ "aria-label": y,
24
+ "aria-describedby": C,
24
25
  formId: g,
25
- solid: y,
26
- inverted: E
27
- }, w) => {
28
- t === o.Primary ? (t = o.Default, n = u.Strong) : t === o.Secondary && (t = o.Default, n = u.Default), y === !1 && (n = u.Weak);
29
- const c = T(w), { buttonProps: D } = P(
30
- { onPress: () => p && p(), isDisabled: a, type: j[S] },
26
+ solid: E,
27
+ inverted: w
28
+ }, D) => {
29
+ t === o.Primary ? (t = o.Default, n = u.Strong) : t === o.Secondary && (t = o.Default, n = u.Default), E === !1 && (n = u.Weak);
30
+ const c = O(D), { buttonProps: R } = T(
31
+ { onPress: () => p && p(), isDisabled: a, type: q[B] },
31
32
  c
32
- ), { isFocusVisible: R, focusProps: F } = v(), l = (x) => a ? Y : `${W[n][t][x]}`, N = r([
33
- l("button"),
34
- _,
35
- k[d],
36
- f && !s || m ? B[e].iconOnly : B[e].default,
37
- !b && "tw-w-full"
33
+ ), { isFocusVisible: F, focusProps: N } = A(), i = (I) => a ? $ : `${Y[n][t][I]}`, x = r([
34
+ i("button"),
35
+ k,
36
+ z[b],
37
+ f && !s || m ? d[e].iconOnly : d[e].default,
38
+ !S && "tw-w-full"
38
39
  ]);
39
- return /* @__PURE__ */ i.createElement(
40
+ return /* @__PURE__ */ l.createElement(
40
41
  "button",
41
42
  {
42
- "aria-label": C,
43
+ "aria-label": y,
43
44
  "aria-disabled": a,
45
+ "aria-describedby": C,
44
46
  ref: c,
45
- className: r([N, E && "tw-dark", R && $]),
47
+ className: r([x, w && "tw-dark", F && j]),
46
48
  disabled: a,
47
49
  "data-test-id": "button",
48
50
  form: g,
49
- ...D,
50
- ...F
51
+ ...R,
52
+ ...N
51
53
  },
52
- f && /* @__PURE__ */ i.createElement(
54
+ f && /* @__PURE__ */ l.createElement(
53
55
  "span",
54
56
  {
55
57
  "data-test-id": "button-icon",
56
- className: r([s && !m ? z[e] : "", l("icon")])
58
+ className: r([s && !m ? W[e] : "", i("icon")])
57
59
  },
58
- M(f, { size: q[e] })
60
+ P(f, { size: v[e] })
59
61
  ),
60
- s && /* @__PURE__ */ i.createElement("span", { "data-test-id": "button-text", className: r([l("text"), m && "tw-sr-only"]) }, s)
62
+ s && /* @__PURE__ */ l.createElement("span", { "data-test-id": "button-text", className: r([i("text"), m && "tw-sr-only"]) }, s)
61
63
  );
62
- }, G = I(A);
63
- G.displayName = "FondueButton";
64
+ }, H = M(G);
65
+ H.displayName = "FondueButton";
64
66
  export {
65
- G as Button,
66
- _ as ButtonCommonClasses,
67
- Y as ButtonDisabledClasses,
67
+ H as Button,
68
+ k as ButtonCommonClasses,
69
+ $ as ButtonDisabledClasses,
68
70
  u as ButtonEmphasis,
69
- V as ButtonRounding,
70
- k as ButtonRoundingClasses,
71
- U as ButtonSize,
72
- B as ButtonSizeClasses,
71
+ _ as ButtonRounding,
72
+ z as ButtonRoundingClasses,
73
+ V as ButtonSize,
74
+ d as ButtonSizeClasses,
73
75
  o as ButtonStyle,
74
- W as ButtonStyleClasses,
75
- O as ButtonType,
76
- z as IconSpacingClasses,
77
- nt as UpdatedButtonStyle
76
+ Y as ButtonStyleClasses,
77
+ U as ButtonType,
78
+ W as IconSpacingClasses,
79
+ at as UpdatedButtonStyle
78
80
  };
79
81
  //# sourceMappingURL=Button.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.es.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, { ForwardRefRenderFunction, MouseEvent, ReactElement, ReactNode, cloneElement, forwardRef } from 'react';\n\nimport { useButton } from '@react-aria/button';\nimport { merge } from '@utilities/merge';\nimport { useForwardedRef } from '@utilities/useForwardedRef';\nimport {\n ButtonElements,\n ButtonEmphasis,\n ButtonRounding,\n ButtonSize,\n ButtonStyle,\n ButtonType,\n UpdatedButtonStyle,\n} from './ButtonTypes';\nimport {\n ButtonCommonClasses,\n ButtonDisabledClasses,\n ButtonRoundingClasses,\n ButtonSizeClasses,\n ButtonStyleClasses,\n IconSpacingClasses,\n} from './ButtonClasses';\nimport { FOCUS_VISIBLE_STYLE } from '@utilities/focusStyle';\nimport { buttonIconSizeMap, buttonTypeMap } from '@components/Button/mappings';\nimport { useFocusRing } from '@react-aria/focus';\n\n// To be NON-Breaking but import should be done through index.ts\nexport * from './ButtonClasses';\nexport * from './ButtonTypes';\n\nexport type ButtonProps = {\n type?: ButtonType;\n style?: ButtonStyle;\n emphasis?: ButtonEmphasis;\n hideLabel?: boolean;\n size?: ButtonSize;\n rounding?: ButtonRounding;\n disabled?: boolean;\n icon?: ReactElement;\n children?: ReactNode;\n onClick?: (event?: MouseEvent<HTMLButtonElement>) => void;\n hugWidth?: boolean;\n 'aria-label'?: string;\n formId?: string;\n /** @deprecated use emphasis with ButtonEmphasis.Weak */\n solid?: boolean;\n /** @deprecated inverted can be done by wrapping the component in a className=\"tw-dark\" */\n inverted?: boolean;\n};\n\nconst ButtonComponent: ForwardRefRenderFunction<HTMLButtonElement | null, ButtonProps> = (\n {\n type = ButtonType.Button,\n style = ButtonStyle.Default,\n size = ButtonSize.Medium,\n rounding = ButtonRounding.Medium,\n emphasis = ButtonEmphasis.Strong,\n hideLabel = false,\n disabled = false,\n icon,\n children,\n onClick,\n hugWidth = true,\n 'aria-label': ariaLabel,\n formId,\n solid,\n inverted,\n },\n externalRef,\n) => {\n // Map Style Primary, Secondary to style and emphasis\n // Primary and Secondary can be omitted from the style type\n if (style === ButtonStyle.Primary) {\n style = ButtonStyle.Default;\n emphasis = ButtonEmphasis.Strong;\n } else if (style === ButtonStyle.Secondary) {\n style = ButtonStyle.Default;\n emphasis = ButtonEmphasis.Default;\n }\n\n // Rewrite Solid to property emphasis\n if (solid === false) {\n emphasis = ButtonEmphasis.Weak;\n }\n\n const ref = useForwardedRef<HTMLButtonElement | null>(externalRef);\n const { buttonProps } = useButton(\n { onPress: () => onClick && onClick(), isDisabled: disabled, type: buttonTypeMap[type] },\n ref,\n );\n const { isFocusVisible, focusProps } = useFocusRing();\n\n const getStyles = (kind: keyof ButtonElements) =>\n !disabled\n ? `${ButtonStyleClasses[emphasis][style as unknown as UpdatedButtonStyle][kind]}`\n : ButtonDisabledClasses;\n\n const buttonClassName = merge([\n getStyles('button'),\n ButtonCommonClasses,\n ButtonRoundingClasses[rounding],\n (icon && !children) || hideLabel ? ButtonSizeClasses[size].iconOnly : ButtonSizeClasses[size].default,\n !hugWidth && 'tw-w-full',\n ]);\n\n return (\n <button\n aria-label={ariaLabel}\n aria-disabled={disabled}\n ref={ref}\n className={merge([buttonClassName, inverted && 'tw-dark', isFocusVisible && FOCUS_VISIBLE_STYLE])}\n disabled={disabled}\n data-test-id=\"button\"\n form={formId}\n {...buttonProps}\n {...focusProps}\n >\n {icon && (\n <span\n data-test-id=\"button-icon\"\n className={merge([children && !hideLabel ? IconSpacingClasses[size] : '', getStyles('icon')])}\n >\n {cloneElement(icon, { size: buttonIconSizeMap[size] })}\n </span>\n )}\n {children && (\n <span data-test-id=\"button-text\" className={merge([getStyles('text'), hideLabel && 'tw-sr-only'])}>\n {children}\n </span>\n )}\n </button>\n );\n};\n\nexport const Button = forwardRef(ButtonComponent);\nButton.displayName = 'FondueButton';\n"],"names":["ButtonComponent","type","ButtonType","style","ButtonStyle","size","ButtonSize","rounding","ButtonRounding","emphasis","ButtonEmphasis","hideLabel","disabled","icon","children","onClick","hugWidth","ariaLabel","formId","solid","inverted","externalRef","ref","useForwardedRef","buttonProps","useButton","buttonTypeMap","isFocusVisible","focusProps","useFocusRing","getStyles","kind","ButtonDisabledClasses","ButtonStyleClasses","buttonClassName","merge","ButtonCommonClasses","ButtonRoundingClasses","ButtonSizeClasses","React","FOCUS_VISIBLE_STYLE","IconSpacingClasses","cloneElement","buttonIconSizeMap","Button","forwardRef"],"mappings":";;;;;;;;;;AAoDA,MAAMA,IAAmF,CACrF;AAAA,EACI,MAAAC,IAAOC,EAAW;AAAA,EAClB,OAAAC,IAAQC,EAAY;AAAA,EACpB,MAAAC,IAAOC,EAAW;AAAA,EAClB,UAAAC,IAAWC,EAAe;AAAA,EAC1B,UAAAC,IAAWC,EAAe;AAAA,EAC1B,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,cAAcC;AAAA,EACd,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AACJ,GACAC,MACC;AAGG,EAAAlB,MAAUC,EAAY,WACtBD,IAAQC,EAAY,SACpBK,IAAWC,EAAe,UACnBP,MAAUC,EAAY,cAC7BD,IAAQC,EAAY,SACpBK,IAAWC,EAAe,UAI1BS,MAAU,OACVV,IAAWC,EAAe;AAGxB,QAAAY,IAAMC,EAA0CF,CAAW,GAC3D,EAAE,aAAAG,MAAgBC;AAAA,IACpB,EAAE,SAAS,MAAMV,KAAWA,EAAW,GAAA,YAAYH,GAAU,MAAMc,EAAczB,CAAI,EAAE;AAAA,IACvFqB;AAAA,EAAA,GAEE,EAAE,gBAAAK,GAAgB,YAAAC,EAAW,IAAIC,EAAa,GAE9CC,IAAY,CAACC,MACdnB,IAEKoB,IADA,GAAGC,EAAmBxB,CAAQ,EAAEN,CAAsC,EAAE4B,CAAI,KAGhFG,IAAkBC,EAAM;AAAA,IAC1BL,EAAU,QAAQ;AAAA,IAClBM;AAAA,IACAC,EAAsB9B,CAAQ;AAAA,IAC7BM,KAAQ,CAACC,KAAaH,IAAY2B,EAAkBjC,CAAI,EAAE,WAAWiC,EAAkBjC,CAAI,EAAE;AAAA,IAC9F,CAACW,KAAY;AAAA,EAAA,CAChB;AAGG,SAAA,gBAAAuB,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,cAAYtB;AAAA,MACZ,iBAAeL;AAAA,MACf,KAAAU;AAAA,MACA,WAAWa,EAAM,CAACD,GAAiBd,KAAY,WAAWO,KAAkBa,CAAmB,CAAC;AAAA,MAChG,UAAA5B;AAAA,MACA,gBAAa;AAAA,MACb,MAAMM;AAAA,MACL,GAAGM;AAAA,MACH,GAAGI;AAAA,IAAA;AAAA,IAEHf,KACG,gBAAA0B,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,gBAAa;AAAA,QACb,WAAWJ,EAAM,CAACrB,KAAY,CAACH,IAAY8B,EAAmBpC,CAAI,IAAI,IAAIyB,EAAU,MAAM,CAAC,CAAC;AAAA,MAAA;AAAA,MAE3FY,EAAa7B,GAAM,EAAE,MAAM8B,EAAkBtC,CAAI,GAAG;AAAA,IACzD;AAAA,IAEHS,KACG,gBAAAyB,EAAA,cAAC,QAAK,EAAA,gBAAa,eAAc,WAAWJ,EAAM,CAACL,EAAU,MAAM,GAAGnB,KAAa,YAAY,CAAC,KAC3FG,CACL;AAAA,EAAA;AAIhB,GAEa8B,IAASC,EAAW7C,CAAe;AAChD4C,EAAO,cAAc;"}
1
+ {"version":3,"file":"Button.es.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport React, { ForwardRefRenderFunction, MouseEvent, ReactElement, ReactNode, cloneElement, forwardRef } from 'react';\n\nimport { useButton } from '@react-aria/button';\nimport { merge } from '@utilities/merge';\nimport { useForwardedRef } from '@utilities/useForwardedRef';\nimport {\n ButtonElements,\n ButtonEmphasis,\n ButtonRounding,\n ButtonSize,\n ButtonStyle,\n ButtonType,\n UpdatedButtonStyle,\n} from './ButtonTypes';\nimport {\n ButtonCommonClasses,\n ButtonDisabledClasses,\n ButtonRoundingClasses,\n ButtonSizeClasses,\n ButtonStyleClasses,\n IconSpacingClasses,\n} from './ButtonClasses';\nimport { FOCUS_VISIBLE_STYLE } from '@utilities/focusStyle';\nimport { buttonIconSizeMap, buttonTypeMap } from '@components/Button/mappings';\nimport { useFocusRing } from '@react-aria/focus';\n\n// To be NON-Breaking but import should be done through index.ts\nexport * from './ButtonClasses';\nexport * from './ButtonTypes';\n\nexport type ButtonProps = {\n type?: ButtonType;\n style?: ButtonStyle;\n emphasis?: ButtonEmphasis;\n hideLabel?: boolean;\n size?: ButtonSize;\n rounding?: ButtonRounding;\n disabled?: boolean;\n icon?: ReactElement;\n children?: ReactNode;\n onClick?: (event?: MouseEvent<HTMLButtonElement>) => void;\n hugWidth?: boolean;\n 'aria-label'?: string;\n 'aria-describedby'?: string;\n formId?: string;\n /** @deprecated use emphasis with ButtonEmphasis.Weak */\n solid?: boolean;\n /** @deprecated inverted can be done by wrapping the component in a className=\"tw-dark\" */\n inverted?: boolean;\n};\n\nconst ButtonComponent: ForwardRefRenderFunction<HTMLButtonElement | null, ButtonProps> = (\n {\n type = ButtonType.Button,\n style = ButtonStyle.Default,\n size = ButtonSize.Medium,\n rounding = ButtonRounding.Medium,\n emphasis = ButtonEmphasis.Strong,\n hideLabel = false,\n disabled = false,\n icon,\n children,\n onClick,\n hugWidth = true,\n 'aria-label': ariaLabel,\n 'aria-describedby': ariaDescribedBy,\n formId,\n solid,\n inverted,\n },\n externalRef,\n) => {\n // Map Style Primary, Secondary to style and emphasis\n // Primary and Secondary can be omitted from the style type\n if (style === ButtonStyle.Primary) {\n style = ButtonStyle.Default;\n emphasis = ButtonEmphasis.Strong;\n } else if (style === ButtonStyle.Secondary) {\n style = ButtonStyle.Default;\n emphasis = ButtonEmphasis.Default;\n }\n\n // Rewrite Solid to property emphasis\n if (solid === false) {\n emphasis = ButtonEmphasis.Weak;\n }\n\n const ref = useForwardedRef<HTMLButtonElement | null>(externalRef);\n const { buttonProps } = useButton(\n { onPress: () => onClick && onClick(), isDisabled: disabled, type: buttonTypeMap[type] },\n ref,\n );\n const { isFocusVisible, focusProps } = useFocusRing();\n\n const getStyles = (kind: keyof ButtonElements) =>\n !disabled\n ? `${ButtonStyleClasses[emphasis][style as unknown as UpdatedButtonStyle][kind]}`\n : ButtonDisabledClasses;\n\n const buttonClassName = merge([\n getStyles('button'),\n ButtonCommonClasses,\n ButtonRoundingClasses[rounding],\n (icon && !children) || hideLabel ? ButtonSizeClasses[size].iconOnly : ButtonSizeClasses[size].default,\n !hugWidth && 'tw-w-full',\n ]);\n\n return (\n <button\n aria-label={ariaLabel}\n aria-disabled={disabled}\n aria-describedby={ariaDescribedBy}\n ref={ref}\n className={merge([buttonClassName, inverted && 'tw-dark', isFocusVisible && FOCUS_VISIBLE_STYLE])}\n disabled={disabled}\n data-test-id=\"button\"\n form={formId}\n {...buttonProps}\n {...focusProps}\n >\n {icon && (\n <span\n data-test-id=\"button-icon\"\n className={merge([children && !hideLabel ? IconSpacingClasses[size] : '', getStyles('icon')])}\n >\n {cloneElement(icon, { size: buttonIconSizeMap[size] })}\n </span>\n )}\n {children && (\n <span data-test-id=\"button-text\" className={merge([getStyles('text'), hideLabel && 'tw-sr-only'])}>\n {children}\n </span>\n )}\n </button>\n );\n};\n\nexport const Button = forwardRef(ButtonComponent);\nButton.displayName = 'FondueButton';\n"],"names":["ButtonComponent","type","ButtonType","style","ButtonStyle","size","ButtonSize","rounding","ButtonRounding","emphasis","ButtonEmphasis","hideLabel","disabled","icon","children","onClick","hugWidth","ariaLabel","ariaDescribedBy","formId","solid","inverted","externalRef","ref","useForwardedRef","buttonProps","useButton","buttonTypeMap","isFocusVisible","focusProps","useFocusRing","getStyles","kind","ButtonDisabledClasses","ButtonStyleClasses","buttonClassName","merge","ButtonCommonClasses","ButtonRoundingClasses","ButtonSizeClasses","React","FOCUS_VISIBLE_STYLE","IconSpacingClasses","cloneElement","buttonIconSizeMap","Button","forwardRef"],"mappings":";;;;;;;;;;AAqDA,MAAMA,IAAmF,CACrF;AAAA,EACI,MAAAC,IAAOC,EAAW;AAAA,EAClB,OAAAC,IAAQC,EAAY;AAAA,EACpB,MAAAC,IAAOC,EAAW;AAAA,EAClB,UAAAC,IAAWC,EAAe;AAAA,EAC1B,UAAAC,IAAWC,EAAe;AAAA,EAC1B,WAAAC,IAAY;AAAA,EACZ,UAAAC,IAAW;AAAA,EACX,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,cAAcC;AAAA,EACd,oBAAoBC;AAAA,EACpB,QAAAC;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AACJ,GACAC,MACC;AAGG,EAAAnB,MAAUC,EAAY,WACtBD,IAAQC,EAAY,SACpBK,IAAWC,EAAe,UACnBP,MAAUC,EAAY,cAC7BD,IAAQC,EAAY,SACpBK,IAAWC,EAAe,UAI1BU,MAAU,OACVX,IAAWC,EAAe;AAGxB,QAAAa,IAAMC,EAA0CF,CAAW,GAC3D,EAAE,aAAAG,MAAgBC;AAAA,IACpB,EAAE,SAAS,MAAMX,KAAWA,EAAW,GAAA,YAAYH,GAAU,MAAMe,EAAc1B,CAAI,EAAE;AAAA,IACvFsB;AAAA,EAAA,GAEE,EAAE,gBAAAK,GAAgB,YAAAC,EAAW,IAAIC,EAAa,GAE9CC,IAAY,CAACC,MACdpB,IAEKqB,IADA,GAAGC,EAAmBzB,CAAQ,EAAEN,CAAsC,EAAE6B,CAAI,KAGhFG,IAAkBC,EAAM;AAAA,IAC1BL,EAAU,QAAQ;AAAA,IAClBM;AAAA,IACAC,EAAsB/B,CAAQ;AAAA,IAC7BM,KAAQ,CAACC,KAAaH,IAAY4B,EAAkBlC,CAAI,EAAE,WAAWkC,EAAkBlC,CAAI,EAAE;AAAA,IAC9F,CAACW,KAAY;AAAA,EAAA,CAChB;AAGG,SAAA,gBAAAwB,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACG,cAAYvB;AAAA,MACZ,iBAAeL;AAAA,MACf,oBAAkBM;AAAA,MAClB,KAAAK;AAAA,MACA,WAAWa,EAAM,CAACD,GAAiBd,KAAY,WAAWO,KAAkBa,CAAmB,CAAC;AAAA,MAChG,UAAA7B;AAAA,MACA,gBAAa;AAAA,MACb,MAAMO;AAAA,MACL,GAAGM;AAAA,MACH,GAAGI;AAAA,IAAA;AAAA,IAEHhB,KACG,gBAAA2B,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACG,gBAAa;AAAA,QACb,WAAWJ,EAAM,CAACtB,KAAY,CAACH,IAAY+B,EAAmBrC,CAAI,IAAI,IAAI0B,EAAU,MAAM,CAAC,CAAC;AAAA,MAAA;AAAA,MAE3FY,EAAa9B,GAAM,EAAE,MAAM+B,EAAkBvC,CAAI,GAAG;AAAA,IACzD;AAAA,IAEHS,KACG,gBAAA0B,EAAA,cAAC,QAAK,EAAA,gBAAa,eAAc,WAAWJ,EAAM,CAACL,EAAU,MAAM,GAAGpB,KAAa,YAAY,CAAC,KAC3FG,CACL;AAAA,EAAA;AAIhB,GAEa+B,IAASC,EAAW9C,CAAe;AAChD6C,EAAO,cAAc;"}
@@ -45,7 +45,7 @@ const i = (t, r) => t.reduce((c, E) => (E.type === r && c++, E.children ? c + i(
45
45
  case a.ELEMENT_QUOTE:
46
46
  return `<p class="${s}" style="${l(r.quote)}">${e}</p>`;
47
47
  case H:
48
- return `<p class="${s} style="${l(r.p)}">${e}</p>`;
48
+ return `<p class="${s}" style="${l(r.p)}">${e}</p>`;
49
49
  case a.ELEMENT_IMAGE_TITLE:
50
50
  return `<p class="${s}" style="${l(r.imageTitle)}">${e}</p>`;
51
51
  case a.ELEMENT_IMAGE_CAPTION:
@@ -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 UL_CLASSES,\n getOrderedListClasses,\n} from '@components/RichTextEditor/Plugins';\nimport { getTextStyle } from '@components/RichTextEditor/Plugins/ListPlugin/ListItemContentMarkupElement';\nimport { TextStyles, alignmentClassnames } from '@components/RichTextEditor/Plugins/TextStylePlugin/TextStyles';\nimport { DesignTokens } from '@components/RichTextEditor/types';\nimport {\n ELEMENT_LI,\n ELEMENT_LIC,\n ELEMENT_LINK,\n ELEMENT_MENTION,\n ELEMENT_OL,\n ELEMENT_PARAGRAPH,\n ELEMENT_UL,\n TDescendant,\n TElement,\n TText,\n isText,\n} from '@udecode/plate';\nimport { 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 { merge } from '@utilities/merge';\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 designTokens: DesignTokens;\n mappedMentionable?: MappedMentionableItems;\n nestingCount?: NestingCount;\n};\n\nexport const serializeNodeToHtmlRecursive = (\n node: TDescendant,\n { designTokens, mappedMentionable, nestingCount = {} }: SerializeNodeToHtmlRecursiveOptions,\n): string => {\n if (isText(node)) {\n return serializeLeafToHtml(node as TText);\n }\n\n const rootNestingCount = nestingCount[node.type] || countNodesOfType([node], node.type);\n const children = (node.children as TDescendant[])\n .map((n: TDescendant) =>\n serializeNodeToHtmlRecursive(n, {\n designTokens,\n nestingCount: {\n ...nestingCount,\n [n.type as string]: rootNestingCount,\n },\n mappedMentionable,\n }),\n )\n .join('');\n\n const hasColumnBreak = node.breakAfterColumn === 'active';\n const columnBreakClasses = hasColumnBreak ? 'tw-break-after-column tw-break-inside-avoid-column' : '';\n const breakWordsClass = 'tw-break-words';\n const alignClass = node?.align ? alignmentClassnames[node.align as string] : '';\n const classNames = merge([alignClass, breakWordsClass, columnBreakClasses]);\n\n switch (node.type) {\n case TextStyles.ELEMENT_HEADING1:\n return `<h1 class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.heading1)}\">${children}</h1>`;\n case TextStyles.ELEMENT_HEADING2:\n return `<h2 class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.heading2)}\">${children}</h2>`;\n case TextStyles.ELEMENT_HEADING3:\n return `<h3 class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.heading3)}\">${children}</h3>`;\n case TextStyles.ELEMENT_HEADING4:\n return `<h4 class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.heading4)}\">${children}</h4>`;\n case TextStyles.ELEMENT_CUSTOM1:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.custom1)}\">${children}</p>`;\n case TextStyles.ELEMENT_CUSTOM2:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.custom2)}\">${children}</p>`;\n case TextStyles.ELEMENT_CUSTOM3:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.custom3)}\">${children}</p>`;\n case TextStyles.ELEMENT_QUOTE:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.quote)}\">${children}</p>`;\n case ELEMENT_PARAGRAPH:\n return `<p class=\"${classNames} style=\"${reactCssPropsToCss(designTokens.p)}\">${children}</p>`;\n case TextStyles.ELEMENT_IMAGE_TITLE:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.imageTitle)}\">${children}</p>`;\n case TextStyles.ELEMENT_IMAGE_CAPTION:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.imageCaption)}\">${children}</p>`;\n case ELEMENT_UL:\n return `<ul class=\"${UL_CLASSES} ${classNames}\">${children}</ul>`;\n case ELEMENT_OL:\n const nestingLevel = Math.max(rootNestingCount - countNodesOfType([node], ELEMENT_OL), 0);\n return `<ol class=\"${getOrderedListClasses(nestingLevel)} ${classNames}\">${children}</ol>`;\n case ELEMENT_LI:\n const liElement = node as TElement;\n const styledLicElement = (liElement.children[0]?.children as TDescendant[])?.[0];\n const liStyles = { ...designTokens[getTextStyle(styledLicElement)], textDecoration: 'none' };\n\n return `<li class=\"${classNames}\" style=\"${reactCssPropsToCss(liStyles)}\">${children}</li>`;\n case ELEMENT_LIC:\n const licElement = node as TElement;\n const licStyles = { textDecoration: designTokens[getTextStyle(licElement.children[0])]?.textDecoration };\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(licStyles)}\">${children}</p>`;\n case ELEMENT_LINK:\n return linkNode(node, children, designTokens, classNames);\n case ELEMENT_BUTTON:\n return buttonNode(node, children, designTokens, classNames);\n case ELEMENT_CHECK_ITEM:\n return checkItemNode(node, children, classNames);\n case ELEMENT_MENTION:\n return mentionHtmlNode(node, { mentionable: mappedMentionable });\n\n default:\n return children;\n }\n};\n"],"names":["countNodesOfType","nodes","type","acc","node","serializeNodeToHtmlRecursive","designTokens","mappedMentionable","nestingCount","isText","serializeLeafToHtml","rootNestingCount","children","n","columnBreakClasses","breakWordsClass","alignClass","alignmentClassnames","classNames","merge","TextStyles","reactCssPropsToCss","ELEMENT_PARAGRAPH","ELEMENT_UL","UL_CLASSES","ELEMENT_OL","nestingLevel","getOrderedListClasses","ELEMENT_LI","styledLicElement","_b","_a","liStyles","getTextStyle","ELEMENT_LIC","licStyles","_c","ELEMENT_LINK","linkNode","ELEMENT_BUTTON","buttonNode","ELEMENT_CHECK_ITEM","checkItemNode","ELEMENT_MENTION","mentionHtmlNode"],"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 UL_CLASSES,\n getOrderedListClasses,\n} from '@components/RichTextEditor/Plugins';\nimport { getTextStyle } from '@components/RichTextEditor/Plugins/ListPlugin/ListItemContentMarkupElement';\nimport { TextStyles, alignmentClassnames } from '@components/RichTextEditor/Plugins/TextStylePlugin/TextStyles';\nimport { DesignTokens } from '@components/RichTextEditor/types';\nimport {\n ELEMENT_LI,\n ELEMENT_LIC,\n ELEMENT_LINK,\n ELEMENT_MENTION,\n ELEMENT_OL,\n ELEMENT_PARAGRAPH,\n ELEMENT_UL,\n TDescendant,\n TElement,\n TText,\n isText,\n} from '@udecode/plate';\nimport { 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 { merge } from '@utilities/merge';\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 designTokens: DesignTokens;\n mappedMentionable?: MappedMentionableItems;\n nestingCount?: NestingCount;\n};\n\nexport const serializeNodeToHtmlRecursive = (\n node: TDescendant,\n { designTokens, mappedMentionable, nestingCount = {} }: SerializeNodeToHtmlRecursiveOptions,\n): string => {\n if (isText(node)) {\n return serializeLeafToHtml(node as TText);\n }\n\n const rootNestingCount = nestingCount[node.type] || countNodesOfType([node], node.type);\n const children = (node.children as TDescendant[])\n .map((n: TDescendant) =>\n serializeNodeToHtmlRecursive(n, {\n designTokens,\n nestingCount: {\n ...nestingCount,\n [n.type as string]: rootNestingCount,\n },\n mappedMentionable,\n }),\n )\n .join('');\n\n const hasColumnBreak = node.breakAfterColumn === 'active';\n const columnBreakClasses = hasColumnBreak ? 'tw-break-after-column tw-break-inside-avoid-column' : '';\n const breakWordsClass = 'tw-break-words';\n const alignClass = node?.align ? alignmentClassnames[node.align as string] : '';\n const classNames = merge([alignClass, breakWordsClass, columnBreakClasses]);\n\n switch (node.type) {\n case TextStyles.ELEMENT_HEADING1:\n return `<h1 class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.heading1)}\">${children}</h1>`;\n case TextStyles.ELEMENT_HEADING2:\n return `<h2 class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.heading2)}\">${children}</h2>`;\n case TextStyles.ELEMENT_HEADING3:\n return `<h3 class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.heading3)}\">${children}</h3>`;\n case TextStyles.ELEMENT_HEADING4:\n return `<h4 class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.heading4)}\">${children}</h4>`;\n case TextStyles.ELEMENT_CUSTOM1:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.custom1)}\">${children}</p>`;\n case TextStyles.ELEMENT_CUSTOM2:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.custom2)}\">${children}</p>`;\n case TextStyles.ELEMENT_CUSTOM3:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.custom3)}\">${children}</p>`;\n case TextStyles.ELEMENT_QUOTE:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.quote)}\">${children}</p>`;\n case ELEMENT_PARAGRAPH:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.p)}\">${children}</p>`;\n case TextStyles.ELEMENT_IMAGE_TITLE:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.imageTitle)}\">${children}</p>`;\n case TextStyles.ELEMENT_IMAGE_CAPTION:\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(designTokens.imageCaption)}\">${children}</p>`;\n case ELEMENT_UL:\n return `<ul class=\"${UL_CLASSES} ${classNames}\">${children}</ul>`;\n case ELEMENT_OL:\n const nestingLevel = Math.max(rootNestingCount - countNodesOfType([node], ELEMENT_OL), 0);\n return `<ol class=\"${getOrderedListClasses(nestingLevel)} ${classNames}\">${children}</ol>`;\n case ELEMENT_LI:\n const liElement = node as TElement;\n const styledLicElement = (liElement.children[0]?.children as TDescendant[])?.[0];\n const liStyles = { ...designTokens[getTextStyle(styledLicElement)], textDecoration: 'none' };\n\n return `<li class=\"${classNames}\" style=\"${reactCssPropsToCss(liStyles)}\">${children}</li>`;\n case ELEMENT_LIC:\n const licElement = node as TElement;\n const licStyles = { textDecoration: designTokens[getTextStyle(licElement.children[0])]?.textDecoration };\n return `<p class=\"${classNames}\" style=\"${reactCssPropsToCss(licStyles)}\">${children}</p>`;\n case ELEMENT_LINK:\n return linkNode(node, children, designTokens, classNames);\n case ELEMENT_BUTTON:\n return buttonNode(node, children, designTokens, classNames);\n case ELEMENT_CHECK_ITEM:\n return checkItemNode(node, children, classNames);\n case ELEMENT_MENTION:\n return mentionHtmlNode(node, { mentionable: mappedMentionable });\n\n default:\n return children;\n }\n};\n"],"names":["countNodesOfType","nodes","type","acc","node","serializeNodeToHtmlRecursive","designTokens","mappedMentionable","nestingCount","isText","serializeLeafToHtml","rootNestingCount","children","n","columnBreakClasses","breakWordsClass","alignClass","alignmentClassnames","classNames","merge","TextStyles","reactCssPropsToCss","ELEMENT_PARAGRAPH","ELEMENT_UL","UL_CLASSES","ELEMENT_OL","nestingLevel","getOrderedListClasses","ELEMENT_LI","styledLicElement","_b","_a","liStyles","getTextStyle","ELEMENT_LIC","licStyles","_c","ELEMENT_LINK","linkNode","ELEMENT_BUTTON","buttonNode","ELEMENT_CHECK_ITEM","checkItemNode","ELEMENT_MENTION","mentionHtmlNode"],"mappings":"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"}
@@ -1,21 +1,22 @@
1
1
  import { IconSize as _ } from "../../foundation/Icon/IconSize.es.js";
2
- import { useLink as se } from "@react-aria/link";
3
- import { FOCUS_VISIBLE_STYLE as ne } from "../../utilities/focusStyle.es.js";
2
+ import { useLink as ne } from "@react-aria/link";
3
+ import { FOCUS_VISIBLE_STYLE as we } from "../../utilities/focusStyle.es.js";
4
4
  import { merge as n } from "../../utilities/merge.es.js";
5
- import t, { useState as d, useRef as I, useMemo as we, useCallback as S, useEffect as fe, useLayoutEffect as ie, cloneElement as h } from "react";
6
- import { BrightHeader as ce, brightHeaderArrowBackgroundColors as k } from "./BrightHeader.es.js";
5
+ import t, { useState as m, useRef as $, useMemo as ie, useCallback as S, useEffect as fe, useLayoutEffect as ce, cloneElement as h } from "react";
6
+ import { BrightHeader as de, brightHeaderArrowBackgroundColors as k } from "./BrightHeader.es.js";
7
7
  import { usePopper as me } from "react-popper";
8
- import { Button as $ } from "../Button/Button.es.js";
9
- import { ButtonStyle as V, ButtonEmphasis as Y, ButtonSize as j } from "../Button/ButtonTypes.es.js";
10
- const q = {
8
+ import { useMemoizedId as pe } from "../../hooks/useMemoizedId.es.js";
9
+ import { Button as V } from "../Button/Button.es.js";
10
+ import { ButtonStyle as Y, ButtonEmphasis as j, ButtonSize as q } from "../Button/ButtonTypes.es.js";
11
+ const D = {
11
12
  small: "tw-pt-3.5",
12
13
  large: "tw-pt-4"
13
- }, D = {
14
+ }, G = {
14
15
  small: "tw-pb-3.5",
15
16
  large: "tw-pb-4"
16
17
  };
17
- var de = /* @__PURE__ */ ((e) => (e.Top = "Top", e.Right = "Right", e.Bottom = "Bottom", e.Left = "Left", e))(de || {}), pe = /* @__PURE__ */ ((e) => (e.Start = "Start", e.Middle = "Middle", e.End = "End", e))(pe || {});
18
- const ue = {
18
+ var ue = /* @__PURE__ */ ((e) => (e.Top = "Top", e.Right = "Right", e.Bottom = "Bottom", e.Left = "Left", e))(ue || {}), be = /* @__PURE__ */ ((e) => (e.Start = "Start", e.Middle = "Middle", e.End = "End", e))(be || {});
19
+ const ge = {
19
20
  ["Top-Start"]: "top-start",
20
21
  ["Top-End"]: "top-end",
21
22
  ["Bottom-Start"]: "bottom-start",
@@ -28,7 +29,7 @@ const ue = {
28
29
  ["Right-Middle"]: "right",
29
30
  ["Bottom-Middle"]: "bottom",
30
31
  ["Left-Middle"]: "left"
31
- }, be = (e, l, s) => {
32
+ }, Ee = (e, l, s) => {
32
33
  switch (!0) {
33
34
  case e.toString().includes("Top".toLowerCase()):
34
35
  return "before:tw-border-t-0 before:tw-border-l-0 tw-bottom-[-6px] before:tw-bg-black-100 before:dark:tw-bg-white";
@@ -50,41 +51,41 @@ const ue = {
50
51
  default:
51
52
  return "before:tw-border-b-0 before:tw-border-r-0 tw-top-[-6px] before:tw-bg-black-100 before:dark:tw-bg-white";
52
53
  }
53
- }, ge = ({
54
+ }, Se = ({
54
55
  content: e,
55
56
  tooltipIcon: l,
56
57
  heading: s,
57
58
  headingIcon: p,
58
59
  linkUrl: c,
59
- linkLabel: G,
60
- brightHeader: m,
60
+ linkLabel: J,
61
+ brightHeader: d,
61
62
  buttons: r,
62
- children: J,
63
+ children: K,
63
64
  position: v = "Bottom",
64
65
  alignment: x = "Middle",
65
66
  withArrow: u,
66
- flip: K = !0,
67
+ flip: Q = !0,
67
68
  triggerElement: B,
68
69
  hoverDelay: L = 200,
69
70
  enterDelay: b = 0,
70
71
  open: T = !1,
71
- disabled: Q = !1,
72
- hidden: W = !1
72
+ disabled: W = !1,
73
+ hidden: X = !1
73
74
  }) => {
74
- var N;
75
- const [g, X] = d(
75
+ var O;
76
+ const [g, Z] = m(
76
77
  null
77
- ), C = I(null), { linkProps: Z } = se({}, C), A = we(
78
- () => c || m || r || s || p,
79
- [c, m, r, s, p]
80
- ), P = ue[`${v}-${x}`], [w, H] = d(null), [R, U] = d(null), [ee, te] = d(null), f = me(g, w, {
81
- placement: P,
78
+ ), C = $(null), { linkProps: A } = ne({}, C), P = ie(
79
+ () => c || d || r || s || p,
80
+ [c, d, r, s, p]
81
+ ), H = ge[`${v}-${x}`], [w, U] = m(null), [M, ee] = m(null), [te, re] = m(null), R = pe(), i = me(g, w, {
82
+ placement: H,
82
83
  strategy: "fixed",
83
84
  modifiers: [
84
85
  {
85
86
  name: "arrow",
86
87
  options: {
87
- element: ee
88
+ element: te
88
89
  }
89
90
  },
90
91
  {
@@ -95,27 +96,27 @@ const ue = {
95
96
  },
96
97
  {
97
98
  name: "flip",
98
- enabled: K
99
+ enabled: Q
99
100
  }
100
101
  ]
101
- }), re = ((N = f.state) == null ? void 0 : N.placement) ?? v, oe = be(re, m, x), [E, o] = d(!1), i = I(null), M = S(() => {
102
- i.current && clearTimeout(i.current), i.current = setTimeout(() => o(!1), L);
103
- }, [L]), y = S(() => {
104
- if (i.current && clearTimeout(i.current), b) {
105
- i.current = setTimeout(() => o(!0), b);
102
+ }), oe = ((O = i.state) == null ? void 0 : O.placement) ?? v, ae = Ee(oe, d, x), [E, o] = m(!1), f = $(null), y = S(() => {
103
+ f.current && clearTimeout(f.current), f.current = setTimeout(() => o(!1), L);
104
+ }, [L]), z = S(() => {
105
+ if (f.current && clearTimeout(f.current), b) {
106
+ f.current = setTimeout(() => o(!0), b);
106
107
  return;
107
108
  }
108
109
  o(!0);
109
- }, [b]), z = S(
110
+ }, [b]), N = S(
110
111
  (a) => {
111
- var F;
112
- const O = a.path ?? ((F = a.composedPath) == null ? void 0 : F.call(a));
113
- O && [g, R, w].some((le) => O.includes(le)) && y();
112
+ var I;
113
+ const F = a.path ?? ((I = a.composedPath) == null ? void 0 : I.call(a));
114
+ F && [g, M, w].some((se) => F.includes(se)) && z();
114
115
  },
115
- [y, g, R, w]
116
- ), ae = {
117
- onMouseOver: (a) => z(a.nativeEvent),
118
- onMouseLeave: M,
116
+ [z, g, M, w]
117
+ ), le = {
118
+ onMouseOver: (a) => N(a.nativeEvent),
119
+ onMouseLeave: y,
119
120
  onFocus: () => o(!0),
120
121
  onBlur: (a) => {
121
122
  w != null && w.contains(a.relatedTarget) || o(!1);
@@ -123,35 +124,37 @@ const ue = {
123
124
  };
124
125
  return fe(() => {
125
126
  o(T);
126
- }, [T]), ie(() => {
127
- typeof f.update == "function" && E && f.update();
128
- }, [E]), /* @__PURE__ */ t.createElement(t.Fragment, null, /* @__PURE__ */ t.createElement("div", { ...ae, ref: U }, B && h(B, {
129
- ref: X
127
+ }, [T]), ce(() => {
128
+ typeof i.update == "function" && E && i.update();
129
+ }, [E]), /* @__PURE__ */ t.createElement(t.Fragment, null, /* @__PURE__ */ t.createElement("div", { ...le, ref: ee }, B && h(B, {
130
+ ref: Z,
131
+ "aria-describedby": R
130
132
  })), /* @__PURE__ */ t.createElement(
131
133
  "div",
132
134
  {
133
- ref: H,
135
+ ref: U,
134
136
  className: n([
135
137
  "tw-popper-container tw-inline-block tw-max-w-[200px] tw-bg-black-100 dark:tw-bg-white tw-rounded-md tw-shadow-mid tw-text-white dark:tw-text-black-100 tw-z-[120000]",
136
- (W || Q) && "tw-hidden",
138
+ (X || W) && "tw-hidden",
137
139
  !E && "tw-opacity-0 tw-h-0 tw-w-0 tw-overflow-hidden"
138
140
  ]),
139
141
  "data-test-id": "tooltip",
140
142
  role: "tooltip",
141
- style: f.styles.popper,
142
- ...f.attributes.popper,
143
+ id: R,
144
+ style: i.styles.popper,
145
+ ...i.attributes.popper,
143
146
  onFocus: () => o(!0),
144
- onMouseOver: (a) => z(a.nativeEvent),
145
- onMouseLeave: M
147
+ onMouseOver: (a) => N(a.nativeEvent),
148
+ onMouseLeave: y
146
149
  },
147
- m && /* @__PURE__ */ t.createElement(ce, { headerStyle: m }),
150
+ d && /* @__PURE__ */ t.createElement(de, { headerStyle: d }),
148
151
  /* @__PURE__ */ t.createElement(
149
152
  "div",
150
153
  {
151
154
  className: n([
152
155
  "tw-px-4 tw-bg-black-100 dark:tw-bg-white tw-rounded-md tw-relative tw-z-[120000]",
153
- A ? q.small : q.large,
154
- c ? D.small : D.large
156
+ P ? D.small : D.large,
157
+ c ? G.small : G.large
155
158
  ])
156
159
  },
157
160
  s && /* @__PURE__ */ t.createElement("h4", { className: "tw-flex tw-text-m tw-font-bold tw-mb-1" }, p && /* @__PURE__ */ t.createElement("span", { className: "tw-mr-1.5" }, h(p, { size: _.Size20 })), s),
@@ -159,7 +162,7 @@ const ue = {
159
162
  c && /* @__PURE__ */ t.createElement(
160
163
  "a",
161
164
  {
162
- ...Z,
165
+ ...A,
163
166
  "data-test-id": "tooltip-link",
164
167
  ref: C,
165
168
  href: c,
@@ -167,27 +170,27 @@ const ue = {
167
170
  rel: "noopener noreferrer",
168
171
  className: n([
169
172
  "tw-text-xs tw-text-black-40 dark:tw-text-black-80 tw-underline tw-mt-1",
170
- ne
173
+ we
171
174
  ]),
172
175
  onBlur: () => r && r.length > 0 ? null : o(!1)
173
176
  },
174
- G ?? "Click here to learn more."
177
+ J ?? "Click here to learn more."
175
178
  ),
176
179
  r && /* @__PURE__ */ t.createElement("div", { className: "tw-flex tw-flex-row-reverse tw-gap-x-1 tw-mt-4" }, r.length > 0 && /* @__PURE__ */ t.createElement("div", { onBlur: () => r && r.length < 2 ? o(!1) : null }, /* @__PURE__ */ t.createElement(
177
- $,
180
+ V,
178
181
  {
179
- style: V.Default,
180
- emphasis: Y.Strong,
181
- size: j.Small,
182
+ style: Y.Default,
183
+ emphasis: j.Strong,
184
+ size: q.Small,
182
185
  onClick: r[0].action
183
186
  },
184
187
  r[0].label
185
188
  )), r.length === 2 && /* @__PURE__ */ t.createElement("div", { onBlur: () => o(!1) }, /* @__PURE__ */ t.createElement(
186
- $,
189
+ V,
187
190
  {
188
- style: V.Default,
189
- emphasis: Y.Default,
190
- size: j.Small,
191
+ style: Y.Default,
192
+ emphasis: j.Default,
193
+ size: q.Small,
191
194
  onClick: r[1].action
192
195
  },
193
196
  r[1].label
@@ -198,21 +201,21 @@ const ue = {
198
201
  {
199
202
  "data-test-id": "popover-arrow",
200
203
  "data-popper-arrow": u,
201
- ref: te,
202
- style: f.styles.arrow,
204
+ ref: re,
205
+ style: i.styles.arrow,
203
206
  className: n([
204
207
  u && "tw-popper-arrow tw-z-[110000] tw-absolute tw-w-3 tw-h-3 tw-pointer-events-none before:tw-absolute before:tw-w-3 before:tw-h-3 before:tw-rotate-45 before:tw-border before:tw-border-line",
205
- u && oe
208
+ u && ae
206
209
  ])
207
210
  }
208
211
  )),
209
- J
212
+ K
210
213
  ));
211
214
  };
212
- ge.displayName = "FondueTooltip";
215
+ Se.displayName = "FondueTooltip";
213
216
  export {
214
- ge as Tooltip,
215
- pe as TooltipAlignment,
216
- de as TooltipPosition
217
+ Se as Tooltip,
218
+ be as TooltipAlignment,
219
+ ue as TooltipPosition
217
220
  };
218
221
  //# sourceMappingURL=Tooltip.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Tooltip.es.js","sources":["../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { Button, ButtonEmphasis, ButtonSize, ButtonStyle } from '@components/Button';\nimport { IconSize } from '@foundation/Icon/IconSize';\nimport { useLink } from '@react-aria/link';\nimport { FOCUS_VISIBLE_STYLE } from '@utilities/focusStyle';\nimport { merge } from '@utilities/merge';\nimport React, {\n FocusEvent,\n HTMLAttributes,\n PropsWithChildren,\n ReactChild,\n ReactElement,\n ReactNode,\n cloneElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { BrightHeader, BrightHeaderStyle, brightHeaderArrowBackgroundColors } from './BrightHeader';\nimport { usePopper } from 'react-popper';\nimport { Placement } from '@popperjs/core';\n\nexport type TooltipButton = {\n label: string;\n action: () => void;\n};\n\nexport type TooltipProps = PropsWithChildren<{\n triggerElement?: ReactElement;\n content: ReactNode;\n tooltipIcon?: ReactElement;\n heading?: ReactNode;\n headingIcon?: ReactElement;\n linkUrl?: string;\n linkLabel?: string;\n brightHeader?: BrightHeaderStyle;\n buttons?: [TooltipButton, TooltipButton] | [TooltipButton];\n children?: ReactChild;\n position?: TooltipPosition;\n alignment?: TooltipAlignment;\n flip?: boolean;\n withArrow?: boolean;\n hoverDelay?: number;\n enterDelay?: number;\n open?: boolean;\n disabled?: boolean;\n /** @deprecated use disabled since the tooltip is always present in the DOM now so hidden has no effect anymore */\n hidden?: boolean;\n}>;\n\n/**\n * This is a temporary workaround because for some yet unknown reasons `tailwindcss` in clarify purges the `tw-pb-3.5` and `tw-pt-3.5` class.\n */\nconst paddingsTop = {\n small: 'tw-pt-3.5',\n large: 'tw-pt-4',\n};\n\nconst paddingsBottom = {\n small: 'tw-pb-3.5',\n large: 'tw-pb-4',\n};\n\nexport enum TooltipPosition {\n Top = 'Top',\n Right = 'Right',\n Bottom = 'Bottom',\n Left = 'Left',\n}\n\nexport enum TooltipAlignment {\n Start = 'Start',\n Middle = 'Middle',\n End = 'End',\n}\n\nconst placementMap: Record<`${TooltipPosition}-${TooltipAlignment}`, Placement> = {\n ['Top-Start']: 'top-start',\n ['Top-End']: 'top-end',\n ['Bottom-Start']: 'bottom-start',\n ['Bottom-End']: 'bottom-end',\n ['Left-Start']: 'left-start',\n ['Left-End']: 'left-end',\n ['Right-Start']: 'right-start',\n ['Right-End']: 'right-end',\n ['Top-Middle']: 'top',\n ['Right-Middle']: 'right',\n ['Bottom-Middle']: 'bottom',\n ['Left-Middle']: 'left',\n};\n\nconst getArrowClasses = (currentPlacement: string, brightHeader: BrightHeaderStyle | undefined, alignment: string) => {\n switch (true) {\n case currentPlacement.toString().includes(TooltipPosition.Top.toLowerCase()):\n return 'before:tw-border-t-0 before:tw-border-l-0 tw-bottom-[-6px] before:tw-bg-black-100 before:dark:tw-bg-white';\n case currentPlacement.toString().includes(TooltipPosition.Right.toLowerCase()):\n return merge([\n 'before:tw-border-t-0 before:tw-border-r-0 tw-left-[-5px]',\n brightHeader &&\n alignment === TooltipAlignment.Start &&\n currentPlacement.toString().includes(TooltipAlignment.Start.toLowerCase())\n ? brightHeaderArrowBackgroundColors[brightHeader]\n : 'before:tw-bg-black-100 before:dark:tw-bg-white',\n ]);\n case currentPlacement.toString().includes(TooltipPosition.Bottom.toLowerCase()):\n return merge([\n 'before:tw-border-b-0 before:tw-border-r-0 tw-top-[-6px]',\n brightHeader\n ? brightHeaderArrowBackgroundColors[brightHeader]\n : 'before:tw-bg-black-100 before:dark:tw-bg-white',\n ]);\n case currentPlacement.toString().includes(TooltipPosition.Left.toLowerCase()):\n return merge([\n 'before:tw-border-b-0 before:tw-border-l-0 tw-right-[-5px]',\n brightHeader &&\n alignment === TooltipAlignment.Start &&\n currentPlacement.toString().includes(TooltipAlignment.Start.toLowerCase())\n ? brightHeaderArrowBackgroundColors[brightHeader]\n : 'before:tw-bg-black-100 before:dark:tw-bg-white',\n ]);\n default:\n return 'before:tw-border-b-0 before:tw-border-r-0 tw-top-[-6px] before:tw-bg-black-100 before:dark:tw-bg-white';\n }\n};\n\nexport const Tooltip = ({\n content,\n tooltipIcon,\n heading,\n headingIcon,\n linkUrl,\n linkLabel,\n brightHeader,\n buttons,\n children,\n position = TooltipPosition.Bottom,\n alignment = TooltipAlignment.Middle,\n withArrow,\n flip = true,\n triggerElement,\n hoverDelay = 200,\n enterDelay = 0,\n open = false,\n disabled = false,\n hidden = false,\n}: TooltipProps) => {\n const [triggerElementRef, setTriggerElementRef] = useState<HTMLElement | HTMLDivElement | HTMLButtonElement | null>(\n null,\n );\n const linkRef = useRef<HTMLAnchorElement | null>(null);\n const { linkProps } = useLink({}, linkRef);\n const hasLargePaddingTop = useMemo(\n () => linkUrl || brightHeader || buttons || heading || headingIcon,\n [linkUrl, brightHeader, buttons, heading, headingIcon],\n );\n\n const placement = placementMap[`${position}-${alignment}`];\n const [tooltipContainerRef, setTooltipContainerRef] = useState<HTMLDivElement | null>(null);\n const [triggerElementContainerRef, setTriggerElementContainerRef] = useState<HTMLDivElement | null>(null);\n const [arrowElement, setArrowElement] = useState<HTMLDivElement | null>(null);\n\n const tooltipOffset = withArrow ? 10 : 5;\n const popperInstance = usePopper(triggerElementRef, tooltipContainerRef, {\n placement,\n strategy: 'fixed',\n modifiers: [\n {\n name: 'arrow',\n options: {\n element: arrowElement,\n },\n },\n {\n name: 'offset',\n options: {\n offset: [0, tooltipOffset],\n },\n },\n {\n name: 'flip',\n enabled: flip,\n },\n ],\n });\n\n const currentPlacement = popperInstance.state?.placement ?? position;\n const arrowStyling = getArrowClasses(currentPlacement, brightHeader, alignment);\n const [isOpen, setIsOpen] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleHideTooltipOnHover = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n timeoutRef.current = setTimeout(() => setIsOpen(false), hoverDelay);\n }, [hoverDelay]);\n\n const handleShowTooltipOnHover = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n if (enterDelay) {\n timeoutRef.current = setTimeout(() => setIsOpen(true), enterDelay);\n return;\n }\n\n setIsOpen(true);\n }, [enterDelay]);\n\n const checkIfHovered = useCallback(\n (event) => {\n const hoveredElement = event.path ?? event.composedPath?.();\n const hoverSources = [triggerElementRef, triggerElementContainerRef, tooltipContainerRef];\n\n if (hoveredElement && hoverSources.some((el) => hoveredElement.includes(el))) {\n handleShowTooltipOnHover();\n }\n },\n [handleShowTooltipOnHover, triggerElementRef, triggerElementContainerRef, tooltipContainerRef],\n );\n\n const triggerProps: HTMLAttributes<HTMLElement> = {\n onMouseOver: (event) => checkIfHovered(event.nativeEvent),\n onMouseLeave: handleHideTooltipOnHover,\n onFocus: () => setIsOpen(true),\n onBlur: (event: FocusEvent) => {\n if (!tooltipContainerRef?.contains(event.relatedTarget)) {\n setIsOpen(false);\n }\n },\n };\n\n useEffect(() => {\n setIsOpen(open);\n }, [open]);\n\n useLayoutEffect(() => {\n if (typeof popperInstance.update === 'function' && isOpen) {\n popperInstance.update();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n return (\n <>\n <div {...triggerProps} ref={setTriggerElementContainerRef}>\n {triggerElement &&\n cloneElement(triggerElement, {\n ref: setTriggerElementRef,\n })}\n </div>\n <div\n ref={setTooltipContainerRef}\n className={merge([\n 'tw-popper-container tw-inline-block tw-max-w-[200px] tw-bg-black-100 dark:tw-bg-white tw-rounded-md tw-shadow-mid tw-text-white dark:tw-text-black-100 tw-z-[120000]',\n (hidden || disabled) && 'tw-hidden',\n !isOpen && 'tw-opacity-0 tw-h-0 tw-w-0 tw-overflow-hidden',\n ])}\n data-test-id=\"tooltip\"\n role=\"tooltip\"\n style={popperInstance.styles.popper}\n {...popperInstance.attributes.popper}\n onFocus={() => setIsOpen(true)}\n onMouseOver={(event) => checkIfHovered(event.nativeEvent)}\n onMouseLeave={handleHideTooltipOnHover}\n >\n {brightHeader && <BrightHeader headerStyle={brightHeader} />}\n <div\n className={merge([\n 'tw-px-4 tw-bg-black-100 dark:tw-bg-white tw-rounded-md tw-relative tw-z-[120000]',\n hasLargePaddingTop ? paddingsTop.small : paddingsTop.large,\n linkUrl ? paddingsBottom.small : paddingsBottom.large,\n ])}\n >\n {heading && (\n <h4 className=\"tw-flex tw-text-m tw-font-bold tw-mb-1\">\n {headingIcon && (\n <span className=\"tw-mr-1.5\">\n {cloneElement(headingIcon, { size: IconSize.Size20 })}\n </span>\n )}\n {heading}\n </h4>\n )}\n <div className=\"tw-flex\">\n {tooltipIcon && (\n <span className=\"tw-shrink-0 tw-mr-1 tw-leading-4\">\n {cloneElement(tooltipIcon, { size: IconSize.Size16 })}\n </span>\n )}\n <p className=\"tw-text-s tw-min-w-0 tw-break-words\">{content}</p>\n </div>\n {linkUrl && (\n <a\n {...linkProps}\n data-test-id=\"tooltip-link\"\n ref={linkRef}\n href={linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={merge([\n 'tw-text-xs tw-text-black-40 dark:tw-text-black-80 tw-underline tw-mt-1',\n FOCUS_VISIBLE_STYLE,\n ])}\n onBlur={() => (buttons && buttons.length > 0 ? null : setIsOpen(false))}\n >\n {linkLabel ?? 'Click here to learn more.'}\n </a>\n )}\n {buttons && (\n <div className=\"tw-flex tw-flex-row-reverse tw-gap-x-1 tw-mt-4\">\n {buttons.length > 0 && (\n <div onBlur={() => (buttons && buttons.length < 2 ? setIsOpen(false) : null)}>\n <Button\n style={ButtonStyle.Default}\n emphasis={ButtonEmphasis.Strong}\n size={ButtonSize.Small}\n onClick={buttons[0].action}\n >\n {buttons[0].label}\n </Button>\n </div>\n )}\n {buttons.length === 2 && (\n <div onBlur={() => setIsOpen(false)}>\n <Button\n style={ButtonStyle.Default}\n emphasis={ButtonEmphasis.Default}\n size={ButtonSize.Small}\n onClick={buttons[1].action}\n >\n {buttons[1].label}\n </Button>\n </div>\n )}\n </div>\n )}\n </div>\n {/**\n * This container is needed for the arrow element to not be styled by popperJS\n * selectors for its immediate children .tw-popper-container > .tw-popper-arrow\n * */}\n <div aria-hidden=\"true\">\n <div\n data-test-id=\"popover-arrow\"\n data-popper-arrow={withArrow}\n ref={setArrowElement}\n style={popperInstance.styles.arrow}\n className={merge([\n withArrow &&\n 'tw-popper-arrow tw-z-[110000] tw-absolute tw-w-3 tw-h-3 tw-pointer-events-none before:tw-absolute before:tw-w-3 before:tw-h-3 before:tw-rotate-45 before:tw-border before:tw-border-line',\n withArrow && arrowStyling,\n ])}\n />\n </div>\n {children}\n </div>\n </>\n );\n};\nTooltip.displayName = 'FondueTooltip';\n"],"names":["paddingsTop","paddingsBottom","TooltipPosition","TooltipAlignment","placementMap","getArrowClasses","currentPlacement","brightHeader","alignment","merge","brightHeaderArrowBackgroundColors","Tooltip","content","tooltipIcon","heading","headingIcon","linkUrl","linkLabel","buttons","children","position","withArrow","flip","triggerElement","hoverDelay","enterDelay","open","disabled","hidden","triggerElementRef","setTriggerElementRef","useState","linkRef","useRef","linkProps","useLink","hasLargePaddingTop","useMemo","placement","tooltipContainerRef","setTooltipContainerRef","triggerElementContainerRef","setTriggerElementContainerRef","arrowElement","setArrowElement","popperInstance","usePopper","_a","arrowStyling","isOpen","setIsOpen","timeoutRef","handleHideTooltipOnHover","useCallback","handleShowTooltipOnHover","checkIfHovered","event","hoveredElement","el","triggerProps","useEffect","useLayoutEffect","React","cloneElement","BrightHeader","IconSize","FOCUS_VISIBLE_STYLE","Button","ButtonStyle","ButtonEmphasis","ButtonSize"],"mappings":"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"}
1
+ {"version":3,"file":"Tooltip.es.js","sources":["../../../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { Button, ButtonEmphasis, ButtonSize, ButtonStyle } from '@components/Button';\nimport { IconSize } from '@foundation/Icon/IconSize';\nimport { useLink } from '@react-aria/link';\nimport { FOCUS_VISIBLE_STYLE } from '@utilities/focusStyle';\nimport { merge } from '@utilities/merge';\nimport React, {\n FocusEvent,\n HTMLAttributes,\n PropsWithChildren,\n ReactChild,\n ReactElement,\n ReactNode,\n cloneElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { BrightHeader, BrightHeaderStyle, brightHeaderArrowBackgroundColors } from './BrightHeader';\nimport { usePopper } from 'react-popper';\nimport { Placement } from '@popperjs/core';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\n\nexport type TooltipButton = {\n label: string;\n action: () => void;\n};\n\nexport type TooltipProps = PropsWithChildren<{\n triggerElement?: ReactElement;\n content: ReactNode;\n tooltipIcon?: ReactElement;\n heading?: ReactNode;\n headingIcon?: ReactElement;\n linkUrl?: string;\n linkLabel?: string;\n brightHeader?: BrightHeaderStyle;\n buttons?: [TooltipButton, TooltipButton] | [TooltipButton];\n children?: ReactChild;\n position?: TooltipPosition;\n alignment?: TooltipAlignment;\n flip?: boolean;\n withArrow?: boolean;\n hoverDelay?: number;\n enterDelay?: number;\n open?: boolean;\n disabled?: boolean;\n /** @deprecated use disabled since the tooltip is always present in the DOM now so hidden has no effect anymore */\n hidden?: boolean;\n}>;\n\n/**\n * This is a temporary workaround because for some yet unknown reasons `tailwindcss` in clarify purges the `tw-pb-3.5` and `tw-pt-3.5` class.\n */\nconst paddingsTop = {\n small: 'tw-pt-3.5',\n large: 'tw-pt-4',\n};\n\nconst paddingsBottom = {\n small: 'tw-pb-3.5',\n large: 'tw-pb-4',\n};\n\nexport enum TooltipPosition {\n Top = 'Top',\n Right = 'Right',\n Bottom = 'Bottom',\n Left = 'Left',\n}\n\nexport enum TooltipAlignment {\n Start = 'Start',\n Middle = 'Middle',\n End = 'End',\n}\n\nconst placementMap: Record<`${TooltipPosition}-${TooltipAlignment}`, Placement> = {\n ['Top-Start']: 'top-start',\n ['Top-End']: 'top-end',\n ['Bottom-Start']: 'bottom-start',\n ['Bottom-End']: 'bottom-end',\n ['Left-Start']: 'left-start',\n ['Left-End']: 'left-end',\n ['Right-Start']: 'right-start',\n ['Right-End']: 'right-end',\n ['Top-Middle']: 'top',\n ['Right-Middle']: 'right',\n ['Bottom-Middle']: 'bottom',\n ['Left-Middle']: 'left',\n};\n\nconst getArrowClasses = (currentPlacement: string, brightHeader: BrightHeaderStyle | undefined, alignment: string) => {\n switch (true) {\n case currentPlacement.toString().includes(TooltipPosition.Top.toLowerCase()):\n return 'before:tw-border-t-0 before:tw-border-l-0 tw-bottom-[-6px] before:tw-bg-black-100 before:dark:tw-bg-white';\n case currentPlacement.toString().includes(TooltipPosition.Right.toLowerCase()):\n return merge([\n 'before:tw-border-t-0 before:tw-border-r-0 tw-left-[-5px]',\n brightHeader &&\n alignment === TooltipAlignment.Start &&\n currentPlacement.toString().includes(TooltipAlignment.Start.toLowerCase())\n ? brightHeaderArrowBackgroundColors[brightHeader]\n : 'before:tw-bg-black-100 before:dark:tw-bg-white',\n ]);\n case currentPlacement.toString().includes(TooltipPosition.Bottom.toLowerCase()):\n return merge([\n 'before:tw-border-b-0 before:tw-border-r-0 tw-top-[-6px]',\n brightHeader\n ? brightHeaderArrowBackgroundColors[brightHeader]\n : 'before:tw-bg-black-100 before:dark:tw-bg-white',\n ]);\n case currentPlacement.toString().includes(TooltipPosition.Left.toLowerCase()):\n return merge([\n 'before:tw-border-b-0 before:tw-border-l-0 tw-right-[-5px]',\n brightHeader &&\n alignment === TooltipAlignment.Start &&\n currentPlacement.toString().includes(TooltipAlignment.Start.toLowerCase())\n ? brightHeaderArrowBackgroundColors[brightHeader]\n : 'before:tw-bg-black-100 before:dark:tw-bg-white',\n ]);\n default:\n return 'before:tw-border-b-0 before:tw-border-r-0 tw-top-[-6px] before:tw-bg-black-100 before:dark:tw-bg-white';\n }\n};\n\nexport const Tooltip = ({\n content,\n tooltipIcon,\n heading,\n headingIcon,\n linkUrl,\n linkLabel,\n brightHeader,\n buttons,\n children,\n position = TooltipPosition.Bottom,\n alignment = TooltipAlignment.Middle,\n withArrow,\n flip = true,\n triggerElement,\n hoverDelay = 200,\n enterDelay = 0,\n open = false,\n disabled = false,\n hidden = false,\n}: TooltipProps) => {\n const [triggerElementRef, setTriggerElementRef] = useState<HTMLElement | HTMLDivElement | HTMLButtonElement | null>(\n null,\n );\n const linkRef = useRef<HTMLAnchorElement | null>(null);\n const { linkProps } = useLink({}, linkRef);\n const hasLargePaddingTop = useMemo(\n () => linkUrl || brightHeader || buttons || heading || headingIcon,\n [linkUrl, brightHeader, buttons, heading, headingIcon],\n );\n\n const placement = placementMap[`${position}-${alignment}`];\n const [tooltipContainerRef, setTooltipContainerRef] = useState<HTMLDivElement | null>(null);\n const [triggerElementContainerRef, setTriggerElementContainerRef] = useState<HTMLDivElement | null>(null);\n const [arrowElement, setArrowElement] = useState<HTMLDivElement | null>(null);\n const id = useMemoizedId();\n\n const tooltipOffset = withArrow ? 10 : 5;\n const popperInstance = usePopper(triggerElementRef, tooltipContainerRef, {\n placement,\n strategy: 'fixed',\n modifiers: [\n {\n name: 'arrow',\n options: {\n element: arrowElement,\n },\n },\n {\n name: 'offset',\n options: {\n offset: [0, tooltipOffset],\n },\n },\n {\n name: 'flip',\n enabled: flip,\n },\n ],\n });\n\n const currentPlacement = popperInstance.state?.placement ?? position;\n const arrowStyling = getArrowClasses(currentPlacement, brightHeader, alignment);\n const [isOpen, setIsOpen] = useState(false);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleHideTooltipOnHover = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n timeoutRef.current = setTimeout(() => setIsOpen(false), hoverDelay);\n }, [hoverDelay]);\n\n const handleShowTooltipOnHover = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n if (enterDelay) {\n timeoutRef.current = setTimeout(() => setIsOpen(true), enterDelay);\n return;\n }\n\n setIsOpen(true);\n }, [enterDelay]);\n\n const checkIfHovered = useCallback(\n (event) => {\n const hoveredElement = event.path ?? event.composedPath?.();\n const hoverSources = [triggerElementRef, triggerElementContainerRef, tooltipContainerRef];\n\n if (hoveredElement && hoverSources.some((el) => hoveredElement.includes(el))) {\n handleShowTooltipOnHover();\n }\n },\n [handleShowTooltipOnHover, triggerElementRef, triggerElementContainerRef, tooltipContainerRef],\n );\n\n const triggerProps: HTMLAttributes<HTMLElement> = {\n onMouseOver: (event) => checkIfHovered(event.nativeEvent),\n onMouseLeave: handleHideTooltipOnHover,\n onFocus: () => setIsOpen(true),\n onBlur: (event: FocusEvent) => {\n if (!tooltipContainerRef?.contains(event.relatedTarget)) {\n setIsOpen(false);\n }\n },\n };\n\n useEffect(() => {\n setIsOpen(open);\n }, [open]);\n\n useLayoutEffect(() => {\n if (typeof popperInstance.update === 'function' && isOpen) {\n popperInstance.update();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen]);\n\n return (\n <>\n <div {...triggerProps} ref={setTriggerElementContainerRef}>\n {triggerElement &&\n cloneElement(triggerElement, {\n ref: setTriggerElementRef,\n 'aria-describedby': id,\n })}\n </div>\n <div\n ref={setTooltipContainerRef}\n className={merge([\n 'tw-popper-container tw-inline-block tw-max-w-[200px] tw-bg-black-100 dark:tw-bg-white tw-rounded-md tw-shadow-mid tw-text-white dark:tw-text-black-100 tw-z-[120000]',\n (hidden || disabled) && 'tw-hidden',\n !isOpen && 'tw-opacity-0 tw-h-0 tw-w-0 tw-overflow-hidden',\n ])}\n data-test-id=\"tooltip\"\n role=\"tooltip\"\n id={id}\n style={popperInstance.styles.popper}\n {...popperInstance.attributes.popper}\n onFocus={() => setIsOpen(true)}\n onMouseOver={(event) => checkIfHovered(event.nativeEvent)}\n onMouseLeave={handleHideTooltipOnHover}\n >\n {brightHeader && <BrightHeader headerStyle={brightHeader} />}\n <div\n className={merge([\n 'tw-px-4 tw-bg-black-100 dark:tw-bg-white tw-rounded-md tw-relative tw-z-[120000]',\n hasLargePaddingTop ? paddingsTop.small : paddingsTop.large,\n linkUrl ? paddingsBottom.small : paddingsBottom.large,\n ])}\n >\n {heading && (\n <h4 className=\"tw-flex tw-text-m tw-font-bold tw-mb-1\">\n {headingIcon && (\n <span className=\"tw-mr-1.5\">\n {cloneElement(headingIcon, { size: IconSize.Size20 })}\n </span>\n )}\n {heading}\n </h4>\n )}\n <div className=\"tw-flex\">\n {tooltipIcon && (\n <span className=\"tw-shrink-0 tw-mr-1 tw-leading-4\">\n {cloneElement(tooltipIcon, { size: IconSize.Size16 })}\n </span>\n )}\n <p className=\"tw-text-s tw-min-w-0 tw-break-words\">{content}</p>\n </div>\n {linkUrl && (\n <a\n {...linkProps}\n data-test-id=\"tooltip-link\"\n ref={linkRef}\n href={linkUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={merge([\n 'tw-text-xs tw-text-black-40 dark:tw-text-black-80 tw-underline tw-mt-1',\n FOCUS_VISIBLE_STYLE,\n ])}\n onBlur={() => (buttons && buttons.length > 0 ? null : setIsOpen(false))}\n >\n {linkLabel ?? 'Click here to learn more.'}\n </a>\n )}\n {buttons && (\n <div className=\"tw-flex tw-flex-row-reverse tw-gap-x-1 tw-mt-4\">\n {buttons.length > 0 && (\n <div onBlur={() => (buttons && buttons.length < 2 ? setIsOpen(false) : null)}>\n <Button\n style={ButtonStyle.Default}\n emphasis={ButtonEmphasis.Strong}\n size={ButtonSize.Small}\n onClick={buttons[0].action}\n >\n {buttons[0].label}\n </Button>\n </div>\n )}\n {buttons.length === 2 && (\n <div onBlur={() => setIsOpen(false)}>\n <Button\n style={ButtonStyle.Default}\n emphasis={ButtonEmphasis.Default}\n size={ButtonSize.Small}\n onClick={buttons[1].action}\n >\n {buttons[1].label}\n </Button>\n </div>\n )}\n </div>\n )}\n </div>\n {/**\n * This container is needed for the arrow element to not be styled by popperJS\n * selectors for its immediate children .tw-popper-container > .tw-popper-arrow\n * */}\n <div aria-hidden=\"true\">\n <div\n data-test-id=\"popover-arrow\"\n data-popper-arrow={withArrow}\n ref={setArrowElement}\n style={popperInstance.styles.arrow}\n className={merge([\n withArrow &&\n 'tw-popper-arrow tw-z-[110000] tw-absolute tw-w-3 tw-h-3 tw-pointer-events-none before:tw-absolute before:tw-w-3 before:tw-h-3 before:tw-rotate-45 before:tw-border before:tw-border-line',\n withArrow && arrowStyling,\n ])}\n />\n </div>\n {children}\n </div>\n </>\n );\n};\nTooltip.displayName = 'FondueTooltip';\n"],"names":["paddingsTop","paddingsBottom","TooltipPosition","TooltipAlignment","placementMap","getArrowClasses","currentPlacement","brightHeader","alignment","merge","brightHeaderArrowBackgroundColors","Tooltip","content","tooltipIcon","heading","headingIcon","linkUrl","linkLabel","buttons","children","position","withArrow","flip","triggerElement","hoverDelay","enterDelay","open","disabled","hidden","triggerElementRef","setTriggerElementRef","useState","linkRef","useRef","linkProps","useLink","hasLargePaddingTop","useMemo","placement","tooltipContainerRef","setTooltipContainerRef","triggerElementContainerRef","setTriggerElementContainerRef","arrowElement","setArrowElement","id","useMemoizedId","popperInstance","usePopper","_a","arrowStyling","isOpen","setIsOpen","timeoutRef","handleHideTooltipOnHover","useCallback","handleShowTooltipOnHover","checkIfHovered","event","hoveredElement","el","triggerProps","useEffect","useLayoutEffect","React","cloneElement","BrightHeader","IconSize","FOCUS_VISIBLE_STYLE","Button","ButtonStyle","ButtonEmphasis","ButtonSize"],"mappings":"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"}