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