cx 26.0.12 → 26.0.13

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 (363) 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.js +133 -133
  187. package/dist/data.js +2 -2
  188. package/dist/jsx-runtime.js +6 -1
  189. package/dist/manifest.d.ts +1443 -0
  190. package/dist/manifest.js +855 -807
  191. package/dist/ui.js +91 -5
  192. package/dist/util.js +3 -0
  193. package/dist/widgets.js +520 -161
  194. package/package.json +46 -20
  195. package/src/charts/Chart.ts +108 -108
  196. package/src/charts/ScatterGraph.tsx +6 -6
  197. package/src/data/ArrayElementView.ts +90 -90
  198. package/src/data/AugmentedViewBase.ts +88 -88
  199. package/src/data/Binding.ts +104 -104
  200. package/src/data/ExposedRecordView.ts +95 -95
  201. package/src/data/ExposedValueView.ts +89 -89
  202. package/src/data/Expression.spec.ts +229 -229
  203. package/src/data/Expression.ts +233 -233
  204. package/src/data/Grouper.spec.ts +57 -57
  205. package/src/data/Grouper.ts +158 -158
  206. package/src/data/NestedDataView.ts +43 -43
  207. package/src/data/ReadOnlyDataView.ts +39 -39
  208. package/src/data/Ref.ts +104 -104
  209. package/src/data/Selector.ts +10 -10
  210. package/src/data/Store.ts +52 -52
  211. package/src/data/StoreProxy.ts +19 -19
  212. package/src/data/StoreRef.ts +66 -66
  213. package/src/data/StringTemplate.spec.ts +132 -132
  214. package/src/data/StringTemplate.ts +93 -93
  215. package/src/data/StructuredSelector.spec.ts +113 -113
  216. package/src/data/StructuredSelector.ts +146 -146
  217. package/src/data/SubscribableView.ts +63 -63
  218. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  219. package/src/data/ZoomIntoPropertyView.ts +45 -45
  220. package/src/data/computable.spec.ts +87 -62
  221. package/src/data/computable.ts +3 -6
  222. package/src/data/createAccessorModelProxy.spec.tsx +102 -1
  223. package/src/data/createAccessorModelProxy.ts +9 -3
  224. package/src/data/createStructuredSelector.ts +62 -62
  225. package/src/data/getAccessor.spec.ts +11 -11
  226. package/src/data/getAccessor.ts +74 -74
  227. package/src/data/getSelector.spec.ts +43 -43
  228. package/src/data/getSelector.ts +66 -66
  229. package/src/data/ops/filter.spec.ts +35 -35
  230. package/src/data/ops/filter.ts +9 -9
  231. package/src/data/ops/findTreeNode.ts +1 -5
  232. package/src/data/ops/findTreePath.ts +1 -1
  233. package/src/data/ops/merge.ts +13 -13
  234. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  235. package/src/data/ops/removeTreeNodes.ts +2 -2
  236. package/src/data/ops/updateArray.spec.ts +69 -69
  237. package/src/data/ops/updateArray.ts +31 -31
  238. package/src/data/ops/updateTree.ts +1 -1
  239. package/src/data/test-types.ts +7 -7
  240. package/src/hooks/resolveCallback.spec.tsx +30 -7
  241. package/src/hooks/useTrigger.ts +26 -26
  242. package/src/index.scss +6 -6
  243. package/src/jsx-dev-runtime.ts +4 -4
  244. package/src/jsx-runtime.spec.tsx +402 -0
  245. package/src/jsx-runtime.ts +26 -22
  246. package/src/svg/BoundedObject.ts +101 -101
  247. package/src/svg/util/Rect.ts +105 -105
  248. package/src/ui/CSSHelper.ts +17 -17
  249. package/src/ui/ContentResolver.spec.tsx +172 -19
  250. package/src/ui/ContentResolver.ts +16 -8
  251. package/src/ui/Controller.ts +15 -2
  252. package/src/ui/Culture.ts +159 -159
  253. package/src/ui/DataProxy.ts +55 -55
  254. package/src/ui/FocusManager.ts +171 -171
  255. package/src/ui/Instance.ts +866 -868
  256. package/src/ui/Prop.ts +140 -112
  257. package/src/ui/RenderingContext.ts +99 -99
  258. package/src/ui/Repeater.ts +3 -12
  259. package/src/ui/Rescope.ts +49 -49
  260. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  261. package/src/ui/Text.ts +21 -2
  262. package/src/ui/VDOM.ts +34 -34
  263. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  264. package/src/ui/adapter/ArrayAdapter.ts +4 -1
  265. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  266. package/src/ui/adapter/TreeAdapter.ts +185 -185
  267. package/src/ui/app/History.ts +133 -133
  268. package/src/ui/app/Url.spec.ts +50 -50
  269. package/src/ui/app/startHotAppLoop.ts +41 -41
  270. package/src/ui/createFunctionalComponent.spec.tsx +53 -0
  271. package/src/ui/createFunctionalComponent.ts +86 -65
  272. package/src/ui/expr.ts +4 -1
  273. package/src/ui/exprHelpers.spec.ts +379 -0
  274. package/src/ui/exprHelpers.ts +78 -0
  275. package/src/ui/index.ts +47 -46
  276. package/src/ui/layout/Content.ts +30 -30
  277. package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +1 -1
  278. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  279. package/src/ui/selection/KeySelection.ts +153 -153
  280. package/src/ui/selection/Selection.ts +128 -128
  281. package/src/util/Console.ts +13 -11
  282. package/src/util/Format.ts +267 -267
  283. package/src/util/addEventListenerWithOptions.ts +41 -41
  284. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  285. package/src/util/color/rgbToHsl.ts +35 -35
  286. package/src/util/getActiveElement.ts +4 -4
  287. package/src/util/hasKey.ts +18 -18
  288. package/src/util/index.ts +55 -55
  289. package/src/util/innerTextTrim.ts +10 -10
  290. package/src/util/isArray.ts +3 -3
  291. package/src/util/isDataRecord.ts +5 -5
  292. package/src/util/isDefined.ts +3 -3
  293. package/src/util/isString.ts +3 -3
  294. package/src/widgets/AccessorBindings.spec.tsx +26 -0
  295. package/src/widgets/Button.tsx +5 -17
  296. package/src/widgets/DocumentTitle.ts +95 -92
  297. package/src/widgets/Heading.ts +2 -2
  298. package/src/widgets/HtmlElement.spec.helpers.tsx +108 -0
  299. package/src/widgets/HtmlElement.spec.tsx +20 -12
  300. package/src/widgets/HtmlElement.tsx +77 -23
  301. package/src/widgets/Icon.ts +3 -17
  302. package/src/widgets/List.tsx +6 -0
  303. package/src/widgets/ReactElementWrapper.spec.tsx +452 -0
  304. package/src/widgets/ReactElementWrapper.tsx +108 -0
  305. package/src/widgets/Sandbox.ts +103 -103
  306. package/src/widgets/autoFocus.ts +9 -9
  307. package/src/widgets/cx.ts +63 -63
  308. package/src/widgets/drag-drop/DragSource.tsx +3 -4
  309. package/src/widgets/drag-drop/DropZone.tsx +3 -4
  310. package/src/widgets/form/Checkbox.tsx +3 -0
  311. package/src/widgets/form/ColorField.tsx +3 -0
  312. package/src/widgets/form/DateTimeField.tsx +5 -0
  313. package/src/widgets/form/Field.tsx +0 -3
  314. package/src/widgets/form/Label.tsx +1 -0
  315. package/src/widgets/form/LabeledContainer.ts +22 -26
  316. package/src/widgets/form/LookupField.spec.tsx +93 -0
  317. package/src/widgets/form/LookupField.tsx +104 -9
  318. package/src/widgets/form/MonthField.tsx +5 -0
  319. package/src/widgets/form/NumberField.tsx +3 -0
  320. package/src/widgets/form/Radio.tsx +5 -0
  321. package/src/widgets/form/Select.tsx +5 -0
  322. package/src/widgets/form/Slider.tsx +4 -0
  323. package/src/widgets/form/Switch.tsx +3 -0
  324. package/src/widgets/form/TextField.tsx +62 -0
  325. package/src/widgets/form/TimeList.tsx +84 -73
  326. package/src/widgets/form/UploadButton.tsx +53 -2
  327. package/src/widgets/form/Validator.ts +40 -3
  328. package/src/widgets/grid/Grid.tsx +9 -12
  329. package/src/widgets/grid/GridCell.ts +143 -143
  330. package/src/widgets/grid/TreeNode.tsx +9 -0
  331. package/src/widgets/icons/calendar.tsx +17 -17
  332. package/src/widgets/icons/check.tsx +13 -13
  333. package/src/widgets/icons/clear.tsx +15 -15
  334. package/src/widgets/icons/close.tsx +20 -20
  335. package/src/widgets/icons/cx.tsx +38 -38
  336. package/src/widgets/icons/drop-down.tsx +15 -15
  337. package/src/widgets/icons/file.tsx +13 -13
  338. package/src/widgets/icons/folder-open.tsx +15 -15
  339. package/src/widgets/icons/folder.tsx +13 -13
  340. package/src/widgets/icons/forward.tsx +22 -22
  341. package/src/widgets/icons/loading.tsx +24 -24
  342. package/src/widgets/icons/menu.tsx +17 -17
  343. package/src/widgets/icons/pixel-picker.tsx +18 -18
  344. package/src/widgets/icons/search.tsx +13 -13
  345. package/src/widgets/icons/sort-asc.tsx +14 -14
  346. package/src/widgets/icons/square.tsx +18 -18
  347. package/src/widgets/index.ts +1 -0
  348. package/src/widgets/nav/MenuItem.tsx +3 -2
  349. package/src/widgets/nav/Route.ts +142 -142
  350. package/src/widgets/nav/Scroller.tsx +8 -9
  351. package/src/widgets/nav/Tab.ts +2 -2
  352. package/src/widgets/overlay/ContextMenu.ts +42 -42
  353. package/src/widgets/overlay/Dropdown.tsx +762 -762
  354. package/src/widgets/overlay/MsgBox.tsx +141 -141
  355. package/src/widgets/overlay/Overlay.tsx +5 -4
  356. package/src/widgets/overlay/Toast.ts +111 -111
  357. package/src/widgets/overlay/Window.tsx +299 -299
  358. package/src/widgets/overlay/alerts.ts +46 -46
  359. package/src/widgets/overlay/captureMouse.ts +195 -195
  360. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -72
  361. package/src/widgets/overlay/index.d.ts +11 -11
  362. package/src/widgets/overlay/index.ts +11 -11
  363. 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
+ );