@vandenberghinc/volt 1.1.4 → 1.1.6

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 (290) hide show
  1. package/backend/dist/cjs/database.d.ts +41 -68
  2. package/backend/dist/cjs/database.js +136 -78
  3. package/backend/dist/cjs/endpoint.d.ts +23 -9
  4. package/backend/dist/cjs/endpoint.js +98 -21
  5. package/backend/dist/cjs/file_watcher.js +2 -2
  6. package/backend/dist/cjs/frontend.d.ts +0 -2
  7. package/backend/dist/cjs/frontend.js +9 -9
  8. package/backend/dist/cjs/image_endpoint.d.ts +3 -1
  9. package/backend/dist/cjs/image_endpoint.js +2 -1
  10. package/backend/dist/cjs/payments/paddle.js +10 -2
  11. package/backend/dist/cjs/plugins/css.d.ts +6 -5
  12. package/backend/dist/cjs/plugins/css.js +32 -7
  13. package/backend/dist/cjs/plugins/ts/compiler.d.ts +6 -1
  14. package/backend/dist/cjs/plugins/ts/compiler.js +26 -2
  15. package/backend/dist/cjs/plugins/ts/preprocessing.js +5 -3
  16. package/backend/dist/cjs/server.d.ts +7 -13
  17. package/backend/dist/cjs/server.js +184 -303
  18. package/backend/dist/cjs/status.d.ts +1 -0
  19. package/backend/dist/cjs/status.js +2 -1
  20. package/backend/dist/cjs/stream.d.ts +5 -3
  21. package/backend/dist/cjs/stream.js +13 -4
  22. package/backend/dist/cjs/users.d.ts +1 -1
  23. package/backend/dist/cjs/users.js +87 -72
  24. package/backend/dist/cjs/utils.d.ts +17 -9
  25. package/backend/dist/cjs/utils.js +22 -64
  26. package/backend/dist/cjs/view.d.ts +2 -2
  27. package/backend/dist/cjs/view.js +38 -40
  28. package/backend/dist/cjs/volt.d.ts +3 -2
  29. package/backend/dist/cjs/volt.js +2 -2
  30. package/backend/dist/css/volt.css +5 -0
  31. package/backend/dist/esm/database.d.ts +41 -68
  32. package/backend/dist/esm/database.js +137 -79
  33. package/backend/dist/esm/endpoint.d.ts +23 -9
  34. package/backend/dist/esm/endpoint.js +99 -22
  35. package/backend/dist/esm/file_watcher.js +2 -2
  36. package/backend/dist/esm/frontend.d.ts +0 -2
  37. package/backend/dist/esm/frontend.js +9 -9
  38. package/backend/dist/esm/image_endpoint.d.ts +3 -1
  39. package/backend/dist/esm/image_endpoint.js +2 -1
  40. package/backend/dist/esm/payments/paddle.js +11 -3
  41. package/backend/dist/esm/plugins/css.d.ts +6 -5
  42. package/backend/dist/esm/plugins/css.js +32 -6
  43. package/backend/dist/esm/plugins/ts/compiler.d.ts +6 -1
  44. package/backend/dist/esm/plugins/ts/compiler.js +26 -2
  45. package/backend/dist/esm/plugins/ts/preprocessing.js +5 -3
  46. package/backend/dist/esm/server.d.ts +7 -13
  47. package/backend/dist/esm/server.js +182 -301
  48. package/backend/dist/esm/status.d.ts +1 -0
  49. package/backend/dist/esm/status.js +1 -0
  50. package/backend/dist/esm/stream.d.ts +5 -3
  51. package/backend/dist/esm/stream.js +13 -4
  52. package/backend/dist/esm/users.d.ts +1 -1
  53. package/backend/dist/esm/users.js +87 -72
  54. package/backend/dist/esm/utils.d.ts +17 -9
  55. package/backend/dist/esm/utils.js +21 -62
  56. package/backend/dist/esm/view.d.ts +2 -2
  57. package/backend/dist/esm/view.js +38 -40
  58. package/backend/dist/esm/volt.d.ts +3 -2
  59. package/backend/dist/esm/volt.js +2 -1
  60. package/backend/dist/esm-dev/blacklist.js +1 -1
  61. package/backend/dist/esm-dev/cli.js +2 -2
  62. package/backend/dist/esm-dev/database.d.ts +41 -68
  63. package/backend/dist/esm-dev/database.js +138 -80
  64. package/backend/dist/esm-dev/endpoint.d.ts +23 -9
  65. package/backend/dist/esm-dev/endpoint.js +100 -23
  66. package/backend/dist/esm-dev/file_watcher.js +3 -3
  67. package/backend/dist/esm-dev/frontend.d.ts +0 -2
  68. package/backend/dist/esm-dev/frontend.js +9 -9
  69. package/backend/dist/esm-dev/image_endpoint.d.ts +3 -1
  70. package/backend/dist/esm-dev/image_endpoint.js +2 -1
  71. package/backend/dist/esm-dev/logger.js +1 -1
  72. package/backend/dist/esm-dev/payments/paddle.js +12 -4
  73. package/backend/dist/esm-dev/plugins/css.d.ts +6 -5
  74. package/backend/dist/esm-dev/plugins/css.js +33 -7
  75. package/backend/dist/esm-dev/plugins/ts/compiler.d.ts +6 -1
  76. package/backend/dist/esm-dev/plugins/ts/compiler.js +27 -3
  77. package/backend/dist/esm-dev/plugins/ts/preprocessing.js +7 -5
  78. package/backend/dist/esm-dev/rate_limit.js +1 -1
  79. package/backend/dist/esm-dev/server.d.ts +7 -13
  80. package/backend/dist/esm-dev/server.js +184 -303
  81. package/backend/dist/esm-dev/status.d.ts +1 -0
  82. package/backend/dist/esm-dev/status.js +1 -0
  83. package/backend/dist/esm-dev/stream.d.ts +5 -3
  84. package/backend/dist/esm-dev/stream.js +13 -4
  85. package/backend/dist/esm-dev/users.d.ts +1 -1
  86. package/backend/dist/esm-dev/users.js +88 -73
  87. package/backend/dist/esm-dev/utils.d.ts +17 -9
  88. package/backend/dist/esm-dev/utils.js +22 -63
  89. package/backend/dist/esm-dev/view.d.ts +2 -2
  90. package/backend/dist/esm-dev/view.js +39 -41
  91. package/backend/dist/esm-dev/volt.d.ts +3 -2
  92. package/backend/dist/esm-dev/volt.js +2 -1
  93. package/backend/src/database.ts +173 -155
  94. package/backend/src/endpoint.ts +123 -31
  95. package/backend/src/file_watcher.ts +2 -2
  96. package/backend/src/frontend.ts +9 -8
  97. package/backend/src/image_endpoint.ts +4 -0
  98. package/backend/src/payments/paddle.ts +11 -3
  99. package/backend/src/plugins/css.ts +36 -8
  100. package/backend/src/plugins/ts/compiler.ts +37 -1
  101. package/backend/src/plugins/ts/preprocessing.ts +5 -3
  102. package/backend/src/server.ts +167 -306
  103. package/backend/src/status.ts +1 -0
  104. package/backend/src/stream.ts +28 -8
  105. package/backend/src/users.ts +87 -72
  106. package/backend/src/utils.ts +58 -25
  107. package/backend/src/view.ts +30 -28
  108. package/backend/src/{volt.js → volt.ts} +2 -1
  109. package/backend/tsconfig.cjs.json +3 -3
  110. package/backend/tsconfig.esm.json +3 -3
  111. package/frontend/dist/elements/base.d.ts +414 -432
  112. package/frontend/dist/elements/base.js +566 -329
  113. package/frontend/dist/elements/module.d.ts +26 -12
  114. package/frontend/dist/elements/module.js +69 -32
  115. package/frontend/dist/elements/register_element.d.ts +3 -0
  116. package/frontend/dist/elements/register_element.js +22 -0
  117. package/frontend/dist/modules/auth.d.ts +1 -0
  118. package/frontend/dist/modules/auth.js +6 -5
  119. package/frontend/dist/modules/color.d.ts +159 -0
  120. package/frontend/dist/modules/color.js +315 -0
  121. package/frontend/dist/modules/colors.d.ts +1 -26
  122. package/frontend/dist/modules/colors.js +417 -340
  123. package/frontend/dist/modules/cookies.d.ts +1 -0
  124. package/frontend/dist/modules/cookies.js +1 -0
  125. package/frontend/dist/modules/events.d.ts +1 -0
  126. package/frontend/dist/modules/events.js +1 -0
  127. package/frontend/dist/modules/google.d.ts +1 -0
  128. package/frontend/dist/modules/google.js +1 -0
  129. package/frontend/dist/modules/meta.d.ts +1 -0
  130. package/frontend/dist/modules/meta.js +1 -0
  131. package/frontend/dist/modules/mutex.d.ts +1 -2
  132. package/frontend/dist/modules/mutex.js +3 -4
  133. package/frontend/dist/modules/paddle.d.ts +1 -0
  134. package/frontend/dist/modules/paddle.js +14 -13
  135. package/frontend/dist/modules/scheme.d.ts +1 -0
  136. package/frontend/dist/modules/scheme.js +5 -3
  137. package/frontend/dist/modules/statics.d.ts +1 -0
  138. package/frontend/dist/modules/statics.js +1 -0
  139. package/frontend/dist/modules/support.d.ts +1 -0
  140. package/frontend/dist/modules/support.js +3 -2
  141. package/frontend/dist/modules/theme.d.ts +56 -0
  142. package/frontend/dist/{ui → modules}/theme.js +186 -75
  143. package/frontend/dist/modules/themes.d.ts +1 -1
  144. package/frontend/dist/modules/themes.js +1 -0
  145. package/frontend/dist/modules/user.d.ts +1 -0
  146. package/frontend/dist/modules/user.js +11 -10
  147. package/frontend/dist/modules/utils.d.ts +23 -2
  148. package/frontend/dist/modules/utils.js +93 -1
  149. package/frontend/dist/types/gradient.js +4 -0
  150. package/frontend/dist/ui/border_button.d.ts +0 -25
  151. package/frontend/dist/ui/border_button.js +50 -51
  152. package/frontend/dist/ui/button.d.ts +0 -21
  153. package/frontend/dist/ui/button.js +41 -46
  154. package/frontend/dist/ui/canvas.js +15 -15
  155. package/frontend/dist/ui/checkbox.d.ts +3 -17
  156. package/frontend/dist/ui/checkbox.js +36 -30
  157. package/frontend/dist/ui/code.d.ts +15 -82
  158. package/frontend/dist/ui/code.js +150 -125
  159. package/frontend/dist/ui/color.d.ts +0 -1
  160. package/frontend/dist/ui/color.js +1 -1
  161. package/frontend/dist/ui/context_menu.d.ts +4 -2
  162. package/frontend/dist/ui/context_menu.js +16 -17
  163. package/frontend/dist/ui/css.js +2 -0
  164. package/frontend/dist/ui/divider.d.ts +0 -7
  165. package/frontend/dist/ui/divider.js +21 -25
  166. package/frontend/dist/ui/dropdown.d.ts +13 -7
  167. package/frontend/dist/ui/dropdown.js +65 -30
  168. package/frontend/dist/ui/for_each.d.ts +0 -5
  169. package/frontend/dist/ui/for_each.js +17 -22
  170. package/frontend/dist/ui/form.d.ts +17 -12
  171. package/frontend/dist/ui/form.js +21 -18
  172. package/frontend/dist/ui/frame_modes.d.ts +9 -12
  173. package/frontend/dist/ui/frame_modes.js +8 -10
  174. package/frontend/dist/ui/google_map.d.ts +0 -11
  175. package/frontend/dist/ui/google_map.js +23 -28
  176. package/frontend/dist/ui/gradient.d.ts +0 -5
  177. package/frontend/dist/ui/gradient.js +17 -22
  178. package/frontend/dist/ui/image.d.ts +27 -58
  179. package/frontend/dist/ui/image.js +99 -93
  180. package/frontend/dist/ui/input.d.ts +20 -97
  181. package/frontend/dist/ui/input.js +192 -170
  182. package/frontend/dist/ui/link.d.ts +0 -18
  183. package/frontend/dist/ui/link.js +42 -48
  184. package/frontend/dist/ui/list.js +36 -37
  185. package/frontend/dist/ui/loader_button.d.ts +4 -19
  186. package/frontend/dist/ui/loader_button.js +35 -37
  187. package/frontend/dist/ui/loaders.d.ts +0 -8
  188. package/frontend/dist/ui/loaders.js +20 -25
  189. package/frontend/dist/ui/popup.d.ts +11 -8
  190. package/frontend/dist/ui/popup.js +183 -24
  191. package/frontend/dist/ui/pseudo.d.ts +3 -3
  192. package/frontend/dist/ui/pseudo.js +14 -17
  193. package/frontend/dist/ui/scroller.d.ts +10 -48
  194. package/frontend/dist/ui/scroller.js +306 -300
  195. package/frontend/dist/ui/slider.d.ts +9 -3
  196. package/frontend/dist/ui/slider.js +31 -17
  197. package/frontend/dist/ui/spacer.d.ts +0 -9
  198. package/frontend/dist/ui/spacer.js +21 -26
  199. package/frontend/dist/ui/span.js +13 -15
  200. package/frontend/dist/ui/stack.d.ts +14 -75
  201. package/frontend/dist/ui/stack.js +166 -169
  202. package/frontend/dist/ui/steps.d.ts +10 -23
  203. package/frontend/dist/ui/steps.js +47 -34
  204. package/frontend/dist/ui/style.d.ts +4 -3
  205. package/frontend/dist/ui/style.js +13 -18
  206. package/frontend/dist/ui/switch.d.ts +10 -4
  207. package/frontend/dist/ui/switch.js +24 -16
  208. package/frontend/dist/ui/table.d.ts +0 -23
  209. package/frontend/dist/ui/table.js +113 -119
  210. package/frontend/dist/ui/tabs.d.ts +3 -19
  211. package/frontend/dist/ui/tabs.js +35 -29
  212. package/frontend/dist/ui/text.d.ts +0 -8
  213. package/frontend/dist/ui/text.js +20 -25
  214. package/frontend/dist/ui/title.d.ts +0 -15
  215. package/frontend/dist/ui/title.js +39 -45
  216. package/frontend/dist/ui/ui.d.ts +0 -2
  217. package/frontend/dist/ui/ui.js +0 -2
  218. package/frontend/dist/ui/view.d.ts +3 -17
  219. package/frontend/dist/ui/view.js +27 -32
  220. package/frontend/dist/volt.d.ts +2 -1
  221. package/frontend/dist/volt.js +3 -1
  222. package/frontend/examples/dashboard/dashboard.ts +774 -0
  223. package/frontend/examples/theme/theme.ts +58 -0
  224. package/frontend/src/css/volt.css +5 -0
  225. package/frontend/src/elements/base.ts +767 -545
  226. package/frontend/src/elements/module.ts +90 -29
  227. package/frontend/src/elements/register_element.ts +24 -0
  228. package/frontend/src/modules/auth.ts +7 -6
  229. package/frontend/src/modules/color.ts +348 -0
  230. package/frontend/src/modules/colors.ts +468 -449
  231. package/frontend/src/modules/cookies.ts +1 -0
  232. package/frontend/src/modules/events.ts +1 -0
  233. package/frontend/src/modules/google.ts +1 -0
  234. package/frontend/src/modules/meta.ts +2 -1
  235. package/frontend/src/modules/mutex.ts +2 -4
  236. package/frontend/src/modules/paddle.ts +21 -20
  237. package/frontend/src/modules/scheme.ts +5 -4
  238. package/frontend/src/modules/statics.ts +2 -1
  239. package/frontend/src/modules/support.ts +3 -2
  240. package/frontend/src/modules/theme.ts +413 -0
  241. package/frontend/src/modules/themes.ts +2 -1
  242. package/frontend/src/modules/user.ts +12 -11
  243. package/frontend/src/modules/utils.ts +125 -2
  244. package/frontend/src/ui/border_button.ts +41 -37
  245. package/frontend/src/ui/button.ts +33 -32
  246. package/frontend/src/ui/canvas.ts +5 -2
  247. package/frontend/src/ui/checkbox.ts +21 -22
  248. package/frontend/src/ui/code.ts +92 -86
  249. package/frontend/src/ui/context_menu.ts +7 -5
  250. package/frontend/src/ui/css.ts +1 -1
  251. package/frontend/src/ui/divider.ts +15 -10
  252. package/frontend/src/ui/dropdown.ts +38 -21
  253. package/frontend/src/ui/for_each.ts +9 -8
  254. package/frontend/src/ui/form.ts +26 -21
  255. package/frontend/src/ui/frame_modes.ts +13 -17
  256. package/frontend/src/ui/google_map.ts +15 -13
  257. package/frontend/src/ui/gradient.ts +9 -8
  258. package/frontend/src/ui/image.ts +108 -86
  259. package/frontend/src/ui/input.ts +145 -144
  260. package/frontend/src/ui/link.ts +25 -23
  261. package/frontend/src/ui/list.ts +12 -6
  262. package/frontend/src/ui/loader_button.ts +26 -25
  263. package/frontend/src/ui/loaders.ts +12 -11
  264. package/frontend/src/ui/popup.ts +168 -14
  265. package/frontend/src/ui/pseudo.ts +5 -3
  266. package/frontend/src/ui/scroller.ts +303 -294
  267. package/frontend/src/ui/slider.ts +15 -10
  268. package/frontend/src/ui/spacer.ts +14 -11
  269. package/frontend/src/ui/span.ts +6 -2
  270. package/frontend/src/ui/stack.ts +196 -183
  271. package/frontend/src/ui/steps.ts +38 -22
  272. package/frontend/src/ui/style.ts +7 -4
  273. package/frontend/src/ui/switch.ts +16 -11
  274. package/frontend/src/ui/table.ts +42 -34
  275. package/frontend/src/ui/tabs.ts +20 -19
  276. package/frontend/src/ui/text.ts +12 -11
  277. package/frontend/src/ui/title.ts +22 -20
  278. package/frontend/src/ui/ui.ts +0 -2
  279. package/frontend/src/ui/view.ts +20 -19
  280. package/frontend/src/volt.ts +3 -1
  281. package/frontend/{compile.js → tools/compile.old.js} +2 -2
  282. package/frontend/tools/embed_scripts.js +69 -0
  283. package/frontend/tsconfig.json +26 -0
  284. package/package.json +7 -6
  285. package/frontend/dist/ui/theme.d.ts +0 -25
  286. package/frontend/exports.json +0 -1340
  287. package/frontend/src/modules/date.js +0 -535
  288. package/frontend/src/ui/color.ts +0 -117
  289. package/frontend/src/ui/theme.ts +0 -279
  290. /package/backend/src/{vinc.dev.js → vinc.dev.ts} +0 -0
@@ -1,340 +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
- }
207
- else {
208
- return color.length > 3
209
- ? [darkened.r, darkened.g, darkened.b, darkened.a]
210
- : [darkened.r, darkened.g, darkened.b];
211
- }
212
- },
213
- // Lighten the color by interpolating toward white (#FFFFFF)
214
- lighten(color, percent = 0.5) {
215
- if (typeof percent !== "number" || percent < 0 || percent > 1) {
216
- throw new Error("Invalid percentage [0...1]: " + percent + ".");
217
- }
218
- // Convert input to RGB object
219
- const rgb = typeof color === 'string' ? this.hex.to_rgb(color) : {
220
- r: color[0],
221
- g: color[1],
222
- b: color[2],
223
- a: color.length > 3 ? color[3] : 1
224
- };
225
- // Interpolate toward white (255,255,255)
226
- const lightened = {
227
- r: Math.round(rgb.r + (255 - rgb.r) * percent),
228
- g: Math.round(rgb.g + (255 - rgb.g) * percent),
229
- b: Math.round(rgb.b + (255 - rgb.b) * percent),
230
- a: rgb.a
231
- };
232
- // Return in same format as input
233
- if (typeof color === 'string') {
234
- return this.rgb.to_str(lightened.r, lightened.g, lightened.b, lightened.a);
235
- }
236
- else {
237
- return color.length > 3
238
- ? [lightened.r, lightened.g, lightened.b, lightened.a]
239
- : [lightened.r, lightened.g, lightened.b];
240
- }
241
- },
242
- // Interpolate.
243
- interpolate(start, end, percent = 0.5, alpha = 1.0) {
244
- if (typeof percent !== "number" || percent < 0 || percent > 1) {
245
- throw new Error("Invalid percentage [0...1]: " + percent + ".");
246
- }
247
- if (typeof alpha !== "number" || alpha < 0 || alpha > 1) {
248
- throw new Error("Invalid alpha [0...1]: " + alpha + ".");
249
- }
250
- return new ColorRangeClass(start, end).interpolate(percent, alpha);
251
- }
252
- };
253
- // Aliases
254
- Colors.hex.to_rgba = Colors.hex.to_rgb;
255
- Colors.rgba = Colors.rgb;
256
- // Export
257
- export { Colors };
258
- import { Elements } from "../elements/module.js";
259
- /* @docs:
260
- @nav: Frontend
261
- @chapter: Styling
262
- @title: Color range
263
- @description: Used to create a range between two different colors. Can be initialized using alias function `ColorRange`.
264
- @param:
265
- @name: start
266
- @descr: The start color (lightest). May either be a HEX string or an rgb(a) array.
267
- @type: string, array
268
- @param:
269
- @name: end
270
- @descr: The end color (darkest). May either be a HEX string or an rgb(a) array.
271
- @type: string, array
272
- */
273
- export class ColorRangeClass {
274
- constructor(start, end) {
275
- if (Array.isArray(start)) {
276
- this.start = this.array_to_rgba(start);
277
- }
278
- else if (typeof start === "string") {
279
- this.start = Colors.hex.to_rgb(start);
280
- }
281
- else {
282
- throw new Error(`Invalid type "${typeof start}" for parameter "start", the valid types are "string" or "array".`);
283
- }
284
- if (Array.isArray(end)) {
285
- this.end = this.array_to_rgba(end);
286
- }
287
- else if (typeof end === "string") {
288
- this.end = Colors.hex.to_rgb(end);
289
- }
290
- else {
291
- throw new Error(`Invalid type "${typeof end}" for parameter "end", the valid types are "string" or "array".`);
292
- }
293
- }
294
- // Array to rgba.
295
- array_to_rgba(array) {
296
- return {
297
- r: isNaN(array[0]) ? 0 : array[0],
298
- g: isNaN(array[1]) ? 0 : array[1],
299
- b: isNaN(array[2]) ? 0 : array[2],
300
- a: array.length < 4 ? 1.0 : isNaN(array[3]) ? 1.0 : array[3],
301
- };
302
- }
303
- /* @docs:
304
- @title: Interpolate
305
- @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.
306
- @param:
307
- @name: percent
308
- @descr: The percentage to interpolate from start to end, the valid range is `0.0` till `1.0`.
309
- @type: number
310
- @param:
311
- @name: alpha
312
- @descr: The alpha channel, the valid range is `0.0` till `1.0`.
313
- @type: number
314
- @default: 1
315
- */
316
- interpolate(percent = 0.5, alpha = 1.0) {
317
- // Validate inputs
318
- percent = Math.max(0, Math.min(1, percent)); // Clamp percent between 0 and 1
319
- alpha = Math.max(0, Math.min(1, alpha)); // Clamp alpha between 0 and 1
320
- // Handle edge cases
321
- if (percent <= 0) {
322
- return Colors.rgb.to_str(this.start.r, this.start.g, this.start.b, this.start.a);
323
- }
324
- else if (percent >= 1) {
325
- console.log("END:", this.end);
326
- return Colors.rgb.to_str(this.end.r, this.end.g, this.end.b, this.end.a);
327
- }
328
- // Ensure all RGB values are valid numbers (default to 0 if invalid)
329
- const startR = isNaN(this.start.r) ? 0 : this.start.r;
330
- const startG = isNaN(this.start.g) ? 0 : this.start.g;
331
- const startB = isNaN(this.start.b) ? 0 : this.start.b;
332
- const endR = isNaN(this.end.r) ? 0 : this.end.r;
333
- const endG = isNaN(this.end.g) ? 0 : this.end.g;
334
- const endB = isNaN(this.end.b) ? 0 : this.end.b;
335
- // Perform interpolation with validated values
336
- return Colors.rgba.to_str(Math.round(startR + (endR - startR) * percent), Math.round(startG + (endG - startG) * percent), Math.round(startB + (endB - startB) * percent), alpha);
337
- }
338
- }
339
- export const ColorRange = Elements.wrapper(ColorRangeClass);
340
- 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);