@design-edito/tools 0.4.22 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (505) hide show
  1. package/agnostic/arrays/find-duplicates/index.d.ts +1 -1
  2. package/agnostic/arrays/find-duplicates/index.js +3 -2
  3. package/agnostic/arrays/is-array-of/index.d.ts +1 -1
  4. package/agnostic/arrays/is-array-of/index.js +3 -1
  5. package/agnostic/arrays/make/index.d.ts +1 -1
  6. package/agnostic/arrays/random-pick/index.js +2 -1
  7. package/agnostic/arrays/shuffle/index.js +1 -1
  8. package/agnostic/booleans/is-falsy/index.d.ts +3 -3
  9. package/agnostic/booleans/is-falsy/index.js +2 -3
  10. package/agnostic/colors/channels/index.d.ts +16 -16
  11. package/agnostic/colors/channels/index.js +15 -15
  12. package/agnostic/colors/contrast/index.d.ts +6 -6
  13. package/agnostic/colors/contrast/index.js +6 -8
  14. package/agnostic/colors/contrast/index.test.js +1 -1
  15. package/agnostic/colors/convert/index.d.ts +43 -43
  16. package/agnostic/colors/convert/index.js +60 -55
  17. package/agnostic/colors/distance/index.d.ts +5 -5
  18. package/agnostic/colors/distance/index.js +5 -4
  19. package/agnostic/colors/grayscale/index.d.ts +3 -3
  20. package/agnostic/colors/grayscale/index.js +3 -3
  21. package/agnostic/colors/index.d.ts +1 -1
  22. package/agnostic/colors/index.js +1 -1
  23. package/agnostic/colors/invert/index.d.ts +4 -4
  24. package/agnostic/colors/invert/index.js +3 -3
  25. package/agnostic/colors/lerp/index.d.ts +6 -7
  26. package/agnostic/colors/lerp/index.js +5 -6
  27. package/agnostic/colors/luminance/index.d.ts +4 -4
  28. package/agnostic/colors/luminance/index.js +3 -3
  29. package/agnostic/colors/palette/index.d.ts +3 -3
  30. package/agnostic/colors/palette/index.js +4 -3
  31. package/agnostic/colors/rotate/index.d.ts +4 -4
  32. package/agnostic/colors/rotate/index.js +4 -4
  33. package/agnostic/colors/tidy/index.d.ts +2 -2
  34. package/agnostic/colors/tidy/index.js +2 -2
  35. package/agnostic/colors/typechecks/index.d.ts +21 -21
  36. package/agnostic/colors/typechecks/index.js +22 -21
  37. package/agnostic/colors/types.d.ts +33 -33
  38. package/agnostic/css/bem/index.d.ts +11 -11
  39. package/agnostic/css/bem/index.js +9 -8
  40. package/agnostic/css/clss/index.d.ts +1 -1
  41. package/agnostic/css/clss/index.js +1 -1
  42. package/agnostic/css/index.d.ts +1 -1
  43. package/agnostic/css/index.js +1 -1
  44. package/agnostic/css/is-valid-css-class-name/index.d.ts +2 -2
  45. package/agnostic/css/is-valid-css-class-name/index.js +3 -3
  46. package/agnostic/css/scale/index.d.ts +18 -18
  47. package/agnostic/css/scale/index.js +18 -18
  48. package/agnostic/css/styles-set/index.d.ts +1 -1
  49. package/agnostic/css/styles-set/index.js +0 -2
  50. package/agnostic/errors/register/index.d.ts +1 -1
  51. package/agnostic/errors/register/index.js +3 -0
  52. package/agnostic/errors/unknown-to-string/index.d.ts +2 -2
  53. package/agnostic/errors/unknown-to-string/index.js +2 -3
  54. package/agnostic/html/deep-select/index.d.ts +3 -3
  55. package/agnostic/html/deep-select/index.js +11 -7
  56. package/agnostic/html/get-node-ancestors/index.d.ts +3 -3
  57. package/agnostic/html/get-node-ancestors/index.js +3 -3
  58. package/agnostic/html/get-position-inside-parent/index.d.ts +2 -2
  59. package/agnostic/html/get-position-inside-parent/index.js +2 -2
  60. package/agnostic/html/hyper-json/cast/index.d.ts +1 -1
  61. package/agnostic/html/hyper-json/cast/index.js +6 -5
  62. package/agnostic/html/hyper-json/method/index.d.ts +2 -2
  63. package/agnostic/html/hyper-json/serialize/index.d.ts +1 -1
  64. package/agnostic/html/hyper-json/serialize/index.js +9 -5
  65. package/agnostic/html/hyper-json/smart-tags/coalesced/addclass/index.js +1 -0
  66. package/agnostic/html/hyper-json/smart-tags/coalesced/and/index.d.ts +1 -1
  67. package/agnostic/html/hyper-json/smart-tags/coalesced/append/index.d.ts +1 -1
  68. package/agnostic/html/hyper-json/smart-tags/coalesced/append/index.js +1 -0
  69. package/agnostic/html/hyper-json/smart-tags/coalesced/at/index.d.ts +1 -1
  70. package/agnostic/html/hyper-json/smart-tags/coalesced/at/index.js +1 -0
  71. package/agnostic/html/hyper-json/smart-tags/coalesced/call/index.d.ts +1 -1
  72. package/agnostic/html/hyper-json/smart-tags/coalesced/call/index.js +1 -1
  73. package/agnostic/html/hyper-json/smart-tags/coalesced/clone/index.d.ts +1 -1
  74. package/agnostic/html/hyper-json/smart-tags/coalesced/deleteproperties/index.d.ts +1 -1
  75. package/agnostic/html/hyper-json/smart-tags/coalesced/deleteproperties/index.js +0 -1
  76. package/agnostic/html/hyper-json/smart-tags/coalesced/equals/index.d.ts +1 -1
  77. package/agnostic/html/hyper-json/smart-tags/coalesced/getattribute/index.js +1 -0
  78. package/agnostic/html/hyper-json/smart-tags/coalesced/getproperties/index.d.ts +1 -1
  79. package/agnostic/html/hyper-json/smart-tags/coalesced/getproperty/index.d.ts +1 -1
  80. package/agnostic/html/hyper-json/smart-tags/coalesced/getproperty/index.js +1 -2
  81. package/agnostic/html/hyper-json/smart-tags/coalesced/hjparse/index.d.ts +1 -1
  82. package/agnostic/html/hyper-json/smart-tags/coalesced/hjstringify/index.d.ts +1 -1
  83. package/agnostic/html/hyper-json/smart-tags/coalesced/hjstringify/index.js +4 -0
  84. package/agnostic/html/hyper-json/smart-tags/coalesced/if/index.d.ts +1 -1
  85. package/agnostic/html/hyper-json/smart-tags/coalesced/if/index.js +1 -0
  86. package/agnostic/html/hyper-json/smart-tags/coalesced/index.d.ts +11 -11
  87. package/agnostic/html/hyper-json/smart-tags/coalesced/index.js +11 -11
  88. package/agnostic/html/hyper-json/smart-tags/coalesced/initialize/index.d.ts +1 -1
  89. package/agnostic/html/hyper-json/smart-tags/coalesced/initialize/index.js +1 -0
  90. package/agnostic/html/hyper-json/smart-tags/coalesced/join/index.d.ts +1 -1
  91. package/agnostic/html/hyper-json/smart-tags/coalesced/length/index.d.ts +1 -1
  92. package/agnostic/html/hyper-json/smart-tags/coalesced/map/index.d.ts +1 -1
  93. package/agnostic/html/hyper-json/smart-tags/coalesced/or/index.d.ts +1 -1
  94. package/agnostic/html/hyper-json/smart-tags/coalesced/pickrandom/index.d.ts +1 -1
  95. package/agnostic/html/hyper-json/smart-tags/coalesced/populate/index.d.ts +1 -1
  96. package/agnostic/html/hyper-json/smart-tags/coalesced/populate/index.js +1 -0
  97. package/agnostic/html/hyper-json/smart-tags/coalesced/print/index.d.ts +1 -1
  98. package/agnostic/html/hyper-json/smart-tags/coalesced/print/index.js +2 -0
  99. package/agnostic/html/hyper-json/smart-tags/coalesced/push/index.d.ts +1 -1
  100. package/agnostic/html/hyper-json/smart-tags/coalesced/pusheach/index.d.ts +1 -1
  101. package/agnostic/html/hyper-json/smart-tags/coalesced/pusheach/index.js +1 -0
  102. package/agnostic/html/hyper-json/smart-tags/coalesced/recordtoarray/index.d.ts +1 -1
  103. package/agnostic/html/hyper-json/smart-tags/coalesced/removeattribute/index.js +3 -0
  104. package/agnostic/html/hyper-json/smart-tags/coalesced/removeclass/index.js +1 -0
  105. package/agnostic/html/hyper-json/smart-tags/coalesced/renameproperty/index.d.ts +1 -1
  106. package/agnostic/html/hyper-json/smart-tags/coalesced/renameproperty/index.js +1 -0
  107. package/agnostic/html/hyper-json/smart-tags/coalesced/replace/index.d.ts +1 -1
  108. package/agnostic/html/hyper-json/smart-tags/coalesced/replace/index.js +1 -0
  109. package/agnostic/html/hyper-json/smart-tags/coalesced/select/index.js +1 -0
  110. package/agnostic/html/hyper-json/smart-tags/coalesced/set/index.d.ts +1 -1
  111. package/agnostic/html/hyper-json/smart-tags/coalesced/set/index.js +1 -0
  112. package/agnostic/html/hyper-json/smart-tags/coalesced/setattribute/index.js +3 -0
  113. package/agnostic/html/hyper-json/smart-tags/coalesced/setproperty/index.d.ts +1 -1
  114. package/agnostic/html/hyper-json/smart-tags/coalesced/setproperty/index.js +4 -2
  115. package/agnostic/html/hyper-json/smart-tags/coalesced/sorton/index.d.ts +1 -1
  116. package/agnostic/html/hyper-json/smart-tags/coalesced/sorton/index.js +5 -0
  117. package/agnostic/html/hyper-json/smart-tags/coalesced/spread/index.d.ts +1 -1
  118. package/agnostic/html/hyper-json/smart-tags/coalesced/spread/index.js +1 -0
  119. package/agnostic/html/hyper-json/smart-tags/coalesced/toarray/index.d.ts +1 -1
  120. package/agnostic/html/hyper-json/smart-tags/coalesced/toboolean/index.d.ts +1 -1
  121. package/agnostic/html/hyper-json/smart-tags/coalesced/toelement/index.d.ts +1 -1
  122. package/agnostic/html/hyper-json/smart-tags/coalesced/toggleclass/index.js +3 -2
  123. package/agnostic/html/hyper-json/smart-tags/coalesced/tonodelist/index.d.ts +1 -1
  124. package/agnostic/html/hyper-json/smart-tags/coalesced/tonull/index.d.ts +1 -1
  125. package/agnostic/html/hyper-json/smart-tags/coalesced/tonumber/index.d.ts +1 -1
  126. package/agnostic/html/hyper-json/smart-tags/coalesced/torecord/index.d.ts +1 -1
  127. package/agnostic/html/hyper-json/smart-tags/coalesced/toref/index.d.ts +1 -1
  128. package/agnostic/html/hyper-json/smart-tags/coalesced/tostring/index.d.ts +1 -1
  129. package/agnostic/html/hyper-json/smart-tags/coalesced/totext/index.d.ts +1 -1
  130. package/agnostic/html/hyper-json/smart-tags/coalesced/transformselected/index.d.ts +1 -1
  131. package/agnostic/html/hyper-json/smart-tags/coalesced/trim/index.js +1 -1
  132. package/agnostic/html/hyper-json/smart-tags/index.d.ts +1 -1
  133. package/agnostic/html/hyper-json/smart-tags/isolated/any/index.d.ts +1 -1
  134. package/agnostic/html/hyper-json/smart-tags/isolated/array/index.d.ts +1 -1
  135. package/agnostic/html/hyper-json/smart-tags/isolated/get/index.d.ts +1 -1
  136. package/agnostic/html/hyper-json/smart-tags/isolated/guess/index.d.ts +1 -1
  137. package/agnostic/html/hyper-json/smart-tags/isolated/guess/index.js +3 -1
  138. package/agnostic/html/hyper-json/smart-tags/isolated/index.d.ts +1 -1
  139. package/agnostic/html/hyper-json/smart-tags/isolated/index.js +1 -1
  140. package/agnostic/html/hyper-json/smart-tags/isolated/nodelist/index.d.ts +1 -1
  141. package/agnostic/html/hyper-json/smart-tags/isolated/nodelist/index.js +1 -0
  142. package/agnostic/html/hyper-json/smart-tags/isolated/null/index.d.ts +1 -1
  143. package/agnostic/html/hyper-json/smart-tags/isolated/record/index.d.ts +1 -1
  144. package/agnostic/html/hyper-json/smart-tags/isolated/ref/index.d.ts +1 -1
  145. package/agnostic/html/hyper-json/smart-tags/isolated/ref/index.js +3 -1
  146. package/agnostic/html/hyper-json/smart-tags/isolated/text/index.js +2 -2
  147. package/agnostic/html/hyper-json/transformer/index.d.ts +5 -5
  148. package/agnostic/html/hyper-json/tree/index.d.ts +1 -1
  149. package/agnostic/html/hyper-json/tree/index.js +14 -8
  150. package/agnostic/html/hyper-json/types/index.d.ts +11 -11
  151. package/agnostic/html/hyper-json/utils/index.d.ts +3 -3
  152. package/agnostic/html/hyper-json/utils/index.js +8 -3
  153. package/agnostic/html/index.d.ts +1 -1
  154. package/agnostic/html/index.js +1 -1
  155. package/agnostic/html/insert-node/index.d.ts +4 -4
  156. package/agnostic/html/insert-node/index.js +4 -4
  157. package/agnostic/html/replace-in-element/index.d.ts +3 -3
  158. package/agnostic/html/replace-in-element/index.js +4 -4
  159. package/agnostic/html/selector-to-element/index.d.ts +2 -2
  160. package/agnostic/html/selector-to-element/index.js +11 -11
  161. package/agnostic/html/string-to-nodes/index.d.ts +3 -3
  162. package/agnostic/html/string-to-nodes/index.js +3 -3
  163. package/agnostic/html/watch-selection/index.d.ts +4 -5
  164. package/agnostic/html/watch-selection/index.js +5 -6
  165. package/agnostic/misc/assert/index.js +3 -1
  166. package/agnostic/misc/cast/index.d.ts +16 -16
  167. package/agnostic/misc/cast/index.js +18 -18
  168. package/agnostic/misc/connection/index.d.ts +5 -5
  169. package/agnostic/misc/connection/index.js +4 -2
  170. package/agnostic/misc/crawler/index.d.ts +18 -18
  171. package/agnostic/misc/crawler/index.js +10 -9
  172. package/agnostic/misc/crawler/index.test.js +2 -2
  173. package/agnostic/misc/crossenv/detect-runtime/index.d.ts +1 -1
  174. package/agnostic/misc/crossenv/detect-runtime/index.js +10 -11
  175. package/agnostic/misc/crossenv/window/index.d.ts +6 -6
  176. package/agnostic/misc/crossenv/window/index.js +6 -5
  177. package/agnostic/misc/data-size/index.js +2 -0
  178. package/agnostic/misc/index.d.ts +3 -3
  179. package/agnostic/misc/index.js +3 -3
  180. package/agnostic/misc/is-constructor-function/index.d.ts +2 -2
  181. package/agnostic/misc/is-constructor-function/index.js +3 -2
  182. package/agnostic/misc/is-constructor-function/index.test.js +2 -2
  183. package/agnostic/misc/is-nullish/index.d.ts +5 -5
  184. package/agnostic/misc/is-nullish/index.js +5 -4
  185. package/agnostic/misc/logs/index.d.ts +1 -1
  186. package/agnostic/misc/logs/index.js +1 -1
  187. package/agnostic/misc/logs/logger/index.js +2 -2
  188. package/agnostic/misc/lorem-ipsum/index.js +4 -4
  189. package/agnostic/misc/normalize-extension/index.d.ts +3 -3
  190. package/agnostic/misc/normalize-extension/index.js +4 -4
  191. package/agnostic/misc/outcome/index.d.ts +14 -14
  192. package/agnostic/misc/outcome/index.js +6 -4
  193. package/agnostic/numbers/absolute-modulo/index.d.ts +3 -3
  194. package/agnostic/numbers/absolute-modulo/index.js +3 -3
  195. package/agnostic/numbers/approximate-rational/index.d.ts +6 -6
  196. package/agnostic/numbers/approximate-rational/index.js +9 -9
  197. package/agnostic/numbers/clamp/index.d.ts +4 -4
  198. package/agnostic/numbers/clamp/index.js +4 -4
  199. package/agnostic/numbers/geometric-progressions/index.d.ts +5 -5
  200. package/agnostic/numbers/geometric-progressions/index.js +7 -5
  201. package/agnostic/numbers/geometric-progressions/index.test.js +2 -2
  202. package/agnostic/numbers/index.d.ts +1 -1
  203. package/agnostic/numbers/index.js +1 -1
  204. package/agnostic/numbers/interpolate/index.d.ts +8 -8
  205. package/agnostic/numbers/interpolate/index.js +8 -8
  206. package/agnostic/numbers/round/index.d.ts +9 -9
  207. package/agnostic/numbers/round/index.js +9 -9
  208. package/agnostic/objects/deep-get-property/index.d.ts +4 -4
  209. package/agnostic/objects/deep-get-property/index.js +3 -3
  210. package/agnostic/objects/enums/is-in-enum/index.d.ts +3 -3
  211. package/agnostic/objects/enums/is-in-enum/index.js +3 -3
  212. package/agnostic/objects/flatten-getters/index.d.ts +2 -2
  213. package/agnostic/objects/flatten-getters/index.js +3 -2
  214. package/agnostic/objects/index.d.ts +1 -1
  215. package/agnostic/objects/index.js +1 -1
  216. package/agnostic/objects/is-object/index.d.ts +4 -4
  217. package/agnostic/objects/is-object/index.js +4 -4
  218. package/agnostic/objects/is-record/index.d.ts +2 -2
  219. package/agnostic/objects/is-record/index.js +2 -2
  220. package/agnostic/objects/record-format/index.d.ts +9 -9
  221. package/agnostic/objects/record-format/index.js +8 -3
  222. package/agnostic/objects/record-map/index.d.ts +4 -4
  223. package/agnostic/objects/record-map/index.js +5 -3
  224. package/agnostic/objects/sort-keys/index.d.ts +3 -3
  225. package/agnostic/objects/sort-keys/index.js +4 -3
  226. package/agnostic/objects/validation/index.d.ts +3 -3
  227. package/agnostic/objects/validation/index.js +4 -3
  228. package/agnostic/optim/memoize/index.d.ts +2 -2
  229. package/agnostic/optim/memoize/index.js +4 -2
  230. package/agnostic/optim/throttle-debounce/index.d.ts +2 -2
  231. package/agnostic/optim/throttle-debounce/index.js +7 -6
  232. package/agnostic/optim/throttle-debounce/types.d.ts +2 -1
  233. package/agnostic/random/random/index.d.ts +7 -8
  234. package/agnostic/random/random/index.js +3 -3
  235. package/agnostic/random/uuid/index.d.ts +6 -6
  236. package/agnostic/random/uuid/index.js +6 -6
  237. package/agnostic/regexps/index.d.ts +30 -60
  238. package/agnostic/regexps/index.js +27 -26
  239. package/agnostic/sanitization/file-name/index.d.ts +3 -3
  240. package/agnostic/sanitization/file-name/index.js +10 -10
  241. package/agnostic/sanitization/html/index.d.ts +6 -6
  242. package/agnostic/sanitization/html/index.js +9 -6
  243. package/agnostic/sanitization/path/index.d.ts +2 -2
  244. package/agnostic/sanitization/path/index.js +2 -2
  245. package/agnostic/sanitization/user-input/index.js +1 -0
  246. package/agnostic/strings/char-codes/index.js +2 -6
  247. package/agnostic/strings/index.d.ts +1 -1
  248. package/agnostic/strings/index.js +1 -1
  249. package/agnostic/strings/normalize-indent/index.js +2 -2
  250. package/agnostic/strings/parse-table/index.d.ts +13 -13
  251. package/agnostic/strings/parse-table/index.js +31 -16
  252. package/agnostic/strings/replace-all/index.d.ts +1 -1
  253. package/agnostic/strings/replace-all/index.js +1 -0
  254. package/agnostic/strings/to-alphanum/index.js +2 -2
  255. package/agnostic/strings/trim/index.js +2 -2
  256. package/agnostic/time/dates/format-date/index.js +3 -1
  257. package/agnostic/time/dates/index.d.ts +1 -0
  258. package/agnostic/time/dates/index.js +1 -0
  259. package/agnostic/time/dates/to-french-republican/index.d.ts +16 -0
  260. package/agnostic/time/dates/to-french-republican/index.js +82 -0
  261. package/agnostic/time/dates/to-french-republican/index.test.d.ts +1 -0
  262. package/agnostic/time/dates/to-french-republican/index.test.js +112 -0
  263. package/agnostic/time/dates/to-french-republican/types.d.ts +91 -0
  264. package/agnostic/time/dates/to-french-republican/types.js +47 -0
  265. package/agnostic/time/dates/to-french-republican/utils.d.ts +32 -0
  266. package/agnostic/time/dates/to-french-republican/utils.js +155 -0
  267. package/agnostic/time/duration/index.js +2 -0
  268. package/agnostic/time/index.d.ts +2 -2
  269. package/agnostic/time/index.js +2 -2
  270. package/agnostic/time/timeout/index.js +9 -9
  271. package/agnostic/time/transitions/index.js +8 -7
  272. package/components/BeforeAfter/index.controlled.js +1 -0
  273. package/components/BeforeAfter/index.js +4 -0
  274. package/components/Button/index.d.ts +2 -7
  275. package/components/Button/index.js +2 -2
  276. package/components/Clippable/index.js +1 -0
  277. package/components/Drawer/index.js +1 -1
  278. package/components/Gallery/index.js +2 -1
  279. package/components/Gallery/utils.js +5 -1
  280. package/components/Iframe/index.d.ts +16 -34
  281. package/components/Iframe/index.js +70 -27
  282. package/components/Image/index.js +2 -0
  283. package/components/Input/index.controlled.d.ts +42 -0
  284. package/components/Input/index.controlled.js +54 -0
  285. package/components/Input/index.d.ts +21 -17
  286. package/components/Input/index.js +27 -18
  287. package/components/IntersectionObserver/index.js +5 -2
  288. package/components/JsonEditor/index.js +1 -1
  289. package/components/Overlayer/index.d.ts +1 -1
  290. package/components/ScrollListener/utils.d.ts +29 -0
  291. package/components/Select/index.controlled.d.ts +43 -0
  292. package/components/Select/index.controlled.js +54 -0
  293. package/components/Select/index.d.ts +22 -18
  294. package/components/Select/index.js +27 -18
  295. package/components/Sequencer/index.controlled.js +1 -1
  296. package/components/Subtitles/index.js +3 -1
  297. package/components/Subtitles/types.d.ts +14 -0
  298. package/components/Subtitles/utils.d.ts +19 -15
  299. package/components/Subtitles/utils.js +29 -24
  300. package/components/Textarea/index.controlled.d.ts +50 -0
  301. package/components/Textarea/index.controlled.js +75 -0
  302. package/components/Textarea/index.d.ts +22 -17
  303. package/components/Textarea/index.js +27 -18
  304. package/components/UIModule/index.js +3 -1
  305. package/components/Video/index.controlled.d.ts +1 -1
  306. package/components/Video/index.controlled.js +11 -10
  307. package/components/Video/index.js +27 -20
  308. package/components/Video/utils.d.ts +1 -1
  309. package/components/Video/utils.js +11 -2
  310. package/components/index.d.ts +1 -1
  311. package/components/index.js +1 -1
  312. package/components/utils/types.d.ts +5 -0
  313. package/node/@aws-s3/storage/directory/copy-dir/index.d.ts +9 -9
  314. package/node/@aws-s3/storage/directory/copy-dir/index.js +15 -12
  315. package/node/@aws-s3/storage/directory/index.d.ts +1 -1
  316. package/node/@aws-s3/storage/directory/index.js +1 -1
  317. package/node/@aws-s3/storage/directory/list/index.d.ts +5 -5
  318. package/node/@aws-s3/storage/directory/list/index.js +5 -5
  319. package/node/@aws-s3/storage/directory/move-dir/index.d.ts +6 -6
  320. package/node/@aws-s3/storage/directory/move-dir/index.js +11 -7
  321. package/node/@aws-s3/storage/directory/remove-dir/index.d.ts +5 -5
  322. package/node/@aws-s3/storage/directory/remove-dir/index.js +5 -5
  323. package/node/@aws-s3/storage/file/copy/index.d.ts +8 -8
  324. package/node/@aws-s3/storage/file/copy/index.js +12 -9
  325. package/node/@aws-s3/storage/file/download/index.d.ts +6 -6
  326. package/node/@aws-s3/storage/file/download/index.js +6 -5
  327. package/node/@aws-s3/storage/file/exists/index.d.ts +6 -6
  328. package/node/@aws-s3/storage/file/exists/index.js +15 -12
  329. package/node/@aws-s3/storage/file/index.d.ts +1 -1
  330. package/node/@aws-s3/storage/file/index.js +1 -1
  331. package/node/@aws-s3/storage/file/move/index.d.ts +9 -9
  332. package/node/@aws-s3/storage/file/move/index.js +18 -15
  333. package/node/@aws-s3/storage/file/remove/index.d.ts +5 -5
  334. package/node/@aws-s3/storage/file/remove/index.js +16 -11
  335. package/node/@aws-s3/storage/file/stat/index.d.ts +5 -5
  336. package/node/@aws-s3/storage/file/stat/index.js +10 -7
  337. package/node/@aws-s3/storage/file/upload/index.d.ts +7 -7
  338. package/node/@aws-s3/storage/file/upload/index.js +11 -9
  339. package/node/@express/@multer/index.d.ts +12 -12
  340. package/node/@express/@multer/index.js +27 -25
  341. package/node/@google-cloud/storage/bucket/get-metadata/index.d.ts +4 -4
  342. package/node/@google-cloud/storage/bucket/get-metadata/index.js +3 -3
  343. package/node/@google-cloud/storage/directory/copy-dir/index.d.ts +7 -7
  344. package/node/@google-cloud/storage/directory/copy-dir/index.js +6 -6
  345. package/node/@google-cloud/storage/directory/index.d.ts +1 -1
  346. package/node/@google-cloud/storage/directory/index.js +1 -1
  347. package/node/@google-cloud/storage/directory/list/index.d.ts +6 -6
  348. package/node/@google-cloud/storage/directory/list/index.js +5 -5
  349. package/node/@google-cloud/storage/directory/move-dir/index.d.ts +6 -6
  350. package/node/@google-cloud/storage/directory/move-dir/index.js +5 -5
  351. package/node/@google-cloud/storage/directory/remove-dir/index.d.ts +7 -7
  352. package/node/@google-cloud/storage/directory/remove-dir/index.js +6 -6
  353. package/node/@google-cloud/storage/file/copy/index.d.ts +9 -9
  354. package/node/@google-cloud/storage/file/copy/index.js +8 -8
  355. package/node/@google-cloud/storage/file/download/index.d.ts +7 -7
  356. package/node/@google-cloud/storage/file/download/index.js +5 -5
  357. package/node/@google-cloud/storage/file/exists/index.d.ts +7 -7
  358. package/node/@google-cloud/storage/file/exists/index.js +6 -6
  359. package/node/@google-cloud/storage/file/generate-signed-url/index.d.ts +7 -7
  360. package/node/@google-cloud/storage/file/generate-signed-url/index.js +6 -6
  361. package/node/@google-cloud/storage/file/get-metadata/index.d.ts +5 -5
  362. package/node/@google-cloud/storage/file/get-metadata/index.js +4 -4
  363. package/node/@google-cloud/storage/file/get-permissions/index.d.ts +6 -6
  364. package/node/@google-cloud/storage/file/get-permissions/index.js +4 -4
  365. package/node/@google-cloud/storage/file/index.d.ts +1 -1
  366. package/node/@google-cloud/storage/file/index.js +1 -1
  367. package/node/@google-cloud/storage/file/move/index.d.ts +10 -10
  368. package/node/@google-cloud/storage/file/move/index.js +9 -9
  369. package/node/@google-cloud/storage/file/remove/index.d.ts +5 -5
  370. package/node/@google-cloud/storage/file/remove/index.js +4 -4
  371. package/node/@google-cloud/storage/file/revoke-signed-urls/index.d.ts +5 -5
  372. package/node/@google-cloud/storage/file/revoke-signed-urls/index.js +5 -5
  373. package/node/@google-cloud/storage/file/stat/index.d.ts +5 -5
  374. package/node/@google-cloud/storage/file/stat/index.js +4 -4
  375. package/node/@google-cloud/storage/file/update-metadata/index.d.ts +7 -7
  376. package/node/@google-cloud/storage/file/update-metadata/index.js +5 -5
  377. package/node/@google-cloud/storage/file/upload/index.d.ts +7 -7
  378. package/node/@google-cloud/storage/file/upload/index.js +5 -5
  379. package/node/@google-cloud/storage/index.d.ts +1 -1
  380. package/node/@google-cloud/storage/index.js +1 -1
  381. package/node/cloud-storage/clients/index.d.ts +8 -8
  382. package/node/cloud-storage/clients/index.js +8 -8
  383. package/node/cloud-storage/operations/copy-dir/index.d.ts +22 -22
  384. package/node/cloud-storage/operations/copy-dir/index.js +5 -5
  385. package/node/cloud-storage/operations/copy-file/index.d.ts +22 -22
  386. package/node/cloud-storage/operations/copy-file/index.js +5 -5
  387. package/node/cloud-storage/operations/download-file/index.d.ts +19 -19
  388. package/node/cloud-storage/operations/download-file/index.js +6 -6
  389. package/node/cloud-storage/operations/exists-file/index.d.ts +15 -26
  390. package/node/cloud-storage/operations/exists-file/index.js +4 -4
  391. package/node/cloud-storage/operations/index.d.ts +1 -1
  392. package/node/cloud-storage/operations/index.js +1 -1
  393. package/node/cloud-storage/operations/list-dir/index.d.ts +15 -25
  394. package/node/cloud-storage/operations/list-dir/index.js +4 -4
  395. package/node/cloud-storage/operations/move-dir/index.d.ts +22 -22
  396. package/node/cloud-storage/operations/move-dir/index.js +5 -5
  397. package/node/cloud-storage/operations/move-file/index.d.ts +22 -22
  398. package/node/cloud-storage/operations/move-file/index.js +5 -5
  399. package/node/cloud-storage/operations/remove-dir/index.d.ts +18 -18
  400. package/node/cloud-storage/operations/remove-dir/index.js +4 -4
  401. package/node/cloud-storage/operations/remove-file/index.d.ts +18 -18
  402. package/node/cloud-storage/operations/remove-file/index.js +4 -4
  403. package/node/cloud-storage/operations/stat-file/index.d.ts +16 -16
  404. package/node/cloud-storage/operations/stat-file/index.js +4 -4
  405. package/node/cloud-storage/operations/upload-file/index.d.ts +23 -23
  406. package/node/cloud-storage/operations/upload-file/index.js +5 -5
  407. package/node/encryption/@aes-256-gcm/buffer/index.d.ts +6 -6
  408. package/node/encryption/@aes-256-gcm/buffer/index.js +6 -6
  409. package/node/encryption/@aes-256-gcm/uint8-array/index.d.ts +8 -8
  410. package/node/encryption/@aes-256-gcm/uint8-array/index.js +8 -8
  411. package/node/encryption/key/index.d.ts +6 -6
  412. package/node/encryption/key/index.js +6 -6
  413. package/node/files/read-write/index.d.ts +16 -16
  414. package/node/files/subpaths/index.d.ts +8 -8
  415. package/node/files/subpaths/index.js +11 -13
  416. package/node/ftps/directory/copy-dir/index.d.ts +6 -6
  417. package/node/ftps/directory/copy-dir/index.js +6 -6
  418. package/node/ftps/directory/list/index.d.ts +4 -4
  419. package/node/ftps/directory/list/index.js +3 -3
  420. package/node/ftps/directory/move-dir/index.d.ts +6 -6
  421. package/node/ftps/directory/move-dir/index.js +5 -5
  422. package/node/ftps/directory/remove-dir/index.d.ts +6 -6
  423. package/node/ftps/directory/remove-dir/index.js +8 -7
  424. package/node/ftps/file/copy/index.d.ts +6 -6
  425. package/node/ftps/file/copy/index.js +5 -5
  426. package/node/ftps/file/download/index.d.ts +6 -6
  427. package/node/ftps/file/download/index.js +5 -5
  428. package/node/ftps/file/exists/index.d.ts +3 -3
  429. package/node/ftps/file/exists/index.js +3 -3
  430. package/node/ftps/file/move/index.d.ts +8 -8
  431. package/node/ftps/file/move/index.js +11 -9
  432. package/node/ftps/file/remove/index.d.ts +5 -5
  433. package/node/ftps/file/remove/index.js +4 -4
  434. package/node/ftps/file/stat/index.d.ts +4 -4
  435. package/node/ftps/file/stat/index.js +4 -4
  436. package/node/ftps/file/upload/index.d.ts +7 -7
  437. package/node/ftps/file/upload/index.js +5 -5
  438. package/node/images/create/index.d.ts +2 -2
  439. package/node/images/create/index.js +1 -1
  440. package/node/images/format/index.d.ts +8 -8
  441. package/node/images/metadata/index.d.ts +2 -2
  442. package/node/images/transform/index.d.ts +2 -2
  443. package/node/images/transform/index.js +12 -2
  444. package/node/images/transform/operations/blur/index.d.ts +2 -2
  445. package/node/images/transform/operations/blur/index.js +1 -0
  446. package/node/images/transform/operations/brighten/index.d.ts +2 -2
  447. package/node/images/transform/operations/brighten/index.js +1 -0
  448. package/node/images/transform/operations/extend/index.d.ts +2 -2
  449. package/node/images/transform/operations/extend/index.js +1 -0
  450. package/node/images/transform/operations/extract/index.d.ts +2 -2
  451. package/node/images/transform/operations/extract/index.js +1 -0
  452. package/node/images/transform/operations/flatten/index.d.ts +2 -2
  453. package/node/images/transform/operations/flatten/index.js +1 -0
  454. package/node/images/transform/operations/flip/index.d.ts +2 -2
  455. package/node/images/transform/operations/flip/index.js +1 -0
  456. package/node/images/transform/operations/flop/index.d.ts +2 -2
  457. package/node/images/transform/operations/flop/index.js +1 -0
  458. package/node/images/transform/operations/hue/index.d.ts +2 -2
  459. package/node/images/transform/operations/hue/index.js +1 -0
  460. package/node/images/transform/operations/index.d.ts +1 -1
  461. package/node/images/transform/operations/index.js +1 -1
  462. package/node/images/transform/operations/level/index.d.ts +2 -2
  463. package/node/images/transform/operations/level/index.js +1 -0
  464. package/node/images/transform/operations/lighten/index.d.ts +2 -2
  465. package/node/images/transform/operations/lighten/index.js +1 -0
  466. package/node/images/transform/operations/normalize/index.d.ts +2 -2
  467. package/node/images/transform/operations/normalize/index.js +1 -0
  468. package/node/images/transform/operations/overlay/index.d.ts +2 -2
  469. package/node/images/transform/operations/resize/index.d.ts +2 -2
  470. package/node/images/transform/operations/resize/index.js +1 -0
  471. package/node/images/transform/operations/rotate/index.d.ts +2 -2
  472. package/node/images/transform/operations/rotate/index.js +1 -0
  473. package/node/images/transform/operations/saturate/index.d.ts +2 -2
  474. package/node/images/transform/operations/saturate/index.js +1 -0
  475. package/node/images/types.d.ts +41 -2
  476. package/node/images/utils/index.d.ts +10 -5
  477. package/node/index.d.ts +1 -1
  478. package/node/index.js +1 -1
  479. package/node/process/on-exit/index.js +2 -4
  480. package/node/process/prompt-continue/index.d.ts +3 -3
  481. package/node/process/prompt-continue/index.js +4 -3
  482. package/node/process/spawner/index.js +7 -6
  483. package/node/sftp/directory/copy-dir/index.d.ts +6 -6
  484. package/node/sftp/directory/copy-dir/index.js +6 -6
  485. package/node/sftp/directory/list/index.d.ts +3 -3
  486. package/node/sftp/directory/list/index.js +4 -4
  487. package/node/sftp/directory/move-dir/index.d.ts +7 -7
  488. package/node/sftp/directory/move-dir/index.js +7 -7
  489. package/node/sftp/directory/remove-dir/index.d.ts +5 -5
  490. package/node/sftp/directory/remove-dir/index.js +8 -7
  491. package/node/sftp/file/copy/index.d.ts +6 -6
  492. package/node/sftp/file/copy/index.js +5 -5
  493. package/node/sftp/file/download/index.d.ts +7 -7
  494. package/node/sftp/file/download/index.js +5 -5
  495. package/node/sftp/file/exists/index.d.ts +3 -3
  496. package/node/sftp/file/exists/index.js +3 -3
  497. package/node/sftp/file/move/index.d.ts +7 -7
  498. package/node/sftp/file/move/index.js +7 -7
  499. package/node/sftp/file/remove/index.d.ts +4 -4
  500. package/node/sftp/file/remove/index.js +4 -4
  501. package/node/sftp/file/stat/index.d.ts +3 -3
  502. package/node/sftp/file/stat/index.js +6 -5
  503. package/node/sftp/file/upload/index.d.ts +6 -6
  504. package/node/sftp/file/upload/index.js +5 -5
  505. package/package.json +40 -39
@@ -0,0 +1,50 @@
1
+ import { type FunctionComponent, type TextareaHTMLAttributes, type ReactNode } from 'react';
2
+ import type { WithClassName } from '../utils/types.js';
3
+ /**
4
+ * Props for the {@link ControlledTextarea} component.
5
+ *
6
+ * Extends all native {@link TextareaHTMLAttributes} and {@link WithClassName}
7
+ * with optional label, error content, and automatic height adjustment.
8
+ *
9
+ * @property label - Content rendered as an associated `<label>`. When omitted, no label is rendered.
10
+ * @property error - Content rendered as an error message below the textarea. When omitted, no error is rendered.
11
+ * @property autoHeight - When `true`, automatically adjusts the textarea height
12
+ * to fit its content. Defaults to `false`.
13
+ * @property className - Additional class name(s) applied to the textarea element.
14
+ */
15
+ export type Props = TextareaHTMLAttributes<HTMLTextAreaElement> & WithClassName<{
16
+ label?: ReactNode;
17
+ error?: ReactNode;
18
+ autoHeight?: boolean;
19
+ }>;
20
+ /**
21
+ * Controlled textarea field component.
22
+ *
23
+ * Renders a native `<textarea>` element with optional label and error feedback.
24
+ * The textarea value is entirely driven by the provided `value` prop and all
25
+ * native textarea attributes are forwarded to the underlying element.
26
+ *
27
+ * A stable auto-generated `id` is created on mount and used to associate the
28
+ * rendered label through the `htmlFor` attribute.
29
+ *
30
+ * When `autoHeight` is enabled, the textarea height automatically expands or
31
+ * shrinks to match its content.
32
+ *
33
+ * ### CSS elements
34
+ * - `label`
35
+ * - `error`
36
+ *
37
+ * @param props - Component properties.
38
+ * @see {@link Props}
39
+ *
40
+ * @returns A labelled controlled textarea with optional error feedback.
41
+ *
42
+ * @remarks
43
+ * - The component does not manage its own value state.
44
+ * - Consumers are responsible for updating `value` in response to `onChange`.
45
+ * - Additional `className` values are merged with the component public class name
46
+ * and applied to the underlying `<textarea>` element.
47
+ * - When `autoHeight` is enabled, height recalculation occurs whenever the
48
+ * textarea value changes and every 500ms thereafter.
49
+ */
50
+ export declare const ControlledTextarea: FunctionComponent<Props>;
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useLayoutEffect, useRef } from 'react';
3
+ import { clss } from '../../agnostic/css/clss/index.js';
4
+ import { isNotFalsy } from '../../agnostic/booleans/is-falsy/index.js';
5
+ import { randomHash } from '../../agnostic/random/uuid/index.js';
6
+ import { textarea as publicClassName } from '../public-classnames.js';
7
+ import { mergeClassNames } from '../utils/index.js';
8
+ import cssModule from './styles.module.css';
9
+ /**
10
+ * Controlled textarea field component.
11
+ *
12
+ * Renders a native `<textarea>` element with optional label and error feedback.
13
+ * The textarea value is entirely driven by the provided `value` prop and all
14
+ * native textarea attributes are forwarded to the underlying element.
15
+ *
16
+ * A stable auto-generated `id` is created on mount and used to associate the
17
+ * rendered label through the `htmlFor` attribute.
18
+ *
19
+ * When `autoHeight` is enabled, the textarea height automatically expands or
20
+ * shrinks to match its content.
21
+ *
22
+ * ### CSS elements
23
+ * - `label`
24
+ * - `error`
25
+ *
26
+ * @param props - Component properties.
27
+ * @see {@link Props}
28
+ *
29
+ * @returns A labelled controlled textarea with optional error feedback.
30
+ *
31
+ * @remarks
32
+ * - The component does not manage its own value state.
33
+ * - Consumers are responsible for updating `value` in response to `onChange`.
34
+ * - Additional `className` values are merged with the component public class name
35
+ * and applied to the underlying `<textarea>` element.
36
+ * - When `autoHeight` is enabled, height recalculation occurs whenever the
37
+ * textarea value changes and every 500ms thereafter.
38
+ */
39
+ export const ControlledTextarea = ({ label, error, autoHeight = false, value, className, ...rest }) => {
40
+ const [id] = useState(`_${randomHash(12)}`);
41
+ const textareaRef = useRef(null);
42
+ // Handlers
43
+ const adjustHeight = () => {
44
+ const textarea = textareaRef.current;
45
+ if (textarea === null)
46
+ return;
47
+ textarea.style.height = 'auto';
48
+ textarea.style.height = `${textarea.scrollHeight}px`;
49
+ };
50
+ // Fx. dep `authHeight`, `value` - Compute content height
51
+ useLayoutEffect(() => {
52
+ if (!autoHeight)
53
+ return;
54
+ adjustHeight();
55
+ }, [autoHeight, value]);
56
+ // Rendering
57
+ const c = clss(publicClassName, { cssModule });
58
+ const rootClss = mergeClassNames(c(null), className);
59
+ return _jsxs(_Fragment, { children: [isNotFalsy(label) && _jsx("label", { className: c('label'), htmlFor: id, children: label }), _jsx("textarea", { ...rest, ref: textareaRef, className: rootClss, id: id, value: value, onChange: e => {
60
+ const { target } = e;
61
+ rest.onChange?.(e);
62
+ if (value === undefined)
63
+ return;
64
+ if (typeof value === 'number') {
65
+ target.value = `${value}`;
66
+ }
67
+ else if (typeof value === 'string') {
68
+ target.value = value;
69
+ }
70
+ else {
71
+ // value is readonly string[]
72
+ // not supported for <select>; ignore or normalize if needed
73
+ }
74
+ } }), isNotFalsy(error) && _jsx("span", { className: c('error'), children: error })] });
75
+ };
@@ -1,33 +1,38 @@
1
- import { type FunctionComponent, type TextareaHTMLAttributes, type ReactNode } from 'react';
2
- import type { WithClassName } from '../utils/types.js';
1
+ import { type FunctionComponent } from 'react';
2
+ import { type Props as ControlledProps } from './index.controlled.js';
3
3
  /**
4
4
  * Props for the {@link Textarea} component.
5
5
  *
6
- * Extends all native {@link TextareaHTMLAttributes} and {@link WithClassName}
7
- * with optional label and error content.
6
+ * Alias of {@link ControlledProps}.
8
7
  *
9
- * @property label - Content rendered as an associated `<label>`. When omitted, no label is rendered.
10
- * @property error - Content rendered as an error message below the textarea. When omitted, no error is rendered.
11
- * @property className - Additional class name(s) applied to the root element.
8
+ * All native textarea attributes remain available, including `value`,
9
+ * `defaultValue`, and `onChange`, allowing the component to operate
10
+ * in either controlled or hybrid mode.
12
11
  */
13
- export type Props = TextareaHTMLAttributes<HTMLTextAreaElement> & WithClassName<{
14
- label?: ReactNode;
15
- error?: ReactNode;
16
- }>;
12
+ export type Props = ControlledProps;
17
13
  /**
18
- * Textarea field component with optional label and error message.
14
+ * Textarea field component supporting controlled and hybrid usage.
19
15
  *
20
- * Renders a native `<textarea>` element inside a wrapper, with a stable
21
- * auto-generated `id` used to associate the label via `htmlFor`.
22
- * All standard textarea attributes are forwarded to the underlying element.
16
+ * Wraps {@link ControlledTextarea} and automatically manages the textarea
17
+ * value when no `value` prop is provided.
23
18
  *
24
19
  * ### CSS elements
25
20
  * - `label`
26
- * - `textarea`
27
21
  * - `error`
28
22
  *
29
23
  * @param props - Component properties.
30
24
  * @see {@link Props}
31
- * @returns A labelled textarea wrapper with optional error feedback.
25
+ *
26
+ * @returns A labelled textarea with optional internal value management.
27
+ *
28
+ * @remarks
29
+ * - In controlled mode (`value` defined), the textarea value is fully driven
30
+ * by the parent component and internal state is never updated.
31
+ * - In hybrid mode, internal state is initialized from `defaultValue` and
32
+ * subsequently manages value updates itself.
33
+ * - In hybrid mode, the internal value is updated before forwarding the
34
+ * `onChange` callback.
35
+ * - `defaultValue` is only used to initialize internal state and is not
36
+ * forwarded to the underlying controlled component.
32
37
  */
33
38
  export declare const Textarea: FunctionComponent<Props>;
@@ -1,30 +1,39 @@
1
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
- import { clss } from '../../agnostic/css/clss/index.js';
4
- import { isNotFalsy } from '../../agnostic/booleans/is-falsy/index.js';
5
- import { randomHash } from '../../agnostic/random/uuid/index.js';
6
- import { textarea as publicClassName } from '../public-classnames.js';
7
- import { mergeClassNames } from '../utils/index.js';
8
- import cssModule from './styles.module.css';
3
+ import { ControlledTextarea } from './index.controlled.js';
9
4
  /**
10
- * Textarea field component with optional label and error message.
5
+ * Textarea field component supporting controlled and hybrid usage.
11
6
  *
12
- * Renders a native `<textarea>` element inside a wrapper, with a stable
13
- * auto-generated `id` used to associate the label via `htmlFor`.
14
- * All standard textarea attributes are forwarded to the underlying element.
7
+ * Wraps {@link ControlledTextarea} and automatically manages the textarea
8
+ * value when no `value` prop is provided.
15
9
  *
16
10
  * ### CSS elements
17
11
  * - `label`
18
- * - `textarea`
19
12
  * - `error`
20
13
  *
21
14
  * @param props - Component properties.
22
15
  * @see {@link Props}
23
- * @returns A labelled textarea wrapper with optional error feedback.
16
+ *
17
+ * @returns A labelled textarea with optional internal value management.
18
+ *
19
+ * @remarks
20
+ * - In controlled mode (`value` defined), the textarea value is fully driven
21
+ * by the parent component and internal state is never updated.
22
+ * - In hybrid mode, internal state is initialized from `defaultValue` and
23
+ * subsequently manages value updates itself.
24
+ * - In hybrid mode, the internal value is updated before forwarding the
25
+ * `onChange` callback.
26
+ * - `defaultValue` is only used to initialize internal state and is not
27
+ * forwarded to the underlying controlled component.
24
28
  */
25
- export const Textarea = ({ label, error, className, ...rest }) => {
26
- const [id] = useState(`_${randomHash(12)}`);
27
- const c = clss(publicClassName, { cssModule });
28
- const rootClss = mergeClassNames(c(null), className);
29
- return _jsxs(_Fragment, { children: [isNotFalsy(label) && _jsx("label", { className: c('label'), htmlFor: id, children: label }), _jsx("textarea", { ...rest, className: rootClss, id: id }), isNotFalsy(error) && _jsx("span", { className: c('error'), children: error })] });
29
+ export const Textarea = ({ defaultValue, value, onChange, ...rest }) => {
30
+ const isControlled = value !== undefined;
31
+ const [internal, setInternal] = useState(defaultValue ?? '');
32
+ const currentValue = isControlled ? value : internal;
33
+ const handleChange = (e) => {
34
+ if (!isControlled)
35
+ setInternal(e.target.value);
36
+ onChange?.(e);
37
+ };
38
+ return _jsx(ControlledTextarea, { ...rest, value: currentValue, onChange: handleChange });
30
39
  };
@@ -94,6 +94,7 @@ export const UIModule = ({ src, props, stateHandlers, className }) => {
94
94
  }
95
95
  if ('update' in data && typeof data.update !== 'function')
96
96
  return setLoadedModule(errs.updFunc);
97
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- shape fully validated by the checks above
97
98
  const module = data;
98
99
  setLoadedModule(module);
99
100
  try {
@@ -109,7 +110,7 @@ export const UIModule = ({ src, props, stateHandlers, className }) => {
109
110
  : new Error(unknownToString(err));
110
111
  setLoadedModule(e);
111
112
  }
112
- }).catch(err => {
113
+ }).catch((err) => {
113
114
  setLoading(false);
114
115
  setLoadedModule(err instanceof Error ? err : new Error(unknownToString(err)));
115
116
  setModuleTarget(null);
@@ -133,6 +134,7 @@ export const UIModule = ({ src, props, stateHandlers, className }) => {
133
134
  }, [src]);
134
135
  // Fx dep. `loadedModule` - log load errors
135
136
  useEffect(() => {
137
+ // eslint-disable-next-line no-console
136
138
  if (loadedModule instanceof Error)
137
139
  console.error(loadedModule);
138
140
  }, [loadedModule]);
@@ -1,5 +1,5 @@
1
1
  import { type FunctionComponent, type PropsWithChildren, type VideoHTMLAttributes, type ReactEventHandler } from 'react';
2
- import { type WithClassName } from '../utils/types.js';
2
+ import type { WithClassName } from '../utils/types.js';
3
3
  import { type Props as SubsProps } from '../Subtitles/index.js';
4
4
  /**
5
5
  * Describes a single video source.
@@ -54,16 +54,15 @@ export const ControlledVideo = ({ sources, tracks, subtitles, playBtnContent, pa
54
54
  if (videoRef.current === null)
55
55
  return;
56
56
  const video = videoRef.current;
57
- setTotalTime(Number(video.duration));
57
+ setTotalTime(video.duration);
58
58
  intrinsicVideoAttributes.onLoadedMetadata?.(e);
59
59
  }, [intrinsicVideoAttributes.onLoadedMetadata]);
60
60
  const handleOnTimeUpdateEvent = useCallback((e) => {
61
61
  const video = e.currentTarget;
62
- const newTimeMs = secondsToMs(Number(video.currentTime));
62
+ const newTimeMs = secondsToMs(video.currentTime);
63
63
  setCurrentTimeMs(newTimeMs);
64
- if (intrinsicVideoAttributes?.onTimeUpdate !== undefined) {
64
+ if (intrinsicVideoAttributes.onTimeUpdate !== undefined)
65
65
  intrinsicVideoAttributes.onTimeUpdate(e);
66
- }
67
66
  }, [intrinsicVideoAttributes.onTimeUpdate]);
68
67
  const handleOnPlayEvent = useCallback((e) => {
69
68
  /* We must never play a video that has controlled time */
@@ -75,11 +74,11 @@ export const ControlledVideo = ({ sources, tracks, subtitles, playBtnContent, pa
75
74
  }, [isTimeControlled, intrinsicVideoAttributes.onPlay]);
76
75
  // Custom action handlers
77
76
  const handlePlayButtonClick = useCallback((e) => {
78
- const isPlaying = videoRef.current !== null ? Boolean(videoRef.current.paused) : false;
77
+ const isPlaying = videoRef.current !== null ? videoRef.current.paused : false;
79
78
  actionHandlers?.playButtonClick?.(e, isPlaying, videoRef.current);
80
79
  }, [actionHandlers?.playButtonClick]);
81
80
  const handlePauseButtonClick = useCallback((e) => {
82
- const isPlaying = videoRef.current !== null ? Boolean(videoRef.current.paused) : false;
81
+ const isPlaying = videoRef.current !== null ? videoRef.current.paused : false;
83
82
  actionHandlers?.pauseButtonClick?.(e, isPlaying, videoRef.current);
84
83
  }, [actionHandlers?.pauseButtonClick]);
85
84
  const handleLoudButtonClick = useCallback((e) => {
@@ -125,7 +124,7 @@ export const ControlledVideo = ({ sources, tracks, subtitles, playBtnContent, pa
125
124
  'muted': !isLoud,
126
125
  ..._modifiers
127
126
  }), className);
128
- const appliedVolume = volume ?? 0;
127
+ const appliedVolume = volume;
129
128
  const rootAttributes = {
130
129
  'data-play-on': isPlaying ? '' : undefined,
131
130
  'data-play-off': !isPlaying ? '' : undefined,
@@ -151,8 +150,10 @@ export const ControlledVideo = ({ sources, tracks, subtitles, playBtnContent, pa
151
150
  if (Array.isArray(sources)) {
152
151
  if (sources.length === 0)
153
152
  return [];
153
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- first element sampled just above; array is expected to be homogeneous
154
154
  if (typeof sources[0] === 'string')
155
155
  return sources.map(src => ({ src }));
156
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- first element was checked not to be a string just above; array is expected to be homogeneous
156
157
  return sources;
157
158
  }
158
159
  return [];
@@ -165,8 +166,10 @@ export const ControlledVideo = ({ sources, tracks, subtitles, playBtnContent, pa
165
166
  if (Array.isArray(tracks)) {
166
167
  if (tracks.length === 0)
167
168
  return [];
169
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- first element sampled just above; array is expected to be homogeneous
168
170
  if (typeof tracks[0] === 'string')
169
171
  return tracks.map(src => ({ src }));
172
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- first element was checked not to be a string just above; array is expected to be homogeneous
170
173
  return tracks;
171
174
  }
172
175
  return [];
@@ -208,9 +211,7 @@ export const ControlledVideo = ({ sources, tracks, subtitles, playBtnContent, pa
208
211
  }
209
212
  }, [play, isTimeControlled]);
210
213
  useEffect(() => {
211
- if (volume !== undefined) {
212
- forceVolume(videoRef.current, volume);
213
- }
214
+ forceVolume(videoRef.current, volume);
214
215
  }, [volume]);
215
216
  useEffect(() => {
216
217
  if (givenCurrentTimeMs !== undefined && videoRef.current !== null) {
@@ -55,20 +55,20 @@ export const Video = ({ loop, disclaimer, autoPlayWhenVisible, autoPauseWhenHidd
55
55
  }
56
56
  setPlay(true);
57
57
  hasBeenAutoPlayed.current = true;
58
- }, [controlledProps?.onPlay, shouldDisclaimerBeOn]);
58
+ }, [controlledProps.onPlay, shouldDisclaimerBeOn]);
59
59
  const handleOnPauseEvent = useCallback((e) => {
60
60
  setPlay(false);
61
61
  controlledProps.onPause?.(e);
62
- }, [controlledProps?.onPause]);
62
+ }, [controlledProps.onPause]);
63
63
  const handleOnVolumeChangeEvent = useCallback((e) => {
64
- setMute(Boolean(e.currentTarget.muted));
65
- setVolume(Number(e.currentTarget.volume));
64
+ setMute(e.currentTarget.muted);
65
+ setVolume(e.currentTarget.volume);
66
66
  controlledProps.onVolumeChange?.(e);
67
- }, [controlledProps?.onVolumeChange]);
67
+ }, [controlledProps.onVolumeChange]);
68
68
  const handleOnRateChangeEvent = useCallback((e) => {
69
- setPlaybackRate(Number(e.currentTarget.playbackRate));
69
+ setPlaybackRate(e.currentTarget.playbackRate);
70
70
  controlledProps.onRateChange?.(e);
71
- }, [controlledProps?.onRateChange]);
71
+ }, [controlledProps.onRateChange]);
72
72
  const handleOnFullscreenChangeEvent = useCallback((e) => {
73
73
  if (document.fullscreenElement === null || shouldDisclaimerBeOn) {
74
74
  setFullscreen(false);
@@ -77,7 +77,7 @@ export const Video = ({ loop, disclaimer, autoPlayWhenVisible, autoPauseWhenHidd
77
77
  const handleOnLoadedMetadataEvent = useCallback((e) => {
78
78
  muteAttributeWorkaround(e.currentTarget, controlledProps.muted ?? false);
79
79
  controlledProps.onLoadedMetadata?.(e);
80
- }, [controlledProps?.onLoadedMetadata, controlledProps?.muted]);
80
+ }, [controlledProps.onLoadedMetadata, controlledProps.muted]);
81
81
  // User actions
82
82
  const handlePlayButtonClick = useCallback((e, isPlaying, video) => {
83
83
  controlledProps.actionHandlers?.playButtonClick?.(e, isPlaying, video);
@@ -111,20 +111,28 @@ export const Video = ({ loop, disclaimer, autoPlayWhenVisible, autoPauseWhenHidd
111
111
  const onIntersected = useCallback(({ ioEntry }) => {
112
112
  if (ioEntry === undefined)
113
113
  return;
114
- const { isIntersecting = false } = ioEntry;
115
- if (autoPauseWhenHidden === true && !isIntersecting) {
114
+ const { isIntersecting } = ioEntry;
115
+ if (autoPauseWhenHidden === true && !isIntersecting)
116
116
  setPlay(false);
117
- }
118
- if (autoLoudWhenVisible === true && isIntersecting) {
117
+ if (autoLoudWhenVisible === true && isIntersecting)
119
118
  setMute(false);
120
- }
121
- if (autoPlayWhenVisible === true && !shouldDisclaimerBeOn && !hasBeenAutoPlayed.current && isIntersecting) {
119
+ if (autoPlayWhenVisible === true
120
+ && !shouldDisclaimerBeOn
121
+ && !hasBeenAutoPlayed.current
122
+ && isIntersecting)
122
123
  setPlay(true);
123
- }
124
- if (autoMuteWhenHidden === true && !shouldDisclaimerBeOn && !hasBeenAutoPlayed.current && !isIntersecting) {
124
+ if (autoMuteWhenHidden === true
125
+ && !shouldDisclaimerBeOn
126
+ && !hasBeenAutoPlayed.current
127
+ && !isIntersecting)
125
128
  setMute(true);
126
- }
127
- }, [autoPlayWhenVisible, autoPauseWhenHidden, autoMuteWhenHidden, autoLoudWhenVisible, shouldDisclaimerBeOn]);
129
+ }, [
130
+ autoPlayWhenVisible,
131
+ autoPauseWhenHidden,
132
+ autoMuteWhenHidden,
133
+ autoLoudWhenVisible,
134
+ shouldDisclaimerBeOn
135
+ ]);
128
136
  const handleDiclaimerDismiss = useCallback((prevIsOn) => {
129
137
  setIsDisclaimerOn(false);
130
138
  if (controlledProps.autoPlay === true && !hasBeenAutoPlayed.current) {
@@ -133,9 +141,8 @@ export const Video = ({ loop, disclaimer, autoPlayWhenVisible, autoPauseWhenHidd
133
141
  disclaimer?.actionHandlers?.dismissClick?.(prevIsOn);
134
142
  }, [controlledProps.autoPlay, disclaimer?.actionHandlers?.dismissClick]);
135
143
  useEffect(() => {
136
- if (isDisclaimerOn !== shouldDisclaimerBeOn) {
144
+ if (isDisclaimerOn !== shouldDisclaimerBeOn)
137
145
  setIsDisclaimerOn(shouldDisclaimerBeOn);
138
- }
139
146
  }, [isDisclaimerOn, shouldDisclaimerBeOn]);
140
147
  useEffect(() => {
141
148
  if (shouldDisclaimerBeOn) {
@@ -5,7 +5,7 @@ export declare const forceLoud: (video: HTMLVideoElement | null) => void;
5
5
  export declare const forceVolume: (video: HTMLVideoElement | null, volume: number) => void;
6
6
  export declare const forceCurrentTime: (video: HTMLVideoElement | null, time: number, setCurrentTime: Dispatch<SetStateAction<number>>) => void;
7
7
  export declare const forcePlay: (video: HTMLVideoElement | null) => Promise<boolean>;
8
- export declare const forcePause: (video: HTMLVideoElement | null) => Promise<boolean>;
8
+ export declare const forcePause: (video: HTMLVideoElement | null) => boolean;
9
9
  export declare const forcePlaybackRate: (video: HTMLVideoElement | null, rate: number) => void;
10
10
  export declare const forceFullscreen: (video: HTMLVideoElement | null) => Promise<boolean>;
11
11
  export declare const forceExitFullscreen: (video: HTMLVideoElement | null) => Promise<boolean>;
@@ -13,21 +13,25 @@ export const muteAttributeWorkaround = (video, shouldMute) => {
13
13
  export const forceMute = (video) => {
14
14
  if (video === null)
15
15
  return;
16
+ // eslint-disable-next-line no-param-reassign
16
17
  video.muted = true;
17
18
  };
18
19
  export const forceLoud = (video) => {
19
20
  if (video === null)
20
21
  return;
22
+ // eslint-disable-next-line no-param-reassign
21
23
  video.muted = false;
22
24
  };
23
25
  export const forceVolume = (video, volume) => {
24
26
  if (video === null)
25
27
  return;
28
+ // eslint-disable-next-line no-param-reassign
26
29
  video.volume = volume;
27
30
  };
28
31
  export const forceCurrentTime = (video, time, setCurrentTime) => {
29
32
  if (video === null)
30
33
  return;
34
+ // eslint-disable-next-line no-param-reassign
31
35
  video.currentTime = time;
32
36
  setCurrentTime(time);
33
37
  };
@@ -41,11 +45,12 @@ export const forcePlay = async (video) => {
41
45
  return video.paused;
42
46
  }
43
47
  catch (e) {
48
+ // eslint-disable-next-line no-console
44
49
  console.error(e);
45
50
  }
46
51
  return false;
47
52
  };
48
- export const forcePause = async (video) => {
53
+ export const forcePause = (video) => {
49
54
  if (video === null)
50
55
  return false;
51
56
  if (video.paused)
@@ -55,6 +60,7 @@ export const forcePause = async (video) => {
55
60
  return video.paused;
56
61
  }
57
62
  catch (e) {
63
+ // eslint-disable-next-line no-console
58
64
  console.error(e);
59
65
  }
60
66
  return false;
@@ -62,6 +68,7 @@ export const forcePause = async (video) => {
62
68
  export const forcePlaybackRate = (video, rate) => {
63
69
  if (video === null)
64
70
  return;
71
+ // eslint-disable-next-line no-param-reassign
65
72
  video.playbackRate = rate;
66
73
  };
67
74
  export const forceFullscreen = async (video) => {
@@ -72,6 +79,7 @@ export const forceFullscreen = async (video) => {
72
79
  return document.fullscreenElement === video;
73
80
  }
74
81
  catch (e) {
82
+ // eslint-disable-next-line no-console
75
83
  console.error(e);
76
84
  }
77
85
  return false;
@@ -85,6 +93,7 @@ export const forceExitFullscreen = async (video) => {
85
93
  return document.fullscreenElement !== video;
86
94
  }
87
95
  catch (e) {
96
+ // eslint-disable-next-line no-console
88
97
  console.error(e);
89
98
  }
90
99
  return false;
@@ -117,7 +126,7 @@ export function formatTime(ms, format, fps = 25) {
117
126
  const result = Object
118
127
  .keys(tokens)
119
128
  .sort((a, b) => b.length - a.length)
120
- .reduce((acc, t) => acc.replace(new RegExp(t, 'g'), String(tokens[t])), format);
129
+ .reduce((acc, t) => acc.replace(new RegExp(t, 'gv'), String(tokens[t])), format);
121
130
  return result;
122
131
  }
123
132
  export const getTimelineClickProgress = (event, timeline, video) => {
@@ -12,8 +12,8 @@ export * as intersectionObserver from './IntersectionObserver/index.js'
12
12
  export * as jsonEditor from './JsonEditor/index.js'
13
13
  export * as overlayer from './Overlayer/index.js'
14
14
  export * as paginator from './Paginator/index.js'
15
- export * as resizeObserver from './ResizeObserver/index.js'
16
15
  export * as scrllgngn from './Scrllgngn/index.js'
16
+ export * as resizeObserver from './ResizeObserver/index.js'
17
17
  export * as scrollListener from './ScrollListener/index.js'
18
18
  export * as select from './Select/index.js'
19
19
  export * as sequencer from './Sequencer/index.js'
@@ -12,8 +12,8 @@ export * as intersectionObserver from './IntersectionObserver/index.js'
12
12
  export * as jsonEditor from './JsonEditor/index.js'
13
13
  export * as overlayer from './Overlayer/index.js'
14
14
  export * as paginator from './Paginator/index.js'
15
- export * as resizeObserver from './ResizeObserver/index.js'
16
15
  export * as scrllgngn from './Scrllgngn/index.js'
16
+ export * as resizeObserver from './ResizeObserver/index.js'
17
17
  export * as scrollListener from './ScrollListener/index.js'
18
18
  export * as select from './Select/index.js'
19
19
  export * as sequencer from './Sequencer/index.js'
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Extends a type with an optional `className` prop accepting a string or an array of string-or-nullish values.
3
+ *
4
+ * @template T - The base type to extend.
5
+ */
1
6
  export type WithClassName<T extends Record<string, unknown>> = T & {
2
7
  className?: string | Array<string | null | undefined>;
3
8
  };
@@ -12,15 +12,15 @@ export type CopyDirOptions = {
12
12
  * Recursively copies every object under `sourceDir` to the same relative path
13
13
  * beneath `targetDir` in a single S3 bucket (AWS SDK v3).
14
14
  *
15
- * @param {S3Client} client - The v3 S3 client instance.
16
- * @param {string} bucketName - The name of the S3 bucket.
17
- * @param {string} sourceDir - The source directory prefix to copy from.
18
- * @param {string} targetDir - The target directory prefix to copy to.
19
- * @param {CopyDirOptions} [options] - Optional copy‑behaviour configuration.
20
- * @param {Omit<ListObjectsV2CommandInput,'Bucket'|'Prefix'>} [options.listObjectsOptions] - Extra list parameters.
21
- * @param {Omit<CopyObjectCommandInput,'Bucket'|'Key'|'CopySource'>} [options.copyOptions] - Extra copy parameters.
22
- * @param {boolean} [options.overwrite=false] - Whether to overwrite existing files at target.
23
- * @returns {Promise<Outcome.Either<true, string>>}
15
+ * @param client - The v3 S3 client instance.
16
+ * @param bucketName - The name of the S3 bucket.
17
+ * @param sourceDir - The source directory prefix to copy from.
18
+ * @param targetDir - The target directory prefix to copy to.
19
+ * @param [options] - Optional copy‑behaviour configuration.
20
+ * @param [options.listObjectsOptions] - Extra list parameters.
21
+ * @param [options.copyOptions] - Extra copy parameters.
22
+ * @param [options.overwrite=false] - Whether to overwrite existing files at target.
23
+ * @returns
24
24
  * - Success: `Outcome.makeSuccess(true)` if every object is copied.
25
25
  * - Failure: `Outcome.makeFailure(errStr)` on error.
26
26
  */
@@ -1,19 +1,20 @@
1
1
  import { ListObjectsV2Command, CopyObjectCommand, HeadObjectCommand } from '@aws-sdk/client-s3';
2
2
  import * as Outcome from '../../../../../agnostic/misc/outcome/index.js';
3
3
  import { unknownToString } from '../../../../../agnostic/errors/unknown-to-string/index.js';
4
+ import { deepGetProperty } from '../../../../../agnostic/objects/deep-get-property/index.js';
4
5
  /**
5
6
  * Recursively copies every object under `sourceDir` to the same relative path
6
7
  * beneath `targetDir` in a single S3 bucket (AWS SDK v3).
7
8
  *
8
- * @param {S3Client} client - The v3 S3 client instance.
9
- * @param {string} bucketName - The name of the S3 bucket.
10
- * @param {string} sourceDir - The source directory prefix to copy from.
11
- * @param {string} targetDir - The target directory prefix to copy to.
12
- * @param {CopyDirOptions} [options] - Optional copy‑behaviour configuration.
13
- * @param {Omit<ListObjectsV2CommandInput,'Bucket'|'Prefix'>} [options.listObjectsOptions] - Extra list parameters.
14
- * @param {Omit<CopyObjectCommandInput,'Bucket'|'Key'|'CopySource'>} [options.copyOptions] - Extra copy parameters.
15
- * @param {boolean} [options.overwrite=false] - Whether to overwrite existing files at target.
16
- * @returns {Promise<Outcome.Either<true, string>>}
9
+ * @param client - The v3 S3 client instance.
10
+ * @param bucketName - The name of the S3 bucket.
11
+ * @param sourceDir - The source directory prefix to copy from.
12
+ * @param targetDir - The target directory prefix to copy to.
13
+ * @param [options] - Optional copy‑behaviour configuration.
14
+ * @param [options.listObjectsOptions] - Extra list parameters.
15
+ * @param [options.copyOptions] - Extra copy parameters.
16
+ * @param [options.overwrite=false] - Whether to overwrite existing files at target.
17
+ * @returns
17
18
  * - Success: `Outcome.makeSuccess(true)` if every object is copied.
18
19
  * - Failure: `Outcome.makeFailure(errStr)` on error.
19
20
  */
@@ -42,10 +43,12 @@ export async function copyDir(client, bucketName, sourceDir, targetDir, options)
42
43
  continue;
43
44
  }
44
45
  catch (err) {
45
- const code = err?.name ?? err?.$metadata?.httpStatusCode;
46
- if (code !== 'NotFound' && code !== 404) {
46
+ const name = deepGetProperty(err, 'name');
47
+ const httpStatusCode = deepGetProperty(err, '$metadata.httpStatusCode');
48
+ const code = name ?? httpStatusCode;
49
+ // eslint-disable-next-line max-depth
50
+ if (code !== 'NotFound' && code !== 404)
47
51
  return Outcome.makeFailure(unknownToString(err));
48
- }
49
52
  // Not found, proceed with copy
50
53
  }
51
54
  }
@@ -1,4 +1,4 @@
1
1
  export * as copyDir from './copy-dir/index.js'
2
- export * as moveDir from './move-dir/index.js'
3
2
  export * as list from './list/index.js'
3
+ export * as moveDir from './move-dir/index.js'
4
4
  export * as removeDir from './remove-dir/index.js'
@@ -1,4 +1,4 @@
1
1
  export * as copyDir from './copy-dir/index.js'
2
- export * as moveDir from './move-dir/index.js'
3
2
  export * as list from './list/index.js'
3
+ export * as moveDir from './move-dir/index.js'
4
4
  export * as removeDir from './remove-dir/index.js'