@apia/charts 2.0.9 → 2.0.10

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 (36) hide show
  1. package/dist/charts/chartJsRenderer/ChartComponent.d.ts +22 -0
  2. package/dist/charts/chartJsRenderer/ChartComponent.d.ts.map +1 -0
  3. package/dist/charts/chartJsRenderer/ChartComponent.js +248 -0
  4. package/dist/charts/chartJsRenderer/ChartComponent.js.map +1 -0
  5. package/dist/charts/types.d.ts +173 -0
  6. package/dist/charts/types.d.ts.map +1 -0
  7. package/dist/index.d.ts +4 -334
  8. package/dist/index.js +2 -1455
  9. package/dist/index.js.map +1 -1
  10. package/dist/widgets/WidgetComponent.d.ts +10 -0
  11. package/dist/widgets/WidgetComponent.d.ts.map +1 -0
  12. package/dist/widgets/WidgetComponent.js +54 -0
  13. package/dist/widgets/WidgetComponent.js.map +1 -0
  14. package/dist/widgets/counter/Counter.js +108 -0
  15. package/dist/widgets/counter/Counter.js.map +1 -0
  16. package/dist/widgets/custom/useCustomWidget.js +64 -0
  17. package/dist/widgets/custom/useCustomWidget.js.map +1 -0
  18. package/dist/widgets/custom/util.js +9 -0
  19. package/dist/widgets/custom/util.js.map +1 -0
  20. package/dist/widgets/oxford/Oxford.js +243 -0
  21. package/dist/widgets/oxford/Oxford.js.map +1 -0
  22. package/dist/widgets/ring/Ring.js +123 -0
  23. package/dist/widgets/ring/Ring.js.map +1 -0
  24. package/dist/widgets/scale/Scale.js +145 -0
  25. package/dist/widgets/scale/Scale.js.map +1 -0
  26. package/dist/widgets/speedMeter/SpeedMeter.js +189 -0
  27. package/dist/widgets/speedMeter/SpeedMeter.js.map +1 -0
  28. package/dist/widgets/tLight/TLight.js +134 -0
  29. package/dist/widgets/tLight/TLight.js.map +1 -0
  30. package/dist/widgets/thermometer/Thermometer.js +146 -0
  31. package/dist/widgets/thermometer/Thermometer.js.map +1 -0
  32. package/dist/widgets/thermometer/util.js +34 -0
  33. package/dist/widgets/thermometer/util.js.map +1 -0
  34. package/dist/widgets/types.d.ts +106 -0
  35. package/dist/widgets/types.d.ts.map +1 -0
  36. package/package.json +3 -3
@@ -0,0 +1,243 @@
1
+ import { jsx, jsxs } from '@apia/theme/jsx-runtime';
2
+ import { Box, createElement } from '@apia/theme';
3
+ import React from 'react';
4
+ import tinycolor from 'tinycolor2';
5
+ import { useGauge } from 'use-gauge';
6
+ import { noNaN } from '@apia/util';
7
+
8
+ const START_ANGLE = 45;
9
+ const END_ANGLE = 315;
10
+ const Oxford = ({
11
+ backgroundColor,
12
+ colorRanges,
13
+ currentValue,
14
+ currentValueColor,
15
+ currentValueFontSize,
16
+ height,
17
+ maxValue,
18
+ minValue,
19
+ pointerColor,
20
+ scaleValuesSize,
21
+ valueRanges,
22
+ width
23
+ }) => {
24
+ const value = currentValue;
25
+ const diameter = Math.min(height, width);
26
+ const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];
27
+ const domainMin = noNaN(minValue) ?? valueRanges[0];
28
+ const offset = 20;
29
+ const gauge = useGauge({
30
+ domain: [domainMin, domainMax],
31
+ startAngle: START_ANGLE,
32
+ endAngle: END_ANGLE,
33
+ numTicks: 10 + 1,
34
+ diameter
35
+ });
36
+ const gauge2 = useGauge({
37
+ domain: [valueRanges[0], valueRanges[valueRanges.length - 1]],
38
+ startAngle: START_ANGLE,
39
+ endAngle: END_ANGLE,
40
+ numTicks: valueRanges[valueRanges.length - 1] - valueRanges[0] + 1,
41
+ diameter
42
+ });
43
+ const needle = gauge.getNeedleProps({
44
+ value: 0,
45
+ baseRadius: 12,
46
+ tipRadius: 2
47
+ });
48
+ const angle = (END_ANGLE - START_ANGLE) * value / (domainMax - domainMin);
49
+ function getColor(value2) {
50
+ const index = valueRanges.findIndex(
51
+ (range) => noNaN(value2) <= noNaN(range)
52
+ );
53
+ if (index === -1) {
54
+ return colorRanges[0];
55
+ }
56
+ return colorRanges[index];
57
+ }
58
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(
59
+ "svg",
60
+ {
61
+ ...gauge.getSVGProps(),
62
+ height: Math.max(width, height),
63
+ width: Math.max(width, height),
64
+ viewBox: `-${diameter / 2 + offset} -${diameter / 2 + offset} ${diameter + offset * 2} ${diameter + offset * 2}`,
65
+ children: [
66
+ /* @__PURE__ */ jsxs("g", { id: "arcs", children: [
67
+ /* @__PURE__ */ jsx(
68
+ "path",
69
+ {
70
+ ...gauge.getArcProps({
71
+ offset: offset - 5,
72
+ startAngle: 0,
73
+ endAngle: 360
74
+ }),
75
+ stroke: "black",
76
+ opacity: "1",
77
+ fill: backgroundColor !== "" && backgroundColor !== void 0 ? tinycolor(backgroundColor).setAlpha(0.5).toPercentageRgbString() : "none",
78
+ strokeLinecap: "round",
79
+ strokeWidth: 5,
80
+ vectorEffect: "non-scaling-stroke"
81
+ }
82
+ ),
83
+ valueRanges.map((innerValue, i) => {
84
+ if (!valueRanges[i + 1]) {
85
+ return null;
86
+ }
87
+ const valueToAngle = (value2) => {
88
+ const angleRange = END_ANGLE - START_ANGLE;
89
+ const valueRange = domainMax - domainMin;
90
+ const angle2 = START_ANGLE + (value2 - domainMin) / valueRange * angleRange;
91
+ return Math.round(angle2);
92
+ };
93
+ return /* @__PURE__ */ jsxs("g", { children: [
94
+ /* @__PURE__ */ jsx(
95
+ "path",
96
+ {
97
+ ...gauge.getArcProps({
98
+ offset: offset - 5,
99
+ startAngle: i === 0 ? START_ANGLE : valueToAngle(innerValue),
100
+ endAngle: i === 0 ? valueToAngle(valueRanges[1]) : i === valueRanges.length - 1 ? END_ANGLE : valueToAngle(valueRanges[i + 1])
101
+ }),
102
+ stroke: "black",
103
+ opacity: "0.8",
104
+ fill: "none",
105
+ strokeLinecap: "square",
106
+ strokeWidth: 5,
107
+ vectorEffect: "non-scaling-stroke"
108
+ }
109
+ ),
110
+ /* @__PURE__ */ jsx(
111
+ "path",
112
+ {
113
+ ...gauge.getArcProps({
114
+ offset: -20,
115
+ startAngle: i === 0 ? START_ANGLE : valueToAngle(innerValue),
116
+ endAngle: i === 0 ? valueToAngle(valueRanges[1]) : i === valueRanges.length - 1 ? END_ANGLE : valueToAngle(valueRanges[i + 1])
117
+ }),
118
+ stroke: getColor(innerValue),
119
+ opacity: "0.1",
120
+ fill: "none",
121
+ strokeLinecap: "butt",
122
+ strokeWidth: 75,
123
+ vectorEffect: "non-scaling-stroke"
124
+ }
125
+ ),
126
+ /* @__PURE__ */ createElement(
127
+ "path",
128
+ {
129
+ ...gauge.getArcProps({
130
+ offset: -55,
131
+ startAngle: i === 0 ? START_ANGLE : valueToAngle(innerValue),
132
+ endAngle: i === 0 ? valueToAngle(valueRanges[1]) : i === valueRanges.length - 1 ? END_ANGLE : valueToAngle(valueRanges[i + 1])
133
+ }),
134
+ key: `${innerValue}_${i}`,
135
+ stroke: getColor(innerValue) || "#999",
136
+ opacity: "0.8",
137
+ fill: "none",
138
+ strokeLinecap: "butt",
139
+ strokeWidth: 10,
140
+ vectorEffect: "non-scaling-stroke"
141
+ }
142
+ )
143
+ ] }, `${innerValue}_${i}`);
144
+ })
145
+ ] }),
146
+ /* @__PURE__ */ jsxs("g", { id: "ticks", children: [
147
+ gauge.ticks.map((angle2, i) => {
148
+ const angleToValue = (angle3) => {
149
+ const angleRange = END_ANGLE - START_ANGLE;
150
+ const valueRange = domainMax - domainMin;
151
+ const value2 = domainMin + (angle3 - START_ANGLE) / angleRange * valueRange;
152
+ return Math.round(value2);
153
+ };
154
+ const asValue = angleToValue(angle2);
155
+ const showText = asValue % 10 === 0;
156
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
157
+ /* @__PURE__ */ jsx(
158
+ "line",
159
+ {
160
+ stroke: "gray",
161
+ strokeWidth: showText ? 4 : 2,
162
+ ...gauge.getTickProps({ angle: angle2, length: showText ? 12 : 3 }),
163
+ vectorEffect: "non-scaling-stroke"
164
+ }
165
+ ),
166
+ showText && /* @__PURE__ */ jsx(
167
+ "text",
168
+ {
169
+ fill: "black",
170
+ ...gauge.getLabelProps({
171
+ angle: angle2,
172
+ offset: 20
173
+ }),
174
+ style: {
175
+ fontSize: `${scaleValuesSize ?? 30}px`
176
+ },
177
+ children: asValue
178
+ }
179
+ )
180
+ ] }, `tick-group-${angle2}_ ${i}`);
181
+ }),
182
+ gauge2.ticks.map((angle2, i) => {
183
+ return /* @__PURE__ */ jsx(React.Fragment, { children: /* @__PURE__ */ jsx(
184
+ "line",
185
+ {
186
+ stroke: "gray",
187
+ strokeWidth: 2,
188
+ ...gauge.getTickProps({
189
+ angle: angle2,
190
+ length: 3
191
+ }),
192
+ vectorEffect: "non-scaling-stroke"
193
+ }
194
+ ) }, `tick-group-${angle2}_ ${i}_2`);
195
+ })
196
+ ] }),
197
+ /* @__PURE__ */ jsxs("g", { id: "needle", children: [
198
+ /* @__PURE__ */ jsx("circle", { fill: pointerColor, ...needle.base, r: 20 }),
199
+ /* @__PURE__ */ jsx("circle", { fill: pointerColor, ...needle.base }),
200
+ /* @__PURE__ */ jsx(
201
+ "circle",
202
+ {
203
+ fill: pointerColor,
204
+ opacity: "0.5",
205
+ ...needle.tip,
206
+ style: {
207
+ transform: `rotate(${angle}deg)`,
208
+ transition: "transform 500ms"
209
+ }
210
+ }
211
+ ),
212
+ /* @__PURE__ */ jsx(
213
+ "polyline",
214
+ {
215
+ style: {
216
+ transform: `rotate(${angle}deg)`,
217
+ transition: "transform 500ms"
218
+ },
219
+ fill: pointerColor,
220
+ opacity: "0.5",
221
+ points: needle.points
222
+ }
223
+ ),
224
+ /* @__PURE__ */ jsx("circle", { fill: "white", ...needle.base, r: 4 })
225
+ ] }),
226
+ /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx(
227
+ "text",
228
+ {
229
+ textAnchor: "middle",
230
+ alignmentBaseline: "text-before-edge",
231
+ y: diameter / 5,
232
+ style: { fontSize: `${currentValueFontSize ?? 30}px` },
233
+ fill: currentValueColor,
234
+ children: value
235
+ }
236
+ ) })
237
+ ]
238
+ }
239
+ ) });
240
+ };
241
+
242
+ export { Oxford };
243
+ //# sourceMappingURL=Oxford.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Oxford.js","sources":["../../../src/widgets/oxford/Oxford.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Box } from '@apia/theme';\r\nimport tinycolor from 'tinycolor2';\r\nimport { useGauge } from 'use-gauge';\r\nimport { TApiaWidgetBaseProps, TApiaWidgetOxfordProps } from '../types';\r\nimport { noNaN } from '@apia/util';\r\n\r\nconst START_ANGLE = 45;\r\nconst END_ANGLE = 315;\r\n\r\nexport const Oxford = ({\r\n backgroundColor,\r\n colorRanges,\r\n currentValue,\r\n currentValueColor,\r\n currentValueFontSize,\r\n height,\r\n maxValue,\r\n minValue,\r\n pointerColor,\r\n scaleValuesSize,\r\n valueRanges,\r\n width,\r\n}: TApiaWidgetBaseProps<TApiaWidgetOxfordProps>) => {\r\n const allTicks = true;\r\n const value = currentValue;\r\n const diameter = Math.min(height, width);\r\n const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];\r\n const domainMin = noNaN(minValue) ?? valueRanges[0];\r\n\r\n const offset = 20;\r\n const gauge = useGauge({\r\n domain: [domainMin, domainMax],\r\n startAngle: START_ANGLE,\r\n endAngle: END_ANGLE,\r\n numTicks: 10 + 1,\r\n diameter: diameter,\r\n });\r\n const gauge2 = useGauge({\r\n domain: [valueRanges[0], valueRanges[valueRanges.length - 1]],\r\n startAngle: START_ANGLE,\r\n endAngle: END_ANGLE,\r\n numTicks: valueRanges[valueRanges.length - 1] - valueRanges[0] + 1,\r\n diameter: diameter,\r\n });\r\n\r\n const needle = gauge.getNeedleProps({\r\n value: 0,\r\n baseRadius: 12,\r\n tipRadius: 2,\r\n });\r\n\r\n const angle = ((END_ANGLE - START_ANGLE) * value) / (domainMax - domainMin);\r\n\r\n function getColor(value: number) {\r\n const index = valueRanges.findIndex(\r\n (range) => noNaN(value) <= noNaN(range),\r\n );\r\n\r\n if (index === -1) {\r\n return colorRanges[0];\r\n }\r\n\r\n return colorRanges[index];\r\n }\r\n\r\n return (\r\n <Box>\r\n <svg\r\n {...gauge.getSVGProps()}\r\n height={Math.max(width, height)}\r\n width={Math.max(width, height)}\r\n viewBox={`-${diameter / 2 + offset} -${diameter / 2 + offset} ${\r\n diameter + offset * 2\r\n } ${diameter + offset * 2}`}\r\n >\r\n <g id=\"arcs\">\r\n <path\r\n {...gauge.getArcProps({\r\n offset: offset - 5,\r\n startAngle: 0,\r\n endAngle: 360,\r\n })}\r\n stroke=\"black\"\r\n opacity=\"1\"\r\n fill={\r\n backgroundColor !== '' && backgroundColor !== undefined\r\n ? tinycolor(backgroundColor)\r\n .setAlpha(0.5)\r\n .toPercentageRgbString()\r\n : 'none'\r\n }\r\n strokeLinecap=\"round\"\r\n strokeWidth={5}\r\n vectorEffect={'non-scaling-stroke'}\r\n />\r\n {valueRanges.map((innerValue, i) => {\r\n if (!valueRanges[i + 1]) {\r\n return null;\r\n }\r\n\r\n const valueToAngle = (value: number) => {\r\n const angleRange = END_ANGLE - START_ANGLE;\r\n const valueRange = domainMax - domainMin;\r\n const angle =\r\n START_ANGLE + ((value - domainMin) / valueRange) * angleRange;\r\n return Math.round(angle);\r\n };\r\n\r\n return (\r\n <g key={`${innerValue}_${i}`}>\r\n <path\r\n {...gauge.getArcProps({\r\n offset: offset - 5,\r\n startAngle:\r\n i === 0 ? START_ANGLE : valueToAngle(innerValue),\r\n endAngle:\r\n i === 0\r\n ? valueToAngle(valueRanges[1])\r\n : i === valueRanges.length - 1\r\n ? END_ANGLE\r\n : valueToAngle(valueRanges[i + 1]),\r\n })}\r\n stroke={'black'}\r\n opacity=\"0.8\"\r\n fill=\"none\"\r\n strokeLinecap=\"square\"\r\n strokeWidth={5}\r\n vectorEffect={'non-scaling-stroke'}\r\n />\r\n <path\r\n {...gauge.getArcProps({\r\n offset: -20,\r\n startAngle:\r\n i === 0 ? START_ANGLE : valueToAngle(innerValue),\r\n endAngle:\r\n i === 0\r\n ? valueToAngle(valueRanges[1])\r\n : i === valueRanges.length - 1\r\n ? END_ANGLE\r\n : valueToAngle(valueRanges[i + 1]),\r\n })}\r\n stroke={getColor(innerValue)}\r\n opacity=\"0.1\"\r\n fill=\"none\"\r\n strokeLinecap=\"butt\"\r\n strokeWidth={75}\r\n vectorEffect={'non-scaling-stroke'}\r\n />\r\n <path\r\n {...gauge.getArcProps({\r\n offset: -55,\r\n startAngle:\r\n i === 0 ? START_ANGLE : valueToAngle(innerValue),\r\n endAngle:\r\n i === 0\r\n ? valueToAngle(valueRanges[1])\r\n : i === valueRanges.length - 1\r\n ? END_ANGLE\r\n : valueToAngle(valueRanges[i + 1]),\r\n })}\r\n key={`${innerValue}_${i}`}\r\n stroke={getColor(innerValue) || '#999'}\r\n opacity=\"0.8\"\r\n fill=\"none\"\r\n strokeLinecap=\"butt\"\r\n strokeWidth={10}\r\n vectorEffect={'non-scaling-stroke'}\r\n />\r\n </g>\r\n );\r\n })}\r\n </g>\r\n <g id=\"ticks\">\r\n {gauge.ticks.map((angle, i) => {\r\n const angleToValue = (angle: number) => {\r\n const angleRange = END_ANGLE - START_ANGLE;\r\n const valueRange = domainMax - domainMin;\r\n\r\n const value =\r\n domainMin + ((angle - START_ANGLE) / angleRange) * valueRange;\r\n\r\n return Math.round(value);\r\n };\r\n const asValue = angleToValue(angle);\r\n\r\n const showText = asValue % 10 === 0;\r\n\r\n return (\r\n <React.Fragment key={`tick-group-${angle}_ ${i}`}>\r\n <line\r\n stroke=\"gray\"\r\n strokeWidth={showText ? 4 : 2}\r\n {...gauge.getTickProps({ angle, length: showText ? 12 : 3 })}\r\n vectorEffect={'non-scaling-stroke'}\r\n />\r\n {showText && (\r\n <text\r\n fill={'black'}\r\n {...gauge.getLabelProps({\r\n angle,\r\n offset: 20,\r\n })}\r\n style={{\r\n fontSize: `${scaleValuesSize ?? 30}px`,\r\n }}\r\n >\r\n {asValue}\r\n </text>\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n {allTicks &&\r\n gauge2.ticks.map((angle, i) => {\r\n return (\r\n <React.Fragment key={`tick-group-${angle}_ ${i}_2`}>\r\n <line\r\n stroke=\"gray\"\r\n strokeWidth={2}\r\n {...gauge.getTickProps({\r\n angle,\r\n length: 3,\r\n })}\r\n vectorEffect={'non-scaling-stroke'}\r\n />\r\n </React.Fragment>\r\n );\r\n })}\r\n </g>\r\n <g id=\"needle\">\r\n <circle fill={pointerColor} {...needle.base} r={20} />\r\n <circle fill={pointerColor} {...needle.base} />\r\n <circle\r\n fill={pointerColor}\r\n opacity=\"0.5\"\r\n {...needle.tip}\r\n style={{\r\n transform: `rotate(${angle}deg)`,\r\n transition: 'transform 500ms',\r\n }}\r\n />\r\n <polyline\r\n style={{\r\n transform: `rotate(${angle}deg)`,\r\n transition: 'transform 500ms',\r\n }}\r\n fill={pointerColor}\r\n opacity=\"0.5\"\r\n points={needle.points}\r\n />\r\n <circle fill=\"white\" {...needle.base} r={4} />\r\n </g>\r\n <g>\r\n <text\r\n textAnchor=\"middle\"\r\n alignmentBaseline=\"text-before-edge\"\r\n y={diameter / 5}\r\n style={{ fontSize: `${currentValueFontSize ?? 30}px` }}\r\n fill={currentValueColor}\r\n >\r\n {value}\r\n </text>\r\n </g>\r\n </svg>\r\n </Box>\r\n );\r\n};\r\n"],"names":["value","angle"],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ import { jsx, jsxs } from '@apia/theme/jsx-runtime';
2
+ import { Box } from '@apia/theme';
3
+ import { useGauge } from 'use-gauge';
4
+ import { noNaN, animate, addBoundary } from '@apia/util';
5
+ import { useState, useRef, useEffect } from 'react';
6
+
7
+ const START_ANGLE = 0;
8
+ const END_ANGLE = 360;
9
+ const Ring = ({
10
+ colorRanges,
11
+ maxValue,
12
+ minValue,
13
+ currentValue,
14
+ height,
15
+ valueRanges,
16
+ ringEmptyColor,
17
+ ringWidth,
18
+ width,
19
+ currentValueColor,
20
+ currentValueFontSize
21
+ }) => {
22
+ const [value, setValue] = useState(currentValue);
23
+ const diameter = Math.min(height, width);
24
+ const offset = 20;
25
+ const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];
26
+ const domainMin = noNaN(minValue) ?? valueRanges[0];
27
+ const gauge = useGauge({
28
+ domain: [domainMin, domainMax],
29
+ startAngle: START_ANGLE,
30
+ endAngle: END_ANGLE,
31
+ numTicks: 0,
32
+ diameter
33
+ });
34
+ const lastCurrentValue = useRef(0);
35
+ useEffect(() => {
36
+ const difference = currentValue - lastCurrentValue.current;
37
+ return animate(
38
+ 500,
39
+ (progress) => {
40
+ const step = addBoundary(
41
+ difference * progress + lastCurrentValue.current,
42
+ domainMin,
43
+ domainMax
44
+ );
45
+ setValue(Math.round(step));
46
+ },
47
+ () => {
48
+ lastCurrentValue.current = currentValue;
49
+ }
50
+ );
51
+ }, [currentValue]);
52
+ function getColor(value2) {
53
+ const index = valueRanges.findIndex((range) => value2 <= range);
54
+ if (index === -1) {
55
+ return colorRanges[0];
56
+ }
57
+ return colorRanges[index - 1] ?? colorRanges[index];
58
+ }
59
+ const valueToAngle = (value2) => {
60
+ const angleRange = 360;
61
+ const valueRange = domainMax - domainMin;
62
+ const angle = (value2 - domainMin) / valueRange * angleRange;
63
+ return Math.round(angle);
64
+ };
65
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(
66
+ "svg",
67
+ {
68
+ ...gauge.getSVGProps(),
69
+ height: Math.max(width, height),
70
+ width: Math.max(width, height),
71
+ viewBox: `-${diameter / 2 + offset} -${diameter / 2 + offset} ${diameter + offset * 2} ${diameter + offset * 2}`,
72
+ children: [
73
+ /* @__PURE__ */ jsxs("g", { id: "arcs", children: [
74
+ /* @__PURE__ */ jsx(
75
+ "path",
76
+ {
77
+ ...gauge.getArcProps({
78
+ offset: offset - ((noNaN(ringWidth) ?? 0) < 0 ? (noNaN(ringWidth) ?? 0) * 100 : noNaN(ringWidth) ?? 0),
79
+ startAngle: START_ANGLE,
80
+ endAngle: END_ANGLE
81
+ }),
82
+ stroke: ringEmptyColor ?? "transparent",
83
+ fill: "none",
84
+ strokeLinecap: "round",
85
+ strokeWidth: (noNaN(ringWidth) ?? 0) < 0 ? (noNaN(ringWidth) ?? 0) * 100 : noNaN(ringWidth) ?? 0
86
+ }
87
+ ),
88
+ /* @__PURE__ */ jsx(
89
+ "path",
90
+ {
91
+ ...gauge.getArcProps({
92
+ offset: offset - ((noNaN(ringWidth) ?? 0) < 0 ? (noNaN(ringWidth) ?? 0) * 100 : noNaN(ringWidth) ?? 0),
93
+ startAngle: 180,
94
+ endAngle: valueToAngle(value) === 360 ? 179 + valueToAngle(value) : 180 + valueToAngle(value)
95
+ }),
96
+ stroke: getColor(value),
97
+ opacity: "0.8",
98
+ fill: "none",
99
+ strokeLinecap: "square",
100
+ strokeWidth: (noNaN(ringWidth) ?? 0) < 0 ? (noNaN(ringWidth) ?? 0) * 100 : noNaN(ringWidth) ?? 0,
101
+ style: {
102
+ transition: "stroke 0.5s"
103
+ }
104
+ }
105
+ )
106
+ ] }),
107
+ /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx(
108
+ "text",
109
+ {
110
+ textAnchor: "middle",
111
+ style: { fontSize: `${currentValueFontSize ?? 30}px` },
112
+ alignmentBaseline: "central",
113
+ color: currentValueColor,
114
+ children: value
115
+ }
116
+ ) })
117
+ ]
118
+ }
119
+ ) });
120
+ };
121
+
122
+ export { Ring };
123
+ //# sourceMappingURL=Ring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Ring.js","sources":["../../../src/widgets/ring/Ring.tsx"],"sourcesContent":["import { Box } from '@apia/theme';\r\nimport { useGauge } from 'use-gauge';\r\nimport { TApiaWidgetBaseProps, TApiaWidgetRingProps } from '../types';\r\nimport { addBoundary, noNaN, animate } from '@apia/util';\r\nimport { useEffect, useRef, useState } from 'react';\r\n\r\nconst START_ANGLE = 0;\r\nconst END_ANGLE = 360;\r\n\r\nexport const Ring = ({\r\n colorRanges,\r\n maxValue,\r\n minValue,\r\n currentValue,\r\n height,\r\n valueRanges,\r\n ringEmptyColor,\r\n ringWidth,\r\n width,\r\n currentValueColor,\r\n currentValueFontSize,\r\n}: TApiaWidgetBaseProps<TApiaWidgetRingProps>) => {\r\n const [value, setValue] = useState(currentValue);\r\n const diameter = Math.min(height, width);\r\n const offset = 20;\r\n const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];\r\n const domainMin = noNaN(minValue) ?? valueRanges[0];\r\n const gauge = useGauge({\r\n domain: [domainMin, domainMax],\r\n startAngle: START_ANGLE,\r\n endAngle: END_ANGLE,\r\n numTicks: 0,\r\n diameter: diameter,\r\n });\r\n\r\n const lastCurrentValue = useRef(0);\r\n useEffect(() => {\r\n const difference = currentValue - lastCurrentValue.current;\r\n return animate(\r\n 500,\r\n (progress) => {\r\n const step = addBoundary(\r\n difference * progress + lastCurrentValue.current,\r\n domainMin,\r\n domainMax,\r\n );\r\n setValue(Math.round(step));\r\n },\r\n () => {\r\n lastCurrentValue.current = currentValue;\r\n },\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [currentValue]);\r\n\r\n function getColor(value: number) {\r\n const index = valueRanges.findIndex((range) => value <= range);\r\n\r\n if (index === -1) {\r\n return colorRanges[0];\r\n }\r\n\r\n return colorRanges[index - 1] ?? colorRanges[index];\r\n }\r\n\r\n const valueToAngle = (value: number) => {\r\n const angleRange = 360;\r\n const valueRange = domainMax - domainMin;\r\n const angle = ((value - domainMin) / valueRange) * angleRange;\r\n\r\n return Math.round(angle);\r\n };\r\n\r\n return (\r\n <Box>\r\n <svg\r\n {...gauge.getSVGProps()}\r\n height={Math.max(width, height)}\r\n width={Math.max(width, height)}\r\n viewBox={`-${diameter / 2 + offset} -${diameter / 2 + offset} ${\r\n diameter + offset * 2\r\n } ${diameter + offset * 2}`}\r\n >\r\n <g id=\"arcs\">\r\n <path\r\n {...gauge.getArcProps({\r\n offset:\r\n offset -\r\n ((noNaN(ringWidth) ?? 0) < 0\r\n ? (noNaN(ringWidth) ?? 0) * 100\r\n : noNaN(ringWidth) ?? 0),\r\n startAngle: START_ANGLE,\r\n endAngle: END_ANGLE,\r\n })}\r\n stroke={ringEmptyColor ?? 'transparent'}\r\n fill=\"none\"\r\n strokeLinecap=\"round\"\r\n strokeWidth={\r\n (noNaN(ringWidth) ?? 0) < 0\r\n ? (noNaN(ringWidth) ?? 0) * 100\r\n : noNaN(ringWidth) ?? 0\r\n }\r\n />\r\n <path\r\n {...gauge.getArcProps({\r\n offset:\r\n offset -\r\n ((noNaN(ringWidth) ?? 0) < 0\r\n ? (noNaN(ringWidth) ?? 0) * 100\r\n : noNaN(ringWidth) ?? 0),\r\n startAngle: 180,\r\n endAngle:\r\n valueToAngle(value) === 360\r\n ? 179 + valueToAngle(value)\r\n : 180 + valueToAngle(value),\r\n })}\r\n stroke={getColor(value)}\r\n opacity=\"0.8\"\r\n fill=\"none\"\r\n strokeLinecap=\"square\"\r\n strokeWidth={\r\n (noNaN(ringWidth) ?? 0) < 0\r\n ? (noNaN(ringWidth) ?? 0) * 100\r\n : noNaN(ringWidth) ?? 0\r\n }\r\n style={{\r\n transition: 'stroke 0.5s',\r\n }}\r\n />\r\n </g>\r\n <g>\r\n <text\r\n textAnchor=\"middle\"\r\n style={{ fontSize: `${currentValueFontSize ?? 30}px` }}\r\n alignmentBaseline=\"central\"\r\n color={currentValueColor}\r\n >\r\n {value}\r\n </text>\r\n </g>\r\n </svg>\r\n </Box>\r\n );\r\n};\r\n"],"names":["value"],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ import { jsx, jsxs } from '@apia/theme/jsx-runtime';
2
+ import React from 'react';
3
+ import { Box } from '@apia/theme';
4
+ import { useGauge } from 'use-gauge';
5
+ import { noNaN } from '@apia/util';
6
+
7
+ const START_ANGLE = 90;
8
+ const END_ANGLE = 270;
9
+ const Scale = ({
10
+ currentValue,
11
+ currentValueFontSize,
12
+ height,
13
+ maxValue,
14
+ minValue,
15
+ pointerColor,
16
+ scaleValuesSize,
17
+ valueRanges,
18
+ width
19
+ }) => {
20
+ const allTicks = false;
21
+ const value = currentValue;
22
+ const diameter = Math.min(height, width);
23
+ const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];
24
+ const domainMin = noNaN(minValue) ?? valueRanges[0];
25
+ const offset = 20;
26
+ const gauge = useGauge({
27
+ domain: [domainMin, domainMax],
28
+ startAngle: START_ANGLE,
29
+ endAngle: END_ANGLE,
30
+ numTicks: 10 + 1,
31
+ diameter
32
+ });
33
+ useGauge({
34
+ domain: [valueRanges[0], valueRanges[valueRanges.length - 1]],
35
+ startAngle: START_ANGLE,
36
+ endAngle: END_ANGLE,
37
+ numTicks: valueRanges[valueRanges.length - 1] - valueRanges[0] + 1,
38
+ diameter
39
+ });
40
+ const needle = gauge.getNeedleProps({
41
+ value: 0,
42
+ baseRadius: 12,
43
+ tipRadius: 2
44
+ });
45
+ const angle = (END_ANGLE - START_ANGLE) * value / (domainMax - domainMin);
46
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(
47
+ "svg",
48
+ {
49
+ ...gauge.getSVGProps(),
50
+ height: Math.max(width, height),
51
+ width: Math.max(width, height),
52
+ viewBox: `-${diameter / 2 + offset} -${diameter / 2 + offset} ${diameter + offset * 2} ${diameter / 2 + offset * 2}`,
53
+ children: [
54
+ /* @__PURE__ */ jsx("g", { id: "arcs", children: /* @__PURE__ */ jsx(
55
+ "path",
56
+ {
57
+ ...gauge.getArcProps({
58
+ offset: offset - 5,
59
+ startAngle: 90,
60
+ endAngle: 270
61
+ }),
62
+ stroke: "gray",
63
+ opacity: "0.2",
64
+ fill: "none",
65
+ strokeLinecap: "round",
66
+ strokeWidth: 5
67
+ }
68
+ ) }),
69
+ /* @__PURE__ */ jsxs("g", { id: "ticks", children: [
70
+ gauge.ticks.map((angle2) => {
71
+ const angleToValue = (angle3) => {
72
+ const angleRange = END_ANGLE - START_ANGLE;
73
+ const valueRange = domainMax - domainMin;
74
+ const value2 = domainMin + (angle3 - START_ANGLE) / angleRange * valueRange;
75
+ return Math.round(value2);
76
+ };
77
+ const asValue = angleToValue(angle2);
78
+ const showText = asValue % 10 === 0;
79
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
80
+ /* @__PURE__ */ jsx(
81
+ "line",
82
+ {
83
+ stroke: "gray",
84
+ strokeWidth: showText ? 4 : 2,
85
+ ...gauge.getTickProps({ angle: angle2, length: showText ? 12 : 3 })
86
+ }
87
+ ),
88
+ showText && /* @__PURE__ */ jsx(
89
+ "text",
90
+ {
91
+ fill: "black",
92
+ ...gauge.getLabelProps({ angle: angle2, offset: 20 }),
93
+ style: { fontSize: `${scaleValuesSize ?? 30}px` },
94
+ children: asValue
95
+ }
96
+ )
97
+ ] }, `tick-group-${angle2}`);
98
+ }),
99
+ allTicks
100
+ ] }),
101
+ /* @__PURE__ */ jsxs("g", { id: "needle", children: [
102
+ /* @__PURE__ */ jsx("circle", { fill: pointerColor, ...needle.base, r: 20 }),
103
+ /* @__PURE__ */ jsx("circle", { fill: pointerColor, ...needle.base }),
104
+ /* @__PURE__ */ jsx(
105
+ "circle",
106
+ {
107
+ fill: pointerColor,
108
+ opacity: "0.5",
109
+ ...needle.tip,
110
+ style: {
111
+ transform: `rotate(${angle}deg)`,
112
+ transition: "transform 500ms"
113
+ }
114
+ }
115
+ ),
116
+ /* @__PURE__ */ jsx(
117
+ "polyline",
118
+ {
119
+ style: {
120
+ transform: `rotate(${angle}deg)`,
121
+ transition: "transform 500ms"
122
+ },
123
+ fill: pointerColor,
124
+ opacity: "0.5",
125
+ points: needle.points
126
+ }
127
+ ),
128
+ /* @__PURE__ */ jsx("circle", { fill: "white", ...needle.base, r: 4 })
129
+ ] }),
130
+ /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx(
131
+ "text",
132
+ {
133
+ textAnchor: "middle",
134
+ style: { fontSize: `${currentValueFontSize ?? 30}px` },
135
+ y: -diameter / 4 + 20,
136
+ children: value
137
+ }
138
+ ) })
139
+ ]
140
+ }
141
+ ) });
142
+ };
143
+
144
+ export { Scale };
145
+ //# sourceMappingURL=Scale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Scale.js","sources":["../../../src/widgets/scale/Scale.tsx"],"sourcesContent":["import React from 'react';\r\nimport { Box } from '@apia/theme';\r\nimport { useGauge } from 'use-gauge';\r\nimport { TApiaWidgetBaseProps, TApiaWidgetScaleProps } from '../types';\r\nimport { noNaN } from '@apia/util';\r\n\r\nconst START_ANGLE = 90;\r\nconst END_ANGLE = 270;\r\n\r\nexport const Scale = ({\r\n currentValue,\r\n currentValueFontSize,\r\n height,\r\n maxValue,\r\n minValue,\r\n pointerColor,\r\n scaleValuesSize,\r\n valueRanges,\r\n width,\r\n}: TApiaWidgetBaseProps<TApiaWidgetScaleProps>) => {\r\n const allTicks = false;\r\n const value = currentValue;\r\n const diameter = Math.min(height, width);\r\n const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];\r\n const domainMin = noNaN(minValue) ?? valueRanges[0];\r\n const offset = 20;\r\n const gauge = useGauge({\r\n domain: [domainMin, domainMax],\r\n startAngle: START_ANGLE,\r\n endAngle: END_ANGLE,\r\n numTicks: 10 + 1,\r\n diameter: diameter,\r\n });\r\n const gauge2 = useGauge({\r\n domain: [valueRanges[0], valueRanges[valueRanges.length - 1]],\r\n startAngle: START_ANGLE,\r\n endAngle: END_ANGLE,\r\n numTicks: valueRanges[valueRanges.length - 1] - valueRanges[0] + 1,\r\n diameter: diameter,\r\n });\r\n\r\n const needle = gauge.getNeedleProps({\r\n value: 0,\r\n baseRadius: 12,\r\n tipRadius: 2,\r\n });\r\n\r\n const angle = ((END_ANGLE - START_ANGLE) * value) / (domainMax - domainMin);\r\n\r\n return (\r\n <Box>\r\n <svg\r\n {...gauge.getSVGProps()}\r\n height={Math.max(width, height)}\r\n width={Math.max(width, height)}\r\n viewBox={`-${diameter / 2 + offset} -${diameter / 2 + offset} ${\r\n diameter + offset * 2\r\n } ${diameter / 2 + offset * 2}`}\r\n >\r\n <g id=\"arcs\">\r\n <path\r\n {...gauge.getArcProps({\r\n offset: offset - 5,\r\n startAngle: 90,\r\n endAngle: 270,\r\n })}\r\n stroke=\"gray\"\r\n opacity=\"0.2\"\r\n fill=\"none\"\r\n strokeLinecap=\"round\"\r\n strokeWidth={5}\r\n />\r\n </g>\r\n <g id=\"ticks\">\r\n {gauge.ticks.map((angle) => {\r\n const angleToValue = (angle: number) => {\r\n const angleRange = END_ANGLE - START_ANGLE;\r\n const valueRange = domainMax - domainMin;\r\n\r\n const value =\r\n domainMin + ((angle - START_ANGLE) / angleRange) * valueRange;\r\n\r\n return Math.round(value);\r\n };\r\n const asValue = angleToValue(angle);\r\n const showText = asValue % 10 === 0;\r\n\r\n return (\r\n <React.Fragment key={`tick-group-${angle}`}>\r\n <line\r\n stroke=\"gray\"\r\n strokeWidth={showText ? 4 : 2}\r\n {...gauge.getTickProps({ angle, length: showText ? 12 : 3 })}\r\n />\r\n {showText && (\r\n <text\r\n fill=\"black\"\r\n {...gauge.getLabelProps({ angle, offset: 20 })}\r\n style={{ fontSize: `${scaleValuesSize ?? 30}px` }}\r\n >\r\n {asValue}\r\n </text>\r\n )}\r\n </React.Fragment>\r\n );\r\n })}\r\n {allTicks &&\r\n gauge2.ticks.map((angle, i) => {\r\n return (\r\n <React.Fragment key={`tick-group-${angle}_ ${i}_2`}>\r\n <line\r\n stroke=\"gray\"\r\n strokeWidth={2}\r\n {...gauge.getTickProps({\r\n angle,\r\n length: 3,\r\n })}\r\n />\r\n </React.Fragment>\r\n );\r\n })}\r\n </g>\r\n <g id=\"needle\">\r\n <circle fill={pointerColor} {...needle.base} r={20} />\r\n <circle fill={pointerColor} {...needle.base} />\r\n <circle\r\n fill={pointerColor}\r\n opacity=\"0.5\"\r\n {...needle.tip}\r\n style={{\r\n transform: `rotate(${angle}deg)`,\r\n transition: 'transform 500ms',\r\n }}\r\n />\r\n <polyline\r\n style={{\r\n transform: `rotate(${angle}deg)`,\r\n transition: 'transform 500ms',\r\n }}\r\n fill={pointerColor}\r\n opacity=\"0.5\"\r\n points={needle.points}\r\n />\r\n <circle fill=\"white\" {...needle.base} r={4} />\r\n </g>\r\n <g>\r\n <text\r\n textAnchor=\"middle\"\r\n style={{ fontSize: `${currentValueFontSize ?? 30}px` }}\r\n y={-diameter / 4 + 20}\r\n >\r\n {value}\r\n </text>\r\n </g>\r\n </svg>\r\n </Box>\r\n );\r\n};\r\n"],"names":["angle","value"],"mappings":"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"}