cx 26.0.12 → 26.0.14

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 (365) hide show
  1. package/build/charts/ScatterGraph.d.ts +4 -4
  2. package/build/charts/ScatterGraph.js +2 -2
  3. package/build/data/ArrayElementView.spec.d.ts +1 -0
  4. package/build/data/ArrayElementView.spec.js +81 -0
  5. package/build/data/Binding.spec.d.ts +1 -0
  6. package/build/data/Binding.spec.js +61 -0
  7. package/build/data/Expression.spec.d.ts +1 -0
  8. package/build/data/Expression.spec.js +196 -0
  9. package/build/data/Grouper.spec.d.ts +1 -0
  10. package/build/data/Grouper.spec.js +48 -0
  11. package/build/data/Ref.spec.d.ts +1 -0
  12. package/build/data/Ref.spec.js +72 -0
  13. package/build/data/Selector.d.ts +1 -1
  14. package/build/data/Store.spec.d.ts +1 -0
  15. package/build/data/Store.spec.js +19 -0
  16. package/build/data/StoreRef.spec.d.ts +1 -0
  17. package/build/data/StoreRef.spec.js +22 -0
  18. package/build/data/StringTemplate.spec.d.ts +1 -0
  19. package/build/data/StringTemplate.spec.js +112 -0
  20. package/build/data/StructuredSelector.spec.d.ts +1 -0
  21. package/build/data/StructuredSelector.spec.js +102 -0
  22. package/build/data/View.spec.d.ts +1 -0
  23. package/build/data/View.spec.js +44 -0
  24. package/build/data/ZoomIntoPropertyView.spec.d.ts +1 -0
  25. package/build/data/ZoomIntoPropertyView.spec.js +54 -0
  26. package/build/data/comparer.spec.d.ts +1 -0
  27. package/build/data/comparer.spec.js +50 -0
  28. package/build/data/computable.d.ts +3 -6
  29. package/build/data/computable.spec.d.ts +1 -0
  30. package/build/data/computable.spec.js +56 -0
  31. package/build/data/createAccessorModelProxy.d.ts +5 -3
  32. package/build/data/createAccessorModelProxy.spec.d.ts +1 -0
  33. package/build/data/createAccessorModelProxy.spec.js +30 -0
  34. package/build/data/createStructuredSelector.spec.d.ts +1 -0
  35. package/build/data/createStructuredSelector.spec.js +42 -0
  36. package/build/data/diff/diffs.spec.d.ts +1 -0
  37. package/build/data/diff/diffs.spec.js +45 -0
  38. package/build/data/getAccessor.spec.d.ts +1 -0
  39. package/build/data/getAccessor.spec.js +10 -0
  40. package/build/data/getSelector.spec.d.ts +1 -0
  41. package/build/data/getSelector.spec.js +36 -0
  42. package/build/data/ops/append.spec.d.ts +1 -0
  43. package/build/data/ops/append.spec.js +24 -0
  44. package/build/data/ops/filter.spec.d.ts +1 -0
  45. package/build/data/ops/filter.spec.js +25 -0
  46. package/build/data/ops/findTreeNode.d.ts +1 -1
  47. package/build/data/ops/findTreeNode.js +1 -1
  48. package/build/data/ops/findTreeNode.spec.d.ts +1 -0
  49. package/build/data/ops/findTreeNode.spec.js +20 -0
  50. package/build/data/ops/findTreePath.d.ts +1 -1
  51. package/build/data/ops/merge.spec.d.ts +1 -0
  52. package/build/data/ops/merge.spec.js +23 -0
  53. package/build/data/ops/removeTreeNodes.d.ts +1 -1
  54. package/build/data/ops/removeTreeNodes.js +1 -1
  55. package/build/data/ops/removeTreeNodes.spec.d.ts +1 -0
  56. package/build/data/ops/removeTreeNodes.spec.js +35 -0
  57. package/build/data/ops/updateArray.spec.d.ts +1 -0
  58. package/build/data/ops/updateArray.spec.js +33 -0
  59. package/build/data/ops/updateTree.d.ts +1 -1
  60. package/build/data/ops/updateTree.spec.d.ts +1 -0
  61. package/build/data/ops/updateTree.spec.js +44 -0
  62. package/build/hooks/invokeCallback.spec.d.ts +1 -0
  63. package/build/hooks/invokeCallback.spec.js +44 -0
  64. package/build/hooks/resolveCallback.spec.d.ts +1 -0
  65. package/build/hooks/resolveCallback.spec.js +35 -0
  66. package/build/hooks/store.spec.d.ts +1 -0
  67. package/build/hooks/store.spec.js +48 -0
  68. package/build/hooks/useTrigger.spec.d.ts +1 -0
  69. package/build/hooks/useTrigger.spec.js +59 -0
  70. package/build/jsx-runtime.d.ts +10 -10
  71. package/build/jsx-runtime.js +6 -0
  72. package/build/svg/util/Rect.d.ts +1 -1
  73. package/build/ui/ContentResolver.d.ts +16 -6
  74. package/build/ui/Controller.d.ts +7 -0
  75. package/build/ui/Controller.js +2 -1
  76. package/build/ui/Controller.spec.d.ts +1 -0
  77. package/build/ui/Controller.spec.js +247 -0
  78. package/build/ui/Cx.spec.d.ts +1 -0
  79. package/build/ui/Cx.spec.js +153 -0
  80. package/build/ui/DataProxy.spec.d.ts +1 -0
  81. package/build/ui/DataProxy.spec.js +208 -0
  82. package/build/ui/Instance.d.ts +1 -1
  83. package/build/ui/Instance.js +10 -10
  84. package/build/ui/IsolatedScope.spec.d.ts +1 -0
  85. package/build/ui/IsolatedScope.spec.js +42 -0
  86. package/build/ui/Prop.d.ts +12 -1
  87. package/build/ui/PureContainer.spec.d.ts +1 -0
  88. package/build/ui/PureContainer.spec.js +149 -0
  89. package/build/ui/Repeater.d.ts +3 -3
  90. package/build/ui/Repeater.spec.d.ts +1 -0
  91. package/build/ui/Repeater.spec.js +109 -0
  92. package/build/ui/Rescope.spec.d.ts +1 -0
  93. package/build/ui/Rescope.spec.js +134 -0
  94. package/build/ui/Restate.spec.d.ts +1 -0
  95. package/build/ui/Restate.spec.js +257 -0
  96. package/build/ui/Text.d.ts +14 -2
  97. package/build/ui/Text.js +3 -0
  98. package/build/ui/adapter/ArrayAdapter.js +4 -1
  99. package/build/ui/adapter/ArrayAdapter.spec.d.ts +1 -0
  100. package/build/ui/adapter/ArrayAdapter.spec.js +44 -0
  101. package/build/ui/adapter/TreeAdapter.spec.d.ts +1 -0
  102. package/build/ui/adapter/TreeAdapter.spec.js +71 -0
  103. package/build/ui/app/Url.spec.d.ts +1 -0
  104. package/build/ui/app/Url.spec.js +43 -0
  105. package/build/ui/app/startHotAppLoop.js +1 -1
  106. package/build/ui/createFunctionalComponent.d.ts +14 -1
  107. package/build/ui/createFunctionalComponent.js +7 -4
  108. package/build/ui/createFunctionalComponent.spec.d.ts +1 -0
  109. package/build/ui/createFunctionalComponent.spec.js +272 -0
  110. package/build/ui/expr.d.ts +3 -1
  111. package/build/ui/exprHelpers.d.ts +32 -0
  112. package/build/ui/exprHelpers.js +61 -0
  113. package/build/ui/index.d.ts +1 -0
  114. package/build/ui/index.js +1 -0
  115. package/build/ui/layout/ContentPlaceholder.spec.d.ts +1 -0
  116. package/build/ui/layout/ContentPlaceholder.spec.js +333 -0
  117. package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +1 -0
  118. package/build/ui/layout/FirstVisibleChildLayout.spec.js +101 -0
  119. package/build/util/Console.d.ts +1 -0
  120. package/build/util/Console.js +7 -3
  121. package/build/util/Format.spec.d.ts +1 -0
  122. package/build/util/Format.spec.js +58 -0
  123. package/build/util/TraversalStack.spec.d.ts +1 -0
  124. package/build/util/TraversalStack.spec.js +43 -0
  125. package/build/util/date/upperBoundCheck.spec.d.ts +1 -0
  126. package/build/util/date/upperBoundCheck.spec.js +22 -0
  127. package/build/util/getSearchQueryPredicate.spec.d.ts +1 -0
  128. package/build/util/getSearchQueryPredicate.spec.js +33 -0
  129. package/build/util/isValidIdentifierName.spec.d.ts +1 -0
  130. package/build/util/isValidIdentifierName.spec.js +28 -0
  131. package/build/util/routeAppend.spec.d.ts +1 -0
  132. package/build/util/routeAppend.spec.js +14 -0
  133. package/build/widgets/AccessorBindings.spec.d.ts +1 -0
  134. package/build/widgets/AccessorBindings.spec.js +40 -0
  135. package/build/widgets/Button.d.ts +3 -6
  136. package/build/widgets/Button.js +1 -1
  137. package/build/widgets/DocumentTitle.d.ts +2 -0
  138. package/build/widgets/Heading.d.ts +2 -2
  139. package/build/widgets/HtmlElement.d.ts +31 -8
  140. package/build/widgets/HtmlElement.js +7 -9
  141. package/build/widgets/HtmlElement.spec.d.ts +1 -0
  142. package/build/widgets/HtmlElement.spec.js +38 -0
  143. package/build/widgets/Icon.d.ts +3 -13
  144. package/build/widgets/List.d.ts +4 -0
  145. package/build/widgets/ReactElementWrapper.d.ts +29 -0
  146. package/build/widgets/ReactElementWrapper.js +59 -0
  147. package/build/widgets/drag-drop/DragSource.d.ts +3 -3
  148. package/build/widgets/drag-drop/DragSource.js +2 -3
  149. package/build/widgets/drag-drop/DropZone.d.ts +3 -3
  150. package/build/widgets/drag-drop/DropZone.js +2 -3
  151. package/build/widgets/form/Checkbox.d.ts +2 -0
  152. package/build/widgets/form/ColorField.d.ts +2 -0
  153. package/build/widgets/form/DateTimeField.d.ts +2 -0
  154. package/build/widgets/form/Field.d.ts +0 -2
  155. package/build/widgets/form/LabeledContainer.d.ts +9 -8
  156. package/build/widgets/form/LabeledContainer.js +9 -9
  157. package/build/widgets/form/LookupField.d.ts +57 -9
  158. package/build/widgets/form/MonthField.d.ts +2 -0
  159. package/build/widgets/form/NumberField.d.ts +2 -0
  160. package/build/widgets/form/Radio.d.ts +2 -0
  161. package/build/widgets/form/Select.d.ts +2 -0
  162. package/build/widgets/form/Slider.d.ts +3 -0
  163. package/build/widgets/form/Switch.d.ts +2 -0
  164. package/build/widgets/form/TextField.d.ts +34 -0
  165. package/build/widgets/form/TimeList.d.ts +16 -1
  166. package/build/widgets/form/TimeList.js +34 -62
  167. package/build/widgets/form/UploadButton.d.ts +34 -2
  168. package/build/widgets/form/UploadButton.js +3 -1
  169. package/build/widgets/form/ValidationGroup.spec.d.ts +1 -0
  170. package/build/widgets/form/ValidationGroup.spec.js +62 -0
  171. package/build/widgets/form/Validator.d.ts +33 -2
  172. package/build/widgets/form/Validator.js +3 -0
  173. package/build/widgets/grid/Grid.d.ts +9 -9
  174. package/build/widgets/grid/TreeNode.d.ts +6 -0
  175. package/build/widgets/index.d.ts +1 -0
  176. package/build/widgets/index.js +1 -0
  177. package/build/widgets/nav/MenuItem.d.ts +3 -2
  178. package/build/widgets/nav/Route.spec.d.ts +1 -0
  179. package/build/widgets/nav/Route.spec.js +15 -0
  180. package/build/widgets/nav/Scroller.d.ts +4 -6
  181. package/build/widgets/nav/Scroller.js +6 -3
  182. package/build/widgets/nav/Tab.d.ts +2 -2
  183. package/build/widgets/overlay/ContextMenu.d.ts +3 -3
  184. package/build/widgets/overlay/Overlay.d.ts +2 -1
  185. package/build/widgets/overlay/Overlay.js +1 -1
  186. package/build/widgets/overlay/createHotPromiseWindowFactory.js +0 -1
  187. package/build.js +133 -133
  188. package/dist/data.js +2 -2
  189. package/dist/jsx-runtime.js +6 -1
  190. package/dist/manifest.d.ts +1443 -0
  191. package/dist/manifest.js +761 -713
  192. package/dist/ui.js +91 -5
  193. package/dist/util.js +3 -0
  194. package/dist/widgets.js +520 -162
  195. package/package.json +46 -20
  196. package/src/charts/Chart.ts +108 -108
  197. package/src/charts/ScatterGraph.tsx +6 -6
  198. package/src/data/ArrayElementView.ts +90 -90
  199. package/src/data/AugmentedViewBase.ts +88 -88
  200. package/src/data/Binding.ts +104 -104
  201. package/src/data/ExposedRecordView.ts +95 -95
  202. package/src/data/ExposedValueView.ts +89 -89
  203. package/src/data/Expression.spec.ts +229 -229
  204. package/src/data/Expression.ts +233 -233
  205. package/src/data/Grouper.spec.ts +57 -57
  206. package/src/data/Grouper.ts +158 -158
  207. package/src/data/NestedDataView.ts +43 -43
  208. package/src/data/ReadOnlyDataView.ts +39 -39
  209. package/src/data/Ref.ts +104 -104
  210. package/src/data/Selector.ts +10 -10
  211. package/src/data/Store.ts +52 -52
  212. package/src/data/StoreProxy.ts +19 -19
  213. package/src/data/StoreRef.ts +66 -66
  214. package/src/data/StringTemplate.spec.ts +132 -132
  215. package/src/data/StringTemplate.ts +93 -93
  216. package/src/data/StructuredSelector.spec.ts +113 -113
  217. package/src/data/StructuredSelector.ts +146 -146
  218. package/src/data/SubscribableView.ts +63 -63
  219. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  220. package/src/data/ZoomIntoPropertyView.ts +45 -45
  221. package/src/data/computable.spec.ts +87 -62
  222. package/src/data/computable.ts +3 -6
  223. package/src/data/createAccessorModelProxy.spec.tsx +102 -1
  224. package/src/data/createAccessorModelProxy.ts +9 -3
  225. package/src/data/createStructuredSelector.ts +62 -62
  226. package/src/data/getAccessor.spec.ts +11 -11
  227. package/src/data/getAccessor.ts +74 -74
  228. package/src/data/getSelector.spec.ts +43 -43
  229. package/src/data/getSelector.ts +66 -66
  230. package/src/data/ops/filter.spec.ts +35 -35
  231. package/src/data/ops/filter.ts +9 -9
  232. package/src/data/ops/findTreeNode.ts +1 -5
  233. package/src/data/ops/findTreePath.ts +1 -1
  234. package/src/data/ops/merge.ts +13 -13
  235. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  236. package/src/data/ops/removeTreeNodes.ts +2 -2
  237. package/src/data/ops/updateArray.spec.ts +69 -69
  238. package/src/data/ops/updateArray.ts +31 -31
  239. package/src/data/ops/updateTree.ts +1 -1
  240. package/src/data/test-types.ts +7 -7
  241. package/src/hooks/resolveCallback.spec.tsx +30 -7
  242. package/src/hooks/useTrigger.ts +26 -26
  243. package/src/index.scss +6 -6
  244. package/src/jsx-dev-runtime.ts +4 -4
  245. package/src/jsx-runtime.spec.tsx +431 -0
  246. package/src/jsx-runtime.ts +26 -22
  247. package/src/svg/BoundedObject.ts +101 -101
  248. package/src/svg/util/Rect.ts +105 -105
  249. package/src/ui/CSSHelper.ts +17 -17
  250. package/src/ui/ContentResolver.spec.tsx +172 -19
  251. package/src/ui/ContentResolver.ts +16 -8
  252. package/src/ui/Controller.ts +15 -2
  253. package/src/ui/Culture.ts +159 -159
  254. package/src/ui/DataProxy.ts +55 -55
  255. package/src/ui/FocusManager.ts +171 -171
  256. package/src/ui/Instance.ts +866 -868
  257. package/src/ui/Prop.ts +140 -112
  258. package/src/ui/RenderingContext.ts +99 -99
  259. package/src/ui/Repeater.ts +3 -12
  260. package/src/ui/Rescope.ts +49 -49
  261. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  262. package/src/ui/Text.ts +21 -2
  263. package/src/ui/VDOM.ts +34 -34
  264. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  265. package/src/ui/adapter/ArrayAdapter.ts +4 -1
  266. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  267. package/src/ui/adapter/TreeAdapter.ts +185 -185
  268. package/src/ui/app/History.ts +133 -133
  269. package/src/ui/app/Url.spec.ts +50 -50
  270. package/src/ui/app/startHotAppLoop.ts +41 -41
  271. package/src/ui/createFunctionalComponent.spec.tsx +53 -0
  272. package/src/ui/createFunctionalComponent.ts +86 -65
  273. package/src/ui/expr.ts +4 -1
  274. package/src/ui/exprHelpers.spec.ts +379 -0
  275. package/src/ui/exprHelpers.ts +78 -0
  276. package/src/ui/index.ts +47 -46
  277. package/src/ui/layout/Content.ts +30 -30
  278. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +1 -1
  279. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  280. package/src/ui/selection/KeySelection.ts +153 -153
  281. package/src/ui/selection/Selection.ts +128 -128
  282. package/src/util/Console.ts +13 -11
  283. package/src/util/Format.spec.ts +41 -41
  284. package/src/util/Format.ts +267 -267
  285. package/src/util/addEventListenerWithOptions.ts +41 -41
  286. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  287. package/src/util/color/rgbToHsl.ts +35 -35
  288. package/src/util/getActiveElement.ts +4 -4
  289. package/src/util/hasKey.ts +18 -18
  290. package/src/util/index.ts +55 -55
  291. package/src/util/innerTextTrim.ts +10 -10
  292. package/src/util/isArray.ts +3 -3
  293. package/src/util/isDataRecord.ts +5 -5
  294. package/src/util/isDefined.ts +3 -3
  295. package/src/util/isString.ts +3 -3
  296. package/src/widgets/AccessorBindings.spec.tsx +26 -0
  297. package/src/widgets/Button.tsx +5 -17
  298. package/src/widgets/DocumentTitle.ts +95 -92
  299. package/src/widgets/Heading.ts +2 -2
  300. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -0
  301. package/src/widgets/HtmlElement.spec.tsx +20 -12
  302. package/src/widgets/HtmlElement.tsx +77 -23
  303. package/src/widgets/Icon.ts +3 -17
  304. package/src/widgets/List.tsx +6 -0
  305. package/src/widgets/ReactElementWrapper.spec.tsx +452 -0
  306. package/src/widgets/ReactElementWrapper.tsx +108 -0
  307. package/src/widgets/Sandbox.ts +103 -103
  308. package/src/widgets/autoFocus.ts +9 -9
  309. package/src/widgets/cx.ts +63 -63
  310. package/src/widgets/drag-drop/DragSource.tsx +3 -4
  311. package/src/widgets/drag-drop/DropZone.tsx +3 -4
  312. package/src/widgets/form/Checkbox.tsx +3 -0
  313. package/src/widgets/form/ColorField.tsx +3 -0
  314. package/src/widgets/form/DateTimeField.tsx +5 -0
  315. package/src/widgets/form/Field.tsx +0 -3
  316. package/src/widgets/form/Label.tsx +1 -0
  317. package/src/widgets/form/LabeledContainer.ts +22 -26
  318. package/src/widgets/form/LookupField.spec.tsx +93 -0
  319. package/src/widgets/form/LookupField.tsx +104 -9
  320. package/src/widgets/form/MonthField.tsx +5 -0
  321. package/src/widgets/form/NumberField.tsx +3 -0
  322. package/src/widgets/form/Radio.tsx +5 -0
  323. package/src/widgets/form/Select.tsx +5 -0
  324. package/src/widgets/form/Slider.tsx +4 -0
  325. package/src/widgets/form/Switch.tsx +3 -0
  326. package/src/widgets/form/TextField.tsx +62 -0
  327. package/src/widgets/form/TimeList.tsx +84 -73
  328. package/src/widgets/form/UploadButton.tsx +53 -2
  329. package/src/widgets/form/Validator.ts +40 -3
  330. package/src/widgets/grid/Grid.tsx +9 -12
  331. package/src/widgets/grid/GridCell.ts +143 -143
  332. package/src/widgets/grid/TreeNode.tsx +9 -0
  333. package/src/widgets/icons/calendar.tsx +17 -17
  334. package/src/widgets/icons/check.tsx +13 -13
  335. package/src/widgets/icons/clear.tsx +15 -15
  336. package/src/widgets/icons/close.tsx +20 -20
  337. package/src/widgets/icons/cx.tsx +38 -38
  338. package/src/widgets/icons/drop-down.tsx +15 -15
  339. package/src/widgets/icons/file.tsx +13 -13
  340. package/src/widgets/icons/folder-open.tsx +15 -15
  341. package/src/widgets/icons/folder.tsx +13 -13
  342. package/src/widgets/icons/forward.tsx +22 -22
  343. package/src/widgets/icons/loading.tsx +24 -24
  344. package/src/widgets/icons/menu.tsx +17 -17
  345. package/src/widgets/icons/pixel-picker.tsx +18 -18
  346. package/src/widgets/icons/search.tsx +13 -13
  347. package/src/widgets/icons/sort-asc.tsx +14 -14
  348. package/src/widgets/icons/square.tsx +18 -18
  349. package/src/widgets/index.ts +1 -0
  350. package/src/widgets/nav/MenuItem.tsx +3 -2
  351. package/src/widgets/nav/Route.ts +142 -142
  352. package/src/widgets/nav/Scroller.tsx +8 -9
  353. package/src/widgets/nav/Tab.ts +2 -2
  354. package/src/widgets/overlay/ContextMenu.ts +42 -42
  355. package/src/widgets/overlay/Dropdown.tsx +762 -762
  356. package/src/widgets/overlay/MsgBox.tsx +141 -141
  357. package/src/widgets/overlay/Overlay.tsx +5 -4
  358. package/src/widgets/overlay/Toast.ts +111 -111
  359. package/src/widgets/overlay/Window.tsx +299 -299
  360. package/src/widgets/overlay/alerts.ts +46 -46
  361. package/src/widgets/overlay/captureMouse.ts +195 -195
  362. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +0 -1
  363. package/src/widgets/overlay/index.d.ts +11 -11
  364. package/src/widgets/overlay/index.ts +11 -11
  365. package/src/widgets/overlay/tooltip-ops.ts +173 -173
@@ -1,101 +1,101 @@
1
- import { Instance } from "./../ui/Instance";
2
- import { StyledContainerConfig, ContainerBase } from "../ui/Container";
3
- import { RenderingContext } from "../ui/RenderingContext";
4
- import { Prop } from "../ui/Prop";
5
- import { IRect, Rect } from "./util/Rect";
6
-
7
- /** Typed context interface for SVG/layout-related context properties */
8
- export interface SvgRenderingContext extends RenderingContext {
9
- parentRect?: Rect;
10
- inSvg?: boolean;
11
- addClipRect?: (rect: Rect) => string;
12
- }
13
-
14
- export interface BoundedObjectConfig extends StyledContainerConfig {
15
- /**
16
- * Anchor defines how child bounds are tied to the parent. Zero aligns with the top/left edge.
17
- * One aligns with the bottom/right edge. See Svg for more information.
18
- */
19
- anchors?: Prop<string | number | IRect>;
20
-
21
- /** Move boundaries specified by the offset. See Svg for more information. */
22
- offset?: Prop<string | number | IRect>;
23
-
24
- /** Apply margin to the given boundaries. See Svg for more information. */
25
- margin?: Prop<string | number | IRect>;
26
-
27
- /** Padding to be applied to the boundaries rectangle before passing to the children. */
28
- padding?: Prop<string | number | IRect>;
29
- }
30
-
31
- export interface BoundedObjectInstance extends Instance {
32
- parentRect?: any;
33
- }
34
-
35
- export class BoundedObject<
36
- Config extends BoundedObjectConfig = BoundedObjectConfig,
37
- InstanceType extends BoundedObjectInstance = BoundedObjectInstance,
38
- > extends ContainerBase<Config, InstanceType> {
39
- declare anchors: any;
40
- declare margin: any;
41
- declare offset: any;
42
- declare padding: any;
43
-
44
- declareData(...args: any[]) {
45
- return super.declareData(
46
- {
47
- anchors: undefined,
48
- offset: undefined,
49
- margin: undefined,
50
- padding: undefined,
51
- },
52
- ...args,
53
- );
54
- }
55
-
56
- prepareData(context: RenderingContext, instance: InstanceType) {
57
- super.prepareData(context, instance);
58
- var { data } = instance;
59
- data.anchors = Rect.convert(data.anchors);
60
- data.offset = Rect.convert(data.offset);
61
- data.margin = Rect.convertMargin(data.margin);
62
- data.padding = Rect.convertMargin(data.padding);
63
- }
64
-
65
- calculateBounds(context: SvgRenderingContext, instance: InstanceType) {
66
- var { data } = instance;
67
- return Rect.add(Rect.add(Rect.multiply(instance.parentRect, data.anchors), data.offset), data.margin);
68
- }
69
-
70
- prepareBounds(context: SvgRenderingContext, instance: InstanceType) {
71
- var { data } = instance;
72
- if (
73
- instance.shouldUpdate ||
74
- !instance.cached.parentRect ||
75
- !instance.cached.parentRect.isEqual(context.parentRect) ||
76
- !data.bounds
77
- ) {
78
- if (!context.parentRect) throw new Error("Parent bounds were not provided through the context.");
79
- instance.parentRect = context.parentRect;
80
- instance.cache("parentRect", context.parentRect);
81
- instance.markShouldUpdate(context);
82
- data.bounds = this.calculateBounds(context, instance);
83
- data.childrenBounds = Rect.add(data.bounds, data.padding);
84
- }
85
- }
86
-
87
- prepare(context: SvgRenderingContext, instance: InstanceType) {
88
- this.prepareBounds(context, instance);
89
- context.push("parentRect", instance.data.childrenBounds);
90
- }
91
-
92
- prepareCleanup(context: SvgRenderingContext, instance: InstanceType) {
93
- context.pop("parentRect");
94
- }
95
- }
96
-
97
- BoundedObject.prototype.anchors = 0;
98
- BoundedObject.prototype.margin = 0;
99
- BoundedObject.prototype.offset = 0;
100
- BoundedObject.prototype.padding = 0;
101
- BoundedObject.prototype.styled = true;
1
+ import { Instance } from "./../ui/Instance";
2
+ import { StyledContainerConfig, ContainerBase } from "../ui/Container";
3
+ import { RenderingContext } from "../ui/RenderingContext";
4
+ import { Prop } from "../ui/Prop";
5
+ import { IRect, Rect } from "./util/Rect";
6
+
7
+ /** Typed context interface for SVG/layout-related context properties */
8
+ export interface SvgRenderingContext extends RenderingContext {
9
+ parentRect?: Rect;
10
+ inSvg?: boolean;
11
+ addClipRect?: (rect: Rect) => string;
12
+ }
13
+
14
+ export interface BoundedObjectConfig extends StyledContainerConfig {
15
+ /**
16
+ * Anchor defines how child bounds are tied to the parent. Zero aligns with the top/left edge.
17
+ * One aligns with the bottom/right edge. See Svg for more information.
18
+ */
19
+ anchors?: Prop<string | number | IRect>;
20
+
21
+ /** Move boundaries specified by the offset. See Svg for more information. */
22
+ offset?: Prop<string | number | IRect>;
23
+
24
+ /** Apply margin to the given boundaries. See Svg for more information. */
25
+ margin?: Prop<string | number | IRect>;
26
+
27
+ /** Padding to be applied to the boundaries rectangle before passing to the children. */
28
+ padding?: Prop<string | number | IRect>;
29
+ }
30
+
31
+ export interface BoundedObjectInstance extends Instance {
32
+ parentRect?: any;
33
+ }
34
+
35
+ export class BoundedObject<
36
+ Config extends BoundedObjectConfig = BoundedObjectConfig,
37
+ InstanceType extends BoundedObjectInstance = BoundedObjectInstance,
38
+ > extends ContainerBase<Config, InstanceType> {
39
+ declare anchors: any;
40
+ declare margin: any;
41
+ declare offset: any;
42
+ declare padding: any;
43
+
44
+ declareData(...args: any[]) {
45
+ return super.declareData(
46
+ {
47
+ anchors: undefined,
48
+ offset: undefined,
49
+ margin: undefined,
50
+ padding: undefined,
51
+ },
52
+ ...args,
53
+ );
54
+ }
55
+
56
+ prepareData(context: RenderingContext, instance: InstanceType) {
57
+ super.prepareData(context, instance);
58
+ var { data } = instance;
59
+ data.anchors = Rect.convert(data.anchors);
60
+ data.offset = Rect.convert(data.offset);
61
+ data.margin = Rect.convertMargin(data.margin);
62
+ data.padding = Rect.convertMargin(data.padding);
63
+ }
64
+
65
+ calculateBounds(context: SvgRenderingContext, instance: InstanceType) {
66
+ var { data } = instance;
67
+ return Rect.add(Rect.add(Rect.multiply(instance.parentRect, data.anchors), data.offset), data.margin);
68
+ }
69
+
70
+ prepareBounds(context: SvgRenderingContext, instance: InstanceType) {
71
+ var { data } = instance;
72
+ if (
73
+ instance.shouldUpdate ||
74
+ !instance.cached.parentRect ||
75
+ !instance.cached.parentRect.isEqual(context.parentRect) ||
76
+ !data.bounds
77
+ ) {
78
+ if (!context.parentRect) throw new Error("Parent bounds were not provided through the context.");
79
+ instance.parentRect = context.parentRect;
80
+ instance.cache("parentRect", context.parentRect);
81
+ instance.markShouldUpdate(context);
82
+ data.bounds = this.calculateBounds(context, instance);
83
+ data.childrenBounds = Rect.add(data.bounds, data.padding);
84
+ }
85
+ }
86
+
87
+ prepare(context: SvgRenderingContext, instance: InstanceType) {
88
+ this.prepareBounds(context, instance);
89
+ context.push("parentRect", instance.data.childrenBounds);
90
+ }
91
+
92
+ prepareCleanup(context: SvgRenderingContext, instance: InstanceType) {
93
+ context.pop("parentRect");
94
+ }
95
+ }
96
+
97
+ BoundedObject.prototype.anchors = 0;
98
+ BoundedObject.prototype.margin = 0;
99
+ BoundedObject.prototype.offset = 0;
100
+ BoundedObject.prototype.padding = 0;
101
+ BoundedObject.prototype.styled = true;
@@ -1,105 +1,105 @@
1
- import { isNumber } from "../../util/isNumber";
2
- import { isArray } from "../../util/isArray";
3
-
4
- type RectMargin = string | Rect | Array<string | number>;
5
-
6
- export interface IRect {
7
- l: number;
8
- r: number;
9
- t: number;
10
- b: number;
11
- }
12
-
13
- export class Rect implements IRect {
14
- isRect: boolean = true;
15
- l: number = 0; //left;
16
- r: number = 0; //right
17
- t: number = 0; //top
18
- b: number = 0; //bottom
19
-
20
- constructor(config?: { t?: number; r?: number; b?: number; l?: number }) {
21
- Object.assign(this, config);
22
- }
23
-
24
- width(): number {
25
- return this.r - this.l;
26
- }
27
-
28
- height(): number {
29
- return this.b - this.t;
30
- }
31
-
32
- valid(): boolean {
33
- return this.r > this.l && this.b > this.t;
34
- }
35
-
36
- makeValid(): Rect {
37
- return new Rect({
38
- l: Math.min(this.l, this.r),
39
- r: Math.max(this.l, this.r),
40
- t: Math.min(this.t, this.b),
41
- b: Math.max(this.t, this.b),
42
- });
43
- }
44
-
45
- isEqual(r: Rect): boolean {
46
- if (!r || !r.isRect) return false;
47
-
48
- return r.l == this.l && r.r == this.r && r.t == this.t && r.b == this.b;
49
- }
50
-
51
- static add(a: Rect, b: Rect): Rect {
52
- return new Rect({
53
- l: a.l + b.l,
54
- t: a.t + b.t,
55
- r: a.r + b.r,
56
- b: a.b + b.b,
57
- });
58
- }
59
-
60
- static multiply(a: Rect, b: Rect): Rect {
61
- return new Rect({
62
- l: a.l + (a.r - a.l) * b.l,
63
- r: a.l + (a.r - a.l) * b.r,
64
- t: a.t + (a.b - a.t) * b.t,
65
- b: a.t + (a.b - a.t) * b.b,
66
- });
67
- }
68
-
69
- static margin(r: Rect, m?: RectMargin): Rect {
70
- var mr = Rect.convertMargin(m);
71
- return Rect.add(r, mr);
72
- }
73
-
74
- static convertMargin(m?: RectMargin): Rect {
75
- if (!m) return new Rect();
76
-
77
- if ((m as any).isRect) return m as Rect;
78
-
79
- if (isNumber(m)) return new Rect({ l: m as number, t: m as number, r: -(m as number), b: -(m as number) });
80
-
81
- var mr = Rect.convert(m);
82
- mr.b = -mr.b;
83
- mr.r = -mr.r;
84
- return mr;
85
- }
86
-
87
- static convert(r?: RectMargin | number): Rect {
88
- if (!r) return new Rect({ l: 0, r: 0, t: 0, b: 0 });
89
-
90
- if ((r as any).isRect) return r as Rect;
91
-
92
- if (typeof r === "string") r = r.split(" ");
93
-
94
- if (isArray(r)) {
95
- return new Rect({
96
- t: parseFloat(r[0] as any),
97
- r: parseFloat(r[1] as any),
98
- b: parseFloat(r[2] as any),
99
- l: parseFloat(r[3] as any),
100
- });
101
- }
102
-
103
- return new Rect(r as any);
104
- }
105
- }
1
+ import { isNumber } from "../../util/isNumber";
2
+ import { isArray } from "../../util/isArray";
3
+
4
+ type RectMargin = string | Rect | Array<string | number>;
5
+
6
+ export interface IRect {
7
+ l: number;
8
+ r: number;
9
+ t: number;
10
+ b: number;
11
+ }
12
+
13
+ export class Rect implements IRect {
14
+ isRect: boolean = true;
15
+ l: number = 0; //left;
16
+ r: number = 0; //right
17
+ t: number = 0; //top
18
+ b: number = 0; //bottom
19
+
20
+ constructor(config?: { t?: number; r?: number; b?: number; l?: number }) {
21
+ Object.assign(this, config);
22
+ }
23
+
24
+ width(): number {
25
+ return this.r - this.l;
26
+ }
27
+
28
+ height(): number {
29
+ return this.b - this.t;
30
+ }
31
+
32
+ valid(): boolean {
33
+ return this.r > this.l && this.b > this.t;
34
+ }
35
+
36
+ makeValid(): Rect {
37
+ return new Rect({
38
+ l: Math.min(this.l, this.r),
39
+ r: Math.max(this.l, this.r),
40
+ t: Math.min(this.t, this.b),
41
+ b: Math.max(this.t, this.b),
42
+ });
43
+ }
44
+
45
+ isEqual(r?: Rect): boolean {
46
+ if (!r || !r.isRect) return false;
47
+
48
+ return r.l == this.l && r.r == this.r && r.t == this.t && r.b == this.b;
49
+ }
50
+
51
+ static add(a: Rect, b: Rect): Rect {
52
+ return new Rect({
53
+ l: a.l + b.l,
54
+ t: a.t + b.t,
55
+ r: a.r + b.r,
56
+ b: a.b + b.b,
57
+ });
58
+ }
59
+
60
+ static multiply(a: Rect, b: Rect): Rect {
61
+ return new Rect({
62
+ l: a.l + (a.r - a.l) * b.l,
63
+ r: a.l + (a.r - a.l) * b.r,
64
+ t: a.t + (a.b - a.t) * b.t,
65
+ b: a.t + (a.b - a.t) * b.b,
66
+ });
67
+ }
68
+
69
+ static margin(r: Rect, m?: RectMargin): Rect {
70
+ var mr = Rect.convertMargin(m);
71
+ return Rect.add(r, mr);
72
+ }
73
+
74
+ static convertMargin(m?: RectMargin): Rect {
75
+ if (!m) return new Rect();
76
+
77
+ if ((m as any).isRect) return m as Rect;
78
+
79
+ if (isNumber(m)) return new Rect({ l: m as number, t: m as number, r: -(m as number), b: -(m as number) });
80
+
81
+ var mr = Rect.convert(m);
82
+ mr.b = -mr.b;
83
+ mr.r = -mr.r;
84
+ return mr;
85
+ }
86
+
87
+ static convert(r?: RectMargin | number): Rect {
88
+ if (!r) return new Rect({ l: 0, r: 0, t: 0, b: 0 });
89
+
90
+ if ((r as any).isRect) return r as Rect;
91
+
92
+ if (typeof r === "string") r = r.split(" ");
93
+
94
+ if (isArray(r)) {
95
+ return new Rect({
96
+ t: parseFloat(r[0] as any),
97
+ r: parseFloat(r[1] as any),
98
+ b: parseFloat(r[2] as any),
99
+ l: parseFloat(r[3] as any),
100
+ });
101
+ }
102
+
103
+ return new Rect(r as any);
104
+ }
105
+ }
@@ -1,17 +1,17 @@
1
- var cssHelperCache: { [key: string]: any } = {};
2
-
3
- export class CSSHelper {
4
- static get(code: string): any {
5
- var helper = cssHelperCache[code];
6
- if (!helper) throw new Error(`Unknown CSS helper '${code}'.`);
7
- return helper;
8
- }
9
-
10
- static register(code: string, helper: any): void {
11
- cssHelperCache[code] = helper;
12
- }
13
-
14
- static alias(code: string, helper: any): void {
15
- cssHelperCache[code] = helper;
16
- }
17
- }
1
+ var cssHelperCache: { [key: string]: any } = {};
2
+
3
+ export class CSSHelper {
4
+ static get(code: string): any {
5
+ var helper = cssHelperCache[code];
6
+ if (!helper) throw new Error(`Unknown CSS helper '${code}'.`);
7
+ return helper;
8
+ }
9
+
10
+ static register(code: string, helper: any): void {
11
+ cssHelperCache[code] = helper;
12
+ }
13
+
14
+ static alias(code: string, helper: any): void {
15
+ cssHelperCache[code] = helper;
16
+ }
17
+ }
@@ -4,6 +4,8 @@ import { createTestRenderer } from "../util/test/createTestRenderer";
4
4
  import assert from "assert";
5
5
  import { bind } from "./bind";
6
6
  import { createAccessorModelProxy } from "../data/createAccessorModelProxy";
7
+ import { Prop } from "./Prop";
8
+ import { stringTemplate } from "../data/StringTemplate";
7
9
 
8
10
  interface TestModel {
9
11
  user: {
@@ -18,10 +20,7 @@ describe("ContentResolver", () => {
18
20
  let widget = (
19
21
  <cx>
20
22
  <div>
21
- <ContentResolver
22
- params={{ name: bind("name") }}
23
- onResolve={(params) => <span text={params.name} />}
24
- />
23
+ <ContentResolver params={{ name: bind("name") }} onResolve={(params) => <span text={params.name} />} />
25
24
  </div>
26
25
  </cx>
27
26
  );
@@ -177,11 +176,7 @@ describe("ContentResolver", () => {
177
176
  let widget = (
178
177
  <cx>
179
178
  <div>
180
- <ContentResolver
181
- mode="prepend"
182
- params={{ show: true }}
183
- onResolve={() => <span>Prepended</span>}
184
- >
179
+ <ContentResolver mode="prepend" params={{ show: true }} onResolve={() => <span>Prepended</span>}>
185
180
  <span>Original</span>
186
181
  </ContentResolver>
187
182
  </div>
@@ -215,11 +210,7 @@ describe("ContentResolver", () => {
215
210
  let widget = (
216
211
  <cx>
217
212
  <div>
218
- <ContentResolver
219
- mode="append"
220
- params={{ show: true }}
221
- onResolve={() => <span>Appended</span>}
222
- >
213
+ <ContentResolver mode="append" params={{ show: true }} onResolve={() => <span>Appended</span>}>
223
214
  <span>Original</span>
224
215
  </ContentResolver>
225
216
  </div>
@@ -354,11 +345,7 @@ describe("ContentResolver", () => {
354
345
  const name: string = params.name;
355
346
  const age: number = params.age;
356
347
  const active: boolean = params.active;
357
- return (
358
- <span
359
- text={`${name} is ${age} years old and ${active ? "active" : "inactive"}`}
360
- />
361
- );
348
+ return <span text={`${name} is ${age} years old and ${active ? "active" : "inactive"}`} />;
362
349
  }}
363
350
  />
364
351
  </div>
@@ -427,4 +414,170 @@ describe("ContentResolver", () => {
427
414
  ],
428
415
  });
429
416
  });
417
+
418
+ it("supports simple Prop params (non-structured)", () => {
419
+ const model = createAccessorModelProxy<TestModel>();
420
+
421
+ // Test using a single AccessorChain as params instead of an object
422
+ let widget = (
423
+ <cx>
424
+ <div>
425
+ <ContentResolver
426
+ params={model.user.name}
427
+ onResolve={(name) => {
428
+ // name should be typed as string (from AccessorChain<string>)
429
+ const typedName: string = name;
430
+ return <span text={`Hello, ${typedName}!`} />;
431
+ }}
432
+ />
433
+ </div>
434
+ </cx>
435
+ );
436
+
437
+ let store = new Store({
438
+ data: {
439
+ user: {
440
+ name: "Alice",
441
+ age: 25,
442
+ active: true,
443
+ },
444
+ },
445
+ });
446
+
447
+ const component = createTestRenderer(store, widget);
448
+
449
+ let tree = component.toJSON();
450
+ assert.deepEqual(tree, {
451
+ type: "div",
452
+ props: {},
453
+ children: [
454
+ {
455
+ type: "span",
456
+ props: {},
457
+ children: ["Hello, Alice!"],
458
+ },
459
+ ],
460
+ });
461
+ });
462
+
463
+ it("supports simple bind() as params", () => {
464
+ let widget = (
465
+ <cx>
466
+ <div>
467
+ <ContentResolver
468
+ params={bind("count")}
469
+ onResolve={(count) => {
470
+ return <span text={`Count: ${count}`} />;
471
+ }}
472
+ />
473
+ </div>
474
+ </cx>
475
+ );
476
+
477
+ let store = new Store({
478
+ data: {
479
+ count: 42,
480
+ },
481
+ });
482
+
483
+ const component = createTestRenderer(store, widget);
484
+
485
+ let tree = component.toJSON();
486
+ assert.deepEqual(tree, {
487
+ type: "div",
488
+ props: {},
489
+ children: [
490
+ {
491
+ type: "span",
492
+ props: {},
493
+ children: ["Count: 42"],
494
+ },
495
+ ],
496
+ });
497
+ });
498
+
499
+ it("resolves Selector<string> | null to string | null", () => {
500
+ const text: string | null = "Hello {user.name}";
501
+
502
+ let widget = (
503
+ <cx>
504
+ <div>
505
+ <ContentResolver
506
+ params={{
507
+ text: text ? stringTemplate(text) : null,
508
+ }}
509
+ onResolve={(params) => {
510
+ // params.text should be string | null
511
+ const typedText: string | null = params.text;
512
+ // @ts-expect-error - params.text should not be 'any' or broader type
513
+ const shouldFail: number = params.text;
514
+ return <span text={typedText ?? "no text"} />;
515
+ }}
516
+ />
517
+ </div>
518
+ </cx>
519
+ );
520
+
521
+ let store = new Store({
522
+ data: {
523
+ user: { name: "World", age: 30, active: true },
524
+ },
525
+ });
526
+
527
+ const component = createTestRenderer(store, widget);
528
+ let tree = component.toJSON();
529
+ assert.deepEqual(tree, {
530
+ type: "div",
531
+ props: {},
532
+ children: [{ type: "span", props: {}, children: ["Hello World"] }],
533
+ });
534
+ });
535
+
536
+ it("resolves Prop<string> to string (not any)", () => {
537
+ const model = createAccessorModelProxy<TestModel>();
538
+
539
+ // When params is typed as Prop<string>, onResolve should receive string (not any)
540
+ // This tests that the union type Prop<T> correctly extracts T
541
+ const typedParam: Prop<string> = model.user.name;
542
+
543
+ let widget = (
544
+ <cx>
545
+ <div>
546
+ <ContentResolver
547
+ params={typedParam}
548
+ onResolve={(name) => {
549
+ // name should be typed as string, not any
550
+ const typedName: string = name;
551
+ return <span text={`Hello, ${typedName}!`} />;
552
+ }}
553
+ />
554
+ </div>
555
+ </cx>
556
+ );
557
+
558
+ let store = new Store({
559
+ data: {
560
+ user: {
561
+ name: "Bob",
562
+ age: 35,
563
+ active: false,
564
+ },
565
+ },
566
+ });
567
+
568
+ const component = createTestRenderer(store, widget);
569
+
570
+ let tree = component.toJSON();
571
+ assert.deepEqual(tree, {
572
+ type: "div",
573
+ props: {},
574
+ children: [
575
+ {
576
+ type: "span",
577
+ props: {},
578
+ children: ["Hello, Bob!"],
579
+ },
580
+ ],
581
+ });
582
+ });
430
583
  });