cx 26.1.3 → 26.1.5

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 (568) 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/ui/exprHelpers.d.ts +12 -0
  6. package/build/ui/exprHelpers.js +17 -0
  7. package/build/ui/tpl.d.ts +5 -3
  8. package/build/ui/tpl.js +11 -4
  9. package/build.js +133 -133
  10. package/dist/manifest.js +782 -779
  11. package/dist/ui.js +26 -4
  12. package/package.json +100 -100
  13. package/src/charts/Bar.scss +28 -28
  14. package/src/charts/Bar.ts +114 -114
  15. package/src/charts/BarGraph.scss +28 -28
  16. package/src/charts/BarGraph.tsx +145 -145
  17. package/src/charts/BubbleGraph.scss +31 -31
  18. package/src/charts/BubbleGraph.tsx +165 -165
  19. package/src/charts/Chart.ts +108 -108
  20. package/src/charts/ColorMap.ts +150 -150
  21. package/src/charts/Column.scss +28 -28
  22. package/src/charts/Column.ts +124 -124
  23. package/src/charts/ColumnBarBase.tsx +284 -284
  24. package/src/charts/ColumnBarGraphBase.tsx +229 -229
  25. package/src/charts/ColumnGraph.scss +29 -29
  26. package/src/charts/ColumnGraph.tsx +153 -153
  27. package/src/charts/Grid.ts +5 -5
  28. package/src/charts/Gridlines.scss +24 -24
  29. package/src/charts/Gridlines.tsx +88 -88
  30. package/src/charts/Legend.scss +50 -50
  31. package/src/charts/Legend.tsx +270 -270
  32. package/src/charts/LegendEntry.scss +29 -29
  33. package/src/charts/LegendEntry.tsx +197 -197
  34. package/src/charts/LineGraph.scss +24 -24
  35. package/src/charts/LineGraph.tsx +455 -455
  36. package/src/charts/Marker.scss +43 -43
  37. package/src/charts/Marker.tsx +483 -483
  38. package/src/charts/MarkerLine.scss +19 -19
  39. package/src/charts/MarkerLine.tsx +214 -214
  40. package/src/charts/MouseTracker.tsx +112 -112
  41. package/src/charts/Pie.ts +8 -8
  42. package/src/charts/PieChart.scss +28 -28
  43. package/src/charts/PieChart.tsx +717 -717
  44. package/src/charts/PieLabel.tsx +106 -106
  45. package/src/charts/PieLabelsContainer.ts +68 -68
  46. package/src/charts/Range.scss +19 -19
  47. package/src/charts/Range.tsx +318 -318
  48. package/src/charts/RangeMarker.scss +17 -17
  49. package/src/charts/RangeMarker.tsx +233 -233
  50. package/src/charts/ScatterGraph.scss +23 -23
  51. package/src/charts/ScatterGraph.tsx +245 -245
  52. package/src/charts/Swimlane.scss +16 -16
  53. package/src/charts/Swimlane.tsx +195 -195
  54. package/src/charts/Swimlanes.scss +16 -16
  55. package/src/charts/Swimlanes.tsx +179 -179
  56. package/src/charts/axis/Axis.scss +22 -22
  57. package/src/charts/axis/Axis.tsx +444 -444
  58. package/src/charts/axis/CategoryAxis.scss +34 -34
  59. package/src/charts/axis/CategoryAxis.tsx +313 -313
  60. package/src/charts/axis/NumericAxis.scss +34 -34
  61. package/src/charts/axis/NumericAxis.tsx +437 -437
  62. package/src/charts/axis/Stack.ts +61 -61
  63. package/src/charts/axis/TimeAxis.scss +33 -33
  64. package/src/charts/axis/TimeAxis.tsx +718 -718
  65. package/src/charts/axis/index.scss +5 -5
  66. package/src/charts/axis/index.ts +3 -3
  67. package/src/charts/axis/variables.scss +2 -2
  68. package/src/charts/helpers/MinMaxFinder.ts +66 -66
  69. package/src/charts/helpers/PointReducer.ts +135 -135
  70. package/src/charts/helpers/SnapPointFinder.ts +136 -136
  71. package/src/charts/helpers/ValueAtFinder.ts +72 -72
  72. package/src/charts/helpers/index.ts +4 -4
  73. package/src/charts/index.scss +22 -22
  74. package/src/charts/index.ts +34 -34
  75. package/src/charts/palette.scss +97 -97
  76. package/src/charts/shapes.tsx +86 -86
  77. package/src/charts/variables.scss +22 -22
  78. package/src/core.d.ts +182 -182
  79. package/src/data/AggregateFunction.ts +171 -171
  80. package/src/data/ArrayElementView.spec.ts +88 -88
  81. package/src/data/ArrayElementView.ts +91 -91
  82. package/src/data/ArrayRef.ts +34 -34
  83. package/src/data/AugmentedViewBase.ts +88 -88
  84. package/src/data/Binding.spec.ts +69 -69
  85. package/src/data/Binding.ts +104 -104
  86. package/src/data/ExposedRecordView.ts +95 -95
  87. package/src/data/ExposedValueView.ts +89 -89
  88. package/src/data/Expression.spec.ts +229 -229
  89. package/src/data/Expression.ts +233 -233
  90. package/src/data/Grouper.spec.ts +57 -57
  91. package/src/data/Grouper.ts +158 -158
  92. package/src/data/NestedDataView.ts +43 -43
  93. package/src/data/ReadOnlyDataView.ts +39 -39
  94. package/src/data/Ref.spec.ts +79 -79
  95. package/src/data/Ref.ts +104 -104
  96. package/src/data/Selector.ts +10 -10
  97. package/src/data/Store.spec.ts +22 -22
  98. package/src/data/Store.ts +52 -52
  99. package/src/data/StoreProxy.ts +19 -19
  100. package/src/data/StoreRef.spec.ts +24 -24
  101. package/src/data/StoreRef.ts +66 -66
  102. package/src/data/StringTemplate.spec.ts +132 -132
  103. package/src/data/StringTemplate.ts +93 -93
  104. package/src/data/StructuredSelector.spec.ts +113 -113
  105. package/src/data/StructuredSelector.ts +146 -146
  106. package/src/data/SubscribableView.ts +63 -63
  107. package/src/data/View.spec.ts +60 -60
  108. package/src/data/View.ts +289 -289
  109. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  110. package/src/data/ZoomIntoPropertyView.ts +45 -45
  111. package/src/data/comparer.spec.ts +60 -60
  112. package/src/data/comparer.ts +78 -78
  113. package/src/data/computable.spec.ts +87 -87
  114. package/src/data/computable.ts +69 -69
  115. package/src/data/createAccessorModelProxy.spec.tsx +145 -145
  116. package/src/data/createAccessorModelProxy.ts +66 -66
  117. package/src/data/createStructuredSelector.spec.ts +45 -45
  118. package/src/data/createStructuredSelector.ts +62 -62
  119. package/src/data/defaultCompare.ts +14 -14
  120. package/src/data/diff/diffArrays.ts +49 -49
  121. package/src/data/diff/diffs.spec.ts +49 -49
  122. package/src/data/diff/index.ts +1 -1
  123. package/src/data/enableFatArrowExpansion.ts +6 -6
  124. package/src/data/getAccessor.spec.ts +11 -11
  125. package/src/data/getAccessor.ts +74 -74
  126. package/src/data/getSelector.spec.ts +43 -43
  127. package/src/data/getSelector.ts +66 -66
  128. package/src/data/index.ts +30 -30
  129. package/src/data/isSelector.ts +26 -26
  130. package/src/data/ops/append.spec.ts +28 -28
  131. package/src/data/ops/append.ts +5 -5
  132. package/src/data/ops/filter.spec.ts +35 -35
  133. package/src/data/ops/filter.ts +9 -9
  134. package/src/data/ops/findTreeNode.spec.ts +23 -23
  135. package/src/data/ops/findTreeNode.ts +14 -14
  136. package/src/data/ops/findTreePath.ts +23 -23
  137. package/src/data/ops/index.ts +11 -11
  138. package/src/data/ops/insertElement.ts +3 -3
  139. package/src/data/ops/merge.spec.ts +27 -27
  140. package/src/data/ops/merge.ts +13 -13
  141. package/src/data/ops/moveElement.ts +21 -21
  142. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  143. package/src/data/ops/removeTreeNodes.ts +15 -15
  144. package/src/data/ops/updateArray.spec.ts +69 -69
  145. package/src/data/ops/updateArray.ts +31 -31
  146. package/src/data/ops/updateTree.spec.ts +54 -54
  147. package/src/data/ops/updateTree.ts +23 -23
  148. package/src/data/test-types.ts +7 -7
  149. package/src/global.scss +13 -13
  150. package/src/hooks/createLocalStorageRef.ts +21 -21
  151. package/src/hooks/index.ts +8 -8
  152. package/src/hooks/invokeCallback.spec.tsx +59 -59
  153. package/src/hooks/invokeCallback.ts +8 -8
  154. package/src/hooks/resolveCallback.spec.tsx +71 -71
  155. package/src/hooks/resolveCallback.ts +16 -16
  156. package/src/hooks/store.spec.tsx +67 -67
  157. package/src/hooks/store.ts +46 -46
  158. package/src/hooks/useEffect.ts +14 -14
  159. package/src/hooks/useInterval.ts +8 -8
  160. package/src/hooks/useState.ts +20 -20
  161. package/src/hooks/useTrigger.spec.tsx +105 -105
  162. package/src/hooks/useTrigger.ts +26 -26
  163. package/src/index.scss +6 -6
  164. package/src/index.ts +7 -7
  165. package/src/jsx-dev-runtime.ts +4 -4
  166. package/src/jsx-runtime.spec.tsx +431 -431
  167. package/src/jsx-runtime.ts +79 -79
  168. package/src/locale/de-de.ts +76 -76
  169. package/src/locale/en-us.ts +75 -75
  170. package/src/locale/es-es.ts +76 -76
  171. package/src/locale/fr-fr.ts +76 -76
  172. package/src/locale/nl-nl.ts +76 -76
  173. package/src/locale/pt-pt.ts +76 -76
  174. package/src/locale/sr-latn-ba.ts +76 -76
  175. package/src/svg/BoundedObject.ts +101 -101
  176. package/src/svg/ClipRect.tsx +29 -29
  177. package/src/svg/Ellipse.tsx +68 -68
  178. package/src/svg/Line.tsx +58 -58
  179. package/src/svg/NonOverlappingRect.ts +26 -26
  180. package/src/svg/NonOverlappingRectGroup.ts +49 -49
  181. package/src/svg/Rectangle.tsx +90 -90
  182. package/src/svg/Svg.scss +27 -27
  183. package/src/svg/Svg.tsx +241 -241
  184. package/src/svg/Text.tsx +134 -134
  185. package/src/svg/TextualBoundedObject.ts +35 -35
  186. package/src/svg/index.scss +8 -8
  187. package/src/svg/index.ts +17 -17
  188. package/src/svg/util/Rect.ts +105 -105
  189. package/src/ui/CSS.ts +87 -87
  190. package/src/ui/CSSHelper.ts +17 -17
  191. package/src/ui/Container.tsx +216 -216
  192. package/src/ui/ContentResolver.spec.tsx +585 -585
  193. package/src/ui/ContentResolver.ts +132 -132
  194. package/src/ui/Controller.spec.tsx +574 -574
  195. package/src/ui/Controller.ts +202 -202
  196. package/src/ui/Culture.ts +159 -159
  197. package/src/ui/Cx.spec.tsx +210 -210
  198. package/src/ui/Cx.tsx +386 -386
  199. package/src/ui/DataProxy.spec.tsx +337 -337
  200. package/src/ui/DataProxy.ts +55 -55
  201. package/src/ui/DetachedScope.tsx +159 -159
  202. package/src/ui/FocusManager.ts +171 -171
  203. package/src/ui/Format.ts +108 -108
  204. package/src/ui/HoverSync.tsx +189 -189
  205. package/src/ui/Instance.ts +866 -866
  206. package/src/ui/IsolatedScope.spec.tsx +62 -62
  207. package/src/ui/IsolatedScope.ts +50 -50
  208. package/src/ui/Localization.ts +70 -70
  209. package/src/ui/Prop.ts +140 -140
  210. package/src/ui/PureContainer.spec.tsx +232 -232
  211. package/src/ui/PureContainer.tsx +19 -19
  212. package/src/ui/RenderingContext.ts +99 -99
  213. package/src/ui/Repeater.spec.tsx +143 -143
  214. package/src/ui/Repeater.ts +194 -194
  215. package/src/ui/Rescope.spec.tsx +199 -199
  216. package/src/ui/Rescope.ts +49 -49
  217. package/src/ui/ResizeManager.ts +30 -30
  218. package/src/ui/Restate.spec.tsx +422 -422
  219. package/src/ui/Restate.tsx +217 -217
  220. package/src/ui/StaticText.ts +11 -11
  221. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  222. package/src/ui/Text.ts +49 -49
  223. package/src/ui/VDOM.ts +1 -1
  224. package/src/ui/Widget.spec.tsx +53 -53
  225. package/src/ui/Widget.tsx +301 -301
  226. package/src/ui/ZIndexManager.ts +11 -11
  227. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  228. package/src/ui/adapter/ArrayAdapter.ts +229 -229
  229. package/src/ui/adapter/DataAdapter.ts +52 -52
  230. package/src/ui/adapter/GroupAdapter.ts +235 -235
  231. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  232. package/src/ui/adapter/TreeAdapter.ts +185 -185
  233. package/src/ui/adapter/index.ts +4 -4
  234. package/src/ui/app/History.ts +133 -133
  235. package/src/ui/app/Url.spec.ts +50 -50
  236. package/src/ui/app/Url.ts +102 -102
  237. package/src/ui/app/index.ts +5 -5
  238. package/src/ui/app/startAppLoop.tsx +71 -71
  239. package/src/ui/app/startHotAppLoop.ts +41 -41
  240. package/src/ui/batchUpdates.ts +77 -77
  241. package/src/ui/bind.ts +10 -10
  242. package/src/ui/createFunctionalComponent.spec.tsx +454 -454
  243. package/src/ui/createFunctionalComponent.ts +86 -86
  244. package/src/ui/expr.ts +47 -47
  245. package/src/ui/exprHelpers.spec.ts +412 -379
  246. package/src/ui/exprHelpers.ts +18 -0
  247. package/src/ui/flattenProps.ts +21 -21
  248. package/src/ui/index.scss +2 -2
  249. package/src/ui/index.ts +47 -47
  250. package/src/ui/keyboardShortcuts.ts +40 -40
  251. package/src/ui/layout/Content.ts +30 -30
  252. package/src/ui/layout/ContentPlaceholder.spec.tsx +599 -599
  253. package/src/ui/layout/ContentPlaceholder.ts +133 -133
  254. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +207 -207
  255. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  256. package/src/ui/layout/LabelsLeftLayout.scss +46 -46
  257. package/src/ui/layout/LabelsLeftLayout.tsx +76 -76
  258. package/src/ui/layout/LabelsTopLayout.scss +64 -64
  259. package/src/ui/layout/LabelsTopLayout.tsx +156 -156
  260. package/src/ui/layout/UseParentLayout.ts +8 -8
  261. package/src/ui/layout/exploreChildren.ts +38 -38
  262. package/src/ui/layout/index.scss +3 -3
  263. package/src/ui/layout/index.ts +10 -10
  264. package/src/ui/layout/variables.scss +2 -2
  265. package/src/ui/selection/KeySelection.ts +153 -153
  266. package/src/ui/selection/PropertySelection.ts +87 -87
  267. package/src/ui/selection/Selection.ts +128 -128
  268. package/src/ui/selection/index.ts +3 -3
  269. package/src/ui/tpl.spec.ts +69 -0
  270. package/src/ui/tpl.ts +17 -4
  271. package/src/ui/variables.scss +1 -1
  272. package/src/util/Component.spec.ts +411 -411
  273. package/src/util/Component.ts +301 -301
  274. package/src/util/Console.ts +13 -13
  275. package/src/util/DOM.ts +88 -88
  276. package/src/util/Debug.ts +71 -71
  277. package/src/util/Format.spec.ts +69 -69
  278. package/src/util/Format.ts +267 -267
  279. package/src/util/GlobalCacheIdentifier.ts +11 -11
  280. package/src/util/KeyCode.ts +21 -21
  281. package/src/util/SubscriberList.ts +86 -86
  282. package/src/util/Timing.ts +58 -58
  283. package/src/util/TraversalStack.spec.ts +53 -53
  284. package/src/util/TraversalStack.ts +47 -47
  285. package/src/util/addEventListenerWithOptions.ts +41 -41
  286. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  287. package/src/util/calculateNaturalElementHeight.ts +22 -22
  288. package/src/util/call-once.scss +6 -6
  289. package/src/util/capitalize.ts +4 -4
  290. package/src/util/coalesce.ts +6 -6
  291. package/src/util/color/hslToRgb.ts +34 -34
  292. package/src/util/color/index.ts +4 -4
  293. package/src/util/color/parseColor.ts +173 -173
  294. package/src/util/color/rgbToHex.ts +14 -14
  295. package/src/util/color/rgbToHsl.ts +35 -35
  296. package/src/util/date/dateDiff.ts +9 -9
  297. package/src/util/date/diff.ts +13 -13
  298. package/src/util/date/encodeDate.ts +8 -8
  299. package/src/util/date/encodeDateWithTimezoneOffset.ts +18 -18
  300. package/src/util/date/index.ts +11 -11
  301. package/src/util/date/lowerBoundCheck.ts +13 -13
  302. package/src/util/date/maxDate.ts +14 -14
  303. package/src/util/date/minDate.ts +14 -14
  304. package/src/util/date/monthStart.ts +8 -8
  305. package/src/util/date/parseDateInvariant.ts +20 -20
  306. package/src/util/date/sameDate.ts +11 -11
  307. package/src/util/date/upperBoundCheck.spec.ts +30 -30
  308. package/src/util/date/upperBoundCheck.ts +13 -13
  309. package/src/util/date/zeroTime.ts +9 -9
  310. package/src/util/debounce.ts +26 -26
  311. package/src/util/dummyCallback.ts +1 -1
  312. package/src/util/escapeSpecialRegexCharacters.ts +8 -8
  313. package/src/util/eventCallbacks.ts +12 -12
  314. package/src/util/expandFatArrows.ts +118 -118
  315. package/src/util/findScrollableParent.ts +15 -15
  316. package/src/util/getActiveElement.ts +4 -4
  317. package/src/util/getParentFrameBoundingClientRect.ts +13 -13
  318. package/src/util/getScrollerBoundingClientRect.ts +12 -12
  319. package/src/util/getSearchQueryPredicate.spec.ts +40 -40
  320. package/src/util/getSearchQueryPredicate.ts +58 -58
  321. package/src/util/getTopLevelBoundingClientRect.ts +7 -7
  322. package/src/util/getVendorPrefix.ts +33 -33
  323. package/src/util/hasKey.ts +18 -18
  324. package/src/util/index.scss +10 -10
  325. package/src/util/index.ts +55 -55
  326. package/src/util/innerTextTrim.ts +10 -10
  327. package/src/util/isArray.ts +3 -3
  328. package/src/util/isDataRecord.ts +5 -5
  329. package/src/util/isDefined.ts +3 -3
  330. package/src/util/isDigit.ts +8 -8
  331. package/src/util/isFunction.ts +3 -3
  332. package/src/util/isNonEmptyArray.ts +3 -3
  333. package/src/util/isNumber.ts +3 -3
  334. package/src/util/isObject.ts +3 -3
  335. package/src/util/isPromise.ts +6 -6
  336. package/src/util/isString.ts +3 -3
  337. package/src/util/isTextInputElement.ts +2 -2
  338. package/src/util/isTouchDevice.ts +7 -7
  339. package/src/util/isTouchEvent.ts +64 -64
  340. package/src/util/isUndefined.ts +3 -3
  341. package/src/util/isValidIdentifierName.spec.ts +33 -33
  342. package/src/util/isValidIdentifierName.ts +5 -5
  343. package/src/util/onIdleCallback.ts +10 -10
  344. package/src/util/parseStyle.ts +29 -29
  345. package/src/util/quote.ts +6 -6
  346. package/src/util/reverseSlice.ts +9 -9
  347. package/src/util/routeAppend.spec.ts +19 -19
  348. package/src/util/routeAppend.ts +15 -15
  349. package/src/util/scrollElementIntoView.ts +40 -40
  350. package/src/util/scss/add-rules.scss +40 -40
  351. package/src/util/scss/calc.scss +44 -44
  352. package/src/util/scss/call-once.scss +12 -12
  353. package/src/util/scss/clockwise.scss +49 -49
  354. package/src/util/scss/colors.scss +9 -9
  355. package/src/util/scss/deep-get.scss +11 -11
  356. package/src/util/scss/deep-merge.scss +21 -21
  357. package/src/util/scss/divide.scss +3 -3
  358. package/src/util/scss/include.scss +48 -48
  359. package/src/util/scss/index.scss +9 -9
  360. package/src/util/shallowEquals.ts +43 -43
  361. package/src/util/test/createTestRenderer.tsx +19 -19
  362. package/src/util/throttle.ts +21 -21
  363. package/src/util/validatedDebounce.ts +23 -23
  364. package/src/variables.scss +217 -217
  365. package/src/widgets/AccessorBindings.spec.tsx +90 -90
  366. package/src/widgets/Button.scss +119 -119
  367. package/src/widgets/Button.tsx +189 -189
  368. package/src/widgets/Button.variables.scss +117 -117
  369. package/src/widgets/CxCredit.scss +39 -39
  370. package/src/widgets/CxCredit.tsx +46 -46
  371. package/src/widgets/DocumentTitle.ts +95 -95
  372. package/src/widgets/FlexBox.scss +148 -148
  373. package/src/widgets/FlexBox.tsx +168 -168
  374. package/src/widgets/Heading.scss +40 -40
  375. package/src/widgets/Heading.ts +42 -42
  376. package/src/widgets/HighlightedSearchText.scss +20 -20
  377. package/src/widgets/HighlightedSearchText.tsx +54 -54
  378. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -108
  379. package/src/widgets/HtmlElement.spec.tsx +89 -89
  380. package/src/widgets/HtmlElement.tsx +407 -407
  381. package/src/widgets/Icon.scss +22 -22
  382. package/src/widgets/Icon.ts +64 -64
  383. package/src/widgets/List.scss +93 -93
  384. package/src/widgets/List.tsx +793 -793
  385. package/src/widgets/ProgressBar.scss +50 -50
  386. package/src/widgets/ProgressBar.tsx +66 -66
  387. package/src/widgets/ReactElementWrapper.spec.tsx +452 -452
  388. package/src/widgets/ReactElementWrapper.tsx +108 -108
  389. package/src/widgets/Resizer.scss +43 -43
  390. package/src/widgets/Resizer.tsx +200 -200
  391. package/src/widgets/Sandbox.ts +103 -103
  392. package/src/widgets/Section.scss +55 -55
  393. package/src/widgets/Section.tsx +187 -187
  394. package/src/widgets/animations.scss +10 -10
  395. package/src/widgets/autoFocus.ts +9 -9
  396. package/src/widgets/cx.ts +63 -63
  397. package/src/widgets/drag-drop/DragClone.scss +35 -35
  398. package/src/widgets/drag-drop/DragHandle.scss +18 -18
  399. package/src/widgets/drag-drop/DragHandle.tsx +47 -47
  400. package/src/widgets/drag-drop/DragSource.scss +26 -26
  401. package/src/widgets/drag-drop/DragSource.tsx +237 -237
  402. package/src/widgets/drag-drop/DropZone.scss +76 -76
  403. package/src/widgets/drag-drop/DropZone.tsx +353 -353
  404. package/src/widgets/drag-drop/index.scss +3 -3
  405. package/src/widgets/drag-drop/index.ts +4 -4
  406. package/src/widgets/drag-drop/ops.tsx +422 -422
  407. package/src/widgets/drag-drop/variables.scss +14 -14
  408. package/src/widgets/enableAllInternalDependencies.ts +11 -11
  409. package/src/widgets/form/Calendar.scss +199 -199
  410. package/src/widgets/form/Calendar.tsx +760 -760
  411. package/src/widgets/form/Calendar.variables.scss +63 -63
  412. package/src/widgets/form/Checkbox.scss +129 -129
  413. package/src/widgets/form/Checkbox.tsx +287 -287
  414. package/src/widgets/form/Checkbox.variables.scss +39 -39
  415. package/src/widgets/form/ColorField.scss +98 -98
  416. package/src/widgets/form/ColorField.tsx +497 -497
  417. package/src/widgets/form/ColorPicker.scss +285 -285
  418. package/src/widgets/form/ColorPicker.tsx +544 -544
  419. package/src/widgets/form/ColorPicker.variables.scss +22 -22
  420. package/src/widgets/form/DateField.ts +21 -21
  421. package/src/widgets/form/DateTimeField.scss +92 -92
  422. package/src/widgets/form/DateTimeField.tsx +726 -726
  423. package/src/widgets/form/DateTimePicker.scss +46 -46
  424. package/src/widgets/form/DateTimePicker.tsx +429 -429
  425. package/src/widgets/form/Field.scss +164 -164
  426. package/src/widgets/form/Field.tsx +608 -608
  427. package/src/widgets/form/FieldGroup.ts +10 -10
  428. package/src/widgets/form/FieldIcon.ts +61 -61
  429. package/src/widgets/form/HelpText.scss +24 -24
  430. package/src/widgets/form/HelpText.ts +15 -15
  431. package/src/widgets/form/Label.scss +37 -37
  432. package/src/widgets/form/Label.tsx +117 -117
  433. package/src/widgets/form/LabeledContainer.ts +77 -77
  434. package/src/widgets/form/LookupField.scss +221 -221
  435. package/src/widgets/form/LookupField.spec.tsx +93 -93
  436. package/src/widgets/form/LookupField.tsx +1421 -1421
  437. package/src/widgets/form/MonthField.scss +100 -100
  438. package/src/widgets/form/MonthField.tsx +670 -670
  439. package/src/widgets/form/MonthPicker.scss +125 -125
  440. package/src/widgets/form/MonthPicker.tsx +822 -822
  441. package/src/widgets/form/NumberField.scss +63 -63
  442. package/src/widgets/form/NumberField.tsx +543 -543
  443. package/src/widgets/form/Radio.scss +123 -123
  444. package/src/widgets/form/Radio.tsx +249 -249
  445. package/src/widgets/form/Radio.variables.scss +45 -45
  446. package/src/widgets/form/Select.scss +101 -101
  447. package/src/widgets/form/Select.tsx +327 -327
  448. package/src/widgets/form/Slider.scss +121 -121
  449. package/src/widgets/form/Slider.tsx +473 -473
  450. package/src/widgets/form/Switch.scss +142 -142
  451. package/src/widgets/form/Switch.tsx +176 -176
  452. package/src/widgets/form/TextArea.scss +45 -45
  453. package/src/widgets/form/TextArea.tsx +229 -229
  454. package/src/widgets/form/TextField.scss +57 -57
  455. package/src/widgets/form/TextField.tsx +407 -407
  456. package/src/widgets/form/TimeField.ts +10 -10
  457. package/src/widgets/form/TimeList.tsx +105 -105
  458. package/src/widgets/form/UploadButton.scss +49 -49
  459. package/src/widgets/form/UploadButton.tsx +307 -307
  460. package/src/widgets/form/ValidationError.scss +22 -22
  461. package/src/widgets/form/ValidationError.tsx +72 -72
  462. package/src/widgets/form/ValidationGroup.spec.tsx +147 -147
  463. package/src/widgets/form/ValidationGroup.ts +141 -141
  464. package/src/widgets/form/Validator.ts +60 -60
  465. package/src/widgets/form/Wheel.scss +152 -152
  466. package/src/widgets/form/Wheel.tsx +314 -314
  467. package/src/widgets/form/index.scss +24 -24
  468. package/src/widgets/form/index.ts +28 -28
  469. package/src/widgets/form/variables.scss +355 -355
  470. package/src/widgets/grid/Grid.scss +640 -640
  471. package/src/widgets/grid/Grid.tsx +4243 -4243
  472. package/src/widgets/grid/GridCell.ts +143 -143
  473. package/src/widgets/grid/GridCellEditor.tsx +58 -58
  474. package/src/widgets/grid/GridRow.ts +302 -302
  475. package/src/widgets/grid/GridRowLine.ts +49 -49
  476. package/src/widgets/grid/Pagination.scss +115 -115
  477. package/src/widgets/grid/Pagination.tsx +126 -126
  478. package/src/widgets/grid/TreeNode.scss +90 -90
  479. package/src/widgets/grid/TreeNode.tsx +154 -154
  480. package/src/widgets/grid/createGridCellEditor.tsx +18 -18
  481. package/src/widgets/grid/index.scss +3 -3
  482. package/src/widgets/grid/index.ts +16 -16
  483. package/src/widgets/grid/variables.scss +137 -137
  484. package/src/widgets/icons/arrow-down.svg +3 -3
  485. package/src/widgets/icons/arrow-right.svg +2 -2
  486. package/src/widgets/icons/base.svg +104 -104
  487. package/src/widgets/icons/calendar-old.svg +169 -169
  488. package/src/widgets/icons/calendar.svg +187 -187
  489. package/src/widgets/icons/calendar.tsx +22 -22
  490. package/src/widgets/icons/check.tsx +14 -14
  491. package/src/widgets/icons/clear.svg +74 -74
  492. package/src/widgets/icons/clear.tsx +16 -16
  493. package/src/widgets/icons/close.svg +74 -74
  494. package/src/widgets/icons/close.tsx +20 -20
  495. package/src/widgets/icons/cx.tsx +39 -39
  496. package/src/widgets/icons/drop-down.tsx +16 -16
  497. package/src/widgets/icons/dropdown-arrow.svg +61 -61
  498. package/src/widgets/icons/file.svg +4 -4
  499. package/src/widgets/icons/file.tsx +14 -14
  500. package/src/widgets/icons/folder-open.svg +5 -5
  501. package/src/widgets/icons/folder-open.tsx +16 -16
  502. package/src/widgets/icons/folder.svg +58 -58
  503. package/src/widgets/icons/folder.tsx +14 -14
  504. package/src/widgets/icons/forward.svg +67 -67
  505. package/src/widgets/icons/forward.tsx +23 -23
  506. package/src/widgets/icons/index.ts +14 -14
  507. package/src/widgets/icons/loading.svg +4 -4
  508. package/src/widgets/icons/loading.tsx +25 -25
  509. package/src/widgets/icons/menu.tsx +18 -18
  510. package/src/widgets/icons/pixel-picker.tsx +18 -18
  511. package/src/widgets/icons/registry.ts +56 -56
  512. package/src/widgets/icons/search.svg +107 -107
  513. package/src/widgets/icons/search.tsx +14 -14
  514. package/src/widgets/icons/sort-asc.svg +3 -3
  515. package/src/widgets/icons/sort-asc.tsx +15 -15
  516. package/src/widgets/icons/square.tsx +19 -19
  517. package/src/widgets/index.d.ts +55 -55
  518. package/src/widgets/index.scss +16 -16
  519. package/src/widgets/index.ts +58 -58
  520. package/src/widgets/nav/Link.scss +20 -20
  521. package/src/widgets/nav/Link.ts +11 -11
  522. package/src/widgets/nav/LinkButton.ts +176 -176
  523. package/src/widgets/nav/Menu.scss +76 -76
  524. package/src/widgets/nav/Menu.tsx +489 -489
  525. package/src/widgets/nav/Menu.variables.scss +25 -25
  526. package/src/widgets/nav/MenuItem.scss +130 -130
  527. package/src/widgets/nav/MenuItem.tsx +525 -525
  528. package/src/widgets/nav/MenuSpacer.ts +18 -18
  529. package/src/widgets/nav/RedirectRoute.ts +49 -49
  530. package/src/widgets/nav/Route.spec.tsx +24 -24
  531. package/src/widgets/nav/Route.ts +142 -142
  532. package/src/widgets/nav/Scroller.scss +148 -148
  533. package/src/widgets/nav/Scroller.tsx +252 -252
  534. package/src/widgets/nav/Submenu.ts +6 -6
  535. package/src/widgets/nav/Tab.scss +82 -82
  536. package/src/widgets/nav/Tab.ts +120 -120
  537. package/src/widgets/nav/Tab.variables.scss +84 -84
  538. package/src/widgets/nav/cover.scss +22 -22
  539. package/src/widgets/nav/index.scss +5 -5
  540. package/src/widgets/nav/index.ts +10 -10
  541. package/src/widgets/nav/variables.scss +27 -27
  542. package/src/widgets/overlay/ContextMenu.ts +42 -42
  543. package/src/widgets/overlay/Dropdown.scss +186 -186
  544. package/src/widgets/overlay/Dropdown.tsx +762 -762
  545. package/src/widgets/overlay/FlyweightTooltipTracker.ts +57 -57
  546. package/src/widgets/overlay/MsgBox.tsx +141 -141
  547. package/src/widgets/overlay/Overlay.scss +68 -68
  548. package/src/widgets/overlay/Overlay.tsx +947 -947
  549. package/src/widgets/overlay/Toast.scss +163 -163
  550. package/src/widgets/overlay/Toast.ts +111 -111
  551. package/src/widgets/overlay/Tooltip.scss +177 -177
  552. package/src/widgets/overlay/Tooltip.tsx +393 -393
  553. package/src/widgets/overlay/Window.scss +129 -129
  554. package/src/widgets/overlay/Window.tsx +299 -299
  555. package/src/widgets/overlay/Window.variables.scss +62 -62
  556. package/src/widgets/overlay/alerts.ts +46 -46
  557. package/src/widgets/overlay/captureMouse.scss +13 -13
  558. package/src/widgets/overlay/captureMouse.ts +195 -195
  559. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
  560. package/src/widgets/overlay/index.d.ts +11 -11
  561. package/src/widgets/overlay/index.scss +15 -15
  562. package/src/widgets/overlay/index.ts +11 -11
  563. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  564. package/src/widgets/overlay/variables.scss +85 -85
  565. package/src/widgets/variables.scss +146 -146
  566. package/tsconfig.compile.json +4 -4
  567. package/tsconfig.json +34 -34
  568. package/tsconfig.mocha.json +14 -14
@@ -1,473 +1,473 @@
1
- /** @jsxImportSource react */
2
-
3
- import { BooleanProp, NumberProp, StringProp, StructuredProp, StyleProp } from "../../ui/Prop";
4
- import type { RenderingContext } from "../../ui/RenderingContext";
5
- import { VDOM, Widget, getContent } from "../../ui/Widget";
6
- import { addEventListenerWithOptions } from "../../util/addEventListenerWithOptions";
7
- import { getTopLevelBoundingClientRect } from "../../util/getTopLevelBoundingClientRect";
8
- import { isDefined } from "../../util/isDefined";
9
- import { isUndefined } from "../../util/isUndefined";
10
- import { captureMouseOrTouch, getCursorPos } from "../overlay/captureMouse";
11
- import {
12
- tooltipMouseLeave,
13
- tooltipMouseMove,
14
- tooltipParentDidMount,
15
- tooltipParentWillReceiveProps,
16
- tooltipParentWillUnmount,
17
- type TooltipConfig,
18
- } from "../overlay/tooltip-ops";
19
- import { Field, FieldConfig, FieldInstance, getFieldTooltip } from "./Field";
20
- import type { Instance } from "../../ui/Instance";
21
-
22
- export interface SliderConfig extends FieldConfig {
23
- /** Low value of the slider range. */
24
- from?: NumberProp;
25
-
26
- /** High value of the slider range. */
27
- to?: NumberProp;
28
-
29
- /** Rounding step. */
30
- step?: NumberProp;
31
-
32
- /** Minimum allowed value. Default is `0`. */
33
- minValue?: NumberProp;
34
-
35
- /** Maximum allowed value. Default is `100`. */
36
- maxValue?: NumberProp;
37
-
38
- /** Style object to be applied on the selected axis range. */
39
- rangeStyle?: StyleProp;
40
-
41
- /** Style object to be applied on the handle. */
42
- handleStyle?: StyleProp;
43
-
44
- /** Minimum allowed value. Default is `0`. */
45
- min?: NumberProp;
46
-
47
- /** Maximum allowed value. Default is `100`. */
48
- max?: NumberProp;
49
-
50
- /** High value of the slider range. */
51
- value?: NumberProp;
52
-
53
- /** Set to `true` to orient the slider vertically. */
54
- vertical?: boolean;
55
-
56
- /** Invert vertical slider behavior. Set this to `true` if you want the slider to go from `top` to `bottom`. */
57
- invert?: boolean;
58
-
59
- /** Range tooltip configuration. */
60
- toTooltip?: StringProp | StructuredProp;
61
-
62
- /** Range tooltip configuration. */
63
- valueTooltip?: StringProp | StructuredProp;
64
-
65
- /** Range tooltip configuration. */
66
- fromTooltip?: StringProp | StructuredProp;
67
-
68
- /** When set to `true`, slider responds to mouse wheel events, while hovering it. It will not work if both `from` and `to` values are used. Default value is `false`. */
69
- wheel?: BooleanProp;
70
-
71
- /** Value increment/decrement, when controlling the slider with mouse wheel. Default value is set to `1%` of range. */
72
- increment?: NumberProp;
73
-
74
- /** Increment percentage. Default value is `0.01` (1%). */
75
- incrementPercentage?: number;
76
-
77
- /** Set to `true` to make the slider read-only. */
78
- readOnly?: BooleanProp;
79
-
80
- /** Custom validation function. */
81
- onValidate?: string | ((value: number, instance: Instance, validationParams: Record<string, unknown>) => unknown);
82
- }
83
-
84
- export class Slider extends Field<SliderConfig, FieldInstance<Slider>> {
85
- declare baseClass: string;
86
- declare min?: number;
87
- declare max?: number;
88
- declare minValue: number;
89
- declare maxValue: number;
90
- declare value?: number;
91
- declare vertical: boolean;
92
- declare invert: boolean;
93
- declare from?: number;
94
- declare to?: number;
95
- declare showFrom?: boolean;
96
- declare showTo?: boolean;
97
- declare toTooltip?: TooltipConfig;
98
- declare fromTooltip?: TooltipConfig;
99
- declare valueTooltip?: TooltipConfig;
100
- declare incrementPercentage: number;
101
- declare wheel: boolean;
102
-
103
- declareData(...args: Record<string, unknown>[]): void {
104
- super.declareData(
105
- {
106
- from: 0,
107
- to: 0,
108
- step: undefined,
109
- minValue: undefined,
110
- maxValue: undefined,
111
- increment: undefined,
112
- incrementPercentage: undefined,
113
- wheel: undefined,
114
- disabled: undefined,
115
- enabled: undefined,
116
- readOnly: undefined,
117
- rangeStyle: {
118
- structured: true,
119
- },
120
- handleStyle: {
121
- structured: true,
122
- },
123
- invert: false,
124
- },
125
- ...args,
126
- );
127
- }
128
-
129
- init(): void {
130
- if (isDefined(this.min)) this.minValue = this.min;
131
-
132
- if (isDefined(this.max)) this.maxValue = this.max;
133
-
134
- if (this.value != null) this.to = this.value;
135
-
136
- if (isUndefined(this.from)) this.from = this.minValue;
137
- else this.showFrom = true;
138
-
139
- if (isUndefined(this.to)) this.to = this.maxValue;
140
- else this.showTo = true;
141
-
142
- if (this.valueTooltip) this.toTooltip = this.valueTooltip;
143
-
144
- super.init();
145
- }
146
-
147
- prepareData(context: RenderingContext, instance: FieldInstance<Slider>): void {
148
- let { data } = instance;
149
- data.stateMods = {
150
- ...data.stateMods,
151
- horizontal: !this.vertical,
152
- vertical: this.vertical,
153
- disabled: data.disabled,
154
- };
155
- super.prepareData(context, instance);
156
- }
157
-
158
- renderInput(context: RenderingContext, instance: FieldInstance<Slider>, key: string): React.ReactNode {
159
- return (
160
- <SliderComponent
161
- key={key}
162
- instance={instance}
163
- data={instance.data}
164
- label={this.labelPlacement && getContent(this.renderLabel(context, instance, "label"))}
165
- />
166
- );
167
- }
168
- }
169
-
170
- Slider.prototype.baseClass = "slider";
171
- Slider.prototype.minValue = 0;
172
- Slider.prototype.maxValue = 100;
173
- Slider.prototype.vertical = false;
174
- Slider.prototype.incrementPercentage = 0.01;
175
- Slider.prototype.wheel = false;
176
- Slider.prototype.invert = false;
177
-
178
- Widget.alias("slider", Slider);
179
-
180
- interface SliderComponentProps {
181
- instance: FieldInstance<Slider>;
182
- data: Record<string, any>;
183
- label?: React.ReactNode;
184
- }
185
-
186
- interface SliderComponentState {
187
- from: number;
188
- to: number;
189
- drag?: boolean;
190
- }
191
-
192
- interface DomRefs {
193
- el?: HTMLElement;
194
- range?: HTMLElement;
195
- from?: HTMLElement;
196
- to?: HTMLElement;
197
- }
198
-
199
- class SliderComponent extends VDOM.Component<SliderComponentProps, SliderComponentState> {
200
- dom: DomRefs;
201
- unsubscribeOnWheel?: () => void;
202
-
203
- constructor(props: SliderComponentProps) {
204
- super(props);
205
- this.dom = {};
206
- let { data } = props;
207
- this.state = {
208
- from: data.from as number,
209
- to: data.to as number,
210
- };
211
- }
212
-
213
- render(): React.ReactNode {
214
- let { instance, data, label } = this.props;
215
- let { widget } = instance;
216
- let { CSS, baseClass } = widget;
217
- let { minValue, maxValue } = data;
218
- let { from, to } = this.state;
219
-
220
- from = Math.min(maxValue, Math.max(minValue, from));
221
- to = Math.min(maxValue, Math.max(minValue, to));
222
-
223
- let handleStyle = CSS.parseStyle(data.handleStyle);
224
- let anchor = widget.vertical ? (widget.invert ? "top" : "bottom") : "left";
225
- let rangeStart = from - minValue;
226
- let rangeSize = to - from;
227
-
228
- let fromHandleStyle = {
229
- ...handleStyle,
230
- [anchor]: `${(100 * (from - minValue)) / (maxValue - minValue)}%`,
231
- };
232
-
233
- let toHandleStyle = {
234
- ...handleStyle,
235
- [anchor]: `${(100 * (to - minValue)) / (maxValue - minValue)}%`,
236
- };
237
-
238
- let rangeStyle = {
239
- ...CSS.parseStyle(data.rangeStyle),
240
- [anchor]: `${(100 * rangeStart) / (maxValue - minValue)}%`,
241
- [widget.vertical ? "height" : "width"]: `${(100 * rangeSize) / (maxValue - minValue)}%`,
242
- };
243
-
244
- return (
245
- <div
246
- className={data.classNames}
247
- style={data.style}
248
- id={data.id}
249
- onClick={(e: React.MouseEvent) => this.onClick(e)}
250
- ref={(el: HTMLDivElement | null) => {
251
- this.dom.el = el || undefined;
252
- }}
253
- onMouseMove={(e: React.MouseEvent) => tooltipMouseMove(e, ...getFieldTooltip(instance))}
254
- onMouseLeave={(e: React.MouseEvent) => tooltipMouseLeave(e, ...getFieldTooltip(instance))}
255
- >
256
- {label}&nbsp;
257
- <div className={CSS.element(baseClass, "axis")}>
258
- {rangeSize > 0 && <div key="range" className={CSS.element(baseClass, "range")} style={rangeStyle} />}
259
- <div
260
- key="space"
261
- className={CSS.element(baseClass, "space")}
262
- ref={(c: HTMLDivElement | null) => {
263
- this.dom.range = c || undefined;
264
- }}
265
- >
266
- {widget.showFrom && (
267
- <div
268
- key="from"
269
- className={CSS.element(baseClass, "handle")}
270
- tabIndex={data.disabled ? undefined : (data.tabIndex as number) || 0}
271
- style={fromHandleStyle}
272
- onMouseDown={(e: React.MouseEvent) => this.onHandleMouseDown(e, "from")}
273
- onMouseMove={(e: React.MouseEvent) =>
274
- tooltipMouseMove(e, instance, widget.fromTooltip, { tooltipName: "fromTooltip" })
275
- }
276
- onMouseLeave={(e: React.MouseEvent) => this.onHandleMouseLeave(e, "from")}
277
- onTouchStart={(e: React.TouchEvent) => this.onHandleMouseDown(e, "from")}
278
- ref={(c: HTMLDivElement | null) => {
279
- this.dom.from = c || undefined;
280
- }}
281
- />
282
- )}
283
- {widget.showTo && (
284
- <div
285
- key="to"
286
- className={CSS.element(baseClass, "handle")}
287
- tabIndex={data.disabled ? undefined : 0}
288
- style={toHandleStyle}
289
- onMouseDown={(e: React.MouseEvent) => this.onHandleMouseDown(e, "to")}
290
- onMouseMove={(e: React.MouseEvent) =>
291
- tooltipMouseMove(e, instance, widget.toTooltip, { tooltipName: "toTooltip" })
292
- }
293
- onMouseLeave={(e: React.MouseEvent) => this.onHandleMouseLeave(e, "to")}
294
- onTouchStart={(e: React.TouchEvent) => this.onHandleMouseDown(e, "to")}
295
- ref={(c: HTMLDivElement | null) => {
296
- this.dom.to = c || undefined;
297
- }}
298
- />
299
- )}
300
- </div>
301
- </div>
302
- </div>
303
- );
304
- }
305
-
306
- UNSAFE_componentWillReceiveProps(props: SliderComponentProps): void {
307
- this.setState({
308
- from: props.data.from,
309
- to: props.data.to,
310
- });
311
-
312
- let { instance } = props;
313
- let { widget } = instance;
314
- tooltipParentWillReceiveProps(this.dom.to!, instance, widget.toTooltip, { tooltipName: "toTooltip" });
315
- tooltipParentWillReceiveProps(this.dom.from!, instance, widget.fromTooltip, { tooltipName: "fromTooltip" });
316
- }
317
-
318
- componentWillUnmount(): void {
319
- tooltipParentWillUnmount(this.props.instance);
320
- this.unsubscribeOnWheel?.();
321
- }
322
-
323
- componentDidMount(): void {
324
- let { instance } = this.props;
325
- let { widget } = instance;
326
- tooltipParentDidMount(this.dom.to!, instance, widget.toTooltip, { tooltipName: "toTooltip" });
327
- tooltipParentDidMount(this.dom.from!, instance, widget.fromTooltip, { tooltipName: "fromTooltip" });
328
-
329
- this.unsubscribeOnWheel = addEventListenerWithOptions(this.dom.el!, "wheel", (e) => this.onWheel(e), {
330
- passive: false,
331
- });
332
- }
333
-
334
- onHandleMouseLeave(e: React.MouseEvent, handle: "from" | "to"): void {
335
- if (!this.state.drag) {
336
- let tooltipName = handle + "Tooltip";
337
- let { instance } = this.props;
338
- let tooltip = handle == "from" ? instance.widget.fromTooltip : instance.widget.toTooltip;
339
- tooltipMouseLeave(e, instance, tooltip, { tooltipName });
340
- }
341
- }
342
-
343
- onHandleMouseDown(e: React.MouseEvent | React.TouchEvent, handle: "from" | "to"): void {
344
- e.preventDefault();
345
- e.stopPropagation();
346
-
347
- let { instance } = this.props;
348
- let { data, widget } = instance;
349
- if (data.disabled || data.readOnly) return;
350
-
351
- let handleEl = this.dom[handle];
352
- let b = getTopLevelBoundingClientRect(handleEl!);
353
- let pos = getCursorPos(e);
354
- let dx = pos.clientX - (b.left + b.right) / 2;
355
- let dy = pos.clientY - (b.top + b.bottom) / 2;
356
-
357
- let tooltipName = handle + "Tooltip";
358
- let tooltip = handle == "from" ? widget.fromTooltip : widget.toTooltip;
359
-
360
- this.setState({
361
- drag: true,
362
- });
363
-
364
- captureMouseOrTouch(
365
- e,
366
- (e) => {
367
- let { value } = this.getValues(e, widget.vertical ? dy : dx);
368
- if (handle === "from") {
369
- if (instance.set("from", value)) this.setState({ from: value });
370
- if (value > this.state.to) {
371
- if (instance.set("to", value)) this.setState({ to: value });
372
- }
373
- } else if (handle === "to") {
374
- if (instance.set("to", value)) this.setState({ to: value });
375
- if (value < this.state.from) {
376
- if (instance.set("from", value)) this.setState({ from: value });
377
- }
378
- }
379
- tooltipMouseMove(e, instance, tooltip, { tooltipName, target: handleEl });
380
- },
381
- (e: any) => {
382
- this.setState({
383
- drag: false,
384
- });
385
- let pos = getCursorPos(e);
386
- let el = document.elementFromPoint(pos.clientX, pos.clientY);
387
- if (el !== handleEl) tooltipMouseLeave(e, instance, tooltip as any, { tooltipName, target: handleEl });
388
- },
389
- );
390
- }
391
-
392
- getValues(
393
- e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent,
394
- d: number = 0,
395
- ): { percent: number; value: number } {
396
- let { data, widget } = this.props.instance;
397
- let { minValue, maxValue } = data;
398
- let b = getTopLevelBoundingClientRect(this.dom.range!);
399
- let pos = getCursorPos(e as any);
400
- let pct = widget.vertical
401
- ? widget.invert
402
- ? Math.max(0, Math.min(1, (pos.clientY - b.top - d) / this.dom.range!.offsetHeight))
403
- : Math.max(0, Math.min(1, (b.bottom - pos.clientY + d) / this.dom.range!.offsetHeight))
404
- : Math.max(0, Math.min(1, (pos.clientX - b.left - d) / this.dom.range!.offsetWidth));
405
- let delta = (maxValue - minValue) * pct;
406
- if (data.step) {
407
- let currentValue = Math.round(delta / data.step) * data.step + minValue;
408
- let value = this.checkBoundaries(currentValue);
409
-
410
- if (maxValue % data.step === 0) delta = Math.round(delta / data.step) * data.step;
411
-
412
- delta = value - minValue;
413
- }
414
-
415
- return {
416
- percent: delta / (maxValue - minValue),
417
- value: minValue + delta,
418
- };
419
- }
420
-
421
- onClick(e: React.MouseEvent): void {
422
- let { instance } = this.props;
423
- let { data, widget } = instance;
424
- if (!data.disabled && !data.readOnly) {
425
- let { value } = this.getValues(e);
426
- this.props.instance.set("value", value, { immediate: true });
427
-
428
- if (widget.showFrom) {
429
- this.setState({ from: value });
430
- this.props.instance.set("from", value, { immediate: true });
431
- }
432
- if (widget.showTo) {
433
- this.setState({ to: value });
434
- this.props.instance.set("to", value, { immediate: true });
435
- }
436
- }
437
- }
438
-
439
- onWheel(e: WheelEvent): void {
440
- let { instance } = this.props;
441
- let { data, widget } = instance;
442
- if ((widget.showFrom && widget.showTo) || !data.wheel) return;
443
-
444
- e.preventDefault();
445
- e.stopPropagation();
446
-
447
- let increment = e.deltaY > 0 ? this.getIncrement() : -this.getIncrement();
448
-
449
- if (!data.disabled && !data.readOnly) {
450
- if (widget.showFrom) {
451
- let value = this.checkBoundaries(data.from + increment);
452
- if (instance.set("from", value)) this.setState({ from: value });
453
- } else if (widget.showTo) {
454
- let value = this.checkBoundaries(data.to + increment);
455
- if (instance.set("to", value)) this.setState({ to: value });
456
- }
457
- }
458
- }
459
-
460
- checkBoundaries(value: number): number {
461
- let { data } = this.props.instance;
462
- if (value > data.maxValue) value = data.maxValue;
463
- else if (value < data.minValue) value = data.minValue;
464
- return value;
465
- }
466
-
467
- getIncrement(): number {
468
- let { instance } = this.props;
469
- let { data } = instance;
470
- let increment = data.increment || (data.maxValue - data.minValue) * data.incrementPercentage;
471
- return increment;
472
- }
473
- }
1
+ /** @jsxImportSource react */
2
+
3
+ import { BooleanProp, NumberProp, StringProp, StructuredProp, StyleProp } from "../../ui/Prop";
4
+ import type { RenderingContext } from "../../ui/RenderingContext";
5
+ import { VDOM, Widget, getContent } from "../../ui/Widget";
6
+ import { addEventListenerWithOptions } from "../../util/addEventListenerWithOptions";
7
+ import { getTopLevelBoundingClientRect } from "../../util/getTopLevelBoundingClientRect";
8
+ import { isDefined } from "../../util/isDefined";
9
+ import { isUndefined } from "../../util/isUndefined";
10
+ import { captureMouseOrTouch, getCursorPos } from "../overlay/captureMouse";
11
+ import {
12
+ tooltipMouseLeave,
13
+ tooltipMouseMove,
14
+ tooltipParentDidMount,
15
+ tooltipParentWillReceiveProps,
16
+ tooltipParentWillUnmount,
17
+ type TooltipConfig,
18
+ } from "../overlay/tooltip-ops";
19
+ import { Field, FieldConfig, FieldInstance, getFieldTooltip } from "./Field";
20
+ import type { Instance } from "../../ui/Instance";
21
+
22
+ export interface SliderConfig extends FieldConfig {
23
+ /** Low value of the slider range. */
24
+ from?: NumberProp;
25
+
26
+ /** High value of the slider range. */
27
+ to?: NumberProp;
28
+
29
+ /** Rounding step. */
30
+ step?: NumberProp;
31
+
32
+ /** Minimum allowed value. Default is `0`. */
33
+ minValue?: NumberProp;
34
+
35
+ /** Maximum allowed value. Default is `100`. */
36
+ maxValue?: NumberProp;
37
+
38
+ /** Style object to be applied on the selected axis range. */
39
+ rangeStyle?: StyleProp;
40
+
41
+ /** Style object to be applied on the handle. */
42
+ handleStyle?: StyleProp;
43
+
44
+ /** Minimum allowed value. Default is `0`. */
45
+ min?: NumberProp;
46
+
47
+ /** Maximum allowed value. Default is `100`. */
48
+ max?: NumberProp;
49
+
50
+ /** High value of the slider range. */
51
+ value?: NumberProp;
52
+
53
+ /** Set to `true` to orient the slider vertically. */
54
+ vertical?: boolean;
55
+
56
+ /** Invert vertical slider behavior. Set this to `true` if you want the slider to go from `top` to `bottom`. */
57
+ invert?: boolean;
58
+
59
+ /** Range tooltip configuration. */
60
+ toTooltip?: StringProp | StructuredProp;
61
+
62
+ /** Range tooltip configuration. */
63
+ valueTooltip?: StringProp | StructuredProp;
64
+
65
+ /** Range tooltip configuration. */
66
+ fromTooltip?: StringProp | StructuredProp;
67
+
68
+ /** When set to `true`, slider responds to mouse wheel events, while hovering it. It will not work if both `from` and `to` values are used. Default value is `false`. */
69
+ wheel?: BooleanProp;
70
+
71
+ /** Value increment/decrement, when controlling the slider with mouse wheel. Default value is set to `1%` of range. */
72
+ increment?: NumberProp;
73
+
74
+ /** Increment percentage. Default value is `0.01` (1%). */
75
+ incrementPercentage?: number;
76
+
77
+ /** Set to `true` to make the slider read-only. */
78
+ readOnly?: BooleanProp;
79
+
80
+ /** Custom validation function. */
81
+ onValidate?: string | ((value: number, instance: Instance, validationParams: Record<string, unknown>) => unknown);
82
+ }
83
+
84
+ export class Slider extends Field<SliderConfig, FieldInstance<Slider>> {
85
+ declare baseClass: string;
86
+ declare min?: number;
87
+ declare max?: number;
88
+ declare minValue: number;
89
+ declare maxValue: number;
90
+ declare value?: number;
91
+ declare vertical: boolean;
92
+ declare invert: boolean;
93
+ declare from?: number;
94
+ declare to?: number;
95
+ declare showFrom?: boolean;
96
+ declare showTo?: boolean;
97
+ declare toTooltip?: TooltipConfig;
98
+ declare fromTooltip?: TooltipConfig;
99
+ declare valueTooltip?: TooltipConfig;
100
+ declare incrementPercentage: number;
101
+ declare wheel: boolean;
102
+
103
+ declareData(...args: Record<string, unknown>[]): void {
104
+ super.declareData(
105
+ {
106
+ from: 0,
107
+ to: 0,
108
+ step: undefined,
109
+ minValue: undefined,
110
+ maxValue: undefined,
111
+ increment: undefined,
112
+ incrementPercentage: undefined,
113
+ wheel: undefined,
114
+ disabled: undefined,
115
+ enabled: undefined,
116
+ readOnly: undefined,
117
+ rangeStyle: {
118
+ structured: true,
119
+ },
120
+ handleStyle: {
121
+ structured: true,
122
+ },
123
+ invert: false,
124
+ },
125
+ ...args,
126
+ );
127
+ }
128
+
129
+ init(): void {
130
+ if (isDefined(this.min)) this.minValue = this.min;
131
+
132
+ if (isDefined(this.max)) this.maxValue = this.max;
133
+
134
+ if (this.value != null) this.to = this.value;
135
+
136
+ if (isUndefined(this.from)) this.from = this.minValue;
137
+ else this.showFrom = true;
138
+
139
+ if (isUndefined(this.to)) this.to = this.maxValue;
140
+ else this.showTo = true;
141
+
142
+ if (this.valueTooltip) this.toTooltip = this.valueTooltip;
143
+
144
+ super.init();
145
+ }
146
+
147
+ prepareData(context: RenderingContext, instance: FieldInstance<Slider>): void {
148
+ let { data } = instance;
149
+ data.stateMods = {
150
+ ...data.stateMods,
151
+ horizontal: !this.vertical,
152
+ vertical: this.vertical,
153
+ disabled: data.disabled,
154
+ };
155
+ super.prepareData(context, instance);
156
+ }
157
+
158
+ renderInput(context: RenderingContext, instance: FieldInstance<Slider>, key: string): React.ReactNode {
159
+ return (
160
+ <SliderComponent
161
+ key={key}
162
+ instance={instance}
163
+ data={instance.data}
164
+ label={this.labelPlacement && getContent(this.renderLabel(context, instance, "label"))}
165
+ />
166
+ );
167
+ }
168
+ }
169
+
170
+ Slider.prototype.baseClass = "slider";
171
+ Slider.prototype.minValue = 0;
172
+ Slider.prototype.maxValue = 100;
173
+ Slider.prototype.vertical = false;
174
+ Slider.prototype.incrementPercentage = 0.01;
175
+ Slider.prototype.wheel = false;
176
+ Slider.prototype.invert = false;
177
+
178
+ Widget.alias("slider", Slider);
179
+
180
+ interface SliderComponentProps {
181
+ instance: FieldInstance<Slider>;
182
+ data: Record<string, any>;
183
+ label?: React.ReactNode;
184
+ }
185
+
186
+ interface SliderComponentState {
187
+ from: number;
188
+ to: number;
189
+ drag?: boolean;
190
+ }
191
+
192
+ interface DomRefs {
193
+ el?: HTMLElement;
194
+ range?: HTMLElement;
195
+ from?: HTMLElement;
196
+ to?: HTMLElement;
197
+ }
198
+
199
+ class SliderComponent extends VDOM.Component<SliderComponentProps, SliderComponentState> {
200
+ dom: DomRefs;
201
+ unsubscribeOnWheel?: () => void;
202
+
203
+ constructor(props: SliderComponentProps) {
204
+ super(props);
205
+ this.dom = {};
206
+ let { data } = props;
207
+ this.state = {
208
+ from: data.from as number,
209
+ to: data.to as number,
210
+ };
211
+ }
212
+
213
+ render(): React.ReactNode {
214
+ let { instance, data, label } = this.props;
215
+ let { widget } = instance;
216
+ let { CSS, baseClass } = widget;
217
+ let { minValue, maxValue } = data;
218
+ let { from, to } = this.state;
219
+
220
+ from = Math.min(maxValue, Math.max(minValue, from));
221
+ to = Math.min(maxValue, Math.max(minValue, to));
222
+
223
+ let handleStyle = CSS.parseStyle(data.handleStyle);
224
+ let anchor = widget.vertical ? (widget.invert ? "top" : "bottom") : "left";
225
+ let rangeStart = from - minValue;
226
+ let rangeSize = to - from;
227
+
228
+ let fromHandleStyle = {
229
+ ...handleStyle,
230
+ [anchor]: `${(100 * (from - minValue)) / (maxValue - minValue)}%`,
231
+ };
232
+
233
+ let toHandleStyle = {
234
+ ...handleStyle,
235
+ [anchor]: `${(100 * (to - minValue)) / (maxValue - minValue)}%`,
236
+ };
237
+
238
+ let rangeStyle = {
239
+ ...CSS.parseStyle(data.rangeStyle),
240
+ [anchor]: `${(100 * rangeStart) / (maxValue - minValue)}%`,
241
+ [widget.vertical ? "height" : "width"]: `${(100 * rangeSize) / (maxValue - minValue)}%`,
242
+ };
243
+
244
+ return (
245
+ <div
246
+ className={data.classNames}
247
+ style={data.style}
248
+ id={data.id}
249
+ onClick={(e: React.MouseEvent) => this.onClick(e)}
250
+ ref={(el: HTMLDivElement | null) => {
251
+ this.dom.el = el || undefined;
252
+ }}
253
+ onMouseMove={(e: React.MouseEvent) => tooltipMouseMove(e, ...getFieldTooltip(instance))}
254
+ onMouseLeave={(e: React.MouseEvent) => tooltipMouseLeave(e, ...getFieldTooltip(instance))}
255
+ >
256
+ {label}&nbsp;
257
+ <div className={CSS.element(baseClass, "axis")}>
258
+ {rangeSize > 0 && <div key="range" className={CSS.element(baseClass, "range")} style={rangeStyle} />}
259
+ <div
260
+ key="space"
261
+ className={CSS.element(baseClass, "space")}
262
+ ref={(c: HTMLDivElement | null) => {
263
+ this.dom.range = c || undefined;
264
+ }}
265
+ >
266
+ {widget.showFrom && (
267
+ <div
268
+ key="from"
269
+ className={CSS.element(baseClass, "handle")}
270
+ tabIndex={data.disabled ? undefined : (data.tabIndex as number) || 0}
271
+ style={fromHandleStyle}
272
+ onMouseDown={(e: React.MouseEvent) => this.onHandleMouseDown(e, "from")}
273
+ onMouseMove={(e: React.MouseEvent) =>
274
+ tooltipMouseMove(e, instance, widget.fromTooltip, { tooltipName: "fromTooltip" })
275
+ }
276
+ onMouseLeave={(e: React.MouseEvent) => this.onHandleMouseLeave(e, "from")}
277
+ onTouchStart={(e: React.TouchEvent) => this.onHandleMouseDown(e, "from")}
278
+ ref={(c: HTMLDivElement | null) => {
279
+ this.dom.from = c || undefined;
280
+ }}
281
+ />
282
+ )}
283
+ {widget.showTo && (
284
+ <div
285
+ key="to"
286
+ className={CSS.element(baseClass, "handle")}
287
+ tabIndex={data.disabled ? undefined : 0}
288
+ style={toHandleStyle}
289
+ onMouseDown={(e: React.MouseEvent) => this.onHandleMouseDown(e, "to")}
290
+ onMouseMove={(e: React.MouseEvent) =>
291
+ tooltipMouseMove(e, instance, widget.toTooltip, { tooltipName: "toTooltip" })
292
+ }
293
+ onMouseLeave={(e: React.MouseEvent) => this.onHandleMouseLeave(e, "to")}
294
+ onTouchStart={(e: React.TouchEvent) => this.onHandleMouseDown(e, "to")}
295
+ ref={(c: HTMLDivElement | null) => {
296
+ this.dom.to = c || undefined;
297
+ }}
298
+ />
299
+ )}
300
+ </div>
301
+ </div>
302
+ </div>
303
+ );
304
+ }
305
+
306
+ UNSAFE_componentWillReceiveProps(props: SliderComponentProps): void {
307
+ this.setState({
308
+ from: props.data.from,
309
+ to: props.data.to,
310
+ });
311
+
312
+ let { instance } = props;
313
+ let { widget } = instance;
314
+ tooltipParentWillReceiveProps(this.dom.to!, instance, widget.toTooltip, { tooltipName: "toTooltip" });
315
+ tooltipParentWillReceiveProps(this.dom.from!, instance, widget.fromTooltip, { tooltipName: "fromTooltip" });
316
+ }
317
+
318
+ componentWillUnmount(): void {
319
+ tooltipParentWillUnmount(this.props.instance);
320
+ this.unsubscribeOnWheel?.();
321
+ }
322
+
323
+ componentDidMount(): void {
324
+ let { instance } = this.props;
325
+ let { widget } = instance;
326
+ tooltipParentDidMount(this.dom.to!, instance, widget.toTooltip, { tooltipName: "toTooltip" });
327
+ tooltipParentDidMount(this.dom.from!, instance, widget.fromTooltip, { tooltipName: "fromTooltip" });
328
+
329
+ this.unsubscribeOnWheel = addEventListenerWithOptions(this.dom.el!, "wheel", (e) => this.onWheel(e), {
330
+ passive: false,
331
+ });
332
+ }
333
+
334
+ onHandleMouseLeave(e: React.MouseEvent, handle: "from" | "to"): void {
335
+ if (!this.state.drag) {
336
+ let tooltipName = handle + "Tooltip";
337
+ let { instance } = this.props;
338
+ let tooltip = handle == "from" ? instance.widget.fromTooltip : instance.widget.toTooltip;
339
+ tooltipMouseLeave(e, instance, tooltip, { tooltipName });
340
+ }
341
+ }
342
+
343
+ onHandleMouseDown(e: React.MouseEvent | React.TouchEvent, handle: "from" | "to"): void {
344
+ e.preventDefault();
345
+ e.stopPropagation();
346
+
347
+ let { instance } = this.props;
348
+ let { data, widget } = instance;
349
+ if (data.disabled || data.readOnly) return;
350
+
351
+ let handleEl = this.dom[handle];
352
+ let b = getTopLevelBoundingClientRect(handleEl!);
353
+ let pos = getCursorPos(e);
354
+ let dx = pos.clientX - (b.left + b.right) / 2;
355
+ let dy = pos.clientY - (b.top + b.bottom) / 2;
356
+
357
+ let tooltipName = handle + "Tooltip";
358
+ let tooltip = handle == "from" ? widget.fromTooltip : widget.toTooltip;
359
+
360
+ this.setState({
361
+ drag: true,
362
+ });
363
+
364
+ captureMouseOrTouch(
365
+ e,
366
+ (e) => {
367
+ let { value } = this.getValues(e, widget.vertical ? dy : dx);
368
+ if (handle === "from") {
369
+ if (instance.set("from", value)) this.setState({ from: value });
370
+ if (value > this.state.to) {
371
+ if (instance.set("to", value)) this.setState({ to: value });
372
+ }
373
+ } else if (handle === "to") {
374
+ if (instance.set("to", value)) this.setState({ to: value });
375
+ if (value < this.state.from) {
376
+ if (instance.set("from", value)) this.setState({ from: value });
377
+ }
378
+ }
379
+ tooltipMouseMove(e, instance, tooltip, { tooltipName, target: handleEl });
380
+ },
381
+ (e: any) => {
382
+ this.setState({
383
+ drag: false,
384
+ });
385
+ let pos = getCursorPos(e);
386
+ let el = document.elementFromPoint(pos.clientX, pos.clientY);
387
+ if (el !== handleEl) tooltipMouseLeave(e, instance, tooltip as any, { tooltipName, target: handleEl });
388
+ },
389
+ );
390
+ }
391
+
392
+ getValues(
393
+ e: React.MouseEvent | React.TouchEvent | MouseEvent | TouchEvent,
394
+ d: number = 0,
395
+ ): { percent: number; value: number } {
396
+ let { data, widget } = this.props.instance;
397
+ let { minValue, maxValue } = data;
398
+ let b = getTopLevelBoundingClientRect(this.dom.range!);
399
+ let pos = getCursorPos(e as any);
400
+ let pct = widget.vertical
401
+ ? widget.invert
402
+ ? Math.max(0, Math.min(1, (pos.clientY - b.top - d) / this.dom.range!.offsetHeight))
403
+ : Math.max(0, Math.min(1, (b.bottom - pos.clientY + d) / this.dom.range!.offsetHeight))
404
+ : Math.max(0, Math.min(1, (pos.clientX - b.left - d) / this.dom.range!.offsetWidth));
405
+ let delta = (maxValue - minValue) * pct;
406
+ if (data.step) {
407
+ let currentValue = Math.round(delta / data.step) * data.step + minValue;
408
+ let value = this.checkBoundaries(currentValue);
409
+
410
+ if (maxValue % data.step === 0) delta = Math.round(delta / data.step) * data.step;
411
+
412
+ delta = value - minValue;
413
+ }
414
+
415
+ return {
416
+ percent: delta / (maxValue - minValue),
417
+ value: minValue + delta,
418
+ };
419
+ }
420
+
421
+ onClick(e: React.MouseEvent): void {
422
+ let { instance } = this.props;
423
+ let { data, widget } = instance;
424
+ if (!data.disabled && !data.readOnly) {
425
+ let { value } = this.getValues(e);
426
+ this.props.instance.set("value", value, { immediate: true });
427
+
428
+ if (widget.showFrom) {
429
+ this.setState({ from: value });
430
+ this.props.instance.set("from", value, { immediate: true });
431
+ }
432
+ if (widget.showTo) {
433
+ this.setState({ to: value });
434
+ this.props.instance.set("to", value, { immediate: true });
435
+ }
436
+ }
437
+ }
438
+
439
+ onWheel(e: WheelEvent): void {
440
+ let { instance } = this.props;
441
+ let { data, widget } = instance;
442
+ if ((widget.showFrom && widget.showTo) || !data.wheel) return;
443
+
444
+ e.preventDefault();
445
+ e.stopPropagation();
446
+
447
+ let increment = e.deltaY > 0 ? this.getIncrement() : -this.getIncrement();
448
+
449
+ if (!data.disabled && !data.readOnly) {
450
+ if (widget.showFrom) {
451
+ let value = this.checkBoundaries(data.from + increment);
452
+ if (instance.set("from", value)) this.setState({ from: value });
453
+ } else if (widget.showTo) {
454
+ let value = this.checkBoundaries(data.to + increment);
455
+ if (instance.set("to", value)) this.setState({ to: value });
456
+ }
457
+ }
458
+ }
459
+
460
+ checkBoundaries(value: number): number {
461
+ let { data } = this.props.instance;
462
+ if (value > data.maxValue) value = data.maxValue;
463
+ else if (value < data.minValue) value = data.minValue;
464
+ return value;
465
+ }
466
+
467
+ getIncrement(): number {
468
+ let { instance } = this.props;
469
+ let { data } = instance;
470
+ let increment = data.increment || (data.maxValue - data.minValue) * data.incrementPercentage;
471
+ return increment;
472
+ }
473
+ }