@spaced-out/ui-design-system 0.0.1-alpha.0

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 (259) hide show
  1. package/.commitlintrc.json +3 -0
  2. package/.cspell/custom-words.txt +22 -0
  3. package/.editorconfig +9 -0
  4. package/.eslintignore +1 -0
  5. package/.eslintrc.yml +122 -0
  6. package/.flowconfig +45 -0
  7. package/.github/workflows/pages.yml +52 -0
  8. package/.prettierrc +11 -0
  9. package/.storybook/SenseTheme.js +12 -0
  10. package/.storybook/main.js +73 -0
  11. package/.storybook/manager-head.html +41 -0
  12. package/.storybook/manager.js +14 -0
  13. package/.storybook/preview-head.html +130 -0
  14. package/.storybook/preview.js +128 -0
  15. package/.storybook/public/favicon.ico +0 -0
  16. package/.storybook/public/favicon.svg +6 -0
  17. package/.storybook/public/fonts/CentraNo2-Book.woff +0 -0
  18. package/.storybook/public/fonts/CentraNo2-Book.woff2 +0 -0
  19. package/.storybook/public/fonts/CentraNo2-BookItalic.woff +0 -0
  20. package/.storybook/public/fonts/CentraNo2-BookItalic.woff2 +0 -0
  21. package/.storybook/public/fonts/CentraNo2-Medium.woff +0 -0
  22. package/.storybook/public/fonts/CentraNo2-Medium.woff2 +0 -0
  23. package/.vscode/extensions.json +3 -0
  24. package/CHANGELOG.md +73 -0
  25. package/README.md +178 -0
  26. package/babel.config.js +24 -0
  27. package/config.js +58 -0
  28. package/cspell.json +26 -0
  29. package/design-tokens/border/app-border.json +41 -0
  30. package/design-tokens/border/base-border.json +41 -0
  31. package/design-tokens/color/app-color.json +226 -0
  32. package/design-tokens/color/base-color.json +265 -0
  33. package/design-tokens/elevation/app-elevation.json +22 -0
  34. package/design-tokens/elevation/base-elevation.json +19 -0
  35. package/design-tokens/font/base-font.json +98 -0
  36. package/design-tokens/index.js +5 -0
  37. package/design-tokens/motion/app.motion.json +24 -0
  38. package/design-tokens/motion/base-motion.json +40 -0
  39. package/design-tokens/opacity/base-opacity.json +49 -0
  40. package/design-tokens/shadow/base-shadow.json +86 -0
  41. package/design-tokens/size/base-size.json +94 -0
  42. package/design-tokens/space/app-space.json +40 -0
  43. package/design-tokens/space/base-space.json +40 -0
  44. package/flow-typed/npm/lodash_v4.x.x.js +6407 -0
  45. package/git-conventional-commits.json +43 -0
  46. package/gulpfile.js +48 -0
  47. package/jest.config.js +9 -0
  48. package/lib/assets/fontawesome/LICENSE.txt +18 -0
  49. package/lib/assets/fontawesome/css/all.min.css +27184 -0
  50. package/lib/assets/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  51. package/lib/assets/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  52. package/lib/assets/fontawesome/webfonts/fa-duotone-900.ttf +0 -0
  53. package/lib/assets/fontawesome/webfonts/fa-duotone-900.woff2 +0 -0
  54. package/lib/assets/fontawesome/webfonts/fa-light-300.ttf +0 -0
  55. package/lib/assets/fontawesome/webfonts/fa-light-300.woff2 +0 -0
  56. package/lib/assets/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  57. package/lib/assets/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  58. package/lib/assets/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  59. package/lib/assets/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  60. package/lib/assets/fontawesome/webfonts/fa-thin-100.ttf +0 -0
  61. package/lib/assets/fontawesome/webfonts/fa-thin-100.woff2 +0 -0
  62. package/lib/assets/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
  63. package/lib/assets/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
  64. package/lib/components/Button/Button.js +120 -0
  65. package/lib/components/Button/Button.js.flow +166 -0
  66. package/lib/components/Button/Button.module.css +226 -0
  67. package/lib/components/Button/index.js +24 -0
  68. package/lib/components/Button/index.js.flow +4 -0
  69. package/lib/components/ButtonDropdown/ButtonDropdown.js +89 -0
  70. package/lib/components/ButtonDropdown/ButtonDropdown.js.flow +119 -0
  71. package/lib/components/ButtonDropdown/ButtonDropdown.module.css +4 -0
  72. package/lib/components/ButtonDropdown/index.js +12 -0
  73. package/lib/components/ButtonDropdown/index.js.flow +4 -0
  74. package/lib/components/Checkbox/Checkbox.js +99 -0
  75. package/lib/components/Checkbox/Checkbox.js.flow +133 -0
  76. package/lib/components/Checkbox/Checkbox.module.css +160 -0
  77. package/lib/components/Checkbox/CheckboxGroup.js +85 -0
  78. package/lib/components/Checkbox/CheckboxGroup.js.flow +105 -0
  79. package/lib/components/Checkbox/CheckboxGroup.module.css +47 -0
  80. package/lib/components/Checkbox/index.js +19 -0
  81. package/lib/components/Checkbox/index.js.flow +3 -0
  82. package/lib/components/CircularLoader/CircularLoader.js +44 -0
  83. package/lib/components/CircularLoader/CircularLoader.js.flow +44 -0
  84. package/lib/components/CircularLoader/CircularLoader.module.css +81 -0
  85. package/lib/components/CircularLoader/index.js +12 -0
  86. package/lib/components/CircularLoader/index.js.flow +3 -0
  87. package/lib/components/CodeBlock.js +26 -0
  88. package/lib/components/CodeBlock.js.flow +19 -0
  89. package/lib/components/Dialog/Dialog.js +148 -0
  90. package/lib/components/Dialog/Dialog.js.flow +165 -0
  91. package/lib/components/Dialog/Dialog.module.css +87 -0
  92. package/lib/components/Dialog/index.js +36 -0
  93. package/lib/components/Dialog/index.js.flow +14 -0
  94. package/lib/components/Dropdown/Dropdown.js +108 -0
  95. package/lib/components/Dropdown/Dropdown.js.flow +129 -0
  96. package/lib/components/Dropdown/Dropdown.module.css +14 -0
  97. package/lib/components/Dropdown/index.js +18 -0
  98. package/lib/components/Dropdown/index.js.flow +4 -0
  99. package/lib/components/Grid/Grid.js +82 -0
  100. package/lib/components/Grid/Grid.js.flow +88 -0
  101. package/lib/components/Grid/Grid.module.css +30 -0
  102. package/lib/components/Grid/index.js +16 -0
  103. package/lib/components/Grid/index.js.flow +3 -0
  104. package/lib/components/Icon/ClickableIcon.js +51 -0
  105. package/lib/components/Icon/ClickableIcon.js.flow +51 -0
  106. package/lib/components/Icon/ClickableIcon.module.css +50 -0
  107. package/lib/components/Icon/FontAwesomeLibrary.js +3 -0
  108. package/lib/components/Icon/FontAwesomeLibrary.js.flow +3 -0
  109. package/lib/components/Icon/Icon.js +38 -0
  110. package/lib/components/Icon/Icon.js.flow +51 -0
  111. package/lib/components/Icon/index.js +25 -0
  112. package/lib/components/Icon/index.js.flow +6 -0
  113. package/lib/components/InContextAlert/InContextAlert.js +121 -0
  114. package/lib/components/InContextAlert/InContextAlert.js.flow +173 -0
  115. package/lib/components/InContextAlert/InContextAlert.module.css +54 -0
  116. package/lib/components/InContextAlert/index.js +18 -0
  117. package/lib/components/InContextAlert/index.js.flow +3 -0
  118. package/lib/components/Input/Input.js +172 -0
  119. package/lib/components/Input/Input.js.flow +246 -0
  120. package/lib/components/Input/Input.module.css +122 -0
  121. package/lib/components/Input/index.js +12 -0
  122. package/lib/components/Input/index.js.flow +4 -0
  123. package/lib/components/LinearLoader/LinearLoader.js +35 -0
  124. package/lib/components/LinearLoader/LinearLoader.js.flow +34 -0
  125. package/lib/components/LinearLoader/LinearLoader.module.css +43 -0
  126. package/lib/components/LinearLoader/index.js +12 -0
  127. package/lib/components/LinearLoader/index.js.flow +3 -0
  128. package/lib/components/Menu/Menu.js +76 -0
  129. package/lib/components/Menu/Menu.js.flow +85 -0
  130. package/lib/components/Menu/Menu.module.css +124 -0
  131. package/lib/components/Menu/index.js +12 -0
  132. package/lib/components/Menu/index.js.flow +4 -0
  133. package/lib/components/Modal/Modal.js +121 -0
  134. package/lib/components/Modal/Modal.js.flow +157 -0
  135. package/lib/components/Modal/Modal.module.css +62 -0
  136. package/lib/components/Modal/index.js +12 -0
  137. package/lib/components/Modal/index.js.flow +3 -0
  138. package/lib/components/Notification/Notification.js +89 -0
  139. package/lib/components/Notification/Notification.js.flow +136 -0
  140. package/lib/components/Notification/Notification.module.css +54 -0
  141. package/lib/components/Notification/index.js +18 -0
  142. package/lib/components/Notification/index.js.flow +3 -0
  143. package/lib/components/Panel/Panel.js +96 -0
  144. package/lib/components/Panel/Panel.js.flow +109 -0
  145. package/lib/components/Panel/Panel.module.css +77 -0
  146. package/lib/components/Panel/index.js +30 -0
  147. package/lib/components/Panel/index.js.flow +10 -0
  148. package/lib/components/RadioButton/RadioButton.js +76 -0
  149. package/lib/components/RadioButton/RadioButton.js.flow +102 -0
  150. package/lib/components/RadioButton/RadioButton.module.css +122 -0
  151. package/lib/components/RadioButton/RadioGroup.js +60 -0
  152. package/lib/components/RadioButton/RadioGroup.js.flow +85 -0
  153. package/lib/components/RadioButton/RadioGroup.module.css +47 -0
  154. package/lib/components/RadioButton/index.js +19 -0
  155. package/lib/components/RadioButton/index.js.flow +3 -0
  156. package/lib/components/SearchInput/SearchInput.js +47 -0
  157. package/lib/components/SearchInput/SearchInput.js.flow +73 -0
  158. package/lib/components/SearchInput/SearchInput.module.css +11 -0
  159. package/lib/components/SearchInput/index.js +12 -0
  160. package/lib/components/SearchInput/index.js.flow +4 -0
  161. package/lib/components/Text/Text.js +195 -0
  162. package/lib/components/Text/Text.js.flow +160 -0
  163. package/lib/components/Text/index.js +103 -0
  164. package/lib/components/Text/index.js.flow +21 -0
  165. package/lib/components/Textarea/Textarea.js +95 -0
  166. package/lib/components/Textarea/Textarea.js.flow +133 -0
  167. package/lib/components/Textarea/Textarea.module.css +110 -0
  168. package/lib/components/Textarea/index.js +12 -0
  169. package/lib/components/Textarea/index.js.flow +4 -0
  170. package/lib/components/Toast/Toast.js +187 -0
  171. package/lib/components/Toast/Toast.js.flow +210 -0
  172. package/lib/components/Toast/Toast.module.css +52 -0
  173. package/lib/components/Toast/ToastContainer.js +129 -0
  174. package/lib/components/Toast/ToastContainer.js.flow +125 -0
  175. package/lib/components/Toast/ToastContainer.module.css +41 -0
  176. package/lib/components/Toast/ToastManager.js +62 -0
  177. package/lib/components/Toast/ToastManager.js.flow +67 -0
  178. package/lib/components/Toast/index.js +56 -0
  179. package/lib/components/Toast/index.js.flow +12 -0
  180. package/lib/components/Toggle/Toggle.js +69 -0
  181. package/lib/components/Toggle/Toggle.js.flow +94 -0
  182. package/lib/components/Toggle/Toggle.module.css +144 -0
  183. package/lib/components/Toggle/index.js +12 -0
  184. package/lib/components/Toggle/index.js.flow +2 -0
  185. package/lib/components/Tooltip/Tooltip.js +81 -0
  186. package/lib/components/Tooltip/Tooltip.js.flow +110 -0
  187. package/lib/components/Tooltip/Tooltip.module.css +16 -0
  188. package/lib/components/Tooltip/index.js +12 -0
  189. package/lib/components/Tooltip/index.js.flow +4 -0
  190. package/lib/components/Truncate/Truncate.js +28 -0
  191. package/lib/components/Truncate/Truncate.js.flow +22 -0
  192. package/lib/components/Truncate/Truncate.module.css +6 -0
  193. package/lib/components/Truncate/index.js +12 -0
  194. package/lib/components/Truncate/index.js.flow +4 -0
  195. package/lib/components/Typeahead/Typeahead.js +124 -0
  196. package/lib/components/Typeahead/Typeahead.js.flow +153 -0
  197. package/lib/components/Typeahead/Typeahead.module.css +10 -0
  198. package/lib/components/Typeahead/index.js +12 -0
  199. package/lib/components/Typeahead/index.js.flow +4 -0
  200. package/lib/hooks/index.js +27 -0
  201. package/lib/hooks/index.js.flow +4 -0
  202. package/lib/hooks/useMountTransition.js +25 -0
  203. package/lib/hooks/useMountTransition.js.flow +27 -0
  204. package/lib/hooks/useToastPortal.js +32 -0
  205. package/lib/hooks/useToastPortal.js.flow +30 -0
  206. package/lib/styles/animation.module.css +9 -0
  207. package/lib/styles/border.module.css +27 -0
  208. package/lib/styles/shadow.module.css +42 -0
  209. package/lib/styles/typography.module.css +227 -0
  210. package/lib/styles/variables/_border.css +21 -0
  211. package/lib/styles/variables/_border.js +29 -0
  212. package/lib/styles/variables/_border.js.flow +23 -0
  213. package/lib/styles/variables/_color.css +131 -0
  214. package/lib/styles/variables/_color.js +139 -0
  215. package/lib/styles/variables/_color.js.flow +133 -0
  216. package/lib/styles/variables/_elevation.css +11 -0
  217. package/lib/styles/variables/_elevation.js +19 -0
  218. package/lib/styles/variables/_elevation.js.flow +13 -0
  219. package/lib/styles/variables/_font.css +51 -0
  220. package/lib/styles/variables/_font.js +59 -0
  221. package/lib/styles/variables/_font.js.flow +53 -0
  222. package/lib/styles/variables/_motion.css +11 -0
  223. package/lib/styles/variables/_motion.js +19 -0
  224. package/lib/styles/variables/_motion.js.flow +13 -0
  225. package/lib/styles/variables/_opacity.css +29 -0
  226. package/lib/styles/variables/_opacity.js +37 -0
  227. package/lib/styles/variables/_opacity.js.flow +31 -0
  228. package/lib/styles/variables/_shadow.css +47 -0
  229. package/lib/styles/variables/_shadow.js +55 -0
  230. package/lib/styles/variables/_shadow.js.flow +49 -0
  231. package/lib/styles/variables/_size.css +59 -0
  232. package/lib/styles/variables/_size.js +67 -0
  233. package/lib/styles/variables/_size.js.flow +61 -0
  234. package/lib/styles/variables/_space.css +23 -0
  235. package/lib/styles/variables/_space.js +31 -0
  236. package/lib/styles/variables/_space.js.flow +25 -0
  237. package/lib/types/common.js +1 -0
  238. package/lib/types/common.js.flow +3 -0
  239. package/lib/types/toast.js +24 -0
  240. package/lib/types/toast.js.flow +41 -0
  241. package/lib/types/typography.js +22 -0
  242. package/lib/types/typography.js.flow +18 -0
  243. package/lib/utils/classify.js +33 -0
  244. package/lib/utils/classify.js.flow +29 -0
  245. package/lib/utils/click-away.js +110 -0
  246. package/lib/utils/click-away.js.flow +134 -0
  247. package/lib/utils/dom.js +202 -0
  248. package/lib/utils/dom.js.flow +238 -0
  249. package/lib/utils/helpers.js +16 -0
  250. package/lib/utils/helpers.js.flow +11 -0
  251. package/lib/utils/makeClassNameComponent.js +58 -0
  252. package/lib/utils/makeClassNameComponent.js.flow +71 -0
  253. package/lib/utils/merge-refs.js +17 -0
  254. package/lib/utils/merge-refs.js.flow +14 -0
  255. package/lint-staged.config.js +5 -0
  256. package/package.json +114 -0
  257. package/postcss.config.js +3 -0
  258. package/pull_request_template.md +48 -0
  259. package/settings.json +3 -0
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.cancelEvent = cancelEvent;
7
+ exports.checkDateInputSupport = checkDateInputSupport;
8
+ exports.createElement = createElement;
9
+ exports.forget = forget;
10
+ exports.getAnchorPosition = getAnchorPosition;
11
+ exports.getFixedAnchorPosition = getFixedAnchorPosition;
12
+ exports.getListPasteHandler = void 0;
13
+ exports.listen = listen;
14
+ exports.pageHeight = pageHeight;
15
+ exports.pxToNumber = pxToNumber;
16
+ exports.requestPointerLock = requestPointerLock;
17
+ exports.stopEvent = stopEvent;
18
+ exports.stopEventImmediately = stopEventImmediately;
19
+
20
+ function createElement(document, type, props) {
21
+ const el = document.createElement(type);
22
+ return Object.assign(el, props);
23
+ }
24
+ function pageHeight() {
25
+ const {
26
+ body,
27
+ documentElement
28
+ } = window.document;
29
+ return Math.max(body.scrollHeight, body.clientHeight, documentElement.scrollHeight, documentElement.clientHeight);
30
+ }
31
+ function getFixedAnchorPosition(element) {
32
+ let placement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
33
+ let pad = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
34
+ let justify = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'center';
35
+ const rect = element.getBoundingClientRect();
36
+ const docX = rect.left;
37
+ const docY = rect.top;
38
+ let x, y;
39
+ switch (placement) {
40
+ case 'bottom':
41
+ y = docY + rect.height + pad;
42
+ switch (justify) {
43
+ case 'start':
44
+ x = docX;
45
+ break;
46
+ case 'center':
47
+ x = docX + rect.width / 2;
48
+ break;
49
+ case 'end':
50
+ default:
51
+ x = docX + rect.width;
52
+ break;
53
+ }
54
+ break;
55
+ case 'left':
56
+ x = docX - pad;
57
+ switch (justify) {
58
+ case 'start':
59
+ y = docY;
60
+ break;
61
+ case 'center':
62
+ y = docY + rect.height / 2;
63
+ break;
64
+ case 'end':
65
+ default:
66
+ y = docY + rect.height;
67
+ break;
68
+ }
69
+ break;
70
+ case 'right':
71
+ x = docX + rect.width + pad;
72
+ y = docY + rect.height / 2;
73
+ break;
74
+ default:
75
+ y = docY - pad;
76
+ switch (justify) {
77
+ case 'start':
78
+ x = docX;
79
+ break;
80
+ case 'center':
81
+ x = docX + rect.width / 2;
82
+ break;
83
+ case 'end':
84
+ default:
85
+ x = docX + rect.width;
86
+ break;
87
+ }
88
+ break;
89
+ }
90
+ return {
91
+ x,
92
+ y,
93
+ placement
94
+ };
95
+ }
96
+ function getAnchorPosition(element) {
97
+ let placement = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top';
98
+ let pad = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
99
+ let justify = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'center';
100
+ const position = getFixedAnchorPosition(element, placement, pad, justify);
101
+ const documentStyle = window.document.documentElement.style;
102
+ return {
103
+ ...position,
104
+ x: position.x + window.pageXOffset - pxToNumber(documentStyle.paddingLeft),
105
+ y: position.y + window.pageYOffset - pxToNumber(documentStyle.paddingTop)
106
+ };
107
+ }
108
+ function pxToNumber(px) {
109
+ return parseFloat(px.replace('px', '') || '0');
110
+ }
111
+
112
+ // TODO (kyle): add more handler types?
113
+
114
+ function listen(target, handlers, options) {
115
+ let hook = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'addEventListener';
116
+ for (const eventName in handlers) {
117
+ // $FlowFixMe indexing valid EventTarget properties
118
+ target[hook](eventName, handlers[eventName], options);
119
+ }
120
+ }
121
+ function forget(target, events, options) {
122
+ return listen(target, events, options, 'removeEventListener');
123
+ }
124
+ function stopEvent(event) {
125
+ event.stopPropagation();
126
+ }
127
+ function stopEventImmediately(event) {
128
+ event.nativeEvent.stopImmediatePropagation();
129
+ }
130
+ function cancelEvent(event) {
131
+ event.stopPropagation();
132
+ event.preventDefault();
133
+ }
134
+ function requestPointerLock(element) {
135
+ return new Promise((resolve, reject) => {
136
+ const handleChange = () => {
137
+ // $FlowIssue
138
+ if (document.pointerLockElement === element) {
139
+ resolve();
140
+ removeHandlers();
141
+ }
142
+ };
143
+ const handleError = () => {
144
+ reject();
145
+ removeHandlers();
146
+ };
147
+ const removeHandlers = () => {
148
+ // $FlowFixMe
149
+ forget(document, {
150
+ pointerlockchange: handleChange,
151
+ pointerlockerror: handleError
152
+ });
153
+ };
154
+
155
+ // $FlowFixMe
156
+ listen(document, {
157
+ pointerlockchange: handleChange,
158
+ pointerlockerror: handleError
159
+ });
160
+ element.requestPointerLock();
161
+ });
162
+ }
163
+ function checkDateInputSupport() {
164
+ const input = window.document.createElement('input');
165
+ input.setAttribute('type', 'date');
166
+ const notADateValue = 'not-a-date';
167
+ input.setAttribute('value', notADateValue);
168
+ return input.value !== notADateValue;
169
+ }
170
+ //reference: https://stackoverflow.com/a/10199306
171
+
172
+ const getListPasteHandler = _ref => {
173
+ let {
174
+ listItemSeparatorRegex = /[\,\n]/,
175
+ handleValue
176
+ } = _ref;
177
+ const handlePaste = event => {
178
+ const value = event.clipboardData?.getData('text');
179
+ if (!value || !value.length) {
180
+ return;
181
+ }
182
+ //do nothing if the copied string fails the regex test
183
+ if (!listItemSeparatorRegex.test(value)) {
184
+ return;
185
+ }
186
+ event.preventDefault();
187
+ const parsedValues = value.split(listItemSeparatorRegex).reduce((acc, val) => {
188
+ const newVal = val.trim();
189
+ if (
190
+ // value exists
191
+ !!newVal.length &&
192
+ // value not already in queue
193
+ !acc.includes(newVal)) {
194
+ acc.push(newVal);
195
+ }
196
+ return acc;
197
+ }, []);
198
+ handleValue?.(parsedValues);
199
+ };
200
+ return handlePaste;
201
+ };
202
+ exports.getListPasteHandler = getListPasteHandler;
@@ -0,0 +1,238 @@
1
+ // @flow strict
2
+
3
+ export type Placement = 'top' | 'left' | 'right' | 'bottom';
4
+ export type ArrowPosition = 'start' | 'center' | 'end';
5
+ export type Justify = ArrowPosition;
6
+
7
+ export type PositionedPlacement = {
8
+ placement: Placement,
9
+ x: number,
10
+ y: number,
11
+ };
12
+
13
+ export function createElement(
14
+ document: Document,
15
+ type: string,
16
+ props: {[string]: mixed, ...},
17
+ ): HTMLElement {
18
+ const el = document.createElement(type);
19
+ return Object.assign(el, props);
20
+ }
21
+
22
+ export function pageHeight(): number {
23
+ const {body, documentElement} = window.document;
24
+ return Math.max(
25
+ body.scrollHeight,
26
+ body.clientHeight,
27
+ documentElement.scrollHeight,
28
+ documentElement.clientHeight,
29
+ );
30
+ }
31
+
32
+ export function getFixedAnchorPosition(
33
+ element: HTMLElement,
34
+ placement: Placement = 'top',
35
+ pad?: number = 0,
36
+ justify?: Justify = 'center',
37
+ ): PositionedPlacement {
38
+ const rect = element.getBoundingClientRect();
39
+
40
+ const docX = rect.left;
41
+ const docY = rect.top;
42
+
43
+ let x, y;
44
+
45
+ switch (placement) {
46
+ case 'bottom':
47
+ y = docY + rect.height + pad;
48
+ switch (justify) {
49
+ case 'start':
50
+ x = docX;
51
+ break;
52
+ case 'center':
53
+ x = docX + rect.width / 2;
54
+ break;
55
+ case 'end':
56
+ default:
57
+ x = docX + rect.width;
58
+ break;
59
+ }
60
+ break;
61
+ case 'left':
62
+ x = docX - pad;
63
+ switch (justify) {
64
+ case 'start':
65
+ y = docY;
66
+ break;
67
+ case 'center':
68
+ y = docY + rect.height / 2;
69
+ break;
70
+ case 'end':
71
+ default:
72
+ y = docY + rect.height;
73
+ break;
74
+ }
75
+ break;
76
+ case 'right':
77
+ x = docX + rect.width + pad;
78
+ y = docY + rect.height / 2;
79
+ break;
80
+ default:
81
+ y = docY - pad;
82
+ switch (justify) {
83
+ case 'start':
84
+ x = docX;
85
+ break;
86
+ case 'center':
87
+ x = docX + rect.width / 2;
88
+ break;
89
+ case 'end':
90
+ default:
91
+ x = docX + rect.width;
92
+ break;
93
+ }
94
+ break;
95
+ }
96
+
97
+ return {x, y, placement};
98
+ }
99
+
100
+ export function getAnchorPosition(
101
+ element: HTMLElement,
102
+ placement?: Placement = 'top',
103
+ pad?: number = 0,
104
+ justify?: Justify = 'center',
105
+ ): PositionedPlacement {
106
+ const position = getFixedAnchorPosition(element, placement, pad, justify);
107
+ const documentStyle = window.document.documentElement.style;
108
+ return {
109
+ ...position,
110
+ x: position.x + window.pageXOffset - pxToNumber(documentStyle.paddingLeft),
111
+ y: position.y + window.pageYOffset - pxToNumber(documentStyle.paddingTop),
112
+ };
113
+ }
114
+
115
+ export function pxToNumber(px: string): number {
116
+ return parseFloat(px.replace('px', '') || '0');
117
+ }
118
+
119
+ // TODO (kyle): add more handler types?
120
+ type Handlers = $Shape<{
121
+ click: (MouseEvent) => mixed,
122
+ mousedown: (MouseEvent) => mixed,
123
+ mouseup: (MouseEvent) => mixed,
124
+ pointerdown: (PointerEvent) => mixed,
125
+ pointerup: (PointerEvent) => mixed,
126
+ pointercancel: (PointerEvent) => mixed,
127
+ [string]: (Event) => mixed,
128
+ }>;
129
+ export function listen(
130
+ target: EventTarget,
131
+ handlers: Handlers,
132
+ options?: EventListenerOptionsOrUseCapture,
133
+ hook: 'addEventListener' | 'removeEventListener' = 'addEventListener',
134
+ ) {
135
+ for (const eventName in handlers) {
136
+ // $FlowFixMe indexing valid EventTarget properties
137
+ target[hook](eventName, handlers[eventName], options);
138
+ }
139
+ }
140
+
141
+ export function forget(
142
+ target: EventTarget,
143
+ events: Handlers,
144
+ options: EventListenerOptionsOrUseCapture,
145
+ ): void {
146
+ return listen(target, events, options, 'removeEventListener');
147
+ }
148
+
149
+ type MixedEvent = SyntheticEvent<EventTarget> | Event;
150
+ export function stopEvent(event: MixedEvent) {
151
+ event.stopPropagation();
152
+ }
153
+ export function stopEventImmediately(event: SyntheticEvent<EventTarget>) {
154
+ event.nativeEvent.stopImmediatePropagation();
155
+ }
156
+ export function cancelEvent(event: MixedEvent) {
157
+ event.stopPropagation();
158
+ event.preventDefault();
159
+ }
160
+
161
+ export function requestPointerLock(element: Element): Promise<void> {
162
+ return new Promise((resolve, reject) => {
163
+ const handleChange = () => {
164
+ // $FlowIssue
165
+ if (document.pointerLockElement === element) {
166
+ resolve();
167
+ removeHandlers();
168
+ }
169
+ };
170
+ const handleError = () => {
171
+ reject();
172
+ removeHandlers();
173
+ };
174
+ const removeHandlers = () => {
175
+ // $FlowFixMe
176
+ forget(document, {
177
+ pointerlockchange: handleChange,
178
+ pointerlockerror: handleError,
179
+ });
180
+ };
181
+
182
+ // $FlowFixMe
183
+ listen(document, {
184
+ pointerlockchange: handleChange,
185
+ pointerlockerror: handleError,
186
+ });
187
+
188
+ element.requestPointerLock();
189
+ });
190
+ }
191
+
192
+ export function checkDateInputSupport(): boolean {
193
+ const input = window.document.createElement('input');
194
+ input.setAttribute('type', 'date');
195
+
196
+ const notADateValue = 'not-a-date';
197
+ input.setAttribute('value', notADateValue);
198
+
199
+ return input.value !== notADateValue;
200
+ }
201
+ //reference: https://stackoverflow.com/a/10199306
202
+
203
+ export const getListPasteHandler = ({
204
+ listItemSeparatorRegex = /[\,\n]/,
205
+ handleValue,
206
+ }: {
207
+ listItemSeparatorRegex?: RegExp,
208
+ handleValue?: (string[]) => mixed,
209
+ }): ((ClipboardEvent) => mixed) => {
210
+ const handlePaste = (event: ClipboardEvent) => {
211
+ const value = event.clipboardData?.getData('text');
212
+ if (!value || !value.length) {
213
+ return;
214
+ }
215
+ //do nothing if the copied string fails the regex test
216
+ if (!listItemSeparatorRegex.test(value)) {
217
+ return;
218
+ }
219
+ event.preventDefault();
220
+ const parsedValues = value
221
+ .split(listItemSeparatorRegex)
222
+ .reduce((acc, val) => {
223
+ const newVal = val.trim();
224
+ if (
225
+ // value exists
226
+ !!newVal.length &&
227
+ // value not already in queue
228
+ !acc.includes(newVal)
229
+ ) {
230
+ acc.push(newVal);
231
+ }
232
+ return acc;
233
+ }, []);
234
+ handleValue?.(parsedValues);
235
+ };
236
+
237
+ return handlePaste;
238
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.uuid = void 0;
7
+
8
+ const uuid = () => {
9
+ let dt = new Date().getTime();
10
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
11
+ const r = (dt + Math.random() * 16) % 16 | 0;
12
+ dt = Math.floor(dt / 16);
13
+ return (c === 'x' ? r : r & 0x3 | 0x8).toString(16);
14
+ });
15
+ };
16
+ exports.uuid = uuid;
@@ -0,0 +1,11 @@
1
+ // @flow strict
2
+
3
+ export const uuid = (): string => {
4
+ let dt = new Date().getTime();
5
+
6
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
7
+ const r = (dt + Math.random() * 16) % 16 | 0;
8
+ dt = Math.floor(dt / 16);
9
+ return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);
10
+ });
11
+ };
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = makeClassNameComponent;
7
+ exports.makeClassNameComponentCustom = makeClassNameComponentCustom;
8
+ exports.nameHoc = nameHoc;
9
+ var React = _interopRequireWildcard(require("react"));
10
+ var _classify = _interopRequireDefault(require("./classify"));
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
14
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
15
+
16
+ function nameHoc(WrapperComponent, WrappedComponent, hocName) {
17
+ const wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';
18
+ WrapperComponent.displayName = `${hocName}(${wrappedComponentName})`;
19
+ return WrapperComponent;
20
+ }
21
+ function makeClassNameComponent(baseClassName) {
22
+ let ComponentType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'div';
23
+ let name = arguments.length > 2 ? arguments[2] : undefined;
24
+ return /*#__PURE__*/React.forwardRef(
25
+ // $FlowFixMe[escaped-generic]
26
+ nameComponent((_ref, ref) => {
27
+ let {
28
+ className,
29
+ ...props
30
+ } = _ref;
31
+ return (
32
+ /*#__PURE__*/
33
+ // $FlowFixMe[escaped-generic]
34
+ (0, _jsxRuntime.js)(ComponentType, {
35
+ ...props,
36
+ ref: ref,
37
+ className: (0, _classify.default)(baseClassName, className)
38
+ })
39
+ );
40
+ }, `CNC(${name || ComponentType})`));
41
+ }
42
+ function makeClassNameComponentCustom(baseClassName, ComponentType) {
43
+ return /*#__PURE__*/React.forwardRef(nameHoc((_ref2, ref) => {
44
+ let {
45
+ className,
46
+ ...props
47
+ } = _ref2;
48
+ return /*#__PURE__*/(0, _jsxRuntime.js)(ComponentType, {
49
+ ...props,
50
+ ref: ref,
51
+ className: (0, _classify.default)(baseClassName, className)
52
+ });
53
+ }, ComponentType, 'CNC'));
54
+ }
55
+ function nameComponent(component, name) {
56
+ component.displayName = name;
57
+ return component;
58
+ }
@@ -0,0 +1,71 @@
1
+ // @flow strict
2
+
3
+ import * as React from 'react';
4
+
5
+ import classify from './classify';
6
+
7
+
8
+ export function nameHoc<C, T: React.ComponentType<C>, C2>(
9
+ WrapperComponent: T,
10
+ WrappedComponent: React.ComponentType<C2>,
11
+ hocName: string,
12
+ ): T {
13
+ const wrappedComponentName =
14
+ WrappedComponent.displayName || WrappedComponent.name || 'Component';
15
+ WrapperComponent.displayName = `${hocName}(${wrappedComponentName})`;
16
+ return WrapperComponent;
17
+ }
18
+
19
+ export type ClassNameComponent<
20
+ T = 'div',
21
+ I = React.ElementRef<T>,
22
+ > = React.AbstractComponent<React.ElementConfig<T>, I>;
23
+
24
+ export default function makeClassNameComponent<C: string>(
25
+ baseClassName: string,
26
+ // $FlowFixMe not sure how to type this correctly
27
+ ComponentType: C = 'div',
28
+ name?: string,
29
+ ): React.AbstractComponent<React.ElementConfig<C>, React.ElementRef<C>> {
30
+ return React.forwardRef(
31
+ // $FlowFixMe[escaped-generic]
32
+ nameComponent(
33
+ ({className, ...props}, ref) => (
34
+ // $FlowFixMe[escaped-generic]
35
+ <ComponentType
36
+ {...props}
37
+ ref={ref}
38
+ className={classify(baseClassName, className)}
39
+ />
40
+ ),
41
+ `CNC(${name || ComponentType})`,
42
+ ),
43
+ );
44
+ }
45
+
46
+ export function makeClassNameComponentCustom<
47
+ C: $ReadOnly<{className?: string}>,
48
+ B,
49
+ >(
50
+ baseClassName: string,
51
+ ComponentType: React.AbstractComponent<C, B>,
52
+ ): React.AbstractComponent<C, B> {
53
+ return React.forwardRef(
54
+ nameHoc(
55
+ ({className, ...props}, ref) => (
56
+ <ComponentType
57
+ {...props}
58
+ ref={ref}
59
+ className={classify(baseClassName, className)}
60
+ />
61
+ ),
62
+ ComponentType,
63
+ 'CNC',
64
+ ),
65
+ );
66
+ }
67
+
68
+ function nameComponent(component, name) {
69
+ component.displayName = name;
70
+ return component;
71
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.mergeRefs = mergeRefs;
7
+ function mergeRefs(refs) {
8
+ return value => {
9
+ refs.forEach(ref => {
10
+ if (typeof ref === 'function') {
11
+ ref(value);
12
+ } else if (ref != null) {
13
+ ref.current = value;
14
+ }
15
+ });
16
+ };
17
+ }
@@ -0,0 +1,14 @@
1
+ // @flow strict
2
+ export function mergeRefs(
3
+ refs: Array<{current: ?HTMLElement, ...}>,
4
+ ): (value: empty) => void {
5
+ return (value) => {
6
+ refs.forEach((ref) => {
7
+ if (typeof ref === 'function') {
8
+ ref(value);
9
+ } else if (ref != null) {
10
+ ref.current = value;
11
+ }
12
+ });
13
+ };
14
+ }
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ 'src/**/*.{js,jsx}': [`prettier --write`, `eslint src --fix`],
3
+ 'src/**/*.css': [`prettier --write`],
4
+ '**': [`cspell`],
5
+ };