@rowsncolumns/charts 28.0.0 → 28.1.1

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 (193) hide show
  1. package/dist/cjs/atoms/pivot-chart.atom.d.ts +14 -0
  2. package/dist/cjs/atoms/pivot-chart.atom.d.ts.map +1 -0
  3. package/dist/cjs/atoms/pivot-chart.atom.js +9 -0
  4. package/dist/cjs/basic-chart/basic-chart.d.ts +1 -1
  5. package/dist/cjs/basic-chart/basic-chart.d.ts.map +1 -1
  6. package/dist/cjs/basic-chart/basic-chart.js +863 -371
  7. package/dist/cjs/components/dialogs/pivot-chart-dialog.d.ts +39 -0
  8. package/dist/cjs/components/dialogs/pivot-chart-dialog.d.ts.map +1 -0
  9. package/dist/cjs/components/dialogs/pivot-chart-dialog.js +100 -0
  10. package/dist/cjs/components/editors/chart-editor.d.ts +13 -1
  11. package/dist/cjs/components/editors/chart-editor.d.ts.map +1 -1
  12. package/dist/cjs/components/editors/chart-editor.js +225 -59
  13. package/dist/cjs/config.d.ts.map +1 -1
  14. package/dist/cjs/config.js +149 -12
  15. package/dist/cjs/hooks/use-charts.d.ts +21 -6
  16. package/dist/cjs/hooks/use-charts.d.ts.map +1 -1
  17. package/dist/cjs/hooks/use-charts.js +13 -1
  18. package/dist/cjs/hooks/use-on-create-chart.d.ts.map +1 -1
  19. package/dist/cjs/hooks/use-on-create-chart.js +7 -1
  20. package/dist/cjs/hooks/use-on-move-chart-to-sheet.d.ts +12 -0
  21. package/dist/cjs/hooks/use-on-move-chart-to-sheet.d.ts.map +1 -0
  22. package/dist/cjs/hooks/use-on-move-chart-to-sheet.js +26 -0
  23. package/dist/cjs/hooks/use-on-move-chart.d.ts +1 -1
  24. package/dist/cjs/hooks/use-on-move-chart.d.ts.map +1 -1
  25. package/dist/cjs/hooks/use-on-move-chart.js +2 -2
  26. package/dist/cjs/hooks/use-on-resize-chart.d.ts +1 -1
  27. package/dist/cjs/hooks/use-on-resize-chart.d.ts.map +1 -1
  28. package/dist/cjs/hooks/use-on-resize-chart.js +2 -2
  29. package/dist/cjs/index.d.ts +11 -0
  30. package/dist/cjs/index.d.ts.map +1 -1
  31. package/dist/cjs/index.js +34 -1
  32. package/dist/cjs/interface/create-chart.d.ts.map +1 -1
  33. package/dist/cjs/interface/create-chart.js +33 -42
  34. package/dist/cjs/interface/delete-chart.d.ts.map +1 -1
  35. package/dist/cjs/interface/delete-chart.js +4 -0
  36. package/dist/cjs/interface/move-chart-to-sheet.d.ts +13 -0
  37. package/dist/cjs/interface/move-chart-to-sheet.d.ts.map +1 -0
  38. package/dist/cjs/interface/move-chart-to-sheet.js +136 -0
  39. package/dist/cjs/interface/move-chart.d.ts +2 -2
  40. package/dist/cjs/interface/move-chart.d.ts.map +1 -1
  41. package/dist/cjs/interface/move-chart.js +7 -1
  42. package/dist/cjs/interface/resize-chart.d.ts +2 -2
  43. package/dist/cjs/interface/resize-chart.d.ts.map +1 -1
  44. package/dist/cjs/interface/resize-chart.js +7 -1
  45. package/dist/cjs/interface/update-chart.d.ts.map +1 -1
  46. package/dist/cjs/interface/update-chart.js +4 -0
  47. package/dist/cjs/plotly/basic-chart/basic-chart.d.ts +1 -1
  48. package/dist/cjs/plotly/basic-chart/basic-chart.d.ts.map +1 -1
  49. package/dist/cjs/plotly/basic-chart/basic-chart.js +970 -585
  50. package/dist/cjs/plotly/basic-chart/helpers.d.ts.map +1 -1
  51. package/dist/cjs/plotly/basic-chart/helpers.js +3 -0
  52. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  53. package/dist/cjs/types.d.ts +7 -0
  54. package/dist/cjs/types.d.ts.map +1 -1
  55. package/dist/cjs/utils/axis-number-format.d.ts +69 -0
  56. package/dist/cjs/utils/axis-number-format.d.ts.map +1 -0
  57. package/dist/cjs/utils/axis-number-format.js +217 -0
  58. package/dist/cjs/utils/category-levels.d.ts +27 -0
  59. package/dist/cjs/utils/category-levels.d.ts.map +1 -0
  60. package/dist/cjs/utils/category-levels.js +80 -0
  61. package/dist/cjs/utils/chart-image.d.ts +8 -0
  62. package/dist/cjs/utils/chart-image.d.ts.map +1 -0
  63. package/dist/cjs/utils/chart-image.js +28 -0
  64. package/dist/cjs/utils/chart-orientation.d.ts +67 -0
  65. package/dist/cjs/utils/chart-orientation.d.ts.map +1 -0
  66. package/dist/cjs/utils/chart-orientation.js +265 -0
  67. package/dist/cjs/utils/chart-spec-utils.d.ts +3 -0
  68. package/dist/cjs/utils/chart-spec-utils.d.ts.map +1 -1
  69. package/dist/cjs/utils/chart-spec-utils.js +12 -4
  70. package/dist/cjs/utils/chart-styles.d.ts +75 -0
  71. package/dist/cjs/utils/chart-styles.d.ts.map +1 -0
  72. package/dist/cjs/utils/chart-styles.js +283 -0
  73. package/dist/cjs/utils/empty-cells.d.ts +30 -0
  74. package/dist/cjs/utils/empty-cells.d.ts.map +1 -0
  75. package/dist/cjs/utils/empty-cells.js +91 -0
  76. package/dist/cjs/utils/overrides.d.ts +6 -1
  77. package/dist/cjs/utils/overrides.d.ts.map +1 -1
  78. package/dist/cjs/utils/overrides.js +19 -7
  79. package/dist/cjs/utils/pie-explosion.d.ts +30 -0
  80. package/dist/cjs/utils/pie-explosion.d.ts.map +1 -0
  81. package/dist/cjs/utils/pie-explosion.js +55 -0
  82. package/dist/cjs/utils/plotly-click.d.ts +34 -0
  83. package/dist/cjs/utils/plotly-click.d.ts.map +1 -0
  84. package/dist/cjs/utils/plotly-click.js +49 -0
  85. package/dist/cjs/utils/plotly-surface.d.ts +14 -0
  86. package/dist/cjs/utils/plotly-surface.d.ts.map +1 -0
  87. package/dist/cjs/utils/plotly-surface.js +64 -0
  88. package/dist/cjs/utils/plotly-title.d.ts +12 -0
  89. package/dist/cjs/utils/plotly-title.d.ts.map +1 -0
  90. package/dist/cjs/utils/plotly-title.js +24 -0
  91. package/dist/cjs/utils/series-click.d.ts +39 -0
  92. package/dist/cjs/utils/series-click.d.ts.map +1 -0
  93. package/dist/cjs/utils/series-click.js +75 -0
  94. package/dist/cjs/utils/three-d.d.ts +17 -1
  95. package/dist/cjs/utils/three-d.d.ts.map +1 -1
  96. package/dist/cjs/utils/three-d.js +32 -4
  97. package/dist/esm/atoms/pivot-chart.atom.d.ts +14 -0
  98. package/dist/esm/atoms/pivot-chart.atom.d.ts.map +1 -0
  99. package/dist/esm/atoms/pivot-chart.atom.js +4 -0
  100. package/dist/esm/basic-chart/basic-chart.d.ts +1 -1
  101. package/dist/esm/basic-chart/basic-chart.d.ts.map +1 -1
  102. package/dist/esm/basic-chart/basic-chart.js +680 -178
  103. package/dist/esm/components/dialogs/pivot-chart-dialog.d.ts +39 -0
  104. package/dist/esm/components/dialogs/pivot-chart-dialog.d.ts.map +1 -0
  105. package/dist/esm/components/dialogs/pivot-chart-dialog.js +89 -0
  106. package/dist/esm/components/editors/chart-editor.d.ts +13 -1
  107. package/dist/esm/components/editors/chart-editor.d.ts.map +1 -1
  108. package/dist/esm/components/editors/chart-editor.js +164 -20
  109. package/dist/esm/config.d.ts.map +1 -1
  110. package/dist/esm/config.js +149 -12
  111. package/dist/esm/hooks/use-charts.d.ts +21 -6
  112. package/dist/esm/hooks/use-charts.d.ts.map +1 -1
  113. package/dist/esm/hooks/use-charts.js +13 -1
  114. package/dist/esm/hooks/use-on-create-chart.d.ts.map +1 -1
  115. package/dist/esm/hooks/use-on-create-chart.js +7 -1
  116. package/dist/esm/hooks/use-on-move-chart-to-sheet.d.ts +12 -0
  117. package/dist/esm/hooks/use-on-move-chart-to-sheet.d.ts.map +1 -0
  118. package/dist/esm/hooks/use-on-move-chart-to-sheet.js +19 -0
  119. package/dist/esm/hooks/use-on-move-chart.d.ts +1 -1
  120. package/dist/esm/hooks/use-on-move-chart.d.ts.map +1 -1
  121. package/dist/esm/hooks/use-on-move-chart.js +2 -2
  122. package/dist/esm/hooks/use-on-resize-chart.d.ts +1 -1
  123. package/dist/esm/hooks/use-on-resize-chart.d.ts.map +1 -1
  124. package/dist/esm/hooks/use-on-resize-chart.js +2 -2
  125. package/dist/esm/index.d.ts +11 -0
  126. package/dist/esm/index.d.ts.map +1 -1
  127. package/dist/esm/index.js +14 -0
  128. package/dist/esm/interface/create-chart.d.ts.map +1 -1
  129. package/dist/esm/interface/create-chart.js +36 -58
  130. package/dist/esm/interface/delete-chart.d.ts.map +1 -1
  131. package/dist/esm/interface/delete-chart.js +4 -0
  132. package/dist/esm/interface/move-chart-to-sheet.d.ts +13 -0
  133. package/dist/esm/interface/move-chart-to-sheet.d.ts.map +1 -0
  134. package/dist/esm/interface/move-chart-to-sheet.js +126 -0
  135. package/dist/esm/interface/move-chart.d.ts +2 -2
  136. package/dist/esm/interface/move-chart.d.ts.map +1 -1
  137. package/dist/esm/interface/move-chart.js +7 -1
  138. package/dist/esm/interface/resize-chart.d.ts +2 -2
  139. package/dist/esm/interface/resize-chart.d.ts.map +1 -1
  140. package/dist/esm/interface/resize-chart.js +7 -1
  141. package/dist/esm/interface/update-chart.d.ts.map +1 -1
  142. package/dist/esm/interface/update-chart.js +4 -0
  143. package/dist/esm/plotly/basic-chart/basic-chart.d.ts +1 -1
  144. package/dist/esm/plotly/basic-chart/basic-chart.d.ts.map +1 -1
  145. package/dist/esm/plotly/basic-chart/basic-chart.js +858 -463
  146. package/dist/esm/plotly/basic-chart/helpers.d.ts.map +1 -1
  147. package/dist/esm/plotly/basic-chart/helpers.js +3 -0
  148. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  149. package/dist/esm/types.d.ts +7 -0
  150. package/dist/esm/types.d.ts.map +1 -1
  151. package/dist/esm/utils/axis-number-format.d.ts +69 -0
  152. package/dist/esm/utils/axis-number-format.d.ts.map +1 -0
  153. package/dist/esm/utils/axis-number-format.js +170 -0
  154. package/dist/esm/utils/category-levels.d.ts +27 -0
  155. package/dist/esm/utils/category-levels.d.ts.map +1 -0
  156. package/dist/esm/utils/category-levels.js +65 -0
  157. package/dist/esm/utils/chart-image.d.ts +8 -0
  158. package/dist/esm/utils/chart-image.d.ts.map +1 -0
  159. package/dist/esm/utils/chart-image.js +24 -0
  160. package/dist/esm/utils/chart-orientation.d.ts +67 -0
  161. package/dist/esm/utils/chart-orientation.d.ts.map +1 -0
  162. package/dist/esm/utils/chart-orientation.js +234 -0
  163. package/dist/esm/utils/chart-spec-utils.d.ts +3 -0
  164. package/dist/esm/utils/chart-spec-utils.d.ts.map +1 -1
  165. package/dist/esm/utils/chart-spec-utils.js +10 -2
  166. package/dist/esm/utils/chart-styles.d.ts +75 -0
  167. package/dist/esm/utils/chart-styles.d.ts.map +1 -0
  168. package/dist/esm/utils/chart-styles.js +357 -0
  169. package/dist/esm/utils/empty-cells.d.ts +30 -0
  170. package/dist/esm/utils/empty-cells.d.ts.map +1 -0
  171. package/dist/esm/utils/empty-cells.js +67 -0
  172. package/dist/esm/utils/overrides.d.ts +6 -1
  173. package/dist/esm/utils/overrides.d.ts.map +1 -1
  174. package/dist/esm/utils/overrides.js +14 -2
  175. package/dist/esm/utils/pie-explosion.d.ts +30 -0
  176. package/dist/esm/utils/pie-explosion.d.ts.map +1 -0
  177. package/dist/esm/utils/pie-explosion.js +43 -0
  178. package/dist/esm/utils/plotly-click.d.ts +34 -0
  179. package/dist/esm/utils/plotly-click.d.ts.map +1 -0
  180. package/dist/esm/utils/plotly-click.js +44 -0
  181. package/dist/esm/utils/plotly-surface.d.ts +14 -0
  182. package/dist/esm/utils/plotly-surface.d.ts.map +1 -0
  183. package/dist/esm/utils/plotly-surface.js +45 -0
  184. package/dist/esm/utils/plotly-title.d.ts +12 -0
  185. package/dist/esm/utils/plotly-title.d.ts.map +1 -0
  186. package/dist/esm/utils/plotly-title.js +20 -0
  187. package/dist/esm/utils/series-click.d.ts +39 -0
  188. package/dist/esm/utils/series-click.d.ts.map +1 -0
  189. package/dist/esm/utils/series-click.js +66 -0
  190. package/dist/esm/utils/three-d.d.ts +17 -1
  191. package/dist/esm/utils/three-d.d.ts.map +1 -1
  192. package/dist/esm/utils/three-d.js +29 -3
  193. package/package.json +13 -9
@@ -13,7 +13,9 @@ var editing_chart_atom_1 = require("../../atoms/editing-chart.atom");
13
13
  var chart_range_input_1 = require("./chart-range-input");
14
14
  var config_1 = require("../../config");
15
15
  var utils_1 = require("@rowsncolumns/utils");
16
+ var chart_orientation_1 = require("../../utils/chart-orientation");
16
17
  var chart_spec_utils_1 = require("../../utils/chart-spec-utils");
18
+ var chart_styles_1 = require("../../utils/chart-styles");
17
19
  var AGGREGATE_OPTIONS = [
18
20
  { label: "Sum", value: "SUM" },
19
21
  { label: "Average", value: "AVERAGE" },
@@ -22,6 +24,21 @@ var AGGREGATE_OPTIONS = [
22
24
  { label: "Min", value: "MIN" },
23
25
  { label: "Max", value: "MAX" },
24
26
  ];
27
+ /** Swatch for the theme-accent palette tile (the theme itself is resolved at render time). */
28
+ var THEME_PALETTE_PREVIEW = [
29
+ "#4472C4",
30
+ "#ED7D31",
31
+ "#A5A5A5",
32
+ "#FFC000",
33
+ "#5B9BD5",
34
+ "#70AD47",
35
+ ];
36
+ /** Excel's placement modes, in the order its Properties pane lists them. */
37
+ var CHART_PLACEMENT_OPTIONS = [
38
+ { label: "Move and size with cells", value: "moveAndSize" },
39
+ { label: "Move but don't size with cells", value: "moveOnly" },
40
+ { label: "Don't move or size with cells", value: "absolute" },
41
+ ];
25
42
  var Section = function (_a) {
26
43
  var title = _a.title, _b = _a.defaultOpen, defaultOpen = _b === void 0 ? false : _b, children = _a.children;
27
44
  return (react_1.default.createElement("details", { open: defaultOpen, className: "group border border-rnc-border border-solid rounded-md mb-2 px-3" },
@@ -31,8 +48,8 @@ var Section = function (_a) {
31
48
  react_1.default.createElement("div", { className: "flex flex-col gap-2 pb-3" }, children)));
32
49
  };
33
50
  var ChartEditor = function (_a) {
34
- var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22;
35
- var chart = _a.chart, sheetId = _a.sheetId, onSubmit = _a.onSubmit;
51
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39;
52
+ var chart = _a.chart, sheetId = _a.sheetId, onSubmit = _a.onSubmit, onRequestMoveChart = _a.onRequestMoveChart, getFormattedValue = _a.getFormattedValue;
36
53
  var setChartDialogState = (0, editing_chart_atom_1.useSetChartEditorDialogState)();
37
54
  // Close dialog
38
55
  var closeDialog = function () { return setChartDialogState(false); };
@@ -51,17 +68,19 @@ var ChartEditor = function (_a) {
51
68
  // eslint-disable-next-line react-hooks/exhaustive-deps
52
69
  [chart === null || chart === void 0 ? void 0 : chart.chartId]);
53
70
  // Formik
54
- var _23 = (0, formik_1.useFormik)({
71
+ var _40 = (0, formik_1.useFormik)({
55
72
  initialValues: initialValues,
56
73
  enableReinitialize: true,
57
74
  onSubmit: function (values) {
58
75
  // Submit against the live position so edits do not revert a
59
- // chart moved or resized while the editor was open.
60
- onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(chart ? tslib_1.__assign(tslib_1.__assign({}, values), { position: chart.position }) : values);
76
+ // chart moved or resized while the editor was open; the placement
77
+ // mode is the one property of the position the form owns.
78
+ onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(chart
79
+ ? tslib_1.__assign(tslib_1.__assign({}, values), { position: tslib_1.__assign(tslib_1.__assign({}, chart.position), { overlayPosition: tslib_1.__assign(tslib_1.__assign({}, chart.position.overlayPosition), { placement: values.position.overlayPosition.placement }) }) }) : values);
61
80
  // Close dialog
62
81
  closeDialog();
63
82
  },
64
- }), handleSubmit = _23.handleSubmit, setFieldValue = _23.setFieldValue, resetForm = _23.resetForm, values = _23.values;
83
+ }), handleSubmit = _40.handleSubmit, setFieldValue = _40.setFieldValue, resetForm = _40.resetForm, values = _40.values;
65
84
  var onCancelForm = function () {
66
85
  resetForm();
67
86
  closeDialog();
@@ -85,6 +104,19 @@ var ChartEditor = function (_a) {
85
104
  var isBarOrColumnBasic = basicSpec
86
105
  ? basicSpec.chartType === "bar" || basicSpec.chartType === "column"
87
106
  : false;
107
+ // Customize → "Chart options": each control names the chart types it
108
+ // applies to and the section renders when any of them does, so a chart type
109
+ // is never left out by a separately maintained list (pie was, until #783).
110
+ var chartOptionControls = {
111
+ binCount: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "histogram",
112
+ radarStyle: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "radar",
113
+ stockVariant: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "stock",
114
+ doughnutHoleSize: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "doughnut",
115
+ explosion: (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "pie" || (basicSpec === null || basicSpec === void 0 ? void 0 : basicSpec.chartType) === "doughnut",
116
+ gapWidth: isBarOrColumnBasic,
117
+ overlap: isBarOrColumnBasic,
118
+ };
119
+ var showChartOptions = Object.values(chartOptionControls).some(Boolean);
88
120
  // Check aggregate
89
121
  var isAggregateType = basicSpec
90
122
  ? basicSpec.series.some(function (serie) { return serie.aggregateType; })
@@ -138,13 +170,27 @@ var ChartEditor = function (_a) {
138
170
  }))))),
139
171
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
140
172
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Chart data range"),
141
- react_1.default.createElement(chart_range_input_1.ChartRangeInput, { key: values.chartId, sheetId: sheetId, range: (_c = (_b = values.spec) === null || _b === void 0 ? void 0 : _b.dataRange) !== null && _c !== void 0 ? _c : undefined, onChangeRange: function (range) {
173
+ ((_b = values.spec) === null || _b === void 0 ? void 0 : _b.pivotTableId) != null ? (
174
+ // A PivotChart's range follows its pivot's data area; it is not
175
+ // editable here (Excel greys the range on a PivotChart too).
176
+ react_1.default.createElement("span", { className: "font-system text-xs text-rnc-muted-foreground" }, "Bound to PivotTable \u2014 the data range follows the pivot.")) : (react_1.default.createElement(chart_range_input_1.ChartRangeInput, { key: values.chartId, sheetId: sheetId, range: (_d = (_c = values.spec) === null || _c === void 0 ? void 0 : _c.dataRange) !== null && _d !== void 0 ? _d : undefined, onChangeRange: function (range) {
142
177
  setFieldValue("spec.dataRange", range);
143
- }, required: true, placeholder: "Select a range", className: "mb-0" })),
178
+ }, required: true, placeholder: "Select a range", className: "mb-0" }))),
179
+ basicSpec ? (react_1.default.createElement(ui_1.Stack, { direction: "horizontal", className: "gap-2 pb-2 items-center" },
180
+ react_1.default.createElement(ui_1.Button, { type: "button", variant: "outline", size: "xs", disabled: !(0, chart_orientation_1.canSwitchRowColumn)(values.spec), onClick: function () {
181
+ var next = (0, chart_orientation_1.switchRowColumn)(values.spec, {
182
+ getFormattedValue: getFormattedValue,
183
+ });
184
+ if (next)
185
+ setFieldValue("spec", next);
186
+ } }, "Switch Row/Column"),
187
+ react_1.default.createElement("span", { className: "font-system text-xs text-rnc-muted-foreground" },
188
+ "Series in ",
189
+ (0, chart_orientation_1.inferSeriesOrientation)(values.spec)))) : null,
144
190
  basicSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
145
191
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
146
192
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Horizontal (category) axis labels"),
147
- ((_d = basicSpec.domains) !== null && _d !== void 0 ? _d : []).map(function (domain, i) {
193
+ ((_e = basicSpec.domains) !== null && _e !== void 0 ? _e : []).map(function (domain, i) {
148
194
  return domain.sources.map(function (source, idx) {
149
195
  return (react_1.default.createElement(chart_range_input_1.ChartRangeInput, { key: "".concat(values.chartId, "-domains-").concat(basicSpec.domains.length, "-").concat(i, "-").concat(idx), sheetId: sheetId, range: source, onChangeRange: function (range) {
150
196
  setFieldValue("spec.domains[".concat(i, "].sources[").concat(idx, "]"), range);
@@ -322,9 +368,9 @@ var ChartEditor = function (_a) {
322
368
  } }),
323
369
  "Use first row as headers"),
324
370
  bubbleSpec.chartType === "bubble"
325
- ? renderChartDataSection("Bubble labels", "bubbleLabels", (_e = bubbleSpec.bubbleLabels) !== null && _e !== void 0 ? _e : [], "Select the cells containing labels for each bubble.")
371
+ ? renderChartDataSection("Bubble labels", "bubbleLabels", (_f = bubbleSpec.bubbleLabels) !== null && _f !== void 0 ? _f : [], "Select the cells containing labels for each bubble.")
326
372
  : null,
327
- renderChartDataSection("X values", "domains", (_f = bubbleSpec.domains) !== null && _f !== void 0 ? _f : [], "Choose the numeric values for the horizontal axis."),
373
+ renderChartDataSection("X values", "domains", (_g = bubbleSpec.domains) !== null && _g !== void 0 ? _g : [], "Choose the numeric values for the horizontal axis."),
328
374
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-2 pb-2" },
329
375
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Legend entries (series)"),
330
376
  bubbleSpec.series.map(function (seriesEntry, i) {
@@ -402,9 +448,24 @@ var ChartEditor = function (_a) {
402
448
  return setFieldValue("spec.useFirstRowAsHeaders", e.target.checked);
403
449
  } }),
404
450
  "Use first row as headers"),
405
- renderChartDataSection("Labels", "labels", (_g = treemapSpec.labels) !== null && _g !== void 0 ? _g : [], "Select the cells that contain node labels."),
406
- renderChartDataSection("Parent labels", "parentLabels", (_h = treemapSpec.parentLabels) !== null && _h !== void 0 ? _h : [], "Choose the cells that define each node's parent label."),
407
- renderChartDataSection("Size data", "sizeData", (_j = treemapSpec.sizeData) !== null && _j !== void 0 ? _j : [], "Provide numeric values to determine each node's size."))) : null,
451
+ renderChartDataSection("Labels", "labels", (_h = treemapSpec.labels) !== null && _h !== void 0 ? _h : [], "Select the cells that contain node labels."),
452
+ renderChartDataSection("Parent labels", "parentLabels", (_j = treemapSpec.parentLabels) !== null && _j !== void 0 ? _j : [], "Choose the cells that define each node's parent label."),
453
+ renderChartDataSection("Size data", "sizeData", (_k = treemapSpec.sizeData) !== null && _k !== void 0 ? _k : [], "Provide numeric values to determine each node's size."))) : null,
454
+ basicSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
455
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2 w-56" },
456
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Show empty cells as"),
457
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", "aria-label": "Show empty cells as", value: (_l = values.spec.emptyCells) !== null && _l !== void 0 ? _l : "gaps", onChange: function (event) {
458
+ var emptyCells = event.target.value;
459
+ setFieldValue("spec.emptyCells", emptyCells === "gaps" ? undefined : emptyCells);
460
+ } },
461
+ react_1.default.createElement("option", { value: "gaps" }, "Gaps"),
462
+ react_1.default.createElement("option", { value: "zero" }, "Zero"),
463
+ react_1.default.createElement("option", { value: "connect" }, "Connect data points with line"))),
464
+ react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
465
+ react_1.default.createElement("input", { type: "checkbox", checked: values.spec.showNaAsEmpty !== false, onChange: function (e) {
466
+ setFieldValue("spec.showNaAsEmpty", e.target.checked ? undefined : false);
467
+ } }),
468
+ "Show #N/A as an empty cell"))) : null,
408
469
  react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
409
470
  react_1.default.createElement("input", { type: "checkbox", checked: values.spec.hiddenDimensionStrategy === "SHOW_ALL", name: "showColumnStripes", onChange: function (e) {
410
471
  setFieldValue("spec.hiddenDimensionStrategy", e.target.checked
@@ -416,12 +477,96 @@ var ChartEditor = function (_a) {
416
477
  react_1.default.createElement(Section, { title: "Chart style", defaultOpen: true },
417
478
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
418
479
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Chart title"),
419
- react_1.default.createElement(ui_1.Input, { value: (_k = values === null || values === void 0 ? void 0 : values.spec.title) !== null && _k !== void 0 ? _k : "", type: "text", onChange: function (e) { return setFieldValue("spec.title", e.target.value); }, className: "text-xs", placeholder: "Enter chart title" }))),
480
+ react_1.default.createElement(ui_1.Input, { value: (_m = values === null || values === void 0 ? void 0 : values.spec.title) !== null && _m !== void 0 ? _m : "", type: "text", onChange: function (e) { return setFieldValue("spec.title", e.target.value); }, className: "text-xs", placeholder: "Enter chart title" })),
481
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
482
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Style"),
483
+ react_1.default.createElement("div", { className: "grid grid-cols-4 gap-1", role: "radiogroup" }, chart_styles_1.CHART_STYLES.map(function (style) {
484
+ var isActive = values.spec.chartStyle === style.id;
485
+ return (react_1.default.createElement("button", { key: style.id, type: "button", role: "radio", "aria-checked": isActive, "aria-label": style.label, title: style.label, onClick: function () {
486
+ return setFieldValue("spec", (0, chart_styles_1.applyChartStyle)(values.spec, style));
487
+ }, className: "flex items-end justify-center gap-0.5 h-8 rounded-sm border border-solid p-1 ".concat(isActive
488
+ ? "border-rnc-primary"
489
+ : "border-rnc-border"), style: { background: style.preview.background } }, style.preview.bars.map(function (color, i) { return (react_1.default.createElement("span", { key: "".concat(style.id, "-").concat(i), className: "w-1.5 rounded-[1px]", style: { height: 6 + i * 4, background: color } })); })));
490
+ }))),
491
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
492
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Colors"),
493
+ react_1.default.createElement("div", { className: "flex flex-col gap-1", role: "radiogroup" }, chart_styles_1.CHART_COLOR_PALETTES.map(function (palette) {
494
+ var _a, _b;
495
+ var current = (_a = values.spec.palette) !== null && _a !== void 0 ? _a : undefined;
496
+ var isActive = palette.colors
497
+ ? !!current &&
498
+ current.length === palette.colors.length &&
499
+ current.every(function (c, i) { var _a; return c === ((_a = palette.colors) === null || _a === void 0 ? void 0 : _a[i]); })
500
+ : !current || current.length === 0;
501
+ return (react_1.default.createElement("button", { key: palette.id, type: "button", role: "radio", "aria-checked": isActive, "aria-label": palette.label, title: palette.label, onClick: function () {
502
+ return setFieldValue("spec", (0, chart_styles_1.applyChartColorPalette)(values.spec, palette));
503
+ }, className: "flex items-center gap-1 rounded-sm border border-solid px-1 py-0.5 ".concat(isActive ? "border-rnc-primary" : "border-rnc-border") },
504
+ ((_b = palette.colors) !== null && _b !== void 0 ? _b : THEME_PALETTE_PREVIEW).map(function (color, i) { return (react_1.default.createElement("span", { key: "".concat(palette.id, "-").concat(i), className: "h-3 w-3 rounded-[1px]", style: { background: color } })); }),
505
+ react_1.default.createElement("span", { className: "font-system text-xs text-rnc-text-weak" }, palette.label)));
506
+ }))),
507
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
508
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Quick layout"),
509
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: "", "aria-label": "Quick layout", onChange: function (e) {
510
+ var layout = chart_styles_1.CHART_QUICK_LAYOUTS.find(function (entry) { return String(entry.id) === e.target.value; });
511
+ if (layout) {
512
+ setFieldValue("spec", (0, chart_styles_1.applyChartQuickLayout)(values.spec, layout));
513
+ }
514
+ } },
515
+ react_1.default.createElement("option", { value: "" }, "Choose a layout\u2026"),
516
+ chart_styles_1.CHART_QUICK_LAYOUTS.map(function (layout) { return (react_1.default.createElement("option", { key: layout.id, value: layout.id }, layout.label)); }))),
517
+ react_1.default.createElement("div", null,
518
+ react_1.default.createElement(ui_1.Button, { type: "button", size: "xs", onClick: function () {
519
+ return setFieldValue("spec", (0, chart_styles_1.resetChartToMatchStyle)(values.spec));
520
+ } }, "Reset to match style")),
521
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
522
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Title font"),
523
+ react_1.default.createElement("div", { className: "flex items-center gap-1 flex-wrap" },
524
+ react_1.default.createElement(ui_1.Input, { value: (_p = (_o = values.spec.titleTextFormat) === null || _o === void 0 ? void 0 : _o.fontFamily) !== null && _p !== void 0 ? _p : "", type: "text", onChange: function (e) {
525
+ return setFieldValue("spec.titleTextFormat.fontFamily", e.target.value || undefined);
526
+ }, className: "text-xs w-32", placeholder: "Font family", "aria-label": "Title font family" }),
527
+ react_1.default.createElement(ui_1.Input, { value: (_r = (_q = values.spec.titleTextFormat) === null || _q === void 0 ? void 0 : _q.fontSize) !== null && _r !== void 0 ? _r : "", type: "number", min: 1, onChange: function (e) {
528
+ return setFieldValue("spec.titleTextFormat.fontSize", e.target.value === "" ? undefined : Number(e.target.value));
529
+ }, className: "text-xs w-16", placeholder: "Size", "aria-label": "Title font size" }),
530
+ react_1.default.createElement("input", { type: "color", value: (_t = (_s = values.spec.titleTextFormat) === null || _s === void 0 ? void 0 : _s.color) !== null && _t !== void 0 ? _t : "#000000", onChange: function (e) {
531
+ return setFieldValue("spec.titleTextFormat.color", e.target.value);
532
+ }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer", "aria-label": "Title color" }),
533
+ react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
534
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_u = values.spec.titleTextFormat) === null || _u === void 0 ? void 0 : _u.bold), onChange: function (e) {
535
+ return setFieldValue("spec.titleTextFormat.bold", e.target.checked);
536
+ } }),
537
+ "Bold"),
538
+ react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
539
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_v = values.spec.titleTextFormat) === null || _v === void 0 ? void 0 : _v.italic), onChange: function (e) {
540
+ return setFieldValue("spec.titleTextFormat.italic", e.target.checked);
541
+ } }),
542
+ "Italic")))),
543
+ react_1.default.createElement(Section, { title: "Chart area" },
544
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
545
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Fill"),
546
+ react_1.default.createElement("div", { className: "flex items-center gap-1" },
547
+ react_1.default.createElement("input", { type: "color", value: (_w = values.spec.backgroundColor) !== null && _w !== void 0 ? _w : "#FFFFFF", onChange: function (e) {
548
+ return setFieldValue("spec.backgroundColor", e.target.value);
549
+ }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer", "aria-label": "Chart area fill" }),
550
+ values.spec.backgroundColor ? (react_1.default.createElement(ui_1.IconButton, { type: "button", onClick: function () {
551
+ return setFieldValue("spec.backgroundColor", undefined);
552
+ }, "aria-label": "No fill", title: "No fill" },
553
+ react_1.default.createElement(icons_1.CrossCircledIcon, null))) : (react_1.default.createElement("span", { className: "font-system text-xs text-rnc-text-weak" }, "Automatic")))),
554
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
555
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Border"),
556
+ react_1.default.createElement("div", { className: "flex items-center gap-1" },
557
+ react_1.default.createElement("input", { type: "color", value: (_x = values.borderColor) !== null && _x !== void 0 ? _x : "#D9D9D9", onChange: function (e) { return setFieldValue("borderColor", e.target.value); }, className: "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer", "aria-label": "Chart area border" }),
558
+ values.borderColor ? (react_1.default.createElement(ui_1.IconButton, { type: "button", onClick: function () { return setFieldValue("borderColor", undefined); }, "aria-label": "No border", title: "No border" },
559
+ react_1.default.createElement(icons_1.CrossCircledIcon, null))) : (react_1.default.createElement("span", { className: "font-system text-xs text-rnc-text-weak" }, "None")))),
560
+ react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
561
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean(values.spec.roundedCorners), onChange: function (e) {
562
+ return setFieldValue("spec.roundedCorners", e.target.checked);
563
+ } }),
564
+ "Rounded corners")),
420
565
  basicSpec ? (react_1.default.createElement(react_1.default.Fragment, null,
421
566
  react_1.default.createElement(Section, { title: "Legend" },
422
567
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
423
568
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Legend"),
424
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: (_m = (_l = values === null || values === void 0 ? void 0 : values.spec.legend) === null || _l === void 0 ? void 0 : _l.position) !== null && _m !== void 0 ? _m : "", onChange: function (e) {
569
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: (_z = (_y = values === null || values === void 0 ? void 0 : values.spec.legend) === null || _y === void 0 ? void 0 : _y.position) !== null && _z !== void 0 ? _z : "", onChange: function (e) {
425
570
  return setFieldValue("spec.legend.position", e.target.value || undefined);
426
571
  } },
427
572
  react_1.default.createElement("option", { value: "" }, "Auto"),
@@ -433,7 +578,7 @@ var ChartEditor = function (_a) {
433
578
  react_1.default.createElement(Section, { title: "Vertical axis" },
434
579
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
435
580
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Vertical axis title"),
436
- react_1.default.createElement(ui_1.Input, { value: (_o = values === null || values === void 0 ? void 0 : values.spec.verticalAxisTitle) !== null && _o !== void 0 ? _o : "", type: "text", onChange: function (e) {
581
+ react_1.default.createElement(ui_1.Input, { value: (_0 = values === null || values === void 0 ? void 0 : values.spec.verticalAxisTitle) !== null && _0 !== void 0 ? _0 : "", type: "text", onChange: function (e) {
437
582
  return setFieldValue("spec.verticalAxisTitle", e.target.value);
438
583
  }, className: "text-xs", placeholder: "Vertical axis title" })),
439
584
  isCartesianBasic ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-2 pb-2" },
@@ -441,104 +586,112 @@ var ChartEditor = function (_a) {
441
586
  react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
442
587
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 w-20" },
443
588
  react_1.default.createElement("label", { className: "font-system text-xs" }, "Min"),
444
- react_1.default.createElement(ui_1.Input, { type: "number", value: (_q = (_p = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _p === void 0 ? void 0 : _p.min) !== null && _q !== void 0 ? _q : "", onChange: function (e) {
589
+ react_1.default.createElement(ui_1.Input, { type: "number", value: (_2 = (_1 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _1 === void 0 ? void 0 : _1.min) !== null && _2 !== void 0 ? _2 : "", onChange: function (e) {
445
590
  return setFieldValue("spec.valueAxisOptions.min", e.target.value === ""
446
591
  ? undefined
447
592
  : Number(e.target.value));
448
593
  }, className: "text-xs", placeholder: "Auto" })),
449
594
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 w-20" },
450
595
  react_1.default.createElement("label", { className: "font-system text-xs" }, "Max"),
451
- react_1.default.createElement(ui_1.Input, { type: "number", value: (_s = (_r = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _r === void 0 ? void 0 : _r.max) !== null && _s !== void 0 ? _s : "", onChange: function (e) {
596
+ react_1.default.createElement(ui_1.Input, { type: "number", value: (_4 = (_3 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _3 === void 0 ? void 0 : _3.max) !== null && _4 !== void 0 ? _4 : "", onChange: function (e) {
452
597
  return setFieldValue("spec.valueAxisOptions.max", e.target.value === ""
453
598
  ? undefined
454
599
  : Number(e.target.value));
455
600
  }, className: "text-xs", placeholder: "Auto" }))),
456
601
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
457
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_t = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _t === void 0 ? void 0 : _t.logarithmic), onChange: function (e) {
602
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_5 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _5 === void 0 ? void 0 : _5.logarithmic), onChange: function (e) {
458
603
  return setFieldValue("spec.valueAxisOptions.logarithmic", e.target.checked || undefined);
459
604
  } }),
460
605
  "Logarithmic scale"),
461
606
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
462
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_u = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _u === void 0 ? void 0 : _u.reverse), onChange: function (e) {
607
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_6 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _6 === void 0 ? void 0 : _6.reverse), onChange: function (e) {
463
608
  return setFieldValue("spec.valueAxisOptions.reverse", e.target.checked || undefined);
464
609
  } }),
465
610
  "Reverse direction"),
466
611
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
467
- react_1.default.createElement("input", { type: "checkbox", checked: ((_v = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _v === void 0 ? void 0 : _v.showMajorGridlines) !==
612
+ react_1.default.createElement("input", { type: "checkbox", checked: ((_7 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _7 === void 0 ? void 0 : _7.showMajorGridlines) !==
468
613
  false, onChange: function (e) {
469
614
  return setFieldValue("spec.valueAxisOptions.showMajorGridlines", e.target.checked);
470
615
  } }),
471
616
  "Gridlines"),
617
+ react_1.default.createElement("label", { className: "font-system text-xs" }, "Number format"),
618
+ react_1.default.createElement(ui_1.Input, { value: (_9 = (_8 = values === null || values === void 0 ? void 0 : values.spec.valueAxisOptions) === null || _8 === void 0 ? void 0 : _8.numberFormatPattern) !== null && _9 !== void 0 ? _9 : "", type: "text", onChange: function (e) {
619
+ return setFieldValue("spec.valueAxisOptions.numberFormatPattern", e.target.value || undefined);
620
+ }, className: "text-xs w-32", placeholder: "Linked to source" }),
472
621
  basicSpec.series.some(function (s) { return s.useSecondaryAxis; }) ? (react_1.default.createElement(react_1.default.Fragment, null,
473
622
  react_1.default.createElement("label", { className: "font-system text-sm pt-1" }, "Secondary value axis"),
474
623
  react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
475
624
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 w-20" },
476
625
  react_1.default.createElement("label", { className: "font-system text-xs" }, "Min"),
477
- react_1.default.createElement(ui_1.Input, { type: "number", value: (_x = (_w = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _w === void 0 ? void 0 : _w.min) !== null && _x !== void 0 ? _x : "", onChange: function (e) {
626
+ react_1.default.createElement(ui_1.Input, { type: "number", value: (_11 = (_10 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _10 === void 0 ? void 0 : _10.min) !== null && _11 !== void 0 ? _11 : "", onChange: function (e) {
478
627
  return setFieldValue("spec.secondaryValueAxisOptions.min", e.target.value === ""
479
628
  ? undefined
480
629
  : Number(e.target.value));
481
630
  }, className: "text-xs", placeholder: "Auto" })),
482
631
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 w-20" },
483
632
  react_1.default.createElement("label", { className: "font-system text-xs" }, "Max"),
484
- react_1.default.createElement(ui_1.Input, { type: "number", value: (_z = (_y = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _y === void 0 ? void 0 : _y.max) !== null && _z !== void 0 ? _z : "", onChange: function (e) {
633
+ react_1.default.createElement(ui_1.Input, { type: "number", value: (_13 = (_12 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _12 === void 0 ? void 0 : _12.max) !== null && _13 !== void 0 ? _13 : "", onChange: function (e) {
485
634
  return setFieldValue("spec.secondaryValueAxisOptions.max", e.target.value === ""
486
635
  ? undefined
487
636
  : Number(e.target.value));
488
637
  }, className: "text-xs", placeholder: "Auto" }))),
489
638
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
490
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_0 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _0 === void 0 ? void 0 : _0.logarithmic), onChange: function (e) {
639
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_14 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _14 === void 0 ? void 0 : _14.logarithmic), onChange: function (e) {
491
640
  return setFieldValue("spec.secondaryValueAxisOptions.logarithmic", e.target.checked || undefined);
492
641
  } }),
493
642
  "Logarithmic scale"),
494
643
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
495
- react_1.default.createElement("input", { type: "checkbox", checked: ((_1 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _1 === void 0 ? void 0 : _1.showMajorGridlines) !== false, onChange: function (e) {
644
+ react_1.default.createElement("input", { type: "checkbox", checked: ((_15 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _15 === void 0 ? void 0 : _15.showMajorGridlines) !== false, onChange: function (e) {
496
645
  return setFieldValue("spec.secondaryValueAxisOptions.showMajorGridlines", e.target.checked);
497
646
  } }),
498
- "Gridlines"))) : null)) : null),
647
+ "Gridlines"),
648
+ react_1.default.createElement("label", { className: "font-system text-xs" }, "Number format"),
649
+ react_1.default.createElement(ui_1.Input, { value: (_17 = (_16 = values === null || values === void 0 ? void 0 : values.spec.secondaryValueAxisOptions) === null || _16 === void 0 ? void 0 : _16.numberFormatPattern) !== null && _17 !== void 0 ? _17 : "", type: "text", onChange: function (e) {
650
+ return setFieldValue("spec.secondaryValueAxisOptions.numberFormatPattern", e.target.value || undefined);
651
+ }, className: "text-xs w-32", placeholder: "Linked to source" }))) : null)) : null),
499
652
  react_1.default.createElement(Section, { title: "Horizontal axis" },
500
653
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
501
654
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Horizontal axis title"),
502
- react_1.default.createElement(ui_1.Input, { value: (_2 = values === null || values === void 0 ? void 0 : values.spec.horizontalAxisTitle) !== null && _2 !== void 0 ? _2 : "", type: "text", onChange: function (e) {
655
+ react_1.default.createElement(ui_1.Input, { value: (_18 = values === null || values === void 0 ? void 0 : values.spec.horizontalAxisTitle) !== null && _18 !== void 0 ? _18 : "", type: "text", onChange: function (e) {
503
656
  return setFieldValue("spec.horizontalAxisTitle", e.target.value);
504
657
  }, className: "text-xs", placeholder: "Horizontal axis title" })),
505
658
  isCartesianBasic ? (react_1.default.createElement(react_1.default.Fragment, null,
506
659
  react_1.default.createElement("label", { className: "font-system text-sm pt-1" }, "Category axis"),
507
660
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
508
- react_1.default.createElement("input", { type: "checkbox", checked: ((_3 = values === null || values === void 0 ? void 0 : values.spec.categoryAxisOptions) === null || _3 === void 0 ? void 0 : _3.showMajorGridlines) === true, onChange: function (e) {
661
+ react_1.default.createElement("input", { type: "checkbox", checked: ((_19 = values === null || values === void 0 ? void 0 : values.spec.categoryAxisOptions) === null || _19 === void 0 ? void 0 : _19.showMajorGridlines) === true, onChange: function (e) {
509
662
  return setFieldValue("spec.categoryAxisOptions.showMajorGridlines", e.target.checked);
510
663
  } }),
511
664
  "Gridlines"))) : null),
512
665
  react_1.default.createElement(Section, { title: "Data labels" },
513
666
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
514
667
  react_1.default.createElement("label", { className: "font-system text-sm flex items-center gap-1" },
515
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_4 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _4 === void 0 ? void 0 : _4.show), onChange: function (e) {
668
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_20 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _20 === void 0 ? void 0 : _20.show), onChange: function (e) {
516
669
  return setFieldValue("spec.dataLabels.show", e.target.checked);
517
670
  } }),
518
671
  "Show data labels"),
519
- ((_5 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _5 === void 0 ? void 0 : _5.show) ? (react_1.default.createElement("div", { className: "pl-4 flex flex-col gap-1" },
672
+ ((_21 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _21 === void 0 ? void 0 : _21.show) ? (react_1.default.createElement("div", { className: "pl-4 flex flex-col gap-1" },
520
673
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
521
- react_1.default.createElement("input", { type: "checkbox", checked: ((_6 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _6 === void 0 ? void 0 : _6.showValue) !== false, onChange: function (e) {
674
+ react_1.default.createElement("input", { type: "checkbox", checked: ((_22 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _22 === void 0 ? void 0 : _22.showValue) !== false, onChange: function (e) {
522
675
  return setFieldValue("spec.dataLabels.showValue", e.target.checked);
523
676
  } }),
524
677
  "Value"),
525
678
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
526
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_7 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _7 === void 0 ? void 0 : _7.showCategoryName), onChange: function (e) {
679
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_23 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _23 === void 0 ? void 0 : _23.showCategoryName), onChange: function (e) {
527
680
  return setFieldValue("spec.dataLabels.showCategoryName", e.target.checked);
528
681
  } }),
529
682
  "Category name"),
530
683
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
531
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_8 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _8 === void 0 ? void 0 : _8.showSeriesName), onChange: function (e) {
684
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_24 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _24 === void 0 ? void 0 : _24.showSeriesName), onChange: function (e) {
532
685
  return setFieldValue("spec.dataLabels.showSeriesName", e.target.checked);
533
686
  } }),
534
687
  "Series name"),
535
688
  react_1.default.createElement("label", { className: "font-system text-xs flex items-center gap-1" },
536
- react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_9 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _9 === void 0 ? void 0 : _9.showPercent), onChange: function (e) {
689
+ react_1.default.createElement("input", { type: "checkbox", checked: Boolean((_25 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _25 === void 0 ? void 0 : _25.showPercent), onChange: function (e) {
537
690
  return setFieldValue("spec.dataLabels.showPercent", e.target.checked);
538
691
  } }),
539
692
  "Percentage"),
540
693
  react_1.default.createElement("label", { className: "font-system text-xs" }, "Label position"),
541
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: (_11 = (_10 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _10 === void 0 ? void 0 : _10.position) !== null && _11 !== void 0 ? _11 : "outside", onChange: function (e) {
694
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-32", value: (_27 = (_26 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _26 === void 0 ? void 0 : _26.position) !== null && _27 !== void 0 ? _27 : "outside", onChange: function (e) {
542
695
  return setFieldValue("spec.dataLabels.position", e.target.value);
543
696
  } },
544
697
  react_1.default.createElement("option", { value: "center" }, "Center"),
@@ -548,55 +701,57 @@ var ChartEditor = function (_a) {
548
701
  react_1.default.createElement("option", { value: "outsideEnd" }, "Outside end"),
549
702
  react_1.default.createElement("option", { value: "bestFit" }, "Best fit")),
550
703
  react_1.default.createElement("label", { className: "font-system text-xs" }, "Number format pattern"),
551
- react_1.default.createElement(ui_1.Input, { value: (_13 = (_12 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _12 === void 0 ? void 0 : _12.numberFormatPattern) !== null && _13 !== void 0 ? _13 : "", type: "text", onChange: function (e) {
704
+ react_1.default.createElement(ui_1.Input, { value: (_29 = (_28 = values === null || values === void 0 ? void 0 : values.spec.dataLabels) === null || _28 === void 0 ? void 0 : _28.numberFormatPattern) !== null && _29 !== void 0 ? _29 : "", type: "text", onChange: function (e) {
552
705
  return setFieldValue("spec.dataLabels.numberFormatPattern", e.target.value || undefined);
553
706
  }, className: "text-xs w-32", placeholder: "#,##0.00" }))) : null)),
554
- basicSpec &&
555
- (basicSpec.chartType === "histogram" ||
556
- basicSpec.chartType === "radar" ||
557
- basicSpec.chartType === "stock" ||
558
- basicSpec.chartType === "doughnut" ||
559
- isBarOrColumnBasic) ? (react_1.default.createElement(Section, { title: "Chart options" },
560
- basicSpec.chartType === "histogram" ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
707
+ basicSpec && showChartOptions ? (react_1.default.createElement(Section, { title: "Chart options" },
708
+ chartOptionControls.binCount ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
561
709
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Bins (leave blank for auto)"),
562
- react_1.default.createElement(ui_1.Input, { value: (_14 = basicSpec.binCount) !== null && _14 !== void 0 ? _14 : "", type: "number", min: 1, onChange: function (e) {
710
+ react_1.default.createElement(ui_1.Input, { value: (_30 = basicSpec.binCount) !== null && _30 !== void 0 ? _30 : "", type: "number", min: 1, onChange: function (e) {
563
711
  var raw = e.target.value;
564
712
  setFieldValue("spec.binCount", raw === "" ? undefined : Number(raw));
565
713
  }, className: "text-xs", placeholder: "Auto (Sturges)" }))) : null,
566
- basicSpec.chartType === "radar" ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
714
+ chartOptionControls.radarStyle ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
567
715
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Radar style"),
568
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_15 = basicSpec.radarStyle) !== null && _15 !== void 0 ? _15 : "standard", onChange: function (e) {
716
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_31 = basicSpec.radarStyle) !== null && _31 !== void 0 ? _31 : "standard", onChange: function (e) {
569
717
  return setFieldValue("spec.radarStyle", e.target.value);
570
718
  } },
571
719
  react_1.default.createElement("option", { value: "standard" }, "Standard"),
572
720
  react_1.default.createElement("option", { value: "marker" }, "With markers"),
573
721
  react_1.default.createElement("option", { value: "filled" }, "Filled")))) : null,
574
- basicSpec.chartType === "stock" ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
722
+ chartOptionControls.stockVariant ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
575
723
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Stock variant"),
576
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_16 = basicSpec.stockVariant) !== null && _16 !== void 0 ? _16 : "HLC", onChange: function (e) {
724
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent", value: (_32 = basicSpec.stockVariant) !== null && _32 !== void 0 ? _32 : "HLC", onChange: function (e) {
577
725
  return setFieldValue("spec.stockVariant", e.target.value);
578
726
  } },
579
727
  react_1.default.createElement("option", { value: "HLC" }, "High-Low-Close"),
580
728
  react_1.default.createElement("option", { value: "OHLC" }, "Open-High-Low-Close"),
581
729
  react_1.default.createElement("option", { value: "VHLC" }, "Volume-High-Low-Close"),
582
730
  react_1.default.createElement("option", { value: "VOHLC" }, "Volume-Open-High-Low-Close")))) : null,
583
- basicSpec.chartType === "doughnut" ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
731
+ chartOptionControls.doughnutHoleSize ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
584
732
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Doughnut hole size (0-0.9)"),
585
- react_1.default.createElement(ui_1.Input, { type: "number", min: 0, max: 0.9, step: 0.05, value: (_17 = basicSpec.doughnutHoleSize) !== null && _17 !== void 0 ? _17 : "", onChange: function (e) {
733
+ react_1.default.createElement(ui_1.Input, { type: "number", min: 0, max: 0.9, step: 0.05, value: (_33 = basicSpec.doughnutHoleSize) !== null && _33 !== void 0 ? _33 : "", onChange: function (e) {
586
734
  return setFieldValue("spec.doughnutHoleSize", e.target.value === ""
587
735
  ? undefined
588
736
  : Number(e.target.value));
589
737
  }, className: "text-xs w-32", placeholder: "0.5" }))) : null,
590
- isBarOrColumnBasic ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
738
+ chartOptionControls.explosion ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
739
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Explosion (% of radius, 0-400)"),
740
+ react_1.default.createElement(ui_1.Input, { type: "number", min: 0, max: 400, step: 5, "aria-label": "Explosion", value: (_34 = basicSpec.explosion) !== null && _34 !== void 0 ? _34 : "", onChange: function (e) {
741
+ return setFieldValue("spec.explosion", e.target.value === ""
742
+ ? undefined
743
+ : Number(e.target.value));
744
+ }, className: "text-xs w-32", placeholder: "0" }))) : null,
745
+ chartOptionControls.gapWidth ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
591
746
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Gap width (0-500)"),
592
- react_1.default.createElement(ui_1.Input, { type: "number", min: 0, max: 500, value: (_18 = basicSpec.gapWidth) !== null && _18 !== void 0 ? _18 : "", onChange: function (e) {
747
+ react_1.default.createElement(ui_1.Input, { type: "number", min: 0, max: 500, value: (_35 = basicSpec.gapWidth) !== null && _35 !== void 0 ? _35 : "", onChange: function (e) {
593
748
  return setFieldValue("spec.gapWidth", e.target.value === ""
594
749
  ? undefined
595
750
  : Number(e.target.value));
596
751
  }, className: "text-xs w-32", placeholder: "150" }))) : null,
597
- isBarOrColumnBasic ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
752
+ chartOptionControls.overlap ? (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
598
753
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Series overlap (-100 to 100)"),
599
- react_1.default.createElement(ui_1.Input, { type: "number", min: -100, max: 100, value: (_19 = basicSpec.overlap) !== null && _19 !== void 0 ? _19 : "", onChange: function (e) {
754
+ react_1.default.createElement(ui_1.Input, { type: "number", min: -100, max: 100, value: (_36 = basicSpec.overlap) !== null && _36 !== void 0 ? _36 : "", onChange: function (e) {
600
755
  return setFieldValue("spec.overlap", e.target.value === ""
601
756
  ? undefined
602
757
  : Number(e.target.value));
@@ -604,7 +759,7 @@ var ChartEditor = function (_a) {
604
759
  bubbleSpec && bubbleSpec.chartType === "scatter" ? (react_1.default.createElement(Section, { title: "Chart options" },
605
760
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
606
761
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Scatter style"),
607
- react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-56", value: (_20 = bubbleSpec.scatterStyle) !== null && _20 !== void 0 ? _20 : "lineMarker", onChange: function (e) {
762
+ react_1.default.createElement("select", { className: "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent w-56", value: (_37 = bubbleSpec.scatterStyle) !== null && _37 !== void 0 ? _37 : "lineMarker", onChange: function (e) {
608
763
  return setFieldValue("spec.scatterStyle", e.target.value);
609
764
  } },
610
765
  react_1.default.createElement("option", { value: "lineMarker" }, "Straight lines with markers"),
@@ -615,14 +770,25 @@ var ChartEditor = function (_a) {
615
770
  bubbleSpec ? (react_1.default.createElement(Section, { title: "Axis titles" },
616
771
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
617
772
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Vertical axis title"),
618
- react_1.default.createElement(ui_1.Input, { value: (_21 = values === null || values === void 0 ? void 0 : values.spec.verticalAxisTitle) !== null && _21 !== void 0 ? _21 : "", type: "text", onChange: function (e) {
773
+ react_1.default.createElement(ui_1.Input, { value: (_38 = values === null || values === void 0 ? void 0 : values.spec.verticalAxisTitle) !== null && _38 !== void 0 ? _38 : "", type: "text", onChange: function (e) {
619
774
  return setFieldValue("spec.verticalAxisTitle", e.target.value);
620
775
  }, className: "text-xs", placeholder: "Vertical axis title" })),
621
776
  react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2" },
622
777
  react_1.default.createElement("label", { className: "font-system text-sm" }, "Horizontal axis title"),
623
- react_1.default.createElement(ui_1.Input, { value: (_22 = values === null || values === void 0 ? void 0 : values.spec.horizontalAxisTitle) !== null && _22 !== void 0 ? _22 : "", type: "text", onChange: function (e) {
778
+ react_1.default.createElement(ui_1.Input, { value: (_39 = values === null || values === void 0 ? void 0 : values.spec.horizontalAxisTitle) !== null && _39 !== void 0 ? _39 : "", type: "text", onChange: function (e) {
624
779
  return setFieldValue("spec.horizontalAxisTitle", e.target.value);
625
- }, className: "text-xs", placeholder: "Horizontal axis title" })))) : null)),
780
+ }, className: "text-xs", placeholder: "Horizontal axis title" })))) : null,
781
+ react_1.default.createElement(Section, { title: "Properties" },
782
+ react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1 pb-2", role: "radiogroup" }, CHART_PLACEMENT_OPTIONS.map(function (_a) {
783
+ var _b;
784
+ var label = _a.label, value = _a.value;
785
+ return (react_1.default.createElement("label", { key: value, className: "font-system text-sm flex items-center gap-1" },
786
+ react_1.default.createElement("input", { type: "radio", name: "placement", value: value, checked: ((_b = values.position.overlayPosition.placement) !== null && _b !== void 0 ? _b : "moveAndSize") === value, onChange: function () {
787
+ return setFieldValue("position.overlayPosition.placement", value);
788
+ } }),
789
+ label));
790
+ })),
791
+ onRequestMoveChart && chart ? (react_1.default.createElement(ui_1.Button, { type: "button", size: "xs", className: "mb-2", onClick: function () { return onRequestMoveChart(chart); } }, "Move chart\u2026")) : null))),
626
792
  react_1.default.createElement("div", { className: "flex gap-1 py-2 mt-1" },
627
793
  react_1.default.createElement(ui_1.Button, { type: "submit", variant: "primary", size: "xs" }, "Save"),
628
794
  react_1.default.createElement(ui_1.Button, { size: "xs", onClick: onCancelForm, type: "button" }, "Cancel"))));
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAqJ3D,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAgB1E,CAAC;AAYJ;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,OAAO,CAAC,SAAS,CAAC,KAAG,OAQzD,CAAC;AAiBF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,OAAO,CAAC,SAAS,CAAC,KAAG,MAmB9D,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAqR3D,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAgB1E,CAAC;AAYJ;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,OAAO,CAAC,SAAS,CAAC,KAAG,OAQzD,CAAC;AAuBF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,OAAO,CAAC,SAAS,CAAC,KAAG,MA4B9D,CAAC"}