@zohodesk/components 1.0.0-temp-206.5 → 1.0.0-temp-207
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/.cli/propValidation_report.html +1 -1
- package/README.md +9 -0
- package/es/Accordion/Accordion.js +2 -2
- package/es/Accordion/AccordionItem.js +4 -4
- package/es/Accordion/__tests__/Accordion.spec.js +1 -1
- package/es/Accordion/__tests__/AccordionItem.spec.js +1 -1
- package/es/Accordion/index.js +2 -2
- package/es/Animation/Animation.js +3 -3
- package/es/Animation/__tests__/Animation.spec.js +1 -1
- package/es/Animation/utils.js +1 -1
- package/es/AppContainer/AppContainer.js +9 -9
- package/es/AppContainer/__tests__/AppContainer.spec.js +1 -1
- package/es/Avatar/Avatar.js +5 -5
- package/es/Avatar/__tests__/Avatar.spec.js +1 -1
- package/es/AvatarTeam/AvatarTeam.js +4 -4
- package/es/AvatarTeam/__tests__/AvatarTeam.spec.js +1 -1
- package/es/Button/Button.js +4 -4
- package/es/Button/__tests__/Button.spec.js +1 -1
- package/es/Button/index.js +2 -2
- package/es/Button/props/defaultProps.js +1 -1
- package/es/Buttongroup/Buttongroup.js +3 -3
- package/es/Buttongroup/__tests__/Buttongroup.spec.js +1 -1
- package/es/Card/Card.js +5 -5
- package/es/Card/__tests__/Card.spec.js +1 -1
- package/es/Card/index.js +4 -4
- package/es/CheckBox/CheckBox.js +6 -6
- package/es/CheckBox/__tests__/CheckBox.spec.js +1 -1
- package/es/DateTime/CalendarView.js +6 -6
- package/es/DateTime/DateTime.js +15 -15
- package/es/DateTime/DateTimePopupFooter.js +5 -5
- package/es/DateTime/DateTimePopupHeader.js +4 -4
- package/es/DateTime/DateWidget.js +17 -17
- package/es/DateTime/DaysRow.js +3 -3
- package/es/DateTime/Time.js +5 -5
- package/es/DateTime/YearView.js +6 -6
- package/es/DateTime/__tests__/CalendarView.spec.js +1 -1
- package/es/DateTime/__tests__/DateTime.spec.js +1 -1
- package/es/DateTime/__tests__/DateTimePopupFooter.spec.js +1 -1
- package/es/DateTime/__tests__/DateTimePopupHeader.spec.js +1 -1
- package/es/DateTime/__tests__/DateWidget.spec.js +1 -1
- package/es/DateTime/__tests__/DaysRow.spec.js +1 -1
- package/es/DateTime/__tests__/Time.spec.js +1 -1
- package/es/DateTime/__tests__/YearView.spec.js +1 -1
- package/es/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +1 -1
- package/es/DateTime/__tests__/__snapshots__/DateTimePopupHeader.spec.js.snap +1 -1
- package/es/DateTime/__tests__/__snapshots__/YearView.spec.js.snap +1 -1
- package/es/DateTime/dateFormatUtils/dateFormat.js +4 -4
- package/es/DateTime/dateFormatUtils/dayChange.js +2 -2
- package/es/DateTime/dateFormatUtils/index.js +3 -3
- package/es/DateTime/dateFormatUtils/monthChange.js +2 -2
- package/es/DateTime/dateFormatUtils/timeChange.js +2 -2
- package/es/DateTime/dateFormatUtils/yearChange.js +2 -2
- package/es/DateTime/index.js +1 -1
- package/es/DateTime/props/propTypes.js +1 -1
- package/es/DateTime/validator.js +2 -2
- package/es/DropBox/DropBox.js +9 -9
- package/es/DropBox/DropBoxElement/DropBoxElement.js +6 -6
- package/es/DropBox/DropBoxElement/__tests__/DropBoxElement.spec.js +1 -1
- package/es/DropBox/DropBoxElement/css/cssJSLogic.js +1 -1
- package/es/DropBox/DropBoxElement/useDropboxPosCalc.js +1 -1
- package/es/DropBox/__tests__/DropBox.spec.js +1 -1
- package/es/DropBox/css/cssJSLogic.js +1 -1
- package/es/DropBox/props/defaultProps.js +1 -1
- package/es/DropBox/props/propTypes.js +1 -1
- package/es/DropBox/utils/isMobilePopover.js +1 -1
- package/es/DropDown/DropDown.js +4 -4
- package/es/DropDown/DropDownHeading.js +3 -3
- package/es/DropDown/DropDownItem.js +3 -3
- package/es/DropDown/DropDownSearch.js +4 -4
- package/es/DropDown/DropDownSeparator.js +2 -2
- package/es/DropDown/__tests__/DropDown.spec.js +1 -1
- package/es/DropDown/__tests__/DropDownHeading.spec.js +1 -1
- package/es/DropDown/__tests__/DropDownItem.spec.js +1 -1
- package/es/DropDown/__tests__/DropDownSearch.spec.js +1 -1
- package/es/DropDown/__tests__/DropDownSeparator.spec.js +1 -1
- package/es/DropDown/index.js +7 -7
- package/es/DropDown/props/propTypes.js +1 -1
- package/es/Heading/Heading.js +8 -5
- package/es/Heading/__tests__/Heading.spec.js +10 -1
- package/es/Heading/__tests__/__snapshots__/Heading.spec.js.snap +55 -1
- package/es/Heading/props/propTypes.js +2 -1
- package/es/Label/Label.js +4 -4
- package/es/Label/__tests__/Label.spec.js +1 -1
- package/es/Layout/Box.js +4 -4
- package/es/Layout/Container.js +4 -4
- package/es/Layout/__tests__/Box.spec.js +1 -1
- package/es/Layout/__tests__/Container.spec.js +1 -1
- package/es/Layout/index.js +2 -2
- package/es/ListItem/ListContainer.js +6 -6
- package/es/ListItem/ListItem.js +5 -5
- package/es/ListItem/ListItemWithAvatar.js +7 -7
- package/es/ListItem/ListItemWithCheckBox.js +6 -6
- package/es/ListItem/ListItemWithIcon.js +5 -5
- package/es/ListItem/ListItemWithRadio.js +6 -6
- package/es/ListItem/__tests__/ListContainer.spec.js +1 -1
- package/es/ListItem/__tests__/ListItem.spec.js +1 -1
- package/es/ListItem/__tests__/ListItemWithAvatar.spec.js +1 -1
- package/es/ListItem/__tests__/ListItemWithCheckBox.spec.js +1 -1
- package/es/ListItem/__tests__/ListItemWithIcon.spec.js +1 -1
- package/es/ListItem/__tests__/ListItemWithRadio.spec.js +1 -1
- package/es/ListItem/index.js +6 -6
- package/es/Modal/Modal.js +3 -3
- package/es/Modal/__tests__/Modal.spec.js +1 -1
- package/es/MultiSelect/AdvancedGroupMultiSelect.js +17 -17
- package/es/MultiSelect/AdvancedMultiSelect.js +17 -17
- package/es/MultiSelect/EmptyState.js +3 -3
- package/es/MultiSelect/MobileHeader/MobileHeader.js +5 -5
- package/es/MultiSelect/MobileHeader/__tests__/MobileHeader.spec.js +1 -1
- package/es/MultiSelect/MultiSelect.js +20 -20
- package/es/MultiSelect/MultiSelectHeader.js +4 -4
- package/es/MultiSelect/MultiSelectWithAvatar.js +16 -16
- package/es/MultiSelect/SelectedOptions.js +5 -5
- package/es/MultiSelect/Suggestions.js +6 -6
- package/es/MultiSelect/__tests__/AdvancedGroupMultiSelect.spec.js +1 -1
- package/es/MultiSelect/__tests__/AdvancedMultiSelect.spec.js +1 -1
- package/es/MultiSelect/__tests__/EmptyState.spec.js +1 -1
- package/es/MultiSelect/__tests__/MultiSelect.spec.js +1 -1
- package/es/MultiSelect/__tests__/MultiSelectHeader.spec.js +1 -1
- package/es/MultiSelect/__tests__/MultiSelectWithAvatar.spec.js +1 -1
- package/es/MultiSelect/__tests__/SelectedOptions.spec.js +1 -1
- package/es/MultiSelect/__tests__/Suggestions.spec.js +1 -1
- package/es/MultiSelect/index.js +4 -4
- package/es/MultiSelect/props/defaultProps.js +1 -1
- package/es/PopOver/PopOver.js +6 -6
- package/es/PopOver/__tests__/PopOver.spec.js +1 -1
- package/es/PopOver/index.js +3 -3
- package/es/Popup/Popup.js +3 -3
- package/es/Provider/AvatarSize.js +1 -1
- package/es/Provider/CssProvider.js +1 -1
- package/es/Provider/IdProvider.js +2 -2
- package/es/Provider/LibraryContext.js +2 -2
- package/es/Provider/ZindexProvider.js +2 -2
- package/es/Provider/index.js +4 -4
- package/es/Radio/Radio.js +5 -5
- package/es/Radio/__tests__/Radio.spec.js +1 -1
- package/es/Responsive/CustomResponsive.js +12 -19
- package/es/Responsive/RefWrapper.js +1 -2
- package/es/Responsive/ResizeComponent.js +2 -2
- package/es/Responsive/Responsive.js +6 -6
- package/es/Responsive/index.js +3 -3
- package/es/Responsive/props/propTypes.js +1 -2
- package/es/Responsive/utils/index.js +1 -1
- package/es/Responsive/windowResizeObserver.js +1 -1
- package/es/ResponsiveDropBox/ResponsiveDropBox.js +6 -6
- package/es/ResponsiveDropBox/__tests__/ResponsiveDropBox.spec.js +1 -1
- package/es/ResponsiveDropBox/props/propTypes.js +1 -1
- package/es/Ribbon/Ribbon.js +3 -3
- package/es/Ribbon/__tests__/Ribbon.spec.js +1 -1
- package/es/RippleEffect/RippleEffect.js +4 -4
- package/es/RippleEffect/__tests__/RippleEffect.spec.js +1 -1
- package/es/Select/GroupSelect.js +16 -16
- package/es/Select/Select.js +15 -15
- package/es/Select/SelectWithAvatar.js +17 -17
- package/es/Select/SelectWithIcon.js +13 -13
- package/es/Select/__tests__/GroupSelect.spec.js +1 -1
- package/es/Select/__tests__/Select.spec.js +1 -1
- package/es/Select/__tests__/SelectWithAvatar.spec.js +1 -1
- package/es/Select/__tests__/SelectWithIcon.spec.js +1 -1
- package/es/Select/index.js +4 -4
- package/es/Select/props/defaultProps.js +1 -1
- package/es/Stencils/Stencils.js +3 -3
- package/es/Stencils/__tests__/Stencils.spec.js +1 -1
- package/es/Switch/Switch.js +5 -5
- package/es/Switch/__tests__/Switch.spec.js +1 -1
- package/es/Tab/Tab.js +5 -5
- package/es/Tab/TabContent.js +4 -4
- package/es/Tab/TabContentWrapper.js +3 -3
- package/es/Tab/TabWrapper.js +3 -3
- package/es/Tab/Tabs.js +16 -16
- package/es/Tab/Tabs.module.css +2 -2
- package/es/Tab/__tests__/Tab.spec.js +1 -1
- package/es/Tab/__tests__/TabContent.spec.js +1 -1
- package/es/Tab/__tests__/TabContentWrapper.spec.js +1 -1
- package/es/Tab/__tests__/TabWrapper.spec.js +1 -1
- package/es/Tab/__tests__/Tabs.spec.js +1 -1
- package/es/Tab/index.js +5 -5
- package/es/Tab/props/propTypes.js +2 -2
- package/es/Tag/Tag.js +7 -7
- package/es/Tag/__tests__/Tag.spec.js +1 -1
- package/es/TextBox/TextBox.js +3 -3
- package/es/TextBox/__tests__/TextBox.spec.js +1 -1
- package/es/TextBoxIcon/TextBoxIcon.js +6 -6
- package/es/TextBoxIcon/__tests__/TextBoxIcon.spec.js +1 -1
- package/es/TextBoxIcon/props/propTypes.js +1 -1
- package/es/Textarea/Textarea.js +154 -27
- package/es/Textarea/Textarea.module.css +55 -4
- package/es/Textarea/TextareaOne.js +349 -0
- package/es/Textarea/__tests__/Textarea.spec.js +1 -1
- package/es/Textarea/props/propTypes.js +4 -1
- package/es/Textarea/utils/calculateNodeHeight.js +58 -0
- package/es/Textarea/utils/calculateNodeHeightOne.js +66 -0
- package/es/Textarea/utils/debounce.js +24 -0
- package/es/Textarea/utils/getSizingData.js +27 -0
- package/es/Textarea/utils/ownerDocument.js +5 -0
- package/es/Textarea/utils/ownerWindow.js +8 -0
- package/es/Textarea/utils/updateState.js +30 -0
- package/es/Tooltip/Tooltip.js +17 -7
- package/es/Tooltip/Tooltip.module.css +0 -8
- package/es/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +3 -3
- package/es/VelocityAnimation/VelocityAnimation/__tests__/VelocityAnimation.spec.js +1 -1
- package/es/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +3 -3
- package/es/VelocityAnimation/VelocityAnimationGroup/__tests__/VelocityAnimationGroup.spec.js +1 -1
- package/es/VelocityAnimation/index.js +2 -2
- package/es/common/common.module.css +24 -0
- package/es/css.js +37 -37
- package/es/deprecated/PortalLayer/PortalLayer.js +3 -3
- package/es/index.js +39 -39
- package/es/semantic/Button/Button.js +3 -3
- package/es/semantic/Button/__tests__/Button.spec.js +1 -1
- package/es/semantic/index.js +1 -1
- package/es/utils/Common.js +1 -1
- package/es/utils/ContextOptimizer.js +1 -1
- package/es/utils/cssUtils.js +11 -0
- package/es/utils/datetime/common.js +1 -1
- package/es/utils/dropDownUtils.js +1 -1
- package/es/utils/index.js +1 -1
- package/es/v1/Accordion/Accordion.js +2 -2
- package/es/v1/Accordion/AccordionItem.js +4 -4
- package/es/v1/Accordion/index.js +2 -2
- package/es/v1/Animation/Animation.js +3 -3
- package/es/v1/Animation/utils.js +1 -1
- package/es/v1/AppContainer/AppContainer.js +9 -9
- package/es/v1/Avatar/Avatar.js +5 -5
- package/es/v1/AvatarTeam/AvatarTeam.js +4 -4
- package/es/v1/Button/Button.js +4 -4
- package/es/v1/Button/props/defaultProps.js +1 -1
- package/es/v1/Buttongroup/Buttongroup.js +3 -3
- package/es/v1/Card/Card.js +5 -5
- package/es/v1/Card/index.js +4 -4
- package/es/v1/CheckBox/CheckBox.js +6 -6
- package/es/v1/DateTime/CalendarView.js +7 -7
- package/es/v1/DateTime/DateTime.js +15 -15
- package/es/v1/DateTime/DateTimePopupFooter.js +5 -5
- package/es/v1/DateTime/DateTimePopupHeader.js +4 -4
- package/es/v1/DateTime/DateWidget.js +17 -17
- package/es/v1/DateTime/DaysRow.js +3 -3
- package/es/v1/DateTime/Time.js +5 -5
- package/es/v1/DateTime/YearView.js +6 -6
- package/es/v1/DateTime/index.js +1 -1
- package/es/v1/DateTime/props/propTypes.js +1 -1
- package/es/v1/DropBox/DropBox.js +9 -9
- package/es/v1/DropBox/DropBoxElement/DropBoxElement.js +6 -6
- package/es/v1/DropBox/props/defaultProps.js +1 -1
- package/es/v1/DropBox/props/propTypes.js +1 -1
- package/es/v1/DropBox/utils/isMobilePopover.js +1 -1
- package/es/v1/DropDown/DropDown.js +4 -4
- package/es/v1/DropDown/DropDownHeading.js +3 -3
- package/es/v1/DropDown/DropDownItem.js +3 -3
- package/es/v1/DropDown/DropDownSearch.js +4 -4
- package/es/v1/DropDown/DropDownSeparator.js +2 -2
- package/es/v1/DropDown/props/propTypes.js +1 -1
- package/es/v1/Heading/Heading.js +8 -5
- package/es/v1/Heading/props/propTypes.js +2 -1
- package/es/v1/Label/Label.js +4 -4
- package/es/v1/Layout/Box.js +4 -4
- package/es/v1/Layout/Container.js +4 -4
- package/es/v1/Layout/index.js +2 -2
- package/es/v1/ListItem/ListContainer.js +6 -6
- package/es/v1/ListItem/ListItem.js +5 -5
- package/es/v1/ListItem/ListItemWithAvatar.js +7 -7
- package/es/v1/ListItem/ListItemWithCheckBox.js +6 -6
- package/es/v1/ListItem/ListItemWithIcon.js +5 -5
- package/es/v1/ListItem/ListItemWithRadio.js +6 -6
- package/es/v1/ListItem/index.js +6 -6
- package/es/v1/Modal/Modal.js +3 -3
- package/es/v1/MultiSelect/AdvancedGroupMultiSelect.js +17 -17
- package/es/v1/MultiSelect/AdvancedMultiSelect.js +17 -17
- package/es/v1/MultiSelect/EmptyState.js +3 -3
- package/es/v1/MultiSelect/MobileHeader/MobileHeader.js +5 -5
- package/es/v1/MultiSelect/MultiSelect.js +19 -19
- package/es/v1/MultiSelect/MultiSelectHeader.js +4 -4
- package/es/v1/MultiSelect/MultiSelectWithAvatar.js +16 -16
- package/es/v1/MultiSelect/SelectedOptions.js +5 -5
- package/es/v1/MultiSelect/Suggestions.js +6 -6
- package/es/v1/MultiSelect/index.js +4 -4
- package/es/v1/MultiSelect/props/defaultProps.js +1 -1
- package/es/v1/PopOver/PopOver.js +6 -6
- package/es/v1/Popup/Popup.js +3 -3
- package/es/v1/Radio/Radio.js +5 -5
- package/es/v1/ResponsiveDropBox/ResponsiveDropBox.js +6 -6
- package/es/v1/ResponsiveDropBox/props/propTypes.js +1 -1
- package/es/v1/Ribbon/Ribbon.js +3 -3
- package/es/v1/RippleEffect/RippleEffect.js +4 -4
- package/es/v1/Select/GroupSelect.js +16 -16
- package/es/v1/Select/Select.js +15 -15
- package/es/v1/Select/SelectWithAvatar.js +17 -17
- package/es/v1/Select/SelectWithIcon.js +13 -13
- package/es/v1/Select/index.js +4 -4
- package/es/v1/Select/props/defaultProps.js +1 -1
- package/es/v1/Stencils/Stencils.js +3 -3
- package/es/v1/Switch/Switch.js +5 -5
- package/es/v1/Tab/Tab.js +5 -5
- package/es/v1/Tab/TabContent.js +4 -4
- package/es/v1/Tab/TabContentWrapper.js +3 -3
- package/es/v1/Tab/TabWrapper.js +3 -3
- package/es/v1/Tab/Tabs.js +16 -16
- package/es/v1/Tab/index.js +5 -5
- package/es/v1/Tab/props/propTypes.js +2 -2
- package/es/v1/Tab/v1Tabs.module.css +2 -2
- package/es/v1/Tag/Tag.js +7 -7
- package/es/v1/TextBox/TextBox.js +3 -3
- package/es/v1/TextBoxIcon/TextBoxIcon.js +6 -6
- package/es/v1/TextBoxIcon/props/propTypes.js +1 -1
- package/es/v1/Textarea/Textarea.js +3 -3
- package/es/v1/Tooltip/Tooltip.js +17 -7
- package/es/v1/Typography/Typography.js +4 -4
- package/es/v1/Typography/css/cssJSLogic.js +1 -1
- package/es/v1/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +3 -3
- package/es/v1/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +3 -3
- package/es/v1/semantic/Button/Button.js +3 -3
- package/es/v1/semantic/index.js +1 -1
- package/lib/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +1 -1
- package/lib/DateTime/__tests__/__snapshots__/DateTimePopupHeader.spec.js.snap +1 -1
- package/lib/DateTime/__tests__/__snapshots__/YearView.spec.js.snap +1 -1
- package/lib/Heading/Heading.js +7 -3
- package/lib/Heading/__tests__/Heading.spec.js +9 -0
- package/lib/Heading/__tests__/__snapshots__/Heading.spec.js.snap +55 -1
- package/lib/Heading/props/propTypes.js +2 -1
- package/lib/Responsive/CustomResponsive.js +5 -12
- package/lib/Responsive/RefWrapper.js +3 -4
- package/lib/Responsive/props/propTypes.js +1 -2
- package/lib/Tab/Tabs.js +54 -53
- package/lib/Tab/Tabs.module.css +2 -2
- package/lib/Tab/props/propTypes.js +2 -2
- package/lib/Textarea/Textarea.js +188 -43
- package/lib/Textarea/Textarea.module.css +55 -4
- package/lib/Textarea/TextareaOne.js +422 -0
- package/lib/Textarea/props/propTypes.js +4 -1
- package/lib/Textarea/utils/calculateNodeHeight.js +69 -0
- package/lib/Textarea/utils/calculateNodeHeightOne.js +74 -0
- package/lib/Textarea/utils/debounce.js +33 -0
- package/lib/Textarea/utils/getSizingData.js +37 -0
- package/lib/Textarea/utils/ownerDocument.js +13 -0
- package/lib/Textarea/utils/ownerWindow.js +18 -0
- package/lib/Textarea/utils/updateState.js +36 -0
- package/lib/Tooltip/Tooltip.js +15 -4
- package/lib/Tooltip/Tooltip.module.css +0 -8
- package/lib/common/common.module.css +24 -0
- package/lib/utils/cssUtils.js +22 -0
- package/lib/v1/Heading/Heading.js +7 -3
- package/lib/v1/Heading/props/propTypes.js +2 -1
- package/lib/v1/Tab/Tabs.js +3 -3
- package/lib/v1/Tab/props/propTypes.js +2 -2
- package/lib/v1/Tab/v1Tabs.module.css +2 -2
- package/lib/v1/Tooltip/Tooltip.js +15 -4
- package/package.json +8 -8
- package/result.json +1 -1
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
/* textarea placeholder default variable */
|
|
13
13
|
--textarea_placeholder_text_color: var(--zdt_textarea_placeholder_text);
|
|
14
14
|
}
|
|
15
|
+
|
|
15
16
|
.basic {
|
|
16
17
|
composes: varClass;
|
|
17
18
|
-webkit-appearance: none;
|
|
@@ -22,119 +23,169 @@
|
|
|
22
23
|
color: var(--textarea_text_color);
|
|
23
24
|
cursor: var(--textarea_cursor);
|
|
24
25
|
}
|
|
26
|
+
|
|
25
27
|
.basic, .noBorder {
|
|
26
28
|
border-width: var(--textarea_border_width);
|
|
27
29
|
}
|
|
30
|
+
|
|
28
31
|
.basic::placeholder {
|
|
29
32
|
color: var(--textarea_placeholder_text_color);
|
|
30
33
|
}
|
|
34
|
+
|
|
31
35
|
.basic::-webkit-placeholder {
|
|
32
36
|
color: var(--textarea_placeholder_text_color);
|
|
33
37
|
}
|
|
38
|
+
|
|
34
39
|
.basic::-moz-placeholder {
|
|
35
40
|
color: var(--textarea_placeholder_text_color);
|
|
36
41
|
}
|
|
42
|
+
|
|
37
43
|
.basic::-ms-placeholder {
|
|
38
44
|
color: var(--textarea_placeholder_text_color);
|
|
39
45
|
}
|
|
46
|
+
|
|
40
47
|
.basic:disabled {
|
|
41
48
|
--textarea_cursor: not-allowed;
|
|
42
49
|
--textarea_text_color: var(--zdt_textarea_default_text);
|
|
43
50
|
}
|
|
51
|
+
|
|
44
52
|
.readonly {
|
|
45
53
|
--textarea_cursor: not-allowed;
|
|
46
54
|
}
|
|
55
|
+
|
|
47
56
|
.resizeX {
|
|
48
57
|
composes: resizeX from '../common/common.module.css';
|
|
49
58
|
}
|
|
59
|
+
|
|
50
60
|
.resizeY {
|
|
51
61
|
composes: resizeY from '../common/common.module.css';
|
|
52
62
|
}
|
|
63
|
+
|
|
53
64
|
.noresize {
|
|
54
65
|
composes: resizenone from '../common/common.module.css';
|
|
55
66
|
}
|
|
67
|
+
|
|
56
68
|
.resizeboth {
|
|
57
69
|
composes: resizeboth from '../common/common.module.css';
|
|
58
70
|
}
|
|
71
|
+
|
|
59
72
|
/* css:lineheight-validation:ignore */
|
|
60
73
|
.container {
|
|
61
74
|
composes: basic;
|
|
62
|
-
transition:
|
|
75
|
+
transition: .3s;
|
|
76
|
+
/* transition: border var(--zd_transition2) linear 0s,
|
|
63
77
|
height var(--zd_transition2) linear 0s;
|
|
64
|
-
-
|
|
78
|
+
-webkit-transition: border var(--zd_transition2) linear 0s,
|
|
65
79
|
height var(--zd_transition2) linear 0s;
|
|
80
|
+
-moz-transition: border var(--zd_transition2) linear 0s,
|
|
81
|
+
height var(--zd_transition2) linear 0s; */
|
|
66
82
|
width: 100% ;
|
|
67
83
|
max-width: 100% ;
|
|
68
84
|
min-width: var(--zd_size100) ;
|
|
69
85
|
font-size: var(--textarea_font_size);
|
|
70
86
|
line-height: var(--textarea_line_height);
|
|
71
87
|
height: var(--textarea_height);
|
|
72
|
-
-webkit-transition: border var(--zd_transition2) linear 0s,
|
|
73
|
-
height var(--zd_transition2) linear 0s;
|
|
74
88
|
border-style: solid;
|
|
75
89
|
background-color: var(--zdt_textarea_default_bg);
|
|
76
90
|
border-color: var(--textarea_border_color);
|
|
77
91
|
padding: var(--textarea_padding);
|
|
78
92
|
}
|
|
93
|
+
|
|
79
94
|
.needBorder {
|
|
80
95
|
--textarea_border_width: 0 0 1px 0;
|
|
81
96
|
}
|
|
97
|
+
|
|
82
98
|
.borderColor_transparent {
|
|
83
99
|
--textarea_border_color: var(--zdt_textarea_transparent_border);
|
|
84
100
|
}
|
|
101
|
+
|
|
85
102
|
.borderColor_default {
|
|
86
103
|
--textarea_border_color: var(--zdt_textarea_default_border);
|
|
87
104
|
}
|
|
105
|
+
|
|
88
106
|
.effect:hover {
|
|
89
107
|
--textarea_border_color: var(--zdt_textarea_hover_border);
|
|
90
108
|
}
|
|
109
|
+
|
|
91
110
|
.effect:focus {
|
|
92
111
|
--textarea_border_color: var(--zdt_textarea_focus_border);
|
|
93
112
|
}
|
|
113
|
+
|
|
94
114
|
.xsmall,
|
|
95
115
|
.xmedium {
|
|
96
116
|
vertical-align: middle;
|
|
97
117
|
}
|
|
118
|
+
|
|
98
119
|
.xsmall {
|
|
99
120
|
--textarea_font_size: var(--zd_font_size14);
|
|
100
121
|
--textarea_padding: var(--zd_size4) 0 var(--zd_size2);
|
|
101
122
|
--textarea_height: var(--zd_size28);
|
|
102
123
|
--textarea_line_height: 1.3572;
|
|
103
124
|
}
|
|
125
|
+
|
|
104
126
|
.xmedium {
|
|
105
127
|
--textarea_font_size: var(--zd_font_size13);
|
|
106
128
|
--textarea_padding: var(--zd_size4) 0 var(--zd_size2);
|
|
107
129
|
--textarea_height: var(--zd_size25);
|
|
108
130
|
--textarea_line_height: 1.3077;
|
|
109
131
|
}
|
|
132
|
+
|
|
110
133
|
.small {
|
|
111
134
|
--textarea_height: var(--zd_size30);
|
|
112
135
|
--textarea_padding: var(--zd_size2) 0;
|
|
113
136
|
}
|
|
137
|
+
|
|
114
138
|
.smallanimated:focus,
|
|
115
139
|
.xsmallanimated:focus,
|
|
116
140
|
.xmediumanimated:focus {
|
|
117
141
|
--textarea_height: var(--zd_size70);
|
|
118
142
|
}
|
|
143
|
+
|
|
119
144
|
.medium {
|
|
120
145
|
--textarea_height: var(--zd_size88);
|
|
121
146
|
--textarea_padding: var(--zd_size2);
|
|
122
147
|
}
|
|
148
|
+
|
|
123
149
|
.large {
|
|
124
150
|
--textarea_height: var(--zd_size45);
|
|
125
151
|
--textarea_padding: var(--zd_size2);
|
|
126
152
|
}
|
|
153
|
+
|
|
127
154
|
.largeanimated:focus {
|
|
128
155
|
--textarea_height: var(--zd_size220);
|
|
129
156
|
}
|
|
157
|
+
|
|
130
158
|
.xlarge {
|
|
131
159
|
--textarea_height: var(--zd_size184);
|
|
132
160
|
}
|
|
161
|
+
|
|
133
162
|
.default {
|
|
134
163
|
font-family: var(--zd_regular);
|
|
135
164
|
--textarea_text_color: var(--zdt_textarea_black_text);
|
|
136
165
|
}
|
|
166
|
+
|
|
137
167
|
.primary {
|
|
138
168
|
composes: semibold from '../common/common.module.css';
|
|
139
169
|
--textarea_text_color: var(--zdt_textarea_black_text);
|
|
140
170
|
}
|
|
171
|
+
|
|
172
|
+
.forceHiddenStyle {
|
|
173
|
+
/* Visibility needed to hide the extra text area on iPads */
|
|
174
|
+
visibility: hidden;
|
|
175
|
+
/* Remove from the content flow */
|
|
176
|
+
position: absolute;
|
|
177
|
+
/* Ignore the scrollbar width */
|
|
178
|
+
overflow: hidden;
|
|
179
|
+
height: 0 ;
|
|
180
|
+
top: 0 ;
|
|
181
|
+
/* Create a new layer, increase the isolation of the computed values */
|
|
182
|
+
transform: translateZ(0);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
[dir=ltr] .forceHiddenStyle {
|
|
186
|
+
left: 0 ;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
[dir=rtl] .forceHiddenStyle {
|
|
190
|
+
right: 0 ;
|
|
191
|
+
}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ReactDOM from "react-dom";
|
|
3
|
+
import { defaultProps } from "./props/defaultProps";
|
|
4
|
+
import { propTypes } from "./props/propTypes";
|
|
5
|
+
/* eslint css-modules/no-unused-class: [2, { markAsUsed: ['resizeX', 'resizeY', 'noresize', 'resizeboth', 'xsmall', 'small', 'medium', 'large', 'xlarge', 'default', 'primary'] }] */
|
|
6
|
+
|
|
7
|
+
import style from "./Textarea.module.css";
|
|
8
|
+
import ownerWindow from "./ownerWindow";
|
|
9
|
+
import debounce from "./debounce";
|
|
10
|
+
const styles = {
|
|
11
|
+
shadow: {
|
|
12
|
+
// Visibility needed to hide the extra text area on iPads
|
|
13
|
+
visibility: "hidden",
|
|
14
|
+
// Remove from the content flow
|
|
15
|
+
position: "absolute",
|
|
16
|
+
// Ignore the scrollbar width
|
|
17
|
+
overflow: "hidden",
|
|
18
|
+
height: 0,
|
|
19
|
+
top: 0,
|
|
20
|
+
left: 0,
|
|
21
|
+
// Create a new layer, increase the isolation of the computed values
|
|
22
|
+
transform: "translateZ(0)"
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
export default class Textarea extends React.Component {
|
|
26
|
+
constructor(props) {
|
|
27
|
+
super(props);
|
|
28
|
+
this.onChange = this.onChange.bind(this);
|
|
29
|
+
this.onKeyDown = this.onKeyDown.bind(this);
|
|
30
|
+
this.onBlur = this.onBlur.bind(this);
|
|
31
|
+
this.inputRef = this.inputRef.bind(this);
|
|
32
|
+
this.getUpdatedState = this.getUpdatedState.bind(this);
|
|
33
|
+
this.isEmpty = this.isEmpty.bind(this);
|
|
34
|
+
this.getStyleValue = this.getStyleValue.bind(this);
|
|
35
|
+
this.updateState = this.updateState.bind(this);
|
|
36
|
+
this.syncHeight = this.syncHeight.bind(this);
|
|
37
|
+
this.syncHeightWithFlushSync = this.syncHeightWithFlushSync.bind(this);
|
|
38
|
+
this.handleResize = this.handleResize.bind(this);
|
|
39
|
+
this.rAFHandleResize = this.rAFHandleResize.bind(this);
|
|
40
|
+
this.rAF = null;
|
|
41
|
+
this.resizeObserver = null;
|
|
42
|
+
this.debounceHandleResize = null;
|
|
43
|
+
this.shadowRef = /*#__PURE__*/React.createRef();
|
|
44
|
+
this.rendersRef = /*#__PURE__*/React.createRef();
|
|
45
|
+
this.state = {
|
|
46
|
+
outerHeightStyle: 0,
|
|
47
|
+
overflow: false
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
onBlur(e) {
|
|
52
|
+
e && e.preventDefault();
|
|
53
|
+
let {
|
|
54
|
+
onBlur
|
|
55
|
+
} = this.props;
|
|
56
|
+
onBlur && onBlur(e.target.value, e);
|
|
57
|
+
this.syncHeight();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
onKeyDown(e) {
|
|
61
|
+
let {
|
|
62
|
+
onKeyDown
|
|
63
|
+
} = this.props;
|
|
64
|
+
onKeyDown && onKeyDown(e);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
inputRef(e) {
|
|
68
|
+
let {
|
|
69
|
+
getRef
|
|
70
|
+
} = this.props;
|
|
71
|
+
this.textareaRef = e;
|
|
72
|
+
getRef && getRef(e);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
isEmpty(obj) {
|
|
76
|
+
return obj === undefined || obj === null || Object.keys(obj).length === 0 || obj.outerHeightStyle === 0 && !obj.overflow;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
getStyleValue(value) {
|
|
80
|
+
return parseInt(value, 10) || 0;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
getUpdatedState() {
|
|
84
|
+
const {
|
|
85
|
+
minRows = 1,
|
|
86
|
+
maxRows = 5,
|
|
87
|
+
placeHolder
|
|
88
|
+
} = this.props;
|
|
89
|
+
const input = this.textareaRef;
|
|
90
|
+
const containerWindow = ownerWindow(input);
|
|
91
|
+
const computedStyle = containerWindow.getComputedStyle(input); // If input's width is shrunk and it's not visible, don't sync height.
|
|
92
|
+
|
|
93
|
+
if (computedStyle.width === "0px") {
|
|
94
|
+
return {
|
|
95
|
+
outerHeightStyle: 0
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const inputShallow = this.shadowRef.current;
|
|
100
|
+
inputShallow.style.width = computedStyle.width;
|
|
101
|
+
inputShallow.value = input.value || placeHolder || "x"; // if (inputShallow.value.slice(-1) === "\n") {
|
|
102
|
+
// Certain fonts which overflow the line height will cause the textarea
|
|
103
|
+
// to report a different scrollHeight depending on whether the last line
|
|
104
|
+
// is empty. Make it non-empty to avoid this issue.
|
|
105
|
+
// inputShallow.value += " ";
|
|
106
|
+
// }
|
|
107
|
+
|
|
108
|
+
const boxSizing = computedStyle.boxSizing;
|
|
109
|
+
const padding = this.getStyleValue(computedStyle.paddingBottom) + this.getStyleValue(computedStyle.paddingTop);
|
|
110
|
+
const border = this.getStyleValue(computedStyle.borderBottomWidth) + this.getStyleValue(computedStyle.borderTopWidth); // The height of the inner content
|
|
111
|
+
|
|
112
|
+
const innerHeight = inputShallow.scrollHeight; // Measure height of a textarea with a single row
|
|
113
|
+
|
|
114
|
+
inputShallow.value = "x";
|
|
115
|
+
const singleRowHeight = inputShallow.scrollHeight; // The height of the outer content
|
|
116
|
+
|
|
117
|
+
let outerHeight = innerHeight;
|
|
118
|
+
|
|
119
|
+
if (minRows) {
|
|
120
|
+
outerHeight = Math.max(Number(minRows) * singleRowHeight, outerHeight);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (maxRows) {
|
|
124
|
+
outerHeight = Math.min(Number(maxRows) * singleRowHeight, outerHeight);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
outerHeight = Math.max(outerHeight, singleRowHeight); // Take the box sizing into account for applying this value as a style.
|
|
128
|
+
|
|
129
|
+
const outerHeightStyle = outerHeight + (boxSizing === "border-box" ? padding + border : 0);
|
|
130
|
+
const overflow = Math.abs(outerHeight - innerHeight) <= 1;
|
|
131
|
+
console.log("outerHeightStyle-->", outerHeightStyle);
|
|
132
|
+
return {
|
|
133
|
+
outerHeightStyle,
|
|
134
|
+
overflow
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
updateState(prevState, newState) {
|
|
139
|
+
const {
|
|
140
|
+
outerHeightStyle,
|
|
141
|
+
overflow
|
|
142
|
+
} = newState;
|
|
143
|
+
const renders = this.rendersRef; // Need a large enough difference to update the height.
|
|
144
|
+
// This prevents infinite rendering loop.
|
|
145
|
+
|
|
146
|
+
if (renders.current < 20 && (outerHeightStyle > 0 && Math.abs((prevState.outerHeightStyle || 0) - outerHeightStyle) > 1 || prevState.overflow !== overflow)) {
|
|
147
|
+
renders.current += 1;
|
|
148
|
+
return {
|
|
149
|
+
overflow,
|
|
150
|
+
outerHeightStyle
|
|
151
|
+
};
|
|
152
|
+
} // if (process.env.NODE_ENV !== "production") {
|
|
153
|
+
// if (renders.current === 20) {
|
|
154
|
+
// console.error(
|
|
155
|
+
// [
|
|
156
|
+
// "MUI: Too many re-renders. The layout is unstable.",
|
|
157
|
+
// "TextareaAutosize limits the number of renders to prevent an infinite loop."
|
|
158
|
+
// ].join("\n")
|
|
159
|
+
// )
|
|
160
|
+
// }
|
|
161
|
+
// }
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
return prevState;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
syncHeight() {
|
|
168
|
+
const newState = this.getUpdatedState();
|
|
169
|
+
|
|
170
|
+
if (this.isEmpty(newState)) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
this.setState(prevState => this.updateState(prevState, newState));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
onChange(e) {
|
|
178
|
+
e && e.preventDefault();
|
|
179
|
+
let {
|
|
180
|
+
onChange,
|
|
181
|
+
text
|
|
182
|
+
} = this.props;
|
|
183
|
+
this.rendersRef.current = 0;
|
|
184
|
+
const isControlled = text !== undefined;
|
|
185
|
+
|
|
186
|
+
if (!isControlled) {
|
|
187
|
+
this.syncHeight();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
onChange && onChange(e.target.value, e);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
syncHeightWithFlushSync() {
|
|
194
|
+
const newState = this.getUpdatedState();
|
|
195
|
+
|
|
196
|
+
if (this.isEmpty(newState)) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
ReactDOM.flushSync(() => {
|
|
201
|
+
this.setState(prevState => this.updateState(prevState, newState));
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
handleResize() {
|
|
206
|
+
this.rendersRef.current = 0;
|
|
207
|
+
this.syncHeightWithFlushSync();
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
rAFHandleResize() {
|
|
211
|
+
cancelAnimationFrame(this.rAF);
|
|
212
|
+
this.rAF = requestAnimationFrame(() => {
|
|
213
|
+
this.handleResize();
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
componentDidMount() {
|
|
218
|
+
const input = this.textareaRef;
|
|
219
|
+
const containerWindow = ownerWindow(input);
|
|
220
|
+
this.debounceHandleResize = debounce(this.handleResize);
|
|
221
|
+
containerWindow.addEventListener("resize", this.debounceHandleResize);
|
|
222
|
+
|
|
223
|
+
if (typeof ResizeObserver !== "undefined") {
|
|
224
|
+
this.resizeObserver = new ResizeObserver(this.rAFHandleResize);
|
|
225
|
+
this.resizeObserver.observe(input);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
componentWillUnmount() {
|
|
230
|
+
const input = this.textareaRef;
|
|
231
|
+
const containerWindow = ownerWindow(input);
|
|
232
|
+
this.debounceHandleResize.clear();
|
|
233
|
+
cancelAnimationFrame(this.rAF);
|
|
234
|
+
containerWindow.removeEventListener("resize", this.debounceHandleResize);
|
|
235
|
+
|
|
236
|
+
if (this.resizeObserver) {
|
|
237
|
+
this.resizeObserver.disconnect();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
componentDidUpdate(prevProps) {
|
|
242
|
+
if (prevProps.text !== this.props.text) {
|
|
243
|
+
this.rendersRef.current = 0;
|
|
244
|
+
this.syncHeight();
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
render() {
|
|
249
|
+
let {
|
|
250
|
+
size,
|
|
251
|
+
placeHolder,
|
|
252
|
+
needBorder,
|
|
253
|
+
text,
|
|
254
|
+
isDisabled,
|
|
255
|
+
resize,
|
|
256
|
+
maxLength,
|
|
257
|
+
animated,
|
|
258
|
+
variant,
|
|
259
|
+
getRef,
|
|
260
|
+
onFocus,
|
|
261
|
+
dataId,
|
|
262
|
+
dataSelectorId,
|
|
263
|
+
isReadOnly,
|
|
264
|
+
needAppearance,
|
|
265
|
+
needReadOnlyStyle,
|
|
266
|
+
borderColor,
|
|
267
|
+
needEffect,
|
|
268
|
+
autoFocus,
|
|
269
|
+
htmlId,
|
|
270
|
+
a11y,
|
|
271
|
+
customClass,
|
|
272
|
+
maxRows,
|
|
273
|
+
minRows = 3,
|
|
274
|
+
inlineStyle
|
|
275
|
+
} = this.props;
|
|
276
|
+
let {
|
|
277
|
+
ariaLabel,
|
|
278
|
+
ariaLabelledby
|
|
279
|
+
} = a11y;
|
|
280
|
+
let resizes = {
|
|
281
|
+
horizontal: "resizeX",
|
|
282
|
+
vertical: "resizeY",
|
|
283
|
+
both: "resizeboth",
|
|
284
|
+
none: "noresize"
|
|
285
|
+
};
|
|
286
|
+
let options = {};
|
|
287
|
+
|
|
288
|
+
if (isReadOnly) {
|
|
289
|
+
options.readOnly = "readOnly";
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (isDisabled) {
|
|
293
|
+
options.disabled = "disabled";
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (autoFocus) {
|
|
297
|
+
options.autoFocus = true;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
let classList = needAppearance ? `${style.container} ${style[size]} ${style[variant]} ${needBorder ? style.needBorder : style.noBorder} ${resize ? style[resizes[resize]] : style[resizes.none]} ${animated ? `${style[`${size}animated`]}` : ""} ${isDisabled && !needEffect || isReadOnly && !needEffect ? "" : style.effect}` : `${style.basic}`;
|
|
301
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("textarea", {
|
|
302
|
+
"aria-label": ariaLabel,
|
|
303
|
+
"aria-labelledby": ariaLabelledby,
|
|
304
|
+
className: `${customClass} ${isReadOnly && needReadOnlyStyle ? style.readonly : ""} ${classList} ${style[`borderColor_${borderColor}`]}`,
|
|
305
|
+
placeholder: placeHolder,
|
|
306
|
+
...options,
|
|
307
|
+
"data-id": dataId,
|
|
308
|
+
"data-test-id": dataId,
|
|
309
|
+
maxLength: maxLength,
|
|
310
|
+
onChange: this.onChange,
|
|
311
|
+
onKeyDown: this.onKeyDown,
|
|
312
|
+
onFocus: onFocus,
|
|
313
|
+
onBlur: this.onBlur,
|
|
314
|
+
ref: this.inputRef,
|
|
315
|
+
value: text,
|
|
316
|
+
id: htmlId,
|
|
317
|
+
"data-selector-id": dataSelectorId,
|
|
318
|
+
rows: minRows,
|
|
319
|
+
style: {
|
|
320
|
+
height: this.state.outerHeightStyle,
|
|
321
|
+
// Need a large enough difference to allow scrolling.
|
|
322
|
+
// This prevents infinite rendering loop.
|
|
323
|
+
overflow: this.state.overflow ? "hidden" : undefined,
|
|
324
|
+
...inlineStyle
|
|
325
|
+
}
|
|
326
|
+
}), /*#__PURE__*/React.createElement("textarea", {
|
|
327
|
+
"aria-hidden": true,
|
|
328
|
+
readOnly: true,
|
|
329
|
+
ref: this.shadowRef,
|
|
330
|
+
tabIndex: -1,
|
|
331
|
+
className: `${customClass} ${classList} ${style[`borderColor_${borderColor}`]}`,
|
|
332
|
+
style: { ...styles.shadow,
|
|
333
|
+
...inlineStyle,
|
|
334
|
+
paddingTop: 0,
|
|
335
|
+
paddingBottom: 0
|
|
336
|
+
}
|
|
337
|
+
}));
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
}
|
|
341
|
+
Textarea.defaultProps = defaultProps;
|
|
342
|
+
Textarea.propTypes = propTypes; // if (__DOCS__) {
|
|
343
|
+
// Textarea.docs = {
|
|
344
|
+
// componentGroup: 'Form Elements',
|
|
345
|
+
// folderName: 'Style Guide',
|
|
346
|
+
// external: true,
|
|
347
|
+
// description: ' '
|
|
348
|
+
// };
|
|
349
|
+
// }
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import getSizingData from "./getSizingData";
|
|
2
|
+
export default function calculateNodeHeight(_ref) {
|
|
3
|
+
let {
|
|
4
|
+
minRows = 1,
|
|
5
|
+
maxRows = 5,
|
|
6
|
+
textareaEle,
|
|
7
|
+
hiddenTextareaEle
|
|
8
|
+
} = _ref;
|
|
9
|
+
const {
|
|
10
|
+
computedStyle,
|
|
11
|
+
paddingSize,
|
|
12
|
+
borderSize,
|
|
13
|
+
boxSizing
|
|
14
|
+
} = getSizingData(textareaEle);
|
|
15
|
+
const isBorderBox = boxSizing === "border-box"; // If input's width is shrunk and it's not visible, don't sync height.
|
|
16
|
+
|
|
17
|
+
if (computedStyle.width === '0px') {
|
|
18
|
+
return {
|
|
19
|
+
height: 0
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let hiddenTextarea = hiddenTextareaEle;
|
|
24
|
+
hiddenTextarea.style.width = computedStyle.width;
|
|
25
|
+
hiddenTextarea.value = textareaEle.value || textareaEle.placeholder || "x";
|
|
26
|
+
|
|
27
|
+
if (hiddenTextarea.value.slice(-1) === "\n") {
|
|
28
|
+
// // Certain fonts which overflow the line height will cause the textarea
|
|
29
|
+
// // to report a different scrollHeight depending on whether the last line
|
|
30
|
+
// // is empty. Make it non-empty to avoid this issue.
|
|
31
|
+
hiddenTextarea.value += " ";
|
|
32
|
+
} // The height of the inner content
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
const innerHeight = hiddenTextarea.scrollHeight; // Measure height of a textarea with a single row
|
|
36
|
+
|
|
37
|
+
hiddenTextarea.value = "x";
|
|
38
|
+
const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize || parseInt(computedStyle.lineHeight); // The height of the outer content
|
|
39
|
+
|
|
40
|
+
let outerHeight = innerHeight;
|
|
41
|
+
|
|
42
|
+
if (minRows) {
|
|
43
|
+
outerHeight = Math.max(Number(minRows) * singleRowHeight, outerHeight);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (maxRows) {
|
|
47
|
+
outerHeight = Math.min(Number(maxRows) * singleRowHeight, outerHeight);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
outerHeight = Math.max(outerHeight, singleRowHeight); // Take the box sizing into account for applying this value as a style.
|
|
51
|
+
|
|
52
|
+
const height = outerHeight + (isBorderBox ? paddingSize + borderSize : 0);
|
|
53
|
+
const overflow = Math.abs(outerHeight - innerHeight) <= 1;
|
|
54
|
+
return {
|
|
55
|
+
height,
|
|
56
|
+
overflow
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import getSizingData from "./getSizingData";
|
|
2
|
+
|
|
3
|
+
const getHeight = (node, _ref) => {
|
|
4
|
+
let {
|
|
5
|
+
borderSize,
|
|
6
|
+
paddingSize,
|
|
7
|
+
isBorderBox
|
|
8
|
+
} = _ref;
|
|
9
|
+
const height = node.scrollHeight;
|
|
10
|
+
|
|
11
|
+
if (isBorderBox) {
|
|
12
|
+
// border-box: add border, since height = content + padding + border
|
|
13
|
+
return height + borderSize;
|
|
14
|
+
} // remove padding, since height = content
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
return height - paddingSize;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export default function calculateNodeHeightOne(_ref2) {
|
|
21
|
+
let {
|
|
22
|
+
minRows = 1,
|
|
23
|
+
maxRows = 5,
|
|
24
|
+
textareaEle,
|
|
25
|
+
hiddenTextareaEle
|
|
26
|
+
} = _ref2;
|
|
27
|
+
const {
|
|
28
|
+
computedStyle,
|
|
29
|
+
paddingSize,
|
|
30
|
+
borderSize,
|
|
31
|
+
boxSizing
|
|
32
|
+
} = getSizingData(hiddenTextareaEle);
|
|
33
|
+
const isBorderBox = boxSizing === "border-box"; // If input's width is shrunk and it's not visible, don't sync height.
|
|
34
|
+
|
|
35
|
+
if (computedStyle.width === '0px') {
|
|
36
|
+
return {
|
|
37
|
+
height: 0
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let hiddenTextarea = hiddenTextareaEle; // The height of the inner content
|
|
42
|
+
|
|
43
|
+
let height = getHeight(hiddenTextarea, {
|
|
44
|
+
paddingSize,
|
|
45
|
+
borderSize,
|
|
46
|
+
isBorderBox
|
|
47
|
+
});
|
|
48
|
+
const innerHeight = getHeight(hiddenTextarea, {
|
|
49
|
+
paddingSize,
|
|
50
|
+
borderSize,
|
|
51
|
+
isBorderBox
|
|
52
|
+
}); // measure height of a textarea with a single row
|
|
53
|
+
|
|
54
|
+
hiddenTextarea.value = textareaEle.value || textareaEle.placeholder || "x";
|
|
55
|
+
hiddenTextarea.style.width = computedStyle.width;
|
|
56
|
+
const rowHeight = hiddenTextarea.scrollHeight - paddingSize;
|
|
57
|
+
let minHeight = rowHeight * minRows + (isBorderBox ? paddingSize + borderSize : 0);
|
|
58
|
+
let maxHeight = rowHeight * maxRows + (isBorderBox ? paddingSize + borderSize : 0);
|
|
59
|
+
height = Math.min(maxHeight, Math.max(minHeight, height)); // Take the box sizing into account for applying this value as a style.
|
|
60
|
+
|
|
61
|
+
const overflow = Math.abs(height - innerHeight) <= 1;
|
|
62
|
+
return {
|
|
63
|
+
height,
|
|
64
|
+
overflow
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Corresponds to 10 frames at 60 Hz.
|
|
2
|
+
export default function debounce(func) {
|
|
3
|
+
let wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 166;
|
|
4
|
+
let timeout;
|
|
5
|
+
|
|
6
|
+
function debounced() {
|
|
7
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
8
|
+
args[_key] = arguments[_key];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const later = () => {
|
|
12
|
+
func.apply(this, args);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
clearTimeout(timeout);
|
|
16
|
+
timeout = setTimeout(later, wait);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
debounced.clear = () => {
|
|
20
|
+
clearTimeout(timeout);
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
return debounced;
|
|
24
|
+
}
|