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
@@ -2,16 +2,63 @@
2
2
 
3
3
  import { Widget, VDOM } from "../../ui/Widget";
4
4
  import { Icon } from "../Icon";
5
- import { Field, FieldInstance } from "./Field";
5
+ import { Field, FieldConfig, FieldInstance } from "./Field";
6
6
  import { Url } from "../../ui/app/Url";
7
7
  import { Localization } from "../../ui/Localization";
8
8
  import type { RenderingContext } from "../../ui/RenderingContext";
9
9
  import type { Instance } from "../../ui/Instance";
10
10
  import { isNonEmptyArray } from "../../util/isNonEmptyArray";
11
+ import { BooleanProp, StringProp } from "../../ui/Prop";
11
12
 
12
13
  //TODO: Implement UploadStatus which will enable canceling
13
14
 
14
- export class UploadButton extends Field {
15
+ export interface UploadButtonConfig extends FieldConfig {
16
+ /** Set to `true` to allow multiple file selection. Default is `false`. */
17
+ multiple?: boolean;
18
+
19
+ /** HTTP method used for upload. Default is `POST`. */
20
+ method?: string;
21
+
22
+ /** Set to `true` to abort uploads when the component is destroyed. Default is `false`. */
23
+ abortOnDestroy?: boolean;
24
+
25
+ /** Text displayed while upload is in progress. */
26
+ uploadInProgressText?: string;
27
+
28
+ /** URL to upload files to. */
29
+ url?: StringProp;
30
+
31
+ /** Text displayed on the button. */
32
+ text?: StringProp;
33
+
34
+ /** Name or configuration of the icon to be displayed on the button. */
35
+ icon?: StringProp;
36
+
37
+ /** File types accepted for upload. E.g. `image/*`, `.pdf`, etc. */
38
+ accept?: StringProp;
39
+
40
+ /** Base CSS class to be applied to the button. Defaults to `uploadbutton`. */
41
+ baseClass?: string;
42
+
43
+ /** Callback to resolve the upload URL for each file. */
44
+ onResolveUrl?: string | ((file: File, instance: Instance) => string | Promise<string>);
45
+
46
+ /** Callback invoked before upload starts. Return `false` to cancel the upload. */
47
+ onUploadStarting?:
48
+ | string
49
+ | ((xhr: XMLHttpRequest, instance: Instance, file: File, formData: FormData) => boolean | Promise<boolean>);
50
+
51
+ /** Callback invoked when upload completes successfully. */
52
+ onUploadComplete?: string | ((xhr: XMLHttpRequest, instance: Instance, file: File, formData: FormData) => void);
53
+
54
+ /** Callback invoked to report upload progress. */
55
+ onUploadProgress?: string | ((event: ProgressEvent, instance: Instance, file: File, formData: FormData) => void);
56
+
57
+ /** Callback invoked when an upload error occurs. */
58
+ onUploadError?: string | ((error: unknown, instance: Instance, file: File, formData: FormData) => void);
59
+ }
60
+
61
+ export class UploadButton extends Field<UploadButtonConfig> {
15
62
  declare public multiple: boolean;
16
63
  declare public method: string;
17
64
  declare public abortOnDestroy: boolean;
@@ -28,6 +75,10 @@ export class UploadButton extends Field {
28
75
  | ((event: ProgressEvent, instance: Instance, file: File, formData: FormData) => void);
29
76
  declare public onUploadError?: string | ((error: unknown, instance: Instance, file: File, formData: FormData) => void);
30
77
 
78
+ constructor(config?: UploadButtonConfig) {
79
+ super(config);
80
+ }
81
+
31
82
  declareData(...args: Record<string, unknown>[]): void {
32
83
  super.declareData(
33
84
  {
@@ -1,10 +1,47 @@
1
- import { Field } from "./Field";
1
+ import { Field, FieldConfig } from "./Field";
2
2
  import type { RenderingContext } from "../../ui/RenderingContext";
3
3
  import type { Instance } from "../../ui/Instance";
4
+ import type { StructuredProp, ResolvePropType } from "../../ui/Prop";
4
5
 
5
- export class Validator extends Field {
6
+ /**
7
+ * Configuration for Validator widget.
8
+ *
9
+ * The value type parameter enables type inference for the onValidate callback:
10
+ * - Literal values preserve their types
11
+ * - AccessorChain<T> resolves to T
12
+ * - Bind/Tpl/Expr resolve to any
13
+ * - Structured props (objects) have each property resolved individually
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * <Validator
18
+ * value={{
19
+ * password: model.user.password,
20
+ * confirmPassword: model.user.confirmPassword
21
+ * }}
22
+ * onValidate={(value) => {
23
+ * if (value.password !== value.confirmPassword)
24
+ * return "Passwords do not match";
25
+ * }}
26
+ * />
27
+ * ```
28
+ */
29
+ export interface ValidatorConfig<V = StructuredProp> extends FieldConfig {
30
+ /** The value to be validated. Can be a structured object with multiple fields. */
31
+ value?: V;
32
+
33
+ /** Custom validation function. */
34
+ onValidate?:
35
+ | string
36
+ | ((value: ResolvePropType<V>, instance: Instance, validationParams: Record<string, unknown>) => unknown);
37
+ }
38
+
39
+ export class Validator<V = StructuredProp> extends Field<ValidatorConfig<V>> {
40
+ constructor(config?: ValidatorConfig<V>) {
41
+ super(config);
42
+ }
6
43
  declareData(...args: Record<string, unknown>[]): void {
7
- return super.declareData(...args, {
44
+ return super.declareData(...args, {
8
45
  value: {
9
46
  structured: true,
10
47
  },
@@ -76,9 +76,9 @@ import { Create, CreateConfig } from "../../util";
76
76
  import type { TreeAdapter } from "../../ui/adapter/TreeAdapter";
77
77
  export { GridRowConfig };
78
78
 
79
- type FetchRecordsResult<T> = T[] | { records: T[]; lastPage?: boolean; totalRecordCount?: number };
79
+ export type GridFetchRecordsResult<T> = T[] | { records: T[]; lastPage?: boolean; totalRecordCount?: number };
80
80
 
81
- interface MappedGridRecord<T = any> extends DataAdapterRecord<T> {
81
+ export interface MappedGridRecord<T = any> extends DataAdapterRecord<T> {
82
82
  row?: GridRowInstance;
83
83
  vdom?: any;
84
84
  fixedVdom?: any;
@@ -87,7 +87,7 @@ interface MappedGridRecord<T = any> extends DataAdapterRecord<T> {
87
87
  group?: any;
88
88
  }
89
89
 
90
- interface GridDragEvent<T> extends DragEvent {
90
+ export interface GridDragEvent<T> extends DragEvent {
91
91
  target: {
92
92
  recordBefore?: MappedGridRecord<T>;
93
93
  recordAfter?: MappedGridRecord<T>;
@@ -97,14 +97,14 @@ interface GridDragEvent<T> extends DragEvent {
97
97
  };
98
98
  }
99
99
 
100
- interface GridRowDragEvent<T> extends DragEvent {
100
+ export interface GridRowDragEvent<T> extends DragEvent {
101
101
  target: {
102
102
  record: MappedGridRecord<T>;
103
103
  index: number;
104
104
  };
105
105
  }
106
106
 
107
- interface GridColumnDropEvent extends DragEvent {
107
+ export interface GridColumnDropEvent extends DragEvent {
108
108
  target: {
109
109
  grid: any;
110
110
  instance: Instance;
@@ -132,7 +132,7 @@ interface GridMoveCursorOptions {
132
132
  cancelEdit?: boolean;
133
133
  }
134
134
 
135
- interface GridGroupingKey {
135
+ export interface GridGroupingKey {
136
136
  [key: string]:
137
137
  | Prop<any>
138
138
  | {
@@ -149,9 +149,9 @@ interface GroupingResult<T> {
149
149
  records: MappedGridRecord<T>[];
150
150
  }
151
151
 
152
- type GridColumnAlignment = "left" | "right" | "center";
152
+ export type GridColumnAlignment = "left" | "right" | "center";
153
153
 
154
- interface GridGroupingConfig<T> {
154
+ export interface GridGroupingConfig<T> {
155
155
  key: GridGroupingKey;
156
156
  aggregates?: StructuredProp;
157
157
  showCaption?: boolean;
@@ -163,9 +163,6 @@ interface GridGroupingConfig<T> {
163
163
  comparer?: (a: GroupingResult<T>, b: GroupingResult<T>) => number;
164
164
  }
165
165
 
166
- // TODO: Check Column config
167
- // Props are in order based on docs
168
-
169
166
  export interface GridColumnHeaderConfig {
170
167
  text?: StringProp;
171
168
  colSpan?: NumberProp;
@@ -422,7 +419,7 @@ export interface GridConfig<T = any> extends StyledContainerConfig {
422
419
  sortDirection?: string;
423
420
  },
424
421
  instance?: Instance,
425
- ) => FetchRecordsResult<T> | Promise<FetchRecordsResult<T>>;
422
+ ) => GridFetchRecordsResult<T> | Promise<GridFetchRecordsResult<T>>;
426
423
 
427
424
  /** Callback function to be executed when a row is double-clicked. */
428
425
  onRowDoubleClick?: string | ((e: React.SyntheticEvent<any>, instance: Instance) => void);
@@ -1,143 +1,143 @@
1
- import { StyledContainerBase, StyledContainerConfig } from "../../ui";
2
- import { Format } from "../../ui/Format";
3
- import { Instance } from "../../ui/Instance";
4
- import { BooleanProp, NumberProp, Prop, StringProp } from "../../ui/Prop";
5
- import { RenderingContext } from "../../ui/RenderingContext";
6
- import { isUndefined } from "../../util/isUndefined";
7
-
8
- export interface GridCellConfig extends StyledContainerConfig {
9
- /** Selector used to obtain the value that should be displayed inside the cell. Not required if `field` is used. */
10
- value?: StringProp | NumberProp;
11
-
12
- /** Selector used to obtain the weight of the cell in aggregate operations, such as weighted averages. */
13
- weight?: Prop<any>;
14
-
15
- /** Add default padding to grid cell. */
16
- pad?: BooleanProp;
17
-
18
- /** Format specifier used to convert the value into a string. */
19
- format?: StringProp;
20
-
21
- /** Name of the field that holds the value to be displayed. */
22
- field?: string;
23
-
24
- /** Record alias. Default is `$record`. */
25
- recordName?: string;
26
-
27
- /** Record alias. Default is `$record`. */
28
- recordAlias?: string;
29
-
30
- /** Indicate if a cell is editable or not. Default value is true. */
31
- editable?: boolean;
32
-
33
- /**
34
- * Used to indicate that the adjacent cells in the column should be merged together.
35
- * If set to `same-value`, only cells with the same value will be merged.
36
- * If set to `always`, all cells within the group will be merged.
37
- * This is an experimental feature that might not work well with other
38
- * grid related features such as multi-line rows, buffered rendering, etc.
39
- */
40
- mergeCells?: Prop<"same-value" | "always">;
41
-
42
- /** Aggregate value for the cell. */
43
- aggregateValue?: Prop<any>;
44
-
45
- /** Column span. */
46
- colSpan?: NumberProp;
47
-
48
- /** Row span. */
49
- rowSpan?: NumberProp;
50
-
51
- /** Whether the column is fixed. */
52
- fixed?: BooleanProp;
53
-
54
- /** Cell alignment. */
55
- align?: "left" | "right" | "center";
56
-
57
- /** Editor widget for cell editing. */
58
- editor?: any;
59
-
60
- /** Unique column identifier. */
61
- uniqueColumnId?: string;
62
- }
63
-
64
- export class GridCell extends StyledContainerBase<GridCellConfig> {
65
- declare value?: StringProp | NumberProp;
66
- declare field?: string;
67
- declare recordName?: string;
68
- declare editable?: boolean;
69
- declare align?: "left" | "right" | "center";
70
- declare editor?: any;
71
- declare uniqueColumnId?: string;
72
- declare pad?: boolean;
73
- declare fixed?: boolean;
74
- declare merged?: boolean;
75
-
76
- constructor(config?: GridCellConfig) {
77
- super(config);
78
- }
79
-
80
- declareData(...args: any[]) {
81
- return super.declareData(...args, {
82
- value: undefined,
83
- aggregateValue: undefined,
84
- weight: undefined,
85
- pad: undefined,
86
- format: undefined,
87
- colSpan: undefined,
88
- rowSpan: undefined,
89
- editable: undefined,
90
- fixed: undefined,
91
- mergeCells: undefined,
92
- });
93
- }
94
-
95
- init() {
96
- if (!this.value && this.field) this.value = { bind: this.recordName + "." + this.field };
97
-
98
- if (isUndefined(this.editable)) this.editable = !!this.editor;
99
-
100
- super.init();
101
- }
102
-
103
- prepareCSS(context: RenderingContext, instance: Instance) {
104
- let { data } = instance;
105
-
106
- data.classNames = this.CSS.expand(
107
- data.className,
108
- data.class,
109
- this.CSS.state({
110
- pad: data.pad,
111
- editable: data.editable,
112
- ["aligned-" + this.align]: this.align,
113
- mergable: data.merged,
114
- }),
115
- );
116
-
117
- data.style = this.CSS.parseStyle(data.style);
118
- }
119
-
120
- render(context: RenderingContext, instance: Instance, key: string) {
121
- let { data } = instance;
122
- let content;
123
-
124
- if (this.items.length > 0) content = this.renderChildren(context, instance);
125
- else {
126
- content = data.value;
127
- if (data.format) content = Format.value(content, data.format);
128
- }
129
-
130
- return {
131
- atomic: true,
132
- content,
133
- instance,
134
- data,
135
- key,
136
- uniqueColumnId: this.uniqueColumnId,
137
- };
138
- }
139
- }
140
-
141
- GridCell.prototype.pad = true;
142
- GridCell.prototype.fixed = false;
143
- GridCell.prototype.merged = false;
1
+ import { StyledContainerBase, StyledContainerConfig } from "../../ui";
2
+ import { Format } from "../../ui/Format";
3
+ import { Instance } from "../../ui/Instance";
4
+ import { BooleanProp, NumberProp, Prop, StringProp } from "../../ui/Prop";
5
+ import { RenderingContext } from "../../ui/RenderingContext";
6
+ import { isUndefined } from "../../util/isUndefined";
7
+
8
+ export interface GridCellConfig extends StyledContainerConfig {
9
+ /** Selector used to obtain the value that should be displayed inside the cell. Not required if `field` is used. */
10
+ value?: StringProp | NumberProp;
11
+
12
+ /** Selector used to obtain the weight of the cell in aggregate operations, such as weighted averages. */
13
+ weight?: Prop<any>;
14
+
15
+ /** Add default padding to grid cell. */
16
+ pad?: BooleanProp;
17
+
18
+ /** Format specifier used to convert the value into a string. */
19
+ format?: StringProp;
20
+
21
+ /** Name of the field that holds the value to be displayed. */
22
+ field?: string;
23
+
24
+ /** Record alias. Default is `$record`. */
25
+ recordName?: string;
26
+
27
+ /** Record alias. Default is `$record`. */
28
+ recordAlias?: string;
29
+
30
+ /** Indicate if a cell is editable or not. Default value is true. */
31
+ editable?: boolean;
32
+
33
+ /**
34
+ * Used to indicate that the adjacent cells in the column should be merged together.
35
+ * If set to `same-value`, only cells with the same value will be merged.
36
+ * If set to `always`, all cells within the group will be merged.
37
+ * This is an experimental feature that might not work well with other
38
+ * grid related features such as multi-line rows, buffered rendering, etc.
39
+ */
40
+ mergeCells?: Prop<"same-value" | "always">;
41
+
42
+ /** Aggregate value for the cell. */
43
+ aggregateValue?: Prop<any>;
44
+
45
+ /** Column span. */
46
+ colSpan?: NumberProp;
47
+
48
+ /** Row span. */
49
+ rowSpan?: NumberProp;
50
+
51
+ /** Whether the column is fixed. */
52
+ fixed?: BooleanProp;
53
+
54
+ /** Cell alignment. */
55
+ align?: "left" | "right" | "center";
56
+
57
+ /** Editor widget for cell editing. */
58
+ editor?: any;
59
+
60
+ /** Unique column identifier. */
61
+ uniqueColumnId?: string;
62
+ }
63
+
64
+ export class GridCell extends StyledContainerBase<GridCellConfig> {
65
+ declare value?: StringProp | NumberProp;
66
+ declare field?: string;
67
+ declare recordName?: string;
68
+ declare editable?: boolean;
69
+ declare align?: "left" | "right" | "center";
70
+ declare editor?: any;
71
+ declare uniqueColumnId?: string;
72
+ declare pad?: boolean;
73
+ declare fixed?: boolean;
74
+ declare merged?: boolean;
75
+
76
+ constructor(config?: GridCellConfig) {
77
+ super(config);
78
+ }
79
+
80
+ declareData(...args: any[]) {
81
+ return super.declareData(...args, {
82
+ value: undefined,
83
+ aggregateValue: undefined,
84
+ weight: undefined,
85
+ pad: undefined,
86
+ format: undefined,
87
+ colSpan: undefined,
88
+ rowSpan: undefined,
89
+ editable: undefined,
90
+ fixed: undefined,
91
+ mergeCells: undefined,
92
+ });
93
+ }
94
+
95
+ init() {
96
+ if (!this.value && this.field) this.value = { bind: this.recordName + "." + this.field };
97
+
98
+ if (isUndefined(this.editable)) this.editable = !!this.editor;
99
+
100
+ super.init();
101
+ }
102
+
103
+ prepareCSS(context: RenderingContext, instance: Instance) {
104
+ let { data } = instance;
105
+
106
+ data.classNames = this.CSS.expand(
107
+ data.className,
108
+ data.class,
109
+ this.CSS.state({
110
+ pad: data.pad,
111
+ editable: data.editable,
112
+ ["aligned-" + this.align]: this.align,
113
+ mergable: data.merged,
114
+ }),
115
+ );
116
+
117
+ data.style = this.CSS.parseStyle(data.style);
118
+ }
119
+
120
+ render(context: RenderingContext, instance: Instance, key: string) {
121
+ let { data } = instance;
122
+ let content;
123
+
124
+ if (this.items.length > 0) content = this.renderChildren(context, instance);
125
+ else {
126
+ content = data.value;
127
+ if (data.format) content = Format.value(content, data.format);
128
+ }
129
+
130
+ return {
131
+ atomic: true,
132
+ content,
133
+ instance,
134
+ data,
135
+ key,
136
+ uniqueColumnId: this.uniqueColumnId,
137
+ };
138
+ }
139
+ }
140
+
141
+ GridCell.prototype.pad = true;
142
+ GridCell.prototype.fixed = false;
143
+ GridCell.prototype.merged = false;
@@ -26,15 +26,24 @@ export interface TreeNodeConfig extends StyledContainerConfig {
26
26
  /** Icon to be displayed. */
27
27
  icon?: StringProp;
28
28
 
29
+ /** Icon for items (sets leafIcon). */
30
+ itemIcon?: StringProp;
31
+
29
32
  /** Icon for leaf nodes. */
30
33
  leafIcon?: StringProp;
31
34
 
35
+ /** Icon displayed when the node is loading. */
36
+ loadingIcon?: string;
37
+
32
38
  /** Icon for open folder. */
33
39
  openFolderIcon?: StringProp;
34
40
 
35
41
  /** Icon for folder. */
36
42
  folderIcon?: StringProp;
37
43
 
44
+ /** Set to `true` to hide the icon. */
45
+ hideIcon?: boolean;
46
+
38
47
  /** Set to `true` to hide the arrow. */
39
48
  hideArrow?: BooleanProp;
40
49
  }
@@ -1,17 +1,17 @@
1
- /** @jsxImportSource react */
2
- import {VDOM} from '../../ui/Widget';
3
- import {registerIcon} from './registry';
4
-
5
- export default registerIcon('calendar', (props: any) => {
6
- return <svg
7
- {...props}
8
- viewBox="0 0 32 32">
9
-
10
- <path d="M4 3h6m10 0h6" fill="none" stroke="currentColor" strokeWidth="2"/>
11
- <path d="M19 21h4v4h-4z" fill="currentColor"/>
12
- <path d="M3 25h24M3 21h24M3 17h24M7 28V13m-4 0h24M11 28V13.2M15 28V13.27M19 28V13.03M23 28V13.5" fill="none" stroke="currentColor"/>
13
- <path fill="currentColor" d="M10 8h10v2H10z"/>
14
- <path fill="none" stroke="currentColor" strokeWidth="2" d="M3 5h24v24H3z"/>
15
- </svg>
16
- }, true);
17
-
1
+ /** @jsxImportSource react */
2
+ import {VDOM} from '../../ui/Widget';
3
+ import {registerIcon} from './registry';
4
+
5
+ export default registerIcon('calendar', (props: any) => {
6
+ return <svg
7
+ {...props}
8
+ viewBox="0 0 32 32">
9
+
10
+ <path d="M4 3h6m10 0h6" fill="none" stroke="currentColor" strokeWidth="2"/>
11
+ <path d="M19 21h4v4h-4z" fill="currentColor"/>
12
+ <path d="M3 25h24M3 21h24M3 17h24M7 28V13m-4 0h24M11 28V13.2M15 28V13.27M19 28V13.03M23 28V13.5" fill="none" stroke="currentColor"/>
13
+ <path fill="currentColor" d="M10 8h10v2H10z"/>
14
+ <path fill="none" stroke="currentColor" strokeWidth="2" d="M3 5h24v24H3z"/>
15
+ </svg>
16
+ }, true);
17
+
@@ -1,13 +1,13 @@
1
- /** @jsxImportSource react */
2
- import {VDOM} from '../../ui/Widget';
3
- import {registerIcon} from './registry';
4
-
5
- export default registerIcon('check', (props: any) => {
6
- return <svg
7
- {...props}
8
- viewBox="0 0 64 64">
9
- <path d="M7.136 42.94l20.16 14.784 29.568-40.32-9.72-7.128-22.598 30.816-10.44-7.656z"
10
- fill="currentColor"/>
11
- </svg>
12
- }, true);
13
-
1
+ /** @jsxImportSource react */
2
+ import {VDOM} from '../../ui/Widget';
3
+ import {registerIcon} from './registry';
4
+
5
+ export default registerIcon('check', (props: any) => {
6
+ return <svg
7
+ {...props}
8
+ viewBox="0 0 64 64">
9
+ <path d="M7.136 42.94l20.16 14.784 29.568-40.32-9.72-7.128-22.598 30.816-10.44-7.656z"
10
+ fill="currentColor"/>
11
+ </svg>
12
+ }, true);
13
+
@@ -1,15 +1,15 @@
1
- /** @jsxImportSource react */
2
- import {VDOM} from '../../ui/Widget';
3
- import {registerIcon} from './registry';
4
-
5
- export default registerIcon('clear', (props: any) => {
6
- return <svg
7
- {...props}
8
- viewBox="0 0 32 32">
9
- <path fill="currentColor"
10
- strokeWidth="1"
11
- stroke="currentColor"
12
- d="M16.9 16l4.92-4.92c.24-.24.24-.6 0-.84s-.6-.24-.84 0l-4.92 4.92-5.04-4.98c-.24-.24-.6-.24-.84 0s-.24.6 0 .84L15.16 16l-4.98 4.98c-.24.24-.24.6 0 .84s.6.24.84 0L16 16.84l4.98 4.98c.24.24.6.24.84 0s.24-.6 0-.84L16.9 16z"/>
13
- </svg>
14
- }, true);
15
-
1
+ /** @jsxImportSource react */
2
+ import {VDOM} from '../../ui/Widget';
3
+ import {registerIcon} from './registry';
4
+
5
+ export default registerIcon('clear', (props: any) => {
6
+ return <svg
7
+ {...props}
8
+ viewBox="0 0 32 32">
9
+ <path fill="currentColor"
10
+ strokeWidth="1"
11
+ stroke="currentColor"
12
+ d="M16.9 16l4.92-4.92c.24-.24.24-.6 0-.84s-.6-.24-.84 0l-4.92 4.92-5.04-4.98c-.24-.24-.6-.24-.84 0s-.24.6 0 .84L15.16 16l-4.98 4.98c-.24.24-.24.6 0 .84s.6.24.84 0L16 16.84l4.98 4.98c.24.24.6.24.84 0s.24-.6 0-.84L16.9 16z"/>
13
+ </svg>
14
+ }, true);
15
+
@@ -1,20 +1,20 @@
1
- /** @jsxImportSource react */
2
- import { VDOM } from "../../ui/Widget";
3
- import { registerIcon } from "./registry";
4
-
5
- export default registerIcon(
6
- "close",
7
- (props: any) => {
8
- return (
9
- <svg {...props} viewBox="0 0 32 32">
10
- <path
11
- fill="currentColor"
12
- strokeWidth="1"
13
- stroke="currentColor"
14
- d="M17.8 16l9.84-9.84c.48-.48.48-1.2 0-1.68s-1.2-.48-1.68 0l-9.84 9.84L6.04 4.36c-.48-.48-1.2-.48-1.68 0s-.48 1.2 0 1.68L14.32 16l-9.96 9.96c-.48.48-.48 1.2 0 1.68s1.2.48 1.68 0L16 17.68l9.96 9.96c.48.48 1.2.48 1.68 0s.48-1.2 0-1.68L17.8 16z"
15
- />
16
- </svg>
17
- );
18
- },
19
- true
20
- );
1
+ /** @jsxImportSource react */
2
+ import { VDOM } from "../../ui/Widget";
3
+ import { registerIcon } from "./registry";
4
+
5
+ export default registerIcon(
6
+ "close",
7
+ (props: any) => {
8
+ return (
9
+ <svg {...props} viewBox="0 0 32 32">
10
+ <path
11
+ fill="currentColor"
12
+ strokeWidth="1"
13
+ stroke="currentColor"
14
+ d="M17.8 16l9.84-9.84c.48-.48.48-1.2 0-1.68s-1.2-.48-1.68 0l-9.84 9.84L6.04 4.36c-.48-.48-1.2-.48-1.68 0s-.48 1.2 0 1.68L14.32 16l-9.96 9.96c-.48.48-.48 1.2 0 1.68s1.2.48 1.68 0L16 17.68l9.96 9.96c.48.48 1.2.48 1.68 0s.48-1.2 0-1.68L17.8 16z"
15
+ />
16
+ </svg>
17
+ );
18
+ },
19
+ true
20
+ );