@rowsncolumns/charts 28.1.14 → 28.1.16

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 (99) hide show
  1. package/dist/cjs/basic-chart/basic-chart.d.ts.map +1 -1
  2. package/dist/cjs/basic-chart/basic-chart.js +312 -271
  3. package/dist/cjs/components/editors/chart-editor-capabilities.d.ts +48 -0
  4. package/dist/cjs/components/editors/chart-editor-capabilities.d.ts.map +1 -0
  5. package/dist/cjs/components/editors/chart-editor-capabilities.js +62 -0
  6. package/dist/cjs/components/editors/chart-editor.d.ts.map +1 -1
  7. package/dist/cjs/components/editors/chart-editor.js +200 -534
  8. package/dist/cjs/components/editors/fields/axis-options-fields.d.ts +16 -0
  9. package/dist/cjs/components/editors/fields/axis-options-fields.d.ts.map +1 -0
  10. package/dist/cjs/components/editors/fields/axis-options-fields.js +31 -0
  11. package/dist/cjs/components/editors/fields/chart-type-options.d.ts +25 -0
  12. package/dist/cjs/components/editors/fields/chart-type-options.d.ts.map +1 -0
  13. package/dist/cjs/components/editors/fields/chart-type-options.js +170 -0
  14. package/dist/cjs/components/editors/fields/data-labels-fields.d.ts +15 -0
  15. package/dist/cjs/components/editors/fields/data-labels-fields.d.ts.map +1 -0
  16. package/dist/cjs/components/editors/fields/data-labels-fields.js +57 -0
  17. package/dist/cjs/components/editors/fields/primitives.d.ts +54 -0
  18. package/dist/cjs/components/editors/fields/primitives.d.ts.map +1 -0
  19. package/dist/cjs/components/editors/fields/primitives.js +52 -0
  20. package/dist/cjs/components/editors/fields/series-format-fields.d.ts +17 -0
  21. package/dist/cjs/components/editors/fields/series-format-fields.d.ts.map +1 -0
  22. package/dist/cjs/components/editors/fields/series-format-fields.js +165 -0
  23. package/dist/cjs/components/editors/fields/series-name-field.d.ts +16 -0
  24. package/dist/cjs/components/editors/fields/series-name-field.d.ts.map +1 -0
  25. package/dist/cjs/components/editors/fields/series-name-field.js +36 -0
  26. package/dist/cjs/components/editors/fields/text-format-fields.d.ts +20 -0
  27. package/dist/cjs/components/editors/fields/text-format-fields.d.ts.map +1 -0
  28. package/dist/cjs/components/editors/fields/text-format-fields.js +46 -0
  29. package/dist/cjs/config.d.ts.map +1 -1
  30. package/dist/cjs/config.js +3 -0
  31. package/dist/cjs/interface/create-chart.d.ts +3 -2
  32. package/dist/cjs/interface/create-chart.d.ts.map +1 -1
  33. package/dist/cjs/interface/create-chart.js +7 -0
  34. package/dist/cjs/plotly/basic-chart/basic-chart.d.ts.map +1 -1
  35. package/dist/cjs/plotly/basic-chart/basic-chart.js +255 -218
  36. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  37. package/dist/cjs/utils/chart-orientation.d.ts.map +1 -1
  38. package/dist/cjs/utils/chart-orientation.js +24 -12
  39. package/dist/cjs/utils/chart-spec-utils.d.ts.map +1 -1
  40. package/dist/cjs/utils/chart-spec-utils.js +120 -21
  41. package/dist/cjs/utils/echarts-overlays.d.ts +2 -0
  42. package/dist/cjs/utils/echarts-overlays.d.ts.map +1 -1
  43. package/dist/cjs/utils/echarts-overlays.js +25 -12
  44. package/dist/cjs/utils/series-name.d.ts +12 -0
  45. package/dist/cjs/utils/series-name.d.ts.map +1 -0
  46. package/dist/cjs/utils/series-name.js +26 -0
  47. package/dist/cjs/utils/trendline.d.ts +9 -0
  48. package/dist/cjs/utils/trendline.d.ts.map +1 -1
  49. package/dist/cjs/utils/trendline.js +16 -1
  50. package/dist/esm/basic-chart/basic-chart.d.ts.map +1 -1
  51. package/dist/esm/basic-chart/basic-chart.js +80 -38
  52. package/dist/esm/components/editors/chart-editor-capabilities.d.ts +48 -0
  53. package/dist/esm/components/editors/chart-editor-capabilities.d.ts.map +1 -0
  54. package/dist/esm/components/editors/chart-editor-capabilities.js +58 -0
  55. package/dist/esm/components/editors/chart-editor.d.ts.map +1 -1
  56. package/dist/esm/components/editors/chart-editor.js +166 -448
  57. package/dist/esm/components/editors/fields/axis-options-fields.d.ts +16 -0
  58. package/dist/esm/components/editors/fields/axis-options-fields.d.ts.map +1 -0
  59. package/dist/esm/components/editors/fields/axis-options-fields.js +22 -0
  60. package/dist/esm/components/editors/fields/chart-type-options.d.ts +25 -0
  61. package/dist/esm/components/editors/fields/chart-type-options.d.ts.map +1 -0
  62. package/dist/esm/components/editors/fields/chart-type-options.js +151 -0
  63. package/dist/esm/components/editors/fields/data-labels-fields.d.ts +15 -0
  64. package/dist/esm/components/editors/fields/data-labels-fields.d.ts.map +1 -0
  65. package/dist/esm/components/editors/fields/data-labels-fields.js +47 -0
  66. package/dist/esm/components/editors/fields/primitives.d.ts +54 -0
  67. package/dist/esm/components/editors/fields/primitives.d.ts.map +1 -0
  68. package/dist/esm/components/editors/fields/primitives.js +26 -0
  69. package/dist/esm/components/editors/fields/series-format-fields.d.ts +17 -0
  70. package/dist/esm/components/editors/fields/series-format-fields.d.ts.map +1 -0
  71. package/dist/esm/components/editors/fields/series-format-fields.js +143 -0
  72. package/dist/esm/components/editors/fields/series-name-field.d.ts +16 -0
  73. package/dist/esm/components/editors/fields/series-name-field.d.ts.map +1 -0
  74. package/dist/esm/components/editors/fields/series-name-field.js +31 -0
  75. package/dist/esm/components/editors/fields/text-format-fields.d.ts +20 -0
  76. package/dist/esm/components/editors/fields/text-format-fields.d.ts.map +1 -0
  77. package/dist/esm/components/editors/fields/text-format-fields.js +34 -0
  78. package/dist/esm/config.d.ts.map +1 -1
  79. package/dist/esm/config.js +3 -0
  80. package/dist/esm/interface/create-chart.d.ts +3 -2
  81. package/dist/esm/interface/create-chart.d.ts.map +1 -1
  82. package/dist/esm/interface/create-chart.js +8 -1
  83. package/dist/esm/plotly/basic-chart/basic-chart.d.ts.map +1 -1
  84. package/dist/esm/plotly/basic-chart/basic-chart.js +52 -30
  85. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  86. package/dist/esm/utils/chart-orientation.d.ts.map +1 -1
  87. package/dist/esm/utils/chart-orientation.js +20 -0
  88. package/dist/esm/utils/chart-spec-utils.d.ts.map +1 -1
  89. package/dist/esm/utils/chart-spec-utils.js +95 -8
  90. package/dist/esm/utils/echarts-overlays.d.ts +2 -0
  91. package/dist/esm/utils/echarts-overlays.d.ts.map +1 -1
  92. package/dist/esm/utils/echarts-overlays.js +15 -1
  93. package/dist/esm/utils/series-name.d.ts +12 -0
  94. package/dist/esm/utils/series-name.d.ts.map +1 -0
  95. package/dist/esm/utils/series-name.js +24 -0
  96. package/dist/esm/utils/trendline.d.ts +9 -0
  97. package/dist/esm/utils/trendline.d.ts.map +1 -1
  98. package/dist/esm/utils/trendline.js +14 -0
  99. package/package.json +3 -3
@@ -0,0 +1,16 @@
1
+ import type { ChartAxisOptions } from "@rowsncolumns/spreadsheet";
2
+ import React from "react";
3
+ /**
4
+ * One axis' options (`ChartAxisOptions`): a value axis has a scale
5
+ * (min / max / logarithmic), both have direction, gridlines, visibility
6
+ * and tick-label font; a value axis also has its number format.
7
+ */
8
+ export declare const AxisOptionsFields: ({ label, kind, value, onChange, gridlinesDefault, }: {
9
+ label: string;
10
+ kind: "value" | "category";
11
+ value: ChartAxisOptions | null | undefined;
12
+ onChange(next: ChartAxisOptions): void;
13
+ /** What an omitted `showMajorGridlines` means for this axis. */
14
+ gridlinesDefault?: boolean;
15
+ }) => React.JSX.Element;
16
+ //# sourceMappingURL=axis-options-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axis-options-fields.d.ts","sourceRoot":"","sources":["../../../../../components/editors/fields/axis-options-fields.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,MAAM,OAAO,CAAC;AAK1B;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,GAAI,qDAM/B;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,UAAU,CAAC;IAC3B,KAAK,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,sBAoEA,CAAC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AxisOptionsFields = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = tslib_1.__importDefault(require("react"));
6
+ var primitives_1 = require("./primitives");
7
+ var text_format_fields_1 = require("./text-format-fields");
8
+ /**
9
+ * One axis' options (`ChartAxisOptions`): a value axis has a scale
10
+ * (min / max / logarithmic), both have direction, gridlines, visibility
11
+ * and tick-label font; a value axis also has its number format.
12
+ */
13
+ var AxisOptionsFields = function (_a) {
14
+ var _b;
15
+ var label = _a.label, kind = _a.kind, value = _a.value, onChange = _a.onChange, _c = _a.gridlinesDefault, gridlinesDefault = _c === void 0 ? true : _c;
16
+ var set = function (patch) {
17
+ return onChange(tslib_1.__assign(tslib_1.__assign({}, (value !== null && value !== void 0 ? value : {})), patch));
18
+ };
19
+ return (react_1.default.createElement("div", { className: "flex flex-col gap-2 pb-2" },
20
+ react_1.default.createElement("label", { className: "font-system text-sm" }, label),
21
+ kind === "value" ? (react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
22
+ react_1.default.createElement(primitives_1.NumberField, { label: "Min", ariaLabel: "".concat(label, " min"), value: value === null || value === void 0 ? void 0 : value.min, onChange: function (min) { return set({ min: min }); }, placeholder: "Auto" }),
23
+ react_1.default.createElement(primitives_1.NumberField, { label: "Max", ariaLabel: "".concat(label, " max"), value: value === null || value === void 0 ? void 0 : value.max, onChange: function (max) { return set({ max: max }); }, placeholder: "Auto" }))) : null,
24
+ kind === "value" ? (react_1.default.createElement(primitives_1.CheckboxField, { label: "Logarithmic scale", ariaLabel: "".concat(label, " logarithmic scale"), checked: Boolean(value === null || value === void 0 ? void 0 : value.logarithmic), onChange: function (on) { return set({ logarithmic: on || undefined }); } })) : null,
25
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Reverse direction", ariaLabel: "".concat(label, " reverse direction"), checked: Boolean(value === null || value === void 0 ? void 0 : value.reverse), onChange: function (on) { return set({ reverse: on || undefined }); } }),
26
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Gridlines", ariaLabel: "".concat(label, " gridlines"), checked: (_b = value === null || value === void 0 ? void 0 : value.showMajorGridlines) !== null && _b !== void 0 ? _b : gridlinesDefault, onChange: function (showMajorGridlines) { return set({ showMajorGridlines: showMajorGridlines }); } }),
27
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Show axis", ariaLabel: "".concat(label, " visible"), checked: (value === null || value === void 0 ? void 0 : value.visible) !== false, onChange: function (on) { return set({ visible: on ? undefined : false }); } }),
28
+ kind === "value" ? (react_1.default.createElement(primitives_1.TextField, { label: "Number format", ariaLabel: "".concat(label, " number format"), value: value === null || value === void 0 ? void 0 : value.numberFormatPattern, onChange: function (numberFormatPattern) { return set({ numberFormatPattern: numberFormatPattern }); }, placeholder: "Linked to source" })) : null,
29
+ react_1.default.createElement(text_format_fields_1.TextFormatFields, { label: "".concat(label, " font"), collapsible: true, value: value === null || value === void 0 ? void 0 : value.textFormat, onChange: function (textFormat) { return set({ textFormat: textFormat }); } })));
30
+ };
31
+ exports.AxisOptionsFields = AxisOptionsFields;
@@ -0,0 +1,25 @@
1
+ import type { EmbeddedChart } from "@rowsncolumns/spreadsheet";
2
+ import React from "react";
3
+ import type { ChartEditorCapabilities } from "../chart-editor-capabilities";
4
+ type ChartSpec = EmbeddedChart["spec"];
5
+ /** `totalIndices` (0-based) ⇄ the "1, 4, 7" the user types (1-based). */
6
+ export declare const parseTotalPoints: (text: string) => number[] | undefined;
7
+ export declare const formatTotalPoints: (indices: number[] | null | undefined) => string;
8
+ /** Whether `ChartTypeOptionsFields` renders anything for this chart. */
9
+ export declare const chartTypeHasOptions: (spec: Pick<ChartSpec, "chartType"> & {
10
+ sourceChartType?: unknown;
11
+ }, capabilities: Pick<ChartEditorCapabilities, "category" | "hasGapWidth" | "hasOverlap">) => boolean;
12
+ /**
13
+ * The options a chart type has beyond its series and axes — Excel's
14
+ * Format Data Series → Series Options for histogram bins, box & whisker,
15
+ * waterfall totals, pie-of-pie splits, bubble sizing, treemap labels,
16
+ * radar / stock variants, doughnut hole, explosion, gap width and overlap.
17
+ * Returns `null` when the chart type has none.
18
+ */
19
+ export declare const ChartTypeOptionsFields: ({ spec, capabilities, setFieldValue, }: {
20
+ spec: ChartSpec;
21
+ capabilities: ChartEditorCapabilities;
22
+ setFieldValue(field: string, value: unknown): void;
23
+ }) => React.JSX.Element | null;
24
+ export {};
25
+ //# sourceMappingURL=chart-type-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart-type-options.d.ts","sourceRoot":"","sources":["../../../../../components/editors/fields/chart-type-options.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAG5E,KAAK,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;AAEvC,yEAAyE;AACzE,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,MAAM,EAAE,GAAG,SAQ1D,CAAC;AACF,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,KAAG,MAC3B,CAAC;AAE/C,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,GAC9B,MAAM,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,EAClE,cAAc,IAAI,CAAC,uBAAuB,EAAE,UAAU,GAAG,aAAa,GAAG,YAAY,CAAC,KACrF,OAkBF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GAAI,wCAIpC;IACD,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,EAAE,uBAAuB,CAAC;IACtC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CACpD,6BAuWA,CAAC"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChartTypeOptionsFields = exports.chartTypeHasOptions = exports.formatTotalPoints = exports.parseTotalPoints = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var ui_1 = require("@rowsncolumns/ui");
6
+ var react_1 = tslib_1.__importDefault(require("react"));
7
+ var primitives_1 = require("./primitives");
8
+ /** `totalIndices` (0-based) ⇄ the "1, 4, 7" the user types (1-based). */
9
+ var parseTotalPoints = function (text) {
10
+ var points = text
11
+ .split(/[,\s;]+/)
12
+ .map(function (part) { return Number.parseInt(part, 10); })
13
+ .filter(function (n) { return Number.isFinite(n) && n >= 1; })
14
+ .map(function (n) { return n - 1; });
15
+ var unique = tslib_1.__spreadArray([], tslib_1.__read(new Set(points)), false).sort(function (a, b) { return a - b; });
16
+ return unique.length ? unique : undefined;
17
+ };
18
+ exports.parseTotalPoints = parseTotalPoints;
19
+ var formatTotalPoints = function (indices) {
20
+ return (indices !== null && indices !== void 0 ? indices : []).map(function (i) { return i + 1; }).join(", ");
21
+ };
22
+ exports.formatTotalPoints = formatTotalPoints;
23
+ /** Whether `ChartTypeOptionsFields` renders anything for this chart. */
24
+ var chartTypeHasOptions = function (spec, capabilities) {
25
+ var _a;
26
+ var type = spec.chartType;
27
+ var token = String((_a = spec.sourceChartType) !== null && _a !== void 0 ? _a : "").toUpperCase();
28
+ return (type === "histogram" ||
29
+ type === "boxplot" ||
30
+ type === "waterfall" ||
31
+ (type === "pie" && token === "OF_PIE") ||
32
+ type === "bubble" ||
33
+ type === "scatter" ||
34
+ capabilities.category === "hierarchy" ||
35
+ type === "radar" ||
36
+ type === "stock" ||
37
+ type === "doughnut" ||
38
+ type === "pie" ||
39
+ capabilities.hasGapWidth ||
40
+ capabilities.hasOverlap);
41
+ };
42
+ exports.chartTypeHasOptions = chartTypeHasOptions;
43
+ /**
44
+ * The options a chart type has beyond its series and axes — Excel's
45
+ * Format Data Series → Series Options for histogram bins, box & whisker,
46
+ * waterfall totals, pie-of-pie splits, bubble sizing, treemap labels,
47
+ * radar / stock variants, doughnut hole, explosion, gap width and overlap.
48
+ * Returns `null` when the chart type has none.
49
+ */
50
+ var ChartTypeOptionsFields = function (_a) {
51
+ var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
52
+ var spec = _a.spec, capabilities = _a.capabilities, setFieldValue = _a.setFieldValue;
53
+ var s = spec;
54
+ var type = spec.chartType;
55
+ var isPareto = type === "histogram" && String((_b = s.sourceChartType) !== null && _b !== void 0 ? _b : "").toUpperCase() === "PARETO";
56
+ var isOfPie = type === "pie" && String((_c = s.sourceChartType) !== null && _c !== void 0 ? _c : "").toUpperCase() === "OF_PIE";
57
+ var controls = [];
58
+ if (type === "histogram") {
59
+ controls.push(react_1.default.createElement(ui_1.Stack, { key: "bins", direction: "vertical", className: "gap-2 pb-2" },
60
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Bins"),
61
+ react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
62
+ react_1.default.createElement(primitives_1.NumberField, { label: "Bins (leave blank for auto)", ariaLabel: "Bins (leave blank for auto)", value: s.binCount, min: 1, onChange: function (binCount) { return setFieldValue("spec.binCount", binCount); }, placeholder: "Auto", className: "text-xs w-28" }),
63
+ react_1.default.createElement(primitives_1.NumberField, { label: "Bin width", ariaLabel: "Bin width", value: s.binSize, min: 0, onChange: function (binSize) { return setFieldValue("spec.binSize", binSize); }, placeholder: "Auto" }),
64
+ react_1.default.createElement(primitives_1.SelectField, { label: "Interval closed on", ariaLabel: "Interval closed on", value: (_d = s.intervalClosed) !== null && _d !== void 0 ? _d : "r", options: [
65
+ { value: "r", label: "Right (a, b]" },
66
+ { value: "l", label: "Left [a, b)" },
67
+ ], onChange: function (intervalClosed) {
68
+ return setFieldValue("spec.intervalClosed", intervalClosed === "r" ? undefined : intervalClosed);
69
+ } })),
70
+ react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
71
+ react_1.default.createElement(primitives_1.NumberField, { label: "Overflow bin (values above)", ariaLabel: "Overflow bin", value: s.overflow, onChange: function (overflow) { return setFieldValue("spec.overflow", overflow); }, placeholder: "None", className: "text-xs w-28" }),
72
+ react_1.default.createElement(primitives_1.NumberField, { label: "Underflow bin (values below)", ariaLabel: "Underflow bin", value: s.underflow, onChange: function (underflow) { return setFieldValue("spec.underflow", underflow); }, placeholder: "None", className: "text-xs w-28" })),
73
+ isPareto ? (react_1.default.createElement(primitives_1.ColorField, { label: "Pareto line color", ariaLabel: "Pareto line color", value: s.paretoLineColor, onChange: function (color) { return setFieldValue("spec.paretoLineColor", color); }, onClear: function () { return setFieldValue("spec.paretoLineColor", undefined); } })) : null));
74
+ }
75
+ if (type === "boxplot") {
76
+ controls.push(react_1.default.createElement(ui_1.Stack, { key: "box", direction: "vertical", className: "gap-1 pb-2" },
77
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Box & whisker"),
78
+ react_1.default.createElement(primitives_1.SelectField, { label: "Quartile calculation", ariaLabel: "Quartile calculation", value: (_e = s.quartileMethod) !== null && _e !== void 0 ? _e : "exclusive", options: [
79
+ { value: "exclusive", label: "Exclusive median" },
80
+ { value: "inclusive", label: "Inclusive median" },
81
+ ], onChange: function (quartileMethod) { return setFieldValue("spec.quartileMethod", quartileMethod); }, className: "w-40" }),
82
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Show outlier points", checked: s.showOutliers !== false, onChange: function (on) { return setFieldValue("spec.showOutliers", on ? undefined : false); } }),
83
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Show mean markers", checked: Boolean(s.showMeanMarker), onChange: function (on) { return setFieldValue("spec.showMeanMarker", on || undefined); } }),
84
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Show inner points", checked: Boolean(s.showInnerPoints), onChange: function (on) { return setFieldValue("spec.showInnerPoints", on || undefined); } }),
85
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Show mean line", checked: Boolean(s.showMeanLine), onChange: function (on) { return setFieldValue("spec.showMeanLine", on || undefined); } })));
86
+ }
87
+ if (type === "waterfall") {
88
+ controls.push(react_1.default.createElement(ui_1.Stack, { key: "waterfall", direction: "vertical", className: "gap-1 pb-2" },
89
+ react_1.default.createElement(primitives_1.TextField, { label: "Total points (1-based, comma-separated)", ariaLabel: "Total points", value: (0, exports.formatTotalPoints)(s.totalIndices), onChange: function (text) { return setFieldValue("spec.totalIndices", (0, exports.parseTotalPoints)(text !== null && text !== void 0 ? text : "")); }, placeholder: "e.g. 4, 8", className: "text-xs w-40" }),
90
+ react_1.default.createElement("p", { className: "m-0 text-xs text-rnc-text-weak" }, "A total bar starts from zero instead of the running sum (Excel's \"Set as total\"). Decreases take each series' negative fill.")));
91
+ }
92
+ if (isOfPie) {
93
+ controls.push(react_1.default.createElement(ui_1.Stack, { key: "ofpie", direction: "vertical", className: "gap-2 pb-2" },
94
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Second plot"),
95
+ react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
96
+ react_1.default.createElement(primitives_1.SelectField, { label: "Split series by", ariaLabel: "Split series by", value: (_f = s.splitType) !== null && _f !== void 0 ? _f : "position", options: [
97
+ { value: "position", label: "Position" },
98
+ { value: "value", label: "Value" },
99
+ { value: "percent", label: "Percentage value" },
100
+ ], onChange: function (splitType) { return setFieldValue("spec.splitType", splitType); } }),
101
+ react_1.default.createElement(primitives_1.NumberField, { label: ((_g = s.splitType) !== null && _g !== void 0 ? _g : "position") === "position"
102
+ ? "Values in second plot"
103
+ : (s.splitType === "value" ? "Values less than" : "Values less than %"), ariaLabel: "Split position", value: s.splitPos, min: 0, onChange: function (splitPos) { return setFieldValue("spec.splitPos", splitPos); }, placeholder: "3" }),
104
+ react_1.default.createElement(primitives_1.NumberField, { label: "Second plot size (%)", ariaLabel: "Second plot size", value: s.secondPieSize, min: 5, max: 200, onChange: function (secondPieSize) { return setFieldValue("spec.secondPieSize", secondPieSize); }, placeholder: "75" }))));
105
+ }
106
+ if (type === "bubble") {
107
+ controls.push(react_1.default.createElement(ui_1.Stack, { key: "bubble", direction: "vertical", className: "gap-2 pb-2" },
108
+ react_1.default.createElement("label", { className: "font-system text-sm" }, "Bubble size"),
109
+ react_1.default.createElement("div", { className: "flex flex-wrap gap-2 items-end" },
110
+ react_1.default.createElement(primitives_1.NumberField, { label: "Scale bubble size to (%)", ariaLabel: "Bubble scale", value: s.bubbleScale, min: 0, max: 300, onChange: function (bubbleScale) { return setFieldValue("spec.bubbleScale", bubbleScale); }, placeholder: "100", className: "text-xs w-28" }),
111
+ react_1.default.createElement(primitives_1.SelectField, { label: "Size represents", ariaLabel: "Size represents", value: (_h = s.sizeRepresents) !== null && _h !== void 0 ? _h : "area", options: [
112
+ { value: "area", label: "Area of bubbles" },
113
+ { value: "width", label: "Width of bubbles" },
114
+ ], onChange: function (sizeRepresents) {
115
+ return setFieldValue("spec.sizeRepresents", sizeRepresents === "area" ? undefined : sizeRepresents);
116
+ } }))));
117
+ }
118
+ if (type === "scatter") {
119
+ controls.push(react_1.default.createElement(primitives_1.SelectField, { key: "scatter", label: "Scatter style", ariaLabel: "Scatter style", value: (_j = s.scatterStyle) !== null && _j !== void 0 ? _j : "lineMarker", options: [
120
+ { value: "lineMarker", label: "Straight lines with markers" },
121
+ { value: "line", label: "Straight lines" },
122
+ { value: "marker", label: "Markers only" },
123
+ { value: "smoothMarker", label: "Smooth lines with markers" },
124
+ { value: "smooth", label: "Smooth lines" },
125
+ { value: "none", label: "No lines or markers" },
126
+ ], onChange: function (scatterStyle) { return setFieldValue("spec.scatterStyle", scatterStyle); }, className: "w-56" }));
127
+ }
128
+ if (capabilities.category === "hierarchy") {
129
+ controls.push(react_1.default.createElement(ui_1.Stack, { key: "hierarchy", direction: "vertical", className: "gap-1 pb-2" },
130
+ type === "treemap" ? (react_1.default.createElement(primitives_1.SelectField, { label: "Category labels", ariaLabel: "Category label layout", value: (_k = s.parentLabelLayout) !== null && _k !== void 0 ? _k : "banner", options: [
131
+ { value: "banner", label: "Banner" },
132
+ { value: "overlapping", label: "Overlapping" },
133
+ { value: "none", label: "None" },
134
+ ], onChange: function (parentLabelLayout) {
135
+ return setFieldValue("spec.parentLabelLayout", parentLabelLayout === "banner" ? undefined : parentLabelLayout);
136
+ }, className: "w-40" })) : null,
137
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Drill down on click", checked: Boolean(s.drillDown), onChange: function (on) { return setFieldValue("spec.drillDown", on || undefined); } })));
138
+ }
139
+ if (type === "radar") {
140
+ controls.push(react_1.default.createElement(primitives_1.SelectField, { key: "radar", label: "Radar style", ariaLabel: "Radar style", value: (_l = s.radarStyle) !== null && _l !== void 0 ? _l : "standard", options: [
141
+ { value: "standard", label: "Standard" },
142
+ { value: "marker", label: "With markers" },
143
+ { value: "filled", label: "Filled" },
144
+ ], onChange: function (radarStyle) { return setFieldValue("spec.radarStyle", radarStyle); }, className: "w-40" }));
145
+ }
146
+ if (type === "stock") {
147
+ controls.push(react_1.default.createElement(primitives_1.SelectField, { key: "stock", label: "Stock variant", ariaLabel: "Stock variant", value: (_m = s.stockVariant) !== null && _m !== void 0 ? _m : "HLC", options: [
148
+ { value: "HLC", label: "High-Low-Close" },
149
+ { value: "OHLC", label: "Open-High-Low-Close" },
150
+ { value: "VHLC", label: "Volume-High-Low-Close" },
151
+ { value: "VOHLC", label: "Volume-Open-High-Low-Close" },
152
+ ], onChange: function (stockVariant) { return setFieldValue("spec.stockVariant", stockVariant); }, className: "w-56" }));
153
+ }
154
+ if (type === "doughnut") {
155
+ controls.push(react_1.default.createElement(primitives_1.NumberField, { key: "hole", label: "Doughnut hole size (0-0.9)", ariaLabel: "Doughnut hole size (0-0.9)", value: s.doughnutHoleSize, min: 0, max: 0.9, step: 0.05, onChange: function (doughnutHoleSize) { return setFieldValue("spec.doughnutHoleSize", doughnutHoleSize); }, placeholder: "0.5", className: "text-xs w-32" }));
156
+ }
157
+ if (type === "pie" || type === "doughnut") {
158
+ controls.push(react_1.default.createElement(primitives_1.NumberField, { key: "explosion", label: "Explosion (% of radius, 0-400)", ariaLabel: "Explosion", value: s.explosion, min: 0, max: 400, step: 5, onChange: function (explosion) { return setFieldValue("spec.explosion", explosion); }, placeholder: "0", className: "text-xs w-32" }));
159
+ }
160
+ if (capabilities.hasGapWidth) {
161
+ controls.push(react_1.default.createElement(primitives_1.NumberField, { key: "gap", label: "Gap width (0-500)", ariaLabel: "Gap width (0-500)", value: s.gapWidth, min: 0, max: 500, onChange: function (gapWidth) { return setFieldValue("spec.gapWidth", gapWidth); }, placeholder: type === "histogram" ? "0" : "150", className: "text-xs w-32" }));
162
+ }
163
+ if (capabilities.hasOverlap) {
164
+ controls.push(react_1.default.createElement(primitives_1.NumberField, { key: "overlap", label: "Series overlap (-100 to 100)", ariaLabel: "Series overlap (-100 to 100)", value: s.overlap, min: -100, max: 100, onChange: function (overlap) { return setFieldValue("spec.overlap", overlap); }, placeholder: "0", className: "text-xs w-32" }));
165
+ }
166
+ if (!controls.length)
167
+ return null;
168
+ return react_1.default.createElement(react_1.default.Fragment, null, controls);
169
+ };
170
+ exports.ChartTypeOptionsFields = ChartTypeOptionsFields;
@@ -0,0 +1,15 @@
1
+ import type { ChartDataLabelsOptions } from "@rowsncolumns/spreadsheet";
2
+ import React from "react";
3
+ import type { ChartEditorCapabilities } from "../chart-editor-capabilities";
4
+ /**
5
+ * What a data label shows and where (`ChartDataLabelsOptions`) — the chart's
6
+ * labels, or one series' own when `perSeries` (Excel's Format Data Labels on
7
+ * one series: inherit the chart's, show its own, or hide them).
8
+ */
9
+ export declare const DataLabelsFields: ({ value, onChange, capabilities, perSeries, }: {
10
+ value: ChartDataLabelsOptions | null | undefined;
11
+ onChange(next: ChartDataLabelsOptions | undefined): void;
12
+ capabilities: Pick<ChartEditorCapabilities, "hasPercentLabels" | "hasBubbleSizeLabels">;
13
+ perSeries?: boolean;
14
+ }) => React.JSX.Element;
15
+ //# sourceMappingURL=data-labels-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-labels-fields.d.ts","sourceRoot":"","sources":["../../../../../components/editors/fields/data-labels-fields.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAoB5E;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAAI,+CAK9B;IACD,KAAK,EAAE,sBAAsB,GAAG,IAAI,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,sBAAsB,GAAG,SAAS,GAAG,IAAI,CAAC;IACzD,YAAY,EAAE,IAAI,CAChB,uBAAuB,EACvB,kBAAkB,GAAG,qBAAqB,CAC3C,CAAC;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,sBA2FA,CAAC"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataLabelsFields = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = tslib_1.__importDefault(require("react"));
6
+ var primitives_1 = require("./primitives");
7
+ var text_format_fields_1 = require("./text-format-fields");
8
+ var POSITIONS = [
9
+ { value: "center", label: "Center" },
10
+ { value: "inside", label: "Inside" },
11
+ { value: "outside", label: "Outside" },
12
+ { value: "insideEnd", label: "Inside end" },
13
+ { value: "outsideEnd", label: "Outside end" },
14
+ { value: "bestFit", label: "Best fit" },
15
+ { value: "above", label: "Above" },
16
+ { value: "below", label: "Below" },
17
+ { value: "left", label: "Left" },
18
+ { value: "right", label: "Right" },
19
+ ];
20
+ /**
21
+ * What a data label shows and where (`ChartDataLabelsOptions`) — the chart's
22
+ * labels, or one series' own when `perSeries` (Excel's Format Data Labels on
23
+ * one series: inherit the chart's, show its own, or hide them).
24
+ */
25
+ var DataLabelsFields = function (_a) {
26
+ var _b;
27
+ var value = _a.value, onChange = _a.onChange, capabilities = _a.capabilities, _c = _a.perSeries, perSeries = _c === void 0 ? false : _c;
28
+ var set = function (patch) {
29
+ return onChange(tslib_1.__assign(tslib_1.__assign({}, (value !== null && value !== void 0 ? value : {})), patch));
30
+ };
31
+ var mode = !value
32
+ ? "inherit"
33
+ : value.show
34
+ ? "show"
35
+ : "hide";
36
+ return (react_1.default.createElement("div", { className: "flex flex-col gap-1" },
37
+ perSeries ? (react_1.default.createElement(primitives_1.SelectField, { label: "Data labels", value: mode, options: [
38
+ { value: "inherit", label: "Same as chart" },
39
+ { value: "show", label: "Show" },
40
+ { value: "hide", label: "Hide" },
41
+ ], onChange: function (next) {
42
+ return onChange(next === "inherit"
43
+ ? undefined
44
+ : next === "show"
45
+ ? tslib_1.__assign(tslib_1.__assign({}, (value !== null && value !== void 0 ? value : {})), { show: true }) : { show: false });
46
+ }, className: "w-32" })) : (react_1.default.createElement(primitives_1.CheckboxField, { small: false, label: "Show data labels", checked: Boolean(value === null || value === void 0 ? void 0 : value.show), onChange: function (show) { return set({ show: show }); } })),
47
+ (value === null || value === void 0 ? void 0 : value.show) ? (react_1.default.createElement("div", { className: "pl-4 flex flex-col gap-1" },
48
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Value", checked: value.showValue !== false, onChange: function (showValue) { return set({ showValue: showValue }); } }),
49
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Category name", checked: Boolean(value.showCategoryName), onChange: function (showCategoryName) { return set({ showCategoryName: showCategoryName }); } }),
50
+ react_1.default.createElement(primitives_1.CheckboxField, { label: "Series name", checked: Boolean(value.showSeriesName), onChange: function (showSeriesName) { return set({ showSeriesName: showSeriesName }); } }),
51
+ capabilities.hasPercentLabels ? (react_1.default.createElement(primitives_1.CheckboxField, { label: "Percentage", checked: Boolean(value.showPercent), onChange: function (showPercent) { return set({ showPercent: showPercent }); } })) : null,
52
+ capabilities.hasBubbleSizeLabels ? (react_1.default.createElement(primitives_1.CheckboxField, { label: "Bubble size", checked: Boolean(value.showBubbleSize), onChange: function (showBubbleSize) { return set({ showBubbleSize: showBubbleSize }); } })) : null,
53
+ react_1.default.createElement(primitives_1.SelectField, { label: "Label position", value: (_b = value.position) !== null && _b !== void 0 ? _b : "outside", options: POSITIONS, onChange: function (position) { return set({ position: position }); }, className: "w-32" }),
54
+ react_1.default.createElement(primitives_1.TextField, { label: "Number format pattern", value: value.numberFormatPattern, onChange: function (numberFormatPattern) { return set({ numberFormatPattern: numberFormatPattern }); }, placeholder: "#,##0.00" }),
55
+ react_1.default.createElement(text_format_fields_1.TextFormatFields, { label: "Label font", value: value.textFormat, onChange: function (textFormat) { return set({ textFormat: textFormat }); } }))) : null));
56
+ };
57
+ exports.DataLabelsFields = DataLabelsFields;
@@ -0,0 +1,54 @@
1
+ import React from "react";
2
+ /**
3
+ * The editor's small native controls, styled like the rest of the dialog.
4
+ * They stay native (`<select>`, `<input type=checkbox|color>`) so the
5
+ * editor's test mocks of `@rowsncolumns/ui` keep covering it.
6
+ */
7
+ export declare const SELECT_CLASS = "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent";
8
+ export declare const COLOR_CLASS = "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer";
9
+ export declare const CheckboxField: ({ label, checked, onChange, small, ariaLabel, }: {
10
+ label: React.ReactNode;
11
+ checked: boolean;
12
+ onChange(checked: boolean): void;
13
+ small?: boolean;
14
+ ariaLabel?: string;
15
+ }) => React.JSX.Element;
16
+ export declare const SelectField: <T extends string>({ label, value, options, onChange, ariaLabel, className, }: {
17
+ label?: React.ReactNode;
18
+ value: T;
19
+ options: ReadonlyArray<{
20
+ value: T;
21
+ label: string;
22
+ }>;
23
+ onChange(value: T): void;
24
+ ariaLabel?: string;
25
+ className?: string;
26
+ }) => React.JSX.Element;
27
+ export declare const NumberField: ({ label, value, onChange, placeholder, min, max, step, ariaLabel, className, }: {
28
+ label?: React.ReactNode;
29
+ value: number | null | undefined;
30
+ onChange(value: number | undefined): void;
31
+ placeholder?: string;
32
+ min?: number;
33
+ max?: number;
34
+ step?: number;
35
+ ariaLabel?: string;
36
+ className?: string;
37
+ }) => React.JSX.Element;
38
+ export declare const TextField: ({ label, value, onChange, placeholder, ariaLabel, className, }: {
39
+ label?: React.ReactNode;
40
+ value: string | null | undefined;
41
+ onChange(value: string | undefined): void;
42
+ placeholder?: string;
43
+ ariaLabel?: string;
44
+ className?: string;
45
+ }) => React.JSX.Element;
46
+ export declare const ColorField: ({ label, value, fallback, onChange, onClear, ariaLabel, }: {
47
+ label?: React.ReactNode;
48
+ value: string | null | undefined;
49
+ fallback?: string;
50
+ onChange(value: string): void;
51
+ onClear?(): void;
52
+ ariaLabel?: string;
53
+ }) => React.JSX.Element;
54
+ //# sourceMappingURL=primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.d.ts","sourceRoot":"","sources":["../../../../../components/editors/fields/primitives.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;GAIG;AAEH,eAAO,MAAM,YAAY,yEAC+C,CAAC;AACzE,eAAO,MAAM,WAAW,kFACyD,CAAC;AAElF,eAAO,MAAM,aAAa,GAAI,iDAM3B;IACD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sBAYA,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAAE,4DAO3C;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,KAAK,EAAE,CAAC,CAAC;IACT,OAAO,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sBAgBA,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,gFAUzB;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sBAiBA,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,gEAOvB;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sBAYA,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,2DAOxB;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,sBAsBA,CAAC"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ColorField = exports.TextField = exports.NumberField = exports.SelectField = exports.CheckboxField = exports.COLOR_CLASS = exports.SELECT_CLASS = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var ui_1 = require("@rowsncolumns/ui");
6
+ var react_1 = tslib_1.__importDefault(require("react"));
7
+ /**
8
+ * The editor's small native controls, styled like the rest of the dialog.
9
+ * They stay native (`<select>`, `<input type=checkbox|color>`) so the
10
+ * editor's test mocks of `@rowsncolumns/ui` keep covering it.
11
+ */
12
+ exports.SELECT_CLASS = "border border-rnc-border rounded-sm px-1 py-1 text-xs bg-transparent";
13
+ exports.COLOR_CLASS = "h-6 w-8 p-0 border border-rnc-border rounded-sm bg-transparent cursor-pointer";
14
+ var CheckboxField = function (_a) {
15
+ var label = _a.label, checked = _a.checked, onChange = _a.onChange, _b = _a.small, small = _b === void 0 ? true : _b, ariaLabel = _a.ariaLabel;
16
+ return (react_1.default.createElement("label", { className: "font-system ".concat(small ? "text-xs" : "text-sm", " flex items-center gap-1") },
17
+ react_1.default.createElement("input", { type: "checkbox", checked: checked, "aria-label": ariaLabel, onChange: function (e) { return onChange(e.target.checked); } }),
18
+ label));
19
+ };
20
+ exports.CheckboxField = CheckboxField;
21
+ var SelectField = function (_a) {
22
+ var label = _a.label, value = _a.value, options = _a.options, onChange = _a.onChange, ariaLabel = _a.ariaLabel, className = _a.className;
23
+ return (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1" },
24
+ label ? react_1.default.createElement("label", { className: "font-system text-xs" }, label) : null,
25
+ react_1.default.createElement("select", { className: "".concat(exports.SELECT_CLASS, " ").concat(className !== null && className !== void 0 ? className : ""), "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (typeof label === "string" ? label : undefined), value: value, onChange: function (e) { return onChange(e.target.value); } }, options.map(function (option) { return (react_1.default.createElement("option", { key: option.value, value: option.value }, option.label)); }))));
26
+ };
27
+ exports.SelectField = SelectField;
28
+ var NumberField = function (_a) {
29
+ var label = _a.label, value = _a.value, onChange = _a.onChange, placeholder = _a.placeholder, min = _a.min, max = _a.max, step = _a.step, ariaLabel = _a.ariaLabel, _b = _a.className, className = _b === void 0 ? "text-xs w-20" : _b;
30
+ return (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1" },
31
+ label ? react_1.default.createElement("label", { className: "font-system text-xs" }, label) : null,
32
+ react_1.default.createElement(ui_1.Input, { type: "number", value: value !== null && value !== void 0 ? value : "", min: min, max: max, step: step, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (typeof label === "string" ? label : undefined), onChange: function (e) {
33
+ return onChange(e.target.value === "" ? undefined : Number(e.target.value));
34
+ }, className: className, placeholder: placeholder })));
35
+ };
36
+ exports.NumberField = NumberField;
37
+ var TextField = function (_a) {
38
+ var label = _a.label, value = _a.value, onChange = _a.onChange, placeholder = _a.placeholder, ariaLabel = _a.ariaLabel, _b = _a.className, className = _b === void 0 ? "text-xs w-32" : _b;
39
+ return (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1" },
40
+ label ? react_1.default.createElement("label", { className: "font-system text-xs" }, label) : null,
41
+ react_1.default.createElement(ui_1.Input, { type: "text", value: value !== null && value !== void 0 ? value : "", "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (typeof label === "string" ? label : undefined), onChange: function (e) { return onChange(e.target.value || undefined); }, className: className, placeholder: placeholder })));
42
+ };
43
+ exports.TextField = TextField;
44
+ var ColorField = function (_a) {
45
+ var label = _a.label, value = _a.value, _b = _a.fallback, fallback = _b === void 0 ? "#4285F4" : _b, onChange = _a.onChange, onClear = _a.onClear, ariaLabel = _a.ariaLabel;
46
+ return (react_1.default.createElement(ui_1.Stack, { direction: "vertical", className: "gap-1" },
47
+ label ? react_1.default.createElement("label", { className: "font-system text-xs" }, label) : null,
48
+ react_1.default.createElement("div", { className: "flex items-center gap-1" },
49
+ react_1.default.createElement("input", { type: "color", value: value !== null && value !== void 0 ? value : fallback, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : (typeof label === "string" ? label : undefined), onChange: function (e) { return onChange(e.target.value); }, className: exports.COLOR_CLASS }),
50
+ onClear && value ? (react_1.default.createElement("button", { type: "button", className: "font-system text-xs text-rnc-muted-foreground underline", onClick: onClear }, "Clear")) : null)));
51
+ };
52
+ exports.ColorField = ColorField;
@@ -0,0 +1,17 @@
1
+ import type { ChartData } from "@rowsncolumns/spreadsheet";
2
+ import React from "react";
3
+ import type { ChartEditorCapabilities } from "../chart-editor-capabilities";
4
+ /**
5
+ * Excel's Format Data Series for one series: axis, trendline (every
6
+ * option of Format Trendline), error bars (Format Error Bars), fill
7
+ * (gradient / no fill / per-point colours / invert if negative), markers
8
+ * and the series' own data labels. Only the groups the chart type has
9
+ * (`capabilities`) render.
10
+ */
11
+ export declare const SeriesFormatFields: ({ sheetId, series, capabilities, onChange, }: {
12
+ sheetId: number;
13
+ series: ChartData;
14
+ capabilities: ChartEditorCapabilities;
15
+ onChange(patch: Partial<ChartData>): void;
16
+ }) => React.JSX.Element;
17
+ //# sourceMappingURL=series-format-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"series-format-fields.d.ts","sourceRoot":"","sources":["../../../../../components/editors/fields/series-format-fields.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGV,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAqC5E;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAI,8CAKhC;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,uBAAuB,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;CAC3C,sBAoXA,CAAC"}