cx 26.0.5 → 26.0.8

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 (257) hide show
  1. package/build/charts/Bar.scss +29 -0
  2. package/build/charts/BarGraph.scss +29 -0
  3. package/build/charts/BubbleGraph.scss +32 -0
  4. package/build/charts/Column.scss +29 -0
  5. package/build/charts/ColumnGraph.scss +30 -0
  6. package/build/charts/Gridlines.scss +25 -0
  7. package/build/charts/Legend.scss +50 -0
  8. package/build/charts/LegendEntry.scss +29 -0
  9. package/build/charts/LineGraph.d.ts +11 -0
  10. package/build/charts/LineGraph.js +1 -0
  11. package/build/charts/LineGraph.scss +25 -0
  12. package/build/charts/Marker.scss +44 -0
  13. package/build/charts/MarkerLine.scss +20 -0
  14. package/build/charts/PieChart.scss +29 -0
  15. package/build/charts/Range.scss +20 -0
  16. package/build/charts/RangeMarker.scss +17 -0
  17. package/build/charts/ScatterGraph.scss +24 -0
  18. package/build/charts/Swimlane.scss +16 -0
  19. package/build/charts/Swimlanes.scss +16 -0
  20. package/build/charts/axis/Axis.scss +23 -0
  21. package/build/charts/axis/CategoryAxis.scss +35 -0
  22. package/build/charts/axis/NumericAxis.scss +35 -0
  23. package/build/charts/axis/TimeAxis.scss +34 -0
  24. package/build/charts/axis/index.scss +5 -0
  25. package/build/charts/axis/variables.scss +3 -0
  26. package/build/charts/index.scss +22 -0
  27. package/build/charts/palette.scss +97 -0
  28. package/build/charts/variables.scss +22 -0
  29. package/build/data/ArrayElementView.spec.js +1 -1
  30. package/build/global.scss +14 -0
  31. package/build/hooks/store.spec.js +1 -1
  32. package/build/hooks/useTrigger.spec.js +1 -1
  33. package/build/index.scss +6 -0
  34. package/build/jsx-runtime.d.ts +3 -2
  35. package/build/svg/Svg.scss +28 -0
  36. package/build/svg/index.scss +9 -0
  37. package/build/ui/Controller.spec.js +6 -2
  38. package/build/ui/app/startAppLoop.d.ts +3 -2
  39. package/build/ui/app/startHotAppLoop.d.ts +3 -2
  40. package/build/ui/index.scss +2 -0
  41. package/build/ui/layout/ContentPlaceholder.spec.js +12 -12
  42. package/build/ui/layout/LabelsLeftLayout.scss +47 -0
  43. package/build/ui/layout/LabelsTopLayout.scss +65 -0
  44. package/build/ui/layout/index.scss +3 -0
  45. package/build/ui/layout/variables.scss +2 -0
  46. package/build/ui/variables.scss +2 -0
  47. package/build/util/addEventListenerWithOptions.d.ts +2 -2
  48. package/build/util/call-once.scss +7 -0
  49. package/build/util/index.scss +11 -0
  50. package/build/util/scss/add-rules.scss +40 -0
  51. package/build/util/scss/calc.scss +45 -0
  52. package/build/util/scss/call-once.scss +13 -0
  53. package/build/util/scss/clockwise.scss +49 -0
  54. package/build/util/scss/colors.scss +10 -0
  55. package/build/util/scss/deep-get.scss +12 -0
  56. package/build/util/scss/deep-merge.scss +21 -0
  57. package/build/util/scss/divide.scss +3 -0
  58. package/build/util/scss/include.scss +48 -0
  59. package/build/util/scss/index.scss +9 -0
  60. package/build/variables.scss +217 -0
  61. package/build/widgets/Button.scss +119 -0
  62. package/build/widgets/Button.variables.scss +117 -0
  63. package/build/widgets/CxCredit.scss +39 -0
  64. package/build/widgets/FlexBox.scss +148 -0
  65. package/build/widgets/Heading.scss +40 -0
  66. package/build/widgets/HighlightedSearchText.scss +20 -0
  67. package/build/widgets/Icon.scss +22 -0
  68. package/build/widgets/List.scss +93 -0
  69. package/build/widgets/ProgressBar.scss +51 -0
  70. package/build/widgets/Resizer.scss +44 -0
  71. package/build/widgets/Section.scss +56 -0
  72. package/build/widgets/animations.scss +11 -0
  73. package/build/widgets/drag-drop/DragClone.scss +36 -0
  74. package/build/widgets/drag-drop/DragHandle.scss +19 -0
  75. package/build/widgets/drag-drop/DragSource.scss +27 -0
  76. package/build/widgets/drag-drop/DropZone.scss +77 -0
  77. package/build/widgets/drag-drop/index.scss +4 -0
  78. package/build/widgets/drag-drop/variables.scss +15 -0
  79. package/build/widgets/form/Calendar.scss +199 -0
  80. package/build/widgets/form/Calendar.variables.scss +64 -0
  81. package/build/widgets/form/Checkbox.scss +129 -0
  82. package/build/widgets/form/Checkbox.variables.scss +40 -0
  83. package/build/widgets/form/ColorField.scss +98 -0
  84. package/build/widgets/form/ColorPicker.scss +285 -0
  85. package/build/widgets/form/ColorPicker.variables.scss +22 -0
  86. package/build/widgets/form/DateTimeField.scss +92 -0
  87. package/build/widgets/form/DateTimePicker.scss +47 -0
  88. package/build/widgets/form/Field.scss +164 -0
  89. package/build/widgets/form/HelpText.scss +24 -0
  90. package/build/widgets/form/Label.scss +38 -0
  91. package/build/widgets/form/LookupField.scss +221 -0
  92. package/build/widgets/form/MonthField.scss +100 -0
  93. package/build/widgets/form/MonthPicker.scss +125 -0
  94. package/build/widgets/form/NumberField.scss +63 -0
  95. package/build/widgets/form/Radio.scss +123 -0
  96. package/build/widgets/form/Radio.variables.scss +46 -0
  97. package/build/widgets/form/Select.scss +101 -0
  98. package/build/widgets/form/Slider.scss +121 -0
  99. package/build/widgets/form/Switch.scss +142 -0
  100. package/build/widgets/form/TextArea.scss +45 -0
  101. package/build/widgets/form/TextField.scss +57 -0
  102. package/build/widgets/form/UploadButton.scss +49 -0
  103. package/build/widgets/form/ValidationError.scss +23 -0
  104. package/build/widgets/form/Wheel.scss +152 -0
  105. package/build/widgets/form/index.scss +24 -0
  106. package/build/widgets/form/variables.scss +355 -0
  107. package/build/widgets/grid/Grid.scss +640 -0
  108. package/build/widgets/grid/Pagination.scss +115 -0
  109. package/build/widgets/grid/TreeNode.scss +90 -0
  110. package/build/widgets/grid/index.scss +4 -0
  111. package/build/widgets/grid/variables.scss +137 -0
  112. package/build/widgets/index.scss +16 -0
  113. package/build/widgets/nav/Link.scss +20 -0
  114. package/build/widgets/nav/Menu.scss +76 -0
  115. package/build/widgets/nav/Menu.variables.scss +25 -0
  116. package/build/widgets/nav/MenuItem.d.ts +1 -0
  117. package/build/widgets/nav/MenuItem.scss +130 -0
  118. package/build/widgets/nav/Scroller.scss +148 -0
  119. package/build/widgets/nav/Tab.scss +82 -0
  120. package/build/widgets/nav/Tab.variables.scss +84 -0
  121. package/build/widgets/nav/cover.scss +22 -0
  122. package/build/widgets/nav/index.scss +6 -0
  123. package/build/widgets/nav/variables.scss +27 -0
  124. package/build/widgets/overlay/Dropdown.scss +186 -0
  125. package/build/widgets/overlay/Overlay.scss +68 -0
  126. package/build/widgets/overlay/Toast.scss +164 -0
  127. package/build/widgets/overlay/Tooltip.scss +177 -0
  128. package/build/widgets/overlay/Window.scss +129 -0
  129. package/build/widgets/overlay/Window.variables.scss +62 -0
  130. package/build/widgets/overlay/captureMouse.scss +13 -0
  131. package/build/widgets/overlay/index.scss +15 -0
  132. package/build/widgets/overlay/variables.scss +85 -0
  133. package/build/widgets/variables.scss +146 -0
  134. package/build.js +133 -129
  135. package/dist/charts.js +1 -0
  136. package/dist/manifest.js +849 -743
  137. package/package.json +4 -2
  138. package/src/charts/Chart.ts +108 -108
  139. package/src/charts/LineGraph.tsx +14 -0
  140. package/src/data/ArrayElementView.ts +90 -90
  141. package/src/data/AugmentedViewBase.ts +88 -88
  142. package/src/data/Binding.ts +104 -104
  143. package/src/data/ExposedRecordView.ts +95 -95
  144. package/src/data/ExposedValueView.ts +89 -89
  145. package/src/data/Expression.spec.ts +229 -229
  146. package/src/data/Expression.ts +233 -233
  147. package/src/data/Grouper.spec.ts +57 -57
  148. package/src/data/Grouper.ts +158 -158
  149. package/src/data/NestedDataView.ts +43 -43
  150. package/src/data/ReadOnlyDataView.ts +39 -39
  151. package/src/data/Ref.ts +104 -104
  152. package/src/data/Selector.ts +10 -10
  153. package/src/data/Store.ts +52 -52
  154. package/src/data/StoreProxy.ts +19 -19
  155. package/src/data/StoreRef.ts +66 -66
  156. package/src/data/StringTemplate.spec.ts +132 -132
  157. package/src/data/StringTemplate.ts +93 -93
  158. package/src/data/StructuredSelector.spec.ts +113 -113
  159. package/src/data/StructuredSelector.ts +146 -146
  160. package/src/data/SubscribableView.ts +63 -63
  161. package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
  162. package/src/data/ZoomIntoPropertyView.ts +45 -45
  163. package/src/data/computable.spec.ts +62 -62
  164. package/src/data/createAccessorModelProxy.ts +60 -60
  165. package/src/data/createStructuredSelector.ts +62 -62
  166. package/src/data/getAccessor.spec.ts +11 -11
  167. package/src/data/getAccessor.ts +74 -74
  168. package/src/data/getSelector.spec.ts +43 -43
  169. package/src/data/getSelector.ts +66 -66
  170. package/src/data/ops/filter.spec.ts +35 -35
  171. package/src/data/ops/filter.ts +9 -9
  172. package/src/data/ops/merge.ts +13 -13
  173. package/src/data/ops/removeTreeNodes.spec.ts +37 -37
  174. package/src/data/ops/removeTreeNodes.ts +15 -15
  175. package/src/data/ops/updateArray.spec.ts +69 -69
  176. package/src/data/ops/updateArray.ts +31 -31
  177. package/src/data/ops/updateTree.ts +23 -23
  178. package/src/data/test-types.ts +7 -7
  179. package/src/hooks/useTrigger.ts +26 -26
  180. package/src/index.scss +6 -6
  181. package/src/jsx-runtime.ts +75 -72
  182. package/src/svg/BoundedObject.ts +101 -101
  183. package/src/ui/CSSHelper.ts +17 -17
  184. package/src/ui/ContentResolver.ts +124 -124
  185. package/src/ui/Controller.ts +189 -189
  186. package/src/ui/Culture.ts +159 -159
  187. package/src/ui/DataProxy.ts +55 -55
  188. package/src/ui/FocusManager.ts +171 -171
  189. package/src/ui/Instance.ts +868 -868
  190. package/src/ui/RenderingContext.ts +99 -99
  191. package/src/ui/Rescope.ts +49 -49
  192. package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
  193. package/src/ui/VDOM.ts +34 -34
  194. package/src/ui/adapter/ArrayAdapter.spec.ts +55 -55
  195. package/src/ui/adapter/ArrayAdapter.ts +226 -226
  196. package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
  197. package/src/ui/adapter/TreeAdapter.ts +185 -185
  198. package/src/ui/app/History.ts +133 -133
  199. package/src/ui/app/Url.spec.ts +50 -50
  200. package/src/ui/app/startAppLoop.tsx +2 -1
  201. package/src/ui/app/startHotAppLoop.ts +2 -1
  202. package/src/ui/createFunctionalComponent.ts +65 -65
  203. package/src/ui/index.ts +45 -45
  204. package/src/ui/layout/Content.ts +30 -30
  205. package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
  206. package/src/ui/selection/KeySelection.ts +165 -165
  207. package/src/ui/selection/PropertySelection.ts +87 -87
  208. package/src/ui/selection/Selection.ts +118 -118
  209. package/src/util/Format.ts +267 -267
  210. package/src/util/addEventListenerWithOptions.ts +41 -41
  211. package/src/util/browserSupportsPassiveEventHandlers.ts +20 -20
  212. package/src/util/color/rgbToHsl.ts +35 -35
  213. package/src/util/getActiveElement.ts +4 -4
  214. package/src/util/hasKey.ts +18 -18
  215. package/src/util/index.ts +55 -55
  216. package/src/util/innerTextTrim.ts +10 -10
  217. package/src/util/isArray.ts +3 -3
  218. package/src/util/isDataRecord.ts +5 -5
  219. package/src/util/isDefined.ts +3 -3
  220. package/src/util/isString.ts +3 -3
  221. package/src/widgets/Sandbox.ts +103 -103
  222. package/src/widgets/autoFocus.ts +9 -9
  223. package/src/widgets/cx.ts +63 -63
  224. package/src/widgets/drag-drop/ops.tsx +1 -1
  225. package/src/widgets/grid/GridCell.ts +143 -143
  226. package/src/widgets/icons/calendar.tsx +17 -17
  227. package/src/widgets/icons/check.tsx +13 -13
  228. package/src/widgets/icons/clear.tsx +15 -15
  229. package/src/widgets/icons/close.tsx +20 -20
  230. package/src/widgets/icons/cx.tsx +38 -38
  231. package/src/widgets/icons/drop-down.tsx +15 -15
  232. package/src/widgets/icons/file.tsx +13 -13
  233. package/src/widgets/icons/folder-open.tsx +15 -15
  234. package/src/widgets/icons/folder.tsx +13 -13
  235. package/src/widgets/icons/forward.tsx +22 -22
  236. package/src/widgets/icons/loading.tsx +24 -24
  237. package/src/widgets/icons/menu.tsx +17 -17
  238. package/src/widgets/icons/pixel-picker.tsx +18 -18
  239. package/src/widgets/icons/search.tsx +13 -13
  240. package/src/widgets/icons/sort-asc.tsx +14 -14
  241. package/src/widgets/icons/square.tsx +18 -18
  242. package/src/widgets/nav/MenuItem.tsx +1 -0
  243. package/src/widgets/nav/Route.ts +142 -142
  244. package/src/widgets/overlay/ContextMenu.ts +42 -42
  245. package/src/widgets/overlay/Dropdown.tsx +762 -762
  246. package/src/widgets/overlay/MsgBox.tsx +141 -141
  247. package/src/widgets/overlay/Toast.ts +111 -111
  248. package/src/widgets/overlay/Window.tsx +299 -299
  249. package/src/widgets/overlay/alerts.ts +46 -46
  250. package/src/widgets/overlay/captureMouse.ts +195 -195
  251. package/src/widgets/overlay/createHotPromiseWindowFactory.ts +72 -72
  252. package/src/widgets/overlay/index.d.ts +11 -11
  253. package/src/widgets/overlay/index.ts +11 -11
  254. package/src/widgets/overlay/tooltip-ops.ts +173 -173
  255. package/build/ui/PureContainer.spec.d.ts +0 -1
  256. package/build/ui/PureContainer.spec.js +0 -149
  257. package/dist/manifest.d.ts +0 -1443
@@ -0,0 +1,97 @@
1
+ //https://www.materialui.co/colors
2
+ //normal:200 900
3
+ //hover:100 700
4
+ //selected: 300 900
5
+ //disabled: 0 100
6
+ @use "sass:map";
7
+ @use "sass:list";
8
+
9
+ $cx-default-palette-colors: rgba(244, 67, 54, 1) rgba(233, 30, 99, 1) rgba(156, 39, 176, 1) rgba(103, 58, 183, 1)
10
+ rgba(63, 81, 181, 1) rgba(33, 150, 243, 1) rgba(3, 169, 244, 1) rgba(0, 188, 212, 1) rgba(0, 150, 136, 1)
11
+ rgba(76, 175, 80, 1) rgba(139, 195, 74, 1) rgba(205, 220, 57, 1) rgba(255, 235, 59, 1) rgba(255, 193, 7, 1)
12
+ rgba(255, 152, 0, 1) rgba(255, 87, 34, 1) !default;
13
+
14
+ $cx-default-palette-fill-whiten: 60% !default;
15
+ $cx-default-palette-fill-hover-whiten: 50% !default;
16
+ $cx-default-palette-fill-selected-whiten: 20% !default;
17
+ $cx-default-palette-fill-disabled-whiten: 90% !default;
18
+
19
+ $cx-default-palette-fill-blacken: 0% !default;
20
+ $cx-default-palette-fill-hover-blacken: 0% !default;
21
+ $cx-default-palette-fill-selected-blacken: 0% !default;
22
+ $cx-default-palette-fill-disabled-blacken: 0% !default;
23
+
24
+ $cx-default-palette-stroke-whiten: 0% !default;
25
+ $cx-default-palette-stroke-blacken: 10% !default;
26
+
27
+ @mixin cx-palette(
28
+ $palette-colors: $cx-default-palette-colors,
29
+ $palette-fill-whiten: $cx-default-palette-fill-whiten,
30
+ $palette-fill-hover-whiten: $cx-default-palette-fill-hover-whiten,
31
+ $palette-fill-selected-whiten: $cx-default-palette-fill-selected-whiten,
32
+ $palette-fill-disabled-whiten: $cx-default-palette-fill-disabled-whiten,
33
+ $palette-fill-blacken: $cx-default-palette-fill-blacken,
34
+ $palette-fill-hover-blacken: $cx-default-palette-fill-hover-blacken,
35
+ $palette-fill-selected-blacken: $cx-default-palette-fill-selected-blacken,
36
+ $palette-fill-disabled-blacken: $cx-default-palette-fill-disabled-blacken,
37
+ $palette-stroke-whiten: $cx-default-palette-stroke-whiten,
38
+ $palette-stroke-blacken: $cx-default-palette-stroke-blacken,
39
+ $besm: $cx-besm
40
+ ) {
41
+ $block: map.get($besm, block);
42
+ $element: map.get($besm, element);
43
+ $state: map.get($besm, state);
44
+
45
+ @for $i from 1 through list.length($palette-colors) {
46
+ $c: list.nth($palette-colors, 1 + (($i - 1) * 1) % list.length($palette-colors));
47
+
48
+ .#{$state}color-#{$i - 1} {
49
+ $fill: cx-blacken(cx-whiten($c, $palette-fill-whiten), $palette-fill-blacken);
50
+ $stroke: cx-blacken(cx-whiten($fill, $palette-stroke-whiten), $palette-stroke-blacken);
51
+ fill: $fill;
52
+ stroke: $stroke;
53
+ background: $fill;
54
+ border-color: $stroke;
55
+
56
+ &.#{$state}selectable:hover,
57
+ &.#{$state}selectable.#{$state}hover,
58
+ .#{$state}color-root:hover &,
59
+ .#{$state}color-root.#{$state}hover & {
60
+ $fill: cx-blacken(cx-whiten($c, $palette-fill-hover-whiten), $palette-fill-hover-blacken);
61
+ $stroke: cx-blacken(cx-whiten($fill, $palette-stroke-whiten), $palette-stroke-blacken);
62
+ fill: $fill;
63
+ stroke: $stroke;
64
+ background: $fill;
65
+ border-color: $stroke;
66
+ }
67
+
68
+ &.#{$state}selected,
69
+ &.#{$state}selected:hover,
70
+ &.#{$state}selected.#{$state}hover,
71
+ .#{$state}color-root.#{$state}selected &,
72
+ .#{$state}color-root.#{$state}selected:hover &,
73
+ .#{$state}color-root.#{$state}selected.#{$state}hover & {
74
+ $fill: cx-blacken(cx-whiten($c, $palette-fill-selected-whiten), $palette-fill-selected-blacken);
75
+ $stroke: cx-blacken(cx-whiten($fill, $palette-stroke-whiten), $palette-stroke-blacken);
76
+ fill: $fill;
77
+ stroke: $stroke;
78
+ background: $fill;
79
+ border-color: $stroke;
80
+ }
81
+
82
+ &.#{$state}disabled,
83
+ .#{$state}color-root.#{$state}disabled & {
84
+ $fill: cx-blacken(cx-whiten($c, $palette-fill-disabled-whiten), $palette-fill-disabled-blacken);
85
+ $stroke: cx-blacken(cx-whiten($fill, $palette-stroke-whiten), $palette-stroke-blacken);
86
+ fill: $fill;
87
+ stroke: $stroke;
88
+ background: $fill;
89
+ border-color: $stroke;
90
+ }
91
+ }
92
+ }
93
+ }
94
+
95
+ @if (cx-should-include("cx/charts/palette")) {
96
+ @include cx-palette();
97
+ }
@@ -0,0 +1,22 @@
1
+ @use "sass:map";
2
+ @import "axis/variables";
3
+
4
+ $cx-default-swimlanes-lane-background-color: #f1f1f1;
5
+ $cx-default-range-marker-color: #696969;
6
+
7
+ $cx-dependencies: map.merge(
8
+ $cx-dependencies,
9
+ (
10
+ "cx/charts/Bar": "cx/charts/palette",
11
+ "cx/charts/BarGraph": "cx/charts/palette",
12
+ "cx/charts/Column": "cx/charts/palette",
13
+ "cx/charts/ColumnGraph": "cx/charts/palette",
14
+ "cx/charts/LineGraph": "cx/charts/palette",
15
+ "cx/charts/ColorMap": "cx/charts/palette",
16
+ "cx/charts/ScatterGraph": "cx/charts/palette",
17
+ "cx/charts/BubbleGraph": "cx/charts/palette",
18
+ "cx/charts/MarkerLine": "cx/charts/palette",
19
+ "cx/charts/Marker": "cx/charts/palette",
20
+ "cx/charts/PieChart": "cx/charts/palette",
21
+ )
22
+ );
@@ -23,7 +23,7 @@ describe("ArrayElementView", function () {
23
23
  let store = new Store({ data: { letters } });
24
24
  let elementView = new ArrayElementView({ store, itemIndex: 1, arrayAccessor: getAccessor({ bind: "letters" }) });
25
25
  elementView.delete("$record");
26
- assert.deepEqual(store.get("letters"), [letters[0]]);
26
+ assert.deepEqual(store.get("letters"), [...letters[0]]);
27
27
  });
28
28
  it("exposes the element as under the given alias", function () {
29
29
  let letters = [{ letter: "A" }, { letter: "B" }];
@@ -0,0 +1,14 @@
1
+
2
+ $cx-include-global-rules: false !default;
3
+
4
+ @mixin cx-global-rules() {
5
+ @each $tag, $styles in $cx-element-style-map {
6
+ #{$tag} {
7
+ @include cx-add-rules($styles)
8
+ }
9
+ }
10
+ }
11
+
12
+ @if ($cx-include-global-rules and cx-call-once('cx/globals')) {
13
+ @include cx-global-rules();
14
+ }
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "cx/jsx-runtime";
2
2
  import assert from "assert";
3
- import { createTestRenderer } from "../util/test/createTestRenderer";
3
+ import { createTestRenderer } from "src/util/test/createTestRenderer";
4
4
  import { computable } from "../data";
5
5
  import { Store } from "../data/Store";
6
6
  import { createFunctionalComponent } from "../ui/createFunctionalComponent";
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "cx/jsx-runtime";
2
2
  import assert from "assert";
3
- import { createTestRenderer } from "../util/test/createTestRenderer";
3
+ import { createTestRenderer } from "src/util/test/createTestRenderer";
4
4
  import { Store } from "../data/Store";
5
5
  import { createFunctionalComponent } from "../ui/createFunctionalComponent";
6
6
  import { useTrigger } from "./useTrigger";
@@ -0,0 +1,6 @@
1
+ @import "global";
2
+ @import "util/index";
3
+ @import "ui/index";
4
+ @import "widgets/index";
5
+ @import "svg/index";
6
+ @import "charts/index";
@@ -1,15 +1,16 @@
1
1
  import type { JSX as ReactJSX } from "react";
2
2
  import { Instance } from "./ui/Instance";
3
- import type { Prop } from "./ui/Prop";
3
+ import type { ClassProp, Prop } from "./ui/Prop";
4
4
  import { Widget } from "./ui/Widget";
5
5
  import { HtmlElementConfig } from "./widgets/HtmlElement";
6
+ import { ChildNode } from "./ui/Container";
6
7
  export declare function jsx(typeName: any, props: any, key?: string): any;
7
8
  export declare const jsxs: typeof jsx;
8
9
  type ReactIntrinsicElements = ReactJSX.IntrinsicElements;
9
10
  type IsEventHandler<K, T> = K extends `on${string}` ? (T extends Function ? true : false) : false;
10
11
  type CxEventHandler<T> = T extends (event: infer E) => any ? string | ((event: E, instance: Instance) => void) : string | T;
11
12
  type CxIntrinsicElement<T> = {
12
- [K in keyof T]: K extends "children" ? any : IsEventHandler<K, T[K]> extends true ? CxEventHandler<T[K]> : Prop<T[K]>;
13
+ [K in keyof T]: K extends "children" ? ChildNode | ChildNode[] : K extends "className" | "class" ? ClassProp : IsEventHandler<K, T[K]> extends true ? CxEventHandler<T[K]> : Prop<T[K]>;
13
14
  } & HtmlElementConfig;
14
15
  type CxIntrinsicElements = {
15
16
  [K in keyof ReactIntrinsicElements]: CxIntrinsicElement<ReactIntrinsicElements[K]>;
@@ -0,0 +1,28 @@
1
+ @use "sass:map";
2
+
3
+ @mixin cx-svg(
4
+ $name: 'svg',
5
+ $besm: $cx-besm
6
+ ) {
7
+ $block: map.get($besm, block);
8
+ $element: map.get($besm, element);
9
+ $state: map.get($besm, state);
10
+ $mod: map.get($besm, mod);
11
+
12
+ .#{$block}#{$name} {
13
+ box-sizing: border-box;
14
+ overflow: hidden;
15
+ position: relative;
16
+ height: 150px; //default height
17
+
18
+ & > svg {
19
+ width: 100%;
20
+ height: 100%;
21
+ position: absolute;
22
+ }
23
+ }
24
+ }
25
+
26
+ @if (cx-should-include('cx/svg/Svg')) {
27
+ @include cx-svg;
28
+ }
@@ -0,0 +1,9 @@
1
+ .cxs-text-anchor-middle {
2
+ text-anchor: middle;
3
+ }
4
+
5
+ .cxs-text-anchor-right {
6
+ text-anchor: end;
7
+ }
8
+
9
+ @import "Svg";
@@ -39,9 +39,11 @@ describe("Controller", () => {
39
39
  }
40
40
  class Cmp extends Widget {
41
41
  render(context, instance, key) {
42
- instance.invoke("onTest");
43
42
  return null;
44
43
  }
44
+ onInit(context, instance) {
45
+ instance.invoke("onTest");
46
+ }
45
47
  }
46
48
  let store = new Store();
47
49
  const component = createTestRenderer(store, _jsx("cx", { children: _jsx(Cmp, { controller: TestController, onTest: "callback" }) }));
@@ -63,9 +65,11 @@ describe("Controller", () => {
63
65
  }
64
66
  class Cmp extends Widget {
65
67
  render(context, instance, key) {
66
- instance.invoke("onTest");
67
68
  return null;
68
69
  }
70
+ onInit(context, instance) {
71
+ instance.invoke("onTest");
72
+ }
69
73
  }
70
74
  let store = new Store();
71
75
  const component = createTestRenderer(store, _jsx("cx", { children: _jsx("div", { controller: TestController1, children: _jsx(Cmp, { controller: TestController2, onTest: "callback1" }) }) }));
@@ -1,10 +1,11 @@
1
1
  /** @jsxImportSource react */
2
- import { Widget, WidgetConfig } from "../Widget";
2
+ import { Widget } from "../Widget";
3
3
  import { Store } from "../../data/Store";
4
4
  import { Instance } from "../Instance";
5
+ import { Create } from "../../util/Component";
5
6
  export interface StartAppLoopOptions {
6
7
  destroyDelay?: number;
7
8
  removeParentDOMElement?: boolean;
8
9
  [key: string]: any;
9
10
  }
10
- export declare function startAppLoop(parentDOMElement: HTMLElement, storeOrInstance?: Store | Instance, widget?: Widget | WidgetConfig, options?: StartAppLoopOptions): () => void;
11
+ export declare function startAppLoop(parentDOMElement: HTMLElement, storeOrInstance?: Store | Instance, widget?: Create<typeof Widget> | Create<typeof Widget>[], options?: StartAppLoopOptions): () => void;
@@ -1,6 +1,7 @@
1
1
  import { StartAppLoopOptions } from "./startAppLoop";
2
- import { Widget, WidgetConfig } from "../Widget";
2
+ import { Widget } from "../Widget";
3
3
  import { Store } from "../../data/Store";
4
+ import { Create } from "../../util/Component";
4
5
  export interface HotModule {
5
6
  hot?: {
6
7
  accept: () => void;
@@ -8,4 +9,4 @@ export interface HotModule {
8
9
  data?: any;
9
10
  };
10
11
  }
11
- export declare function startHotAppLoop(appModule: HotModule, element: HTMLElement, store: Store, widgets: Widget | WidgetConfig, options?: StartAppLoopOptions): () => void;
12
+ export declare function startHotAppLoop(appModule: HotModule, element: HTMLElement, store: Store, widgets: Create<typeof Widget> | Create<typeof Widget>[], options?: StartAppLoopOptions): () => void;
@@ -0,0 +1,2 @@
1
+
2
+ @import 'layout/index';
@@ -8,7 +8,7 @@ import { bind } from "../bind";
8
8
  describe("ContentPlaceholder", () => {
9
9
  it("allows putting content inside", () => {
10
10
  let store = new Store();
11
- const component = createTestRenderer(store, _jsx("cx", { children: _jsxs("div", { children: [_jsx("header", { children: _jsx(ContentPlaceholder, { name: "header" }) }), _jsx("main", { children: _jsx("h2", { putInto: "header", children: "Header" }) })] }) }));
11
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsxs("div", { children: [_jsx("header", { children: _jsx(ContentPlaceholder, { name: "header" }) }), _jsx("main", { children: _jsx("h2", { putInto: "header", children: "Header" }) })] }) })));
12
12
  let tree = component.toJSON();
13
13
  assert.deepEqual(tree, {
14
14
  type: "div",
@@ -39,7 +39,7 @@ describe("ContentPlaceholder", () => {
39
39
  headerText: "Header",
40
40
  },
41
41
  });
42
- const component = createTestRenderer(store, _jsx("cx", { children: _jsxs("div", { children: [_jsx(ContentPlaceholder, { name: "header" }), _jsx("h2", { putInto: "header", text: bind("headerText") })] }) }));
42
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsxs("div", { children: [_jsx(ContentPlaceholder, { name: "header" }), _jsx("h2", { putInto: "header", text: bind("headerText") })] }) })));
43
43
  let getTree = (headerText) => ({
44
44
  type: "div",
45
45
  props: {},
@@ -57,7 +57,7 @@ describe("ContentPlaceholder", () => {
57
57
  });
58
58
  it("allows putting multiple entries inside", () => {
59
59
  let store = new Store();
60
- const component = createTestRenderer(store, _jsx("cx", { children: _jsxs("div", { children: [_jsx("header", { children: _jsx(ContentPlaceholder, { name: "headers", allowMultiple: true }) }), _jsxs("main", { children: [_jsx("h2", { putInto: "headers", children: "Header1" }), _jsx("h2", { putInto: "headers", children: "Header2" })] })] }) }));
60
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsxs("div", { children: [_jsx("header", { children: _jsx(ContentPlaceholder, { name: "headers", allowMultiple: true }) }), _jsxs("main", { children: [_jsx("h2", { putInto: "headers", children: "Header1" }), _jsx("h2", { putInto: "headers", children: "Header2" })] })] }) })));
61
61
  let tree = component.toJSON();
62
62
  assert.deepEqual(tree, {
63
63
  type: "div",
@@ -89,7 +89,7 @@ describe("ContentPlaceholder", () => {
89
89
  });
90
90
  it("allows putting multiple entries inside when content is defined before and after the placeholder", () => {
91
91
  let store = new Store();
92
- const component = createTestRenderer(store, _jsx("cx", { children: _jsxs("div", { children: [_jsxs(PureContainer, { children: [_jsx("h2", { putInto: "headers", children: "Header1" }), _jsx("h2", { putInto: "headers", children: "Header2" })] }), _jsx("header", { children: _jsx(ContentPlaceholder, { name: "headers", allowMultiple: true }) }), _jsxs(PureContainer, { children: [_jsx("h2", { putInto: "headers", children: "Header3" }), _jsx("h2", { putInto: "headers", children: "Header4" })] })] }) }));
92
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsxs("div", { children: [_jsxs(PureContainer, { children: [_jsx("h2", { putInto: "headers", children: "Header1" }), _jsx("h2", { putInto: "headers", children: "Header2" })] }), _jsx("header", { children: _jsx(ContentPlaceholder, { name: "headers", allowMultiple: true }) }), _jsxs(PureContainer, { children: [_jsx("h2", { putInto: "headers", children: "Header3" }), _jsx("h2", { putInto: "headers", children: "Header4" })] })] }) })));
93
93
  let tree = component.toJSON();
94
94
  assert.deepEqual(tree, {
95
95
  type: "div",
@@ -126,7 +126,7 @@ describe("ContentPlaceholder", () => {
126
126
  });
127
127
  it("allows putting multiple entries into separate placeholders using content placeholder scopes", () => {
128
128
  let store = new Store();
129
- const component = createTestRenderer(store, _jsx("cx", { children: _jsxs("div", { children: [_jsxs(ContentPlaceholderScope, { name: "headers", children: [_jsx("h2", { putInto: "headers", children: "Header1" }), _jsx("h2", { putInto: "headers", children: "Header2" }), _jsx("header", { children: _jsx(ContentPlaceholder, { name: "headers", allowMultiple: true }) })] }), _jsxs(ContentPlaceholderScope, { name: "headers", children: [_jsx("header", { children: _jsx(ContentPlaceholder, { name: "headers", allowMultiple: true }) }), _jsx("h2", { putInto: "headers", children: "Header3" }), _jsx("h2", { putInto: "headers", children: "Header4" })] })] }) }));
129
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsxs("div", { children: [_jsxs(ContentPlaceholderScope, { name: "headers", children: [_jsx("h2", { putInto: "headers", children: "Header1" }), _jsx("h2", { putInto: "headers", children: "Header2" }), _jsx("header", { children: _jsx(ContentPlaceholder, { name: "headers", allowMultiple: true }) })] }), _jsxs(ContentPlaceholderScope, { name: "headers", children: [_jsx("header", { children: _jsx(ContentPlaceholder, { name: "headers", allowMultiple: true }) }), _jsx("h2", { putInto: "headers", children: "Header3" }), _jsx("h2", { putInto: "headers", children: "Header4" })] })] }) })));
130
130
  let tree = component.toJSON();
131
131
  assert.deepEqual(tree, {
132
132
  type: "div",
@@ -170,7 +170,7 @@ describe("ContentPlaceholder", () => {
170
170
  it("is used for defining body position in outer layouts", () => {
171
171
  let store = new Store();
172
172
  let layout = (_jsx("cx", { children: _jsxs("div", { children: [_jsx("header", { children: "Header" }), _jsx(ContentPlaceholder, {}), _jsx("footer", { children: "Footer" })] }) }));
173
- const component = createTestRenderer(store, _jsx("cx", { children: _jsx("main", { outerLayout: layout }) }));
173
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsx("main", { outerLayout: layout }) })));
174
174
  assert.deepEqual(component.toJSON(), {
175
175
  type: "div",
176
176
  props: {},
@@ -202,7 +202,7 @@ describe("ContentPlaceholder", () => {
202
202
  },
203
203
  });
204
204
  let layout = (_jsx("cx", { children: _jsxs("div", { children: [_jsx("header", { children: _jsx(ContentPlaceholder, { name: "header" }) }), _jsx(ContentPlaceholder, {}), _jsx("footer", { children: _jsx(ContentPlaceholder, { name: "footer" }) })] }) }));
205
- const component = createTestRenderer(store, _jsx("cx", { children: _jsxs("main", { outerLayout: layout, children: [_jsx("div", { putInto: "header", children: _jsx("span", { text: bind("header") }) }), _jsx("div", { putInto: "footer", children: _jsx("span", { text: bind("footer") }) }), _jsx("span", { text: bind("body") })] }) }));
205
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsxs("main", { outerLayout: layout, children: [_jsx("div", { putInto: "header", children: _jsx("span", { text: bind("header") }) }), _jsx("div", { putInto: "footer", children: _jsx("span", { text: bind("footer") }) }), _jsx("span", { text: bind("body") })] }) })));
206
206
  let getTree = (h, b, f) => ({
207
207
  type: "div",
208
208
  props: {},
@@ -236,7 +236,7 @@ describe("ContentPlaceholder", () => {
236
236
  let store = new Store();
237
237
  let outerLayout = (_jsx("cx", { children: _jsx("div", { children: _jsx(ContentPlaceholder, {}) }) }));
238
238
  let innerLayout = (_jsx("cx", { children: _jsx("main", { outerLayout: outerLayout, children: _jsx(ContentPlaceholder, {}) }) }));
239
- const component = createTestRenderer(store, _jsx("cx", { children: _jsx("section", { outerLayout: innerLayout }) }));
239
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsx("section", { outerLayout: innerLayout }) })));
240
240
  let tree = component.toJSON();
241
241
  //console.log(tree);
242
242
  assert.deepEqual(tree, {
@@ -259,7 +259,7 @@ describe("ContentPlaceholder", () => {
259
259
  });
260
260
  it("works in strange order", () => {
261
261
  let store = new Store();
262
- const component = createTestRenderer(store, _jsx("cx", { children: _jsxs("div", { children: [_jsx(ContentPlaceholder, { name: "footer" }), _jsx(PureContainer, { putInto: "footer-content", children: "works" }), _jsxs(PureContainer, { putInto: "footer", children: ["It", _jsx(ContentPlaceholder, { name: "footer-content", children: "doesn't work" })] })] }) }));
262
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsxs("div", { children: [_jsx(ContentPlaceholder, { name: "footer" }), _jsx(PureContainer, { putInto: "footer-content", children: "works" }), _jsxs(PureContainer, { putInto: "footer", children: ["It", _jsx(ContentPlaceholder, { name: "footer-content", children: "doesn't work" })] })] }) })));
263
263
  let tree = component.toJSON();
264
264
  //console.log(tree);
265
265
  assert.deepEqual(tree, {
@@ -272,7 +272,7 @@ describe("ContentPlaceholder", () => {
272
272
  let store = new Store();
273
273
  let outerLayout = (_jsx("cx", { children: _jsx("div", { children: _jsx(ContentPlaceholder, {}) }) }));
274
274
  let innerLayout = (_jsx("cx", { children: _jsx(PureContainer, { children: _jsx("main", { outerLayout: outerLayout, children: _jsx(ContentPlaceholder, {}) }) }) }));
275
- const component = createTestRenderer(store, _jsx("cx", { children: _jsx("section", { outerLayout: innerLayout }) }));
275
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsx("section", { outerLayout: innerLayout }) })));
276
276
  assert.deepEqual(component.toJSON(), {
277
277
  type: "div",
278
278
  props: {},
@@ -283,7 +283,7 @@ describe("ContentPlaceholder", () => {
283
283
  let store = new Store();
284
284
  let outerLayout1 = (_jsx("cx", { children: _jsx("div", { children: _jsx(ContentPlaceholder, {}) }) }));
285
285
  let outerLayout2 = (_jsx("cx", { children: _jsx("main", { children: _jsx(ContentPlaceholder, {}) }) }));
286
- const component = createTestRenderer(store, _jsx("cx", { children: _jsx(PureContainer, { outerLayout: outerLayout1, children: _jsx(PureContainer, { outerLayout: outerLayout2, children: "Content" }) }) }));
286
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsx(PureContainer, { outerLayout: outerLayout1, children: _jsx(PureContainer, { outerLayout: outerLayout2, children: "Content" }) }) })));
287
287
  assert.deepEqual(component.toJSON(), {
288
288
  type: "div",
289
289
  props: {},
@@ -300,7 +300,7 @@ describe("ContentPlaceholder", () => {
300
300
  });
301
301
  let outerLayout = (_jsx("cx", { children: _jsxs("div", { children: [_jsx(ContentPlaceholder, {}), _jsx("footer", { children: _jsx(ContentPlaceholder, { name: "footer" }) })] }) }));
302
302
  let innerLayout = (_jsx("cx", { children: _jsx(PureContainer, { children: _jsxs(PureContainer, { outerLayout: outerLayout, children: [_jsx("header", { children: _jsx(ContentPlaceholder, { name: "header" }) }), _jsx(ContentPlaceholder, {})] }) }) }));
303
- const component = createTestRenderer(store, _jsx("cx", { children: _jsxs("main", { outerLayout: innerLayout, children: [_jsx("div", { putInto: "header", children: _jsx("span", { text: bind("header") }) }), _jsx("div", { putInto: "footer", children: _jsx("span", { text: bind("footer") }) }), _jsx("span", { text: bind("body") })] }) }));
303
+ const component = createTestRenderer(store, (_jsx("cx", { children: _jsxs("main", { outerLayout: innerLayout, children: [_jsx("div", { putInto: "header", children: _jsx("span", { text: bind("header") }) }), _jsx("div", { putInto: "footer", children: _jsx("span", { text: bind("footer") }) }), _jsx("span", { text: bind("body") })] }) })));
304
304
  let getTree = (h, b, f) => ({
305
305
  type: "div",
306
306
  props: {},
@@ -0,0 +1,47 @@
1
+
2
+ @use "sass:map";
3
+
4
+ @mixin cx-labelsleftlayout(
5
+ $name: 'labelsleftlayout',
6
+ $besm: $cx-besm
7
+ ) {
8
+ $block: map.get($besm, block);
9
+ $element: map.get($besm, element);
10
+ $state: map.get($besm, state);
11
+ $mod: map.get($besm, mod);
12
+
13
+ .#{$block}labelsleftlayout {
14
+ border-spacing: 0;
15
+
16
+ &.#{$mod}stretch {
17
+ width: 100%;
18
+
19
+ .#{$element}labelsleftlayout-label {
20
+ width: 5em;
21
+
22
+ .#{$block}label {
23
+ white-space: nowrap;
24
+ }
25
+ }
26
+ }
27
+ }
28
+
29
+ .#{$element}labelsleftlayout-field {
30
+ padding: 5px 0 5px 5px;
31
+ }
32
+
33
+ .#{$element}labelsleftlayout-label {
34
+ text-align: right;
35
+ vertical-align: top;
36
+
37
+ padding: 5px 5px 5px 0;
38
+
39
+ .#{$block}label {
40
+ padding-right: 0;
41
+ }
42
+ }
43
+ }
44
+
45
+ @if (cx-should-include('cx/ui/LabelsLeftLayout')) {
46
+ @include cx-labelsleftlayout();
47
+ }
@@ -0,0 +1,65 @@
1
+ @use "sass:map";
2
+
3
+ @mixin cx-labelstoplayout(
4
+ $name: 'labelstoplayout',
5
+ $besm: $cx-besm
6
+ ) {
7
+ $block: map.get($besm, block);
8
+ $element: map.get($besm, element);
9
+ $state: map.get($besm, state);
10
+ $mod: map.get($besm, mod);
11
+
12
+ .#{$block}labelstoplayout {
13
+ border-spacing: 0 3px;
14
+
15
+ &.#{$mod}stretch {
16
+ width: 100%;
17
+
18
+ //unsure what it does
19
+ //.#{$element}labelstoplayout-label {
20
+ // width: 10em;
21
+ //}
22
+ }
23
+ }
24
+
25
+ .#{$element}labelstoplayout-field {
26
+ padding: 0 5px;
27
+ box-sizing: border-box;
28
+ vertical-align: top;
29
+
30
+ &:first-child {
31
+ padding-left: 0;
32
+ }
33
+
34
+ &:last-child {
35
+ padding-right: 0;
36
+ }
37
+ }
38
+
39
+ .#{$element}labelstoplayout-label {
40
+ vertical-align: bottom;
41
+ padding: 5px 5px 0 5px;
42
+ box-sizing: border-box;
43
+
44
+ .#{$block}label {
45
+ padding-left: 0;
46
+ padding-bottom: 0;
47
+ }
48
+
49
+ &:first-child {
50
+ padding-left: 0;
51
+ }
52
+
53
+ &:last-child {
54
+ padding-right: 0;
55
+ }
56
+ }
57
+
58
+ .#{$mod}fixed {
59
+ table-layout: fixed;
60
+ }
61
+ }
62
+
63
+ @if (cx-should-include('cx/ui/LabelsTopLayout')) {
64
+ @include cx-labelstoplayout();
65
+ }
@@ -0,0 +1,3 @@
1
+
2
+ @import "LabelsLeftLayout";
3
+ @import "LabelsTopLayout";
@@ -0,0 +1,2 @@
1
+
2
+ // Layout variables
@@ -0,0 +1,2 @@
1
+
2
+ @import "layout/variables";
@@ -12,6 +12,6 @@ interface EventMap {
12
12
  keyup: KeyboardEvent;
13
13
  keypress: KeyboardEvent;
14
14
  }
15
- export declare function addEventListenerWithOptions<K extends keyof EventMap>(element: Element, event: K, callback: (event: EventMap[K]) => void, options: AddEventListenerOptions): () => void;
16
- export declare function addEventListenerWithOptions(element: Element, event: string, callback: (event: Event) => void, options: AddEventListenerOptions): () => void;
15
+ export declare function addEventListenerWithOptions<K extends keyof EventMap>(element: Element | Document, event: K, callback: (event: EventMap[K]) => void, options: AddEventListenerOptions): () => void;
16
+ export declare function addEventListenerWithOptions(element: Element | Document, event: string, callback: (event: Event) => void, options: AddEventListenerOptions): () => void;
17
17
  export {};
@@ -0,0 +1,7 @@
1
+ $cx-call-once-data: () !default;
2
+
3
+ @function cx-call-once($name) {
4
+ $result: map_get($cx-call-once-data, $name);
5
+ $cx-call-once-data: map_merge($cx-call-once-data, ($name: true)) !global;
6
+ @return $result != true;
7
+ }
@@ -0,0 +1,11 @@
1
+ .cx-text-left.cx-text-left {
2
+ text-align: left;
3
+ }
4
+
5
+ .cx-text-right.cx-text-right {
6
+ text-align: right;
7
+ }
8
+
9
+ .cx-text-center.cx-text-center {
10
+ text-align: center;
11
+ }
@@ -0,0 +1,40 @@
1
+ @use "sass:map";
2
+
3
+ @mixin cx-add-rules($styles) {
4
+ @each $rule, $value in $styles {
5
+ #{$rule}: $value;
6
+ }
7
+ }
8
+
9
+ @mixin cx-add-state-rules($state-style-map, $key) {
10
+ @include cx-add-rules(map.get($state-style-map, $key));
11
+ }
12
+
13
+ @function cx-merge-state-style-maps($state-style-map, $override-style-map) {
14
+ $result: $state-style-map;
15
+
16
+ @if ($override-style-map != null) {
17
+ @each $key, $new-value in $override-style-map {
18
+ $old-value: map.get($state-style-map, $key);
19
+ @if ($old-value != null) {
20
+ $new-value: map.merge($old-value, $new-value);
21
+ }
22
+ $result: map.merge(
23
+ $result,
24
+ (
25
+ $key: $new-value,
26
+ )
27
+ );
28
+ }
29
+ }
30
+
31
+ @return $result;
32
+ }
33
+
34
+ @function cx-get-state-rule($state-style-map, $key, $rule, $default: null) {
35
+ $result: map.get(map.get($state-style-map, $key), $rule);
36
+ @if ($result != null) {
37
+ @return $result;
38
+ }
39
+ @return $default;
40
+ }
@@ -0,0 +1,45 @@
1
+ @use "sass:list";
2
+ @use "sass:map";
3
+ @use "sass:math";
4
+
5
+ @function cx-calc($lengths...) {
6
+ $units: ();
7
+
8
+ @each $l in $lengths {
9
+ $unit: math.unit($l);
10
+ @if (map.has-key($units, $unit)) {
11
+ $nl: map.get($units, $unit) + $l;
12
+ $units: map.merge($units, ($unit: $nl))
13
+ } @else {
14
+ $units: map.merge($units, ($unit: $l))
15
+ }
16
+ }
17
+
18
+ $keys: map.keys($units);
19
+ @if (list.length($keys) == 1) {
20
+ @return map.get($units, list.nth($keys, 1));
21
+ }
22
+
23
+ $calc: '';
24
+ $count: 0;
25
+
26
+ @each $u, $v in $units {
27
+ @if ($v != 0) {
28
+ $count: $count + 1;
29
+ @if ($count > 1) {
30
+ $calc: $calc + ' + ';
31
+ }
32
+ $calc: $calc + $v;
33
+ }
34
+ }
35
+
36
+ @if ($count == 0) {
37
+ @return 0;
38
+ }
39
+
40
+ @if ($count == 1) {
41
+ @return #{$calc};
42
+ }
43
+
44
+ @return #{'calc(' + $calc + ')'};
45
+ }