@zohodesk/components 1.2.4 → 1.2.6

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.
Files changed (202) hide show
  1. package/README.md +8 -0
  2. package/coverage/Button/Button.js.html +1 -1
  3. package/coverage/Button/css/Button.module.css.html +1 -1
  4. package/coverage/Button/css/cssJSLogic.js.html +1 -1
  5. package/coverage/Button/css/index.html +1 -1
  6. package/coverage/Button/index.html +1 -1
  7. package/coverage/Button/props/defaultProps.js.html +1 -1
  8. package/coverage/Button/props/index.html +1 -1
  9. package/coverage/Button/props/propTypes.js.html +1 -1
  10. package/coverage/Buttongroup/Buttongroup.js.html +1 -1
  11. package/coverage/Buttongroup/Buttongroup.module.css.html +1 -1
  12. package/coverage/Buttongroup/index.html +1 -1
  13. package/coverage/Buttongroup/props/defaultProps.js.html +1 -1
  14. package/coverage/Buttongroup/props/index.html +1 -1
  15. package/coverage/Buttongroup/props/propTypes.js.html +1 -1
  16. package/coverage/index.html +1 -1
  17. package/coverage/utils/dummyFunction.js.html +1 -1
  18. package/coverage/utils/index.html +1 -1
  19. package/es/AppContainer/AppContainer.js +3 -0
  20. package/es/v1/Accordion/Accordion.js +65 -0
  21. package/es/v1/Accordion/AccordionItem.js +57 -0
  22. package/es/v1/Accordion/index.js +2 -0
  23. package/es/v1/Animation/Animation.js +127 -0
  24. package/es/v1/AppContainer/AppContainer.js +137 -0
  25. package/es/v1/Avatar/Avatar.js +189 -0
  26. package/es/v1/AvatarTeam/AvatarTeam.js +70 -0
  27. package/es/v1/Button/Button.js +68 -0
  28. package/es/v1/Buttongroup/Buttongroup.js +31 -0
  29. package/es/v1/Card/Card.js +271 -0
  30. package/es/v1/CheckBox/CheckBox.js +155 -0
  31. package/es/v1/DateTime/CalendarView.js +218 -0
  32. package/es/v1/DateTime/DateTime.js +783 -0
  33. package/es/v1/DateTime/DateTimePopupFooter.js +47 -0
  34. package/es/v1/DateTime/DateTimePopupHeader.js +105 -0
  35. package/es/v1/DateTime/DateWidget.js +1098 -0
  36. package/es/v1/DateTime/DaysRow.js +31 -0
  37. package/es/v1/DateTime/Time.js +166 -0
  38. package/es/v1/DateTime/YearView.js +264 -0
  39. package/es/v1/DateTime/index.js +1 -0
  40. package/es/v1/DropBox/DropBox.js +91 -0
  41. package/es/v1/DropBox/DropBoxElement/DropBoxElement.js +132 -0
  42. package/es/v1/DropDown/DropDown.js +73 -0
  43. package/es/v1/DropDown/DropDownHeading.js +44 -0
  44. package/es/v1/DropDown/DropDownItem.js +76 -0
  45. package/es/v1/DropDown/DropDownSearch.js +63 -0
  46. package/es/v1/DropDown/DropDownSeparator.js +15 -0
  47. package/es/v1/Heading/Heading.js +32 -0
  48. package/es/v1/Label/Label.js +40 -0
  49. package/es/v1/Layout/Box.js +115 -0
  50. package/es/v1/Layout/Container.js +132 -0
  51. package/es/v1/Layout/index.js +2 -0
  52. package/es/v1/ListItem/ListContainer.js +102 -0
  53. package/es/v1/ListItem/ListItem.js +124 -0
  54. package/es/v1/ListItem/ListItemWithAvatar.js +145 -0
  55. package/es/v1/ListItem/ListItemWithCheckBox.js +104 -0
  56. package/es/v1/ListItem/ListItemWithIcon.js +127 -0
  57. package/es/v1/ListItem/ListItemWithRadio.js +105 -0
  58. package/es/v1/ListItem/index.js +6 -0
  59. package/es/v1/Modal/Modal.js +154 -0
  60. package/es/v1/MultiSelect/AdvancedGroupMultiSelect.js +1079 -0
  61. package/es/v1/MultiSelect/AdvancedMultiSelect.js +568 -0
  62. package/es/v1/MultiSelect/EmptyState.js +64 -0
  63. package/es/v1/MultiSelect/MobileHeader/MobileHeader.js +50 -0
  64. package/es/v1/MultiSelect/MultiSelect.js +1120 -0
  65. package/es/v1/MultiSelect/MultiSelectHeader.js +32 -0
  66. package/es/v1/MultiSelect/MultiSelectWithAvatar.js +216 -0
  67. package/es/v1/MultiSelect/SelectedOptions.js +82 -0
  68. package/es/v1/MultiSelect/Suggestions.js +142 -0
  69. package/es/v1/MultiSelect/index.js +4 -0
  70. package/es/v1/PopOver/PopOver.js +211 -0
  71. package/es/v1/Popup/Popup.js +645 -0
  72. package/es/v1/Radio/Radio.js +115 -0
  73. package/es/v1/Responsive/CustomResponsive.js +195 -0
  74. package/es/v1/Responsive/RefWrapper.js +39 -0
  75. package/es/v1/Responsive/ResizeComponent.js +197 -0
  76. package/es/v1/Responsive/ResizeObserver.js +140 -0
  77. package/es/v1/Responsive/Responsive.js +194 -0
  78. package/es/v1/Responsive/index.js +9 -0
  79. package/es/v1/ResponsiveDropBox/ResponsiveDropBox.js +58 -0
  80. package/es/v1/Ribbon/Ribbon.js +33 -0
  81. package/es/v1/RippleEffect/RippleEffect.js +24 -0
  82. package/es/v1/Select/GroupSelect.js +803 -0
  83. package/es/v1/Select/Select.js +969 -0
  84. package/es/v1/Select/SelectWithAvatar.js +344 -0
  85. package/es/v1/Select/SelectWithIcon.js +535 -0
  86. package/es/v1/Select/index.js +4 -0
  87. package/es/v1/Stencils/Stencils.js +26 -0
  88. package/es/v1/Switch/Switch.js +94 -0
  89. package/es/v1/Tab/Tab.js +108 -0
  90. package/es/v1/Tab/TabContent.js +30 -0
  91. package/es/v1/Tab/TabContentWrapper.js +29 -0
  92. package/es/v1/Tab/TabWrapper.js +57 -0
  93. package/es/v1/Tab/Tabs.js +612 -0
  94. package/es/v1/Tab/index.js +5 -0
  95. package/es/v1/Tag/Tag.js +134 -0
  96. package/es/v1/TextBox/TextBox.js +154 -0
  97. package/es/v1/TextBoxIcon/TextBoxIcon.js +158 -0
  98. package/es/v1/Textarea/Textarea.js +102 -0
  99. package/es/v1/Tooltip/Tooltip.js +518 -0
  100. package/es/v1/Typography/Typography.js +38 -0
  101. package/es/v1/Typography/css/Typography.module.css +376 -0
  102. package/es/v1/Typography/css/cssJSLogic.js +46 -0
  103. package/es/v1/Typography/css/letterSpacingMap.js +12 -0
  104. package/es/v1/Typography/props/defaultProps.js +8 -0
  105. package/es/v1/Typography/props/propTypes.js +24 -0
  106. package/es/v1/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +69 -0
  107. package/es/v1/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +100 -0
  108. package/es/v1/semantic/Button/Button.js +53 -0
  109. package/es/v1/semantic/index.js +1 -0
  110. package/lib/AppContainer/AppContainer.js +5 -0
  111. package/lib/v1/Accordion/Accordion.js +96 -0
  112. package/lib/v1/Accordion/AccordionItem.js +68 -0
  113. package/lib/v1/Accordion/index.js +23 -0
  114. package/lib/v1/Animation/Animation.js +143 -0
  115. package/lib/v1/AppContainer/AppContainer.js +209 -0
  116. package/lib/v1/Avatar/Avatar.js +246 -0
  117. package/lib/v1/AvatarTeam/AvatarTeam.js +81 -0
  118. package/lib/v1/Button/Button.js +82 -0
  119. package/lib/v1/Buttongroup/Buttongroup.js +44 -0
  120. package/lib/v1/Card/Card.js +365 -0
  121. package/lib/v1/CheckBox/CheckBox.js +166 -0
  122. package/lib/v1/DateTime/CalendarView.js +285 -0
  123. package/lib/v1/DateTime/DateTime.js +872 -0
  124. package/lib/v1/DateTime/DateTimePopupFooter.js +96 -0
  125. package/lib/v1/DateTime/DateTimePopupHeader.js +166 -0
  126. package/lib/v1/DateTime/DateWidget.js +1125 -0
  127. package/lib/v1/DateTime/DaysRow.js +80 -0
  128. package/lib/v1/DateTime/Time.js +254 -0
  129. package/lib/v1/DateTime/YearView.js +325 -0
  130. package/lib/v1/DateTime/index.js +15 -0
  131. package/lib/v1/DropBox/DropBox.js +119 -0
  132. package/lib/v1/DropBox/DropBoxElement/DropBoxElement.js +145 -0
  133. package/lib/v1/DropDown/DropDown.js +170 -0
  134. package/lib/v1/DropDown/DropDownHeading.js +93 -0
  135. package/lib/v1/DropDown/DropDownItem.js +127 -0
  136. package/lib/v1/DropDown/DropDownSearch.js +113 -0
  137. package/lib/v1/DropDown/DropDownSeparator.js +64 -0
  138. package/lib/v1/Heading/Heading.js +49 -0
  139. package/lib/v1/Label/Label.js +51 -0
  140. package/lib/v1/Layout/Box.js +128 -0
  141. package/lib/v1/Layout/Container.js +145 -0
  142. package/lib/v1/Layout/index.js +23 -0
  143. package/lib/v1/ListItem/ListContainer.js +120 -0
  144. package/lib/v1/ListItem/ListItem.js +138 -0
  145. package/lib/v1/ListItem/ListItemWithAvatar.js +162 -0
  146. package/lib/v1/ListItem/ListItemWithCheckBox.js +125 -0
  147. package/lib/v1/ListItem/ListItemWithIcon.js +143 -0
  148. package/lib/v1/ListItem/ListItemWithRadio.js +126 -0
  149. package/lib/v1/ListItem/index.js +55 -0
  150. package/lib/v1/Modal/Modal.js +212 -0
  151. package/lib/v1/MultiSelect/AdvancedGroupMultiSelect.js +1167 -0
  152. package/lib/v1/MultiSelect/AdvancedMultiSelect.js +634 -0
  153. package/lib/v1/MultiSelect/EmptyState.js +112 -0
  154. package/lib/v1/MultiSelect/MobileHeader/MobileHeader.js +62 -0
  155. package/lib/v1/MultiSelect/MultiSelect.js +1201 -0
  156. package/lib/v1/MultiSelect/MultiSelectHeader.js +78 -0
  157. package/lib/v1/MultiSelect/MultiSelectWithAvatar.js +270 -0
  158. package/lib/v1/MultiSelect/SelectedOptions.js +126 -0
  159. package/lib/v1/MultiSelect/Suggestions.js +195 -0
  160. package/lib/v1/MultiSelect/index.js +39 -0
  161. package/lib/v1/PopOver/PopOver.js +293 -0
  162. package/lib/v1/Popup/Popup.js +715 -0
  163. package/lib/v1/Radio/Radio.js +126 -0
  164. package/lib/v1/Responsive/CustomResponsive.js +242 -0
  165. package/lib/v1/Responsive/RefWrapper.js +57 -0
  166. package/lib/v1/Responsive/ResizeComponent.js +268 -0
  167. package/lib/v1/Responsive/ResizeObserver.js +168 -0
  168. package/lib/v1/Responsive/Responsive.js +274 -0
  169. package/lib/v1/Responsive/index.js +55 -0
  170. package/lib/v1/ResponsiveDropBox/ResponsiveDropBox.js +79 -0
  171. package/lib/v1/Ribbon/Ribbon.js +44 -0
  172. package/lib/v1/RippleEffect/RippleEffect.js +39 -0
  173. package/lib/v1/Select/GroupSelect.js +877 -0
  174. package/lib/v1/Select/Select.js +1013 -0
  175. package/lib/v1/Select/SelectWithAvatar.js +394 -0
  176. package/lib/v1/Select/SelectWithIcon.js +597 -0
  177. package/lib/v1/Select/index.js +39 -0
  178. package/lib/v1/Stencils/Stencils.js +43 -0
  179. package/lib/v1/Switch/Switch.js +108 -0
  180. package/lib/v1/Tab/Tab.js +132 -0
  181. package/lib/v1/Tab/TabContent.js +42 -0
  182. package/lib/v1/Tab/TabContentWrapper.js +42 -0
  183. package/lib/v1/Tab/TabWrapper.js +89 -0
  184. package/lib/v1/Tab/Tabs.js +680 -0
  185. package/lib/v1/Tab/index.js +47 -0
  186. package/lib/v1/Tag/Tag.js +154 -0
  187. package/lib/v1/TextBox/TextBox.js +168 -0
  188. package/lib/v1/TextBoxIcon/TextBoxIcon.js +196 -0
  189. package/lib/v1/Textarea/Textarea.js +118 -0
  190. package/lib/v1/Tooltip/Tooltip.js +586 -0
  191. package/lib/v1/Typography/Typography.js +56 -0
  192. package/lib/v1/Typography/css/Typography.module.css +376 -0
  193. package/lib/v1/Typography/css/cssJSLogic.js +41 -0
  194. package/lib/v1/Typography/css/letterSpacingMap.js +20 -0
  195. package/lib/v1/Typography/props/defaultProps.js +15 -0
  196. package/lib/v1/Typography/props/propTypes.js +35 -0
  197. package/lib/v1/VelocityAnimation/VelocityAnimation/VelocityAnimation.js +90 -0
  198. package/lib/v1/VelocityAnimation/VelocityAnimationGroup/VelocityAnimationGroup.js +126 -0
  199. package/lib/v1/semantic/Button/Button.js +63 -0
  200. package/lib/v1/semantic/index.js +15 -0
  201. package/package.json +1 -1
  202. package/result.json +1 -1
@@ -0,0 +1,115 @@
1
+ import React from 'react';
2
+ import { defaultProps } from '../../Radio/props/defaultProps';
3
+ import { propTypes } from '../../Radio/props/propTypes';
4
+ import Label from '../Label/Label';
5
+ import { Container, Box } from '../Layout';
6
+ import style from '../../Radio/Radio.module.css';
7
+
8
+ const Radio = props => {
9
+ let {
10
+ id,
11
+ name,
12
+ value,
13
+ checked,
14
+ disabled,
15
+ isReadOnly,
16
+ palette,
17
+ disabledTitle,
18
+ title,
19
+ text,
20
+ labelPalette,
21
+ size,
22
+ labelSize,
23
+ variant,
24
+ active,
25
+ isFilled,
26
+ customClass,
27
+ a11y
28
+ } = props;
29
+ let {
30
+ customRadioWrap = '',
31
+ customRadio = '',
32
+ customLabel = ''
33
+ } = customClass;
34
+ let accessMode = isReadOnly ? style.readonly : disabled ? style.disabled : style.pointer;
35
+ let toolTip = disabled ? disabledTitle : title ? title : null;
36
+ let {
37
+ ariaHidden,
38
+ role = 'radio',
39
+ ariaChecked = checked,
40
+ ariaLabel,
41
+ ariaLabelledby,
42
+ ariaReadonly = isReadOnly || disabled ? true : false
43
+ } = a11y;
44
+
45
+ function onChange(e) {
46
+ const {
47
+ onChange
48
+ } = props;
49
+ onChange && onChange(value, e);
50
+ }
51
+
52
+ return /*#__PURE__*/React.createElement(Container, {
53
+ dataId: value ? value.toLowerCase() : 'RadioComp',
54
+ isCover: false,
55
+ isInline: text ? false : true,
56
+ alignBox: "row",
57
+ align: "both",
58
+ className: `${style.container} ${active && !disabled ? style.active : ''} ${accessMode} ${isReadOnly || disabled ? '' : style.hoverEfffect} ${checked ? style.checked : ''} ${customRadioWrap}`,
59
+ "data-title": toolTip,
60
+ onClick: !isReadOnly && !disabled ? onChange : '',
61
+ "aria-checked": ariaChecked,
62
+ tabindex: isReadOnly || disabled || ariaHidden ? '-1' : '0',
63
+ role: role,
64
+ "aria-Hidden": ariaHidden,
65
+ "aria-label": ariaLabel,
66
+ "aria-labelledby": ariaLabelledby,
67
+ "aria-readonly": ariaReadonly
68
+ }, /*#__PURE__*/React.createElement(Box, {
69
+ className: `${style.radio} ${checked ? `${style[`rdBox${palette}`]}` : ''}
70
+ ${isReadOnly || disabled ? '' : `${style[`hover${palette}`]}`} ${style[size]} ${isFilled ? style.filled : ''} ${style[`centerPath${palette}`]} ${customRadio}`
71
+ }, /*#__PURE__*/React.createElement("input", {
72
+ type: "hidden",
73
+ id: id,
74
+ name: name,
75
+ value: value
76
+ }), /*#__PURE__*/React.createElement("label", {
77
+ className: `${style.radioLabel} ${accessMode}`
78
+ }, /*#__PURE__*/React.createElement("svg", {
79
+ xmlns: "http://www.w3.org/2000/svg",
80
+ viewBox: "0 0 40 40"
81
+ }, /*#__PURE__*/React.createElement("circle", {
82
+ cx: "20",
83
+ cy: "20",
84
+ r: "19",
85
+ className: `${style.rdBox}`
86
+ }), checked ? /*#__PURE__*/React.createElement("circle", {
87
+ cx: "20",
88
+ cy: "20",
89
+ r: "11.03",
90
+ className: `${style.centerPath}`
91
+ }) : null))), text && /*#__PURE__*/React.createElement(Box, {
92
+ flexible: true,
93
+ className: style.text
94
+ }, /*#__PURE__*/React.createElement(Label, {
95
+ text: text,
96
+ palette: disabled ? 'disable' : labelPalette,
97
+ size: labelSize,
98
+ type: "title",
99
+ clipped: true,
100
+ dataId: `${text}_label`,
101
+ variant: variant,
102
+ title: toolTip ? toolTip : text,
103
+ customClass: `${checked && active && !disabled ? `${style[`${palette}checkedActive`]}` : ''}
104
+ ${style[`${palette}Label`]} ${accessMode} ${customLabel}`
105
+ })));
106
+ };
107
+
108
+ export default Radio;
109
+ Radio.defaultProps = defaultProps;
110
+ Radio.propTypes = propTypes; // if (__DOCS__) {
111
+ // Radio.docs = {
112
+ // componentGroup: 'Form Elements',
113
+ // folderName: 'Style Guide'
114
+ // };
115
+ // }
@@ -0,0 +1,195 @@
1
+ import React, { useContext, useEffect, useState, useRef, useMemo } from 'react';
2
+ import { CustomResponsiveSender_defaultProps, CustomResponsiveReceiver_defaultProps } from '../../Responsive/props/defaultProps';
3
+ import { CustomResponsiveSender_propTypes, CustomResponsiveReceiver_propTypes } from '../../Responsive/props/propTypes';
4
+ import ResizeObserver from './ResizeObserver';
5
+ import DOMRefWrapper from './RefWrapper';
6
+ import shallowCompare from '../../Responsive/utils/shallowCompare';
7
+ import { isBreackPointMatched, Subscribale, isTouchDevice, windowResizeObserver } from '../../Responsive/sizeObservers';
8
+ import { ContextOptimizer } from '../../utils/ContextOptimizer'; // const commonBreakPoints = [ 480, 640, 768, 1024, 1440 ];
9
+ // const otherBreakPoints = [320, 360, 375, 720, 1280, 1600, 1920];
10
+ // defaultResponsiveId means if ResponsiveSender do not recive id This will be id
11
+
12
+ const defaultResponsiveId = 'parent_sender'; // validSizeResponsiveId means in some parent's height and with is caluclated ( readed )
13
+
14
+ const validSizeResponsiveId = 'valid_sender';
15
+ const ResponsiveContext = /*#__PURE__*/React.createContext({
16
+ [validSizeResponsiveId]: windowResizeObserver
17
+ });
18
+ export function ResponsiveSender(props) {
19
+ // variables
20
+ const {
21
+ children,
22
+ domRefKey,
23
+ responsiveId
24
+ } = props;
25
+
26
+ function init() {
27
+ let size = {
28
+ height: 0,
29
+ width: 0
30
+ };
31
+
32
+ function getSize() {
33
+ return size;
34
+ }
35
+
36
+ const childContext = {
37
+ resize: new Subscribale(),
38
+ getSize,
39
+ // TODO: rename isParentSize ==> isSizeReaded (or) isMySize (or) isOriginalSize
40
+ isParentSize: false
41
+ };
42
+
43
+ function onResize(newSize) {
44
+ childContext.isParentSize = true;
45
+ size = newSize;
46
+ setTimeout(() => {
47
+ childContext.resize.dispatch(newSize);
48
+ });
49
+ }
50
+
51
+ const observer = new ResizeObserver(onResize);
52
+
53
+ function containerRef(node) {
54
+ observer.replaceObservationElement(node);
55
+ }
56
+
57
+ return {
58
+ containerRef,
59
+ childContext
60
+ };
61
+ }
62
+
63
+ const {
64
+ containerRef,
65
+ childContext
66
+ } = useMemo(init, []);
67
+
68
+ function contextSelector(context) {
69
+ const totalContext = { ...context
70
+ };
71
+ totalContext[responsiveId] = childContext; // NOTE: this for fallback of if responsive receiver id wrong or not avelable Responcive id
72
+
73
+ totalContext[defaultResponsiveId] = childContext;
74
+
75
+ if (childContext.isParentSize) {
76
+ totalContext[validSizeResponsiveId] = childContext;
77
+ }
78
+
79
+ return totalContext;
80
+ }
81
+
82
+ return /*#__PURE__*/React.createElement(ContextOptimizer, {
83
+ Context: ResponsiveContext,
84
+ calculation: contextSelector
85
+ }, totalContext => /*#__PURE__*/React.createElement(ResponsiveContext.Provider, {
86
+ value: totalContext
87
+ }, /*#__PURE__*/React.createElement(DOMRefWrapper, {
88
+ domRefKey: domRefKey,
89
+ ref: containerRef
90
+ }, children)));
91
+ }
92
+ ResponsiveSender.defaultProps = { ...CustomResponsiveSender_defaultProps,
93
+ responsiveId: defaultResponsiveId
94
+ };
95
+ ResponsiveSender.contextType = ResponsiveContext;
96
+ ResponsiveSender.propTypes = CustomResponsiveSender_propTypes;
97
+ export function useResponsiveReceiver() {
98
+ let responsiveId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultResponsiveId;
99
+ let query = arguments.length > 1 ? arguments[1] : undefined;
100
+ const [, forceUpdate] = useState();
101
+ const totalContextData = useContext(ResponsiveContext);
102
+ const validSizeContextData = totalContextData[validSizeResponsiveId];
103
+ const contextData = totalContextData[responsiveId] || totalContextData[defaultResponsiveId] || validSizeContextData; // NOTE: this for fallback of if responsive receiver id wrong
104
+
105
+ const resizeHandlerRef = useRef();
106
+ const data = useRef();
107
+
108
+ function updateLatestData() {
109
+ const size = contextData.isParentSize ? contextData.getSize() : validSizeContextData.getSize();
110
+ const prevData = data.current;
111
+ data.current = query({
112
+ isTouchDevice,
113
+ isParentSize: contextData.isParentSize,
114
+ currentScreenSize: size,
115
+
116
+ mediaQueryOR(breakPointArray) {
117
+ return breakPointArray.some(breakPoint => {
118
+ const {
119
+ isHeight,
120
+ isWidth
121
+ } = isBreackPointMatched(breakPoint, size);
122
+ return isHeight || isWidth;
123
+ });
124
+ },
125
+
126
+ mediaQueryAND(breakPointArray) {
127
+ return breakPointArray.every(breakPoint => {
128
+ const {
129
+ isHeight,
130
+ isWidth
131
+ } = isBreackPointMatched(breakPoint, size);
132
+ return (isHeight === undefined ? true : isHeight) && (isWidth === undefined ? true : isWidth);
133
+ });
134
+ }
135
+
136
+ });
137
+ const isSameValues = shallowCompare(data.current, prevData);
138
+
139
+ if (isSameValues) {
140
+ data.current = prevData;
141
+ }
142
+
143
+ return isSameValues;
144
+ }
145
+
146
+ resizeHandlerRef.current = updateLatestData;
147
+ useEffect(() => {
148
+ function handleResize(size) {
149
+ const isSameValues = resizeHandlerRef.current(size);
150
+ !isSameValues && forceUpdate({});
151
+ }
152
+
153
+ contextData.resize.subscribe(handleResize);
154
+ return () => contextData.resize.unsubscribe(handleResize);
155
+ }, [contextData]); // const prevContextDataRef = useRef();
156
+ // function handleResize(size) {
157
+ // const prevData = data.current;
158
+ // resizeHandlerRef.current(size);
159
+ // const isSammeValues = shallowCompare(data.current, prevData);
160
+ // !isSammeValues && forceUpdate({});
161
+ // }
162
+ // if(prevContextDataRef.current !== contextData) {
163
+ // prevContextDataRef.current = contextData;
164
+ // contextData.resize.unsubscribe(handleResize);
165
+ // windowResizeObserver.unobserve(handleResize);
166
+ // if (contextData) {
167
+ // contextData.resize.subscribe(handleResize);
168
+ // } else {
169
+ // windowResizeObserver.observe(handleResize);
170
+ // }
171
+ // }
172
+ // NOTE: this call for we must give updated value
173
+
174
+ updateLatestData();
175
+ return data.current;
176
+ }
177
+ export function ResponsiveReceiver(_ref) {
178
+ let {
179
+ children,
180
+ responsiveId,
181
+ query,
182
+ eleRef,
183
+ domRefKey
184
+ } = _ref;
185
+ const data = useResponsiveReceiver(responsiveId, query);
186
+ const child = children(data);
187
+ return eleRef ? /*#__PURE__*/React.createElement(DOMRefWrapper, {
188
+ domRefKey: domRefKey,
189
+ ref: eleRef
190
+ }, child) : child;
191
+ }
192
+ ResponsiveReceiver.defaultProps = { ...CustomResponsiveReceiver_defaultProps,
193
+ responsiveId: defaultResponsiveId
194
+ };
195
+ ResponsiveReceiver.propTypes = CustomResponsiveReceiver_propTypes;
@@ -0,0 +1,39 @@
1
+ import React, { forwardRef, useCallback, Children, cloneElement } from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ function setRef(refFunc, value) {
5
+ if (typeof refFunc === 'function') {
6
+ refFunc(value);
7
+ } else if (refFunc instanceof Object) {
8
+ refFunc.current = value;
9
+ }
10
+ }
11
+
12
+ const DOMRefWrapper = /*#__PURE__*/forwardRef((props, refFunc) => {
13
+ const ele = Children.only(props.children);
14
+ const {
15
+ domRefKey = 'eleRef'
16
+ } = props; // NOTE: need to check for forward Ref function, Because in Froward Ref case refKey is "ref"
17
+
18
+ const refKey = typeof ele.type !== 'string' ? domRefKey : 'ref'; // const setAttribute = useCallback(node => {
19
+
20
+ const eleRealRefFunc = ele.props[refKey];
21
+ const setAttribute = useCallback(ref => {
22
+ setRef(refFunc, ref);
23
+ setRef(eleRealRefFunc, ref);
24
+ }, [refFunc, eleRealRefFunc]); // let refKey = typeof ele.type === 'string' ? 'ref' : 'eleRef';
25
+
26
+ let childProps = {
27
+ [refKey]: setAttribute
28
+ };
29
+ return /*#__PURE__*/cloneElement(ele, childProps);
30
+ });
31
+ DOMRefWrapper.defaultProps = {
32
+ domRefKey: 'eleRef'
33
+ };
34
+ DOMRefWrapper.propTypes = {
35
+ domRefKey: PropTypes.any,
36
+ children: PropTypes.any
37
+ };
38
+ DOMRefWrapper.displayName = 'DOMRefWrapper';
39
+ export default DOMRefWrapper;
@@ -0,0 +1,197 @@
1
+ /* eslint-disable */
2
+ // QUestions to be discussed
3
+ //1) mutation.type === 'characterData' needed ???
4
+ // 2) debounce Mutation observer and resize observer
5
+ import React from 'react';
6
+ import PropTypes from 'prop-types';
7
+ import ResizeObserver from './ResizeObserver';
8
+ import { getElementSpace, debounce } from '../../utils/Common';
9
+ export default class ResizeComponent extends React.Component {
10
+ constructor(props) {
11
+ super(props);
12
+ this.noSpaceForChildren = false;
13
+ this.childrenCurrentList = [];
14
+ this.widthCheck = debounce(this.widthCheck.bind(this), 10); // this.widthCheck = this.widthCheck.bind(this);
15
+
16
+ this.onResize = this.onResize.bind(this);
17
+ this.onResizeMutation = this.onResizeMutation.bind(this);
18
+ this.tabsObserver = new ResizeObserver(this.onResize);
19
+ this.tabObserver = new MutationObserver(this.onResizeMutation);
20
+ this.reset = this.reset.bind(this);
21
+ this.constructChildren = this.constructChildren.bind(this);
22
+ this.querySelector = this.querySelector.bind(this);
23
+ }
24
+
25
+ querySelector() {
26
+ if (this.props.wrapperDivRef && this.props.wrapperDivRef.current) {
27
+ return this.props.wrapperDivRef.current.querySelectorAll('[data-responsive="true"]');
28
+ } else {
29
+ return [];
30
+ }
31
+ }
32
+
33
+ onResizeMutation(mutations) {
34
+ // console.log(mutations);
35
+ let {
36
+ childrenList
37
+ } = this.props;
38
+
39
+ for (const mutation of mutations) {
40
+ if (mutation.type === 'childList') {
41
+ if (mutation.addedNodes.length) {
42
+ let newAdded = false;
43
+ mutation.addedNodes.forEach(mut => {
44
+ // Here we can listen for icon nodes. Confirm with bk
45
+ if (mut.attributes && mut.attributes['data-responsive'] && (childrenList.length !== this.querySelector().length || this.childrenCurrentList.length !== this.querySelector().length)) {
46
+ newAdded = true;
47
+ }
48
+ });
49
+
50
+ if (newAdded) {
51
+ //console.log('A child node has been added ', mutation);
52
+ this.onResize();
53
+ }
54
+ } else if (mutation.removedNodes.length) {// ?? removed nodes ku check pannanum ah ??
55
+ // console.log('A child node has been removed ', mutation);
56
+ }
57
+ } else if (mutation.type === 'attributes') {//console.log('The ' + mutation.attributeName + ' attribute was modified.', mutation);
58
+ } else if (mutation.type === 'characterData') {// To Call While Changing InnerText, Remove Below line If Required. But It might affect Performance.
59
+ // this.onResize();
60
+ }
61
+ } // mutations.forEach(mutation => {
62
+ // if (mutation.target === foo &&
63
+ // mutation.attributeName === 'style' &&
64
+ // oldWidth !== foo.style.width) {
65
+ // foo.textContent = 'Width changed from ' +
66
+ // oldWidth + ' to ' + foo.style.width;
67
+ // oldWidth = foo.style.width;
68
+ // }
69
+ // });
70
+
71
+ }
72
+
73
+ componentDidMount() {
74
+ if (this.props.wrapperDivRef && this.props.wrapperDivRef.current) {
75
+ this.tabsObserver.observe(this.props.wrapperDivRef.current);
76
+ this.tabObserver.observe(this.props.wrapperDivRef.current, {
77
+ characterData: true,
78
+ attributes: true,
79
+ childList: true,
80
+ subtree: true,
81
+ attributeFilter: ['data-responsive']
82
+ });
83
+ }
84
+ }
85
+
86
+ componentWillUnmount() {
87
+ this.reset();
88
+ }
89
+
90
+ reset() {
91
+ this.childrenCurrentList = [];
92
+ this.tabsObserver.disconnect();
93
+ this.tabObserver && this.tabObserver.disconnect();
94
+ }
95
+
96
+ componentDidUpdate(prevProps) {
97
+ if (this.childrenCurrentList.length === 0) {
98
+ this.childrenCurrentList = this.querySelector();
99
+ this.widthCheck();
100
+ }
101
+
102
+ if (this.props.resizeId !== prevProps.resizeId) {
103
+ // Completely reset the observers and set new observer if id is changed
104
+ this.reset();
105
+
106
+ if (this.props.wrapperDivRef && this.props.wrapperDivRef.current) {
107
+ this.tabsObserver.observe(this.props.wrapperDivRef.current);
108
+ this.tabObserver.observe(this.props.wrapperDivRef.current, {
109
+ characterData: true,
110
+ attributes: true,
111
+ childList: true,
112
+ subtree: true,
113
+ attributeFilter: ['data-responsive']
114
+ });
115
+ }
116
+ }
117
+ }
118
+
119
+ onResize() {
120
+ // if (this.childrenCurrentList.length !== 0) {
121
+ this.childrenCurrentList = [];
122
+ this.constructChildren(0, false); //}
123
+ } // shouldComponentUpdate() {
124
+ // return this.childrenCurrentList.length === 0
125
+ // }
126
+
127
+
128
+ widthCheck() {
129
+ let wrapperDivRef = this.props.wrapperDivRef.current;
130
+ let moreDivRef = this.props.moreDivRef.current;
131
+
132
+ if (wrapperDivRef && this.childrenCurrentList.length > 0) {
133
+ const childrenWidthList = this.childrenCurrentList; // this.childrenCurrentList = childrenWidthList;
134
+
135
+ const moreWidth = getElementSpace(moreDivRef).neededSpace; //console.log(moreWidth,'moreWidth');
136
+
137
+ let totalWidth = getElementSpace(wrapperDivRef).availableInsideSpace - moreWidth;
138
+ let _childrenTotalWidth = 0;
139
+ let dataCount = 0;
140
+ this.noSpaceForChildren = false;
141
+
142
+ if (totalWidth <= moreWidth) {
143
+ this.noSpaceForChildren = true;
144
+ } else {
145
+ for (let i = 0; i < childrenWidthList.length; i++) {
146
+ let currentWidth = getElementSpace(childrenWidthList[i]).neededSpace;
147
+ _childrenTotalWidth += currentWidth; // console.log(_childrenTotalWidth, currentWidth, totalWidth)
148
+
149
+ if (i === childrenWidthList.length - 1 && moreWidth >= currentWidth) {
150
+ totalWidth += moreWidth;
151
+ }
152
+
153
+ if (totalWidth <= _childrenTotalWidth) {
154
+ dataCount = i;
155
+ break;
156
+ }
157
+ }
158
+ }
159
+
160
+ this.constructChildren(dataCount, true);
161
+ } else {
162
+ this.constructChildren(0, false);
163
+ }
164
+ }
165
+
166
+ constructChildren() {
167
+ let dataCount = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
168
+ let responsive = arguments.length > 1 ? arguments[1] : undefined;
169
+ const {
170
+ childrenList,
171
+ getData
172
+ } = this.props; // If the data count is zero we assume that we can render all the items - data count will be zero only when we want to calculate the whole list width
173
+
174
+ dataCount = dataCount || childrenList && childrenList.length;
175
+ getData({
176
+ responsiveHook: responsive,
177
+ validListCount: this.noSpaceForChildren ? 0 : dataCount
178
+ });
179
+ }
180
+
181
+ render() {
182
+ return /*#__PURE__*/React.createElement(React.Fragment, null, this.props.children);
183
+ }
184
+
185
+ }
186
+ ResizeComponent.propTypes = {
187
+ children: PropTypes.node,
188
+ getData: PropTypes.func,
189
+ resizeId: PropTypes.number,
190
+ childrenList: PropTypes.array,
191
+ wrapperDivRef: PropTypes.any,
192
+ moreDivRef: PropTypes.any
193
+ };
194
+ ResizeComponent.defaultProps = {
195
+ getData: () => {},
196
+ resizeId: null
197
+ };
@@ -0,0 +1,140 @@
1
+ const hasResizeObserver = !!window.ResizeObserver;
2
+ const mutationObserverOptions = {
3
+ //NOTE: we donot consider child Count
4
+ // childList: true,
5
+ attributes: true
6
+ };
7
+
8
+ function getSize(element) {
9
+ let {
10
+ offsetHeight,
11
+ offsetWidth
12
+ } = element; // const { height, width } = element.getBoundingClientRect();
13
+
14
+ return {
15
+ height: offsetHeight,
16
+ width: offsetWidth
17
+ };
18
+ }
19
+
20
+ function dispatch() {
21
+ let resizeResponsive = new Event('resizeResponsive');
22
+ window.dispatchEvent(resizeResponsive);
23
+ }
24
+
25
+ if (!hasResizeObserver) {
26
+ let interval = null;
27
+ window.addEventListener('resize', () => {
28
+ clearTimeout(interval);
29
+ interval = setTimeout(dispatch, 100);
30
+ });
31
+ } // NOTE: this is not full polyfill , we just wrote what types of changes wlli
32
+
33
+
34
+ export default class ResizeObserverPolyfill {
35
+ constructor(onResize) {
36
+ // method finding
37
+ this.transitionEndHandler = this.transitionEndHandler.bind(this);
38
+ this.resizeHandlerDispatch = this.resizeHandlerDispatch.bind(this);
39
+ this.resizeHandler = this.resizeHandler.bind(this);
40
+ this.replaceResizeHandler = this.replaceResizeHandler.bind(this);
41
+ this.debounce = this.debounce.bind(this);
42
+ this.onResize = onResize;
43
+ this.targetNode = null;
44
+ this.size = {
45
+ height: 0,
46
+ width: 0
47
+ };
48
+
49
+ if (hasResizeObserver) {
50
+ this.resizeObserverInstance = new window.ResizeObserver(this.resizeHandlerDispatch);
51
+ } else {
52
+ this.mutationObserverInstance = new window.MutationObserver(this.resizeHandlerDispatch);
53
+ }
54
+ }
55
+
56
+ replaceResizeHandler(onResize) {
57
+ this.onResize = onResize;
58
+ }
59
+
60
+ resizeHandler() {
61
+ if (!this.targetNode) {
62
+ return;
63
+ }
64
+
65
+ const currentSize = getSize(this.targetNode); // if (this.size && shallowCompare(currentSize, this.size)) {
66
+
67
+ if (this.size && currentSize.height === this.size.height && currentSize.width === this.size.width) {
68
+ return;
69
+ }
70
+
71
+ this.size = currentSize;
72
+ this.onResize(this.size, this.targetNode);
73
+ return true;
74
+ }
75
+
76
+ resizeHandlerDispatch() {
77
+ if (!this.resizeHandler() || hasResizeObserver) {
78
+ return;
79
+ }
80
+
81
+ dispatch();
82
+ }
83
+
84
+ debounce() {
85
+ clearTimeout(this.interval);
86
+ this.interval = setTimeout(this.resizeHandler, 100);
87
+ }
88
+
89
+ transitionEndHandler(event) {
90
+ if (event.propertyName.indexOf('color') === -1) {
91
+ this.resizeHandlerDispatch();
92
+ }
93
+ }
94
+
95
+ addEventListeners(targetNode) {
96
+ targetNode.addEventListener('transitionend', this.transitionEndHandler);
97
+ window.addEventListener('resizeResponsive', this.debounce);
98
+ targetNode.addEventListener('animationend', this.resizeHandlerDispatch);
99
+ targetNode.addEventListener('webkitAnimationEnd', this.resizeHandlerDispatch);
100
+ }
101
+
102
+ removeEventListeners(targetNode) {
103
+ targetNode.removeEventListener('transitionend', this.transitionEndHandler);
104
+ window.removeEventListener('resizeResponsive', this.debounce);
105
+ targetNode.removeEventListener('animationend', this.resizeHandlerDispatch);
106
+ targetNode.removeEventListener('webkitAnimationEnd', this.resizeHandlerDispatch);
107
+ }
108
+
109
+ observe(targetNode) {
110
+ this.targetNode = targetNode;
111
+
112
+ if (hasResizeObserver) {
113
+ this.resizeObserverInstance.observe(targetNode);
114
+ } else {
115
+ this.addEventListeners(targetNode);
116
+ this.mutationObserverInstance.observe(targetNode, mutationObserverOptions);
117
+ }
118
+ }
119
+
120
+ replaceObservationElement(targetNode) {
121
+ if (this.targetNode === targetNode) {
122
+ return;
123
+ }
124
+
125
+ this.targetNode && this.disconnect();
126
+ targetNode && this.observe(targetNode);
127
+ targetNode && this.resizeHandlerDispatch();
128
+ }
129
+
130
+ disconnect() {
131
+ this.targetNode && this.removeEventListeners(this.targetNode);
132
+ hasResizeObserver ? this.resizeObserverInstance.disconnect() : this.mutationObserverInstance.disconnect();
133
+ this.targetNode = null;
134
+ this.size = {
135
+ height: 0,
136
+ width: 0
137
+ };
138
+ }
139
+
140
+ }