plotboilerplate 1.24.0 → 1.25.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 (141) hide show
  1. package/README.md +13 -1
  2. package/dist/index.esm.js +294 -129
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.esm.min.js +1 -1
  5. package/dist/index.esm.min.js.map +1 -1
  6. package/dist/plotboilerplate.browser.min.js +1 -1
  7. package/dist/plotboilerplate.browser.min.js.map +1 -1
  8. package/dist/plotboilerplate.js +12084 -11919
  9. package/dist/plotboilerplate.min.js +1 -1
  10. package/package.json +9 -5
  11. package/src/cjs/PlotBoilerplate.d.ts +37 -6
  12. package/src/cjs/PlotBoilerplate.js +222 -116
  13. package/src/cjs/PlotBoilerplate.js.map +1 -1
  14. package/src/cjs/Polygon.d.ts +26 -7
  15. package/src/cjs/Polygon.js +56 -10
  16. package/src/cjs/Polygon.js.map +1 -1
  17. package/src/cjs/Triangle.js +2 -2
  18. package/src/cjs/Triangle.js.map +1 -1
  19. package/src/cjs/Vertex.d.ts +15 -3
  20. package/src/cjs/Vertex.js +18 -1
  21. package/src/cjs/Vertex.js.map +1 -1
  22. package/src/cjs/interfaces/core.d.ts +28 -0
  23. package/src/cjs/interfaces/core.js +2 -0
  24. package/src/cjs/interfaces/core.js.map +1 -1
  25. package/src/cjs/utils/datastructures/Color.d.ts +147 -1
  26. package/src/cjs/utils/datastructures/Color.js +385 -41
  27. package/src/cjs/utils/datastructures/Color.js.map +1 -1
  28. package/src/cjs/utils/datastructures/ColorGradient.d.ts +79 -0
  29. package/src/cjs/utils/datastructures/ColorGradient.js +171 -0
  30. package/src/cjs/utils/datastructures/ColorGradient.js.map +1 -0
  31. package/src/cjs/utils/dom/components/ColorGradientPicker.d.ts +245 -0
  32. package/src/cjs/utils/dom/components/ColorGradientPicker.js +667 -0
  33. package/src/cjs/utils/dom/components/ColorGradientPicker.js.map +1 -0
  34. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.d.ts +129 -0
  35. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.js +520 -0
  36. package/src/cjs/utils/dom/components/ColorGradientPickerJSX.js.map +1 -0
  37. package/src/cjs/utils/dom/components/ColorGradientSelector.d.ts +117 -0
  38. package/src/cjs/utils/dom/components/ColorGradientSelector.js +325 -0
  39. package/src/cjs/utils/dom/components/ColorGradientSelector.js.map +1 -0
  40. package/src/cjs/utils/dom/components/Test.d.ts +7 -0
  41. package/src/cjs/utils/dom/components/Test.js +30 -0
  42. package/src/cjs/utils/dom/components/Test.js.map +1 -0
  43. package/src/cjs/utils/dom/guiSizeToggler.js +1 -1
  44. package/src/cjs/utils/dom/guiSizeToggler.js.map +1 -1
  45. package/src/cjs/utils/helpers/BezierPathInteractionHelper.d.ts +9 -3
  46. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js +20 -13
  47. package/src/cjs/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  48. package/src/cjs/utils/helpers/CircleHelper.d.ts +10 -1
  49. package/src/cjs/utils/helpers/CircleHelper.js +13 -2
  50. package/src/cjs/utils/helpers/CircleHelper.js.map +1 -1
  51. package/src/cjs/utils/helpers/CircleSectorHelper.d.ts +2 -2
  52. package/src/cjs/utils/helpers/CircleSectorHelper.js +1 -0
  53. package/src/cjs/utils/helpers/CircleSectorHelper.js.map +1 -1
  54. package/src/cjs/utils/helpers/TriangleHelper.d.ts +57 -0
  55. package/src/cjs/utils/helpers/TriangleHelper.js +83 -0
  56. package/src/cjs/utils/helpers/TriangleHelper.js.map +1 -0
  57. package/src/cjs/utils/helpers/VEllipseHelper.d.ts +6 -4
  58. package/src/cjs/utils/helpers/VEllipseHelper.js +4 -2
  59. package/src/cjs/utils/helpers/VEllipseHelper.js.map +1 -1
  60. package/src/cjs/utils/helpers/VEllipseSectorHelper.d.ts +3 -2
  61. package/src/cjs/utils/helpers/VEllipseSectorHelper.js +1 -0
  62. package/src/cjs/utils/helpers/VEllipseSectorHelper.js.map +1 -1
  63. package/src/cjs/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  64. package/src/cjs/utils/parsers/LinearColorGradientParser.js +224 -0
  65. package/src/cjs/utils/parsers/LinearColorGradientParser.js.map +1 -0
  66. package/src/createDemoDrawables.js +1 -0
  67. package/src/esm/PlotBoilerplate.d.ts +37 -6
  68. package/src/esm/PlotBoilerplate.js +222 -116
  69. package/src/esm/PlotBoilerplate.js.map +1 -1
  70. package/src/esm/Polygon.d.ts +26 -7
  71. package/src/esm/Polygon.js +53 -10
  72. package/src/esm/Polygon.js.map +1 -1
  73. package/src/esm/Triangle.js +2 -2
  74. package/src/esm/Triangle.js.map +1 -1
  75. package/src/esm/Vertex.d.ts +15 -3
  76. package/src/esm/Vertex.js +18 -1
  77. package/src/esm/Vertex.js.map +1 -1
  78. package/src/esm/interfaces/core.d.ts +28 -0
  79. package/src/esm/interfaces/core.js +2 -0
  80. package/src/esm/interfaces/core.js.map +1 -1
  81. package/src/esm/utils/datastructures/Color.d.ts +147 -1
  82. package/src/esm/utils/datastructures/Color.js +386 -42
  83. package/src/esm/utils/datastructures/Color.js.map +1 -1
  84. package/src/esm/utils/datastructures/ColorGradient.d.ts +79 -0
  85. package/src/esm/utils/datastructures/ColorGradient.js +166 -0
  86. package/src/esm/utils/datastructures/ColorGradient.js.map +1 -0
  87. package/src/esm/utils/dom/components/ColorGradientPicker.d.ts +245 -0
  88. package/src/esm/utils/dom/components/ColorGradientPicker.js +732 -0
  89. package/src/esm/utils/dom/components/ColorGradientPicker.js.map +1 -0
  90. package/src/esm/utils/dom/components/ColorGradientPickerJSX.d.ts +129 -0
  91. package/src/esm/utils/dom/components/ColorGradientPickerJSX.js +582 -0
  92. package/src/esm/utils/dom/components/ColorGradientPickerJSX.js.map +1 -0
  93. package/src/esm/utils/dom/components/ColorGradientSelector.d.ts +117 -0
  94. package/src/esm/utils/dom/components/ColorGradientSelector.js +332 -0
  95. package/src/esm/utils/dom/components/ColorGradientSelector.js.map +1 -0
  96. package/src/esm/utils/dom/components/Test.d.ts +7 -0
  97. package/src/esm/utils/dom/components/Test.js +26 -0
  98. package/src/esm/utils/dom/components/Test.js.map +1 -0
  99. package/src/esm/utils/dom/guiSizeToggler.js +1 -1
  100. package/src/esm/utils/dom/guiSizeToggler.js.map +1 -1
  101. package/src/esm/utils/helpers/BezierPathInteractionHelper.d.ts +9 -3
  102. package/src/esm/utils/helpers/BezierPathInteractionHelper.js +20 -13
  103. package/src/esm/utils/helpers/BezierPathInteractionHelper.js.map +1 -1
  104. package/src/esm/utils/helpers/CircleHelper.d.ts +10 -1
  105. package/src/esm/utils/helpers/CircleHelper.js +13 -2
  106. package/src/esm/utils/helpers/CircleHelper.js.map +1 -1
  107. package/src/esm/utils/helpers/CircleSectorHelper.d.ts +2 -2
  108. package/src/esm/utils/helpers/CircleSectorHelper.js +1 -0
  109. package/src/esm/utils/helpers/CircleSectorHelper.js.map +1 -1
  110. package/src/esm/utils/helpers/TriangleHelper.d.ts +57 -0
  111. package/src/esm/utils/helpers/TriangleHelper.js +78 -0
  112. package/src/esm/utils/helpers/TriangleHelper.js.map +1 -0
  113. package/src/esm/utils/helpers/VEllipseHelper.d.ts +6 -4
  114. package/src/esm/utils/helpers/VEllipseHelper.js +4 -2
  115. package/src/esm/utils/helpers/VEllipseHelper.js.map +1 -1
  116. package/src/esm/utils/helpers/VEllipseSectorHelper.d.ts +3 -2
  117. package/src/esm/utils/helpers/VEllipseSectorHelper.js +1 -0
  118. package/src/esm/utils/helpers/VEllipseSectorHelper.js.map +1 -1
  119. package/src/esm/utils/parsers/LinearColorGradientParser.d.ts +78 -0
  120. package/src/esm/utils/parsers/LinearColorGradientParser.js +217 -0
  121. package/src/esm/utils/parsers/LinearColorGradientParser.js.map +1 -0
  122. package/src/external.d.ts +9 -0
  123. package/src/ts/PlotBoilerplate.ts +233 -105
  124. package/src/ts/Polygon.ts +68 -14
  125. package/src/ts/Triangle.ts +2 -2
  126. package/src/ts/Vertex.ts +21 -3
  127. package/src/ts/interfaces/core.ts +31 -0
  128. package/src/ts/utils/datastructures/Color.ts +423 -44
  129. package/src/ts/utils/datastructures/ColorGradient.ts +196 -0
  130. package/src/ts/utils/dom/components/ColorGradientPicker.tsx +877 -0
  131. package/src/ts/utils/dom/components/ColorGradientSelector.tsx +445 -0
  132. package/src/ts/utils/dom/components/Test.tsx +44 -0
  133. package/src/ts/utils/dom/components/_ColorGradientPicker_raw.ts_ +392 -0
  134. package/src/ts/utils/dom/guiSizeToggler.ts +1 -1
  135. package/src/ts/utils/helpers/BezierPathInteractionHelper.ts +25 -15
  136. package/src/ts/utils/helpers/CircleHelper.ts +17 -3
  137. package/src/ts/utils/helpers/CircleSectorHelper.ts +4 -2
  138. package/src/ts/utils/helpers/TriangleHelper.ts +102 -0
  139. package/src/ts/utils/helpers/VEllipseHelper.ts +6 -4
  140. package/src/ts/utils/helpers/VEllipseSectorHelper.ts +3 -2
  141. package/src/ts/utils/parsers/LinearColorGradientParser.ts +297 -0
@@ -0,0 +1,196 @@
1
+ /**
2
+ * A simple linear color gradient implementation.
3
+ *
4
+ * A color gradient is just an array of color objects paired with position values on the gradient.
5
+ *
6
+ * TODO: add `angle`
7
+ *
8
+ * @author Ikaros Kappler
9
+ * @version 1.0.0
10
+ * @date 2025-08-05
11
+ */
12
+
13
+ import { Color } from "./Color";
14
+
15
+ const RAD_TO_DEG: number = 180.0 / Math.PI;
16
+
17
+ export type ColorGradientRotation = number | `${number}deg` | `${number}turn` | `to top` | "to bottom" | "to left" | "to right";
18
+
19
+ const DEFAULT_COLORSET: Array<ColorGradientItem> = [
20
+ { color: Color.Red, ratio: 0.0 },
21
+ { color: Color.Gold, ratio: 0.2 },
22
+ { color: Color.Yellow, ratio: 0.4 },
23
+ { color: Color.LimeGreen, ratio: 0.6 },
24
+ { color: Color.MediumBlue, ratio: 0.8 },
25
+ { color: Color.Purple, ratio: 1.0 }
26
+ ];
27
+
28
+ export interface ColorGradientItem {
29
+ color: Color;
30
+ ratio: number; // Ideally a percentage value in [0.0 .. 1.0]
31
+ }
32
+
33
+ export class ColorGradient {
34
+ values: Array<ColorGradientItem>;
35
+ angle: ColorGradientRotation;
36
+
37
+ /**
38
+ * Creates a new ColorGradient with the given values. Please be sure that the values appear in the correct
39
+ * order regarding the `ratio` information. This will not be validated.
40
+ *
41
+ * @param {Array<ColorGradientItem>} values - The values to use.
42
+ * @param {number?} angle - (optional) An optional angle for the gradient; if no specified `PI/2.0` will be used (vertical from left to right).
43
+ */
44
+ constructor(values: Array<ColorGradientItem>, angle?: ColorGradientRotation) {
45
+ this.values = values;
46
+ // Default: left to right
47
+ this.angle = typeof angle === "undefined" ? Math.PI / 2.0 : angle;
48
+ }
49
+
50
+ /**
51
+ * Get a color gradient CSS value string from these gradient settings.
52
+ *
53
+ * @instance
54
+ * @memberof ColorGradientPicker
55
+ * @returns {string}
56
+ */
57
+ public toColorGradientString(): string {
58
+ // Example:
59
+ // linear-gradient(90deg,rgba(42, 123, 155, 1) 0%, rgba(87, 199, 133, 1) 38%, rgba(161, 210, 108, 1) 68%, rgba(237, 221, 83, 1) 100%)
60
+
61
+ // const buffer: Array<string | undefined> = [`linear-gradient( ${RAD_TO_DEG * this.angle}deg, `];
62
+ const buffer: Array<string | undefined> = [
63
+ `linear-gradient( ${typeof this.angle === "number" ? `${this.angle * RAD_TO_DEG}deg` : this.angle}, `
64
+ ];
65
+
66
+ for (var i = 0; i < this.values.length; i++) {
67
+ if (i > 0) {
68
+ buffer.push(",");
69
+ }
70
+ const colorValue: string = this.values[i] ? this.values[i].color.cssRGBA() : null;
71
+ buffer.push(colorValue);
72
+ const percentage = this.values[i].ratio;
73
+ buffer.push(`${typeof percentage === "number" ? `${percentage * 100}%` : percentage}`);
74
+ }
75
+ buffer.push(")");
76
+
77
+ return buffer.join(" ");
78
+ }
79
+
80
+ /**
81
+ * Get the color at the specific relative position.
82
+ *
83
+ * @param {number} ratio - Any value between 0.0 and 1.0.
84
+ */
85
+ getColorAt(ratio: number): Color {
86
+ // Locate interval first
87
+ const intervalLocation: [number, ColorGradientItem] = this.locateClosestRatio(ratio);
88
+ const leftItem: ColorGradientItem = this.values[intervalLocation[0]];
89
+ const rightItem: ColorGradientItem = this.values[intervalLocation[0] + 1];
90
+ const relativeInnerIntervalPosition: number = (ratio - leftItem.ratio) / (rightItem.ratio - leftItem.ratio);
91
+ return leftItem.color.clone().interpolate(rightItem.color, relativeInnerIntervalPosition);
92
+ }
93
+
94
+ /**
95
+ * Find that gradient record (index) that's value is closest to the given relative value. The function will return
96
+ * the closest value and the left index, indicating the containing interval index.
97
+ *
98
+ * @param {number} ratio - The value to look for.
99
+ * @returns {[number,number]} A pair of left interval boundary index and closest value.
100
+ */
101
+ locateClosestRatio(ratio: number): [number, ColorGradientItem] {
102
+ if (this.values.length === 0) {
103
+ console.warn("[Warn] All slider values array is empty. This should not happen, cannot proceed.");
104
+ return [NaN, null]; // This should not happen: at least two values must be present in a gradient
105
+ }
106
+ // console.log("__locateClosestSliderValue", "allSliderValues", allSliderValues);
107
+ let leftSliderIndex: number = 0;
108
+ let closestSliderValue: ColorGradientItem = this.values[leftSliderIndex];
109
+ for (var i = 1; i < this.values.length; i++) {
110
+ const curVal: ColorGradientItem = this.values[i];
111
+ if (Math.abs(curVal.ratio - ratio) < Math.abs(closestSliderValue.ratio - ratio)) {
112
+ closestSliderValue = curVal;
113
+ if (curVal.ratio > ratio) {
114
+ leftSliderIndex = i - 1;
115
+ } else {
116
+ leftSliderIndex = i;
117
+ }
118
+ }
119
+ }
120
+ return [leftSliderIndex, closestSliderValue];
121
+ }
122
+
123
+ /**
124
+ * Try to convert the given anonymous item (usually and object) to a ColorGradient. This method should be used
125
+ * to restore items from JSON parse results to convert them into proper ColorGradient instances.
126
+ *
127
+ * @param {any} item
128
+ * @returns {ColorGradient}
129
+ */
130
+ public static fromObject(item: any): ColorGradient {
131
+ if (typeof item !== "object") {
132
+ throw new Error(`Cannot instantiate ColorGradient from item: must be an object. (${typeof item})`);
133
+ }
134
+ if (!item.hasOwnProperty("values")) {
135
+ throw new Error("Cannot instantiate ColorGradient from object: missing property 'values'.");
136
+ }
137
+ const valuesObj: Array<object> = item.values;
138
+ if (!Array.isArray(valuesObj)) {
139
+ throw new Error("Cannot instantiate ColorGradient from object: property 'values' is not an array.");
140
+ }
141
+ const values: Array<ColorGradientItem> = valuesObj.map((element: object, index: number) => {
142
+ if (typeof element !== "object") {
143
+ throw new Error(`Cannot instantiate ColorGradient from object: item at index ${index} is not an object.`);
144
+ }
145
+ if (!element.hasOwnProperty("color") || !element.hasOwnProperty("ratio")) {
146
+ throw new Error(
147
+ `Cannot instantiate ColorGradient from object: item at index ${index} is missing 'color' or 'ratio' property.`
148
+ );
149
+ }
150
+ const tmpElement = element as ColorGradientItem;
151
+ return { color: Color.makeRGB(tmpElement.color.r, tmpElement.color.g, tmpElement.color.b), ratio: tmpElement.ratio };
152
+ });
153
+ // More checks possible here ...
154
+ return new ColorGradient(values, item.angle);
155
+ }
156
+
157
+ /**
158
+ * Clone this linear color gradient. Returns a deep clone.
159
+ *
160
+ * @returns {ColorGradient}
161
+ */
162
+ public clone(): ColorGradient {
163
+ return new ColorGradient(
164
+ this.values.map((item: ColorGradientItem) => {
165
+ return { color: item.color, ratio: item.ratio };
166
+ }),
167
+ this.angle
168
+ );
169
+ }
170
+
171
+ /**
172
+ * Create a default color gradient with six color: red, orange, yellow, green, blue, purple.
173
+ * @returns
174
+ */
175
+ public static createDefault(): ColorGradient {
176
+ return new ColorGradient(DEFAULT_COLORSET.map((item: ColorGradientItem) => ({ color: item.color, ratio: item.ratio })));
177
+ }
178
+
179
+ /**
180
+ * Create a basic color gradient from only two colors.
181
+ *
182
+ * @param {Color} startColor - The leftmost color.
183
+ * @param {Color} endColor - The rightmost color.
184
+ * @param {number?} angleInRadians - (optional) An optional angle for the gradient; if no specified `PI/2.0` will be used (vertical from left to right).
185
+ * @returns
186
+ */
187
+ public static createFrom(startColor: Color, endColor: Color, angleInRadians?: number): ColorGradient {
188
+ return new ColorGradient(
189
+ [
190
+ { ratio: 0.0, color: startColor },
191
+ { ratio: 1.0, color: endColor }
192
+ ],
193
+ angleInRadians
194
+ );
195
+ }
196
+ }