tempest-react-sdk 0.78.0 → 0.80.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 (1603) hide show
  1. package/README.md +6 -6
  2. package/bin/lib/openapi/generate.hostile.test.mjs +45 -4
  3. package/bin/lib/openapi/generate.mjs +303 -88
  4. package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
  5. package/bin/lib/openapi/generate.test.mjs +462 -1
  6. package/bin/lib/openapi/schema-to-zod.mjs +4 -3
  7. package/dist/access/Can.cjs.map +1 -1
  8. package/dist/access/Can.js.map +1 -1
  9. package/dist/access/access-control-context.cjs.map +1 -1
  10. package/dist/access/access-control-context.js.map +1 -1
  11. package/dist/access/create-role-access-control.cjs.map +1 -1
  12. package/dist/access/create-role-access-control.js.map +1 -1
  13. package/dist/access/permissions-from-token.cjs.map +1 -1
  14. package/dist/access/permissions-from-token.js.map +1 -1
  15. package/dist/access/use-can.cjs.map +1 -1
  16. package/dist/access/use-can.js.map +1 -1
  17. package/dist/app/AppProviders.cjs.map +1 -1
  18. package/dist/app/AppProviders.js.map +1 -1
  19. package/dist/audio/audio-bus.cjs.map +1 -1
  20. package/dist/audio/audio-bus.js.map +1 -1
  21. package/dist/audio/audio-output.cjs.map +1 -1
  22. package/dist/audio/audio-output.js.map +1 -1
  23. package/dist/audio/audio-player.cjs.map +1 -1
  24. package/dist/audio/audio-player.js.map +1 -1
  25. package/dist/audio/audio-recorder.cjs.map +1 -1
  26. package/dist/audio/audio-recorder.js.map +1 -1
  27. package/dist/audio/duration.cjs.map +1 -1
  28. package/dist/audio/duration.js.map +1 -1
  29. package/dist/audio/level-meter.cjs.map +1 -1
  30. package/dist/audio/level-meter.js.map +1 -1
  31. package/dist/audio/media-access.cjs.map +1 -1
  32. package/dist/audio/media-access.js.map +1 -1
  33. package/dist/audio/noise-floor.cjs.map +1 -1
  34. package/dist/audio/noise-floor.js.map +1 -1
  35. package/dist/audio/sfx-pool.cjs.map +1 -1
  36. package/dist/audio/sfx-pool.js.map +1 -1
  37. package/dist/audio/use-audio-bus.cjs.map +1 -1
  38. package/dist/audio/use-audio-bus.js.map +1 -1
  39. package/dist/audio/use-audio-recorder.cjs.map +1 -1
  40. package/dist/audio/use-audio-recorder.js.map +1 -1
  41. package/dist/audio/use-audio.cjs.map +1 -1
  42. package/dist/audio/use-audio.js.map +1 -1
  43. package/dist/audio/use-microphone.cjs +1 -1
  44. package/dist/audio/use-microphone.cjs.map +1 -1
  45. package/dist/audio/use-microphone.js +1 -5
  46. package/dist/audio/use-microphone.js.map +1 -1
  47. package/dist/audio/use-sfx-pool.cjs.map +1 -1
  48. package/dist/audio/use-sfx-pool.js.map +1 -1
  49. package/dist/audio/voice-activity.cjs.map +1 -1
  50. package/dist/audio/voice-activity.js.map +1 -1
  51. package/dist/audio/voice-chain-stages.cjs.map +1 -1
  52. package/dist/audio/voice-chain-stages.js.map +1 -1
  53. package/dist/audio/voice-chain.cjs.map +1 -1
  54. package/dist/audio/voice-chain.js.map +1 -1
  55. package/dist/audio/wav.cjs.map +1 -1
  56. package/dist/audio/wav.js.map +1 -1
  57. package/dist/auth/AuthGuard.cjs.map +1 -1
  58. package/dist/auth/AuthGuard.js.map +1 -1
  59. package/dist/auth/create-auth-store.cjs.map +1 -1
  60. package/dist/auth/create-auth-store.js.map +1 -1
  61. package/dist/auth/create-tempest-auth.cjs +1 -1
  62. package/dist/auth/create-tempest-auth.cjs.map +1 -1
  63. package/dist/auth/create-tempest-auth.js +1 -3
  64. package/dist/auth/create-tempest-auth.js.map +1 -1
  65. package/dist/auth/jwt.cjs.map +1 -1
  66. package/dist/auth/jwt.js.map +1 -1
  67. package/dist/auth/lazy-with-retry.cjs.map +1 -1
  68. package/dist/auth/lazy-with-retry.js.map +1 -1
  69. package/dist/auth/passkey.cjs.map +1 -1
  70. package/dist/auth/passkey.js.map +1 -1
  71. package/dist/auth/refresh-queue.cjs.map +1 -1
  72. package/dist/auth/refresh-queue.js.map +1 -1
  73. package/dist/auth/use-passkey.cjs +1 -1
  74. package/dist/auth/use-passkey.cjs.map +1 -1
  75. package/dist/auth/use-passkey.js +1 -1
  76. package/dist/auth/use-passkey.js.map +1 -1
  77. package/dist/br/BrazilMap.cjs.map +1 -1
  78. package/dist/br/BrazilMap.js.map +1 -1
  79. package/dist/br/BrazilMap.module.cjs.map +1 -1
  80. package/dist/br/BrazilMap.module.js.map +1 -1
  81. package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
  82. package/dist/br/BrazilStateCitySelect.js.map +1 -1
  83. package/dist/br/BrazilStateMap.cjs.map +1 -1
  84. package/dist/br/BrazilStateMap.js.map +1 -1
  85. package/dist/br/MapLegend.cjs.map +1 -1
  86. package/dist/br/MapLegend.js.map +1 -1
  87. package/dist/br/MapLegend.module.cjs.map +1 -1
  88. package/dist/br/MapLegend.module.js.map +1 -1
  89. package/dist/br/MapMarkers.cjs.map +1 -1
  90. package/dist/br/MapMarkers.js.map +1 -1
  91. package/dist/br/MapTooltip.cjs.map +1 -1
  92. package/dist/br/MapTooltip.js.map +1 -1
  93. package/dist/br/MunicipalitySearch.cjs +1 -1
  94. package/dist/br/MunicipalitySearch.cjs.map +1 -1
  95. package/dist/br/MunicipalitySearch.js +2 -5
  96. package/dist/br/MunicipalitySearch.js.map +1 -1
  97. package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
  98. package/dist/br/MunicipalitySearch.module.js.map +1 -1
  99. package/dist/br/PixQRCode.cjs.map +1 -1
  100. package/dist/br/PixQRCode.js.map +1 -1
  101. package/dist/br/PixQRCode.module.cjs.map +1 -1
  102. package/dist/br/PixQRCode.module.js.map +1 -1
  103. package/dist/br/boleto.cjs.map +1 -1
  104. package/dist/br/boleto.js.map +1 -1
  105. package/dist/br/br-geo.cjs.map +1 -1
  106. package/dist/br/br-geo.js.map +1 -1
  107. package/dist/br/data/br-centroids.cjs.map +1 -1
  108. package/dist/br/data/br-centroids.js.map +1 -1
  109. package/dist/br/data/br-locations.cjs.map +1 -1
  110. package/dist/br/data/br-locations.js.map +1 -1
  111. package/dist/br/data/br-uf-geo.cjs.map +1 -1
  112. package/dist/br/data/br-uf-geo.js.map +1 -1
  113. package/dist/br/data/mun/AC.cjs.map +1 -1
  114. package/dist/br/data/mun/AC.js.map +1 -1
  115. package/dist/br/data/mun/AL.cjs.map +1 -1
  116. package/dist/br/data/mun/AL.js.map +1 -1
  117. package/dist/br/data/mun/AM.cjs.map +1 -1
  118. package/dist/br/data/mun/AM.js.map +1 -1
  119. package/dist/br/data/mun/AP.cjs.map +1 -1
  120. package/dist/br/data/mun/AP.js.map +1 -1
  121. package/dist/br/data/mun/BA.cjs.map +1 -1
  122. package/dist/br/data/mun/BA.js.map +1 -1
  123. package/dist/br/data/mun/CE.cjs.map +1 -1
  124. package/dist/br/data/mun/CE.js.map +1 -1
  125. package/dist/br/data/mun/DF.cjs.map +1 -1
  126. package/dist/br/data/mun/DF.js.map +1 -1
  127. package/dist/br/data/mun/ES.cjs.map +1 -1
  128. package/dist/br/data/mun/ES.js.map +1 -1
  129. package/dist/br/data/mun/GO.cjs.map +1 -1
  130. package/dist/br/data/mun/GO.js.map +1 -1
  131. package/dist/br/data/mun/MA.cjs.map +1 -1
  132. package/dist/br/data/mun/MA.js.map +1 -1
  133. package/dist/br/data/mun/MG.cjs.map +1 -1
  134. package/dist/br/data/mun/MG.js.map +1 -1
  135. package/dist/br/data/mun/MS.cjs.map +1 -1
  136. package/dist/br/data/mun/MS.js.map +1 -1
  137. package/dist/br/data/mun/MT.cjs.map +1 -1
  138. package/dist/br/data/mun/MT.js.map +1 -1
  139. package/dist/br/data/mun/PA.cjs.map +1 -1
  140. package/dist/br/data/mun/PA.js.map +1 -1
  141. package/dist/br/data/mun/PB.cjs.map +1 -1
  142. package/dist/br/data/mun/PB.js.map +1 -1
  143. package/dist/br/data/mun/PE.cjs.map +1 -1
  144. package/dist/br/data/mun/PE.js.map +1 -1
  145. package/dist/br/data/mun/PI.cjs.map +1 -1
  146. package/dist/br/data/mun/PI.js.map +1 -1
  147. package/dist/br/data/mun/PR.cjs.map +1 -1
  148. package/dist/br/data/mun/PR.js.map +1 -1
  149. package/dist/br/data/mun/RJ.cjs.map +1 -1
  150. package/dist/br/data/mun/RJ.js.map +1 -1
  151. package/dist/br/data/mun/RN.cjs.map +1 -1
  152. package/dist/br/data/mun/RN.js.map +1 -1
  153. package/dist/br/data/mun/RO.cjs.map +1 -1
  154. package/dist/br/data/mun/RO.js.map +1 -1
  155. package/dist/br/data/mun/RR.cjs.map +1 -1
  156. package/dist/br/data/mun/RR.js.map +1 -1
  157. package/dist/br/data/mun/RS.cjs.map +1 -1
  158. package/dist/br/data/mun/RS.js.map +1 -1
  159. package/dist/br/data/mun/SC.cjs.map +1 -1
  160. package/dist/br/data/mun/SC.js.map +1 -1
  161. package/dist/br/data/mun/SE.cjs.map +1 -1
  162. package/dist/br/data/mun/SE.js.map +1 -1
  163. package/dist/br/data/mun/SP.cjs.map +1 -1
  164. package/dist/br/data/mun/SP.js.map +1 -1
  165. package/dist/br/data/mun/TO.cjs.map +1 -1
  166. package/dist/br/data/mun/TO.js.map +1 -1
  167. package/dist/br/geocode.cjs.map +1 -1
  168. package/dist/br/geocode.js.map +1 -1
  169. package/dist/br/holidays.cjs.map +1 -1
  170. package/dist/br/holidays.js.map +1 -1
  171. package/dist/br/locations.cjs.map +1 -1
  172. package/dist/br/locations.js.map +1 -1
  173. package/dist/br/nfe.cjs.map +1 -1
  174. package/dist/br/nfe.js.map +1 -1
  175. package/dist/br/pix.cjs +1 -1
  176. package/dist/br/pix.cjs.map +1 -1
  177. package/dist/br/pix.js +108 -74
  178. package/dist/br/pix.js.map +1 -1
  179. package/dist/br/regions.cjs.map +1 -1
  180. package/dist/br/regions.js.map +1 -1
  181. package/dist/br/scales.cjs.map +1 -1
  182. package/dist/br/scales.js.map +1 -1
  183. package/dist/br/state-geo.cjs.map +1 -1
  184. package/dist/br/state-geo.js.map +1 -1
  185. package/dist/br/svg-utils.cjs.map +1 -1
  186. package/dist/br/svg-utils.js.map +1 -1
  187. package/dist/br/use-map-hover.cjs.map +1 -1
  188. package/dist/br/use-map-hover.js.map +1 -1
  189. package/dist/br/use-map-zoom.cjs.map +1 -1
  190. package/dist/br/use-map-zoom.js.map +1 -1
  191. package/dist/br/whatsapp.cjs.map +1 -1
  192. package/dist/br/whatsapp.js.map +1 -1
  193. package/dist/br.cjs.map +1 -1
  194. package/dist/br.d.ts +6 -2
  195. package/dist/br.js.map +1 -1
  196. package/dist/capture/barcode.cjs.map +1 -1
  197. package/dist/capture/barcode.js.map +1 -1
  198. package/dist/capture/media-recorder.cjs.map +1 -1
  199. package/dist/capture/media-recorder.js.map +1 -1
  200. package/dist/capture/use-barcode-scanner.cjs.map +1 -1
  201. package/dist/capture/use-barcode-scanner.js.map +1 -1
  202. package/dist/capture/use-screen-capture.cjs +1 -1
  203. package/dist/capture/use-screen-capture.cjs.map +1 -1
  204. package/dist/capture/use-screen-capture.js +1 -7
  205. package/dist/capture/use-screen-capture.js.map +1 -1
  206. package/dist/capture/use-speech-recognition.cjs +1 -1
  207. package/dist/capture/use-speech-recognition.cjs.map +1 -1
  208. package/dist/capture/use-speech-recognition.js +35 -36
  209. package/dist/capture/use-speech-recognition.js.map +1 -1
  210. package/dist/capture/use-torch.cjs.map +1 -1
  211. package/dist/capture/use-torch.js.map +1 -1
  212. package/dist/capture/use-video-recorder.cjs.map +1 -1
  213. package/dist/capture/use-video-recorder.js.map +1 -1
  214. package/dist/capture/video-recorder.cjs.map +1 -1
  215. package/dist/capture/video-recorder.js.map +1 -1
  216. package/dist/charts/AreaChart.cjs.map +1 -1
  217. package/dist/charts/AreaChart.js.map +1 -1
  218. package/dist/charts/BarChart.cjs.map +1 -1
  219. package/dist/charts/BarChart.js.map +1 -1
  220. package/dist/charts/LineChart.cjs.map +1 -1
  221. package/dist/charts/LineChart.js.map +1 -1
  222. package/dist/charts/PieChart.cjs.map +1 -1
  223. package/dist/charts/PieChart.js.map +1 -1
  224. package/dist/charts/RadarChart.cjs.map +1 -1
  225. package/dist/charts/RadarChart.js.map +1 -1
  226. package/dist/charts/palette.cjs.map +1 -1
  227. package/dist/charts/palette.js.map +1 -1
  228. package/dist/charts/scales.cjs.map +1 -1
  229. package/dist/charts/scales.js.map +1 -1
  230. package/dist/charts/types.cjs.map +1 -1
  231. package/dist/charts/types.js.map +1 -1
  232. package/dist/charts/use-chart-colors.cjs.map +1 -1
  233. package/dist/charts/use-chart-colors.js.map +1 -1
  234. package/dist/components/AIChat/AIChat.cjs +1 -1
  235. package/dist/components/AIChat/AIChat.cjs.map +1 -1
  236. package/dist/components/AIChat/AIChat.js +1 -5
  237. package/dist/components/AIChat/AIChat.js.map +1 -1
  238. package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
  239. package/dist/components/AIChat/AIChat.module.js.map +1 -1
  240. package/dist/components/AIChat/AIChatComposer.cjs +1 -1
  241. package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
  242. package/dist/components/AIChat/AIChatComposer.js +1 -7
  243. package/dist/components/AIChat/AIChatComposer.js.map +1 -1
  244. package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
  245. package/dist/components/AIChat/AIChatTurn.js.map +1 -1
  246. package/dist/components/AIChat/ai-chat-turns.cjs.map +1 -1
  247. package/dist/components/AIChat/ai-chat-turns.js.map +1 -1
  248. package/dist/components/Accordion/Accordion.cjs.map +1 -1
  249. package/dist/components/Accordion/Accordion.js.map +1 -1
  250. package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
  251. package/dist/components/Accordion/Accordion.module.js.map +1 -1
  252. package/dist/components/Alert/Alert.cjs.map +1 -1
  253. package/dist/components/Alert/Alert.js.map +1 -1
  254. package/dist/components/Alert/Alert.module.cjs.map +1 -1
  255. package/dist/components/Alert/Alert.module.js.map +1 -1
  256. package/dist/components/AppBar/AppBar.cjs.map +1 -1
  257. package/dist/components/AppBar/AppBar.js.map +1 -1
  258. package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
  259. package/dist/components/AppBar/AppBar.module.js.map +1 -1
  260. package/dist/components/AppBar/use-sticky-body-warning.cjs +1 -1
  261. package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
  262. package/dist/components/AppBar/use-sticky-body-warning.js +1 -1
  263. package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
  264. package/dist/components/AppShell/AppShell.cjs.map +1 -1
  265. package/dist/components/AppShell/AppShell.js.map +1 -1
  266. package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
  267. package/dist/components/AppShell/AppShell.module.js.map +1 -1
  268. package/dist/components/AspectRatio/AspectRatio.cjs.map +1 -1
  269. package/dist/components/AspectRatio/AspectRatio.js.map +1 -1
  270. package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
  271. package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
  272. package/dist/components/AudioPlayer/AudioPlayer.cjs +1 -1
  273. package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
  274. package/dist/components/AudioPlayer/AudioPlayer.js +1 -7
  275. package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
  276. package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
  277. package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
  278. package/dist/components/AudioRecorder/AudioRecorder.cjs +1 -1
  279. package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
  280. package/dist/components/AudioRecorder/AudioRecorder.js +16 -21
  281. package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
  282. package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
  283. package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
  284. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  285. package/dist/components/Avatar/Avatar.js.map +1 -1
  286. package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
  287. package/dist/components/Avatar/Avatar.module.js.map +1 -1
  288. package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
  289. package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
  290. package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
  291. package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
  292. package/dist/components/Badge/Badge.cjs.map +1 -1
  293. package/dist/components/Badge/Badge.js.map +1 -1
  294. package/dist/components/Badge/Badge.module.cjs.map +1 -1
  295. package/dist/components/Badge/Badge.module.js.map +1 -1
  296. package/dist/components/Banner/Banner.cjs.map +1 -1
  297. package/dist/components/Banner/Banner.js.map +1 -1
  298. package/dist/components/Banner/Banner.module.cjs.map +1 -1
  299. package/dist/components/Banner/Banner.module.js.map +1 -1
  300. package/dist/components/BarList/BarList.cjs.map +1 -1
  301. package/dist/components/BarList/BarList.js.map +1 -1
  302. package/dist/components/BarList/BarList.module.cjs.map +1 -1
  303. package/dist/components/BarList/BarList.module.js.map +1 -1
  304. package/dist/components/BarList/bar-list-model.cjs.map +1 -1
  305. package/dist/components/BarList/bar-list-model.js.map +1 -1
  306. package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
  307. package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
  308. package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
  309. package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
  310. package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
  311. package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
  312. package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
  313. package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
  314. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  315. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  316. package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
  317. package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
  318. package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
  319. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  320. package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
  321. package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
  322. package/dist/components/Button/Button.cjs.map +1 -1
  323. package/dist/components/Button/Button.js.map +1 -1
  324. package/dist/components/Button/Button.module.cjs.map +1 -1
  325. package/dist/components/Button/Button.module.js.map +1 -1
  326. package/dist/components/Button/ButtonContent.cjs.map +1 -1
  327. package/dist/components/Button/ButtonContent.js.map +1 -1
  328. package/dist/components/Button/ButtonSlot.cjs.map +1 -1
  329. package/dist/components/Button/ButtonSlot.js.map +1 -1
  330. package/dist/components/Button/button-class.cjs.map +1 -1
  331. package/dist/components/Button/button-class.js.map +1 -1
  332. package/dist/components/Button/link-rel.cjs.map +1 -1
  333. package/dist/components/Button/link-rel.js.map +1 -1
  334. package/dist/components/Button/slot.cjs.map +1 -1
  335. package/dist/components/Button/slot.js.map +1 -1
  336. package/dist/components/Calendar/Calendar.cjs.map +1 -1
  337. package/dist/components/Calendar/Calendar.js.map +1 -1
  338. package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
  339. package/dist/components/Calendar/Calendar.module.js.map +1 -1
  340. package/dist/components/Card/Card.cjs.map +1 -1
  341. package/dist/components/Card/Card.js.map +1 -1
  342. package/dist/components/Card/Card.module.cjs.map +1 -1
  343. package/dist/components/Card/Card.module.js.map +1 -1
  344. package/dist/components/Carousel/Carousel.cjs.map +1 -1
  345. package/dist/components/Carousel/Carousel.js.map +1 -1
  346. package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
  347. package/dist/components/Carousel/Carousel.module.js.map +1 -1
  348. package/dist/components/Center/Center.cjs.map +1 -1
  349. package/dist/components/Center/Center.js.map +1 -1
  350. package/dist/components/Center/Center.module.cjs.map +1 -1
  351. package/dist/components/Center/Center.module.js.map +1 -1
  352. package/dist/components/Chat/Chat.cjs.map +1 -1
  353. package/dist/components/Chat/Chat.js.map +1 -1
  354. package/dist/components/Chat/Chat.module.cjs.map +1 -1
  355. package/dist/components/Chat/Chat.module.js.map +1 -1
  356. package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -1
  357. package/dist/components/Chat/ChatActionsMenu.js.map +1 -1
  358. package/dist/components/Chat/ChatAttachments.cjs.map +1 -1
  359. package/dist/components/Chat/ChatAttachments.js.map +1 -1
  360. package/dist/components/Chat/ChatBubble.cjs.map +1 -1
  361. package/dist/components/Chat/ChatBubble.js.map +1 -1
  362. package/dist/components/Chat/ChatComposer.cjs.map +1 -1
  363. package/dist/components/Chat/ChatComposer.js.map +1 -1
  364. package/dist/components/Chat/chat-groups.cjs +1 -1
  365. package/dist/components/Chat/chat-groups.cjs.map +1 -1
  366. package/dist/components/Chat/chat-groups.js +2 -6
  367. package/dist/components/Chat/chat-groups.js.map +1 -1
  368. package/dist/components/Chat/chat-receipt.cjs.map +1 -1
  369. package/dist/components/Chat/chat-receipt.js.map +1 -1
  370. package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
  371. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  372. package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
  373. package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
  374. package/dist/components/ChipInput/ChipInput.cjs +1 -1
  375. package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
  376. package/dist/components/ChipInput/ChipInput.js +2 -12
  377. package/dist/components/ChipInput/ChipInput.js.map +1 -1
  378. package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
  379. package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
  380. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  381. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  382. package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
  383. package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
  384. package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
  385. package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
  386. package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
  387. package/dist/components/CodeBlock/tokenize.js.map +1 -1
  388. package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
  389. package/dist/components/Collapsible/Collapsible.js.map +1 -1
  390. package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
  391. package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
  392. package/dist/components/Combobox/Combobox.cjs.map +1 -1
  393. package/dist/components/Combobox/Combobox.js.map +1 -1
  394. package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
  395. package/dist/components/Combobox/Combobox.module.js.map +1 -1
  396. package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -1
  397. package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -1
  398. package/dist/components/Command/Command.cjs +1 -1
  399. package/dist/components/Command/Command.cjs.map +1 -1
  400. package/dist/components/Command/Command.js +4 -11
  401. package/dist/components/Command/Command.js.map +1 -1
  402. package/dist/components/Command/Command.module.cjs.map +1 -1
  403. package/dist/components/Command/Command.module.js.map +1 -1
  404. package/dist/components/ConditionalWrapper/ConditionalWrapper.cjs.map +1 -1
  405. package/dist/components/ConditionalWrapper/ConditionalWrapper.js.map +1 -1
  406. package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  407. package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
  408. package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
  409. package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
  410. package/dist/components/ContextMenu/ContextMenu.js +1 -1
  411. package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
  412. package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
  413. package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
  414. package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
  415. package/dist/components/CopyButton/CopyButton.js.map +1 -1
  416. package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
  417. package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
  418. package/dist/components/DataList/DataList.cjs.map +1 -1
  419. package/dist/components/DataList/DataList.js.map +1 -1
  420. package/dist/components/DataList/DataList.module.cjs.map +1 -1
  421. package/dist/components/DataList/DataList.module.js.map +1 -1
  422. package/dist/components/DataTable/DataTable.cjs +1 -1
  423. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  424. package/dist/components/DataTable/DataTable.js +6 -14
  425. package/dist/components/DataTable/DataTable.js.map +1 -1
  426. package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
  427. package/dist/components/DataTable/DataTable.module.js.map +1 -1
  428. package/dist/components/DataTable/EditableCell.cjs +1 -1
  429. package/dist/components/DataTable/EditableCell.cjs.map +1 -1
  430. package/dist/components/DataTable/EditableCell.js +1 -9
  431. package/dist/components/DataTable/EditableCell.js.map +1 -1
  432. package/dist/components/DataTable/LoadingRows.cjs.map +1 -1
  433. package/dist/components/DataTable/LoadingRows.js.map +1 -1
  434. package/dist/components/DataTable/edit-labels.cjs.map +1 -1
  435. package/dist/components/DataTable/edit-labels.js.map +1 -1
  436. package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
  437. package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
  438. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  439. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  440. package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
  441. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  442. package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
  443. package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
  444. package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
  445. package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
  446. package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
  447. package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
  448. package/dist/components/Divider/Divider.cjs.map +1 -1
  449. package/dist/components/Divider/Divider.js.map +1 -1
  450. package/dist/components/Divider/Divider.module.cjs.map +1 -1
  451. package/dist/components/Divider/Divider.module.js.map +1 -1
  452. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  453. package/dist/components/Drawer/Drawer.js.map +1 -1
  454. package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
  455. package/dist/components/Drawer/Drawer.module.js.map +1 -1
  456. package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
  457. package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  458. package/dist/components/DropdownMenu/DropdownMenu.js +2 -14
  459. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  460. package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
  461. package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
  462. package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
  463. package/dist/components/Dropzone/Dropzone.js.map +1 -1
  464. package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
  465. package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
  466. package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
  467. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  468. package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
  469. package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
  470. package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
  471. package/dist/components/ErrorState/ErrorState.js.map +1 -1
  472. package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
  473. package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
  474. package/dist/components/ErrorText/ErrorText.cjs.map +1 -1
  475. package/dist/components/ErrorText/ErrorText.js.map +1 -1
  476. package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
  477. package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
  478. package/dist/components/FileUpload/FileUpload.cjs +1 -1
  479. package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
  480. package/dist/components/FileUpload/FileUpload.js +7 -17
  481. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  482. package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
  483. package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
  484. package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
  485. package/dist/components/FilterBar/FilterBar.js.map +1 -1
  486. package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
  487. package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
  488. package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
  489. package/dist/components/FilterBar/filter-apply.js.map +1 -1
  490. package/dist/components/FilterBar/filter-model.cjs.map +1 -1
  491. package/dist/components/FilterBar/filter-model.js.map +1 -1
  492. package/dist/components/FilterBar/filter-query.cjs +1 -1
  493. package/dist/components/FilterBar/filter-query.cjs.map +1 -1
  494. package/dist/components/FilterBar/filter-query.js +2 -5
  495. package/dist/components/FilterBar/filter-query.js.map +1 -1
  496. package/dist/components/FilterPanel/FilterPanel.cjs.map +1 -1
  497. package/dist/components/FilterPanel/FilterPanel.js.map +1 -1
  498. package/dist/components/FilterPanel/FilterPanel.module.cjs.map +1 -1
  499. package/dist/components/FilterPanel/FilterPanel.module.js.map +1 -1
  500. package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
  501. package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
  502. package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
  503. package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
  504. package/dist/components/For/For.cjs.map +1 -1
  505. package/dist/components/For/For.js.map +1 -1
  506. package/dist/components/Form/Form.cjs.map +1 -1
  507. package/dist/components/Form/Form.js.map +1 -1
  508. package/dist/components/Form/Form.module.cjs.map +1 -1
  509. package/dist/components/Form/Form.module.js.map +1 -1
  510. package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
  511. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  512. package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
  513. package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
  514. package/dist/components/Image/Image.cjs.map +1 -1
  515. package/dist/components/Image/Image.js.map +1 -1
  516. package/dist/components/Image/Image.module.cjs.map +1 -1
  517. package/dist/components/Image/Image.module.js.map +1 -1
  518. package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
  519. package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
  520. package/dist/components/ImageCropper/ImageCropper.js +4 -8
  521. package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
  522. package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
  523. package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
  524. package/dist/components/ImageCropper/crop-geometry.cjs.map +1 -1
  525. package/dist/components/ImageCropper/crop-geometry.js.map +1 -1
  526. package/dist/components/Input/Input.cjs.map +1 -1
  527. package/dist/components/Input/Input.js.map +1 -1
  528. package/dist/components/Input/Input.module.cjs.map +1 -1
  529. package/dist/components/Input/Input.module.js.map +1 -1
  530. package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
  531. package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
  532. package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
  533. package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
  534. package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
  535. package/dist/components/InstallButton/InstallButton.js.map +1 -1
  536. package/dist/components/InstallButton/InstallButton.module.cjs.map +1 -1
  537. package/dist/components/InstallButton/InstallButton.module.js.map +1 -1
  538. package/dist/components/InstallButton/install-hints.cjs.map +1 -1
  539. package/dist/components/InstallButton/install-hints.js.map +1 -1
  540. package/dist/components/Kanban/Kanban.cjs.map +1 -1
  541. package/dist/components/Kanban/Kanban.js.map +1 -1
  542. package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
  543. package/dist/components/Kanban/Kanban.module.js.map +1 -1
  544. package/dist/components/Kbd/Kbd.cjs.map +1 -1
  545. package/dist/components/Kbd/Kbd.js.map +1 -1
  546. package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
  547. package/dist/components/Kbd/Kbd.module.js.map +1 -1
  548. package/dist/components/Label/Label.cjs.map +1 -1
  549. package/dist/components/Label/Label.js.map +1 -1
  550. package/dist/components/Label/Label.module.cjs.map +1 -1
  551. package/dist/components/Label/Label.module.js.map +1 -1
  552. package/dist/components/Layout/Layout.cjs.map +1 -1
  553. package/dist/components/Layout/Layout.js.map +1 -1
  554. package/dist/components/Layout/Layout.module.cjs.map +1 -1
  555. package/dist/components/Layout/Layout.module.js.map +1 -1
  556. package/dist/components/Lightbox/Lightbox.cjs +1 -1
  557. package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
  558. package/dist/components/Lightbox/Lightbox.js +1 -1
  559. package/dist/components/Lightbox/Lightbox.js.map +1 -1
  560. package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
  561. package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
  562. package/dist/components/ListTile/ListTile.cjs.map +1 -1
  563. package/dist/components/ListTile/ListTile.js.map +1 -1
  564. package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
  565. package/dist/components/ListTile/ListTile.module.js.map +1 -1
  566. package/dist/components/Markdown/Markdown.cjs.map +1 -1
  567. package/dist/components/Markdown/Markdown.js.map +1 -1
  568. package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
  569. package/dist/components/Markdown/Markdown.module.js.map +1 -1
  570. package/dist/components/Markdown/markdown-parse.cjs +2 -2
  571. package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
  572. package/dist/components/Markdown/markdown-parse.js +8 -27
  573. package/dist/components/Markdown/markdown-parse.js.map +1 -1
  574. package/dist/components/Masonry/Masonry.cjs.map +1 -1
  575. package/dist/components/Masonry/Masonry.js.map +1 -1
  576. package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
  577. package/dist/components/Masonry/Masonry.module.js.map +1 -1
  578. package/dist/components/Masonry/masonry-layout.cjs.map +1 -1
  579. package/dist/components/Masonry/masonry-layout.js.map +1 -1
  580. package/dist/components/Menubar/Menubar.cjs.map +1 -1
  581. package/dist/components/Menubar/Menubar.js.map +1 -1
  582. package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
  583. package/dist/components/Menubar/Menubar.module.js.map +1 -1
  584. package/dist/components/Modal/Modal.cjs.map +1 -1
  585. package/dist/components/Modal/Modal.js.map +1 -1
  586. package/dist/components/Modal/Modal.module.cjs.map +1 -1
  587. package/dist/components/Modal/Modal.module.js.map +1 -1
  588. package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
  589. package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
  590. package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
  591. package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
  592. package/dist/components/Money/Money.cjs.map +1 -1
  593. package/dist/components/Money/Money.js.map +1 -1
  594. package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
  595. package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
  596. package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
  597. package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
  598. package/dist/components/NProgress/NProgress.cjs.map +1 -1
  599. package/dist/components/NProgress/NProgress.js.map +1 -1
  600. package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
  601. package/dist/components/NProgress/NProgress.module.js.map +1 -1
  602. package/dist/components/Navbar/Navbar.cjs.map +1 -1
  603. package/dist/components/Navbar/Navbar.js.map +1 -1
  604. package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
  605. package/dist/components/Navbar/Navbar.module.js.map +1 -1
  606. package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
  607. package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
  608. package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
  609. package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
  610. package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
  611. package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
  612. package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
  613. package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
  614. package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
  615. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
  616. package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
  617. package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
  618. package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
  619. package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -1
  620. package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
  621. package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
  622. package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
  623. package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
  624. package/dist/components/Page/Page.cjs.map +1 -1
  625. package/dist/components/Page/Page.js.map +1 -1
  626. package/dist/components/Page/Page.module.cjs.map +1 -1
  627. package/dist/components/Page/Page.module.js.map +1 -1
  628. package/dist/components/Pagination/Pagination.cjs.map +1 -1
  629. package/dist/components/Pagination/Pagination.js.map +1 -1
  630. package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
  631. package/dist/components/Pagination/Pagination.module.js.map +1 -1
  632. package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
  633. package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
  634. package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
  635. package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
  636. package/dist/components/PinInput/PinInput.cjs.map +1 -1
  637. package/dist/components/PinInput/PinInput.js.map +1 -1
  638. package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
  639. package/dist/components/PinInput/PinInput.module.js.map +1 -1
  640. package/dist/components/Popover/Popover.cjs.map +1 -1
  641. package/dist/components/Popover/Popover.js.map +1 -1
  642. package/dist/components/Popover/Popover.module.cjs.map +1 -1
  643. package/dist/components/Popover/Popover.module.js.map +1 -1
  644. package/dist/components/Portal/Portal.cjs.map +1 -1
  645. package/dist/components/Portal/Portal.js.map +1 -1
  646. package/dist/components/Portal/anchor-position.cjs.map +1 -1
  647. package/dist/components/Portal/anchor-position.js.map +1 -1
  648. package/dist/components/Portal/escape-layer.cjs.map +1 -1
  649. package/dist/components/Portal/escape-layer.js.map +1 -1
  650. package/dist/components/Portal/portal-host.cjs.map +1 -1
  651. package/dist/components/Portal/portal-host.js.map +1 -1
  652. package/dist/components/Portal/tab-bridge.cjs +1 -1
  653. package/dist/components/Portal/tab-bridge.cjs.map +1 -1
  654. package/dist/components/Portal/tab-bridge.js +1 -5
  655. package/dist/components/Portal/tab-bridge.js.map +1 -1
  656. package/dist/components/Progress/Progress.cjs.map +1 -1
  657. package/dist/components/Progress/Progress.js.map +1 -1
  658. package/dist/components/Progress/Progress.module.cjs.map +1 -1
  659. package/dist/components/Progress/Progress.module.js.map +1 -1
  660. package/dist/components/QRCode/QRCode.cjs.map +1 -1
  661. package/dist/components/QRCode/QRCode.js.map +1 -1
  662. package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
  663. package/dist/components/QRCode/QRCode.module.js.map +1 -1
  664. package/dist/components/QRCode/qr-encode.cjs +1 -1
  665. package/dist/components/QRCode/qr-encode.cjs.map +1 -1
  666. package/dist/components/QRCode/qr-encode.js +7 -13
  667. package/dist/components/QRCode/qr-encode.js.map +1 -1
  668. package/dist/components/QRCode/qr-tables.cjs.map +1 -1
  669. package/dist/components/QRCode/qr-tables.js.map +1 -1
  670. package/dist/components/Radio/Radio.cjs.map +1 -1
  671. package/dist/components/Radio/Radio.js.map +1 -1
  672. package/dist/components/Radio/Radio.module.cjs.map +1 -1
  673. package/dist/components/Radio/Radio.module.js.map +1 -1
  674. package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
  675. package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
  676. package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
  677. package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
  678. package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
  679. package/dist/components/RatingStars/RatingStars.js.map +1 -1
  680. package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
  681. package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
  682. package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
  683. package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
  684. package/dist/components/RefreshIndicator/RefreshIndicator.js +10 -18
  685. package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
  686. package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
  687. package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
  688. package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
  689. package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
  690. package/dist/components/Resizable/Resizable.cjs +1 -1
  691. package/dist/components/Resizable/Resizable.cjs.map +1 -1
  692. package/dist/components/Resizable/Resizable.js +1 -9
  693. package/dist/components/Resizable/Resizable.js.map +1 -1
  694. package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
  695. package/dist/components/Resizable/Resizable.module.js.map +1 -1
  696. package/dist/components/Responsive/Responsive.cjs.map +1 -1
  697. package/dist/components/Responsive/Responsive.js.map +1 -1
  698. package/dist/components/Reveal/Reveal.cjs.map +1 -1
  699. package/dist/components/Reveal/Reveal.js.map +1 -1
  700. package/dist/components/Reveal/Reveal.module.cjs.map +1 -1
  701. package/dist/components/Reveal/Reveal.module.js.map +1 -1
  702. package/dist/components/Reveal/reveal-threshold.cjs.map +1 -1
  703. package/dist/components/Reveal/reveal-threshold.js.map +1 -1
  704. package/dist/components/SafeArea/SafeArea.cjs.map +1 -1
  705. package/dist/components/SafeArea/SafeArea.js.map +1 -1
  706. package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
  707. package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
  708. package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
  709. package/dist/components/Scheduler/Scheduler.js.map +1 -1
  710. package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
  711. package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
  712. package/dist/components/Scheduler/scheduler-layout.cjs.map +1 -1
  713. package/dist/components/Scheduler/scheduler-layout.js.map +1 -1
  714. package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
  715. package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
  716. package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
  717. package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
  718. package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
  719. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  720. package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
  721. package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
  722. package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -1
  723. package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
  724. package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -1
  725. package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -1
  726. package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
  727. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  728. package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
  729. package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
  730. package/dist/components/Select/CaretIcon.cjs.map +1 -1
  731. package/dist/components/Select/CaretIcon.js.map +1 -1
  732. package/dist/components/Select/Select.cjs.map +1 -1
  733. package/dist/components/Select/Select.js.map +1 -1
  734. package/dist/components/Select/Select.module.cjs.map +1 -1
  735. package/dist/components/Select/Select.module.js.map +1 -1
  736. package/dist/components/Select/options.cjs.map +1 -1
  737. package/dist/components/Select/options.js.map +1 -1
  738. package/dist/components/Sidebar/Sidebar.cjs +1 -1
  739. package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
  740. package/dist/components/Sidebar/Sidebar.js +13 -23
  741. package/dist/components/Sidebar/Sidebar.js.map +1 -1
  742. package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
  743. package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
  744. package/dist/components/Sidebar/SidebarEntry.cjs.map +1 -1
  745. package/dist/components/Sidebar/SidebarEntry.js.map +1 -1
  746. package/dist/components/Sidebar/active-nav-key.cjs.map +1 -1
  747. package/dist/components/Sidebar/active-nav-key.js.map +1 -1
  748. package/dist/components/SignaturePad/SignaturePad.cjs +1 -1
  749. package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
  750. package/dist/components/SignaturePad/SignaturePad.js +1 -5
  751. package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
  752. package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
  753. package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
  754. package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
  755. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  756. package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
  757. package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
  758. package/dist/components/Slider/Slider.cjs.map +1 -1
  759. package/dist/components/Slider/Slider.js.map +1 -1
  760. package/dist/components/Slider/Slider.module.cjs.map +1 -1
  761. package/dist/components/Slider/Slider.module.js.map +1 -1
  762. package/dist/components/Spacer/Spacer.cjs.map +1 -1
  763. package/dist/components/Spacer/Spacer.js.map +1 -1
  764. package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
  765. package/dist/components/Spacer/Spacer.module.js.map +1 -1
  766. package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
  767. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  768. package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
  769. package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
  770. package/dist/components/Sparkline/sparkline-geometry.cjs.map +1 -1
  771. package/dist/components/Sparkline/sparkline-geometry.js.map +1 -1
  772. package/dist/components/Spinner/Spinner.cjs.map +1 -1
  773. package/dist/components/Spinner/Spinner.js.map +1 -1
  774. package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
  775. package/dist/components/Spinner/Spinner.module.js.map +1 -1
  776. package/dist/components/Stat/Stat.cjs.map +1 -1
  777. package/dist/components/Stat/Stat.js.map +1 -1
  778. package/dist/components/Stat/Stat.module.cjs.map +1 -1
  779. package/dist/components/Stat/Stat.module.js.map +1 -1
  780. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  781. package/dist/components/Stepper/Stepper.js.map +1 -1
  782. package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
  783. package/dist/components/Stepper/Stepper.module.js.map +1 -1
  784. package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
  785. package/dist/components/StepperInput/StepperInput.js.map +1 -1
  786. package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
  787. package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
  788. package/dist/components/Switch/Switch.cjs.map +1 -1
  789. package/dist/components/Switch/Switch.js.map +1 -1
  790. package/dist/components/Switch/Switch.module.cjs.map +1 -1
  791. package/dist/components/Switch/Switch.module.js.map +1 -1
  792. package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
  793. package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
  794. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
  795. package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
  796. package/dist/components/Table/Table.cjs.map +1 -1
  797. package/dist/components/Table/Table.js.map +1 -1
  798. package/dist/components/Table/Table.module.cjs.map +1 -1
  799. package/dist/components/Table/Table.module.js.map +1 -1
  800. package/dist/components/Tabs/Tabs.cjs.map +1 -1
  801. package/dist/components/Tabs/Tabs.js.map +1 -1
  802. package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
  803. package/dist/components/Tabs/Tabs.module.js.map +1 -1
  804. package/dist/components/Tag/Tag.cjs.map +1 -1
  805. package/dist/components/Tag/Tag.js.map +1 -1
  806. package/dist/components/Tag/Tag.module.cjs.map +1 -1
  807. package/dist/components/Tag/Tag.module.js.map +1 -1
  808. package/dist/components/Textarea/Textarea.cjs.map +1 -1
  809. package/dist/components/Textarea/Textarea.js.map +1 -1
  810. package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
  811. package/dist/components/Textarea/Textarea.module.js.map +1 -1
  812. package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
  813. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  814. package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
  815. package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
  816. package/dist/components/Timeline/Timeline.cjs.map +1 -1
  817. package/dist/components/Timeline/Timeline.js.map +1 -1
  818. package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
  819. package/dist/components/Timeline/Timeline.module.js.map +1 -1
  820. package/dist/components/Toast/Toast.module.cjs.map +1 -1
  821. package/dist/components/Toast/Toast.module.js.map +1 -1
  822. package/dist/components/Toast/ToastProvider.cjs.map +1 -1
  823. package/dist/components/Toast/ToastProvider.js.map +1 -1
  824. package/dist/components/Toggle/Toggle.cjs.map +1 -1
  825. package/dist/components/Toggle/Toggle.js.map +1 -1
  826. package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
  827. package/dist/components/Toggle/Toggle.module.js.map +1 -1
  828. package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
  829. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  830. package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
  831. package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
  832. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  833. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  834. package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
  835. package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
  836. package/dist/components/Tour/Tour.cjs +1 -1
  837. package/dist/components/Tour/Tour.cjs.map +1 -1
  838. package/dist/components/Tour/Tour.js +1 -5
  839. package/dist/components/Tour/Tour.js.map +1 -1
  840. package/dist/components/Tour/Tour.module.cjs.map +1 -1
  841. package/dist/components/Tour/Tour.module.js.map +1 -1
  842. package/dist/components/Tour/tour-position.cjs.map +1 -1
  843. package/dist/components/Tour/tour-position.js.map +1 -1
  844. package/dist/components/Transfer/Transfer.cjs.map +1 -1
  845. package/dist/components/Transfer/Transfer.js.map +1 -1
  846. package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
  847. package/dist/components/Transfer/Transfer.module.js.map +1 -1
  848. package/dist/components/Transfer/transfer-state.cjs.map +1 -1
  849. package/dist/components/Transfer/transfer-state.js.map +1 -1
  850. package/dist/components/TreeView/TreeView.cjs.map +1 -1
  851. package/dist/components/TreeView/TreeView.js.map +1 -1
  852. package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
  853. package/dist/components/TreeView/TreeView.module.js.map +1 -1
  854. package/dist/components/TruncateText/TruncateText.cjs.map +1 -1
  855. package/dist/components/TruncateText/TruncateText.js.map +1 -1
  856. package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
  857. package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
  858. package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
  859. package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
  860. package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
  861. package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
  862. package/dist/components/VideoPlayer/VideoPlayer.cjs +1 -1
  863. package/dist/components/VideoPlayer/VideoPlayer.cjs.map +1 -1
  864. package/dist/components/VideoPlayer/VideoPlayer.js +1 -7
  865. package/dist/components/VideoPlayer/VideoPlayer.js.map +1 -1
  866. package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
  867. package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
  868. package/dist/components/VideoPlayer/playback-rates.cjs.map +1 -1
  869. package/dist/components/VideoPlayer/playback-rates.js.map +1 -1
  870. package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
  871. package/dist/components/VirtualList/VirtualList.js.map +1 -1
  872. package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
  873. package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
  874. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
  875. package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
  876. package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
  877. package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
  878. package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
  879. package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
  880. package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
  881. package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
  882. package/dist/components/Wizard/Wizard.cjs +1 -1
  883. package/dist/components/Wizard/Wizard.cjs.map +1 -1
  884. package/dist/components/Wizard/Wizard.js +4 -11
  885. package/dist/components/Wizard/Wizard.js.map +1 -1
  886. package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
  887. package/dist/components/Wizard/Wizard.module.js.map +1 -1
  888. package/dist/data/create-data-provider.cjs.map +1 -1
  889. package/dist/data/create-data-provider.js.map +1 -1
  890. package/dist/data/data-provider-context.cjs.map +1 -1
  891. package/dist/data/data-provider-context.js.map +1 -1
  892. package/dist/data/use-resource.cjs.map +1 -1
  893. package/dist/data/use-resource.js.map +1 -1
  894. package/dist/editor/RichTextEditor.cjs.map +1 -1
  895. package/dist/editor/RichTextEditor.js.map +1 -1
  896. package/dist/editor/RichTextEditor.module.cjs.map +1 -1
  897. package/dist/editor/RichTextEditor.module.js.map +1 -1
  898. package/dist/editor.js +1 -2
  899. package/dist/error-boundary/ErrorBoundary.cjs.map +1 -1
  900. package/dist/error-boundary/ErrorBoundary.js.map +1 -1
  901. package/dist/error-boundary/use-error-handler.cjs.map +1 -1
  902. package/dist/error-boundary/use-error-handler.js.map +1 -1
  903. package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
  904. package/dist/feature-flags/FeatureFlagsProvider.js.map +1 -1
  905. package/dist/feature-flags/growthbook-adapter.cjs.map +1 -1
  906. package/dist/feature-flags/growthbook-adapter.js.map +1 -1
  907. package/dist/feature-flags/in-memory-adapter.cjs.map +1 -1
  908. package/dist/feature-flags/in-memory-adapter.js.map +1 -1
  909. package/dist/feature-flags/launchdarkly-adapter.cjs.map +1 -1
  910. package/dist/feature-flags/launchdarkly-adapter.js.map +1 -1
  911. package/dist/forms/FormField.cjs.map +1 -1
  912. package/dist/forms/FormField.js.map +1 -1
  913. package/dist/forms/br-validators.cjs.map +1 -1
  914. package/dist/forms/br-validators.js.map +1 -1
  915. package/dist/forms/masked-inputs.cjs.map +1 -1
  916. package/dist/forms/masked-inputs.js.map +1 -1
  917. package/dist/forms/use-viacep.cjs.map +1 -1
  918. package/dist/forms/use-viacep.js.map +1 -1
  919. package/dist/forms/use-zod-form.cjs.map +1 -1
  920. package/dist/forms/use-zod-form.js.map +1 -1
  921. package/dist/forms/validate-form.cjs.map +1 -1
  922. package/dist/forms/validate-form.js.map +1 -1
  923. package/dist/forms/zod-resolver.cjs.map +1 -1
  924. package/dist/forms/zod-resolver.js.map +1 -1
  925. package/dist/geo/TrajectoryMap.cjs.map +1 -1
  926. package/dist/geo/TrajectoryMap.js.map +1 -1
  927. package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
  928. package/dist/geo/TrajectoryMap.module.js.map +1 -1
  929. package/dist/geo/bounds.cjs.map +1 -1
  930. package/dist/geo/bounds.js.map +1 -1
  931. package/dist/geo/create-position-tracker.cjs +1 -1
  932. package/dist/geo/create-position-tracker.cjs.map +1 -1
  933. package/dist/geo/create-position-tracker.js +1 -7
  934. package/dist/geo/create-position-tracker.js.map +1 -1
  935. package/dist/geo/distance.cjs.map +1 -1
  936. package/dist/geo/distance.js.map +1 -1
  937. package/dist/geo/estimate.cjs.map +1 -1
  938. package/dist/geo/estimate.js.map +1 -1
  939. package/dist/geo/leaflet-map.cjs.map +1 -1
  940. package/dist/geo/leaflet-map.js.map +1 -1
  941. package/dist/geo/projection.cjs.map +1 -1
  942. package/dist/geo/projection.js.map +1 -1
  943. package/dist/geo/routing.cjs.map +1 -1
  944. package/dist/geo/routing.js.map +1 -1
  945. package/dist/geo/types.cjs.map +1 -1
  946. package/dist/geo/types.js.map +1 -1
  947. package/dist/geo/use-position-tracker.cjs.map +1 -1
  948. package/dist/geo/use-position-tracker.js.map +1 -1
  949. package/dist/hooks/pwa-env.cjs.map +1 -1
  950. package/dist/hooks/pwa-env.js.map +1 -1
  951. package/dist/hooks/tab-sequence.cjs.map +1 -1
  952. package/dist/hooks/tab-sequence.js.map +1 -1
  953. package/dist/hooks/use-announce.cjs +1 -1
  954. package/dist/hooks/use-announce.cjs.map +1 -1
  955. package/dist/hooks/use-announce.js +2 -2
  956. package/dist/hooks/use-announce.js.map +1 -1
  957. package/dist/hooks/use-async.cjs.map +1 -1
  958. package/dist/hooks/use-async.js.map +1 -1
  959. package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
  960. package/dist/hooks/use-before-install-prompt.js.map +1 -1
  961. package/dist/hooks/use-breakpoint.cjs.map +1 -1
  962. package/dist/hooks/use-breakpoint.js.map +1 -1
  963. package/dist/hooks/use-click-outside.cjs.map +1 -1
  964. package/dist/hooks/use-click-outside.js.map +1 -1
  965. package/dist/hooks/use-client-filter.cjs.map +1 -1
  966. package/dist/hooks/use-client-filter.js.map +1 -1
  967. package/dist/hooks/use-clipboard.cjs.map +1 -1
  968. package/dist/hooks/use-clipboard.js.map +1 -1
  969. package/dist/hooks/use-countdown.cjs.map +1 -1
  970. package/dist/hooks/use-countdown.js.map +1 -1
  971. package/dist/hooks/use-counter.cjs.map +1 -1
  972. package/dist/hooks/use-counter.js.map +1 -1
  973. package/dist/hooks/use-debounce.cjs.map +1 -1
  974. package/dist/hooks/use-debounce.js.map +1 -1
  975. package/dist/hooks/use-deep-memo.cjs.map +1 -1
  976. package/dist/hooks/use-deep-memo.js.map +1 -1
  977. package/dist/hooks/use-disclosure.cjs.map +1 -1
  978. package/dist/hooks/use-disclosure.js.map +1 -1
  979. package/dist/hooks/use-document-title.cjs.map +1 -1
  980. package/dist/hooks/use-document-title.js.map +1 -1
  981. package/dist/hooks/use-document-visibility.cjs.map +1 -1
  982. package/dist/hooks/use-document-visibility.js.map +1 -1
  983. package/dist/hooks/use-draft-filters.cjs.map +1 -1
  984. package/dist/hooks/use-draft-filters.js.map +1 -1
  985. package/dist/hooks/use-event-listener.cjs.map +1 -1
  986. package/dist/hooks/use-event-listener.js.map +1 -1
  987. package/dist/hooks/use-favicon.cjs.map +1 -1
  988. package/dist/hooks/use-favicon.js.map +1 -1
  989. package/dist/hooks/use-focus-trap.cjs.map +1 -1
  990. package/dist/hooks/use-focus-trap.js.map +1 -1
  991. package/dist/hooks/use-fullscreen-element.cjs.map +1 -1
  992. package/dist/hooks/use-fullscreen-element.js.map +1 -1
  993. package/dist/hooks/use-fullscreen.cjs +1 -1
  994. package/dist/hooks/use-fullscreen.cjs.map +1 -1
  995. package/dist/hooks/use-fullscreen.js +7 -23
  996. package/dist/hooks/use-fullscreen.js.map +1 -1
  997. package/dist/hooks/use-geolocation.cjs.map +1 -1
  998. package/dist/hooks/use-geolocation.js.map +1 -1
  999. package/dist/hooks/use-hover.cjs.map +1 -1
  1000. package/dist/hooks/use-hover.js.map +1 -1
  1001. package/dist/hooks/use-idle.cjs.map +1 -1
  1002. package/dist/hooks/use-idle.js.map +1 -1
  1003. package/dist/hooks/use-install-prompt.cjs +1 -1
  1004. package/dist/hooks/use-install-prompt.cjs.map +1 -1
  1005. package/dist/hooks/use-install-prompt.js +1 -1
  1006. package/dist/hooks/use-install-prompt.js.map +1 -1
  1007. package/dist/hooks/use-intersection-observer.cjs.map +1 -1
  1008. package/dist/hooks/use-intersection-observer.js.map +1 -1
  1009. package/dist/hooks/use-interval.cjs.map +1 -1
  1010. package/dist/hooks/use-interval.js.map +1 -1
  1011. package/dist/hooks/use-is-first-render.cjs.map +1 -1
  1012. package/dist/hooks/use-is-first-render.js.map +1 -1
  1013. package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
  1014. package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
  1015. package/dist/hooks/use-latest-ref.cjs.map +1 -1
  1016. package/dist/hooks/use-latest-ref.js.map +1 -1
  1017. package/dist/hooks/use-list-state.cjs.map +1 -1
  1018. package/dist/hooks/use-list-state.js.map +1 -1
  1019. package/dist/hooks/use-local-storage.cjs +1 -1
  1020. package/dist/hooks/use-local-storage.cjs.map +1 -1
  1021. package/dist/hooks/use-local-storage.js +2 -5
  1022. package/dist/hooks/use-local-storage.js.map +1 -1
  1023. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  1024. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  1025. package/dist/hooks/use-long-press.cjs.map +1 -1
  1026. package/dist/hooks/use-long-press.js.map +1 -1
  1027. package/dist/hooks/use-map.cjs.map +1 -1
  1028. package/dist/hooks/use-map.js.map +1 -1
  1029. package/dist/hooks/use-media-devices.cjs.map +1 -1
  1030. package/dist/hooks/use-media-devices.js.map +1 -1
  1031. package/dist/hooks/use-media-permission.cjs +1 -1
  1032. package/dist/hooks/use-media-permission.cjs.map +1 -1
  1033. package/dist/hooks/use-media-permission.js +2 -5
  1034. package/dist/hooks/use-media-permission.js.map +1 -1
  1035. package/dist/hooks/use-media-query.cjs.map +1 -1
  1036. package/dist/hooks/use-media-query.js.map +1 -1
  1037. package/dist/hooks/use-object-url.cjs.map +1 -1
  1038. package/dist/hooks/use-object-url.js.map +1 -1
  1039. package/dist/hooks/use-online.cjs.map +1 -1
  1040. package/dist/hooks/use-online.js.map +1 -1
  1041. package/dist/hooks/use-pagination.cjs.map +1 -1
  1042. package/dist/hooks/use-pagination.js.map +1 -1
  1043. package/dist/hooks/use-previous.cjs.map +1 -1
  1044. package/dist/hooks/use-previous.js.map +1 -1
  1045. package/dist/hooks/use-push-to-talk.cjs.map +1 -1
  1046. package/dist/hooks/use-push-to-talk.js.map +1 -1
  1047. package/dist/hooks/use-queue.cjs.map +1 -1
  1048. package/dist/hooks/use-queue.js.map +1 -1
  1049. package/dist/hooks/use-resize-observer.cjs.map +1 -1
  1050. package/dist/hooks/use-resize-observer.js.map +1 -1
  1051. package/dist/hooks/use-scroll-lock.cjs.map +1 -1
  1052. package/dist/hooks/use-scroll-lock.js.map +1 -1
  1053. package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
  1054. package/dist/hooks/use-scroll-overflow.js.map +1 -1
  1055. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  1056. package/dist/hooks/use-service-worker-update.js.map +1 -1
  1057. package/dist/hooks/use-set.cjs.map +1 -1
  1058. package/dist/hooks/use-set.js.map +1 -1
  1059. package/dist/hooks/use-sortable.cjs.map +1 -1
  1060. package/dist/hooks/use-sortable.js.map +1 -1
  1061. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  1062. package/dist/hooks/use-stable-callback.js.map +1 -1
  1063. package/dist/hooks/use-storage-estimate.cjs.map +1 -1
  1064. package/dist/hooks/use-storage-estimate.js.map +1 -1
  1065. package/dist/hooks/use-throttle.cjs.map +1 -1
  1066. package/dist/hooks/use-throttle.js.map +1 -1
  1067. package/dist/hooks/use-timeout.cjs.map +1 -1
  1068. package/dist/hooks/use-timeout.js.map +1 -1
  1069. package/dist/hooks/use-toggle.cjs.map +1 -1
  1070. package/dist/hooks/use-toggle.js.map +1 -1
  1071. package/dist/hooks/use-typewriter.cjs.map +1 -1
  1072. package/dist/hooks/use-typewriter.js.map +1 -1
  1073. package/dist/hooks/use-window-size.cjs.map +1 -1
  1074. package/dist/hooks/use-window-size.js.map +1 -1
  1075. package/dist/http/api-client.cjs +1 -1
  1076. package/dist/http/api-client.cjs.map +1 -1
  1077. package/dist/http/api-client.js +5 -1
  1078. package/dist/http/api-client.js.map +1 -1
  1079. package/dist/http/build-url.cjs +1 -1
  1080. package/dist/http/build-url.cjs.map +1 -1
  1081. package/dist/http/build-url.js +3 -1
  1082. package/dist/http/build-url.js.map +1 -1
  1083. package/dist/http/credential-scope.cjs.map +1 -1
  1084. package/dist/http/credential-scope.js.map +1 -1
  1085. package/dist/http/csrf.cjs.map +1 -1
  1086. package/dist/http/csrf.js.map +1 -1
  1087. package/dist/http/decode-response.cjs.map +1 -1
  1088. package/dist/http/decode-response.js.map +1 -1
  1089. package/dist/http/describe-api-error.cjs.map +1 -1
  1090. package/dist/http/describe-api-error.js.map +1 -1
  1091. package/dist/http/errors.cjs.map +1 -1
  1092. package/dist/http/errors.js.map +1 -1
  1093. package/dist/http/idempotency.cjs.map +1 -1
  1094. package/dist/http/idempotency.js.map +1 -1
  1095. package/dist/http/parse-response.cjs.map +1 -1
  1096. package/dist/http/parse-response.js.map +1 -1
  1097. package/dist/http/presigned-post.cjs +2 -0
  1098. package/dist/http/presigned-post.cjs.map +1 -0
  1099. package/dist/http/presigned-post.js +73 -0
  1100. package/dist/http/presigned-post.js.map +1 -0
  1101. package/dist/http/resumable-upload.cjs.map +1 -1
  1102. package/dist/http/resumable-upload.js.map +1 -1
  1103. package/dist/http/retry.cjs.map +1 -1
  1104. package/dist/http/retry.js.map +1 -1
  1105. package/dist/http/timeout.cjs.map +1 -1
  1106. package/dist/http/timeout.js.map +1 -1
  1107. package/dist/http/upload-with-progress.cjs +1 -1
  1108. package/dist/http/upload-with-progress.cjs.map +1 -1
  1109. package/dist/http/upload-with-progress.js +2 -7
  1110. package/dist/http/upload-with-progress.js.map +1 -1
  1111. package/dist/http/use-describe-api-error.cjs.map +1 -1
  1112. package/dist/http/use-describe-api-error.js.map +1 -1
  1113. package/dist/http/use-poll.cjs +1 -1
  1114. package/dist/http/use-poll.cjs.map +1 -1
  1115. package/dist/http/use-poll.js +2 -5
  1116. package/dist/http/use-poll.js.map +1 -1
  1117. package/dist/i18n/I18nProvider.cjs.map +1 -1
  1118. package/dist/i18n/I18nProvider.js.map +1 -1
  1119. package/dist/i18n/create-i18n.cjs.map +1 -1
  1120. package/dist/i18n/create-i18n.js.map +1 -1
  1121. package/dist/icons/Icon.cjs.map +1 -1
  1122. package/dist/icons/Icon.js.map +1 -1
  1123. package/dist/icons/IconPicker.cjs.map +1 -1
  1124. package/dist/icons/IconPicker.js.map +1 -1
  1125. package/dist/icons/IconPicker.module.cjs.map +1 -1
  1126. package/dist/icons/IconPicker.module.js.map +1 -1
  1127. package/dist/icons/IconProvider.cjs.map +1 -1
  1128. package/dist/icons/IconProvider.js.map +1 -1
  1129. package/dist/icons/alias.cjs.map +1 -1
  1130. package/dist/icons/alias.js.map +1 -1
  1131. package/dist/icons/generated/aliases.cjs.map +1 -1
  1132. package/dist/icons/generated/aliases.js.map +1 -1
  1133. package/dist/icons/generated/icon-names.cjs.map +1 -1
  1134. package/dist/icons/generated/icon-names.js.map +1 -1
  1135. package/dist/icons/generated/loaders.cjs.map +1 -1
  1136. package/dist/icons/generated/loaders.js.map +1 -1
  1137. package/dist/icons/generated/shard-00.cjs.map +1 -1
  1138. package/dist/icons/generated/shard-00.js.map +1 -1
  1139. package/dist/icons/generated/shard-01.cjs.map +1 -1
  1140. package/dist/icons/generated/shard-01.js.map +1 -1
  1141. package/dist/icons/generated/shard-02.cjs.map +1 -1
  1142. package/dist/icons/generated/shard-02.js.map +1 -1
  1143. package/dist/icons/generated/shard-03.cjs.map +1 -1
  1144. package/dist/icons/generated/shard-03.js.map +1 -1
  1145. package/dist/icons/generated/shard-04.cjs.map +1 -1
  1146. package/dist/icons/generated/shard-04.js.map +1 -1
  1147. package/dist/icons/generated/shard-05.cjs.map +1 -1
  1148. package/dist/icons/generated/shard-05.js.map +1 -1
  1149. package/dist/icons/generated/shard-06.cjs.map +1 -1
  1150. package/dist/icons/generated/shard-06.js.map +1 -1
  1151. package/dist/icons/generated/shard-07.cjs.map +1 -1
  1152. package/dist/icons/generated/shard-07.js.map +1 -1
  1153. package/dist/icons/generated/shard-08.cjs.map +1 -1
  1154. package/dist/icons/generated/shard-08.js.map +1 -1
  1155. package/dist/icons/generated/shard-09.cjs.map +1 -1
  1156. package/dist/icons/generated/shard-09.js.map +1 -1
  1157. package/dist/icons/generated/shard-10.cjs.map +1 -1
  1158. package/dist/icons/generated/shard-10.js.map +1 -1
  1159. package/dist/icons/generated/shard-11.cjs.map +1 -1
  1160. package/dist/icons/generated/shard-11.js.map +1 -1
  1161. package/dist/icons/generated/shard-12.cjs.map +1 -1
  1162. package/dist/icons/generated/shard-12.js.map +1 -1
  1163. package/dist/icons/generated/shard-13.cjs.map +1 -1
  1164. package/dist/icons/generated/shard-13.js.map +1 -1
  1165. package/dist/icons/generated/shard-14.cjs.map +1 -1
  1166. package/dist/icons/generated/shard-14.js.map +1 -1
  1167. package/dist/icons/generated/shard-15.cjs.map +1 -1
  1168. package/dist/icons/generated/shard-15.js.map +1 -1
  1169. package/dist/icons/generated/shard-16.cjs.map +1 -1
  1170. package/dist/icons/generated/shard-16.js.map +1 -1
  1171. package/dist/icons/generated/shard-17.cjs.map +1 -1
  1172. package/dist/icons/generated/shard-17.js.map +1 -1
  1173. package/dist/icons/generated/shard-18.cjs.map +1 -1
  1174. package/dist/icons/generated/shard-18.js.map +1 -1
  1175. package/dist/icons/generated/shard-19.cjs.map +1 -1
  1176. package/dist/icons/generated/shard-19.js.map +1 -1
  1177. package/dist/icons/generated/shard-20.cjs.map +1 -1
  1178. package/dist/icons/generated/shard-20.js.map +1 -1
  1179. package/dist/icons/generated/shard-21.cjs.map +1 -1
  1180. package/dist/icons/generated/shard-21.js.map +1 -1
  1181. package/dist/icons/generated/shard-22.cjs.map +1 -1
  1182. package/dist/icons/generated/shard-22.js.map +1 -1
  1183. package/dist/icons/generated/shard-23.cjs.map +1 -1
  1184. package/dist/icons/generated/shard-23.js.map +1 -1
  1185. package/dist/icons/generated/shard-24.cjs.map +1 -1
  1186. package/dist/icons/generated/shard-24.js.map +1 -1
  1187. package/dist/icons/generated/shard-25.cjs.map +1 -1
  1188. package/dist/icons/generated/shard-25.js.map +1 -1
  1189. package/dist/icons/generated/shard-26.cjs.map +1 -1
  1190. package/dist/icons/generated/shard-26.js.map +1 -1
  1191. package/dist/icons/generated/shard-27.cjs.map +1 -1
  1192. package/dist/icons/generated/shard-27.js.map +1 -1
  1193. package/dist/icons/generated/shard-28.cjs.map +1 -1
  1194. package/dist/icons/generated/shard-28.js.map +1 -1
  1195. package/dist/icons/generated/shard-29.cjs.map +1 -1
  1196. package/dist/icons/generated/shard-29.js.map +1 -1
  1197. package/dist/icons/generated/shard-30.cjs.map +1 -1
  1198. package/dist/icons/generated/shard-30.js.map +1 -1
  1199. package/dist/icons/generated/shard-31.cjs.map +1 -1
  1200. package/dist/icons/generated/shard-31.js.map +1 -1
  1201. package/dist/icons/generated/shard-32.cjs.map +1 -1
  1202. package/dist/icons/generated/shard-32.js.map +1 -1
  1203. package/dist/icons/generated/shard-33.cjs.map +1 -1
  1204. package/dist/icons/generated/shard-33.js.map +1 -1
  1205. package/dist/icons/generated/shard-34.cjs.map +1 -1
  1206. package/dist/icons/generated/shard-34.js.map +1 -1
  1207. package/dist/icons/generated/shard-35.cjs.map +1 -1
  1208. package/dist/icons/generated/shard-35.js.map +1 -1
  1209. package/dist/icons/generated/shard-36.cjs.map +1 -1
  1210. package/dist/icons/generated/shard-36.js.map +1 -1
  1211. package/dist/icons/generated/shard-37.cjs.map +1 -1
  1212. package/dist/icons/generated/shard-37.js.map +1 -1
  1213. package/dist/icons/generated/shard-38.cjs.map +1 -1
  1214. package/dist/icons/generated/shard-38.js.map +1 -1
  1215. package/dist/icons/generated/shard-39.cjs.map +1 -1
  1216. package/dist/icons/generated/shard-39.js.map +1 -1
  1217. package/dist/icons/generated/shard-40.cjs.map +1 -1
  1218. package/dist/icons/generated/shard-40.js.map +1 -1
  1219. package/dist/icons/generated/shard-41.cjs.map +1 -1
  1220. package/dist/icons/generated/shard-41.js.map +1 -1
  1221. package/dist/icons/generated/shard-42.cjs.map +1 -1
  1222. package/dist/icons/generated/shard-42.js.map +1 -1
  1223. package/dist/icons/generated/shard-43.cjs.map +1 -1
  1224. package/dist/icons/generated/shard-43.js.map +1 -1
  1225. package/dist/icons/generated/shard-44.cjs.map +1 -1
  1226. package/dist/icons/generated/shard-44.js.map +1 -1
  1227. package/dist/icons/generated/shard-45.cjs.map +1 -1
  1228. package/dist/icons/generated/shard-45.js.map +1 -1
  1229. package/dist/icons/icon-context.cjs.map +1 -1
  1230. package/dist/icons/icon-context.js.map +1 -1
  1231. package/dist/icons/is-icon-name.cjs.map +1 -1
  1232. package/dist/icons/is-icon-name.js.map +1 -1
  1233. package/dist/icons/material-symbols.cjs.map +1 -1
  1234. package/dist/icons/material-symbols.js.map +1 -1
  1235. package/dist/icons/normalize-icon-name.cjs.map +1 -1
  1236. package/dist/icons/normalize-icon-name.js.map +1 -1
  1237. package/dist/icons/shard-cache.cjs +1 -1
  1238. package/dist/icons/shard-cache.cjs.map +1 -1
  1239. package/dist/icons/shard-cache.js +2 -5
  1240. package/dist/icons/shard-cache.js.map +1 -1
  1241. package/dist/icons/use-icon.cjs.map +1 -1
  1242. package/dist/icons/use-icon.js.map +1 -1
  1243. package/dist/icons/validate-icon-name.cjs.map +1 -1
  1244. package/dist/icons/validate-icon-name.js.map +1 -1
  1245. package/dist/icons-virtual.cjs.map +1 -1
  1246. package/dist/icons-virtual.js.map +1 -1
  1247. package/dist/imaging/canvas.cjs.map +1 -1
  1248. package/dist/imaging/canvas.js.map +1 -1
  1249. package/dist/imaging/compress.cjs.map +1 -1
  1250. package/dist/imaging/compress.js.map +1 -1
  1251. package/dist/imaging/decode.cjs.map +1 -1
  1252. package/dist/imaging/decode.js.map +1 -1
  1253. package/dist/imaging/encode.cjs.map +1 -1
  1254. package/dist/imaging/encode.js.map +1 -1
  1255. package/dist/imaging/exceptions.cjs.map +1 -1
  1256. package/dist/imaging/exceptions.js.map +1 -1
  1257. package/dist/imaging/frame.cjs.map +1 -1
  1258. package/dist/imaging/frame.js.map +1 -1
  1259. package/dist/imaging/thumbnails.cjs.map +1 -1
  1260. package/dist/imaging/thumbnails.js.map +1 -1
  1261. package/dist/imaging/transform.cjs.map +1 -1
  1262. package/dist/imaging/transform.js.map +1 -1
  1263. package/dist/imaging/use-image-processing.cjs.map +1 -1
  1264. package/dist/imaging/use-image-processing.js.map +1 -1
  1265. package/dist/logger/logger.cjs.map +1 -1
  1266. package/dist/logger/logger.js.map +1 -1
  1267. package/dist/neural.cjs.map +1 -1
  1268. package/dist/neural.js.map +1 -1
  1269. package/dist/oauth/GoogleSignIn.cjs +1 -1
  1270. package/dist/oauth/GoogleSignIn.cjs.map +1 -1
  1271. package/dist/oauth/GoogleSignIn.js +6 -9
  1272. package/dist/oauth/GoogleSignIn.js.map +1 -1
  1273. package/dist/oauth/callback.cjs.map +1 -1
  1274. package/dist/oauth/callback.js.map +1 -1
  1275. package/dist/oauth/use-oauth-callback.cjs.map +1 -1
  1276. package/dist/oauth/use-oauth-callback.js.map +1 -1
  1277. package/dist/offline/conflict.cjs.map +1 -1
  1278. package/dist/offline/conflict.js.map +1 -1
  1279. package/dist/offline/create-offline-database.cjs.map +1 -1
  1280. package/dist/offline/create-offline-database.js.map +1 -1
  1281. package/dist/offline/create-offline-store.cjs +1 -1
  1282. package/dist/offline/create-offline-store.cjs.map +1 -1
  1283. package/dist/offline/create-offline-store.js +1 -5
  1284. package/dist/offline/create-offline-store.js.map +1 -1
  1285. package/dist/offline/create-offline-sync.cjs +1 -1
  1286. package/dist/offline/create-offline-sync.cjs.map +1 -1
  1287. package/dist/offline/create-offline-sync.js +9 -14
  1288. package/dist/offline/create-offline-sync.js.map +1 -1
  1289. package/dist/offline/use-offline-sync.cjs.map +1 -1
  1290. package/dist/offline/use-offline-sync.js.map +1 -1
  1291. package/dist/perf/cache-size.cjs.map +1 -1
  1292. package/dist/perf/cache-size.js.map +1 -1
  1293. package/dist/perf/device.cjs.map +1 -1
  1294. package/dist/perf/device.js.map +1 -1
  1295. package/dist/perf/format.cjs.map +1 -1
  1296. package/dist/perf/format.js.map +1 -1
  1297. package/dist/perf/profiler.cjs.map +1 -1
  1298. package/dist/perf/profiler.js.map +1 -1
  1299. package/dist/push/use-push-subscription.cjs.map +1 -1
  1300. package/dist/push/use-push-subscription.js.map +1 -1
  1301. package/dist/push/utils.cjs.map +1 -1
  1302. package/dist/push/utils.js.map +1 -1
  1303. package/dist/push/web-push-client.cjs.map +1 -1
  1304. package/dist/push/web-push-client.js.map +1 -1
  1305. package/dist/query/QueryProvider.cjs.map +1 -1
  1306. package/dist/query/QueryProvider.js.map +1 -1
  1307. package/dist/query/constants.cjs.map +1 -1
  1308. package/dist/query/constants.js.map +1 -1
  1309. package/dist/query/create-query-keys.cjs.map +1 -1
  1310. package/dist/query/create-query-keys.js.map +1 -1
  1311. package/dist/query/foreign-client-warning.cjs.map +1 -1
  1312. package/dist/query/foreign-client-warning.js.map +1 -1
  1313. package/dist/query/offline-persistence.cjs +1 -1
  1314. package/dist/query/offline-persistence.cjs.map +1 -1
  1315. package/dist/query/offline-persistence.js +2 -10
  1316. package/dist/query/offline-persistence.js.map +1 -1
  1317. package/dist/query/optimistic.cjs.map +1 -1
  1318. package/dist/query/optimistic.js.map +1 -1
  1319. package/dist/query/pagination.cjs.map +1 -1
  1320. package/dist/query/pagination.js.map +1 -1
  1321. package/dist/query/retry-policy.cjs.map +1 -1
  1322. package/dist/query/retry-policy.js.map +1 -1
  1323. package/dist/query/use-cursor-query.cjs.map +1 -1
  1324. package/dist/query/use-cursor-query.js.map +1 -1
  1325. package/dist/query/use-offline-mutation.cjs.map +1 -1
  1326. package/dist/query/use-offline-mutation.js.map +1 -1
  1327. package/dist/query/use-paginated-query.cjs.map +1 -1
  1328. package/dist/query/use-paginated-query.js.map +1 -1
  1329. package/dist/router/AppRouter.cjs.map +1 -1
  1330. package/dist/router/AppRouter.js.map +1 -1
  1331. package/dist/router/RouteGuard.cjs.map +1 -1
  1332. package/dist/router/RouteGuard.js.map +1 -1
  1333. package/dist/router/index.js +2 -2
  1334. package/dist/share/share-or-download.cjs.map +1 -1
  1335. package/dist/share/share-or-download.js.map +1 -1
  1336. package/dist/share/share.cjs.map +1 -1
  1337. package/dist/share/share.js.map +1 -1
  1338. package/dist/sse/create-event-stream.cjs +1 -1
  1339. package/dist/sse/create-event-stream.cjs.map +1 -1
  1340. package/dist/sse/create-event-stream.js +44 -30
  1341. package/dist/sse/create-event-stream.js.map +1 -1
  1342. package/dist/sse/ticket-event-stream.cjs +2 -0
  1343. package/dist/sse/ticket-event-stream.cjs.map +1 -0
  1344. package/dist/sse/ticket-event-stream.js +41 -0
  1345. package/dist/sse/ticket-event-stream.js.map +1 -0
  1346. package/dist/sse/use-event-stream.cjs +1 -1
  1347. package/dist/sse/use-event-stream.cjs.map +1 -1
  1348. package/dist/sse/use-event-stream.js +7 -4
  1349. package/dist/sse/use-event-stream.js.map +1 -1
  1350. package/dist/store/create-selectors.cjs.map +1 -1
  1351. package/dist/store/create-selectors.js.map +1 -1
  1352. package/dist/store/create-store.cjs.map +1 -1
  1353. package/dist/store/create-store.js.map +1 -1
  1354. package/dist/sw/background-sync.cjs.map +1 -1
  1355. package/dist/sw/background-sync.js.map +1 -1
  1356. package/dist/sw/cache-inspect.cjs.map +1 -1
  1357. package/dist/sw/cache-inspect.js.map +1 -1
  1358. package/dist/sw/cache.cjs +1 -1
  1359. package/dist/sw/cache.cjs.map +1 -1
  1360. package/dist/sw/cache.js +2 -6
  1361. package/dist/sw/cache.js.map +1 -1
  1362. package/dist/sw/create-push-handler.cjs.map +1 -1
  1363. package/dist/sw/create-push-handler.js.map +1 -1
  1364. package/dist/sw/credential-headers.cjs.map +1 -1
  1365. package/dist/sw/credential-headers.js.map +1 -1
  1366. package/dist/sw/periodic-sync.cjs.map +1 -1
  1367. package/dist/sw/periodic-sync.js.map +1 -1
  1368. package/dist/sw/register-service-worker.cjs.map +1 -1
  1369. package/dist/sw/register-service-worker.js.map +1 -1
  1370. package/dist/sw/session-data.cjs.map +1 -1
  1371. package/dist/sw/session-data.js.map +1 -1
  1372. package/dist/tabular/assets.cjs.map +1 -1
  1373. package/dist/tabular/assets.js.map +1 -1
  1374. package/dist/tabular/cache.cjs.map +1 -1
  1375. package/dist/tabular/cache.js.map +1 -1
  1376. package/dist/tabular/compact.cjs.map +1 -1
  1377. package/dist/tabular/compact.js.map +1 -1
  1378. package/dist/tabular/exceptions.cjs.map +1 -1
  1379. package/dist/tabular/exceptions.js.map +1 -1
  1380. package/dist/tabular/manifest.cjs.map +1 -1
  1381. package/dist/tabular/manifest.js.map +1 -1
  1382. package/dist/tabular/predictor.cjs.map +1 -1
  1383. package/dist/tabular/predictor.js.map +1 -1
  1384. package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
  1385. package/dist/tabular/use-tabular-predictor.js.map +1 -1
  1386. package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
  1387. package/dist/telemetry/TelemetryProvider.js.map +1 -1
  1388. package/dist/telemetry/app-error-adapter.cjs.map +1 -1
  1389. package/dist/telemetry/app-error-adapter.js.map +1 -1
  1390. package/dist/telemetry/app-error-queue.cjs.map +1 -1
  1391. package/dist/telemetry/app-error-queue.js.map +1 -1
  1392. package/dist/telemetry/app-error-reporter.cjs.map +1 -1
  1393. package/dist/telemetry/app-error-reporter.js.map +1 -1
  1394. package/dist/telemetry/app-error-schema.cjs.map +1 -1
  1395. package/dist/telemetry/app-error-schema.js.map +1 -1
  1396. package/dist/telemetry/app-error-transport.cjs.map +1 -1
  1397. package/dist/telemetry/app-error-transport.js.map +1 -1
  1398. package/dist/telemetry/console-adapter.cjs.map +1 -1
  1399. package/dist/telemetry/console-adapter.js.map +1 -1
  1400. package/dist/telemetry/describe-app-error.cjs.map +1 -1
  1401. package/dist/telemetry/describe-app-error.js.map +1 -1
  1402. package/dist/telemetry/posthog-adapter.cjs +1 -1
  1403. package/dist/telemetry/posthog-adapter.cjs.map +1 -1
  1404. package/dist/telemetry/posthog-adapter.js +1 -5
  1405. package/dist/telemetry/posthog-adapter.js.map +1 -1
  1406. package/dist/telemetry/sentry-adapter.cjs.map +1 -1
  1407. package/dist/telemetry/sentry-adapter.js.map +1 -1
  1408. package/dist/tempest-react-sdk.cjs +1 -1
  1409. package/dist/tempest-react-sdk.d.ts +440 -7
  1410. package/dist/tempest-react-sdk.js +122 -120
  1411. package/dist/testing/create-mock-handlers.cjs.map +1 -1
  1412. package/dist/testing/create-mock-handlers.js.map +1 -1
  1413. package/dist/testing.js +1 -2
  1414. package/dist/theme/ThemeProvider.cjs.map +1 -1
  1415. package/dist/theme/ThemeProvider.js.map +1 -1
  1416. package/dist/theme/apply-theme.cjs.map +1 -1
  1417. package/dist/theme/apply-theme.js.map +1 -1
  1418. package/dist/theme/color.cjs.map +1 -1
  1419. package/dist/theme/color.js.map +1 -1
  1420. package/dist/theme/create-theme.cjs.map +1 -1
  1421. package/dist/theme/create-theme.js.map +1 -1
  1422. package/dist/theme/data-viz-ramps.cjs.map +1 -1
  1423. package/dist/theme/data-viz-ramps.js.map +1 -1
  1424. package/dist/theme/initial-theme.cjs.map +1 -1
  1425. package/dist/theme/initial-theme.js.map +1 -1
  1426. package/dist/theme/inverse-render.cjs.map +1 -1
  1427. package/dist/theme/inverse-render.js.map +1 -1
  1428. package/dist/theme/inverse-restore.cjs.map +1 -1
  1429. package/dist/theme/inverse-restore.js.map +1 -1
  1430. package/dist/theme/inverse-surface.cjs.map +1 -1
  1431. package/dist/theme/inverse-surface.js.map +1 -1
  1432. package/dist/theme/status-tokens.cjs.map +1 -1
  1433. package/dist/theme/status-tokens.js.map +1 -1
  1434. package/dist/theme/theme-presets.cjs.map +1 -1
  1435. package/dist/theme/theme-presets.js.map +1 -1
  1436. package/dist/utils/absent.cjs.map +1 -1
  1437. package/dist/utils/absent.js.map +1 -1
  1438. package/dist/utils/arrays.cjs.map +1 -1
  1439. package/dist/utils/arrays.js.map +1 -1
  1440. package/dist/utils/base64.cjs.map +1 -1
  1441. package/dist/utils/base64.js.map +1 -1
  1442. package/dist/utils/cn.cjs.map +1 -1
  1443. package/dist/utils/cn.js.map +1 -1
  1444. package/dist/utils/compare-values.cjs.map +1 -1
  1445. package/dist/utils/compare-values.js.map +1 -1
  1446. package/dist/utils/compressed-storage.cjs.map +1 -1
  1447. package/dist/utils/compressed-storage.js.map +1 -1
  1448. package/dist/utils/csv.cjs.map +1 -1
  1449. package/dist/utils/csv.js.map +1 -1
  1450. package/dist/utils/dev-mode.cjs.map +1 -1
  1451. package/dist/utils/dev-mode.js.map +1 -1
  1452. package/dist/utils/duplicate-instance.cjs.map +1 -1
  1453. package/dist/utils/duplicate-instance.js.map +1 -1
  1454. package/dist/utils/format.cjs.map +1 -1
  1455. package/dist/utils/format.js.map +1 -1
  1456. package/dist/utils/functions.cjs +1 -1
  1457. package/dist/utils/functions.cjs.map +1 -1
  1458. package/dist/utils/functions.js +1 -1
  1459. package/dist/utils/functions.js.map +1 -1
  1460. package/dist/utils/guards.cjs.map +1 -1
  1461. package/dist/utils/guards.js.map +1 -1
  1462. package/dist/utils/ids.cjs.map +1 -1
  1463. package/dist/utils/ids.js.map +1 -1
  1464. package/dist/utils/intl-cache.cjs.map +1 -1
  1465. package/dist/utils/intl-cache.js.map +1 -1
  1466. package/dist/utils/json-frame.cjs.map +1 -1
  1467. package/dist/utils/json-frame.js.map +1 -1
  1468. package/dist/utils/numbers.cjs.map +1 -1
  1469. package/dist/utils/numbers.js.map +1 -1
  1470. package/dist/utils/objects.cjs.map +1 -1
  1471. package/dist/utils/objects.js.map +1 -1
  1472. package/dist/utils/owner-fingerprint.cjs.map +1 -1
  1473. package/dist/utils/owner-fingerprint.js.map +1 -1
  1474. package/dist/utils/promises.cjs.map +1 -1
  1475. package/dist/utils/promises.js.map +1 -1
  1476. package/dist/utils/relative-time.cjs.map +1 -1
  1477. package/dist/utils/relative-time.js.map +1 -1
  1478. package/dist/utils/safe-url.cjs.map +1 -1
  1479. package/dist/utils/safe-url.js.map +1 -1
  1480. package/dist/utils/schema-like.cjs.map +1 -1
  1481. package/dist/utils/schema-like.js.map +1 -1
  1482. package/dist/utils/storage.cjs +1 -1
  1483. package/dist/utils/storage.cjs.map +1 -1
  1484. package/dist/utils/storage.js +2 -2
  1485. package/dist/utils/storage.js.map +1 -1
  1486. package/dist/utils/strings.cjs.map +1 -1
  1487. package/dist/utils/strings.js.map +1 -1
  1488. package/dist/utils/xlsx.cjs.map +1 -1
  1489. package/dist/utils/xlsx.js.map +1 -1
  1490. package/dist/vision/core/canvas.cjs.map +1 -1
  1491. package/dist/vision/core/canvas.js.map +1 -1
  1492. package/dist/vision/core/dtypes.cjs.map +1 -1
  1493. package/dist/vision/core/dtypes.js.map +1 -1
  1494. package/dist/vision/core/exceptions.cjs.map +1 -1
  1495. package/dist/vision/core/exceptions.js.map +1 -1
  1496. package/dist/vision/core/graph.cjs.map +1 -1
  1497. package/dist/vision/core/graph.js.map +1 -1
  1498. package/dist/vision/core/metadata.cjs +1 -1
  1499. package/dist/vision/core/metadata.cjs.map +1 -1
  1500. package/dist/vision/core/metadata.js +9 -26
  1501. package/dist/vision/core/metadata.js.map +1 -1
  1502. package/dist/vision/core/providers.cjs.map +1 -1
  1503. package/dist/vision/core/providers.js.map +1 -1
  1504. package/dist/vision/core/session.cjs.map +1 -1
  1505. package/dist/vision/core/session.js.map +1 -1
  1506. package/dist/vision/core/timing.cjs.map +1 -1
  1507. package/dist/vision/core/timing.js.map +1 -1
  1508. package/dist/vision/fusion.cjs.map +1 -1
  1509. package/dist/vision/fusion.js.map +1 -1
  1510. package/dist/vision/index.cjs.map +1 -1
  1511. package/dist/vision/index.js.map +1 -1
  1512. package/dist/vision/io/image.cjs.map +1 -1
  1513. package/dist/vision/io/image.js.map +1 -1
  1514. package/dist/vision/labels.cjs.map +1 -1
  1515. package/dist/vision/labels.js.map +1 -1
  1516. package/dist/vision/luminance.cjs.map +1 -1
  1517. package/dist/vision/luminance.js.map +1 -1
  1518. package/dist/vision/normalization.cjs.map +1 -1
  1519. package/dist/vision/normalization.js.map +1 -1
  1520. package/dist/vision/postprocess/classification.cjs.map +1 -1
  1521. package/dist/vision/postprocess/classification.js.map +1 -1
  1522. package/dist/vision/postprocess/detection.cjs.map +1 -1
  1523. package/dist/vision/postprocess/detection.js.map +1 -1
  1524. package/dist/vision/postprocess/segmentation.cjs.map +1 -1
  1525. package/dist/vision/postprocess/segmentation.js.map +1 -1
  1526. package/dist/vision/preprocess/image.cjs.map +1 -1
  1527. package/dist/vision/preprocess/image.js.map +1 -1
  1528. package/dist/vision/preprocess/pipeline.cjs.map +1 -1
  1529. package/dist/vision/preprocess/pipeline.js.map +1 -1
  1530. package/dist/vision/results.cjs.map +1 -1
  1531. package/dist/vision/results.js.map +1 -1
  1532. package/dist/vision/tasks/base.cjs.map +1 -1
  1533. package/dist/vision/tasks/base.js.map +1 -1
  1534. package/dist/vision/tasks/classifier.cjs.map +1 -1
  1535. package/dist/vision/tasks/classifier.js.map +1 -1
  1536. package/dist/vision/tasks/detectClassify.cjs.map +1 -1
  1537. package/dist/vision/tasks/detectClassify.js.map +1 -1
  1538. package/dist/vision/tasks/detector.cjs.map +1 -1
  1539. package/dist/vision/tasks/detector.js.map +1 -1
  1540. package/dist/vision/tasks/segmenter.cjs.map +1 -1
  1541. package/dist/vision/tasks/segmenter.js.map +1 -1
  1542. package/dist/vision/types.cjs.map +1 -1
  1543. package/dist/vision/types.js.map +1 -1
  1544. package/dist/vision/use-camera-stream.cjs +1 -1
  1545. package/dist/vision/use-camera-stream.cjs.map +1 -1
  1546. package/dist/vision/use-camera-stream.js +3 -9
  1547. package/dist/vision/use-camera-stream.js.map +1 -1
  1548. package/dist/vision/use-live-luminance.cjs +1 -1
  1549. package/dist/vision/use-live-luminance.cjs.map +1 -1
  1550. package/dist/vision/use-live-luminance.js +1 -5
  1551. package/dist/vision/use-live-luminance.js.map +1 -1
  1552. package/dist/vite/base-url.cjs.map +1 -1
  1553. package/dist/vite/base-url.js.map +1 -1
  1554. package/dist/vite/create-vite-config.cjs.map +1 -1
  1555. package/dist/vite/create-vite-config.js.map +1 -1
  1556. package/dist/vite/narrow-tokens.cjs.map +1 -1
  1557. package/dist/vite/narrow-tokens.js.map +1 -1
  1558. package/dist/vite/tempest-csp.cjs +1 -1
  1559. package/dist/vite/tempest-csp.cjs.map +1 -1
  1560. package/dist/vite/tempest-csp.js +2 -10
  1561. package/dist/vite/tempest-csp.js.map +1 -1
  1562. package/dist/vite/tempest-icons.cjs.map +1 -1
  1563. package/dist/vite/tempest-icons.js.map +1 -1
  1564. package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
  1565. package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
  1566. package/dist/vite/tempest-pwa-dev-sw.js +9 -16
  1567. package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
  1568. package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
  1569. package/dist/vite/tempest-pwa-icons.js.map +1 -1
  1570. package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
  1571. package/dist/vite/tempest-pwa-manifest.js.map +1 -1
  1572. package/dist/vite/tempest-styles.cjs.map +1 -1
  1573. package/dist/vite/tempest-styles.js.map +1 -1
  1574. package/dist/vite/tempest-vitest.cjs.map +1 -1
  1575. package/dist/vite/tempest-vitest.js.map +1 -1
  1576. package/dist/webrtc/link-stats.cjs.map +1 -1
  1577. package/dist/webrtc/link-stats.js.map +1 -1
  1578. package/dist/webrtc/mesh-quality.cjs.map +1 -1
  1579. package/dist/webrtc/mesh-quality.js.map +1 -1
  1580. package/dist/webrtc/opus-sdp.cjs.map +1 -1
  1581. package/dist/webrtc/opus-sdp.js.map +1 -1
  1582. package/dist/webrtc/peer-link.cjs +1 -1
  1583. package/dist/webrtc/peer-link.cjs.map +1 -1
  1584. package/dist/webrtc/peer-link.js +2 -5
  1585. package/dist/webrtc/peer-link.js.map +1 -1
  1586. package/dist/webrtc/peer-mesh.cjs +1 -1
  1587. package/dist/webrtc/peer-mesh.cjs.map +1 -1
  1588. package/dist/webrtc/peer-mesh.js +8 -24
  1589. package/dist/webrtc/peer-mesh.js.map +1 -1
  1590. package/dist/webrtc/sender-bitrate.cjs.map +1 -1
  1591. package/dist/webrtc/sender-bitrate.js.map +1 -1
  1592. package/dist/webrtc/use-link-stats.cjs.map +1 -1
  1593. package/dist/webrtc/use-link-stats.js.map +1 -1
  1594. package/dist/ws/create-web-socket.cjs +1 -1
  1595. package/dist/ws/create-web-socket.cjs.map +1 -1
  1596. package/dist/ws/create-web-socket.js +4 -22
  1597. package/dist/ws/create-web-socket.js.map +1 -1
  1598. package/dist/ws/resilience.cjs.map +1 -1
  1599. package/dist/ws/resilience.js.map +1 -1
  1600. package/dist/ws/use-web-socket.cjs.map +1 -1
  1601. package/dist/ws/use-web-socket.js.map +1 -1
  1602. package/package.json +9 -6
  1603. package/template/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Form.cjs","names":[],"sources":["../../../src/components/Form/Form.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { CSSProperties, FormHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Form.module.css\";\n\nexport type FormLayout = \"stack\" | \"inline\" | \"grid\";\nexport type FormActionsAlign = \"start\" | \"center\" | \"end\" | \"between\";\n\ninterface LayoutProps {\n /** Field arrangement. `stack` stacks fields vertically, `inline` lines them up in a wrapping row, `grid` arranges them in `columns` equal-width tracks. Default `stack`. */\n layout?: FormLayout;\n /** Number of columns when `layout=\"grid\"`, or a custom `grid-template-columns` value. Default `2`. */\n columns?: number | string;\n /** Gap between fields. Numbers map to a multiple of the 4px scale (default `4` → 16px). */\n gap?: number | string;\n}\n\nfunction resolveGap(gap: number | string | undefined, fallback: number): string {\n if (gap === undefined) return `${fallback * 4}px`;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string {\n if (columns === undefined) return \"repeat(2, minmax(0, 1fr))\";\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\nexport interface FormProps extends FormHTMLAttributes<HTMLFormElement>, LayoutProps {}\n\n/**\n * Form wrapper with a built-in layout variant. Replaces ad-hoc `<form>` +\n * `<Stack>` / `<Grid>` boilerplate; pair with [[FormRow]], [[FormSection]],\n * and [[FormActions]] for richer layouts.\n *\n * @example\n * <Form layout=\"grid\" columns={2} gap={4} onSubmit={form.handleSubmit(save)}>\n * <Input label=\"Nome\" {...form.register(\"name\")} />\n * <Input label=\"Email\" {...form.register(\"email\")} />\n * <FormActions align=\"end\">\n * <Button type=\"submit\">Salvar</Button>\n * </FormActions>\n * </Form>\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n { layout = \"stack\", columns, gap, className, style, children, ...props },\n ref,\n) {\n const finalStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n ...style,\n };\n return (\n <form\n ref={ref}\n className={cn(styles.form, styles[layout], className)}\n style={finalStyle}\n {...props}\n >\n {children}\n </form>\n );\n});\n\nexport interface FormSectionProps extends Omit<HTMLAttributes<HTMLElement>, \"title\">, LayoutProps {\n title?: ReactNode;\n description?: ReactNode;\n}\n\n/**\n * Visually grouped subset of fields with an optional title and description.\n * Has its own `layout`/`columns`/`gap` so subsets can stack while the parent\n * grids (or vice versa).\n *\n * The header is deliberately not a `SectionHeader`: a field group sits one step\n * below a page section, and its title is `text-lg` / semibold / `leading-snug`\n * with `space-3` below, against `text-2xl` / bold / `leading-tight` with\n * `space-5` for `SectionHeader`. Sharing the component would either grow every\n * form group to page-section size or add a size switch to `SectionHeader` that\n * only this caller uses.\n *\n * @example\n * <FormSection title=\"Endereço\" description=\"Usado para entrega\" layout=\"grid\" columns={3}>\n * <Input label=\"CEP\" />\n * <Input label=\"Rua\" />\n * <Input label=\"Número\" />\n * </FormSection>\n */\nexport function FormSection({\n title,\n description,\n layout = \"stack\",\n columns,\n gap,\n className,\n style,\n children,\n ...props\n}: FormSectionProps) {\n const bodyStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n };\n return (\n <section className={cn(styles.section, className)} style={style} {...props}>\n {(title || description) && (\n <header className={styles.sectionHeader}>\n {title && <h3 className={styles.sectionTitle}>{title}</h3>}\n {description && <p className={styles.sectionDescription}>{description}</p>}\n </header>\n )}\n <div className={cn(styles.sectionBody, styles[layout])} style={bodyStyle}>\n {children}\n </div>\n </section>\n );\n}\n\nexport interface FormRowProps extends HTMLAttributes<HTMLDivElement> {\n /** Gap between row items. Numbers map to a multiple of the 4px scale (default `3` → 12px). */\n gap?: number | string;\n}\n\n/**\n * Forces a horizontal row regardless of parent layout — useful for grouping\n * two short fields side-by-side inside an otherwise stacked form (e.g. CEP +\n * city, expiry month + year).\n *\n * @example\n * <Form layout=\"stack\">\n * <FormRow>\n * <Input label=\"CEP\" />\n * <Input label=\"Cidade\" />\n * </FormRow>\n * <Input label=\"Endereço completo\" />\n * </Form>\n */\nexport function FormRow({ gap, className, style, children, ...props }: FormRowProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 3), ...style };\n return (\n <div className={cn(styles.row, className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface FormActionsProps extends HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment of buttons. Default `end`. */\n align?: FormActionsAlign;\n /** Gap between buttons. Numbers map to a multiple of the 4px scale (default `2` → 8px). */\n gap?: number | string;\n}\n\n/**\n * Footer button row for a form. Use inside (or after) [[Form]] / [[FormSection]].\n *\n * @example\n * <FormActions align=\"end\">\n * <Button variant=\"ghost\" onClick={onCancel}>Cancelar</Button>\n * <Button type=\"submit\" loading={form.formState.isSubmitting}>Salvar</Button>\n * </FormActions>\n */\nexport function FormActions({\n align = \"end\",\n gap,\n className,\n style,\n children,\n ...props\n}: FormActionsProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 2), ...style };\n return (\n <div className={cn(styles.actions, styles[align], className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n"],"mappings":"2HAiBA,SAAS,EAAW,EAAkC,EAA0B,CAE5E,OADI,IAAQ,IAAA,GAAkB,GAAG,EAAW,EAAE,IACvC,OAAO,GAAQ,SAAW,GAAG,EAAM,EAAE,IAAM,CACtD,CAEA,SAAS,EAAe,EAA8C,CAElE,OADI,IAAY,IAAA,GAAkB,4BAC3B,OAAO,GAAY,SAAW,UAAU,EAAQ,mBAAqB,CAChF,CAkBA,IAAa,GAAA,EAAO,EAAA,WAAA,CAAuC,SACvD,CAAE,SAAS,QAAS,UAAS,MAAK,YAAW,QAAO,WAAU,GAAG,GACjE,EACF,CACE,IAAM,EAA4B,CAC9B,IAAK,EAAW,EAAK,CAAC,EACtB,GAAI,IAAW,OAAS,CAAE,oBAAqB,EAAe,CAAO,CAAE,EAAI,KAC3E,GAAG,CACP,EACA,OACI,EAAA,EAAA,IAAA,CAAC,OAAD,CACS,MACL,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,EAAA,QAAO,GAAS,CAAS,EACpD,MAAO,EACP,GAAI,EAEH,UACC,CAAA,CAEd,CAAC,EA0BD,SAAgB,EAAY,CACxB,QACA,cACA,SAAS,QACT,UACA,MACA,YACA,QACA,WACA,GAAG,GACc,CACjB,IAAM,EAA2B,CAC7B,IAAK,EAAW,EAAK,CAAC,EACtB,GAAI,IAAW,OAAS,CAAE,oBAAqB,EAAe,CAAO,CAAE,EAAI,IAC/E,EACA,OACI,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,CAAS,EAAU,QAAO,GAAI,EAArE,SAAA,EACM,GAAS,KACP,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAA,QAAO,cAA1B,SAAA,CACK,IAAS,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAA,QAAO,aAAe,SAAA,CAAU,CAAA,EACxD,IAAe,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,mBAAqB,SAAA,CAAe,CAAA,CACrE,CAEZ,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,YAAa,EAAA,QAAO,EAAO,EAAG,MAAO,EAC1D,UACA,CAAA,CACA,GAEjB,CAqBA,SAAgB,EAAQ,CAAE,MAAK,YAAW,QAAO,WAAU,GAAG,GAAuB,CACjF,IAAM,EAA4B,CAAE,IAAK,EAAW,EAAK,CAAC,EAAG,GAAG,CAAM,EACtE,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,CAAS,EAAG,MAAO,EAAY,GAAI,EAC7D,UACA,CAAA,CAEb,CAkBA,SAAgB,EAAY,CACxB,QAAQ,MACR,MACA,YACA,QACA,WACA,GAAG,GACc,CACjB,IAAM,EAA4B,CAAE,IAAK,EAAW,EAAK,CAAC,EAAG,GAAG,CAAM,EACtE,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,EAAA,QAAO,GAAQ,CAAS,EAAG,MAAO,EAAY,GAAI,EAChF,UACA,CAAA,CAEb"}
1
+ {"version":3,"file":"Form.cjs","names":["forwardRef","cn","styles","require_cn","require_Form_module","react","react_jsx_runtime","resolveGap","gap","fallback","resolveColumns","columns","Form","props","finalStyle","layout","style","className","FormSection","bodyStyle","title","description","FormRow","FormActions","align"],"sources":["../../../src/components/Form/Form.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { CSSProperties, FormHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Form.module.css\";\n\nexport type FormLayout = \"stack\" | \"inline\" | \"grid\";\nexport type FormActionsAlign = \"start\" | \"center\" | \"end\" | \"between\";\n\ninterface LayoutProps {\n /** Field arrangement. `stack` stacks fields vertically, `inline` lines them up in a wrapping row, `grid` arranges them in `columns` equal-width tracks. Default `stack`. */\n layout?: FormLayout;\n /** Number of columns when `layout=\"grid\"`, or a custom `grid-template-columns` value. Default `2`. */\n columns?: number | string;\n /** Gap between fields. Numbers map to a multiple of the 4px scale (default `4` → 16px). */\n gap?: number | string;\n}\n\nfunction resolveGap(gap: number | string | undefined, fallback: number): string {\n if (gap === undefined) return `${fallback * 4}px`;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string {\n if (columns === undefined) return \"repeat(2, minmax(0, 1fr))\";\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\nexport interface FormProps extends FormHTMLAttributes<HTMLFormElement>, LayoutProps {}\n\n/**\n * Form wrapper with a built-in layout variant. Replaces ad-hoc `<form>` +\n * `<Stack>` / `<Grid>` boilerplate; pair with [[FormRow]], [[FormSection]],\n * and [[FormActions]] for richer layouts.\n *\n * @example\n * <Form layout=\"grid\" columns={2} gap={4} onSubmit={form.handleSubmit(save)}>\n * <Input label=\"Nome\" {...form.register(\"name\")} />\n * <Input label=\"Email\" {...form.register(\"email\")} />\n * <FormActions align=\"end\">\n * <Button type=\"submit\">Salvar</Button>\n * </FormActions>\n * </Form>\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n { layout = \"stack\", columns, gap, className, style, children, ...props },\n ref,\n) {\n const finalStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n ...style,\n };\n return (\n <form\n ref={ref}\n className={cn(styles.form, styles[layout], className)}\n style={finalStyle}\n {...props}\n >\n {children}\n </form>\n );\n});\n\nexport interface FormSectionProps extends Omit<HTMLAttributes<HTMLElement>, \"title\">, LayoutProps {\n title?: ReactNode;\n description?: ReactNode;\n}\n\n/**\n * Visually grouped subset of fields with an optional title and description.\n * Has its own `layout`/`columns`/`gap` so subsets can stack while the parent\n * grids (or vice versa).\n *\n * The header is deliberately not a `SectionHeader`: a field group sits one step\n * below a page section, and its title is `text-lg` / semibold / `leading-snug`\n * with `space-3` below, against `text-2xl` / bold / `leading-tight` with\n * `space-5` for `SectionHeader`. Sharing the component would either grow every\n * form group to page-section size or add a size switch to `SectionHeader` that\n * only this caller uses.\n *\n * @example\n * <FormSection title=\"Endereço\" description=\"Usado para entrega\" layout=\"grid\" columns={3}>\n * <Input label=\"CEP\" />\n * <Input label=\"Rua\" />\n * <Input label=\"Número\" />\n * </FormSection>\n */\nexport function FormSection({\n title,\n description,\n layout = \"stack\",\n columns,\n gap,\n className,\n style,\n children,\n ...props\n}: FormSectionProps) {\n const bodyStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n };\n return (\n <section className={cn(styles.section, className)} style={style} {...props}>\n {(title || description) && (\n <header className={styles.sectionHeader}>\n {title && <h3 className={styles.sectionTitle}>{title}</h3>}\n {description && <p className={styles.sectionDescription}>{description}</p>}\n </header>\n )}\n <div className={cn(styles.sectionBody, styles[layout])} style={bodyStyle}>\n {children}\n </div>\n </section>\n );\n}\n\nexport interface FormRowProps extends HTMLAttributes<HTMLDivElement> {\n /** Gap between row items. Numbers map to a multiple of the 4px scale (default `3` → 12px). */\n gap?: number | string;\n}\n\n/**\n * Forces a horizontal row regardless of parent layout — useful for grouping\n * two short fields side-by-side inside an otherwise stacked form (e.g. CEP +\n * city, expiry month + year).\n *\n * @example\n * <Form layout=\"stack\">\n * <FormRow>\n * <Input label=\"CEP\" />\n * <Input label=\"Cidade\" />\n * </FormRow>\n * <Input label=\"Endereço completo\" />\n * </Form>\n */\nexport function FormRow({ gap, className, style, children, ...props }: FormRowProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 3), ...style };\n return (\n <div className={cn(styles.row, className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface FormActionsProps extends HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment of buttons. Default `end`. */\n align?: FormActionsAlign;\n /** Gap between buttons. Numbers map to a multiple of the 4px scale (default `2` → 8px). */\n gap?: number | string;\n}\n\n/**\n * Footer button row for a form. Use inside (or after) [[Form]] / [[FormSection]].\n *\n * @example\n * <FormActions align=\"end\">\n * <Button variant=\"ghost\" onClick={onCancel}>Cancelar</Button>\n * <Button type=\"submit\" loading={form.formState.isSubmitting}>Salvar</Button>\n * </FormActions>\n */\nexport function FormActions({\n align = \"end\",\n gap,\n className,\n style,\n children,\n ...props\n}: FormActionsProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 2), ...style };\n return (\n <div className={cn(styles.actions, styles[align], className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n"],"mappings":"A,2HAiBA,SAASO,EAAW,EAAkC,EAA0B,CAE5E,OADIC,IAAQ,IAAA,GAAkB,GAAGC,EAAW,EAAE,IACvC,OAAOD,GAAQ,SAAW,GAAGA,EAAM,EAAE,IAAMA,CACtD,CAEA,SAASE,EAAe,EAA8C,CAElE,OADIC,IAAY,IAAA,GAAkB,4BAC3B,OAAOA,GAAY,SAAW,UAAUA,EAAQ,mBAAqBA,CAChF,CAkBA,IAAaC,GAAA,EAAOZ,EAAAA,WAAAA,CAAuC,SACvD,CAAE,SAAS,QAAS,UAAS,MAAK,YAAW,QAAO,WAAU,GAAGa,GACjE,EACF,CACE,IAAMC,EAA4B,CAC9B,IAAKP,EAAWC,EAAK,CAAC,EACtB,GAAIO,IAAW,OAAS,CAAE,oBAAqBL,EAAeC,CAAO,CAAE,EAAI,KAC3E,GAAGK,CACP,EACA,OACI,EAAAV,EAAA,IAAA,CAAC,OAAD,CACS,MACL,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,KAAMA,EAAAA,QAAOa,GAASE,CAAS,EACpD,MAAOH,EACP,GAAID,EAEH,UACC,CAAA,CAEd,CAAC,EA0BD,SAAgBK,EAAY,CACxB,QACA,cACA,SAAS,QACT,UACA,MACA,YACA,QACA,WACA,GAAGL,GACc,CACjB,IAAMM,EAA2B,CAC7B,IAAKZ,EAAWC,EAAK,CAAC,EACtB,GAAIO,IAAW,OAAS,CAAE,oBAAqBL,EAAeC,CAAO,CAAE,EAAI,IAC/E,EACA,OACI,EAAAL,EAAA,KAAA,CAAC,UAAD,CAAS,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,QAASe,CAAS,EAAU,QAAO,GAAIJ,EAArE,SAAA,EACMO,GAASC,KACP,EAAAf,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAWJ,EAAAA,QAAO,cAA1B,SAAA,CACKkB,IAAS,EAAAd,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWJ,EAAAA,QAAO,aAAe,SAAAkB,CAAU,CAAA,EACxDC,IAAe,EAAAf,EAAA,IAAA,CAAC,IAAD,CAAG,UAAWJ,EAAAA,QAAO,mBAAqB,SAAAmB,CAAe,CAAA,CACrE,CAEZ,CAAA,GAAA,EAAAf,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,YAAaA,EAAAA,QAAOa,EAAO,EAAG,MAAOI,EAC1D,UACA,CAAA,CACA,C,EAEjB,CAqBA,SAAgBG,EAAQ,CAAE,MAAK,YAAW,QAAO,WAAU,GAAGT,GAAuB,CACjF,IAAMC,EAA4B,CAAE,IAAKP,EAAWC,EAAK,CAAC,EAAG,GAAGQ,CAAM,EACtE,OACI,EAAAV,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,IAAKe,CAAS,EAAG,MAAOH,EAAY,GAAID,EAC7D,UACA,CAAA,CAEb,CAkBA,SAAgBU,EAAY,CACxB,QAAQ,MACR,MACA,YACA,QACA,WACA,GAAGV,GACc,CACjB,IAAMC,EAA4B,CAAE,IAAKP,EAAWC,EAAK,CAAC,EAAG,GAAGQ,CAAM,EACtE,OACI,EAAAV,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,QAASA,EAAAA,QAAOsB,GAAQP,CAAS,EAAG,MAAOH,EAAY,GAAID,EAChF,UACA,CAAA,CAEb,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"Form.js","names":[],"sources":["../../../src/components/Form/Form.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { CSSProperties, FormHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Form.module.css\";\n\nexport type FormLayout = \"stack\" | \"inline\" | \"grid\";\nexport type FormActionsAlign = \"start\" | \"center\" | \"end\" | \"between\";\n\ninterface LayoutProps {\n /** Field arrangement. `stack` stacks fields vertically, `inline` lines them up in a wrapping row, `grid` arranges them in `columns` equal-width tracks. Default `stack`. */\n layout?: FormLayout;\n /** Number of columns when `layout=\"grid\"`, or a custom `grid-template-columns` value. Default `2`. */\n columns?: number | string;\n /** Gap between fields. Numbers map to a multiple of the 4px scale (default `4` → 16px). */\n gap?: number | string;\n}\n\nfunction resolveGap(gap: number | string | undefined, fallback: number): string {\n if (gap === undefined) return `${fallback * 4}px`;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string {\n if (columns === undefined) return \"repeat(2, minmax(0, 1fr))\";\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\nexport interface FormProps extends FormHTMLAttributes<HTMLFormElement>, LayoutProps {}\n\n/**\n * Form wrapper with a built-in layout variant. Replaces ad-hoc `<form>` +\n * `<Stack>` / `<Grid>` boilerplate; pair with [[FormRow]], [[FormSection]],\n * and [[FormActions]] for richer layouts.\n *\n * @example\n * <Form layout=\"grid\" columns={2} gap={4} onSubmit={form.handleSubmit(save)}>\n * <Input label=\"Nome\" {...form.register(\"name\")} />\n * <Input label=\"Email\" {...form.register(\"email\")} />\n * <FormActions align=\"end\">\n * <Button type=\"submit\">Salvar</Button>\n * </FormActions>\n * </Form>\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n { layout = \"stack\", columns, gap, className, style, children, ...props },\n ref,\n) {\n const finalStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n ...style,\n };\n return (\n <form\n ref={ref}\n className={cn(styles.form, styles[layout], className)}\n style={finalStyle}\n {...props}\n >\n {children}\n </form>\n );\n});\n\nexport interface FormSectionProps extends Omit<HTMLAttributes<HTMLElement>, \"title\">, LayoutProps {\n title?: ReactNode;\n description?: ReactNode;\n}\n\n/**\n * Visually grouped subset of fields with an optional title and description.\n * Has its own `layout`/`columns`/`gap` so subsets can stack while the parent\n * grids (or vice versa).\n *\n * The header is deliberately not a `SectionHeader`: a field group sits one step\n * below a page section, and its title is `text-lg` / semibold / `leading-snug`\n * with `space-3` below, against `text-2xl` / bold / `leading-tight` with\n * `space-5` for `SectionHeader`. Sharing the component would either grow every\n * form group to page-section size or add a size switch to `SectionHeader` that\n * only this caller uses.\n *\n * @example\n * <FormSection title=\"Endereço\" description=\"Usado para entrega\" layout=\"grid\" columns={3}>\n * <Input label=\"CEP\" />\n * <Input label=\"Rua\" />\n * <Input label=\"Número\" />\n * </FormSection>\n */\nexport function FormSection({\n title,\n description,\n layout = \"stack\",\n columns,\n gap,\n className,\n style,\n children,\n ...props\n}: FormSectionProps) {\n const bodyStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n };\n return (\n <section className={cn(styles.section, className)} style={style} {...props}>\n {(title || description) && (\n <header className={styles.sectionHeader}>\n {title && <h3 className={styles.sectionTitle}>{title}</h3>}\n {description && <p className={styles.sectionDescription}>{description}</p>}\n </header>\n )}\n <div className={cn(styles.sectionBody, styles[layout])} style={bodyStyle}>\n {children}\n </div>\n </section>\n );\n}\n\nexport interface FormRowProps extends HTMLAttributes<HTMLDivElement> {\n /** Gap between row items. Numbers map to a multiple of the 4px scale (default `3` → 12px). */\n gap?: number | string;\n}\n\n/**\n * Forces a horizontal row regardless of parent layout — useful for grouping\n * two short fields side-by-side inside an otherwise stacked form (e.g. CEP +\n * city, expiry month + year).\n *\n * @example\n * <Form layout=\"stack\">\n * <FormRow>\n * <Input label=\"CEP\" />\n * <Input label=\"Cidade\" />\n * </FormRow>\n * <Input label=\"Endereço completo\" />\n * </Form>\n */\nexport function FormRow({ gap, className, style, children, ...props }: FormRowProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 3), ...style };\n return (\n <div className={cn(styles.row, className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface FormActionsProps extends HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment of buttons. Default `end`. */\n align?: FormActionsAlign;\n /** Gap between buttons. Numbers map to a multiple of the 4px scale (default `2` → 8px). */\n gap?: number | string;\n}\n\n/**\n * Footer button row for a form. Use inside (or after) [[Form]] / [[FormSection]].\n *\n * @example\n * <FormActions align=\"end\">\n * <Button variant=\"ghost\" onClick={onCancel}>Cancelar</Button>\n * <Button type=\"submit\" loading={form.formState.isSubmitting}>Salvar</Button>\n * </FormActions>\n */\nexport function FormActions({\n align = \"end\",\n gap,\n className,\n style,\n children,\n ...props\n}: FormActionsProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 2), ...style };\n return (\n <div className={cn(styles.actions, styles[align], className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;AAiBA,SAAS,EAAW,GAAkC,GAA0B;CAE5E,OADI,MAAQ,KAAA,IAAkB,GAAG,IAAW,EAAE,MACvC,OAAO,KAAQ,WAAW,GAAG,IAAM,EAAE,MAAM;AACtD;AAEA,SAAS,EAAe,GAA8C;CAElE,OADI,MAAY,KAAA,IAAkB,8BAC3B,OAAO,KAAY,WAAW,UAAU,EAAQ,qBAAqB;AAChF;AAkBA,IAAa,IAAO,EAAuC,SACvD,EAAE,YAAS,SAAS,YAAS,QAAK,cAAW,UAAO,aAAU,GAAG,KACjE,GACF;CACE,IAAM,IAA4B;EAC9B,KAAK,EAAW,GAAK,CAAC;EACtB,GAAI,MAAW,SAAS,EAAE,qBAAqB,EAAe,CAAO,EAAE,IAAI;EAC3E,GAAG;CACP;CACA,OACI,kBAAC,QAAD;EACS;EACL,WAAW,EAAG,EAAO,MAAM,EAAO,IAAS,CAAS;EACpD,OAAO;EACP,GAAI;EAEH;CACC,CAAA;AAEd,CAAC;AA0BD,SAAgB,EAAY,EACxB,UACA,gBACA,YAAS,SACT,YACA,QACA,cACA,UACA,aACA,GAAG,KACc;CACjB,IAAM,IAA2B;EAC7B,KAAK,EAAW,GAAK,CAAC;EACtB,GAAI,MAAW,SAAS,EAAE,qBAAqB,EAAe,CAAO,EAAE,IAAI;CAC/E;CACA,OACI,kBAAC,WAAD;EAAS,WAAW,EAAG,EAAO,SAAS,CAAS;EAAU;EAAO,GAAI;EAArE,UAAA,EACM,KAAS,MACP,kBAAC,UAAD;GAAQ,WAAW,EAAO;GAA1B,UAAA,CACK,KAAS,kBAAC,MAAD;IAAI,WAAW,EAAO;IAAe,UAAA;GAAU,CAAA,GACxD,KAAe,kBAAC,KAAD;IAAG,WAAW,EAAO;IAAqB,UAAA;GAAe,CAAA,CACrE;EAEZ,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAW,EAAG,EAAO,aAAa,EAAO,EAAO;GAAG,OAAO;GAC1D;EACA,CAAA,CACA;;AAEjB;AAqBA,SAAgB,EAAQ,EAAE,QAAK,cAAW,UAAO,aAAU,GAAG,KAAuB;CACjF,IAAM,IAA4B;EAAE,KAAK,EAAW,GAAK,CAAC;EAAG,GAAG;CAAM;CACtE,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,KAAK,CAAS;EAAG,OAAO;EAAY,GAAI;EAC7D;CACA,CAAA;AAEb;AAkBA,SAAgB,EAAY,EACxB,WAAQ,OACR,QACA,cACA,UACA,aACA,GAAG,KACc;CACjB,IAAM,IAA4B;EAAE,KAAK,EAAW,GAAK,CAAC;EAAG,GAAG;CAAM;CACtE,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,SAAS,EAAO,IAAQ,CAAS;EAAG,OAAO;EAAY,GAAI;EAChF;CACA,CAAA;AAEb"}
1
+ {"version":3,"file":"Form.js","names":["styles","Form_module_default","resolveGap","gap","fallback","resolveColumns","columns","Form","forwardRef","props","finalStyle","layout","style","cn","className","FormSection","bodyStyle","title","description","FormRow","FormActions","align"],"sources":["../../../src/components/Form/Form.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { CSSProperties, FormHTMLAttributes, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Form.module.css\";\n\nexport type FormLayout = \"stack\" | \"inline\" | \"grid\";\nexport type FormActionsAlign = \"start\" | \"center\" | \"end\" | \"between\";\n\ninterface LayoutProps {\n /** Field arrangement. `stack` stacks fields vertically, `inline` lines them up in a wrapping row, `grid` arranges them in `columns` equal-width tracks. Default `stack`. */\n layout?: FormLayout;\n /** Number of columns when `layout=\"grid\"`, or a custom `grid-template-columns` value. Default `2`. */\n columns?: number | string;\n /** Gap between fields. Numbers map to a multiple of the 4px scale (default `4` → 16px). */\n gap?: number | string;\n}\n\nfunction resolveGap(gap: number | string | undefined, fallback: number): string {\n if (gap === undefined) return `${fallback * 4}px`;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string {\n if (columns === undefined) return \"repeat(2, minmax(0, 1fr))\";\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\nexport interface FormProps extends FormHTMLAttributes<HTMLFormElement>, LayoutProps {}\n\n/**\n * Form wrapper with a built-in layout variant. Replaces ad-hoc `<form>` +\n * `<Stack>` / `<Grid>` boilerplate; pair with [[FormRow]], [[FormSection]],\n * and [[FormActions]] for richer layouts.\n *\n * @example\n * <Form layout=\"grid\" columns={2} gap={4} onSubmit={form.handleSubmit(save)}>\n * <Input label=\"Nome\" {...form.register(\"name\")} />\n * <Input label=\"Email\" {...form.register(\"email\")} />\n * <FormActions align=\"end\">\n * <Button type=\"submit\">Salvar</Button>\n * </FormActions>\n * </Form>\n */\nexport const Form = forwardRef<HTMLFormElement, FormProps>(function Form(\n { layout = \"stack\", columns, gap, className, style, children, ...props },\n ref,\n) {\n const finalStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n ...style,\n };\n return (\n <form\n ref={ref}\n className={cn(styles.form, styles[layout], className)}\n style={finalStyle}\n {...props}\n >\n {children}\n </form>\n );\n});\n\nexport interface FormSectionProps extends Omit<HTMLAttributes<HTMLElement>, \"title\">, LayoutProps {\n title?: ReactNode;\n description?: ReactNode;\n}\n\n/**\n * Visually grouped subset of fields with an optional title and description.\n * Has its own `layout`/`columns`/`gap` so subsets can stack while the parent\n * grids (or vice versa).\n *\n * The header is deliberately not a `SectionHeader`: a field group sits one step\n * below a page section, and its title is `text-lg` / semibold / `leading-snug`\n * with `space-3` below, against `text-2xl` / bold / `leading-tight` with\n * `space-5` for `SectionHeader`. Sharing the component would either grow every\n * form group to page-section size or add a size switch to `SectionHeader` that\n * only this caller uses.\n *\n * @example\n * <FormSection title=\"Endereço\" description=\"Usado para entrega\" layout=\"grid\" columns={3}>\n * <Input label=\"CEP\" />\n * <Input label=\"Rua\" />\n * <Input label=\"Número\" />\n * </FormSection>\n */\nexport function FormSection({\n title,\n description,\n layout = \"stack\",\n columns,\n gap,\n className,\n style,\n children,\n ...props\n}: FormSectionProps) {\n const bodyStyle: CSSProperties = {\n gap: resolveGap(gap, 4),\n ...(layout === \"grid\" ? { gridTemplateColumns: resolveColumns(columns) } : null),\n };\n return (\n <section className={cn(styles.section, className)} style={style} {...props}>\n {(title || description) && (\n <header className={styles.sectionHeader}>\n {title && <h3 className={styles.sectionTitle}>{title}</h3>}\n {description && <p className={styles.sectionDescription}>{description}</p>}\n </header>\n )}\n <div className={cn(styles.sectionBody, styles[layout])} style={bodyStyle}>\n {children}\n </div>\n </section>\n );\n}\n\nexport interface FormRowProps extends HTMLAttributes<HTMLDivElement> {\n /** Gap between row items. Numbers map to a multiple of the 4px scale (default `3` → 12px). */\n gap?: number | string;\n}\n\n/**\n * Forces a horizontal row regardless of parent layout — useful for grouping\n * two short fields side-by-side inside an otherwise stacked form (e.g. CEP +\n * city, expiry month + year).\n *\n * @example\n * <Form layout=\"stack\">\n * <FormRow>\n * <Input label=\"CEP\" />\n * <Input label=\"Cidade\" />\n * </FormRow>\n * <Input label=\"Endereço completo\" />\n * </Form>\n */\nexport function FormRow({ gap, className, style, children, ...props }: FormRowProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 3), ...style };\n return (\n <div className={cn(styles.row, className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n\nexport interface FormActionsProps extends HTMLAttributes<HTMLDivElement> {\n /** Horizontal alignment of buttons. Default `end`. */\n align?: FormActionsAlign;\n /** Gap between buttons. Numbers map to a multiple of the 4px scale (default `2` → 8px). */\n gap?: number | string;\n}\n\n/**\n * Footer button row for a form. Use inside (or after) [[Form]] / [[FormSection]].\n *\n * @example\n * <FormActions align=\"end\">\n * <Button variant=\"ghost\" onClick={onCancel}>Cancelar</Button>\n * <Button type=\"submit\" loading={form.formState.isSubmitting}>Salvar</Button>\n * </FormActions>\n */\nexport function FormActions({\n align = \"end\",\n gap,\n className,\n style,\n children,\n ...props\n}: FormActionsProps) {\n const finalStyle: CSSProperties = { gap: resolveGap(gap, 2), ...style };\n return (\n <div className={cn(styles.actions, styles[align], className)} style={finalStyle} {...props}>\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;AAiBA,SAASE,EAAW,GAAkC,GAA0B;CAE5E,OADIC,MAAQ,KAAA,IAAkB,GAAGC,IAAW,EAAE,MACvC,OAAOD,KAAQ,WAAW,GAAGA,IAAM,EAAE,MAAMA;AACtD;AAEA,SAASE,EAAe,GAA8C;CAElE,OADIC,MAAY,KAAA,IAAkB,8BAC3B,OAAOA,KAAY,WAAW,UAAUA,EAAQ,qBAAqBA;AAChF;AAkBA,IAAaC,IAAOC,EAAuC,SACvD,EAAE,YAAS,SAAS,YAAS,QAAK,cAAW,UAAO,aAAU,GAAGC,KACjE,GACF;CACE,IAAMC,IAA4B;EAC9B,KAAKR,EAAWC,GAAK,CAAC;EACtB,GAAIQ,MAAW,SAAS,EAAE,qBAAqBN,EAAeC,CAAO,EAAE,IAAI;EAC3E,GAAGM;CACP;CACA,OACI,kBAAC,QAAD;EACS;EACL,WAAWC,EAAGb,EAAO,MAAMA,EAAOW,IAASG,CAAS;EACpD,OAAOJ;EACP,GAAID;EAEH;CACC,CAAA;AAEd,CAAC;AA0BD,SAAgBM,EAAY,EACxB,UACA,gBACA,YAAS,SACT,YACA,QACA,cACA,UACA,aACA,GAAGN,KACc;CACjB,IAAMO,IAA2B;EAC7B,KAAKd,EAAWC,GAAK,CAAC;EACtB,GAAIQ,MAAW,SAAS,EAAE,qBAAqBN,EAAeC,CAAO,EAAE,IAAI;CAC/E;CACA,OACI,kBAAC,WAAD;EAAS,WAAWO,EAAGb,EAAO,SAASc,CAAS;EAAU;EAAO,GAAIL;EAArE,UAAA,EACMQ,KAASC,MACP,kBAAC,UAAD;GAAQ,WAAWlB,EAAO;GAA1B,UAAA,CACKiB,KAAS,kBAAC,MAAD;IAAI,WAAWjB,EAAO;IAAe,UAAAiB;GAAU,CAAA,GACxDC,KAAe,kBAAC,KAAD;IAAG,WAAWlB,EAAO;IAAqB,UAAAkB;GAAe,CAAA,CACrE;EAEZ,CAAA,GAAA,kBAAC,OAAD;GAAK,WAAWL,EAAGb,EAAO,aAAaA,EAAOW,EAAO;GAAG,OAAOK;GAC1D;EACA,CAAA,CACA;;AAEjB;AAqBA,SAAgBG,EAAQ,EAAE,QAAK,cAAW,UAAO,aAAU,GAAGV,KAAuB;CACjF,IAAMC,IAA4B;EAAE,KAAKR,EAAWC,GAAK,CAAC;EAAG,GAAGS;CAAM;CACtE,OACI,kBAAC,OAAD;EAAK,WAAWC,EAAGb,EAAO,KAAKc,CAAS;EAAG,OAAOJ;EAAY,GAAID;EAC7D;CACA,CAAA;AAEb;AAkBA,SAAgBW,EAAY,EACxB,WAAQ,OACR,QACA,cACA,UACA,aACA,GAAGX,KACc;CACjB,IAAMC,IAA4B;EAAE,KAAKR,EAAWC,GAAK,CAAC;EAAG,GAAGS;CAAM;CACtE,OACI,kBAAC,OAAD;EAAK,WAAWC,EAAGb,EAAO,SAASA,EAAOqB,IAAQP,CAAS;EAAG,OAAOJ;EAAY,GAAID;EAChF;CACA,CAAA;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Form.module.cjs","names":[],"sources":["../../../src/components/Form/Form.module.css"],"sourcesContent":[".form {\n display: flex;\n width: 100%;\n font-family: var(--tempest-font-sans);\n}\n\n.form.stack {\n flex-direction: column;\n}\n\n.form.inline {\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.form.grid {\n display: grid;\n width: 100%;\n}\n\n.section {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.sectionHeader {\n display: flex;\n flex-direction: column;\n margin-bottom: var(--tempest-space-3);\n}\n\n.sectionTitle {\n font-size: var(--tempest-text-lg);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n margin: 0;\n}\n\n.sectionDescription {\n font-size: var(--tempest-text-sm);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n margin: var(--tempest-space-1) 0 0;\n}\n\n.sectionBody {\n display: flex;\n width: 100%;\n}\n\n.sectionBody.stack {\n flex-direction: column;\n}\n\n.sectionBody.inline {\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.sectionBody.grid {\n display: grid;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n width: 100%;\n}\n\n.row > * {\n flex: 1 1 0;\n min-width: 0;\n}\n\n/* On mobile, rows collapse to single column for legibility. */\n@media (max-width: 639.98px) {\n .row {\n flex-direction: column;\n align-items: stretch;\n }\n .row > * {\n flex: 1 1 auto;\n }\n}\n\n.actions {\n display: flex;\n flex-direction: row;\n width: 100%;\n margin-top: var(--tempest-space-2);\n}\n\n.actions.start {\n justify-content: flex-start;\n}\n\n.actions.center {\n justify-content: center;\n}\n\n.actions.end {\n justify-content: flex-end;\n}\n\n.actions.between {\n justify-content: space-between;\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"Form.module.cjs","names":["form","stack","inline","grid","section","sectionHeader","sectionTitle","sectionDescription","sectionBody","row","actions","start","center","end","between","Form_module_default"],"sources":["../../../src/components/Form/Form.module.css"],"sourcesContent":[".form {\n display: flex;\n width: 100%;\n font-family: var(--tempest-font-sans);\n}\n\n.form.stack {\n flex-direction: column;\n}\n\n.form.inline {\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.form.grid {\n display: grid;\n width: 100%;\n}\n\n.section {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.sectionHeader {\n display: flex;\n flex-direction: column;\n margin-bottom: var(--tempest-space-3);\n}\n\n.sectionTitle {\n font-size: var(--tempest-text-lg);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n margin: 0;\n}\n\n.sectionDescription {\n font-size: var(--tempest-text-sm);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n margin: var(--tempest-space-1) 0 0;\n}\n\n.sectionBody {\n display: flex;\n width: 100%;\n}\n\n.sectionBody.stack {\n flex-direction: column;\n}\n\n.sectionBody.inline {\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.sectionBody.grid {\n display: grid;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n width: 100%;\n}\n\n.row > * {\n flex: 1 1 0;\n min-width: 0;\n}\n\n/* On mobile, rows collapse to single column for legibility. */\n@media (max-width: 639.98px) {\n .row {\n flex-direction: column;\n align-items: stretch;\n }\n .row > * {\n flex: 1 1 auto;\n }\n}\n\n.actions {\n display: flex;\n flex-direction: row;\n width: 100%;\n margin-top: var(--tempest-space-2);\n}\n\n.actions.start {\n justify-content: flex-start;\n}\n\n.actions.center {\n justify-content: center;\n}\n\n.actions.end {\n justify-content: flex-end;\n}\n\n.actions.between {\n justify-content: space-between;\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"Form.module.js","names":[],"sources":["../../../src/components/Form/Form.module.css"],"sourcesContent":[".form {\n display: flex;\n width: 100%;\n font-family: var(--tempest-font-sans);\n}\n\n.form.stack {\n flex-direction: column;\n}\n\n.form.inline {\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.form.grid {\n display: grid;\n width: 100%;\n}\n\n.section {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.sectionHeader {\n display: flex;\n flex-direction: column;\n margin-bottom: var(--tempest-space-3);\n}\n\n.sectionTitle {\n font-size: var(--tempest-text-lg);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n margin: 0;\n}\n\n.sectionDescription {\n font-size: var(--tempest-text-sm);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n margin: var(--tempest-space-1) 0 0;\n}\n\n.sectionBody {\n display: flex;\n width: 100%;\n}\n\n.sectionBody.stack {\n flex-direction: column;\n}\n\n.sectionBody.inline {\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.sectionBody.grid {\n display: grid;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n width: 100%;\n}\n\n.row > * {\n flex: 1 1 0;\n min-width: 0;\n}\n\n/* On mobile, rows collapse to single column for legibility. */\n@media (max-width: 639.98px) {\n .row {\n flex-direction: column;\n align-items: stretch;\n }\n .row > * {\n flex: 1 1 auto;\n }\n}\n\n.actions {\n display: flex;\n flex-direction: row;\n width: 100%;\n margin-top: var(--tempest-space-2);\n}\n\n.actions.start {\n justify-content: flex-start;\n}\n\n.actions.center {\n justify-content: center;\n}\n\n.actions.end {\n justify-content: flex-end;\n}\n\n.actions.between {\n justify-content: space-between;\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"Form.module.js","names":["form","stack","inline","grid","section","sectionHeader","sectionTitle","sectionDescription","sectionBody","row","actions","start","center","end","between","Form_module_default"],"sources":["../../../src/components/Form/Form.module.css"],"sourcesContent":[".form {\n display: flex;\n width: 100%;\n font-family: var(--tempest-font-sans);\n}\n\n.form.stack {\n flex-direction: column;\n}\n\n.form.inline {\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.form.grid {\n display: grid;\n width: 100%;\n}\n\n.section {\n display: flex;\n flex-direction: column;\n width: 100%;\n}\n\n.sectionHeader {\n display: flex;\n flex-direction: column;\n margin-bottom: var(--tempest-space-3);\n}\n\n.sectionTitle {\n font-size: var(--tempest-text-lg);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n line-height: var(--tempest-leading-snug);\n margin: 0;\n}\n\n.sectionDescription {\n font-size: var(--tempest-text-sm);\n color: var(--tempest-text-muted);\n line-height: var(--tempest-leading-snug);\n margin: var(--tempest-space-1) 0 0;\n}\n\n.sectionBody {\n display: flex;\n width: 100%;\n}\n\n.sectionBody.stack {\n flex-direction: column;\n}\n\n.sectionBody.inline {\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n}\n\n.sectionBody.grid {\n display: grid;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n flex-wrap: wrap;\n width: 100%;\n}\n\n.row > * {\n flex: 1 1 0;\n min-width: 0;\n}\n\n/* On mobile, rows collapse to single column for legibility. */\n@media (max-width: 639.98px) {\n .row {\n flex-direction: column;\n align-items: stretch;\n }\n .row > * {\n flex: 1 1 auto;\n }\n}\n\n.actions {\n display: flex;\n flex-direction: row;\n width: 100%;\n margin-top: var(--tempest-space-2);\n}\n\n.actions.start {\n justify-content: flex-start;\n}\n\n.actions.center {\n justify-content: center;\n}\n\n.actions.end {\n justify-content: flex-end;\n}\n\n.actions.between {\n justify-content: space-between;\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"HoverCard.cjs","names":[],"sources":["../../../src/components/HoverCard/HoverCard.tsx"],"sourcesContent":["import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { Portal } from \"@/components/Portal\";\nimport { useAnchorPosition } from \"@/components/Portal/anchor-position\";\nimport { usePortalTabOrder } from \"@/components/Portal/tab-bridge\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./HoverCard.module.css\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface HoverCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Element the user hovers/focuses to reveal the card. */\n trigger: ReactNode;\n /** Card content shown while hovering/focusing the trigger or the card itself. */\n children: ReactNode;\n /** Delay in ms before opening on mouseenter/focus. Default 300. */\n openDelay?: number;\n /** Delay in ms before closing on mouseleave/blur. Default 150. */\n closeDelay?: number;\n /** Where the card is anchored relative to the trigger. Default \"bottom\". */\n placement?: HoverCardPlacement;\n /**\n * Render the card in a portal, positioned against the trigger. Default `true`.\n *\n * In flow, an ancestor with `overflow` other than `visible` clips the card — a\n * user handle in the last row of a `DataTable` showed 17% of it (measured in\n * Chrome at 1440 px). In a portal it escapes the clip and flips to the\n * opposite side at the viewport edge.\n */\n portal?: boolean;\n}\n\n/** Gap between trigger and card, in px — the in-flow CSS uses the same 8 px. */\nconst CARD_OFFSET = 8;\n\n/**\n * Content preview shown when the trigger is hovered or focused.\n *\n * - Opens after `openDelay` on `mouseenter`/`focus`.\n * - Closes after `closeDelay` on `mouseleave`/`blur`.\n * - Positioned relative to the trigger via `placement`, in a portal by default.\n * - Moving the pointer from the trigger into the card keeps it open: React\n * dispatches `mouseenter`/`mouseleave` along the component tree, and the\n * portalled card is still inside the trigger's wrapper there.\n * - A link or button in the card is the next `Tab` stop after the trigger, as it\n * was in flow.\n * - The card is rendered as a labelled `role=\"dialog\"` region; the trigger stays keyboard focusable.\n *\n * @param props - The hover card props.\n * @returns The trigger wrapper and the anchored card when open.\n */\nexport function HoverCard({\n trigger,\n children,\n openDelay = 300,\n closeDelay = 150,\n placement = \"bottom\",\n portal = true,\n className,\n style,\n ...rest\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const [rootNode, setRootNode] = useState<HTMLSpanElement | null>(null);\n const [cardNode, setCardNode] = useState<HTMLDivElement | null>(null);\n const floatingStyle = useAnchorPosition({\n anchor: rootNode,\n floating: cardNode,\n side: placement,\n align: \"center\",\n offset: CARD_OFFSET,\n enabled: portal && open,\n });\n usePortalTabOrder({ enabled: portal && open, anchor: rootNode, panel: cardNode });\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimer = useCallback((): void => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const scheduleOpen = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(true), openDelay);\n }, [clearTimer, openDelay]);\n\n const scheduleClose = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimer, closeDelay]);\n\n useEffect(() => clearTimer, [clearTimer]);\n\n const card = (\n <div\n ref={setCardNode}\n id={id}\n role=\"dialog\"\n className={cn(styles.card, styles[placement], portal && styles.portalled, className)}\n style={{ ...style, ...floatingStyle }}\n {...rest}\n >\n {children}\n </div>\n );\n\n return (\n <span\n ref={setRootNode}\n className={styles.root}\n onMouseEnter={scheduleOpen}\n onMouseLeave={scheduleClose}\n onFocus={scheduleOpen}\n onBlur={scheduleClose}\n >\n <span aria-describedby={open ? id : undefined} className={styles.trigger}>\n {trigger}\n </span>\n {open && (portal ? <Portal>{card}</Portal> : card)}\n </span>\n );\n}\n"],"mappings":"mPAiCA,IAAM,EAAc,EAkBpB,SAAgB,EAAU,CACtB,UACA,WACA,YAAY,IACZ,aAAa,IACb,YAAY,SACZ,SAAS,GACT,YACA,QACA,GAAG,GACY,CACf,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAK,EAChC,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAiC,IAAI,EAC/D,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAAgC,IAAI,EAC9D,EAAgB,EAAA,kBAAkB,CACpC,OAAQ,EACR,SAAU,EACV,KAAM,EACN,MAAO,SACP,OAAQ,EACR,QAAS,GAAU,CACvB,CAAC,EACD,EAAA,kBAAkB,CAAE,QAAS,GAAU,EAAM,OAAQ,EAAU,MAAO,CAAS,CAAC,EAChF,IAAM,GAAA,EAAK,EAAA,MAAA,CAAM,EACX,GAAA,EAAW,EAAA,OAAA,CAA6C,IAAI,EAE5D,GAAA,EAAa,EAAA,YAAA,KAAwB,CACnC,EAAS,UAAY,OACrB,aAAa,EAAS,OAAO,EAC7B,EAAS,QAAU,KAE3B,EAAG,CAAC,CAAC,EAEC,GAAA,EAAe,EAAA,YAAA,KAAwB,CACzC,EAAW,EACX,EAAS,QAAU,eAAiB,EAAQ,EAAI,EAAG,CAAS,CAChE,EAAG,CAAC,EAAY,CAAS,CAAC,EAEpB,GAAA,EAAgB,EAAA,YAAA,KAAwB,CAC1C,EAAW,EACX,EAAS,QAAU,eAAiB,EAAQ,EAAK,EAAG,CAAU,CAClE,EAAG,CAAC,EAAY,CAAU,CAAC,GAE3B,EAAA,EAAA,UAAA,KAAgB,EAAY,CAAC,CAAU,CAAC,EAExC,IAAM,GACF,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,IAAK,EACD,KACJ,KAAK,SACL,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,EAAA,QAAO,GAAY,GAAU,EAAA,QAAO,UAAW,CAAS,EACnF,MAAO,CAAE,GAAG,EAAO,GAAG,CAAc,EACpC,GAAI,EAEH,UACA,CAAA,EAGT,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CACI,IAAK,EACL,UAAW,EAAA,QAAO,KAClB,aAAc,EACd,aAAc,EACd,QAAS,EACT,OAAQ,EANZ,SAAA,EAQI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,mBAAkB,EAAO,EAAK,IAAA,GAAW,UAAW,EAAA,QAAO,QAC5D,SAAA,CACC,CAAA,EACL,IAAS,GAAS,EAAA,EAAA,IAAA,CAAC,EAAA,OAAD,CAAA,SAAS,CAAa,CAAA,EAAI,EAC3C,GAEd"}
1
+ {"version":3,"file":"HoverCard.cjs","names":["useState","useAnchorPosition","useId","useRef","useCallback","cn","styles","Portal","require_cn","require_Portal","require_anchor_position","require_tab_bridge","require_HoverCard_module","react","react_jsx_runtime","CARD_OFFSET","HoverCard","rest","open","setOpen","rootNode","setRootNode","cardNode","setCardNode","floatingStyle","placement","portal","id","timerRef","clearTimer","scheduleOpen","openDelay","scheduleClose","closeDelay","card","className","style","trigger"],"sources":["../../../src/components/HoverCard/HoverCard.tsx"],"sourcesContent":["import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { Portal } from \"@/components/Portal\";\nimport { useAnchorPosition } from \"@/components/Portal/anchor-position\";\nimport { usePortalTabOrder } from \"@/components/Portal/tab-bridge\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./HoverCard.module.css\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface HoverCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Element the user hovers/focuses to reveal the card. */\n trigger: ReactNode;\n /** Card content shown while hovering/focusing the trigger or the card itself. */\n children: ReactNode;\n /** Delay in ms before opening on mouseenter/focus. Default 300. */\n openDelay?: number;\n /** Delay in ms before closing on mouseleave/blur. Default 150. */\n closeDelay?: number;\n /** Where the card is anchored relative to the trigger. Default \"bottom\". */\n placement?: HoverCardPlacement;\n /**\n * Render the card in a portal, positioned against the trigger. Default `true`.\n *\n * In flow, an ancestor with `overflow` other than `visible` clips the card — a\n * user handle in the last row of a `DataTable` showed 17% of it (measured in\n * Chrome at 1440 px). In a portal it escapes the clip and flips to the\n * opposite side at the viewport edge.\n */\n portal?: boolean;\n}\n\n/** Gap between trigger and card, in px — the in-flow CSS uses the same 8 px. */\nconst CARD_OFFSET = 8;\n\n/**\n * Content preview shown when the trigger is hovered or focused.\n *\n * - Opens after `openDelay` on `mouseenter`/`focus`.\n * - Closes after `closeDelay` on `mouseleave`/`blur`.\n * - Positioned relative to the trigger via `placement`, in a portal by default.\n * - Moving the pointer from the trigger into the card keeps it open: React\n * dispatches `mouseenter`/`mouseleave` along the component tree, and the\n * portalled card is still inside the trigger's wrapper there.\n * - A link or button in the card is the next `Tab` stop after the trigger, as it\n * was in flow.\n * - The card is rendered as a labelled `role=\"dialog\"` region; the trigger stays keyboard focusable.\n *\n * @param props - The hover card props.\n * @returns The trigger wrapper and the anchored card when open.\n */\nexport function HoverCard({\n trigger,\n children,\n openDelay = 300,\n closeDelay = 150,\n placement = \"bottom\",\n portal = true,\n className,\n style,\n ...rest\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const [rootNode, setRootNode] = useState<HTMLSpanElement | null>(null);\n const [cardNode, setCardNode] = useState<HTMLDivElement | null>(null);\n const floatingStyle = useAnchorPosition({\n anchor: rootNode,\n floating: cardNode,\n side: placement,\n align: \"center\",\n offset: CARD_OFFSET,\n enabled: portal && open,\n });\n usePortalTabOrder({ enabled: portal && open, anchor: rootNode, panel: cardNode });\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimer = useCallback((): void => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const scheduleOpen = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(true), openDelay);\n }, [clearTimer, openDelay]);\n\n const scheduleClose = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimer, closeDelay]);\n\n useEffect(() => clearTimer, [clearTimer]);\n\n const card = (\n <div\n ref={setCardNode}\n id={id}\n role=\"dialog\"\n className={cn(styles.card, styles[placement], portal && styles.portalled, className)}\n style={{ ...style, ...floatingStyle }}\n {...rest}\n >\n {children}\n </div>\n );\n\n return (\n <span\n ref={setRootNode}\n className={styles.root}\n onMouseEnter={scheduleOpen}\n onMouseLeave={scheduleClose}\n onFocus={scheduleOpen}\n onBlur={scheduleClose}\n >\n <span aria-describedby={open ? id : undefined} className={styles.trigger}>\n {trigger}\n </span>\n {open && (portal ? <Portal>{card}</Portal> : card)}\n </span>\n );\n}\n"],"mappings":"A,mPAiCA,IAAMe,EAAc,EAkBpB,SAAgBC,EAAU,CACtB,UACA,WACA,YAAY,IACZ,aAAa,IACb,YAAY,SACZ,SAAS,GACT,YACA,QACA,GAAGC,GACY,CACf,GAAM,CAACC,EAAMC,IAAA,EAAWnB,EAAAA,SAAAA,CAAS,EAAK,EAChC,CAACoB,EAAUC,IAAA,EAAerB,EAAAA,SAAAA,CAAiC,IAAI,EAC/D,CAACsB,EAAUC,IAAA,EAAevB,EAAAA,SAAAA,CAAgC,IAAI,EAC9DwB,EAAgBvB,EAAAA,kBAAkB,CACpC,OAAQmB,EACR,SAAUE,EACV,KAAMG,EACN,MAAO,SACP,OAAQV,EACR,QAASW,GAAUR,CACvB,CAAC,EACDP,EAAA,kBAAkB,CAAE,QAASe,GAAUR,EAAM,OAAQE,EAAU,MAAOE,CAAS,CAAC,EAChF,IAAMK,GAAA,EAAKzB,EAAAA,MAAAA,CAAM,EACX0B,GAAA,EAAWzB,EAAAA,OAAAA,CAA6C,IAAI,EAE5D0B,GAAA,EAAazB,EAAAA,YAAAA,KAAwB,CACnCwB,EAAS,UAAY,OACrB,aAAaA,EAAS,OAAO,EAC7B,EAAS,QAAU,KAE3B,EAAG,CAAC,CAAC,EAECE,GAAA,EAAe1B,EAAAA,YAAAA,KAAwB,CACzCyB,EAAW,EACX,EAAS,QAAU,eAAiBV,EAAQ,EAAI,EAAGY,CAAS,CAChE,EAAG,CAACF,EAAYE,CAAS,CAAC,EAEpBC,GAAA,EAAgB5B,EAAAA,YAAAA,KAAwB,CAC1CyB,EAAW,EACX,EAAS,QAAU,eAAiBV,EAAQ,EAAK,EAAGc,CAAU,CAClE,EAAG,CAACJ,EAAYI,CAAU,CAAC,GAE3B,EAAApB,EAAA,UAAA,KAAgBgB,EAAY,CAACA,CAAU,CAAC,EAExC,IAAMK,GACF,EAAApB,EAAA,IAAA,CAAC,MAAD,CACI,IAAKS,EACD,KACJ,KAAK,SACL,UAAWlB,EAAAA,GAAGC,EAAAA,QAAO,KAAMA,EAAAA,QAAOmB,GAAYC,GAAUpB,EAAAA,QAAO,UAAW6B,CAAS,EACnF,MAAO,CAAE,GAAGC,EAAO,GAAGZ,CAAc,EACpC,GAAIP,EAEH,UACA,CAAA,EAGT,OACI,EAAAH,EAAA,KAAA,CAAC,OAAD,CACI,IAAKO,EACL,UAAWf,EAAAA,QAAO,KAClB,aAAcwB,EACd,aAAcE,EACd,QAASF,EACT,OAAQE,EANZ,SAAA,EAQI,EAAAlB,EAAA,IAAA,CAAC,OAAD,CAAM,mBAAkBI,EAAOS,EAAK,IAAA,GAAW,UAAWrB,EAAAA,QAAO,QAC5D,SAAA+B,CACC,CAAA,EACLnB,IAASQ,GAAS,EAAAZ,EAAA,IAAA,CAACP,EAAAA,OAAD,CAAA,SAAS2B,CAAa,CAAA,EAAIA,EAC3C,C,EAEd,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"HoverCard.js","names":[],"sources":["../../../src/components/HoverCard/HoverCard.tsx"],"sourcesContent":["import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { Portal } from \"@/components/Portal\";\nimport { useAnchorPosition } from \"@/components/Portal/anchor-position\";\nimport { usePortalTabOrder } from \"@/components/Portal/tab-bridge\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./HoverCard.module.css\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface HoverCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Element the user hovers/focuses to reveal the card. */\n trigger: ReactNode;\n /** Card content shown while hovering/focusing the trigger or the card itself. */\n children: ReactNode;\n /** Delay in ms before opening on mouseenter/focus. Default 300. */\n openDelay?: number;\n /** Delay in ms before closing on mouseleave/blur. Default 150. */\n closeDelay?: number;\n /** Where the card is anchored relative to the trigger. Default \"bottom\". */\n placement?: HoverCardPlacement;\n /**\n * Render the card in a portal, positioned against the trigger. Default `true`.\n *\n * In flow, an ancestor with `overflow` other than `visible` clips the card — a\n * user handle in the last row of a `DataTable` showed 17% of it (measured in\n * Chrome at 1440 px). In a portal it escapes the clip and flips to the\n * opposite side at the viewport edge.\n */\n portal?: boolean;\n}\n\n/** Gap between trigger and card, in px — the in-flow CSS uses the same 8 px. */\nconst CARD_OFFSET = 8;\n\n/**\n * Content preview shown when the trigger is hovered or focused.\n *\n * - Opens after `openDelay` on `mouseenter`/`focus`.\n * - Closes after `closeDelay` on `mouseleave`/`blur`.\n * - Positioned relative to the trigger via `placement`, in a portal by default.\n * - Moving the pointer from the trigger into the card keeps it open: React\n * dispatches `mouseenter`/`mouseleave` along the component tree, and the\n * portalled card is still inside the trigger's wrapper there.\n * - A link or button in the card is the next `Tab` stop after the trigger, as it\n * was in flow.\n * - The card is rendered as a labelled `role=\"dialog\"` region; the trigger stays keyboard focusable.\n *\n * @param props - The hover card props.\n * @returns The trigger wrapper and the anchored card when open.\n */\nexport function HoverCard({\n trigger,\n children,\n openDelay = 300,\n closeDelay = 150,\n placement = \"bottom\",\n portal = true,\n className,\n style,\n ...rest\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const [rootNode, setRootNode] = useState<HTMLSpanElement | null>(null);\n const [cardNode, setCardNode] = useState<HTMLDivElement | null>(null);\n const floatingStyle = useAnchorPosition({\n anchor: rootNode,\n floating: cardNode,\n side: placement,\n align: \"center\",\n offset: CARD_OFFSET,\n enabled: portal && open,\n });\n usePortalTabOrder({ enabled: portal && open, anchor: rootNode, panel: cardNode });\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimer = useCallback((): void => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const scheduleOpen = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(true), openDelay);\n }, [clearTimer, openDelay]);\n\n const scheduleClose = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimer, closeDelay]);\n\n useEffect(() => clearTimer, [clearTimer]);\n\n const card = (\n <div\n ref={setCardNode}\n id={id}\n role=\"dialog\"\n className={cn(styles.card, styles[placement], portal && styles.portalled, className)}\n style={{ ...style, ...floatingStyle }}\n {...rest}\n >\n {children}\n </div>\n );\n\n return (\n <span\n ref={setRootNode}\n className={styles.root}\n onMouseEnter={scheduleOpen}\n onMouseLeave={scheduleClose}\n onFocus={scheduleOpen}\n onBlur={scheduleClose}\n >\n <span aria-describedby={open ? id : undefined} className={styles.trigger}>\n {trigger}\n </span>\n {open && (portal ? <Portal>{card}</Portal> : card)}\n </span>\n );\n}\n"],"mappings":";;;;;;;;AAiCA,IAAM,IAAc;AAkBpB,SAAgB,EAAU,EACtB,YACA,aACA,eAAY,KACZ,gBAAa,KACb,eAAY,UACZ,YAAS,IACT,cACA,UACA,GAAG,KACY;CACf,IAAM,CAAC,GAAM,KAAW,EAAS,EAAK,GAChC,CAAC,GAAU,KAAe,EAAiC,IAAI,GAC/D,CAAC,GAAU,KAAe,EAAgC,IAAI,GAC9D,IAAgB,EAAkB;EACpC,QAAQ;EACR,UAAU;EACV,MAAM;EACN,OAAO;EACP,QAAQ;EACR,SAAS,KAAU;CACvB,CAAC;CACD,EAAkB;EAAE,SAAS,KAAU;EAAM,QAAQ;EAAU,OAAO;CAAS,CAAC;CAChF,IAAM,IAAK,EAAM,GACX,IAAW,EAA6C,IAAI,GAE5D,IAAa,QAAwB;EACvC,AAAI,EAAS,YAAY,SACrB,aAAa,EAAS,OAAO,GAC7B,EAAS,UAAU;CAE3B,GAAG,CAAC,CAAC,GAEC,IAAe,QAAwB;EAEzC,AADA,EAAW,GACX,EAAS,UAAU,iBAAiB,EAAQ,EAAI,GAAG,CAAS;CAChE,GAAG,CAAC,GAAY,CAAS,CAAC,GAEpB,IAAgB,QAAwB;EAE1C,AADA,EAAW,GACX,EAAS,UAAU,iBAAiB,EAAQ,EAAK,GAAG,CAAU;CAClE,GAAG,CAAC,GAAY,CAAU,CAAC;CAE3B,QAAgB,GAAY,CAAC,CAAU,CAAC;CAExC,IAAM,IACF,kBAAC,OAAD;EACI,KAAK;EACD;EACJ,MAAK;EACL,WAAW,EAAG,EAAO,MAAM,EAAO,IAAY,KAAU,EAAO,WAAW,CAAS;EACnF,OAAO;GAAE,GAAG;GAAO,GAAG;EAAc;EACpC,GAAI;EAEH;CACA,CAAA;CAGT,OACI,kBAAC,QAAD;EACI,KAAK;EACL,WAAW,EAAO;EAClB,cAAc;EACd,cAAc;EACd,SAAS;EACT,QAAQ;EANZ,UAAA,CAQI,kBAAC,QAAD;GAAM,oBAAkB,IAAO,IAAK,KAAA;GAAW,WAAW,EAAO;GAC5D,UAAA;EACC,CAAA,GACL,MAAS,IAAS,kBAAC,GAAD,EAAA,UAAS,EAAa,CAAA,IAAI,EAC3C;;AAEd"}
1
+ {"version":3,"file":"HoverCard.js","names":["styles","HoverCard_module_default","CARD_OFFSET","HoverCard","rest","open","setOpen","useState","rootNode","setRootNode","cardNode","setCardNode","floatingStyle","useAnchorPosition","placement","portal","id","useId","timerRef","useRef","clearTimer","useCallback","scheduleOpen","openDelay","scheduleClose","closeDelay","card","cn","className","style","trigger","Portal"],"sources":["../../../src/components/HoverCard/HoverCard.tsx"],"sourcesContent":["import { useCallback, useEffect, useId, useRef, useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { Portal } from \"@/components/Portal\";\nimport { useAnchorPosition } from \"@/components/Portal/anchor-position\";\nimport { usePortalTabOrder } from \"@/components/Portal/tab-bridge\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./HoverCard.module.css\";\n\nexport type HoverCardPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface HoverCardProps extends HTMLAttributes<HTMLDivElement> {\n /** Element the user hovers/focuses to reveal the card. */\n trigger: ReactNode;\n /** Card content shown while hovering/focusing the trigger or the card itself. */\n children: ReactNode;\n /** Delay in ms before opening on mouseenter/focus. Default 300. */\n openDelay?: number;\n /** Delay in ms before closing on mouseleave/blur. Default 150. */\n closeDelay?: number;\n /** Where the card is anchored relative to the trigger. Default \"bottom\". */\n placement?: HoverCardPlacement;\n /**\n * Render the card in a portal, positioned against the trigger. Default `true`.\n *\n * In flow, an ancestor with `overflow` other than `visible` clips the card — a\n * user handle in the last row of a `DataTable` showed 17% of it (measured in\n * Chrome at 1440 px). In a portal it escapes the clip and flips to the\n * opposite side at the viewport edge.\n */\n portal?: boolean;\n}\n\n/** Gap between trigger and card, in px — the in-flow CSS uses the same 8 px. */\nconst CARD_OFFSET = 8;\n\n/**\n * Content preview shown when the trigger is hovered or focused.\n *\n * - Opens after `openDelay` on `mouseenter`/`focus`.\n * - Closes after `closeDelay` on `mouseleave`/`blur`.\n * - Positioned relative to the trigger via `placement`, in a portal by default.\n * - Moving the pointer from the trigger into the card keeps it open: React\n * dispatches `mouseenter`/`mouseleave` along the component tree, and the\n * portalled card is still inside the trigger's wrapper there.\n * - A link or button in the card is the next `Tab` stop after the trigger, as it\n * was in flow.\n * - The card is rendered as a labelled `role=\"dialog\"` region; the trigger stays keyboard focusable.\n *\n * @param props - The hover card props.\n * @returns The trigger wrapper and the anchored card when open.\n */\nexport function HoverCard({\n trigger,\n children,\n openDelay = 300,\n closeDelay = 150,\n placement = \"bottom\",\n portal = true,\n className,\n style,\n ...rest\n}: HoverCardProps) {\n const [open, setOpen] = useState(false);\n const [rootNode, setRootNode] = useState<HTMLSpanElement | null>(null);\n const [cardNode, setCardNode] = useState<HTMLDivElement | null>(null);\n const floatingStyle = useAnchorPosition({\n anchor: rootNode,\n floating: cardNode,\n side: placement,\n align: \"center\",\n offset: CARD_OFFSET,\n enabled: portal && open,\n });\n usePortalTabOrder({ enabled: portal && open, anchor: rootNode, panel: cardNode });\n const id = useId();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const clearTimer = useCallback((): void => {\n if (timerRef.current !== null) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n const scheduleOpen = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(true), openDelay);\n }, [clearTimer, openDelay]);\n\n const scheduleClose = useCallback((): void => {\n clearTimer();\n timerRef.current = setTimeout(() => setOpen(false), closeDelay);\n }, [clearTimer, closeDelay]);\n\n useEffect(() => clearTimer, [clearTimer]);\n\n const card = (\n <div\n ref={setCardNode}\n id={id}\n role=\"dialog\"\n className={cn(styles.card, styles[placement], portal && styles.portalled, className)}\n style={{ ...style, ...floatingStyle }}\n {...rest}\n >\n {children}\n </div>\n );\n\n return (\n <span\n ref={setRootNode}\n className={styles.root}\n onMouseEnter={scheduleOpen}\n onMouseLeave={scheduleClose}\n onFocus={scheduleOpen}\n onBlur={scheduleClose}\n >\n <span aria-describedby={open ? id : undefined} className={styles.trigger}>\n {trigger}\n </span>\n {open && (portal ? <Portal>{card}</Portal> : card)}\n </span>\n );\n}\n"],"mappings":";;;;;;;;AAiCA,IAAME,IAAc;AAkBpB,SAAgBC,EAAU,EACtB,YACA,aACA,eAAY,KACZ,gBAAa,KACb,eAAY,UACZ,YAAS,IACT,cACA,UACA,GAAGC,KACY;CACf,IAAM,CAACC,GAAMC,KAAWC,EAAS,EAAK,GAChC,CAACC,GAAUC,KAAeF,EAAiC,IAAI,GAC/D,CAACG,GAAUC,KAAeJ,EAAgC,IAAI,GAC9DK,IAAgBC,EAAkB;EACpC,QAAQL;EACR,UAAUE;EACV,MAAMI;EACN,OAAO;EACP,QAAQZ;EACR,SAASa,KAAUV;CACvB,CAAC;CACD,EAAkB;EAAE,SAASU,KAAUV;EAAM,QAAQG;EAAU,OAAOE;CAAS,CAAC;CAChF,IAAMM,IAAKC,EAAM,GACXC,IAAWC,EAA6C,IAAI,GAE5DC,IAAaC,QAAwB;EACvC,AAAIH,EAAS,YAAY,SACrB,aAAaA,EAAS,OAAO,GAC7B,EAAS,UAAU;CAE3B,GAAG,CAAC,CAAC,GAECI,IAAeD,QAAwB;EAEzC,AADAD,EAAW,GACX,EAAS,UAAU,iBAAiBd,EAAQ,EAAI,GAAGiB,CAAS;CAChE,GAAG,CAACH,GAAYG,CAAS,CAAC,GAEpBC,IAAgBH,QAAwB;EAE1C,AADAD,EAAW,GACX,EAAS,UAAU,iBAAiBd,EAAQ,EAAK,GAAGmB,CAAU;CAClE,GAAG,CAACL,GAAYK,CAAU,CAAC;CAE3B,QAAgBL,GAAY,CAACA,CAAU,CAAC;CAExC,IAAMM,IACF,kBAAC,OAAD;EACI,KAAKf;EACD;EACJ,MAAK;EACL,WAAWgB,EAAG3B,EAAO,MAAMA,EAAOc,IAAYC,KAAUf,EAAO,WAAW4B,CAAS;EACnF,OAAO;GAAE,GAAGC;GAAO,GAAGjB;EAAc;EACpC,GAAIR;EAEH;CACA,CAAA;CAGT,OACI,kBAAC,QAAD;EACI,KAAKK;EACL,WAAWT,EAAO;EAClB,cAAcsB;EACd,cAAcE;EACd,SAASF;EACT,QAAQE;EANZ,UAAA,CAQI,kBAAC,QAAD;GAAM,oBAAkBnB,IAAOW,IAAK,KAAA;GAAW,WAAWhB,EAAO;GAC5D,UAAA8B;EACC,CAAA,GACLzB,MAASU,IAAS,kBAACgB,GAAD,EAAA,UAASL,EAAa,CAAA,IAAIA,EAC3C;;AAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"HoverCard.module.cjs","names":[],"sources":["../../../src/components/HoverCard/HoverCard.module.css"],"sourcesContent":[".root {\n position: relative;\n display: inline-flex;\n}\n\n.trigger {\n display: inline-flex;\n}\n\n.card {\n position: absolute;\n z-index: var(--tempest-z-popover);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n min-width: 200px;\n max-width: 320px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n animation: tempest-hover-card-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.card:focus {\n outline: none;\n}\n\n/* Placements (center-aligned across the trigger). */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n\n.portalled {\n right: auto;\n bottom: auto;\n transform: none;\n}\n\n@keyframes tempest-hover-card-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .card {\n animation: none;\n }\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"HoverCard.module.cjs","names":["root","trigger","card","tempestHoverCardIn","top","bottom","left","right","portalled","HoverCard_module_default"],"sources":["../../../src/components/HoverCard/HoverCard.module.css"],"sourcesContent":[".root {\n position: relative;\n display: inline-flex;\n}\n\n.trigger {\n display: inline-flex;\n}\n\n.card {\n position: absolute;\n z-index: var(--tempest-z-popover);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n min-width: 200px;\n max-width: 320px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n animation: tempest-hover-card-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.card:focus {\n outline: none;\n}\n\n/* Placements (center-aligned across the trigger). */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n\n.portalled {\n right: auto;\n bottom: auto;\n transform: none;\n}\n\n@keyframes tempest-hover-card-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .card {\n animation: none;\n }\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"HoverCard.module.js","names":[],"sources":["../../../src/components/HoverCard/HoverCard.module.css"],"sourcesContent":[".root {\n position: relative;\n display: inline-flex;\n}\n\n.trigger {\n display: inline-flex;\n}\n\n.card {\n position: absolute;\n z-index: var(--tempest-z-popover);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n min-width: 200px;\n max-width: 320px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n animation: tempest-hover-card-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.card:focus {\n outline: none;\n}\n\n/* Placements (center-aligned across the trigger). */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n\n.portalled {\n right: auto;\n bottom: auto;\n transform: none;\n}\n\n@keyframes tempest-hover-card-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .card {\n animation: none;\n }\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"HoverCard.module.js","names":["root","trigger","card","tempestHoverCardIn","top","bottom","left","right","portalled","HoverCard_module_default"],"sources":["../../../src/components/HoverCard/HoverCard.module.css"],"sourcesContent":[".root {\n position: relative;\n display: inline-flex;\n}\n\n.trigger {\n display: inline-flex;\n}\n\n.card {\n position: absolute;\n z-index: var(--tempest-z-popover);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n min-width: 200px;\n max-width: 320px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n animation: tempest-hover-card-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.card:focus {\n outline: none;\n}\n\n/* Placements (center-aligned across the trigger). */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n\n.portalled {\n right: auto;\n bottom: auto;\n transform: none;\n}\n\n@keyframes tempest-hover-card-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .card {\n animation: none;\n }\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"Image.cjs","names":[],"sources":["../../../src/components/Image/Image.tsx"],"sourcesContent":["import type { ImgHTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Image.module.css\";\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n /** Primary image source URL. */\n src: string;\n /** Fallback source swapped in once if the primary `src` fails to load. */\n fallback?: string;\n /** Alternative text describing the image (required for accessibility). */\n alt: string;\n /** When true (default) uses native lazy loading; otherwise loads eagerly. */\n lazy?: boolean;\n}\n\n/**\n * Renders an `<img>` with native lazy loading and a one-shot fallback.\n *\n * On the first load error the source is swapped to `fallback` (when provided),\n * guarded so a failing fallback cannot loop the `onError` handler.\n *\n * @param src - The primary image source URL.\n * @param fallback - Optional source used once when `src` fails to load.\n * @param alt - Accessible alternative text for the image.\n * @param lazy - Whether to use `loading=\"lazy\"` (default `true`).\n * @returns The rendered image element.\n */\nexport function Image({\n src,\n fallback,\n alt,\n lazy = true,\n className,\n onError,\n ...props\n}: ImageProps) {\n const [currentSrc, setCurrentSrc] = useState<string>(src);\n const [usedFallback, setUsedFallback] = useState<boolean>(false);\n\n return (\n <img\n src={currentSrc}\n alt={alt}\n loading={lazy ? \"lazy\" : \"eager\"}\n className={cn(styles.image, className)}\n onError={(event) => {\n if (fallback && !usedFallback && currentSrc !== fallback) {\n setUsedFallback(true);\n setCurrentSrc(fallback);\n }\n onError?.(event);\n }}\n {...props}\n />\n );\n}\n"],"mappings":"4HA4BA,SAAgB,EAAM,CAClB,MACA,WACA,MACA,OAAO,GACP,YACA,UACA,GAAG,GACQ,CACX,GAAM,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAiB,CAAG,EAClD,CAAC,EAAc,IAAA,EAAmB,EAAA,SAAA,CAAkB,EAAK,EAE/D,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,IAAK,EACA,MACL,QAAS,EAAO,OAAS,QACzB,UAAW,EAAA,GAAG,EAAA,QAAO,MAAO,CAAS,EACrC,QAAU,GAAU,CACZ,GAAY,CAAC,GAAgB,IAAe,IAC5C,EAAgB,EAAI,EACpB,EAAc,CAAQ,GAE1B,IAAU,CAAK,CACnB,EACA,GAAI,CACP,CAAA,CAET"}
1
+ {"version":3,"file":"Image.cjs","names":["useState","cn","styles","require_cn","require_Image_module","react","react_jsx_runtime","Image","props","currentSrc","setCurrentSrc","src","usedFallback","setUsedFallback","lazy","className","fallback","onError","event"],"sources":["../../../src/components/Image/Image.tsx"],"sourcesContent":["import type { ImgHTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Image.module.css\";\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n /** Primary image source URL. */\n src: string;\n /** Fallback source swapped in once if the primary `src` fails to load. */\n fallback?: string;\n /** Alternative text describing the image (required for accessibility). */\n alt: string;\n /** When true (default) uses native lazy loading; otherwise loads eagerly. */\n lazy?: boolean;\n}\n\n/**\n * Renders an `<img>` with native lazy loading and a one-shot fallback.\n *\n * On the first load error the source is swapped to `fallback` (when provided),\n * guarded so a failing fallback cannot loop the `onError` handler.\n *\n * @param src - The primary image source URL.\n * @param fallback - Optional source used once when `src` fails to load.\n * @param alt - Accessible alternative text for the image.\n * @param lazy - Whether to use `loading=\"lazy\"` (default `true`).\n * @returns The rendered image element.\n */\nexport function Image({\n src,\n fallback,\n alt,\n lazy = true,\n className,\n onError,\n ...props\n}: ImageProps) {\n const [currentSrc, setCurrentSrc] = useState<string>(src);\n const [usedFallback, setUsedFallback] = useState<boolean>(false);\n\n return (\n <img\n src={currentSrc}\n alt={alt}\n loading={lazy ? \"lazy\" : \"eager\"}\n className={cn(styles.image, className)}\n onError={(event) => {\n if (fallback && !usedFallback && currentSrc !== fallback) {\n setUsedFallback(true);\n setCurrentSrc(fallback);\n }\n onError?.(event);\n }}\n {...props}\n />\n );\n}\n"],"mappings":"A,4HA4BA,SAAgBO,EAAM,CAClB,MACA,WACA,MACA,OAAO,GACP,YACA,UACA,GAAGC,GACQ,CACX,GAAM,CAACC,EAAYC,IAAA,EAAiBV,EAAAA,SAAAA,CAAiBW,CAAG,EAClD,CAACC,EAAcC,IAAA,EAAmBb,EAAAA,SAAAA,CAAkB,EAAK,EAE/D,OACI,EAAAM,EAAA,IAAA,CAAC,MAAD,CACI,IAAKG,EACA,MACL,QAASK,EAAO,OAAS,QACzB,UAAWb,EAAAA,GAAGC,EAAAA,QAAO,MAAOa,CAAS,EACrC,QAAU,GAAU,CACZC,GAAY,CAACJ,GAAgBH,IAAeO,IAC5CH,EAAgB,EAAI,EACpBH,EAAcM,CAAQ,GAE1BC,IAAUC,CAAK,CACnB,EACA,GAAIV,CACP,CAAA,CAET,C"}
@@ -1 +1 @@
1
- {"version":3,"file":"Image.js","names":[],"sources":["../../../src/components/Image/Image.tsx"],"sourcesContent":["import type { ImgHTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Image.module.css\";\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n /** Primary image source URL. */\n src: string;\n /** Fallback source swapped in once if the primary `src` fails to load. */\n fallback?: string;\n /** Alternative text describing the image (required for accessibility). */\n alt: string;\n /** When true (default) uses native lazy loading; otherwise loads eagerly. */\n lazy?: boolean;\n}\n\n/**\n * Renders an `<img>` with native lazy loading and a one-shot fallback.\n *\n * On the first load error the source is swapped to `fallback` (when provided),\n * guarded so a failing fallback cannot loop the `onError` handler.\n *\n * @param src - The primary image source URL.\n * @param fallback - Optional source used once when `src` fails to load.\n * @param alt - Accessible alternative text for the image.\n * @param lazy - Whether to use `loading=\"lazy\"` (default `true`).\n * @returns The rendered image element.\n */\nexport function Image({\n src,\n fallback,\n alt,\n lazy = true,\n className,\n onError,\n ...props\n}: ImageProps) {\n const [currentSrc, setCurrentSrc] = useState<string>(src);\n const [usedFallback, setUsedFallback] = useState<boolean>(false);\n\n return (\n <img\n src={currentSrc}\n alt={alt}\n loading={lazy ? \"lazy\" : \"eager\"}\n className={cn(styles.image, className)}\n onError={(event) => {\n if (fallback && !usedFallback && currentSrc !== fallback) {\n setUsedFallback(true);\n setCurrentSrc(fallback);\n }\n onError?.(event);\n }}\n {...props}\n />\n );\n}\n"],"mappings":";;;;;AA4BA,SAAgB,EAAM,EAClB,QACA,aACA,QACA,UAAO,IACP,cACA,YACA,GAAG,KACQ;CACX,IAAM,CAAC,GAAY,KAAiB,EAAiB,CAAG,GAClD,CAAC,GAAc,KAAmB,EAAkB,EAAK;CAE/D,OACI,kBAAC,OAAD;EACI,KAAK;EACA;EACL,SAAS,IAAO,SAAS;EACzB,WAAW,EAAG,EAAO,OAAO,CAAS;EACrC,UAAU,MAAU;GAKhB,AAJI,KAAY,CAAC,KAAgB,MAAe,MAC5C,EAAgB,EAAI,GACpB,EAAc,CAAQ,IAE1B,IAAU,CAAK;EACnB;EACA,GAAI;CACP,CAAA;AAET"}
1
+ {"version":3,"file":"Image.js","names":["styles","Image_module_default","Image","props","currentSrc","setCurrentSrc","useState","src","usedFallback","setUsedFallback","lazy","cn","className","fallback","onError","event"],"sources":["../../../src/components/Image/Image.tsx"],"sourcesContent":["import type { ImgHTMLAttributes } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Image.module.css\";\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, \"src\"> {\n /** Primary image source URL. */\n src: string;\n /** Fallback source swapped in once if the primary `src` fails to load. */\n fallback?: string;\n /** Alternative text describing the image (required for accessibility). */\n alt: string;\n /** When true (default) uses native lazy loading; otherwise loads eagerly. */\n lazy?: boolean;\n}\n\n/**\n * Renders an `<img>` with native lazy loading and a one-shot fallback.\n *\n * On the first load error the source is swapped to `fallback` (when provided),\n * guarded so a failing fallback cannot loop the `onError` handler.\n *\n * @param src - The primary image source URL.\n * @param fallback - Optional source used once when `src` fails to load.\n * @param alt - Accessible alternative text for the image.\n * @param lazy - Whether to use `loading=\"lazy\"` (default `true`).\n * @returns The rendered image element.\n */\nexport function Image({\n src,\n fallback,\n alt,\n lazy = true,\n className,\n onError,\n ...props\n}: ImageProps) {\n const [currentSrc, setCurrentSrc] = useState<string>(src);\n const [usedFallback, setUsedFallback] = useState<boolean>(false);\n\n return (\n <img\n src={currentSrc}\n alt={alt}\n loading={lazy ? \"lazy\" : \"eager\"}\n className={cn(styles.image, className)}\n onError={(event) => {\n if (fallback && !usedFallback && currentSrc !== fallback) {\n setUsedFallback(true);\n setCurrentSrc(fallback);\n }\n onError?.(event);\n }}\n {...props}\n />\n );\n}\n"],"mappings":";;;;;AA4BA,SAAgBE,EAAM,EAClB,QACA,aACA,QACA,UAAO,IACP,cACA,YACA,GAAGC,KACQ;CACX,IAAM,CAACC,GAAYC,KAAiBC,EAAiBC,CAAG,GAClD,CAACC,GAAcC,KAAmBH,EAAkB,EAAK;CAE/D,OACI,kBAAC,OAAD;EACI,KAAKF;EACA;EACL,SAASM,IAAO,SAAS;EACzB,WAAWC,EAAGX,EAAO,OAAOY,CAAS;EACrC,UAAU,MAAU;GAKhB,AAJIC,KAAY,CAACL,KAAgBJ,MAAeS,MAC5CJ,EAAgB,EAAI,GACpBJ,EAAcQ,CAAQ,IAE1BC,IAAUC,CAAK;EACnB;EACA,GAAIZ;CACP,CAAA;AAET"}
@@ -1 +1 @@
1
- {"version":3,"file":"Image.module.cjs","names":[],"sources":["../../../src/components/Image/Image.module.css"],"sourcesContent":[".image {\n max-width: 100%;\n height: auto;\n display: block;\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"Image.module.cjs","names":["image","Image_module_default"],"sources":["../../../src/components/Image/Image.module.css"],"sourcesContent":[".image {\n max-width: 100%;\n height: auto;\n display: block;\n}\n"],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"Image.module.js","names":[],"sources":["../../../src/components/Image/Image.module.css"],"sourcesContent":[".image {\n max-width: 100%;\n height: auto;\n display: block;\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"Image.module.js","names":["image","Image_module_default"],"sources":["../../../src/components/Image/Image.module.css"],"sourcesContent":[".image {\n max-width: 100%;\n height: auto;\n display: block;\n}\n"],"mappings":";"}
@@ -1,2 +1,2 @@
1
- const e=require("../../utils/cn.cjs"),t=require("./crop-geometry.cjs"),n=require("./ImageCropper.module.cjs");let r=require("react"),i=require("react/jsx-runtime");var a=12,o=.15;function s({src:s,aspect:c=1,maxZoom:l=4,maxSize:u,outputType:d=`image/png`,outputQuality:f=.92,shape:p=`rect`,onCropChange:m,label:h=`Área de recorte`,className:g,ref:_,...v}){let y=`${(0,r.useId)()}-hint`,b=(0,r.useRef)(null),x=(0,r.useRef)(null),S=(0,r.useRef)(null),[C,w]=(0,r.useState)(null),[T,E]=(0,r.useState)(null),[D,O]=(0,r.useState)({width:0,height:0}),[k,A]=(0,r.useState)(1),[j,M]=(0,r.useState)({x:0,y:0});(0,r.useEffect)(()=>{if(typeof s==`string`){w(s);return}let e=URL.createObjectURL(s);return w(e),()=>URL.revokeObjectURL(e)},[s]),(0,r.useEffect)(()=>{E(null),A(1),M({x:0,y:0})},[C]),(0,r.useEffect)(()=>{let e=b.current;if(!e)return;let t=()=>O({width:e.clientWidth,height:e.clientHeight});if(t(),typeof ResizeObserver>`u`)return;let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let N=T?t.coverScale(T,D)*k:0,P=(0,r.useMemo)(()=>T?{width:T.width*N,height:T.height*N}:{width:0,height:0},[T,N]),F=(0,r.useCallback)(e=>{M(n=>{let r=t.clampOffset(e,P,D);return r.x===n.x&&r.y===n.y?n:(m?.({zoom:k,offset:r}),r)})},[P,D,m,k]),I=(0,r.useCallback)(e=>{let n=Math.min(l,Math.max(1,e));if(A(n),!T)return;let r=t.coverScale(T,D)*n,i={width:T.width*r,height:T.height*r};M(e=>{let r=t.clampOffset(e,i,D);return m?.({zoom:n,offset:r}),r})},[D,l,T,m]),L=(0,r.useCallback)(()=>{A(1),M({x:0,y:0}),m?.({zoom:1,offset:{x:0,y:0}})},[m]),R=(0,r.useCallback)(async()=>{let e=x.current;if(!e||!T)return null;let n=t.computeCropRect({image:T,frame:D,zoom:k,offset:j});if(n.sWidth<=0||n.sHeight<=0)return null;let r=t.outputSize(n,u),i=document.createElement(`canvas`);i.width=r.width,i.height=r.height;let a=i.getContext(`2d`);return a?(a.drawImage(e,n.sx,n.sy,n.sWidth,n.sHeight,0,0,r.width,r.height),new Promise(e=>{i.toBlob(t=>e(t),d,f)})):null},[D,u,T,j,f,d,k]);(0,r.useImperativeHandle)(_,()=>({crop:R,reset:L}),[R,L]);let z=e=>{T&&(S.current={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,from:j},e.currentTarget.setPointerCapture?.(e.pointerId))},B=e=>{let t=S.current;t&&t.pointerId===e.pointerId&&F({x:t.from.x+(e.clientX-t.startX),y:t.from.y+(e.clientY-t.startY)})},V=e=>{S.current?.pointerId===e.pointerId&&(S.current=null)},H=e=>{let t=e.shiftKey?48:a,n={ArrowLeft:{x:-t,y:0},ArrowRight:{x:t,y:0},ArrowUp:{x:0,y:-t},ArrowDown:{x:0,y:t}}[e.key];if(n){e.preventDefault(),F({x:j.x+n.x,y:j.y+n.y});return}e.key===`+`||e.key===`=`?(e.preventDefault(),I(k+o)):e.key===`-`||e.key===`_`?(e.preventDefault(),I(k-o)):e.key===`0`&&(e.preventDefault(),L())};return(0,i.jsxs)(`div`,{className:e.cn(n.default.wrapper,g),...v,children:[(0,i.jsx)(`div`,{ref:b,className:e.cn(n.default.frame,p===`circle`&&n.default.circle),style:{aspectRatio:String(c)},role:`group`,"aria-label":h,"aria-describedby":y,tabIndex:0,onPointerDown:z,onPointerMove:B,onPointerUp:V,onPointerCancel:V,onKeyDown:H,onWheel:e=>{e.preventDefault(),I(k+(e.deltaY<0?o:-.15))},children:C&&(0,i.jsx)(`img`,{ref:x,src:C,alt:``,draggable:!1,className:n.default.image,style:{width:P.width||void 0,height:P.height||void 0,transform:`translate(${j.x}px, ${j.y}px)`},onLoad:e=>{let t=e.currentTarget;t.naturalWidth>0&&t.naturalHeight>0&&E({width:t.naturalWidth,height:t.naturalHeight})}})}),(0,i.jsxs)(`div`,{className:n.default.controls,children:[(0,i.jsx)(`input`,{type:`range`,className:n.default.zoom,min:1,max:l,step:.01,value:k,onChange:e=>I(Number(e.target.value)),"aria-label":`Zoom`,disabled:!T}),(0,i.jsx)(`button`,{type:`button`,className:n.default.reset,onClick:L,disabled:!T,children:`Centralizar`})]}),(0,i.jsxs)(`p`,{id:y,className:n.default.hint,children:[`Arraste para reposicionar. Setas movem, `,(0,i.jsx)(`kbd`,{children:`+`}),` e `,(0,i.jsx)(`kbd`,{children:`−`}),` dão zoom,`,` `,(0,i.jsx)(`kbd`,{children:`0`}),` centraliza.`]})]})}exports.ImageCropper=s;
1
+ const e=require("../../utils/cn.cjs"),t=require("./crop-geometry.cjs"),n=require("./ImageCropper.module.cjs");let r=require("react"),i=require("react/jsx-runtime");var a=12,o=.15;function s({src:s,aspect:c=1,maxZoom:l=4,maxSize:u,outputType:d=`image/png`,outputQuality:f=.92,shape:p=`rect`,onCropChange:m,label:h=`Área de recorte`,className:g,ref:_,...v}){let y=`${(0,r.useId)()}-hint`,b=(0,r.useRef)(null),x=(0,r.useRef)(null),S=(0,r.useRef)(null),[C,w]=(0,r.useState)(null),[T,E]=(0,r.useState)(null),[D,O]=(0,r.useState)({width:0,height:0}),[k,A]=(0,r.useState)(1),[j,M]=(0,r.useState)({x:0,y:0});(0,r.useEffect)(()=>{if(typeof s==`string`){w(s);return}let e=URL.createObjectURL(s);return w(e),()=>URL.revokeObjectURL(e)},[s]),(0,r.useEffect)(()=>{E(null),A(1),M({x:0,y:0})},[C]),(0,r.useEffect)(()=>{let e=b.current;if(!e)return;let t=()=>O({width:e.clientWidth,height:e.clientHeight});if(t(),typeof ResizeObserver>`u`)return;let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let N=T?t.coverScale(T,D)*k:0,P=(0,r.useMemo)(()=>T?{width:T.width*N,height:T.height*N}:{width:0,height:0},[T,N]),F=(0,r.useCallback)(e=>{M(n=>{let r=t.clampOffset(e,P,D);return r.x===n.x&&r.y===n.y?n:(m?.({zoom:k,offset:r}),r)})},[P,D,m,k]),I=(0,r.useCallback)(e=>{let n=Math.min(l,Math.max(1,e));if(A(n),!T)return;let r=t.coverScale(T,D)*n,i={width:T.width*r,height:T.height*r};M(e=>{let r=t.clampOffset(e,i,D);return m?.({zoom:n,offset:r}),r})},[D,l,T,m]),L=(0,r.useCallback)(()=>{A(1),M({x:0,y:0}),m?.({zoom:1,offset:{x:0,y:0}})},[m]),R=(0,r.useCallback)(async()=>{let e=x.current;if(!e||!T)return null;let n=t.computeCropRect({image:T,frame:D,zoom:k,offset:j});if(n.sWidth<=0||n.sHeight<=0)return null;let r=t.outputSize(n,u),i=document.createElement(`canvas`);i.width=r.width,i.height=r.height;let a=i.getContext(`2d`);return a?(a.drawImage(e,n.sx,n.sy,n.sWidth,n.sHeight,0,0,r.width,r.height),new Promise(e=>{i.toBlob(t=>e(t),d,f)})):null},[D,u,T,j,f,d,k]);(0,r.useImperativeHandle)(_,()=>({crop:R,reset:L}),[R,L]);let z=e=>{T&&(S.current={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,from:j},e.currentTarget.setPointerCapture?.(e.pointerId))},B=e=>{let t=S.current;t&&t.pointerId===e.pointerId&&F({x:t.from.x+(e.clientX-t.startX),y:t.from.y+(e.clientY-t.startY)})},V=e=>{S.current?.pointerId===e.pointerId&&(S.current=null)},H=e=>{let t=e.shiftKey?48:a,n={ArrowLeft:{x:-t,y:0},ArrowRight:{x:t,y:0},ArrowUp:{x:0,y:-t},ArrowDown:{x:0,y:t}}[e.key];n?(e.preventDefault(),F({x:j.x+n.x,y:j.y+n.y})):e.key===`+`||e.key===`=`?(e.preventDefault(),I(k+o)):e.key===`-`||e.key===`_`?(e.preventDefault(),I(k-o)):e.key===`0`&&(e.preventDefault(),L())};return(0,i.jsxs)(`div`,{className:e.cn(n.default.wrapper,g),...v,children:[(0,i.jsx)(`div`,{ref:b,className:e.cn(n.default.frame,p===`circle`&&n.default.circle),style:{aspectRatio:String(c)},role:`group`,"aria-label":h,"aria-describedby":y,tabIndex:0,onPointerDown:z,onPointerMove:B,onPointerUp:V,onPointerCancel:V,onKeyDown:H,onWheel:e=>{e.preventDefault(),I(k+(e.deltaY<0?o:-.15))},children:C&&(0,i.jsx)(`img`,{ref:x,src:C,alt:``,draggable:!1,className:n.default.image,style:{width:P.width||void 0,height:P.height||void 0,transform:`translate(${j.x}px, ${j.y}px)`},onLoad:e=>{let t=e.currentTarget;t.naturalWidth>0&&t.naturalHeight>0&&E({width:t.naturalWidth,height:t.naturalHeight})}})}),(0,i.jsxs)(`div`,{className:n.default.controls,children:[(0,i.jsx)(`input`,{type:`range`,className:n.default.zoom,min:1,max:l,step:.01,value:k,onChange:e=>I(Number(e.target.value)),"aria-label":`Zoom`,disabled:!T}),(0,i.jsx)(`button`,{type:`button`,className:n.default.reset,onClick:L,disabled:!T,children:`Centralizar`})]}),(0,i.jsxs)(`p`,{id:y,className:n.default.hint,children:[`Arraste para reposicionar. Setas movem, `,(0,i.jsx)(`kbd`,{children:`+`}),` e `,(0,i.jsx)(`kbd`,{children:`−`}),` dão zoom,`,` `,(0,i.jsx)(`kbd`,{children:`0`}),` centraliza.`]})]})}exports.ImageCropper=s;
2
2
  //# sourceMappingURL=ImageCropper.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageCropper.cjs","names":[],"sources":["../../../src/components/ImageCropper/ImageCropper.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — pointer drag, wheel\n * zoom, aspect clamping and canvas export share one piece of geometry state, and the\n * props are the two halves of that: the frame (aspect, shape, maxZoom, label) and\n * the export (maxSize, outputType, outputQuality, onCropChange, ref). Threading the\n * geometry through props would duplicate the clamp maths.\n */\nimport {\n type HTMLAttributes,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nimport {\n clampOffset,\n computeCropRect,\n coverScale,\n type Offset,\n outputSize,\n type Size,\n} from \"./crop-geometry\";\nimport styles from \"./ImageCropper.module.css\";\n\n/** Imperative handle for exporting the current crop. */\nexport interface ImageCropperHandle {\n /**\n * Render the current crop and resolve with it.\n *\n * Resolves `null` when the image has not loaded yet or the browser refuses to\n * encode — never throws, so a submit handler does not need a try/catch.\n */\n crop: () => Promise<Blob | null>;\n /** Recentre at zoom 1. */\n reset: () => void;\n}\n\nexport interface ImageCropperProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** The image to crop: a `File`/`Blob` from an input, or a URL. */\n src: File | Blob | string;\n /** Crop aspect ratio as `width / height`. Default `1` (square). */\n aspect?: number;\n /** Maximum zoom over the cover scale. Default `4`. */\n maxZoom?: number;\n /**\n * Cap on the longest edge of the exported image, in px.\n *\n * Without it the export keeps the source resolution, which is right for a\n * document scan and wasteful for an avatar.\n */\n maxSize?: number;\n /** Output MIME type. Default `\"image/png\"`. */\n outputType?: string;\n /** Output quality for lossy types, `0`–`1`. Default `0.92`. */\n outputQuality?: number;\n /** Overlay shape. `\"circle\"` for an avatar, `\"rect\"` for a document. Default `\"rect\"`. */\n shape?: \"rect\" | \"circle\";\n /** Called whenever the crop changes, e.g. to enable a submit button. */\n onCropChange?: (state: { zoom: number; offset: Offset }) => void;\n /** Accessible name for the crop area. */\n label?: string;\n ref?: React.Ref<ImageCropperHandle>;\n}\n\n/** Pixels moved per arrow-key press. */\nconst KEY_STEP = 12;\n\n/** Zoom added or removed per `+`/`-` press, and per wheel notch. */\nconst ZOOM_STEP = 0.15;\n\n/**\n * Crop an image to a fixed aspect ratio.\n *\n * The frame stays put and the image pans and zooms behind it — the model an avatar\n * or document-photo flow wants, where the output shape is decided by the app and\n * the user only chooses what lands inside it. (A free-form draggable rectangle is a\n * different component; this one cannot produce an off-ratio crop by construction.)\n *\n * The export reads the *natural* pixels through a canvas, so a 4000 px photo is not\n * silently downsampled to whatever the on-screen preview measured. The image is\n * also always clamped to cover the frame, so an export can never contain the empty\n * bands you get from panning past an edge.\n *\n * Works by pointer, wheel and keyboard: arrows pan, `+`/`-` zoom, `0` resets.\n *\n * @example\n * const cropper = useRef<ImageCropperHandle>(null);\n *\n * <ImageCropper ref={cropper} src={file} aspect={1} shape=\"circle\" maxSize={512} />\n * <Button onClick={async () => upload(await cropper.current?.crop())}>Salvar</Button>\n */\nexport function ImageCropper({\n src,\n aspect = 1,\n maxZoom = 4,\n maxSize,\n outputType = \"image/png\",\n outputQuality = 0.92,\n shape = \"rect\",\n onCropChange,\n label = \"Área de recorte\",\n className,\n ref,\n ...rest\n}: ImageCropperProps) {\n /**\n * Id for the shortcut hint.\n *\n * Generated rather than derived from `label`: a label with spaces would produce\n * an id with spaces, and `aria-describedby` splits on whitespace — so the\n * description would silently never associate with the frame.\n */\n const hintId = `${useId()}-hint`;\n\n const frameRef = useRef<HTMLDivElement>(null);\n const imageRef = useRef<HTMLImageElement | null>(null);\n const dragRef = useRef<{\n pointerId: number;\n startX: number;\n startY: number;\n from: Offset;\n } | null>(null);\n\n const [url, setUrl] = useState<string | null>(null);\n const [natural, setNatural] = useState<Size | null>(null);\n const [frame, setFrame] = useState<Size>({ width: 0, height: 0 });\n const [zoom, setZoom] = useState(1);\n const [offset, setOffset] = useState<Offset>({ x: 0, y: 0 });\n\n /**\n * Resolve `src` to a displayable URL.\n *\n * A `File`/`Blob` needs `createObjectURL`, and the URL must be revoked when the\n * source changes or the component unmounts — otherwise every re-pick of a photo\n * leaks the previous one for the lifetime of the document.\n */\n useEffect(() => {\n if (typeof src === \"string\") {\n setUrl(src);\n return;\n }\n const objectUrl = URL.createObjectURL(src);\n setUrl(objectUrl);\n return () => URL.revokeObjectURL(objectUrl);\n }, [src]);\n\n // A new source invalidates the previous framing.\n useEffect(() => {\n setNatural(null);\n setZoom(1);\n setOffset({ x: 0, y: 0 });\n }, [url]);\n\n /** Track the frame's rendered size — the crop math is all relative to it. */\n useEffect(() => {\n const element = frameRef.current;\n if (!element) return;\n const measure = () =>\n setFrame({ width: element.clientWidth, height: element.clientHeight });\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n const scale = natural ? coverScale(natural, frame) * zoom : 0;\n\n /**\n * On-screen image size.\n *\n * Memoized because the pan callback depends on it: a fresh object every render\n * would rebuild that callback every render, and the pointer handlers close over\n * it during a drag.\n */\n const displayed = useMemo<Size>(\n () =>\n natural\n ? { width: natural.width * scale, height: natural.height * scale }\n : { width: 0, height: 0 },\n [natural, scale],\n );\n\n /** Apply a pan, clamped so the frame stays covered. */\n const pan = useCallback(\n (next: Offset) => {\n setOffset((current) => {\n const clamped = clampOffset(next, displayed, frame);\n if (clamped.x === current.x && clamped.y === current.y) return current;\n onCropChange?.({ zoom, offset: clamped });\n return clamped;\n });\n },\n [displayed, frame, onCropChange, zoom],\n );\n\n /**\n * Apply a zoom, then re-clamp the offset.\n *\n * Re-clamping is not optional: zooming *out* shrinks the image, so an offset\n * that was legal a moment ago can now expose background.\n */\n const applyZoom = useCallback(\n (next: number) => {\n const clampedZoom = Math.min(maxZoom, Math.max(1, next));\n setZoom(clampedZoom);\n if (!natural) return;\n const nextScale = coverScale(natural, frame) * clampedZoom;\n const nextDisplayed = {\n width: natural.width * nextScale,\n height: natural.height * nextScale,\n };\n setOffset((current) => {\n const clamped = clampOffset(current, nextDisplayed, frame);\n onCropChange?.({ zoom: clampedZoom, offset: clamped });\n return clamped;\n });\n },\n [frame, maxZoom, natural, onCropChange],\n );\n\n const reset = useCallback(() => {\n setZoom(1);\n setOffset({ x: 0, y: 0 });\n onCropChange?.({ zoom: 1, offset: { x: 0, y: 0 } });\n }, [onCropChange]);\n\n /**\n * Draw the current crop and encode it.\n *\n * Returns `null` rather than throwing on the paths a caller cannot do anything\n * about: no image yet, no 2D context, or an encoder that declined.\n */\n const crop = useCallback(async (): Promise<Blob | null> => {\n const image = imageRef.current;\n if (!image || !natural) return null;\n\n const rect = computeCropRect({ image: natural, frame, zoom, offset });\n if (rect.sWidth <= 0 || rect.sHeight <= 0) return null;\n\n const out = outputSize(rect, maxSize);\n const canvas = document.createElement(\"canvas\");\n canvas.width = out.width;\n canvas.height = out.height;\n const context = canvas.getContext(\"2d\");\n if (!context) return null;\n\n context.drawImage(\n image,\n rect.sx,\n rect.sy,\n rect.sWidth,\n rect.sHeight,\n 0,\n 0,\n out.width,\n out.height,\n );\n\n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob), outputType, outputQuality);\n });\n }, [frame, maxSize, natural, offset, outputQuality, outputType, zoom]);\n\n useImperativeHandle(ref, () => ({ crop, reset }), [crop, reset]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (!natural) return;\n dragRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n from: offset,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>): void => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n pan({\n x: drag.from.x + (event.clientX - drag.startX),\n y: drag.from.y + (event.clientY - drag.startY),\n });\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (dragRef.current?.pointerId !== event.pointerId) return;\n dragRef.current = null;\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const step = event.shiftKey ? KEY_STEP * 4 : KEY_STEP;\n const moves: Record<string, Offset> = {\n ArrowLeft: { x: -step, y: 0 },\n ArrowRight: { x: step, y: 0 },\n ArrowUp: { x: 0, y: -step },\n ArrowDown: { x: 0, y: step },\n };\n const move = moves[event.key];\n if (move) {\n event.preventDefault();\n pan({ x: offset.x + move.x, y: offset.y + move.y });\n return;\n }\n if (event.key === \"+\" || event.key === \"=\") {\n event.preventDefault();\n applyZoom(zoom + ZOOM_STEP);\n } else if (event.key === \"-\" || event.key === \"_\") {\n event.preventDefault();\n applyZoom(zoom - ZOOM_STEP);\n } else if (event.key === \"0\") {\n event.preventDefault();\n reset();\n }\n };\n\n return (\n <div className={cn(styles.wrapper, className)} {...rest}>\n <div\n ref={frameRef}\n className={cn(styles.frame, shape === \"circle\" && styles.circle)}\n style={{ aspectRatio: String(aspect) }}\n role=\"group\"\n aria-label={label}\n aria-describedby={hintId}\n tabIndex={0}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n onWheel={(event) => {\n event.preventDefault();\n applyZoom(zoom + (event.deltaY < 0 ? ZOOM_STEP : -ZOOM_STEP));\n }}\n >\n {url && (\n <img\n ref={imageRef}\n src={url}\n alt=\"\"\n draggable={false}\n className={styles.image}\n style={{\n width: displayed.width || undefined,\n height: displayed.height || undefined,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n }}\n onLoad={(event) => {\n const element = event.currentTarget;\n // A decode can succeed and still report no intrinsic size —\n // an SVG without a viewBox is the common case. Accepting\n // that would enable the controls over an image the crop\n // maths can do nothing with.\n if (element.naturalWidth > 0 && element.naturalHeight > 0) {\n setNatural({\n width: element.naturalWidth,\n height: element.naturalHeight,\n });\n }\n }}\n />\n )}\n </div>\n\n <div className={styles.controls}>\n <input\n type=\"range\"\n className={styles.zoom}\n min={1}\n max={maxZoom}\n step={0.01}\n value={zoom}\n onChange={(event) => applyZoom(Number(event.target.value))}\n aria-label=\"Zoom\"\n disabled={!natural}\n />\n <button type=\"button\" className={styles.reset} onClick={reset} disabled={!natural}>\n Centralizar\n </button>\n </div>\n\n <p id={hintId} className={styles.hint}>\n Arraste para reposicionar. Setas movem, <kbd>+</kbd> e <kbd>−</kbd> dão zoom,{\" \"}\n <kbd>0</kbd> centraliza.\n </p>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ImageCropper.cjs","names":["useId","useRef","useState","coverScale","useMemo","useCallback","clampOffset","computeCropRect","outputSize","cn","styles","require_cn","require_crop_geometry","require_ImageCropper_module","react","react_jsx_runtime","KEY_STEP","ZOOM_STEP","ImageCropper","rest","hintId","frameRef","imageRef","dragRef","url","setUrl","natural","setNatural","frame","setFrame","zoom","setZoom","offset","setOffset","src","objectUrl","element","measure","observer","scale","displayed","pan","clamped","next","current","onCropChange","applyZoom","clampedZoom","maxZoom","nextScale","nextDisplayed","reset","crop","image","rect","out","maxSize","canvas","context","resolve","blob","outputType","outputQuality","ref","onPointerDown","event","onPointerMove","drag","endDrag","onKeyDown","step","move","className","shape","aspect","label"],"sources":["../../../src/components/ImageCropper/ImageCropper.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — pointer drag, wheel\n * zoom, aspect clamping and canvas export share one piece of geometry state, and the\n * props are the two halves of that: the frame (aspect, shape, maxZoom, label) and\n * the export (maxSize, outputType, outputQuality, onCropChange, ref). Threading the\n * geometry through props would duplicate the clamp maths.\n */\nimport {\n type HTMLAttributes,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nimport {\n clampOffset,\n computeCropRect,\n coverScale,\n type Offset,\n outputSize,\n type Size,\n} from \"./crop-geometry\";\nimport styles from \"./ImageCropper.module.css\";\n\n/** Imperative handle for exporting the current crop. */\nexport interface ImageCropperHandle {\n /**\n * Render the current crop and resolve with it.\n *\n * Resolves `null` when the image has not loaded yet or the browser refuses to\n * encode — never throws, so a submit handler does not need a try/catch.\n */\n crop: () => Promise<Blob | null>;\n /** Recentre at zoom 1. */\n reset: () => void;\n}\n\nexport interface ImageCropperProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** The image to crop: a `File`/`Blob` from an input, or a URL. */\n src: File | Blob | string;\n /** Crop aspect ratio as `width / height`. Default `1` (square). */\n aspect?: number;\n /** Maximum zoom over the cover scale. Default `4`. */\n maxZoom?: number;\n /**\n * Cap on the longest edge of the exported image, in px.\n *\n * Without it the export keeps the source resolution, which is right for a\n * document scan and wasteful for an avatar.\n */\n maxSize?: number;\n /** Output MIME type. Default `\"image/png\"`. */\n outputType?: string;\n /** Output quality for lossy types, `0`–`1`. Default `0.92`. */\n outputQuality?: number;\n /** Overlay shape. `\"circle\"` for an avatar, `\"rect\"` for a document. Default `\"rect\"`. */\n shape?: \"rect\" | \"circle\";\n /** Called whenever the crop changes, e.g. to enable a submit button. */\n onCropChange?: (state: { zoom: number; offset: Offset }) => void;\n /** Accessible name for the crop area. */\n label?: string;\n ref?: React.Ref<ImageCropperHandle>;\n}\n\n/** Pixels moved per arrow-key press. */\nconst KEY_STEP = 12;\n\n/** Zoom added or removed per `+`/`-` press, and per wheel notch. */\nconst ZOOM_STEP = 0.15;\n\n/**\n * Crop an image to a fixed aspect ratio.\n *\n * The frame stays put and the image pans and zooms behind it — the model an avatar\n * or document-photo flow wants, where the output shape is decided by the app and\n * the user only chooses what lands inside it. (A free-form draggable rectangle is a\n * different component; this one cannot produce an off-ratio crop by construction.)\n *\n * The export reads the *natural* pixels through a canvas, so a 4000 px photo is not\n * silently downsampled to whatever the on-screen preview measured. The image is\n * also always clamped to cover the frame, so an export can never contain the empty\n * bands you get from panning past an edge.\n *\n * Works by pointer, wheel and keyboard: arrows pan, `+`/`-` zoom, `0` resets.\n *\n * @example\n * const cropper = useRef<ImageCropperHandle>(null);\n *\n * <ImageCropper ref={cropper} src={file} aspect={1} shape=\"circle\" maxSize={512} />\n * <Button onClick={async () => upload(await cropper.current?.crop())}>Salvar</Button>\n */\nexport function ImageCropper({\n src,\n aspect = 1,\n maxZoom = 4,\n maxSize,\n outputType = \"image/png\",\n outputQuality = 0.92,\n shape = \"rect\",\n onCropChange,\n label = \"Área de recorte\",\n className,\n ref,\n ...rest\n}: ImageCropperProps) {\n /**\n * Id for the shortcut hint.\n *\n * Generated rather than derived from `label`: a label with spaces would produce\n * an id with spaces, and `aria-describedby` splits on whitespace — so the\n * description would silently never associate with the frame.\n */\n const hintId = `${useId()}-hint`;\n\n const frameRef = useRef<HTMLDivElement>(null);\n const imageRef = useRef<HTMLImageElement | null>(null);\n const dragRef = useRef<{\n pointerId: number;\n startX: number;\n startY: number;\n from: Offset;\n } | null>(null);\n\n const [url, setUrl] = useState<string | null>(null);\n const [natural, setNatural] = useState<Size | null>(null);\n const [frame, setFrame] = useState<Size>({ width: 0, height: 0 });\n const [zoom, setZoom] = useState(1);\n const [offset, setOffset] = useState<Offset>({ x: 0, y: 0 });\n\n /**\n * Resolve `src` to a displayable URL.\n *\n * A `File`/`Blob` needs `createObjectURL`, and the URL must be revoked when the\n * source changes or the component unmounts — otherwise every re-pick of a photo\n * leaks the previous one for the lifetime of the document.\n */\n useEffect(() => {\n if (typeof src === \"string\") {\n setUrl(src);\n return;\n }\n const objectUrl = URL.createObjectURL(src);\n setUrl(objectUrl);\n return () => URL.revokeObjectURL(objectUrl);\n }, [src]);\n\n // A new source invalidates the previous framing.\n useEffect(() => {\n setNatural(null);\n setZoom(1);\n setOffset({ x: 0, y: 0 });\n }, [url]);\n\n /** Track the frame's rendered size — the crop math is all relative to it. */\n useEffect(() => {\n const element = frameRef.current;\n if (!element) return;\n const measure = () =>\n setFrame({ width: element.clientWidth, height: element.clientHeight });\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n const scale = natural ? coverScale(natural, frame) * zoom : 0;\n\n /**\n * On-screen image size.\n *\n * Memoized because the pan callback depends on it: a fresh object every render\n * would rebuild that callback every render, and the pointer handlers close over\n * it during a drag.\n */\n const displayed = useMemo<Size>(\n () =>\n natural\n ? { width: natural.width * scale, height: natural.height * scale }\n : { width: 0, height: 0 },\n [natural, scale],\n );\n\n /** Apply a pan, clamped so the frame stays covered. */\n const pan = useCallback(\n (next: Offset) => {\n setOffset((current) => {\n const clamped = clampOffset(next, displayed, frame);\n if (clamped.x === current.x && clamped.y === current.y) return current;\n onCropChange?.({ zoom, offset: clamped });\n return clamped;\n });\n },\n [displayed, frame, onCropChange, zoom],\n );\n\n /**\n * Apply a zoom, then re-clamp the offset.\n *\n * Re-clamping is not optional: zooming *out* shrinks the image, so an offset\n * that was legal a moment ago can now expose background.\n */\n const applyZoom = useCallback(\n (next: number) => {\n const clampedZoom = Math.min(maxZoom, Math.max(1, next));\n setZoom(clampedZoom);\n if (!natural) return;\n const nextScale = coverScale(natural, frame) * clampedZoom;\n const nextDisplayed = {\n width: natural.width * nextScale,\n height: natural.height * nextScale,\n };\n setOffset((current) => {\n const clamped = clampOffset(current, nextDisplayed, frame);\n onCropChange?.({ zoom: clampedZoom, offset: clamped });\n return clamped;\n });\n },\n [frame, maxZoom, natural, onCropChange],\n );\n\n const reset = useCallback(() => {\n setZoom(1);\n setOffset({ x: 0, y: 0 });\n onCropChange?.({ zoom: 1, offset: { x: 0, y: 0 } });\n }, [onCropChange]);\n\n /**\n * Draw the current crop and encode it.\n *\n * Returns `null` rather than throwing on the paths a caller cannot do anything\n * about: no image yet, no 2D context, or an encoder that declined.\n */\n const crop = useCallback(async (): Promise<Blob | null> => {\n const image = imageRef.current;\n if (!image || !natural) return null;\n\n const rect = computeCropRect({ image: natural, frame, zoom, offset });\n if (rect.sWidth <= 0 || rect.sHeight <= 0) return null;\n\n const out = outputSize(rect, maxSize);\n const canvas = document.createElement(\"canvas\");\n canvas.width = out.width;\n canvas.height = out.height;\n const context = canvas.getContext(\"2d\");\n if (!context) return null;\n\n context.drawImage(\n image,\n rect.sx,\n rect.sy,\n rect.sWidth,\n rect.sHeight,\n 0,\n 0,\n out.width,\n out.height,\n );\n\n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob), outputType, outputQuality);\n });\n }, [frame, maxSize, natural, offset, outputQuality, outputType, zoom]);\n\n useImperativeHandle(ref, () => ({ crop, reset }), [crop, reset]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (!natural) return;\n dragRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n from: offset,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>): void => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n pan({\n x: drag.from.x + (event.clientX - drag.startX),\n y: drag.from.y + (event.clientY - drag.startY),\n });\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (dragRef.current?.pointerId !== event.pointerId) return;\n dragRef.current = null;\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const step = event.shiftKey ? KEY_STEP * 4 : KEY_STEP;\n const moves: Record<string, Offset> = {\n ArrowLeft: { x: -step, y: 0 },\n ArrowRight: { x: step, y: 0 },\n ArrowUp: { x: 0, y: -step },\n ArrowDown: { x: 0, y: step },\n };\n const move = moves[event.key];\n if (move) {\n event.preventDefault();\n pan({ x: offset.x + move.x, y: offset.y + move.y });\n return;\n }\n if (event.key === \"+\" || event.key === \"=\") {\n event.preventDefault();\n applyZoom(zoom + ZOOM_STEP);\n } else if (event.key === \"-\" || event.key === \"_\") {\n event.preventDefault();\n applyZoom(zoom - ZOOM_STEP);\n } else if (event.key === \"0\") {\n event.preventDefault();\n reset();\n }\n };\n\n return (\n <div className={cn(styles.wrapper, className)} {...rest}>\n <div\n ref={frameRef}\n className={cn(styles.frame, shape === \"circle\" && styles.circle)}\n style={{ aspectRatio: String(aspect) }}\n role=\"group\"\n aria-label={label}\n aria-describedby={hintId}\n tabIndex={0}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n onWheel={(event) => {\n event.preventDefault();\n applyZoom(zoom + (event.deltaY < 0 ? ZOOM_STEP : -ZOOM_STEP));\n }}\n >\n {url && (\n <img\n ref={imageRef}\n src={url}\n alt=\"\"\n draggable={false}\n className={styles.image}\n style={{\n width: displayed.width || undefined,\n height: displayed.height || undefined,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n }}\n onLoad={(event) => {\n const element = event.currentTarget;\n // A decode can succeed and still report no intrinsic size —\n // an SVG without a viewBox is the common case. Accepting\n // that would enable the controls over an image the crop\n // maths can do nothing with.\n if (element.naturalWidth > 0 && element.naturalHeight > 0) {\n setNatural({\n width: element.naturalWidth,\n height: element.naturalHeight,\n });\n }\n }}\n />\n )}\n </div>\n\n <div className={styles.controls}>\n <input\n type=\"range\"\n className={styles.zoom}\n min={1}\n max={maxZoom}\n step={0.01}\n value={zoom}\n onChange={(event) => applyZoom(Number(event.target.value))}\n aria-label=\"Zoom\"\n disabled={!natural}\n />\n <button type=\"button\" className={styles.reset} onClick={reset} disabled={!natural}>\n Centralizar\n </button>\n </div>\n\n <p id={hintId} className={styles.hint}>\n Arraste para reposicionar. Setas movem, <kbd>+</kbd> e <kbd>−</kbd> dão zoom,{\" \"}\n <kbd>0</kbd> centraliza.\n </p>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -148,14 +148,10 @@ function _({ src: _, aspect: v = 1, maxZoom: y = 4, maxSize: b, outputType: x =
148
148
  y: t
149
149
  }
150
150
  }[e.key];
151
- if (n) {
152
- e.preventDefault(), G({
153
- x: V.x + n.x,
154
- y: V.y + n.y
155
- });
156
- return;
157
- }
158
- e.key === "+" || e.key === "=" ? (e.preventDefault(), K(z + g)) : e.key === "-" || e.key === "_" ? (e.preventDefault(), K(z - g)) : e.key === "0" && (e.preventDefault(), q());
151
+ n ? (e.preventDefault(), G({
152
+ x: V.x + n.x,
153
+ y: V.y + n.y
154
+ })) : e.key === "+" || e.key === "=" ? (e.preventDefault(), K(z + g)) : e.key === "-" || e.key === "_" ? (e.preventDefault(), K(z - g)) : e.key === "0" && (e.preventDefault(), q());
159
155
  };
160
156
  return /* @__PURE__ */ m("div", {
161
157
  className: e(a.wrapper, E),
@@ -1 +1 @@
1
- {"version":3,"file":"ImageCropper.js","names":[],"sources":["../../../src/components/ImageCropper/ImageCropper.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — pointer drag, wheel\n * zoom, aspect clamping and canvas export share one piece of geometry state, and the\n * props are the two halves of that: the frame (aspect, shape, maxZoom, label) and\n * the export (maxSize, outputType, outputQuality, onCropChange, ref). Threading the\n * geometry through props would duplicate the clamp maths.\n */\nimport {\n type HTMLAttributes,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nimport {\n clampOffset,\n computeCropRect,\n coverScale,\n type Offset,\n outputSize,\n type Size,\n} from \"./crop-geometry\";\nimport styles from \"./ImageCropper.module.css\";\n\n/** Imperative handle for exporting the current crop. */\nexport interface ImageCropperHandle {\n /**\n * Render the current crop and resolve with it.\n *\n * Resolves `null` when the image has not loaded yet or the browser refuses to\n * encode — never throws, so a submit handler does not need a try/catch.\n */\n crop: () => Promise<Blob | null>;\n /** Recentre at zoom 1. */\n reset: () => void;\n}\n\nexport interface ImageCropperProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** The image to crop: a `File`/`Blob` from an input, or a URL. */\n src: File | Blob | string;\n /** Crop aspect ratio as `width / height`. Default `1` (square). */\n aspect?: number;\n /** Maximum zoom over the cover scale. Default `4`. */\n maxZoom?: number;\n /**\n * Cap on the longest edge of the exported image, in px.\n *\n * Without it the export keeps the source resolution, which is right for a\n * document scan and wasteful for an avatar.\n */\n maxSize?: number;\n /** Output MIME type. Default `\"image/png\"`. */\n outputType?: string;\n /** Output quality for lossy types, `0`–`1`. Default `0.92`. */\n outputQuality?: number;\n /** Overlay shape. `\"circle\"` for an avatar, `\"rect\"` for a document. Default `\"rect\"`. */\n shape?: \"rect\" | \"circle\";\n /** Called whenever the crop changes, e.g. to enable a submit button. */\n onCropChange?: (state: { zoom: number; offset: Offset }) => void;\n /** Accessible name for the crop area. */\n label?: string;\n ref?: React.Ref<ImageCropperHandle>;\n}\n\n/** Pixels moved per arrow-key press. */\nconst KEY_STEP = 12;\n\n/** Zoom added or removed per `+`/`-` press, and per wheel notch. */\nconst ZOOM_STEP = 0.15;\n\n/**\n * Crop an image to a fixed aspect ratio.\n *\n * The frame stays put and the image pans and zooms behind it — the model an avatar\n * or document-photo flow wants, where the output shape is decided by the app and\n * the user only chooses what lands inside it. (A free-form draggable rectangle is a\n * different component; this one cannot produce an off-ratio crop by construction.)\n *\n * The export reads the *natural* pixels through a canvas, so a 4000 px photo is not\n * silently downsampled to whatever the on-screen preview measured. The image is\n * also always clamped to cover the frame, so an export can never contain the empty\n * bands you get from panning past an edge.\n *\n * Works by pointer, wheel and keyboard: arrows pan, `+`/`-` zoom, `0` resets.\n *\n * @example\n * const cropper = useRef<ImageCropperHandle>(null);\n *\n * <ImageCropper ref={cropper} src={file} aspect={1} shape=\"circle\" maxSize={512} />\n * <Button onClick={async () => upload(await cropper.current?.crop())}>Salvar</Button>\n */\nexport function ImageCropper({\n src,\n aspect = 1,\n maxZoom = 4,\n maxSize,\n outputType = \"image/png\",\n outputQuality = 0.92,\n shape = \"rect\",\n onCropChange,\n label = \"Área de recorte\",\n className,\n ref,\n ...rest\n}: ImageCropperProps) {\n /**\n * Id for the shortcut hint.\n *\n * Generated rather than derived from `label`: a label with spaces would produce\n * an id with spaces, and `aria-describedby` splits on whitespace — so the\n * description would silently never associate with the frame.\n */\n const hintId = `${useId()}-hint`;\n\n const frameRef = useRef<HTMLDivElement>(null);\n const imageRef = useRef<HTMLImageElement | null>(null);\n const dragRef = useRef<{\n pointerId: number;\n startX: number;\n startY: number;\n from: Offset;\n } | null>(null);\n\n const [url, setUrl] = useState<string | null>(null);\n const [natural, setNatural] = useState<Size | null>(null);\n const [frame, setFrame] = useState<Size>({ width: 0, height: 0 });\n const [zoom, setZoom] = useState(1);\n const [offset, setOffset] = useState<Offset>({ x: 0, y: 0 });\n\n /**\n * Resolve `src` to a displayable URL.\n *\n * A `File`/`Blob` needs `createObjectURL`, and the URL must be revoked when the\n * source changes or the component unmounts — otherwise every re-pick of a photo\n * leaks the previous one for the lifetime of the document.\n */\n useEffect(() => {\n if (typeof src === \"string\") {\n setUrl(src);\n return;\n }\n const objectUrl = URL.createObjectURL(src);\n setUrl(objectUrl);\n return () => URL.revokeObjectURL(objectUrl);\n }, [src]);\n\n // A new source invalidates the previous framing.\n useEffect(() => {\n setNatural(null);\n setZoom(1);\n setOffset({ x: 0, y: 0 });\n }, [url]);\n\n /** Track the frame's rendered size — the crop math is all relative to it. */\n useEffect(() => {\n const element = frameRef.current;\n if (!element) return;\n const measure = () =>\n setFrame({ width: element.clientWidth, height: element.clientHeight });\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n const scale = natural ? coverScale(natural, frame) * zoom : 0;\n\n /**\n * On-screen image size.\n *\n * Memoized because the pan callback depends on it: a fresh object every render\n * would rebuild that callback every render, and the pointer handlers close over\n * it during a drag.\n */\n const displayed = useMemo<Size>(\n () =>\n natural\n ? { width: natural.width * scale, height: natural.height * scale }\n : { width: 0, height: 0 },\n [natural, scale],\n );\n\n /** Apply a pan, clamped so the frame stays covered. */\n const pan = useCallback(\n (next: Offset) => {\n setOffset((current) => {\n const clamped = clampOffset(next, displayed, frame);\n if (clamped.x === current.x && clamped.y === current.y) return current;\n onCropChange?.({ zoom, offset: clamped });\n return clamped;\n });\n },\n [displayed, frame, onCropChange, zoom],\n );\n\n /**\n * Apply a zoom, then re-clamp the offset.\n *\n * Re-clamping is not optional: zooming *out* shrinks the image, so an offset\n * that was legal a moment ago can now expose background.\n */\n const applyZoom = useCallback(\n (next: number) => {\n const clampedZoom = Math.min(maxZoom, Math.max(1, next));\n setZoom(clampedZoom);\n if (!natural) return;\n const nextScale = coverScale(natural, frame) * clampedZoom;\n const nextDisplayed = {\n width: natural.width * nextScale,\n height: natural.height * nextScale,\n };\n setOffset((current) => {\n const clamped = clampOffset(current, nextDisplayed, frame);\n onCropChange?.({ zoom: clampedZoom, offset: clamped });\n return clamped;\n });\n },\n [frame, maxZoom, natural, onCropChange],\n );\n\n const reset = useCallback(() => {\n setZoom(1);\n setOffset({ x: 0, y: 0 });\n onCropChange?.({ zoom: 1, offset: { x: 0, y: 0 } });\n }, [onCropChange]);\n\n /**\n * Draw the current crop and encode it.\n *\n * Returns `null` rather than throwing on the paths a caller cannot do anything\n * about: no image yet, no 2D context, or an encoder that declined.\n */\n const crop = useCallback(async (): Promise<Blob | null> => {\n const image = imageRef.current;\n if (!image || !natural) return null;\n\n const rect = computeCropRect({ image: natural, frame, zoom, offset });\n if (rect.sWidth <= 0 || rect.sHeight <= 0) return null;\n\n const out = outputSize(rect, maxSize);\n const canvas = document.createElement(\"canvas\");\n canvas.width = out.width;\n canvas.height = out.height;\n const context = canvas.getContext(\"2d\");\n if (!context) return null;\n\n context.drawImage(\n image,\n rect.sx,\n rect.sy,\n rect.sWidth,\n rect.sHeight,\n 0,\n 0,\n out.width,\n out.height,\n );\n\n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob), outputType, outputQuality);\n });\n }, [frame, maxSize, natural, offset, outputQuality, outputType, zoom]);\n\n useImperativeHandle(ref, () => ({ crop, reset }), [crop, reset]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (!natural) return;\n dragRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n from: offset,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>): void => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n pan({\n x: drag.from.x + (event.clientX - drag.startX),\n y: drag.from.y + (event.clientY - drag.startY),\n });\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (dragRef.current?.pointerId !== event.pointerId) return;\n dragRef.current = null;\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const step = event.shiftKey ? KEY_STEP * 4 : KEY_STEP;\n const moves: Record<string, Offset> = {\n ArrowLeft: { x: -step, y: 0 },\n ArrowRight: { x: step, y: 0 },\n ArrowUp: { x: 0, y: -step },\n ArrowDown: { x: 0, y: step },\n };\n const move = moves[event.key];\n if (move) {\n event.preventDefault();\n pan({ x: offset.x + move.x, y: offset.y + move.y });\n return;\n }\n if (event.key === \"+\" || event.key === \"=\") {\n event.preventDefault();\n applyZoom(zoom + ZOOM_STEP);\n } else if (event.key === \"-\" || event.key === \"_\") {\n event.preventDefault();\n applyZoom(zoom - ZOOM_STEP);\n } else if (event.key === \"0\") {\n event.preventDefault();\n reset();\n }\n };\n\n return (\n <div className={cn(styles.wrapper, className)} {...rest}>\n <div\n ref={frameRef}\n className={cn(styles.frame, shape === \"circle\" && styles.circle)}\n style={{ aspectRatio: String(aspect) }}\n role=\"group\"\n aria-label={label}\n aria-describedby={hintId}\n tabIndex={0}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n onWheel={(event) => {\n event.preventDefault();\n applyZoom(zoom + (event.deltaY < 0 ? ZOOM_STEP : -ZOOM_STEP));\n }}\n >\n {url && (\n <img\n ref={imageRef}\n src={url}\n alt=\"\"\n draggable={false}\n className={styles.image}\n style={{\n width: displayed.width || undefined,\n height: displayed.height || undefined,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n }}\n onLoad={(event) => {\n const element = event.currentTarget;\n // A decode can succeed and still report no intrinsic size —\n // an SVG without a viewBox is the common case. Accepting\n // that would enable the controls over an image the crop\n // maths can do nothing with.\n if (element.naturalWidth > 0 && element.naturalHeight > 0) {\n setNatural({\n width: element.naturalWidth,\n height: element.naturalHeight,\n });\n }\n }}\n />\n )}\n </div>\n\n <div className={styles.controls}>\n <input\n type=\"range\"\n className={styles.zoom}\n min={1}\n max={maxZoom}\n step={0.01}\n value={zoom}\n onChange={(event) => applyZoom(Number(event.target.value))}\n aria-label=\"Zoom\"\n disabled={!natural}\n />\n <button type=\"button\" className={styles.reset} onClick={reset} disabled={!natural}>\n Centralizar\n </button>\n </div>\n\n <p id={hintId} className={styles.hint}>\n Arraste para reposicionar. Setas movem, <kbd>+</kbd> e <kbd>−</kbd> dão zoom,{\" \"}\n <kbd>0</kbd> centraliza.\n </p>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ImageCropper.js","names":["styles","ImageCropper_module_default","KEY_STEP","ZOOM_STEP","ImageCropper","rest","hintId","useId","frameRef","useRef","imageRef","dragRef","url","setUrl","useState","natural","setNatural","frame","setFrame","zoom","setZoom","offset","setOffset","useEffect","src","objectUrl","element","measure","observer","scale","coverScale","displayed","useMemo","pan","useCallback","clamped","clampOffset","next","current","onCropChange","applyZoom","clampedZoom","maxZoom","nextScale","nextDisplayed","reset","crop","image","rect","computeCropRect","out","outputSize","maxSize","canvas","context","resolve","blob","outputType","outputQuality","ref","onPointerDown","event","onPointerMove","drag","endDrag","onKeyDown","step","move","cn","className","shape","aspect","label"],"sources":["../../../src/components/ImageCropper/ImageCropper.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — pointer drag, wheel\n * zoom, aspect clamping and canvas export share one piece of geometry state, and the\n * props are the two halves of that: the frame (aspect, shape, maxZoom, label) and\n * the export (maxSize, outputType, outputQuality, onCropChange, ref). Threading the\n * geometry through props would duplicate the clamp maths.\n */\nimport {\n type HTMLAttributes,\n type KeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"@/utils/cn\";\n\nimport {\n clampOffset,\n computeCropRect,\n coverScale,\n type Offset,\n outputSize,\n type Size,\n} from \"./crop-geometry\";\nimport styles from \"./ImageCropper.module.css\";\n\n/** Imperative handle for exporting the current crop. */\nexport interface ImageCropperHandle {\n /**\n * Render the current crop and resolve with it.\n *\n * Resolves `null` when the image has not loaded yet or the browser refuses to\n * encode — never throws, so a submit handler does not need a try/catch.\n */\n crop: () => Promise<Blob | null>;\n /** Recentre at zoom 1. */\n reset: () => void;\n}\n\nexport interface ImageCropperProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** The image to crop: a `File`/`Blob` from an input, or a URL. */\n src: File | Blob | string;\n /** Crop aspect ratio as `width / height`. Default `1` (square). */\n aspect?: number;\n /** Maximum zoom over the cover scale. Default `4`. */\n maxZoom?: number;\n /**\n * Cap on the longest edge of the exported image, in px.\n *\n * Without it the export keeps the source resolution, which is right for a\n * document scan and wasteful for an avatar.\n */\n maxSize?: number;\n /** Output MIME type. Default `\"image/png\"`. */\n outputType?: string;\n /** Output quality for lossy types, `0`–`1`. Default `0.92`. */\n outputQuality?: number;\n /** Overlay shape. `\"circle\"` for an avatar, `\"rect\"` for a document. Default `\"rect\"`. */\n shape?: \"rect\" | \"circle\";\n /** Called whenever the crop changes, e.g. to enable a submit button. */\n onCropChange?: (state: { zoom: number; offset: Offset }) => void;\n /** Accessible name for the crop area. */\n label?: string;\n ref?: React.Ref<ImageCropperHandle>;\n}\n\n/** Pixels moved per arrow-key press. */\nconst KEY_STEP = 12;\n\n/** Zoom added or removed per `+`/`-` press, and per wheel notch. */\nconst ZOOM_STEP = 0.15;\n\n/**\n * Crop an image to a fixed aspect ratio.\n *\n * The frame stays put and the image pans and zooms behind it — the model an avatar\n * or document-photo flow wants, where the output shape is decided by the app and\n * the user only chooses what lands inside it. (A free-form draggable rectangle is a\n * different component; this one cannot produce an off-ratio crop by construction.)\n *\n * The export reads the *natural* pixels through a canvas, so a 4000 px photo is not\n * silently downsampled to whatever the on-screen preview measured. The image is\n * also always clamped to cover the frame, so an export can never contain the empty\n * bands you get from panning past an edge.\n *\n * Works by pointer, wheel and keyboard: arrows pan, `+`/`-` zoom, `0` resets.\n *\n * @example\n * const cropper = useRef<ImageCropperHandle>(null);\n *\n * <ImageCropper ref={cropper} src={file} aspect={1} shape=\"circle\" maxSize={512} />\n * <Button onClick={async () => upload(await cropper.current?.crop())}>Salvar</Button>\n */\nexport function ImageCropper({\n src,\n aspect = 1,\n maxZoom = 4,\n maxSize,\n outputType = \"image/png\",\n outputQuality = 0.92,\n shape = \"rect\",\n onCropChange,\n label = \"Área de recorte\",\n className,\n ref,\n ...rest\n}: ImageCropperProps) {\n /**\n * Id for the shortcut hint.\n *\n * Generated rather than derived from `label`: a label with spaces would produce\n * an id with spaces, and `aria-describedby` splits on whitespace — so the\n * description would silently never associate with the frame.\n */\n const hintId = `${useId()}-hint`;\n\n const frameRef = useRef<HTMLDivElement>(null);\n const imageRef = useRef<HTMLImageElement | null>(null);\n const dragRef = useRef<{\n pointerId: number;\n startX: number;\n startY: number;\n from: Offset;\n } | null>(null);\n\n const [url, setUrl] = useState<string | null>(null);\n const [natural, setNatural] = useState<Size | null>(null);\n const [frame, setFrame] = useState<Size>({ width: 0, height: 0 });\n const [zoom, setZoom] = useState(1);\n const [offset, setOffset] = useState<Offset>({ x: 0, y: 0 });\n\n /**\n * Resolve `src` to a displayable URL.\n *\n * A `File`/`Blob` needs `createObjectURL`, and the URL must be revoked when the\n * source changes or the component unmounts — otherwise every re-pick of a photo\n * leaks the previous one for the lifetime of the document.\n */\n useEffect(() => {\n if (typeof src === \"string\") {\n setUrl(src);\n return;\n }\n const objectUrl = URL.createObjectURL(src);\n setUrl(objectUrl);\n return () => URL.revokeObjectURL(objectUrl);\n }, [src]);\n\n // A new source invalidates the previous framing.\n useEffect(() => {\n setNatural(null);\n setZoom(1);\n setOffset({ x: 0, y: 0 });\n }, [url]);\n\n /** Track the frame's rendered size — the crop math is all relative to it. */\n useEffect(() => {\n const element = frameRef.current;\n if (!element) return;\n const measure = () =>\n setFrame({ width: element.clientWidth, height: element.clientHeight });\n measure();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(measure);\n observer.observe(element);\n return () => observer.disconnect();\n }, []);\n\n const scale = natural ? coverScale(natural, frame) * zoom : 0;\n\n /**\n * On-screen image size.\n *\n * Memoized because the pan callback depends on it: a fresh object every render\n * would rebuild that callback every render, and the pointer handlers close over\n * it during a drag.\n */\n const displayed = useMemo<Size>(\n () =>\n natural\n ? { width: natural.width * scale, height: natural.height * scale }\n : { width: 0, height: 0 },\n [natural, scale],\n );\n\n /** Apply a pan, clamped so the frame stays covered. */\n const pan = useCallback(\n (next: Offset) => {\n setOffset((current) => {\n const clamped = clampOffset(next, displayed, frame);\n if (clamped.x === current.x && clamped.y === current.y) return current;\n onCropChange?.({ zoom, offset: clamped });\n return clamped;\n });\n },\n [displayed, frame, onCropChange, zoom],\n );\n\n /**\n * Apply a zoom, then re-clamp the offset.\n *\n * Re-clamping is not optional: zooming *out* shrinks the image, so an offset\n * that was legal a moment ago can now expose background.\n */\n const applyZoom = useCallback(\n (next: number) => {\n const clampedZoom = Math.min(maxZoom, Math.max(1, next));\n setZoom(clampedZoom);\n if (!natural) return;\n const nextScale = coverScale(natural, frame) * clampedZoom;\n const nextDisplayed = {\n width: natural.width * nextScale,\n height: natural.height * nextScale,\n };\n setOffset((current) => {\n const clamped = clampOffset(current, nextDisplayed, frame);\n onCropChange?.({ zoom: clampedZoom, offset: clamped });\n return clamped;\n });\n },\n [frame, maxZoom, natural, onCropChange],\n );\n\n const reset = useCallback(() => {\n setZoom(1);\n setOffset({ x: 0, y: 0 });\n onCropChange?.({ zoom: 1, offset: { x: 0, y: 0 } });\n }, [onCropChange]);\n\n /**\n * Draw the current crop and encode it.\n *\n * Returns `null` rather than throwing on the paths a caller cannot do anything\n * about: no image yet, no 2D context, or an encoder that declined.\n */\n const crop = useCallback(async (): Promise<Blob | null> => {\n const image = imageRef.current;\n if (!image || !natural) return null;\n\n const rect = computeCropRect({ image: natural, frame, zoom, offset });\n if (rect.sWidth <= 0 || rect.sHeight <= 0) return null;\n\n const out = outputSize(rect, maxSize);\n const canvas = document.createElement(\"canvas\");\n canvas.width = out.width;\n canvas.height = out.height;\n const context = canvas.getContext(\"2d\");\n if (!context) return null;\n\n context.drawImage(\n image,\n rect.sx,\n rect.sy,\n rect.sWidth,\n rect.sHeight,\n 0,\n 0,\n out.width,\n out.height,\n );\n\n return new Promise((resolve) => {\n canvas.toBlob((blob) => resolve(blob), outputType, outputQuality);\n });\n }, [frame, maxSize, natural, offset, outputQuality, outputType, zoom]);\n\n useImperativeHandle(ref, () => ({ crop, reset }), [crop, reset]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (!natural) return;\n dragRef.current = {\n pointerId: event.pointerId,\n startX: event.clientX,\n startY: event.clientY,\n from: offset,\n };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>): void => {\n const drag = dragRef.current;\n if (!drag || drag.pointerId !== event.pointerId) return;\n pan({\n x: drag.from.x + (event.clientX - drag.startX),\n y: drag.from.y + (event.clientY - drag.startY),\n });\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>): void => {\n if (dragRef.current?.pointerId !== event.pointerId) return;\n dragRef.current = null;\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const step = event.shiftKey ? KEY_STEP * 4 : KEY_STEP;\n const moves: Record<string, Offset> = {\n ArrowLeft: { x: -step, y: 0 },\n ArrowRight: { x: step, y: 0 },\n ArrowUp: { x: 0, y: -step },\n ArrowDown: { x: 0, y: step },\n };\n const move = moves[event.key];\n if (move) {\n event.preventDefault();\n pan({ x: offset.x + move.x, y: offset.y + move.y });\n return;\n }\n if (event.key === \"+\" || event.key === \"=\") {\n event.preventDefault();\n applyZoom(zoom + ZOOM_STEP);\n } else if (event.key === \"-\" || event.key === \"_\") {\n event.preventDefault();\n applyZoom(zoom - ZOOM_STEP);\n } else if (event.key === \"0\") {\n event.preventDefault();\n reset();\n }\n };\n\n return (\n <div className={cn(styles.wrapper, className)} {...rest}>\n <div\n ref={frameRef}\n className={cn(styles.frame, shape === \"circle\" && styles.circle)}\n style={{ aspectRatio: String(aspect) }}\n role=\"group\"\n aria-label={label}\n aria-describedby={hintId}\n tabIndex={0}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n onWheel={(event) => {\n event.preventDefault();\n applyZoom(zoom + (event.deltaY < 0 ? ZOOM_STEP : -ZOOM_STEP));\n }}\n >\n {url && (\n <img\n ref={imageRef}\n src={url}\n alt=\"\"\n draggable={false}\n className={styles.image}\n style={{\n width: displayed.width || undefined,\n height: displayed.height || undefined,\n transform: `translate(${offset.x}px, ${offset.y}px)`,\n }}\n onLoad={(event) => {\n const element = event.currentTarget;\n // A decode can succeed and still report no intrinsic size —\n // an SVG without a viewBox is the common case. Accepting\n // that would enable the controls over an image the crop\n // maths can do nothing with.\n if (element.naturalWidth > 0 && element.naturalHeight > 0) {\n setNatural({\n width: element.naturalWidth,\n height: element.naturalHeight,\n });\n }\n }}\n />\n )}\n </div>\n\n <div className={styles.controls}>\n <input\n type=\"range\"\n className={styles.zoom}\n min={1}\n max={maxZoom}\n step={0.01}\n value={zoom}\n onChange={(event) => applyZoom(Number(event.target.value))}\n aria-label=\"Zoom\"\n disabled={!natural}\n />\n <button type=\"button\" className={styles.reset} onClick={reset} disabled={!natural}>\n Centralizar\n </button>\n </div>\n\n <p id={hintId} className={styles.hint}>\n Arraste para reposicionar. Setas movem, <kbd>+</kbd> e <kbd>−</kbd> dão zoom,{\" \"}\n <kbd>0</kbd> centraliza.\n </p>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ImageCropper.module.cjs","names":[],"sources":["../../../src/components/ImageCropper/ImageCropper.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-3);\n max-width: 100%;\n font-family: var(--tempest-font-sans);\n}\n\n.frame {\n position: relative;\n width: 100%;\n overflow: hidden;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n background-color: var(--tempest-surface);\n /*\n * `grab` rather than `move`: nothing is being moved to a destination, the\n * image is being dragged under a fixed frame.\n */\n cursor: grab;\n /*\n * The frame owns dragging on touch, so the browser must not also scroll the\n * page from the same gesture.\n */\n touch-action: none;\n user-select: none;\n}\n\n.frame:active {\n cursor: grabbing;\n}\n\n.frame:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.circle {\n border-radius: var(--tempest-radius-full);\n}\n\n.image {\n position: absolute;\n top: 50%;\n left: 50%;\n /*\n * Both `max-*`, not just the width. The size is set inline from the zoom, so\n * either cap silently overrides it — and an app reset carrying\n * `img { max-height: 100% }` is enough, since a 0-0-1 element rule meets no\n * competition here. The failure is worse than it looks: `crop()` builds its\n * rectangle from `computeCropRect({ image: natural, ... })` and never reads the\n * rendered element, so the export stays correct while the preview is squashed\n * on one axis. The user drags against a distorted image and gets a framing they\n * never saw. A component that sizes itself inline owns neutralising both caps.\n */\n max-width: none;\n max-height: none;\n pointer-events: none;\n /*\n * Centring lives in `translate` and the pan in the inline `transform`, which\n * are separate CSS properties applied in that order. Keeping them apart means\n * a pan is just `transform: translate(x, y)` — it never has to re-derive the\n * `-50% -50%` centring, and the two cannot overwrite each other.\n */\n translate: -50% -50%;\n}\n\n.controls {\n display: flex;\n /*\n * Wraps rather than squeezing. The zoom slider is the flexible item, so on a\n * narrow row it is the one that gives — and a range input has no useful floor\n * of its own, so it gave all the way to `width: 0`, leaving the thumb alone and\n * no visible focus ring while the button beside it kept both. Measured at 390px\n * with a crowded row. Wrapping moves the slider to its own line instead.\n */\n flex-wrap: wrap;\n align-items: center;\n gap: var(--tempest-space-3);\n}\n\n.zoom {\n /*\n * `min-width: 0` is what let it collapse to nothing: it exists to let a flex\n * item shrink past its min-content size, which for a range input is the whole\n * control. A real floor keeps the slider draggable and its focus ring visible;\n * the wrap on `.controls` is what absorbs the width this refuses to give up.\n */\n flex: 1 1 6rem;\n min-width: 6rem;\n accent-color: var(--tempest-primary);\n}\n\n.zoom:disabled {\n opacity: 0.5;\n}\n\n.reset {\n padding: var(--tempest-space-1) var(--tempest-space-3);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n font: inherit;\n font-size: var(--tempest-text-sm);\n cursor: pointer;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .reset:hover:not(:disabled) {\n background-color: var(--tempest-surface);\n }\n}\n\n.reset:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.reset:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.hint {\n margin: 0;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-xs);\n}\n\n.hint kbd {\n padding: 0 var(--tempest-space-1);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n font-family: var(--tempest-font-mono, monospace);\n font-size: inherit;\n}\n"],"mappings":";"}
1
+ {"version":3,"file":"ImageCropper.module.cjs","names":["wrapper","frame","circle","image","controls","zoom","reset","hint","ImageCropper_module_default"],"sources":["../../../src/components/ImageCropper/ImageCropper.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-3);\n max-width: 100%;\n font-family: var(--tempest-font-sans);\n}\n\n.frame {\n position: relative;\n width: 100%;\n overflow: hidden;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n background-color: var(--tempest-surface);\n /*\n * `grab` rather than `move`: nothing is being moved to a destination, the\n * image is being dragged under a fixed frame.\n */\n cursor: grab;\n /*\n * The frame owns dragging on touch, so the browser must not also scroll the\n * page from the same gesture.\n */\n touch-action: none;\n user-select: none;\n}\n\n.frame:active {\n cursor: grabbing;\n}\n\n.frame:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.circle {\n border-radius: var(--tempest-radius-full);\n}\n\n.image {\n position: absolute;\n top: 50%;\n left: 50%;\n /*\n * Both `max-*`, not just the width. The size is set inline from the zoom, so\n * either cap silently overrides it — and an app reset carrying\n * `img { max-height: 100% }` is enough, since a 0-0-1 element rule meets no\n * competition here. The failure is worse than it looks: `crop()` builds its\n * rectangle from `computeCropRect({ image: natural, ... })` and never reads the\n * rendered element, so the export stays correct while the preview is squashed\n * on one axis. The user drags against a distorted image and gets a framing they\n * never saw. A component that sizes itself inline owns neutralising both caps.\n */\n max-width: none;\n max-height: none;\n pointer-events: none;\n /*\n * Centring lives in `translate` and the pan in the inline `transform`, which\n * are separate CSS properties applied in that order. Keeping them apart means\n * a pan is just `transform: translate(x, y)` — it never has to re-derive the\n * `-50% -50%` centring, and the two cannot overwrite each other.\n */\n translate: -50% -50%;\n}\n\n.controls {\n display: flex;\n /*\n * Wraps rather than squeezing. The zoom slider is the flexible item, so on a\n * narrow row it is the one that gives — and a range input has no useful floor\n * of its own, so it gave all the way to `width: 0`, leaving the thumb alone and\n * no visible focus ring while the button beside it kept both. Measured at 390px\n * with a crowded row. Wrapping moves the slider to its own line instead.\n */\n flex-wrap: wrap;\n align-items: center;\n gap: var(--tempest-space-3);\n}\n\n.zoom {\n /*\n * `min-width: 0` is what let it collapse to nothing: it exists to let a flex\n * item shrink past its min-content size, which for a range input is the whole\n * control. A real floor keeps the slider draggable and its focus ring visible;\n * the wrap on `.controls` is what absorbs the width this refuses to give up.\n */\n flex: 1 1 6rem;\n min-width: 6rem;\n accent-color: var(--tempest-primary);\n}\n\n.zoom:disabled {\n opacity: 0.5;\n}\n\n.reset {\n padding: var(--tempest-space-1) var(--tempest-space-3);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n font: inherit;\n font-size: var(--tempest-text-sm);\n cursor: pointer;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .reset:hover:not(:disabled) {\n background-color: var(--tempest-surface);\n }\n}\n\n.reset:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.reset:disabled {\n opacity: 0.5;\n cursor: default;\n}\n\n.hint {\n margin: 0;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-xs);\n}\n\n.hint kbd {\n padding: 0 var(--tempest-space-1);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n font-family: var(--tempest-font-mono, monospace);\n font-size: inherit;\n}\n"],"mappings":";"}