@frontify/fondue 13.4.3 → 13.4.5
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/ActionMenu/Aria/AriaMenuItem.es.js.map +1 -1
- package/dist/components/Breadcrumbs/BreadcrumbItem.es.js +1 -2
- package/dist/components/Breadcrumbs/BreadcrumbItem.es.js.map +1 -1
- package/dist/components/Breadcrumbs/CurrentBreadcrumbItem.es.js +9 -9
- package/dist/components/Breadcrumbs/CurrentBreadcrumbItem.es.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.es.js +81 -82
- package/dist/components/Checkbox/Checkbox.es.js.map +1 -1
- package/dist/components/Checklist/Checklist.es.js.map +1 -1
- package/dist/components/EditableText/EditableText.es.js +1 -1
- package/dist/components/EditableText/EditableText.es.js.map +1 -1
- package/dist/components/FilterableMultiSelect/FilterableMultiSelect.es.js.map +1 -1
- package/dist/components/LegacyTooltip/LegacyTooltip.es.js.map +1 -1
- package/dist/components/Menu/Menu.es.js.map +1 -1
- package/dist/components/Menu/useMenuKeyboardNavigation.es.js.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.es.js.map +1 -1
- package/dist/components/OrderableList/OrderableList.es.js.map +1 -1
- package/dist/components/TextInput/TextInput.es.js.map +1 -1
- package/dist/components/Tree/Tree.es.js.map +1 -1
- package/dist/components/Tree/TreeItem/TreeItem.es.js +93 -93
- package/dist/components/Tree/TreeItem/TreeItem.es.js.map +1 -1
- package/dist/components/Tree/TreeItem/TreeItemMultiselect.es.js.map +1 -1
- package/dist/components/Tree/utils/useDeepCompareEffect.es.js.map +1 -1
- package/dist/hooks/useDropdownAutoHeight.es.js.map +1 -1
- package/dist/index.cjs.js +2 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/packages/components/style.css +1 -1
- package/dist/packages/locales/de-CH.d.ts +2 -0
- package/dist/packages/locales/de-CH.js +36 -0
- package/dist/packages/locales/de-CH.js.map +1 -0
- package/dist/packages/locales/de-DE.d.ts +2 -0
- package/dist/packages/locales/de-DE.js +36 -0
- package/dist/packages/locales/de-DE.js.map +1 -0
- package/dist/packages/locales/en-US.d.ts +31 -0
- package/dist/packages/locales/en-US.js +36 -0
- package/dist/packages/locales/en-US.js.map +1 -0
- package/dist/packages/locales/es-ES.d.ts +2 -0
- package/dist/packages/locales/es-ES.js +36 -0
- package/dist/packages/locales/es-ES.js.map +1 -0
- package/dist/packages/locales/fr-CH.d.ts +2 -0
- package/dist/packages/locales/fr-CH.js +36 -0
- package/dist/packages/locales/fr-CH.js.map +1 -0
- package/dist/packages/locales/fr-FR.d.ts +2 -0
- package/dist/packages/locales/fr-FR.js +36 -0
- package/dist/packages/locales/fr-FR.js.map +1 -0
- package/dist/packages/locales/index.d.ts +12 -0
- package/dist/packages/locales/index.js +25 -0
- package/dist/packages/locales/index.js.map +1 -0
- package/dist/packages/locales/it-CH.d.ts +2 -0
- package/dist/packages/locales/it-CH.js +36 -0
- package/dist/packages/locales/it-CH.js.map +1 -0
- package/dist/packages/locales/it-IT.d.ts +2 -0
- package/dist/packages/locales/it-IT.js +36 -0
- package/dist/packages/locales/it-IT.js.map +1 -0
- package/dist/packages/locales/nl-NL.d.ts +2 -0
- package/dist/packages/locales/nl-NL.js +36 -0
- package/dist/packages/locales/nl-NL.js.map +1 -0
- package/dist/packages/locales/pl-PL.d.ts +2 -0
- package/dist/packages/locales/pl-PL.js +36 -0
- package/dist/packages/locales/pl-PL.js.map +1 -0
- package/dist/packages/locales/pt-PT.d.ts +2 -0
- package/dist/packages/locales/pt-PT.js +36 -0
- package/dist/packages/locales/pt-PT.js.map +1 -0
- package/dist/packages/locales/types.d.ts +9 -0
- package/dist/packages/rte/style.css +1 -1
- package/dist/utilities/useForwardedRef.es.js.map +1 -1
- package/package.json +15 -6
|
@@ -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 {\n IconCheckMark,\n IconClipboard,\n IconCross,\n IconCrossCircle,\n IconExclamationMarkTriangle,\n IconEye,\n IconEyeOff,\n} from '@frontify/fondue-icons';\nimport { useFocusRing } from '@react-aria/focus';\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type AriaAttributes,\n type FocusEvent,\n type ForwardRefRenderFunction,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport { LoadingCircle, LoadingCircleSize } from '@components/LoadingCircle/LoadingCircle';\nimport { useCopy } from '@hooks/useCopy';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { FOCUS_STYLE } from '@utilities/focusStyle';\nimport { merge } from '@utilities/merge';\nimport { Validation, validationClassMap } from '@utilities/validation';\n\nimport { LegacyTooltip, type LegacyTooltipProps } from '../LegacyTooltip/LegacyTooltip';\n\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md} the migration guide}.\n */\nexport enum TextInputType {\n Text = 'text',\n Password = 'password',\n Number = 'number',\n Search = 'search',\n}\n\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md} the migration guide}.\n */\nexport type TextInputExtraAction = {\n onClick: () => void;\n icon: ReactElement;\n title: string;\n tooltip?: Omit<LegacyTooltipProps, 'triggerElement'>;\n disabled?: boolean;\n};\n\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md} the migration guide}.\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 maxLength?: number;\n size?: number;\n spellcheck?: boolean;\n /** @deprecated a `ref` can be forwarded to expose the underlying `<input />` DOM node.\n @example\n ```tsx\n import { TextInput } from '@frontify/fondue';\n\n const Component = () => {\n const inputRef = useRef();\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [)\n return <TextInput ref={inputRef} />\n }\n ```\n */\n focusOnMount?: boolean;\n selectable?: boolean;\n extraActions?: TextInputExtraAction[];\n ariaLabel?: string;\n} & AriaAttributes;\n\ntype TextInputTextProps = TextInputBaseProps & {\n type?: TextInputType.Text;\n obfuscated?: false;\n};\ntype TextInputSearchProps = TextInputBaseProps & {\n type: TextInputType.Search;\n obfuscated?: false;\n};\ntype TextInputNumberProps = TextInputBaseProps & {\n type: TextInputType.Number;\n min?: number;\n max?: number;\n obfuscated?: false;\n};\ntype TextInputPasswordProps = TextInputBaseProps & {\n type: TextInputType.Password;\n obfuscated?: boolean;\n};\n\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md} the migration guide}.\n */\nexport type TextInputProps = TextInputTextProps | TextInputNumberProps | TextInputPasswordProps | TextInputSearchProps;\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\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md#text-input the migration guide}.\n */\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n (\n {\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 maxLength,\n ...props\n },\n ref,\n ): ReactElement => {\n const inputElement = useRef<HTMLInputElement | null>(null);\n useImperativeHandle(ref, () => inputElement.current!, []);\n\n const { isFocusVisible: inputIsFocusVisible, focusProps: inputFocusProps } = useFocusRing({\n isTextInput: true,\n });\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 [isObfuscated, setIsObfuscated] = useState(\n typeof obfuscated === 'boolean' ? obfuscated : type === TextInputType.Password,\n );\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n if (focusOnMount && inputElement.current) {\n inputElement.current.focus();\n }\n }, 0);\n return () => {\n clearTimeout(timeoutId);\n };\n }, [focusOnMount]);\n\n useEffect(() => {\n if (typeof obfuscated === 'boolean') {\n // eslint-disable-next-line react-hooks/set-state-in-effect\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-base dark:tw-bg-transparent',\n dotted ? 'tw-border-dashed' : 'tw-border-solid',\n disabled || readonly\n ? 'tw-bg-box-disabled dark:tw-bg-box-disabled hover:tw-cursor-not-allowed tw-border-line-weak dark:tw-border-line-weak'\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 ) : null}\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-text-disabled tw-placeholder-text-disabled dark:tw-text-black-30 dark:tw-placeholder-black-40 hover:tw-cursor-not-allowed'\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 maxLength={maxLength}\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\n ? 'tw-cursor-default tw-text-black-40'\n : '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\n ? 'tw-cursor-default tw-text-black-40'\n : '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\n ? 'tw-cursor-default tw-text-black-40'\n : '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 },\n);\nTextInput.displayName = 'FondueTextInput';\n"],"names":["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","maxLength","props","inputElement","useRef","useImperativeHandle","inputIsFocusVisible","inputFocusProps","clearButtonIsFocusVisible","clearButtonFocusProps","passwordButtonIsFocusVisible","passwordButtonFocusProps","copyButtonIsFocusVisible","copyButtonFocusProps","copy","status","useCopy","isObfuscated","setIsObfuscated","useState","useEffect","timeoutId","onKeyDown","event","getInputType","spellcheckProp","jsxs","validationClassMap","useMemoizedId","_a","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 {\n IconCheckMark,\n IconClipboard,\n IconCross,\n IconCrossCircle,\n IconExclamationMarkTriangle,\n IconEye,\n IconEyeOff,\n} from '@frontify/fondue-icons';\nimport { useFocusRing } from '@react-aria/focus';\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n type AriaAttributes,\n type FocusEvent,\n type ForwardRefRenderFunction,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\n\nimport { LoadingCircle, LoadingCircleSize } from '@components/LoadingCircle/LoadingCircle';\nimport { useCopy } from '@hooks/useCopy';\nimport { useMemoizedId } from '@hooks/useMemoizedId';\nimport { FOCUS_STYLE } from '@utilities/focusStyle';\nimport { merge } from '@utilities/merge';\nimport { Validation, validationClassMap } from '@utilities/validation';\n\nimport { LegacyTooltip, type LegacyTooltipProps } from '../LegacyTooltip/LegacyTooltip';\n\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md} the migration guide}.\n */\nexport enum TextInputType {\n Text = 'text',\n Password = 'password',\n Number = 'number',\n Search = 'search',\n}\n\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md} the migration guide}.\n */\nexport type TextInputExtraAction = {\n onClick: () => void;\n icon: ReactElement;\n title: string;\n tooltip?: Omit<LegacyTooltipProps, 'triggerElement'>;\n disabled?: boolean;\n};\n\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md} the migration guide}.\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 maxLength?: number;\n size?: number;\n spellcheck?: boolean;\n /** @deprecated a `ref` can be forwarded to expose the underlying `<input />` DOM node.\n @example\n ```tsx\n import { TextInput } from '@frontify/fondue';\n\n const Component = () => {\n const inputRef = useRef();\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, [)\n return <TextInput ref={inputRef} />\n }\n ```\n */\n focusOnMount?: boolean;\n selectable?: boolean;\n extraActions?: TextInputExtraAction[];\n ariaLabel?: string;\n} & AriaAttributes;\n\ntype TextInputTextProps = TextInputBaseProps & {\n type?: TextInputType.Text;\n obfuscated?: false;\n};\ntype TextInputSearchProps = TextInputBaseProps & {\n type: TextInputType.Search;\n obfuscated?: false;\n};\ntype TextInputNumberProps = TextInputBaseProps & {\n type: TextInputType.Number;\n min?: number;\n max?: number;\n obfuscated?: false;\n};\ntype TextInputPasswordProps = TextInputBaseProps & {\n type: TextInputType.Password;\n obfuscated?: boolean;\n};\n\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md} the migration guide}.\n */\nexport type TextInputProps = TextInputTextProps | TextInputNumberProps | TextInputPasswordProps | TextInputSearchProps;\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\n/**\n * @deprecated Use `TextInput` from `@frontify/fondue/components` instead. Also check {@link https://github.com/Frontify/fondue/blob/main/packages/components/MIGRATING.md#text-input the migration guide}.\n */\nexport const TextInput = forwardRef<HTMLInputElement, TextInputProps>(\n (\n {\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 maxLength,\n ...props\n },\n ref,\n ): ReactElement => {\n const inputElement = useRef<HTMLInputElement | null>(null);\n useImperativeHandle(ref, () => inputElement.current!, []);\n\n const { isFocusVisible: inputIsFocusVisible, focusProps: inputFocusProps } = useFocusRing({\n isTextInput: true,\n });\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 [isObfuscated, setIsObfuscated] = useState(\n typeof obfuscated === 'boolean' ? obfuscated : type === TextInputType.Password,\n );\n\n useEffect(() => {\n const timeoutId = setTimeout(() => {\n if (focusOnMount && inputElement.current) {\n inputElement.current.focus();\n }\n }, 0);\n return () => {\n clearTimeout(timeoutId);\n };\n }, [focusOnMount]);\n\n useEffect(() => {\n if (typeof obfuscated === 'boolean') {\n // eslint-disable-next-line @eslint-react/set-state-in-effect\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-base dark:tw-bg-transparent',\n dotted ? 'tw-border-dashed' : 'tw-border-solid',\n disabled || readonly\n ? 'tw-bg-box-disabled dark:tw-bg-box-disabled hover:tw-cursor-not-allowed tw-border-line-weak dark:tw-border-line-weak'\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 ) : null}\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-text-disabled tw-placeholder-text-disabled dark:tw-text-black-30 dark:tw-placeholder-black-40 hover:tw-cursor-not-allowed'\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 maxLength={maxLength}\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\n ? 'tw-cursor-default tw-text-black-40'\n : '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\n ? 'tw-cursor-default tw-text-black-40'\n : '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\n ? 'tw-cursor-default tw-text-black-40'\n : '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 },\n);\nTextInput.displayName = 'FondueTextInput';\n"],"names":["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","maxLength","props","inputElement","useRef","useImperativeHandle","inputIsFocusVisible","inputFocusProps","clearButtonIsFocusVisible","clearButtonFocusProps","passwordButtonIsFocusVisible","passwordButtonFocusProps","copyButtonIsFocusVisible","copyButtonFocusProps","copy","status","useCopy","isObfuscated","setIsObfuscated","useState","useEffect","timeoutId","onKeyDown","event","getInputType","spellcheckProp","jsxs","validationClassMap","useMemoizedId","_a","e","index","key","LegacyTooltip","_b","IconCross","IconEye","IconEyeOff","LoadingCircle","LoadingCircleSize","IconExclamationMarkTriangle","IconCrossCircle","IconClipboard","IconCheckMark"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tree.es.js","sources":["../../../src/components/Tree/Tree.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {\n DndContext,\n type DragEndEvent,\n type DragMoveEvent,\n DragOverlay,\n KeyboardSensor,\n type MeasuringConfiguration,\n MeasuringStrategy,\n PointerSensor,\n closestCorners,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { enableMapSet, produce } from 'immer';\nimport { isEqual } from 'lodash-es';\nimport {\n type KeyboardEvent,\n cloneElement,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n useTransition,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n type DragHandlerPosition,\n type RegisterNodeChildrenPayload,\n type SensorContext,\n type TreeAnnouncements,\n type TreeDragOverEvent,\n type TreeDragStartEvent,\n type TreeItemProps,\n type TreeItemStyling,\n type TreeProps,\n type TreeState,\n type TreeStateAction,\n} from '@components/Tree/types';\n\nimport { TreeContext, type TreeContextProps } from './TreeContext';\nimport { type InternalTreeItemProps, TreeItemOverlay } from './TreeItem';\nimport { type InternalTreeItemMultiSelectProps } from './TreeItem/TreeItemMultiselect';\nimport { type Overlay } from './TreeItem/TreeItemOverlay';\nimport {\n ROOT_ID,\n currentNodesChanged,\n findIndexById,\n getAnnouncements,\n getCurrentChildrenForNewNodesIfExpanded,\n getNodeChildrenIds,\n getNodesToRender,\n getProjection,\n getReactNodeIdsInFlatArray,\n getTreeNodesWithoutElements,\n handleKeyDownEvent,\n removeReactNodesFromFlatArray,\n sensorsActivationConstraint,\n shouldUpdateTreeState,\n updateNodeWithNewChildren,\n} from './helpers';\nimport {\n recursivelyRemoveFragmentsAndEnrichChildren,\n sortableTreeKeyboardCoordinates,\n useDeepCompareEffect,\n} from './utils';\n\nconst measuring: MeasuringConfiguration = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nenableMapSet();\n\nconst reducer = produce((draft: TreeState, action: TreeStateAction) => {\n switch (action.type) {\n case 'EXPAND_NODE': {\n draft.expandedIds = new Set(draft.expandedIds).add(action.payload);\n return;\n }\n\n case 'SHRINK_NODE': {\n const newExpanded = new Set(draft.expandedIds);\n newExpanded.delete(action.payload);\n\n draft.expandedIds = newExpanded;\n return;\n }\n\n case 'SET_SELECTION_MODE':\n draft.selectionMode = action.payload.selectionMode;\n return;\n\n case 'SET_PROJECTION': {\n if (!isEqual(draft.projection, action.payload)) {\n draft.projection = action.payload;\n }\n return;\n }\n\n case 'REGISTER_OVERLAY_ITEM': {\n draft.overlay = action.payload;\n return;\n }\n\n case 'REGISTER_ROOT_NODES': {\n // reset rootNodes keeping any children when expanded\n draft.rootNodes = getCurrentChildrenForNewNodesIfExpanded(\n draft.rootNodes,\n draft.expandedIds,\n action.payload,\n );\n return;\n }\n\n case 'REGISTER_NODE_CHILDREN': {\n const { id: parentId, children } = action.payload;\n\n if (findIndexById(draft.rootNodes, parentId) === -1) {\n // This can happen when this action is triggered before the rootNodes array is updated\n // It happens if using static data will all nodes and handling expandedIds outside the Tree component\n // Most of the cases, it will register the children properly afterwards\n // See Scrollable Tree With Label story\n console.warn(`Parent element with ID \"${parentId}\" not found when registering children.`);\n return;\n }\n\n const currentChildrenIds = getNodeChildrenIds(draft.rootNodes, parentId);\n const newChildrenIds = children.map((node) => node.props.id);\n\n if (\n !isEqual(currentChildrenIds, newChildrenIds) ||\n currentNodesChanged(currentChildrenIds, draft.rootNodes, children)\n ) {\n // keep any children when parent expanded\n const newChildren = getCurrentChildrenForNewNodesIfExpanded(\n draft.rootNodes,\n draft.expandedIds,\n children,\n );\n draft.rootNodes = updateNodeWithNewChildren(draft.rootNodes, parentId, newChildren);\n }\n\n return;\n }\n\n case 'UNREGISTER_NODE_CHILDREN': {\n const nodeIds = getReactNodeIdsInFlatArray(draft.rootNodes, action.payload);\n if (nodeIds.length > 0) {\n draft.rootNodes = removeReactNodesFromFlatArray(draft.rootNodes, nodeIds);\n }\n return;\n }\n\n case 'REGISTER_NODES': {\n draft.nodes = action.payload;\n return;\n }\n\n case 'REPLACE_EXPANDED': {\n draft.expandedIds = new Set(action.payload);\n return;\n }\n\n case 'REPLACE_SELECTED': {\n draft.selectedIds = new Set(action.payload);\n return;\n }\n\n case 'REPLACE_STATE': {\n draft.rootNodes = action.payload.rootNodes;\n draft.overlay = action.payload.overlay;\n draft.projection = action.payload.projection;\n draft.selectedIds = action.payload.selectedIds;\n draft.expandedIds = action.payload.expandedIds;\n draft.selectionMode = action.payload.selectionMode;\n return;\n }\n\n default: {\n console.warn(`Updated tree with action \"${action.type}\" but it has not effect.`);\n return;\n }\n }\n});\n\nexport const Tree = memo(\n ({\n id,\n onDrop,\n onSelect = () => {},\n onExpand,\n onShrink,\n children,\n selectedIds,\n expandedIds,\n draggable = false,\n multiselect = false,\n dragHandlerPosition = 'left',\n enableDragDelay = true,\n showDragHandlerOnHoverOnly = true,\n showContentWhileDragging = false,\n itemStyle,\n 'data-test-id': dataTestId = 'fondue-tree',\n }: TreeProps) => {\n const initialState: TreeState = useMemo(\n () => ({\n selectionMode: multiselect ? 'multiselect' : 'single',\n selectedIds: new Set(selectedIds ?? []),\n expandedIds: new Set(expandedIds ?? []),\n rootNodes: [],\n expandedNodes: [],\n nodes: [],\n nodesReady: false,\n projection: null,\n }),\n [expandedIds, multiselect, selectedIds],\n );\n\n const [treeState, updateTreeState] = useReducer(reducer, initialState);\n const [, startTransition] = useTransition();\n\n const [offset, setOffset] = useState<Nullable<number>>(null);\n const [overId, setOverId] = useState<Nullable<string>>(null);\n const [activeId, setActiveId] = useState<Nullable<string>>(null);\n const [currentPosition, setCurrentPosition] =\n useState<Nullable<{ overId: string; parentId: Nullable<string> }>>(null);\n\n useEffect(() => {\n const keyDownHandler = (event: globalThis.KeyboardEvent) => {\n if (shouldUpdateTreeState(event, multiselect)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'multiselect' },\n });\n }\n };\n\n const keyUpHandler = (event: globalThis.KeyboardEvent) => {\n if (shouldUpdateTreeState(event, multiselect)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'single' },\n });\n }\n };\n\n if (multiselect) {\n window.addEventListener('keydown', keyDownHandler);\n window.addEventListener('keyup', keyUpHandler);\n }\n\n return () => {\n window.removeEventListener('keydown', keyDownHandler);\n window.removeEventListener('keyup', keyUpHandler);\n };\n }, [multiselect]);\n\n const registerOverlay = useCallback((overlay: Overlay) => {\n updateTreeState({ type: 'REGISTER_OVERLAY_ITEM', payload: overlay });\n }, []);\n\n const registerNodeChildren = useCallback((payload: RegisterNodeChildrenPayload) => {\n updateTreeState({ type: 'REGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const unregisterNodeChildren = useCallback((payload: string) => {\n updateTreeState({ type: 'UNREGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const handleSelect = useCallback(\n (id: string, ignoreRemoveSelected = false) => {\n onSelect(id, ignoreRemoveSelected, getTreeNodesWithoutElements(treeState.nodes));\n },\n [onSelect, treeState.nodes],\n );\n\n const handleExpand = useCallback(\n (id: string) => {\n if (onExpand) {\n return onExpand(id);\n }\n\n updateTreeState({\n type: 'EXPAND_NODE',\n payload: id,\n });\n },\n [onExpand],\n );\n\n const handleShrink = useCallback(\n (id: string) => {\n if (onShrink) {\n return onShrink(id);\n }\n\n updateTreeState({\n type: 'SHRINK_NODE',\n payload: id,\n });\n },\n [onShrink],\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n resetState();\n\n const { over, active } = event;\n\n if (!over?.id || !active?.id || !treeState.projection?.parentId) {\n return;\n }\n\n const activeNode = treeState.nodes.find((node) => node.props.id === active.id);\n const contentComponent = activeNode?.props?.contentComponent;\n\n onDrop?.({\n id: active.id.toString(),\n parentId: treeState.projection.parentId,\n sort: treeState.projection.position,\n contentComponent,\n });\n };\n\n const handleDragStart = ({ active: { id: activeId, data } }: TreeDragStartEvent) => {\n setActiveId(activeId);\n setOverId(activeId);\n\n if (activeId && data.current) {\n setCurrentPosition({\n parentId: data.current.parentId,\n overId: activeId,\n });\n }\n\n document.body.style.setProperty('cursor', 'grabbing');\n };\n\n const handleDragOver = ({ over }: TreeDragOverEvent) => {\n setOverId(over?.id ?? null);\n };\n\n const handleDragMove = ({ delta }: DragMoveEvent) => {\n setOffset(delta.x);\n };\n\n const handleDragCancel = () => {\n resetState();\n };\n\n const resetState = () => {\n setOverId(null);\n setActiveId(null);\n setOffset(0);\n setCurrentPosition(null);\n\n document.body.style.setProperty('cursor', 'default');\n };\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLUListElement>) => {\n return handleKeyDownEvent(\n event,\n treeState.expandedIds,\n treeState.nodes,\n handleSelect,\n handleShrink,\n handleExpand,\n );\n },\n [handleExpand, handleShrink, handleSelect, treeState.expandedIds, treeState.nodes],\n );\n\n const sensorContext: SensorContext = useRef({\n nodes: treeState.nodes,\n offset: offset ?? 0,\n });\n\n // eslint-disable-next-line react-hooks/refs\n const coordinateGetter = useMemo(() => sortableTreeKeyboardCoordinates(sensorContext), [sensorContext]);\n const activationConstraint = sensorsActivationConstraint({ dragHandlerPosition, enableDragDelay });\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint }),\n useSensor(KeyboardSensor, { coordinateGetter }),\n );\n\n const announcements: TreeAnnouncements = useMemo(() => {\n return getAnnouncements(treeState, currentPosition, setCurrentPosition);\n }, [currentPosition, treeState]);\n\n useDeepCompareEffect(() => {\n if (!children) {\n return;\n }\n\n updateTreeState({\n type: 'REGISTER_ROOT_NODES',\n payload: recursivelyRemoveFragmentsAndEnrichChildren(children, { parentId: ROOT_ID, level: 0 }),\n });\n }, [children]);\n\n useDeepCompareEffect(() => {\n if (treeState.rootNodes.length === 0) {\n return;\n }\n\n startTransition(() => {\n const nodesToRender = getNodesToRender(treeState.rootNodes, treeState.expandedIds);\n\n updateTreeState({\n type: 'REGISTER_NODES',\n payload: nodesToRender,\n });\n });\n }, [treeState.rootNodes, treeState.expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_EXPANDED',\n payload: expandedIds ?? [],\n });\n }, [expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_SELECTED',\n payload: selectedIds ?? [],\n });\n }, [selectedIds]);\n\n useDeepCompareEffect(() => {\n sensorContext.current = {\n nodes: treeState.nodes,\n offset: offset ?? 0,\n };\n }, [offset, treeState.nodes]);\n\n useEffect(() => {\n const projection =\n activeId && overId\n ? getProjection({\n nodes: treeState.nodes,\n activeId,\n overId,\n dragOffset: offset ?? 0,\n })\n : null;\n\n updateTreeState({\n type: 'SET_PROJECTION',\n payload: projection,\n });\n }, [activeId, offset, overId, treeState.nodes]);\n\n const getPropToUse = (\n nodeProp: TreeItemProps['dragHandlerPosition' | 'showContentWhileDragging' | 'showDragHandlerOnHoverOnly'],\n treeProp: TreeProps['dragHandlerPosition' | 'showContentWhileDragging' | 'showDragHandlerOnHoverOnly'],\n ) => nodeProp || treeProp;\n\n const { nodes, items } = useMemo(() => {\n const treeItemStyle = {\n spacingY: 'none',\n contentHight: 'single-line',\n shadow: 'none',\n borderRadius: 'small',\n borderWidth: 'none',\n borderStyle: 'none',\n activeColorStyle: 'neutral',\n ...itemStyle,\n } as TreeItemStyling;\n\n const getTreeItemProps = (nodeProps: InternalTreeItemProps | InternalTreeItemMultiSelectProps) => {\n return multiselect\n ? {\n checkBoxPosition: getPropToUse(\n (nodeProps as InternalTreeItemMultiSelectProps).checkBoxPosition,\n dragHandlerPosition,\n ) as DragHandlerPosition,\n }\n : {\n draggable: (nodeProps as InternalTreeItemProps).draggable ? true : draggable,\n dragHandlerPosition: getPropToUse(\n (nodeProps as InternalTreeItemProps).dragHandlerPosition,\n dragHandlerPosition,\n ) as TreeProps['dragHandlerPosition'],\n showDragHandlerOnHoverOnly: getPropToUse(\n (nodeProps as InternalTreeItemProps).showDragHandlerOnHoverOnly,\n showDragHandlerOnHoverOnly,\n ) as TreeProps['showDragHandlerOnHoverOnly'],\n showContentWhileDragging: getPropToUse(\n (nodeProps as InternalTreeItemProps).showContentWhileDragging,\n showContentWhileDragging,\n ) as TreeProps['showContentWhileDragging'],\n };\n };\n\n return {\n items: treeState.nodes.map((node) => node.props.id),\n nodes: treeState.nodes.map((node) =>\n cloneElement(node, {\n ...getTreeItemProps(node.props),\n itemStyle: { ...treeItemStyle, ...node.props.itemStyle },\n registerOverlay,\n onExpand: handleExpand,\n onShrink: handleShrink,\n onSelect: handleSelect,\n registerNodeChildren,\n unregisterNodeChildren,\n }),\n ),\n };\n }, [\n itemStyle,\n treeState.nodes,\n draggable,\n multiselect,\n dragHandlerPosition,\n showDragHandlerOnHoverOnly,\n showContentWhileDragging,\n registerOverlay,\n handleExpand,\n handleShrink,\n handleSelect,\n registerNodeChildren,\n unregisterNodeChildren,\n ]);\n\n const contextValue: TreeContextProps = useMemo(\n () => ({\n treeState,\n onSelect: handleSelect,\n onExpand: handleExpand,\n onShrink: handleShrink,\n }),\n [treeState, handleSelect, handleExpand, handleShrink],\n );\n\n return (\n <TreeContext.Provider value={contextValue}>\n <ul\n id={id}\n role=\"tree\"\n data-test-id={dataTestId}\n onKeyDown={handleKeyDown}\n aria-multiselectable={treeState.selectionMode === 'multiselect'}\n className=\"tw-p-0 tw-m-0 tw-font-sans tw-font-normal tw-list-none tw-text-left tw-text-sm tw-select-none\"\n >\n <DndContext\n sensors={sensors}\n measuring={measuring}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragMove={handleDragMove}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n accessibility={{\n announcements,\n container: document.getElementById(id)?.parentElement ?? document.body,\n }}\n collisionDetection={closestCorners}\n >\n <SortableContext items={items} strategy={verticalListSortingStrategy}>\n {nodes}\n </SortableContext>\n\n {createPortal(\n <DragOverlay\n zIndex={1500}\n wrapperElement=\"ul\"\n dropAnimation={null}\n modifiers={[restrictToWindowEdges]}\n >\n {treeState.overlay && (\n <TreeItemOverlay\n {...treeState.overlay}\n isSelected={treeState.selectedIds.has(treeState.overlay.id)}\n />\n )}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n </ul>\n </TreeContext.Provider>\n );\n },\n);\n\nTree.displayName = 'FondueTree';\n"],"names":["measuring","MeasuringStrategy","enableMapSet","reducer","produce","draft","action","newExpanded","isEqual","getCurrentChildrenForNewNodesIfExpanded","parentId","children","findIndexById","currentChildrenIds","getNodeChildrenIds","newChildrenIds","node","currentNodesChanged","newChildren","updateNodeWithNewChildren","nodeIds","getReactNodeIdsInFlatArray","removeReactNodesFromFlatArray","Tree","memo","id","onDrop","onSelect","onExpand","onShrink","selectedIds","expandedIds","draggable","multiselect","dragHandlerPosition","enableDragDelay","showDragHandlerOnHoverOnly","showContentWhileDragging","itemStyle","dataTestId","initialState","useMemo","treeState","updateTreeState","useReducer","startTransition","useTransition","offset","setOffset","useState","overId","setOverId","activeId","setActiveId","currentPosition","setCurrentPosition","useEffect","keyDownHandler","event","shouldUpdateTreeState","keyUpHandler","registerOverlay","useCallback","overlay","registerNodeChildren","payload","unregisterNodeChildren","handleSelect","ignoreRemoveSelected","getTreeNodesWithoutElements","handleExpand","handleShrink","handleDragEnd","resetState","over","active","_a","activeNode","contentComponent","_b","handleDragStart","data","handleDragOver","handleDragMove","delta","handleDragCancel","handleKeyDown","handleKeyDownEvent","sensorContext","useRef","coordinateGetter","sortableTreeKeyboardCoordinates","activationConstraint","sensorsActivationConstraint","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","announcements","getAnnouncements","useDeepCompareEffect","recursivelyRemoveFragmentsAndEnrichChildren","ROOT_ID","nodesToRender","getNodesToRender","projection","getProjection","getPropToUse","nodeProp","treeProp","nodes","items","treeItemStyle","getTreeItemProps","nodeProps","cloneElement","contextValue","jsx","TreeContext","jsxs","DndContext","closestCorners","SortableContext","verticalListSortingStrategy","createPortal","DragOverlay","restrictToWindowEdges","TreeItemOverlay"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Tree.es.js","sources":["../../../src/components/Tree/Tree.tsx"],"sourcesContent":["/* (c) Copyright Frontify Ltd., all rights reserved. */\n\nimport {\n DndContext,\n type DragEndEvent,\n type DragMoveEvent,\n DragOverlay,\n KeyboardSensor,\n type MeasuringConfiguration,\n MeasuringStrategy,\n PointerSensor,\n closestCorners,\n useSensor,\n useSensors,\n} from '@dnd-kit/core';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { SortableContext, verticalListSortingStrategy } from '@dnd-kit/sortable';\nimport { enableMapSet, produce } from 'immer';\nimport { isEqual } from 'lodash-es';\nimport {\n type KeyboardEvent,\n cloneElement,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n useState,\n useTransition,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport {\n type DragHandlerPosition,\n type RegisterNodeChildrenPayload,\n type SensorContext,\n type TreeAnnouncements,\n type TreeDragOverEvent,\n type TreeDragStartEvent,\n type TreeItemProps,\n type TreeItemStyling,\n type TreeProps,\n type TreeState,\n type TreeStateAction,\n} from '@components/Tree/types';\n\nimport { TreeContext, type TreeContextProps } from './TreeContext';\nimport { type InternalTreeItemProps, TreeItemOverlay } from './TreeItem';\nimport { type InternalTreeItemMultiSelectProps } from './TreeItem/TreeItemMultiselect';\nimport { type Overlay } from './TreeItem/TreeItemOverlay';\nimport {\n ROOT_ID,\n currentNodesChanged,\n findIndexById,\n getAnnouncements,\n getCurrentChildrenForNewNodesIfExpanded,\n getNodeChildrenIds,\n getNodesToRender,\n getProjection,\n getReactNodeIdsInFlatArray,\n getTreeNodesWithoutElements,\n handleKeyDownEvent,\n removeReactNodesFromFlatArray,\n sensorsActivationConstraint,\n shouldUpdateTreeState,\n updateNodeWithNewChildren,\n} from './helpers';\nimport {\n recursivelyRemoveFragmentsAndEnrichChildren,\n sortableTreeKeyboardCoordinates,\n useDeepCompareEffect,\n} from './utils';\n\nconst measuring: MeasuringConfiguration = {\n droppable: {\n strategy: MeasuringStrategy.Always,\n },\n};\n\nenableMapSet();\n\nconst reducer = produce((draft: TreeState, action: TreeStateAction) => {\n switch (action.type) {\n case 'EXPAND_NODE': {\n draft.expandedIds = new Set(draft.expandedIds).add(action.payload);\n return;\n }\n\n case 'SHRINK_NODE': {\n const newExpanded = new Set(draft.expandedIds);\n newExpanded.delete(action.payload);\n\n draft.expandedIds = newExpanded;\n return;\n }\n\n case 'SET_SELECTION_MODE':\n draft.selectionMode = action.payload.selectionMode;\n return;\n\n case 'SET_PROJECTION': {\n if (!isEqual(draft.projection, action.payload)) {\n draft.projection = action.payload;\n }\n return;\n }\n\n case 'REGISTER_OVERLAY_ITEM': {\n draft.overlay = action.payload;\n return;\n }\n\n case 'REGISTER_ROOT_NODES': {\n // reset rootNodes keeping any children when expanded\n draft.rootNodes = getCurrentChildrenForNewNodesIfExpanded(\n draft.rootNodes,\n draft.expandedIds,\n action.payload,\n );\n return;\n }\n\n case 'REGISTER_NODE_CHILDREN': {\n const { id: parentId, children } = action.payload;\n\n if (findIndexById(draft.rootNodes, parentId) === -1) {\n // This can happen when this action is triggered before the rootNodes array is updated\n // It happens if using static data will all nodes and handling expandedIds outside the Tree component\n // Most of the cases, it will register the children properly afterwards\n // See Scrollable Tree With Label story\n console.warn(`Parent element with ID \"${parentId}\" not found when registering children.`);\n return;\n }\n\n const currentChildrenIds = getNodeChildrenIds(draft.rootNodes, parentId);\n const newChildrenIds = children.map((node) => node.props.id);\n\n if (\n !isEqual(currentChildrenIds, newChildrenIds) ||\n currentNodesChanged(currentChildrenIds, draft.rootNodes, children)\n ) {\n // keep any children when parent expanded\n const newChildren = getCurrentChildrenForNewNodesIfExpanded(\n draft.rootNodes,\n draft.expandedIds,\n children,\n );\n draft.rootNodes = updateNodeWithNewChildren(draft.rootNodes, parentId, newChildren);\n }\n\n return;\n }\n\n case 'UNREGISTER_NODE_CHILDREN': {\n const nodeIds = getReactNodeIdsInFlatArray(draft.rootNodes, action.payload);\n if (nodeIds.length > 0) {\n draft.rootNodes = removeReactNodesFromFlatArray(draft.rootNodes, nodeIds);\n }\n return;\n }\n\n case 'REGISTER_NODES': {\n draft.nodes = action.payload;\n return;\n }\n\n case 'REPLACE_EXPANDED': {\n draft.expandedIds = new Set(action.payload);\n return;\n }\n\n case 'REPLACE_SELECTED': {\n draft.selectedIds = new Set(action.payload);\n return;\n }\n\n case 'REPLACE_STATE': {\n draft.rootNodes = action.payload.rootNodes;\n draft.overlay = action.payload.overlay;\n draft.projection = action.payload.projection;\n draft.selectedIds = action.payload.selectedIds;\n draft.expandedIds = action.payload.expandedIds;\n draft.selectionMode = action.payload.selectionMode;\n return;\n }\n\n default: {\n console.warn(`Updated tree with action \"${action.type}\" but it has not effect.`);\n return;\n }\n }\n});\n\nexport const Tree = memo(\n ({\n id,\n onDrop,\n onSelect = () => {},\n onExpand,\n onShrink,\n children,\n selectedIds,\n expandedIds,\n draggable = false,\n multiselect = false,\n dragHandlerPosition = 'left',\n enableDragDelay = true,\n showDragHandlerOnHoverOnly = true,\n showContentWhileDragging = false,\n itemStyle,\n 'data-test-id': dataTestId = 'fondue-tree',\n }: TreeProps) => {\n const initialState: TreeState = useMemo(\n () => ({\n selectionMode: multiselect ? 'multiselect' : 'single',\n selectedIds: new Set(selectedIds ?? []),\n expandedIds: new Set(expandedIds ?? []),\n rootNodes: [],\n expandedNodes: [],\n nodes: [],\n nodesReady: false,\n projection: null,\n }),\n [expandedIds, multiselect, selectedIds],\n );\n\n const [treeState, updateTreeState] = useReducer(reducer, initialState);\n const [, startTransition] = useTransition();\n\n const [offset, setOffset] = useState<Nullable<number>>(null);\n const [overId, setOverId] = useState<Nullable<string>>(null);\n const [activeId, setActiveId] = useState<Nullable<string>>(null);\n const [currentPosition, setCurrentPosition] =\n useState<Nullable<{ overId: string; parentId: Nullable<string> }>>(null);\n\n useEffect(() => {\n const keyDownHandler = (event: globalThis.KeyboardEvent) => {\n if (shouldUpdateTreeState(event, multiselect)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'multiselect' },\n });\n }\n };\n\n const keyUpHandler = (event: globalThis.KeyboardEvent) => {\n if (shouldUpdateTreeState(event, multiselect)) {\n updateTreeState({\n type: 'SET_SELECTION_MODE',\n payload: { selectionMode: 'single' },\n });\n }\n };\n\n if (multiselect) {\n window.addEventListener('keydown', keyDownHandler);\n window.addEventListener('keyup', keyUpHandler);\n }\n\n return () => {\n window.removeEventListener('keydown', keyDownHandler);\n window.removeEventListener('keyup', keyUpHandler);\n };\n }, [multiselect]);\n\n const registerOverlay = useCallback((overlay: Overlay) => {\n updateTreeState({ type: 'REGISTER_OVERLAY_ITEM', payload: overlay });\n }, []);\n\n const registerNodeChildren = useCallback((payload: RegisterNodeChildrenPayload) => {\n updateTreeState({ type: 'REGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const unregisterNodeChildren = useCallback((payload: string) => {\n updateTreeState({ type: 'UNREGISTER_NODE_CHILDREN', payload });\n }, []);\n\n const handleSelect = useCallback(\n (id: string, ignoreRemoveSelected = false) => {\n onSelect(id, ignoreRemoveSelected, getTreeNodesWithoutElements(treeState.nodes));\n },\n [onSelect, treeState.nodes],\n );\n\n const handleExpand = useCallback(\n (id: string) => {\n if (onExpand) {\n return onExpand(id);\n }\n\n updateTreeState({\n type: 'EXPAND_NODE',\n payload: id,\n });\n },\n [onExpand],\n );\n\n const handleShrink = useCallback(\n (id: string) => {\n if (onShrink) {\n return onShrink(id);\n }\n\n updateTreeState({\n type: 'SHRINK_NODE',\n payload: id,\n });\n },\n [onShrink],\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n resetState();\n\n const { over, active } = event;\n\n if (!over?.id || !active?.id || !treeState.projection?.parentId) {\n return;\n }\n\n const activeNode = treeState.nodes.find((node) => node.props.id === active.id);\n const contentComponent = activeNode?.props?.contentComponent;\n\n onDrop?.({\n id: active.id.toString(),\n parentId: treeState.projection.parentId,\n sort: treeState.projection.position,\n contentComponent,\n });\n };\n\n const handleDragStart = ({ active: { id: activeId, data } }: TreeDragStartEvent) => {\n setActiveId(activeId);\n setOverId(activeId);\n\n if (activeId && data.current) {\n setCurrentPosition({\n parentId: data.current.parentId,\n overId: activeId,\n });\n }\n\n document.body.style.setProperty('cursor', 'grabbing');\n };\n\n const handleDragOver = ({ over }: TreeDragOverEvent) => {\n setOverId(over?.id ?? null);\n };\n\n const handleDragMove = ({ delta }: DragMoveEvent) => {\n setOffset(delta.x);\n };\n\n const handleDragCancel = () => {\n resetState();\n };\n\n const resetState = () => {\n setOverId(null);\n setActiveId(null);\n setOffset(0);\n setCurrentPosition(null);\n\n document.body.style.setProperty('cursor', 'default');\n };\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLUListElement>) => {\n return handleKeyDownEvent(\n event,\n treeState.expandedIds,\n treeState.nodes,\n handleSelect,\n handleShrink,\n handleExpand,\n );\n },\n [handleExpand, handleShrink, handleSelect, treeState.expandedIds, treeState.nodes],\n );\n\n const sensorContext: SensorContext = useRef({\n nodes: treeState.nodes,\n offset: offset ?? 0,\n });\n\n // eslint-disable-next-line @eslint-react/refs\n const coordinateGetter = useMemo(() => sortableTreeKeyboardCoordinates(sensorContext), [sensorContext]);\n const activationConstraint = sensorsActivationConstraint({ dragHandlerPosition, enableDragDelay });\n\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint }),\n useSensor(KeyboardSensor, { coordinateGetter }),\n );\n\n const announcements: TreeAnnouncements = useMemo(() => {\n return getAnnouncements(treeState, currentPosition, setCurrentPosition);\n }, [currentPosition, treeState]);\n\n useDeepCompareEffect(() => {\n if (!children) {\n return;\n }\n\n updateTreeState({\n type: 'REGISTER_ROOT_NODES',\n payload: recursivelyRemoveFragmentsAndEnrichChildren(children, { parentId: ROOT_ID, level: 0 }),\n });\n }, [children]);\n\n useDeepCompareEffect(() => {\n if (treeState.rootNodes.length === 0) {\n return;\n }\n\n startTransition(() => {\n const nodesToRender = getNodesToRender(treeState.rootNodes, treeState.expandedIds);\n\n updateTreeState({\n type: 'REGISTER_NODES',\n payload: nodesToRender,\n });\n });\n }, [treeState.rootNodes, treeState.expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_EXPANDED',\n payload: expandedIds ?? [],\n });\n }, [expandedIds]);\n\n useEffect(() => {\n updateTreeState({\n type: 'REPLACE_SELECTED',\n payload: selectedIds ?? [],\n });\n }, [selectedIds]);\n\n useDeepCompareEffect(() => {\n sensorContext.current = {\n nodes: treeState.nodes,\n offset: offset ?? 0,\n };\n }, [offset, treeState.nodes]);\n\n useEffect(() => {\n const projection =\n activeId && overId\n ? getProjection({\n nodes: treeState.nodes,\n activeId,\n overId,\n dragOffset: offset ?? 0,\n })\n : null;\n\n updateTreeState({\n type: 'SET_PROJECTION',\n payload: projection,\n });\n }, [activeId, offset, overId, treeState.nodes]);\n\n const getPropToUse = (\n nodeProp: TreeItemProps['dragHandlerPosition' | 'showContentWhileDragging' | 'showDragHandlerOnHoverOnly'],\n treeProp: TreeProps['dragHandlerPosition' | 'showContentWhileDragging' | 'showDragHandlerOnHoverOnly'],\n ) => nodeProp || treeProp;\n\n const { nodes, items } = useMemo(() => {\n const treeItemStyle = {\n spacingY: 'none',\n contentHight: 'single-line',\n shadow: 'none',\n borderRadius: 'small',\n borderWidth: 'none',\n borderStyle: 'none',\n activeColorStyle: 'neutral',\n ...itemStyle,\n } as TreeItemStyling;\n\n const getTreeItemProps = (nodeProps: InternalTreeItemProps | InternalTreeItemMultiSelectProps) => {\n return multiselect\n ? {\n checkBoxPosition: getPropToUse(\n (nodeProps as InternalTreeItemMultiSelectProps).checkBoxPosition,\n dragHandlerPosition,\n ) as DragHandlerPosition,\n }\n : {\n draggable: (nodeProps as InternalTreeItemProps).draggable ? true : draggable,\n dragHandlerPosition: getPropToUse(\n (nodeProps as InternalTreeItemProps).dragHandlerPosition,\n dragHandlerPosition,\n ) as TreeProps['dragHandlerPosition'],\n showDragHandlerOnHoverOnly: getPropToUse(\n (nodeProps as InternalTreeItemProps).showDragHandlerOnHoverOnly,\n showDragHandlerOnHoverOnly,\n ) as TreeProps['showDragHandlerOnHoverOnly'],\n showContentWhileDragging: getPropToUse(\n (nodeProps as InternalTreeItemProps).showContentWhileDragging,\n showContentWhileDragging,\n ) as TreeProps['showContentWhileDragging'],\n };\n };\n\n return {\n items: treeState.nodes.map((node) => node.props.id),\n nodes: treeState.nodes.map((node) =>\n cloneElement(node, {\n ...getTreeItemProps(node.props),\n itemStyle: { ...treeItemStyle, ...node.props.itemStyle },\n registerOverlay,\n onExpand: handleExpand,\n onShrink: handleShrink,\n onSelect: handleSelect,\n registerNodeChildren,\n unregisterNodeChildren,\n }),\n ),\n };\n }, [\n itemStyle,\n treeState.nodes,\n draggable,\n multiselect,\n dragHandlerPosition,\n showDragHandlerOnHoverOnly,\n showContentWhileDragging,\n registerOverlay,\n handleExpand,\n handleShrink,\n handleSelect,\n registerNodeChildren,\n unregisterNodeChildren,\n ]);\n\n const contextValue: TreeContextProps = useMemo(\n () => ({\n treeState,\n onSelect: handleSelect,\n onExpand: handleExpand,\n onShrink: handleShrink,\n }),\n [treeState, handleSelect, handleExpand, handleShrink],\n );\n\n return (\n <TreeContext.Provider value={contextValue}>\n <ul\n id={id}\n role=\"tree\"\n data-test-id={dataTestId}\n onKeyDown={handleKeyDown}\n aria-multiselectable={treeState.selectionMode === 'multiselect'}\n className=\"tw-p-0 tw-m-0 tw-font-sans tw-font-normal tw-list-none tw-text-left tw-text-sm tw-select-none\"\n >\n <DndContext\n sensors={sensors}\n measuring={measuring}\n onDragEnd={handleDragEnd}\n onDragOver={handleDragOver}\n onDragMove={handleDragMove}\n onDragStart={handleDragStart}\n onDragCancel={handleDragCancel}\n accessibility={{\n announcements,\n container: document.getElementById(id)?.parentElement ?? document.body,\n }}\n collisionDetection={closestCorners}\n >\n <SortableContext items={items} strategy={verticalListSortingStrategy}>\n {nodes}\n </SortableContext>\n\n {createPortal(\n <DragOverlay\n zIndex={1500}\n wrapperElement=\"ul\"\n dropAnimation={null}\n modifiers={[restrictToWindowEdges]}\n >\n {treeState.overlay && (\n <TreeItemOverlay\n {...treeState.overlay}\n isSelected={treeState.selectedIds.has(treeState.overlay.id)}\n />\n )}\n </DragOverlay>,\n document.body,\n )}\n </DndContext>\n </ul>\n </TreeContext.Provider>\n );\n },\n);\n\nTree.displayName = 'FondueTree';\n"],"names":["measuring","MeasuringStrategy","enableMapSet","reducer","produce","draft","action","newExpanded","isEqual","getCurrentChildrenForNewNodesIfExpanded","parentId","children","findIndexById","currentChildrenIds","getNodeChildrenIds","newChildrenIds","node","currentNodesChanged","newChildren","updateNodeWithNewChildren","nodeIds","getReactNodeIdsInFlatArray","removeReactNodesFromFlatArray","Tree","memo","id","onDrop","onSelect","onExpand","onShrink","selectedIds","expandedIds","draggable","multiselect","dragHandlerPosition","enableDragDelay","showDragHandlerOnHoverOnly","showContentWhileDragging","itemStyle","dataTestId","initialState","useMemo","treeState","updateTreeState","useReducer","startTransition","useTransition","offset","setOffset","useState","overId","setOverId","activeId","setActiveId","currentPosition","setCurrentPosition","useEffect","keyDownHandler","event","shouldUpdateTreeState","keyUpHandler","registerOverlay","useCallback","overlay","registerNodeChildren","payload","unregisterNodeChildren","handleSelect","ignoreRemoveSelected","getTreeNodesWithoutElements","handleExpand","handleShrink","handleDragEnd","resetState","over","active","_a","activeNode","contentComponent","_b","handleDragStart","data","handleDragOver","handleDragMove","delta","handleDragCancel","handleKeyDown","handleKeyDownEvent","sensorContext","useRef","coordinateGetter","sortableTreeKeyboardCoordinates","activationConstraint","sensorsActivationConstraint","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","announcements","getAnnouncements","useDeepCompareEffect","recursivelyRemoveFragmentsAndEnrichChildren","ROOT_ID","nodesToRender","getNodesToRender","projection","getProjection","getPropToUse","nodeProp","treeProp","nodes","items","treeItemStyle","getTreeItemProps","nodeProps","cloneElement","contextValue","jsx","TreeContext","jsxs","DndContext","closestCorners","SortableContext","verticalListSortingStrategy","createPortal","DragOverlay","restrictToWindowEdges","TreeItemOverlay"],"mappings":"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"}
|