cx 22.11.0 → 22.11.2

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 (775) hide show
  1. package/LICENSE-THIRD-PARTY.md +91 -91
  2. package/LICENSE.md +7 -7
  3. package/README.md +46 -46
  4. package/dist/data.js +2510 -2510
  5. package/dist/manifest.js +458 -458
  6. package/dist/ui.js +5245 -5245
  7. package/dist/widgets.js +22007 -21991
  8. package/index.js +17 -17
  9. package/locale/de-de.js +69 -69
  10. package/locale/en-us.js +71 -71
  11. package/locale/es-es.js +69 -69
  12. package/locale/fr-fr.js +70 -70
  13. package/locale/nl-nl.js +75 -75
  14. package/locale/pt-pt.js +63 -63
  15. package/locale/sr-latn-ba.js +70 -70
  16. package/package.json +30 -30
  17. package/src/charts/Bar.d.ts +27 -27
  18. package/src/charts/Bar.js +89 -89
  19. package/src/charts/Bar.scss +26 -26
  20. package/src/charts/BarGraph.d.ts +16 -16
  21. package/src/charts/BarGraph.js +110 -110
  22. package/src/charts/BarGraph.scss +27 -27
  23. package/src/charts/BubbleGraph.js +92 -92
  24. package/src/charts/BubbleGraph.scss +29 -29
  25. package/src/charts/Chart.d.ts +12 -12
  26. package/src/charts/Chart.js +77 -77
  27. package/src/charts/ColorMap.d.ts +21 -21
  28. package/src/charts/ColorMap.js +98 -98
  29. package/src/charts/Column.scss +26 -26
  30. package/src/charts/ColumnBarBase.d.ts +61 -61
  31. package/src/charts/ColumnBarBase.js +169 -169
  32. package/src/charts/ColumnBarGraphBase.d.ts +71 -71
  33. package/src/charts/ColumnBarGraphBase.js +119 -119
  34. package/src/charts/ColumnGraph.d.ts +19 -19
  35. package/src/charts/ColumnGraph.js +114 -114
  36. package/src/charts/ColumnGraph.scss +27 -27
  37. package/src/charts/Grid.js +5 -5
  38. package/src/charts/Gridlines.d.ts +24 -24
  39. package/src/charts/Gridlines.js +48 -48
  40. package/src/charts/Gridlines.scss +22 -22
  41. package/src/charts/Legend.d.ts +26 -26
  42. package/src/charts/Legend.js +142 -142
  43. package/src/charts/Legend.scss +41 -41
  44. package/src/charts/LegendEntry.d.ts +37 -37
  45. package/src/charts/LegendEntry.js +117 -117
  46. package/src/charts/LegendEntry.scss +30 -30
  47. package/src/charts/LineGraph.d.ts +45 -44
  48. package/src/charts/LineGraph.js +201 -201
  49. package/src/charts/LineGraph.scss +23 -23
  50. package/src/charts/Marker.d.ts +87 -87
  51. package/src/charts/Marker.js +287 -287
  52. package/src/charts/Marker.scss +41 -41
  53. package/src/charts/MarkerLine.d.ts +57 -57
  54. package/src/charts/MarkerLine.js +128 -128
  55. package/src/charts/MarkerLine.scss +17 -17
  56. package/src/charts/MouseTracker.d.ts +16 -16
  57. package/src/charts/MouseTracker.js +80 -80
  58. package/src/charts/Pie.js +8 -8
  59. package/src/charts/PieChart.d.ts +80 -80
  60. package/src/charts/PieChart.js +370 -370
  61. package/src/charts/PieChart.scss +26 -26
  62. package/src/charts/PieLabel.d.ts +26 -26
  63. package/src/charts/PieLabel.js +65 -65
  64. package/src/charts/PieLabelsContainer.d.ts +3 -3
  65. package/src/charts/PieLabelsContainer.js +55 -55
  66. package/src/charts/Range.d.ts +74 -74
  67. package/src/charts/Range.js +205 -205
  68. package/src/charts/Range.scss +18 -18
  69. package/src/charts/ScatterGraph.d.ts +65 -65
  70. package/src/charts/ScatterGraph.js +155 -155
  71. package/src/charts/ScatterGraph.scss +21 -21
  72. package/src/charts/axis/Axis.d.ts +82 -82
  73. package/src/charts/axis/Axis.js +222 -222
  74. package/src/charts/axis/Axis.scss +22 -22
  75. package/src/charts/axis/CategoryAxis.d.ts +21 -21
  76. package/src/charts/axis/CategoryAxis.js +224 -224
  77. package/src/charts/axis/CategoryAxis.scss +32 -32
  78. package/src/charts/axis/NumericAxis.js +349 -349
  79. package/src/charts/axis/NumericAxis.scss +32 -32
  80. package/src/charts/axis/Stack.d.ts +10 -10
  81. package/src/charts/axis/Stack.js +58 -58
  82. package/src/charts/axis/TimeAxis.d.ts +23 -23
  83. package/src/charts/axis/TimeAxis.js +510 -510
  84. package/src/charts/axis/TimeAxis.scss +32 -32
  85. package/src/charts/axis/index.d.ts +3 -3
  86. package/src/charts/axis/index.js +3 -3
  87. package/src/charts/axis/index.scss +5 -5
  88. package/src/charts/axis/variables.scss +2 -2
  89. package/src/charts/helpers/MinMaxFinder.js +37 -37
  90. package/src/charts/helpers/MinMaxReducer.d.ts +22 -22
  91. package/src/charts/helpers/PointReducer.d.ts +15 -15
  92. package/src/charts/helpers/PointReducer.js +39 -39
  93. package/src/charts/helpers/SnapPointFinder.d.ts +18 -18
  94. package/src/charts/helpers/SnapPointFinder.js +46 -46
  95. package/src/charts/helpers/ValueAtFinder.d.ts +16 -16
  96. package/src/charts/helpers/ValueAtFinder.js +41 -41
  97. package/src/charts/helpers/index.d.ts +4 -4
  98. package/src/charts/helpers/index.js +4 -4
  99. package/src/charts/index.d.ts +23 -23
  100. package/src/charts/index.js +31 -31
  101. package/src/charts/index.scss +20 -20
  102. package/src/charts/palette.scss +95 -95
  103. package/src/charts/shapes.d.ts +22 -22
  104. package/src/charts/shapes.js +79 -79
  105. package/src/charts/variables.scss +14 -14
  106. package/src/core.d.ts +264 -264
  107. package/src/data/AggregateFunction.d.ts +17 -17
  108. package/src/data/AggregateFunction.js +148 -148
  109. package/src/data/ArrayElementView.d.ts +13 -13
  110. package/src/data/ArrayElementView.js +46 -46
  111. package/src/data/ArrayRef.d.ts +14 -14
  112. package/src/data/ArrayRef.js +34 -34
  113. package/src/data/AugmentedViewBase.d.ts +18 -18
  114. package/src/data/AugmentedViewBase.js +67 -67
  115. package/src/data/Binding.d.ts +16 -16
  116. package/src/data/Binding.js +86 -86
  117. package/src/data/Binding.spec.js +51 -51
  118. package/src/data/ExposedRecordView.d.ts +14 -14
  119. package/src/data/ExposedRecordView.js +69 -69
  120. package/src/data/ExposedValueView.d.ts +19 -19
  121. package/src/data/ExposedValueView.js +72 -72
  122. package/src/data/Expression.d.ts +16 -16
  123. package/src/data/Grouper.d.ts +21 -21
  124. package/src/data/Grouper.js +120 -120
  125. package/src/data/Grouper.spec.js +22 -22
  126. package/src/data/NestedDataView.d.ts +19 -19
  127. package/src/data/NestedDataView.js +22 -22
  128. package/src/data/ReadOnlyDataView.d.ts +14 -14
  129. package/src/data/ReadOnlyDataView.js +26 -26
  130. package/src/data/Ref.js +79 -79
  131. package/src/data/Store.d.ts +14 -14
  132. package/src/data/Store.js +46 -46
  133. package/src/data/Store.spec.js +22 -22
  134. package/src/data/StoreProxy.d.ts +4 -4
  135. package/src/data/StoreProxy.js +16 -16
  136. package/src/data/StoreRef.js +54 -54
  137. package/src/data/StringTemplate.d.ts +13 -13
  138. package/src/data/StringTemplate.js +97 -97
  139. package/src/data/StringTemplate.spec.js +82 -82
  140. package/src/data/StructuredSelector.d.ts +16 -16
  141. package/src/data/StructuredSelector.js +131 -131
  142. package/src/data/StructuredSelector.spec.js +113 -113
  143. package/src/data/SubscribableView.d.ts +11 -11
  144. package/src/data/View.js +182 -182
  145. package/src/data/View.spec.js +60 -60
  146. package/src/data/ZoomIntoPropertyView.d.ts +11 -11
  147. package/src/data/ZoomIntoPropertyView.js +33 -33
  148. package/src/data/ZoomIntoPropertyView.spec.js +65 -65
  149. package/src/data/comparer.d.ts +7 -7
  150. package/src/data/comparer.js +54 -54
  151. package/src/data/comparer.spec.js +60 -60
  152. package/src/data/computable.d.ts +45 -45
  153. package/src/data/computable.js +56 -56
  154. package/src/data/computable.spec.js +55 -55
  155. package/src/data/createAccessorModelProxy.d.ts +6 -6
  156. package/src/data/createAccessorModelProxy.js +43 -43
  157. package/src/data/createAccessorModelProxy.spec.tsx +38 -38
  158. package/src/data/createStructuredSelector.d.ts +2 -2
  159. package/src/data/createStructuredSelector.js +43 -43
  160. package/src/data/createStructuredSelector.spec.js +46 -46
  161. package/src/data/defaultCompare.js +14 -14
  162. package/src/data/diff/diffArrays.d.ts +15 -15
  163. package/src/data/diff/diffArrays.js +41 -41
  164. package/src/data/diff/diffs.spec.js +49 -49
  165. package/src/data/diff/index.d.ts +1 -1
  166. package/src/data/diff/index.js +1 -1
  167. package/src/data/enableFatArrowExpansion.d.ts +1 -1
  168. package/src/data/enableFatArrowExpansion.js +6 -6
  169. package/src/data/getAccessor.d.ts +8 -8
  170. package/src/data/getAccessor.js +61 -61
  171. package/src/data/getSelector.d.ts +3 -3
  172. package/src/data/getSelector.js +48 -48
  173. package/src/data/getSelector.spec.js +43 -43
  174. package/src/data/index.d.ts +30 -30
  175. package/src/data/index.js +28 -28
  176. package/src/data/isSelector.d.ts +1 -1
  177. package/src/data/isSelector.js +26 -26
  178. package/src/data/ops/append.d.ts +1 -1
  179. package/src/data/ops/append.js +7 -7
  180. package/src/data/ops/append.spec.js +28 -28
  181. package/src/data/ops/filter.d.ts +1 -1
  182. package/src/data/ops/filter.js +8 -8
  183. package/src/data/ops/filter.spec.js +29 -29
  184. package/src/data/ops/findTreeNode.js +15 -15
  185. package/src/data/ops/findTreeNode.spec.js +24 -24
  186. package/src/data/ops/findTreePath.d.ts +6 -6
  187. package/src/data/ops/findTreePath.js +16 -16
  188. package/src/data/ops/index.d.ts +10 -10
  189. package/src/data/ops/index.js +11 -11
  190. package/src/data/ops/insertElement.js +2 -2
  191. package/src/data/ops/merge.d.ts +3 -3
  192. package/src/data/ops/merge.js +9 -9
  193. package/src/data/ops/merge.spec.js +27 -27
  194. package/src/data/ops/moveElement.js +13 -13
  195. package/src/data/ops/removeTreeNodes.d.ts +1 -1
  196. package/src/data/ops/removeTreeNodes.js +5 -5
  197. package/src/data/ops/removeTreeNodes.spec.js +28 -28
  198. package/src/data/ops/updateArray.d.ts +5 -5
  199. package/src/data/ops/updateArray.js +24 -24
  200. package/src/data/ops/updateArray.spec.js +38 -38
  201. package/src/data/ops/updateTree.d.ts +7 -7
  202. package/src/data/ops/updateTree.js +25 -25
  203. package/src/data/ops/updateTree.spec.js +34 -34
  204. package/src/global.scss +13 -13
  205. package/src/hooks/createLocalStorageRef.d.ts +2 -2
  206. package/src/hooks/createLocalStorageRef.js +22 -22
  207. package/src/hooks/index.d.ts +8 -8
  208. package/src/hooks/index.js +7 -7
  209. package/src/hooks/invokeCallback.d.ts +5 -5
  210. package/src/hooks/invokeCallback.js +6 -6
  211. package/src/hooks/invokeCallback.spec.js +53 -53
  212. package/src/hooks/resolveCallback.d.ts +3 -3
  213. package/src/hooks/resolveCallback.js +11 -11
  214. package/src/hooks/resolveCallback.spec.js +54 -54
  215. package/src/hooks/store.d.ts +7 -7
  216. package/src/hooks/store.js +32 -32
  217. package/src/hooks/store.spec.js +73 -73
  218. package/src/hooks/useEffect.d.ts +2 -2
  219. package/src/hooks/useEffect.js +14 -14
  220. package/src/hooks/useInterval.js +7 -7
  221. package/src/hooks/useState.d.ts +2 -2
  222. package/src/hooks/useState.js +15 -15
  223. package/src/hooks/useTrigger.d.ts +4 -4
  224. package/src/hooks/useTrigger.js +20 -20
  225. package/src/hooks/useTrigger.spec.js +102 -102
  226. package/src/index.js +7 -7
  227. package/src/index.scss +6 -6
  228. package/src/svg/BoundedObject.d.ts +22 -22
  229. package/src/svg/BoundedObject.js +59 -59
  230. package/src/svg/ClipRect.d.ts +4 -4
  231. package/src/svg/ClipRect.js +23 -23
  232. package/src/svg/Ellipse.d.ts +23 -23
  233. package/src/svg/Ellipse.js +36 -36
  234. package/src/svg/Line.d.ts +20 -20
  235. package/src/svg/Line.js +32 -32
  236. package/src/svg/NonOverlappingRect.d.ts +5 -5
  237. package/src/svg/NonOverlappingRect.js +14 -14
  238. package/src/svg/NonOverlappingRectGroup.d.ts +3 -3
  239. package/src/svg/NonOverlappingRectGroup.js +36 -36
  240. package/src/svg/Rectangle.d.ts +23 -23
  241. package/src/svg/Rectangle.js +36 -36
  242. package/src/svg/Svg.d.ts +32 -32
  243. package/src/svg/Svg.js +177 -177
  244. package/src/svg/Svg.scss +26 -26
  245. package/src/svg/Text.d.ts +38 -38
  246. package/src/svg/Text.js +61 -61
  247. package/src/svg/TextualBoundedObject.d.ts +6 -6
  248. package/src/svg/TextualBoundedObject.js +28 -28
  249. package/src/svg/index.d.ts +11 -11
  250. package/src/svg/index.js +17 -17
  251. package/src/svg/index.scss +8 -8
  252. package/src/svg/util/Rect.d.ts +40 -40
  253. package/src/svg/util/Rect.js +108 -108
  254. package/src/ui/CSS.d.ts +19 -19
  255. package/src/ui/CSS.js +79 -79
  256. package/src/ui/CSSHelper.d.ts +10 -10
  257. package/src/ui/CSSHelper.js +17 -17
  258. package/src/ui/Container.d.ts +18 -18
  259. package/src/ui/Container.js +183 -183
  260. package/src/ui/ContentResolver.d.ts +12 -12
  261. package/src/ui/ContentResolver.js +78 -78
  262. package/src/ui/Controller.d.ts +6 -0
  263. package/src/ui/Controller.js +114 -114
  264. package/src/ui/Controller.spec.js +414 -414
  265. package/src/ui/Culture.d.ts +22 -22
  266. package/src/ui/Culture.js +65 -65
  267. package/src/ui/Cx.d.ts +18 -18
  268. package/src/ui/Cx.js +313 -313
  269. package/src/ui/Cx.spec.js +193 -193
  270. package/src/ui/DataProxy.d.ts +11 -10
  271. package/src/ui/DataProxy.js +44 -44
  272. package/src/ui/DataProxy.spec.js +335 -335
  273. package/src/ui/DetachedScope.d.ts +21 -21
  274. package/src/ui/DetachedScope.js +93 -93
  275. package/src/ui/FocusManager.d.ts +29 -29
  276. package/src/ui/FocusManager.js +171 -171
  277. package/src/ui/Format.d.ts +2 -2
  278. package/src/ui/Format.js +88 -88
  279. package/src/ui/HoverSync.d.ts +13 -13
  280. package/src/ui/HoverSync.js +147 -147
  281. package/src/ui/Instance.d.ts +69 -69
  282. package/src/ui/Instance.js +610 -610
  283. package/src/ui/IsolatedScope.d.ts +16 -16
  284. package/src/ui/IsolatedScope.js +29 -29
  285. package/src/ui/IsolatedScope.spec.js +62 -62
  286. package/src/ui/Localization.d.ts +17 -17
  287. package/src/ui/Localization.js +72 -72
  288. package/src/ui/PureContainer.d.ts +16 -16
  289. package/src/ui/PureContainer.js +7 -7
  290. package/src/ui/RenderingContext.d.ts +9 -9
  291. package/src/ui/RenderingContext.js +88 -88
  292. package/src/ui/Repeater.d.ts +49 -49
  293. package/src/ui/Repeater.js +98 -98
  294. package/src/ui/Repeater.spec.js +143 -143
  295. package/src/ui/Rescope.d.ts +10 -10
  296. package/src/ui/Rescope.js +31 -31
  297. package/src/ui/Rescope.spec.js +195 -195
  298. package/src/ui/ResizeManager.d.ts +9 -9
  299. package/src/ui/ResizeManager.js +30 -30
  300. package/src/ui/Restate.d.ts +15 -15
  301. package/src/ui/Restate.js +155 -155
  302. package/src/ui/Restate.spec.js +422 -422
  303. package/src/ui/StaticText.d.ts +8 -8
  304. package/src/ui/StaticText.js +9 -9
  305. package/src/ui/StructuredInstanceDataAccessor.d.ts +16 -16
  306. package/src/ui/StructuredInstanceDataAccessor.js +26 -26
  307. package/src/ui/Text.d.ts +10 -10
  308. package/src/ui/Text.js +27 -27
  309. package/src/ui/VDOM.d.ts +3 -3
  310. package/src/ui/VDOM.js +2 -2
  311. package/src/ui/Widget.d.ts +14 -14
  312. package/src/ui/Widget.js +200 -200
  313. package/src/ui/ZIndexManager.d.ts +7 -7
  314. package/src/ui/ZIndexManager.js +11 -11
  315. package/src/ui/adapter/ArrayAdapter.d.ts +17 -17
  316. package/src/ui/adapter/ArrayAdapter.js +142 -142
  317. package/src/ui/adapter/ArrayAdapter.spec.js +55 -55
  318. package/src/ui/adapter/DataAdapter.d.ts +28 -19
  319. package/src/ui/adapter/DataAdapter.js +19 -19
  320. package/src/ui/adapter/GroupAdapter.d.ts +4 -4
  321. package/src/ui/adapter/GroupAdapter.js +138 -136
  322. package/src/ui/adapter/TreeAdapter.d.ts +4 -4
  323. package/src/ui/adapter/TreeAdapter.js +100 -100
  324. package/src/ui/adapter/TreeAdapter.spec.js +67 -67
  325. package/src/ui/adapter/index.d.ts +4 -4
  326. package/src/ui/adapter/index.js +4 -4
  327. package/src/ui/app/History.d.ts +17 -17
  328. package/src/ui/app/History.js +114 -114
  329. package/src/ui/app/Url.d.ts +21 -21
  330. package/src/ui/app/Url.js +103 -103
  331. package/src/ui/app/Url.spec.js +51 -51
  332. package/src/ui/app/index.d.ts +4 -4
  333. package/src/ui/app/index.js +5 -5
  334. package/src/ui/app/startAppLoop.d.ts +3 -3
  335. package/src/ui/app/startAppLoop.js +57 -57
  336. package/src/ui/app/startHotAppLoop.d.ts +6 -6
  337. package/src/ui/app/startHotAppLoop.js +25 -25
  338. package/src/ui/batchUpdates.d.ts +10 -10
  339. package/src/ui/batchUpdates.js +67 -67
  340. package/src/ui/bind.d.ts +3 -3
  341. package/src/ui/bind.js +7 -7
  342. package/src/ui/createFunctionalComponent.d.ts +1 -1
  343. package/src/ui/createFunctionalComponent.js +68 -68
  344. package/src/ui/createFunctionalComponent.spec.js +400 -400
  345. package/src/ui/expr.d.ts +24 -24
  346. package/src/ui/expr.js +17 -17
  347. package/src/ui/flattenProps.js +21 -21
  348. package/src/ui/index.js +44 -44
  349. package/src/ui/index.scss +2 -2
  350. package/src/ui/keyboardShortcuts.d.ts +4 -4
  351. package/src/ui/keyboardShortcuts.js +32 -32
  352. package/src/ui/layout/Content.d.ts +14 -14
  353. package/src/ui/layout/Content.js +16 -16
  354. package/src/ui/layout/ContentPlaceholder.d.ts +17 -17
  355. package/src/ui/layout/ContentPlaceholder.js +79 -79
  356. package/src/ui/layout/ContentPlaceholder.spec.js +368 -368
  357. package/src/ui/layout/FirstVisibleChildLayout.d.ts +4 -4
  358. package/src/ui/layout/FirstVisibleChildLayout.js +65 -65
  359. package/src/ui/layout/FirstVisibleChildLayout.spec.js +196 -196
  360. package/src/ui/layout/LabelsLeftLayout.d.ts +11 -11
  361. package/src/ui/layout/LabelsLeftLayout.js +59 -59
  362. package/src/ui/layout/LabelsLeftLayout.scss +44 -44
  363. package/src/ui/layout/LabelsTopLayout.d.ts +15 -15
  364. package/src/ui/layout/LabelsTopLayout.js +134 -134
  365. package/src/ui/layout/LabelsTopLayout.scss +63 -63
  366. package/src/ui/layout/UseParentLayout.d.ts +4 -4
  367. package/src/ui/layout/UseParentLayout.js +6 -6
  368. package/src/ui/layout/exploreChildren.d.ts +14 -14
  369. package/src/ui/layout/exploreChildren.js +40 -40
  370. package/src/ui/layout/index.d.ts +10 -10
  371. package/src/ui/layout/index.js +10 -10
  372. package/src/ui/layout/index.scss +3 -3
  373. package/src/ui/layout/variables.scss +2 -2
  374. package/src/ui/selection/KeySelection.d.ts +17 -17
  375. package/src/ui/selection/KeySelection.js +129 -129
  376. package/src/ui/selection/PropertySelection.d.ts +17 -17
  377. package/src/ui/selection/PropertySelection.js +57 -57
  378. package/src/ui/selection/Selection.d.ts +27 -27
  379. package/src/ui/selection/Selection.js +97 -97
  380. package/src/ui/selection/index.d.ts +3 -3
  381. package/src/ui/selection/index.js +3 -3
  382. package/src/ui/tpl.d.ts +2 -2
  383. package/src/ui/tpl.js +4 -4
  384. package/src/ui/variables.scss +1 -1
  385. package/src/util/Component.d.ts +41 -41
  386. package/src/util/Component.js +107 -107
  387. package/src/util/Console.d.ts +9 -9
  388. package/src/util/Console.js +11 -11
  389. package/src/util/DOM.d.ts +33 -33
  390. package/src/util/DOM.js +72 -72
  391. package/src/util/Debug.d.ts +10 -10
  392. package/src/util/Debug.js +45 -45
  393. package/src/util/Format.d.ts +13 -13
  394. package/src/util/Format.js +241 -241
  395. package/src/util/Format.spec.js +69 -69
  396. package/src/util/GlobalCacheIdentifier.js +11 -11
  397. package/src/util/GlobalCacheldentifier.d.ts +6 -6
  398. package/src/util/KeyCode.d.ts +21 -21
  399. package/src/util/KeyCode.js +21 -21
  400. package/src/util/SubscriberList.d.ts +41 -41
  401. package/src/util/SubscriberList.js +57 -57
  402. package/src/util/Timing.d.ts +13 -13
  403. package/src/util/Timing.js +57 -57
  404. package/src/util/TraversalStack.js +42 -42
  405. package/src/util/TraversalStack.spec.js +46 -46
  406. package/src/util/addEventListenerWithOptions.d.ts +6 -6
  407. package/src/util/addEventListenerWithOptions.js +9 -9
  408. package/src/util/browserSupportsPassiveEventHandlers.d.ts +4 -4
  409. package/src/util/browserSupportsPassiveEventHandlers.js +18 -18
  410. package/src/util/calculateNaturalElementHeight.d.ts +1 -1
  411. package/src/util/calculateNaturalElementHeight.js +22 -22
  412. package/src/util/call-once.scss +6 -6
  413. package/src/util/coalesce.d.ts +1 -1
  414. package/src/util/coalesce.js +6 -6
  415. package/src/util/color/hslToRgb.d.ts +8 -8
  416. package/src/util/color/hslToRgb.js +27 -27
  417. package/src/util/color/index.d.ts +3 -3
  418. package/src/util/color/index.js +4 -4
  419. package/src/util/color/parseColor.d.ts +59 -59
  420. package/src/util/color/parseColor.js +119 -119
  421. package/src/util/color/rgbToHex.d.ts +8 -8
  422. package/src/util/color/rgbToHex.js +7 -7
  423. package/src/util/color/rgbToHsl.d.ts +8 -8
  424. package/src/util/color/rgbToHsl.js +27 -27
  425. package/src/util/date/dateDiff.d.ts +7 -7
  426. package/src/util/date/dateDiff.js +3 -3
  427. package/src/util/date/diff.d.ts +7 -7
  428. package/src/util/date/diff.js +7 -7
  429. package/src/util/date/encodeDateWithTimezoneOffset.js +18 -18
  430. package/src/util/date/index.d.ts +8 -8
  431. package/src/util/date/index.js +9 -9
  432. package/src/util/date/lowerBoundCheck.d.ts +7 -7
  433. package/src/util/date/lowerBoundCheck.js +6 -6
  434. package/src/util/date/maxDate.d.ts +5 -5
  435. package/src/util/date/maxDate.js +9 -9
  436. package/src/util/date/minDate.d.ts +5 -5
  437. package/src/util/date/minDate.js +9 -9
  438. package/src/util/date/monthStart.d.ts +5 -5
  439. package/src/util/date/monthStart.js +3 -3
  440. package/src/util/date/sameDate.d.ts +6 -6
  441. package/src/util/date/sameDate.js +5 -5
  442. package/src/util/date/upperBoundCheck.d.ts +7 -7
  443. package/src/util/date/upperBoundCheck.js +6 -6
  444. package/src/util/date/upperBoundCheck.spec.js +30 -30
  445. package/src/util/date/zeroTime.d.ts +6 -6
  446. package/src/util/date/zeroTime.js +3 -3
  447. package/src/util/debounce.d.ts +9 -9
  448. package/src/util/dummyCallback.d.ts +1 -1
  449. package/src/util/dummyCallback.js +1 -1
  450. package/src/util/escapeSpecialRegexCharacters.d.ts +6 -6
  451. package/src/util/escapeSpecialRegexCharacters.js +3 -3
  452. package/src/util/eventCallbacks.d.ts +4 -4
  453. package/src/util/eventCallbacks.js +2 -2
  454. package/src/util/expandFatArrows.js +118 -118
  455. package/src/util/findScrollableParent.js +16 -16
  456. package/src/util/getActiveElement.js +3 -3
  457. package/src/util/getParentFrameBoundingClientRect.js +18 -18
  458. package/src/util/getScrollerBoundingClientRect.js +21 -21
  459. package/src/util/getSearchQueryPredicate.js +58 -58
  460. package/src/util/getSearchQueryPredicate.spec.js +40 -40
  461. package/src/util/getTopLevelBoundingClientRect.js +13 -13
  462. package/src/util/getVendorPrefix.js +26 -26
  463. package/src/util/index.d.ts +50 -50
  464. package/src/util/index.js +52 -52
  465. package/src/util/index.scss +10 -10
  466. package/src/util/innerTextTrim.d.ts +6 -6
  467. package/src/util/innerTextTrim.js +5 -5
  468. package/src/util/isArray.js +3 -3
  469. package/src/util/isDefined.js +3 -3
  470. package/src/util/isDigit.d.ts +6 -6
  471. package/src/util/isDigit.js +3 -3
  472. package/src/util/isFunction.d.ts +1 -1
  473. package/src/util/isFunction.js +3 -3
  474. package/src/util/isNonEmptyArray.d.ts +1 -1
  475. package/src/util/isNonEmptyArray.js +3 -3
  476. package/src/util/isNumber.js +3 -3
  477. package/src/util/isObject.js +3 -3
  478. package/src/util/isPromise.d.ts +1 -1
  479. package/src/util/isPromise.js +6 -6
  480. package/src/util/isString.js +3 -3
  481. package/src/util/isTextInputElement.d.ts +1 -1
  482. package/src/util/isTextInputElement.js +2 -2
  483. package/src/util/isTouchDevice.d.ts +1 -1
  484. package/src/util/isTouchDevice.js +7 -7
  485. package/src/util/isTouchEvent.d.ts +3 -3
  486. package/src/util/isTouchEvent.js +64 -64
  487. package/src/util/isUndefined.js +3 -3
  488. package/src/util/onIdleCallback.js +13 -13
  489. package/src/util/parseStyle.d.ts +3 -3
  490. package/src/util/parseStyle.js +27 -27
  491. package/src/util/quote.d.ts +2 -2
  492. package/src/util/quote.js +5 -5
  493. package/src/util/reverseSlice.js +9 -9
  494. package/src/util/routeAppend.js +15 -15
  495. package/src/util/routeAppend.spec.js +19 -19
  496. package/src/util/scrollElementIntoView.d.ts +7 -7
  497. package/src/util/scrollElementIntoView.js +34 -34
  498. package/src/util/scss/add-rules.scss +39 -39
  499. package/src/util/scss/calc.scss +40 -40
  500. package/src/util/scss/call-once.scss +10 -10
  501. package/src/util/scss/clockwise.scss +47 -47
  502. package/src/util/scss/colors.scss +7 -7
  503. package/src/util/scss/deep-get.scss +9 -9
  504. package/src/util/scss/deep-merge.scss +18 -18
  505. package/src/util/scss/include.scss +47 -47
  506. package/src/util/scss/index.scss +8 -8
  507. package/src/util/shallowEquals.js +43 -43
  508. package/src/util/throttle.d.ts +8 -8
  509. package/src/util/throttle.js +14 -14
  510. package/src/variables.scss +217 -217
  511. package/src/widgets/AccessorBindings.spec.tsx +66 -66
  512. package/src/widgets/Button.d.ts +58 -58
  513. package/src/widgets/Button.scss +117 -117
  514. package/src/widgets/Button.variables.scss +107 -107
  515. package/src/widgets/CxCredit.d.ts +12 -12
  516. package/src/widgets/CxCredit.js +31 -31
  517. package/src/widgets/CxCredit.scss +41 -41
  518. package/src/widgets/DocumentTitle.d.ts +11 -11
  519. package/src/widgets/DocumentTitle.js +68 -68
  520. package/src/widgets/FlexBox.d.ts +69 -69
  521. package/src/widgets/FlexBox.js +92 -92
  522. package/src/widgets/FlexBox.scss +155 -155
  523. package/src/widgets/Heading.d.ts +16 -16
  524. package/src/widgets/Heading.js +32 -32
  525. package/src/widgets/Heading.scss +38 -38
  526. package/src/widgets/HighlightedSearchText.d.ts +9 -9
  527. package/src/widgets/HighlightedSearchText.js +36 -36
  528. package/src/widgets/HighlightedSearchText.scss +18 -18
  529. package/src/widgets/HtmlElement.d.ts +26 -26
  530. package/src/widgets/HtmlElement.js +273 -273
  531. package/src/widgets/HtmlElement.spec.js +57 -57
  532. package/src/widgets/Icon.d.ts +36 -36
  533. package/src/widgets/Icon.js +50 -50
  534. package/src/widgets/Icon.scss +20 -20
  535. package/src/widgets/List.d.ts +87 -87
  536. package/src/widgets/List.js +589 -589
  537. package/src/widgets/List.scss +92 -92
  538. package/src/widgets/ProgressBar.d.ts +17 -17
  539. package/src/widgets/ProgressBar.js +46 -46
  540. package/src/widgets/ProgressBar.scss +49 -49
  541. package/src/widgets/Resizer.d.ts +27 -27
  542. package/src/widgets/Resizer.js +151 -151
  543. package/src/widgets/Resizer.scss +42 -42
  544. package/src/widgets/Sandbox.d.ts +16 -16
  545. package/src/widgets/Sandbox.js +62 -62
  546. package/src/widgets/Section.d.ts +52 -52
  547. package/src/widgets/Section.js +139 -139
  548. package/src/widgets/Section.scss +54 -54
  549. package/src/widgets/animations.scss +10 -10
  550. package/src/widgets/autoFocus.d.ts +1 -1
  551. package/src/widgets/autoFocus.js +9 -9
  552. package/src/widgets/cx.d.ts +1 -1
  553. package/src/widgets/cx.js +71 -71
  554. package/src/widgets/drag-drop/DragClone.scss +33 -33
  555. package/src/widgets/drag-drop/DragHandle.d.ts +10 -10
  556. package/src/widgets/drag-drop/DragHandle.js +37 -37
  557. package/src/widgets/drag-drop/DragHandle.scss +16 -16
  558. package/src/widgets/drag-drop/DragSource.d.ts +34 -34
  559. package/src/widgets/drag-drop/DragSource.js +160 -160
  560. package/src/widgets/drag-drop/DragSource.scss +24 -24
  561. package/src/widgets/drag-drop/DropZone.d.ts +90 -90
  562. package/src/widgets/drag-drop/DropZone.js +213 -213
  563. package/src/widgets/drag-drop/DropZone.scss +74 -74
  564. package/src/widgets/drag-drop/index.d.ts +4 -4
  565. package/src/widgets/drag-drop/index.js +4 -4
  566. package/src/widgets/drag-drop/index.scss +3 -3
  567. package/src/widgets/drag-drop/ops.d.ts +56 -56
  568. package/src/widgets/drag-drop/ops.js +344 -344
  569. package/src/widgets/drag-drop/variables.scss +11 -11
  570. package/src/widgets/enableAllInternalDependencies.d.ts +1 -1
  571. package/src/widgets/enableAllInternalDependencies.js +11 -11
  572. package/src/widgets/form/Calendar.d.ts +86 -86
  573. package/src/widgets/form/Calendar.js +527 -527
  574. package/src/widgets/form/Calendar.scss +164 -164
  575. package/src/widgets/form/Calendar.variables.scss +63 -63
  576. package/src/widgets/form/Checkbox.d.ts +43 -43
  577. package/src/widgets/form/Checkbox.js +200 -200
  578. package/src/widgets/form/Checkbox.scss +122 -122
  579. package/src/widgets/form/Checkbox.variables.scss +39 -39
  580. package/src/widgets/form/ColorField.d.ts +43 -43
  581. package/src/widgets/form/ColorField.js +389 -389
  582. package/src/widgets/form/ColorField.scss +92 -92
  583. package/src/widgets/form/ColorPicker.d.ts +23 -23
  584. package/src/widgets/form/ColorPicker.js +451 -451
  585. package/src/widgets/form/ColorPicker.scss +184 -184
  586. package/src/widgets/form/ColorPicker.variables.scss +20 -20
  587. package/src/widgets/form/DateField.d.ts +6 -6
  588. package/src/widgets/form/DateField.js +12 -12
  589. package/src/widgets/form/DateTimeField.d.ts +83 -83
  590. package/src/widgets/form/DateTimeField.js +571 -571
  591. package/src/widgets/form/DateTimeField.scss +90 -90
  592. package/src/widgets/form/DateTimePicker.js +391 -391
  593. package/src/widgets/form/DateTimePicker.scss +44 -44
  594. package/src/widgets/form/Field.d.ts +112 -112
  595. package/src/widgets/form/Field.js +419 -419
  596. package/src/widgets/form/Field.scss +162 -162
  597. package/src/widgets/form/FieldGroup.d.ts +6 -6
  598. package/src/widgets/form/FieldGroup.js +5 -5
  599. package/src/widgets/form/HelpText.d.ts +10 -10
  600. package/src/widgets/form/HelpText.js +9 -9
  601. package/src/widgets/form/HelpText.scss +23 -23
  602. package/src/widgets/form/Label.d.ts +25 -25
  603. package/src/widgets/form/Label.js +86 -86
  604. package/src/widgets/form/Label.scss +36 -36
  605. package/src/widgets/form/LabeledContainer.d.ts +17 -17
  606. package/src/widgets/form/LabeledContainer.js +59 -59
  607. package/src/widgets/form/LookupField.d.ts +171 -165
  608. package/src/widgets/form/LookupField.js +1126 -1126
  609. package/src/widgets/form/LookupField.scss +219 -219
  610. package/src/widgets/form/MonthField.d.ts +88 -88
  611. package/src/widgets/form/MonthField.js +512 -512
  612. package/src/widgets/form/MonthField.scss +99 -99
  613. package/src/widgets/form/MonthPicker.d.ts +68 -68
  614. package/src/widgets/form/MonthPicker.js +631 -631
  615. package/src/widgets/form/MonthPicker.scss +120 -120
  616. package/src/widgets/form/NumberField.d.ts +96 -94
  617. package/src/widgets/form/NumberField.js +458 -443
  618. package/src/widgets/form/NumberField.scss +65 -65
  619. package/src/widgets/form/Radio.d.ts +37 -37
  620. package/src/widgets/form/Radio.js +188 -188
  621. package/src/widgets/form/Radio.scss +122 -122
  622. package/src/widgets/form/Radio.variables.scss +45 -45
  623. package/src/widgets/form/Select.d.ts +73 -73
  624. package/src/widgets/form/Select.js +274 -274
  625. package/src/widgets/form/Select.scss +98 -98
  626. package/src/widgets/form/Slider.d.ts +65 -65
  627. package/src/widgets/form/Slider.js +345 -345
  628. package/src/widgets/form/Slider.scss +121 -121
  629. package/src/widgets/form/Switch.d.ts +38 -38
  630. package/src/widgets/form/Switch.js +118 -118
  631. package/src/widgets/form/Switch.scss +140 -140
  632. package/src/widgets/form/TextArea.d.ts +17 -17
  633. package/src/widgets/form/TextArea.js +182 -182
  634. package/src/widgets/form/TextArea.scss +60 -60
  635. package/src/widgets/form/TextField.d.ts +75 -75
  636. package/src/widgets/form/TextField.js +285 -285
  637. package/src/widgets/form/TextField.scss +55 -55
  638. package/src/widgets/form/TimeField.d.ts +6 -6
  639. package/src/widgets/form/TimeField.js +11 -11
  640. package/src/widgets/form/TimeList.js +84 -84
  641. package/src/widgets/form/UploadButton.d.ts +31 -31
  642. package/src/widgets/form/UploadButton.js +213 -213
  643. package/src/widgets/form/UploadButton.scss +47 -47
  644. package/src/widgets/form/ValidationError.d.ts +10 -10
  645. package/src/widgets/form/ValidationError.js +37 -37
  646. package/src/widgets/form/ValidationError.scss +21 -21
  647. package/src/widgets/form/ValidationGroup.spec.js +148 -148
  648. package/src/widgets/form/Validator.d.ts +6 -6
  649. package/src/widgets/form/Wheel.js +261 -261
  650. package/src/widgets/form/Wheel.scss +148 -148
  651. package/src/widgets/form/index.d.ts +26 -26
  652. package/src/widgets/form/index.js +29 -29
  653. package/src/widgets/form/index.scss +24 -24
  654. package/src/widgets/form/variables.scss +352 -352
  655. package/src/widgets/grid/Grid.d.ts +398 -377
  656. package/src/widgets/grid/Grid.js +3228 -3227
  657. package/src/widgets/grid/Grid.scss +680 -680
  658. package/src/widgets/grid/GridCell.d.ts +29 -29
  659. package/src/widgets/grid/GridCell.js +70 -70
  660. package/src/widgets/grid/GridCellEditor.js +41 -41
  661. package/src/widgets/grid/GridRow.js +228 -228
  662. package/src/widgets/grid/GridRowLine.js +24 -24
  663. package/src/widgets/grid/Pagination.d.ts +14 -14
  664. package/src/widgets/grid/Pagination.js +94 -94
  665. package/src/widgets/grid/Pagination.scss +113 -113
  666. package/src/widgets/grid/TreeNode.d.ts +25 -25
  667. package/src/widgets/grid/TreeNode.js +102 -102
  668. package/src/widgets/grid/TreeNode.scss +90 -90
  669. package/src/widgets/grid/index.d.ts +3 -3
  670. package/src/widgets/grid/index.js +14 -14
  671. package/src/widgets/grid/index.scss +3 -3
  672. package/src/widgets/grid/variables.scss +88 -88
  673. package/src/widgets/icons/arrow-down.svg +3 -3
  674. package/src/widgets/icons/arrow-right.svg +2 -2
  675. package/src/widgets/icons/base.svg +104 -104
  676. package/src/widgets/icons/calendar-old.svg +169 -169
  677. package/src/widgets/icons/calendar.js +16 -16
  678. package/src/widgets/icons/calendar.svg +187 -187
  679. package/src/widgets/icons/check.js +12 -12
  680. package/src/widgets/icons/clear.js +14 -14
  681. package/src/widgets/icons/clear.svg +74 -74
  682. package/src/widgets/icons/close.js +19 -19
  683. package/src/widgets/icons/close.svg +74 -74
  684. package/src/widgets/icons/cx.js +37 -37
  685. package/src/widgets/icons/drop-down.js +14 -14
  686. package/src/widgets/icons/dropdown-arrow.svg +61 -61
  687. package/src/widgets/icons/file.js +12 -12
  688. package/src/widgets/icons/file.svg +4 -4
  689. package/src/widgets/icons/folder-open.js +14 -14
  690. package/src/widgets/icons/folder-open.svg +5 -5
  691. package/src/widgets/icons/folder.js +12 -12
  692. package/src/widgets/icons/folder.svg +58 -58
  693. package/src/widgets/icons/forward.js +21 -21
  694. package/src/widgets/icons/forward.svg +67 -67
  695. package/src/widgets/icons/index.js +14 -14
  696. package/src/widgets/icons/loading.js +23 -23
  697. package/src/widgets/icons/loading.svg +4 -4
  698. package/src/widgets/icons/menu.js +16 -16
  699. package/src/widgets/icons/registry.js +53 -53
  700. package/src/widgets/icons/search.js +12 -12
  701. package/src/widgets/icons/search.svg +107 -107
  702. package/src/widgets/icons/sort-asc.js +13 -13
  703. package/src/widgets/icons/sort-asc.svg +3 -3
  704. package/src/widgets/icons/square.js +17 -17
  705. package/src/widgets/index.d.ts +55 -55
  706. package/src/widgets/index.js +57 -57
  707. package/src/widgets/index.scss +16 -16
  708. package/src/widgets/nav/Link.d.ts +26 -26
  709. package/src/widgets/nav/Link.js +7 -7
  710. package/src/widgets/nav/Link.scss +18 -18
  711. package/src/widgets/nav/LinkButton.d.ts +31 -31
  712. package/src/widgets/nav/LinkButton.js +127 -127
  713. package/src/widgets/nav/Menu.d.ts +27 -27
  714. package/src/widgets/nav/Menu.js +406 -406
  715. package/src/widgets/nav/Menu.scss +74 -74
  716. package/src/widgets/nav/Menu.variables.scss +17 -17
  717. package/src/widgets/nav/MenuItem.d.ts +31 -35
  718. package/src/widgets/nav/MenuItem.js +445 -445
  719. package/src/widgets/nav/MenuItem.scss +128 -128
  720. package/src/widgets/nav/MenuSpacer.d.ts +5 -5
  721. package/src/widgets/nav/MenuSpacer.js +12 -12
  722. package/src/widgets/nav/RedirectRoute.d.ts +9 -9
  723. package/src/widgets/nav/RedirectRoute.js +40 -40
  724. package/src/widgets/nav/Route.d.ts +21 -21
  725. package/src/widgets/nav/Route.js +105 -105
  726. package/src/widgets/nav/Route.spec.js +27 -27
  727. package/src/widgets/nav/Scroller.d.ts +17 -17
  728. package/src/widgets/nav/Scroller.js +214 -214
  729. package/src/widgets/nav/Scroller.scss +146 -146
  730. package/src/widgets/nav/Submenu.d.ts +6 -6
  731. package/src/widgets/nav/Submenu.js +6 -6
  732. package/src/widgets/nav/Tab.d.ts +33 -33
  733. package/src/widgets/nav/Tab.js +82 -82
  734. package/src/widgets/nav/Tab.scss +81 -81
  735. package/src/widgets/nav/Tab.variables.scss +80 -80
  736. package/src/widgets/nav/cover.scss +21 -21
  737. package/src/widgets/nav/index.d.ts +10 -10
  738. package/src/widgets/nav/index.js +10 -10
  739. package/src/widgets/nav/index.scss +5 -5
  740. package/src/widgets/nav/variables.scss +25 -25
  741. package/src/widgets/overlay/ContextMenu.d.ts +10 -9
  742. package/src/widgets/overlay/ContextMenu.js +29 -29
  743. package/src/widgets/overlay/Dropdown.d.ts +27 -27
  744. package/src/widgets/overlay/Dropdown.js +610 -610
  745. package/src/widgets/overlay/Dropdown.scss +184 -184
  746. package/src/widgets/overlay/FlyweightTooltipTracker.d.ts +8 -8
  747. package/src/widgets/overlay/FlyweightTooltipTracker.js +36 -36
  748. package/src/widgets/overlay/MsgBox.d.ts +16 -16
  749. package/src/widgets/overlay/MsgBox.js +116 -116
  750. package/src/widgets/overlay/Overlay.d.ts +69 -69
  751. package/src/widgets/overlay/Overlay.js +747 -747
  752. package/src/widgets/overlay/Overlay.scss +66 -66
  753. package/src/widgets/overlay/Toast.d.ts +30 -30
  754. package/src/widgets/overlay/Toast.js +92 -92
  755. package/src/widgets/overlay/Toast.scss +162 -162
  756. package/src/widgets/overlay/Tooltip.d.ts +50 -50
  757. package/src/widgets/overlay/Tooltip.scss +175 -175
  758. package/src/widgets/overlay/Window.d.ts +39 -39
  759. package/src/widgets/overlay/Window.js +195 -195
  760. package/src/widgets/overlay/Window.scss +112 -112
  761. package/src/widgets/overlay/Window.variables.scss +67 -67
  762. package/src/widgets/overlay/alerts.d.ts +7 -7
  763. package/src/widgets/overlay/alerts.js +39 -39
  764. package/src/widgets/overlay/captureMouse.d.ts +53 -53
  765. package/src/widgets/overlay/captureMouse.js +132 -132
  766. package/src/widgets/overlay/captureMouse.scss +13 -13
  767. package/src/widgets/overlay/index.d.ts +10 -10
  768. package/src/widgets/overlay/index.js +10 -10
  769. package/src/widgets/overlay/index.scss +15 -15
  770. package/src/widgets/overlay/tooltip-ops.d.ts +8 -8
  771. package/src/widgets/overlay/tooltip-ops.js +24 -24
  772. package/src/widgets/overlay/variables.scss +82 -82
  773. package/src/widgets/variables.scss +144 -144
  774. package/yarn-error.log +7973 -0
  775. package/dist/reset.js +0 -1
@@ -1,610 +1,610 @@
1
- import { Localization } from "../../ui/Localization";
2
- import { ResizeManager } from "../../ui/ResizeManager";
3
- import { Widget, VDOM } from "../../ui/Widget";
4
- import { calculateNaturalElementHeight } from "../../util/calculateNaturalElementHeight";
5
- import { closestParent, findFirst, isFocusable } from "../../util/DOM";
6
- import { getTopLevelBoundingClientRect } from "../../util/getTopLevelBoundingClientRect";
7
- import { isTouchDevice } from "../../util/isTouchDevice";
8
- import { Overlay } from "./Overlay";
9
-
10
- /*
11
- Dropdown specific features:
12
- - ability to position itself next to the target element
13
- - monitor scrollable parents and updates it's position
14
- */
15
-
16
- export class Dropdown extends Overlay {
17
- init() {
18
- if (this.trackMouse) {
19
- this.trackMouseX = true;
20
- this.trackMouseY = true;
21
- }
22
- if (this.autoFocus && !this.hasOwnProperty(this.focusable)) this.focusable = true;
23
- super.init();
24
- }
25
-
26
- declareData() {
27
- return super.declareData(...arguments, {
28
- placement: undefined,
29
- });
30
- }
31
-
32
- initInstance(context, instance) {
33
- instance.mousePosition = this.mousePosition;
34
- instance.parentPositionChangeEvent = context.parentPositionChangeEvent;
35
- super.initInstance(context, instance);
36
- }
37
-
38
- explore(context, instance) {
39
- context.push("lastDropdown", instance);
40
- super.explore(context, instance);
41
- }
42
-
43
- exploreCleanup(context, instance) {
44
- context.pop("lastDropdown");
45
- super.exploreCleanup(context, instance);
46
- }
47
-
48
- overlayDidMount(instance, component) {
49
- super.overlayDidMount(instance, component);
50
- var scrollableParents = (component.scrollableParents = [window]);
51
- component.updateDropdownPosition = (e) => this.updateDropdownPosition(instance, component);
52
-
53
- instance.initialScreenPosition = null;
54
-
55
- var el = instance.relatedElement.parentElement;
56
- while (el) {
57
- scrollableParents.push(el);
58
- el = el.parentElement;
59
- }
60
- scrollableParents.forEach((el) => {
61
- el.addEventListener("scroll", component.updateDropdownPosition);
62
- });
63
- component.offResize = ResizeManager.subscribe(component.updateDropdownPosition);
64
-
65
- if (this.onDropdownDidMount) instance.invoke("onDropdownDidMount", instance, component);
66
-
67
- if (this.pipeValidateDropdownPosition)
68
- instance.invoke("pipeValidateDropdownPosition", component.updateDropdownPosition, instance);
69
-
70
- if (instance.parentPositionChangeEvent)
71
- component.offParentPositionChange = instance.parentPositionChangeEvent.subscribe(
72
- component.updateDropdownPosition
73
- );
74
- }
75
-
76
- overlayDidUpdate(instance, component) {
77
- this.updateDropdownPosition(instance, component);
78
- }
79
-
80
- overlayWillUnmount(instance, component) {
81
- var { scrollableParents } = component;
82
- if (scrollableParents) {
83
- scrollableParents.forEach((el) => {
84
- el.removeEventListener("scroll", component.updateDropdownPosition);
85
- });
86
- delete component.scrollableParents;
87
- delete component.updateDropdownPosition;
88
- }
89
- if (component.offResize) component.offResize();
90
-
91
- if (this.pipeValidateDropdownPosition) instance.invoke("pipeValidateDropdownPosition", null, instance);
92
-
93
- if (component.offParentPositionChange) component.offParentPositionChange();
94
-
95
- delete component.parentBounds;
96
- delete component.initialScreenPosition;
97
- }
98
-
99
- dismissAfterScroll(data, instance, component) {
100
- if (this.onDismissAfterScroll && instance.invoke("onDismissAfterScroll", data, instance, component) === false)
101
- return;
102
- if (instance.dismiss) instance.dismiss();
103
- }
104
-
105
- updateDropdownPosition(instance, component) {
106
- var { el, initialScreenPosition } = component;
107
- var { data, relatedElement } = instance;
108
- var parentBounds = (component.parentBounds = getTopLevelBoundingClientRect(relatedElement));
109
-
110
- //getBoundingClientRect() will return an empty rect if the element is hidden or removed
111
- if (parentBounds.left == 0 && parentBounds.top == 0 && parentBounds.bottom == 0 && parentBounds.right == 0)
112
- return;
113
-
114
- if (this.trackMouseX && instance.mousePosition) {
115
- parentBounds = {
116
- top: parentBounds.top,
117
- bottom: parentBounds.bottom,
118
- left: instance.mousePosition.x,
119
- right: instance.mousePosition.x,
120
- };
121
- }
122
-
123
- if (this.trackMouseY && instance.mousePosition) {
124
- parentBounds = {
125
- left: parentBounds.left,
126
- right: parentBounds.right,
127
- top: instance.mousePosition.y,
128
- bottom: instance.mousePosition.y,
129
- };
130
- }
131
-
132
- let explode = this.pad && typeof this.elementExplode === "number" ? this.elementExplode : 0;
133
- if (explode) {
134
- parentBounds = {
135
- left: Math.round(parentBounds.left - explode),
136
- right: Math.round(parentBounds.right + explode),
137
- top: Math.round(parentBounds.top - explode),
138
- bottom: Math.round(parentBounds.bottom + explode),
139
- };
140
- }
141
-
142
- var style = {};
143
- if (this.matchWidth) style.minWidth = `${parentBounds.right - parentBounds.left}px`;
144
- if (this.matchMaxWidth) style.maxWidth = `${parentBounds.right - parentBounds.left}px`;
145
-
146
- var contentSize = this.measureNaturalDropdownSize(instance, component);
147
- var placement = this.findOptimalPlacement(contentSize, parentBounds, data.placement, component.lastPlacement);
148
-
149
- this.applyPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, false);
150
- component.setCustomStyle(style);
151
- this.setDirectionClass(component, placement);
152
-
153
- if (this.constrain) {
154
- //recheck content size for changes as sometimes when auto is used the size can change
155
- let newContentSize = this.measureNaturalDropdownSize(instance, component);
156
- if (newContentSize.width != contentSize.width || newContentSize.height != contentSize.height) {
157
- let newStyle = {};
158
- this.applyPositioningPlacementStyles(newStyle, placement, newContentSize, parentBounds, el, true);
159
- component.setCustomStyle(newStyle);
160
- }
161
- }
162
-
163
- if (!initialScreenPosition) initialScreenPosition = component.initialScreenPosition = parentBounds;
164
-
165
- if (
166
- Math.abs(parentBounds.top - initialScreenPosition.top) > this.closeOnScrollDistance ||
167
- Math.abs(parentBounds.left - initialScreenPosition.left) > this.closeOnScrollDistance
168
- )
169
- this.dismissAfterScroll({ parentBounds, initialScreenPosition }, instance, component);
170
-
171
- instance.positionChangeSubscribers.notify();
172
- }
173
-
174
- applyFixedPositioningPlacementStyles(style, placement, contentSize, rel, el, noAuto) {
175
- let viewport = getViewportRect(this.screenPadding);
176
- style.position = "fixed";
177
-
178
- if (placement.startsWith("down")) {
179
- style.top = `${(this.cover ? rel.top : rel.bottom) + this.offset}px`;
180
- let bottom = viewport.bottom - (rel.bottom + this.offset + contentSize.height);
181
- style.bottom =
182
- this.constrain && (noAuto || bottom < this.screenPadding + 10)
183
- ? Math.max(this.screenPadding, bottom) + "px"
184
- : "auto";
185
- } else if (placement.startsWith("up")) {
186
- let top = rel.top - this.offset - contentSize.height - viewport.top;
187
- style.top =
188
- this.constrain && (noAuto || top < this.screenPadding + 10)
189
- ? Math.max(this.screenPadding, top) + "px"
190
- : "auto";
191
- style.bottom =
192
- document.documentElement.offsetHeight - (this.cover ? rel.bottom : rel.top) + this.offset + "px";
193
- }
194
-
195
- switch (placement) {
196
- case "down":
197
- case "down-center":
198
- style.right = "auto";
199
- style.left = `${Math.round((rel.left + rel.right - el.offsetWidth) / 2)}px`;
200
- break;
201
-
202
- case "down-right":
203
- style.right = "auto";
204
- style.left = `${rel.left}px`;
205
- break;
206
-
207
- case "down-left":
208
- style.right = `${document.documentElement.offsetWidth - rel.right}px`;
209
- style.left = "auto";
210
- break;
211
-
212
- case "up":
213
- case "up-center":
214
- style.right = "auto";
215
- style.left = `${Math.round((rel.left + rel.right - el.offsetWidth) / 2)}px`;
216
- break;
217
-
218
- case "up-right":
219
- style.right = "auto";
220
- style.left = `${rel.left}px`;
221
- break;
222
-
223
- case "up-left":
224
- style.right = `${document.documentElement.offsetWidth - rel.right}px`;
225
- style.left = "auto";
226
- break;
227
-
228
- case "right":
229
- case "right-center":
230
- style.top = `${Math.round((rel.top + rel.bottom - el.offsetHeight) / 2)}px`;
231
- style.right = "auto";
232
- style.bottom = "auto";
233
- style.left = `${rel.right + this.offset}px`;
234
- break;
235
-
236
- case "right-down":
237
- style.top = `${rel.top}px`;
238
- style.right = "auto";
239
- style.bottom = "auto";
240
- style.left = `${rel.right + this.offset}px`;
241
- break;
242
-
243
- case "right-up":
244
- style.top = "auto";
245
- style.right = "auto";
246
- style.bottom = `${document.documentElement.offsetHeight - rel.bottom}px`;
247
- style.left = `${rel.right + this.offset}px`;
248
- break;
249
-
250
- case "left":
251
- case "left-center":
252
- style.top = `${Math.round((rel.top + rel.bottom - el.offsetHeight) / 2)}px`;
253
- style.right = `${document.documentElement.offsetWidth - rel.left + this.offset}px`;
254
- style.bottom = "auto";
255
- style.left = "auto";
256
- break;
257
-
258
- case "left-down":
259
- style.top = `${rel.top}px`;
260
- style.right = `${document.documentElement.offsetWidth - rel.left + this.offset}px`;
261
- style.bottom = "auto";
262
- style.left = "auto";
263
- break;
264
-
265
- case "left-up":
266
- style.top = "auto";
267
- style.right = `${document.documentElement.offsetWidth - rel.left + this.offset}px`;
268
- style.bottom = `${document.documentElement.offsetHeight - rel.bottom}px`;
269
- style.left = "auto";
270
- break;
271
-
272
- case "screen-center":
273
- let w = Math.min(contentSize.width, document.documentElement.offsetWidth - 2 * this.screenPadding);
274
- let h = Math.min(contentSize.height, document.documentElement.offsetHeight - 2 * this.screenPadding);
275
- style.top = `${Math.round((document.documentElement.offsetHeight - h) / 2)}px`;
276
- style.right = `${Math.round((document.documentElement.offsetWidth - w) / 2)}px`;
277
- style.bottom = `${Math.round((document.documentElement.offsetHeight - h) / 2)}px`;
278
- style.left = `${Math.round((document.documentElement.offsetWidth - w) / 2)}px`;
279
- break;
280
- }
281
- }
282
-
283
- applyAbsolutePositioningPlacementStyles(style, placement, contentSize, rel, el, noAuto) {
284
- var viewport = getViewportRect(this.screenPadding);
285
-
286
- style.position = "absolute";
287
-
288
- if (placement.startsWith("down")) {
289
- style.top = `${rel.bottom - rel.top + this.offset}px`;
290
- let room = viewport.bottom - rel.bottom + this.offset;
291
- style.bottom =
292
- this.constrain && (noAuto || contentSize.height >= room - 10)
293
- ? `${-Math.min(room, contentSize.height)}px`
294
- : "auto";
295
- } else if (placement.startsWith("up")) {
296
- let room = rel.top - this.offset - viewport.top;
297
- style.top =
298
- this.constrain && (noAuto || contentSize.height >= room - 10)
299
- ? `${-Math.min(room, contentSize.height)}px`
300
- : "auto";
301
- style.bottom = `${rel.bottom - rel.top - this.offset}px`;
302
- }
303
-
304
- switch (placement) {
305
- case "down":
306
- case "down-center":
307
- style.right = "auto";
308
- style.left = `${Math.round((rel.right - rel.left - el.offsetWidth) / 2)}px`;
309
- break;
310
-
311
- case "down-right":
312
- style.right = "auto";
313
- style.left = `0`;
314
- break;
315
-
316
- case "down-left":
317
- style.right = `0`;
318
- style.left = "auto";
319
- break;
320
-
321
- case "up":
322
- case "up-center":
323
- style.right = "auto";
324
- style.left = `${Math.round((rel.right - rel.left - el.offsetWidth) / 2)}px`;
325
- break;
326
-
327
- case "up-right":
328
- style.right = "auto";
329
- style.left = `0`;
330
- break;
331
-
332
- case "up-left":
333
- style.right = `0`;
334
- style.left = "auto";
335
- break;
336
-
337
- case "right":
338
- case "right-center":
339
- style.top = `${Math.round((rel.bottom - rel.top - el.offsetHeight) / 2)}px`;
340
- style.right = "auto";
341
- style.bottom = "auto";
342
- style.left = `${rel.right - rel.left + this.offset}px`;
343
- break;
344
-
345
- case "right-down":
346
- style.top = `0`;
347
- style.right = "auto";
348
- style.bottom = "auto";
349
- style.left = `${rel.right - rel.left + this.offset}px`;
350
- break;
351
-
352
- case "right-up":
353
- style.top = "auto";
354
- style.right = "auto";
355
- style.bottom = `0`;
356
- style.left = `${rel.right - rel.left + this.offset}px`;
357
- break;
358
-
359
- case "left":
360
- case "left-center":
361
- style.top = `${Math.round((rel.bottom - rel.top - el.offsetHeight) / 2)}px`;
362
- style.right = `${rel.right - rel.left + this.offset}px`;
363
- style.bottom = "auto";
364
- style.left = "auto";
365
- break;
366
-
367
- case "left-down":
368
- style.top = `0`;
369
- style.right = `${rel.right - rel.left + this.offset}px`;
370
- style.bottom = "auto";
371
- style.left = "auto";
372
- break;
373
-
374
- case "left-up":
375
- style.top = "auto";
376
- style.right = `${rel.right - rel.left + this.offset}px`;
377
- style.bottom = `0`;
378
- style.left = "auto";
379
- break;
380
- }
381
- }
382
-
383
- applyPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto) {
384
- switch (this.positioning) {
385
- case "absolute":
386
- this.applyAbsolutePositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
387
- break;
388
-
389
- case "auto":
390
- if (isTouchDevice())
391
- this.applyAbsolutePositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
392
- else this.applyFixedPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
393
- break;
394
-
395
- default:
396
- this.applyFixedPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
397
- break;
398
- }
399
- }
400
-
401
- setDirectionClass(component, placement) {
402
- var state = {
403
- "place-left": false,
404
- "place-right": false,
405
- "place-up": false,
406
- "place-down": false,
407
- };
408
-
409
- component.lastPlacement = placement;
410
-
411
- component.setCSSState({
412
- ...state,
413
- ["place-" + placement]: true,
414
- });
415
- }
416
-
417
- measureNaturalDropdownSize(instance, component) {
418
- var { el } = component;
419
- var size = {
420
- width: el.offsetWidth,
421
- height: this.constrain
422
- ? calculateNaturalElementHeight(el)
423
- : el.offsetHeight - el.clientHeight + el.scrollHeight,
424
- };
425
-
426
- if (this.firstChildDefinesHeight && el.firstChild) {
427
- size.height = el.firstChild.offsetHeight;
428
- }
429
-
430
- if (this.firstChildDefinesWidth && el.firstChild) {
431
- size.width = el.firstChild.offsetWidth;
432
- }
433
-
434
- if (this.onMeasureNaturalContentSize) {
435
- var more = instance.invoke("onMeasureNaturalContentSize", el, instance, component);
436
- Object.assign(size, more);
437
- }
438
-
439
- return size;
440
- }
441
-
442
- findOptimalPlacement(contentSize, target, placement, lastPlacement) {
443
- var placementOrder = this.placementOrder.split(" ");
444
- var best = lastPlacement || placement;
445
- var first;
446
-
447
- var score = {};
448
- var viewport = getViewportRect();
449
-
450
- for (var i = 0; i < placementOrder.length; i++) {
451
- var p = placementOrder[i];
452
- if (!first) first = p;
453
- var parts = p.split("-");
454
-
455
- var primary = parts[0];
456
- var secondary = parts[1] || "center";
457
-
458
- score[p] = 0;
459
- var vertical = true;
460
-
461
- switch (primary) {
462
- case "down":
463
- score[p] += 3 * Math.min(1, (viewport.bottom - target.bottom - this.offset) / contentSize.height);
464
- break;
465
-
466
- case "up":
467
- score[p] += 3 * Math.min(1, (target.top - viewport.top - this.offset) / contentSize.height);
468
- break;
469
-
470
- case "right":
471
- score[p] += target.right + contentSize.width + this.offset < viewport.right ? 3 : 0;
472
- vertical = false;
473
- break;
474
-
475
- case "left":
476
- score[p] += target.left - contentSize.width - this.offset >= viewport.left ? 3 : 0;
477
- vertical = false;
478
- break;
479
- }
480
-
481
- switch (secondary) {
482
- case "center":
483
- if (vertical) {
484
- score[p] += (target.right + target.left - contentSize.width) / 2 >= viewport.left ? 1 : 0;
485
- score[p] += (target.right + target.left + contentSize.width) / 2 < viewport.right ? 1 : 0;
486
- } else {
487
- score[p] += (target.bottom + target.top - contentSize.height) / 2 >= viewport.top ? 1 : 0;
488
- score[p] += (target.bottom + target.top + contentSize.height) / 2 < viewport.bottom ? 1 : 0;
489
- }
490
- break;
491
-
492
- case "right":
493
- score[p] += target.left + contentSize.width < viewport.right ? 2 : 0;
494
- break;
495
-
496
- case "left":
497
- score[p] += target.right - contentSize.width >= viewport.left ? 2 : 0;
498
- break;
499
-
500
- case "up":
501
- score[p] += target.bottom - contentSize.height >= viewport.top ? 2 : 0;
502
- break;
503
-
504
- case "down":
505
- score[p] += target.top + contentSize.height < viewport.bottom ? 2 : 0;
506
- break;
507
- }
508
- }
509
-
510
- if (!(best in score)) best = first;
511
-
512
- for (var k in score) if (score[k] > score[best]) best = k;
513
-
514
- if (this.touchFriendly && isTouchDevice() && score[best] < 5) return "screen-center";
515
-
516
- return best;
517
- }
518
-
519
- handleKeyDown(e, instance) {
520
- switch (e.keyCode) {
521
- case 27: //esc
522
- var focusable = findFirst(instance.relatedElement, isFocusable);
523
- if (focusable) focusable.focus();
524
- e.stopPropagation();
525
- e.preventDefault();
526
- break;
527
- }
528
-
529
- if (this.onKeyDown) instance.invoke("onKeyDown", e, instance);
530
- }
531
-
532
- renderContents(context, instance) {
533
- let { CSS, baseClass } = this;
534
- let result = [super.renderContents(context, instance)];
535
- if (this.arrow) {
536
- result.push(
537
- <div key="arrow-border" className={CSS.element(baseClass, "arrow-border")}></div>,
538
- <div key="arrow-back" className={CSS.element(baseClass, "arrow-fill")}></div>
539
- );
540
- }
541
- return result;
542
- }
543
-
544
- render(context, instance, key) {
545
- let { CSS, baseClass } = this;
546
- //if relatedElement is not provided, a beacon is rendered to and used to resolve a nearby element as a target
547
- //if onResolveTarget doesn't provide another element, the beacon itself is used as a target
548
- let beacon = null;
549
- if (this.relatedElement) instance.relatedElement = this.relatedElement;
550
-
551
- if (!this.relatedElement || instance.needsBeacon) {
552
- beacon = (
553
- <div
554
- key={`${key}-beacon`}
555
- className={CSS.element(baseClass, "beacon")}
556
- ref={(el) => {
557
- if (instance.relatedElement) return;
558
- let target = el;
559
- if (this.onResolveRelatedElement) target = instance.invoke("onResolveRelatedElement", el, instance);
560
- else target = el.previousElementSibling;
561
- if (!target) target = el;
562
- if (target == el) instance.needsBeacon = true;
563
- instance.relatedElement = target;
564
- instance.setState({ dummy: {} });
565
- }}
566
- />
567
- );
568
- }
569
- return [beacon, instance.relatedElement && super.render(context, instance, key)];
570
- }
571
-
572
- getOverlayContainer() {
573
- // this should be instance.relatedElement
574
- if (this.relatedElement) {
575
- let container = closestParent(this.relatedElement, (el) => el.dataset && el.dataset.focusableOverlayContainer);
576
- if (container) return container;
577
- }
578
- return super.getOverlayContainer();
579
- }
580
- }
581
-
582
- Dropdown.prototype.offset = 0;
583
- Dropdown.prototype.baseClass = "dropdown";
584
- Dropdown.prototype.matchWidth = true;
585
- Dropdown.prototype.matchMaxWidth = false;
586
- Dropdown.prototype.placementOrder = "up down right left";
587
- Dropdown.prototype.placement = null; //default placement
588
- Dropdown.prototype.constrain = false;
589
- Dropdown.prototype.positioning = "fixed";
590
- Dropdown.prototype.touchFriendly = false;
591
- Dropdown.prototype.arrow = false;
592
- Dropdown.prototype.pad = false;
593
- Dropdown.prototype.elementExplode = 0;
594
- Dropdown.prototype.closeOnScrollDistance = 50;
595
- Dropdown.prototype.screenPadding = 5;
596
- Dropdown.prototype.firstChildDefinesHeight = false;
597
- Dropdown.prototype.firstChildDefinesWidth = false;
598
- Dropdown.prototype.cover = false;
599
-
600
- Widget.alias("dropdown", Dropdown);
601
- Localization.registerPrototype("cx/widgets/Dropdown", Dropdown);
602
-
603
- function getViewportRect(padding = 0) {
604
- return {
605
- left: padding,
606
- top: padding,
607
- right: document.documentElement.offsetWidth - padding,
608
- bottom: document.documentElement.offsetHeight - padding,
609
- };
610
- }
1
+ import { Localization } from "../../ui/Localization";
2
+ import { ResizeManager } from "../../ui/ResizeManager";
3
+ import { Widget, VDOM } from "../../ui/Widget";
4
+ import { calculateNaturalElementHeight } from "../../util/calculateNaturalElementHeight";
5
+ import { closestParent, findFirst, isFocusable } from "../../util/DOM";
6
+ import { getTopLevelBoundingClientRect } from "../../util/getTopLevelBoundingClientRect";
7
+ import { isTouchDevice } from "../../util/isTouchDevice";
8
+ import { Overlay } from "./Overlay";
9
+
10
+ /*
11
+ Dropdown specific features:
12
+ - ability to position itself next to the target element
13
+ - monitor scrollable parents and updates it's position
14
+ */
15
+
16
+ export class Dropdown extends Overlay {
17
+ init() {
18
+ if (this.trackMouse) {
19
+ this.trackMouseX = true;
20
+ this.trackMouseY = true;
21
+ }
22
+ if (this.autoFocus && !this.hasOwnProperty(this.focusable)) this.focusable = true;
23
+ super.init();
24
+ }
25
+
26
+ declareData() {
27
+ return super.declareData(...arguments, {
28
+ placement: undefined,
29
+ });
30
+ }
31
+
32
+ initInstance(context, instance) {
33
+ instance.mousePosition = this.mousePosition;
34
+ instance.parentPositionChangeEvent = context.parentPositionChangeEvent;
35
+ super.initInstance(context, instance);
36
+ }
37
+
38
+ explore(context, instance) {
39
+ context.push("lastDropdown", instance);
40
+ super.explore(context, instance);
41
+ }
42
+
43
+ exploreCleanup(context, instance) {
44
+ context.pop("lastDropdown");
45
+ super.exploreCleanup(context, instance);
46
+ }
47
+
48
+ overlayDidMount(instance, component) {
49
+ super.overlayDidMount(instance, component);
50
+ var scrollableParents = (component.scrollableParents = [window]);
51
+ component.updateDropdownPosition = (e) => this.updateDropdownPosition(instance, component);
52
+
53
+ instance.initialScreenPosition = null;
54
+
55
+ var el = instance.relatedElement.parentElement;
56
+ while (el) {
57
+ scrollableParents.push(el);
58
+ el = el.parentElement;
59
+ }
60
+ scrollableParents.forEach((el) => {
61
+ el.addEventListener("scroll", component.updateDropdownPosition);
62
+ });
63
+ component.offResize = ResizeManager.subscribe(component.updateDropdownPosition);
64
+
65
+ if (this.onDropdownDidMount) instance.invoke("onDropdownDidMount", instance, component);
66
+
67
+ if (this.pipeValidateDropdownPosition)
68
+ instance.invoke("pipeValidateDropdownPosition", component.updateDropdownPosition, instance);
69
+
70
+ if (instance.parentPositionChangeEvent)
71
+ component.offParentPositionChange = instance.parentPositionChangeEvent.subscribe(
72
+ component.updateDropdownPosition
73
+ );
74
+ }
75
+
76
+ overlayDidUpdate(instance, component) {
77
+ this.updateDropdownPosition(instance, component);
78
+ }
79
+
80
+ overlayWillUnmount(instance, component) {
81
+ var { scrollableParents } = component;
82
+ if (scrollableParents) {
83
+ scrollableParents.forEach((el) => {
84
+ el.removeEventListener("scroll", component.updateDropdownPosition);
85
+ });
86
+ delete component.scrollableParents;
87
+ delete component.updateDropdownPosition;
88
+ }
89
+ if (component.offResize) component.offResize();
90
+
91
+ if (this.pipeValidateDropdownPosition) instance.invoke("pipeValidateDropdownPosition", null, instance);
92
+
93
+ if (component.offParentPositionChange) component.offParentPositionChange();
94
+
95
+ delete component.parentBounds;
96
+ delete component.initialScreenPosition;
97
+ }
98
+
99
+ dismissAfterScroll(data, instance, component) {
100
+ if (this.onDismissAfterScroll && instance.invoke("onDismissAfterScroll", data, instance, component) === false)
101
+ return;
102
+ if (instance.dismiss) instance.dismiss();
103
+ }
104
+
105
+ updateDropdownPosition(instance, component) {
106
+ var { el, initialScreenPosition } = component;
107
+ var { data, relatedElement } = instance;
108
+ var parentBounds = (component.parentBounds = getTopLevelBoundingClientRect(relatedElement));
109
+
110
+ //getBoundingClientRect() will return an empty rect if the element is hidden or removed
111
+ if (parentBounds.left == 0 && parentBounds.top == 0 && parentBounds.bottom == 0 && parentBounds.right == 0)
112
+ return;
113
+
114
+ if (this.trackMouseX && instance.mousePosition) {
115
+ parentBounds = {
116
+ top: parentBounds.top,
117
+ bottom: parentBounds.bottom,
118
+ left: instance.mousePosition.x,
119
+ right: instance.mousePosition.x,
120
+ };
121
+ }
122
+
123
+ if (this.trackMouseY && instance.mousePosition) {
124
+ parentBounds = {
125
+ left: parentBounds.left,
126
+ right: parentBounds.right,
127
+ top: instance.mousePosition.y,
128
+ bottom: instance.mousePosition.y,
129
+ };
130
+ }
131
+
132
+ let explode = this.pad && typeof this.elementExplode === "number" ? this.elementExplode : 0;
133
+ if (explode) {
134
+ parentBounds = {
135
+ left: Math.round(parentBounds.left - explode),
136
+ right: Math.round(parentBounds.right + explode),
137
+ top: Math.round(parentBounds.top - explode),
138
+ bottom: Math.round(parentBounds.bottom + explode),
139
+ };
140
+ }
141
+
142
+ var style = {};
143
+ if (this.matchWidth) style.minWidth = `${parentBounds.right - parentBounds.left}px`;
144
+ if (this.matchMaxWidth) style.maxWidth = `${parentBounds.right - parentBounds.left}px`;
145
+
146
+ var contentSize = this.measureNaturalDropdownSize(instance, component);
147
+ var placement = this.findOptimalPlacement(contentSize, parentBounds, data.placement, component.lastPlacement);
148
+
149
+ this.applyPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, false);
150
+ component.setCustomStyle(style);
151
+ this.setDirectionClass(component, placement);
152
+
153
+ if (this.constrain) {
154
+ //recheck content size for changes as sometimes when auto is used the size can change
155
+ let newContentSize = this.measureNaturalDropdownSize(instance, component);
156
+ if (newContentSize.width != contentSize.width || newContentSize.height != contentSize.height) {
157
+ let newStyle = {};
158
+ this.applyPositioningPlacementStyles(newStyle, placement, newContentSize, parentBounds, el, true);
159
+ component.setCustomStyle(newStyle);
160
+ }
161
+ }
162
+
163
+ if (!initialScreenPosition) initialScreenPosition = component.initialScreenPosition = parentBounds;
164
+
165
+ if (
166
+ Math.abs(parentBounds.top - initialScreenPosition.top) > this.closeOnScrollDistance ||
167
+ Math.abs(parentBounds.left - initialScreenPosition.left) > this.closeOnScrollDistance
168
+ )
169
+ this.dismissAfterScroll({ parentBounds, initialScreenPosition }, instance, component);
170
+
171
+ instance.positionChangeSubscribers.notify();
172
+ }
173
+
174
+ applyFixedPositioningPlacementStyles(style, placement, contentSize, rel, el, noAuto) {
175
+ let viewport = getViewportRect(this.screenPadding);
176
+ style.position = "fixed";
177
+
178
+ if (placement.startsWith("down")) {
179
+ style.top = `${(this.cover ? rel.top : rel.bottom) + this.offset}px`;
180
+ let bottom = viewport.bottom - (rel.bottom + this.offset + contentSize.height);
181
+ style.bottom =
182
+ this.constrain && (noAuto || bottom < this.screenPadding + 10)
183
+ ? Math.max(this.screenPadding, bottom) + "px"
184
+ : "auto";
185
+ } else if (placement.startsWith("up")) {
186
+ let top = rel.top - this.offset - contentSize.height - viewport.top;
187
+ style.top =
188
+ this.constrain && (noAuto || top < this.screenPadding + 10)
189
+ ? Math.max(this.screenPadding, top) + "px"
190
+ : "auto";
191
+ style.bottom =
192
+ document.documentElement.offsetHeight - (this.cover ? rel.bottom : rel.top) + this.offset + "px";
193
+ }
194
+
195
+ switch (placement) {
196
+ case "down":
197
+ case "down-center":
198
+ style.right = "auto";
199
+ style.left = `${Math.round((rel.left + rel.right - el.offsetWidth) / 2)}px`;
200
+ break;
201
+
202
+ case "down-right":
203
+ style.right = "auto";
204
+ style.left = `${rel.left}px`;
205
+ break;
206
+
207
+ case "down-left":
208
+ style.right = `${document.documentElement.offsetWidth - rel.right}px`;
209
+ style.left = "auto";
210
+ break;
211
+
212
+ case "up":
213
+ case "up-center":
214
+ style.right = "auto";
215
+ style.left = `${Math.round((rel.left + rel.right - el.offsetWidth) / 2)}px`;
216
+ break;
217
+
218
+ case "up-right":
219
+ style.right = "auto";
220
+ style.left = `${rel.left}px`;
221
+ break;
222
+
223
+ case "up-left":
224
+ style.right = `${document.documentElement.offsetWidth - rel.right}px`;
225
+ style.left = "auto";
226
+ break;
227
+
228
+ case "right":
229
+ case "right-center":
230
+ style.top = `${Math.round((rel.top + rel.bottom - el.offsetHeight) / 2)}px`;
231
+ style.right = "auto";
232
+ style.bottom = "auto";
233
+ style.left = `${rel.right + this.offset}px`;
234
+ break;
235
+
236
+ case "right-down":
237
+ style.top = `${rel.top}px`;
238
+ style.right = "auto";
239
+ style.bottom = "auto";
240
+ style.left = `${rel.right + this.offset}px`;
241
+ break;
242
+
243
+ case "right-up":
244
+ style.top = "auto";
245
+ style.right = "auto";
246
+ style.bottom = `${document.documentElement.offsetHeight - rel.bottom}px`;
247
+ style.left = `${rel.right + this.offset}px`;
248
+ break;
249
+
250
+ case "left":
251
+ case "left-center":
252
+ style.top = `${Math.round((rel.top + rel.bottom - el.offsetHeight) / 2)}px`;
253
+ style.right = `${document.documentElement.offsetWidth - rel.left + this.offset}px`;
254
+ style.bottom = "auto";
255
+ style.left = "auto";
256
+ break;
257
+
258
+ case "left-down":
259
+ style.top = `${rel.top}px`;
260
+ style.right = `${document.documentElement.offsetWidth - rel.left + this.offset}px`;
261
+ style.bottom = "auto";
262
+ style.left = "auto";
263
+ break;
264
+
265
+ case "left-up":
266
+ style.top = "auto";
267
+ style.right = `${document.documentElement.offsetWidth - rel.left + this.offset}px`;
268
+ style.bottom = `${document.documentElement.offsetHeight - rel.bottom}px`;
269
+ style.left = "auto";
270
+ break;
271
+
272
+ case "screen-center":
273
+ let w = Math.min(contentSize.width, document.documentElement.offsetWidth - 2 * this.screenPadding);
274
+ let h = Math.min(contentSize.height, document.documentElement.offsetHeight - 2 * this.screenPadding);
275
+ style.top = `${Math.round((document.documentElement.offsetHeight - h) / 2)}px`;
276
+ style.right = `${Math.round((document.documentElement.offsetWidth - w) / 2)}px`;
277
+ style.bottom = `${Math.round((document.documentElement.offsetHeight - h) / 2)}px`;
278
+ style.left = `${Math.round((document.documentElement.offsetWidth - w) / 2)}px`;
279
+ break;
280
+ }
281
+ }
282
+
283
+ applyAbsolutePositioningPlacementStyles(style, placement, contentSize, rel, el, noAuto) {
284
+ var viewport = getViewportRect(this.screenPadding);
285
+
286
+ style.position = "absolute";
287
+
288
+ if (placement.startsWith("down")) {
289
+ style.top = `${rel.bottom - rel.top + this.offset}px`;
290
+ let room = viewport.bottom - rel.bottom + this.offset;
291
+ style.bottom =
292
+ this.constrain && (noAuto || contentSize.height >= room - 10)
293
+ ? `${-Math.min(room, contentSize.height)}px`
294
+ : "auto";
295
+ } else if (placement.startsWith("up")) {
296
+ let room = rel.top - this.offset - viewport.top;
297
+ style.top =
298
+ this.constrain && (noAuto || contentSize.height >= room - 10)
299
+ ? `${-Math.min(room, contentSize.height)}px`
300
+ : "auto";
301
+ style.bottom = `${rel.bottom - rel.top - this.offset}px`;
302
+ }
303
+
304
+ switch (placement) {
305
+ case "down":
306
+ case "down-center":
307
+ style.right = "auto";
308
+ style.left = `${Math.round((rel.right - rel.left - el.offsetWidth) / 2)}px`;
309
+ break;
310
+
311
+ case "down-right":
312
+ style.right = "auto";
313
+ style.left = `0`;
314
+ break;
315
+
316
+ case "down-left":
317
+ style.right = `0`;
318
+ style.left = "auto";
319
+ break;
320
+
321
+ case "up":
322
+ case "up-center":
323
+ style.right = "auto";
324
+ style.left = `${Math.round((rel.right - rel.left - el.offsetWidth) / 2)}px`;
325
+ break;
326
+
327
+ case "up-right":
328
+ style.right = "auto";
329
+ style.left = `0`;
330
+ break;
331
+
332
+ case "up-left":
333
+ style.right = `0`;
334
+ style.left = "auto";
335
+ break;
336
+
337
+ case "right":
338
+ case "right-center":
339
+ style.top = `${Math.round((rel.bottom - rel.top - el.offsetHeight) / 2)}px`;
340
+ style.right = "auto";
341
+ style.bottom = "auto";
342
+ style.left = `${rel.right - rel.left + this.offset}px`;
343
+ break;
344
+
345
+ case "right-down":
346
+ style.top = `0`;
347
+ style.right = "auto";
348
+ style.bottom = "auto";
349
+ style.left = `${rel.right - rel.left + this.offset}px`;
350
+ break;
351
+
352
+ case "right-up":
353
+ style.top = "auto";
354
+ style.right = "auto";
355
+ style.bottom = `0`;
356
+ style.left = `${rel.right - rel.left + this.offset}px`;
357
+ break;
358
+
359
+ case "left":
360
+ case "left-center":
361
+ style.top = `${Math.round((rel.bottom - rel.top - el.offsetHeight) / 2)}px`;
362
+ style.right = `${rel.right - rel.left + this.offset}px`;
363
+ style.bottom = "auto";
364
+ style.left = "auto";
365
+ break;
366
+
367
+ case "left-down":
368
+ style.top = `0`;
369
+ style.right = `${rel.right - rel.left + this.offset}px`;
370
+ style.bottom = "auto";
371
+ style.left = "auto";
372
+ break;
373
+
374
+ case "left-up":
375
+ style.top = "auto";
376
+ style.right = `${rel.right - rel.left + this.offset}px`;
377
+ style.bottom = `0`;
378
+ style.left = "auto";
379
+ break;
380
+ }
381
+ }
382
+
383
+ applyPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto) {
384
+ switch (this.positioning) {
385
+ case "absolute":
386
+ this.applyAbsolutePositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
387
+ break;
388
+
389
+ case "auto":
390
+ if (isTouchDevice())
391
+ this.applyAbsolutePositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
392
+ else this.applyFixedPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
393
+ break;
394
+
395
+ default:
396
+ this.applyFixedPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
397
+ break;
398
+ }
399
+ }
400
+
401
+ setDirectionClass(component, placement) {
402
+ var state = {
403
+ "place-left": false,
404
+ "place-right": false,
405
+ "place-up": false,
406
+ "place-down": false,
407
+ };
408
+
409
+ component.lastPlacement = placement;
410
+
411
+ component.setCSSState({
412
+ ...state,
413
+ ["place-" + placement]: true,
414
+ });
415
+ }
416
+
417
+ measureNaturalDropdownSize(instance, component) {
418
+ var { el } = component;
419
+ var size = {
420
+ width: el.offsetWidth,
421
+ height: this.constrain
422
+ ? calculateNaturalElementHeight(el)
423
+ : el.offsetHeight - el.clientHeight + el.scrollHeight,
424
+ };
425
+
426
+ if (this.firstChildDefinesHeight && el.firstChild) {
427
+ size.height = el.firstChild.offsetHeight;
428
+ }
429
+
430
+ if (this.firstChildDefinesWidth && el.firstChild) {
431
+ size.width = el.firstChild.offsetWidth;
432
+ }
433
+
434
+ if (this.onMeasureNaturalContentSize) {
435
+ var more = instance.invoke("onMeasureNaturalContentSize", el, instance, component);
436
+ Object.assign(size, more);
437
+ }
438
+
439
+ return size;
440
+ }
441
+
442
+ findOptimalPlacement(contentSize, target, placement, lastPlacement) {
443
+ var placementOrder = this.placementOrder.split(" ");
444
+ var best = lastPlacement || placement;
445
+ var first;
446
+
447
+ var score = {};
448
+ var viewport = getViewportRect();
449
+
450
+ for (var i = 0; i < placementOrder.length; i++) {
451
+ var p = placementOrder[i];
452
+ if (!first) first = p;
453
+ var parts = p.split("-");
454
+
455
+ var primary = parts[0];
456
+ var secondary = parts[1] || "center";
457
+
458
+ score[p] = 0;
459
+ var vertical = true;
460
+
461
+ switch (primary) {
462
+ case "down":
463
+ score[p] += 3 * Math.min(1, (viewport.bottom - target.bottom - this.offset) / contentSize.height);
464
+ break;
465
+
466
+ case "up":
467
+ score[p] += 3 * Math.min(1, (target.top - viewport.top - this.offset) / contentSize.height);
468
+ break;
469
+
470
+ case "right":
471
+ score[p] += target.right + contentSize.width + this.offset < viewport.right ? 3 : 0;
472
+ vertical = false;
473
+ break;
474
+
475
+ case "left":
476
+ score[p] += target.left - contentSize.width - this.offset >= viewport.left ? 3 : 0;
477
+ vertical = false;
478
+ break;
479
+ }
480
+
481
+ switch (secondary) {
482
+ case "center":
483
+ if (vertical) {
484
+ score[p] += (target.right + target.left - contentSize.width) / 2 >= viewport.left ? 1 : 0;
485
+ score[p] += (target.right + target.left + contentSize.width) / 2 < viewport.right ? 1 : 0;
486
+ } else {
487
+ score[p] += (target.bottom + target.top - contentSize.height) / 2 >= viewport.top ? 1 : 0;
488
+ score[p] += (target.bottom + target.top + contentSize.height) / 2 < viewport.bottom ? 1 : 0;
489
+ }
490
+ break;
491
+
492
+ case "right":
493
+ score[p] += target.left + contentSize.width < viewport.right ? 2 : 0;
494
+ break;
495
+
496
+ case "left":
497
+ score[p] += target.right - contentSize.width >= viewport.left ? 2 : 0;
498
+ break;
499
+
500
+ case "up":
501
+ score[p] += target.bottom - contentSize.height >= viewport.top ? 2 : 0;
502
+ break;
503
+
504
+ case "down":
505
+ score[p] += target.top + contentSize.height < viewport.bottom ? 2 : 0;
506
+ break;
507
+ }
508
+ }
509
+
510
+ if (!(best in score)) best = first;
511
+
512
+ for (var k in score) if (score[k] > score[best]) best = k;
513
+
514
+ if (this.touchFriendly && isTouchDevice() && score[best] < 5) return "screen-center";
515
+
516
+ return best;
517
+ }
518
+
519
+ handleKeyDown(e, instance) {
520
+ switch (e.keyCode) {
521
+ case 27: //esc
522
+ var focusable = findFirst(instance.relatedElement, isFocusable);
523
+ if (focusable) focusable.focus();
524
+ e.stopPropagation();
525
+ e.preventDefault();
526
+ break;
527
+ }
528
+
529
+ if (this.onKeyDown) instance.invoke("onKeyDown", e, instance);
530
+ }
531
+
532
+ renderContents(context, instance) {
533
+ let { CSS, baseClass } = this;
534
+ let result = [super.renderContents(context, instance)];
535
+ if (this.arrow) {
536
+ result.push(
537
+ <div key="arrow-border" className={CSS.element(baseClass, "arrow-border")}></div>,
538
+ <div key="arrow-back" className={CSS.element(baseClass, "arrow-fill")}></div>
539
+ );
540
+ }
541
+ return result;
542
+ }
543
+
544
+ render(context, instance, key) {
545
+ let { CSS, baseClass } = this;
546
+ //if relatedElement is not provided, a beacon is rendered to and used to resolve a nearby element as a target
547
+ //if onResolveTarget doesn't provide another element, the beacon itself is used as a target
548
+ let beacon = null;
549
+ if (this.relatedElement) instance.relatedElement = this.relatedElement;
550
+
551
+ if (!this.relatedElement || instance.needsBeacon) {
552
+ beacon = (
553
+ <div
554
+ key={`${key}-beacon`}
555
+ className={CSS.element(baseClass, "beacon")}
556
+ ref={(el) => {
557
+ if (instance.relatedElement) return;
558
+ let target = el;
559
+ if (this.onResolveRelatedElement) target = instance.invoke("onResolveRelatedElement", el, instance);
560
+ else target = el.previousElementSibling;
561
+ if (!target) target = el;
562
+ if (target == el) instance.needsBeacon = true;
563
+ instance.relatedElement = target;
564
+ instance.setState({ dummy: {} });
565
+ }}
566
+ />
567
+ );
568
+ }
569
+ return [beacon, instance.relatedElement && super.render(context, instance, key)];
570
+ }
571
+
572
+ getOverlayContainer() {
573
+ // this should be instance.relatedElement
574
+ if (this.relatedElement) {
575
+ let container = closestParent(this.relatedElement, (el) => el.dataset && el.dataset.focusableOverlayContainer);
576
+ if (container) return container;
577
+ }
578
+ return super.getOverlayContainer();
579
+ }
580
+ }
581
+
582
+ Dropdown.prototype.offset = 0;
583
+ Dropdown.prototype.baseClass = "dropdown";
584
+ Dropdown.prototype.matchWidth = true;
585
+ Dropdown.prototype.matchMaxWidth = false;
586
+ Dropdown.prototype.placementOrder = "up down right left";
587
+ Dropdown.prototype.placement = null; //default placement
588
+ Dropdown.prototype.constrain = false;
589
+ Dropdown.prototype.positioning = "fixed";
590
+ Dropdown.prototype.touchFriendly = false;
591
+ Dropdown.prototype.arrow = false;
592
+ Dropdown.prototype.pad = false;
593
+ Dropdown.prototype.elementExplode = 0;
594
+ Dropdown.prototype.closeOnScrollDistance = 50;
595
+ Dropdown.prototype.screenPadding = 5;
596
+ Dropdown.prototype.firstChildDefinesHeight = false;
597
+ Dropdown.prototype.firstChildDefinesWidth = false;
598
+ Dropdown.prototype.cover = false;
599
+
600
+ Widget.alias("dropdown", Dropdown);
601
+ Localization.registerPrototype("cx/widgets/Dropdown", Dropdown);
602
+
603
+ function getViewportRect(padding = 0) {
604
+ return {
605
+ left: padding,
606
+ top: padding,
607
+ right: document.documentElement.offsetWidth - padding,
608
+ bottom: document.documentElement.offsetHeight - padding,
609
+ };
610
+ }