@vandenberghinc/volt 1.1.26 → 1.1.28

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 (502) hide show
  1. package/backend/dist/cjs/{blacklist.d.ts → backend/src/blacklist.d.ts} +5 -3
  2. package/backend/dist/cjs/{blacklist.js → backend/src/blacklist.js} +8 -5
  3. package/backend/dist/cjs/{cli.js → backend/src/cli.js} +29 -47
  4. package/backend/dist/cjs/backend/src/database/collection.d.ts +1543 -0
  5. package/backend/dist/cjs/backend/src/database/collection.js +3042 -0
  6. package/backend/dist/cjs/backend/src/database/database.d.ts +66 -0
  7. package/backend/dist/cjs/{database → backend/src/database}/database.js +48 -43
  8. package/backend/dist/cjs/backend/src/database/filters/filters.d.ts +6 -0
  9. package/backend/dist/cjs/backend/src/database/filters/filters.js +15 -0
  10. package/backend/dist/cjs/backend/src/database/filters/strict_filter.d.ts +223 -0
  11. package/backend/dist/cjs/backend/src/database/filters/strict_filter.js +15 -0
  12. package/backend/dist/cjs/backend/src/database/filters/strict_filter_test.js +443 -0
  13. package/backend/dist/cjs/backend/src/database/filters/strict_filter_test_v0.js +15 -0
  14. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v0.d.ts +50 -0
  15. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v0.js +15 -0
  16. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v1.d.ts +76 -0
  17. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v1.js +15 -0
  18. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v2.d.ts +75 -0
  19. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v2.js +15 -0
  20. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v3.d.ts +219 -0
  21. package/backend/dist/cjs/backend/src/database/filters/strict_filter_v3.js +15 -0
  22. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  23. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter.js +15 -0
  24. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter_test.d.ts +5 -0
  25. package/backend/dist/cjs/backend/src/database/filters/strict_update_filter_test.js +355 -0
  26. package/backend/dist/cjs/backend/src/database/flatten.d.ts +75 -0
  27. package/backend/dist/cjs/{logger.js → backend/src/database/flatten.js} +18 -7
  28. package/backend/dist/cjs/backend/src/database/flatten_test.js +175 -0
  29. package/backend/dist/cjs/backend/src/database/quota/quota.d.ts +461 -0
  30. package/backend/dist/cjs/backend/src/database/quota/quota.js +1014 -0
  31. package/backend/dist/cjs/backend/src/database/quota/quota_v1.d.ts +534 -0
  32. package/backend/dist/cjs/backend/src/database/quota/quota_v1.js +1087 -0
  33. package/backend/dist/cjs/backend/src/database/quota/safe_int.d.ts +293 -0
  34. package/backend/dist/cjs/backend/src/database/quota/safe_int.js +573 -0
  35. package/backend/dist/{esm → cjs/backend/src}/endpoint.d.ts +69 -46
  36. package/backend/dist/cjs/{endpoint.js → backend/src/endpoint.js} +87 -101
  37. package/backend/dist/cjs/backend/src/errors/index.d.ts +7 -0
  38. package/backend/dist/cjs/backend/src/errors/index.js +25 -0
  39. package/backend/dist/{esm/utils.d.ts → cjs/backend/src/errors/internal_external.d.ts} +14 -22
  40. package/backend/dist/cjs/backend/src/errors/internal_external.js +85 -0
  41. package/backend/dist/cjs/backend/src/errors/invalid_usage_error.d.ts +38 -0
  42. package/backend/dist/cjs/{mutex.js → backend/src/errors/invalid_usage_error.js} +20 -37
  43. package/backend/dist/cjs/backend/src/errors/system_error.d.ts +230 -0
  44. package/backend/dist/cjs/backend/src/errors/system_error.js +393 -0
  45. package/backend/dist/cjs/backend/src/events.d.ts +54 -0
  46. package/backend/dist/cjs/backend/src/events.js +15 -0
  47. package/backend/dist/cjs/{frontend.js → backend/src/frontend.js} +1 -1
  48. package/backend/dist/cjs/{image_endpoint.d.ts → backend/src/image_endpoint.d.ts} +16 -1
  49. package/backend/dist/cjs/{image_endpoint.js → backend/src/image_endpoint.js} +3 -5
  50. package/backend/dist/cjs/backend/src/logger.d.ts +5 -0
  51. package/backend/dist/cjs/backend/src/logger.js +15 -0
  52. package/backend/dist/cjs/backend/src/meta.d.ts +64 -0
  53. package/backend/dist/cjs/{meta.js → backend/src/meta.js} +9 -12
  54. package/backend/dist/cjs/backend/src/payments/paddle.d.ts +326 -0
  55. package/backend/dist/cjs/{payments → backend/src/payments}/paddle.js +377 -327
  56. package/backend/dist/cjs/backend/src/plugins/browser.d.ts +1 -0
  57. package/backend/dist/cjs/backend/src/plugins/browser.js +15 -0
  58. package/backend/dist/cjs/backend/src/plugins/mail/mail.d.ts +248 -0
  59. package/backend/dist/cjs/backend/src/plugins/mail/mail.js +379 -0
  60. package/backend/dist/{esm → cjs/backend/src}/plugins/mail/ui.d.ts +23 -0
  61. package/backend/dist/cjs/backend/src/plugins/pdf.d.ts +1 -0
  62. package/backend/dist/cjs/backend/src/rate_limit.d.ts +145 -0
  63. package/backend/dist/cjs/backend/src/rate_limit.js +549 -0
  64. package/backend/dist/cjs/{route.d.ts → backend/src/route.d.ts} +3 -10
  65. package/backend/dist/cjs/{route.js → backend/src/route.js} +23 -21
  66. package/backend/dist/cjs/backend/src/server.d.ts +485 -0
  67. package/backend/dist/cjs/{server.js → backend/src/server.js} +688 -873
  68. package/backend/dist/cjs/backend/src/splash_screen.d.ts +80 -0
  69. package/backend/dist/cjs/{splash_screen.js → backend/src/splash_screen.js} +24 -3
  70. package/backend/dist/cjs/backend/src/status.d.ts +74 -0
  71. package/backend/dist/cjs/{status.js → backend/src/status.js} +64 -64
  72. package/backend/dist/cjs/backend/src/stream.d.ts +376 -0
  73. package/backend/dist/cjs/{stream.js → backend/src/stream.js} +299 -276
  74. package/backend/dist/cjs/backend/src/users.d.ts +807 -0
  75. package/backend/dist/cjs/backend/src/users.js +1971 -0
  76. package/backend/dist/cjs/backend/src/utils.d.ts +16 -0
  77. package/backend/dist/cjs/{utils.js → backend/src/utils.js} +14 -77
  78. package/backend/dist/{esm → cjs/backend/src}/view.d.ts +33 -11
  79. package/backend/dist/cjs/backend/src/view.js +508 -0
  80. package/backend/dist/{esm → cjs/backend/src}/volt.d.ts +10 -1
  81. package/backend/dist/cjs/{volt.js → backend/src/volt.js} +8 -5
  82. package/backend/dist/cjs/frontend/src/modules/request.d.ts +70 -0
  83. package/backend/dist/cjs/frontend/src/modules/request.js +99 -0
  84. package/backend/dist/esm/{blacklist.d.ts → backend/src/blacklist.d.ts} +5 -3
  85. package/backend/dist/esm/{blacklist.js → backend/src/blacklist.js} +9 -6
  86. package/backend/dist/esm/{cli.js → backend/src/cli.js} +43 -60
  87. package/backend/dist/esm/backend/src/database/collection.d.ts +1543 -0
  88. package/backend/dist/esm/backend/src/database/collection.js +3510 -0
  89. package/backend/dist/esm/backend/src/database/database.d.ts +66 -0
  90. package/backend/dist/esm/{database → backend/src/database}/database.js +62 -103
  91. package/backend/dist/esm/backend/src/database/document.d.ts +1 -0
  92. package/backend/dist/esm/backend/src/database/document.js +558 -0
  93. package/backend/dist/esm/backend/src/database/filters/filters.d.ts +6 -0
  94. package/backend/dist/esm/backend/src/database/filters/filters.js +1 -0
  95. package/backend/dist/esm/backend/src/database/filters/strict_filter.d.ts +223 -0
  96. package/backend/dist/esm/backend/src/database/filters/strict_filter.js +3 -0
  97. package/backend/dist/esm/backend/src/database/filters/strict_filter_test.d.ts +1 -0
  98. package/backend/dist/esm/backend/src/database/filters/strict_filter_test.js +505 -0
  99. package/backend/dist/esm/backend/src/database/filters/strict_filter_test_v0.d.ts +1 -0
  100. package/backend/dist/esm/backend/src/database/filters/strict_filter_test_v0.js +712 -0
  101. package/backend/dist/esm/backend/src/database/filters/strict_filter_v0.d.ts +50 -0
  102. package/backend/dist/esm/backend/src/database/filters/strict_filter_v0.js +5 -0
  103. package/backend/dist/esm/backend/src/database/filters/strict_filter_v1.d.ts +76 -0
  104. package/backend/dist/esm/backend/src/database/filters/strict_filter_v1.js +44 -0
  105. package/backend/dist/esm/backend/src/database/filters/strict_filter_v2.d.ts +75 -0
  106. package/backend/dist/esm/backend/src/database/filters/strict_filter_v2.js +5 -0
  107. package/backend/dist/esm/backend/src/database/filters/strict_filter_v3.d.ts +219 -0
  108. package/backend/dist/esm/backend/src/database/filters/strict_filter_v3.js +1 -0
  109. package/backend/dist/esm/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  110. package/backend/dist/esm/backend/src/database/filters/strict_update_filter.js +5 -0
  111. package/backend/dist/esm/backend/src/database/filters/strict_update_filter_test.d.ts +5 -0
  112. package/backend/dist/esm/backend/src/database/filters/strict_update_filter_test.js +405 -0
  113. package/backend/dist/esm/backend/src/database/flatten.d.ts +75 -0
  114. package/backend/dist/esm/backend/src/database/flatten.js +22 -0
  115. package/backend/dist/esm/backend/src/database/flatten_test.d.ts +1 -0
  116. package/backend/dist/esm/backend/src/database/flatten_test.js +174 -0
  117. package/backend/dist/esm/backend/src/database/quota/quota.d.ts +461 -0
  118. package/backend/dist/esm/backend/src/database/quota/quota.js +1118 -0
  119. package/backend/dist/esm/backend/src/database/quota/quota_v1.d.ts +534 -0
  120. package/backend/dist/esm/backend/src/database/quota/quota_v1.js +1242 -0
  121. package/backend/dist/esm/backend/src/database/quota/safe_int.d.ts +293 -0
  122. package/backend/dist/esm/backend/src/database/quota/safe_int.js +602 -0
  123. package/backend/dist/{cjs → esm/backend/src}/endpoint.d.ts +69 -46
  124. package/backend/dist/esm/{endpoint.js → backend/src/endpoint.js} +136 -127
  125. package/backend/dist/esm/backend/src/errors/index.d.ts +7 -0
  126. package/backend/dist/esm/backend/src/errors/index.js +7 -0
  127. package/backend/dist/{cjs/utils.d.ts → esm/backend/src/errors/internal_external.d.ts} +14 -22
  128. package/backend/dist/esm/backend/src/errors/internal_external.js +70 -0
  129. package/backend/dist/esm/backend/src/errors/invalid_usage_error.d.ts +38 -0
  130. package/backend/dist/esm/backend/src/errors/invalid_usage_error.js +30 -0
  131. package/backend/dist/esm/backend/src/errors/system_error.d.ts +230 -0
  132. package/backend/dist/esm/backend/src/errors/system_error.js +402 -0
  133. package/backend/dist/esm/backend/src/events.d.ts +54 -0
  134. package/backend/dist/esm/backend/src/events.js +5 -0
  135. package/backend/dist/esm/{frontend.js → backend/src/frontend.js} +1 -1
  136. package/backend/dist/esm/{image_endpoint.d.ts → backend/src/image_endpoint.d.ts} +16 -1
  137. package/backend/dist/esm/{image_endpoint.js → backend/src/image_endpoint.js} +16 -20
  138. package/backend/dist/esm/backend/src/logger.d.ts +5 -0
  139. package/backend/dist/esm/backend/src/logger.js +8 -0
  140. package/backend/dist/esm/backend/src/meta.d.ts +64 -0
  141. package/backend/dist/esm/{meta.js → backend/src/meta.js} +15 -54
  142. package/backend/dist/esm/backend/src/payments/paddle.d.ts +326 -0
  143. package/backend/dist/esm/{payments → backend/src/payments}/paddle.js +417 -452
  144. package/backend/dist/esm/backend/src/plugins/browser.d.ts +1 -0
  145. package/backend/dist/esm/backend/src/plugins/browser.js +170 -0
  146. package/backend/dist/esm/backend/src/plugins/mail/mail.d.ts +248 -0
  147. package/backend/dist/esm/backend/src/plugins/mail/mail.js +389 -0
  148. package/backend/dist/{cjs → esm/backend/src}/plugins/mail/ui.d.ts +23 -0
  149. package/backend/dist/esm/{plugins → backend/src/plugins}/mail/ui.js +3 -6
  150. package/backend/dist/esm/backend/src/plugins/pdf.d.ts +1 -0
  151. package/backend/dist/esm/{plugins → backend/src/plugins}/pdf.js +3 -3
  152. package/backend/dist/esm/backend/src/rate_limit.d.ts +145 -0
  153. package/backend/dist/esm/backend/src/rate_limit.js +667 -0
  154. package/backend/dist/esm/{route.d.ts → backend/src/route.d.ts} +3 -10
  155. package/backend/dist/esm/{route.js → backend/src/route.js} +26 -21
  156. package/backend/dist/esm/backend/src/server.d.ts +485 -0
  157. package/backend/dist/esm/{server.js → backend/src/server.js} +891 -1441
  158. package/backend/dist/esm/backend/src/splash_screen.d.ts +80 -0
  159. package/backend/dist/esm/{splash_screen.js → backend/src/splash_screen.js} +42 -55
  160. package/backend/dist/esm/backend/src/status.d.ts +74 -0
  161. package/backend/dist/esm/backend/src/status.js +199 -0
  162. package/backend/dist/esm/backend/src/stream.d.ts +376 -0
  163. package/backend/dist/esm/{stream.js → backend/src/stream.js} +327 -292
  164. package/backend/dist/esm/backend/src/users.d.ts +809 -0
  165. package/backend/dist/esm/backend/src/users.js +2140 -0
  166. package/backend/dist/esm/backend/src/utils.d.ts +16 -0
  167. package/backend/dist/esm/{utils.js → backend/src/utils.js} +20 -81
  168. package/backend/dist/{cjs → esm/backend/src}/view.d.ts +33 -11
  169. package/backend/dist/esm/{view.js → backend/src/view.js} +266 -86
  170. package/backend/dist/{cjs → esm/backend/src}/volt.d.ts +10 -1
  171. package/backend/dist/esm/{volt.js → backend/src/volt.js} +7 -4
  172. package/backend/dist/esm/frontend/src/modules/request.d.ts +70 -0
  173. package/backend/dist/esm/frontend/src/modules/request.js +117 -0
  174. package/frontend/dist/backend/src/database/collection.d.ts +1543 -0
  175. package/frontend/dist/backend/src/database/collection.js +3510 -0
  176. package/frontend/dist/backend/src/database/database.d.ts +66 -0
  177. package/frontend/dist/backend/src/database/database.js +196 -0
  178. package/frontend/dist/backend/src/database/filters/filters.d.ts +6 -0
  179. package/frontend/dist/backend/src/database/filters/filters.js +1 -0
  180. package/frontend/dist/backend/src/database/filters/strict_filter.d.ts +223 -0
  181. package/frontend/dist/backend/src/database/filters/strict_filter.js +3 -0
  182. package/frontend/dist/backend/src/database/filters/strict_update_filter.d.ts +165 -0
  183. package/frontend/dist/backend/src/database/filters/strict_update_filter.js +5 -0
  184. package/frontend/dist/backend/src/database/flatten.d.ts +75 -0
  185. package/frontend/dist/backend/src/database/flatten.js +22 -0
  186. package/frontend/dist/backend/src/endpoint.d.ts +204 -0
  187. package/frontend/dist/backend/src/endpoint.js +570 -0
  188. package/frontend/dist/backend/src/errors/index.d.ts +7 -0
  189. package/frontend/dist/backend/src/errors/index.js +7 -0
  190. package/frontend/dist/backend/src/errors/internal_external.d.ts +38 -0
  191. package/frontend/dist/backend/src/errors/internal_external.js +70 -0
  192. package/frontend/dist/backend/src/errors/invalid_usage_error.d.ts +38 -0
  193. package/frontend/dist/backend/src/errors/invalid_usage_error.js +30 -0
  194. package/frontend/dist/backend/src/errors/system_error.d.ts +230 -0
  195. package/frontend/dist/backend/src/errors/system_error.js +402 -0
  196. package/frontend/dist/backend/src/events.d.ts +54 -0
  197. package/frontend/dist/backend/src/events.js +5 -0
  198. package/frontend/dist/backend/src/frontend.d.ts +11 -0
  199. package/frontend/dist/backend/src/frontend.js +12 -0
  200. package/frontend/dist/backend/src/image_endpoint.d.ts +39 -0
  201. package/frontend/dist/backend/src/image_endpoint.js +202 -0
  202. package/frontend/dist/backend/src/meta.d.ts +64 -0
  203. package/frontend/dist/backend/src/meta.js +110 -0
  204. package/frontend/dist/backend/src/payments/paddle.d.ts +326 -0
  205. package/frontend/dist/backend/src/payments/paddle.js +2256 -0
  206. package/frontend/dist/backend/src/plugins/mail/mail.d.ts +248 -0
  207. package/frontend/dist/backend/src/plugins/mail/mail.js +389 -0
  208. package/{backend/dist/esm/plugins/mail.d.ts → frontend/dist/backend/src/plugins/mail/ui.d.ts} +23 -0
  209. package/{backend/dist/esm/plugins/mail.js → frontend/dist/backend/src/plugins/mail/ui.js} +3 -6
  210. package/frontend/dist/backend/src/rate_limit.d.ts +145 -0
  211. package/frontend/dist/backend/src/rate_limit.js +673 -0
  212. package/frontend/dist/backend/src/route.d.ts +35 -0
  213. package/frontend/dist/backend/src/route.js +212 -0
  214. package/frontend/dist/backend/src/server.d.ts +485 -0
  215. package/frontend/dist/backend/src/server.js +2670 -0
  216. package/frontend/dist/backend/src/splash_screen.d.ts +80 -0
  217. package/frontend/dist/backend/src/splash_screen.js +135 -0
  218. package/frontend/dist/backend/src/status.d.ts +74 -0
  219. package/frontend/dist/backend/src/status.js +199 -0
  220. package/frontend/dist/backend/src/stream.d.ts +376 -0
  221. package/frontend/dist/backend/src/stream.js +1007 -0
  222. package/frontend/dist/backend/src/users.d.ts +807 -0
  223. package/frontend/dist/backend/src/users.js +2118 -0
  224. package/frontend/dist/backend/src/utils.d.ts +16 -0
  225. package/frontend/dist/backend/src/utils.js +241 -0
  226. package/frontend/dist/backend/src/view.d.ts +162 -0
  227. package/frontend/dist/backend/src/view.js +720 -0
  228. package/frontend/dist/frontend/src/elements/base.d.ts +4414 -0
  229. package/frontend/dist/{elements → frontend/src/elements}/base.js +3624 -260
  230. package/frontend/dist/frontend/src/elements/module.d.ts +95 -0
  231. package/frontend/dist/{elements → frontend/src/elements}/module.js +53 -52
  232. package/frontend/dist/frontend/src/elements/types.d.ts +52 -0
  233. package/frontend/dist/frontend/src/elements/types.js +5 -0
  234. package/frontend/dist/frontend/src/modules/attachment.d.ts +126 -0
  235. package/frontend/dist/frontend/src/modules/attachment.js +306 -0
  236. package/frontend/dist/frontend/src/modules/auth.d.ts +44 -0
  237. package/frontend/dist/frontend/src/modules/auth.js +80 -0
  238. package/frontend/dist/{modules → frontend/src/modules}/color.js +2 -2
  239. package/frontend/dist/frontend/src/modules/compression.d.ts +39 -0
  240. package/frontend/dist/frontend/src/modules/compression.js +102 -0
  241. package/frontend/dist/frontend/src/modules/cookies.d.ts +44 -0
  242. package/frontend/dist/frontend/src/modules/cookies.js +143 -0
  243. package/frontend/dist/frontend/src/modules/events.d.ts +31 -0
  244. package/frontend/dist/frontend/src/modules/events.js +74 -0
  245. package/frontend/dist/frontend/src/modules/google.d.ts +23 -0
  246. package/frontend/dist/frontend/src/modules/google.js +52 -0
  247. package/frontend/dist/frontend/src/modules/meta.d.ts +14 -0
  248. package/frontend/dist/{modules → frontend/src/modules}/meta.js +9 -7
  249. package/frontend/dist/{modules → frontend/src/modules}/paddle.d.ts +37 -134
  250. package/frontend/dist/{modules → frontend/src/modules}/paddle.js +620 -568
  251. package/frontend/dist/frontend/src/modules/request.d.ts +70 -0
  252. package/frontend/dist/frontend/src/modules/request.js +117 -0
  253. package/frontend/dist/frontend/src/modules/settings.d.ts +3 -0
  254. package/frontend/dist/frontend/src/modules/settings.js +5 -0
  255. package/frontend/dist/frontend/src/modules/statics.d.ts +21 -0
  256. package/frontend/dist/{modules → frontend/src/modules}/statics.js +15 -18
  257. package/frontend/dist/frontend/src/modules/support.d.ts +30 -0
  258. package/frontend/dist/frontend/src/modules/support.js +53 -0
  259. package/frontend/dist/{modules → frontend/src/modules}/theme.d.ts +67 -0
  260. package/frontend/dist/{modules → frontend/src/modules}/theme.js +68 -38
  261. package/frontend/dist/frontend/src/modules/themes.d.ts +12 -0
  262. package/frontend/dist/frontend/src/modules/themes.js +22 -0
  263. package/frontend/dist/frontend/src/modules/user.d.ts +164 -0
  264. package/frontend/dist/frontend/src/modules/user.js +268 -0
  265. package/frontend/dist/frontend/src/modules/utils.d.ts +176 -0
  266. package/frontend/dist/frontend/src/modules/utils.js +569 -0
  267. package/frontend/dist/frontend/src/types/gradient.d.ts +29 -0
  268. package/frontend/dist/{types → frontend/src/types}/gradient.js +14 -18
  269. package/frontend/dist/frontend/src/ui/border_button.d.ts +94 -0
  270. package/frontend/dist/{ui → frontend/src/ui}/border_button.js +7 -13
  271. package/frontend/dist/frontend/src/ui/button.d.ts +28 -0
  272. package/frontend/dist/{ui → frontend/src/ui}/button.js +21 -12
  273. package/frontend/dist/frontend/src/ui/canvas.d.ts +138 -0
  274. package/frontend/dist/{ui → frontend/src/ui}/canvas.js +88 -55
  275. package/frontend/dist/frontend/src/ui/checkbox.d.ts +74 -0
  276. package/frontend/dist/{ui → frontend/src/ui}/checkbox.js +80 -41
  277. package/frontend/dist/{ui → frontend/src/ui}/code.d.ts +73 -6
  278. package/frontend/dist/{ui → frontend/src/ui}/code.js +55 -52
  279. package/frontend/dist/{ui → frontend/src/ui}/context_menu.d.ts +4 -0
  280. package/frontend/dist/{ui → frontend/src/ui}/context_menu.js +12 -17
  281. package/frontend/dist/{ui → frontend/src/ui}/css.d.ts +4 -0
  282. package/frontend/dist/{ui → frontend/src/ui}/css.js +3 -3
  283. package/frontend/dist/{ui → frontend/src/ui}/divider.d.ts +4 -0
  284. package/frontend/dist/{ui → frontend/src/ui}/divider.js +3 -3
  285. package/frontend/dist/{ui → frontend/src/ui}/dropdown.d.ts +57 -2
  286. package/frontend/dist/{ui → frontend/src/ui}/dropdown.js +87 -94
  287. package/frontend/dist/{ui → frontend/src/ui}/for_each.d.ts +4 -0
  288. package/frontend/dist/{ui → frontend/src/ui}/for_each.js +3 -3
  289. package/frontend/dist/{ui → frontend/src/ui}/form.d.ts +6 -2
  290. package/frontend/dist/{ui → frontend/src/ui}/form.js +10 -7
  291. package/frontend/dist/frontend/src/ui/frame_modes.d.ts +37 -0
  292. package/frontend/dist/{ui → frontend/src/ui}/frame_modes.js +16 -22
  293. package/frontend/dist/{ui → frontend/src/ui}/google_map.d.ts +4 -0
  294. package/frontend/dist/{ui → frontend/src/ui}/google_map.js +4 -4
  295. package/frontend/dist/{ui → frontend/src/ui}/gradient.d.ts +4 -0
  296. package/frontend/dist/{ui → frontend/src/ui}/gradient.js +3 -3
  297. package/frontend/dist/{ui → frontend/src/ui}/image.d.ts +4 -0
  298. package/frontend/dist/{ui → frontend/src/ui}/image.js +5 -5
  299. package/frontend/dist/frontend/src/ui/input.d.ts +392 -0
  300. package/frontend/dist/{ui → frontend/src/ui}/input.js +346 -360
  301. package/frontend/dist/{ui → frontend/src/ui}/link.d.ts +4 -0
  302. package/frontend/dist/{ui → frontend/src/ui}/link.js +3 -3
  303. package/frontend/dist/{ui → frontend/src/ui}/list.d.ts +4 -0
  304. package/frontend/dist/{ui → frontend/src/ui}/list.js +12 -6
  305. package/frontend/dist/frontend/src/ui/loader_button.d.ts +80 -0
  306. package/frontend/dist/{ui → frontend/src/ui}/loader_button.js +35 -47
  307. package/frontend/dist/frontend/src/ui/loaders.d.ts +57 -0
  308. package/frontend/dist/{ui → frontend/src/ui}/loaders.js +11 -11
  309. package/frontend/dist/{ui → frontend/src/ui}/popup.d.ts +11 -6
  310. package/frontend/dist/{ui → frontend/src/ui}/popup.js +32 -18
  311. package/frontend/dist/frontend/src/ui/pseudo.d.ts +44 -0
  312. package/frontend/dist/{ui → frontend/src/ui}/pseudo.js +84 -8
  313. package/frontend/dist/{ui → frontend/src/ui}/scroller.d.ts +14 -2
  314. package/frontend/dist/{ui → frontend/src/ui}/scroller.js +37 -43
  315. package/frontend/dist/{ui → frontend/src/ui}/slider.d.ts +5 -1
  316. package/frontend/dist/{ui → frontend/src/ui}/slider.js +4 -4
  317. package/frontend/dist/{ui → frontend/src/ui}/spacer.d.ts +4 -0
  318. package/frontend/dist/{ui → frontend/src/ui}/spacer.js +3 -3
  319. package/frontend/dist/{ui → frontend/src/ui}/span.d.ts +4 -0
  320. package/frontend/dist/{ui → frontend/src/ui}/span.js +3 -3
  321. package/frontend/dist/{ui → frontend/src/ui}/stack.d.ts +4 -0
  322. package/frontend/dist/{ui → frontend/src/ui}/stack.js +3 -9
  323. package/frontend/dist/frontend/src/ui/steps.d.ts +131 -0
  324. package/frontend/dist/{ui → frontend/src/ui}/steps.js +30 -45
  325. package/frontend/dist/{ui → frontend/src/ui}/style.d.ts +4 -0
  326. package/frontend/dist/{ui → frontend/src/ui}/style.js +3 -3
  327. package/frontend/dist/{ui → frontend/src/ui}/switch.d.ts +5 -1
  328. package/frontend/dist/{ui → frontend/src/ui}/switch.js +4 -4
  329. package/frontend/dist/{ui → frontend/src/ui}/table.d.ts +4 -0
  330. package/frontend/dist/{ui → frontend/src/ui}/table.js +6 -6
  331. package/frontend/dist/{ui → frontend/src/ui}/tabs.d.ts +45 -3
  332. package/frontend/dist/{ui → frontend/src/ui}/tabs.js +65 -40
  333. package/frontend/dist/{ui → frontend/src/ui}/text.d.ts +4 -0
  334. package/frontend/dist/{ui → frontend/src/ui}/text.js +3 -3
  335. package/frontend/dist/frontend/src/ui/title.d.ts +91 -0
  336. package/frontend/dist/frontend/src/ui/title.js +272 -0
  337. package/frontend/dist/{ui → frontend/src/ui}/view.d.ts +4 -0
  338. package/frontend/dist/{ui → frontend/src/ui}/view.js +3 -3
  339. package/frontend/dist/{volt.d.ts → frontend/src/volt.d.ts} +3 -0
  340. package/frontend/dist/{volt.js → frontend/src/volt.js} +4 -0
  341. package/frontend/tools/bundle_d_ts.js +71 -0
  342. package/frontend/tools/convert_to_jsdoc_input.txt +9452 -0
  343. package/frontend/tools/convert_to_jsdoc_output.txt +7626 -0
  344. package/frontend/tools/convert_to_jsdoc_tmp.js +345 -0
  345. package/package.json +11 -12
  346. package/backend/dist/cjs/database/collection.d.ts +0 -160
  347. package/backend/dist/cjs/database/collection.js +0 -842
  348. package/backend/dist/cjs/database/database.d.ts +0 -121
  349. package/backend/dist/cjs/database/document.d.ts +0 -131
  350. package/backend/dist/cjs/database/document.js +0 -224
  351. package/backend/dist/cjs/database.d.ts +0 -502
  352. package/backend/dist/cjs/database.js +0 -2248
  353. package/backend/dist/cjs/logger.d.ts +0 -3
  354. package/backend/dist/cjs/meta.d.ts +0 -50
  355. package/backend/dist/cjs/mutex.d.ts +0 -24
  356. package/backend/dist/cjs/payments/paddle.d.ts +0 -160
  357. package/backend/dist/cjs/plugins/browser.d.ts +0 -36
  358. package/backend/dist/cjs/plugins/browser.js +0 -198
  359. package/backend/dist/cjs/plugins/css.d.ts +0 -11
  360. package/backend/dist/cjs/plugins/css.js +0 -80
  361. package/backend/dist/cjs/plugins/mail.d.ts +0 -277
  362. package/backend/dist/cjs/plugins/mail.js +0 -1370
  363. package/backend/dist/cjs/plugins/ts/compiler.d.ts +0 -139
  364. package/backend/dist/cjs/plugins/ts/compiler.js +0 -750
  365. package/backend/dist/cjs/plugins/ts/preprocessing.d.ts +0 -14
  366. package/backend/dist/cjs/plugins/ts/preprocessing.js +0 -440
  367. package/backend/dist/cjs/rate_limit.d.ts +0 -63
  368. package/backend/dist/cjs/rate_limit.js +0 -348
  369. package/backend/dist/cjs/request.deprc.d.ts +0 -48
  370. package/backend/dist/cjs/request.deprc.js +0 -572
  371. package/backend/dist/cjs/response.deprc.d.ts +0 -55
  372. package/backend/dist/cjs/response.deprc.js +0 -275
  373. package/backend/dist/cjs/server.d.ts +0 -342
  374. package/backend/dist/cjs/splash_screen.d.ts +0 -35
  375. package/backend/dist/cjs/status.d.ts +0 -61
  376. package/backend/dist/cjs/stream.d.ts +0 -79
  377. package/backend/dist/cjs/users.d.ts +0 -111
  378. package/backend/dist/cjs/users.js +0 -1817
  379. package/backend/dist/cjs/view.js +0 -352
  380. package/backend/dist/cjs/vinc.dev.d.ts +0 -3
  381. package/backend/dist/cjs/vinc.dev.js +0 -7
  382. package/backend/dist/css/adyen.css +0 -92
  383. package/backend/dist/css/volt.css +0 -70
  384. package/backend/dist/esm/database/collection.d.ts +0 -160
  385. package/backend/dist/esm/database/collection.js +0 -1328
  386. package/backend/dist/esm/database/database.d.ts +0 -121
  387. package/backend/dist/esm/database/document.d.ts +0 -131
  388. package/backend/dist/esm/database/document.js +0 -247
  389. package/backend/dist/esm/database.d.ts +0 -502
  390. package/backend/dist/esm/database.js +0 -2423
  391. package/backend/dist/esm/file_watcher.js +0 -329
  392. package/backend/dist/esm/logger.d.ts +0 -3
  393. package/backend/dist/esm/logger.js +0 -11
  394. package/backend/dist/esm/meta.d.ts +0 -50
  395. package/backend/dist/esm/mutex.d.ts +0 -24
  396. package/backend/dist/esm/mutex.js +0 -48
  397. package/backend/dist/esm/payments/paddle.d.ts +0 -160
  398. package/backend/dist/esm/plugins/browser.d.ts +0 -36
  399. package/backend/dist/esm/plugins/browser.js +0 -176
  400. package/backend/dist/esm/plugins/css.d.ts +0 -11
  401. package/backend/dist/esm/plugins/css.js +0 -90
  402. package/backend/dist/esm/plugins/ts/compiler.d.ts +0 -139
  403. package/backend/dist/esm/plugins/ts/compiler.js +0 -1194
  404. package/backend/dist/esm/plugins/ts/preprocessing.d.ts +0 -14
  405. package/backend/dist/esm/plugins/ts/preprocessing.js +0 -726
  406. package/backend/dist/esm/rate_limit.d.ts +0 -63
  407. package/backend/dist/esm/rate_limit.js +0 -417
  408. package/backend/dist/esm/request.deprc.d.ts +0 -48
  409. package/backend/dist/esm/request.deprc.js +0 -572
  410. package/backend/dist/esm/response.deprc.d.ts +0 -55
  411. package/backend/dist/esm/response.deprc.js +0 -275
  412. package/backend/dist/esm/server.d.ts +0 -342
  413. package/backend/dist/esm/splash_screen.d.ts +0 -35
  414. package/backend/dist/esm/status.d.ts +0 -61
  415. package/backend/dist/esm/status.js +0 -197
  416. package/backend/dist/esm/stream.d.ts +0 -79
  417. package/backend/dist/esm/users.d.ts +0 -111
  418. package/backend/dist/esm/users.js +0 -1935
  419. package/backend/dist/esm/vinc.dev.d.ts +0 -3
  420. package/backend/dist/esm/vinc.dev.js +0 -7
  421. package/frontend/dist/elements/base.d.ts +0 -9889
  422. package/frontend/dist/elements/module.d.ts +0 -30
  423. package/frontend/dist/modules/array.d.ts +0 -94
  424. package/frontend/dist/modules/array.js +0 -634
  425. package/frontend/dist/modules/auth.d.ts +0 -46
  426. package/frontend/dist/modules/auth.js +0 -139
  427. package/frontend/dist/modules/colors.d.ts +0 -1
  428. package/frontend/dist/modules/colors.js +0 -417
  429. package/frontend/dist/modules/compression.d.ts +0 -6
  430. package/frontend/dist/modules/compression.js +0 -999
  431. package/frontend/dist/modules/cookies.d.ts +0 -18
  432. package/frontend/dist/modules/cookies.js +0 -167
  433. package/frontend/dist/modules/date.d.ts +0 -142
  434. package/frontend/dist/modules/date.js +0 -493
  435. package/frontend/dist/modules/events.d.ts +0 -8
  436. package/frontend/dist/modules/events.js +0 -91
  437. package/frontend/dist/modules/google.d.ts +0 -11
  438. package/frontend/dist/modules/google.js +0 -54
  439. package/frontend/dist/modules/meta.d.ts +0 -10
  440. package/frontend/dist/modules/mutex.d.ts +0 -7
  441. package/frontend/dist/modules/mutex.js +0 -51
  442. package/frontend/dist/modules/number.d.ts +0 -16
  443. package/frontend/dist/modules/number.js +0 -23
  444. package/frontend/dist/modules/object.d.ts +0 -52
  445. package/frontend/dist/modules/object.js +0 -383
  446. package/frontend/dist/modules/scheme.d.ts +0 -227
  447. package/frontend/dist/modules/scheme.js +0 -531
  448. package/frontend/dist/modules/settings.d.ts +0 -3
  449. package/frontend/dist/modules/settings.js +0 -4
  450. package/frontend/dist/modules/statics.d.ts +0 -5
  451. package/frontend/dist/modules/string.d.ts +0 -124
  452. package/frontend/dist/modules/string.js +0 -745
  453. package/frontend/dist/modules/support.d.ts +0 -19
  454. package/frontend/dist/modules/support.js +0 -103
  455. package/frontend/dist/modules/themes.d.ts +0 -8
  456. package/frontend/dist/modules/themes.js +0 -18
  457. package/frontend/dist/modules/user.d.ts +0 -59
  458. package/frontend/dist/modules/user.js +0 -280
  459. package/frontend/dist/modules/utils.d.ts +0 -87
  460. package/frontend/dist/modules/utils.js +0 -923
  461. package/frontend/dist/types/gradient.d.ts +0 -12
  462. package/frontend/dist/ui/border_button.d.ts +0 -152
  463. package/frontend/dist/ui/button.d.ts +0 -21
  464. package/frontend/dist/ui/canvas.d.ts +0 -56
  465. package/frontend/dist/ui/checkbox.d.ts +0 -52
  466. package/frontend/dist/ui/frame_modes.d.ts +0 -25
  467. package/frontend/dist/ui/input.d.ts +0 -241
  468. package/frontend/dist/ui/loader_button.d.ts +0 -93
  469. package/frontend/dist/ui/loaders.d.ts +0 -57
  470. package/frontend/dist/ui/pseudo.d.ts +0 -16
  471. package/frontend/dist/ui/steps.d.ts +0 -59
  472. package/frontend/dist/ui/title.d.ts +0 -21
  473. package/frontend/dist/ui/title.js +0 -121
  474. package/frontend/examples/dashboard/dashboard.ts +0 -776
  475. /package/backend/dist/cjs/{cli.d.ts → backend/src/cli.d.ts} +0 -0
  476. /package/backend/dist/cjs/{file_watcher.d.ts → backend/src/database/document.d.ts} +0 -0
  477. /package/backend/dist/cjs/{file_watcher.js → backend/src/database/document.js} +0 -0
  478. /package/backend/dist/cjs/{plugins/pdf.d.ts → backend/src/database/filters/strict_filter_test.d.ts} +0 -0
  479. /package/backend/dist/{esm/file_watcher.d.ts → cjs/backend/src/database/filters/strict_filter_test_v0.d.ts} +0 -0
  480. /package/backend/dist/{esm/plugins/pdf.d.ts → cjs/backend/src/database/flatten_test.d.ts} +0 -0
  481. /package/backend/dist/cjs/{frontend.d.ts → backend/src/frontend.d.ts} +0 -0
  482. /package/backend/dist/cjs/{plugins → backend/src/plugins}/communication.d.ts +0 -0
  483. /package/backend/dist/cjs/{plugins → backend/src/plugins}/communication.js +0 -0
  484. /package/backend/dist/cjs/{plugins → backend/src/plugins}/mail/ui.js +0 -0
  485. /package/backend/dist/cjs/{plugins → backend/src/plugins}/pdf.js +0 -0
  486. /package/backend/dist/cjs/{plugins → backend/src/plugins}/thread_monitor.d.ts +0 -0
  487. /package/backend/dist/cjs/{plugins → backend/src/plugins}/thread_monitor.js +0 -0
  488. /package/backend/dist/cjs/{vinc.d.ts → backend/src/vinc.d.ts} +0 -0
  489. /package/backend/dist/cjs/{vinc.js → backend/src/vinc.js} +0 -0
  490. /package/backend/dist/esm/{cli.d.ts → backend/src/cli.d.ts} +0 -0
  491. /package/backend/dist/esm/{frontend.d.ts → backend/src/frontend.d.ts} +0 -0
  492. /package/backend/dist/esm/{plugins → backend/src/plugins}/communication.d.ts +0 -0
  493. /package/backend/dist/esm/{plugins → backend/src/plugins}/communication.js +0 -0
  494. /package/backend/dist/esm/{plugins → backend/src/plugins}/thread_monitor.d.ts +0 -0
  495. /package/backend/dist/esm/{plugins → backend/src/plugins}/thread_monitor.js +0 -0
  496. /package/backend/dist/esm/{vinc.d.ts → backend/src/vinc.d.ts} +0 -0
  497. /package/backend/dist/esm/{vinc.js → backend/src/vinc.js} +0 -0
  498. /package/frontend/dist/{elements → frontend/src/elements}/register_element.d.ts +0 -0
  499. /package/frontend/dist/{elements → frontend/src/elements}/register_element.js +0 -0
  500. /package/frontend/dist/{modules → frontend/src/modules}/color.d.ts +0 -0
  501. /package/frontend/dist/{ui → frontend/src/ui}/ui.d.ts +0 -0
  502. /package/frontend/dist/{ui → frontend/src/ui}/ui.js +0 -0
@@ -1,6 +1,6 @@
1
- /*
2
- * Author: Daan van den Bergh
3
- * Copyright: © 2022 - 2024 Daan van den Bergh.
1
+ /**
2
+ * @author Daan van den Bergh
3
+ * @copyright © 2022 - 2025 Daan van den Bergh. All rights reserved
4
4
  */
5
5
  var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
6
6
  function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
@@ -37,16 +37,16 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
37
37
  return useValue ? value : void 0;
38
38
  };
39
39
  // External imports.
40
- import { fuzzy } from "@vandenberghinc/vlib/frontend";
40
+ import * as vlib from "@vandenberghinc/vlib/frontend";
41
41
  // Imports.
42
42
  import { Elements, VElementTagMap } from "../elements/module.js";
43
43
  import { Utils } from "../modules/utils.js";
44
- import { HStack, VStack, VStackElement } from "./stack";
45
- import { Text } from "./text";
46
- import { ImageMask } from "./image";
47
- import { GradientBorder } from "./gradient";
48
- import { Scroller } from "./scroller";
49
- import { Divider } from "./divider";
44
+ import { HStack, VStack, VStackElement } from "./stack.js";
45
+ import { Text } from "./text.js";
46
+ import { ImageMask } from "./image.js";
47
+ import { GradientBorder } from "./gradient.js";
48
+ import { Scroller } from "./scroller.js";
49
+ import { Divider } from "./divider.js";
50
50
  // Input.
51
51
  let InputElement = (() => {
52
52
  let _classDecorators = [Elements.create({
@@ -110,11 +110,18 @@ let InputElement = (() => {
110
110
  this.type(type ?? "text");
111
111
  this.value(value ?? "");
112
112
  }
113
- value(val) { if (this._e === undefined) {
114
- return super.value(val);
115
- } if (val == null) {
116
- return this._e.getAttribute("value") ?? "";
117
- } this._e.setAttribute("value", val.toString()); return this; }
113
+ value(val) {
114
+ if (this._e === undefined) {
115
+ return super.value(val);
116
+ }
117
+ if (val == null) {
118
+ return this._e.value ?? "";
119
+ }
120
+ this._e.value = val.toString();
121
+ // if (val == null) { return this._e.getAttribute("value") ?? ""; }
122
+ // this._e.setAttribute("value", val.toString());
123
+ return this;
124
+ }
118
125
  required(val) { if (this._e === undefined) {
119
126
  return super.required(val);
120
127
  } if (val == null) {
@@ -336,19 +343,6 @@ let ExtendedInputElement = (() => {
336
343
  ...VStackElement.default_style,
337
344
  "color": "inherit",
338
345
  "font-size": "16px",
339
- // Custom.
340
- "--input-padding": "12px 6px",
341
- "--input-border-radius": "5px",
342
- "--input-border-color": "gray",
343
- "--input-hover-border-color": "gray",
344
- "--input-background": "transparent",
345
- "--image-mask-color": "#000",
346
- "--image-size": "20px",
347
- "--image-margin-right": "10px",
348
- "--image-margin-left": "5px",
349
- "--image-alt": "VWeb",
350
- "--focus-color": "#8EB8EB",
351
- "--missing-color": "#E8454E",
352
346
  },
353
347
  })];
354
348
  let _classDescriptor;
@@ -364,63 +358,113 @@ let ExtendedInputElement = (() => {
364
358
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
365
359
  __runInitializers(_classThis, _classExtraInitializers);
366
360
  }
367
- _focus_color;
368
- _missing_color;
369
- _mask_color;
370
- _initial_border_color;
371
- _hover_border_color;
361
+ copy_opts;
362
+ input_opts;
363
+ /** The label node, always defined even when `opts.label` is undefined, so the user can still style it. */
372
364
  // @ts-expect-error
373
365
  label;
366
+ /** The left image element created by the `opts.image` field. */
374
367
  image;
368
+ /** The clickable copy node created by the `opts.copy` field. */
369
+ copyable;
370
+ /** The input element created by the `opts.input` field. */
375
371
  input;
372
+ /** The (gradient) border element used for the input field. */
376
373
  input_border;
374
+ /** The container element for the input field. */
377
375
  container;
378
- error;
379
- is_missing = false;
376
+ /** The error text element shown when the input is marked as missing. */
377
+ error_text;
378
+ /** Has error state. */
379
+ has_error = false;
380
+ /** Is focused state. */
380
381
  is_focused = false;
381
- // @todo add readonly func
382
+ /** Validation options. */
383
+ validation_entry;
382
384
  // Constructor.
383
- constructor({ label = undefined, image = undefined, alt = undefined, placeholder = "Input", id = undefined, readonly = false, required = false, type = "text", value = undefined, }) {
385
+ constructor({ label, image, placeholder = "Input", id, readonly = false, required = false, type = "text", value, copy, input, validate, }) {
384
386
  // Initialize super.
385
387
  super();
386
388
  this._init({
387
389
  derived: ExtendedInputElement,
388
390
  });
391
+ // Cast image.
392
+ if (typeof image === "string") {
393
+ image = { url: image };
394
+ }
395
+ // Cast label.
396
+ if (typeof label === "string") {
397
+ label = { text: label };
398
+ }
399
+ // Direct attributes.
400
+ this.validation_entry = validate;
389
401
  // Set id.
390
402
  if (id != null) {
391
403
  this.id(id);
392
404
  }
393
- // Attributes.
394
- this._focus_color = ExtendedInputElement.default_style["--focus-color"];
395
- this._missing_color = ExtendedInputElement.default_style["--missing-color"];
396
- this._mask_color = ExtendedInputElement.default_style["--image-mask-color"];
397
- this._initial_border_color = ExtendedInputElement.default_style["--input-border-color"];
398
- this._hover_border_color = ExtendedInputElement.default_style["--input-hover-border-color"];
405
+ // Set input options..
406
+ this.input_opts = {
407
+ ...(input ?? {}),
408
+ border: {
409
+ color: input?.border?.color ?? "gray",
410
+ hover: input?.border?.hover ?? "gray",
411
+ focused: input?.border?.focused ?? "#8EB8EB",
412
+ missing: input?.border?.missing ?? "#E8454E",
413
+ width: input?.border?.width ?? "1px",
414
+ radius: input?.border?.radius ?? "5px",
415
+ type: input?.border?.type ?? "full",
416
+ },
417
+ };
418
+ // Set copy options.
419
+ this.copy_opts = copy;
399
420
  // Set default styling.
400
421
  this.styles(ExtendedInputElement.default_style);
401
422
  // Title element.
402
- this.label = Text(label)
423
+ this.label = Text(label?.text)
403
424
  .parent(this)
404
- .font_size("inherit")
405
- .margin(0, 0, 7.5, 0)
406
- .color("inherit")
407
- .width("fit-content")
408
- .ellipsis_overflow(true);
409
- if (label == null) {
425
+ .font_size(label?.font_size ?? "inherit")
426
+ .margin(0, 0, label?.spacing ?? (input?.border?.type === "bottom" ? 12.5 : 7.5), 0)
427
+ .color(label?.color ?? "inherit");
428
+ if (!label) {
429
+ // always keep label present so uses can still style it with single-line code when needed.
410
430
  this.label.hide();
411
431
  }
412
- // Title element.
413
- this.image = ImageMask(image)
414
- .parent(this)
415
- .mask_color(this._mask_color)
416
- .frame(ExtendedInputElement.default_style["--image-size"], ExtendedInputElement.default_style["--image-size"])
417
- .margin(0)
418
- .margin_right(ExtendedInputElement.default_style["--image-margin-right"])
419
- .margin_left(ExtendedInputElement.default_style["--image-margin-left"])
420
- .alt(alt ? alt : ExtendedInputElement.default_style["--image-alt"]);
421
- if (image == null) {
422
- this.image.hide();
432
+ else {
433
+ if (label.wrap) {
434
+ this.label
435
+ .width("fit-content")
436
+ .overflow_wrap("break-word") // or "anywhere" for more aggressive breaking
437
+ .hyphens("auto")
438
+ .display("inline-block") // so width constraints apply
439
+ .max_width(label.max_width ?? "100%"); // ensure there’s something to wrap to
440
+ }
441
+ else {
442
+ this.label.ellipsis_overflow(true)
443
+ .width("fit-content")
444
+ .max_width(label.max_width ?? "100%"); // ensure there’s something to wrap to
445
+ }
423
446
  }
447
+ // Input left image.
448
+ this.image = !image ? undefined : ImageMask(image.url)
449
+ .parent(this)
450
+ .mask_color(image.color ?? "#000")
451
+ .square(image.size ?? 20)
452
+ .margin(0, 10, 0, 5)
453
+ .alt(image?.alt ?? "Volt");
454
+ // Copyable right image.
455
+ this.copyable = !this.copy_opts ? undefined : ImageMask(this.copy_opts.url)
456
+ .parent(this)
457
+ .mask_color(this.copy_opts?.color ?? image?.color ?? "#000")
458
+ .square(this.copy_opts.size ?? 20)
459
+ .margin(0, 5, 0, 10)
460
+ .alt(this.copy_opts?.alt ?? "Copy")
461
+ .on_click(() => {
462
+ if (this.copy_opts?.on_click) {
463
+ this.copy_opts.on_click(this.input.value());
464
+ }
465
+ })
466
+ .transition_mask("background 200ms ease-in-out")
467
+ .on_mouse_over_out(e => e.mask_color(this.copy_opts?.hover ?? image?.color ?? "#000"), e => e.mask_color(this.copy_opts?.color ?? image?.color ?? "#000"));
424
468
  // Input element.
425
469
  if (type === "box" || type === "area") {
426
470
  this.input = InputBox(placeholder);
@@ -437,7 +481,8 @@ let ExtendedInputElement = (() => {
437
481
  .margin(0)
438
482
  .width("100%")
439
483
  .stretch(true)
440
- .padding(0, 5)
484
+ // .padding(0, 5)
485
+ .padding(0)
441
486
  .line_height("1.6em")
442
487
  .box_shadow("none")
443
488
  .border("none")
@@ -445,54 +490,68 @@ let ExtendedInputElement = (() => {
445
490
  .z_index(1)
446
491
  .border_radius(0) // is required.
447
492
  .on_focus(() => {
448
- if (!this.is_missing) {
493
+ if (!this.has_error) {
449
494
  this.is_focused = true;
450
- this.input_border.border_color(this._focus_color);
451
- this.container.box_shadow(`0 0 0 3px ${this._focus_color}80`);
495
+ this._set_border_color(this.input_opts.border.focused, true);
452
496
  }
453
497
  })
454
498
  .on_blur(() => {
455
- if (!this.is_missing) {
499
+ if (!this.has_error) {
456
500
  this.is_focused = false;
457
- this.input_border.border_color(this._initial_border_color);
458
- this.container.box_shadow(`0 0 0 0px transparent`);
501
+ this._set_border_color(this.input_opts.border.color);
459
502
  }
460
503
  });
504
+ // Set input height.
505
+ if (input?.height != null) {
506
+ console.log("Setting fixed height to", input.height);
507
+ this.input.fixed_height(input.height);
508
+ }
461
509
  // The input border to support gradients.
462
510
  this.input_border = GradientBorder()
463
511
  .z_index(0)
464
512
  .position(0, 0, 0, 0)
465
- .border_radius(ExtendedInputElement.default_style["--input-border-radius"])
466
- .border_width(1)
467
- .border_color(ExtendedInputElement.default_style["--input-border-color"])
468
- .border_color("0px solid transparent")
513
+ .border_width(this.input_opts.border.width)
514
+ .border_radius(this.input_opts.border.radius)
515
+ .border_color(this.input_opts.border.color)
469
516
  .box_shadow(`0 0 0 0px transparent`)
470
- .transition("background 200ms ease-in-out");
517
+ .transition("background 200ms ease-in-out")
518
+ .pointer_events("none");
519
+ if (this.input_opts.border.type === "bottom") {
520
+ this.input_border.hide();
521
+ }
471
522
  // The hstack container.
472
- this.container = HStack(VStack(this.image)
523
+ this.container = HStack(!this.image ? undefined : VStack(this.image) // wrap in container for height.
473
524
  .width("fit-content")
474
525
  .height("1.6em")
475
- .center_vertical(), this.input_border, this.input)
526
+ .center_vertical(), this.input, !this.copyable ? undefined : VStack(this.copyable) // wrap in container for height.
527
+ .width("fit-content")
528
+ .height("1.6em")
529
+ .center_vertical(), this.input_border)
476
530
  .parent(this)
477
531
  .position("relative")
478
- .background(ExtendedInputElement.default_style["--input-background"])
479
- .padding(ExtendedInputElement.default_style["--input-padding"])
532
+ .background(input?.background ?? "transparent")
533
+ .padding((input?.padding ?? "12px 6px"))
534
+ .border_radius(this.input_opts.border.radius) // for outline when focused or missing etc.
480
535
  .transition("box-shadow 0.2s ease-in-out")
481
536
  .outline("0px solid transparent")
482
537
  .box_shadow(`0 0 0 0px transparent`)
483
538
  .width("100%")
484
539
  .on_mouse_over_out((e) => {
485
- if (!this.is_missing && !this.is_focused) {
486
- this.input_border.border_color(this._hover_border_color);
540
+ if (!this.has_error && !this.is_focused) {
541
+ this._set_border_color(this.input_opts.border.hover);
487
542
  }
488
543
  }, (e) => {
489
- if (!this.is_missing && !this.is_focused) {
490
- this.input_border.border_color(this._initial_border_color);
544
+ if (!this.has_error && !this.is_focused) {
545
+ this._set_border_color(this.input_opts.border.color);
491
546
  }
492
547
  });
548
+ if (this.input_opts.border.type === "bottom") {
549
+ this._set_border_color(this.input_opts.border.color);
550
+ this.container.padding_left(0).padding_right(0);
551
+ }
493
552
  // The error message.
494
- this.error = Text("Incomplete field")
495
- .color(this._missing_color)
553
+ this.error_text = Text("Incomplete field")
554
+ .color(this.input_opts.border.missing)
496
555
  .font_size("0.8em")
497
556
  .margin(7.5, 0, 0, 2.5)
498
557
  .padding(0)
@@ -503,122 +562,104 @@ let ExtendedInputElement = (() => {
503
562
  this.id(id);
504
563
  }
505
564
  // Set required.
506
- if (required) {
507
- this.required(required);
508
- }
565
+ this.required(required);
509
566
  // Append.
510
- this.append(this.label, this.container, this.error);
567
+ this.append(this.label, this.container, this.error_text);
511
568
  // Set value.
512
569
  if (value) {
513
570
  this.value(value);
514
571
  }
515
572
  }
516
- styles(style_dict) {
517
- if (style_dict == null) {
518
- let styles = super.styles();
519
- styles["--input-background"] = this.container.background();
520
- styles["--input-padding"] = this.container.padding();
521
- styles["--input-border-radius"] = this.container.border_radius();
522
- styles["--input-border-color"] = this.container.border_color();
523
- styles["--input-hover-border-color"] = this._hover_border_color;
524
- styles["--image-mask-color"] = this._mask_color;
525
- styles["--image-size"] = this.image.width().toString();
526
- styles["--image-margin-right"] = this.image.margin_right().toString();
527
- styles["--image-margin-left"] = this.image.margin_left().toString();
528
- styles["--image-alt"] = this.image.alt() || "VWeb";
529
- styles["--focus-color"] = this._focus_color;
530
- styles["--missing-color"] = this._missing_color;
531
- return styles;
573
+ /** Helper to set the border color. */
574
+ _set_border_color(color, set_outline = false) {
575
+ if (this.input_opts.border.type === "full") {
576
+ this.input_border.border_color(color);
577
+ if (set_outline) {
578
+ this.container.box_shadow(`0 0 0 3px ${color}80`);
579
+ }
580
+ else {
581
+ this.container.box_shadow(`0 0 0 0px transparent`);
582
+ }
532
583
  }
533
584
  else {
534
- return super.styles(style_dict);
585
+ this.container.border_bottom(this.input_opts.border.width, color);
535
586
  }
536
587
  }
537
- // Set default since it inherits an element.
538
- set_default() {
539
- return super.set_default(ExtendedInputElement);
540
- }
588
+ // Set the focus color.
541
589
  focus_color(val) {
542
590
  if (val == null) {
543
- return this._focus_color ?? "";
591
+ return (this.input_opts.border.focused ?? "");
544
592
  }
545
- this._focus_color = val;
593
+ this.input_opts.border.focused = val;
546
594
  return this;
547
595
  }
548
- missing_color(val) {
549
- if (val == null) {
550
- return this._missing_color ?? "";
551
- }
552
- this._missing_color = val;
553
- this.error.color(this._missing_color);
554
- return this;
596
+ // Set default since it inherits an element.
597
+ set_default() {
598
+ return super.set_default(ExtendedInputElement);
555
599
  }
556
- missing(to, err = "Incomplete field") {
557
- if (to == null) {
558
- return this.is_missing;
559
- }
560
- else if (to === true) {
561
- this.is_missing = true;
562
- this.input_border.border_color(this._missing_color);
563
- // this.container.outline(`1px solid ${this._missing_color}`)
564
- this.container.box_shadow(`0 0 0 3px ${this._missing_color}80`);
565
- // this.image.mask_color(this._missing_color)
566
- this.error.show();
567
- if (err) {
568
- this.error.text(err);
569
- }
600
+ /**
601
+ * Set the error state and message.
602
+ * Providing a truthy value will enable the error state and return the current instance for chaining.
603
+ * Providing a falsy value will disable the error state and return the current instance for chaining.
604
+ * Providing no value will return the current error message or `undefined` when no error is set.
605
+ */
606
+ error(err) {
607
+ if (err == null) {
608
+ return (this.has_error ? this.error_text.text() : undefined);
609
+ }
610
+ else if (err) {
611
+ this.has_error = true;
612
+ this._set_border_color(this.input_opts.border.missing, true);
613
+ // this.image.mask_color(this._border_opts.missing)
614
+ this.error_text.show();
615
+ this.error_text.text(err);
570
616
  }
571
617
  else {
572
- this.is_missing = false;
573
- this.input_border.border_color(this._initial_border_color);
574
- // this.container.outline("0px solid transparent")
575
- this.container.box_shadow(`0 0 0 0px transparent`);
576
- // this.image.mask_color(this._mask_color)
577
- this.error.hide();
618
+ this.has_error = false;
619
+ this._set_border_color(this.input_opts.border.color);
620
+ this.error_text.hide();
578
621
  }
579
622
  return this;
580
623
  }
581
- set_error(err = "Incomplete field") {
582
- return this.missing(true, err);
624
+ /** Remove the error state and mark as valid. */
625
+ valid() {
626
+ return this.error(false);
583
627
  }
584
- // Submit the item, throws an error when the item is not defined.
628
+ /** Submit the item, throws an error when the item is not defined. */
585
629
  submit() {
630
+ // Get value.
586
631
  const value = this.value();
587
- console.log("id:", this.id(), "value:", value);
588
632
  if (value == null || value === "") {
589
- this.missing(true);
633
+ this.error("Incomplete field");
590
634
  throw Error("Fill in all the required fields.");
591
635
  }
592
- this.missing(false);
593
- return value;
594
- }
595
- mask_color(val) {
596
- if (val == null) {
597
- return this._mask_color ?? "";
636
+ // Validate.
637
+ if (this.validation_entry) {
638
+ const res = vlib.Schema.validate_entry(value, this.validation_entry, { throw: false, field_type: "field" });
639
+ if (res.error) {
640
+ // use raw error for showing.
641
+ this.error(res.raw_error ?? "Invalid value");
642
+ // use full error for throwing.
643
+ throw Error(res.error);
644
+ }
598
645
  }
599
- this._mask_color = val;
600
- this.image.mask_color(this._mask_color);
601
- return this;
602
- }
603
- // Show error.
604
- show_error(err = "Incomplete field") {
605
- this.missing(true, err);
606
- return this;
607
- }
608
- // Hide error.
609
- hide_error() {
610
- this.missing(false);
611
- return this;
646
+ // Success.
647
+ this.valid();
648
+ return value;
612
649
  }
613
650
  readonly(val) { if (val == null) {
614
651
  return this.input.readonly();
615
652
  } this.input.readonly(val); return this; }
616
653
  text(val) { if (val == null) {
617
- return this.label.text();
618
- } this.label.text(val); return this; }
619
- value(val) { if (val == null) {
620
- return this.input.value();
621
- } this.input.value(val); return this; }
654
+ return this.label?.text() ?? "";
655
+ } this.label?.text(val); return this; }
656
+ value(val) {
657
+ if (val == null) {
658
+ return this.input.value();
659
+ }
660
+ this.input.value(val);
661
+ return this;
662
+ }
622
663
  required(val) { if (val == null) {
623
664
  return this.input.required();
624
665
  } this.input.required(val); return this; }
@@ -636,31 +677,6 @@ let ExtendedInputElement = (() => {
636
677
  this.input.on_input((x, y) => val(this, y));
637
678
  return this;
638
679
  }
639
- border_radius(val) { if (val == null) {
640
- return this.container.border_radius();
641
- } this.container.border_radius(val); this.input_border.border_radius(val); return this; }
642
- border_color(val) {
643
- if (val == null) {
644
- return this.container.border_color();
645
- }
646
- this._initial_border_color = val;
647
- this.container.border_color(val);
648
- this.input_border.border_color(val);
649
- return this;
650
- }
651
- hover_border_color(val) {
652
- if (val == null) {
653
- return this._hover_border_color;
654
- }
655
- this._hover_border_color = val;
656
- return this;
657
- }
658
- border_width(val) { if (val == null) {
659
- return this.container.border_width();
660
- } this.container.border_width(val); this.input_border.border_width(val); return this; }
661
- border_style(val) { if (val == null) {
662
- return this.container.border_style();
663
- } this.container.border_style(val); this.input_border.border_style(val); return this; }
664
680
  background(val) { if (val == null) {
665
681
  return this.container.background();
666
682
  } this.container.background(val); return this; }
@@ -671,13 +687,6 @@ let ExtendedInputElement = (() => {
671
687
  this.container.padding(...values);
672
688
  return this;
673
689
  }
674
- border(...args) {
675
- if (args.length === 0 || (args.length === 1 && args[0] == null)) {
676
- return this.input_border.border();
677
- }
678
- this.input_border.border(...args);
679
- return this;
680
- }
681
690
  };
682
691
  return ExtendedInputElement = _classThis;
683
692
  })();
@@ -693,18 +702,6 @@ let ExtendedSelectElement = (() => {
693
702
  "color": "inherit",
694
703
  "font-size": "16px",
695
704
  "background": "#FFFFFF",
696
- // Custom.
697
- "--input-padding": "12px 6px",
698
- "--input-border-radius": "5px",
699
- "--input-border-color": "gray",
700
- "--image-mask-color": "#000",
701
- "--image-size": "20px",
702
- "--image-margin-right": "10px",
703
- "--image-margin-left": "5px",
704
- "--image-alt": "VWeb",
705
- "--hover-bg": "#00000007",
706
- "--focus-color": "#8EB8EB",
707
- "--missing-color": "#E8454E",
708
705
  }
709
706
  })];
710
707
  let _classDescriptor;
@@ -720,32 +717,59 @@ let ExtendedSelectElement = (() => {
720
717
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
721
718
  __runInitializers(_classThis, _classExtraInitializers);
722
719
  }
723
- _focus_color;
724
- _missing_color;
725
- _mask_color;
726
- _border_color;
727
- _hover_bg;
720
+ /** The selectable items. */
728
721
  items;
722
+ /** The label node. */
729
723
  // @ts-expect-error
730
724
  label;
725
+ /** The image node. */
731
726
  image;
727
+ /** The input node (readonly) with the selected value. */
732
728
  input;
729
+ /** The container node. */
733
730
  container;
734
- error;
731
+ /** The error text node. */
732
+ error_text;
733
+ /** The dropdown scroller element. */
735
734
  dropdown;
736
- is_missing = false;
735
+ /** Has error state. */
736
+ has_error = false;
737
+ /** Is focused state. */
738
+ is_focused = false;
739
+ // Internal attributes.
740
+ input_opts;
741
+ image_opts;
742
+ _dropdown_item_hover;
737
743
  _on_change_callback;
738
744
  _on_dropdown_close;
739
745
  _dropdown_height;
740
746
  _value;
741
747
  // Constructor.
742
- constructor({ label = undefined, image = undefined, alt = "", placeholder = "Placeholder", id = undefined, required = false, items = [{ id: "option", text: "Option", image: undefined }], // may also be an array with strings which will be used as the item's id and text.
743
- }) {
748
+ constructor({ label = undefined, image = undefined, placeholder = "Placeholder", id = undefined, required = false, items = [{ id: "option", text: "Option", image: undefined }], // may also be an array with strings which will be used as the item's id and text.
749
+ dropdown, input, }) {
744
750
  // Initialize super.
745
751
  super();
746
752
  this._init({
747
753
  derived: ExtendedSelectElement,
748
754
  });
755
+ // Cast image.
756
+ if (typeof image === "string") {
757
+ image = { url: image };
758
+ }
759
+ this.image_opts = image;
760
+ // Set input options..
761
+ this.input_opts = {
762
+ ...(input ?? {}),
763
+ border: {
764
+ color: input?.border?.color ?? "gray",
765
+ hover: input?.border?.hover ?? "gray",
766
+ focused: input?.border?.focused ?? "#8EB8EB",
767
+ missing: input?.border?.missing ?? "#E8454E",
768
+ width: input?.border?.width ?? "1px",
769
+ radius: input?.border?.radius ?? "5px",
770
+ type: input?.border?.type ?? "full",
771
+ },
772
+ };
749
773
  // Arguments.
750
774
  if (Array.isArray(items)) {
751
775
  this.items = [];
@@ -785,11 +809,7 @@ let ExtendedSelectElement = (() => {
785
809
  throw Error(`Parameter "items" should be a defined value of type "array" or "object".`);
786
810
  }
787
811
  // Attributes.
788
- this._focus_color = ExtendedSelectElement.default_style["--focus-color"];
789
- this._missing_color = ExtendedSelectElement.default_style["--missing-color"];
790
- this._mask_color = ExtendedSelectElement.default_style["--image-mask-color"];
791
- this._border_color = ExtendedSelectElement.default_style["--input-border-color"];
792
- this._hover_bg = ExtendedSelectElement.default_style["--hover-bg"];
812
+ this._dropdown_item_hover = dropdown?.hover ?? "#00000007";
793
813
  // Set default styling.
794
814
  this.styles(ExtendedSelectElement.default_style);
795
815
  // Title element.
@@ -804,17 +824,12 @@ let ExtendedSelectElement = (() => {
804
824
  this.label.hide();
805
825
  }
806
826
  // Title element.
807
- this.image = ImageMask(image)
827
+ this.image = !image ? undefined : ImageMask(image.url)
808
828
  .parent(this)
809
- .mask_color(this._mask_color)
810
- .frame(ExtendedSelectElement.default_style["--image-size"], ExtendedSelectElement.default_style["--image-size"])
811
- .margin(0)
812
- .margin_right(ExtendedSelectElement.default_style["--image-margin-right"])
813
- .margin_left(ExtendedSelectElement.default_style["--image-margin-left"])
814
- .alt(alt ? alt : ExtendedSelectElement.default_style["--image-alt"]);
815
- if (image == null) {
816
- this.image.hide();
817
- }
829
+ .mask_color(image?.color ?? "#000")
830
+ .square(image?.size ?? 20)
831
+ .margin(0, 10, 0, 5)
832
+ .alt(image?.alt ?? "Volt");
818
833
  // Input element.
819
834
  this.input = Input(placeholder)
820
835
  .parent(this)
@@ -831,29 +846,40 @@ let ExtendedSelectElement = (() => {
831
846
  .cursor("pointer")
832
847
  .border_radius(0); // is required
833
848
  // The hstack container.
834
- this.container = HStack(VStack(this.image)
849
+ this.container = HStack(!this.image ? undefined : VStack(this.image)
835
850
  .width("fit-content")
836
851
  .height("1.6em")
837
852
  .center_vertical(), this.input)
838
853
  .parent(this)
839
- .background(ExtendedSelectElement.default_style["background"])
840
- .padding(ExtendedSelectElement.default_style["--input-padding"])
841
- .border_radius(ExtendedSelectElement.default_style["--input-border-radius"])
842
- .border_width(1)
854
+ .background(input?.background ?? "transparent")
855
+ .padding((input?.padding ?? "12px 6px"))
856
+ .border_radius(this.input_opts.border.radius)
857
+ .border_width(this.input_opts.border.width)
843
858
  .border_style("solid")
844
- .border_color(this._border_color)
845
- .transition("outline 0.2s ease-in-out, box-shadow 0.2s ease-in-out")
846
- .outline("0px solid transparent")
859
+ .transition("border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out")
847
860
  .box_shadow(`0 0 0 0px transparent`)
848
861
  .width("100%")
862
+ .on_mouse_over_out((e) => {
863
+ if (!this.has_error && !this.is_focused) {
864
+ this._set_border_color(this.input_opts.border.hover);
865
+ }
866
+ }, (e) => {
867
+ if (!this.has_error && !this.is_focused) {
868
+ this._set_border_color(this.input_opts.border.color);
869
+ }
870
+ })
849
871
  .on_click(() => {
850
872
  if (this.dropdown.is_hidden()) {
851
873
  this.expand();
852
874
  }
853
875
  });
876
+ this._set_border_color(this.input_opts.border.color);
877
+ if (this.input_opts.border.type === "bottom") {
878
+ this.container.padding_left(0).padding_right(0);
879
+ }
854
880
  // The error message.
855
- this.error = Text("Incomplete field")
856
- .color(this._missing_color)
881
+ this.error_text = Text("Incomplete field")
882
+ .color(this.input_opts.border.missing)
857
883
  .font_size("0.8em")
858
884
  .margin(7.5, 0, 0, 2.5)
859
885
  .padding(0)
@@ -864,16 +890,16 @@ let ExtendedSelectElement = (() => {
864
890
  .parent(this)
865
891
  .position(0, null, null, null)
866
892
  .background(ExtendedSelectElement.default_style["background"])
867
- .border_radius(ExtendedSelectElement.default_style["--input-border-radius"])
868
- .border_width(1)
893
+ .border_radius(this.input_opts.border.radius)
894
+ .border_width(this.input_opts.border.width)
869
895
  .border_style("solid")
870
- .border_color(this._border_color)
896
+ .border_color(this.input_opts.border.color)
871
897
  .box_shadow("0px 0px 5px #00000050")
872
898
  .frame("100%", "100%")
873
899
  .z_index(10)
874
900
  .hide();
875
901
  // Append.
876
- this.append(this.label, this.container, this.error, this.dropdown);
902
+ this.append(this.label, this.container, this.error_text, this.dropdown);
877
903
  // Styling.
878
904
  this.position("relative");
879
905
  this.overflow("visible");
@@ -903,92 +929,103 @@ let ExtendedSelectElement = (() => {
903
929
  if (stop) {
904
930
  this.dropdown.hide();
905
931
  window.removeEventListener("mousedown", this._on_dropdown_close);
932
+ // Unfocus.
933
+ if (!this.has_error) {
934
+ this.is_focused = false;
935
+ this._set_border_color(this.input_opts.border.color);
936
+ }
906
937
  }
907
938
  };
908
939
  }
909
- dropdown_height(val) {
910
- if (val === undefined) {
911
- return this._dropdown_height;
912
- }
913
- this._dropdown_height = val;
914
- return this;
915
- }
916
- styles(style_dict) {
917
- if (style_dict == null) {
918
- let styles = super.styles();
919
- styles["--input-padding"] = this.container.padding();
920
- styles["--input-border-radius"] = this.container.border_radius();
921
- styles["--input-border-color"] = this._border_color;
922
- styles["--image-mask-color"] = this._mask_color;
923
- styles["--image-size"] = this.image.width().toString();
924
- styles["--image-margin-right"] = this.image.margin_right().toString();
925
- styles["--image-margin-left"] = this.image.margin_left().toString();
926
- styles["--image-alt"] = this.image.alt() || "VWeb";
927
- styles["--focus-color"] = this._focus_color;
928
- styles["--missing-color"] = this._missing_color;
929
- return styles;
940
+ /** Helper to set the border color. */
941
+ _set_border_color(color, set_outline = false) {
942
+ if (this.input_opts.border.type === "full") {
943
+ this.container.border_color(color);
944
+ if (set_outline) {
945
+ this.container.box_shadow(`0 0 0 3px ${color}80`);
946
+ }
947
+ else {
948
+ this.container.box_shadow(`0 0 0 0px transparent`);
949
+ }
930
950
  }
931
951
  else {
932
- return super.styles(style_dict);
952
+ this.container.border_bottom(this.input_opts.border.width, color);
933
953
  }
934
954
  }
935
- // Set default since it inherits an element.
936
- set_default() {
937
- return super.set_default(ExtendedSelectElement);
938
- }
939
955
  focus_color(val) {
940
956
  if (val == null) {
941
- return this._focus_color ?? "";
957
+ return this.input_opts.border.focused ?? "";
942
958
  }
943
- this._focus_color = val;
959
+ this.input_opts.border.focused = val;
944
960
  return this;
945
961
  }
946
- missing_color(val) {
962
+ error_color(val) {
947
963
  if (val == null) {
948
- return this._missing_color ?? "";
964
+ return this.input_opts.border.missing ?? "";
949
965
  }
950
- this._missing_color = val;
951
- this.error.color(this._missing_color);
966
+ this.input_opts.border.missing = val;
967
+ this.error_text.color(this.input_opts.border.missing);
952
968
  return this;
953
969
  }
954
- missing(to, err = "Incomplete field") {
955
- if (to == null) {
956
- return this.is_missing;
957
- }
958
- else if (to === true) {
959
- this.is_missing = true;
960
- this.container.outline(`1px solid ${this._missing_color}`);
961
- this.container.box_shadow(`0 0 0 3px ${this._missing_color}80`);
962
- this.image.mask_color(this._missing_color);
963
- this.error.show();
970
+ dropdown_height(val) {
971
+ if (val === undefined) {
972
+ return this._dropdown_height;
973
+ }
974
+ this._dropdown_height = val;
975
+ return this;
976
+ }
977
+ /** Set default since it inherits an element. */
978
+ set_default() {
979
+ return super.set_default(ExtendedSelectElement);
980
+ }
981
+ /**
982
+ * Set the error state and message.
983
+ * Providing a truthy value will enable the error state and return the current instance for chaining.
984
+ * Providing a falsy value will disable the error state and return the current instance for chaining.
985
+ * Providing no value will return the current error message or `undefined` when no error is set.
986
+ */
987
+ error(err) {
988
+ if (err == null) {
989
+ return (this.has_error ? this.error_text.text() : undefined);
990
+ }
991
+ else if (err) {
992
+ this.has_error = true;
993
+ this._set_border_color(this.input_opts.border.missing, true);
994
+ this.image?.mask_color(this.input_opts.border.missing);
995
+ this.error_text.show();
964
996
  if (err) {
965
- this.error.text(err);
997
+ this.error_text.text(err);
966
998
  }
967
999
  }
968
1000
  else {
969
- this.is_missing = false;
970
- this.container.outline("0px solid transparent");
971
- this.container.box_shadow(`0 0 0 0px transparent`);
972
- this.image.mask_color(this._mask_color);
973
- this.error.hide();
1001
+ this.has_error = false;
1002
+ this._set_border_color(this.input_opts.border.color);
1003
+ this.image?.mask_color(this.image_opts?.color ?? "#000");
1004
+ this.error_text.hide();
974
1005
  }
975
1006
  return this;
976
1007
  }
977
- set_error(err = "Incomplete field") {
978
- return this.missing(true, err);
1008
+ /** Remove the error state and mark as valid. */
1009
+ valid() {
1010
+ return this.error(false);
979
1011
  }
980
- // Submit the item, throws an error when the item is not defined.
1012
+ /** Submit the item, throws an error when the item is not defined. */
981
1013
  submit() {
982
1014
  const value = this.value();
983
1015
  if (value == null || value === "") {
984
- this.missing(true);
1016
+ this.error("Incomplete field");
985
1017
  throw Error("Fill in all the required fields.");
986
1018
  }
987
- this.missing(false);
1019
+ this.valid();
988
1020
  return value;
989
1021
  }
990
- // Expand dropdown.
1022
+ /** Expand dropdown. */
991
1023
  expand() {
1024
+ // Set focus.
1025
+ if (!this.has_error) {
1026
+ this.is_focused = true;
1027
+ this._set_border_color(this.input_opts.border.focused, true);
1028
+ }
992
1029
  // Add event listener.
993
1030
  window.addEventListener("mousedown", this._on_dropdown_close);
994
1031
  // Clear.
@@ -1015,7 +1052,7 @@ let ExtendedSelectElement = (() => {
1015
1052
  });
1016
1053
  }
1017
1054
  else {
1018
- const results = fuzzy.search({
1055
+ const results = vlib.fuzzy.search({
1019
1056
  query,
1020
1057
  targets: this.items,
1021
1058
  limit: undefined,
@@ -1042,12 +1079,10 @@ let ExtendedSelectElement = (() => {
1042
1079
  let img;
1043
1080
  if (item.image != null) {
1044
1081
  img = ImageMask(item.image)
1045
- .mask_color(this._mask_color)
1046
- .frame(ExtendedSelectElement.default_style["--image-size"], ExtendedSelectElement.default_style["--image-size"])
1047
- .margin(0)
1048
- .margin_right(ExtendedSelectElement.default_style["--image-margin-right"])
1049
- .margin_left(ExtendedSelectElement.default_style["--image-margin-left"])
1050
- .alt(ExtendedSelectElement.default_style["--image-alt"])
1082
+ .mask_color(this.image_opts?.color ?? "#000")
1083
+ .square(this.image_opts?.size ?? 20)
1084
+ .margin(0, 10, 0, 5)
1085
+ .alt(this.image_opts?.alt ?? "Volt")
1051
1086
  .pointer_events("none"); // so target element of mouse down is easier.
1052
1087
  }
1053
1088
  // Text.
@@ -1074,7 +1109,7 @@ let ExtendedSelectElement = (() => {
1074
1109
  }
1075
1110
  window.removeEventListener("mousedown", this._on_dropdown_close);
1076
1111
  })
1077
- .on_mouse_over((e) => e.background(this._hover_bg))
1112
+ .on_mouse_over((e) => e.background(this._dropdown_item_hover))
1078
1113
  .on_mouse_out((e) => e.background("transparent"));
1079
1114
  // Update the item with the stack for searches.
1080
1115
  item.stack = stack;
@@ -1087,7 +1122,7 @@ let ExtendedSelectElement = (() => {
1087
1122
  if (this.items.length > 15) {
1088
1123
  this.dropdown.append(search, Divider()
1089
1124
  .margin(0)
1090
- .background(this._border_color), content);
1125
+ .background(this.input_opts.border.color), content);
1091
1126
  }
1092
1127
  else {
1093
1128
  this.dropdown.append(content);
@@ -1127,14 +1162,6 @@ let ExtendedSelectElement = (() => {
1127
1162
  });
1128
1163
  return this;
1129
1164
  }
1130
- mask_color(val) {
1131
- if (val == null) {
1132
- return this._mask_color;
1133
- }
1134
- this._mask_color = val;
1135
- this.image.mask_color(this._mask_color);
1136
- return this;
1137
- }
1138
1165
  background(val) {
1139
1166
  if (val == null) {
1140
1167
  return this.background();
@@ -1143,39 +1170,6 @@ let ExtendedSelectElement = (() => {
1143
1170
  this.dropdown.background(val);
1144
1171
  return this;
1145
1172
  }
1146
- border_radius(val) {
1147
- if (val == null) {
1148
- return this.container.border_radius();
1149
- }
1150
- this.container.border_radius(val);
1151
- this.dropdown.border_radius(val);
1152
- return this;
1153
- }
1154
- border_color(val) {
1155
- if (val == null) {
1156
- return this._border_color;
1157
- }
1158
- this._border_color = val;
1159
- this.container.border_color(this._border_color);
1160
- this.dropdown.border_color(this._border_color);
1161
- return this;
1162
- }
1163
- border_width(val) {
1164
- if (val == null) {
1165
- return this.container.border_width();
1166
- }
1167
- this.container.border_width(val);
1168
- this.dropdown.border_width(val);
1169
- return this;
1170
- }
1171
- border_style(val) {
1172
- if (val == null) {
1173
- return this.container.border_style();
1174
- }
1175
- this.container.border_style(val);
1176
- this.dropdown.border_style(val);
1177
- return this;
1178
- }
1179
1173
  padding(...values) {
1180
1174
  if (values.length === 0 || (values.length === 1 && values[0] == null)) {
1181
1175
  return this.container.padding();
@@ -1184,14 +1178,6 @@ let ExtendedSelectElement = (() => {
1184
1178
  this.dropdown.padding(...values);
1185
1179
  return this;
1186
1180
  }
1187
- border(...args) {
1188
- if (args.length === 0 || (args.length === 1 && args[0] == null)) {
1189
- return this.container.border();
1190
- }
1191
- this.container.border(...args);
1192
- this.dropdown.border(...args);
1193
- return this;
1194
- }
1195
1181
  // @ts-expect-error
1196
1182
  on_change(callback) {
1197
1183
  if (callback == null) {