@apia/charts 1.0.2 → 2.0.0

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 (81) hide show
  1. package/dist/charts/ChartContext.js +6 -0
  2. package/dist/charts/ChartContext.js.map +1 -0
  3. package/dist/charts/ChartRenderer.d.ts +17 -0
  4. package/dist/charts/ChartRenderer.d.ts.map +1 -0
  5. package/dist/charts/ChartRenderer.js +175 -0
  6. package/dist/charts/ChartRenderer.js.map +1 -0
  7. package/dist/charts/horizontalBars/Bar.js +226 -0
  8. package/dist/charts/horizontalBars/Bar.js.map +1 -0
  9. package/dist/charts/horizontalBars/HorizontalBars.js +374 -0
  10. package/dist/charts/horizontalBars/HorizontalBars.js.map +1 -0
  11. package/dist/charts/linear/LineChart.js +528 -0
  12. package/dist/charts/linear/LineChart.js.map +1 -0
  13. package/dist/charts/linear/Node.js +56 -0
  14. package/dist/charts/linear/Node.js.map +1 -0
  15. package/dist/charts/pie/Pie.js +184 -0
  16. package/dist/charts/pie/Pie.js.map +1 -0
  17. package/dist/charts/pie/Slice.js +96 -0
  18. package/dist/charts/pie/Slice.js.map +1 -0
  19. package/dist/charts/pie/usePieAnimation.js +123 -0
  20. package/dist/charts/pie/usePieAnimation.js.map +1 -0
  21. package/dist/charts/types.d.ts +188 -0
  22. package/dist/charts/types.d.ts.map +1 -0
  23. package/dist/charts/util/ChartSelector.js +36 -0
  24. package/dist/charts/util/ChartSelector.js.map +1 -0
  25. package/dist/charts/util/ColoredLegendItem.js +46 -0
  26. package/dist/charts/util/ColoredLegendItem.js.map +1 -0
  27. package/dist/charts/util/EmptyGrid.d.ts +8 -0
  28. package/dist/charts/util/EmptyGrid.d.ts.map +1 -0
  29. package/dist/charts/util/EmptyGrid.js +51 -0
  30. package/dist/charts/util/EmptyGrid.js.map +1 -0
  31. package/dist/charts/util/LegendContainer.js +53 -0
  32. package/dist/charts/util/LegendContainer.js.map +1 -0
  33. package/dist/charts/util/NumberedLegendItem.js +45 -0
  34. package/dist/charts/util/NumberedLegendItem.js.map +1 -0
  35. package/dist/charts/util/getBarColor.js +29 -0
  36. package/dist/charts/util/getBarColor.js.map +1 -0
  37. package/dist/charts/util/parseMargin.js +11 -0
  38. package/dist/charts/util/parseMargin.js.map +1 -0
  39. package/dist/charts/util/useChartStyles.js +35 -0
  40. package/dist/charts/util/useChartStyles.js.map +1 -0
  41. package/dist/charts/verticalBars/Bar.js +239 -0
  42. package/dist/charts/verticalBars/Bar.js.map +1 -0
  43. package/dist/charts/verticalBars/VerticalBars.js +394 -0
  44. package/dist/charts/verticalBars/VerticalBars.js.map +1 -0
  45. package/dist/charts/waterfallBars/WaterfallBar.js +84 -0
  46. package/dist/charts/waterfallBars/WaterfallBar.js.map +1 -0
  47. package/dist/charts/waterfallBars/WaterfallBars.js +289 -0
  48. package/dist/charts/waterfallBars/WaterfallBars.js.map +1 -0
  49. package/dist/index.d.ts +6 -250
  50. package/dist/index.js +4 -4263
  51. package/dist/index.js.map +1 -1
  52. package/dist/widgets/WidgetContainer.d.ts +10 -0
  53. package/dist/widgets/WidgetContainer.d.ts.map +1 -0
  54. package/dist/widgets/WidgetContainer.js +68 -0
  55. package/dist/widgets/WidgetContainer.js.map +1 -0
  56. package/dist/widgets/counter/Counter.js +108 -0
  57. package/dist/widgets/counter/Counter.js.map +1 -0
  58. package/dist/widgets/custom/useCustomWidget.js +64 -0
  59. package/dist/widgets/custom/useCustomWidget.js.map +1 -0
  60. package/dist/widgets/custom/util.js +9 -0
  61. package/dist/widgets/custom/util.js.map +1 -0
  62. package/dist/widgets/oxford/Oxford.js +241 -0
  63. package/dist/widgets/oxford/Oxford.js.map +1 -0
  64. package/dist/widgets/ring/Ring.js +123 -0
  65. package/dist/widgets/ring/Ring.js.map +1 -0
  66. package/dist/widgets/scale/Scale.js +145 -0
  67. package/dist/widgets/scale/Scale.js.map +1 -0
  68. package/dist/widgets/speedMeter/SpeedMeter.js +187 -0
  69. package/dist/widgets/speedMeter/SpeedMeter.js.map +1 -0
  70. package/dist/widgets/tLight/TLight.js +134 -0
  71. package/dist/widgets/tLight/TLight.js.map +1 -0
  72. package/dist/widgets/thermometer/Thermometer.js +144 -0
  73. package/dist/widgets/thermometer/Thermometer.js.map +1 -0
  74. package/dist/widgets/thermometer/util.js +31 -0
  75. package/dist/widgets/thermometer/util.js.map +1 -0
  76. package/dist/widgets/types.d.ts +41 -0
  77. package/dist/widgets/types.d.ts.map +1 -0
  78. package/package.json +30 -43
  79. package/LICENSE.md +0 -21
  80. package/README.md +0 -1
  81. package/cleanDist.json +0 -3
@@ -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) * 100,
79
+ startAngle: START_ANGLE,
80
+ endAngle: END_ANGLE
81
+ }),
82
+ stroke: ringEmptyColor ?? "transparent",
83
+ fill: "none",
84
+ strokeLinecap: "round",
85
+ strokeWidth: (noNaN(ringWidth) ?? 0) * 100
86
+ }
87
+ ),
88
+ /* @__PURE__ */ jsx(
89
+ "path",
90
+ {
91
+ ...gauge.getArcProps({
92
+ offset: offset - (noNaN(ringWidth) ?? 0) * 100,
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) * 100,
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';\nimport { useGauge } from 'use-gauge';\nimport { TApiaWidgetProps } from '../types';\nimport { addBoundary, noNaN, animate } from '@apia/util';\nimport { useEffect, useRef, useState } from 'react';\n\nconst START_ANGLE = 0;\nconst END_ANGLE = 360;\n\nexport const Ring = ({\n colorRanges,\n maxValue,\n minValue,\n currentValue,\n height,\n valueRanges,\n ringEmptyColor,\n ringWidth,\n width,\n currentValueColor,\n currentValueFontSize,\n}: TApiaWidgetProps) => {\n const [value, setValue] = useState(currentValue);\n const diameter = Math.min(height, width);\n const offset = 20;\n const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];\n const domainMin = noNaN(minValue) ?? valueRanges[0];\n const gauge = useGauge({\n domain: [domainMin, domainMax],\n startAngle: START_ANGLE,\n endAngle: END_ANGLE,\n numTicks: 0,\n diameter: diameter,\n });\n\n const lastCurrentValue = useRef(0);\n useEffect(() => {\n const difference = currentValue - lastCurrentValue.current;\n return animate(\n 500,\n (progress) => {\n const step = addBoundary(\n difference * progress + lastCurrentValue.current,\n domainMin,\n domainMax,\n );\n setValue(Math.round(step));\n },\n () => {\n lastCurrentValue.current = currentValue;\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentValue]);\n\n function getColor(value: number) {\n const index = valueRanges.findIndex((range) => value <= range);\n\n if (index === -1) {\n return colorRanges[0];\n }\n\n return colorRanges[index - 1] ?? colorRanges[index];\n }\n\n const valueToAngle = (value: number) => {\n const angleRange = 360;\n const valueRange = domainMax - domainMin;\n const angle = ((value - domainMin) / valueRange) * angleRange;\n\n return Math.round(angle);\n };\n\n return (\n <Box>\n <svg\n {...gauge.getSVGProps()}\n height={Math.max(width, height)}\n width={Math.max(width, height)}\n viewBox={`-${diameter / 2 + offset} -${diameter / 2 + offset} ${\n diameter + offset * 2\n } ${diameter + offset * 2}`}\n >\n <g id=\"arcs\">\n <path\n {...gauge.getArcProps({\n offset: offset - (noNaN(ringWidth) ?? 0) * 100,\n startAngle: START_ANGLE,\n endAngle: END_ANGLE,\n })}\n stroke={ringEmptyColor ?? 'transparent'}\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeWidth={(noNaN(ringWidth) ?? 0) * 100}\n />\n <path\n {...gauge.getArcProps({\n offset: offset - (noNaN(ringWidth) ?? 0) * 100,\n startAngle: 180,\n endAngle:\n valueToAngle(value) === 360\n ? 179 + valueToAngle(value)\n : 180 + valueToAngle(value),\n })}\n stroke={getColor(value)}\n opacity=\"0.8\"\n fill=\"none\"\n strokeLinecap=\"square\"\n strokeWidth={(noNaN(ringWidth) ?? 0) * 100}\n style={{\n transition: 'stroke 0.5s',\n }}\n />\n </g>\n <g>\n <text\n textAnchor=\"middle\"\n style={{ fontSize: `${currentValueFontSize ?? 30}px` }}\n alignmentBaseline=\"central\"\n color={currentValueColor}\n >\n {value}\n </text>\n </g>\n </svg>\n </Box>\n );\n};\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';\nimport { Box } from '@apia/theme';\nimport { useGauge } from 'use-gauge';\nimport { TApiaWidgetProps } from '../types';\nimport { noNaN } from '@apia/util';\n\nconst START_ANGLE = 90;\nconst END_ANGLE = 270;\n\nexport const Scale = ({\n currentValue,\n currentValueFontSize,\n height,\n maxValue,\n minValue,\n pointerColor,\n scaleValuesSize,\n valueRanges,\n width,\n}: TApiaWidgetProps) => {\n const allTicks = false;\n const value = currentValue;\n const diameter = Math.min(height, width);\n const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];\n const domainMin = noNaN(minValue) ?? valueRanges[0];\n const offset = 20;\n const gauge = useGauge({\n domain: [domainMin, domainMax],\n startAngle: START_ANGLE,\n endAngle: END_ANGLE,\n numTicks: 10 + 1,\n diameter: diameter,\n });\n const gauge2 = useGauge({\n domain: [valueRanges[0], valueRanges[valueRanges.length - 1]],\n startAngle: START_ANGLE,\n endAngle: END_ANGLE,\n numTicks: valueRanges[valueRanges.length - 1] - valueRanges[0] + 1,\n diameter: diameter,\n });\n\n const needle = gauge.getNeedleProps({\n value: 0,\n baseRadius: 12,\n tipRadius: 2,\n });\n\n const angle = ((END_ANGLE - START_ANGLE) * value) / (domainMax - domainMin);\n\n return (\n <Box>\n <svg\n {...gauge.getSVGProps()}\n height={Math.max(width, height)}\n width={Math.max(width, height)}\n viewBox={`-${diameter / 2 + offset} -${diameter / 2 + offset} ${\n diameter + offset * 2\n } ${diameter / 2 + offset * 2}`}\n >\n <g id=\"arcs\">\n <path\n {...gauge.getArcProps({\n offset: offset - 5,\n startAngle: 90,\n endAngle: 270,\n })}\n stroke=\"gray\"\n opacity=\"0.2\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeWidth={5}\n />\n </g>\n <g id=\"ticks\">\n {gauge.ticks.map((angle) => {\n const angleToValue = (angle: number) => {\n const angleRange = END_ANGLE - START_ANGLE;\n const valueRange = domainMax - domainMin;\n\n const value =\n domainMin + ((angle - START_ANGLE) / angleRange) * valueRange;\n\n return Math.round(value);\n };\n const asValue = angleToValue(angle);\n const showText = asValue % 10 === 0;\n\n return (\n <React.Fragment key={`tick-group-${angle}`}>\n <line\n stroke=\"gray\"\n strokeWidth={showText ? 4 : 2}\n {...gauge.getTickProps({ angle, length: showText ? 12 : 3 })}\n />\n {showText && (\n <text\n fill=\"black\"\n {...gauge.getLabelProps({ angle, offset: 20 })}\n style={{ fontSize: `${scaleValuesSize ?? 30}px` }}\n >\n {asValue}\n </text>\n )}\n </React.Fragment>\n );\n })}\n {allTicks &&\n gauge2.ticks.map((angle, i) => {\n return (\n <React.Fragment key={`tick-group-${angle}_ ${i}_2`}>\n <line\n stroke=\"gray\"\n strokeWidth={2}\n {...gauge.getTickProps({\n angle,\n length: 3,\n })}\n />\n </React.Fragment>\n );\n })}\n </g>\n <g id=\"needle\">\n <circle fill={pointerColor} {...needle.base} r={20} />\n <circle fill={pointerColor} {...needle.base} />\n <circle\n fill={pointerColor}\n opacity=\"0.5\"\n {...needle.tip}\n style={{\n transform: `rotate(${angle}deg)`,\n transition: 'transform 500ms',\n }}\n />\n <polyline\n style={{\n transform: `rotate(${angle}deg)`,\n transition: 'transform 500ms',\n }}\n fill={pointerColor}\n opacity=\"0.5\"\n points={needle.points}\n />\n <circle fill=\"white\" {...needle.base} r={4} />\n </g>\n <g>\n <text\n textAnchor=\"middle\"\n style={{ fontSize: `${currentValueFontSize ?? 30}px` }}\n y={-diameter / 4 + 20}\n >\n {value}\n </text>\n </g>\n </svg>\n </Box>\n );\n};\n"],"names":["angle","value"],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ import { jsx, jsxs } from '@apia/theme/jsx-runtime';
2
+ import { Box, createElement } from '@apia/theme';
3
+ import React from 'react';
4
+ import { useGauge } from 'use-gauge';
5
+ import { noNaN } from '@apia/util';
6
+
7
+ const START_ANGLE = 30;
8
+ const END_ANGLE = 330;
9
+ const SpeedMeter = ({
10
+ backgroundColor,
11
+ colorRanges,
12
+ currentValue,
13
+ currentValueColor,
14
+ currentValueFontSize,
15
+ height,
16
+ maxValue,
17
+ minValue,
18
+ pointerColor,
19
+ scaleValuesSize,
20
+ valueRanges,
21
+ width
22
+ }) => {
23
+ const value = currentValue;
24
+ const diameter = Math.min(height, width);
25
+ const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];
26
+ const domainMin = noNaN(minValue) ?? valueRanges[0];
27
+ const offset = 20;
28
+ const gauge = useGauge({
29
+ domain: [domainMin, domainMax],
30
+ startAngle: START_ANGLE,
31
+ endAngle: END_ANGLE,
32
+ numTicks: valueRanges[valueRanges.length - 1] / 10 + 1,
33
+ diameter
34
+ });
35
+ const needle = gauge.getNeedleProps({
36
+ value: 0,
37
+ baseRadius: 12,
38
+ tipRadius: 2
39
+ });
40
+ function getColor(value2) {
41
+ const index = valueRanges.findIndex((range) => value2 <= range);
42
+ if (index === -1) {
43
+ return colorRanges[0];
44
+ }
45
+ return colorRanges[index];
46
+ }
47
+ const angle = (END_ANGLE - START_ANGLE) * value / (domainMax - domainMin);
48
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(
49
+ "svg",
50
+ {
51
+ ...gauge.getSVGProps(),
52
+ height: Math.max(width, height),
53
+ width: Math.max(width, height),
54
+ viewBox: `-${diameter / 2 + offset} -${diameter / 2 + offset} ${diameter + offset * 2} ${diameter + offset * 2}`,
55
+ children: [
56
+ /* @__PURE__ */ jsxs("g", { id: "arcs", children: [
57
+ /* @__PURE__ */ jsx(
58
+ "path",
59
+ {
60
+ ...gauge.getArcProps({
61
+ offset: offset - 5,
62
+ startAngle: 0,
63
+ endAngle: 360
64
+ }),
65
+ stroke: "gray",
66
+ fill: backgroundColor ?? "none",
67
+ strokeLinecap: "round",
68
+ strokeWidth: 5
69
+ }
70
+ ),
71
+ valueRanges.map((innerValue, i) => {
72
+ const valueToAngle = (value2) => {
73
+ const angleRange = END_ANGLE - START_ANGLE;
74
+ const valueRange = domainMax - domainMin;
75
+ const angle2 = START_ANGLE + (value2 - domainMin) / valueRange * angleRange;
76
+ return Math.round(angle2);
77
+ };
78
+ return /* @__PURE__ */ jsxs("g", { children: [
79
+ /* @__PURE__ */ jsx(
80
+ "path",
81
+ {
82
+ ...gauge.getArcProps({
83
+ offset: -50,
84
+ startAngle: i === 0 ? START_ANGLE : valueToAngle(innerValue),
85
+ endAngle: i === 0 ? valueToAngle(valueRanges[1]) : i === valueRanges.length - 1 ? END_ANGLE : valueToAngle(valueRanges[i + 1])
86
+ }),
87
+ stroke: getColor(innerValue),
88
+ opacity: "0.8",
89
+ fill: "none",
90
+ strokeLinecap: "round",
91
+ strokeWidth: 2
92
+ }
93
+ ),
94
+ /* @__PURE__ */ createElement(
95
+ "path",
96
+ {
97
+ ...gauge.getArcProps({
98
+ offset: -55,
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
+ key: `${innerValue}_${i}`,
103
+ stroke: getColor(innerValue),
104
+ opacity: "0.8",
105
+ fill: "none",
106
+ strokeLinecap: "round",
107
+ strokeWidth: 2
108
+ }
109
+ )
110
+ ] }, `${innerValue}_${i}`);
111
+ })
112
+ ] }),
113
+ /* @__PURE__ */ jsx("g", { id: "ticks", children: gauge.ticks.map((angle2) => {
114
+ const angleToValue = (angle3) => {
115
+ const angleRange = END_ANGLE - START_ANGLE;
116
+ const valueRange = domainMax - domainMin;
117
+ const value2 = domainMin + (angle3 - START_ANGLE) / angleRange * valueRange;
118
+ return Math.round(value2);
119
+ };
120
+ const asValue = angleToValue(angle2);
121
+ const showText = asValue % 10 === 0;
122
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
123
+ /* @__PURE__ */ jsx(
124
+ "line",
125
+ {
126
+ stroke: "gray",
127
+ strokeWidth: showText ? 4 : 2,
128
+ ...gauge.getTickProps({ angle: angle2, length: showText ? 12 : 3 })
129
+ }
130
+ ),
131
+ showText && /* @__PURE__ */ jsx(
132
+ "text",
133
+ {
134
+ fill: "black",
135
+ ...gauge.getLabelProps({ angle: angle2, offset: 20 }),
136
+ style: { fontSize: `${scaleValuesSize ?? 30}px` },
137
+ children: asValue
138
+ }
139
+ )
140
+ ] }, `tick-group-${angle2}`);
141
+ }) }),
142
+ /* @__PURE__ */ jsxs("g", { id: "needle", children: [
143
+ /* @__PURE__ */ jsx("circle", { fill: pointerColor, ...needle.base, r: 20 }),
144
+ /* @__PURE__ */ jsx("circle", { fill: pointerColor, ...needle.base }),
145
+ /* @__PURE__ */ jsx(
146
+ "circle",
147
+ {
148
+ fill: pointerColor,
149
+ opacity: "0.5",
150
+ ...needle.tip,
151
+ style: {
152
+ transform: `rotate(${angle}deg)`,
153
+ transition: "transform 500ms"
154
+ }
155
+ }
156
+ ),
157
+ /* @__PURE__ */ jsx(
158
+ "polyline",
159
+ {
160
+ style: {
161
+ transform: `rotate(${angle}deg)`,
162
+ transition: "transform 500ms"
163
+ },
164
+ fill: pointerColor,
165
+ opacity: "0.5",
166
+ points: needle.points
167
+ }
168
+ ),
169
+ /* @__PURE__ */ jsx("circle", { fill: "white", ...needle.base, r: 4 })
170
+ ] }),
171
+ /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx(
172
+ "text",
173
+ {
174
+ textAnchor: "middle",
175
+ y: diameter / 2,
176
+ fill: currentValueColor,
177
+ style: { fontSize: `${currentValueFontSize ?? 30}px` },
178
+ children: value
179
+ }
180
+ ) })
181
+ ]
182
+ }
183
+ ) });
184
+ };
185
+
186
+ export { SpeedMeter };
187
+ //# sourceMappingURL=SpeedMeter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpeedMeter.js","sources":["../../../src/widgets/speedMeter/SpeedMeter.tsx"],"sourcesContent":["import React from 'react';\nimport { Box } from '@apia/theme';\nimport { useGauge } from 'use-gauge';\nimport { TApiaWidgetProps } from '../types';\nimport { noNaN } from '@apia/util';\n\nconst START_ANGLE = 30;\nconst END_ANGLE = 330;\n\nexport const SpeedMeter = ({\n backgroundColor,\n colorRanges,\n currentValue,\n currentValueColor,\n currentValueFontSize,\n height,\n maxValue,\n minValue,\n pointerColor,\n scaleValuesSize,\n valueRanges,\n width,\n}: TApiaWidgetProps) => {\n const allTicks = false;\n const value = currentValue;\n const diameter = Math.min(height, width);\n const domainMax = noNaN(maxValue) ?? valueRanges[valueRanges.length - 1];\n const domainMin = noNaN(minValue) ?? valueRanges[0];\n const offset = 20;\n const gauge = useGauge({\n domain: [domainMin, domainMax],\n startAngle: START_ANGLE,\n endAngle: END_ANGLE,\n numTicks: allTicks\n ? valueRanges[valueRanges.length - 1] - valueRanges[0] + 1\n : valueRanges[valueRanges.length - 1] / 10 + 1,\n diameter: diameter,\n });\n\n const needle = gauge.getNeedleProps({\n value: 0,\n baseRadius: 12,\n tipRadius: 2,\n });\n\n function getColor(value: number) {\n const index = valueRanges.findIndex((range) => value <= range);\n\n if (index === -1) {\n return colorRanges[0];\n }\n\n return colorRanges[index];\n }\n\n const angle = ((END_ANGLE - START_ANGLE) * value) / (domainMax - domainMin);\n\n return (\n <Box>\n <svg\n {...gauge.getSVGProps()}\n height={Math.max(width, height)}\n width={Math.max(width, height)}\n viewBox={`-${diameter / 2 + offset} -${diameter / 2 + offset} ${\n diameter + offset * 2\n } ${diameter + offset * 2}`}\n >\n <g id=\"arcs\">\n <path\n {...gauge.getArcProps({\n offset: offset - 5,\n startAngle: 0,\n endAngle: 360,\n })}\n stroke=\"gray\"\n fill={backgroundColor ?? 'none'}\n strokeLinecap=\"round\"\n strokeWidth={5}\n />\n {valueRanges.map((innerValue, i) => {\n const valueToAngle = (value: number) => {\n const angleRange = END_ANGLE - START_ANGLE;\n const valueRange = domainMax - domainMin;\n const angle =\n START_ANGLE + ((value - domainMin) / valueRange) * angleRange;\n return Math.round(angle);\n };\n\n return (\n <g key={`${innerValue}_${i}`}>\n <path\n {...gauge.getArcProps({\n offset: -50,\n startAngle:\n i === 0 ? START_ANGLE : valueToAngle(innerValue),\n endAngle:\n i === 0\n ? valueToAngle(valueRanges[1])\n : i === valueRanges.length - 1\n ? END_ANGLE\n : valueToAngle(valueRanges[i + 1]),\n })}\n stroke={getColor(innerValue)}\n opacity=\"0.8\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeWidth={2}\n />\n <path\n {...gauge.getArcProps({\n offset: -55,\n startAngle:\n i === 0 ? START_ANGLE : valueToAngle(innerValue),\n endAngle:\n i === 0\n ? valueToAngle(valueRanges[1])\n : i === valueRanges.length - 1\n ? END_ANGLE\n : valueToAngle(valueRanges[i + 1]),\n })}\n key={`${innerValue}_${i}`}\n stroke={getColor(innerValue)}\n opacity=\"0.8\"\n fill=\"none\"\n strokeLinecap=\"round\"\n strokeWidth={2}\n />\n </g>\n );\n })}\n </g>\n <g id=\"ticks\">\n {gauge.ticks.map((angle) => {\n const angleToValue = (angle: number) => {\n const angleRange = END_ANGLE - START_ANGLE;\n const valueRange = domainMax - domainMin;\n\n const value =\n domainMin + ((angle - START_ANGLE) / angleRange) * valueRange;\n\n return Math.round(value);\n };\n const asValue = angleToValue(angle);\n const showText = asValue % 10 === 0;\n\n return (\n <React.Fragment key={`tick-group-${angle}`}>\n <line\n stroke=\"gray\"\n strokeWidth={showText ? 4 : 2}\n {...gauge.getTickProps({ angle, length: showText ? 12 : 3 })}\n />\n {showText && (\n <text\n fill=\"black\"\n {...gauge.getLabelProps({ angle, offset: 20 })}\n style={{ fontSize: `${scaleValuesSize ?? 30}px` }}\n >\n {asValue}\n </text>\n )}\n </React.Fragment>\n );\n })}\n </g>\n <g id=\"needle\">\n <circle fill={pointerColor} {...needle.base} r={20} />\n <circle fill={pointerColor} {...needle.base} />\n <circle\n fill={pointerColor}\n opacity=\"0.5\"\n {...needle.tip}\n style={{\n transform: `rotate(${angle}deg)`,\n transition: 'transform 500ms',\n }}\n />\n <polyline\n style={{\n transform: `rotate(${angle}deg)`,\n transition: 'transform 500ms',\n }}\n fill={pointerColor}\n opacity=\"0.5\"\n points={needle.points}\n />\n <circle fill=\"white\" {...needle.base} r={4} />\n </g>\n <g>\n <text\n textAnchor=\"middle\"\n y={diameter / 2}\n fill={currentValueColor}\n style={{ fontSize: `${currentValueFontSize ?? 30}px` }}\n >\n {value}\n </text>\n </g>\n </svg>\n </Box>\n );\n};\n"],"names":["value","angle"],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { jsx, jsxs } from '@apia/theme/jsx-runtime';
2
+ import { Box } from '@apia/theme';
3
+ import { useGauge } from 'use-gauge';
4
+ import { useState, useRef, useCallback, useEffect } from 'react';
5
+ import { noNaN, animate, addBoundary } from '@apia/util';
6
+
7
+ const START_ANGLE = 0;
8
+ const END_ANGLE = 360;
9
+ const TLight = ({
10
+ addBorder = false,
11
+ colorRanges,
12
+ maxValue,
13
+ minValue,
14
+ currentValue,
15
+ height,
16
+ valueRanges,
17
+ width,
18
+ currentValueColor,
19
+ currentValueFontSize
20
+ }) => {
21
+ const [value, setValue] = useState(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 gauge = useGauge({
26
+ domain: [domainMin, domainMax],
27
+ startAngle: START_ANGLE,
28
+ endAngle: END_ANGLE,
29
+ numTicks: 0,
30
+ diameter
31
+ });
32
+ function getColor(value2) {
33
+ const index = valueRanges.findIndex((range) => value2 < range);
34
+ if (index === -1) {
35
+ return colorRanges[0];
36
+ }
37
+ return colorRanges[index - 1] ?? colorRanges[index];
38
+ }
39
+ const hasRendered = useRef(false);
40
+ const onRenderSvg = useCallback(
41
+ (el) => {
42
+ if (!el || hasRendered.current)
43
+ return;
44
+ hasRendered.current = true;
45
+ const svgElement = el;
46
+ const pathElement = el.querySelector("#TLight_arcs");
47
+ if (!(svgElement && pathElement)) {
48
+ return;
49
+ }
50
+ const pathBox = pathElement.getBoundingClientRect();
51
+ const svgBox = svgElement.getBoundingClientRect();
52
+ const pathX = pathBox.x - svgBox.x;
53
+ const pathY = pathBox.y - svgBox.y;
54
+ const viewBox = `${pathX - diameter / 2} ${pathY - diameter / 2} ${diameter} ${diameter}`;
55
+ svgElement.setAttribute("viewBox", viewBox);
56
+ svgElement.style.visibility = "visible";
57
+ },
58
+ [diameter]
59
+ );
60
+ const lastCurrentValue = useRef(0);
61
+ useEffect(() => {
62
+ const difference = currentValue - lastCurrentValue.current;
63
+ return animate(
64
+ 500,
65
+ (progress) => {
66
+ const step = addBoundary(
67
+ difference * progress + lastCurrentValue.current,
68
+ domainMin,
69
+ domainMax
70
+ );
71
+ setValue(Math.round(step));
72
+ },
73
+ () => {
74
+ lastCurrentValue.current = currentValue;
75
+ }
76
+ );
77
+ }, [currentValue]);
78
+ return /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsxs(
79
+ "svg",
80
+ {
81
+ ...gauge.getSVGProps(),
82
+ style: { visibility: "hidden" },
83
+ height: Math.max(width, height),
84
+ width: Math.max(width, height),
85
+ id: "TLight_svg",
86
+ ref: onRenderSvg,
87
+ viewBox: `-${diameter / 2} -${diameter / 2} ${diameter} ${diameter}`,
88
+ children: [
89
+ /* @__PURE__ */ jsxs("g", { id: "TLight_arcs", children: [
90
+ /* @__PURE__ */ jsx(
91
+ "path",
92
+ {
93
+ ...gauge.getArcProps({
94
+ startAngle: START_ANGLE,
95
+ endAngle: END_ANGLE
96
+ }),
97
+ fill: getColor(value),
98
+ id: "TLight_path",
99
+ style: { transition: "fill 0.3s" }
100
+ }
101
+ ),
102
+ addBorder && /* @__PURE__ */ jsx(
103
+ "path",
104
+ {
105
+ ...gauge.getArcProps({
106
+ offset: -2.5,
107
+ startAngle: START_ANGLE,
108
+ endAngle: END_ANGLE
109
+ }),
110
+ stroke: "black",
111
+ fill: "transparent",
112
+ strokeLinecap: "round",
113
+ strokeWidth: 5,
114
+ id: "TLight_path"
115
+ }
116
+ )
117
+ ] }),
118
+ /* @__PURE__ */ jsx("g", { children: /* @__PURE__ */ jsx(
119
+ "text",
120
+ {
121
+ textAnchor: "middle",
122
+ style: { fontSize: `${currentValueFontSize ?? 100}pt` },
123
+ alignmentBaseline: "central",
124
+ fill: currentValueColor,
125
+ children: value
126
+ }
127
+ ) })
128
+ ]
129
+ }
130
+ ) });
131
+ };
132
+
133
+ export { TLight };
134
+ //# sourceMappingURL=TLight.js.map