@vandenberghinc/volt 1.1.5 → 1.1.7

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 (287) hide show
  1. package/backend/dist/cjs/database.d.ts +41 -68
  2. package/backend/dist/cjs/database.js +127 -76
  3. package/backend/dist/cjs/endpoint.d.ts +23 -9
  4. package/backend/dist/cjs/endpoint.js +98 -21
  5. package/backend/dist/cjs/frontend.d.ts +0 -2
  6. package/backend/dist/cjs/frontend.js +9 -9
  7. package/backend/dist/cjs/image_endpoint.d.ts +3 -1
  8. package/backend/dist/cjs/image_endpoint.js +2 -1
  9. package/backend/dist/cjs/payments/paddle.js +10 -2
  10. package/backend/dist/cjs/plugins/css.d.ts +6 -5
  11. package/backend/dist/cjs/plugins/css.js +32 -7
  12. package/backend/dist/cjs/plugins/ts/compiler.d.ts +6 -1
  13. package/backend/dist/cjs/plugins/ts/compiler.js +26 -2
  14. package/backend/dist/cjs/plugins/ts/preprocessing.js +5 -3
  15. package/backend/dist/cjs/server.d.ts +7 -13
  16. package/backend/dist/cjs/server.js +184 -303
  17. package/backend/dist/cjs/status.d.ts +1 -0
  18. package/backend/dist/cjs/status.js +2 -1
  19. package/backend/dist/cjs/stream.d.ts +5 -3
  20. package/backend/dist/cjs/stream.js +13 -4
  21. package/backend/dist/cjs/users.d.ts +1 -1
  22. package/backend/dist/cjs/users.js +87 -72
  23. package/backend/dist/cjs/utils.d.ts +17 -9
  24. package/backend/dist/cjs/utils.js +22 -64
  25. package/backend/dist/cjs/view.d.ts +2 -2
  26. package/backend/dist/cjs/view.js +38 -40
  27. package/backend/dist/cjs/volt.d.ts +3 -2
  28. package/backend/dist/cjs/volt.js +2 -2
  29. package/backend/dist/css/volt.css +5 -0
  30. package/backend/dist/esm/database.d.ts +41 -68
  31. package/backend/dist/esm/database.js +127 -76
  32. package/backend/dist/esm/endpoint.d.ts +23 -9
  33. package/backend/dist/esm/endpoint.js +99 -22
  34. package/backend/dist/esm/frontend.d.ts +0 -2
  35. package/backend/dist/esm/frontend.js +9 -9
  36. package/backend/dist/esm/image_endpoint.d.ts +3 -1
  37. package/backend/dist/esm/image_endpoint.js +2 -1
  38. package/backend/dist/esm/payments/paddle.js +11 -3
  39. package/backend/dist/esm/plugins/css.d.ts +6 -5
  40. package/backend/dist/esm/plugins/css.js +32 -6
  41. package/backend/dist/esm/plugins/ts/compiler.d.ts +6 -1
  42. package/backend/dist/esm/plugins/ts/compiler.js +26 -2
  43. package/backend/dist/esm/plugins/ts/preprocessing.js +5 -3
  44. package/backend/dist/esm/server.d.ts +7 -13
  45. package/backend/dist/esm/server.js +182 -301
  46. package/backend/dist/esm/status.d.ts +1 -0
  47. package/backend/dist/esm/status.js +1 -0
  48. package/backend/dist/esm/stream.d.ts +5 -3
  49. package/backend/dist/esm/stream.js +13 -4
  50. package/backend/dist/esm/users.d.ts +1 -1
  51. package/backend/dist/esm/users.js +87 -72
  52. package/backend/dist/esm/utils.d.ts +17 -9
  53. package/backend/dist/esm/utils.js +21 -62
  54. package/backend/dist/esm/view.d.ts +2 -2
  55. package/backend/dist/esm/view.js +38 -40
  56. package/backend/dist/esm/volt.d.ts +3 -2
  57. package/backend/dist/esm/volt.js +2 -1
  58. package/backend/dist/esm-dev/blacklist.js +1 -1
  59. package/backend/dist/esm-dev/cli.js +2 -2
  60. package/backend/dist/esm-dev/database.d.ts +41 -68
  61. package/backend/dist/esm-dev/database.js +128 -77
  62. package/backend/dist/esm-dev/endpoint.d.ts +23 -9
  63. package/backend/dist/esm-dev/endpoint.js +100 -23
  64. package/backend/dist/esm-dev/file_watcher.js +1 -1
  65. package/backend/dist/esm-dev/frontend.d.ts +0 -2
  66. package/backend/dist/esm-dev/frontend.js +9 -9
  67. package/backend/dist/esm-dev/image_endpoint.d.ts +3 -1
  68. package/backend/dist/esm-dev/image_endpoint.js +2 -1
  69. package/backend/dist/esm-dev/logger.js +1 -1
  70. package/backend/dist/esm-dev/payments/paddle.js +12 -4
  71. package/backend/dist/esm-dev/plugins/css.d.ts +6 -5
  72. package/backend/dist/esm-dev/plugins/css.js +33 -7
  73. package/backend/dist/esm-dev/plugins/ts/compiler.d.ts +6 -1
  74. package/backend/dist/esm-dev/plugins/ts/compiler.js +27 -3
  75. package/backend/dist/esm-dev/plugins/ts/preprocessing.js +7 -5
  76. package/backend/dist/esm-dev/rate_limit.js +1 -1
  77. package/backend/dist/esm-dev/server.d.ts +7 -13
  78. package/backend/dist/esm-dev/server.js +184 -303
  79. package/backend/dist/esm-dev/status.d.ts +1 -0
  80. package/backend/dist/esm-dev/status.js +1 -0
  81. package/backend/dist/esm-dev/stream.d.ts +5 -3
  82. package/backend/dist/esm-dev/stream.js +13 -4
  83. package/backend/dist/esm-dev/users.d.ts +1 -1
  84. package/backend/dist/esm-dev/users.js +88 -73
  85. package/backend/dist/esm-dev/utils.d.ts +17 -9
  86. package/backend/dist/esm-dev/utils.js +22 -63
  87. package/backend/dist/esm-dev/view.d.ts +2 -2
  88. package/backend/dist/esm-dev/view.js +39 -41
  89. package/backend/dist/esm-dev/volt.d.ts +3 -2
  90. package/backend/dist/esm-dev/volt.js +2 -1
  91. package/backend/src/database.ts +163 -152
  92. package/backend/src/endpoint.ts +123 -31
  93. package/backend/src/frontend.ts +9 -8
  94. package/backend/src/image_endpoint.ts +4 -0
  95. package/backend/src/payments/paddle.ts +11 -3
  96. package/backend/src/plugins/css.ts +36 -8
  97. package/backend/src/plugins/ts/compiler.ts +37 -1
  98. package/backend/src/plugins/ts/preprocessing.ts +5 -3
  99. package/backend/src/server.ts +167 -306
  100. package/backend/src/status.ts +1 -0
  101. package/backend/src/stream.ts +28 -8
  102. package/backend/src/users.ts +87 -72
  103. package/backend/src/utils.ts +58 -25
  104. package/backend/src/view.ts +30 -28
  105. package/backend/src/{volt.js → volt.ts} +2 -1
  106. package/backend/tsconfig.cjs.json +3 -3
  107. package/backend/tsconfig.esm.json +3 -3
  108. package/frontend/dist/elements/base.d.ts +397 -415
  109. package/frontend/dist/elements/base.js +565 -328
  110. package/frontend/dist/elements/module.d.ts +26 -12
  111. package/frontend/dist/elements/module.js +69 -32
  112. package/frontend/dist/elements/register_element.d.ts +3 -0
  113. package/frontend/dist/elements/register_element.js +22 -0
  114. package/frontend/dist/modules/auth.d.ts +1 -0
  115. package/frontend/dist/modules/auth.js +6 -5
  116. package/frontend/dist/modules/color.d.ts +159 -0
  117. package/frontend/dist/modules/color.js +315 -0
  118. package/frontend/dist/modules/colors.d.ts +1 -26
  119. package/frontend/dist/modules/colors.js +417 -338
  120. package/frontend/dist/modules/cookies.d.ts +1 -0
  121. package/frontend/dist/modules/cookies.js +1 -0
  122. package/frontend/dist/modules/events.d.ts +1 -0
  123. package/frontend/dist/modules/events.js +1 -0
  124. package/frontend/dist/modules/google.d.ts +1 -0
  125. package/frontend/dist/modules/google.js +1 -0
  126. package/frontend/dist/modules/meta.d.ts +1 -0
  127. package/frontend/dist/modules/meta.js +1 -0
  128. package/frontend/dist/modules/mutex.d.ts +1 -2
  129. package/frontend/dist/modules/mutex.js +3 -4
  130. package/frontend/dist/modules/paddle.d.ts +1 -0
  131. package/frontend/dist/modules/paddle.js +14 -13
  132. package/frontend/dist/modules/scheme.d.ts +1 -0
  133. package/frontend/dist/modules/scheme.js +4 -2
  134. package/frontend/dist/modules/statics.d.ts +1 -0
  135. package/frontend/dist/modules/statics.js +1 -0
  136. package/frontend/dist/modules/support.d.ts +1 -0
  137. package/frontend/dist/modules/support.js +3 -2
  138. package/frontend/dist/modules/theme.d.ts +56 -0
  139. package/frontend/dist/{ui → modules}/theme.js +186 -75
  140. package/frontend/dist/modules/themes.d.ts +1 -1
  141. package/frontend/dist/modules/themes.js +1 -0
  142. package/frontend/dist/modules/user.d.ts +1 -0
  143. package/frontend/dist/modules/user.js +11 -10
  144. package/frontend/dist/modules/utils.d.ts +23 -2
  145. package/frontend/dist/modules/utils.js +93 -1
  146. package/frontend/dist/types/gradient.js +4 -0
  147. package/frontend/dist/ui/border_button.d.ts +0 -25
  148. package/frontend/dist/ui/border_button.js +50 -51
  149. package/frontend/dist/ui/button.d.ts +0 -21
  150. package/frontend/dist/ui/button.js +41 -46
  151. package/frontend/dist/ui/canvas.js +15 -15
  152. package/frontend/dist/ui/checkbox.d.ts +3 -17
  153. package/frontend/dist/ui/checkbox.js +36 -30
  154. package/frontend/dist/ui/code.d.ts +15 -82
  155. package/frontend/dist/ui/code.js +150 -125
  156. package/frontend/dist/ui/color.d.ts +0 -1
  157. package/frontend/dist/ui/color.js +1 -1
  158. package/frontend/dist/ui/context_menu.d.ts +4 -2
  159. package/frontend/dist/ui/context_menu.js +16 -17
  160. package/frontend/dist/ui/css.js +2 -0
  161. package/frontend/dist/ui/divider.d.ts +0 -7
  162. package/frontend/dist/ui/divider.js +21 -25
  163. package/frontend/dist/ui/dropdown.d.ts +13 -7
  164. package/frontend/dist/ui/dropdown.js +65 -30
  165. package/frontend/dist/ui/for_each.d.ts +0 -5
  166. package/frontend/dist/ui/for_each.js +17 -22
  167. package/frontend/dist/ui/form.d.ts +17 -12
  168. package/frontend/dist/ui/form.js +21 -18
  169. package/frontend/dist/ui/frame_modes.d.ts +9 -12
  170. package/frontend/dist/ui/frame_modes.js +8 -10
  171. package/frontend/dist/ui/google_map.d.ts +0 -11
  172. package/frontend/dist/ui/google_map.js +23 -28
  173. package/frontend/dist/ui/gradient.d.ts +0 -5
  174. package/frontend/dist/ui/gradient.js +17 -22
  175. package/frontend/dist/ui/image.d.ts +27 -58
  176. package/frontend/dist/ui/image.js +99 -93
  177. package/frontend/dist/ui/input.d.ts +20 -97
  178. package/frontend/dist/ui/input.js +192 -170
  179. package/frontend/dist/ui/link.d.ts +0 -18
  180. package/frontend/dist/ui/link.js +42 -48
  181. package/frontend/dist/ui/list.js +36 -37
  182. package/frontend/dist/ui/loader_button.d.ts +4 -19
  183. package/frontend/dist/ui/loader_button.js +35 -37
  184. package/frontend/dist/ui/loaders.d.ts +0 -8
  185. package/frontend/dist/ui/loaders.js +20 -25
  186. package/frontend/dist/ui/popup.d.ts +11 -8
  187. package/frontend/dist/ui/popup.js +183 -24
  188. package/frontend/dist/ui/pseudo.d.ts +3 -3
  189. package/frontend/dist/ui/pseudo.js +14 -17
  190. package/frontend/dist/ui/scroller.d.ts +10 -48
  191. package/frontend/dist/ui/scroller.js +306 -300
  192. package/frontend/dist/ui/slider.d.ts +9 -3
  193. package/frontend/dist/ui/slider.js +31 -17
  194. package/frontend/dist/ui/spacer.d.ts +0 -9
  195. package/frontend/dist/ui/spacer.js +21 -26
  196. package/frontend/dist/ui/span.js +13 -15
  197. package/frontend/dist/ui/stack.d.ts +14 -75
  198. package/frontend/dist/ui/stack.js +166 -169
  199. package/frontend/dist/ui/steps.d.ts +10 -23
  200. package/frontend/dist/ui/steps.js +47 -34
  201. package/frontend/dist/ui/style.d.ts +4 -3
  202. package/frontend/dist/ui/style.js +13 -18
  203. package/frontend/dist/ui/switch.d.ts +10 -4
  204. package/frontend/dist/ui/switch.js +24 -16
  205. package/frontend/dist/ui/table.d.ts +0 -23
  206. package/frontend/dist/ui/table.js +113 -119
  207. package/frontend/dist/ui/tabs.d.ts +3 -19
  208. package/frontend/dist/ui/tabs.js +35 -29
  209. package/frontend/dist/ui/text.d.ts +0 -8
  210. package/frontend/dist/ui/text.js +20 -25
  211. package/frontend/dist/ui/title.d.ts +0 -15
  212. package/frontend/dist/ui/title.js +39 -45
  213. package/frontend/dist/ui/ui.d.ts +0 -2
  214. package/frontend/dist/ui/ui.js +0 -2
  215. package/frontend/dist/ui/view.d.ts +3 -17
  216. package/frontend/dist/ui/view.js +27 -32
  217. package/frontend/dist/volt.d.ts +2 -1
  218. package/frontend/dist/volt.js +3 -1
  219. package/frontend/examples/dashboard/dashboard.ts +774 -0
  220. package/frontend/examples/theme/theme.ts +58 -0
  221. package/frontend/src/css/volt.css +5 -0
  222. package/frontend/src/elements/base.ts +767 -545
  223. package/frontend/src/elements/module.ts +90 -29
  224. package/frontend/src/elements/register_element.ts +24 -0
  225. package/frontend/src/modules/auth.ts +7 -6
  226. package/frontend/src/modules/color.ts +348 -0
  227. package/frontend/src/modules/colors.ts +468 -449
  228. package/frontend/src/modules/cookies.ts +1 -0
  229. package/frontend/src/modules/events.ts +1 -0
  230. package/frontend/src/modules/google.ts +1 -0
  231. package/frontend/src/modules/meta.ts +2 -1
  232. package/frontend/src/modules/mutex.ts +2 -4
  233. package/frontend/src/modules/paddle.ts +21 -20
  234. package/frontend/src/modules/scheme.ts +4 -3
  235. package/frontend/src/modules/statics.ts +2 -1
  236. package/frontend/src/modules/support.ts +3 -2
  237. package/frontend/src/modules/theme.ts +413 -0
  238. package/frontend/src/modules/themes.ts +2 -1
  239. package/frontend/src/modules/user.ts +12 -11
  240. package/frontend/src/modules/utils.ts +125 -2
  241. package/frontend/src/ui/border_button.ts +41 -37
  242. package/frontend/src/ui/button.ts +33 -32
  243. package/frontend/src/ui/canvas.ts +5 -2
  244. package/frontend/src/ui/checkbox.ts +21 -22
  245. package/frontend/src/ui/code.ts +92 -86
  246. package/frontend/src/ui/context_menu.ts +7 -5
  247. package/frontend/src/ui/css.ts +1 -1
  248. package/frontend/src/ui/divider.ts +15 -10
  249. package/frontend/src/ui/dropdown.ts +38 -21
  250. package/frontend/src/ui/for_each.ts +9 -8
  251. package/frontend/src/ui/form.ts +26 -21
  252. package/frontend/src/ui/frame_modes.ts +13 -17
  253. package/frontend/src/ui/google_map.ts +15 -13
  254. package/frontend/src/ui/gradient.ts +9 -8
  255. package/frontend/src/ui/image.ts +108 -86
  256. package/frontend/src/ui/input.ts +145 -144
  257. package/frontend/src/ui/link.ts +25 -23
  258. package/frontend/src/ui/list.ts +12 -6
  259. package/frontend/src/ui/loader_button.ts +26 -25
  260. package/frontend/src/ui/loaders.ts +12 -11
  261. package/frontend/src/ui/popup.ts +168 -14
  262. package/frontend/src/ui/pseudo.ts +5 -3
  263. package/frontend/src/ui/scroller.ts +303 -294
  264. package/frontend/src/ui/slider.ts +15 -10
  265. package/frontend/src/ui/spacer.ts +14 -11
  266. package/frontend/src/ui/span.ts +6 -2
  267. package/frontend/src/ui/stack.ts +196 -183
  268. package/frontend/src/ui/steps.ts +38 -22
  269. package/frontend/src/ui/style.ts +7 -4
  270. package/frontend/src/ui/switch.ts +16 -11
  271. package/frontend/src/ui/table.ts +42 -34
  272. package/frontend/src/ui/tabs.ts +20 -19
  273. package/frontend/src/ui/text.ts +12 -11
  274. package/frontend/src/ui/title.ts +22 -20
  275. package/frontend/src/ui/ui.ts +0 -2
  276. package/frontend/src/ui/view.ts +20 -19
  277. package/frontend/src/volt.ts +3 -1
  278. package/frontend/{compile.js → tools/compile.old.js} +2 -2
  279. package/frontend/tools/embed_scripts.js +69 -0
  280. package/frontend/tsconfig.json +26 -0
  281. package/package.json +8 -8
  282. package/frontend/dist/ui/theme.d.ts +0 -25
  283. package/frontend/exports.json +0 -1340
  284. package/frontend/src/modules/date.js +0 -535
  285. package/frontend/src/ui/color.ts +0 -117
  286. package/frontend/src/ui/theme.ts +0 -279
  287. /package/backend/src/{vinc.dev.js → vinc.dev.ts} +0 -0
@@ -1,338 +1,417 @@
1
- // Colors module
2
- const Colors = {
3
- // ---------------------------------------------------------
4
- // Attributes.
5
- black: "\u001b[30m",
6
- red: "\u001b[31m",
7
- red_bold: "\u001b[31m\u001b[1m",
8
- green: "\u001b[32m",
9
- yellow: "\u001b[33m",
10
- blue: "\u001b[34m",
11
- magenta: "\u001b[35m",
12
- cyan: "\u001b[36m",
13
- light_gray: "\u001b[37m",
14
- gray: "\u001b[90m",
15
- bold: "\u001b[1m",
16
- italic: "\u001b[3m",
17
- end: "\u001b[0m",
18
- purple: "\u001b[94m",
19
- bg: {
20
- black: "\u001b[40m",
21
- red: "\u001b[41m",
22
- green: "\u001b[42m",
23
- yellow: "\u001b[43m",
24
- blue: "\u001b[44m",
25
- magenta: "\u001b[45m",
26
- cyan: "\u001b[46m",
27
- white: "\u001b[47m",
28
- },
29
- bright_bg: {
30
- black: "\u001b[100m",
31
- red: "\u001b[101m",
32
- green: "\u001b[102m",
33
- yellow: "\u001b[103m",
34
- blue: "\u001b[104m",
35
- magenta: "\u001b[105m",
36
- cyan: "\u001b[106m",
37
- white: "\u001b[107m",
38
- },
39
- // Hex module
40
- hex: {
41
- // Get the brightness of a hex color (0.0 white, 1.0 dark)
42
- get_brightness(color) {
43
- color = color.replace(/^#/, '');
44
- const bigint = parseInt(color, 16);
45
- const r = (bigint >> 16) & 255;
46
- const g = (bigint >> 8) & 255;
47
- const b = bigint & 255;
48
- const brightness = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
49
- return brightness;
50
- },
51
- // Convert hex to RGBA
52
- to_rgb(hex, as_array = false) {
53
- const index = hex.indexOf("#");
54
- if (index !== -1) {
55
- hex = hex.substr(index + 1);
56
- }
57
- let r = parseInt(hex.substring(0, 2), 16);
58
- let g = parseInt(hex.substring(2, 4), 16);
59
- let b = parseInt(hex.substring(4, 6), 16);
60
- let a = 1;
61
- if (hex.length > 6) {
62
- a = parseInt(hex.substring(6, 8), 16) / 255;
63
- }
64
- if (isNaN(r)) {
65
- r = 0;
66
- }
67
- if (isNaN(g)) {
68
- g = 0;
69
- }
70
- if (isNaN(b)) {
71
- b = 0;
72
- }
73
- if (isNaN(a)) {
74
- a = 1;
75
- }
76
- if (as_array) {
77
- return [r, g, b, a];
78
- }
79
- return { r, g, b, a };
80
- },
81
- // Adjust brightness of a hex color
82
- adjust_brightness(color, adjust = 0) {
83
- const rgba = this.to_rgb(color);
84
- if (Array.isArray(rgba)) {
85
- rgba[0] += adjust;
86
- rgba[1] += adjust;
87
- rgba[2] += adjust;
88
- return Colors.rgb.to_hex(rgba[0], rgba[1], rgba[2], rgba[3]);
89
- }
90
- else {
91
- rgba.r += adjust;
92
- rgba.g += adjust;
93
- rgba.b += adjust;
94
- return Colors.rgb.to_hex(rgba.r, rgba.g, rgba.b, rgba.a);
95
- }
96
- },
97
- // Placeholder for aliasing
98
- to_rgba: null,
99
- },
100
- // RGB module
101
- rgb: {
102
- // RGB(a) to hex
103
- to_hex(r, g, b, a = 1) {
104
- const hexR = Math.round(r).toString(16).padStart(2, '0');
105
- const hexG = Math.round(g).toString(16).padStart(2, '0');
106
- const hexB = Math.round(b).toString(16).padStart(2, '0');
107
- const hexA = a === 1 ? "" : Math.round(a * 255).toString(16).padStart(2, '0');
108
- return `#${hexR}${hexG}${hexB}${hexA}`;
109
- },
110
- // Convert a color string (e.g., "rgb(255, 0, 0)") to an RGBA object
111
- to_obj(color) {
112
- if (!color.startsWith("rgba(") && !color.startsWith("rgb(")) {
113
- throw new Error("Invalid color format");
114
- }
115
- const split = color.trim().split("(")[1].slice(0, -1).split(",");
116
- const obj = { r: 0, g: 0, b: 0, a: 1 };
117
- obj.r = parseInt(split[0].trim());
118
- obj.g = parseInt(split[1].trim());
119
- obj.b = parseInt(split[2].trim());
120
- if (split[3]) {
121
- obj.a = parseFloat(split[3].trim());
122
- }
123
- return obj;
124
- },
125
- // Convert RGBA values to a color string
126
- to_str(r, g, b, a = 1) {
127
- if (a !== 1) {
128
- return `rgba(${isNaN(r) ? 0 : r}, ${isNaN(g) ? 0 : g}, ${isNaN(b) ? 0 : b}, ${isNaN(a) ? 1 : a})`;
129
- }
130
- else {
131
- return `rgb(${isNaN(r) ? 0 : r}, ${isNaN(g) ? 0 : g}, ${isNaN(b) ? 0 : b})`;
132
- }
133
- },
134
- // Adjust brightness of an RGB color
135
- adjust_brightness(color, adjust = 0) {
136
- const rgba = this.to_obj(color);
137
- rgba.r += adjust;
138
- rgba.g += adjust;
139
- rgba.b += adjust;
140
- return this.to_str(rgba.r, rgba.g, rgba.b, rgba.a);
141
- },
142
- },
143
- // Placeholder for aliasing
144
- rgba: null,
145
- // Utility function to adjust brightness
146
- adjust_brightness(color, adjust = 0) {
147
- if (color.startsWith("rgb")) {
148
- return this.rgb.adjust_brightness(color, adjust);
149
- }
150
- else if (color.startsWith("#")) {
151
- return this.hex.adjust_brightness(color, adjust);
152
- }
153
- else {
154
- throw new Error("Invalid color format");
155
- }
156
- },
157
- // Set the opacity of a color
158
- set_opacity(color, opacity = 1.0) {
159
- if (typeof opacity !== "number" || opacity < 0 || opacity > 1) {
160
- throw new Error("Invalid opacity [0...1]: " + opacity + ".");
161
- }
162
- let rgba;
163
- let type;
164
- if (color.startsWith("rgb")) {
165
- type = "rgb";
166
- rgba = this.rgb.to_obj(color);
167
- }
168
- else if (color.startsWith("#")) {
169
- type = "hex";
170
- const result = this.hex.to_rgb(color);
171
- rgba = Array.isArray(result) ? { r: result[0], g: result[1], b: result[2], a: result[3] } : result;
172
- }
173
- else {
174
- throw new Error("Invalid color format");
175
- }
176
- rgba.a = opacity;
177
- if (type === "hex") {
178
- return this.rgb.to_hex(rgba.r, rgba.g, rgba.b, rgba.a);
179
- }
180
- else {
181
- return this.rgb.to_str(rgba.r, rgba.g, rgba.b, rgba.a);
182
- }
183
- },
184
- // Darken the color by interpolating toward black (#000000)
185
- darken(color, percent = 0.5) {
186
- if (typeof percent !== "number" || percent < 0 || percent > 1) {
187
- throw new Error("Invalid percentage [0...1]: " + percent + ".");
188
- }
189
- // Convert input to RGB object
190
- const rgb = typeof color === 'string' ? this.hex.to_rgb(color) : {
191
- r: color[0],
192
- g: color[1],
193
- b: color[2],
194
- a: color.length > 3 ? color[3] : 1
195
- };
196
- // Interpolate toward black (0,0,0)
197
- const darkened = {
198
- r: Math.round(rgb.r * (1 - percent)),
199
- g: Math.round(rgb.g * (1 - percent)),
200
- b: Math.round(rgb.b * (1 - percent)),
201
- a: rgb.a
202
- };
203
- // Return in same format as input
204
- // if (typeof color === 'string') {
205
- return this.rgb.to_str(darkened.r, darkened.g, darkened.b, darkened.a);
206
- // } else {
207
- // return color.length > 3
208
- // ? [darkened.r, darkened.g, darkened.b, darkened.a]
209
- // : [darkened.r, darkened.g, darkened.b];
210
- // }
211
- },
212
- // Lighten the color by interpolating toward white (#FFFFFF)
213
- lighten(color, percent = 0.5) {
214
- if (typeof percent !== "number" || percent < 0 || percent > 1) {
215
- throw new Error("Invalid percentage [0...1]: " + percent + ".");
216
- }
217
- // Convert input to RGB object
218
- const rgb = typeof color === 'string' ? this.hex.to_rgb(color) : {
219
- r: color[0],
220
- g: color[1],
221
- b: color[2],
222
- a: color.length > 3 ? color[3] : 1
223
- };
224
- // Interpolate toward white (255,255,255)
225
- const lightened = {
226
- r: Math.round(rgb.r + (255 - rgb.r) * percent),
227
- g: Math.round(rgb.g + (255 - rgb.g) * percent),
228
- b: Math.round(rgb.b + (255 - rgb.b) * percent),
229
- a: rgb.a
230
- };
231
- // Return in same format as input
232
- // if (typeof color === 'string') {
233
- return this.rgb.to_str(lightened.r, lightened.g, lightened.b, lightened.a);
234
- // } else {
235
- // return color.length > 3
236
- // ? [lightened.r, lightened.g, lightened.b, lightened.a]
237
- // : [lightened.r, lightened.g, lightened.b];
238
- // }
239
- },
240
- // Interpolate.
241
- interpolate(start, end, percent = 0.5, alpha = 1.0) {
242
- if (typeof percent !== "number" || percent < 0 || percent > 1) {
243
- throw new Error("Invalid percentage [0...1]: " + percent + ".");
244
- }
245
- if (typeof alpha !== "number" || alpha < 0 || alpha > 1) {
246
- throw new Error("Invalid alpha [0...1]: " + alpha + ".");
247
- }
248
- return new ColorRangeClass(start, end).interpolate(percent, alpha);
249
- }
250
- };
251
- // Aliases
252
- Colors.hex.to_rgba = Colors.hex.to_rgb;
253
- Colors.rgba = Colors.rgb;
254
- // Export
255
- export { Colors };
256
- import { Elements } from "../elements/module.js";
257
- /* @docs:
258
- @nav: Frontend
259
- @chapter: Styling
260
- @title: Color range
261
- @description: Used to create a range between two different colors. Can be initialized using alias function `ColorRange`.
262
- @param:
263
- @name: start
264
- @descr: The start color (lightest). May either be a HEX string or an rgb(a) array.
265
- @type: string, array
266
- @param:
267
- @name: end
268
- @descr: The end color (darkest). May either be a HEX string or an rgb(a) array.
269
- @type: string, array
270
- */
271
- export class ColorRangeClass {
272
- constructor(start, end) {
273
- if (Array.isArray(start)) {
274
- this.start = this.array_to_rgba(start);
275
- }
276
- else if (typeof start === "string") {
277
- this.start = Colors.hex.to_rgb(start);
278
- }
279
- else {
280
- throw new Error(`Invalid type "${typeof start}" for parameter "start", the valid types are "string" or "array".`);
281
- }
282
- if (Array.isArray(end)) {
283
- this.end = this.array_to_rgba(end);
284
- }
285
- else if (typeof end === "string") {
286
- this.end = Colors.hex.to_rgb(end);
287
- }
288
- else {
289
- throw new Error(`Invalid type "${typeof end}" for parameter "end", the valid types are "string" or "array".`);
290
- }
291
- }
292
- // Array to rgba.
293
- array_to_rgba(array) {
294
- return {
295
- r: isNaN(array[0]) ? 0 : array[0],
296
- g: isNaN(array[1]) ? 0 : array[1],
297
- b: isNaN(array[2]) ? 0 : array[2],
298
- a: array.length < 4 ? 1.0 : isNaN(array[3]) ? 1.0 : array[3],
299
- };
300
- }
301
- /* @docs:
302
- @title: Interpolate
303
- @description: Interpolate between the start and end colors. When `percent` is 0 it will return the `start` color and when percent is `1` it will return the end color without computations.
304
- @param:
305
- @name: percent
306
- @descr: The percentage to interpolate from start to end, the valid range is `0.0` till `1.0`.
307
- @type: number
308
- @param:
309
- @name: alpha
310
- @descr: The alpha channel, the valid range is `0.0` till `1.0`.
311
- @type: number
312
- @default: 1
313
- */
314
- interpolate(percent = 0.5, alpha = 1.0) {
315
- // Validate inputs
316
- percent = Math.max(0, Math.min(1, percent)); // Clamp percent between 0 and 1
317
- alpha = Math.max(0, Math.min(1, alpha)); // Clamp alpha between 0 and 1
318
- // Handle edge cases
319
- if (percent <= 0) {
320
- return Colors.rgb.to_str(this.start.r, this.start.g, this.start.b, this.start.a);
321
- }
322
- else if (percent >= 1) {
323
- console.log("END:", this.end);
324
- return Colors.rgb.to_str(this.end.r, this.end.g, this.end.b, this.end.a);
325
- }
326
- // Ensure all RGB values are valid numbers (default to 0 if invalid)
327
- const startR = isNaN(this.start.r) ? 0 : this.start.r;
328
- const startG = isNaN(this.start.g) ? 0 : this.start.g;
329
- const startB = isNaN(this.start.b) ? 0 : this.start.b;
330
- const endR = isNaN(this.end.r) ? 0 : this.end.r;
331
- const endG = isNaN(this.end.g) ? 0 : this.end.g;
332
- const endB = isNaN(this.end.b) ? 0 : this.end.b;
333
- // Perform interpolation with validated values
334
- return Colors.rgba.to_str(Math.round(startR + (endR - startR) * percent), Math.round(startG + (endG - startG) * percent), Math.round(startB + (endB - startB) * percent), alpha);
335
- }
336
- }
337
- export const ColorRange = Elements.wrapper(ColorRangeClass);
338
- export const NullColorRange = Elements.create_null(ColorRangeClass);
1
+ "use strict";
2
+ /** @deprecated Use `Color` from modules/color.ts instead */
3
+ // type ColorFunction = (data: any) => string;
4
+ // type ColorObject = Record<'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white', string>;
5
+ // type ColorFunctionObject = Record<'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white', ColorFunction>;
6
+ // // Colors module
7
+ // export namespace Colors {
8
+ // // Types.
9
+ // export type Color = string;
10
+ // export type RGBArray = number[];
11
+ // export interface RGBAObject {
12
+ // r: number;
13
+ // g: number;
14
+ // b: number;
15
+ // a?: number;
16
+ // }
17
+ // // ---------------------------------------------------------
18
+ // // Attributes.
19
+ // export const black = "\u001b[30m";
20
+ // export const red = "\u001b[31m";
21
+ // export const red_bold = "\u001b[31m\u001b[1m";
22
+ // export const green = "\u001b[32m";
23
+ // export const yellow = "\u001b[33m";
24
+ // export const blue = "\u001b[34m";
25
+ // export const magenta = "\u001b[35m";
26
+ // export const cyan = "\u001b[36m";
27
+ // export const light_gray = "\u001b[37m";
28
+ // export const gray = "\u001b[90m";
29
+ // export const bold = "\u001b[1m";
30
+ // export const italic = "\u001b[3m";
31
+ // export const end = "\u001b[0m";
32
+ // export const purple = "\u001b[94m";
33
+ // export const bg: ColorObject = {
34
+ // black: "\u001b[40m",
35
+ // red: "\u001b[41m",
36
+ // green: "\u001b[42m",
37
+ // yellow: "\u001b[43m",
38
+ // blue: "\u001b[44m",
39
+ // magenta: "\u001b[45m",
40
+ // cyan: "\u001b[46m",
41
+ // white: "\u001b[47m",
42
+ // };
43
+ // export const bright_bg: ColorObject = {
44
+ // black: "\u001b[100m",
45
+ // red: "\u001b[101m",
46
+ // green: "\u001b[102m",
47
+ // yellow: "\u001b[103m",
48
+ // blue: "\u001b[104m",
49
+ // magenta: "\u001b[105m",
50
+ // cyan: "\u001b[106m",
51
+ // white: "\u001b[107m",
52
+ // };
53
+ // // Hex module
54
+ // export namespace hex {
55
+ // // Get the brightness of a hex color (0.0 white, 1.0 dark)
56
+ // export function get_brightness(color: string): number {
57
+ // color = color.replace(/^#/, '');
58
+ // const bigint = parseInt(color, 16);
59
+ // const r = (bigint >> 16) & 255;
60
+ // const g = (bigint >> 8) & 255;
61
+ // const b = bigint & 255;
62
+ // const brightness = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
63
+ // return brightness;
64
+ // }
65
+ // // Convert hex to RGBA;
66
+ // export function to_rgb(hex: string, as_array: true): number[];
67
+ // export function to_rgb(hex: string, as_array?: false): RGBAObject;
68
+ // export function to_rgb(hex: string, as_array: boolean = false): RGBAObject | number[] {
69
+ // const index = hex.indexOf("#");
70
+ // if (index !== -1) {
71
+ // hex = hex.substr(index + 1);
72
+ // }
73
+ // let r = parseInt(hex.substring(0, 2), 16);
74
+ // let g = parseInt(hex.substring(2, 4), 16);
75
+ // let b = parseInt(hex.substring(4, 6), 16);
76
+ // let a = 1;
77
+ // if (hex.length > 6) {
78
+ // a = parseInt(hex.substring(6, 8), 16) / 255;
79
+ // }
80
+ // if (isNaN(r)) { r = 0; }
81
+ // if (isNaN(g)) { g = 0; }
82
+ // if (isNaN(b)) { b = 0; }
83
+ // if (isNaN(a)) { a = 1; }
84
+ // if (as_array) {
85
+ // return [r, g, b, a];
86
+ // }
87
+ // return { r, g, b, a };
88
+ // }
89
+ // export const to_rgba = to_rgb;
90
+ // // Adjust brightness of a hex color
91
+ // export function adjust_brightness(color: string, adjust: number = 0): string {
92
+ // const rgba = hex.to_rgb(color);
93
+ // if (Array.isArray(rgba)) {
94
+ // rgba[0] += adjust;
95
+ // rgba[1] += adjust;
96
+ // rgba[2] += adjust;
97
+ // return Colors.rgb.to_hex(rgba[0], rgba[1], rgba[2], rgba[3]);
98
+ // } else {
99
+ // rgba.r += adjust;
100
+ // rgba.g += adjust;
101
+ // rgba.b += adjust;
102
+ // return Colors.rgb.to_hex(rgba.r, rgba.g, rgba.b, rgba.a);
103
+ // }
104
+ // }
105
+ // // Placeholder for aliasing
106
+ // // export const to_rgba = null as unknown as (hex: string, as_array?: boolean) => RGBA | number[];
107
+ // };
108
+ // // hex.to_rgba = hex.to_rgb;
109
+ // // RGB module
110
+ // export const rgb = {
111
+ // // RGB(a) to hex
112
+ // to_hex(r: number, g: number, b: number, a: number = 1): string {
113
+ // const hexR = Math.round(r).toString(16).padStart(2, '0');
114
+ // const hexG = Math.round(g).toString(16).padStart(2, '0');
115
+ // const hexB = Math.round(b).toString(16).padStart(2, '0');
116
+ // const hexA = a === 1 ? "" : Math.round(a * 255).toString(16).padStart(2, '0');
117
+ // return `#${hexR}${hexG}${hexB}${hexA}`;
118
+ // },
119
+ // // Convert a color string (e.g., "rgb(255, 0, 0)") to an RGBA object
120
+ // to_obj(color: string): RGBAObject {
121
+ // if (!color.startsWith("rgba(") && !color.startsWith("rgb(")) {
122
+ // throw new Error("Invalid color format");
123
+ // }
124
+ // const split = color.trim().split("(")[1].slice(0, -1).split(",");
125
+ // const obj: RGBAObject = { r: 0, g: 0, b: 0, a: 1 };
126
+ // obj.r = parseInt(split[0].trim());
127
+ // obj.g = parseInt(split[1].trim());
128
+ // obj.b = parseInt(split[2].trim());
129
+ // if (split[3]) {
130
+ // obj.a = parseFloat(split[3].trim());
131
+ // }
132
+ // return obj;
133
+ // },
134
+ // // Convert RGBA values to a color string
135
+ // to_str(r: number, g: number, b: number, a: number = 1): string {
136
+ // if (a !== 1) {
137
+ // return `rgba(${isNaN(r) ? 0 : r}, ${isNaN(g) ? 0 : g}, ${isNaN(b) ? 0 : b}, ${isNaN(a) ? 1 : a})`;
138
+ // } else {
139
+ // return `rgb(${isNaN(r) ? 0 : r}, ${isNaN(g) ? 0 : g}, ${isNaN(b) ? 0 : b})`;
140
+ // }
141
+ // },
142
+ // // Adjust brightness of an RGB color
143
+ // adjust_brightness(color: string, adjust: number = 0): string {
144
+ // const rgba = this.to_obj(color);
145
+ // rgba.r += adjust;
146
+ // rgba.g += adjust;
147
+ // rgba.b += adjust;
148
+ // return this.to_str(rgba.r, rgba.g, rgba.b, rgba.a);
149
+ // },
150
+ // };
151
+ // // Placeholder for aliasing
152
+ // export const rgba = rgb;
153
+ // // Utility function to adjust brightness
154
+ // export function adjust_brightness(color: string, adjust: number = 0): string {
155
+ // if (color.startsWith("rgb")) {
156
+ // return Colors.rgb.adjust_brightness(color, adjust);
157
+ // } else if (color.startsWith("#")) {
158
+ // return Colors.hex.adjust_brightness(color, adjust);
159
+ // } else {
160
+ // throw new Error("Invalid color format");
161
+ // }
162
+ // }
163
+ // // Set the opacity of a color
164
+ // export function set_opacity(color: string, opacity: number = 1.0): string {
165
+ // if (typeof opacity !== "number" || opacity < 0 || opacity > 1) {
166
+ // throw new Error("Invalid opacity [0...1]: " + opacity + ".");
167
+ // }
168
+ // let rgba: RGBAObject;
169
+ // let type: 'rgb' | 'hex';
170
+ // if (color.startsWith("rgb")) {
171
+ // type = "rgb";
172
+ // rgba = Colors.rgb.to_obj(color);
173
+ // } else if (color.startsWith("#")) {
174
+ // type = "hex";
175
+ // const result = Colors.hex.to_rgb(color);
176
+ // rgba = Array.isArray(result) ? { r: result[0], g: result[1], b: result[2], a: result[3] } : result;
177
+ // } else {
178
+ // throw new Error("Invalid color format");
179
+ // }
180
+ // rgba.a = opacity;
181
+ // if (type === "hex") {
182
+ // return Colors.rgb.to_hex(rgba.r, rgba.g, rgba.b, rgba.a);
183
+ // } else {
184
+ // return Colors.rgb.to_str(rgba.r, rgba.g, rgba.b, rgba.a);
185
+ // }
186
+ // }
187
+ // // Initialize a color wrapper.
188
+ // function init_rgb(color: string): RGBAObject {
189
+ // if (color.startsWith("#")) {
190
+ // return Colors.hex.to_rgb(color);
191
+ // } else if (color.startsWith("rgb")) {
192
+ // return Colors.rgb.to_obj(color);
193
+ // } else {
194
+ // throw new Error(`Invalid input color "${color}", only hex and rgb(a) colors are supported.`);
195
+ // }
196
+ // }
197
+ // // Darken the color by interpolating toward black (#000000)
198
+ // export function darken(color: Color /*| RGBArray*/, percent: number = 0.5) {
199
+ // if (typeof percent !== "number" || percent < 0 || percent > 1) {
200
+ // throw new Error("Invalid percentage [0...1]: " + percent + ".");
201
+ // }
202
+ // // Convert input to RGB object
203
+ // const rgb = init_rgb(color);
204
+ // // const rgb = typeof color === 'string' ? Colors.hex.to_rgb(color) as RGBAObject : {
205
+ // // r: color[0],
206
+ // // g: color[1],
207
+ // // b: color[2],
208
+ // // a: color.length > 3 ? color[3] : 1
209
+ // // };
210
+ // // Interpolate toward black (0,0,0)
211
+ // const darkened = {
212
+ // r: Math.round(rgb.r * (1 - percent)),
213
+ // g: Math.round(rgb.g * (1 - percent)),
214
+ // b: Math.round(rgb.b * (1 - percent)),
215
+ // a: rgb.a
216
+ // };
217
+ // // Return in same format as input
218
+ // // if (typeof color === 'string') {
219
+ // return Colors.rgb.to_str(darkened.r, darkened.g, darkened.b, darkened.a);
220
+ // // } else {
221
+ // // return color.length > 3
222
+ // // ? [darkened.r, darkened.g, darkened.b, darkened.a]
223
+ // // : [darkened.r, darkened.g, darkened.b];
224
+ // // }
225
+ // }
226
+ // // Lighten the color by interpolating toward white (#FFFFFF)
227
+ // export function lighten(color: Color /*| RGBArray*/, percent: number = 0.5) {
228
+ // if (typeof percent !== "number" || percent < 0 || percent > 1) {
229
+ // throw new Error("Invalid percentage [0...1]: " + percent + ".");
230
+ // }
231
+ // // Convert input to RGB object
232
+ // const rgb = init_rgb(color);
233
+ // // const rgb = typeof color === 'string' ? Colors.hex.to_rgb(color) as RGBA : {
234
+ // // r: color[0],
235
+ // // g: color[1],
236
+ // // b: color[2],
237
+ // // a: color.length > 3 ? color[3] : 1
238
+ // // };
239
+ // // Interpolate toward white (255,255,255)
240
+ // const lightened = {
241
+ // r: Math.round(rgb.r + (255 - rgb.r) * percent),
242
+ // g: Math.round(rgb.g + (255 - rgb.g) * percent),
243
+ // b: Math.round(rgb.b + (255 - rgb.b) * percent),
244
+ // a: rgb.a
245
+ // };
246
+ // // Return in same format as input
247
+ // // if (typeof color === 'string') {
248
+ // return Colors.rgb.to_str(lightened.r, lightened.g, lightened.b, lightened.a);
249
+ // // } else {
250
+ // // return color.length > 3
251
+ // // ? [lightened.r, lightened.g, lightened.b, lightened.a]
252
+ // // : [lightened.r, lightened.g, lightened.b];
253
+ // // }
254
+ // }
255
+ // // Interpolate.
256
+ // export function interpolate(start: Color /*| RGBArray*/, end: Color /*| RGBArray*/, percent: number = 0.5, alpha: number = 1.0) {
257
+ // if (typeof percent !== "number" || percent < 0 || percent > 1) {
258
+ // throw new Error("Invalid percentage [0...1]: " + percent + ".");
259
+ // }
260
+ // if (typeof alpha !== "number" || alpha < 0 || alpha > 1) {
261
+ // throw new Error("Invalid alpha [0...1]: " + alpha + ".");
262
+ // }
263
+ // return new ColorRangeClass(start, end).interpolate(percent, alpha)
264
+ // }
265
+ // // Determine the opposite (contrasting) color.
266
+ // // Returns black (#000000) if the input color is bright, or white (#ffffff) if it is dark.
267
+ // export function opposite(color: Color): "#000000" | "#ffffff" {
268
+ // let brightness: number;
269
+ // if (color.startsWith("#")) {
270
+ // brightness = Colors.hex.get_brightness(color);
271
+ // } else if (color.startsWith("rgb")) {
272
+ // const rgba = Colors.rgb.to_obj(color);
273
+ // brightness = (0.299 * rgba.r + 0.587 * rgba.g + 0.114 * rgba.b) / 255;
274
+ // } else {
275
+ // throw new Error("Invalid color format for opposite color");
276
+ // }
277
+ // // Return black for bright colors, white for dark colors.
278
+ // return brightness > 0.5 ? "#000000" : "#ffffff";
279
+ // }
280
+ // export function opposite_func(color: Color): typeof lighten | typeof darken {
281
+ // return opposite(color) === "#000000" ? darken : lighten;
282
+ // }
283
+ // };
284
+ // import { Elements } from "../elements/module.js"
285
+ // /* @docs:
286
+ // @nav: Frontend
287
+ // @chapter: Styling
288
+ // @title: Color range
289
+ // @description: Used to create a range between two different colors. Can be initialized using alias function `ColorRange`.
290
+ // @param:
291
+ // @name: start
292
+ // @descr: The start color (lightest). May either be a HEX string or an rgb(a) array.
293
+ // @type: string, array
294
+ // @param:
295
+ // @name: end
296
+ // @descr: The end color (darkest). May either be a HEX string or an rgb(a) array.
297
+ // @type: string, array
298
+ // */
299
+ // export class ColorRangeClass {
300
+ // public start: Colors.RGBAObject;
301
+ // public end: Colors.RGBAObject;
302
+ // constructor(start: Colors.Color | Colors.RGBArray, end: Colors.Color | Colors.RGBArray) {
303
+ // if (Array.isArray(start)) {
304
+ // this.start = this.array_to_rgba(start);
305
+ // } else if (typeof start === "string") {
306
+ // this.start = Colors.hex.to_rgb(start);
307
+ // } else {
308
+ // throw new Error(`Invalid type "${typeof start}" for parameter "start", the valid types are "string" or "array".`);
309
+ // }
310
+ // if (Array.isArray(end)) {
311
+ // this.end = this.array_to_rgba(end);
312
+ // } else if (typeof end === "string") {
313
+ // this.end = Colors.hex.to_rgb(end) as Colors.RGBAObject;
314
+ // } else {
315
+ // throw new Error(`Invalid type "${typeof end}" for parameter "end", the valid types are "string" or "array".`);
316
+ // }
317
+ // }
318
+ // // Array to rgba.
319
+ // array_to_rgba(array: Colors.RGBArray): Colors.RGBAObject {
320
+ // return {
321
+ // r: isNaN(array[0]) ? 0 : array[0],
322
+ // g: isNaN(array[1]) ? 0 : array[1],
323
+ // b: isNaN(array[2]) ? 0 : array[2],
324
+ // a: array.length < 4 ? 1.0 : isNaN(array[3]) ? 1.0 : array[3],
325
+ // }
326
+ // }
327
+ // /* @docs:
328
+ // @title: Interpolate
329
+ // @description: Interpolate between the start and end colors. When `percent` is 0 it will return the `start` color and when percent is `1` it will return the end color without computations.
330
+ // @param:
331
+ // @name: percent
332
+ // @descr: The percentage to interpolate from start to end, the valid range is `0.0` till `1.0`.
333
+ // @type: number
334
+ // @param:
335
+ // @name: alpha
336
+ // @descr: The alpha channel, the valid range is `0.0` till `1.0`.
337
+ // @type: number
338
+ // @default: 1
339
+ // */
340
+ // interpolate(percent: number = 0.5, alpha: number = 1.0): Colors.Color {
341
+ // // Validate inputs
342
+ // percent = Math.max(0, Math.min(1, percent)); // Clamp percent between 0 and 1
343
+ // alpha = Math.max(0, Math.min(1, alpha)); // Clamp alpha between 0 and 1
344
+ // // Handle edge cases
345
+ // if (percent <= 0) {
346
+ // return Colors.rgb.to_str(
347
+ // this.start.r,
348
+ // this.start.g,
349
+ // this.start.b,
350
+ // this.start.a,
351
+ // );
352
+ // } else if (percent >= 1) {
353
+ // console.log("END:", this.end)
354
+ // return Colors.rgb.to_str(
355
+ // this.end.r,
356
+ // this.end.g,
357
+ // this.end.b,
358
+ // this.end.a,
359
+ // );
360
+ // }
361
+ // // Ensure all RGB values are valid numbers (default to 0 if invalid)
362
+ // const startR = isNaN(this.start.r) ? 0 : this.start.r;
363
+ // const startG = isNaN(this.start.g) ? 0 : this.start.g;
364
+ // const startB = isNaN(this.start.b) ? 0 : this.start.b;
365
+ // const endR = isNaN(this.end.r) ? 0 : this.end.r;
366
+ // const endG = isNaN(this.end.g) ? 0 : this.end.g;
367
+ // const endB = isNaN(this.end.b) ? 0 : this.end.b;
368
+ // // Perform interpolation with validated values
369
+ // return Colors.rgba.to_str(
370
+ // Math.round(startR + (endR - startR) * percent),
371
+ // Math.round(startG + (endG - startG) * percent),
372
+ // Math.round(startB + (endB - startB) * percent),
373
+ // alpha,
374
+ // );
375
+ // }
376
+ // // interpolate(percent: number = 0.5, alpha: number = 1.0): Hex {
377
+ // // if (percent <= 0) {
378
+ // // return Colors.rgb.to_str(
379
+ // // this.start.r,
380
+ // // this.start.g,
381
+ // // this.start.b,
382
+ // // this.start.a,
383
+ // // )
384
+ // // } else if (percent >= 1) {
385
+ // // return Colors.rgb.to_str(
386
+ // // this.end.r,
387
+ // // this.end.g,
388
+ // // this.end.b,
389
+ // // this.end.a,
390
+ // // )
391
+ // // }
392
+ // // return Colors.rgba.to_str(
393
+ // // Math.round(this.start.r + (this.end.r - this.start.r) * percent),
394
+ // // Math.round(this.start.g + (this.end.g - this.start.g) * percent),
395
+ // // Math.round(this.start.b + (this.end.b - this.start.b) * percent),
396
+ // // alpha,
397
+ // // )
398
+ // // }
399
+ // // RGBA to hex.
400
+ // // rgb_to_hex(r, g, b, a = 1) {
401
+ // // const hex = [r, g, b].map(x => {
402
+ // // const hex = x.toString(16);
403
+ // // return hex.length === 1 ? '0' + hex : hex;
404
+ // // })
405
+ // // if (a != null && a < 1) {
406
+ // // let a = a / 100;
407
+ // // if (a < 10) {
408
+ // // hex.push("0" + a.toString())
409
+ // // } else {
410
+ // // hex.push(a.toString())
411
+ // // }
412
+ // // }
413
+ // // return '#' + hex.join('');
414
+ // // }
415
+ // }
416
+ // export const ColorRange = Elements.wrapper(ColorRangeClass);
417
+ // export const NullColorRange = Elements.create_null(ColorRangeClass);