@hh.ru/magritte-ui-textarea 3.3.61 → 3.3.62
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/TextArea.js +3 -2
- package/TextArea.js.map +1 -1
- package/TextAreaGrowLimiter.d.ts +1 -0
- package/TextAreaGrowLimiter.js +15 -11
- package/TextAreaGrowLimiter.js.map +1 -1
- package/index.css +110 -110
- package/package.json +2 -2
- package/types.d.ts +6 -0
- package/types.js.map +1 -1
- package/useLimitGrow.d.ts +2 -1
- package/useLimitGrow.js +19 -2
- package/useLimitGrow.js.map +1 -1
package/TextArea.js
CHANGED
|
@@ -19,7 +19,7 @@ import './types.js';
|
|
|
19
19
|
import './TextAreaGrowLimiter.js';
|
|
20
20
|
import '@hh.ru/magritte-common-func-utils';
|
|
21
21
|
|
|
22
|
-
var styles = {"textarea":"magritte-textarea___ugvor_3-3-
|
|
22
|
+
var styles = {"textarea":"magritte-textarea___ugvor_3-3-62","textarea-elevated":"magritte-textarea-elevated___S0jk-_3-3-62","textareaElevated":"magritte-textarea-elevated___S0jk-_3-3-62","textarea-small":"magritte-textarea-small___Q-tsg_3-3-62","textareaSmall":"magritte-textarea-small___Q-tsg_3-3-62","textarea-medium":"magritte-textarea-medium___GNzAm_3-3-62","textareaMedium":"magritte-textarea-medium___GNzAm_3-3-62","textarea-large":"magritte-textarea-large___ugT-5_3-3-62","textareaLarge":"magritte-textarea-large___ugT-5_3-3-62","has-grip":"magritte-has-grip___ATMYQ_3-3-62","hasGrip":"magritte-has-grip___ATMYQ_3-3-62","textarea-limited":"magritte-textarea-limited___cU1Rg_3-3-62","textareaLimited":"magritte-textarea-limited___cU1Rg_3-3-62","maxed-height":"magritte-maxed-height___v1wYG_3-3-62","maxedHeight":"magritte-maxed-height___v1wYG_3-3-62","textarea-focused":"magritte-textarea-focused___eiGyC_3-3-62","textareaFocused":"magritte-textarea-focused___eiGyC_3-3-62","textarea-invalid":"magritte-textarea-invalid___iKOPh_3-3-62","textareaInvalid":"magritte-textarea-invalid___iKOPh_3-3-62","textarea-disabled":"magritte-textarea-disabled___XN0cg_3-3-62","textareaDisabled":"magritte-textarea-disabled___XN0cg_3-3-62","textarea-position-container-wrapper":"magritte-textarea-position-container-wrapper___4Dsui_3-3-62","textareaPositionContainerWrapper":"magritte-textarea-position-container-wrapper___4Dsui_3-3-62","textarea-position-container":"magritte-textarea-position-container___cEpbv_3-3-62","textareaPositionContainer":"magritte-textarea-position-container___cEpbv_3-3-62","native-element":"magritte-native-element___a0RAE_3-3-62","nativeElement":"magritte-native-element___a0RAE_3-3-62","textarea-label":"magritte-textarea-label___sgTIH_3-3-62","textareaLabel":"magritte-textarea-label___sgTIH_3-3-62","textarea-label-elevated":"magritte-textarea-label-elevated___0lxOI_3-3-62","textareaLabelElevated":"magritte-textarea-label-elevated___0lxOI_3-3-62","textarea-limit":"magritte-textarea-limit___IjPJy_3-3-62","textareaLimit":"magritte-textarea-limit___IjPJy_3-3-62","textarea-limit-error":"magritte-textarea-limit-error___vLvZU_3-3-62","textareaLimitError":"magritte-textarea-limit-error___vLvZU_3-3-62","textarea-layout-fill-both":"magritte-textarea-layout-fill-both___ERS-q_3-3-62","textareaLayoutFillBoth":"magritte-textarea-layout-fill-both___ERS-q_3-3-62","textarea-layout-fill-vertical":"magritte-textarea-layout-fill-vertical___HmNtp_3-3-62","textareaLayoutFillVertical":"magritte-textarea-layout-fill-vertical___HmNtp_3-3-62","textarea-layout-fill-horizontal":"magritte-textarea-layout-fill-horizontal___imBH2_3-3-62","textareaLayoutFillHorizontal":"magritte-textarea-layout-fill-horizontal___imBH2_3-3-62","textarea-layout-hug":"magritte-textarea-layout-hug___tdCMY_3-3-62","textareaLayoutHug":"magritte-textarea-layout-hug___tdCMY_3-3-62","textarea-wrapper":"magritte-textarea-wrapper___yD7G6_3-3-62","textareaWrapper":"magritte-textarea-wrapper___yD7G6_3-3-62","value-clone-wrapper":"magritte-value-clone-wrapper___2ZZvS_3-3-62","valueCloneWrapper":"magritte-value-clone-wrapper___2ZZvS_3-3-62","value-clone-container":"magritte-value-clone-container___PVM97_3-3-62","valueCloneContainer":"magritte-value-clone-container___PVM97_3-3-62","side-padding":"magritte-side-padding___O-HUP_3-3-62","sidePadding":"magritte-side-padding___O-HUP_3-3-62","textarea-animation-timeout":"magritte-textarea-animation-timeout___zudbr_3-3-62","textareaAnimationTimeout":"magritte-textarea-animation-timeout___zudbr_3-3-62","textarea-rigging-container":"magritte-textarea-rigging-container___-1S6i_3-3-62","textareaRiggingContainer":"magritte-textarea-rigging-container___-1S6i_3-3-62","label-no-wrap":"magritte-label-no-wrap___RxZ3A_3-3-62","labelNoWrap":"magritte-label-no-wrap___RxZ3A_3-3-62","textarea-grip":"magritte-textarea-grip___iL7lq_3-3-62","textareaGrip":"magritte-textarea-grip___iL7lq_3-3-62","textarea-grip-icon":"magritte-textarea-grip-icon___YK-9w_3-3-62","textareaGripIcon":"magritte-textarea-grip-icon___YK-9w_3-3-62","textarea-limit-enter":"magritte-textarea-limit-enter___CygGz_3-3-62","textareaLimitEnter":"magritte-textarea-limit-enter___CygGz_3-3-62","textarea-limit-exit":"magritte-textarea-limit-exit___RMp-R_3-3-62","textareaLimitExit":"magritte-textarea-limit-exit___RMp-R_3-3-62","textarea-limit-enter-active":"magritte-textarea-limit-enter-active___8vN-t_3-3-62","textareaLimitEnterActive":"magritte-textarea-limit-enter-active___8vN-t_3-3-62","textarea-limit-exit-active":"magritte-textarea-limit-exit-active___a5kBr_3-3-62","textareaLimitExitActive":"magritte-textarea-limit-exit-active___a5kBr_3-3-62"};
|
|
23
23
|
|
|
24
24
|
const ZERO_WIDTH_SPACE = "\u200B";
|
|
25
25
|
const TextAreaComponent = ({
|
|
@@ -79,7 +79,8 @@ const TextAreaComponent = ({
|
|
|
79
79
|
contentCloneWrapperRef,
|
|
80
80
|
textAreaRef,
|
|
81
81
|
resizableDivRef,
|
|
82
|
-
minHeight
|
|
82
|
+
minHeight,
|
|
83
|
+
maxedHeight
|
|
83
84
|
});
|
|
84
85
|
const trlOf = useTranslation("TextArea", "of");
|
|
85
86
|
useEffect(() => {
|
package/TextArea.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextArea.js","sources":["src/TextArea.tsx"],"sourcesContent":["import {\n forwardRef,\n ReactElement,\n useEffect,\n useId,\n useRef,\n useState,\n type TextareaHTMLAttributes,\n type ForwardedRef,\n type CSSProperties,\n} from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport classnames from 'classnames';\n\nimport { useDisabled } from '@hh.ru/magritte-common-use-disabled';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { FormHelper } from '@hh.ru/magritte-ui-form-helper';\nimport { GripSize24 } from '@hh.ru/magritte-ui-icon/private';\nimport { useInputAriaProps } from '@hh.ru/magritte-ui-input/useInputAriaProps';\nimport { Scrollbar, useScrollbar } from '@hh.ru/magritte-ui-scrollbar';\nimport { type TextAreaLayout, type ControlledTextAreaProps } from '@hh.ru/magritte-ui-textarea/types';\nimport { useFocus } from '@hh.ru/magritte-ui-textarea/useFocus';\nimport { useHeightObserver } from '@hh.ru/magritte-ui-textarea/useHeightObserver';\nimport { useLimitGrow } from '@hh.ru/magritte-ui-textarea/useLimitGrow';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './textarea.less';\n\nconst ZERO_WIDTH_SPACE = '\\u200B';\n\nconst TextAreaComponent = <Layout extends TextAreaLayout>(\n {\n onChange,\n onFocus,\n onBlur,\n onValidate,\n value,\n placeholder,\n disabled = false,\n elevatePlaceholder = false,\n invalid = false,\n invalidLimit = false,\n maxLength,\n description,\n errorMessage,\n resize = 'none',\n layout = 'fixed' as Layout,\n size = 'large',\n minHeight: _minHeight,\n maxHeight,\n 'aria-describedby': ariaDescribedBy,\n ...restProps\n }: ControlledTextAreaProps<Layout> &\n Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, keyof ControlledTextAreaProps<'fixed'>>,\n ref: ForwardedRef<HTMLTextAreaElement>\n) => {\n const { isMobile } = useBreakpoint();\n const forceDisabled = useDisabled();\n const isComponentDisabled = forceDisabled || !!disabled;\n const [internalInvalid, setInternalInvalid] = useState(false);\n const [isFocusVisible, setFocusVisible] = useState(false);\n const limitRef = useRef<HTMLDivElement>(null);\n const previousInvalid = useRef(internalInvalid);\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n const resizableDivRef = useRef<HTMLDivElement>(null);\n const resizableDivSizes = useRef<{ width?: number; height?: number } | null>(null);\n const resizableDivWasResized = useRef(false);\n const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({\n axis: isComponentDisabled ? 'none' : 'vertical',\n });\n const textAreaRefCallback = useMultipleRefs(ref, textAreaRef, scrollbar.scrollContainerRef);\n const descriptionId = useId();\n const labelId = useId();\n const [animationTimeout, setAnimationTimeout] = useState(100);\n const currentResizeValue = isMobile ? 'none' : resize;\n const isResizable = currentResizeValue !== 'none';\n const contentCloneRef = useRef<HTMLPreElement>(null);\n const contentCloneWrapperRef = useRef<HTMLDivElement>(null);\n const { minHeight, maxedHeight } = useHeightObserver({\n size,\n minHeight: _minHeight,\n layout,\n contentCloneRef,\n onHeightChange: () => scrollbar.resizeCallbackRef.current?.(),\n });\n const { maxHeightRef, allowScrollRef } = useLimitGrow({\n layout,\n contentCloneRef,\n contentCloneWrapperRef,\n textAreaRef,\n resizableDivRef,\n minHeight,\n });\n const trlOf = useTranslation('TextArea', 'of');\n\n useEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles.textareaAnimationTimeout);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n const animationTimeout = parseInt(style.getPropertyValue(`--animation-duration`), 10);\n if (Number.isInteger(animationTimeout)) {\n setAnimationTimeout(animationTimeout);\n }\n document.body.removeChild(animationTimeoutElement);\n }, []);\n\n const { focusHandler, blurHandler, isFocused } = useFocus<HTMLTextAreaElement>(onFocus, onBlur);\n\n const handleClick = () => {\n if (resizableDivWasResized.current) {\n resizableDivWasResized.current = false;\n return;\n }\n textAreaRef.current?.focus();\n };\n\n const handleMouseUp = () => {\n if (\n resizableDivRef.current?.offsetWidth !== resizableDivSizes.current?.width ||\n resizableDivRef.current?.offsetHeight !== resizableDivSizes.current?.height\n ) {\n resizableDivWasResized.current = true;\n }\n };\n\n const handleMouseDown = () => {\n resizableDivSizes.current = {\n width: resizableDivRef.current?.offsetWidth,\n height: resizableDivRef.current?.offsetHeight,\n };\n };\n\n useEffect(() => {\n if (maxLength) {\n const invalid = !isFocused && value.length > maxLength;\n setInternalInvalid(invalid);\n\n if (previousInvalid.current !== invalid) {\n onValidate?.({ invalidLimit: invalid });\n }\n previousInvalid.current = invalid;\n }\n }, [onValidate, value, internalInvalid, maxLength, isFocused]);\n\n useEffect(() => {\n if (textAreaRef.current) {\n setFocusVisible(isFocused && textAreaRef.current.classList.contains('focus-visible'));\n }\n }, [isFocused]);\n\n useEffect(() => {\n // для layout === 'hug' resizeCallback вызывается в useHeightObserver, т.к. нужно ожидать перерисовку оберток\n if (layout !== 'hug') {\n scrollbar.resizeCallbackRef.current?.();\n }\n }, [layout, scrollbar.resizeCallbackRef, value]);\n\n const placeholderIsElevated = !!elevatePlaceholder && !!placeholder && size === 'large';\n const showLabel = placeholderIsElevated || value === '';\n\n const invalidState = invalid || invalidLimit;\n const ariaProps = useInputAriaProps({\n invalid: invalidState || internalInvalid,\n hasDescription: !!description || !!errorMessage || !!ariaDescribedBy,\n hasPlaceholder: !!placeholder,\n descriptionId: ariaDescribedBy || `input-description-${descriptionId}`,\n labelId,\n });\n\n const hasElevatedPlaceholderClass = (isFocused || value !== '') && placeholderIsElevated;\n\n return (\n <div\n data-qa=\"textarea-wrapper\"\n data-interactive={true}\n className={classnames(styles.textarea, styles[`textarea-${size}`], {\n [styles.textareaFocused]: isFocused,\n [styles.textareaDisabled]: isComponentDisabled,\n [styles.textareaInvalid]: !!(invalidState || internalInvalid),\n [styles.textareaLimitError]:\n invalidLimit || internalInvalid || (maxLength ? value.length > maxLength : false),\n [styles.textareaLimited]: !!maxLength && maxedHeight,\n [styles.textareaLayoutFillBoth]: layout === 'fill-both',\n [styles.textareaLayoutFillVertical]: layout === 'fill-vertical',\n [styles.textareaLayoutFillHorizontal]: layout === 'fill-horizontal',\n [styles.textareaLayoutHug]: layout === 'hug',\n [styles.textareaElevated]: placeholderIsElevated,\n [styles.hasGrip]: isResizable,\n [styles.maxedHeight]: size === 'large' && maxedHeight,\n })}\n >\n <div\n className={classnames(styles.textareaPositionContainerWrapper, scrollbar.hoverContainerCssClass, {\n 'focus-visible': isFocusVisible,\n })}\n >\n <div\n className={classnames(styles.textareaPositionContainer)}\n onClick={handleClick}\n onMouseDown={isResizable ? handleMouseDown : undefined}\n onMouseUp={isResizable ? handleMouseUp : undefined}\n style={\n {\n height: maxHeightRef.current || (maxedHeight ? 'auto' : minHeight),\n minHeight,\n '--magritte-textarea-max-height': maxHeight\n ? `${Math.max(maxHeight, minHeight)}px`\n : 'auto',\n resize: currentResizeValue,\n } as CSSProperties\n }\n ref={resizableDivRef}\n >\n <div className={styles.textareaWrapper} data-qa=\"textarea-native-wrapper\">\n <textarea\n {...restProps}\n {...ariaProps}\n disabled={isComponentDisabled}\n suppressHydrationWarning\n className={classnames(styles.nativeElement, styles.sidePadding)}\n value={value}\n onChange={onChange}\n onFocus={focusHandler}\n onBlur={blurHandler}\n style={{ overflowY: layout !== 'hug' || allowScrollRef.current ? 'auto' : 'hidden' }}\n ref={textAreaRefCallback}\n />\n {layout === 'hug' && (\n <div\n className={classnames(styles.valueCloneWrapper, styles.sidePadding)}\n ref={contentCloneWrapperRef}\n >\n <pre className={styles.valueCloneContainer} ref={contentCloneRef}>\n {`${value}${ZERO_WIDTH_SPACE}`}\n </pre>\n </div>\n )}\n {showLabel && (\n <div className={classnames(styles.textareaRiggingContainer, styles.sidePadding)}>\n <label\n className={classnames(styles.textareaLabel, {\n [styles.labelNoWrap]: elevatePlaceholder,\n [styles.textareaLabelElevated]: hasElevatedPlaceholderClass,\n })}\n id={ariaProps['aria-labelledby']}\n >\n {placeholder}\n </label>\n </div>\n )}\n </div>\n {hasVerticalScroll && <Scrollbar {...verticalScrollbarProps} />}\n </div>\n {!!maxLength && maxedHeight && (\n <CSSTransition\n in={isFocused || value.length > maxLength}\n timeout={animationTimeout}\n classNames={{\n enter: styles.textareaLimitEnter,\n enterActive: styles.textareaLimitEnterActive,\n exit: styles.textareaLimitExit,\n exitActive: styles.textareaLimitExitActive,\n }}\n unmountOnExit\n nodeRef={limitRef}\n >\n <div className={styles.textareaLimit} ref={limitRef}>\n <Text typography=\"label-3-regular\">\n {value.length}\n {trlOf}\n {maxLength}\n </Text>\n </div>\n </CSSTransition>\n )}\n {isResizable && (\n <div className={styles.textareaGrip}>\n <div className={styles.textareaGripIcon}>\n <GripSize24 />\n </div>\n </div>\n )}\n </div>\n <FormHelper\n description={description}\n errorMessage={errorMessage}\n descriptionId={ariaProps['aria-describedby']}\n disabled={isComponentDisabled}\n invalid={invalidState}\n data-qa=\"textarea-hint-container\"\n />\n </div>\n );\n};\n\nconst TextArea = forwardRef(TextAreaComponent) as (<Layout extends TextAreaLayout>(\n props: ControlledTextAreaProps<Layout> &\n Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, keyof ControlledTextAreaProps<'fixed'>> & {\n ref?: React.ForwardedRef<HTMLTextAreaElement>;\n }\n) => ReactElement | null) & { displayName: string };\n\nTextArea.displayName = 'TextArea';\n\nexport { TextArea };\n"],"names":["animationTimeout","invalid"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TextArea.js","sources":["src/TextArea.tsx"],"sourcesContent":["import {\n forwardRef,\n ReactElement,\n useEffect,\n useId,\n useRef,\n useState,\n type TextareaHTMLAttributes,\n type ForwardedRef,\n type CSSProperties,\n} from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport classnames from 'classnames';\n\nimport { useDisabled } from '@hh.ru/magritte-common-use-disabled';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useTranslation } from '@hh.ru/magritte-common-use-translation';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { FormHelper } from '@hh.ru/magritte-ui-form-helper';\nimport { GripSize24 } from '@hh.ru/magritte-ui-icon/private';\nimport { useInputAriaProps } from '@hh.ru/magritte-ui-input/useInputAriaProps';\nimport { Scrollbar, useScrollbar } from '@hh.ru/magritte-ui-scrollbar';\nimport { type TextAreaLayout, type ControlledTextAreaProps } from '@hh.ru/magritte-ui-textarea/types';\nimport { useFocus } from '@hh.ru/magritte-ui-textarea/useFocus';\nimport { useHeightObserver } from '@hh.ru/magritte-ui-textarea/useHeightObserver';\nimport { useLimitGrow } from '@hh.ru/magritte-ui-textarea/useLimitGrow';\nimport { Text } from '@hh.ru/magritte-ui-typography';\n\nimport styles from './textarea.less';\n\nconst ZERO_WIDTH_SPACE = '\\u200B';\n\nconst TextAreaComponent = <Layout extends TextAreaLayout>(\n {\n onChange,\n onFocus,\n onBlur,\n onValidate,\n value,\n placeholder,\n disabled = false,\n elevatePlaceholder = false,\n invalid = false,\n invalidLimit = false,\n maxLength,\n description,\n errorMessage,\n resize = 'none',\n layout = 'fixed' as Layout,\n size = 'large',\n minHeight: _minHeight,\n maxHeight,\n 'aria-describedby': ariaDescribedBy,\n ...restProps\n }: ControlledTextAreaProps<Layout> &\n Omit<TextareaHTMLAttributes<HTMLTextAreaElement>, keyof ControlledTextAreaProps<'fixed'>>,\n ref: ForwardedRef<HTMLTextAreaElement>\n) => {\n const { isMobile } = useBreakpoint();\n const forceDisabled = useDisabled();\n const isComponentDisabled = forceDisabled || !!disabled;\n const [internalInvalid, setInternalInvalid] = useState(false);\n const [isFocusVisible, setFocusVisible] = useState(false);\n const limitRef = useRef<HTMLDivElement>(null);\n const previousInvalid = useRef(internalInvalid);\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n const resizableDivRef = useRef<HTMLDivElement>(null);\n const resizableDivSizes = useRef<{ width?: number; height?: number } | null>(null);\n const resizableDivWasResized = useRef(false);\n const { hasVerticalScroll, verticalScrollbarProps, ...scrollbar } = useScrollbar({\n axis: isComponentDisabled ? 'none' : 'vertical',\n });\n const textAreaRefCallback = useMultipleRefs(ref, textAreaRef, scrollbar.scrollContainerRef);\n const descriptionId = useId();\n const labelId = useId();\n const [animationTimeout, setAnimationTimeout] = useState(100);\n const currentResizeValue = isMobile ? 'none' : resize;\n const isResizable = currentResizeValue !== 'none';\n const contentCloneRef = useRef<HTMLPreElement>(null);\n const contentCloneWrapperRef = useRef<HTMLDivElement>(null);\n const { minHeight, maxedHeight } = useHeightObserver({\n size,\n minHeight: _minHeight,\n layout,\n contentCloneRef,\n onHeightChange: () => scrollbar.resizeCallbackRef.current?.(),\n });\n const { maxHeightRef, allowScrollRef } = useLimitGrow({\n layout,\n contentCloneRef,\n contentCloneWrapperRef,\n textAreaRef,\n resizableDivRef,\n minHeight,\n maxedHeight,\n });\n const trlOf = useTranslation('TextArea', 'of');\n\n useEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles.textareaAnimationTimeout);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n const animationTimeout = parseInt(style.getPropertyValue(`--animation-duration`), 10);\n if (Number.isInteger(animationTimeout)) {\n setAnimationTimeout(animationTimeout);\n }\n document.body.removeChild(animationTimeoutElement);\n }, []);\n\n const { focusHandler, blurHandler, isFocused } = useFocus<HTMLTextAreaElement>(onFocus, onBlur);\n\n const handleClick = () => {\n if (resizableDivWasResized.current) {\n resizableDivWasResized.current = false;\n return;\n }\n textAreaRef.current?.focus();\n };\n\n const handleMouseUp = () => {\n if (\n resizableDivRef.current?.offsetWidth !== resizableDivSizes.current?.width ||\n resizableDivRef.current?.offsetHeight !== resizableDivSizes.current?.height\n ) {\n resizableDivWasResized.current = true;\n }\n };\n\n const handleMouseDown = () => {\n resizableDivSizes.current = {\n width: resizableDivRef.current?.offsetWidth,\n height: resizableDivRef.current?.offsetHeight,\n };\n };\n\n useEffect(() => {\n if (maxLength) {\n const invalid = !isFocused && value.length > maxLength;\n setInternalInvalid(invalid);\n\n if (previousInvalid.current !== invalid) {\n onValidate?.({ invalidLimit: invalid });\n }\n previousInvalid.current = invalid;\n }\n }, [onValidate, value, internalInvalid, maxLength, isFocused]);\n\n useEffect(() => {\n if (textAreaRef.current) {\n setFocusVisible(isFocused && textAreaRef.current.classList.contains('focus-visible'));\n }\n }, [isFocused]);\n\n useEffect(() => {\n // для layout === 'hug' resizeCallback вызывается в useHeightObserver, т.к. нужно ожидать перерисовку оберток\n if (layout !== 'hug') {\n scrollbar.resizeCallbackRef.current?.();\n }\n }, [layout, scrollbar.resizeCallbackRef, value]);\n\n const placeholderIsElevated = !!elevatePlaceholder && !!placeholder && size === 'large';\n const showLabel = placeholderIsElevated || value === '';\n\n const invalidState = invalid || invalidLimit;\n const ariaProps = useInputAriaProps({\n invalid: invalidState || internalInvalid,\n hasDescription: !!description || !!errorMessage || !!ariaDescribedBy,\n hasPlaceholder: !!placeholder,\n descriptionId: ariaDescribedBy || `input-description-${descriptionId}`,\n labelId,\n });\n\n const hasElevatedPlaceholderClass = (isFocused || value !== '') && placeholderIsElevated;\n\n return (\n <div\n data-qa=\"textarea-wrapper\"\n data-interactive={true}\n className={classnames(styles.textarea, styles[`textarea-${size}`], {\n [styles.textareaFocused]: isFocused,\n [styles.textareaDisabled]: isComponentDisabled,\n [styles.textareaInvalid]: !!(invalidState || internalInvalid),\n [styles.textareaLimitError]:\n invalidLimit || internalInvalid || (maxLength ? value.length > maxLength : false),\n [styles.textareaLimited]: !!maxLength && maxedHeight,\n [styles.textareaLayoutFillBoth]: layout === 'fill-both',\n [styles.textareaLayoutFillVertical]: layout === 'fill-vertical',\n [styles.textareaLayoutFillHorizontal]: layout === 'fill-horizontal',\n [styles.textareaLayoutHug]: layout === 'hug',\n [styles.textareaElevated]: placeholderIsElevated,\n [styles.hasGrip]: isResizable,\n [styles.maxedHeight]: size === 'large' && maxedHeight,\n })}\n >\n <div\n className={classnames(styles.textareaPositionContainerWrapper, scrollbar.hoverContainerCssClass, {\n 'focus-visible': isFocusVisible,\n })}\n >\n <div\n className={classnames(styles.textareaPositionContainer)}\n onClick={handleClick}\n onMouseDown={isResizable ? handleMouseDown : undefined}\n onMouseUp={isResizable ? handleMouseUp : undefined}\n style={\n {\n height: maxHeightRef.current || (maxedHeight ? 'auto' : minHeight),\n minHeight,\n '--magritte-textarea-max-height': maxHeight\n ? `${Math.max(maxHeight, minHeight)}px`\n : 'auto',\n resize: currentResizeValue,\n } as CSSProperties\n }\n ref={resizableDivRef}\n >\n <div className={styles.textareaWrapper} data-qa=\"textarea-native-wrapper\">\n <textarea\n {...restProps}\n {...ariaProps}\n disabled={isComponentDisabled}\n suppressHydrationWarning\n className={classnames(styles.nativeElement, styles.sidePadding)}\n value={value}\n onChange={onChange}\n onFocus={focusHandler}\n onBlur={blurHandler}\n style={{ overflowY: layout !== 'hug' || allowScrollRef.current ? 'auto' : 'hidden' }}\n ref={textAreaRefCallback}\n />\n {layout === 'hug' && (\n <div\n className={classnames(styles.valueCloneWrapper, styles.sidePadding)}\n ref={contentCloneWrapperRef}\n >\n <pre className={styles.valueCloneContainer} ref={contentCloneRef}>\n {`${value}${ZERO_WIDTH_SPACE}`}\n </pre>\n </div>\n )}\n {showLabel && (\n <div className={classnames(styles.textareaRiggingContainer, styles.sidePadding)}>\n <label\n className={classnames(styles.textareaLabel, {\n [styles.labelNoWrap]: elevatePlaceholder,\n [styles.textareaLabelElevated]: hasElevatedPlaceholderClass,\n })}\n id={ariaProps['aria-labelledby']}\n >\n {placeholder}\n </label>\n </div>\n )}\n </div>\n {hasVerticalScroll && <Scrollbar {...verticalScrollbarProps} />}\n </div>\n {!!maxLength && maxedHeight && (\n <CSSTransition\n in={isFocused || value.length > maxLength}\n timeout={animationTimeout}\n classNames={{\n enter: styles.textareaLimitEnter,\n enterActive: styles.textareaLimitEnterActive,\n exit: styles.textareaLimitExit,\n exitActive: styles.textareaLimitExitActive,\n }}\n unmountOnExit\n nodeRef={limitRef}\n >\n <div className={styles.textareaLimit} ref={limitRef}>\n <Text typography=\"label-3-regular\">\n {value.length}\n {trlOf}\n {maxLength}\n </Text>\n </div>\n </CSSTransition>\n )}\n {isResizable && (\n <div className={styles.textareaGrip}>\n <div className={styles.textareaGripIcon}>\n <GripSize24 />\n </div>\n </div>\n )}\n </div>\n <FormHelper\n description={description}\n errorMessage={errorMessage}\n descriptionId={ariaProps['aria-describedby']}\n disabled={isComponentDisabled}\n invalid={invalidState}\n data-qa=\"textarea-hint-container\"\n />\n </div>\n );\n};\n\nconst TextArea = forwardRef(TextAreaComponent) as (<Layout extends TextAreaLayout>(\n props: ControlledTextAreaProps<Layout> &\n Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, keyof ControlledTextAreaProps<'fixed'>> & {\n ref?: React.ForwardedRef<HTMLTextAreaElement>;\n }\n) => ReactElement | null) & { displayName: string };\n\nTextArea.displayName = 'TextArea';\n\nexport { TextArea };\n"],"names":["animationTimeout","invalid"],"mappings":"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"}
|
package/TextAreaGrowLimiter.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare const TextAreaGrowLimiter: import("react").ForwardRefExoticCompon
|
|
|
11
11
|
debounce?: boolean;
|
|
12
12
|
preMeasurement?: VoidFunction;
|
|
13
13
|
postMeasurement?: VoidFunction;
|
|
14
|
+
disabled?: boolean;
|
|
14
15
|
style?: import("react").HTMLAttributes<HTMLDivElement>['style'];
|
|
15
16
|
className?: import("react").HTMLAttributes<HTMLDivElement>['className'];
|
|
16
17
|
} & {
|
package/TextAreaGrowLimiter.js
CHANGED
|
@@ -4,21 +4,25 @@ import { createContext, forwardRef, useRef, useState, useMemo, useEffect } from
|
|
|
4
4
|
import { debounce } from '@hh.ru/magritte-common-func-utils';
|
|
5
5
|
import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
|
|
6
6
|
|
|
7
|
-
const
|
|
7
|
+
const DEFAULT_GROW_LIMITER_CONTEXT_VALUE = {
|
|
8
8
|
getHeightDiff: () => 0,
|
|
9
9
|
onHeightChange: () => void 0,
|
|
10
10
|
offHeightChange: () => void 0,
|
|
11
11
|
heightUpdated: () => void 0,
|
|
12
12
|
hasLimit: false
|
|
13
|
-
}
|
|
13
|
+
};
|
|
14
|
+
const GrowLimiterContext = createContext(DEFAULT_GROW_LIMITER_CONTEXT_VALUE);
|
|
14
15
|
const TextAreaGrowLimiter = forwardRef(
|
|
15
|
-
({ children, containerRef, preMeasurement, postMeasurement, debounce: debounce$1 = false, ...rest }, ref) => {
|
|
16
|
+
({ children, containerRef, preMeasurement, postMeasurement, debounce: debounce$1 = false, disabled = false, ...rest }, ref) => {
|
|
16
17
|
const wrapperRef = useRef(null);
|
|
17
18
|
const refMultiplexer = useMultipleRefs(ref, wrapperRef);
|
|
18
19
|
const [heightChangeHandlers, _] = useState(() => /* @__PURE__ */ new Set());
|
|
19
20
|
const heightDiffCache = useRef(null);
|
|
20
|
-
const contextValue = useMemo(
|
|
21
|
-
()
|
|
21
|
+
const contextValue = useMemo(() => {
|
|
22
|
+
if (disabled) {
|
|
23
|
+
return DEFAULT_GROW_LIMITER_CONTEXT_VALUE;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
22
26
|
getHeightDiff: () => {
|
|
23
27
|
if (heightDiffCache.current === null) {
|
|
24
28
|
const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;
|
|
@@ -42,13 +46,13 @@ const TextAreaGrowLimiter = forwardRef(
|
|
|
42
46
|
offHeightChange: (callback) => heightChangeHandlers.delete(callback),
|
|
43
47
|
heightUpdated: () => heightDiffCache.current = null,
|
|
44
48
|
hasLimit: true
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
);
|
|
49
|
+
};
|
|
50
|
+
}, [disabled, heightChangeHandlers, containerRef, wrapperRef, preMeasurement, postMeasurement]);
|
|
48
51
|
useEffect(
|
|
49
52
|
() => {
|
|
53
|
+
heightDiffCache.current = null;
|
|
50
54
|
const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;
|
|
51
|
-
if (!wrapperRef.current || !currentContainer) {
|
|
55
|
+
if (disabled || !wrapperRef.current || !currentContainer) {
|
|
52
56
|
return void 0;
|
|
53
57
|
}
|
|
54
58
|
const observerCallback = () => {
|
|
@@ -69,14 +73,14 @@ const TextAreaGrowLimiter = forwardRef(
|
|
|
69
73
|
// eslint считает что containerRef?.current лишняя зависимость, но эффект должен реагировать если
|
|
70
74
|
// значение в рефе изменилось, т.к. обзервер должен переподписаться на другой элемент
|
|
71
75
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
72
|
-
[heightChangeHandlers, containerRef, containerRef?.current, wrapperRef]
|
|
76
|
+
[disabled, heightChangeHandlers, containerRef, containerRef?.current, wrapperRef]
|
|
73
77
|
);
|
|
74
78
|
return /* @__PURE__ */ jsx(
|
|
75
79
|
"div",
|
|
76
80
|
{
|
|
77
81
|
ref: refMultiplexer,
|
|
78
82
|
...rest,
|
|
79
|
-
style: {
|
|
83
|
+
style: disabled ? rest.style : {
|
|
80
84
|
...rest.style || {},
|
|
81
85
|
borderBottomStyle: "solid",
|
|
82
86
|
borderBottomColor: "transparent"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TextAreaGrowLimiter.js","sources":["src/TextAreaGrowLimiter.tsx"],"sourcesContent":["import { createContext, useRef, forwardRef, useEffect, useState, useMemo } from 'react';\n\nimport { debounce as debounceFunc } from '@hh.ru/magritte-common-func-utils';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport type { TextAreaGrowLimiterProps } from '@hh.ru/magritte-ui-textarea/types';\n\nexport interface GrowLimiterContextValue {\n getHeightDiff: () => number;\n onHeightChange: (callback: VoidFunction) => void;\n offHeightChange: (callback: VoidFunction) => void;\n heightUpdated: VoidFunction;\n hasLimit: boolean;\n}\n\
|
|
1
|
+
{"version":3,"file":"TextAreaGrowLimiter.js","sources":["src/TextAreaGrowLimiter.tsx"],"sourcesContent":["import { createContext, useRef, forwardRef, useEffect, useState, useMemo } from 'react';\n\nimport { debounce as debounceFunc } from '@hh.ru/magritte-common-func-utils';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport type { TextAreaGrowLimiterProps } from '@hh.ru/magritte-ui-textarea/types';\n\nexport interface GrowLimiterContextValue {\n getHeightDiff: () => number;\n onHeightChange: (callback: VoidFunction) => void;\n offHeightChange: (callback: VoidFunction) => void;\n heightUpdated: VoidFunction;\n hasLimit: boolean;\n}\n\nconst DEFAULT_GROW_LIMITER_CONTEXT_VALUE: GrowLimiterContextValue = {\n getHeightDiff: () => 0,\n onHeightChange: () => void 0,\n offHeightChange: () => void 0,\n heightUpdated: () => void 0,\n hasLimit: false,\n};\n\nexport const GrowLimiterContext = createContext<GrowLimiterContextValue>(DEFAULT_GROW_LIMITER_CONTEXT_VALUE);\n\nexport const TextAreaGrowLimiter = forwardRef<HTMLDivElement, TextAreaGrowLimiterProps>(\n ({ children, containerRef, preMeasurement, postMeasurement, debounce = false, disabled = false, ...rest }, ref) => {\n const wrapperRef = useRef<HTMLDivElement>(null);\n const refMultiplexer = useMultipleRefs(ref, wrapperRef);\n const [heightChangeHandlers, _] = useState(() => new Set<VoidFunction>());\n const heightDiffCache = useRef<number | null>(null);\n\n const contextValue = useMemo<GrowLimiterContextValue>(() => {\n if (disabled) {\n return DEFAULT_GROW_LIMITER_CONTEXT_VALUE;\n }\n\n return {\n getHeightDiff: () => {\n if (heightDiffCache.current === null) {\n const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;\n\n if (!wrapperRef.current || !currentContainer) {\n return 0;\n }\n\n // запоминаем позицию скролла в контейнере, отключаем скролл, вызываем preMeasurement если задан\n // в BottomSheet например он отключает ограничение height на внешнем контейнере, чтобы была\n // возможность узнать реальный максимальный размер контейнера\n const scrollTop = currentContainer.scrollTop;\n const overflow = currentContainer.style.overflowY;\n currentContainer.style.overflowY = 'hidden';\n preMeasurement?.();\n\n // Устанавливаем толщину нижней рамки равно 20000 пикселей, чтобы размер обертки гарантированно\n // превысил размер контейнера. После этого сравниваем offsetHeight и scrollHeight контейнера\n // чтобы вычислить сколько доступно свободного пространства до появления в контейнере скролла\n wrapperRef.current.style.borderBottomWidth = '20000px';\n heightDiffCache.current = currentContainer.clientHeight - currentContainer.scrollHeight + 20000;\n // Вызываем postMeasurement если задан, в BottomSheet он возвращает ограничение height к\n // изначальному значению\n postMeasurement?.();\n\n // Возвращаем настройки контейнера и обретки к изначальным значениям\n currentContainer.style.overflowY = overflow;\n wrapperRef.current.style.borderBottomWidth = '0';\n currentContainer.scrollTop = scrollTop;\n }\n return heightDiffCache.current;\n },\n onHeightChange: (callback) => heightChangeHandlers.add(callback),\n offHeightChange: (callback) => heightChangeHandlers.delete(callback),\n heightUpdated: () => (heightDiffCache.current = null),\n hasLimit: true,\n };\n }, [disabled, heightChangeHandlers, containerRef, wrapperRef, preMeasurement, postMeasurement]);\n\n useEffect(\n () => {\n // в выключенном состоянии ничего не измеряем и не наблюдаем, кеш сбрасываем, чтобы после включения\n // не использовать устаревшее значение\n heightDiffCache.current = null;\n\n const currentContainer = containerRef?.current || wrapperRef?.current?.parentElement;\n\n if (disabled || !wrapperRef.current || !currentContainer) {\n return void 0;\n }\n\n const observerCallback = () => {\n heightDiffCache.current = null;\n heightChangeHandlers.forEach((callback) => callback());\n };\n\n const observer = new ResizeObserver(\n debounce ? debounceFunc(observerCallback, 17 /* ~= 1000ms / 60fps */) : observerCallback\n );\n observer.observe(wrapperRef.current, { box: 'content-box' });\n observer.observe(currentContainer, { box: 'content-box' });\n\n return () => observer.disconnect();\n },\n // eslint считает что containerRef?.current лишняя зависимость, но эффект должен реагировать если\n // значение в рефе изменилось, т.к. обзервер должен переподписаться на другой элемент\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [disabled, heightChangeHandlers, containerRef, containerRef?.current, wrapperRef]\n );\n\n return (\n <div\n ref={refMultiplexer}\n {...rest}\n style={\n disabled\n ? rest.style\n : {\n ...(rest.style || {}),\n borderBottomStyle: 'solid',\n borderBottomColor: 'transparent',\n }\n }\n >\n <GrowLimiterContext.Provider value={contextValue}>{children}</GrowLimiterContext.Provider>\n </div>\n );\n }\n);\n\nTextAreaGrowLimiter.displayName = 'TextAreaGrowLimiter';\n"],"names":["debounce","debounceFunc"],"mappings":"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"}
|
package/index.css
CHANGED
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
.magritte-zp-day-theme{
|
|
85
85
|
--magritte-color-component-input-stroke-state-field-focused-v26-0-2:#7195AF;
|
|
86
86
|
}
|
|
87
|
-
.magritte-textarea___ugvor_3-3-
|
|
87
|
+
.magritte-textarea___ugvor_3-3-62{
|
|
88
88
|
display:inline-flex;
|
|
89
89
|
flex-flow:column;
|
|
90
90
|
--magritte-ui-textarea-vertical-offset:0px;
|
|
@@ -92,229 +92,229 @@
|
|
|
92
92
|
--animation-100-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v26-0-2);
|
|
93
93
|
--animation-300-duration:var(--magritte-semantic-animation-ease-in-out-300-duration-v26-0-2);
|
|
94
94
|
}
|
|
95
|
-
.magritte-textarea___ugvor_3-3-
|
|
95
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-elevated___S0jk-_3-3-62{
|
|
96
96
|
--magritte-ui-textarea-vertical-offset:calc(18px * 0.5);
|
|
97
97
|
}
|
|
98
|
-
.magritte-textarea___ugvor_3-3-
|
|
98
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-small___Q-tsg_3-3-62{
|
|
99
99
|
--magritte-ui-textarea-vertical-padding:10px;
|
|
100
100
|
}
|
|
101
|
-
.magritte-textarea___ugvor_3-3-
|
|
101
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-medium___GNzAm_3-3-62{
|
|
102
102
|
--magritte-ui-textarea-vertical-padding:12px;
|
|
103
103
|
}
|
|
104
|
-
.magritte-textarea___ugvor_3-3-
|
|
104
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-large___ugT-5_3-3-62{
|
|
105
105
|
--magritte-ui-textarea-vertical-padding:16px;
|
|
106
106
|
}
|
|
107
|
-
.magritte-textarea___ugvor_3-3-
|
|
107
|
+
.magritte-textarea___ugvor_3-3-62.magritte-has-grip___ATMYQ_3-3-62{
|
|
108
108
|
--magritte-ui-textarea-additional-bottom-padding:18px;
|
|
109
109
|
}
|
|
110
|
-
.magritte-textarea___ugvor_3-3-
|
|
110
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-limited___cU1Rg_3-3-62{
|
|
111
111
|
--magritte-ui-textarea-additional-bottom-padding:20px + 8px;
|
|
112
112
|
}
|
|
113
|
-
.magritte-textarea___ugvor_3-3-
|
|
113
|
+
.magritte-textarea___ugvor_3-3-62.magritte-maxed-height___v1wYG_3-3-62.magritte-textarea-elevated___S0jk-_3-3-62{
|
|
114
114
|
--magritte-ui-textarea-bottom-padding:calc(12px + var(--magritte-ui-textarea-vertical-offset));
|
|
115
115
|
}
|
|
116
116
|
@media (min-width: 1020px){
|
|
117
|
-
body.magritte-old-layout .magritte-textarea___ugvor_3-3-
|
|
117
|
+
body.magritte-old-layout .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover{
|
|
118
118
|
--magritte-ui-form-helper-description-color-override:var(--magritte-color-component-input-text-state-description-hovered-v26-0-2);
|
|
119
119
|
}
|
|
120
|
-
body.magritte-old-layout .magritte-textarea___ugvor_3-3-
|
|
120
|
+
body.magritte-old-layout .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after{
|
|
121
121
|
border-bottom-color:var(--magritte-color-component-input-stroke-state-field-hovered-v26-0-2);
|
|
122
122
|
border-right-color:var(--magritte-color-component-input-stroke-state-field-hovered-v26-0-2);
|
|
123
123
|
border-width:1px;
|
|
124
124
|
background-color:var(--magritte-color-component-input-background-state-field-hovered-v26-0-2);
|
|
125
125
|
}
|
|
126
|
-
body.magritte-old-layout .magritte-textarea___ugvor_3-3-
|
|
126
|
+
body.magritte-old-layout .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-position-container___cEpbv_3-3-62{
|
|
127
127
|
box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-hovered-v26-0-2);
|
|
128
128
|
background-color:var(--magritte-color-component-input-background-state-field-hovered-v26-0-2);
|
|
129
129
|
}
|
|
130
|
-
body.magritte-old-layout .magritte-textarea___ugvor_3-3-
|
|
130
|
+
body.magritte-old-layout .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-native-element___a0RAE_3-3-62{
|
|
131
131
|
color:var(--magritte-color-component-input-text-state-content-hovered-v26-0-2);
|
|
132
132
|
-webkit-text-fill-color:var(--magritte-color-component-input-text-state-content-hovered-v26-0-2);
|
|
133
133
|
opacity:1;
|
|
134
134
|
}
|
|
135
|
-
body.magritte-old-layout .magritte-textarea___ugvor_3-3-
|
|
135
|
+
body.magritte-old-layout .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-label___sgTIH_3-3-62{
|
|
136
136
|
color:var(--magritte-color-component-input-text-state-placeholder-hovered-v26-0-2);
|
|
137
137
|
}
|
|
138
|
-
body.magritte-old-layout .magritte-textarea___ugvor_3-3-
|
|
138
|
+
body.magritte-old-layout .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-label-elevated___0lxOI_3-3-62{
|
|
139
139
|
color:var(--magritte-color-component-input-text-state-label-hovered-v26-0-2);
|
|
140
140
|
}
|
|
141
|
-
body.magritte-old-layout .magritte-textarea___ugvor_3-3-
|
|
141
|
+
body.magritte-old-layout .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-limit___IjPJy_3-3-62{
|
|
142
142
|
background-color:var(--magritte-color-component-input-background-state-field-hovered-v26-0-2);
|
|
143
143
|
}
|
|
144
|
-
body.magritte-old-layout .magritte-textarea___ugvor_3-3-
|
|
144
|
+
body.magritte-old-layout .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-limit___IjPJy_3-3-62{
|
|
145
145
|
--magritte-ui-text-color-override:var(--magritte-color-component-input-text-state-limit-hovered-v26-0-2);
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
@media (min-width: 1024px){
|
|
149
|
-
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-
|
|
149
|
+
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover{
|
|
150
150
|
--magritte-ui-form-helper-description-color-override:var(--magritte-color-component-input-text-state-description-hovered-v26-0-2);
|
|
151
151
|
}
|
|
152
|
-
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-
|
|
152
|
+
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after{
|
|
153
153
|
border-bottom-color:var(--magritte-color-component-input-stroke-state-field-hovered-v26-0-2);
|
|
154
154
|
border-right-color:var(--magritte-color-component-input-stroke-state-field-hovered-v26-0-2);
|
|
155
155
|
border-width:1px;
|
|
156
156
|
background-color:var(--magritte-color-component-input-background-state-field-hovered-v26-0-2);
|
|
157
157
|
}
|
|
158
|
-
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-
|
|
158
|
+
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-position-container___cEpbv_3-3-62{
|
|
159
159
|
box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-hovered-v26-0-2);
|
|
160
160
|
background-color:var(--magritte-color-component-input-background-state-field-hovered-v26-0-2);
|
|
161
161
|
}
|
|
162
|
-
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-
|
|
162
|
+
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-native-element___a0RAE_3-3-62{
|
|
163
163
|
color:var(--magritte-color-component-input-text-state-content-hovered-v26-0-2);
|
|
164
164
|
-webkit-text-fill-color:var(--magritte-color-component-input-text-state-content-hovered-v26-0-2);
|
|
165
165
|
opacity:1;
|
|
166
166
|
}
|
|
167
|
-
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-
|
|
167
|
+
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-label___sgTIH_3-3-62{
|
|
168
168
|
color:var(--magritte-color-component-input-text-state-placeholder-hovered-v26-0-2);
|
|
169
169
|
}
|
|
170
|
-
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-
|
|
170
|
+
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-label-elevated___0lxOI_3-3-62{
|
|
171
171
|
color:var(--magritte-color-component-input-text-state-label-hovered-v26-0-2);
|
|
172
172
|
}
|
|
173
|
-
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-
|
|
173
|
+
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-limit___IjPJy_3-3-62{
|
|
174
174
|
background-color:var(--magritte-color-component-input-background-state-field-hovered-v26-0-2);
|
|
175
175
|
}
|
|
176
|
-
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-
|
|
176
|
+
body:not(.magritte-old-layout) .magritte-textarea___ugvor_3-3-62:not(.magritte-textarea-focused___eiGyC_3-3-62):not(.magritte-textarea-invalid___iKOPh_3-3-62):not(.magritte-textarea-disabled___XN0cg_3-3-62):hover .magritte-textarea-limit___IjPJy_3-3-62{
|
|
177
177
|
--magritte-ui-text-color-override:var(--magritte-color-component-input-text-state-limit-hovered-v26-0-2);
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
|
-
.magritte-textarea___ugvor_3-3-
|
|
180
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62{
|
|
181
181
|
--magritte-ui-form-helper-description-color-override:var(--magritte-color-component-input-text-state-description-focused-v26-0-2);
|
|
182
182
|
}
|
|
183
|
-
.magritte-textarea___ugvor_3-3-
|
|
183
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after{
|
|
184
184
|
border-bottom-color:var(--magritte-color-component-input-stroke-state-field-focused-v26-0-2);
|
|
185
185
|
border-right-color:var(--magritte-color-component-input-stroke-state-field-focused-v26-0-2);
|
|
186
186
|
border-width:2px;
|
|
187
187
|
background-color:var(--magritte-color-component-input-background-state-field-focused-v26-0-2);
|
|
188
188
|
}
|
|
189
|
-
.magritte-textarea___ugvor_3-3-
|
|
189
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62 .magritte-textarea-position-container___cEpbv_3-3-62{
|
|
190
190
|
box-shadow:inset 0 0 0 2px var(--magritte-color-component-input-stroke-state-field-focused-v26-0-2);
|
|
191
191
|
background-color:var(--magritte-color-component-input-background-state-field-focused-v26-0-2);
|
|
192
192
|
}
|
|
193
|
-
.magritte-textarea___ugvor_3-3-
|
|
193
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62 .magritte-native-element___a0RAE_3-3-62{
|
|
194
194
|
color:var(--magritte-color-component-input-text-state-content-focused-v26-0-2);
|
|
195
195
|
-webkit-text-fill-color:var(--magritte-color-component-input-text-state-content-focused-v26-0-2);
|
|
196
196
|
opacity:1;
|
|
197
197
|
}
|
|
198
|
-
.magritte-textarea___ugvor_3-3-
|
|
198
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62 .magritte-textarea-label___sgTIH_3-3-62{
|
|
199
199
|
color:var(--magritte-color-component-input-text-state-placeholder-focused-v26-0-2);
|
|
200
200
|
}
|
|
201
|
-
.magritte-textarea___ugvor_3-3-
|
|
201
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62 .magritte-textarea-label-elevated___0lxOI_3-3-62{
|
|
202
202
|
color:var(--magritte-color-component-input-text-state-label-focused-v26-0-2);
|
|
203
203
|
}
|
|
204
|
-
.magritte-textarea___ugvor_3-3-
|
|
204
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62{
|
|
205
205
|
background-color:var(--magritte-color-component-input-background-state-field-focused-v26-0-2);
|
|
206
206
|
}
|
|
207
|
-
.magritte-textarea___ugvor_3-3-
|
|
207
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62{
|
|
208
208
|
--magritte-ui-text-color-override:var(--magritte-color-component-input-text-state-limit-focused-v26-0-2);
|
|
209
209
|
}
|
|
210
|
-
.magritte-textarea___ugvor_3-3-
|
|
211
|
-
.magritte-textarea___ugvor_3-3-
|
|
210
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62,
|
|
211
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62{
|
|
212
212
|
--magritte-ui-form-helper-error-color-override:var(--magritte-color-component-input-text-state-description-invalid-v26-0-2);
|
|
213
213
|
}
|
|
214
|
-
.magritte-textarea___ugvor_3-3-
|
|
215
|
-
.magritte-textarea___ugvor_3-3-
|
|
214
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after,
|
|
215
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after{
|
|
216
216
|
border-bottom-color:var(--magritte-color-component-input-stroke-state-field-invalid-v26-0-2);
|
|
217
217
|
border-right-color:var(--magritte-color-component-input-stroke-state-field-invalid-v26-0-2);
|
|
218
218
|
border-width:2px;
|
|
219
219
|
background-color:var(--magritte-color-component-input-background-state-field-invalid-v26-0-2);
|
|
220
220
|
}
|
|
221
|
-
.magritte-textarea___ugvor_3-3-
|
|
222
|
-
.magritte-textarea___ugvor_3-3-
|
|
221
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-textarea-position-container___cEpbv_3-3-62,
|
|
222
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-position-container___cEpbv_3-3-62{
|
|
223
223
|
box-shadow:inset 0 0 0 2px var(--magritte-color-component-input-stroke-state-field-invalid-v26-0-2);
|
|
224
224
|
background-color:var(--magritte-color-component-input-background-state-field-invalid-v26-0-2);
|
|
225
225
|
}
|
|
226
|
-
.magritte-textarea___ugvor_3-3-
|
|
227
|
-
.magritte-textarea___ugvor_3-3-
|
|
226
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-native-element___a0RAE_3-3-62,
|
|
227
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-native-element___a0RAE_3-3-62{
|
|
228
228
|
color:var(--magritte-color-component-input-text-state-content-invalid-v26-0-2);
|
|
229
229
|
-webkit-text-fill-color:var(--magritte-color-component-input-text-state-content-invalid-v26-0-2);
|
|
230
230
|
opacity:1;
|
|
231
231
|
}
|
|
232
|
-
.magritte-textarea___ugvor_3-3-
|
|
233
|
-
.magritte-textarea___ugvor_3-3-
|
|
232
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-textarea-label___sgTIH_3-3-62,
|
|
233
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-label___sgTIH_3-3-62{
|
|
234
234
|
color:var(--magritte-color-component-input-text-state-placeholder-invalid-v26-0-2);
|
|
235
235
|
}
|
|
236
|
-
.magritte-textarea___ugvor_3-3-
|
|
237
|
-
.magritte-textarea___ugvor_3-3-
|
|
236
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-textarea-label-elevated___0lxOI_3-3-62,
|
|
237
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-label-elevated___0lxOI_3-3-62{
|
|
238
238
|
color:var(--magritte-color-component-input-text-state-label-invalid-v26-0-2);
|
|
239
239
|
}
|
|
240
|
-
.magritte-textarea___ugvor_3-3-
|
|
241
|
-
.magritte-textarea___ugvor_3-3-
|
|
240
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62,
|
|
241
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62{
|
|
242
242
|
background-color:var(--magritte-color-component-input-background-state-field-invalid-v26-0-2);
|
|
243
243
|
}
|
|
244
|
-
.magritte-textarea___ugvor_3-3-
|
|
244
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-focused___eiGyC_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62{
|
|
245
245
|
--magritte-ui-text-color-override:var(--magritte-color-component-input-text-state-limit-invalid-v26-0-2);
|
|
246
246
|
}
|
|
247
|
-
.magritte-textarea___ugvor_3-3-
|
|
247
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62{
|
|
248
248
|
--magritte-ui-form-helper-error-color-override:var(--magritte-color-component-input-text-state-description-invalid-v26-0-2);
|
|
249
249
|
}
|
|
250
|
-
.magritte-textarea___ugvor_3-3-
|
|
250
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after{
|
|
251
251
|
border-bottom-color:var(--magritte-color-component-input-stroke-state-field-invalid-v26-0-2);
|
|
252
252
|
border-right-color:var(--magritte-color-component-input-stroke-state-field-invalid-v26-0-2);
|
|
253
253
|
border-width:1px;
|
|
254
254
|
background-color:var(--magritte-color-component-input-background-state-field-invalid-v26-0-2);
|
|
255
255
|
}
|
|
256
|
-
.magritte-textarea___ugvor_3-3-
|
|
256
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-position-container___cEpbv_3-3-62{
|
|
257
257
|
box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-invalid-v26-0-2);
|
|
258
258
|
background-color:var(--magritte-color-component-input-background-state-field-invalid-v26-0-2);
|
|
259
259
|
}
|
|
260
|
-
.magritte-textarea___ugvor_3-3-
|
|
260
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-native-element___a0RAE_3-3-62{
|
|
261
261
|
color:var(--magritte-color-component-input-text-state-content-invalid-v26-0-2);
|
|
262
262
|
-webkit-text-fill-color:var(--magritte-color-component-input-text-state-content-invalid-v26-0-2);
|
|
263
263
|
opacity:1;
|
|
264
264
|
}
|
|
265
|
-
.magritte-textarea___ugvor_3-3-
|
|
265
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-label___sgTIH_3-3-62{
|
|
266
266
|
color:var(--magritte-color-component-input-text-state-placeholder-invalid-v26-0-2);
|
|
267
267
|
}
|
|
268
|
-
.magritte-textarea___ugvor_3-3-
|
|
268
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-label-elevated___0lxOI_3-3-62{
|
|
269
269
|
color:var(--magritte-color-component-input-text-state-label-invalid-v26-0-2);
|
|
270
270
|
}
|
|
271
|
-
.magritte-textarea___ugvor_3-3-
|
|
271
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62{
|
|
272
272
|
background-color:var(--magritte-color-component-input-background-state-field-invalid-v26-0-2);
|
|
273
273
|
}
|
|
274
|
-
.magritte-textarea___ugvor_3-3-
|
|
274
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62{
|
|
275
275
|
--magritte-ui-text-color-override:var(--magritte-color-component-input-text-state-limit-invalid-v26-0-2);
|
|
276
276
|
}
|
|
277
|
-
.magritte-textarea___ugvor_3-3-
|
|
277
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62{
|
|
278
278
|
--magritte-ui-form-helper-description-color-override:var(--magritte-color-component-input-text-state-description-disabled-v26-0-2);
|
|
279
279
|
}
|
|
280
|
-
.magritte-textarea___ugvor_3-3-
|
|
280
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after{
|
|
281
281
|
border-bottom-color:var(--magritte-color-component-input-stroke-state-field-disabled-v26-0-2);
|
|
282
282
|
border-right-color:var(--magritte-color-component-input-stroke-state-field-disabled-v26-0-2);
|
|
283
283
|
border-width:1px;
|
|
284
284
|
background-color:var(--magritte-color-component-input-background-state-field-disabled-v26-0-2);
|
|
285
285
|
}
|
|
286
|
-
.magritte-textarea___ugvor_3-3-
|
|
286
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-textarea-position-container___cEpbv_3-3-62{
|
|
287
287
|
box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-state-field-disabled-v26-0-2);
|
|
288
288
|
background-color:var(--magritte-color-component-input-background-state-field-disabled-v26-0-2);
|
|
289
289
|
}
|
|
290
|
-
.magritte-textarea___ugvor_3-3-
|
|
290
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-native-element___a0RAE_3-3-62{
|
|
291
291
|
color:var(--magritte-color-component-input-text-state-content-disabled-v26-0-2);
|
|
292
292
|
-webkit-text-fill-color:var(--magritte-color-component-input-text-state-content-disabled-v26-0-2);
|
|
293
293
|
opacity:1;
|
|
294
294
|
}
|
|
295
|
-
.magritte-textarea___ugvor_3-3-
|
|
295
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-textarea-label___sgTIH_3-3-62{
|
|
296
296
|
color:var(--magritte-color-component-input-text-state-placeholder-disabled-v26-0-2);
|
|
297
297
|
}
|
|
298
|
-
.magritte-textarea___ugvor_3-3-
|
|
298
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-textarea-label-elevated___0lxOI_3-3-62{
|
|
299
299
|
color:var(--magritte-color-component-input-text-state-label-disabled-v26-0-2);
|
|
300
300
|
}
|
|
301
|
-
.magritte-textarea___ugvor_3-3-
|
|
301
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62{
|
|
302
302
|
background-color:var(--magritte-color-component-input-background-state-field-disabled-v26-0-2);
|
|
303
303
|
}
|
|
304
|
-
.magritte-textarea___ugvor_3-3-
|
|
304
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-textarea-limit___IjPJy_3-3-62{
|
|
305
305
|
--magritte-ui-text-color-override:var(--magritte-color-component-input-text-state-limit-disabled-v26-0-2);
|
|
306
306
|
}
|
|
307
|
-
.magritte-textarea___ugvor_3-3-
|
|
308
|
-
.magritte-textarea___ugvor_3-3-
|
|
307
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-textarea-position-container___cEpbv_3-3-62,
|
|
308
|
+
.magritte-textarea___ugvor_3-3-62.magritte-textarea-disabled___XN0cg_3-3-62 .magritte-native-element___a0RAE_3-3-62{
|
|
309
309
|
cursor:not-allowed;
|
|
310
310
|
}
|
|
311
311
|
@media (prefers-reduced-motion){
|
|
312
|
-
.magritte-textarea___ugvor_3-3-
|
|
312
|
+
.magritte-textarea___ugvor_3-3-62{
|
|
313
313
|
--animation-100-duration:1ms;
|
|
314
314
|
--animation-300-duration:1ms;
|
|
315
315
|
}
|
|
316
316
|
}
|
|
317
|
-
.magritte-textarea-position-container-wrapper___4Dsui_3-3-
|
|
317
|
+
.magritte-textarea-position-container-wrapper___4Dsui_3-3-62{
|
|
318
318
|
display:inline-flex;
|
|
319
319
|
position:relative;
|
|
320
320
|
overflow:hidden;
|
|
@@ -322,14 +322,14 @@
|
|
|
322
322
|
border-radius:12px;
|
|
323
323
|
--magritte-ui-scrollbar-border-radius:12px;
|
|
324
324
|
}
|
|
325
|
-
.magritte-textarea-position-container-wrapper___4Dsui_3-3-
|
|
325
|
+
.magritte-textarea-position-container-wrapper___4Dsui_3-3-62.focus-visible{
|
|
326
326
|
outline:var(--magritte-color-component-input-stroke-state-accent-focused-accessible-v26-0-2) solid 4px;
|
|
327
327
|
}
|
|
328
|
-
.magritte-textarea-invalid___iKOPh_3-3-
|
|
329
|
-
.magritte-textarea-limit-error___vLvZU_3-3-
|
|
328
|
+
.magritte-textarea-invalid___iKOPh_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62.focus-visible,
|
|
329
|
+
.magritte-textarea-limit-error___vLvZU_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62.focus-visible{
|
|
330
330
|
outline-color:var(--magritte-color-component-input-stroke-state-negative-focused-accessible-v26-0-2);
|
|
331
331
|
}
|
|
332
|
-
.magritte-textarea-position-container-wrapper___4Dsui_3-3-
|
|
332
|
+
.magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after{
|
|
333
333
|
display:none;
|
|
334
334
|
pointer-events:none;
|
|
335
335
|
user-select:none;
|
|
@@ -344,10 +344,10 @@
|
|
|
344
344
|
border-bottom:1px solid var(--magritte-color-component-input-stroke-field-v26-0-2);
|
|
345
345
|
border-right:1px solid var(--magritte-color-component-input-stroke-field-v26-0-2);
|
|
346
346
|
}
|
|
347
|
-
.magritte-has-grip___ATMYQ_3-3-
|
|
347
|
+
.magritte-has-grip___ATMYQ_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62::after{
|
|
348
348
|
display:block;
|
|
349
349
|
}
|
|
350
|
-
.magritte-native-element___a0RAE_3-3-
|
|
350
|
+
.magritte-native-element___a0RAE_3-3-62{
|
|
351
351
|
box-sizing:border-box;
|
|
352
352
|
border:0;
|
|
353
353
|
width:100%;
|
|
@@ -375,11 +375,11 @@
|
|
|
375
375
|
background:none;
|
|
376
376
|
appearance:none;
|
|
377
377
|
}
|
|
378
|
-
.magritte-native-element___a0RAE_3-3-
|
|
378
|
+
.magritte-native-element___a0RAE_3-3-62::-webkit-scrollbar{
|
|
379
379
|
display:none;
|
|
380
380
|
}
|
|
381
|
-
.magritte-textarea-medium___GNzAm_3-3-
|
|
382
|
-
.magritte-textarea-large___ugT-5_3-3-
|
|
381
|
+
.magritte-textarea-medium___GNzAm_3-3-62 .magritte-native-element___a0RAE_3-3-62,
|
|
382
|
+
.magritte-textarea-large___ugT-5_3-3-62 .magritte-native-element___a0RAE_3-3-62{
|
|
383
383
|
font-family:"hh sans";
|
|
384
384
|
font-weight:400;
|
|
385
385
|
line-height:22px;
|
|
@@ -389,45 +389,45 @@
|
|
|
389
389
|
text-transform:none;
|
|
390
390
|
text-decoration:none;
|
|
391
391
|
}
|
|
392
|
-
.magritte-native-element___a0RAE_3-3-
|
|
392
|
+
.magritte-native-element___a0RAE_3-3-62:focus{
|
|
393
393
|
outline:none;
|
|
394
394
|
}
|
|
395
|
-
.magritte-textarea-layout-fill-both___ERS-q_3-3-
|
|
396
|
-
.magritte-textarea-layout-fill-vertical___HmNtp_3-3-
|
|
397
|
-
.magritte-textarea-layout-fill-horizontal___imBH2_3-3-
|
|
395
|
+
.magritte-textarea-layout-fill-both___ERS-q_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62,
|
|
396
|
+
.magritte-textarea-layout-fill-vertical___HmNtp_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62,
|
|
397
|
+
.magritte-textarea-layout-fill-horizontal___imBH2_3-3-62 .magritte-textarea-position-container-wrapper___4Dsui_3-3-62{
|
|
398
398
|
flex:1;
|
|
399
399
|
}
|
|
400
|
-
.magritte-textarea-layout-fill-both___ERS-q_3-3-
|
|
400
|
+
.magritte-textarea-layout-fill-both___ERS-q_3-3-62{
|
|
401
401
|
width:100%;
|
|
402
402
|
height:100%;
|
|
403
403
|
}
|
|
404
|
-
.magritte-textarea-layout-fill-vertical___HmNtp_3-3-
|
|
404
|
+
.magritte-textarea-layout-fill-vertical___HmNtp_3-3-62{
|
|
405
405
|
height:100%;
|
|
406
406
|
}
|
|
407
|
-
.magritte-textarea-layout-fill-horizontal___imBH2_3-3-
|
|
408
|
-
.magritte-textarea-layout-hug___tdCMY_3-3-
|
|
407
|
+
.magritte-textarea-layout-fill-horizontal___imBH2_3-3-62,
|
|
408
|
+
.magritte-textarea-layout-hug___tdCMY_3-3-62{
|
|
409
409
|
width:100%;
|
|
410
410
|
}
|
|
411
411
|
@media (min-width: 1020px){
|
|
412
|
-
body.magritte-old-layout .magritte-textarea-layout-hug___tdCMY_3-3-
|
|
412
|
+
body.magritte-old-layout .magritte-textarea-layout-hug___tdCMY_3-3-62 .magritte-textarea-position-container___cEpbv_3-3-62{
|
|
413
413
|
max-height:var(--magritte-textarea-max-height, auto);
|
|
414
414
|
}
|
|
415
415
|
}
|
|
416
416
|
@media (min-width: 1024px){
|
|
417
|
-
body:not(.magritte-old-layout) .magritte-textarea-layout-hug___tdCMY_3-3-
|
|
417
|
+
body:not(.magritte-old-layout) .magritte-textarea-layout-hug___tdCMY_3-3-62 .magritte-textarea-position-container___cEpbv_3-3-62{
|
|
418
418
|
max-height:var(--magritte-textarea-max-height, auto);
|
|
419
419
|
}
|
|
420
420
|
}
|
|
421
|
-
.magritte-textarea-wrapper___yD7G6_3-3-
|
|
421
|
+
.magritte-textarea-wrapper___yD7G6_3-3-62{
|
|
422
422
|
display:grid;
|
|
423
423
|
width:100%;
|
|
424
424
|
}
|
|
425
|
-
.magritte-value-clone-wrapper___2ZZvS_3-3-
|
|
425
|
+
.magritte-value-clone-wrapper___2ZZvS_3-3-62{
|
|
426
426
|
grid-area:1 / 1 / 2 / 2;
|
|
427
427
|
min-height:0;
|
|
428
428
|
overflow:hidden;
|
|
429
429
|
}
|
|
430
|
-
.magritte-value-clone-container___PVM97_3-3-
|
|
430
|
+
.magritte-value-clone-container___PVM97_3-3-62{
|
|
431
431
|
margin:0;
|
|
432
432
|
box-sizing:border-box;
|
|
433
433
|
border:0;
|
|
@@ -455,11 +455,11 @@
|
|
|
455
455
|
visibility:hidden;
|
|
456
456
|
pointer-events:none;
|
|
457
457
|
}
|
|
458
|
-
.magritte-value-clone-container___PVM97_3-3-
|
|
458
|
+
.magritte-value-clone-container___PVM97_3-3-62::-webkit-scrollbar{
|
|
459
459
|
display:none;
|
|
460
460
|
}
|
|
461
|
-
.magritte-textarea-medium___GNzAm_3-3-
|
|
462
|
-
.magritte-textarea-large___ugT-5_3-3-
|
|
461
|
+
.magritte-textarea-medium___GNzAm_3-3-62 .magritte-value-clone-container___PVM97_3-3-62,
|
|
462
|
+
.magritte-textarea-large___ugT-5_3-3-62 .magritte-value-clone-container___PVM97_3-3-62{
|
|
463
463
|
font-family:"hh sans";
|
|
464
464
|
font-weight:400;
|
|
465
465
|
line-height:22px;
|
|
@@ -469,16 +469,16 @@
|
|
|
469
469
|
text-transform:none;
|
|
470
470
|
text-decoration:none;
|
|
471
471
|
}
|
|
472
|
-
.magritte-textarea-small___Q-tsg_3-3-
|
|
472
|
+
.magritte-textarea-small___Q-tsg_3-3-62 .magritte-side-padding___O-HUP_3-3-62{
|
|
473
473
|
padding:0 calc(12px - 2px);
|
|
474
474
|
}
|
|
475
|
-
.magritte-textarea-medium___GNzAm_3-3-
|
|
475
|
+
.magritte-textarea-medium___GNzAm_3-3-62 .magritte-side-padding___O-HUP_3-3-62{
|
|
476
476
|
padding:0 calc(16px - 2px);
|
|
477
477
|
}
|
|
478
|
-
.magritte-textarea-large___ugT-5_3-3-
|
|
478
|
+
.magritte-textarea-large___ugT-5_3-3-62 .magritte-side-padding___O-HUP_3-3-62{
|
|
479
479
|
padding:0 calc(16px - 2px);
|
|
480
480
|
}
|
|
481
|
-
.magritte-textarea-position-container___cEpbv_3-3-
|
|
481
|
+
.magritte-textarea-position-container___cEpbv_3-3-62{
|
|
482
482
|
display:inline-flex;
|
|
483
483
|
overflow:hidden;
|
|
484
484
|
position:relative;
|
|
@@ -490,19 +490,19 @@
|
|
|
490
490
|
box-shadow:inset 0 0 0 1px var(--magritte-color-component-input-stroke-field-v26-0-2);
|
|
491
491
|
padding:var(--magritte-ui-textarea-vertical-padding) 2px var(--magritte-ui-textarea-bottom-padding, var(--magritte-ui-textarea-vertical-padding));
|
|
492
492
|
}
|
|
493
|
-
.magritte-textarea-animation-timeout___zudbr_3-3-
|
|
494
|
-
.magritte-textarea-position-container___cEpbv_3-3-
|
|
493
|
+
.magritte-textarea-animation-timeout___zudbr_3-3-62,
|
|
494
|
+
.magritte-textarea-position-container___cEpbv_3-3-62{
|
|
495
495
|
transition-property:transform, color, font-size, letter-spacing;
|
|
496
496
|
transition-duration:var(--animation-100-duration);
|
|
497
497
|
transition-timing-function:var(--magritte-semantic-animation-ease-in-out-100-timing-function-v26-0-2);
|
|
498
498
|
--animation-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v26-0-2);
|
|
499
499
|
}
|
|
500
|
-
.magritte-textarea-rigging-container___-1S6i_3-3-
|
|
500
|
+
.magritte-textarea-rigging-container___-1S6i_3-3-62{
|
|
501
501
|
position:relative;
|
|
502
502
|
pointer-events:none;
|
|
503
503
|
grid-area:1 / 1 / 2 / 2;
|
|
504
504
|
}
|
|
505
|
-
.magritte-textarea-label___sgTIH_3-3-
|
|
505
|
+
.magritte-textarea-label___sgTIH_3-3-62{
|
|
506
506
|
font-family:"hh sans";
|
|
507
507
|
font-weight:400;
|
|
508
508
|
line-height:22px;
|
|
@@ -520,10 +520,10 @@
|
|
|
520
520
|
transition-duration:var(--animation-100-duration);
|
|
521
521
|
transition-timing-function:var(--magritte-semantic-animation-ease-in-out-100-timing-function-v26-0-2);
|
|
522
522
|
}
|
|
523
|
-
.magritte-label-no-wrap___RxZ3A_3-3-
|
|
523
|
+
.magritte-label-no-wrap___RxZ3A_3-3-62{
|
|
524
524
|
white-space:nowrap;
|
|
525
525
|
}
|
|
526
|
-
.magritte-textarea-label-elevated___0lxOI_3-3-
|
|
526
|
+
.magritte-textarea-label-elevated___0lxOI_3-3-62{
|
|
527
527
|
font-family:"hh sans";
|
|
528
528
|
font-weight:400;
|
|
529
529
|
line-height:18px;
|
|
@@ -535,7 +535,7 @@
|
|
|
535
535
|
color:var(--magritte-color-component-input-text-label-v26-0-2);
|
|
536
536
|
transform:translateY(calc(18px * -0.5));
|
|
537
537
|
}
|
|
538
|
-
.magritte-textarea-limit___IjPJy_3-3-
|
|
538
|
+
.magritte-textarea-limit___IjPJy_3-3-62{
|
|
539
539
|
position:absolute;
|
|
540
540
|
bottom:8px;
|
|
541
541
|
right:12px;
|
|
@@ -546,7 +546,7 @@
|
|
|
546
546
|
z-index:1;
|
|
547
547
|
--magritte-ui-text-color-override:var(--magritte-color-component-input-text-limit-v26-0-2);
|
|
548
548
|
}
|
|
549
|
-
.magritte-textarea-grip___iL7lq_3-3-
|
|
549
|
+
.magritte-textarea-grip___iL7lq_3-3-62{
|
|
550
550
|
position:absolute;
|
|
551
551
|
pointer-events:none;
|
|
552
552
|
display:inline-flex;
|
|
@@ -555,25 +555,25 @@
|
|
|
555
555
|
border-bottom-right-radius:12px;
|
|
556
556
|
--magritte-ui-icon-color-override:var(--magritte-color-component-input-icon-grip-v26-0-2);
|
|
557
557
|
}
|
|
558
|
-
.magritte-textarea-grip-icon___YK-9w_3-3-
|
|
558
|
+
.magritte-textarea-grip-icon___YK-9w_3-3-62{
|
|
559
559
|
display:inline-flex;
|
|
560
560
|
z-index:1;
|
|
561
561
|
}
|
|
562
562
|
@media (prefers-reduced-motion: no-preference){
|
|
563
|
-
.magritte-textarea-limit-enter___CygGz_3-3-
|
|
563
|
+
.magritte-textarea-limit-enter___CygGz_3-3-62{
|
|
564
564
|
opacity:0;
|
|
565
565
|
}
|
|
566
|
-
.magritte-textarea-limit-exit___RMp-R_3-3-
|
|
567
|
-
.magritte-textarea-limit-enter-active___8vN-t_3-3-
|
|
566
|
+
.magritte-textarea-limit-exit___RMp-R_3-3-62,
|
|
567
|
+
.magritte-textarea-limit-enter-active___8vN-t_3-3-62{
|
|
568
568
|
opacity:1;
|
|
569
569
|
}
|
|
570
|
-
.magritte-textarea-limit-enter-active___8vN-t_3-3-
|
|
570
|
+
.magritte-textarea-limit-enter-active___8vN-t_3-3-62{
|
|
571
571
|
transition-property:opacity;
|
|
572
572
|
transition-duration:var(--magritte-semantic-animation-ease-in-out-300-duration-v26-0-2);
|
|
573
573
|
transition-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v26-0-2);
|
|
574
574
|
--animation-duration:var(--magritte-semantic-animation-ease-in-out-300-duration-v26-0-2);
|
|
575
575
|
}
|
|
576
|
-
.magritte-textarea-limit-exit-active___a5kBr_3-3-
|
|
576
|
+
.magritte-textarea-limit-exit-active___a5kBr_3-3-62{
|
|
577
577
|
opacity:0;
|
|
578
578
|
transition-property:opacity;
|
|
579
579
|
transition-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v26-0-2);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hh.ru/magritte-ui-textarea",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.62",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"publishConfig": {
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "d3182e9c5671dcf62e80e756b6701ec9f72cd7d0"
|
|
48
48
|
}
|
package/types.d.ts
CHANGED
|
@@ -21,6 +21,12 @@ export type TextAreaGrowLimiterProps = PropsWithChildren<{
|
|
|
21
21
|
* Функция вызываемая после снятия метрик с контейнера.
|
|
22
22
|
*/
|
|
23
23
|
postMeasurement?: VoidFunction;
|
|
24
|
+
/**
|
|
25
|
+
* Отключает ограничение роста: обертка остается в DOM, но не измеряет контейнер и не ограничивает высоту
|
|
26
|
+
* вложенных `TextArea`. Позволяет не перемонтировать содержимое, когда ограничение нужно только в части случаев.
|
|
27
|
+
* @default false
|
|
28
|
+
*/
|
|
29
|
+
disabled?: boolean;
|
|
24
30
|
style?: HTMLAttributes<HTMLDivElement>['style'];
|
|
25
31
|
className?: HTMLAttributes<HTMLDivElement>['className'];
|
|
26
32
|
}> & HTMLAttributes<HTMLDivElement>;
|
package/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["src/types.ts"],"sourcesContent":["import type {\n ReactNode,\n FocusEventHandler,\n ChangeEventHandler,\n PropsWithChildren,\n RefObject,\n HTMLAttributes,\n} from 'react';\n\nexport type TextAreaGrowLimiterProps = PropsWithChildren<{\n /**\n * Ссылка на контейнер, который должен ограничивать высоту TextArea.\n * Если не указан, то используется непосредственный родитель компонента в DOM\n * */\n containerRef?: RefObject<HTMLElement>;\n /**\n * Применять ли дебаунс при пересчете размера TextArea.\n * Если вы ожидаете, что для изменения размера контента или контейнера будет использоваться анимация, то имеет\n * смысл использовать дебаунс для вызова перерасчета. В случае если анимации нет дебаунс можно не использовать.\n */\n debounce?: boolean;\n /**\n * Функция вызываемая перед снятием метрик с контейнера. Может понадобиться при наличии кастомной логики на\n * контейнере. Например если контейнер фиксирует свой размер, но при изменении размера контента подстраивает свой\n * размер под него. В этом случае перед съемом метрик может понадобиться убрать фиксированный размер на контейнере.\n */\n preMeasurement?: VoidFunction;\n /**\n * Функция вызываемая после снятия метрик с контейнера.\n */\n postMeasurement?: VoidFunction;\n style?: HTMLAttributes<HTMLDivElement>['style'];\n className?: HTMLAttributes<HTMLDivElement>['className'];\n}> &\n HTMLAttributes<HTMLDivElement>;\n\nexport type TextAreaSize = 'small' | 'medium' | 'large';\nexport type TextAreaLayout = 'fixed' | 'hug' | 'fill-vertical' | 'fill-horizontal' | 'fill-both';\n\nexport type BaseTextAreaProps<Layout extends TextAreaLayout> = {\n /** Текст плейсхолдера */\n placeholder?: ReactNode;\n /** Обработчик события получения фокуса */\n onFocus?: FocusEventHandler<HTMLTextAreaElement>;\n /** Обработчик события потери фокуса */\n onBlur?: FocusEventHandler<HTMLTextAreaElement>;\n /** Текст подсказки под textarea */\n description?: ReactNode;\n /** Текст сообщения об ошибке */\n errorMessage?: ReactNode;\n /** Флаг отключения textarea */\n disabled?: boolean;\n /** Признак невалидности */\n invalid?: boolean;\n /** Признак невалидности по лимиту */\n invalidLimit?: boolean;\n /** Флаг управляющий режимом отображения полейсхолдера */\n elevatePlaceholder?: boolean;\n /** Определяет отступы и типографику компонента */\n size?: TextAreaSize;\n /** Лимит на количество символов, отображает текущее состояние и лимит */\n maxLength?: number;\n /** Функция для связывания внешней валидации с внутренней */\n onValidate?: (invalidState: { invalidLimit: boolean }) => void;\n /** Позволяет задать в каком направлении допустимо ручное изменение размера. Доступно только с `layout=\"fixed\"` */\n resize?: Layout extends 'fixed' ? 'none' | 'both' | 'horizontal' | 'vertical' : 'none';\n layout?: Layout;\n /** Позволяет задать максимальную высоту при `layout=\"hug\"`. Если значение равно 0 высота не ограничена. */\n maxHeight?: Layout extends 'hug' ? number : never;\n} & TextAreaSizes<Layout>;\n\ntype TextAreaSizes<\n Layout extends TextAreaLayout = 'fixed',\n AllowBothHeight extends boolean = Layout extends 'hug' ? true : false,\n> =\n | { size: 'small'; minHeight?: AllowBothHeight extends true ? 40 | 80 : 80 }\n | { size: 'medium'; minHeight?: AllowBothHeight extends true ? 48 | 96 : 96 }\n | { size?: 'large'; minHeight?: AllowBothHeight extends true ? 56 | 112 : 112 };\n\nexport interface ControlledProps {\n /** Обработчик события изменения */\n onChange: ChangeEventHandler<HTMLTextAreaElement>;\n /** Значение textarea */\n value: string;\n}\n\nexport type UncontrolledTextAreaProps<Layout extends TextAreaLayout> = Partial<ControlledProps> &\n BaseTextAreaProps<Layout>;\n\nexport type ControlledTextAreaProps<Layout extends TextAreaLayout> = BaseTextAreaProps<Layout> & ControlledProps;\n\nexport const MIN_HEIGHT_BY_SIZE = {\n small: [40, 80],\n medium: [48, 96],\n large: [56, 112],\n} as const;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sources":["src/types.ts"],"sourcesContent":["import type {\n ReactNode,\n FocusEventHandler,\n ChangeEventHandler,\n PropsWithChildren,\n RefObject,\n HTMLAttributes,\n} from 'react';\n\nexport type TextAreaGrowLimiterProps = PropsWithChildren<{\n /**\n * Ссылка на контейнер, который должен ограничивать высоту TextArea.\n * Если не указан, то используется непосредственный родитель компонента в DOM\n * */\n containerRef?: RefObject<HTMLElement>;\n /**\n * Применять ли дебаунс при пересчете размера TextArea.\n * Если вы ожидаете, что для изменения размера контента или контейнера будет использоваться анимация, то имеет\n * смысл использовать дебаунс для вызова перерасчета. В случае если анимации нет дебаунс можно не использовать.\n */\n debounce?: boolean;\n /**\n * Функция вызываемая перед снятием метрик с контейнера. Может понадобиться при наличии кастомной логики на\n * контейнере. Например если контейнер фиксирует свой размер, но при изменении размера контента подстраивает свой\n * размер под него. В этом случае перед съемом метрик может понадобиться убрать фиксированный размер на контейнере.\n */\n preMeasurement?: VoidFunction;\n /**\n * Функция вызываемая после снятия метрик с контейнера.\n */\n postMeasurement?: VoidFunction;\n /**\n * Отключает ограничение роста: обертка остается в DOM, но не измеряет контейнер и не ограничивает высоту\n * вложенных `TextArea`. Позволяет не перемонтировать содержимое, когда ограничение нужно только в части случаев.\n * @default false\n */\n disabled?: boolean;\n style?: HTMLAttributes<HTMLDivElement>['style'];\n className?: HTMLAttributes<HTMLDivElement>['className'];\n}> &\n HTMLAttributes<HTMLDivElement>;\n\nexport type TextAreaSize = 'small' | 'medium' | 'large';\nexport type TextAreaLayout = 'fixed' | 'hug' | 'fill-vertical' | 'fill-horizontal' | 'fill-both';\n\nexport type BaseTextAreaProps<Layout extends TextAreaLayout> = {\n /** Текст плейсхолдера */\n placeholder?: ReactNode;\n /** Обработчик события получения фокуса */\n onFocus?: FocusEventHandler<HTMLTextAreaElement>;\n /** Обработчик события потери фокуса */\n onBlur?: FocusEventHandler<HTMLTextAreaElement>;\n /** Текст подсказки под textarea */\n description?: ReactNode;\n /** Текст сообщения об ошибке */\n errorMessage?: ReactNode;\n /** Флаг отключения textarea */\n disabled?: boolean;\n /** Признак невалидности */\n invalid?: boolean;\n /** Признак невалидности по лимиту */\n invalidLimit?: boolean;\n /** Флаг управляющий режимом отображения полейсхолдера */\n elevatePlaceholder?: boolean;\n /** Определяет отступы и типографику компонента */\n size?: TextAreaSize;\n /** Лимит на количество символов, отображает текущее состояние и лимит */\n maxLength?: number;\n /** Функция для связывания внешней валидации с внутренней */\n onValidate?: (invalidState: { invalidLimit: boolean }) => void;\n /** Позволяет задать в каком направлении допустимо ручное изменение размера. Доступно только с `layout=\"fixed\"` */\n resize?: Layout extends 'fixed' ? 'none' | 'both' | 'horizontal' | 'vertical' : 'none';\n layout?: Layout;\n /** Позволяет задать максимальную высоту при `layout=\"hug\"`. Если значение равно 0 высота не ограничена. */\n maxHeight?: Layout extends 'hug' ? number : never;\n} & TextAreaSizes<Layout>;\n\ntype TextAreaSizes<\n Layout extends TextAreaLayout = 'fixed',\n AllowBothHeight extends boolean = Layout extends 'hug' ? true : false,\n> =\n | { size: 'small'; minHeight?: AllowBothHeight extends true ? 40 | 80 : 80 }\n | { size: 'medium'; minHeight?: AllowBothHeight extends true ? 48 | 96 : 96 }\n | { size?: 'large'; minHeight?: AllowBothHeight extends true ? 56 | 112 : 112 };\n\nexport interface ControlledProps {\n /** Обработчик события изменения */\n onChange: ChangeEventHandler<HTMLTextAreaElement>;\n /** Значение textarea */\n value: string;\n}\n\nexport type UncontrolledTextAreaProps<Layout extends TextAreaLayout> = Partial<ControlledProps> &\n BaseTextAreaProps<Layout>;\n\nexport type ControlledTextAreaProps<Layout extends TextAreaLayout> = BaseTextAreaProps<Layout> & ControlledProps;\n\nexport const MIN_HEIGHT_BY_SIZE = {\n small: [40, 80],\n medium: [48, 96],\n large: [56, 112],\n} as const;\n"],"names":[],"mappings":"AAiGO,MAAM,kBAAqB,GAAA;AAAA,EAC9B,KAAA,EAAO,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,EACd,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA;AAAA,EACf,KAAA,EAAO,CAAC,EAAA,EAAI,GAAG,CAAA;AACnB;;;;"}
|
package/useLimitGrow.d.ts
CHANGED
|
@@ -7,8 +7,9 @@ type UseLimitGrowArgs = {
|
|
|
7
7
|
resizableDivRef: RefObject<HTMLElement>;
|
|
8
8
|
textAreaRef: RefObject<HTMLTextAreaElement>;
|
|
9
9
|
minHeight: number;
|
|
10
|
+
maxedHeight: boolean;
|
|
10
11
|
};
|
|
11
|
-
export declare const useLimitGrow: ({ layout, contentCloneRef, contentCloneWrapperRef, resizableDivRef, textAreaRef, minHeight, }: UseLimitGrowArgs) => {
|
|
12
|
+
export declare const useLimitGrow: ({ layout, contentCloneRef, contentCloneWrapperRef, resizableDivRef, textAreaRef, minHeight, maxedHeight, }: UseLimitGrowArgs) => {
|
|
12
13
|
maxHeightRef: RefObject<string>;
|
|
13
14
|
allowScrollRef: RefObject<boolean>;
|
|
14
15
|
};
|
package/useLimitGrow.js
CHANGED
|
@@ -11,17 +11,24 @@ const useLimitGrow = ({
|
|
|
11
11
|
contentCloneWrapperRef,
|
|
12
12
|
resizableDivRef,
|
|
13
13
|
textAreaRef,
|
|
14
|
-
minHeight
|
|
14
|
+
minHeight,
|
|
15
|
+
maxedHeight
|
|
15
16
|
}) => {
|
|
16
17
|
const growLimiterContext = useContext(GrowLimiterContext);
|
|
17
18
|
const allowScrollRef = useRef(false);
|
|
18
19
|
const maxHeightRef = useRef(null);
|
|
20
|
+
const limitAppliedRef = useRef(false);
|
|
19
21
|
if (layout !== "hug" || !growLimiterContext.hasLimit) {
|
|
20
22
|
maxHeightRef.current = null;
|
|
21
23
|
allowScrollRef.current = true;
|
|
22
24
|
}
|
|
23
25
|
useLayoutEffect(() => {
|
|
24
26
|
if (layout !== "hug" || !contentCloneRef.current || !growLimiterContext.hasLimit) {
|
|
27
|
+
if (limitAppliedRef.current) {
|
|
28
|
+
limitAppliedRef.current = false;
|
|
29
|
+
textAreaRef.current && (textAreaRef.current.style.overflowY = "auto");
|
|
30
|
+
resizableDivRef.current && (resizableDivRef.current.style.height = maxedHeight ? "auto" : `${minHeight}px`);
|
|
31
|
+
}
|
|
25
32
|
return void 0;
|
|
26
33
|
}
|
|
27
34
|
const applyHeightLimit = () => {
|
|
@@ -38,6 +45,7 @@ const useLimitGrow = ({
|
|
|
38
45
|
textAreaRef.current.style.overflowY = allowScrollRef.current ? "auto" : "hidden";
|
|
39
46
|
resizableDivRef.current.style.height = `${appliedHeight}px`;
|
|
40
47
|
maxHeightRef.current = `${appliedHeight}px`;
|
|
48
|
+
limitAppliedRef.current = true;
|
|
41
49
|
if (appliedHeight !== height) {
|
|
42
50
|
growLimiterContext.heightUpdated();
|
|
43
51
|
}
|
|
@@ -51,7 +59,16 @@ const useLimitGrow = ({
|
|
|
51
59
|
observer.disconnect();
|
|
52
60
|
context.offHeightChange(applyHeightLimit);
|
|
53
61
|
};
|
|
54
|
-
}, [
|
|
62
|
+
}, [
|
|
63
|
+
layout,
|
|
64
|
+
growLimiterContext,
|
|
65
|
+
contentCloneRef,
|
|
66
|
+
contentCloneWrapperRef,
|
|
67
|
+
resizableDivRef,
|
|
68
|
+
minHeight,
|
|
69
|
+
maxedHeight,
|
|
70
|
+
textAreaRef
|
|
71
|
+
]);
|
|
55
72
|
return { maxHeightRef, allowScrollRef };
|
|
56
73
|
};
|
|
57
74
|
|
package/useLimitGrow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useLimitGrow.js","sources":["src/useLimitGrow.ts"],"sourcesContent":["import { useRef, useContext, useLayoutEffect, type RefObject } from 'react';\n\nimport { GrowLimiterContext } from '@hh.ru/magritte-ui-textarea/TextAreaGrowLimiter';\nimport type { TextAreaLayout } from '@hh.ru/magritte-ui-textarea/types';\n\ntype UseLimitGrowArgs = {\n layout: TextAreaLayout;\n contentCloneRef: RefObject<HTMLElement>;\n contentCloneWrapperRef: RefObject<HTMLElement>;\n resizableDivRef: RefObject<HTMLElement>;\n textAreaRef: RefObject<HTMLTextAreaElement>;\n minHeight: number;\n};\n\nexport const useLimitGrow = ({\n layout,\n contentCloneRef,\n contentCloneWrapperRef,\n resizableDivRef,\n textAreaRef,\n minHeight,\n}: UseLimitGrowArgs): { maxHeightRef: RefObject<string>; allowScrollRef: RefObject<boolean> } => {\n const growLimiterContext = useContext(GrowLimiterContext);\n const allowScrollRef = useRef(false);\n const maxHeightRef = useRef<string | null>(null);\n\n if (layout !== 'hug' || !growLimiterContext.hasLimit) {\n maxHeightRef.current = null;\n allowScrollRef.current = true;\n }\n\n useLayoutEffect(() => {\n if (layout !== 'hug' || !contentCloneRef.current || !growLimiterContext.hasLimit) {\n return void 0;\n }\n\n const applyHeightLimit = () => {\n if (\n !resizableDivRef.current ||\n !contentCloneWrapperRef.current ||\n !contentCloneRef.current ||\n !textAreaRef.current\n ) {\n return;\n }\n\n // Сравниваем высоту контейнера содержащего клон контента текстарии и его обертки. Контейнер может свободно\n // менять высоту чтобы уместить весь контент. Обертка может только свободно уменьшаться, при увеличении\n // размера контента размер обертки не меняется. Вычитая одно из другого получаем положительное число равное\n // изменению размера контента если контент стал больше, и 0 если он уменьшился.\n const contentCloneHeight = contentCloneRef.current.offsetHeight;\n const contentCloneWrapperHeight = contentCloneWrapperRef.current.offsetHeight;\n const contentHeightDelta = contentCloneHeight - contentCloneWrapperHeight;\n // Размер внешнего контейнера текстарии\n const height = resizableDivRef.current.offsetHeight;\n\n // Получаем количество свободного пространства в контейнере которое можем занять до получения скролла\n // Число может быть отрицательным если в контейнере уже присутствует скролл, тогда это количество пикселей\n // на которое нужно уменьшить высоту контента чтобы скролл исчез.\n const heightDiff = growLimiterContext.getHeightDiff();\n // Вычисляем новую высоту внешнего контейнера как сумму его текущей высоты и дельты высоты контента.\n // Убеждаемся что добавляем к высоте текстарии не больше пикселей, чем доступно в контейнере до появления\n // скролла. В результате размер текстарии может уменьшиться, если в контейнере доступно отрицательное\n // количество пикселей до появления скролла (в случае если скролл уже появился из-за добавления другого\n // контента например).\n // Убеждаемся, что высота не стала меньше минимальной допустимой\n const appliedHeight = Math.max(height + Math.min(contentHeightDelta, heightDiff), minHeight);\n allowScrollRef.current = contentHeightDelta > heightDiff || heightDiff < 0;\n textAreaRef.current.style.overflowY = allowScrollRef.current ? 'auto' : 'hidden';\n resizableDivRef.current.style.height = `${appliedHeight}px`;\n maxHeightRef.current = `${appliedHeight}px`;\n if (appliedHeight !== height) {\n // При тестировании в хроме с 20x slowdown сброс кеша в height diff контексте не успевал сработать за\n // период дебаунса, из-за этого если зажать enter компонент мог стать больше по высоте чем контейнер\n // и ограничение срабатывало только после отпускания клавиши,поэтому добавил принудительный сброс кеша\n // при изменении размера компонента\n growLimiterContext.heightUpdated();\n }\n };\n\n const observer = new ResizeObserver(applyHeightLimit);\n // Запускаем процесс пересчета максимальной высоты текстарии каждый раз\n // когда вертикальный размер контента меняется\n observer.observe(contentCloneRef.current, { box: 'border-box' });\n const context = growLimiterContext;\n // Так же запускаем его когда меняется размер контейнера скролла в котором мы пытаемся избежать.\n // Или размер обертки которую создает TextAreaGrowLimiter, например вследствие добавления или удаления\n // контента рядом с текстарией.\n context.onHeightChange(applyHeightLimit);\n applyHeightLimit();\n\n return () => {\n observer.disconnect();\n context.offHeightChange(applyHeightLimit);\n };\n }, [layout
|
|
1
|
+
{"version":3,"file":"useLimitGrow.js","sources":["src/useLimitGrow.ts"],"sourcesContent":["import { useRef, useContext, useLayoutEffect, type RefObject } from 'react';\n\nimport { GrowLimiterContext } from '@hh.ru/magritte-ui-textarea/TextAreaGrowLimiter';\nimport type { TextAreaLayout } from '@hh.ru/magritte-ui-textarea/types';\n\ntype UseLimitGrowArgs = {\n layout: TextAreaLayout;\n contentCloneRef: RefObject<HTMLElement>;\n contentCloneWrapperRef: RefObject<HTMLElement>;\n resizableDivRef: RefObject<HTMLElement>;\n textAreaRef: RefObject<HTMLTextAreaElement>;\n minHeight: number;\n maxedHeight: boolean;\n};\n\nexport const useLimitGrow = ({\n layout,\n contentCloneRef,\n contentCloneWrapperRef,\n resizableDivRef,\n textAreaRef,\n minHeight,\n maxedHeight,\n}: UseLimitGrowArgs): { maxHeightRef: RefObject<string>; allowScrollRef: RefObject<boolean> } => {\n const growLimiterContext = useContext(GrowLimiterContext);\n const allowScrollRef = useRef(false);\n const maxHeightRef = useRef<string | null>(null);\n const limitAppliedRef = useRef(false);\n\n if (layout !== 'hug' || !growLimiterContext.hasLimit) {\n maxHeightRef.current = null;\n allowScrollRef.current = true;\n }\n\n useLayoutEffect(() => {\n if (layout !== 'hug' || !contentCloneRef.current || !growLimiterContext.hasLimit) {\n if (limitAppliedRef.current) {\n // Ограничение сняли на лету (например, TextAreaGrowLimiter выключили пропом disabled). React\n // перезаписывает style только при изменении пропа, поэтому значения, выставленные вручную в\n // applyHeightLimit, возвращаем к тем, что компонент рендерит без ограничения.\n limitAppliedRef.current = false;\n textAreaRef.current && (textAreaRef.current.style.overflowY = 'auto');\n resizableDivRef.current &&\n (resizableDivRef.current.style.height = maxedHeight ? 'auto' : `${minHeight}px`);\n }\n return void 0;\n }\n\n const applyHeightLimit = () => {\n if (\n !resizableDivRef.current ||\n !contentCloneWrapperRef.current ||\n !contentCloneRef.current ||\n !textAreaRef.current\n ) {\n return;\n }\n\n // Сравниваем высоту контейнера содержащего клон контента текстарии и его обертки. Контейнер может свободно\n // менять высоту чтобы уместить весь контент. Обертка может только свободно уменьшаться, при увеличении\n // размера контента размер обертки не меняется. Вычитая одно из другого получаем положительное число равное\n // изменению размера контента если контент стал больше, и 0 если он уменьшился.\n const contentCloneHeight = contentCloneRef.current.offsetHeight;\n const contentCloneWrapperHeight = contentCloneWrapperRef.current.offsetHeight;\n const contentHeightDelta = contentCloneHeight - contentCloneWrapperHeight;\n // Размер внешнего контейнера текстарии\n const height = resizableDivRef.current.offsetHeight;\n\n // Получаем количество свободного пространства в контейнере которое можем занять до получения скролла\n // Число может быть отрицательным если в контейнере уже присутствует скролл, тогда это количество пикселей\n // на которое нужно уменьшить высоту контента чтобы скролл исчез.\n const heightDiff = growLimiterContext.getHeightDiff();\n // Вычисляем новую высоту внешнего контейнера как сумму его текущей высоты и дельты высоты контента.\n // Убеждаемся что добавляем к высоте текстарии не больше пикселей, чем доступно в контейнере до появления\n // скролла. В результате размер текстарии может уменьшиться, если в контейнере доступно отрицательное\n // количество пикселей до появления скролла (в случае если скролл уже появился из-за добавления другого\n // контента например).\n // Убеждаемся, что высота не стала меньше минимальной допустимой\n const appliedHeight = Math.max(height + Math.min(contentHeightDelta, heightDiff), minHeight);\n allowScrollRef.current = contentHeightDelta > heightDiff || heightDiff < 0;\n textAreaRef.current.style.overflowY = allowScrollRef.current ? 'auto' : 'hidden';\n resizableDivRef.current.style.height = `${appliedHeight}px`;\n maxHeightRef.current = `${appliedHeight}px`;\n limitAppliedRef.current = true;\n if (appliedHeight !== height) {\n // При тестировании в хроме с 20x slowdown сброс кеша в height diff контексте не успевал сработать за\n // период дебаунса, из-за этого если зажать enter компонент мог стать больше по высоте чем контейнер\n // и ограничение срабатывало только после отпускания клавиши,поэтому добавил принудительный сброс кеша\n // при изменении размера компонента\n growLimiterContext.heightUpdated();\n }\n };\n\n const observer = new ResizeObserver(applyHeightLimit);\n // Запускаем процесс пересчета максимальной высоты текстарии каждый раз\n // когда вертикальный размер контента меняется\n observer.observe(contentCloneRef.current, { box: 'border-box' });\n const context = growLimiterContext;\n // Так же запускаем его когда меняется размер контейнера скролла в котором мы пытаемся избежать.\n // Или размер обертки которую создает TextAreaGrowLimiter, например вследствие добавления или удаления\n // контента рядом с текстарией.\n context.onHeightChange(applyHeightLimit);\n applyHeightLimit();\n\n return () => {\n observer.disconnect();\n context.offHeightChange(applyHeightLimit);\n };\n }, [\n layout,\n growLimiterContext,\n contentCloneRef,\n contentCloneWrapperRef,\n resizableDivRef,\n minHeight,\n maxedHeight,\n textAreaRef,\n ]);\n\n return { maxHeightRef, allowScrollRef };\n};\n"],"names":[],"mappings":"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"}
|