@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
@@ -1,33 +1,37 @@
1
- import { type FunctionComponent, type InputHTMLAttributes, 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 Input} component.
5
5
  *
6
- * Extends all native {@link InputHTMLAttributes} 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 input. When omitted, no error is rendered.
11
- * @property className - Additional class name(s) applied to the root element.
8
+ * All native input attributes remain available, including `value`
9
+ * and `onChange`, allowing the component to operate in either
10
+ * controlled or hybrid mode.
12
11
  */
13
- export type Props = InputHTMLAttributes<HTMLInputElement> & WithClassName<{
14
- label?: ReactNode;
15
- error?: ReactNode;
16
- }>;
12
+ export type Props = ControlledProps;
17
13
  /**
18
- * Input field component with optional label and error message.
14
+ * Input field component supporting controlled and hybrid usage.
19
15
  *
20
- * Renders a native `<input>` element inside a wrapper, with a stable
21
- * auto-generated `id` used to associate the label via `htmlFor`.
22
- * All standard input attributes are forwarded to the underlying element.
16
+ * Wraps {@link ControlledInput} and automatically manages the input value
17
+ * when no `value` prop is provided.
23
18
  *
24
19
  * ### CSS elements
25
20
  * - `label`
26
- * - `input`
27
21
  * - `error`
28
22
  *
29
23
  * @param props - Component properties.
30
24
  * @see {@link Props}
31
- * @returns A labelled input wrapper with optional error feedback.
25
+ *
26
+ * @returns A labelled input with optional internal value management.
27
+ *
28
+ * @remarks
29
+ * - When `value` is defined, the component behaves as a controlled component:
30
+ * displayed value updates are entirely driven by the parent component.
31
+ * - When `value` is omitted, the component behaves in hybrid mode:
32
+ * it initializes an internal state from the initial `value` prop and
33
+ * subsequently manages value updates itself.
34
+ * - In hybrid mode, the internal value is updated before forwarding
35
+ * the `onChange` callback.
32
36
  */
33
37
  export declare const Input: 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 { input as publicClassName } from '../public-classnames.js';
7
- import { mergeClassNames } from '../utils/index.js';
8
- import cssModule from './styles.module.css';
3
+ import { ControlledInput } from './index.controlled.js';
9
4
  /**
10
- * Input field component with optional label and error message.
5
+ * Input field component supporting controlled and hybrid usage.
11
6
  *
12
- * Renders a native `<input>` element inside a wrapper, with a stable
13
- * auto-generated `id` used to associate the label via `htmlFor`.
14
- * All standard input attributes are forwarded to the underlying element.
7
+ * Wraps {@link ControlledInput} and automatically manages the input value
8
+ * when no `value` prop is provided.
15
9
  *
16
10
  * ### CSS elements
17
11
  * - `label`
18
- * - `input`
19
12
  * - `error`
20
13
  *
21
14
  * @param props - Component properties.
22
15
  * @see {@link Props}
23
- * @returns A labelled input wrapper with optional error feedback.
16
+ *
17
+ * @returns A labelled input with optional internal value management.
18
+ *
19
+ * @remarks
20
+ * - When `value` is defined, the component behaves as a controlled component:
21
+ * displayed value updates are entirely driven by the parent component.
22
+ * - When `value` is omitted, the component behaves in hybrid mode:
23
+ * it initializes an internal state from the initial `value` prop and
24
+ * subsequently manages value updates itself.
25
+ * - In hybrid mode, the internal value is updated before forwarding
26
+ * the `onChange` callback.
24
27
  */
25
- export const Input = ({ 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("input", { ...rest, className: rootClss, id: id }), isNotFalsy(error) && _jsx("span", { className: c('error'), children: error })] });
28
+ export const Input = (props) => {
29
+ const { value, defaultValue, onChange, ...rest } = props;
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(ControlledInput, { ...rest, value: currentValue, onChange: handleChange });
30
39
  };
@@ -40,8 +40,11 @@ export const IntersectionObserverComponent = ({ onIntersected, root, rootMargin,
40
40
  }, []);
41
41
  useEffect(() => {
42
42
  const rootEl = rootRef.current;
43
- if (rootEl === null)
44
- return console.warn('rootRef.current should not be null');
43
+ if (rootEl === null) {
44
+ // eslint-disable-next-line no-console
45
+ console.warn('rootRef.current should not be null');
46
+ return;
47
+ }
45
48
  const observer = new IntersectionObserver(observation, { root, rootMargin, threshold });
46
49
  observerRef.current = observer;
47
50
  observer.observe(rootEl);
@@ -102,7 +102,7 @@ export const ValueEditor = ({ defaultValue = {}, onChange, path = [] }) => {
102
102
  array: Array.isArray(value),
103
103
  record: !Array.isArray(value) && isNonNullObject(value)
104
104
  });
105
- const pathStringDataAttr = (path ?? []).map(e => e.toString()).join('.');
105
+ const pathStringDataAttr = path.map(e => e.toString()).join('.');
106
106
  return _jsxs("span", { className: valueEditorClss, "data-path": pathStringDataAttr, children: [_jsxs(Select, { className: c('type'), onChange: handleTypeSelectChange, children: [_jsx("option", { value: 'string', selected: typeof value === 'string', children: "string" }), _jsx("option", { value: 'number', selected: typeof value === 'number', children: "number" }), _jsx("option", { value: 'boolean', selected: typeof value === 'boolean', children: "boolean" }), _jsx("option", { value: 'null', selected: value === null, children: "null" }), _jsx("option", { value: 'record', selected: isNonNullObject(value) && !Array.isArray(value), children: "record" }), _jsx("option", { value: 'array', selected: Array.isArray(value), children: "array" })] }), typeof value === 'string' && _jsx(StringEditor, { type: 'textarea', defaultValue: value, onChange: handleStringValueChange }), typeof value === 'number' && _jsx(NumberEditor, { defaultValue: value, onChange: handleNumberValueChange }), typeof value === 'boolean' && _jsx(BooleanEditor, { defaultValue: value, onChange: handleBooleanValueChange }), value === null && _jsx(NullEditor, { defaultValue: value }), isNonNullObject(value) && !Array.isArray(value) && _jsx(RecordEditor, { defaultValue: value, onChange: handleRecordValueChange, path: path }), Array.isArray(value) && _jsx(ArrayEditor, { defaultValue: value, onChange: handleArrayValueChange, path: path })] });
107
107
  };
108
108
  /* * * * * * * * * * * * * * * * *
@@ -1,4 +1,4 @@
1
- import { type FunctionComponent, type PropsWithChildren, type ReactNode } from 'react';
1
+ import type { FunctionComponent, PropsWithChildren, ReactNode } from 'react';
2
2
  import type { WithClassName } from '../utils/types.js';
3
3
  /**
4
4
  * Describes a single overlay positioned over the base content.
@@ -1,4 +1,12 @@
1
1
  import type { RefObject, Dispatch, SetStateAction } from 'react';
2
+ /**
3
+ * Scroll-related measurements for the document and viewport.
4
+ *
5
+ * @property win - Window inner dimensions.
6
+ * @property html - Document root element dimensions.
7
+ * @property scroll - Current scroll position.
8
+ * @property viewport - Current viewport bounds in document coordinates.
9
+ */
2
10
  export type GlobalScrollData = {
3
11
  win: {
4
12
  height: number;
@@ -19,18 +27,39 @@ export type GlobalScrollData = {
19
27
  maxY: number;
20
28
  };
21
29
  };
30
+ /**
31
+ * Position and size of a tracked element relative to the document.
32
+ *
33
+ * @property offsetX - Horizontal offset in pixels.
34
+ * @property offsetY - Vertical offset in pixels.
35
+ * @property width - Element width in pixels.
36
+ * @property height - Element height in pixels.
37
+ */
22
38
  export type LocalScrollData = {
23
39
  offsetX: number;
24
40
  offsetY: number;
25
41
  width: number;
26
42
  height: number;
27
43
  };
44
+ /**
45
+ * Combined scroll state passed to each registered {@link ScrollListener}.
46
+ *
47
+ * @property global - Document-level scroll data.
48
+ * @property local - Element-level position data.
49
+ */
28
50
  export type ScrollState = {
29
51
  global: GlobalScrollData;
30
52
  local: LocalScrollData;
31
53
  };
32
54
  export declare const globalDocumentScrollListener: () => GlobalScrollData;
33
55
  export declare const localElementScrollListener: (div: HTMLDivElement) => LocalScrollData;
56
+ /**
57
+ * An entry registered with the global scroll listener.
58
+ *
59
+ * @property id - Unique identifier for this registration.
60
+ * @property rootRef - Ref to the tracked DOM element.
61
+ * @property setData - State setter to update the component's scroll state.
62
+ */
34
63
  export type RegisterEntry = {
35
64
  id: string;
36
65
  rootRef: RefObject<HTMLDivElement | null>;
@@ -0,0 +1,43 @@
1
+ import { type FunctionComponent, type SelectHTMLAttributes, type ReactNode, type PropsWithChildren } from 'react';
2
+ import type { WithClassName } from '../utils/types.js';
3
+ /**
4
+ * Props for the {@link ControlledSelect} component.
5
+ *
6
+ * Extends all native {@link SelectHTMLAttributes} and {@link WithClassName}
7
+ * with optional label, error content, and option children.
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 select. When omitted, no error is rendered.
11
+ * @property className - Additional class name(s) applied to the select element.
12
+ * @property children - `<option>` or `<optgroup>` elements rendered inside the select.
13
+ */
14
+ export type Props = SelectHTMLAttributes<HTMLSelectElement> & PropsWithChildren<WithClassName<{
15
+ label?: ReactNode;
16
+ error?: ReactNode;
17
+ }>>;
18
+ /**
19
+ * Controlled select field component.
20
+ *
21
+ * Renders a native `<select>` element with optional label and error feedback.
22
+ * The selected value is entirely driven by the provided `value` prop and all
23
+ * native select attributes are forwarded to the underlying element.
24
+ *
25
+ * A stable auto-generated `id` is created on mount and used to associate the
26
+ * rendered label through the `htmlFor` attribute.
27
+ *
28
+ * ### CSS elements
29
+ * - `label`
30
+ * - `error`
31
+ *
32
+ * @param props - Component properties.
33
+ * @see {@link Props}
34
+ *
35
+ * @returns A labelled controlled select with optional error feedback.
36
+ *
37
+ * @remarks
38
+ * - The component does not manage its own selection state.
39
+ * - Consumers are responsible for updating `value` in response to `onChange`.
40
+ * - Additional `className` values are merged with the component public class name
41
+ * and applied to the underlying `<select>` element.
42
+ */
43
+ export declare const ControlledSelect: FunctionComponent<Props>;
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
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 { select as publicClassName } from '../public-classnames.js';
7
+ import { mergeClassNames } from '../utils/index.js';
8
+ import cssModule from './styles.module.css';
9
+ /**
10
+ * Controlled select field component.
11
+ *
12
+ * Renders a native `<select>` element with optional label and error feedback.
13
+ * The selected value is entirely driven by the provided `value` prop and all
14
+ * native select 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
+ * ### CSS elements
20
+ * - `label`
21
+ * - `error`
22
+ *
23
+ * @param props - Component properties.
24
+ * @see {@link Props}
25
+ *
26
+ * @returns A labelled controlled select with optional error feedback.
27
+ *
28
+ * @remarks
29
+ * - The component does not manage its own selection state.
30
+ * - Consumers are responsible for updating `value` in response to `onChange`.
31
+ * - Additional `className` values are merged with the component public class name
32
+ * and applied to the underlying `<select>` element.
33
+ */
34
+ export const ControlledSelect = ({ label, error, value, className, children, ...rest }) => {
35
+ const [id] = useState(`_${randomHash(12)}`);
36
+ const c = clss(publicClassName, { cssModule });
37
+ const rootClss = mergeClassNames(c(null), className);
38
+ return _jsxs(_Fragment, { children: [isNotFalsy(label) && _jsx("label", { className: c('label'), htmlFor: id, children: label }), _jsx("select", { ...rest, className: rootClss, id: id, value: value, onChange: e => {
39
+ const { target } = e;
40
+ rest.onChange?.(e);
41
+ if (value === undefined)
42
+ return;
43
+ if (typeof value === 'number') {
44
+ target.value = `${value}`;
45
+ }
46
+ else if (typeof value === 'string') {
47
+ target.value = value;
48
+ }
49
+ else {
50
+ // value is readonly string[]
51
+ // not supported for <select>; ignore or normalize if needed
52
+ }
53
+ }, children: children }), isNotFalsy(error) && _jsx("span", { className: c('error'), children: error })] });
54
+ };
@@ -1,34 +1,38 @@
1
- import { type FunctionComponent, type SelectHTMLAttributes, type ReactNode, type PropsWithChildren } 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 Select} component.
5
5
  *
6
- * Extends all native {@link SelectHTMLAttributes} and {@link WithClassName}
7
- * with optional label, error content, and option children.
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 select. When omitted, no error is rendered.
11
- * @property className - Additional class name(s) applied to the root element.
12
- * @property children - `<option>` or `<optgroup>` elements rendered inside the select.
8
+ * All native select attributes remain available, including `value`,
9
+ * `defaultValue`, and `onChange`, allowing the component to operate
10
+ * in either controlled or hybrid mode.
13
11
  */
14
- export type Props = SelectHTMLAttributes<HTMLSelectElement> & PropsWithChildren<WithClassName<{
15
- label?: ReactNode;
16
- error?: ReactNode;
17
- }>>;
12
+ export type Props = ControlledProps;
18
13
  /**
19
- * Select field component with optional label and error message.
14
+ * Select field component supporting controlled and hybrid usage.
20
15
  *
21
- * Renders a native `<select>` element inside a wrapper, with a stable
22
- * auto-generated `id` used to associate the label via `htmlFor`.
23
- * All standard select attributes are forwarded to the underlying element.
16
+ * Wraps {@link ControlledSelect} and automatically manages the selected
17
+ * value when no `value` prop is provided.
24
18
  *
25
19
  * ### CSS elements
26
20
  * - `label`
27
- * - `select`
28
21
  * - `error`
29
22
  *
30
23
  * @param props - Component properties.
31
24
  * @see {@link Props}
32
- * @returns A labelled select wrapper with optional error feedback.
25
+ *
26
+ * @returns A labelled select with optional internal selection management.
27
+ *
28
+ * @remarks
29
+ * - In controlled mode (`value` defined), the selected 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 selection 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.
33
37
  */
34
38
  export declare const Select: 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 { select as publicClassName } from '../public-classnames.js';
7
- import { mergeClassNames } from '../utils/index.js';
8
- import cssModule from './styles.module.css';
3
+ import { ControlledSelect } from './index.controlled.js';
9
4
  /**
10
- * Select field component with optional label and error message.
5
+ * Select field component supporting controlled and hybrid usage.
11
6
  *
12
- * Renders a native `<select>` element inside a wrapper, with a stable
13
- * auto-generated `id` used to associate the label via `htmlFor`.
14
- * All standard select attributes are forwarded to the underlying element.
7
+ * Wraps {@link ControlledSelect} and automatically manages the selected
8
+ * value when no `value` prop is provided.
15
9
  *
16
10
  * ### CSS elements
17
11
  * - `label`
18
- * - `select`
19
12
  * - `error`
20
13
  *
21
14
  * @param props - Component properties.
22
15
  * @see {@link Props}
23
- * @returns A labelled select wrapper with optional error feedback.
16
+ *
17
+ * @returns A labelled select with optional internal selection management.
18
+ *
19
+ * @remarks
20
+ * - In controlled mode (`value` defined), the selected 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 selection 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 Select = ({ label, error, className, children, ...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("select", { ...rest, className: rootClss, id: id, children: children }), isNotFalsy(error) && _jsx("span", { className: c('error'), children: error })] });
29
+ export const Select = ({ 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(ControlledSelect, { ...rest, value: currentValue, onChange: handleChange });
30
39
  };
@@ -55,7 +55,7 @@ export const SequencerControlled = ({ step = 0, activateOnStep, _modifiers, _dat
55
55
  ? childPos === step
56
56
  : Array.isArray(thisStepActivateOnStep)
57
57
  ? thisStepActivateOnStep.includes(childPos)
58
- : thisStepActivateOnStep === childPos;
58
+ : false;
59
59
  const isNext = !isPrevious && !isCurrent;
60
60
  const childClss = c('child', {
61
61
  current: isCurrent,
@@ -60,6 +60,7 @@ export const Subtitles = ({ src, srtFileContent, subsGroups, timecodeMs, isEnded
60
60
  setLoadError(error instanceof Error
61
61
  ? error
62
62
  : new Error(unknownToString(error)));
63
+ // eslint-disable-next-line no-console
63
64
  console.error(error);
64
65
  onLoadFailed?.(toError(error));
65
66
  }
@@ -69,6 +70,7 @@ export const Subtitles = ({ src, srtFileContent, subsGroups, timecodeMs, isEnded
69
70
  }, [onLoadFailed, onLoaded]);
70
71
  useEffect(() => {
71
72
  fetchAndParseSubs(src, srtFileContent)
73
+ // eslint-disable-next-line no-console
72
74
  .catch((error) => { console.error(error); });
73
75
  }, [fetchAndParseSubs, src, srtFileContent]);
74
76
  // Rendering
@@ -77,7 +79,7 @@ export const Subtitles = ({ src, srtFileContent, subsGroups, timecodeMs, isEnded
77
79
  loading: isLoading,
78
80
  error: loadError !== null
79
81
  }), className);
80
- const prevSubs = parsedSubs.filter(({ start }) => start != null && start < (timecodeMs ?? 0));
82
+ const prevSubs = parsedSubs.filter(({ start }) => start !== undefined && start < (timecodeMs ?? 0));
81
83
  const lastPrevSub = prevSubs[prevSubs.length - 1];
82
84
  const highestSubId = Math.max(...parsedSubs.map(sub => sub.id));
83
85
  const subsGroupsWithBoundaries = computeSubGroupsWithBoundaries(subsGroups, highestSubId);
@@ -1,9 +1,23 @@
1
+ /**
2
+ * A single parsed subtitle entry from an SRT file.
3
+ *
4
+ * @property id - Sequential subtitle number.
5
+ * @property start - Start time in milliseconds.
6
+ * @property end - End time in milliseconds.
7
+ * @property content - Subtitle text content.
8
+ */
1
9
  export type ParsedSub = {
2
10
  id: number;
3
11
  start?: number;
4
12
  end?: number;
5
13
  content?: string;
6
14
  };
15
+ /**
16
+ * The inclusive ID boundaries of a subtitle group.
17
+ *
18
+ * @property startId - ID of the first subtitle in the group.
19
+ * @property endId - ID of the last subtitle in the group.
20
+ */
7
21
  export type SubGroupBoundaries = {
8
22
  startId: number;
9
23
  endId: number;
@@ -1,28 +1,32 @@
1
1
  import type { ParsedSub, SubGroupBoundaries } from './types.js';
2
2
  /**
3
- * Convertit un timecode au format SRT (hh:mm:ss,ms) en millisecondes.
4
- * @param timecode - Timecode sous forme de chaîne (ex: '00:01:23,456')
5
- * @returns Le temps en millisecondes
3
+ * Converts an SRT timecode (hh:mm:ss,ms) to milliseconds.
4
+ *
5
+ * @param timecode - Timecode string (e.g. '00:01:23,456').
6
+ * @returns The time in milliseconds.
6
7
  */
7
8
  export declare const getTimecodeToMs: (timecode: string) => number;
8
9
  /**
9
- * Parse un texte brut de sous-titres SRT en une liste d'objets ParsedSub.
10
- * @param rawSubs - Sous-titres bruts au format SRT
11
- * @returns Tableau d'objets ParsedSub
10
+ * Parses a raw SRT subtitle text into a list of {@link ParsedSub} objects.
11
+ *
12
+ * @param rawSubs - Raw subtitle content in SRT format.
13
+ * @returns Array of parsed subtitle entries.
12
14
  */
13
15
  export declare const parseSubs: (rawSubs: string) => ParsedSub[];
14
16
  /**
15
- * Calcule les groupes de sous-titres avec leurs bornes (startId, endId).
16
- * @param subsGroups - Tableau d'IDs de fin de groupe
17
- * @param highestSubId - ID le plus élevé des sous-titres
18
- * @returns Tableau de SubGroupBoundaries
17
+ * Computes subtitle groups with their boundaries (startId, endId).
18
+ *
19
+ * @param subsGroups - Array of group-end subtitle IDs.
20
+ * @param highestSubId - Highest subtitle ID in the track.
21
+ * @returns Array of {@link SubGroupBoundaries}.
19
22
  */
20
23
  export declare const computeSubGroupsWithBoundaries: (subsGroups: number[] | undefined, highestSubId: number) => SubGroupBoundaries[];
21
24
  /**
22
- * Retourne le groupe de sous-titres courant selon l'ID du dernier sous-titre précédent et l'état.
23
- * @param subsGroupsWithBoundaries - Tableau des groupes avec bornes
24
- * @param lastPrevSubId - ID du dernier sous-titre précédent
25
- * @param isEnded - Indique si la lecture est terminée
26
- * @returns Le groupe courant ou undefined
25
+ * Returns the current subtitle group based on the last preceding subtitle ID and playback state.
26
+ *
27
+ * @param subsGroupsWithBoundaries - Array of groups with their boundaries.
28
+ * @param lastPrevSubId - ID of the last subtitle that has already passed.
29
+ * @param isEnded - Whether playback has ended.
30
+ * @returns The current group, or `undefined` if none matches.
27
31
  */
28
32
  export declare const getCurrentGroup: (subsGroupsWithBoundaries: SubGroupBoundaries[], lastPrevSubId: number | undefined, isEnded: boolean | undefined) => SubGroupBoundaries | undefined;
@@ -1,7 +1,8 @@
1
1
  /**
2
- * Convertit un timecode au format SRT (hh:mm:ss,ms) en millisecondes.
3
- * @param timecode - Timecode sous forme de chaîne (ex: '00:01:23,456')
4
- * @returns Le temps en millisecondes
2
+ * Converts an SRT timecode (hh:mm:ss,ms) to milliseconds.
3
+ *
4
+ * @param timecode - Timecode string (e.g. '00:01:23,456').
5
+ * @returns The time in milliseconds.
5
6
  */
6
7
  export const getTimecodeToMs = (timecode) => {
7
8
  const [hours = '0', minutes = '0', secondsAndMs = '0,0'] = timecode.split(':');
@@ -13,13 +14,14 @@ export const getTimecodeToMs = (timecode) => {
13
14
  return result;
14
15
  };
15
16
  /**
16
- * Parse un texte brut de sous-titres SRT en une liste d'objets ParsedSub.
17
- * @param rawSubs - Sous-titres bruts au format SRT
18
- * @returns Tableau d'objets ParsedSub
17
+ * Parses a raw SRT subtitle text into a list of {@link ParsedSub} objects.
18
+ *
19
+ * @param rawSubs - Raw subtitle content in SRT format.
20
+ * @returns Array of parsed subtitle entries.
19
21
  */
20
22
  export const parseSubs = (rawSubs) => {
21
- const numberRegex = /^\d+$/;
22
- const timecodeRegex = /^[0-9]+:[0-9]+:[0-9]+,[0-9]+\s*-->\s*[0-9]+:[0-9]+:[0-9]+,[0-9]+$/;
23
+ const numberRegex = /^\d+$/v;
24
+ const timecodeRegex = /^[0-9]+:[0-9]+:[0-9]+,[0-9]+\s*-->\s*[0-9]+:[0-9]+:[0-9]+,[0-9]+$/v;
23
25
  const parsedSubs = [];
24
26
  rawSubs.split('\n').forEach(line => {
25
27
  if (line.trim() === '')
@@ -49,10 +51,10 @@ export const parseSubs = (rawSubs) => {
49
51
  }
50
52
  // content
51
53
  if (lastParsedSub?.id !== undefined
52
- && lastParsedSub?.start !== undefined
53
- && lastParsedSub?.end !== undefined) {
54
- if (lastParsedSub?.content !== undefined) {
55
- lastParsedSub.content += '\n' + line;
54
+ && lastParsedSub.start !== undefined
55
+ && lastParsedSub.end !== undefined) {
56
+ if (lastParsedSub.content !== undefined) {
57
+ lastParsedSub.content += `\n${line}`;
56
58
  return;
57
59
  }
58
60
  lastParsedSub.content = line;
@@ -61,21 +63,23 @@ export const parseSubs = (rawSubs) => {
61
63
  return parsedSubs;
62
64
  };
63
65
  /**
64
- * Calcule les groupes de sous-titres avec leurs bornes (startId, endId).
65
- * @param subsGroups - Tableau d'IDs de fin de groupe
66
- * @param highestSubId - ID le plus élevé des sous-titres
67
- * @returns Tableau de SubGroupBoundaries
66
+ * Computes subtitle groups with their boundaries (startId, endId).
67
+ *
68
+ * @param subsGroups - Array of group-end subtitle IDs.
69
+ * @param highestSubId - Highest subtitle ID in the track.
70
+ * @returns Array of {@link SubGroupBoundaries}.
68
71
  */
69
72
  export const computeSubGroupsWithBoundaries = (subsGroups, highestSubId) => {
70
73
  const fallback = [{ startId: 1, endId: highestSubId }];
71
74
  if (subsGroups === undefined || subsGroups.length === 0)
72
75
  return fallback;
73
76
  const emptySubGroupBoundaries = [];
74
- return subsGroups?.reduce((acc, curr, currIndex) => {
77
+ return subsGroups.reduce((acc, curr, currIndex) => {
75
78
  const lastInAcc = acc[acc.length - 1];
76
79
  const startId = lastInAcc === undefined ? 1 : lastInAcc.endId + 1;
77
80
  const endId = curr;
78
- if (currIndex === (subsGroups?.length ?? 0) - 1 && endId !== highestSubId) {
81
+ if (currIndex === subsGroups.length - 1
82
+ && endId !== highestSubId) {
79
83
  return [
80
84
  ...acc,
81
85
  { startId, endId },
@@ -83,14 +87,15 @@ export const computeSubGroupsWithBoundaries = (subsGroups, highestSubId) => {
83
87
  ];
84
88
  }
85
89
  return [...acc, { startId, endId }];
86
- }, emptySubGroupBoundaries) ?? fallback;
90
+ }, emptySubGroupBoundaries);
87
91
  };
88
92
  /**
89
- * Retourne le groupe de sous-titres courant selon l'ID du dernier sous-titre précédent et l'état.
90
- * @param subsGroupsWithBoundaries - Tableau des groupes avec bornes
91
- * @param lastPrevSubId - ID du dernier sous-titre précédent
92
- * @param isEnded - Indique si la lecture est terminée
93
- * @returns Le groupe courant ou undefined
93
+ * Returns the current subtitle group based on the last preceding subtitle ID and playback state.
94
+ *
95
+ * @param subsGroupsWithBoundaries - Array of groups with their boundaries.
96
+ * @param lastPrevSubId - ID of the last subtitle that has already passed.
97
+ * @param isEnded - Whether playback has ended.
98
+ * @returns The current group, or `undefined` if none matches.
94
99
  */
95
100
  export const getCurrentGroup = (subsGroupsWithBoundaries, lastPrevSubId, isEnded) => {
96
101
  const previousGroups = subsGroupsWithBoundaries.filter(group => group.startId <= (lastPrevSubId ?? 0));