@frontify/fondue 12.0.0-beta.371 → 12.0.0-beta.372
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as r, jsxs as p } from "react/jsx-runtime";
|
|
2
2
|
import { InputLabel as Z } from "../InputLabel/InputLabel.es.js";
|
|
3
|
-
import { forwardRef as q, useState as
|
|
3
|
+
import { forwardRef as q, useState as g, useRef as E, useEffect as y, useCallback as R } from "react";
|
|
4
4
|
import { FOCUS_STYLE as T } from "../../utilities/focusStyle.es.js";
|
|
5
5
|
import { merge as o } from "../../utilities/merge.es.js";
|
|
6
6
|
import { mergeProps as ee } from "@react-aria/utils";
|
|
@@ -26,9 +26,9 @@ const de = (e) => e === "Checked" || e === "Mixed", W = "tw-bg-box-selected-stro
|
|
|
26
26
|
emphasis: k = "Default",
|
|
27
27
|
size: C = "Default",
|
|
28
28
|
disabled: s,
|
|
29
|
-
required:
|
|
29
|
+
required: v,
|
|
30
30
|
label: i,
|
|
31
|
-
hideLabel:
|
|
31
|
+
hideLabel: b,
|
|
32
32
|
tooltip: z,
|
|
33
33
|
helperText: l,
|
|
34
34
|
"aria-label": L = "Checkbox",
|
|
@@ -42,7 +42,7 @@ const de = (e) => e === "Checked" || e === "Mixed", W = "tw-bg-box-selected-stro
|
|
|
42
42
|
onChange: s ? void 0 : X,
|
|
43
43
|
isSelected: c === "Checked"
|
|
44
44
|
/* Checked */
|
|
45
|
-
}), [H, D] =
|
|
45
|
+
}), [H, D] = g(), [F, K] = g(), w = E(null), d = E(null), [Y, _] = g(!1), [A, B] = g(!1), N = (n) => {
|
|
46
46
|
n.key === "Tab" && D(!0);
|
|
47
47
|
}, S = () => {
|
|
48
48
|
D(!1);
|
|
@@ -54,7 +54,7 @@ const de = (e) => e === "Checked" || e === "Mixed", W = "tw-bg-box-selected-stro
|
|
|
54
54
|
const { inputProps: G } = te(
|
|
55
55
|
{
|
|
56
56
|
isDisabled: s,
|
|
57
|
-
isRequired:
|
|
57
|
+
isRequired: v,
|
|
58
58
|
isIndeterminate: c === "Mixed",
|
|
59
59
|
"aria-label": L,
|
|
60
60
|
value: U
|
|
@@ -78,18 +78,18 @@ const de = (e) => e === "Checked" || e === "Mixed", W = "tw-bg-box-selected-stro
|
|
|
78
78
|
);
|
|
79
79
|
}, [w, d]);
|
|
80
80
|
return y(() => {
|
|
81
|
-
if (!(!i && !l ||
|
|
81
|
+
if (!(!i && !l || b))
|
|
82
82
|
return u(), window.removeEventListener("resize", u), window.addEventListener("resize", u), () => {
|
|
83
83
|
window.removeEventListener("resize", u);
|
|
84
84
|
};
|
|
85
|
-
}, [i, l,
|
|
85
|
+
}, [i, l, b, u]), /* @__PURE__ */ r("div", { className: "tw-gap-1 tw-transition-colors tw-w-full", "data-test-id": a, children: /* @__PURE__ */ r("div", { className: o(["tw-inline-flex tw-flex-row tw-rounded tw-w-full", H ? T : ""]), children: /* @__PURE__ */ r(
|
|
86
86
|
Z,
|
|
87
87
|
{
|
|
88
88
|
disabled: s,
|
|
89
89
|
clickable: !0,
|
|
90
90
|
htmlFor: M,
|
|
91
91
|
tooltip: z,
|
|
92
|
-
required:
|
|
92
|
+
required: v,
|
|
93
93
|
bold: h,
|
|
94
94
|
children: /* @__PURE__ */ p("span", { className: "tw-flex tw-items-center tw-whitespace-nowrap", children: [
|
|
95
95
|
/* @__PURE__ */ p("span", { className: "tw-inline-flex", children: [
|
|
@@ -104,7 +104,7 @@ const de = (e) => e === "Checked" || e === "Mixed", W = "tw-bg-box-selected-stro
|
|
|
104
104
|
"aria-label": L,
|
|
105
105
|
role: "checkbox",
|
|
106
106
|
"aria-checked": c === "Checked",
|
|
107
|
-
required:
|
|
107
|
+
required: v
|
|
108
108
|
}
|
|
109
109
|
),
|
|
110
110
|
/* @__PURE__ */ r(
|
|
@@ -121,8 +121,8 @@ const de = (e) => e === "Checked" || e === "Mixed", W = "tw-bg-box-selected-stro
|
|
|
121
121
|
}
|
|
122
122
|
)
|
|
123
123
|
] }),
|
|
124
|
-
/* @__PURE__ */ p("span", { className: "tw-inline-flex tw-flex-col tw-min-w-0 tw-ml-1.5", children: [
|
|
125
|
-
i &&
|
|
124
|
+
!b && /* @__PURE__ */ p("span", { className: "tw-inline-flex tw-flex-col tw-min-w-0 tw-ml-1.5", children: [
|
|
125
|
+
i && /* @__PURE__ */ r(
|
|
126
126
|
"span",
|
|
127
127
|
{
|
|
128
128
|
ref: w,
|
|
@@ -136,7 +136,7 @@ const de = (e) => e === "Checked" || e === "Mixed", W = "tw-bg-box-selected-stro
|
|
|
136
136
|
children: i
|
|
137
137
|
}
|
|
138
138
|
),
|
|
139
|
-
l &&
|
|
139
|
+
l && /* @__PURE__ */ r(
|
|
140
140
|
"span",
|
|
141
141
|
{
|
|
142
142
|
ref: d,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox.es.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { IconCheckMark, IconMinus } from '@foundation/Icon/Generated';\nimport { InputLabel, InputLabelTooltipProps } from '@components/InputLabel/InputLabel';\nimport {\n ForwardRefRenderFunction,\n HTMLAttributes,\n ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { FOCUS_STYLE } from '@utilities/focusStyle';\nimport { IconSize } from '@foundation/Icon';\nimport { merge } from '@utilities/merge';\nimport { mergeProps } from '@react-aria/utils';\nimport { useCheckbox } from '@react-aria/checkbox';\nimport { useFocusRing } from '@react-aria/focus';\nimport { useForwardedRef } from '@utilities/useForwardedRef';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { useToggleState } from '@react-stately/toggle';\n\nexport enum CheckboxState {\n Checked = 'Checked',\n Unchecked = 'Unchecked',\n Mixed = 'Mixed',\n}\n\nexport enum CheckboxEmphasis {\n Default = 'Default',\n Weak = 'Weak',\n Strong = 'Strong',\n}\n\nexport enum CheckboxSize {\n Default = 'Default',\n Large = 'Large',\n XLarge = 'XLarge',\n}\n\nexport type CheckboxProps = {\n id?: string;\n state?: CheckboxState;\n emphasis?: CheckboxEmphasis;\n size?: CheckboxSize;\n disabled?: boolean;\n required?: boolean;\n value?: string;\n onChange?: (isChecked: boolean) => void;\n label?: string;\n hideLabel?: boolean;\n tooltip?: InputLabelTooltipProps;\n helperText?: string;\n 'aria-label'?: string;\n groupInputProps?: HTMLAttributes<HTMLElement>;\n 'data-test-id'?: string;\n};\n\nconst isCheckedOrMixed = (checked: CheckboxState): boolean => {\n return checked === CheckboxState.Checked || checked === CheckboxState.Mixed;\n};\n\nconst emphasisDefaultClasses =\n 'tw-bg-box-selected-strong tw-text-box-selected-strong-inverse hover:tw-bg-box-selected-strong-hover';\n\nconst emphasisCheckedClassesMap: Record<CheckboxEmphasis, string> = {\n [CheckboxEmphasis.Weak]:\n 'tw-bg-box-neutral-strong tw-text-box-neutral-strong-inverse hover:tw-bg-box-neutral-strong-hover',\n [CheckboxEmphasis.Default]: emphasisDefaultClasses,\n [CheckboxEmphasis.Strong]: emphasisDefaultClasses,\n};\n\nconst sizeClassesMap: Record<CheckboxSize, string> = {\n [CheckboxSize.Default]: 'tw-h-4 tw-w-4',\n [CheckboxSize.Large]: 'tw-h-5 tw-w-5',\n [CheckboxSize.XLarge]: 'tw-h-8 tw-w-8',\n};\n\nconst CheckboxComponent: ForwardRefRenderFunction<HTMLInputElement, CheckboxProps> = (\n {\n id: propId,\n emphasis = CheckboxEmphasis.Default,\n size = CheckboxSize.Default,\n disabled,\n required,\n label,\n hideLabel,\n tooltip,\n helperText,\n 'aria-label': ariaLabel = 'Checkbox',\n value,\n groupInputProps,\n onChange,\n state = CheckboxState.Unchecked,\n 'data-test-id': dataTestId = 'checkbox',\n },\n ref,\n) => {\n const id = useMemoizedId(propId);\n const inputRef = useForwardedRef<HTMLInputElement | null>(ref);\n const { focusProps } = useFocusRing();\n const toggleState = useToggleState({\n onChange: disabled ? undefined : onChange,\n isSelected: state === CheckboxState.Checked,\n });\n const [showFocus, setShowFocus] = useState<Nullable<boolean>>();\n const [listeningForKeyboardEvents, setListeningForKeyboardEvents] = useState<Nullable<boolean>>();\n const labelContainer = useRef<HTMLSpanElement>(null);\n const helperTextContainer = useRef<HTMLSpanElement>(null);\n const [isLabelOverflowing, setIsLabelOverflowing] = useState(false);\n const [isHelperTextOverflowing, setIsHelperTextOverflowing] = useState(false);\n\n const tabFocusListener = (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n setShowFocus(true);\n }\n };\n\n const blurListener = () => {\n setShowFocus(false);\n };\n\n useEffect(() => {\n if (!listeningForKeyboardEvents) {\n inputRef?.current?.removeEventListener('keyup', tabFocusListener);\n inputRef?.current?.addEventListener('keyup', tabFocusListener);\n inputRef?.current?.removeEventListener('blur', blurListener);\n inputRef?.current?.addEventListener('blur', blurListener);\n\n setListeningForKeyboardEvents(true);\n }\n }, [listeningForKeyboardEvents, inputRef]);\n\n const { inputProps } = useCheckbox(\n {\n isDisabled: disabled,\n isRequired: required,\n isIndeterminate: state === CheckboxState.Mixed,\n 'aria-label': ariaLabel,\n value,\n },\n toggleState,\n inputRef,\n );\n\n const stateMap: Record<CheckboxState, ReactNode> = {\n [CheckboxState.Checked]: (\n <IconCheckMark size={size === CheckboxSize.XLarge ? IconSize.Size24 : IconSize.Size16} />\n ),\n [CheckboxState.Mixed]: <IconMinus />,\n [CheckboxState.Unchecked]: null,\n };\n\n const checkedOrMixed = isCheckedOrMixed(state);\n\n const disabledClasses = merge([\n 'tw-bg-box-disabled tw-pointer-events-none tw-text-box-disabled-inverse tw-border-line-strong',\n checkedOrMixed && 'tw-text-box-disabled-inverse tw-border-line-strong',\n ]);\n\n const enabledClasses = checkedOrMixed\n ? emphasisCheckedClassesMap[emphasis]\n : merge([\n 'tw-bg-base hover:tw-bg-box-neutral',\n emphasis === CheckboxEmphasis.Strong\n ? 'tw-border-2 tw-border-box-selected-strong'\n : 'tw-border tw-border-line-xx-strong',\n ]);\n\n const checkOverflowing = useCallback(() => {\n if (labelContainer.current) {\n setIsLabelOverflowing(labelContainer.current?.scrollWidth > labelContainer.current?.clientWidth);\n }\n\n if (helperTextContainer.current) {\n setIsHelperTextOverflowing(\n helperTextContainer.current?.scrollWidth > helperTextContainer.current?.clientWidth,\n );\n }\n }, [labelContainer, helperTextContainer]);\n\n useEffect(() => {\n if ((!label && !helperText) || hideLabel) {\n return;\n }\n checkOverflowing();\n\n window.removeEventListener('resize', checkOverflowing);\n window.addEventListener('resize', checkOverflowing);\n\n return () => {\n window.removeEventListener('resize', checkOverflowing);\n };\n }, [label, helperText, hideLabel, checkOverflowing]);\n\n return (\n <div className=\"tw-gap-1 tw-transition-colors tw-w-full\" data-test-id={dataTestId}>\n <div className={merge(['tw-inline-flex tw-flex-row tw-rounded tw-w-full', showFocus ? FOCUS_STYLE : ''])}>\n <InputLabel\n disabled={disabled}\n clickable\n htmlFor={id}\n tooltip={tooltip}\n required={required}\n bold={checkedOrMixed}\n >\n <span className=\"tw-flex tw-items-center tw-whitespace-nowrap\">\n <span className=\"tw-inline-flex\">\n <input\n {...mergeProps(groupInputProps || inputProps, focusProps)}\n id={id}\n ref={inputRef}\n className=\"tw-sr-only\"\n data-test-id={`${dataTestId}-input`}\n aria-label={ariaLabel}\n role=\"checkbox\"\n aria-checked={state === CheckboxState.Checked}\n required={required}\n />\n <span\n data-test-id={`${dataTestId}-icon-box`}\n aria-hidden=\"true\"\n className={merge([\n 'tw-leading-3 tw-relative tw-flex tw-items-center tw-justify-center tw-rounded tw-shrink-0 tw-flex-none',\n sizeClassesMap[size],\n disabled ? disabledClasses : enabledClasses,\n ])}\n >\n {stateMap[state]}\n </span>\n </span>\n <span className=\"tw-inline-flex tw-flex-col tw-min-w-0 tw-ml-1.5\">\n {label && !hideLabel && (\n <span\n ref={labelContainer}\n data-test-id={`${dataTestId}-label`}\n className={merge([\n 'tw-text-ellipsis tw-overflow-hidden',\n 'tw-text-xs tw-select-none hover:tw-cursor-pointer hover:tw-text-black dark:hover:tw-text-white group-hover:tw-text-black dark:group-hover:tw-text-white',\n checkedOrMixed && 'tw-font-medium',\n ])}\n title={isLabelOverflowing ? label : undefined}\n >\n {label}\n </span>\n )}\n {helperText && !hideLabel && (\n <span\n ref={helperTextContainer}\n data-test-id={`${dataTestId}-helper-text`}\n className={merge([\n 'tw-text-ellipsis tw-overflow-hidden',\n 'tw-font-sans tw-text-xs tw-font-normal',\n disabled ? 'text-disabled' : 'tw-text-text-weak',\n ])}\n title={isHelperTextOverflowing ? helperText : undefined}\n >\n {helperText}\n </span>\n )}\n </span>\n </span>\n </InputLabel>\n </div>\n </div>\n );\n};\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(CheckboxComponent);\nCheckbox.displayName = 'FondueCheckbox';\n"],"names":["CheckboxState","CheckboxEmphasis","CheckboxSize","isCheckedOrMixed","checked","emphasisDefaultClasses","emphasisCheckedClassesMap","sizeClassesMap","CheckboxComponent","propId","emphasis","size","disabled","required","label","hideLabel","tooltip","helperText","ariaLabel","value","groupInputProps","onChange","state","dataTestId","ref","id","useMemoizedId","inputRef","useForwardedRef","focusProps","useFocusRing","toggleState","useToggleState","showFocus","setShowFocus","useState","listeningForKeyboardEvents","setListeningForKeyboardEvents","labelContainer","useRef","helperTextContainer","isLabelOverflowing","setIsLabelOverflowing","isHelperTextOverflowing","setIsHelperTextOverflowing","tabFocusListener","event","blurListener","useEffect","_a","_b","_c","_d","inputProps","useCheckbox","stateMap","jsx","IconCheckMark","IconSize","IconMinus","checkedOrMixed","disabledClasses","merge","enabledClasses","checkOverflowing","useCallback","FOCUS_STYLE","InputLabel","jsxs","mergeProps","Checkbox","forwardRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Checkbox.es.js","sources":["../../../src/components/Checkbox/Checkbox.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { IconCheckMark, IconMinus } from '@foundation/Icon/Generated';\nimport { InputLabel, InputLabelTooltipProps } from '@components/InputLabel/InputLabel';\nimport {\n ForwardRefRenderFunction,\n HTMLAttributes,\n ReactNode,\n forwardRef,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { FOCUS_STYLE } from '@utilities/focusStyle';\nimport { IconSize } from '@foundation/Icon';\nimport { merge } from '@utilities/merge';\nimport { mergeProps } from '@react-aria/utils';\nimport { useCheckbox } from '@react-aria/checkbox';\nimport { useFocusRing } from '@react-aria/focus';\nimport { useForwardedRef } from '@utilities/useForwardedRef';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { useToggleState } from '@react-stately/toggle';\n\nexport enum CheckboxState {\n Checked = 'Checked',\n Unchecked = 'Unchecked',\n Mixed = 'Mixed',\n}\n\nexport enum CheckboxEmphasis {\n Default = 'Default',\n Weak = 'Weak',\n Strong = 'Strong',\n}\n\nexport enum CheckboxSize {\n Default = 'Default',\n Large = 'Large',\n XLarge = 'XLarge',\n}\n\nexport type CheckboxProps = {\n id?: string;\n state?: CheckboxState;\n emphasis?: CheckboxEmphasis;\n size?: CheckboxSize;\n disabled?: boolean;\n required?: boolean;\n value?: string;\n onChange?: (isChecked: boolean) => void;\n label?: string;\n hideLabel?: boolean;\n tooltip?: InputLabelTooltipProps;\n helperText?: string;\n 'aria-label'?: string;\n groupInputProps?: HTMLAttributes<HTMLElement>;\n 'data-test-id'?: string;\n};\n\nconst isCheckedOrMixed = (checked: CheckboxState): boolean => {\n return checked === CheckboxState.Checked || checked === CheckboxState.Mixed;\n};\n\nconst emphasisDefaultClasses =\n 'tw-bg-box-selected-strong tw-text-box-selected-strong-inverse hover:tw-bg-box-selected-strong-hover';\n\nconst emphasisCheckedClassesMap: Record<CheckboxEmphasis, string> = {\n [CheckboxEmphasis.Weak]:\n 'tw-bg-box-neutral-strong tw-text-box-neutral-strong-inverse hover:tw-bg-box-neutral-strong-hover',\n [CheckboxEmphasis.Default]: emphasisDefaultClasses,\n [CheckboxEmphasis.Strong]: emphasisDefaultClasses,\n};\n\nconst sizeClassesMap: Record<CheckboxSize, string> = {\n [CheckboxSize.Default]: 'tw-h-4 tw-w-4',\n [CheckboxSize.Large]: 'tw-h-5 tw-w-5',\n [CheckboxSize.XLarge]: 'tw-h-8 tw-w-8',\n};\n\nconst CheckboxComponent: ForwardRefRenderFunction<HTMLInputElement, CheckboxProps> = (\n {\n id: propId,\n emphasis = CheckboxEmphasis.Default,\n size = CheckboxSize.Default,\n disabled,\n required,\n label,\n hideLabel,\n tooltip,\n helperText,\n 'aria-label': ariaLabel = 'Checkbox',\n value,\n groupInputProps,\n onChange,\n state = CheckboxState.Unchecked,\n 'data-test-id': dataTestId = 'checkbox',\n },\n ref,\n) => {\n const id = useMemoizedId(propId);\n const inputRef = useForwardedRef<HTMLInputElement | null>(ref);\n const { focusProps } = useFocusRing();\n const toggleState = useToggleState({\n onChange: disabled ? undefined : onChange,\n isSelected: state === CheckboxState.Checked,\n });\n const [showFocus, setShowFocus] = useState<Nullable<boolean>>();\n const [listeningForKeyboardEvents, setListeningForKeyboardEvents] = useState<Nullable<boolean>>();\n const labelContainer = useRef<HTMLSpanElement>(null);\n const helperTextContainer = useRef<HTMLSpanElement>(null);\n const [isLabelOverflowing, setIsLabelOverflowing] = useState(false);\n const [isHelperTextOverflowing, setIsHelperTextOverflowing] = useState(false);\n\n const tabFocusListener = (event: KeyboardEvent) => {\n if (event.key === 'Tab') {\n setShowFocus(true);\n }\n };\n\n const blurListener = () => {\n setShowFocus(false);\n };\n\n useEffect(() => {\n if (!listeningForKeyboardEvents) {\n inputRef?.current?.removeEventListener('keyup', tabFocusListener);\n inputRef?.current?.addEventListener('keyup', tabFocusListener);\n inputRef?.current?.removeEventListener('blur', blurListener);\n inputRef?.current?.addEventListener('blur', blurListener);\n\n setListeningForKeyboardEvents(true);\n }\n }, [listeningForKeyboardEvents, inputRef]);\n\n const { inputProps } = useCheckbox(\n {\n isDisabled: disabled,\n isRequired: required,\n isIndeterminate: state === CheckboxState.Mixed,\n 'aria-label': ariaLabel,\n value,\n },\n toggleState,\n inputRef,\n );\n\n const stateMap: Record<CheckboxState, ReactNode> = {\n [CheckboxState.Checked]: (\n <IconCheckMark size={size === CheckboxSize.XLarge ? IconSize.Size24 : IconSize.Size16} />\n ),\n [CheckboxState.Mixed]: <IconMinus />,\n [CheckboxState.Unchecked]: null,\n };\n\n const checkedOrMixed = isCheckedOrMixed(state);\n\n const disabledClasses = merge([\n 'tw-bg-box-disabled tw-pointer-events-none tw-text-box-disabled-inverse tw-border-line-strong',\n checkedOrMixed && 'tw-text-box-disabled-inverse tw-border-line-strong',\n ]);\n\n const enabledClasses = checkedOrMixed\n ? emphasisCheckedClassesMap[emphasis]\n : merge([\n 'tw-bg-base hover:tw-bg-box-neutral',\n emphasis === CheckboxEmphasis.Strong\n ? 'tw-border-2 tw-border-box-selected-strong'\n : 'tw-border tw-border-line-xx-strong',\n ]);\n\n const checkOverflowing = useCallback(() => {\n if (labelContainer.current) {\n setIsLabelOverflowing(labelContainer.current?.scrollWidth > labelContainer.current?.clientWidth);\n }\n\n if (helperTextContainer.current) {\n setIsHelperTextOverflowing(\n helperTextContainer.current?.scrollWidth > helperTextContainer.current?.clientWidth,\n );\n }\n }, [labelContainer, helperTextContainer]);\n\n useEffect(() => {\n if ((!label && !helperText) || hideLabel) {\n return;\n }\n checkOverflowing();\n\n window.removeEventListener('resize', checkOverflowing);\n window.addEventListener('resize', checkOverflowing);\n\n return () => {\n window.removeEventListener('resize', checkOverflowing);\n };\n }, [label, helperText, hideLabel, checkOverflowing]);\n\n return (\n <div className=\"tw-gap-1 tw-transition-colors tw-w-full\" data-test-id={dataTestId}>\n <div className={merge(['tw-inline-flex tw-flex-row tw-rounded tw-w-full', showFocus ? FOCUS_STYLE : ''])}>\n <InputLabel\n disabled={disabled}\n clickable\n htmlFor={id}\n tooltip={tooltip}\n required={required}\n bold={checkedOrMixed}\n >\n <span className=\"tw-flex tw-items-center tw-whitespace-nowrap\">\n <span className=\"tw-inline-flex\">\n <input\n {...mergeProps(groupInputProps || inputProps, focusProps)}\n id={id}\n ref={inputRef}\n className=\"tw-sr-only\"\n data-test-id={`${dataTestId}-input`}\n aria-label={ariaLabel}\n role=\"checkbox\"\n aria-checked={state === CheckboxState.Checked}\n required={required}\n />\n <span\n data-test-id={`${dataTestId}-icon-box`}\n aria-hidden=\"true\"\n className={merge([\n 'tw-leading-3 tw-relative tw-flex tw-items-center tw-justify-center tw-rounded tw-shrink-0 tw-flex-none',\n sizeClassesMap[size],\n disabled ? disabledClasses : enabledClasses,\n ])}\n >\n {stateMap[state]}\n </span>\n </span>\n {!hideLabel && (\n <span className=\"tw-inline-flex tw-flex-col tw-min-w-0 tw-ml-1.5\">\n {label && (\n <span\n ref={labelContainer}\n data-test-id={`${dataTestId}-label`}\n className={merge([\n 'tw-text-ellipsis tw-overflow-hidden',\n 'tw-text-xs tw-select-none hover:tw-cursor-pointer hover:tw-text-black dark:hover:tw-text-white group-hover:tw-text-black dark:group-hover:tw-text-white',\n checkedOrMixed && 'tw-font-medium',\n ])}\n title={isLabelOverflowing ? label : undefined}\n >\n {label}\n </span>\n )}\n {helperText && (\n <span\n ref={helperTextContainer}\n data-test-id={`${dataTestId}-helper-text`}\n className={merge([\n 'tw-text-ellipsis tw-overflow-hidden',\n 'tw-font-sans tw-text-xs tw-font-normal',\n disabled ? 'text-disabled' : 'tw-text-text-weak',\n ])}\n title={isHelperTextOverflowing ? helperText : undefined}\n >\n {helperText}\n </span>\n )}\n </span>\n )}\n </span>\n </InputLabel>\n </div>\n </div>\n );\n};\n\nexport const Checkbox = forwardRef<HTMLInputElement, CheckboxProps>(CheckboxComponent);\nCheckbox.displayName = 'FondueCheckbox';\n"],"names":["CheckboxState","CheckboxEmphasis","CheckboxSize","isCheckedOrMixed","checked","emphasisDefaultClasses","emphasisCheckedClassesMap","sizeClassesMap","CheckboxComponent","propId","emphasis","size","disabled","required","label","hideLabel","tooltip","helperText","ariaLabel","value","groupInputProps","onChange","state","dataTestId","ref","id","useMemoizedId","inputRef","useForwardedRef","focusProps","useFocusRing","toggleState","useToggleState","showFocus","setShowFocus","useState","listeningForKeyboardEvents","setListeningForKeyboardEvents","labelContainer","useRef","helperTextContainer","isLabelOverflowing","setIsLabelOverflowing","isHelperTextOverflowing","setIsHelperTextOverflowing","tabFocusListener","event","blurListener","useEffect","_a","_b","_c","_d","inputProps","useCheckbox","stateMap","jsx","IconCheckMark","IconSize","IconMinus","checkedOrMixed","disabledClasses","merge","enabledClasses","checkOverflowing","useCallback","FOCUS_STYLE","InputLabel","jsxs","mergeProps","Checkbox","forwardRef"],"mappings":"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"}
|