@frontify/fondue 12.0.0-beta.394 → 12.0.0-beta.396
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/LegacyOrderableList/LegacyCollectionItem.es.js +15 -17
- package/dist/components/LegacyOrderableList/LegacyCollectionItem.es.js.map +1 -1
- package/dist/components/RichTextEditor/EditorPositioningWrapper/ToolbarWrapper/ToolbarWrapperPositioningBottom.es.js +1 -1
- package/dist/components/RichTextEditor/EditorPositioningWrapper/ToolbarWrapper/ToolbarWrapperPositioningBottom.es.js.map +1 -1
- package/dist/components/RichTextEditor/EditorPositioningWrapper/ToolbarWrapper/ToolbarWrapperPositioningFloating.es.js +9 -9
- package/dist/components/RichTextEditor/EditorPositioningWrapper/ToolbarWrapper/ToolbarWrapperPositioningFloating.es.js.map +1 -1
- package/dist/components/RichTextEditor/EditorPositioningWrapper/ToolbarWrapper/ToolbarWrapperPositioningTop.es.js +1 -1
- package/dist/components/RichTextEditor/EditorPositioningWrapper/ToolbarWrapper/ToolbarWrapperPositioningTop.es.js.map +1 -1
- package/dist/components/RichTextEditor/Plugins/CheckboxListPlugin/CheckboxListElement.es.js +30 -26
- package/dist/components/RichTextEditor/Plugins/CheckboxListPlugin/CheckboxListElement.es.js.map +1 -1
- package/dist/components/RichTextEditor/RichTextEditor.es.js +24 -23
- package/dist/components/RichTextEditor/RichTextEditor.es.js.map +1 -1
- package/dist/components/TextInput/TextInput.es.js +15 -15
- package/dist/components/TextInput/TextInput.es.js.map +1 -1
- package/dist/index.cjs.js +4 -4
- 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextInput.es.js","sources":["../../../src/components/TextInput/TextInput.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { LoadingCircle, LoadingCircleSize } from '@components/LoadingCircle';\nimport { useCopy } from '@hooks/useCopy';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { useFocusRing } from '@react-aria/focus';\nimport { FOCUS_STYLE } from '@utilities/focusStyle';\nimport { merge } from '@utilities/merge';\nimport { Validation, validationClassMap } from '@utilities/validation';\nimport {\n AriaAttributes,\n FocusEvent,\n ForwardRefRenderFunction,\n KeyboardEvent,\n ReactElement,\n ReactNode,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n IconCheckMark,\n IconClipboard,\n IconCross,\n IconCrossCircle,\n IconExclamationMarkTriangle,\n IconEye,\n IconEyeOff,\n} from '@foundation/Icon/Generated';\nimport { LegacyTooltip, LegacyTooltipProps } from '../LegacyTooltip';\n\nexport enum TextInputType {\n Text = 'text',\n Password = 'password',\n Number = 'number',\n}\n\nexport type TextInputExtraAction = {\n onClick: () => void;\n icon: ReactElement;\n title: string;\n tooltip?: Omit<LegacyTooltipProps, 'triggerElement'>;\n disabled?: boolean;\n};\n\nexport type TextInputBaseProps = {\n id?: string;\n type?: TextInputType;\n decorator?: ReactNode;\n dotted?: boolean;\n clearable?: boolean;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n autocomplete?: boolean;\n readonly?: boolean;\n validation?: Validation;\n copyable?: boolean;\n value?: string;\n onChange?: (value: string) => void;\n onEnterPressed?: (event: KeyboardEvent<HTMLInputElement>) => void;\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n onClear?: () => void;\n size?: number;\n spellcheck?: boolean;\n focusOnMount?: boolean;\n selectable?: boolean;\n extraActions?: TextInputExtraAction[];\n} & AriaAttributes;\n\nexport type TextInputProps =\n | ({\n type?: TextInputType.Text;\n obfuscated?: false;\n } & TextInputBaseProps)\n | ({\n type?: TextInputType.Number;\n obfuscated?: false;\n min?: number;\n max?: number;\n } & TextInputBaseProps)\n | ({\n type: TextInputType.Password;\n obfuscated?: boolean;\n } & TextInputBaseProps);\n\ntype ExtraActionButtonProps = {\n extraAction: TextInputExtraAction;\n disabled: boolean;\n};\n\nconst ExtraActionButton: ForwardRefRenderFunction<HTMLButtonElement | null, ExtraActionButtonProps> = (\n { extraAction, disabled },\n ref,\n): ReactElement | null => {\n const { isFocusVisible: extraActionButtonIsFocusVisible, focusProps: extraActionButtonFocusProps } = useFocusRing();\n\n if (!extraAction) {\n return null;\n }\n\n const isDisabled = disabled || extraAction.disabled;\n return (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-rounded tw-p-1',\n isDisabled\n ? 'tw-cursor-default tw-text-text-disabled'\n : 'tw-text-text-weak hover:tw-bg-box-neutral-hover hover:tw-text-box-neutral-inverse-hover',\n extraActionButtonIsFocusVisible && FOCUS_STYLE,\n ])}\n onClick={extraAction.onClick}\n data-test-id=\"fondue-extra-action-icon\"\n aria-label={extraAction.title.toLowerCase()}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n type=\"button\"\n ref={ref}\n {...extraActionButtonFocusProps}\n >\n {extraAction.icon}\n </button>\n );\n};\nconst ExtraActionButtonWithRef = forwardRef(ExtraActionButton);\n\nexport const TextInput = ({\n id: propId,\n type = TextInputType.Text,\n decorator,\n validation = Validation.Default,\n clearable = false,\n placeholder,\n required,\n obfuscated,\n disabled = false,\n autocomplete = false,\n dotted = false,\n value = '',\n copyable = false,\n onChange,\n onEnterPressed,\n onBlur,\n onClear,\n onFocus,\n size,\n spellcheck,\n readonly,\n focusOnMount,\n selectable = false,\n extraActions,\n ...props\n}: TextInputProps): ReactElement => {\n const { isFocusVisible: inputIsFocusVisible, focusProps: inputFocusProps } = useFocusRing();\n const { isFocusVisible: clearButtonIsFocusVisible, focusProps: clearButtonFocusProps } = useFocusRing();\n const { isFocusVisible: passwordButtonIsFocusVisible, focusProps: passwordButtonFocusProps } = useFocusRing();\n const { isFocusVisible: copyButtonIsFocusVisible, focusProps: copyButtonFocusProps } = useFocusRing();\n\n const { copy, status } = useCopy();\n\n const inputElement = useRef<HTMLInputElement | null>(null);\n const [isObfuscated, setIsObfuscated] = useState(\n typeof obfuscated === 'boolean' ? obfuscated : type === TextInputType.Password,\n );\n\n useEffect(() => {\n setTimeout(() => {\n focusOnMount && inputElement.current?.focus();\n }, 0);\n }, [focusOnMount]);\n\n useEffect(() => {\n if (typeof obfuscated === 'boolean') {\n setIsObfuscated(obfuscated);\n }\n }, [obfuscated]);\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' && onEnterPressed) {\n onEnterPressed(event);\n }\n };\n\n const getInputType = () => {\n if (type === TextInputType.Password) {\n return isObfuscated ? TextInputType.Password : TextInputType.Text;\n }\n return type;\n };\n\n const spellcheckProp = typeof spellcheck === 'boolean' ? { spellCheck: spellcheck } : null;\n\n return (\n <div\n {...props}\n className={merge([\n 'tw-flex tw-items-center tw-h-9 tw-gap-2 tw-px-3 tw-border tw-transition tw-rounded tw-text-body-small tw-font-sans tw-relative tw-bg-white dark:tw-bg-transparent',\n dotted ? 'tw-border-dashed' : 'tw-border-solid',\n disabled || readonly\n ? 'tw-border-black-5 tw-bg-black-5 dark:tw-bg-black-90 dark:tw-border-black-90'\n : merge([\n 'focus-within:tw-border-line-xx-strong focus-within:hover:tw-border-line-xx-strong hover:tw-border-line-x-strong',\n validationClassMap[validation],\n inputIsFocusVisible &&\n !clearButtonIsFocusVisible &&\n !passwordButtonIsFocusVisible &&\n !copyButtonIsFocusVisible &&\n FOCUS_STYLE,\n ]),\n ])}\n data-test-id=\"fondue-text-input-component\"\n >\n {decorator && (\n <div\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-pl-1',\n disabled ? 'tw-text-black-60' : 'tw-text-black-80',\n ])}\n data-test-id=\"decorator\"\n >\n {decorator}\n </div>\n )}\n <input\n {...inputFocusProps}\n id={useMemoizedId(propId)}\n ref={inputElement}\n className={merge([\n 'tw-w-full tw-grow tw-border-none tw-outline-none tw-bg-transparent tw-hide-input-arrows',\n disabled || readonly\n ? 'tw-text-black-40 tw-placeholder-black-30 dark:tw-text-black-30 dark:tw-placeholder-black-40'\n : 'tw-text-black tw-placeholder-black-60 dark:tw-text-white',\n ])}\n onClick={() => inputElement.current?.focus()}\n onChange={(event) => onChange?.(event.currentTarget.value)}\n onBlur={(e) => {\n inputFocusProps.onBlur?.(e);\n onBlur?.(e);\n }}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n value={value}\n type={getInputType()}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n onFocus={(e) => {\n inputFocusProps.onFocus?.(e);\n if (selectable) {\n e.target.select();\n }\n if (onFocus) {\n onFocus(e);\n }\n }}\n autoComplete={autocomplete ? 'on' : 'off'}\n size={size}\n data-test-id=\"text-input\"\n {...spellcheckProp}\n />\n {extraActions &&\n extraActions.length > 0 &&\n extraActions.map((extraAction: TextInputExtraAction, index: number) => {\n const key = `text-input-extra-action-${index}`;\n if (extraAction.tooltip) {\n return (\n <LegacyTooltip\n key={key}\n {...extraAction.tooltip}\n triggerElement={\n <ExtraActionButtonWithRef extraAction={extraAction} disabled={disabled} />\n }\n />\n );\n }\n return <ExtraActionButtonWithRef key={key} extraAction={extraAction} disabled={disabled} />;\n })}\n {`${value}`.length > 0 && clearable && (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-rounded',\n disabled ? 'tw-cursor-default tw-text-black-40' : 'tw-text-black-60 hover:tw-text-black-100',\n clearButtonIsFocusVisible && FOCUS_STYLE,\n ])}\n onClick={() => {\n inputElement.current?.focus();\n inputElement.current?.setAttribute('value', '');\n\n onChange?.('');\n onClear?.();\n }}\n data-test-id=\"clear-icon\"\n title=\"Clear text input\"\n aria-label=\"clear text input\"\n disabled={disabled}\n type=\"button\"\n {...clearButtonFocusProps}\n >\n <IconCross />\n </button>\n )}\n {type === TextInputType.Password && (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-rounded',\n disabled ? 'tw-cursor-default tw-text-black-40' : 'tw-text-black-60 hover:tw-text-black-100',\n passwordButtonIsFocusVisible && FOCUS_STYLE,\n ])}\n onClick={() => setIsObfuscated(!isObfuscated)}\n data-test-id=\"visibility-icon\"\n title=\"Toggle text visibility\"\n type=\"button\"\n aria-label={`${isObfuscated ? 'unveil' : 'obfuscate'} text input`}\n disabled={disabled}\n {...passwordButtonFocusProps}\n >\n {isObfuscated ? <IconEye /> : <IconEyeOff />}\n </button>\n )}\n {validation === Validation.Loading && (\n <span className=\"tw-absolute tw-top-[-0.55rem] tw-right-[-0.55rem] tw-bg-white tw-rounded-full tw-p-[2px] tw-border tw-border-black-10\">\n <LoadingCircle size={LoadingCircleSize.ExtraSmall} />\n </span>\n )}\n {(validation === Validation.Error || validation === Validation.Warning) && (\n <span\n className={merge([\n 'tw-flex tw-items-center tw-justify-center',\n validation === Validation.Error && 'tw-text-text-negative',\n validation === Validation.Warning && 'tw-text-text-warning',\n ])}\n data-test-id=\"error-state-exclamation-mark-icon\"\n >\n <IconExclamationMarkTriangle />\n </span>\n )}\n {copyable && (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-rounded',\n disabled ? 'tw-cursor-default tw-text-black-40' : 'tw-text-black-60 hover:tw-text-black-100',\n copyButtonIsFocusVisible && FOCUS_STYLE,\n ])}\n onClick={() => copy(value)}\n data-test-id=\"copy-icon\"\n title=\"Copy input text\"\n disabled={disabled}\n type=\"button\"\n {...copyButtonFocusProps}\n >\n {status === 'error' && (\n <span className=\"tw-text-box-negative-strong\">\n <IconCrossCircle />\n </span>\n )}\n {status === 'idle' && <IconClipboard />}\n {status === 'success' && (\n <span className=\"tw-text-box-positive-strong\">\n <IconCheckMark />\n </span>\n )}\n </button>\n )}\n </div>\n );\n};\nTextInput.displayName = 'FondueTextInput';\n"],"names":["TextInputType","ExtraActionButton","extraAction","disabled","ref","extraActionButtonIsFocusVisible","extraActionButtonFocusProps","useFocusRing","isDisabled","jsx","merge","FOCUS_STYLE","ExtraActionButtonWithRef","forwardRef","TextInput","propId","type","decorator","validation","Validation","clearable","placeholder","required","obfuscated","autocomplete","dotted","value","copyable","onChange","onEnterPressed","onBlur","onClear","onFocus","size","spellcheck","readonly","focusOnMount","selectable","extraActions","props","inputIsFocusVisible","inputFocusProps","clearButtonIsFocusVisible","clearButtonFocusProps","passwordButtonIsFocusVisible","passwordButtonFocusProps","copyButtonIsFocusVisible","copyButtonFocusProps","copy","status","useCopy","inputElement","useRef","isObfuscated","setIsObfuscated","useState","useEffect","_a","onKeyDown","event","getInputType","spellcheckProp","jsxs","validationClassMap","useMemoizedId","e","index","key","LegacyTooltip","_b","IconCross","IconEye","IconEyeOff","LoadingCircle","LoadingCircleSize","IconExclamationMarkTriangle","IconCrossCircle","IconClipboard","IconCheckMark"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TextInput.es.js","sources":["../../../src/components/TextInput/TextInput.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport { LoadingCircle, LoadingCircleSize } from '@components/LoadingCircle';\nimport { useCopy } from '@hooks/useCopy';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { useFocusRing } from '@react-aria/focus';\nimport { FOCUS_STYLE } from '@utilities/focusStyle';\nimport { merge } from '@utilities/merge';\nimport { Validation, validationClassMap } from '@utilities/validation';\nimport {\n AriaAttributes,\n FocusEvent,\n ForwardRefRenderFunction,\n KeyboardEvent,\n ReactElement,\n ReactNode,\n forwardRef,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport {\n IconCheckMark,\n IconClipboard,\n IconCross,\n IconCrossCircle,\n IconExclamationMarkTriangle,\n IconEye,\n IconEyeOff,\n} from '@foundation/Icon/Generated';\nimport { LegacyTooltip, LegacyTooltipProps } from '../LegacyTooltip';\n\nexport enum TextInputType {\n Text = 'text',\n Password = 'password',\n Number = 'number',\n}\n\nexport type TextInputExtraAction = {\n onClick: () => void;\n icon: ReactElement;\n title: string;\n tooltip?: Omit<LegacyTooltipProps, 'triggerElement'>;\n disabled?: boolean;\n};\n\nexport type TextInputBaseProps = {\n id?: string;\n type?: TextInputType;\n decorator?: ReactNode;\n dotted?: boolean;\n clearable?: boolean;\n placeholder?: string;\n required?: boolean;\n disabled?: boolean;\n autocomplete?: boolean;\n readonly?: boolean;\n validation?: Validation;\n copyable?: boolean;\n value?: string;\n onChange?: (value: string) => void;\n onEnterPressed?: (event: KeyboardEvent<HTMLInputElement>) => void;\n onBlur?: (event: FocusEvent<HTMLInputElement>) => void;\n onFocus?: (event: FocusEvent<HTMLInputElement>) => void;\n onClear?: () => void;\n size?: number;\n spellcheck?: boolean;\n focusOnMount?: boolean;\n selectable?: boolean;\n extraActions?: TextInputExtraAction[];\n} & AriaAttributes;\n\nexport type TextInputProps =\n | ({\n type?: TextInputType.Text;\n obfuscated?: false;\n } & TextInputBaseProps)\n | ({\n type?: TextInputType.Number;\n obfuscated?: false;\n min?: number;\n max?: number;\n } & TextInputBaseProps)\n | ({\n type: TextInputType.Password;\n obfuscated?: boolean;\n } & TextInputBaseProps);\n\ntype ExtraActionButtonProps = {\n extraAction: TextInputExtraAction;\n disabled: boolean;\n};\n\nconst ExtraActionButton: ForwardRefRenderFunction<HTMLButtonElement | null, ExtraActionButtonProps> = (\n { extraAction, disabled },\n ref,\n): ReactElement | null => {\n const { isFocusVisible: extraActionButtonIsFocusVisible, focusProps: extraActionButtonFocusProps } = useFocusRing();\n\n if (!extraAction) {\n return null;\n }\n\n const isDisabled = disabled || extraAction.disabled;\n return (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-rounded tw-p-1',\n isDisabled\n ? 'tw-cursor-default tw-text-text-disabled'\n : 'tw-text-text-weak hover:tw-bg-box-neutral-hover hover:tw-text-box-neutral-inverse-hover',\n extraActionButtonIsFocusVisible && FOCUS_STYLE,\n ])}\n onClick={extraAction.onClick}\n data-test-id=\"fondue-extra-action-icon\"\n aria-label={extraAction.title.toLowerCase()}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n type=\"button\"\n ref={ref}\n {...extraActionButtonFocusProps}\n >\n {extraAction.icon}\n </button>\n );\n};\nconst ExtraActionButtonWithRef = forwardRef(ExtraActionButton);\n\nexport const TextInput = ({\n id: propId,\n type = TextInputType.Text,\n decorator,\n validation = Validation.Default,\n clearable = false,\n placeholder,\n required,\n obfuscated,\n disabled = false,\n autocomplete = false,\n dotted = false,\n value = '',\n copyable = false,\n onChange,\n onEnterPressed,\n onBlur,\n onClear,\n onFocus,\n size,\n spellcheck,\n readonly,\n focusOnMount,\n selectable = false,\n extraActions,\n ...props\n}: TextInputProps): ReactElement => {\n const { isFocusVisible: inputIsFocusVisible, focusProps: inputFocusProps } = useFocusRing({ isTextInput: true });\n const { isFocusVisible: clearButtonIsFocusVisible, focusProps: clearButtonFocusProps } = useFocusRing();\n const { isFocusVisible: passwordButtonIsFocusVisible, focusProps: passwordButtonFocusProps } = useFocusRing();\n const { isFocusVisible: copyButtonIsFocusVisible, focusProps: copyButtonFocusProps } = useFocusRing();\n\n const { copy, status } = useCopy();\n\n const inputElement = useRef<HTMLInputElement | null>(null);\n const [isObfuscated, setIsObfuscated] = useState(\n typeof obfuscated === 'boolean' ? obfuscated : type === TextInputType.Password,\n );\n\n useEffect(() => {\n setTimeout(() => {\n focusOnMount && inputElement.current?.focus();\n }, 0);\n }, [focusOnMount]);\n\n useEffect(() => {\n if (typeof obfuscated === 'boolean') {\n setIsObfuscated(obfuscated);\n }\n }, [obfuscated]);\n\n const onKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Enter' && onEnterPressed) {\n onEnterPressed(event);\n }\n };\n\n const getInputType = () => {\n if (type === TextInputType.Password) {\n return isObfuscated ? TextInputType.Password : TextInputType.Text;\n }\n return type;\n };\n\n const spellcheckProp = typeof spellcheck === 'boolean' ? { spellCheck: spellcheck } : null;\n\n return (\n <div\n {...props}\n className={merge([\n 'tw-flex tw-items-center tw-h-9 tw-gap-2 tw-px-3 tw-border tw-transition tw-rounded tw-text-body-small tw-font-sans tw-relative tw-bg-white dark:tw-bg-transparent',\n dotted ? 'tw-border-dashed' : 'tw-border-solid',\n disabled || readonly\n ? 'tw-border-black-5 tw-bg-black-5 dark:tw-bg-black-90 dark:tw-border-black-90'\n : merge([\n 'focus-within:tw-border-line-xx-strong focus-within:hover:tw-border-line-xx-strong hover:tw-border-line-x-strong',\n validationClassMap[validation],\n inputIsFocusVisible &&\n !clearButtonIsFocusVisible &&\n !passwordButtonIsFocusVisible &&\n !copyButtonIsFocusVisible &&\n FOCUS_STYLE,\n ]),\n ])}\n data-test-id=\"fondue-text-input-component\"\n >\n {decorator && (\n <div\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-pl-1',\n disabled ? 'tw-text-black-60' : 'tw-text-black-80',\n ])}\n data-test-id=\"decorator\"\n >\n {decorator}\n </div>\n )}\n <input\n {...inputFocusProps}\n id={useMemoizedId(propId)}\n ref={inputElement}\n className={merge([\n 'tw-w-full tw-grow tw-border-none tw-outline-none tw-bg-transparent tw-hide-input-arrows',\n disabled || readonly\n ? 'tw-text-black-40 tw-placeholder-black-30 dark:tw-text-black-30 dark:tw-placeholder-black-40'\n : 'tw-text-black tw-placeholder-black-60 dark:tw-text-white',\n ])}\n onClick={() => inputElement.current?.focus()}\n onChange={(event) => onChange?.(event.currentTarget.value)}\n onBlur={(e) => {\n inputFocusProps.onBlur?.(e);\n onBlur?.(e);\n }}\n onKeyDown={onKeyDown}\n placeholder={placeholder}\n value={value}\n type={getInputType()}\n required={required}\n readOnly={readonly}\n disabled={disabled}\n onFocus={(e) => {\n inputFocusProps.onFocus?.(e);\n if (selectable) {\n e.target.select();\n }\n if (onFocus) {\n onFocus(e);\n }\n }}\n autoComplete={autocomplete ? 'on' : 'off'}\n size={size}\n data-test-id=\"text-input\"\n {...spellcheckProp}\n />\n {extraActions &&\n extraActions.length > 0 &&\n extraActions.map((extraAction: TextInputExtraAction, index: number) => {\n const key = `text-input-extra-action-${index}`;\n if (extraAction.tooltip) {\n return (\n <LegacyTooltip\n key={key}\n {...extraAction.tooltip}\n triggerElement={\n <ExtraActionButtonWithRef extraAction={extraAction} disabled={disabled} />\n }\n />\n );\n }\n return <ExtraActionButtonWithRef key={key} extraAction={extraAction} disabled={disabled} />;\n })}\n {`${value}`.length > 0 && clearable && (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-rounded',\n disabled ? 'tw-cursor-default tw-text-black-40' : 'tw-text-black-60 hover:tw-text-black-100',\n clearButtonIsFocusVisible && FOCUS_STYLE,\n ])}\n onClick={() => {\n inputElement.current?.focus();\n inputElement.current?.setAttribute('value', '');\n\n onChange?.('');\n onClear?.();\n }}\n data-test-id=\"clear-icon\"\n title=\"Clear text input\"\n aria-label=\"clear text input\"\n disabled={disabled}\n type=\"button\"\n {...clearButtonFocusProps}\n >\n <IconCross />\n </button>\n )}\n {type === TextInputType.Password && (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-rounded',\n disabled ? 'tw-cursor-default tw-text-black-40' : 'tw-text-black-60 hover:tw-text-black-100',\n passwordButtonIsFocusVisible && FOCUS_STYLE,\n ])}\n onClick={() => setIsObfuscated(!isObfuscated)}\n data-test-id=\"visibility-icon\"\n title=\"Toggle text visibility\"\n type=\"button\"\n aria-label={`${isObfuscated ? 'unveil' : 'obfuscate'} text input`}\n disabled={disabled}\n {...passwordButtonFocusProps}\n >\n {isObfuscated ? <IconEye /> : <IconEyeOff />}\n </button>\n )}\n {validation === Validation.Loading && (\n <span className=\"tw-absolute tw-top-[-0.55rem] tw-right-[-0.55rem] tw-bg-white tw-rounded-full tw-p-[2px] tw-border tw-border-black-10\">\n <LoadingCircle size={LoadingCircleSize.ExtraSmall} />\n </span>\n )}\n {(validation === Validation.Error || validation === Validation.Warning) && (\n <span\n className={merge([\n 'tw-flex tw-items-center tw-justify-center',\n validation === Validation.Error && 'tw-text-text-negative',\n validation === Validation.Warning && 'tw-text-text-warning',\n ])}\n data-test-id=\"error-state-exclamation-mark-icon\"\n >\n <IconExclamationMarkTriangle />\n </span>\n )}\n {copyable && (\n <button\n className={merge([\n 'tw-flex tw-items-center tw-justify-center tw-transition-colors tw-rounded',\n disabled ? 'tw-cursor-default tw-text-black-40' : 'tw-text-black-60 hover:tw-text-black-100',\n copyButtonIsFocusVisible && FOCUS_STYLE,\n ])}\n onClick={() => copy(value)}\n data-test-id=\"copy-icon\"\n title=\"Copy input text\"\n disabled={disabled}\n type=\"button\"\n {...copyButtonFocusProps}\n >\n {status === 'error' && (\n <span className=\"tw-text-box-negative-strong\">\n <IconCrossCircle />\n </span>\n )}\n {status === 'idle' && <IconClipboard />}\n {status === 'success' && (\n <span className=\"tw-text-box-positive-strong\">\n <IconCheckMark />\n </span>\n )}\n </button>\n )}\n </div>\n );\n};\nTextInput.displayName = 'FondueTextInput';\n"],"names":["TextInputType","ExtraActionButton","extraAction","disabled","ref","extraActionButtonIsFocusVisible","extraActionButtonFocusProps","useFocusRing","isDisabled","jsx","merge","FOCUS_STYLE","ExtraActionButtonWithRef","forwardRef","TextInput","propId","type","decorator","validation","Validation","clearable","placeholder","required","obfuscated","autocomplete","dotted","value","copyable","onChange","onEnterPressed","onBlur","onClear","onFocus","size","spellcheck","readonly","focusOnMount","selectable","extraActions","props","inputIsFocusVisible","inputFocusProps","clearButtonIsFocusVisible","clearButtonFocusProps","passwordButtonIsFocusVisible","passwordButtonFocusProps","copyButtonIsFocusVisible","copyButtonFocusProps","copy","status","useCopy","inputElement","useRef","isObfuscated","setIsObfuscated","useState","useEffect","_a","onKeyDown","event","getInputType","spellcheckProp","jsxs","validationClassMap","useMemoizedId","e","index","key","LegacyTooltip","_b","IconCross","IconEye","IconEyeOff","LoadingCircle","LoadingCircleSize","IconExclamationMarkTriangle","IconCrossCircle","IconClipboard","IconCheckMark"],"mappings":"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"}
|