cx 26.4.0 → 26.4.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 (598) hide show
  1. package/.mocharc.json +5 -5
  2. package/LICENSE-THIRD-PARTY.md +91 -91
  3. package/LICENSE.md +7 -7
  4. package/README.md +46 -46
  5. package/build/charts/shapes.d.ts.map +1 -1
  6. package/build/charts/shapes.js +14 -7
  7. package/build/util/innerTextTrim.js +1 -1
  8. package/build/widgets/overlay/ContextMenu.d.ts.map +1 -1
  9. package/build/widgets/overlay/ContextMenu.js +1 -0
  10. package/build/widgets/overlay/Dropdown.d.ts +11 -3
  11. package/build/widgets/overlay/Dropdown.d.ts.map +1 -1
  12. package/build/widgets/overlay/Dropdown.js +52 -25
  13. package/build/widgets/overlay/Overlay.d.ts.map +1 -1
  14. package/build/widgets/overlay/Overlay.js +1 -1
  15. package/build.js +133 -133
  16. package/dist/charts.js +80 -45
  17. package/dist/manifest.js +806 -806
  18. package/dist/util.js +1 -1
  19. package/dist/widgets.css +13 -12
  20. package/dist/widgets.js +215 -85
  21. package/package.json +101 -100
  22. package/src/charts/Bar.scss +32 -32
  23. package/src/charts/Bar.ts +114 -114
  24. package/src/charts/BarGraph.tsx +145 -145
  25. package/src/charts/BubbleGraph.scss +35 -35
  26. package/src/charts/BubbleGraph.tsx +165 -165
  27. package/src/charts/Chart.ts +110 -110
  28. package/src/charts/ColorMap.ts +150 -150
  29. package/src/charts/Column.scss +32 -32
  30. package/src/charts/Column.ts +124 -124
  31. package/src/charts/ColumnBarBase.tsx +309 -309
  32. package/src/charts/ColumnBarGraphBase.tsx +229 -229
  33. package/src/charts/ColumnGraph.scss +32 -32
  34. package/src/charts/ColumnGraph.tsx +153 -153
  35. package/src/charts/Grid.ts +5 -5
  36. package/src/charts/Gridlines.scss +27 -27
  37. package/src/charts/Gridlines.tsx +88 -88
  38. package/src/charts/Legend.tsx +314 -314
  39. package/src/charts/LegendEntry.tsx +197 -197
  40. package/src/charts/LineGraph.tsx +455 -455
  41. package/src/charts/Marker.scss +46 -46
  42. package/src/charts/Marker.tsx +538 -538
  43. package/src/charts/MarkerLine.scss +23 -23
  44. package/src/charts/MarkerLine.tsx +233 -233
  45. package/src/charts/MouseTracker.tsx +115 -115
  46. package/src/charts/Pie.ts +8 -8
  47. package/src/charts/PieChart.scss +32 -32
  48. package/src/charts/PieChart.tsx +843 -843
  49. package/src/charts/PieLabel.tsx +124 -124
  50. package/src/charts/PieLabelsContainer.ts +68 -68
  51. package/src/charts/Range.scss +23 -23
  52. package/src/charts/Range.tsx +318 -318
  53. package/src/charts/RangeMarker.scss +17 -17
  54. package/src/charts/RangeMarker.tsx +250 -250
  55. package/src/charts/ScatterGraph.scss +27 -27
  56. package/src/charts/ScatterGraph.tsx +245 -245
  57. package/src/charts/Swimlane.scss +19 -19
  58. package/src/charts/Swimlane.tsx +195 -195
  59. package/src/charts/Swimlanes.scss +19 -19
  60. package/src/charts/Swimlanes.tsx +179 -179
  61. package/src/charts/axis/Axis.scss +24 -24
  62. package/src/charts/axis/Axis.tsx +444 -444
  63. package/src/charts/axis/CategoryAxis.scss +37 -37
  64. package/src/charts/axis/CategoryAxis.tsx +313 -313
  65. package/src/charts/axis/NumericAxis.scss +38 -38
  66. package/src/charts/axis/NumericAxis.tsx +437 -437
  67. package/src/charts/axis/Stack.ts +61 -61
  68. package/src/charts/axis/TimeAxis.scss +37 -37
  69. package/src/charts/axis/TimeAxis.tsx +834 -834
  70. package/src/charts/axis/index.scss +4 -4
  71. package/src/charts/axis/index.ts +3 -3
  72. package/src/charts/axis/variables.scss +5 -5
  73. package/src/charts/helpers/MinMaxFinder.ts +66 -66
  74. package/src/charts/helpers/PointReducer.ts +135 -135
  75. package/src/charts/helpers/index.ts +4 -4
  76. package/src/charts/index.scss +21 -21
  77. package/src/charts/index.ts +34 -34
  78. package/src/charts/palette.scss +77 -77
  79. package/src/charts/palette.variables.scss +23 -23
  80. package/src/charts/shapes.tsx +93 -86
  81. package/src/charts/variables.scss +53 -53
  82. package/src/core.d.ts +182 -182
  83. package/src/data/AggregateFunction.ts +171 -171
  84. package/src/data/ArrayElementView.spec.ts +88 -88
  85. package/src/data/ArrayElementView.ts +91 -91
  86. package/src/data/ArrayRef.ts +34 -34
  87. package/src/data/AugmentedViewBase.ts +88 -88
  88. package/src/data/Binding.spec.ts +69 -69
  89. package/src/data/Binding.ts +107 -107
  90. package/src/data/ExposedRecordView.ts +95 -95
  91. package/src/data/ExposedValueView.ts +89 -89
  92. package/src/data/Expression.spec.ts +229 -229
  93. package/src/data/Expression.ts +233 -233
  94. package/src/data/Grouper.spec.ts +57 -57
  95. package/src/data/Grouper.ts +158 -158
  96. package/src/data/NestedDataView.ts +43 -43
  97. package/src/data/ReadOnlyDataView.ts +39 -39
  98. package/src/data/Ref.spec.ts +79 -79
  99. package/src/data/Ref.ts +104 -104
  100. package/src/data/Selector.ts +10 -10
  101. package/src/data/Store.spec.ts +22 -22
  102. package/src/data/Store.ts +52 -52
  103. package/src/data/StoreProxy.ts +19 -19
  104. package/src/data/StoreRef.spec.ts +24 -24
  105. package/src/data/StoreRef.ts +66 -66
  106. package/src/data/StringTemplate.spec.ts +132 -132
  107. package/src/data/StringTemplate.ts +93 -93
  108. package/src/data/StructuredSelector.spec.ts +113 -113
  109. package/src/data/StructuredSelector.ts +146 -146
  110. package/src/data/SubscribableView.ts +63 -63
  111. package/src/data/View.spec.ts +60 -60
  112. package/src/data/View.ts +346 -346
  113. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  114. package/src/data/ZoomIntoPropertyView.ts +45 -45
  115. package/src/data/comparer.spec.ts +60 -60
  116. package/src/data/comparer.ts +78 -78
  117. package/src/data/computable.spec.ts +87 -87
  118. package/src/data/computable.ts +69 -69
  119. package/src/data/createAccessorModelProxy.spec.tsx +157 -157
  120. package/src/data/createStructuredSelector.spec.ts +45 -45
  121. package/src/data/createStructuredSelector.ts +62 -62
  122. package/src/data/defaultCompare.ts +14 -14
  123. package/src/data/diff/diffArrays.ts +49 -49
  124. package/src/data/diff/diffs.spec.ts +49 -49
  125. package/src/data/diff/index.ts +1 -1
  126. package/src/data/enableFatArrowExpansion.ts +6 -6
  127. package/src/data/getAccessor.spec.ts +11 -11
  128. package/src/data/getAccessor.ts +74 -74
  129. package/src/data/getSelector.spec.ts +43 -43
  130. package/src/data/getSelector.ts +66 -66
  131. package/src/data/index.ts +30 -30
  132. package/src/data/isSelector.ts +26 -26
  133. package/src/data/ops/append.spec.ts +28 -28
  134. package/src/data/ops/append.ts +5 -5
  135. package/src/data/ops/filter.spec.ts +35 -35
  136. package/src/data/ops/filter.ts +9 -9
  137. package/src/data/ops/findTreeNode.spec.ts +23 -23
  138. package/src/data/ops/findTreeNode.ts +33 -33
  139. package/src/data/ops/findTreePath.ts +28 -28
  140. package/src/data/ops/index.ts +11 -11
  141. package/src/data/ops/insertElement.ts +3 -3
  142. package/src/data/ops/merge.spec.ts +27 -27
  143. package/src/data/ops/merge.ts +13 -13
  144. package/src/data/ops/moveElement.ts +21 -21
  145. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  146. package/src/data/ops/removeTreeNodes.ts +28 -28
  147. package/src/data/ops/updateArray.spec.ts +69 -69
  148. package/src/data/ops/updateArray.ts +31 -31
  149. package/src/data/ops/updateTree.spec.ts +54 -54
  150. package/src/data/ops/updateTree.ts +49 -49
  151. package/src/data/test-types.ts +7 -7
  152. package/src/hooks/createLocalStorageRef.ts +21 -21
  153. package/src/hooks/index.ts +8 -8
  154. package/src/hooks/invokeCallback.spec.tsx +59 -59
  155. package/src/hooks/invokeCallback.ts +8 -8
  156. package/src/hooks/resolveCallback.spec.tsx +71 -71
  157. package/src/hooks/resolveCallback.ts +16 -16
  158. package/src/hooks/store.spec.tsx +67 -67
  159. package/src/hooks/store.ts +46 -46
  160. package/src/hooks/useEffect.ts +14 -14
  161. package/src/hooks/useInterval.ts +8 -8
  162. package/src/hooks/useState.ts +20 -20
  163. package/src/hooks/useTrigger.spec.tsx +105 -105
  164. package/src/hooks/useTrigger.ts +26 -26
  165. package/src/index.scss +5 -5
  166. package/src/index.ts +7 -7
  167. package/src/jsx-dev-runtime.ts +4 -4
  168. package/src/jsx-runtime.spec.tsx +508 -508
  169. package/src/jsx-runtime.ts +88 -88
  170. package/src/locale/de-de.ts +76 -76
  171. package/src/locale/en-us.ts +75 -75
  172. package/src/locale/es-es.ts +76 -76
  173. package/src/locale/fr-fr.ts +76 -76
  174. package/src/locale/nl-nl.ts +76 -76
  175. package/src/locale/pt-pt.ts +76 -76
  176. package/src/locale/sr-latn-ba.ts +76 -76
  177. package/src/maps.scss +5 -5
  178. package/src/svg/BoundedObject.ts +101 -101
  179. package/src/svg/ClipRect.tsx +29 -29
  180. package/src/svg/Ellipse.tsx +76 -76
  181. package/src/svg/Line.tsx +73 -73
  182. package/src/svg/NonOverlappingRect.ts +26 -26
  183. package/src/svg/NonOverlappingRectGroup.ts +49 -49
  184. package/src/svg/Rectangle.tsx +98 -98
  185. package/src/svg/Svg.scss +28 -28
  186. package/src/svg/Svg.tsx +241 -241
  187. package/src/svg/Text.scss +19 -19
  188. package/src/svg/Text.tsx +190 -190
  189. package/src/svg/TextualBoundedObject.ts +35 -35
  190. package/src/svg/index.scss +10 -10
  191. package/src/svg/index.ts +17 -17
  192. package/src/svg/util/Rect.ts +105 -105
  193. package/src/ui/CSS.ts +87 -87
  194. package/src/ui/CSSHelper.ts +17 -17
  195. package/src/ui/Container.spec.ts +87 -87
  196. package/src/ui/Container.tsx +220 -220
  197. package/src/ui/ContentResolver.spec.tsx +585 -585
  198. package/src/ui/ContentResolver.ts +132 -132
  199. package/src/ui/Controller.spec.tsx +604 -604
  200. package/src/ui/Controller.ts +207 -207
  201. package/src/ui/Culture.ts +159 -159
  202. package/src/ui/Cx.spec.tsx +210 -210
  203. package/src/ui/Cx.tsx +386 -386
  204. package/src/ui/DataProxy.spec.tsx +337 -337
  205. package/src/ui/DataProxy.ts +55 -55
  206. package/src/ui/DetachedScope.tsx +159 -159
  207. package/src/ui/FocusManager.ts +171 -171
  208. package/src/ui/Format.ts +108 -108
  209. package/src/ui/HoverSync.tsx +221 -221
  210. package/src/ui/Instance.ts +963 -963
  211. package/src/ui/IsolatedScope.spec.tsx +62 -62
  212. package/src/ui/IsolatedScope.ts +52 -52
  213. package/src/ui/Localization.ts +70 -70
  214. package/src/ui/Prop.ts +141 -141
  215. package/src/ui/PureContainer.spec.tsx +232 -232
  216. package/src/ui/PureContainer.tsx +19 -19
  217. package/src/ui/RenderingContext.ts +99 -99
  218. package/src/ui/Repeater.ts +194 -194
  219. package/src/ui/Rescope.spec.tsx +199 -199
  220. package/src/ui/Rescope.ts +50 -50
  221. package/src/ui/ResizeManager.ts +30 -30
  222. package/src/ui/Restate.spec.tsx +422 -422
  223. package/src/ui/Restate.tsx +217 -217
  224. package/src/ui/StaticText.ts +11 -11
  225. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  226. package/src/ui/Text.ts +52 -52
  227. package/src/ui/VDOM.ts +1 -1
  228. package/src/ui/Widget.spec.tsx +53 -53
  229. package/src/ui/Widget.tsx +359 -359
  230. package/src/ui/ZIndexManager.ts +11 -11
  231. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  232. package/src/ui/adapter/ArrayAdapter.ts +229 -229
  233. package/src/ui/adapter/DataAdapter.ts +52 -52
  234. package/src/ui/adapter/GroupAdapter.spec.ts +42 -42
  235. package/src/ui/adapter/GroupAdapter.ts +244 -244
  236. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  237. package/src/ui/adapter/TreeAdapter.ts +245 -245
  238. package/src/ui/adapter/index.ts +4 -4
  239. package/src/ui/app/History.ts +147 -147
  240. package/src/ui/app/Url.spec.ts +50 -50
  241. package/src/ui/app/Url.ts +102 -102
  242. package/src/ui/app/index.ts +5 -5
  243. package/src/ui/app/startAppLoop.tsx +82 -82
  244. package/src/ui/app/startHotAppLoop.ts +41 -41
  245. package/src/ui/batchUpdates.ts +72 -72
  246. package/src/ui/bind.ts +10 -10
  247. package/src/ui/createFunctionalComponent.spec.tsx +605 -605
  248. package/src/ui/createFunctionalComponent.ts +96 -96
  249. package/src/ui/expr.ts +47 -47
  250. package/src/ui/exprHelpers.spec.ts +412 -412
  251. package/src/ui/exprHelpers.ts +96 -96
  252. package/src/ui/flattenProps.ts +21 -21
  253. package/src/ui/index.scss +2 -2
  254. package/src/ui/index.ts +51 -51
  255. package/src/ui/keyboardShortcuts.ts +50 -50
  256. package/src/ui/layout/Content.ts +30 -30
  257. package/src/ui/layout/ContentPlaceholder.spec.tsx +599 -599
  258. package/src/ui/layout/ContentPlaceholder.ts +133 -133
  259. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +207 -207
  260. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  261. package/src/ui/layout/LabelsLeftLayout.scss +45 -45
  262. package/src/ui/layout/LabelsLeftLayout.tsx +76 -76
  263. package/src/ui/layout/LabelsTopLayout.scss +73 -73
  264. package/src/ui/layout/LabelsTopLayout.tsx +156 -156
  265. package/src/ui/layout/UseParentLayout.ts +8 -8
  266. package/src/ui/layout/exploreChildren.ts +38 -38
  267. package/src/ui/layout/index.scss +2 -2
  268. package/src/ui/layout/index.ts +10 -10
  269. package/src/ui/layout/variables.scss +2 -2
  270. package/src/ui/selection/KeySelection.ts +153 -153
  271. package/src/ui/selection/PropertySelection.ts +87 -87
  272. package/src/ui/selection/Selection.ts +128 -128
  273. package/src/ui/selection/index.ts +3 -3
  274. package/src/ui/tpl.spec.ts +69 -69
  275. package/src/ui/tpl.ts +17 -17
  276. package/src/ui/variables.scss +1 -1
  277. package/src/util/Component.spec.ts +494 -494
  278. package/src/util/Component.ts +352 -352
  279. package/src/util/Console.ts +13 -13
  280. package/src/util/DOM.ts +88 -88
  281. package/src/util/Debug.ts +71 -71
  282. package/src/util/Format.spec.ts +69 -69
  283. package/src/util/Format.ts +267 -267
  284. package/src/util/GlobalCacheIdentifier.ts +11 -11
  285. package/src/util/KeyCode.ts +21 -21
  286. package/src/util/SubscriberList.ts +86 -86
  287. package/src/util/Timing.ts +58 -58
  288. package/src/util/TraversalStack.spec.ts +53 -53
  289. package/src/util/TraversalStack.ts +47 -47
  290. package/src/util/addEventListenerWithOptions.ts +41 -41
  291. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  292. package/src/util/calculateNaturalElementHeight.ts +22 -22
  293. package/src/util/call-once.scss +6 -6
  294. package/src/util/capitalize.ts +4 -4
  295. package/src/util/coalesce.ts +6 -6
  296. package/src/util/color/hslToRgb.ts +34 -34
  297. package/src/util/color/index.ts +4 -4
  298. package/src/util/color/parseColor.ts +173 -173
  299. package/src/util/color/rgbToHex.ts +14 -14
  300. package/src/util/color/rgbToHsl.ts +35 -35
  301. package/src/util/date/dateDiff.ts +9 -9
  302. package/src/util/date/diff.ts +13 -13
  303. package/src/util/date/encodeDate.ts +8 -8
  304. package/src/util/date/encodeDateWithTimezoneOffset.ts +18 -18
  305. package/src/util/date/index.ts +11 -11
  306. package/src/util/date/lowerBoundCheck.ts +13 -13
  307. package/src/util/date/maxDate.ts +14 -14
  308. package/src/util/date/minDate.ts +14 -14
  309. package/src/util/date/monthStart.ts +8 -8
  310. package/src/util/date/parseDateInvariant.ts +20 -20
  311. package/src/util/date/sameDate.ts +11 -11
  312. package/src/util/date/upperBoundCheck.spec.ts +30 -30
  313. package/src/util/date/upperBoundCheck.ts +13 -13
  314. package/src/util/date/zeroTime.ts +9 -9
  315. package/src/util/debounce.ts +26 -26
  316. package/src/util/dummyCallback.ts +1 -1
  317. package/src/util/escapeSpecialRegexCharacters.ts +8 -8
  318. package/src/util/eventCallbacks.ts +12 -12
  319. package/src/util/expandFatArrows.ts +118 -118
  320. package/src/util/findScrollableParent.ts +15 -15
  321. package/src/util/getActiveElement.ts +4 -4
  322. package/src/util/getParentFrameBoundingClientRect.ts +13 -13
  323. package/src/util/getScrollerBoundingClientRect.ts +12 -12
  324. package/src/util/getSearchQueryPredicate.spec.ts +40 -40
  325. package/src/util/getSearchQueryPredicate.ts +58 -58
  326. package/src/util/getTopLevelBoundingClientRect.ts +7 -7
  327. package/src/util/getVendorPrefix.ts +38 -38
  328. package/src/util/hasKey.ts +18 -18
  329. package/src/util/index.scss +13 -13
  330. package/src/util/index.ts +55 -55
  331. package/src/util/innerTextTrim.ts +10 -10
  332. package/src/util/isArray.ts +3 -3
  333. package/src/util/isDataRecord.ts +5 -5
  334. package/src/util/isDefined.ts +3 -3
  335. package/src/util/isDigit.ts +8 -8
  336. package/src/util/isFunction.ts +3 -3
  337. package/src/util/isNonEmptyArray.ts +3 -3
  338. package/src/util/isNumber.ts +3 -3
  339. package/src/util/isObject.ts +3 -3
  340. package/src/util/isPromise.ts +6 -6
  341. package/src/util/isString.ts +3 -3
  342. package/src/util/isTextInputElement.ts +2 -2
  343. package/src/util/isTouchDevice.ts +7 -7
  344. package/src/util/isTouchEvent.ts +64 -64
  345. package/src/util/isUndefined.ts +3 -3
  346. package/src/util/isValidIdentifierName.spec.ts +33 -33
  347. package/src/util/isValidIdentifierName.ts +5 -5
  348. package/src/util/maps.scss +1 -1
  349. package/src/util/onIdleCallback.ts +10 -10
  350. package/src/util/parseStyle.ts +29 -29
  351. package/src/util/quote.ts +6 -6
  352. package/src/util/reverseSlice.ts +9 -9
  353. package/src/util/routeAppend.spec.ts +19 -19
  354. package/src/util/routeAppend.ts +15 -15
  355. package/src/util/scrollElementIntoView.ts +40 -40
  356. package/src/util/scss/add-rules.scss +40 -40
  357. package/src/util/scss/besm.scss +15 -15
  358. package/src/util/scss/calc.scss +137 -137
  359. package/src/util/scss/call-once.scss +12 -12
  360. package/src/util/scss/clockwise.scss +49 -49
  361. package/src/util/scss/colors.scss +9 -9
  362. package/src/util/scss/deep-get.scss +11 -11
  363. package/src/util/scss/deep-merge.scss +21 -21
  364. package/src/util/scss/defaults.scss +24 -24
  365. package/src/util/scss/divide.scss +3 -3
  366. package/src/util/scss/elements.scss +78 -78
  367. package/src/util/scss/global.scss +15 -15
  368. package/src/util/scss/index.scss +1 -1
  369. package/src/util/scss/maps.scss +2 -2
  370. package/src/util/scss/pad-size.scss +9 -9
  371. package/src/util/scss/padding.scss +6 -6
  372. package/src/util/scss/screen-size.scss +5 -5
  373. package/src/util/scss/variables.scss +6 -6
  374. package/src/util/shallowEquals.ts +43 -43
  375. package/src/util/test/createTestRenderer.tsx +19 -19
  376. package/src/util/throttle.ts +21 -21
  377. package/src/util/validatedDebounce.ts +23 -23
  378. package/src/util/variables.scss +1 -1
  379. package/src/variables.scss +5 -5
  380. package/src/widgets/AccessorBindings.spec.tsx +90 -90
  381. package/src/widgets/Button.scss +143 -143
  382. package/src/widgets/Button.tsx +181 -181
  383. package/src/widgets/Button.variables.scss +21 -21
  384. package/src/widgets/CxCredit.scss +41 -41
  385. package/src/widgets/CxCredit.tsx +46 -46
  386. package/src/widgets/DocumentTitle.ts +95 -95
  387. package/src/widgets/FlexBox.scss +153 -153
  388. package/src/widgets/FlexBox.tsx +168 -168
  389. package/src/widgets/Heading.scss +46 -46
  390. package/src/widgets/Heading.ts +42 -42
  391. package/src/widgets/HighlightedSearchText.scss +27 -27
  392. package/src/widgets/HighlightedSearchText.tsx +54 -54
  393. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -108
  394. package/src/widgets/HtmlElement.spec.tsx +117 -117
  395. package/src/widgets/HtmlElement.tsx +468 -468
  396. package/src/widgets/Icon.scss +28 -28
  397. package/src/widgets/Icon.ts +64 -64
  398. package/src/widgets/List.scss +100 -100
  399. package/src/widgets/List.tsx +792 -792
  400. package/src/widgets/ProgressBar.scss +64 -64
  401. package/src/widgets/ProgressBar.tsx +66 -66
  402. package/src/widgets/ReactElementWrapper.spec.tsx +452 -452
  403. package/src/widgets/ReactElementWrapper.tsx +108 -108
  404. package/src/widgets/Resizer.scss +46 -46
  405. package/src/widgets/Resizer.tsx +200 -200
  406. package/src/widgets/Sandbox.ts +104 -104
  407. package/src/widgets/Section.scss +53 -53
  408. package/src/widgets/Section.tsx +187 -187
  409. package/src/widgets/animations.scss +13 -13
  410. package/src/widgets/autoFocus.ts +9 -9
  411. package/src/widgets/box.scss +47 -47
  412. package/src/widgets/cx.ts +63 -63
  413. package/src/widgets/drag-drop/DragClone.scss +44 -44
  414. package/src/widgets/drag-drop/DragHandle.scss +25 -25
  415. package/src/widgets/drag-drop/DragHandle.tsx +47 -47
  416. package/src/widgets/drag-drop/DragSource.scss +33 -33
  417. package/src/widgets/drag-drop/DragSource.tsx +237 -237
  418. package/src/widgets/drag-drop/DropZone.scss +83 -83
  419. package/src/widgets/drag-drop/DropZone.tsx +353 -353
  420. package/src/widgets/drag-drop/index.scss +4 -4
  421. package/src/widgets/drag-drop/index.ts +4 -4
  422. package/src/widgets/drag-drop/maps.scss +7 -7
  423. package/src/widgets/drag-drop/ops.tsx +422 -422
  424. package/src/widgets/drag-drop/variables.scss +17 -17
  425. package/src/widgets/enableAllInternalDependencies.ts +11 -11
  426. package/src/widgets/form/Calendar.maps.scss +54 -54
  427. package/src/widgets/form/Calendar.scss +237 -237
  428. package/src/widgets/form/Calendar.variables.scss +21 -21
  429. package/src/widgets/form/Checkbox.maps.scss +34 -34
  430. package/src/widgets/form/Checkbox.scss +140 -140
  431. package/src/widgets/form/Checkbox.tsx +340 -340
  432. package/src/widgets/form/Checkbox.variables.scss +8 -8
  433. package/src/widgets/form/ColorField.scss +112 -112
  434. package/src/widgets/form/ColorField.tsx +551 -551
  435. package/src/widgets/form/ColorPicker.maps.scss +21 -21
  436. package/src/widgets/form/ColorPicker.scss +302 -302
  437. package/src/widgets/form/ColorPicker.tsx +606 -606
  438. package/src/widgets/form/ColorPicker.variables.scss +9 -9
  439. package/src/widgets/form/DateField.ts +21 -21
  440. package/src/widgets/form/DateTimeField.scss +111 -111
  441. package/src/widgets/form/DateTimeField.tsx +814 -814
  442. package/src/widgets/form/DateTimePicker.scss +57 -57
  443. package/src/widgets/form/DateTimePicker.tsx +429 -429
  444. package/src/widgets/form/Field.maps.scss +122 -122
  445. package/src/widgets/form/Field.scss +200 -200
  446. package/src/widgets/form/Field.tsx +715 -715
  447. package/src/widgets/form/Field.variables.scss +46 -46
  448. package/src/widgets/form/FieldGroup.ts +10 -10
  449. package/src/widgets/form/FieldIcon.ts +61 -61
  450. package/src/widgets/form/HelpText.scss +27 -27
  451. package/src/widgets/form/HelpText.ts +15 -15
  452. package/src/widgets/form/Label.scss +45 -45
  453. package/src/widgets/form/Label.tsx +117 -117
  454. package/src/widgets/form/LabeledContainer.ts +77 -77
  455. package/src/widgets/form/LookupField.maps.scss +26 -26
  456. package/src/widgets/form/LookupField.spec.tsx +93 -93
  457. package/src/widgets/form/LookupField.tsx +1689 -1689
  458. package/src/widgets/form/MonthField.scss +113 -113
  459. package/src/widgets/form/MonthField.tsx +748 -748
  460. package/src/widgets/form/MonthPicker.maps.scss +50 -50
  461. package/src/widgets/form/MonthPicker.scss +134 -134
  462. package/src/widgets/form/MonthPicker.tsx +1061 -1061
  463. package/src/widgets/form/MonthPicker.variables.scss +24 -24
  464. package/src/widgets/form/NumberField.scss +72 -72
  465. package/src/widgets/form/NumberField.tsx +653 -653
  466. package/src/widgets/form/Radio.maps.scss +36 -36
  467. package/src/widgets/form/Radio.scss +133 -133
  468. package/src/widgets/form/Radio.tsx +249 -249
  469. package/src/widgets/form/Radio.variables.scss +7 -7
  470. package/src/widgets/form/Select.scss +104 -104
  471. package/src/widgets/form/Select.tsx +327 -327
  472. package/src/widgets/form/Slider.scss +130 -130
  473. package/src/widgets/form/Slider.tsx +473 -473
  474. package/src/widgets/form/Switch.scss +152 -152
  475. package/src/widgets/form/Switch.tsx +176 -176
  476. package/src/widgets/form/TextArea.scss +58 -58
  477. package/src/widgets/form/TextArea.tsx +229 -229
  478. package/src/widgets/form/TextField.scss +66 -66
  479. package/src/widgets/form/TextField.tsx +453 -453
  480. package/src/widgets/form/TimeField.ts +10 -10
  481. package/src/widgets/form/TimeList.tsx +105 -105
  482. package/src/widgets/form/UploadButton.scss +57 -57
  483. package/src/widgets/form/UploadButton.tsx +387 -387
  484. package/src/widgets/form/ValidationError.scss +27 -27
  485. package/src/widgets/form/ValidationError.tsx +81 -81
  486. package/src/widgets/form/ValidationGroup.spec.tsx +147 -147
  487. package/src/widgets/form/ValidationGroup.ts +141 -141
  488. package/src/widgets/form/Validator.ts +60 -60
  489. package/src/widgets/form/Wheel.scss +164 -164
  490. package/src/widgets/form/Wheel.tsx +309 -309
  491. package/src/widgets/form/index.scss +22 -22
  492. package/src/widgets/form/index.ts +28 -28
  493. package/src/widgets/form/maps.scss +81 -81
  494. package/src/widgets/form/variables.scss +114 -114
  495. package/src/widgets/grid/Grid.spec.ts +42 -42
  496. package/src/widgets/grid/Grid.tsx +4269 -4269
  497. package/src/widgets/grid/GridCell.ts +143 -143
  498. package/src/widgets/grid/GridCellEditor.tsx +58 -58
  499. package/src/widgets/grid/GridRow.ts +302 -302
  500. package/src/widgets/grid/GridRowLine.ts +49 -49
  501. package/src/widgets/grid/Pagination.scss +124 -124
  502. package/src/widgets/grid/Pagination.tsx +134 -134
  503. package/src/widgets/grid/TreeNode.scss +107 -107
  504. package/src/widgets/grid/TreeNode.tsx +165 -165
  505. package/src/widgets/grid/createGridCellEditor.tsx +18 -18
  506. package/src/widgets/grid/index.scss +3 -3
  507. package/src/widgets/grid/index.ts +16 -16
  508. package/src/widgets/grid/maps.scss +110 -110
  509. package/src/widgets/icons/arrow-down.svg +3 -3
  510. package/src/widgets/icons/arrow-right.svg +2 -2
  511. package/src/widgets/icons/base.svg +104 -104
  512. package/src/widgets/icons/calendar-old.svg +169 -169
  513. package/src/widgets/icons/calendar.svg +187 -187
  514. package/src/widgets/icons/calendar.tsx +22 -22
  515. package/src/widgets/icons/check.tsx +14 -14
  516. package/src/widgets/icons/clear.svg +74 -74
  517. package/src/widgets/icons/clear.tsx +16 -16
  518. package/src/widgets/icons/close.svg +74 -74
  519. package/src/widgets/icons/close.tsx +20 -20
  520. package/src/widgets/icons/cx.tsx +39 -39
  521. package/src/widgets/icons/drop-down.tsx +16 -16
  522. package/src/widgets/icons/dropdown-arrow.svg +61 -61
  523. package/src/widgets/icons/file.svg +4 -4
  524. package/src/widgets/icons/file.tsx +14 -14
  525. package/src/widgets/icons/folder-open.svg +5 -5
  526. package/src/widgets/icons/folder-open.tsx +16 -16
  527. package/src/widgets/icons/folder.svg +58 -58
  528. package/src/widgets/icons/folder.tsx +13 -13
  529. package/src/widgets/icons/forward.svg +67 -67
  530. package/src/widgets/icons/forward.tsx +26 -26
  531. package/src/widgets/icons/index.ts +14 -14
  532. package/src/widgets/icons/loading.svg +4 -4
  533. package/src/widgets/icons/loading.tsx +28 -28
  534. package/src/widgets/icons/menu.tsx +18 -18
  535. package/src/widgets/icons/pixel-picker.tsx +18 -18
  536. package/src/widgets/icons/registry.ts +56 -56
  537. package/src/widgets/icons/search.svg +107 -107
  538. package/src/widgets/icons/search.tsx +14 -14
  539. package/src/widgets/icons/sort-asc.svg +3 -3
  540. package/src/widgets/icons/sort-asc.tsx +15 -15
  541. package/src/widgets/icons/square.tsx +22 -22
  542. package/src/widgets/index.d.ts +55 -55
  543. package/src/widgets/index.scss +16 -16
  544. package/src/widgets/lists.scss +42 -42
  545. package/src/widgets/maps.scss +139 -139
  546. package/src/widgets/nav/Link.scss +33 -33
  547. package/src/widgets/nav/Link.ts +11 -11
  548. package/src/widgets/nav/LinkButton.ts +176 -176
  549. package/src/widgets/nav/Menu.scss +82 -82
  550. package/src/widgets/nav/Menu.tsx +497 -497
  551. package/src/widgets/nav/Menu.variables.scss +13 -13
  552. package/src/widgets/nav/MenuItem.tsx +525 -525
  553. package/src/widgets/nav/MenuSpacer.ts +18 -18
  554. package/src/widgets/nav/RedirectRoute.ts +49 -49
  555. package/src/widgets/nav/Route.spec.tsx +24 -24
  556. package/src/widgets/nav/Route.ts +142 -142
  557. package/src/widgets/nav/Scroller.scss +157 -157
  558. package/src/widgets/nav/Scroller.tsx +252 -252
  559. package/src/widgets/nav/Submenu.ts +6 -6
  560. package/src/widgets/nav/Tab.maps.scss +78 -78
  561. package/src/widgets/nav/Tab.scss +88 -88
  562. package/src/widgets/nav/Tab.variables.scss +15 -15
  563. package/src/widgets/nav/cover.scss +24 -24
  564. package/src/widgets/nav/index.scss +6 -6
  565. package/src/widgets/nav/index.ts +10 -10
  566. package/src/widgets/nav/maps.scss +32 -32
  567. package/src/widgets/nav/variables.scss +19 -19
  568. package/src/widgets/overlay/ContextMenu.ts +46 -45
  569. package/src/widgets/overlay/Dropdown.scss +218 -217
  570. package/src/widgets/overlay/Dropdown.tsx +980 -937
  571. package/src/widgets/overlay/FlyweightTooltipTracker.ts +91 -91
  572. package/src/widgets/overlay/MsgBox.tsx +155 -155
  573. package/src/widgets/overlay/Overlay.scss +88 -88
  574. package/src/widgets/overlay/Overlay.tsx +1 -0
  575. package/src/widgets/overlay/Toast.scss +172 -172
  576. package/src/widgets/overlay/Toast.ts +121 -121
  577. package/src/widgets/overlay/Tooltip.scss +108 -108
  578. package/src/widgets/overlay/Tooltip.tsx +460 -460
  579. package/src/widgets/overlay/Window.maps.scss +51 -51
  580. package/src/widgets/overlay/Window.scss +129 -129
  581. package/src/widgets/overlay/Window.tsx +320 -320
  582. package/src/widgets/overlay/Window.variables.scss +21 -21
  583. package/src/widgets/overlay/alerts.ts +46 -46
  584. package/src/widgets/overlay/captureMouse.scss +13 -13
  585. package/src/widgets/overlay/captureMouse.ts +195 -195
  586. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
  587. package/src/widgets/overlay/index.d.ts +11 -11
  588. package/src/widgets/overlay/index.scss +6 -6
  589. package/src/widgets/overlay/index.ts +11 -11
  590. package/src/widgets/overlay/maps.scss +44 -44
  591. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  592. package/src/widgets/overlay/variables.scss +53 -53
  593. package/tsconfig.compile.json +4 -4
  594. package/tsconfig.json +35 -35
  595. package/tsconfig.mocha.json +14 -14
  596. package/build/widgets/form/Test.d.ts +0 -4
  597. package/build/widgets/form/Test.d.ts.map +0 -1
  598. package/build/widgets/form/Test.js +0 -5
package/dist/util.js CHANGED
@@ -484,7 +484,7 @@ function skipQuotedString(bodyAndNext, openingQuote, i) {
484
484
  */
485
485
  function innerTextTrim(str) {
486
486
  str = str.replace(/\t/g, "");
487
- str = str.replace(/(\s*[\r\n]\s*)/g, " ");
487
+ str = str.replace(/(\s*[\r\n]\s*)/g, "");
488
488
  return str;
489
489
  }
490
490
 
package/dist/widgets.css CHANGED
@@ -4319,6 +4319,7 @@ th.cxe-calendar-display {
4319
4319
  display: block;
4320
4320
  left: -10000px;
4321
4321
  top: -10000px;
4322
+ --cx-scss-dropdown-arrow-offset: var(--cx-js-dropdown-arrow-offset, 16px);
4322
4323
  color: #373a3c;
4323
4324
  background-color: white;
4324
4325
  border-radius: 0;
@@ -4406,18 +4407,18 @@ th.cxe-calendar-display {
4406
4407
 
4407
4408
  .cxs-place-right-down > .cxe-dropdown-arrow-fill,
4408
4409
  .cxs-place-left-down > .cxe-dropdown-arrow-fill {
4409
- top: 16px;
4410
+ top: var(--cx-scss-dropdown-arrow-offset);
4410
4411
  }
4411
4412
 
4412
4413
  .cxs-place-right-down > .cxe-dropdown-arrow-border,
4413
4414
  .cxs-place-left-down > .cxe-dropdown-arrow-border {
4414
- top: 16px;
4415
+ top: var(--cx-scss-dropdown-arrow-offset);
4415
4416
  }
4416
4417
 
4417
4418
  .cxs-place-right-up > .cxe-dropdown-arrow-fill, .cxs-place-right-up > .cxe-dropdown-arrow-border,
4418
4419
  .cxs-place-left-up > .cxe-dropdown-arrow-fill,
4419
4420
  .cxs-place-left-up > .cxe-dropdown-arrow-border {
4420
- top: calc(100% + -16px);
4421
+ top: calc(100% - var(--cx-scss-dropdown-arrow-offset));
4421
4422
  }
4422
4423
 
4423
4424
  .cxs-place-up > .cxe-dropdown-arrow-fill,
@@ -4459,17 +4460,17 @@ th.cxe-calendar-display {
4459
4460
  .cxs-place-down-right > .cxe-dropdown-arrow-fill, .cxs-place-down-right > .cxe-dropdown-arrow-border,
4460
4461
  .cxs-place-up-right > .cxe-dropdown-arrow-fill,
4461
4462
  .cxs-place-up-right > .cxe-dropdown-arrow-border {
4462
- left: 16px;
4463
+ left: var(--cx-scss-dropdown-arrow-offset);
4463
4464
  }
4464
4465
 
4465
4466
  .cxs-place-down-left > .cxe-dropdown-arrow-fill,
4466
4467
  .cxs-place-up-left > .cxe-dropdown-arrow-fill {
4467
- left: calc(100% + -16px);
4468
+ left: calc(100% - var(--cx-scss-dropdown-arrow-offset));
4468
4469
  }
4469
4470
 
4470
4471
  .cxs-place-down-left > .cxe-dropdown-arrow-border,
4471
4472
  .cxs-place-up-left > .cxe-dropdown-arrow-border {
4472
- left: calc(100% + -16px);
4473
+ left: calc(100% - var(--cx-scss-dropdown-arrow-offset));
4473
4474
  }
4474
4475
 
4475
4476
  .cxb-window {
@@ -4732,18 +4733,18 @@ th.cxe-calendar-display {
4732
4733
 
4733
4734
  .cxs-place-right-down > .cxe-tooltip-arrow-fill,
4734
4735
  .cxs-place-left-down > .cxe-tooltip-arrow-fill {
4735
- top: 16px;
4736
+ top: var(--cx-scss-dropdown-arrow-offset);
4736
4737
  }
4737
4738
 
4738
4739
  .cxs-place-right-down > .cxe-tooltip-arrow-border,
4739
4740
  .cxs-place-left-down > .cxe-tooltip-arrow-border {
4740
- top: 16px;
4741
+ top: var(--cx-scss-dropdown-arrow-offset);
4741
4742
  }
4742
4743
 
4743
4744
  .cxs-place-right-up > .cxe-tooltip-arrow-fill, .cxs-place-right-up > .cxe-tooltip-arrow-border,
4744
4745
  .cxs-place-left-up > .cxe-tooltip-arrow-fill,
4745
4746
  .cxs-place-left-up > .cxe-tooltip-arrow-border {
4746
- top: calc(100% + -16px);
4747
+ top: calc(100% - var(--cx-scss-dropdown-arrow-offset));
4747
4748
  }
4748
4749
 
4749
4750
  .cxs-place-up > .cxe-tooltip-arrow-fill,
@@ -4785,17 +4786,17 @@ th.cxe-calendar-display {
4785
4786
  .cxs-place-down-right > .cxe-tooltip-arrow-fill, .cxs-place-down-right > .cxe-tooltip-arrow-border,
4786
4787
  .cxs-place-up-right > .cxe-tooltip-arrow-fill,
4787
4788
  .cxs-place-up-right > .cxe-tooltip-arrow-border {
4788
- left: 16px;
4789
+ left: var(--cx-scss-dropdown-arrow-offset);
4789
4790
  }
4790
4791
 
4791
4792
  .cxs-place-down-left > .cxe-tooltip-arrow-fill,
4792
4793
  .cxs-place-up-left > .cxe-tooltip-arrow-fill {
4793
- left: calc(100% + -16px);
4794
+ left: calc(100% - var(--cx-scss-dropdown-arrow-offset));
4794
4795
  }
4795
4796
 
4796
4797
  .cxs-place-down-left > .cxe-tooltip-arrow-border,
4797
4798
  .cxs-place-up-left > .cxe-tooltip-arrow-border {
4798
- left: calc(100% + -16px);
4799
+ left: calc(100% - var(--cx-scss-dropdown-arrow-offset));
4799
4800
  }
4800
4801
 
4801
4802
  @keyframes cx-toast-enter-animation {
package/dist/widgets.js CHANGED
@@ -2765,13 +2765,17 @@ class OverlayBase extends ContainerBase {
2765
2765
  },
2766
2766
  key,
2767
2767
  );
2768
- return jsx(OverlayComponent, {
2769
- beaconEl: null,
2770
- instance: instance,
2771
- subscribeToBeforeDismiss: context.options.subscribeToBeforeDismiss,
2772
- parentEl: context.options.parentEl,
2773
- children: this.renderContents(context, instance),
2774
- });
2768
+ return jsx(
2769
+ OverlayComponent,
2770
+ {
2771
+ beaconEl: null,
2772
+ instance: instance,
2773
+ subscribeToBeforeDismiss: context.options.subscribeToBeforeDismiss,
2774
+ parentEl: context.options.parentEl,
2775
+ children: this.renderContents(context, instance),
2776
+ },
2777
+ key,
2778
+ );
2775
2779
  }
2776
2780
  renderContents(context, instance) {
2777
2781
  return this.renderChildren(context, instance);
@@ -3377,6 +3381,15 @@ class DropdownBase extends OverlayBase {
3377
3381
  instance.parentPositionChangeEvent = context.parentPositionChangeEvent;
3378
3382
  super.initInstance(context, instance);
3379
3383
  }
3384
+ prepareData(context, instance) {
3385
+ super.prepareData(context, instance);
3386
+ if (this.arrowOffset != null) {
3387
+ instance.data.style = {
3388
+ ...instance.data.style,
3389
+ "--cx-js-dropdown-arrow-offset": `${this.arrowOffset}px`,
3390
+ };
3391
+ }
3392
+ }
3380
3393
  explore(context, instance) {
3381
3394
  context.push("lastDropdown", instance);
3382
3395
  super.explore(context, instance);
@@ -3464,7 +3477,8 @@ class DropdownBase extends OverlayBase {
3464
3477
  if (this.matchMaxWidth) style.maxWidth = `${parentBounds.right - parentBounds.left}px`;
3465
3478
  var contentSize = this.measureNaturalDropdownSize(instance, component);
3466
3479
  var placement = this.findOptimalPlacement(contentSize, parentBounds, data.placement, component.lastPlacement);
3467
- this.applyPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, false);
3480
+ var arrowAdjust = this.getArrowAdjust(component);
3481
+ this.applyPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, false, arrowAdjust);
3468
3482
  component.setCustomStyle(style);
3469
3483
  this.setDirectionClass(component, placement);
3470
3484
  if (this.constrain) {
@@ -3472,7 +3486,7 @@ class DropdownBase extends OverlayBase {
3472
3486
  let newContentSize = this.measureNaturalDropdownSize(instance, component);
3473
3487
  if (newContentSize.width != contentSize.width || newContentSize.height != contentSize.height) {
3474
3488
  let newStyle = {};
3475
- this.applyPositioningPlacementStyles(newStyle, placement, newContentSize, parentBounds, el, true);
3489
+ this.applyPositioningPlacementStyles(newStyle, placement, newContentSize, parentBounds, el, true, arrowAdjust);
3476
3490
  component.setCustomStyle(newStyle);
3477
3491
  }
3478
3492
  }
@@ -3491,7 +3505,17 @@ class DropdownBase extends OverlayBase {
3491
3505
  );
3492
3506
  instance.positionChangeSubscribers.notify();
3493
3507
  }
3494
- applyFixedPositioningPlacementStyles(style, placement, contentSize, rel, el, noAuto) {
3508
+ getArrowAdjust(component) {
3509
+ if (!this.alignArrow || !this.arrow) return 0;
3510
+ if (component.cachedArrowOffset != null) return component.cachedArrowOffset;
3511
+ if (!component.el) return 0;
3512
+ let raw = getComputedStyle(component.el).getPropertyValue("--cx-scss-dropdown-arrow-offset").trim();
3513
+ let parsed = parseFloat(raw);
3514
+ if (!isFinite(parsed)) return 0;
3515
+ component.cachedArrowOffset = parsed;
3516
+ return parsed;
3517
+ }
3518
+ applyFixedPositioningPlacementStyles(style, placement, contentSize, rel, el, noAuto, arrowAdjust = 0) {
3495
3519
  let viewport = getViewportRect(this.screenPadding);
3496
3520
  style.position = "fixed";
3497
3521
  if (placement.startsWith("down")) {
@@ -3515,10 +3539,10 @@ class DropdownBase extends OverlayBase {
3515
3539
  break;
3516
3540
  case "down-right":
3517
3541
  style.right = "auto";
3518
- style.left = `${rel.left}px`;
3542
+ style.left = `${rel.left - arrowAdjust}px`;
3519
3543
  break;
3520
3544
  case "down-left":
3521
- style.right = `${document.documentElement.offsetWidth - rel.right}px`;
3545
+ style.right = `${document.documentElement.offsetWidth - rel.right - arrowAdjust}px`;
3522
3546
  style.left = "auto";
3523
3547
  break;
3524
3548
  case "up":
@@ -3528,10 +3552,10 @@ class DropdownBase extends OverlayBase {
3528
3552
  break;
3529
3553
  case "up-right":
3530
3554
  style.right = "auto";
3531
- style.left = `${rel.left}px`;
3555
+ style.left = `${rel.left - arrowAdjust}px`;
3532
3556
  break;
3533
3557
  case "up-left":
3534
- style.right = `${document.documentElement.offsetWidth - rel.right}px`;
3558
+ style.right = `${document.documentElement.offsetWidth - rel.right - arrowAdjust}px`;
3535
3559
  style.left = "auto";
3536
3560
  break;
3537
3561
  case "right":
@@ -3542,7 +3566,7 @@ class DropdownBase extends OverlayBase {
3542
3566
  style.left = `${rel.right + this.offset}px`;
3543
3567
  break;
3544
3568
  case "right-down":
3545
- style.top = `${rel.top}px`;
3569
+ style.top = `${rel.top - arrowAdjust}px`;
3546
3570
  style.right = "auto";
3547
3571
  style.bottom = "auto";
3548
3572
  style.left = `${rel.right + this.offset}px`;
@@ -3550,7 +3574,7 @@ class DropdownBase extends OverlayBase {
3550
3574
  case "right-up":
3551
3575
  style.top = "auto";
3552
3576
  style.right = "auto";
3553
- style.bottom = `${document.documentElement.offsetHeight - rel.bottom}px`;
3577
+ style.bottom = `${document.documentElement.offsetHeight - rel.bottom - arrowAdjust}px`;
3554
3578
  style.left = `${rel.right + this.offset}px`;
3555
3579
  break;
3556
3580
  case "left":
@@ -3561,7 +3585,7 @@ class DropdownBase extends OverlayBase {
3561
3585
  style.left = "auto";
3562
3586
  break;
3563
3587
  case "left-down":
3564
- style.top = `${rel.top}px`;
3588
+ style.top = `${rel.top - arrowAdjust}px`;
3565
3589
  style.right = `${document.documentElement.offsetWidth - rel.left + this.offset}px`;
3566
3590
  style.bottom = "auto";
3567
3591
  style.left = "auto";
@@ -3569,7 +3593,7 @@ class DropdownBase extends OverlayBase {
3569
3593
  case "left-up":
3570
3594
  style.top = "auto";
3571
3595
  style.right = `${document.documentElement.offsetWidth - rel.left + this.offset}px`;
3572
- style.bottom = `${document.documentElement.offsetHeight - rel.bottom}px`;
3596
+ style.bottom = `${document.documentElement.offsetHeight - rel.bottom - arrowAdjust}px`;
3573
3597
  style.left = "auto";
3574
3598
  break;
3575
3599
  case "screen-center":
@@ -3582,7 +3606,7 @@ class DropdownBase extends OverlayBase {
3582
3606
  break;
3583
3607
  }
3584
3608
  }
3585
- applyAbsolutePositioningPlacementStyles(style, placement, contentSize, rel, el, noAuto) {
3609
+ applyAbsolutePositioningPlacementStyles(style, placement, contentSize, rel, el, noAuto, arrowAdjust = 0) {
3586
3610
  var viewport = getViewportRect(this.screenPadding);
3587
3611
  style.position = "absolute";
3588
3612
  if (placement.startsWith("down")) {
@@ -3608,10 +3632,10 @@ class DropdownBase extends OverlayBase {
3608
3632
  break;
3609
3633
  case "down-right":
3610
3634
  style.right = "auto";
3611
- style.left = `0`;
3635
+ style.left = `${-arrowAdjust}px`;
3612
3636
  break;
3613
3637
  case "down-left":
3614
- style.right = `0`;
3638
+ style.right = `${-arrowAdjust}px`;
3615
3639
  style.left = "auto";
3616
3640
  break;
3617
3641
  case "up":
@@ -3621,10 +3645,10 @@ class DropdownBase extends OverlayBase {
3621
3645
  break;
3622
3646
  case "up-right":
3623
3647
  style.right = "auto";
3624
- style.left = `0`;
3648
+ style.left = `${-arrowAdjust}px`;
3625
3649
  break;
3626
3650
  case "up-left":
3627
- style.right = `0`;
3651
+ style.right = `${-arrowAdjust}px`;
3628
3652
  style.left = "auto";
3629
3653
  break;
3630
3654
  case "right":
@@ -3635,7 +3659,7 @@ class DropdownBase extends OverlayBase {
3635
3659
  style.left = `${rel.right - rel.left + this.offset}px`;
3636
3660
  break;
3637
3661
  case "right-down":
3638
- style.top = `0`;
3662
+ style.top = `${-arrowAdjust}px`;
3639
3663
  style.right = "auto";
3640
3664
  style.bottom = "auto";
3641
3665
  style.left = `${rel.right - rel.left + this.offset}px`;
@@ -3643,7 +3667,7 @@ class DropdownBase extends OverlayBase {
3643
3667
  case "right-up":
3644
3668
  style.top = "auto";
3645
3669
  style.right = "auto";
3646
- style.bottom = `0`;
3670
+ style.bottom = `${-arrowAdjust}px`;
3647
3671
  style.left = `${rel.right - rel.left + this.offset}px`;
3648
3672
  break;
3649
3673
  case "left":
@@ -3654,7 +3678,7 @@ class DropdownBase extends OverlayBase {
3654
3678
  style.left = "auto";
3655
3679
  break;
3656
3680
  case "left-down":
3657
- style.top = `0`;
3681
+ style.top = `${-arrowAdjust}px`;
3658
3682
  style.right = `${rel.right - rel.left + this.offset}px`;
3659
3683
  style.bottom = "auto";
3660
3684
  style.left = "auto";
@@ -3662,23 +3686,48 @@ class DropdownBase extends OverlayBase {
3662
3686
  case "left-up":
3663
3687
  style.top = "auto";
3664
3688
  style.right = `${rel.right - rel.left + this.offset}px`;
3665
- style.bottom = `0`;
3689
+ style.bottom = `${-arrowAdjust}px`;
3666
3690
  style.left = "auto";
3667
3691
  break;
3668
3692
  }
3669
3693
  }
3670
- applyPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto) {
3694
+ applyPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto, arrowAdjust = 0) {
3671
3695
  switch (this.positioning) {
3672
3696
  case "absolute":
3673
- this.applyAbsolutePositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
3697
+ this.applyAbsolutePositioningPlacementStyles(
3698
+ style,
3699
+ placement,
3700
+ contentSize,
3701
+ parentBounds,
3702
+ el,
3703
+ noAuto,
3704
+ arrowAdjust,
3705
+ );
3674
3706
  break;
3675
3707
  case "auto":
3676
3708
  if (isTouchDevice())
3677
- this.applyAbsolutePositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
3678
- else this.applyFixedPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
3709
+ this.applyAbsolutePositioningPlacementStyles(
3710
+ style,
3711
+ placement,
3712
+ contentSize,
3713
+ parentBounds,
3714
+ el,
3715
+ noAuto,
3716
+ arrowAdjust,
3717
+ );
3718
+ else
3719
+ this.applyFixedPositioningPlacementStyles(
3720
+ style,
3721
+ placement,
3722
+ contentSize,
3723
+ parentBounds,
3724
+ el,
3725
+ noAuto,
3726
+ arrowAdjust,
3727
+ );
3679
3728
  break;
3680
3729
  default:
3681
- this.applyFixedPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto);
3730
+ this.applyFixedPositioningPlacementStyles(style, placement, contentSize, parentBounds, el, noAuto, arrowAdjust);
3682
3731
  break;
3683
3732
  }
3684
3733
  }
@@ -3861,6 +3910,7 @@ DropdownBase.prototype.constrain = false;
3861
3910
  DropdownBase.prototype.positioning = "fixed";
3862
3911
  DropdownBase.prototype.touchFriendly = false;
3863
3912
  DropdownBase.prototype.arrow = false;
3913
+ DropdownBase.prototype.alignArrow = false;
3864
3914
  DropdownBase.prototype.pad = false;
3865
3915
  DropdownBase.prototype.elementExplode = 0;
3866
3916
  DropdownBase.prototype.closeOnScrollDistance = 50;
@@ -4590,6 +4640,7 @@ ContextMenu.prototype.offset = 0;
4590
4640
  ContextMenu.prototype.autoFocus = true;
4591
4641
  ContextMenu.prototype.autoFocusFirstChild = false;
4592
4642
  ContextMenu.prototype.focusable = true;
4643
+ ContextMenu.prototype.alignArrow = true;
4593
4644
  Localization.registerPrototype("cx/widgets/ContextMenu", ContextMenu);
4594
4645
  const openContextMenu = (e, content, storeOrInstance, options) => {
4595
4646
  e.preventDefault();
@@ -4788,38 +4839,6 @@ function hasQueryTokens(tokens) {
4788
4839
  }
4789
4840
  return false;
4790
4841
  }
4791
- /**
4792
- * Extract query parameter definitions from tokens
4793
- */
4794
- function extractQueryParams(tokens, optional = false) {
4795
- const params = [];
4796
- for (let i = 0; i < tokens.length; i++) {
4797
- const token = tokens[i];
4798
- if (token.type === "param") {
4799
- // Look back for the key name (e.g., 'page=' before ':page')
4800
- let key = token.value; // Default to param name
4801
- if (i > 0) {
4802
- const prevToken = tokens[i - 1];
4803
- if (prevToken.type === "static" && prevToken.value.endsWith("=")) {
4804
- // Extract key from "key="
4805
- const match = prevToken.value.match(/([^=&?]+)=$/);
4806
- if (match) {
4807
- key = match[1];
4808
- }
4809
- }
4810
- }
4811
- params.push({
4812
- name: token.value,
4813
- key,
4814
- optional,
4815
- });
4816
- } else if (token.type === "optional" && token.children) {
4817
- // Recursively extract from optional segments
4818
- params.push(...extractQueryParams(token.children, true));
4819
- }
4820
- }
4821
- return params;
4822
- }
4823
4842
  /**
4824
4843
  * Split tokens into path tokens and query tokens
4825
4844
  */
@@ -4858,7 +4877,7 @@ function escapeRegex(str) {
4858
4877
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4859
4878
  }
4860
4879
  /**
4861
- * Build a regex pattern from path tokens only (no query handling)
4880
+ * Build a regex pattern from path tokens
4862
4881
  */
4863
4882
  function buildPathRegex(tokens) {
4864
4883
  let pattern = "";
@@ -4869,17 +4888,14 @@ function buildPathRegex(tokens) {
4869
4888
  pattern += escapeRegex(token.value);
4870
4889
  break;
4871
4890
  case "param":
4872
- // Named parameter matches one path segment (no slashes)
4873
4891
  pattern += "([^/]+)";
4874
4892
  paramNames.push(token.value);
4875
4893
  break;
4876
4894
  case "splat":
4877
- // Splat matches any characters including slashes (non-greedy within constraints)
4878
4895
  pattern += "(.+?)";
4879
4896
  paramNames.push(token.value);
4880
4897
  break;
4881
4898
  case "optional":
4882
- // Optional segment - recursively build and wrap in optional group
4883
4899
  if (token.children) {
4884
4900
  const { pattern: childPattern, paramNames: childNames } = buildPathRegex(token.children);
4885
4901
  pattern += `(?:${childPattern})?`;
@@ -4893,13 +4909,104 @@ function buildPathRegex(tokens) {
4893
4909
  paramNames,
4894
4910
  };
4895
4911
  }
4912
+ /**
4913
+ * Build a regex pattern from query tokens.
4914
+ * Handles both key-value patterns (a=:a&b=:b) and structural patterns (auth(*splat)).
4915
+ * Strips leading ? and & query separators from optional children.
4916
+ */
4917
+ function buildQueryRegex(tokens) {
4918
+ let pattern = "";
4919
+ const paramNames = [];
4920
+ for (const token of tokens) {
4921
+ switch (token.type) {
4922
+ case "static":
4923
+ pattern += escapeRegex(token.value);
4924
+ break;
4925
+ case "param":
4926
+ pattern += "([^&]+)";
4927
+ paramNames.push(token.value);
4928
+ break;
4929
+ case "splat":
4930
+ pattern += "(.+?)";
4931
+ paramNames.push(token.value);
4932
+ break;
4933
+ case "optional":
4934
+ if (token.children) {
4935
+ // Strip leading query separators (? and &) from optional children
4936
+ let children = token.children;
4937
+ while (children.length > 0 && children[0].type === "querySeparator") {
4938
+ children = children.slice(1);
4939
+ }
4940
+ const { pattern: childPattern, paramNames: childNames } = buildQueryRegex(children);
4941
+ pattern += `(?:${childPattern})?`;
4942
+ paramNames.push(...childNames);
4943
+ }
4944
+ break;
4945
+ case "querySeparator":
4946
+ if (token.value === "&") {
4947
+ pattern += "&";
4948
+ }
4949
+ break;
4950
+ }
4951
+ }
4952
+ return {
4953
+ pattern,
4954
+ paramNames,
4955
+ };
4956
+ }
4957
+ function extractQueryDefs(tokens, optional = false) {
4958
+ const defs = [];
4959
+ for (let i = 0; i < tokens.length; i++) {
4960
+ const token = tokens[i];
4961
+ if (token.type === "param") {
4962
+ let key = token.value;
4963
+ if (i > 0) {
4964
+ const prevToken = tokens[i - 1];
4965
+ if (prevToken.type === "static" && prevToken.value.endsWith("=")) {
4966
+ const match = prevToken.value.match(/([^=&?]+)=$/);
4967
+ if (match) key = match[1];
4968
+ }
4969
+ }
4970
+ defs.push({
4971
+ key,
4972
+ paramName: token.value,
4973
+ optional,
4974
+ });
4975
+ } else if (token.type === "static") {
4976
+ // Extract fixed key=value pairs (e.g., 'type=bar')
4977
+ for (const part of token.value.split("&")) {
4978
+ const clean = part.replace(/^[?&]/, "");
4979
+ const eqIdx = clean.indexOf("=");
4980
+ if (eqIdx > 0 && clean.length > eqIdx + 1) {
4981
+ defs.push({
4982
+ key: clean.slice(0, eqIdx),
4983
+ fixedValue: clean.slice(eqIdx + 1),
4984
+ optional,
4985
+ });
4986
+ }
4987
+ }
4988
+ } else if (token.type === "optional" && token.children) {
4989
+ defs.push(...extractQueryDefs(token.children, true));
4990
+ }
4991
+ }
4992
+ return defs;
4993
+ }
4994
+ /**
4995
+ * Check if tokens contain splat parameters (recursively)
4996
+ */
4997
+ function hasSplats(tokens) {
4998
+ for (const token of tokens) {
4999
+ if (token.type === "splat") return true;
5000
+ if (token.type === "optional" && token.children && hasSplats(token.children)) return true;
5001
+ }
5002
+ return false;
5003
+ }
4896
5004
  /**
4897
5005
  * Parse a query string into key-value pairs
4898
5006
  */
4899
5007
  function parseQueryString(queryString) {
4900
5008
  const params = new Map();
4901
5009
  if (!queryString) return params;
4902
- // Remove leading ? if present
4903
5010
  const qs = queryString.startsWith("?") ? queryString.slice(1) : queryString;
4904
5011
  if (!qs) return params;
4905
5012
  for (const pair of qs.split("&")) {
@@ -4969,8 +5076,10 @@ class RouteParser {
4969
5076
  tokens;
4970
5077
  pathRegex;
4971
5078
  pathParamNames;
4972
- queryParamDefs;
4973
- hasQueryInSpec;
5079
+ // Query matching: use regex for structural patterns (splats), map-based for key-value patterns
5080
+ queryRegex;
5081
+ queryRegexParamNames;
5082
+ queryDefs;
4974
5083
  constructor(spec) {
4975
5084
  if (!spec) {
4976
5085
  throw new Error("spec is required");
@@ -4983,9 +5092,20 @@ class RouteParser {
4983
5092
  const { pattern, paramNames } = buildPathRegex(pathTokens);
4984
5093
  this.pathRegex = new RegExp(`^${pattern}(?:\\?.*)?$`);
4985
5094
  this.pathParamNames = paramNames;
4986
- // Extract query parameter definitions
4987
- this.queryParamDefs = extractQueryParams(queryTokens);
4988
- this.hasQueryInSpec = queryTokens.length > 0;
5095
+ // Query matching setup
5096
+ if (queryTokens.length > 0 && hasSplats(queryTokens)) {
5097
+ // Structural query: use regex
5098
+ const qTokens = queryTokens[0]?.type === "querySeparator" ? queryTokens.slice(1) : queryTokens;
5099
+ const { pattern: qPattern, paramNames: qParamNames } = buildQueryRegex(qTokens);
5100
+ this.queryRegex = new RegExp(`^${qPattern}$`);
5101
+ this.queryRegexParamNames = qParamNames;
5102
+ this.queryDefs = [];
5103
+ } else {
5104
+ // Key-value query: use map-based matching (order-independent)
5105
+ this.queryRegex = null;
5106
+ this.queryRegexParamNames = [];
5107
+ this.queryDefs = extractQueryDefs(queryTokens);
5108
+ }
4989
5109
  }
4990
5110
  /**
4991
5111
  * Match a path against this route
@@ -4996,7 +5116,6 @@ class RouteParser {
4996
5116
  const queryIndex = path.indexOf("?");
4997
5117
  const pathname = queryIndex >= 0 ? path.slice(0, queryIndex) : path;
4998
5118
  const queryString = queryIndex >= 0 ? path.slice(queryIndex + 1) : "";
4999
- // Match only the pathname part (not query string) to avoid capturing ? in params
5000
5119
  const match = this.pathRegex.exec(pathname);
5001
5120
  if (!match) {
5002
5121
  return false;
@@ -5006,18 +5125,29 @@ class RouteParser {
5006
5125
  for (let i = 0; i < this.pathParamNames.length; i++) {
5007
5126
  params[this.pathParamNames[i]] = match[i + 1];
5008
5127
  }
5009
- // If route has query params in spec, match them from URL's query string
5010
- if (this.hasQueryInSpec) {
5128
+ // Structural query matching (splats)
5129
+ if (this.queryRegex) {
5130
+ const qMatch = this.queryRegex.exec(queryString);
5131
+ if (!qMatch) return false;
5132
+ for (let i = 0; i < this.queryRegexParamNames.length; i++) {
5133
+ params[this.queryRegexParamNames[i]] = qMatch[i + 1];
5134
+ }
5135
+ }
5136
+ // Key-value query matching (order-independent)
5137
+ if (this.queryDefs.length > 0) {
5011
5138
  const urlQueryParams = parseQueryString(queryString);
5012
- for (const paramDef of this.queryParamDefs) {
5013
- const value = urlQueryParams.get(paramDef.key);
5014
- if (value !== undefined) {
5015
- params[paramDef.name] = value;
5016
- } else if (paramDef.optional) {
5017
- params[paramDef.name] = undefined;
5139
+ for (const def of this.queryDefs) {
5140
+ if (def.fixedValue !== undefined) {
5141
+ if (urlQueryParams.get(def.key) !== def.fixedValue && !def.optional) return false;
5018
5142
  } else {
5019
- // Required query param not found
5020
- return false;
5143
+ const value = urlQueryParams.get(def.key);
5144
+ if (value !== undefined) {
5145
+ params[def.paramName] = value;
5146
+ } else if (def.optional) {
5147
+ params[def.paramName] = undefined;
5148
+ } else {
5149
+ return false;
5150
+ }
5021
5151
  }
5022
5152
  }
5023
5153
  }