tempest-react-sdk 0.38.3 → 0.39.1

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 (519) hide show
  1. package/README.md +1 -1
  2. package/dist/_virtual/_rolldown/runtime.cjs +1 -1
  3. package/dist/access/access-control-context.cjs.map +1 -1
  4. package/dist/access/use-can.cjs.map +1 -1
  5. package/dist/app/AppProviders.cjs.map +1 -1
  6. package/dist/app/AppProviders.js.map +1 -1
  7. package/dist/audio/use-audio-recorder.cjs.map +1 -1
  8. package/dist/audio/use-audio.cjs.map +1 -1
  9. package/dist/audio/use-microphone.cjs.map +1 -1
  10. package/dist/auth/create-auth-store.cjs.map +1 -1
  11. package/dist/auth/lazy-with-retry.cjs.map +1 -1
  12. package/dist/auth/use-passkey.cjs.map +1 -1
  13. package/dist/br/BrazilMap.cjs +1 -1
  14. package/dist/br/BrazilMap.cjs.map +1 -1
  15. package/dist/br/BrazilMap.js +2 -2
  16. package/dist/br/BrazilMap.js.map +1 -1
  17. package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
  18. package/dist/br/BrazilStateCitySelect.js.map +1 -1
  19. package/dist/br/BrazilStateMap.cjs +1 -1
  20. package/dist/br/BrazilStateMap.cjs.map +1 -1
  21. package/dist/br/BrazilStateMap.js +2 -2
  22. package/dist/br/BrazilStateMap.js.map +1 -1
  23. package/dist/br/MapLegend.cjs.map +1 -1
  24. package/dist/br/MapLegend.js.map +1 -1
  25. package/dist/br/MapMarkers.cjs.map +1 -1
  26. package/dist/br/MapMarkers.js.map +1 -1
  27. package/dist/br/MunicipalitySearch.cjs.map +1 -1
  28. package/dist/br/MunicipalitySearch.js.map +1 -1
  29. package/dist/br/PixQRCode.cjs.map +1 -1
  30. package/dist/br/PixQRCode.js.map +1 -1
  31. package/dist/br/use-map-hover.cjs.map +1 -1
  32. package/dist/br/use-map-zoom.cjs.map +1 -1
  33. package/dist/capture/media-recorder.cjs +1 -1
  34. package/dist/capture/media-recorder.js +2 -2
  35. package/dist/capture/use-barcode-scanner.cjs +1 -1
  36. package/dist/capture/use-barcode-scanner.cjs.map +1 -1
  37. package/dist/capture/use-barcode-scanner.js +2 -2
  38. package/dist/capture/use-barcode-scanner.js.map +1 -1
  39. package/dist/capture/use-screen-capture.cjs.map +1 -1
  40. package/dist/capture/use-speech-recognition.cjs.map +1 -1
  41. package/dist/capture/use-torch.cjs.map +1 -1
  42. package/dist/capture/use-video-recorder.cjs.map +1 -1
  43. package/dist/charts/AreaChart.cjs.map +1 -1
  44. package/dist/charts/AreaChart.js.map +1 -1
  45. package/dist/charts/BarChart.cjs.map +1 -1
  46. package/dist/charts/BarChart.js.map +1 -1
  47. package/dist/charts/LineChart.cjs.map +1 -1
  48. package/dist/charts/LineChart.js.map +1 -1
  49. package/dist/charts/PieChart.cjs.map +1 -1
  50. package/dist/charts/PieChart.js.map +1 -1
  51. package/dist/charts/RadarChart.cjs.map +1 -1
  52. package/dist/charts/RadarChart.js.map +1 -1
  53. package/dist/charts/use-chart-colors.cjs.map +1 -1
  54. package/dist/components/AIChat/AIChat.cjs.map +1 -1
  55. package/dist/components/AIChat/AIChat.js.map +1 -1
  56. package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
  57. package/dist/components/AIChat/AIChatComposer.js.map +1 -1
  58. package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
  59. package/dist/components/AIChat/AIChatTurn.js.map +1 -1
  60. package/dist/components/Accordion/Accordion.cjs.map +1 -1
  61. package/dist/components/Accordion/Accordion.js.map +1 -1
  62. package/dist/components/Alert/Alert.cjs.map +1 -1
  63. package/dist/components/Alert/Alert.js.map +1 -1
  64. package/dist/components/AppBar/AppBar.cjs.map +1 -1
  65. package/dist/components/AppBar/AppBar.js.map +1 -1
  66. package/dist/components/AppShell/AppShell.cjs.map +1 -1
  67. package/dist/components/AppShell/AppShell.js.map +1 -1
  68. package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
  69. package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
  70. package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
  71. package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
  72. package/dist/components/Avatar/Avatar.cjs.map +1 -1
  73. package/dist/components/Avatar/Avatar.js.map +1 -1
  74. package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
  75. package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
  76. package/dist/components/Badge/Badge.cjs.map +1 -1
  77. package/dist/components/Badge/Badge.js.map +1 -1
  78. package/dist/components/Banner/Banner.cjs.map +1 -1
  79. package/dist/components/Banner/Banner.js.map +1 -1
  80. package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
  81. package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
  82. package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
  83. package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
  84. package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
  85. package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
  86. package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
  87. package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
  88. package/dist/components/Button/Button.cjs.map +1 -1
  89. package/dist/components/Button/Button.js.map +1 -1
  90. package/dist/components/Calendar/Calendar.cjs +1 -1
  91. package/dist/components/Calendar/Calendar.cjs.map +1 -1
  92. package/dist/components/Calendar/Calendar.js +38 -41
  93. package/dist/components/Calendar/Calendar.js.map +1 -1
  94. package/dist/components/Card/Card.cjs.map +1 -1
  95. package/dist/components/Card/Card.js.map +1 -1
  96. package/dist/components/Carousel/Carousel.cjs.map +1 -1
  97. package/dist/components/Carousel/Carousel.js.map +1 -1
  98. package/dist/components/Chat/Chat.cjs.map +1 -1
  99. package/dist/components/Chat/Chat.js.map +1 -1
  100. package/dist/components/Chat/ChatComposer.cjs.map +1 -1
  101. package/dist/components/Chat/ChatComposer.js.map +1 -1
  102. package/dist/components/Chat/chat-groups.cjs +1 -1
  103. package/dist/components/Chat/chat-groups.cjs.map +1 -1
  104. package/dist/components/Chat/chat-groups.js +2 -2
  105. package/dist/components/Chat/chat-groups.js.map +1 -1
  106. package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
  107. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  108. package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
  109. package/dist/components/ChipInput/ChipInput.js.map +1 -1
  110. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  111. package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
  112. package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
  113. package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
  114. package/dist/components/Collapsible/Collapsible.js.map +1 -1
  115. package/dist/components/Combobox/Combobox.cjs.map +1 -1
  116. package/dist/components/Combobox/Combobox.js.map +1 -1
  117. package/dist/components/Command/Command.cjs.map +1 -1
  118. package/dist/components/Command/Command.js.map +1 -1
  119. package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
  120. package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
  121. package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
  122. package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
  123. package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
  124. package/dist/components/CopyButton/CopyButton.js.map +1 -1
  125. package/dist/components/DataList/DataList.cjs.map +1 -1
  126. package/dist/components/DataList/DataList.js.map +1 -1
  127. package/dist/components/DataTable/DataTable.cjs +1 -1
  128. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  129. package/dist/components/DataTable/DataTable.js +2 -2
  130. package/dist/components/DataTable/DataTable.js.map +1 -1
  131. package/dist/components/DataTable/EditableCell.cjs.map +1 -1
  132. package/dist/components/DataTable/EditableCell.js.map +1 -1
  133. package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
  134. package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
  135. package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
  136. package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
  137. package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
  138. package/dist/components/Divider/Divider.cjs.map +1 -1
  139. package/dist/components/Divider/Divider.js.map +1 -1
  140. package/dist/components/Drawer/Drawer.cjs.map +1 -1
  141. package/dist/components/Drawer/Drawer.js.map +1 -1
  142. package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
  143. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  144. package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
  145. package/dist/components/Dropzone/Dropzone.js.map +1 -1
  146. package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
  147. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  148. package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
  149. package/dist/components/ErrorState/ErrorState.js.map +1 -1
  150. package/dist/components/FileUpload/FileUpload.cjs +1 -1
  151. package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
  152. package/dist/components/FileUpload/FileUpload.js +1 -1
  153. package/dist/components/FileUpload/FileUpload.js.map +1 -1
  154. package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
  155. package/dist/components/FilterBar/FilterBar.js.map +1 -1
  156. package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
  157. package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
  158. package/dist/components/Form/Form.cjs.map +1 -1
  159. package/dist/components/Form/Form.js.map +1 -1
  160. package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
  161. package/dist/components/HoverCard/HoverCard.js.map +1 -1
  162. package/dist/components/Image/Image.cjs.map +1 -1
  163. package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
  164. package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
  165. package/dist/components/ImageCropper/ImageCropper.js +1 -1
  166. package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
  167. package/dist/components/Input/Input.cjs.map +1 -1
  168. package/dist/components/Input/Input.js.map +1 -1
  169. package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
  170. package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
  171. package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
  172. package/dist/components/InstallButton/InstallButton.js.map +1 -1
  173. package/dist/components/Kanban/Kanban.cjs.map +1 -1
  174. package/dist/components/Kanban/Kanban.js.map +1 -1
  175. package/dist/components/Label/Label.cjs.map +1 -1
  176. package/dist/components/Label/Label.js.map +1 -1
  177. package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
  178. package/dist/components/Lightbox/Lightbox.js.map +1 -1
  179. package/dist/components/ListTile/ListTile.cjs.map +1 -1
  180. package/dist/components/ListTile/ListTile.js.map +1 -1
  181. package/dist/components/Markdown/Markdown.cjs +1 -1
  182. package/dist/components/Markdown/Markdown.cjs.map +1 -1
  183. package/dist/components/Markdown/Markdown.js +2 -2
  184. package/dist/components/Markdown/Markdown.js.map +1 -1
  185. package/dist/components/Masonry/Masonry.cjs.map +1 -1
  186. package/dist/components/Masonry/Masonry.js.map +1 -1
  187. package/dist/components/Menubar/Menubar.cjs.map +1 -1
  188. package/dist/components/Menubar/Menubar.js.map +1 -1
  189. package/dist/components/Modal/Modal.cjs.map +1 -1
  190. package/dist/components/Modal/Modal.js.map +1 -1
  191. package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
  192. package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
  193. package/dist/components/Money/Money.cjs.map +1 -1
  194. package/dist/components/Money/Money.js.map +1 -1
  195. package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
  196. package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
  197. package/dist/components/NProgress/NProgress.cjs.map +1 -1
  198. package/dist/components/Navbar/Navbar.cjs.map +1 -1
  199. package/dist/components/Navbar/Navbar.js.map +1 -1
  200. package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
  201. package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
  202. package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
  203. package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
  204. package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
  205. package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
  206. package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
  207. package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
  208. package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
  209. package/dist/components/Page/Page.cjs.map +1 -1
  210. package/dist/components/Page/Page.js.map +1 -1
  211. package/dist/components/Pagination/Pagination.cjs.map +1 -1
  212. package/dist/components/Pagination/Pagination.js.map +1 -1
  213. package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
  214. package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
  215. package/dist/components/PinInput/PinInput.cjs.map +1 -1
  216. package/dist/components/PinInput/PinInput.js.map +1 -1
  217. package/dist/components/Popover/Popover.cjs.map +1 -1
  218. package/dist/components/Popover/Popover.js.map +1 -1
  219. package/dist/components/Portal/Portal.cjs.map +1 -1
  220. package/dist/components/Progress/Progress.cjs.map +1 -1
  221. package/dist/components/Progress/Progress.js.map +1 -1
  222. package/dist/components/QRCode/QRCode.cjs.map +1 -1
  223. package/dist/components/QRCode/QRCode.js.map +1 -1
  224. package/dist/components/Radio/Radio.cjs.map +1 -1
  225. package/dist/components/Radio/Radio.js.map +1 -1
  226. package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
  227. package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
  228. package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
  229. package/dist/components/RatingStars/RatingStars.js.map +1 -1
  230. package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
  231. package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
  232. package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
  233. package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
  234. package/dist/components/Resizable/Resizable.cjs.map +1 -1
  235. package/dist/components/Resizable/Resizable.js.map +1 -1
  236. package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
  237. package/dist/components/Scheduler/Scheduler.js.map +1 -1
  238. package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
  239. package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
  240. package/dist/components/SearchBar/SearchBar.js.map +1 -1
  241. package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
  242. package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
  243. package/dist/components/Select/Select.cjs.map +1 -1
  244. package/dist/components/Select/Select.js.map +1 -1
  245. package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
  246. package/dist/components/Sidebar/Sidebar.js.map +1 -1
  247. package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
  248. package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
  249. package/dist/components/Slider/Slider.cjs.map +1 -1
  250. package/dist/components/Slider/Slider.js.map +1 -1
  251. package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
  252. package/dist/components/Sparkline/Sparkline.js.map +1 -1
  253. package/dist/components/Spinner/Spinner.cjs.map +1 -1
  254. package/dist/components/Spinner/Spinner.js.map +1 -1
  255. package/dist/components/Stat/Stat.cjs.map +1 -1
  256. package/dist/components/Stat/Stat.js.map +1 -1
  257. package/dist/components/Stepper/Stepper.cjs.map +1 -1
  258. package/dist/components/Stepper/Stepper.js.map +1 -1
  259. package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
  260. package/dist/components/StepperInput/StepperInput.js.map +1 -1
  261. package/dist/components/Switch/Switch.cjs.map +1 -1
  262. package/dist/components/Switch/Switch.js.map +1 -1
  263. package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
  264. package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
  265. package/dist/components/Table/Table.cjs.map +1 -1
  266. package/dist/components/Table/Table.js.map +1 -1
  267. package/dist/components/Tabs/Tabs.cjs.map +1 -1
  268. package/dist/components/Tabs/Tabs.js.map +1 -1
  269. package/dist/components/Tag/Tag.cjs.map +1 -1
  270. package/dist/components/Tag/Tag.js.map +1 -1
  271. package/dist/components/Textarea/Textarea.cjs.map +1 -1
  272. package/dist/components/Textarea/Textarea.js.map +1 -1
  273. package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
  274. package/dist/components/TimePicker/TimePicker.js.map +1 -1
  275. package/dist/components/Timeline/Timeline.cjs.map +1 -1
  276. package/dist/components/Timeline/Timeline.js.map +1 -1
  277. package/dist/components/Toast/ToastProvider.cjs.map +1 -1
  278. package/dist/components/Toast/ToastProvider.js.map +1 -1
  279. package/dist/components/Toggle/Toggle.cjs.map +1 -1
  280. package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
  281. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  282. package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
  283. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  284. package/dist/components/Tour/Tour.cjs.map +1 -1
  285. package/dist/components/Tour/Tour.js.map +1 -1
  286. package/dist/components/Transfer/Transfer.cjs.map +1 -1
  287. package/dist/components/Transfer/Transfer.js.map +1 -1
  288. package/dist/components/TreeView/TreeView.cjs +1 -1
  289. package/dist/components/TreeView/TreeView.cjs.map +1 -1
  290. package/dist/components/TreeView/TreeView.js +1 -4
  291. package/dist/components/TreeView/TreeView.js.map +1 -1
  292. package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
  293. package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
  294. package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
  295. package/dist/components/VirtualList/VirtualList.js.map +1 -1
  296. package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
  297. package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
  298. package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
  299. package/dist/components/Wizard/Wizard.cjs.map +1 -1
  300. package/dist/components/Wizard/Wizard.js.map +1 -1
  301. package/dist/data/data-provider-context.cjs.map +1 -1
  302. package/dist/data/use-resource.cjs.map +1 -1
  303. package/dist/editor/RichTextEditor.cjs.map +1 -1
  304. package/dist/editor/RichTextEditor.js.map +1 -1
  305. package/dist/error-boundary/use-error-handler.cjs.map +1 -1
  306. package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
  307. package/dist/forms/FormField.cjs.map +1 -1
  308. package/dist/forms/masked-inputs.cjs.map +1 -1
  309. package/dist/forms/use-viacep.cjs.map +1 -1
  310. package/dist/forms/use-zod-form.cjs.map +1 -1
  311. package/dist/geo/TrajectoryMap.cjs.map +1 -1
  312. package/dist/geo/TrajectoryMap.js.map +1 -1
  313. package/dist/geo/leaflet-map.cjs.map +1 -1
  314. package/dist/geo/leaflet-map.js.map +1 -1
  315. package/dist/geo/use-position-tracker.cjs.map +1 -1
  316. package/dist/hooks/use-announce.cjs.map +1 -1
  317. package/dist/hooks/use-async.cjs.map +1 -1
  318. package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
  319. package/dist/hooks/use-breakpoint.cjs.map +1 -1
  320. package/dist/hooks/use-click-outside.cjs.map +1 -1
  321. package/dist/hooks/use-client-filter.cjs.map +1 -1
  322. package/dist/hooks/use-clipboard.cjs.map +1 -1
  323. package/dist/hooks/use-counter.cjs.map +1 -1
  324. package/dist/hooks/use-debounce.cjs.map +1 -1
  325. package/dist/hooks/use-deep-memo.cjs.map +1 -1
  326. package/dist/hooks/use-disclosure.cjs.map +1 -1
  327. package/dist/hooks/use-document-visibility.cjs.map +1 -1
  328. package/dist/hooks/use-event-listener.cjs.map +1 -1
  329. package/dist/hooks/use-geolocation.cjs.map +1 -1
  330. package/dist/hooks/use-hover.cjs.map +1 -1
  331. package/dist/hooks/use-idle.cjs.map +1 -1
  332. package/dist/hooks/use-install-prompt.cjs +1 -1
  333. package/dist/hooks/use-install-prompt.cjs.map +1 -1
  334. package/dist/hooks/use-install-prompt.js +1 -1
  335. package/dist/hooks/use-install-prompt.js.map +1 -1
  336. package/dist/hooks/use-intersection-observer.cjs.map +1 -1
  337. package/dist/hooks/use-interval.cjs.map +1 -1
  338. package/dist/hooks/use-is-first-render.cjs.map +1 -1
  339. package/dist/hooks/use-keyboard-shortcut.cjs +1 -1
  340. package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
  341. package/dist/hooks/use-keyboard-shortcut.js +1 -1
  342. package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
  343. package/dist/hooks/use-list-state.cjs.map +1 -1
  344. package/dist/hooks/use-local-storage.cjs.map +1 -1
  345. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  346. package/dist/hooks/use-long-press.cjs.map +1 -1
  347. package/dist/hooks/use-map.cjs.map +1 -1
  348. package/dist/hooks/use-media-devices.cjs.map +1 -1
  349. package/dist/hooks/use-media-permission.cjs.map +1 -1
  350. package/dist/hooks/use-media-query.cjs.map +1 -1
  351. package/dist/hooks/use-object-url.cjs.map +1 -1
  352. package/dist/hooks/use-online.cjs.map +1 -1
  353. package/dist/hooks/use-pagination.cjs.map +1 -1
  354. package/dist/hooks/use-previous.cjs.map +1 -1
  355. package/dist/hooks/use-queue.cjs.map +1 -1
  356. package/dist/hooks/use-resize-observer.cjs.map +1 -1
  357. package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
  358. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  359. package/dist/hooks/use-set.cjs.map +1 -1
  360. package/dist/hooks/use-sortable.cjs +1 -1
  361. package/dist/hooks/use-sortable.cjs.map +1 -1
  362. package/dist/hooks/use-sortable.js +0 -2
  363. package/dist/hooks/use-sortable.js.map +1 -1
  364. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  365. package/dist/hooks/use-storage-estimate.cjs.map +1 -1
  366. package/dist/hooks/use-throttle.cjs.map +1 -1
  367. package/dist/hooks/use-timeout.cjs.map +1 -1
  368. package/dist/hooks/use-toggle.cjs.map +1 -1
  369. package/dist/hooks/use-window-size.cjs.map +1 -1
  370. package/dist/http/api-client.cjs +1 -1
  371. package/dist/http/api-client.cjs.map +1 -1
  372. package/dist/http/api-client.js +7 -5
  373. package/dist/http/api-client.js.map +1 -1
  374. package/dist/http/resumable-upload.cjs +1 -1
  375. package/dist/http/resumable-upload.cjs.map +1 -1
  376. package/dist/http/resumable-upload.js +1 -1
  377. package/dist/http/resumable-upload.js.map +1 -1
  378. package/dist/http/use-poll.cjs.map +1 -1
  379. package/dist/i18n/I18nProvider.cjs.map +1 -1
  380. package/dist/icons/Icon.cjs.map +1 -1
  381. package/dist/icons/IconProvider.cjs.map +1 -1
  382. package/dist/icons/icon-context.cjs.map +1 -1
  383. package/dist/icons/use-icon.cjs.map +1 -1
  384. package/dist/imaging/use-image-processing.cjs.map +1 -1
  385. package/dist/oauth/GoogleSignIn.cjs.map +1 -1
  386. package/dist/oauth/GoogleSignIn.js.map +1 -1
  387. package/dist/oauth/use-oauth-callback.cjs.map +1 -1
  388. package/dist/offline/use-offline-sync.cjs.map +1 -1
  389. package/dist/push/use-push-subscription.cjs.map +1 -1
  390. package/dist/query/QueryProvider.cjs.map +1 -1
  391. package/dist/query/constants.cjs +1 -1
  392. package/dist/query/constants.cjs.map +1 -1
  393. package/dist/query/constants.js +10 -10
  394. package/dist/query/constants.js.map +1 -1
  395. package/dist/query/create-query-keys.cjs +1 -1
  396. package/dist/query/create-query-keys.cjs.map +1 -1
  397. package/dist/query/create-query-keys.js +1 -1
  398. package/dist/query/create-query-keys.js.map +1 -1
  399. package/dist/query/offline-persistence.cjs.map +1 -1
  400. package/dist/query/use-cursor-query.cjs.map +1 -1
  401. package/dist/query/use-offline-mutation.cjs.map +1 -1
  402. package/dist/query/use-paginated-query.cjs.map +1 -1
  403. package/dist/router/AppRouter.cjs +1 -1
  404. package/dist/router/AppRouter.cjs.map +1 -1
  405. package/dist/router/AppRouter.js +7 -2
  406. package/dist/router/AppRouter.js.map +1 -1
  407. package/dist/sse/use-event-stream.cjs.map +1 -1
  408. package/dist/store/create-store.cjs.map +1 -1
  409. package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
  410. package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
  411. package/dist/theme/ThemeProvider.cjs.map +1 -1
  412. package/dist/theme/color.cjs +1 -1
  413. package/dist/theme/color.cjs.map +1 -1
  414. package/dist/theme/color.js +1 -1
  415. package/dist/theme/color.js.map +1 -1
  416. package/dist/utils/cn.cjs +1 -1
  417. package/dist/utils/cn.cjs.map +1 -1
  418. package/dist/utils/cn.js +1 -1
  419. package/dist/utils/cn.js.map +1 -1
  420. package/dist/utils/objects.cjs +1 -1
  421. package/dist/utils/objects.cjs.map +1 -1
  422. package/dist/utils/objects.js +1 -1
  423. package/dist/utils/objects.js.map +1 -1
  424. package/dist/utils/xlsx.cjs +1 -1
  425. package/dist/utils/xlsx.cjs.map +1 -1
  426. package/dist/utils/xlsx.js +3 -3
  427. package/dist/utils/xlsx.js.map +1 -1
  428. package/dist/vision/core/canvas.cjs +1 -1
  429. package/dist/vision/core/canvas.cjs.map +1 -1
  430. package/dist/vision/core/canvas.js +4 -4
  431. package/dist/vision/core/canvas.js.map +1 -1
  432. package/dist/vision/core/exceptions.cjs +1 -1
  433. package/dist/vision/core/exceptions.cjs.map +1 -1
  434. package/dist/vision/core/exceptions.js +2 -2
  435. package/dist/vision/core/exceptions.js.map +1 -1
  436. package/dist/vision/core/metadata.cjs +2 -2
  437. package/dist/vision/core/metadata.cjs.map +1 -1
  438. package/dist/vision/core/metadata.js +11 -8
  439. package/dist/vision/core/metadata.js.map +1 -1
  440. package/dist/vision/core/session.cjs +1 -1
  441. package/dist/vision/core/session.cjs.map +1 -1
  442. package/dist/vision/core/session.js +8 -5
  443. package/dist/vision/core/session.js.map +1 -1
  444. package/dist/vision/fusion.cjs +2 -0
  445. package/dist/vision/fusion.cjs.map +1 -0
  446. package/dist/vision/fusion.js +42 -0
  447. package/dist/vision/fusion.js.map +1 -0
  448. package/dist/vision/index.cjs +1 -1
  449. package/dist/vision/index.cjs.map +1 -1
  450. package/dist/vision/index.js +23 -20
  451. package/dist/vision/index.js.map +1 -1
  452. package/dist/vision/io/image.cjs +1 -1
  453. package/dist/vision/io/image.cjs.map +1 -1
  454. package/dist/vision/io/image.js +4 -2
  455. package/dist/vision/io/image.js.map +1 -1
  456. package/dist/vision/labels.cjs +1 -1
  457. package/dist/vision/labels.cjs.map +1 -1
  458. package/dist/vision/labels.js +7 -4
  459. package/dist/vision/labels.js.map +1 -1
  460. package/dist/vision/postprocess/detection.cjs +1 -1
  461. package/dist/vision/postprocess/detection.cjs.map +1 -1
  462. package/dist/vision/postprocess/detection.js +3 -10
  463. package/dist/vision/postprocess/detection.js.map +1 -1
  464. package/dist/vision/postprocess/segmentation.cjs +1 -1
  465. package/dist/vision/postprocess/segmentation.cjs.map +1 -1
  466. package/dist/vision/postprocess/segmentation.js +11 -15
  467. package/dist/vision/postprocess/segmentation.js.map +1 -1
  468. package/dist/vision/preprocess/image.cjs +1 -1
  469. package/dist/vision/preprocess/image.cjs.map +1 -1
  470. package/dist/vision/preprocess/image.js +4 -2
  471. package/dist/vision/preprocess/image.js.map +1 -1
  472. package/dist/vision/preprocess/pipeline.cjs +2 -0
  473. package/dist/vision/preprocess/pipeline.cjs.map +1 -0
  474. package/dist/vision/preprocess/pipeline.js +61 -0
  475. package/dist/vision/preprocess/pipeline.js.map +1 -0
  476. package/dist/vision/results.cjs +1 -1
  477. package/dist/vision/results.cjs.map +1 -1
  478. package/dist/vision/results.js +23 -2
  479. package/dist/vision/results.js.map +1 -1
  480. package/dist/vision/tasks/base.cjs +1 -1
  481. package/dist/vision/tasks/base.cjs.map +1 -1
  482. package/dist/vision/tasks/base.js +11 -2
  483. package/dist/vision/tasks/base.js.map +1 -1
  484. package/dist/vision/tasks/classifier.cjs +1 -1
  485. package/dist/vision/tasks/classifier.cjs.map +1 -1
  486. package/dist/vision/tasks/classifier.js +2 -2
  487. package/dist/vision/tasks/classifier.js.map +1 -1
  488. package/dist/vision/tasks/detectClassify.cjs +2 -0
  489. package/dist/vision/tasks/detectClassify.cjs.map +1 -0
  490. package/dist/vision/tasks/detectClassify.js +222 -0
  491. package/dist/vision/tasks/detectClassify.js.map +1 -0
  492. package/dist/vision/tasks/detector.cjs +1 -1
  493. package/dist/vision/tasks/detector.cjs.map +1 -1
  494. package/dist/vision/tasks/detector.js +54 -29
  495. package/dist/vision/tasks/detector.js.map +1 -1
  496. package/dist/vision/tasks/segmenter.cjs +1 -1
  497. package/dist/vision/tasks/segmenter.cjs.map +1 -1
  498. package/dist/vision/tasks/segmenter.js +53 -28
  499. package/dist/vision/tasks/segmenter.js.map +1 -1
  500. package/dist/vision/types.cjs.map +1 -1
  501. package/dist/vision/types.js.map +1 -1
  502. package/dist/vision/use-camera-stream.cjs.map +1 -1
  503. package/dist/vision/use-live-luminance.cjs.map +1 -1
  504. package/dist/vision.cjs +1 -1
  505. package/dist/vision.d.ts +1517 -962
  506. package/dist/vision.js +25 -22
  507. package/dist/vite/create-vite-config.cjs +1 -1
  508. package/dist/vite/create-vite-config.cjs.map +1 -1
  509. package/dist/vite/create-vite-config.js +3 -3
  510. package/dist/vite/create-vite-config.js.map +1 -1
  511. package/dist/vite/tempest-icons.cjs.map +1 -1
  512. package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
  513. package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
  514. package/dist/ws/use-web-socket.cjs +1 -1
  515. package/dist/ws/use-web-socket.cjs.map +1 -1
  516. package/dist/ws/use-web-socket.js +5 -3
  517. package/dist/ws/use-web-socket.js.map +1 -1
  518. package/package.json +2 -2
  519. package/template/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Spinner.cjs","names":[],"sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Spinner.module.css\";\n\nexport type SpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface SpinnerProps {\n size?: SpinnerSize;\n className?: string;\n /** Accessible label announced by screen readers. */\n label?: string;\n /**\n * Visible caption rendered under the spinner. When set, the spinner and\n * caption are wrapped in a centered column.\n */\n caption?: ReactNode;\n /**\n * Center the spinner inside a full-area overlay (fills the nearest\n * positioned ancestor; pair with a relative container or a route fallback).\n * Implies the wrapped layout.\n */\n overlay?: boolean;\n}\n\n/**\n * Loading spinner with preset sizes (xs..xl). Provide `label` for screen\n * readers, `caption` for a visible message, and `overlay` to center it inside a\n * full-area container (e.g. a Suspense / route fallback).\n *\n * @example\n * <Spinner />\n * <Spinner size=\"lg\" caption=\"Carregando…\" overlay />\n */\nexport function Spinner({\n size = \"md\",\n className,\n label = \"Carregando\",\n caption,\n overlay = false,\n}: SpinnerProps) {\n const dot = <span aria-hidden className={cn(styles.spinner, styles[size])} />;\n\n if (!overlay && caption === undefined) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={cn(styles.spinner, styles[size], className)}\n />\n );\n }\n\n return (\n <div\n role=\"status\"\n aria-label={label}\n aria-live=\"polite\"\n className={cn(styles.wrap, overlay && styles.overlay, className)}\n >\n {dot}\n {caption !== undefined && <span className={styles.caption}>{caption}</span>}\n </div>\n );\n}\n"],"mappings":"2GAiCA,SAAgB,EAAQ,CACpB,OAAO,KACP,YACA,QAAQ,aACR,UACA,UAAU,IACG,CACb,IAAM,GAAM,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,cAAA,GAAY,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,EAAA,QAAO,EAAK,CAAI,CAAA,EAY5E,MAVI,CAAC,GAAW,IAAY,IAAA,IAEpB,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,KAAK,SACL,aAAY,EACZ,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,EAAA,QAAO,GAAO,CAAS,CACxD,CAAA,GAKL,EAAA,EAAA,KAAA,CAAC,MAAD,CACI,KAAK,SACL,aAAY,EACZ,YAAU,SACV,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAW,EAAA,QAAO,QAAS,CAAS,WAJnE,CAMK,EACA,IAAY,IAAA,KAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,iBAAU,CAAc,CAAA,CACzE,GAEb"}
1
+ {"version":3,"file":"Spinner.cjs","names":[],"sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Spinner.module.css\";\n\nexport type SpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface SpinnerProps {\n size?: SpinnerSize;\n className?: string;\n /** Accessible label announced by screen readers. */\n label?: string;\n /**\n * Visible caption rendered under the spinner. When set, the spinner and\n * caption are wrapped in a centered column.\n */\n caption?: ReactNode;\n /**\n * Center the spinner inside a full-area overlay (fills the nearest\n * positioned ancestor; pair with a relative container or a route fallback).\n * Implies the wrapped layout.\n */\n overlay?: boolean;\n}\n\n/**\n * Loading spinner with preset sizes (xs..xl). Provide `label` for screen\n * readers, `caption` for a visible message, and `overlay` to center it inside a\n * full-area container (e.g. a Suspense / route fallback).\n *\n * @example\n * <Spinner />\n * <Spinner size=\"lg\" caption=\"Carregando…\" overlay />\n */\nexport function Spinner({\n size = \"md\",\n className,\n label = \"Carregando\",\n caption,\n overlay = false,\n}: SpinnerProps) {\n const dot = <span aria-hidden className={cn(styles.spinner, styles[size])} />;\n\n if (!overlay && caption === undefined) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={cn(styles.spinner, styles[size], className)}\n />\n );\n }\n\n return (\n <div\n role=\"status\"\n aria-label={label}\n aria-live=\"polite\"\n className={cn(styles.wrap, overlay && styles.overlay, className)}\n >\n {dot}\n {caption !== undefined && <span className={styles.caption}>{caption}</span>}\n </div>\n );\n}\n"],"mappings":"2GAiCA,SAAgB,EAAQ,CACpB,OAAO,KACP,YACA,QAAQ,aACR,UACA,UAAU,IACG,CACb,IAAM,GAAM,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,cAAA,GAAY,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,EAAA,QAAO,EAAK,CAAI,CAAA,EAY5E,MAVI,CAAC,GAAW,IAAY,IAAA,IAEpB,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,KAAK,SACL,aAAY,EACZ,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,EAAA,QAAO,GAAO,CAAS,CACxD,CAAA,GAKL,EAAA,EAAA,KAAA,CAAC,MAAD,CACI,KAAK,SACL,aAAY,EACZ,YAAU,SACV,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAW,EAAA,QAAO,QAAS,CAAS,EAJnE,SAAA,CAMK,EACA,IAAY,IAAA,KAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,QAAU,SAAA,CAAc,CAAA,CACzE,GAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Spinner.js","names":[],"sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Spinner.module.css\";\n\nexport type SpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface SpinnerProps {\n size?: SpinnerSize;\n className?: string;\n /** Accessible label announced by screen readers. */\n label?: string;\n /**\n * Visible caption rendered under the spinner. When set, the spinner and\n * caption are wrapped in a centered column.\n */\n caption?: ReactNode;\n /**\n * Center the spinner inside a full-area overlay (fills the nearest\n * positioned ancestor; pair with a relative container or a route fallback).\n * Implies the wrapped layout.\n */\n overlay?: boolean;\n}\n\n/**\n * Loading spinner with preset sizes (xs..xl). Provide `label` for screen\n * readers, `caption` for a visible message, and `overlay` to center it inside a\n * full-area container (e.g. a Suspense / route fallback).\n *\n * @example\n * <Spinner />\n * <Spinner size=\"lg\" caption=\"Carregando…\" overlay />\n */\nexport function Spinner({\n size = \"md\",\n className,\n label = \"Carregando\",\n caption,\n overlay = false,\n}: SpinnerProps) {\n const dot = <span aria-hidden className={cn(styles.spinner, styles[size])} />;\n\n if (!overlay && caption === undefined) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={cn(styles.spinner, styles[size], className)}\n />\n );\n }\n\n return (\n <div\n role=\"status\"\n aria-label={label}\n aria-live=\"polite\"\n className={cn(styles.wrap, overlay && styles.overlay, className)}\n >\n {dot}\n {caption !== undefined && <span className={styles.caption}>{caption}</span>}\n </div>\n );\n}\n"],"mappings":";;;;AAiCA,SAAgB,EAAQ,EACpB,UAAO,MACP,cACA,WAAQ,cACR,YACA,aAAU,MACG;CACb,IAAM,IAAM,kBAAC,QAAD;EAAM,eAAA;EAAY,WAAW,EAAG,EAAO,SAAS,EAAO,EAAK;CAAI,CAAA;CAY5E,OAVI,CAAC,KAAW,MAAY,KAAA,IAEpB,kBAAC,QAAD;EACI,MAAK;EACL,cAAY;EACZ,WAAW,EAAG,EAAO,SAAS,EAAO,IAAO,CAAS;CACxD,CAAA,IAKL,kBAAC,OAAD;EACI,MAAK;EACL,cAAY;EACZ,aAAU;EACV,WAAW,EAAG,EAAO,MAAM,KAAW,EAAO,SAAS,CAAS;YAJnE,CAMK,GACA,MAAY,KAAA,KAAa,kBAAC,QAAD;GAAM,WAAW,EAAO;aAAU;EAAc,CAAA,CACzE;;AAEb"}
1
+ {"version":3,"file":"Spinner.js","names":[],"sources":["../../../src/components/Spinner/Spinner.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Spinner.module.css\";\n\nexport type SpinnerSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface SpinnerProps {\n size?: SpinnerSize;\n className?: string;\n /** Accessible label announced by screen readers. */\n label?: string;\n /**\n * Visible caption rendered under the spinner. When set, the spinner and\n * caption are wrapped in a centered column.\n */\n caption?: ReactNode;\n /**\n * Center the spinner inside a full-area overlay (fills the nearest\n * positioned ancestor; pair with a relative container or a route fallback).\n * Implies the wrapped layout.\n */\n overlay?: boolean;\n}\n\n/**\n * Loading spinner with preset sizes (xs..xl). Provide `label` for screen\n * readers, `caption` for a visible message, and `overlay` to center it inside a\n * full-area container (e.g. a Suspense / route fallback).\n *\n * @example\n * <Spinner />\n * <Spinner size=\"lg\" caption=\"Carregando…\" overlay />\n */\nexport function Spinner({\n size = \"md\",\n className,\n label = \"Carregando\",\n caption,\n overlay = false,\n}: SpinnerProps) {\n const dot = <span aria-hidden className={cn(styles.spinner, styles[size])} />;\n\n if (!overlay && caption === undefined) {\n return (\n <span\n role=\"status\"\n aria-label={label}\n className={cn(styles.spinner, styles[size], className)}\n />\n );\n }\n\n return (\n <div\n role=\"status\"\n aria-label={label}\n aria-live=\"polite\"\n className={cn(styles.wrap, overlay && styles.overlay, className)}\n >\n {dot}\n {caption !== undefined && <span className={styles.caption}>{caption}</span>}\n </div>\n );\n}\n"],"mappings":";;;;AAiCA,SAAgB,EAAQ,EACpB,UAAO,MACP,cACA,WAAQ,cACR,YACA,aAAU,MACG;CACb,IAAM,IAAM,kBAAC,QAAD;EAAM,eAAA;EAAY,WAAW,EAAG,EAAO,SAAS,EAAO,EAAK;CAAI,CAAA;CAY5E,OAVI,CAAC,KAAW,MAAY,KAAA,IAEpB,kBAAC,QAAD;EACI,MAAK;EACL,cAAY;EACZ,WAAW,EAAG,EAAO,SAAS,EAAO,IAAO,CAAS;CACxD,CAAA,IAKL,kBAAC,OAAD;EACI,MAAK;EACL,cAAY;EACZ,aAAU;EACV,WAAW,EAAG,EAAO,MAAM,KAAW,EAAO,SAAS,CAAS;EAJnE,UAAA,CAMK,GACA,MAAY,KAAA,KAAa,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAU,UAAA;EAAc,CAAA,CACzE;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Stat.cjs","names":[],"sources":["../../../src/components/Stat/Stat.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stat.module.css\";\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"Revenue\", \"Active users\"). */\n label: ReactNode;\n /** Metric value (e.g. \"R$ 12.345\", \"1.2k\"). */\n value: ReactNode;\n /** Optional comparison delta — when set, renders alongside the value. */\n delta?: ReactNode;\n /** Trend direction for the delta. Default inferred from delta string. */\n trend?: StatTrend;\n /** Optional supporting context line below the value. */\n hint?: ReactNode;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nfunction inferTrend(delta: ReactNode | undefined): StatTrend | undefined {\n if (typeof delta !== \"string\") return undefined;\n const trimmed = delta.trim();\n if (trimmed.startsWith(\"+\")) return \"up\";\n if (trimmed.startsWith(\"-\") || trimmed.startsWith(\"−\")) return \"down\";\n return undefined;\n}\n\n/**\n * KPI card. Dashboard widget showing a label + big value + optional\n * delta/trend and hint.\n *\n * @example\n * <Stat label=\"Receita\" value=\"R$ 12.345\" delta=\"+12,4%\" trend=\"up\" hint=\"vs. mês anterior\" />\n */\nexport function Stat({ label, value, delta, trend, hint, icon, className, ...props }: StatProps) {\n const resolvedTrend: StatTrend | undefined = trend ?? inferTrend(delta);\n return (\n <div className={cn(styles.stat, className)} {...props}>\n <div className={styles.header}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{label}</span>\n </div>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n {delta !== undefined && (\n <span\n className={cn(\n styles.delta,\n resolvedTrend === \"up\" && styles.up,\n resolvedTrend === \"down\" && styles.down,\n resolvedTrend === \"flat\" && styles.flat,\n )}\n >\n {delta}\n </span>\n )}\n </div>\n {hint && <p className={styles.hint}>{hint}</p>}\n </div>\n );\n}\n"],"mappings":"wGAqBA,SAAS,EAAW,EAAqD,CACrE,GAAI,OAAO,GAAU,SAAU,OAC/B,IAAM,EAAU,EAAM,KAAK,EAC3B,GAAI,EAAQ,WAAW,GAAG,EAAG,MAAO,KACpC,GAAI,EAAQ,WAAW,GAAG,GAAK,EAAQ,WAAW,GAAG,EAAG,MAAO,MAEnE,CASA,SAAgB,EAAK,CAAE,QAAO,QAAO,QAAO,QAAO,OAAM,OAAM,YAAW,GAAG,GAAoB,CAC7F,IAAM,EAAuC,GAAS,EAAW,CAAK,EACtE,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,CAAS,EAAG,GAAI,WAAhD,EACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBAAvB,CACK,IAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,cAAO,CAAW,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,CAAY,CAAA,CAC3C,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,aAAvB,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,CAAY,CAAA,EAC3C,IAAU,IAAA,KACP,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,UAAW,EAAA,GACP,EAAA,QAAO,MACP,IAAkB,MAAQ,EAAA,QAAO,GACjC,IAAkB,QAAU,EAAA,QAAO,KACnC,IAAkB,QAAU,EAAA,QAAO,IACvC,WAEC,CACC,CAAA,CAET,IACJ,IAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,cAAO,CAAQ,CAAA,CAC5C,GAEb"}
1
+ {"version":3,"file":"Stat.cjs","names":[],"sources":["../../../src/components/Stat/Stat.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stat.module.css\";\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"Revenue\", \"Active users\"). */\n label: ReactNode;\n /** Metric value (e.g. \"R$ 12.345\", \"1.2k\"). */\n value: ReactNode;\n /** Optional comparison delta — when set, renders alongside the value. */\n delta?: ReactNode;\n /** Trend direction for the delta. Default inferred from delta string. */\n trend?: StatTrend;\n /** Optional supporting context line below the value. */\n hint?: ReactNode;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nfunction inferTrend(delta: ReactNode | undefined): StatTrend | undefined {\n if (typeof delta !== \"string\") return undefined;\n const trimmed = delta.trim();\n if (trimmed.startsWith(\"+\")) return \"up\";\n if (trimmed.startsWith(\"-\") || trimmed.startsWith(\"−\")) return \"down\";\n return undefined;\n}\n\n/**\n * KPI card. Dashboard widget showing a label + big value + optional\n * delta/trend and hint.\n *\n * @example\n * <Stat label=\"Receita\" value=\"R$ 12.345\" delta=\"+12,4%\" trend=\"up\" hint=\"vs. mês anterior\" />\n */\nexport function Stat({ label, value, delta, trend, hint, icon, className, ...props }: StatProps) {\n const resolvedTrend: StatTrend | undefined = trend ?? inferTrend(delta);\n return (\n <div className={cn(styles.stat, className)} {...props}>\n <div className={styles.header}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{label}</span>\n </div>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n {delta !== undefined && (\n <span\n className={cn(\n styles.delta,\n resolvedTrend === \"up\" && styles.up,\n resolvedTrend === \"down\" && styles.down,\n resolvedTrend === \"flat\" && styles.flat,\n )}\n >\n {delta}\n </span>\n )}\n </div>\n {hint && <p className={styles.hint}>{hint}</p>}\n </div>\n );\n}\n"],"mappings":"wGAqBA,SAAS,EAAW,EAAqD,CACrE,GAAI,OAAO,GAAU,SAAU,OAC/B,IAAM,EAAU,EAAM,KAAK,EAC3B,GAAI,EAAQ,WAAW,GAAG,EAAG,MAAO,KACpC,GAAI,EAAQ,WAAW,GAAG,GAAK,EAAQ,WAAW,GAAG,EAAG,MAAO,MAEnE,CASA,SAAgB,EAAK,CAAE,QAAO,QAAO,QAAO,QAAO,OAAM,OAAM,YAAW,GAAG,GAAoB,CAC7F,IAAM,EAAuC,GAAS,EAAW,CAAK,EACtE,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,CAAS,EAAG,GAAI,EAAhD,SAAA,EACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,OAAvB,SAAA,CACK,IAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,KAAO,SAAA,CAAW,CAAA,GACnD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAY,CAAA,CAC3C,KACL,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,IAAvB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAY,CAAA,EAC3C,IAAU,IAAA,KACP,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,UAAW,EAAA,GACP,EAAA,QAAO,MACP,IAAkB,MAAQ,EAAA,QAAO,GACjC,IAAkB,QAAU,EAAA,QAAO,KACnC,IAAkB,QAAU,EAAA,QAAO,IACvC,EAEC,SAAA,CACC,CAAA,CAET,IACJ,IAAQ,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,KAAO,SAAA,CAAQ,CAAA,CAC5C,GAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Stat.js","names":[],"sources":["../../../src/components/Stat/Stat.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stat.module.css\";\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"Revenue\", \"Active users\"). */\n label: ReactNode;\n /** Metric value (e.g. \"R$ 12.345\", \"1.2k\"). */\n value: ReactNode;\n /** Optional comparison delta — when set, renders alongside the value. */\n delta?: ReactNode;\n /** Trend direction for the delta. Default inferred from delta string. */\n trend?: StatTrend;\n /** Optional supporting context line below the value. */\n hint?: ReactNode;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nfunction inferTrend(delta: ReactNode | undefined): StatTrend | undefined {\n if (typeof delta !== \"string\") return undefined;\n const trimmed = delta.trim();\n if (trimmed.startsWith(\"+\")) return \"up\";\n if (trimmed.startsWith(\"-\") || trimmed.startsWith(\"−\")) return \"down\";\n return undefined;\n}\n\n/**\n * KPI card. Dashboard widget showing a label + big value + optional\n * delta/trend and hint.\n *\n * @example\n * <Stat label=\"Receita\" value=\"R$ 12.345\" delta=\"+12,4%\" trend=\"up\" hint=\"vs. mês anterior\" />\n */\nexport function Stat({ label, value, delta, trend, hint, icon, className, ...props }: StatProps) {\n const resolvedTrend: StatTrend | undefined = trend ?? inferTrend(delta);\n return (\n <div className={cn(styles.stat, className)} {...props}>\n <div className={styles.header}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{label}</span>\n </div>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n {delta !== undefined && (\n <span\n className={cn(\n styles.delta,\n resolvedTrend === \"up\" && styles.up,\n resolvedTrend === \"down\" && styles.down,\n resolvedTrend === \"flat\" && styles.flat,\n )}\n >\n {delta}\n </span>\n )}\n </div>\n {hint && <p className={styles.hint}>{hint}</p>}\n </div>\n );\n}\n"],"mappings":";;;;AAqBA,SAAS,EAAW,GAAqD;CACrE,IAAI,OAAO,KAAU,UAAU;CAC/B,IAAM,IAAU,EAAM,KAAK;CAC3B,IAAI,EAAQ,WAAW,GAAG,GAAG,OAAO;CACpC,IAAI,EAAQ,WAAW,GAAG,KAAK,EAAQ,WAAW,GAAG,GAAG,OAAO;AAEnE;AASA,SAAgB,EAAK,EAAE,UAAO,UAAO,UAAO,UAAO,SAAM,SAAM,cAAW,GAAG,KAAoB;CAC7F,IAAM,IAAuC,KAAS,EAAW,CAAK;CACtE,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,MAAM,CAAS;EAAG,GAAI;YAAhD;GACI,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAvB,CACK,KAAQ,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAO;IAAW,CAAA,GACnD,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAQ;IAAY,CAAA,CAC3C;;GACL,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAvB,CACI,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAQ;IAAY,CAAA,GAC3C,MAAU,KAAA,KACP,kBAAC,QAAD;KACI,WAAW,EACP,EAAO,OACP,MAAkB,QAAQ,EAAO,IACjC,MAAkB,UAAU,EAAO,MACnC,MAAkB,UAAU,EAAO,IACvC;eAEC;IACC,CAAA,CAET;;GACJ,KAAQ,kBAAC,KAAD;IAAG,WAAW,EAAO;cAAO;GAAQ,CAAA;EAC5C;;AAEb"}
1
+ {"version":3,"file":"Stat.js","names":[],"sources":["../../../src/components/Stat/Stat.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stat.module.css\";\n\nexport type StatTrend = \"up\" | \"down\" | \"flat\";\n\nexport interface StatProps extends HTMLAttributes<HTMLDivElement> {\n /** Metric label (e.g. \"Revenue\", \"Active users\"). */\n label: ReactNode;\n /** Metric value (e.g. \"R$ 12.345\", \"1.2k\"). */\n value: ReactNode;\n /** Optional comparison delta — when set, renders alongside the value. */\n delta?: ReactNode;\n /** Trend direction for the delta. Default inferred from delta string. */\n trend?: StatTrend;\n /** Optional supporting context line below the value. */\n hint?: ReactNode;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nfunction inferTrend(delta: ReactNode | undefined): StatTrend | undefined {\n if (typeof delta !== \"string\") return undefined;\n const trimmed = delta.trim();\n if (trimmed.startsWith(\"+\")) return \"up\";\n if (trimmed.startsWith(\"-\") || trimmed.startsWith(\"−\")) return \"down\";\n return undefined;\n}\n\n/**\n * KPI card. Dashboard widget showing a label + big value + optional\n * delta/trend and hint.\n *\n * @example\n * <Stat label=\"Receita\" value=\"R$ 12.345\" delta=\"+12,4%\" trend=\"up\" hint=\"vs. mês anterior\" />\n */\nexport function Stat({ label, value, delta, trend, hint, icon, className, ...props }: StatProps) {\n const resolvedTrend: StatTrend | undefined = trend ?? inferTrend(delta);\n return (\n <div className={cn(styles.stat, className)} {...props}>\n <div className={styles.header}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <span className={styles.label}>{label}</span>\n </div>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n {delta !== undefined && (\n <span\n className={cn(\n styles.delta,\n resolvedTrend === \"up\" && styles.up,\n resolvedTrend === \"down\" && styles.down,\n resolvedTrend === \"flat\" && styles.flat,\n )}\n >\n {delta}\n </span>\n )}\n </div>\n {hint && <p className={styles.hint}>{hint}</p>}\n </div>\n );\n}\n"],"mappings":";;;;AAqBA,SAAS,EAAW,GAAqD;CACrE,IAAI,OAAO,KAAU,UAAU;CAC/B,IAAM,IAAU,EAAM,KAAK;CAC3B,IAAI,EAAQ,WAAW,GAAG,GAAG,OAAO;CACpC,IAAI,EAAQ,WAAW,GAAG,KAAK,EAAQ,WAAW,GAAG,GAAG,OAAO;AAEnE;AASA,SAAgB,EAAK,EAAE,UAAO,UAAO,UAAO,UAAO,SAAM,SAAM,cAAW,GAAG,KAAoB;CAC7F,IAAM,IAAuC,KAAS,EAAW,CAAK;CACtE,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,MAAM,CAAS;EAAG,GAAI;EAAhD,UAAA;GACI,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAvB,UAAA,CACK,KAAQ,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAO,UAAA;IAAW,CAAA,GACnD,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAQ,UAAA;IAAY,CAAA,CAC3C;;GACL,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAvB,UAAA,CACI,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAQ,UAAA;IAAY,CAAA,GAC3C,MAAU,KAAA,KACP,kBAAC,QAAD;KACI,WAAW,EACP,EAAO,OACP,MAAkB,QAAQ,EAAO,IACjC,MAAkB,UAAU,EAAO,MACnC,MAAkB,UAAU,EAAO,IACvC;KAEC,UAAA;IACC,CAAA,CAET;;GACJ,KAAQ,kBAAC,KAAD;IAAG,WAAW,EAAO;IAAO,UAAA;GAAQ,CAAA;EAC5C;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Stepper.cjs","names":[],"sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stepper.module.css\";\n\nexport interface StepItem {\n label: ReactNode;\n /** Secondary line under the label — a hint, or \"optional\". */\n description?: ReactNode;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n /** Index of the currently active step (0-based). */\n current: number;\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * Makes each step activatable. Without it the steps are a read-only\n * indicator, which is the right default — in a gated flow, jumping ahead\n * would skip the gates.\n */\n onStepClick?: (index: number) => void;\n className?: string;\n}\n\n/**\n * Linear progress indicator for multi-step flows. Steps before `current`\n * render as completed; the step at `current` is active; later steps are\n * upcoming.\n */\nexport function Stepper({\n steps,\n current,\n orientation = \"horizontal\",\n onStepClick,\n className,\n}: StepperProps) {\n return (\n <ol\n className={cn(styles.stepper, orientation === \"vertical\" && styles.vertical, className)}\n >\n {steps.map((step, index) => {\n const completed = index < current;\n const active = index === current;\n return (\n <Fragment key={index}>\n <li\n className={cn(\n styles.step,\n completed && styles.completed,\n active && styles.active,\n )}\n aria-current={active ? \"step\" : undefined}\n >\n {onStepClick ? (\n <button\n type=\"button\"\n className={styles.trigger}\n aria-current={active ? \"step\" : undefined}\n onClick={() => onStepClick(index)}\n >\n <span className={styles.dot}>\n {completed ? \"✓\" : index + 1}\n </span>\n <span className={styles.labelGroup}>\n <span className={styles.label}>{step.label}</span>\n {step.description ? (\n <span className={styles.description}>\n {step.description}\n </span>\n ) : null}\n </span>\n </button>\n ) : (\n <>\n <span className={styles.dot}>\n {completed ? \"✓\" : index + 1}\n </span>\n <span className={styles.labelGroup}>\n <span className={styles.label}>{step.label}</span>\n {step.description ? (\n <span className={styles.description}>\n {step.description}\n </span>\n ) : null}\n </span>\n </>\n )}\n </li>\n {index < steps.length - 1 && (\n <span\n className={cn(styles.connector, completed && styles.completed)}\n aria-hidden\n />\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n}\n"],"mappings":"8HA8BA,SAAgB,EAAQ,CACpB,QACA,UACA,cAAc,aACd,cACA,aACa,CACb,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,IAAgB,YAAc,EAAA,QAAO,SAAU,CAAS,WAErF,EAAM,KAAK,EAAM,IAAU,CACxB,IAAM,EAAY,EAAQ,EACpB,EAAS,IAAU,EACzB,OACI,EAAA,EAAA,KAAA,CAAC,EAAA,SAAD,CAAA,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,KAAD,CACI,UAAW,EAAA,GACP,EAAA,QAAO,KACP,GAAa,EAAA,QAAO,UACpB,GAAU,EAAA,QAAO,MACrB,EACA,eAAc,EAAS,OAAS,IAAA,YAE/B,GACG,EAAA,EAAA,KAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,QAClB,eAAc,EAAS,OAAS,IAAA,GAChC,YAAe,EAAY,CAAK,WAJpC,EAMI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,aACnB,EAAY,IAAM,EAAQ,CACzB,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,oBAAxB,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,EAAK,KAAY,CAAA,EAChD,EAAK,aACF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,qBACnB,EAAK,WACJ,CAAA,EACN,IACF,GACF,KAER,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,aACnB,EAAY,IAAM,EAAQ,CACzB,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,oBAAxB,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,EAAK,KAAY,CAAA,EAChD,EAAK,aACF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,qBACnB,EAAK,WACJ,CAAA,EACN,IACF,GACR,CAAA,CAAA,CAEN,CAAA,EACH,EAAQ,EAAM,OAAS,IACpB,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,UAAW,GAAa,EAAA,QAAO,SAAS,EAC7D,cAAA,EACH,CAAA,CAEC,CAAA,EAlDK,CAkDL,CAElB,CAAC,CACD,CAAA,CAEZ"}
1
+ {"version":3,"file":"Stepper.cjs","names":[],"sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stepper.module.css\";\n\nexport interface StepItem {\n label: ReactNode;\n /** Secondary line under the label — a hint, or \"optional\". */\n description?: ReactNode;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n /** Index of the currently active step (0-based). */\n current: number;\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * Makes each step activatable. Without it the steps are a read-only\n * indicator, which is the right default — in a gated flow, jumping ahead\n * would skip the gates.\n */\n onStepClick?: (index: number) => void;\n className?: string;\n}\n\n/**\n * Linear progress indicator for multi-step flows. Steps before `current`\n * render as completed; the step at `current` is active; later steps are\n * upcoming.\n */\nexport function Stepper({\n steps,\n current,\n orientation = \"horizontal\",\n onStepClick,\n className,\n}: StepperProps) {\n return (\n <ol\n className={cn(styles.stepper, orientation === \"vertical\" && styles.vertical, className)}\n >\n {steps.map((step, index) => {\n const completed = index < current;\n const active = index === current;\n return (\n <Fragment key={index}>\n <li\n className={cn(\n styles.step,\n completed && styles.completed,\n active && styles.active,\n )}\n aria-current={active ? \"step\" : undefined}\n >\n {onStepClick ? (\n <button\n type=\"button\"\n className={styles.trigger}\n aria-current={active ? \"step\" : undefined}\n onClick={() => onStepClick(index)}\n >\n <span className={styles.dot}>\n {completed ? \"✓\" : index + 1}\n </span>\n <span className={styles.labelGroup}>\n <span className={styles.label}>{step.label}</span>\n {step.description ? (\n <span className={styles.description}>\n {step.description}\n </span>\n ) : null}\n </span>\n </button>\n ) : (\n <>\n <span className={styles.dot}>\n {completed ? \"✓\" : index + 1}\n </span>\n <span className={styles.labelGroup}>\n <span className={styles.label}>{step.label}</span>\n {step.description ? (\n <span className={styles.description}>\n {step.description}\n </span>\n ) : null}\n </span>\n </>\n )}\n </li>\n {index < steps.length - 1 && (\n <span\n className={cn(styles.connector, completed && styles.completed)}\n aria-hidden\n />\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n}\n"],"mappings":"8HA8BA,SAAgB,EAAQ,CACpB,QACA,UACA,cAAc,aACd,cACA,aACa,CACb,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,IAAgB,YAAc,EAAA,QAAO,SAAU,CAAS,EAErF,SAAA,EAAM,KAAK,EAAM,IAAU,CACxB,IAAM,EAAY,EAAQ,EACpB,EAAS,IAAU,EACzB,OACI,EAAA,EAAA,KAAA,CAAC,EAAA,SAAD,CAAA,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,KAAD,CACI,UAAW,EAAA,GACP,EAAA,QAAO,KACP,GAAa,EAAA,QAAO,UACpB,GAAU,EAAA,QAAO,MACrB,EACA,eAAc,EAAS,OAAS,IAAA,GAE/B,SAAA,GACG,EAAA,EAAA,KAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,QAClB,eAAc,EAAS,OAAS,IAAA,GAChC,YAAe,EAAY,CAAK,EAJpC,SAAA,EAMI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,IACnB,SAAA,EAAY,IAAM,EAAQ,CACzB,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,WAAxB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,EAAK,KAAY,CAAA,EAChD,EAAK,aACF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,YACnB,SAAA,EAAK,WACJ,CAAA,EACN,IACF,CACF,CAAA,CAAA,CAER,CAAA,GAAA,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,IACnB,SAAA,EAAY,IAAM,EAAQ,CACzB,CAAA,GACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,WAAxB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,EAAK,KAAY,CAAA,EAChD,EAAK,aACF,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,YACnB,SAAA,EAAK,WACJ,CAAA,EACN,IACF,CACR,CAAA,CAAA,CAAA,CAAA,CAEN,CAAA,EACH,EAAQ,EAAM,OAAS,IACpB,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,UAAW,GAAa,EAAA,QAAO,SAAS,EAC7D,cAAA,EACH,CAAA,CAEC,CAAA,EAlDK,CAkDL,CAElB,CAAC,CACD,CAAA,CAEZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"Stepper.js","names":[],"sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stepper.module.css\";\n\nexport interface StepItem {\n label: ReactNode;\n /** Secondary line under the label — a hint, or \"optional\". */\n description?: ReactNode;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n /** Index of the currently active step (0-based). */\n current: number;\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * Makes each step activatable. Without it the steps are a read-only\n * indicator, which is the right default — in a gated flow, jumping ahead\n * would skip the gates.\n */\n onStepClick?: (index: number) => void;\n className?: string;\n}\n\n/**\n * Linear progress indicator for multi-step flows. Steps before `current`\n * render as completed; the step at `current` is active; later steps are\n * upcoming.\n */\nexport function Stepper({\n steps,\n current,\n orientation = \"horizontal\",\n onStepClick,\n className,\n}: StepperProps) {\n return (\n <ol\n className={cn(styles.stepper, orientation === \"vertical\" && styles.vertical, className)}\n >\n {steps.map((step, index) => {\n const completed = index < current;\n const active = index === current;\n return (\n <Fragment key={index}>\n <li\n className={cn(\n styles.step,\n completed && styles.completed,\n active && styles.active,\n )}\n aria-current={active ? \"step\" : undefined}\n >\n {onStepClick ? (\n <button\n type=\"button\"\n className={styles.trigger}\n aria-current={active ? \"step\" : undefined}\n onClick={() => onStepClick(index)}\n >\n <span className={styles.dot}>\n {completed ? \"✓\" : index + 1}\n </span>\n <span className={styles.labelGroup}>\n <span className={styles.label}>{step.label}</span>\n {step.description ? (\n <span className={styles.description}>\n {step.description}\n </span>\n ) : null}\n </span>\n </button>\n ) : (\n <>\n <span className={styles.dot}>\n {completed ? \"✓\" : index + 1}\n </span>\n <span className={styles.labelGroup}>\n <span className={styles.label}>{step.label}</span>\n {step.description ? (\n <span className={styles.description}>\n {step.description}\n </span>\n ) : null}\n </span>\n </>\n )}\n </li>\n {index < steps.length - 1 && (\n <span\n className={cn(styles.connector, completed && styles.completed)}\n aria-hidden\n />\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n}\n"],"mappings":";;;;;AA8BA,SAAgB,EAAQ,EACpB,UACA,YACA,iBAAc,cACd,gBACA,gBACa;CACb,OACI,kBAAC,MAAD;EACI,WAAW,EAAG,EAAO,SAAS,MAAgB,cAAc,EAAO,UAAU,CAAS;YAErF,EAAM,KAAK,GAAM,MAAU;GACxB,IAAM,IAAY,IAAQ,GACpB,IAAS,MAAU;GACzB,OACI,kBAAC,GAAD,EAAA,UAAA,CACI,kBAAC,MAAD;IACI,WAAW,EACP,EAAO,MACP,KAAa,EAAO,WACpB,KAAU,EAAO,MACrB;IACA,gBAAc,IAAS,SAAS,KAAA;cAE/B,IACG,kBAAC,UAAD;KACI,MAAK;KACL,WAAW,EAAO;KAClB,gBAAc,IAAS,SAAS,KAAA;KAChC,eAAe,EAAY,CAAK;eAJpC,CAMI,kBAAC,QAAD;MAAM,WAAW,EAAO;gBACnB,IAAY,MAAM,IAAQ;KACzB,CAAA,GACN,kBAAC,QAAD;MAAM,WAAW,EAAO;gBAAxB,CACI,kBAAC,QAAD;OAAM,WAAW,EAAO;iBAAQ,EAAK;MAAY,CAAA,GAChD,EAAK,cACF,kBAAC,QAAD;OAAM,WAAW,EAAO;iBACnB,EAAK;MACJ,CAAA,IACN,IACF;OACF;SAER,kBAAA,GAAA,EAAA,UAAA,CACI,kBAAC,QAAD;KAAM,WAAW,EAAO;eACnB,IAAY,MAAM,IAAQ;IACzB,CAAA,GACN,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAxB,CACI,kBAAC,QAAD;MAAM,WAAW,EAAO;gBAAQ,EAAK;KAAY,CAAA,GAChD,EAAK,cACF,kBAAC,QAAD;MAAM,WAAW,EAAO;gBACnB,EAAK;KACJ,CAAA,IACN,IACF;MACR,EAAA,CAAA;GAEN,CAAA,GACH,IAAQ,EAAM,SAAS,KACpB,kBAAC,QAAD;IACI,WAAW,EAAG,EAAO,WAAW,KAAa,EAAO,SAAS;IAC7D,eAAA;GACH,CAAA,CAEC,EAAA,GAlDK,CAkDL;EAElB,CAAC;CACD,CAAA;AAEZ"}
1
+ {"version":3,"file":"Stepper.js","names":[],"sources":["../../../src/components/Stepper/Stepper.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Stepper.module.css\";\n\nexport interface StepItem {\n label: ReactNode;\n /** Secondary line under the label — a hint, or \"optional\". */\n description?: ReactNode;\n}\n\nexport interface StepperProps {\n steps: StepItem[];\n /** Index of the currently active step (0-based). */\n current: number;\n orientation?: \"horizontal\" | \"vertical\";\n /**\n * Makes each step activatable. Without it the steps are a read-only\n * indicator, which is the right default — in a gated flow, jumping ahead\n * would skip the gates.\n */\n onStepClick?: (index: number) => void;\n className?: string;\n}\n\n/**\n * Linear progress indicator for multi-step flows. Steps before `current`\n * render as completed; the step at `current` is active; later steps are\n * upcoming.\n */\nexport function Stepper({\n steps,\n current,\n orientation = \"horizontal\",\n onStepClick,\n className,\n}: StepperProps) {\n return (\n <ol\n className={cn(styles.stepper, orientation === \"vertical\" && styles.vertical, className)}\n >\n {steps.map((step, index) => {\n const completed = index < current;\n const active = index === current;\n return (\n <Fragment key={index}>\n <li\n className={cn(\n styles.step,\n completed && styles.completed,\n active && styles.active,\n )}\n aria-current={active ? \"step\" : undefined}\n >\n {onStepClick ? (\n <button\n type=\"button\"\n className={styles.trigger}\n aria-current={active ? \"step\" : undefined}\n onClick={() => onStepClick(index)}\n >\n <span className={styles.dot}>\n {completed ? \"✓\" : index + 1}\n </span>\n <span className={styles.labelGroup}>\n <span className={styles.label}>{step.label}</span>\n {step.description ? (\n <span className={styles.description}>\n {step.description}\n </span>\n ) : null}\n </span>\n </button>\n ) : (\n <>\n <span className={styles.dot}>\n {completed ? \"✓\" : index + 1}\n </span>\n <span className={styles.labelGroup}>\n <span className={styles.label}>{step.label}</span>\n {step.description ? (\n <span className={styles.description}>\n {step.description}\n </span>\n ) : null}\n </span>\n </>\n )}\n </li>\n {index < steps.length - 1 && (\n <span\n className={cn(styles.connector, completed && styles.completed)}\n aria-hidden\n />\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n}\n"],"mappings":";;;;;AA8BA,SAAgB,EAAQ,EACpB,UACA,YACA,iBAAc,cACd,gBACA,gBACa;CACb,OACI,kBAAC,MAAD;EACI,WAAW,EAAG,EAAO,SAAS,MAAgB,cAAc,EAAO,UAAU,CAAS;EAErF,UAAA,EAAM,KAAK,GAAM,MAAU;GACxB,IAAM,IAAY,IAAQ,GACpB,IAAS,MAAU;GACzB,OACI,kBAAC,GAAD,EAAA,UAAA,CACI,kBAAC,MAAD;IACI,WAAW,EACP,EAAO,MACP,KAAa,EAAO,WACpB,KAAU,EAAO,MACrB;IACA,gBAAc,IAAS,SAAS,KAAA;IAE/B,UAAA,IACG,kBAAC,UAAD;KACI,MAAK;KACL,WAAW,EAAO;KAClB,gBAAc,IAAS,SAAS,KAAA;KAChC,eAAe,EAAY,CAAK;KAJpC,UAAA,CAMI,kBAAC,QAAD;MAAM,WAAW,EAAO;MACnB,UAAA,IAAY,MAAM,IAAQ;KACzB,CAAA,GACN,kBAAC,QAAD;MAAM,WAAW,EAAO;MAAxB,UAAA,CACI,kBAAC,QAAD;OAAM,WAAW,EAAO;OAAQ,UAAA,EAAK;MAAY,CAAA,GAChD,EAAK,cACF,kBAAC,QAAD;OAAM,WAAW,EAAO;OACnB,UAAA,EAAK;MACJ,CAAA,IACN,IACF;KACF,CAAA,CAAA;IAER,CAAA,IAAA,kBAAA,GAAA,EAAA,UAAA,CACI,kBAAC,QAAD;KAAM,WAAW,EAAO;KACnB,UAAA,IAAY,MAAM,IAAQ;IACzB,CAAA,GACN,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAxB,UAAA,CACI,kBAAC,QAAD;MAAM,WAAW,EAAO;MAAQ,UAAA,EAAK;KAAY,CAAA,GAChD,EAAK,cACF,kBAAC,QAAD;MAAM,WAAW,EAAO;MACnB,UAAA,EAAK;KACJ,CAAA,IACN,IACF;IACR,CAAA,CAAA,EAAA,CAAA;GAEN,CAAA,GACH,IAAQ,EAAM,SAAS,KACpB,kBAAC,QAAD;IACI,WAAW,EAAG,EAAO,WAAW,KAAa,EAAO,SAAS;IAC7D,eAAA;GACH,CAAA,CAEC,EAAA,GAlDK,CAkDL;EAElB,CAAC;CACD,CAAA;AAEZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"StepperInput.cjs","names":[],"sources":["../../../src/components/StepperInput/StepperInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — value/onChange/min/max/step is the numeric contract,\n * format renders it, labels names the increment and decrement buttons for screen\n * readers, and size/disabled/label/className are the field. The button labels cannot\n * be defaulted: they are the only text those buttons have.\n */\nimport { forwardRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { clamp } from \"@/utils/numbers\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./StepperInput.module.css\";\n\nexport interface StepperInputProps {\n /** Current value. */\n value: number;\n /** Fires with the new value (already clamped to min/max). */\n onChange: (value: number) => void;\n /** Lower bound. Default `0`. */\n min?: number;\n /** Upper bound. Default `Number.POSITIVE_INFINITY`. */\n max?: number;\n /** Increment per click. Default `1`. */\n step?: number;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disable the whole control. */\n disabled?: boolean;\n /** Optional label rendered above. */\n label?: ReactNode;\n /** Optional formatter for the displayed value. */\n format?: (value: number) => string;\n /** Custom button labels for accessibility. */\n labels?: { decrement: string; increment: string };\n className?: string;\n}\n\n/**\n * Numeric +/− stepper. Common in checkout quantity selectors and admin\n * forms. Clamps to `[min, max]` and emits already-bounded values.\n *\n * @example\n * <StepperInput value={qty} onChange={setQty} min={1} max={10} />\n */\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(function StepperInput(\n {\n value,\n onChange,\n min = 0,\n max = Number.POSITIVE_INFINITY,\n step = 1,\n size = \"md\",\n disabled = false,\n label,\n format,\n labels = { decrement: \"Diminuir\", increment: \"Aumentar\" },\n className,\n },\n ref,\n) {\n const decrement = (): void => {\n if (disabled) return;\n onChange(clamp(value - step, min, max));\n };\n const increment = (): void => {\n if (disabled) return;\n onChange(clamp(value + step, min, max));\n };\n\n const display = format ? format(value) : String(value);\n const canDecrement = !disabled && value > min;\n const canIncrement = !disabled && value < max;\n\n return (\n <div ref={ref} className={cn(styles.wrapper, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.row, styles[size], disabled && styles.disabled)}>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.decrement}\n onClick={decrement}\n disabled={!canDecrement}\n >\n −\n </button>\n <span className={styles.value} role=\"status\" aria-live=\"polite\">\n {display}\n </span>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.increment}\n onClick={increment}\n disabled={!canIncrement}\n >\n +\n </button>\n </div>\n </div>\n );\n});\n"],"mappings":"wKA2CA,IAAa,GAAA,EAAA,EAAA,WAAA,CAA6D,SACtE,CACI,QACA,WACA,MAAM,EACN,MAAM,IACN,OAAO,EACP,OAAO,KACP,WAAW,GACX,QACA,SACA,SAAS,CAAE,UAAW,WAAY,UAAW,UAAW,EACxD,aAEJ,EACF,CACE,IAAM,MAAwB,CACtB,GACJ,EAAS,EAAA,MAAM,EAAQ,EAAM,EAAK,CAAG,CAAC,CAC1C,EACM,MAAwB,CACtB,GACJ,EAAS,EAAA,MAAM,EAAQ,EAAM,EAAK,CAAG,CAAC,CAC1C,EAEM,EAAU,EAAS,EAAO,CAAK,EAAI,OAAO,CAAK,EAC/C,EAAe,CAAC,GAAY,EAAQ,EACpC,EAAe,CAAC,GAAY,EAAQ,EAE1C,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAU,MAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,CAAS,WAAtD,CACK,IAAS,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAA,QAAO,eAAQ,CAAa,CAAA,GACxD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,EAAA,QAAO,GAAO,GAAY,EAAA,QAAO,QAAQ,WAAxE,EACI,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,IAClB,aAAY,EAAO,UACnB,QAAS,EACT,SAAU,CAAC,WACd,GAEO,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAO,KAAK,SAAS,YAAU,kBAClD,CACC,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,IAClB,aAAY,EAAO,UACnB,QAAS,EACT,SAAU,CAAC,WACd,GAEO,CAAA,CACP,GACJ,GAEb,CAAC"}
1
+ {"version":3,"file":"StepperInput.cjs","names":[],"sources":["../../../src/components/StepperInput/StepperInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — value/onChange/min/max/step is the numeric contract,\n * format renders it, labels names the increment and decrement buttons for screen\n * readers, and size/disabled/label/className are the field. The button labels cannot\n * be defaulted: they are the only text those buttons have.\n */\nimport { forwardRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { clamp } from \"@/utils/numbers\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./StepperInput.module.css\";\n\nexport interface StepperInputProps {\n /** Current value. */\n value: number;\n /** Fires with the new value (already clamped to min/max). */\n onChange: (value: number) => void;\n /** Lower bound. Default `0`. */\n min?: number;\n /** Upper bound. Default `Number.POSITIVE_INFINITY`. */\n max?: number;\n /** Increment per click. Default `1`. */\n step?: number;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disable the whole control. */\n disabled?: boolean;\n /** Optional label rendered above. */\n label?: ReactNode;\n /** Optional formatter for the displayed value. */\n format?: (value: number) => string;\n /** Custom button labels for accessibility. */\n labels?: { decrement: string; increment: string };\n className?: string;\n}\n\n/**\n * Numeric +/− stepper. Common in checkout quantity selectors and admin\n * forms. Clamps to `[min, max]` and emits already-bounded values.\n *\n * @example\n * <StepperInput value={qty} onChange={setQty} min={1} max={10} />\n */\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(function StepperInput(\n {\n value,\n onChange,\n min = 0,\n max = Number.POSITIVE_INFINITY,\n step = 1,\n size = \"md\",\n disabled = false,\n label,\n format,\n labels = { decrement: \"Diminuir\", increment: \"Aumentar\" },\n className,\n },\n ref,\n) {\n const decrement = (): void => {\n if (disabled) return;\n onChange(clamp(value - step, min, max));\n };\n const increment = (): void => {\n if (disabled) return;\n onChange(clamp(value + step, min, max));\n };\n\n const display = format ? format(value) : String(value);\n const canDecrement = !disabled && value > min;\n const canIncrement = !disabled && value < max;\n\n return (\n <div ref={ref} className={cn(styles.wrapper, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.row, styles[size], disabled && styles.disabled)}>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.decrement}\n onClick={decrement}\n disabled={!canDecrement}\n >\n −\n </button>\n <span className={styles.value} role=\"status\" aria-live=\"polite\">\n {display}\n </span>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.increment}\n onClick={increment}\n disabled={!canIncrement}\n >\n +\n </button>\n </div>\n </div>\n );\n});\n"],"mappings":"wKA2CA,IAAa,GAAA,EAAe,EAAA,WAAA,CAA8C,SACtE,CACI,QACA,WACA,MAAM,EACN,MAAM,IACN,OAAO,EACP,OAAO,KACP,WAAW,GACX,QACA,SACA,SAAS,CAAE,UAAW,WAAY,UAAW,UAAW,EACxD,aAEJ,EACF,CACE,IAAM,MAAwB,CACtB,GACJ,EAAS,EAAA,MAAM,EAAQ,EAAM,EAAK,CAAG,CAAC,CAC1C,EACM,MAAwB,CACtB,GACJ,EAAS,EAAA,MAAM,EAAQ,EAAM,EAAK,CAAG,CAAC,CAC1C,EAEM,EAAU,EAAS,EAAO,CAAK,EAAI,OAAO,CAAK,EAC/C,EAAe,CAAC,GAAY,EAAQ,EACpC,EAAe,CAAC,GAAY,EAAQ,EAE1C,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAU,MAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,CAAS,EAAtD,SAAA,CACK,IAAS,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAa,CAAA,GACxD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,EAAA,QAAO,GAAO,GAAY,EAAA,QAAO,QAAQ,EAAxE,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,IAClB,aAAY,EAAO,UACnB,QAAS,EACT,SAAU,CAAC,EACd,SAAA,GAEO,CAAA,GACR,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAO,KAAK,SAAS,YAAU,SAClD,SAAA,CACC,CAAA,GACN,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,IAClB,aAAY,EAAO,UACnB,QAAS,EACT,SAAU,CAAC,EACd,SAAA,GAEO,CAAA,CACP,CACJ,CAAA,CAAA,GAEb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"StepperInput.js","names":[],"sources":["../../../src/components/StepperInput/StepperInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — value/onChange/min/max/step is the numeric contract,\n * format renders it, labels names the increment and decrement buttons for screen\n * readers, and size/disabled/label/className are the field. The button labels cannot\n * be defaulted: they are the only text those buttons have.\n */\nimport { forwardRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { clamp } from \"@/utils/numbers\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./StepperInput.module.css\";\n\nexport interface StepperInputProps {\n /** Current value. */\n value: number;\n /** Fires with the new value (already clamped to min/max). */\n onChange: (value: number) => void;\n /** Lower bound. Default `0`. */\n min?: number;\n /** Upper bound. Default `Number.POSITIVE_INFINITY`. */\n max?: number;\n /** Increment per click. Default `1`. */\n step?: number;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disable the whole control. */\n disabled?: boolean;\n /** Optional label rendered above. */\n label?: ReactNode;\n /** Optional formatter for the displayed value. */\n format?: (value: number) => string;\n /** Custom button labels for accessibility. */\n labels?: { decrement: string; increment: string };\n className?: string;\n}\n\n/**\n * Numeric +/− stepper. Common in checkout quantity selectors and admin\n * forms. Clamps to `[min, max]` and emits already-bounded values.\n *\n * @example\n * <StepperInput value={qty} onChange={setQty} min={1} max={10} />\n */\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(function StepperInput(\n {\n value,\n onChange,\n min = 0,\n max = Number.POSITIVE_INFINITY,\n step = 1,\n size = \"md\",\n disabled = false,\n label,\n format,\n labels = { decrement: \"Diminuir\", increment: \"Aumentar\" },\n className,\n },\n ref,\n) {\n const decrement = (): void => {\n if (disabled) return;\n onChange(clamp(value - step, min, max));\n };\n const increment = (): void => {\n if (disabled) return;\n onChange(clamp(value + step, min, max));\n };\n\n const display = format ? format(value) : String(value);\n const canDecrement = !disabled && value > min;\n const canIncrement = !disabled && value < max;\n\n return (\n <div ref={ref} className={cn(styles.wrapper, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.row, styles[size], disabled && styles.disabled)}>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.decrement}\n onClick={decrement}\n disabled={!canDecrement}\n >\n −\n </button>\n <span className={styles.value} role=\"status\" aria-live=\"polite\">\n {display}\n </span>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.increment}\n onClick={increment}\n disabled={!canIncrement}\n >\n +\n </button>\n </div>\n </div>\n );\n});\n"],"mappings":";;;;;;AA2CA,IAAa,IAAe,EAA8C,SACtE,EACI,UACA,aACA,SAAM,GACN,SAAM,UACN,UAAO,GACP,UAAO,MACP,cAAW,IACX,UACA,WACA,YAAS;CAAE,WAAW;CAAY,WAAW;AAAW,GACxD,gBAEJ,GACF;CACE,IAAM,UAAwB;EACtB,KACJ,EAAS,EAAM,IAAQ,GAAM,GAAK,CAAG,CAAC;CAC1C,GACM,UAAwB;EACtB,KACJ,EAAS,EAAM,IAAQ,GAAM,GAAK,CAAG,CAAC;CAC1C,GAEM,IAAU,IAAS,EAAO,CAAK,IAAI,OAAO,CAAK,GAC/C,IAAe,CAAC,KAAY,IAAQ,GACpC,IAAe,CAAC,KAAY,IAAQ;CAE1C,OACI,kBAAC,OAAD;EAAU;EAAK,WAAW,EAAG,EAAO,SAAS,CAAS;YAAtD,CACK,KAAS,kBAAC,SAAD;GAAO,WAAW,EAAO;aAAQ;EAAa,CAAA,GACxD,kBAAC,OAAD;GAAK,WAAW,EAAG,EAAO,KAAK,EAAO,IAAO,KAAY,EAAO,QAAQ;aAAxE;IACI,kBAAC,UAAD;KACI,MAAK;KACL,WAAW,EAAO;KAClB,cAAY,EAAO;KACnB,SAAS;KACT,UAAU,CAAC;eACd;IAEO,CAAA;IACR,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAO,MAAK;KAAS,aAAU;eAClD;IACC,CAAA;IACN,kBAAC,UAAD;KACI,MAAK;KACL,WAAW,EAAO;KAClB,cAAY,EAAO;KACnB,SAAS;KACT,UAAU,CAAC;eACd;IAEO,CAAA;GACP;IACJ;;AAEb,CAAC"}
1
+ {"version":3,"file":"StepperInput.js","names":[],"sources":["../../../src/components/StepperInput/StepperInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — value/onChange/min/max/step is the numeric contract,\n * format renders it, labels names the increment and decrement buttons for screen\n * readers, and size/disabled/label/className are the field. The button labels cannot\n * be defaulted: they are the only text those buttons have.\n */\nimport { forwardRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { clamp } from \"@/utils/numbers\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./StepperInput.module.css\";\n\nexport interface StepperInputProps {\n /** Current value. */\n value: number;\n /** Fires with the new value (already clamped to min/max). */\n onChange: (value: number) => void;\n /** Lower bound. Default `0`. */\n min?: number;\n /** Upper bound. Default `Number.POSITIVE_INFINITY`. */\n max?: number;\n /** Increment per click. Default `1`. */\n step?: number;\n /** Visual size. Default `\"md\"`. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Disable the whole control. */\n disabled?: boolean;\n /** Optional label rendered above. */\n label?: ReactNode;\n /** Optional formatter for the displayed value. */\n format?: (value: number) => string;\n /** Custom button labels for accessibility. */\n labels?: { decrement: string; increment: string };\n className?: string;\n}\n\n/**\n * Numeric +/− stepper. Common in checkout quantity selectors and admin\n * forms. Clamps to `[min, max]` and emits already-bounded values.\n *\n * @example\n * <StepperInput value={qty} onChange={setQty} min={1} max={10} />\n */\nexport const StepperInput = forwardRef<HTMLDivElement, StepperInputProps>(function StepperInput(\n {\n value,\n onChange,\n min = 0,\n max = Number.POSITIVE_INFINITY,\n step = 1,\n size = \"md\",\n disabled = false,\n label,\n format,\n labels = { decrement: \"Diminuir\", increment: \"Aumentar\" },\n className,\n },\n ref,\n) {\n const decrement = (): void => {\n if (disabled) return;\n onChange(clamp(value - step, min, max));\n };\n const increment = (): void => {\n if (disabled) return;\n onChange(clamp(value + step, min, max));\n };\n\n const display = format ? format(value) : String(value);\n const canDecrement = !disabled && value > min;\n const canIncrement = !disabled && value < max;\n\n return (\n <div ref={ref} className={cn(styles.wrapper, className)}>\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.row, styles[size], disabled && styles.disabled)}>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.decrement}\n onClick={decrement}\n disabled={!canDecrement}\n >\n −\n </button>\n <span className={styles.value} role=\"status\" aria-live=\"polite\">\n {display}\n </span>\n <button\n type=\"button\"\n className={styles.btn}\n aria-label={labels.increment}\n onClick={increment}\n disabled={!canIncrement}\n >\n +\n </button>\n </div>\n </div>\n );\n});\n"],"mappings":";;;;;;AA2CA,IAAa,IAAe,EAA8C,SACtE,EACI,UACA,aACA,SAAM,GACN,SAAM,UACN,UAAO,GACP,UAAO,MACP,cAAW,IACX,UACA,WACA,YAAS;CAAE,WAAW;CAAY,WAAW;AAAW,GACxD,gBAEJ,GACF;CACE,IAAM,UAAwB;EACtB,KACJ,EAAS,EAAM,IAAQ,GAAM,GAAK,CAAG,CAAC;CAC1C,GACM,UAAwB;EACtB,KACJ,EAAS,EAAM,IAAQ,GAAM,GAAK,CAAG,CAAC;CAC1C,GAEM,IAAU,IAAS,EAAO,CAAK,IAAI,OAAO,CAAK,GAC/C,IAAe,CAAC,KAAY,IAAQ,GACpC,IAAe,CAAC,KAAY,IAAQ;CAE1C,OACI,kBAAC,OAAD;EAAU;EAAK,WAAW,EAAG,EAAO,SAAS,CAAS;EAAtD,UAAA,CACK,KAAS,kBAAC,SAAD;GAAO,WAAW,EAAO;GAAQ,UAAA;EAAa,CAAA,GACxD,kBAAC,OAAD;GAAK,WAAW,EAAG,EAAO,KAAK,EAAO,IAAO,KAAY,EAAO,QAAQ;GAAxE,UAAA;IACI,kBAAC,UAAD;KACI,MAAK;KACL,WAAW,EAAO;KAClB,cAAY,EAAO;KACnB,SAAS;KACT,UAAU,CAAC;KACd,UAAA;IAEO,CAAA;IACR,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAO,MAAK;KAAS,aAAU;KAClD,UAAA;IACC,CAAA;IACN,kBAAC,UAAD;KACI,MAAK;KACL,WAAW,EAAO;KAClB,cAAY,EAAO;KACnB,SAAS;KACT,UAAU,CAAC;KACd,UAAA;IAEO,CAAA;GACP;EACJ,CAAA,CAAA;;AAEb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.cjs","names":[],"sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Switch.module.css\";\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n wrapperClassName?: string;\n}\n\n/** Toggle switch backed by a checkbox input. Accessible via keyboard. */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { label, disabled, wrapperClassName, className, ...props },\n ref,\n) {\n return (\n <label className={cn(styles.wrapper, disabled && styles.disabled, wrapperClassName)}>\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n disabled={disabled}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.track} aria-hidden>\n <span className={styles.thumb} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n});\n"],"mappings":"6HAWA,IAAa,GAAA,EAAA,EAAA,WAAA,CAAmD,SAC5D,CAAE,QAAO,WAAU,mBAAkB,YAAW,GAAG,GACnD,EACF,CACE,OACI,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,GAAY,EAAA,QAAO,SAAU,CAAgB,WAAlF,EACI,EAAA,EAAA,IAAA,CAAC,QAAD,CACS,MACL,KAAK,WACL,KAAK,SACK,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,MAAO,CAAS,EACrC,GAAI,CACP,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAO,cAAA,aAC3B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,KAAQ,CAAA,CAC9B,CAAA,EACL,IAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,CAAY,CAAA,CACnD,GAEf,CAAC"}
1
+ {"version":3,"file":"Switch.cjs","names":[],"sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Switch.module.css\";\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n wrapperClassName?: string;\n}\n\n/** Toggle switch backed by a checkbox input. Accessible via keyboard. */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { label, disabled, wrapperClassName, className, ...props },\n ref,\n) {\n return (\n <label className={cn(styles.wrapper, disabled && styles.disabled, wrapperClassName)}>\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n disabled={disabled}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.track} aria-hidden>\n <span className={styles.thumb} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n});\n"],"mappings":"6HAWA,IAAa,GAAA,EAAS,EAAA,WAAA,CAA0C,SAC5D,CAAE,QAAO,WAAU,mBAAkB,YAAW,GAAG,GACnD,EACF,CACE,OACI,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,GAAY,EAAA,QAAO,SAAU,CAAgB,EAAlF,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,QAAD,CACS,MACL,KAAK,WACL,KAAK,SACK,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,MAAO,CAAS,EACrC,GAAI,CACP,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAO,cAAA,GAC3B,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,KAAQ,CAAA,CAC9B,CAAA,EACL,IAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAY,CAAA,CACnD,GAEf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Switch.js","names":[],"sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Switch.module.css\";\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n wrapperClassName?: string;\n}\n\n/** Toggle switch backed by a checkbox input. Accessible via keyboard. */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { label, disabled, wrapperClassName, className, ...props },\n ref,\n) {\n return (\n <label className={cn(styles.wrapper, disabled && styles.disabled, wrapperClassName)}>\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n disabled={disabled}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.track} aria-hidden>\n <span className={styles.thumb} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n});\n"],"mappings":";;;;;AAWA,IAAa,IAAS,EAA0C,SAC5D,EAAE,UAAO,aAAU,qBAAkB,cAAW,GAAG,KACnD,GACF;CACE,OACI,kBAAC,SAAD;EAAO,WAAW,EAAG,EAAO,SAAS,KAAY,EAAO,UAAU,CAAgB;YAAlF;GACI,kBAAC,SAAD;IACS;IACL,MAAK;IACL,MAAK;IACK;IACV,WAAW,EAAG,EAAO,OAAO,CAAS;IACrC,GAAI;GACP,CAAA;GACD,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAO,eAAA;cAC3B,kBAAC,QAAD,EAAM,WAAW,EAAO,MAAQ,CAAA;GAC9B,CAAA;GACL,KAAS,kBAAC,QAAD;IAAM,WAAW,EAAO;cAAQ;GAAY,CAAA;EACnD;;AAEf,CAAC"}
1
+ {"version":3,"file":"Switch.js","names":[],"sources":["../../../src/components/Switch/Switch.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Switch.module.css\";\n\nexport interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, \"type\"> {\n label?: ReactNode;\n wrapperClassName?: string;\n}\n\n/** Toggle switch backed by a checkbox input. Accessible via keyboard. */\nexport const Switch = forwardRef<HTMLInputElement, SwitchProps>(function Switch(\n { label, disabled, wrapperClassName, className, ...props },\n ref,\n) {\n return (\n <label className={cn(styles.wrapper, disabled && styles.disabled, wrapperClassName)}>\n <input\n ref={ref}\n type=\"checkbox\"\n role=\"switch\"\n disabled={disabled}\n className={cn(styles.input, className)}\n {...props}\n />\n <span className={styles.track} aria-hidden>\n <span className={styles.thumb} />\n </span>\n {label && <span className={styles.label}>{label}</span>}\n </label>\n );\n});\n"],"mappings":";;;;;AAWA,IAAa,IAAS,EAA0C,SAC5D,EAAE,UAAO,aAAU,qBAAkB,cAAW,GAAG,KACnD,GACF;CACE,OACI,kBAAC,SAAD;EAAO,WAAW,EAAG,EAAO,SAAS,KAAY,EAAO,UAAU,CAAgB;EAAlF,UAAA;GACI,kBAAC,SAAD;IACS;IACL,MAAK;IACL,MAAK;IACK;IACV,WAAW,EAAG,EAAO,OAAO,CAAS;IACrC,GAAI;GACP,CAAA;GACD,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAO,eAAA;IAC3B,UAAA,kBAAC,QAAD,EAAM,WAAW,EAAO,MAAQ,CAAA;GAC9B,CAAA;GACL,KAAS,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAQ,UAAA;GAAY,CAAA;EACnD;;AAEf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"SyncStatusBadge.cjs","names":[],"sources":["../../../src/components/SyncStatusBadge/SyncStatusBadge.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { AlertTriangle, Check, CloudOff, RefreshCw, UploadCloud } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport type { OfflineSync, SyncTone } from \"@/offline\";\nimport { useSyncStatus } from \"@/offline/use-offline-sync\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\nimport styles from \"./SyncStatusBadge.module.css\";\n\nconst DEFAULT_LABELS: Record<SyncTone, string> = {\n idle: \"Sincronizado\",\n syncing: \"Sincronizando…\",\n pending: \"Pendente\",\n offline: \"Offline\",\n error: \"Erro\",\n};\n\nconst ICONS: Record<SyncTone, typeof Check> = {\n idle: Check,\n syncing: RefreshCw,\n pending: UploadCloud,\n offline: CloudOff,\n error: AlertTriangle,\n};\n\nexport interface SyncStatusBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n /**\n * The dominant tone. Required when `sync` is not passed. Ignored when `sync`\n * is passed (the tone is derived from the engine).\n */\n tone?: SyncTone;\n /**\n * An `OfflineSync` engine to observe directly. When set, the badge wires\n * `useSyncStatus` internally, so `tone` and `pending` come from the engine.\n */\n sync?: OfflineSync<unknown>;\n /** Number of queued mutations, appended to the label when `> 0`. */\n pending?: number;\n /** Override the per-tone label text. */\n labels?: Partial<Record<SyncTone, string>>;\n /** Show the pending count next to the label. Default `true`. */\n showPending?: boolean;\n /** Render only the icon (no text). Default `false`. */\n iconOnly?: boolean;\n}\n\ntype PresentationalProps = Omit<SyncStatusBadgeProps, \"sync\">;\n\n/**\n * The badge itself: a persistent `role=\"status\"` region.\n *\n * Left as its own live region rather than routed through `useAnnounce`, on purpose.\n * The badge is not a transient message — it is a piece of state that stays on\n * screen, which is exactly what `role=\"status\"` describes, and a reader can go back\n * and re-read it. Announcing it *again* from the shared announcer would read every\n * tone change twice.\n *\n * `iconOnly` used to break that, though: dropping the label left a live region whose\n * content never changed, so a switch to `offline` or `error` was announced as\n * nothing at all. The label is now always rendered — visually hidden when\n * `iconOnly`, since `title` is not content and is not announced on a change.\n */\nfunction PresentationalBadge({\n tone = \"idle\",\n pending = 0,\n labels,\n showPending = true,\n iconOnly = false,\n className,\n ...props\n}: PresentationalProps) {\n const Icon = ICONS[tone];\n const label = labels?.[tone] ?? DEFAULT_LABELS[tone];\n const showCount = showPending && pending > 0 && (tone === \"pending\" || tone === \"error\");\n return (\n <span\n className={cn(styles.badge, styles[tone], className)}\n role=\"status\"\n aria-live=\"polite\"\n title={label}\n {...props}\n >\n <Icon\n className={cn(styles.icon, tone === \"syncing\" && styles.spin)}\n size={14}\n aria-hidden=\"true\"\n />\n {iconOnly ? (\n <VisuallyHidden>{label}</VisuallyHidden>\n ) : (\n <span className={styles.label}>{label}</span>\n )}\n {showCount && <span className={styles.count}>{pending}</span>}\n </span>\n );\n}\n\nfunction ConnectedBadge({ sync, ...rest }: PresentationalProps & { sync: OfflineSync<unknown> }) {\n const { tone, pending } = useSyncStatus(sync);\n return <PresentationalBadge {...rest} tone={tone} pending={pending} />;\n}\n\n/**\n * Compact pill showing offline-sync status: a tone-colored icon plus a label\n * and optional pending count.\n *\n * Two modes: pass `sync` to have the badge observe an engine via\n * `useSyncStatus` (zero wiring), or pass an explicit `tone` (+ `pending`) to\n * keep it presentational and testable without IndexedDB.\n *\n * @example\n * // Connected — auto-wires the engine:\n * <SyncStatusBadge sync={notesSync} />\n *\n * // Presentational — you own the state:\n * const { tone, pending } = useSyncStatus(notesSync);\n * <SyncStatusBadge tone={tone} pending={pending} />\n */\nexport function SyncStatusBadge({ sync, ...rest }: SyncStatusBadgeProps) {\n if (sync) return <ConnectedBadge sync={sync} {...rest} />;\n return <PresentationalBadge {...rest} />;\n}\n"],"mappings":"+OAQA,IAAM,EAA2C,CAC7C,KAAM,eACN,QAAS,iBACT,QAAS,WACT,QAAS,UACT,MAAO,MACX,EAEM,EAAwC,CAC1C,KAAM,EAAA,MACN,QAAS,EAAA,UACT,QAAS,EAAA,YACT,QAAS,EAAA,SACT,MAAO,EAAA,aACX,EAuCA,SAAS,EAAoB,CACzB,OAAO,OACP,UAAU,EACV,SACA,cAAc,GACd,WAAW,GACX,YACA,GAAG,GACiB,CACpB,IAAM,EAAO,EAAM,GACb,EAAQ,IAAS,IAAS,EAAe,GACzC,EAAY,GAAe,EAAU,IAAM,IAAS,WAAa,IAAS,SAChF,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,MAAO,EAAA,QAAO,GAAO,CAAS,EACnD,KAAK,SACL,YAAU,SACV,MAAO,EACP,GAAI,WALR,EAOI,EAAA,EAAA,IAAA,CAAC,EAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,IAAS,WAAa,EAAA,QAAO,IAAI,EAC5D,KAAM,GACN,cAAY,MACf,CAAA,EACA,GACG,EAAA,EAAA,IAAA,CAAC,EAAA,eAAD,CAAA,SAAiB,CAAsB,CAAA,GAEvC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,CAAY,CAAA,EAE/C,IAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,CAAc,CAAA,CAC1D,GAEd,CAEA,SAAS,EAAe,CAAE,OAAM,GAAG,GAA8D,CAC7F,GAAM,CAAE,OAAM,WAAY,EAAA,cAAc,CAAI,EAC5C,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,GAAI,EAAY,OAAe,SAAU,CAAA,CACzE,CAkBA,SAAgB,EAAgB,CAAE,OAAM,GAAG,GAA8B,CAErE,OADI,GAAa,EAAA,EAAA,IAAA,CAAC,EAAD,CAAsB,OAAM,GAAI,CAAO,CAAA,GACjD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,GAAI,CAAO,CAAA,CAC3C"}
1
+ {"version":3,"file":"SyncStatusBadge.cjs","names":[],"sources":["../../../src/components/SyncStatusBadge/SyncStatusBadge.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { AlertTriangle, Check, CloudOff, RefreshCw, UploadCloud } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport type { OfflineSync, SyncTone } from \"@/offline\";\nimport { useSyncStatus } from \"@/offline/use-offline-sync\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\nimport styles from \"./SyncStatusBadge.module.css\";\n\nconst DEFAULT_LABELS: Record<SyncTone, string> = {\n idle: \"Sincronizado\",\n syncing: \"Sincronizando…\",\n pending: \"Pendente\",\n offline: \"Offline\",\n error: \"Erro\",\n};\n\nconst ICONS: Record<SyncTone, typeof Check> = {\n idle: Check,\n syncing: RefreshCw,\n pending: UploadCloud,\n offline: CloudOff,\n error: AlertTriangle,\n};\n\nexport interface SyncStatusBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n /**\n * The dominant tone. Required when `sync` is not passed. Ignored when `sync`\n * is passed (the tone is derived from the engine).\n */\n tone?: SyncTone;\n /**\n * An `OfflineSync` engine to observe directly. When set, the badge wires\n * `useSyncStatus` internally, so `tone` and `pending` come from the engine.\n */\n sync?: OfflineSync<unknown>;\n /** Number of queued mutations, appended to the label when `> 0`. */\n pending?: number;\n /** Override the per-tone label text. */\n labels?: Partial<Record<SyncTone, string>>;\n /** Show the pending count next to the label. Default `true`. */\n showPending?: boolean;\n /** Render only the icon (no text). Default `false`. */\n iconOnly?: boolean;\n}\n\ntype PresentationalProps = Omit<SyncStatusBadgeProps, \"sync\">;\n\n/**\n * The badge itself: a persistent `role=\"status\"` region.\n *\n * Left as its own live region rather than routed through `useAnnounce`, on purpose.\n * The badge is not a transient message — it is a piece of state that stays on\n * screen, which is exactly what `role=\"status\"` describes, and a reader can go back\n * and re-read it. Announcing it *again* from the shared announcer would read every\n * tone change twice.\n *\n * `iconOnly` used to break that, though: dropping the label left a live region whose\n * content never changed, so a switch to `offline` or `error` was announced as\n * nothing at all. The label is now always rendered — visually hidden when\n * `iconOnly`, since `title` is not content and is not announced on a change.\n */\nfunction PresentationalBadge({\n tone = \"idle\",\n pending = 0,\n labels,\n showPending = true,\n iconOnly = false,\n className,\n ...props\n}: PresentationalProps) {\n const Icon = ICONS[tone];\n const label = labels?.[tone] ?? DEFAULT_LABELS[tone];\n const showCount = showPending && pending > 0 && (tone === \"pending\" || tone === \"error\");\n return (\n <span\n className={cn(styles.badge, styles[tone], className)}\n role=\"status\"\n aria-live=\"polite\"\n title={label}\n {...props}\n >\n <Icon\n className={cn(styles.icon, tone === \"syncing\" && styles.spin)}\n size={14}\n aria-hidden=\"true\"\n />\n {iconOnly ? (\n <VisuallyHidden>{label}</VisuallyHidden>\n ) : (\n <span className={styles.label}>{label}</span>\n )}\n {showCount && <span className={styles.count}>{pending}</span>}\n </span>\n );\n}\n\nfunction ConnectedBadge({ sync, ...rest }: PresentationalProps & { sync: OfflineSync<unknown> }) {\n const { tone, pending } = useSyncStatus(sync);\n return <PresentationalBadge {...rest} tone={tone} pending={pending} />;\n}\n\n/**\n * Compact pill showing offline-sync status: a tone-colored icon plus a label\n * and optional pending count.\n *\n * Two modes: pass `sync` to have the badge observe an engine via\n * `useSyncStatus` (zero wiring), or pass an explicit `tone` (+ `pending`) to\n * keep it presentational and testable without IndexedDB.\n *\n * @example\n * // Connected — auto-wires the engine:\n * <SyncStatusBadge sync={notesSync} />\n *\n * // Presentational — you own the state:\n * const { tone, pending } = useSyncStatus(notesSync);\n * <SyncStatusBadge tone={tone} pending={pending} />\n */\nexport function SyncStatusBadge({ sync, ...rest }: SyncStatusBadgeProps) {\n if (sync) return <ConnectedBadge sync={sync} {...rest} />;\n return <PresentationalBadge {...rest} />;\n}\n"],"mappings":"+OAQA,IAAM,EAA2C,CAC7C,KAAM,eACN,QAAS,iBACT,QAAS,WACT,QAAS,UACT,MAAO,MACX,EAEM,EAAwC,CAC1C,KAAM,EAAA,MACN,QAAS,EAAA,UACT,QAAS,EAAA,YACT,QAAS,EAAA,SACT,MAAO,EAAA,aACX,EAuCA,SAAS,EAAoB,CACzB,OAAO,OACP,UAAU,EACV,SACA,cAAc,GACd,WAAW,GACX,YACA,GAAG,GACiB,CACpB,IAAM,EAAO,EAAM,GACb,EAAQ,IAAS,IAAS,EAAe,GACzC,EAAY,GAAe,EAAU,IAAM,IAAS,WAAa,IAAS,SAChF,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,MAAO,EAAA,QAAO,GAAO,CAAS,EACnD,KAAK,SACL,YAAU,SACV,MAAO,EACP,GAAI,EALR,SAAA,EAOI,EAAA,EAAA,IAAA,CAAC,EAAD,CACI,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,IAAS,WAAa,EAAA,QAAO,IAAI,EAC5D,KAAM,GACN,cAAY,MACf,CAAA,EACA,GACG,EAAA,EAAA,IAAA,CAAC,EAAA,eAAD,CAAA,SAAiB,CAAsB,CAAA,GAEvC,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAY,CAAA,EAE/C,IAAa,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAc,CAAA,CAC1D,GAEd,CAEA,SAAS,EAAe,CAAE,OAAM,GAAG,GAA8D,CAC7F,GAAM,CAAE,OAAM,WAAY,EAAA,cAAc,CAAI,EAC5C,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,GAAI,EAAY,OAAe,SAAU,CAAA,CACzE,CAkBA,SAAgB,EAAgB,CAAE,OAAM,GAAG,GAA8B,CAErE,OADI,GAAa,EAAA,EAAA,IAAA,CAAC,EAAD,CAAsB,OAAM,GAAI,CAAO,CAAA,GACjD,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,GAAI,CAAO,CAAA,CAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"SyncStatusBadge.js","names":[],"sources":["../../../src/components/SyncStatusBadge/SyncStatusBadge.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { AlertTriangle, Check, CloudOff, RefreshCw, UploadCloud } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport type { OfflineSync, SyncTone } from \"@/offline\";\nimport { useSyncStatus } from \"@/offline/use-offline-sync\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\nimport styles from \"./SyncStatusBadge.module.css\";\n\nconst DEFAULT_LABELS: Record<SyncTone, string> = {\n idle: \"Sincronizado\",\n syncing: \"Sincronizando…\",\n pending: \"Pendente\",\n offline: \"Offline\",\n error: \"Erro\",\n};\n\nconst ICONS: Record<SyncTone, typeof Check> = {\n idle: Check,\n syncing: RefreshCw,\n pending: UploadCloud,\n offline: CloudOff,\n error: AlertTriangle,\n};\n\nexport interface SyncStatusBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n /**\n * The dominant tone. Required when `sync` is not passed. Ignored when `sync`\n * is passed (the tone is derived from the engine).\n */\n tone?: SyncTone;\n /**\n * An `OfflineSync` engine to observe directly. When set, the badge wires\n * `useSyncStatus` internally, so `tone` and `pending` come from the engine.\n */\n sync?: OfflineSync<unknown>;\n /** Number of queued mutations, appended to the label when `> 0`. */\n pending?: number;\n /** Override the per-tone label text. */\n labels?: Partial<Record<SyncTone, string>>;\n /** Show the pending count next to the label. Default `true`. */\n showPending?: boolean;\n /** Render only the icon (no text). Default `false`. */\n iconOnly?: boolean;\n}\n\ntype PresentationalProps = Omit<SyncStatusBadgeProps, \"sync\">;\n\n/**\n * The badge itself: a persistent `role=\"status\"` region.\n *\n * Left as its own live region rather than routed through `useAnnounce`, on purpose.\n * The badge is not a transient message — it is a piece of state that stays on\n * screen, which is exactly what `role=\"status\"` describes, and a reader can go back\n * and re-read it. Announcing it *again* from the shared announcer would read every\n * tone change twice.\n *\n * `iconOnly` used to break that, though: dropping the label left a live region whose\n * content never changed, so a switch to `offline` or `error` was announced as\n * nothing at all. The label is now always rendered — visually hidden when\n * `iconOnly`, since `title` is not content and is not announced on a change.\n */\nfunction PresentationalBadge({\n tone = \"idle\",\n pending = 0,\n labels,\n showPending = true,\n iconOnly = false,\n className,\n ...props\n}: PresentationalProps) {\n const Icon = ICONS[tone];\n const label = labels?.[tone] ?? DEFAULT_LABELS[tone];\n const showCount = showPending && pending > 0 && (tone === \"pending\" || tone === \"error\");\n return (\n <span\n className={cn(styles.badge, styles[tone], className)}\n role=\"status\"\n aria-live=\"polite\"\n title={label}\n {...props}\n >\n <Icon\n className={cn(styles.icon, tone === \"syncing\" && styles.spin)}\n size={14}\n aria-hidden=\"true\"\n />\n {iconOnly ? (\n <VisuallyHidden>{label}</VisuallyHidden>\n ) : (\n <span className={styles.label}>{label}</span>\n )}\n {showCount && <span className={styles.count}>{pending}</span>}\n </span>\n );\n}\n\nfunction ConnectedBadge({ sync, ...rest }: PresentationalProps & { sync: OfflineSync<unknown> }) {\n const { tone, pending } = useSyncStatus(sync);\n return <PresentationalBadge {...rest} tone={tone} pending={pending} />;\n}\n\n/**\n * Compact pill showing offline-sync status: a tone-colored icon plus a label\n * and optional pending count.\n *\n * Two modes: pass `sync` to have the badge observe an engine via\n * `useSyncStatus` (zero wiring), or pass an explicit `tone` (+ `pending`) to\n * keep it presentational and testable without IndexedDB.\n *\n * @example\n * // Connected — auto-wires the engine:\n * <SyncStatusBadge sync={notesSync} />\n *\n * // Presentational — you own the state:\n * const { tone, pending } = useSyncStatus(notesSync);\n * <SyncStatusBadge tone={tone} pending={pending} />\n */\nexport function SyncStatusBadge({ sync, ...rest }: SyncStatusBadgeProps) {\n if (sync) return <ConnectedBadge sync={sync} {...rest} />;\n return <PresentationalBadge {...rest} />;\n}\n"],"mappings":";;;;;;;AAQA,IAAM,IAA2C;CAC7C,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAO;AACX,GAEM,IAAwC;CAC1C,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAO;AACX;AAuCA,SAAS,EAAoB,EACzB,UAAO,QACP,aAAU,GACV,WACA,iBAAc,IACd,cAAW,IACX,cACA,GAAG,KACiB;CACpB,IAAM,IAAO,EAAM,IACb,IAAQ,IAAS,MAAS,EAAe,IACzC,IAAY,KAAe,IAAU,MAAM,MAAS,aAAa,MAAS;CAChF,OACI,kBAAC,QAAD;EACI,WAAW,EAAG,EAAO,OAAO,EAAO,IAAO,CAAS;EACnD,MAAK;EACL,aAAU;EACV,OAAO;EACP,GAAI;YALR;GAOI,kBAAC,GAAD;IACI,WAAW,EAAG,EAAO,MAAM,MAAS,aAAa,EAAO,IAAI;IAC5D,MAAM;IACN,eAAY;GACf,CAAA;GACA,IACG,kBAAC,GAAD,EAAA,UAAiB,EAAsB,CAAA,IAEvC,kBAAC,QAAD;IAAM,WAAW,EAAO;cAAQ;GAAY,CAAA;GAE/C,KAAa,kBAAC,QAAD;IAAM,WAAW,EAAO;cAAQ;GAAc,CAAA;EAC1D;;AAEd;AAEA,SAAS,EAAe,EAAE,SAAM,GAAG,KAA8D;CAC7F,IAAM,EAAE,SAAM,eAAY,EAAc,CAAI;CAC5C,OAAO,kBAAC,GAAD;EAAqB,GAAI;EAAY;EAAe;CAAU,CAAA;AACzE;AAkBA,SAAgB,EAAgB,EAAE,SAAM,GAAG,KAA8B;CAErE,OADI,IAAa,kBAAC,GAAD;EAAsB;EAAM,GAAI;CAAO,CAAA,IACjD,kBAAC,GAAD,EAAqB,GAAI,EAAO,CAAA;AAC3C"}
1
+ {"version":3,"file":"SyncStatusBadge.js","names":[],"sources":["../../../src/components/SyncStatusBadge/SyncStatusBadge.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { AlertTriangle, Check, CloudOff, RefreshCw, UploadCloud } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport type { OfflineSync, SyncTone } from \"@/offline\";\nimport { useSyncStatus } from \"@/offline/use-offline-sync\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\nimport styles from \"./SyncStatusBadge.module.css\";\n\nconst DEFAULT_LABELS: Record<SyncTone, string> = {\n idle: \"Sincronizado\",\n syncing: \"Sincronizando…\",\n pending: \"Pendente\",\n offline: \"Offline\",\n error: \"Erro\",\n};\n\nconst ICONS: Record<SyncTone, typeof Check> = {\n idle: Check,\n syncing: RefreshCw,\n pending: UploadCloud,\n offline: CloudOff,\n error: AlertTriangle,\n};\n\nexport interface SyncStatusBadgeProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n /**\n * The dominant tone. Required when `sync` is not passed. Ignored when `sync`\n * is passed (the tone is derived from the engine).\n */\n tone?: SyncTone;\n /**\n * An `OfflineSync` engine to observe directly. When set, the badge wires\n * `useSyncStatus` internally, so `tone` and `pending` come from the engine.\n */\n sync?: OfflineSync<unknown>;\n /** Number of queued mutations, appended to the label when `> 0`. */\n pending?: number;\n /** Override the per-tone label text. */\n labels?: Partial<Record<SyncTone, string>>;\n /** Show the pending count next to the label. Default `true`. */\n showPending?: boolean;\n /** Render only the icon (no text). Default `false`. */\n iconOnly?: boolean;\n}\n\ntype PresentationalProps = Omit<SyncStatusBadgeProps, \"sync\">;\n\n/**\n * The badge itself: a persistent `role=\"status\"` region.\n *\n * Left as its own live region rather than routed through `useAnnounce`, on purpose.\n * The badge is not a transient message — it is a piece of state that stays on\n * screen, which is exactly what `role=\"status\"` describes, and a reader can go back\n * and re-read it. Announcing it *again* from the shared announcer would read every\n * tone change twice.\n *\n * `iconOnly` used to break that, though: dropping the label left a live region whose\n * content never changed, so a switch to `offline` or `error` was announced as\n * nothing at all. The label is now always rendered — visually hidden when\n * `iconOnly`, since `title` is not content and is not announced on a change.\n */\nfunction PresentationalBadge({\n tone = \"idle\",\n pending = 0,\n labels,\n showPending = true,\n iconOnly = false,\n className,\n ...props\n}: PresentationalProps) {\n const Icon = ICONS[tone];\n const label = labels?.[tone] ?? DEFAULT_LABELS[tone];\n const showCount = showPending && pending > 0 && (tone === \"pending\" || tone === \"error\");\n return (\n <span\n className={cn(styles.badge, styles[tone], className)}\n role=\"status\"\n aria-live=\"polite\"\n title={label}\n {...props}\n >\n <Icon\n className={cn(styles.icon, tone === \"syncing\" && styles.spin)}\n size={14}\n aria-hidden=\"true\"\n />\n {iconOnly ? (\n <VisuallyHidden>{label}</VisuallyHidden>\n ) : (\n <span className={styles.label}>{label}</span>\n )}\n {showCount && <span className={styles.count}>{pending}</span>}\n </span>\n );\n}\n\nfunction ConnectedBadge({ sync, ...rest }: PresentationalProps & { sync: OfflineSync<unknown> }) {\n const { tone, pending } = useSyncStatus(sync);\n return <PresentationalBadge {...rest} tone={tone} pending={pending} />;\n}\n\n/**\n * Compact pill showing offline-sync status: a tone-colored icon plus a label\n * and optional pending count.\n *\n * Two modes: pass `sync` to have the badge observe an engine via\n * `useSyncStatus` (zero wiring), or pass an explicit `tone` (+ `pending`) to\n * keep it presentational and testable without IndexedDB.\n *\n * @example\n * // Connected — auto-wires the engine:\n * <SyncStatusBadge sync={notesSync} />\n *\n * // Presentational — you own the state:\n * const { tone, pending } = useSyncStatus(notesSync);\n * <SyncStatusBadge tone={tone} pending={pending} />\n */\nexport function SyncStatusBadge({ sync, ...rest }: SyncStatusBadgeProps) {\n if (sync) return <ConnectedBadge sync={sync} {...rest} />;\n return <PresentationalBadge {...rest} />;\n}\n"],"mappings":";;;;;;;AAQA,IAAM,IAA2C;CAC7C,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAO;AACX,GAEM,IAAwC;CAC1C,MAAM;CACN,SAAS;CACT,SAAS;CACT,SAAS;CACT,OAAO;AACX;AAuCA,SAAS,EAAoB,EACzB,UAAO,QACP,aAAU,GACV,WACA,iBAAc,IACd,cAAW,IACX,cACA,GAAG,KACiB;CACpB,IAAM,IAAO,EAAM,IACb,IAAQ,IAAS,MAAS,EAAe,IACzC,IAAY,KAAe,IAAU,MAAM,MAAS,aAAa,MAAS;CAChF,OACI,kBAAC,QAAD;EACI,WAAW,EAAG,EAAO,OAAO,EAAO,IAAO,CAAS;EACnD,MAAK;EACL,aAAU;EACV,OAAO;EACP,GAAI;EALR,UAAA;GAOI,kBAAC,GAAD;IACI,WAAW,EAAG,EAAO,MAAM,MAAS,aAAa,EAAO,IAAI;IAC5D,MAAM;IACN,eAAY;GACf,CAAA;GACA,IACG,kBAAC,GAAD,EAAA,UAAiB,EAAsB,CAAA,IAEvC,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAQ,UAAA;GAAY,CAAA;GAE/C,KAAa,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAQ,UAAA;GAAc,CAAA;EAC1D;;AAEd;AAEA,SAAS,EAAe,EAAE,SAAM,GAAG,KAA8D;CAC7F,IAAM,EAAE,SAAM,eAAY,EAAc,CAAI;CAC5C,OAAO,kBAAC,GAAD;EAAqB,GAAI;EAAY;EAAe;CAAU,CAAA;AACzE;AAkBA,SAAgB,EAAgB,EAAE,SAAM,GAAG,KAA8B;CAErE,OADI,IAAa,kBAAC,GAAD;EAAsB;EAAM,GAAI;CAAO,CAAA,IACjD,kBAAC,GAAD,EAAqB,GAAI,EAAO,CAAA;AAC3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"Table.cjs","names":[],"sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — columns, data and rowKey are the model; onRowClick\n * and emptyMessage the interaction and the empty state; stackOnMobile and\n * scrollLabel are the two ways a table survives a phone, and the label is required\n * because a scroll region needs an accessible name.\n */\nimport { useRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useScrollOverflow } from \"@/hooks/use-scroll-overflow\";\nimport styles from \"./Table.module.css\";\n\nexport type TableAlign = \"left\" | \"right\" | \"center\";\nexport type TablePriority = \"always\" | \"tablet\" | \"desktop\";\n\nexport interface TableColumn<T> {\n key: string;\n header: ReactNode;\n /** Render the cell content. Defaults to `row[key]` if not provided. */\n render?: (row: T, index: number) => ReactNode;\n align?: TableAlign;\n width?: string | number;\n className?: string;\n /**\n * Visibility priority: `always` (default) shows on every viewport,\n * `tablet` hides below md (< 768px), `desktop` hides below lg (< 1024px).\n */\n priority?: TablePriority;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n rowKey: (row: T, index: number) => string | number;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n /**\n * Stack mode — render rows as label/value cards on mobile (< md).\n * Better than horizontal scroll when each row has 3+ columns of dense data.\n */\n stackOnMobile?: boolean;\n /**\n * Accessible name for the scrollable region, used only while the table is\n * actually wider than its box. A focus stop that announces nothing is worse\n * than no focus stop, so name the table when the page holds several.\n */\n scrollLabel?: string;\n}\n\nfunction priorityClass(priority: TablePriority | undefined): string | undefined {\n if (priority === \"tablet\") return styles.priorityTablet;\n if (priority === \"desktop\") return styles.priorityDesktop;\n return undefined;\n}\n\n/**\n * Lightweight table with declarative columns + mobile niceties.\n *\n * - `priority` per column lets less-important data hide on narrow viewports.\n * - `stackOnMobile` re-renders each row as a label/value card on mobile,\n * avoiding horizontal scroll for dense data.\n */\nexport function Table<T>({\n columns,\n data,\n rowKey,\n onRowClick,\n emptyMessage = \"Nenhum registro encontrado.\",\n className,\n stackOnMobile = false,\n scrollLabel = \"Tabela rolável horizontalmente\",\n}: TableProps<T>) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const scrollable = useScrollOverflow(scrollRef, \"horizontal\");\n\n return (\n <div\n ref={scrollRef}\n className={cn(styles.scroll, stackOnMobile && styles.stackable, className)}\n tabIndex={scrollable ? 0 : undefined}\n role={scrollable ? \"group\" : undefined}\n aria-label={scrollable ? scrollLabel : undefined}\n >\n <table className={styles.table}>\n <thead className={cn(stackOnMobile && styles.stackableHead)}>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n styles.th,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n )}\n style={{ width: column.width }}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.length === 0 ? (\n <tr>\n <td className={styles.emptyRow} colSpan={columns.length}>\n {emptyMessage}\n </td>\n </tr>\n ) : (\n data.map((row, index) => (\n <tr\n key={rowKey(row, index)}\n className={cn(\n styles.tr,\n onRowClick && styles.clickable,\n stackOnMobile && styles.stackableRow,\n )}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {columns.map((column) => {\n const content = column.render\n ? column.render(row, index)\n : (row as Record<string, ReactNode>)[column.key];\n return (\n <td\n key={column.key}\n className={cn(\n styles.td,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n column.className,\n )}\n data-label={\n typeof column.header === \"string\"\n ? column.header\n : undefined\n }\n >\n {content}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"6KAkDA,SAAS,EAAc,EAAyD,CAC5E,GAAI,IAAa,SAAU,OAAO,EAAA,QAAO,eACzC,GAAI,IAAa,UAAW,OAAO,EAAA,QAAO,eAE9C,CASA,SAAgB,EAAS,CACrB,UACA,OACA,SACA,aACA,eAAe,8BACf,YACA,gBAAgB,GAChB,cAAc,kCACA,CACd,IAAM,GAAA,EAAA,EAAA,OAAA,CAAmC,IAAI,EACvC,EAAa,EAAA,kBAAkB,EAAW,YAAY,EAE5D,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,IAAK,EACL,UAAW,EAAA,GAAG,EAAA,QAAO,OAAQ,GAAiB,EAAA,QAAO,UAAW,CAAS,EACzE,SAAU,EAAa,EAAI,IAAA,GAC3B,KAAM,EAAa,QAAU,IAAA,GAC7B,aAAY,EAAa,EAAc,IAAA,aAEvC,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAA,QAAO,eAAzB,EACI,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAA,GAAG,GAAiB,EAAA,QAAO,aAAa,YACtD,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACK,EAAQ,IAAK,IACV,EAAA,EAAA,IAAA,CAAC,KAAD,CAEI,UAAW,EAAA,GACP,EAAA,QAAO,GACP,EAAO,QAAU,SAAW,EAAA,QAAO,WACnC,EAAO,QAAU,UAAY,EAAA,QAAO,YACpC,EAAc,EAAO,QAAQ,CACjC,EACA,MAAO,CAAE,MAAO,EAAO,KAAM,WAE5B,EAAO,MACR,EAVK,EAAO,GAUZ,CACP,CACD,CAAA,CACD,CAAA,GACP,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SACK,EAAK,SAAW,GACb,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAA,QAAO,SAAU,QAAS,EAAQ,gBAC5C,CACD,CAAA,CACJ,CAAA,EAEJ,EAAK,KAAK,EAAK,KACX,EAAA,EAAA,IAAA,CAAC,KAAD,CAEI,UAAW,EAAA,GACP,EAAA,QAAO,GACP,GAAc,EAAA,QAAO,UACrB,GAAiB,EAAA,QAAO,YAC5B,EACA,QAAS,MAAmB,EAAW,CAAG,EAAI,IAAA,YAE7C,EAAQ,IAAK,GAAW,CACrB,IAAM,EAAU,EAAO,OACjB,EAAO,OAAO,EAAK,CAAK,EACvB,EAAkC,EAAO,KAChD,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAEI,UAAW,EAAA,GACP,EAAA,QAAO,GACP,EAAO,QAAU,SAAW,EAAA,QAAO,WACnC,EAAO,QAAU,UAAY,EAAA,QAAO,YACpC,EAAc,EAAO,QAAQ,EAC7B,EAAO,SACX,EACA,aACI,OAAO,EAAO,QAAW,SACnB,EAAO,OACP,IAAA,YAGT,CACD,EAfK,EAAO,GAeZ,CAEZ,CAAC,CACD,EAhCK,EAAO,EAAK,CAAK,CAgCtB,CACP,CAEF,CAAA,CACJ,GACN,CAAA,CAEb"}
1
+ {"version":3,"file":"Table.cjs","names":[],"sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — columns, data and rowKey are the model; onRowClick\n * and emptyMessage the interaction and the empty state; stackOnMobile and\n * scrollLabel are the two ways a table survives a phone, and the label is required\n * because a scroll region needs an accessible name.\n */\nimport { useRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useScrollOverflow } from \"@/hooks/use-scroll-overflow\";\nimport styles from \"./Table.module.css\";\n\nexport type TableAlign = \"left\" | \"right\" | \"center\";\nexport type TablePriority = \"always\" | \"tablet\" | \"desktop\";\n\nexport interface TableColumn<T> {\n key: string;\n header: ReactNode;\n /** Render the cell content. Defaults to `row[key]` if not provided. */\n render?: (row: T, index: number) => ReactNode;\n align?: TableAlign;\n width?: string | number;\n className?: string;\n /**\n * Visibility priority: `always` (default) shows on every viewport,\n * `tablet` hides below md (< 768px), `desktop` hides below lg (< 1024px).\n */\n priority?: TablePriority;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n rowKey: (row: T, index: number) => string | number;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n /**\n * Stack mode — render rows as label/value cards on mobile (< md).\n * Better than horizontal scroll when each row has 3+ columns of dense data.\n */\n stackOnMobile?: boolean;\n /**\n * Accessible name for the scrollable region, used only while the table is\n * actually wider than its box. A focus stop that announces nothing is worse\n * than no focus stop, so name the table when the page holds several.\n */\n scrollLabel?: string;\n}\n\nfunction priorityClass(priority: TablePriority | undefined): string | undefined {\n if (priority === \"tablet\") return styles.priorityTablet;\n if (priority === \"desktop\") return styles.priorityDesktop;\n return undefined;\n}\n\n/**\n * Lightweight table with declarative columns + mobile niceties.\n *\n * - `priority` per column lets less-important data hide on narrow viewports.\n * - `stackOnMobile` re-renders each row as a label/value card on mobile,\n * avoiding horizontal scroll for dense data.\n */\nexport function Table<T>({\n columns,\n data,\n rowKey,\n onRowClick,\n emptyMessage = \"Nenhum registro encontrado.\",\n className,\n stackOnMobile = false,\n scrollLabel = \"Tabela rolável horizontalmente\",\n}: TableProps<T>) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const scrollable = useScrollOverflow(scrollRef, \"horizontal\");\n\n return (\n <div\n ref={scrollRef}\n className={cn(styles.scroll, stackOnMobile && styles.stackable, className)}\n tabIndex={scrollable ? 0 : undefined}\n role={scrollable ? \"group\" : undefined}\n aria-label={scrollable ? scrollLabel : undefined}\n >\n <table className={styles.table}>\n <thead className={cn(stackOnMobile && styles.stackableHead)}>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n styles.th,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n )}\n style={{ width: column.width }}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.length === 0 ? (\n <tr>\n <td className={styles.emptyRow} colSpan={columns.length}>\n {emptyMessage}\n </td>\n </tr>\n ) : (\n data.map((row, index) => (\n <tr\n key={rowKey(row, index)}\n className={cn(\n styles.tr,\n onRowClick && styles.clickable,\n stackOnMobile && styles.stackableRow,\n )}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {columns.map((column) => {\n const content = column.render\n ? column.render(row, index)\n : (row as Record<string, ReactNode>)[column.key];\n return (\n <td\n key={column.key}\n className={cn(\n styles.td,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n column.className,\n )}\n data-label={\n typeof column.header === \"string\"\n ? column.header\n : undefined\n }\n >\n {content}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":"6KAkDA,SAAS,EAAc,EAAyD,CAC5E,GAAI,IAAa,SAAU,OAAO,EAAA,QAAO,eACzC,GAAI,IAAa,UAAW,OAAO,EAAA,QAAO,eAE9C,CASA,SAAgB,EAAS,CACrB,UACA,OACA,SACA,aACA,eAAe,8BACf,YACA,gBAAgB,GAChB,cAAc,kCACA,CACd,IAAM,GAAA,EAAY,EAAA,OAAA,CAAuB,IAAI,EACvC,EAAa,EAAA,kBAAkB,EAAW,YAAY,EAE5D,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,IAAK,EACL,UAAW,EAAA,GAAG,EAAA,QAAO,OAAQ,GAAiB,EAAA,QAAO,UAAW,CAAS,EACzE,SAAU,EAAa,EAAI,IAAA,GAC3B,KAAM,EAAa,QAAU,IAAA,GAC7B,aAAY,EAAa,EAAc,IAAA,GAEvC,UAAA,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,UAAW,EAAA,QAAO,MAAzB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAA,GAAG,GAAiB,EAAA,QAAO,aAAa,EACtD,UAAA,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACK,EAAQ,IAAK,IACV,EAAA,EAAA,IAAA,CAAC,KAAD,CAEI,UAAW,EAAA,GACP,EAAA,QAAO,GACP,EAAO,QAAU,SAAW,EAAA,QAAO,WACnC,EAAO,QAAU,UAAY,EAAA,QAAO,YACpC,EAAc,EAAO,QAAQ,CACjC,EACA,MAAO,CAAE,MAAO,EAAO,KAAM,EAE5B,SAAA,EAAO,MACR,EAVK,EAAO,GAUZ,CACP,CACD,CAAA,CACD,CAAA,GACP,EAAA,EAAA,IAAA,CAAC,QAAD,CAAA,SACK,EAAK,SAAW,GACb,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,UACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAA,QAAO,SAAU,QAAS,EAAQ,OAC5C,SAAA,CACD,CAAA,CACJ,CAAA,EAEJ,EAAK,KAAK,EAAK,KACX,EAAA,EAAA,IAAA,CAAC,KAAD,CAEI,UAAW,EAAA,GACP,EAAA,QAAO,GACP,GAAc,EAAA,QAAO,UACrB,GAAiB,EAAA,QAAO,YAC5B,EACA,QAAS,MAAmB,EAAW,CAAG,EAAI,IAAA,GAE7C,SAAA,EAAQ,IAAK,GAAW,CACrB,IAAM,EAAU,EAAO,OACjB,EAAO,OAAO,EAAK,CAAK,EACvB,EAAkC,EAAO,KAChD,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAEI,UAAW,EAAA,GACP,EAAA,QAAO,GACP,EAAO,QAAU,SAAW,EAAA,QAAO,WACnC,EAAO,QAAU,UAAY,EAAA,QAAO,YACpC,EAAc,EAAO,QAAQ,EAC7B,EAAO,SACX,EACA,aACI,OAAO,EAAO,QAAW,SACnB,EAAO,OACP,IAAA,GAGT,SAAA,CACD,EAfK,EAAO,GAeZ,CAEZ,CAAC,CACD,EAhCK,EAAO,EAAK,CAAK,CAgCtB,CACP,CAEF,CAAA,CACJ,GACN,CAAA,CAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","names":[],"sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — columns, data and rowKey are the model; onRowClick\n * and emptyMessage the interaction and the empty state; stackOnMobile and\n * scrollLabel are the two ways a table survives a phone, and the label is required\n * because a scroll region needs an accessible name.\n */\nimport { useRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useScrollOverflow } from \"@/hooks/use-scroll-overflow\";\nimport styles from \"./Table.module.css\";\n\nexport type TableAlign = \"left\" | \"right\" | \"center\";\nexport type TablePriority = \"always\" | \"tablet\" | \"desktop\";\n\nexport interface TableColumn<T> {\n key: string;\n header: ReactNode;\n /** Render the cell content. Defaults to `row[key]` if not provided. */\n render?: (row: T, index: number) => ReactNode;\n align?: TableAlign;\n width?: string | number;\n className?: string;\n /**\n * Visibility priority: `always` (default) shows on every viewport,\n * `tablet` hides below md (< 768px), `desktop` hides below lg (< 1024px).\n */\n priority?: TablePriority;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n rowKey: (row: T, index: number) => string | number;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n /**\n * Stack mode — render rows as label/value cards on mobile (< md).\n * Better than horizontal scroll when each row has 3+ columns of dense data.\n */\n stackOnMobile?: boolean;\n /**\n * Accessible name for the scrollable region, used only while the table is\n * actually wider than its box. A focus stop that announces nothing is worse\n * than no focus stop, so name the table when the page holds several.\n */\n scrollLabel?: string;\n}\n\nfunction priorityClass(priority: TablePriority | undefined): string | undefined {\n if (priority === \"tablet\") return styles.priorityTablet;\n if (priority === \"desktop\") return styles.priorityDesktop;\n return undefined;\n}\n\n/**\n * Lightweight table with declarative columns + mobile niceties.\n *\n * - `priority` per column lets less-important data hide on narrow viewports.\n * - `stackOnMobile` re-renders each row as a label/value card on mobile,\n * avoiding horizontal scroll for dense data.\n */\nexport function Table<T>({\n columns,\n data,\n rowKey,\n onRowClick,\n emptyMessage = \"Nenhum registro encontrado.\",\n className,\n stackOnMobile = false,\n scrollLabel = \"Tabela rolável horizontalmente\",\n}: TableProps<T>) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const scrollable = useScrollOverflow(scrollRef, \"horizontal\");\n\n return (\n <div\n ref={scrollRef}\n className={cn(styles.scroll, stackOnMobile && styles.stackable, className)}\n tabIndex={scrollable ? 0 : undefined}\n role={scrollable ? \"group\" : undefined}\n aria-label={scrollable ? scrollLabel : undefined}\n >\n <table className={styles.table}>\n <thead className={cn(stackOnMobile && styles.stackableHead)}>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n styles.th,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n )}\n style={{ width: column.width }}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.length === 0 ? (\n <tr>\n <td className={styles.emptyRow} colSpan={columns.length}>\n {emptyMessage}\n </td>\n </tr>\n ) : (\n data.map((row, index) => (\n <tr\n key={rowKey(row, index)}\n className={cn(\n styles.tr,\n onRowClick && styles.clickable,\n stackOnMobile && styles.stackableRow,\n )}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {columns.map((column) => {\n const content = column.render\n ? column.render(row, index)\n : (row as Record<string, ReactNode>)[column.key];\n return (\n <td\n key={column.key}\n className={cn(\n styles.td,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n column.className,\n )}\n data-label={\n typeof column.header === \"string\"\n ? column.header\n : undefined\n }\n >\n {content}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":";;;;;;AAkDA,SAAS,EAAc,GAAyD;CAC5E,IAAI,MAAa,UAAU,OAAO,EAAO;CACzC,IAAI,MAAa,WAAW,OAAO,EAAO;AAE9C;AASA,SAAgB,EAAS,EACrB,YACA,SACA,WACA,eACA,kBAAe,+BACf,cACA,mBAAgB,IAChB,iBAAc,oCACA;CACd,IAAM,IAAY,EAAuB,IAAI,GACvC,IAAa,EAAkB,GAAW,YAAY;CAE5D,OACI,kBAAC,OAAD;EACI,KAAK;EACL,WAAW,EAAG,EAAO,QAAQ,KAAiB,EAAO,WAAW,CAAS;EACzE,UAAU,IAAa,IAAI,KAAA;EAC3B,MAAM,IAAa,UAAU,KAAA;EAC7B,cAAY,IAAa,IAAc,KAAA;YAEvC,kBAAC,SAAD;GAAO,WAAW,EAAO;aAAzB,CACI,kBAAC,SAAD;IAAO,WAAW,EAAG,KAAiB,EAAO,aAAa;cACtD,kBAAC,MAAD,EAAA,UACK,EAAQ,KAAK,MACV,kBAAC,MAAD;KAEI,WAAW,EACP,EAAO,IACP,EAAO,UAAU,WAAW,EAAO,YACnC,EAAO,UAAU,YAAY,EAAO,aACpC,EAAc,EAAO,QAAQ,CACjC;KACA,OAAO,EAAE,OAAO,EAAO,MAAM;eAE5B,EAAO;IACR,GAVK,EAAO,GAUZ,CACP,EACD,CAAA;GACD,CAAA,GACP,kBAAC,SAAD,EAAA,UACK,EAAK,WAAW,IACb,kBAAC,MAAD,EAAA,UACI,kBAAC,MAAD;IAAI,WAAW,EAAO;IAAU,SAAS,EAAQ;cAC5C;GACD,CAAA,EACJ,CAAA,IAEJ,EAAK,KAAK,GAAK,MACX,kBAAC,MAAD;IAEI,WAAW,EACP,EAAO,IACP,KAAc,EAAO,WACrB,KAAiB,EAAO,YAC5B;IACA,SAAS,UAAmB,EAAW,CAAG,IAAI,KAAA;cAE7C,EAAQ,KAAK,MAAW;KACrB,IAAM,IAAU,EAAO,SACjB,EAAO,OAAO,GAAK,CAAK,IACvB,EAAkC,EAAO;KAChD,OACI,kBAAC,MAAD;MAEI,WAAW,EACP,EAAO,IACP,EAAO,UAAU,WAAW,EAAO,YACnC,EAAO,UAAU,YAAY,EAAO,aACpC,EAAc,EAAO,QAAQ,GAC7B,EAAO,SACX;MACA,cACI,OAAO,EAAO,UAAW,WACnB,EAAO,SACP,KAAA;gBAGT;KACD,GAfK,EAAO,GAeZ;IAEZ,CAAC;GACD,GAhCK,EAAO,GAAK,CAAK,CAgCtB,CACP,EAEF,CAAA,CACJ;;CACN,CAAA;AAEb"}
1
+ {"version":3,"file":"Table.js","names":[],"sources":["../../../src/components/Table/Table.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — columns, data and rowKey are the model; onRowClick\n * and emptyMessage the interaction and the empty state; stackOnMobile and\n * scrollLabel are the two ways a table survives a phone, and the label is required\n * because a scroll region needs an accessible name.\n */\nimport { useRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useScrollOverflow } from \"@/hooks/use-scroll-overflow\";\nimport styles from \"./Table.module.css\";\n\nexport type TableAlign = \"left\" | \"right\" | \"center\";\nexport type TablePriority = \"always\" | \"tablet\" | \"desktop\";\n\nexport interface TableColumn<T> {\n key: string;\n header: ReactNode;\n /** Render the cell content. Defaults to `row[key]` if not provided. */\n render?: (row: T, index: number) => ReactNode;\n align?: TableAlign;\n width?: string | number;\n className?: string;\n /**\n * Visibility priority: `always` (default) shows on every viewport,\n * `tablet` hides below md (< 768px), `desktop` hides below lg (< 1024px).\n */\n priority?: TablePriority;\n}\n\nexport interface TableProps<T> {\n columns: TableColumn<T>[];\n data: T[];\n rowKey: (row: T, index: number) => string | number;\n onRowClick?: (row: T) => void;\n emptyMessage?: ReactNode;\n className?: string;\n /**\n * Stack mode — render rows as label/value cards on mobile (< md).\n * Better than horizontal scroll when each row has 3+ columns of dense data.\n */\n stackOnMobile?: boolean;\n /**\n * Accessible name for the scrollable region, used only while the table is\n * actually wider than its box. A focus stop that announces nothing is worse\n * than no focus stop, so name the table when the page holds several.\n */\n scrollLabel?: string;\n}\n\nfunction priorityClass(priority: TablePriority | undefined): string | undefined {\n if (priority === \"tablet\") return styles.priorityTablet;\n if (priority === \"desktop\") return styles.priorityDesktop;\n return undefined;\n}\n\n/**\n * Lightweight table with declarative columns + mobile niceties.\n *\n * - `priority` per column lets less-important data hide on narrow viewports.\n * - `stackOnMobile` re-renders each row as a label/value card on mobile,\n * avoiding horizontal scroll for dense data.\n */\nexport function Table<T>({\n columns,\n data,\n rowKey,\n onRowClick,\n emptyMessage = \"Nenhum registro encontrado.\",\n className,\n stackOnMobile = false,\n scrollLabel = \"Tabela rolável horizontalmente\",\n}: TableProps<T>) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const scrollable = useScrollOverflow(scrollRef, \"horizontal\");\n\n return (\n <div\n ref={scrollRef}\n className={cn(styles.scroll, stackOnMobile && styles.stackable, className)}\n tabIndex={scrollable ? 0 : undefined}\n role={scrollable ? \"group\" : undefined}\n aria-label={scrollable ? scrollLabel : undefined}\n >\n <table className={styles.table}>\n <thead className={cn(stackOnMobile && styles.stackableHead)}>\n <tr>\n {columns.map((column) => (\n <th\n key={column.key}\n className={cn(\n styles.th,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n )}\n style={{ width: column.width }}\n >\n {column.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.length === 0 ? (\n <tr>\n <td className={styles.emptyRow} colSpan={columns.length}>\n {emptyMessage}\n </td>\n </tr>\n ) : (\n data.map((row, index) => (\n <tr\n key={rowKey(row, index)}\n className={cn(\n styles.tr,\n onRowClick && styles.clickable,\n stackOnMobile && styles.stackableRow,\n )}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n >\n {columns.map((column) => {\n const content = column.render\n ? column.render(row, index)\n : (row as Record<string, ReactNode>)[column.key];\n return (\n <td\n key={column.key}\n className={cn(\n styles.td,\n column.align === \"right\" && styles.alignRight,\n column.align === \"center\" && styles.alignCenter,\n priorityClass(column.priority),\n column.className,\n )}\n data-label={\n typeof column.header === \"string\"\n ? column.header\n : undefined\n }\n >\n {content}\n </td>\n );\n })}\n </tr>\n ))\n )}\n </tbody>\n </table>\n </div>\n );\n}\n"],"mappings":";;;;;;AAkDA,SAAS,EAAc,GAAyD;CAC5E,IAAI,MAAa,UAAU,OAAO,EAAO;CACzC,IAAI,MAAa,WAAW,OAAO,EAAO;AAE9C;AASA,SAAgB,EAAS,EACrB,YACA,SACA,WACA,eACA,kBAAe,+BACf,cACA,mBAAgB,IAChB,iBAAc,oCACA;CACd,IAAM,IAAY,EAAuB,IAAI,GACvC,IAAa,EAAkB,GAAW,YAAY;CAE5D,OACI,kBAAC,OAAD;EACI,KAAK;EACL,WAAW,EAAG,EAAO,QAAQ,KAAiB,EAAO,WAAW,CAAS;EACzE,UAAU,IAAa,IAAI,KAAA;EAC3B,MAAM,IAAa,UAAU,KAAA;EAC7B,cAAY,IAAa,IAAc,KAAA;EAEvC,UAAA,kBAAC,SAAD;GAAO,WAAW,EAAO;GAAzB,UAAA,CACI,kBAAC,SAAD;IAAO,WAAW,EAAG,KAAiB,EAAO,aAAa;IACtD,UAAA,kBAAC,MAAD,EAAA,UACK,EAAQ,KAAK,MACV,kBAAC,MAAD;KAEI,WAAW,EACP,EAAO,IACP,EAAO,UAAU,WAAW,EAAO,YACnC,EAAO,UAAU,YAAY,EAAO,aACpC,EAAc,EAAO,QAAQ,CACjC;KACA,OAAO,EAAE,OAAO,EAAO,MAAM;KAE5B,UAAA,EAAO;IACR,GAVK,EAAO,GAUZ,CACP,EACD,CAAA;GACD,CAAA,GACP,kBAAC,SAAD,EAAA,UACK,EAAK,WAAW,IACb,kBAAC,MAAD,EAAA,UACI,kBAAC,MAAD;IAAI,WAAW,EAAO;IAAU,SAAS,EAAQ;IAC5C,UAAA;GACD,CAAA,EACJ,CAAA,IAEJ,EAAK,KAAK,GAAK,MACX,kBAAC,MAAD;IAEI,WAAW,EACP,EAAO,IACP,KAAc,EAAO,WACrB,KAAiB,EAAO,YAC5B;IACA,SAAS,UAAmB,EAAW,CAAG,IAAI,KAAA;IAE7C,UAAA,EAAQ,KAAK,MAAW;KACrB,IAAM,IAAU,EAAO,SACjB,EAAO,OAAO,GAAK,CAAK,IACvB,EAAkC,EAAO;KAChD,OACI,kBAAC,MAAD;MAEI,WAAW,EACP,EAAO,IACP,EAAO,UAAU,WAAW,EAAO,YACnC,EAAO,UAAU,YAAY,EAAO,aACpC,EAAc,EAAO,QAAQ,GAC7B,EAAO,SACX;MACA,cACI,OAAO,EAAO,UAAW,WACnB,EAAO,SACP,KAAA;MAGT,UAAA;KACD,GAfK,EAAO,GAeZ;IAEZ,CAAC;GACD,GAhCK,EAAO,GAAK,CAAK,CAgCtB,CACP,EAEF,CAAA,CACJ;;CACN,CAAA;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.cjs","names":[],"sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n id: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n /** Initial active tab id. Defaults to the first non-disabled item. */\n defaultId?: string;\n /** Controlled active id. When provided, ignore internal state. */\n activeId?: string;\n onChange?: (id: string) => void;\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\n/**\n * Accessible tabs with an underline (default) or pill variant. Controlled via\n * `activeId` + `onChange` or uncontrolled via `defaultId`.\n */\nexport function Tabs({\n items,\n defaultId,\n activeId,\n onChange,\n variant = \"underline\",\n className,\n}: TabsProps) {\n const firstEnabled = items.find((item) => !item.disabled);\n const [internal, setInternal] = useState<string | undefined>(defaultId ?? firstEnabled?.id);\n\n const isControlled = activeId !== undefined;\n const current = isControlled ? activeId : internal;\n const active = items.find((item) => item.id === current) ?? firstEnabled;\n\n function activate(id: string): void {\n if (!isControlled) setInternal(id);\n onChange?.(id);\n }\n\n return (\n <div className={className}>\n <div role=\"tablist\" className={cn(styles.tablist, variant === \"pill\" && styles.pill)}>\n {items.map((item) => {\n const isActive = item.id === active?.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`panel-${item.id}`}\n id={`tab-${item.id}`}\n disabled={item.disabled}\n className={cn(styles.tab, isActive && styles.active)}\n onClick={() => activate(item.id)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n {active && (\n <div\n role=\"tabpanel\"\n id={`panel-${active.id}`}\n aria-labelledby={`tab-${active.id}`}\n className={styles.panel}\n >\n {active.content}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"2HA2BA,SAAgB,EAAK,CACjB,QACA,YACA,WACA,WACA,UAAU,YACV,aACU,CACV,IAAM,EAAe,EAAM,KAAM,GAAS,CAAC,EAAK,QAAQ,EAClD,CAAC,EAAU,IAAA,EAAA,EAAA,SAAA,CAA4C,GAAa,GAAc,EAAE,EAEpF,EAAe,IAAa,IAAA,GAC5B,EAAU,EAAe,EAAW,EACpC,EAAS,EAAM,KAAM,GAAS,EAAK,KAAO,CAAO,GAAK,EAE5D,SAAS,EAAS,EAAkB,CAC3B,GAAc,EAAY,CAAE,EACjC,IAAW,CAAE,CACjB,CAEA,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAgB,qBAAhB,EACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,KAAK,UAAU,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,IAAY,QAAU,EAAA,QAAO,IAAI,WAC9E,EAAM,IAAK,GAAS,CACjB,IAAM,EAAW,EAAK,KAAO,GAAQ,GACrC,OACI,EAAA,EAAA,IAAA,CAAC,SAAD,CAEI,KAAK,SACL,KAAK,MACL,gBAAe,EACf,gBAAe,SAAS,EAAK,KAC7B,GAAI,OAAO,EAAK,KAChB,SAAU,EAAK,SACf,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,GAAY,EAAA,QAAO,MAAM,EACnD,YAAe,EAAS,EAAK,EAAE,WAE9B,EAAK,KACF,EAXC,EAAK,EAWN,CAEhB,CAAC,CACA,CAAA,EACJ,IACG,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,KAAK,WACL,GAAI,SAAS,EAAO,KACpB,kBAAiB,OAAO,EAAO,KAC/B,UAAW,EAAA,QAAO,eAEjB,EAAO,OACP,CAAA,CAER,GAEb"}
1
+ {"version":3,"file":"Tabs.cjs","names":[],"sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n id: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n /** Initial active tab id. Defaults to the first non-disabled item. */\n defaultId?: string;\n /** Controlled active id. When provided, ignore internal state. */\n activeId?: string;\n onChange?: (id: string) => void;\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\n/**\n * Accessible tabs with an underline (default) or pill variant. Controlled via\n * `activeId` + `onChange` or uncontrolled via `defaultId`.\n */\nexport function Tabs({\n items,\n defaultId,\n activeId,\n onChange,\n variant = \"underline\",\n className,\n}: TabsProps) {\n const firstEnabled = items.find((item) => !item.disabled);\n const [internal, setInternal] = useState<string | undefined>(defaultId ?? firstEnabled?.id);\n\n const isControlled = activeId !== undefined;\n const current = isControlled ? activeId : internal;\n const active = items.find((item) => item.id === current) ?? firstEnabled;\n\n function activate(id: string): void {\n if (!isControlled) setInternal(id);\n onChange?.(id);\n }\n\n return (\n <div className={className}>\n <div role=\"tablist\" className={cn(styles.tablist, variant === \"pill\" && styles.pill)}>\n {items.map((item) => {\n const isActive = item.id === active?.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`panel-${item.id}`}\n id={`tab-${item.id}`}\n disabled={item.disabled}\n className={cn(styles.tab, isActive && styles.active)}\n onClick={() => activate(item.id)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n {active && (\n <div\n role=\"tabpanel\"\n id={`panel-${active.id}`}\n aria-labelledby={`tab-${active.id}`}\n className={styles.panel}\n >\n {active.content}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"2HA2BA,SAAgB,EAAK,CACjB,QACA,YACA,WACA,WACA,UAAU,YACV,aACU,CACV,IAAM,EAAe,EAAM,KAAM,GAAS,CAAC,EAAK,QAAQ,EAClD,CAAC,EAAU,IAAA,EAAe,EAAA,SAAA,CAA6B,GAAa,GAAc,EAAE,EAEpF,EAAe,IAAa,IAAA,GAC5B,EAAU,EAAe,EAAW,EACpC,EAAS,EAAM,KAAM,GAAS,EAAK,KAAO,CAAO,GAAK,EAE5D,SAAS,EAAS,EAAkB,CAC3B,GAAc,EAAY,CAAE,EACjC,IAAW,CAAE,CACjB,CAEA,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAgB,YAAhB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,KAAK,UAAU,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,IAAY,QAAU,EAAA,QAAO,IAAI,EAC9E,SAAA,EAAM,IAAK,GAAS,CACjB,IAAM,EAAW,EAAK,KAAO,GAAQ,GACrC,OACI,EAAA,EAAA,IAAA,CAAC,SAAD,CAEI,KAAK,SACL,KAAK,MACL,gBAAe,EACf,gBAAe,SAAS,EAAK,KAC7B,GAAI,OAAO,EAAK,KAChB,SAAU,EAAK,SACf,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,GAAY,EAAA,QAAO,MAAM,EACnD,YAAe,EAAS,EAAK,EAAE,EAE9B,SAAA,EAAK,KACF,EAXC,EAAK,EAWN,CAEhB,CAAC,CACA,CAAA,EACJ,IACG,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,KAAK,WACL,GAAI,SAAS,EAAO,KACpB,kBAAiB,OAAO,EAAO,KAC/B,UAAW,EAAA,QAAO,MAEjB,SAAA,EAAO,OACP,CAAA,CAER,GAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tabs.js","names":[],"sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n id: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n /** Initial active tab id. Defaults to the first non-disabled item. */\n defaultId?: string;\n /** Controlled active id. When provided, ignore internal state. */\n activeId?: string;\n onChange?: (id: string) => void;\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\n/**\n * Accessible tabs with an underline (default) or pill variant. Controlled via\n * `activeId` + `onChange` or uncontrolled via `defaultId`.\n */\nexport function Tabs({\n items,\n defaultId,\n activeId,\n onChange,\n variant = \"underline\",\n className,\n}: TabsProps) {\n const firstEnabled = items.find((item) => !item.disabled);\n const [internal, setInternal] = useState<string | undefined>(defaultId ?? firstEnabled?.id);\n\n const isControlled = activeId !== undefined;\n const current = isControlled ? activeId : internal;\n const active = items.find((item) => item.id === current) ?? firstEnabled;\n\n function activate(id: string): void {\n if (!isControlled) setInternal(id);\n onChange?.(id);\n }\n\n return (\n <div className={className}>\n <div role=\"tablist\" className={cn(styles.tablist, variant === \"pill\" && styles.pill)}>\n {items.map((item) => {\n const isActive = item.id === active?.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`panel-${item.id}`}\n id={`tab-${item.id}`}\n disabled={item.disabled}\n className={cn(styles.tab, isActive && styles.active)}\n onClick={() => activate(item.id)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n {active && (\n <div\n role=\"tabpanel\"\n id={`panel-${active.id}`}\n aria-labelledby={`tab-${active.id}`}\n className={styles.panel}\n >\n {active.content}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;AA2BA,SAAgB,EAAK,EACjB,UACA,cACA,aACA,aACA,aAAU,aACV,gBACU;CACV,IAAM,IAAe,EAAM,MAAM,MAAS,CAAC,EAAK,QAAQ,GAClD,CAAC,GAAU,KAAe,EAA6B,KAAa,GAAc,EAAE,GAEpF,IAAe,MAAa,KAAA,GAC5B,IAAU,IAAe,IAAW,GACpC,IAAS,EAAM,MAAM,MAAS,EAAK,OAAO,CAAO,KAAK;CAE5D,SAAS,EAAS,GAAkB;EAEhC,AADK,KAAc,EAAY,CAAE,GACjC,IAAW,CAAE;CACjB;CAEA,OACI,kBAAC,OAAD;EAAgB;YAAhB,CACI,kBAAC,OAAD;GAAK,MAAK;GAAU,WAAW,EAAG,EAAO,SAAS,MAAY,UAAU,EAAO,IAAI;aAC9E,EAAM,KAAK,MAAS;IACjB,IAAM,IAAW,EAAK,OAAO,GAAQ;IACrC,OACI,kBAAC,UAAD;KAEI,MAAK;KACL,MAAK;KACL,iBAAe;KACf,iBAAe,SAAS,EAAK;KAC7B,IAAI,OAAO,EAAK;KAChB,UAAU,EAAK;KACf,WAAW,EAAG,EAAO,KAAK,KAAY,EAAO,MAAM;KACnD,eAAe,EAAS,EAAK,EAAE;eAE9B,EAAK;IACF,GAXC,EAAK,EAWN;GAEhB,CAAC;EACA,CAAA,GACJ,KACG,kBAAC,OAAD;GACI,MAAK;GACL,IAAI,SAAS,EAAO;GACpB,mBAAiB,OAAO,EAAO;GAC/B,WAAW,EAAO;aAEjB,EAAO;EACP,CAAA,CAER;;AAEb"}
1
+ {"version":3,"file":"Tabs.js","names":[],"sources":["../../../src/components/Tabs/Tabs.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tabs.module.css\";\n\nexport interface TabItem {\n id: string;\n label: ReactNode;\n content: ReactNode;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n /** Initial active tab id. Defaults to the first non-disabled item. */\n defaultId?: string;\n /** Controlled active id. When provided, ignore internal state. */\n activeId?: string;\n onChange?: (id: string) => void;\n variant?: \"underline\" | \"pill\";\n className?: string;\n}\n\n/**\n * Accessible tabs with an underline (default) or pill variant. Controlled via\n * `activeId` + `onChange` or uncontrolled via `defaultId`.\n */\nexport function Tabs({\n items,\n defaultId,\n activeId,\n onChange,\n variant = \"underline\",\n className,\n}: TabsProps) {\n const firstEnabled = items.find((item) => !item.disabled);\n const [internal, setInternal] = useState<string | undefined>(defaultId ?? firstEnabled?.id);\n\n const isControlled = activeId !== undefined;\n const current = isControlled ? activeId : internal;\n const active = items.find((item) => item.id === current) ?? firstEnabled;\n\n function activate(id: string): void {\n if (!isControlled) setInternal(id);\n onChange?.(id);\n }\n\n return (\n <div className={className}>\n <div role=\"tablist\" className={cn(styles.tablist, variant === \"pill\" && styles.pill)}>\n {items.map((item) => {\n const isActive = item.id === active?.id;\n return (\n <button\n key={item.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`panel-${item.id}`}\n id={`tab-${item.id}`}\n disabled={item.disabled}\n className={cn(styles.tab, isActive && styles.active)}\n onClick={() => activate(item.id)}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n {active && (\n <div\n role=\"tabpanel\"\n id={`panel-${active.id}`}\n aria-labelledby={`tab-${active.id}`}\n className={styles.panel}\n >\n {active.content}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;AA2BA,SAAgB,EAAK,EACjB,UACA,cACA,aACA,aACA,aAAU,aACV,gBACU;CACV,IAAM,IAAe,EAAM,MAAM,MAAS,CAAC,EAAK,QAAQ,GAClD,CAAC,GAAU,KAAe,EAA6B,KAAa,GAAc,EAAE,GAEpF,IAAe,MAAa,KAAA,GAC5B,IAAU,IAAe,IAAW,GACpC,IAAS,EAAM,MAAM,MAAS,EAAK,OAAO,CAAO,KAAK;CAE5D,SAAS,EAAS,GAAkB;EAEhC,AADK,KAAc,EAAY,CAAE,GACjC,IAAW,CAAE;CACjB;CAEA,OACI,kBAAC,OAAD;EAAgB;EAAhB,UAAA,CACI,kBAAC,OAAD;GAAK,MAAK;GAAU,WAAW,EAAG,EAAO,SAAS,MAAY,UAAU,EAAO,IAAI;GAC9E,UAAA,EAAM,KAAK,MAAS;IACjB,IAAM,IAAW,EAAK,OAAO,GAAQ;IACrC,OACI,kBAAC,UAAD;KAEI,MAAK;KACL,MAAK;KACL,iBAAe;KACf,iBAAe,SAAS,EAAK;KAC7B,IAAI,OAAO,EAAK;KAChB,UAAU,EAAK;KACf,WAAW,EAAG,EAAO,KAAK,KAAY,EAAO,MAAM;KACnD,eAAe,EAAS,EAAK,EAAE;KAE9B,UAAA,EAAK;IACF,GAXC,EAAK,EAWN;GAEhB,CAAC;EACA,CAAA,GACJ,KACG,kBAAC,OAAD;GACI,MAAK;GACL,IAAI,SAAS,EAAO;GACpB,mBAAiB,OAAO,EAAO;GAC/B,WAAW,EAAO;GAEjB,UAAA,EAAO;EACP,CAAA,CAER;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.cjs","names":[],"sources":["../../../src/components/Tag/Tag.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tag.module.css\";\n\nexport type TagVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type TagSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TagProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"onRemove\"> {\n /** Visual variant. Default `\"neutral\"`. */\n variant?: TagVariant;\n /** Visual size. Default `\"md\"`. */\n size?: TagSize;\n /** When set, renders a close button that fires this callback. */\n onRemove?: () => void;\n /** Custom remove label for screen readers. Default `\"Remover\"`. */\n removeLabel?: string;\n children?: ReactNode;\n}\n\n/**\n * Removable chip — used for filter tokens, applied search filters,\n * selected entities. Different from `Badge` (status-only, not removable).\n *\n * @example\n * <Tag variant=\"primary\" onRemove={() => removeFilter(\"sao-paulo\")}>\n * São Paulo\n * </Tag>\n */\nexport function Tag({\n variant = \"neutral\",\n size = \"md\",\n onRemove,\n removeLabel = \"Remover\",\n className,\n children,\n ...props\n}: TagProps) {\n return (\n <span className={cn(styles.tag, styles[variant], styles[size], className)} {...props}>\n <span className={styles.label}>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={removeLabel}\n onClick={onRemove}\n >\n ×\n </button>\n )}\n </span>\n );\n}\n"],"mappings":"uGA4BA,SAAgB,EAAI,CAChB,UAAU,UACV,OAAO,KACP,WACA,cAAc,UACd,YACA,WACA,GAAG,GACM,CACT,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,EAAA,QAAO,GAAU,EAAA,QAAO,GAAO,CAAS,EAAG,GAAI,WAA/E,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,UAAe,CAAA,EAC9C,IACG,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,OAClB,aAAY,EACZ,QAAS,WACZ,GAEO,CAAA,CAEV,GAEd"}
1
+ {"version":3,"file":"Tag.cjs","names":[],"sources":["../../../src/components/Tag/Tag.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tag.module.css\";\n\nexport type TagVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type TagSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TagProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"onRemove\"> {\n /** Visual variant. Default `\"neutral\"`. */\n variant?: TagVariant;\n /** Visual size. Default `\"md\"`. */\n size?: TagSize;\n /** When set, renders a close button that fires this callback. */\n onRemove?: () => void;\n /** Custom remove label for screen readers. Default `\"Remover\"`. */\n removeLabel?: string;\n children?: ReactNode;\n}\n\n/**\n * Removable chip — used for filter tokens, applied search filters,\n * selected entities. Different from `Badge` (status-only, not removable).\n *\n * @example\n * <Tag variant=\"primary\" onRemove={() => removeFilter(\"sao-paulo\")}>\n * São Paulo\n * </Tag>\n */\nexport function Tag({\n variant = \"neutral\",\n size = \"md\",\n onRemove,\n removeLabel = \"Remover\",\n className,\n children,\n ...props\n}: TagProps) {\n return (\n <span className={cn(styles.tag, styles[variant], styles[size], className)} {...props}>\n <span className={styles.label}>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={removeLabel}\n onClick={onRemove}\n >\n ×\n </button>\n )}\n </span>\n );\n}\n"],"mappings":"uGA4BA,SAAgB,EAAI,CAChB,UAAU,UACV,OAAO,KACP,WACA,cAAc,UACd,YACA,WACA,GAAG,GACM,CACT,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,EAAA,QAAO,GAAU,EAAA,QAAO,GAAO,CAAS,EAAG,GAAI,EAA/E,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,UAAe,CAAA,EAC9C,IACG,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,OAClB,aAAY,EACZ,QAAS,EACZ,SAAA,GAEO,CAAA,CAEV,GAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tag.js","names":[],"sources":["../../../src/components/Tag/Tag.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tag.module.css\";\n\nexport type TagVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type TagSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TagProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"onRemove\"> {\n /** Visual variant. Default `\"neutral\"`. */\n variant?: TagVariant;\n /** Visual size. Default `\"md\"`. */\n size?: TagSize;\n /** When set, renders a close button that fires this callback. */\n onRemove?: () => void;\n /** Custom remove label for screen readers. Default `\"Remover\"`. */\n removeLabel?: string;\n children?: ReactNode;\n}\n\n/**\n * Removable chip — used for filter tokens, applied search filters,\n * selected entities. Different from `Badge` (status-only, not removable).\n *\n * @example\n * <Tag variant=\"primary\" onRemove={() => removeFilter(\"sao-paulo\")}>\n * São Paulo\n * </Tag>\n */\nexport function Tag({\n variant = \"neutral\",\n size = \"md\",\n onRemove,\n removeLabel = \"Remover\",\n className,\n children,\n ...props\n}: TagProps) {\n return (\n <span className={cn(styles.tag, styles[variant], styles[size], className)} {...props}>\n <span className={styles.label}>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={removeLabel}\n onClick={onRemove}\n >\n ×\n </button>\n )}\n </span>\n );\n}\n"],"mappings":";;;;AA4BA,SAAgB,EAAI,EAChB,aAAU,WACV,UAAO,MACP,aACA,iBAAc,WACd,cACA,aACA,GAAG,KACM;CACT,OACI,kBAAC,QAAD;EAAM,WAAW,EAAG,EAAO,KAAK,EAAO,IAAU,EAAO,IAAO,CAAS;EAAG,GAAI;YAA/E,CACI,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAQ;EAAe,CAAA,GAC9C,KACG,kBAAC,UAAD;GACI,MAAK;GACL,WAAW,EAAO;GAClB,cAAY;GACZ,SAAS;aACZ;EAEO,CAAA,CAEV;;AAEd"}
1
+ {"version":3,"file":"Tag.js","names":[],"sources":["../../../src/components/Tag/Tag.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Tag.module.css\";\n\nexport type TagVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type TagSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface TagProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"onRemove\"> {\n /** Visual variant. Default `\"neutral\"`. */\n variant?: TagVariant;\n /** Visual size. Default `\"md\"`. */\n size?: TagSize;\n /** When set, renders a close button that fires this callback. */\n onRemove?: () => void;\n /** Custom remove label for screen readers. Default `\"Remover\"`. */\n removeLabel?: string;\n children?: ReactNode;\n}\n\n/**\n * Removable chip — used for filter tokens, applied search filters,\n * selected entities. Different from `Badge` (status-only, not removable).\n *\n * @example\n * <Tag variant=\"primary\" onRemove={() => removeFilter(\"sao-paulo\")}>\n * São Paulo\n * </Tag>\n */\nexport function Tag({\n variant = \"neutral\",\n size = \"md\",\n onRemove,\n removeLabel = \"Remover\",\n className,\n children,\n ...props\n}: TagProps) {\n return (\n <span className={cn(styles.tag, styles[variant], styles[size], className)} {...props}>\n <span className={styles.label}>{children}</span>\n {onRemove && (\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={removeLabel}\n onClick={onRemove}\n >\n ×\n </button>\n )}\n </span>\n );\n}\n"],"mappings":";;;;AA4BA,SAAgB,EAAI,EAChB,aAAU,WACV,UAAO,MACP,aACA,iBAAc,WACd,cACA,aACA,GAAG,KACM;CACT,OACI,kBAAC,QAAD;EAAM,WAAW,EAAG,EAAO,KAAK,EAAO,IAAU,EAAO,IAAO,CAAS;EAAG,GAAI;EAA/E,UAAA,CACI,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAQ;EAAe,CAAA,GAC9C,KACG,kBAAC,UAAD;GACI,MAAK;GACL,WAAW,EAAO;GAClB,cAAY;GACZ,SAAS;GACZ,UAAA;EAEO,CAAA,CAEV;;AAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.cjs","names":[],"sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import { forwardRef, useId } from \"react\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: string;\n wrapperClassName?: string;\n}\n\n/**\n * Multi-line text input. Mirrors the {@link Input} API for label/helper/error.\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { label, helperText, error, wrapperClassName, className, id, required, ...props },\n ref,\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={textareaId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n aria-invalid={!!error}\n required={required}\n className={cn(styles.textarea, className)}\n {...props}\n />\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n"],"mappings":"+HAeA,IAAa,GAAA,EAAA,EAAA,WAAA,CAA0D,SACnE,CAAE,QAAO,aAAY,QAAO,mBAAkB,YAAW,KAAI,WAAU,GAAG,GAC1E,EACF,CACE,IAAM,GAAA,EAAA,EAAA,MAAA,CAAoB,EACpB,EAAa,GAAM,EAEzB,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,GAAS,EAAA,QAAO,MAAO,CAAgB,WAA1E,CACK,IACG,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,QAAS,EAAY,UAAW,EAAA,QAAO,eAA9C,CACK,EACA,IAAY,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,kBAAU,GAAO,CAAA,CACnD,KAEX,EAAA,EAAA,IAAA,CAAC,WAAD,CACS,MACL,GAAI,EACJ,eAAc,CAAC,CAAC,EACN,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,SAAU,CAAS,EACxC,GAAI,CACP,CAAA,EACA,GACG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,mBAAY,CAAY,CAAA,EAChD,GACA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,gBAAS,CAAiB,CAAA,EAClD,IACH,GAEb,CAAC"}
1
+ {"version":3,"file":"Textarea.cjs","names":[],"sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import { forwardRef, useId } from \"react\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: string;\n wrapperClassName?: string;\n}\n\n/**\n * Multi-line text input. Mirrors the {@link Input} API for label/helper/error.\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { label, helperText, error, wrapperClassName, className, id, required, ...props },\n ref,\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={textareaId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n aria-invalid={!!error}\n required={required}\n className={cn(styles.textarea, className)}\n {...props}\n />\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n"],"mappings":"+HAeA,IAAa,GAAA,EAAW,EAAA,WAAA,CAA+C,SACnE,CAAE,QAAO,aAAY,QAAO,mBAAkB,YAAW,KAAI,WAAU,GAAG,GAC1E,EACF,CACE,IAAM,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAa,GAAM,EAEzB,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,GAAS,EAAA,QAAO,MAAO,CAAgB,EAA1E,SAAA,CACK,IACG,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,QAAS,EAAY,UAAW,EAAA,QAAO,MAA9C,SAAA,CACK,EACA,IAAY,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,SAAU,SAAA,GAAO,CAAA,CACnD,KAEX,EAAA,EAAA,IAAA,CAAC,WAAD,CACS,MACL,GAAI,EACJ,eAAc,CAAC,CAAC,EACN,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,SAAU,CAAS,EACxC,GAAI,CACP,CAAA,EACA,GACG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,UAAY,SAAA,CAAY,CAAA,EAChD,GACA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,OAAS,SAAA,CAAiB,CAAA,EAClD,IACH,GAEb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Textarea.js","names":[],"sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import { forwardRef, useId } from \"react\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: string;\n wrapperClassName?: string;\n}\n\n/**\n * Multi-line text input. Mirrors the {@link Input} API for label/helper/error.\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { label, helperText, error, wrapperClassName, className, id, required, ...props },\n ref,\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={textareaId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n aria-invalid={!!error}\n required={required}\n className={cn(styles.textarea, className)}\n {...props}\n />\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;AAeA,IAAa,IAAW,EAA+C,SACnE,EAAE,UAAO,eAAY,UAAO,qBAAkB,cAAW,OAAI,aAAU,GAAG,KAC1E,GACF;CACE,IAAM,IAAc,EAAM,GACpB,IAAa,KAAM;CAEzB,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,SAAS,KAAS,EAAO,OAAO,CAAgB;YAA1E;GACK,KACG,kBAAC,SAAD;IAAO,SAAS;IAAY,WAAW,EAAO;cAA9C,CACK,GACA,KAAY,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAU;IAAO,CAAA,CACnD;;GAEX,kBAAC,YAAD;IACS;IACL,IAAI;IACJ,gBAAc,CAAC,CAAC;IACN;IACV,WAAW,EAAG,EAAO,UAAU,CAAS;IACxC,GAAI;GACP,CAAA;GACA,IACG,kBAAC,QAAD;IAAM,WAAW,EAAO;cAAY;GAAY,CAAA,IAChD,IACA,kBAAC,QAAD;IAAM,WAAW,EAAO;cAAS;GAAiB,CAAA,IAClD;EACH;;AAEb,CAAC"}
1
+ {"version":3,"file":"Textarea.js","names":[],"sources":["../../../src/components/Textarea/Textarea.tsx"],"sourcesContent":["import { forwardRef, useId } from \"react\";\nimport type { TextareaHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Textarea.module.css\";\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n label?: string;\n helperText?: string;\n error?: string;\n wrapperClassName?: string;\n}\n\n/**\n * Multi-line text input. Mirrors the {@link Input} API for label/helper/error.\n */\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(function Textarea(\n { label, helperText, error, wrapperClassName, className, id, required, ...props },\n ref,\n) {\n const generatedId = useId();\n const textareaId = id ?? generatedId;\n\n return (\n <div className={cn(styles.wrapper, error && styles.error, wrapperClassName)}>\n {label && (\n <label htmlFor={textareaId} className={styles.label}>\n {label}\n {required && <span className={styles.required}>*</span>}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n aria-invalid={!!error}\n required={required}\n className={cn(styles.textarea, className)}\n {...props}\n />\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;AAeA,IAAa,IAAW,EAA+C,SACnE,EAAE,UAAO,eAAY,UAAO,qBAAkB,cAAW,OAAI,aAAU,GAAG,KAC1E,GACF;CACE,IAAM,IAAc,EAAM,GACpB,IAAa,KAAM;CAEzB,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,SAAS,KAAS,EAAO,OAAO,CAAgB;EAA1E,UAAA;GACK,KACG,kBAAC,SAAD;IAAO,SAAS;IAAY,WAAW,EAAO;IAA9C,UAAA,CACK,GACA,KAAY,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAU,UAAA;IAAO,CAAA,CACnD;;GAEX,kBAAC,YAAD;IACS;IACL,IAAI;IACJ,gBAAc,CAAC,CAAC;IACN;IACV,WAAW,EAAG,EAAO,UAAU,CAAS;IACxC,GAAI;GACP,CAAA;GACA,IACG,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAY,UAAA;GAAY,CAAA,IAChD,IACA,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAS,UAAA;GAAiB,CAAA,IAClD;EACH;;AAEb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"TimePicker.cjs","names":[],"sources":["../../../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — minuteStep and\n * use12Hours change both the list of options and how a typed value parses, so the\n * body holds parsing, formatting and the option list together; the remaining props\n * are the shared field contract.\n */\nimport { useId, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./TimePicker.module.css\";\n\nexport interface TimePickerProps {\n /** Selected time as a 24h `\"HH:MM\"` string (e.g. `\"14:30\"`). May be `\"\"` for none. */\n value: string;\n /** Fired with the new 24h `\"HH:MM\"` string whenever a cell is picked. */\n onChange: (value: string) => void;\n /** Granularity of the minute column. Defaults to `5`. */\n minuteStep?: number;\n /** When true, show a 1–12 hour column plus an AM/PM column (still emits 24h). */\n use12Hours?: boolean;\n label?: string;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\n\ntype Period = \"AM\" | \"PM\";\n\ninterface ParsedTime {\n hour24: number | null;\n minute: number | null;\n}\n\nfunction pad2(value: number): string {\n return value.toString().padStart(2, \"0\");\n}\n\n/** Parse a 24h `\"HH:MM\"` string into hour/minute numbers, or nulls when empty/invalid. */\nfunction parseValue(value: string): ParsedTime {\n const match = /^(\\d{1,2}):(\\d{1,2})$/.exec(value.trim());\n if (!match) return { hour24: null, minute: null };\n const hour24 = Number(match[1]);\n const minute = Number(match[2]);\n if (hour24 < 0 || hour24 > 23 || minute < 0 || minute > 59) {\n return { hour24: null, minute: null };\n }\n return { hour24, minute };\n}\n\n/** Convert a 24h hour into its 12h display hour (1–12). */\nfunction to12Hour(hour24: number): number {\n const mod = hour24 % 12;\n return mod === 0 ? 12 : mod;\n}\n\n/** Convert a 12h display hour + period into a 24h hour (0–23). */\nfunction to24Hour(hour12: number, period: Period): number {\n const base = hour12 % 12;\n return period === \"PM\" ? base + 12 : base;\n}\n\n/**\n * TimePicker — inline, dependency-free time picker with Material \"spinner column\" styling.\n *\n * Renders scrollable columns of selectable cells (hours, minutes, and AM/PM when\n * `use12Hours`). Always emits a 24h `\"HH:MM\"` string via `onChange`, regardless of\n * whether the 12h display is enabled.\n */\nexport function TimePicker({\n value,\n onChange,\n minuteStep = 5,\n use12Hours = false,\n label,\n helperText,\n disabled,\n className,\n}: TimePickerProps) {\n const id = useId();\n const { hour24, minute } = useMemo(() => parseValue(value), [value]);\n\n const period: Period = hour24 !== null && hour24 >= 12 ? \"PM\" : \"AM\";\n\n const hourCells = useMemo<number[]>(() => {\n if (use12Hours) {\n return Array.from({ length: 12 }, (_, index) => index + 1);\n }\n return Array.from({ length: 24 }, (_, index) => index);\n }, [use12Hours]);\n\n const minuteCells = useMemo<number[]>(() => {\n const step = minuteStep > 0 ? minuteStep : 1;\n const cells: number[] = [];\n for (let current = 0; current < 60; current += step) {\n cells.push(current);\n }\n return cells;\n }, [minuteStep]);\n\n const selectedHourDisplay = hour24 === null ? null : use12Hours ? to12Hour(hour24) : hour24;\n\n const emit = (nextHour24: number, nextMinute: number): void => {\n onChange(`${pad2(nextHour24)}:${pad2(nextMinute)}`);\n };\n\n const handleHour = (displayHour: number): void => {\n if (disabled) return;\n const nextMinute = minute ?? 0;\n const nextHour24 = use12Hours ? to24Hour(displayHour, period) : displayHour;\n emit(nextHour24, nextMinute);\n };\n\n const handleMinute = (nextMinute: number): void => {\n if (disabled) return;\n const baseHour24 = hour24 ?? (use12Hours ? to24Hour(12, \"AM\") : 0);\n emit(baseHour24, nextMinute);\n };\n\n const handlePeriod = (nextPeriod: Period): void => {\n if (disabled) return;\n const displayHour = selectedHourDisplay ?? 12;\n const nextMinute = minute ?? 0;\n emit(to24Hour(displayHour, nextPeriod), nextMinute);\n };\n\n return (\n <div className={cn(styles.wrapper, disabled && styles.disabled, className)}>\n {label && (\n <span id={`${id}-label`} className={styles.label}>\n {label}\n </span>\n )}\n <div className={styles.columns}>\n <ul role=\"listbox\" aria-label=\"Horas\" className={styles.column}>\n {hourCells.map((cell) => {\n const active = cell === selectedHourDisplay;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handleHour(cell)}\n >\n {use12Hours ? cell : pad2(cell)}\n </button>\n </li>\n );\n })}\n </ul>\n <ul role=\"listbox\" aria-label=\"Minutos\" className={styles.column}>\n {minuteCells.map((cell) => {\n const active = cell === minute;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handleMinute(cell)}\n >\n {pad2(cell)}\n </button>\n </li>\n );\n })}\n </ul>\n {use12Hours && (\n <ul role=\"listbox\" aria-label=\"Período\" className={styles.column}>\n {([\"AM\", \"PM\"] as Period[]).map((cell) => {\n const active = selectedHourDisplay !== null && cell === period;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handlePeriod(cell)}\n >\n {cell}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n {helperText && <span className={styles.helper}>{helperText}</span>}\n </div>\n );\n}\n"],"mappings":"iIAgCA,SAAS,EAAK,EAAuB,CACjC,OAAO,EAAM,SAAS,CAAC,CAAC,SAAS,EAAG,GAAG,CAC3C,CAGA,SAAS,EAAW,EAA2B,CAC3C,IAAM,EAAQ,wBAAwB,KAAK,EAAM,KAAK,CAAC,EACvD,GAAI,CAAC,EAAO,MAAO,CAAE,OAAQ,KAAM,OAAQ,IAAK,EAChD,IAAM,EAAS,OAAO,EAAM,EAAE,EACxB,EAAS,OAAO,EAAM,EAAE,EAI9B,OAHI,EAAS,GAAK,EAAS,IAAM,EAAS,GAAK,EAAS,GAC7C,CAAE,OAAQ,KAAM,OAAQ,IAAK,EAEjC,CAAE,SAAQ,QAAO,CAC5B,CAGA,SAAS,EAAS,EAAwB,CACtC,IAAM,EAAM,EAAS,GACrB,OAAO,IAAQ,EAAI,GAAK,CAC5B,CAGA,SAAS,EAAS,EAAgB,EAAwB,CACtD,IAAM,EAAO,EAAS,GACtB,OAAO,IAAW,KAAO,EAAO,GAAK,CACzC,CASA,SAAgB,EAAW,CACvB,QACA,WACA,aAAa,EACb,aAAa,GACb,QACA,aACA,WACA,aACgB,CAChB,IAAM,GAAA,EAAA,EAAA,MAAA,CAAW,EACX,CAAE,SAAQ,WAAA,EAAA,EAAA,QAAA,KAAyB,EAAW,CAAK,EAAG,CAAC,CAAK,CAAC,EAE7D,EAAiB,IAAW,MAAQ,GAAU,GAAK,KAAO,KAE1D,GAAA,EAAA,EAAA,QAAA,KACE,EACO,MAAM,KAAK,CAAE,OAAQ,EAAG,GAAI,EAAG,IAAU,EAAQ,CAAC,EAEtD,MAAM,KAAK,CAAE,OAAQ,EAAG,GAAI,EAAG,IAAU,CAAK,EACtD,CAAC,CAAU,CAAC,EAET,GAAA,EAAA,EAAA,QAAA,KAAsC,CACxC,IAAM,EAAO,EAAa,EAAI,EAAa,EACrC,EAAkB,CAAC,EACzB,IAAK,IAAI,EAAU,EAAG,EAAU,GAAI,GAAW,EAC3C,EAAM,KAAK,CAAO,EAEtB,OAAO,CACX,EAAG,CAAC,CAAU,CAAC,EAET,EAAsB,IAAW,KAAO,KAAO,EAAa,EAAS,CAAM,EAAI,EAE/E,GAAQ,EAAoB,IAA6B,CAC3D,EAAS,GAAG,EAAK,CAAU,EAAE,GAAG,EAAK,CAAU,GAAG,CACtD,EAEM,EAAc,GAA8B,CAC9C,GAAI,EAAU,OACd,IAAM,EAAa,GAAU,EACvB,EAAa,EAAa,EAAS,EAAa,CAAM,EAAI,EAChE,EAAK,EAAY,CAAU,CAC/B,EAEM,EAAgB,GAA6B,CAC/C,GAAI,EAAU,OACd,IAAM,EAAa,IAAW,EAAa,EAAS,GAAI,IAAI,EAAI,GAChE,EAAK,EAAY,CAAU,CAC/B,EAEM,EAAgB,GAA6B,CAC/C,GAAI,EAAU,OACd,IAAM,EAAc,GAAuB,GACrC,EAAa,GAAU,EAC7B,EAAK,EAAS,EAAa,CAAU,EAAG,CAAU,CACtD,EAEA,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,GAAY,EAAA,QAAO,SAAU,CAAS,WAAzE,CACK,IACG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAG,EAAG,QAAS,UAAW,EAAA,QAAO,eACtC,CACC,CAAA,GAEV,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,iBAAvB,EACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,KAAK,UAAU,aAAW,QAAQ,UAAW,EAAA,QAAO,gBACnD,EAAU,IAAK,GAAS,CACrB,IAAM,EAAS,IAAS,EACxB,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAe,UAAW,EAAA,QAAO,sBAC7B,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,KAAK,SACL,gBAAe,EACL,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,MAAM,EAClD,YAAe,EAAW,CAAI,WAE7B,EAAa,EAAO,EAAK,CAAI,CAC1B,CAAA,CACR,EAXK,CAWL,CAEZ,CAAC,CACD,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,KAAK,UAAU,aAAW,UAAU,UAAW,EAAA,QAAO,gBACrD,EAAY,IAAK,GAAS,CACvB,IAAM,EAAS,IAAS,EACxB,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAe,UAAW,EAAA,QAAO,sBAC7B,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,KAAK,SACL,gBAAe,EACL,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,MAAM,EAClD,YAAe,EAAa,CAAI,WAE/B,EAAK,CAAI,CACN,CAAA,CACR,EAXK,CAWL,CAEZ,CAAC,CACD,CAAA,EACH,IACG,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,KAAK,UAAU,aAAW,UAAU,UAAW,EAAA,QAAO,gBACpD,CAAC,KAAM,IAAI,CAAC,CAAc,IAAK,GAAS,CACtC,IAAM,EAAS,IAAwB,MAAQ,IAAS,EACxD,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAe,UAAW,EAAA,QAAO,sBAC7B,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,KAAK,SACL,gBAAe,EACL,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,MAAM,EAClD,YAAe,EAAa,CAAI,WAE/B,CACG,CAAA,CACR,EAXK,CAWL,CAEZ,CAAC,CACD,CAAA,CAEP,IACJ,IAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,gBAAS,CAAiB,CAAA,CAChE,GAEb"}
1
+ {"version":3,"file":"TimePicker.cjs","names":[],"sources":["../../../src/components/TimePicker/TimePicker.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — minuteStep and\n * use12Hours change both the list of options and how a typed value parses, so the\n * body holds parsing, formatting and the option list together; the remaining props\n * are the shared field contract.\n */\nimport { useId, useMemo } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./TimePicker.module.css\";\n\nexport interface TimePickerProps {\n /** Selected time as a 24h `\"HH:MM\"` string (e.g. `\"14:30\"`). May be `\"\"` for none. */\n value: string;\n /** Fired with the new 24h `\"HH:MM\"` string whenever a cell is picked. */\n onChange: (value: string) => void;\n /** Granularity of the minute column. Defaults to `5`. */\n minuteStep?: number;\n /** When true, show a 1–12 hour column plus an AM/PM column (still emits 24h). */\n use12Hours?: boolean;\n label?: string;\n helperText?: string;\n disabled?: boolean;\n className?: string;\n}\n\ntype Period = \"AM\" | \"PM\";\n\ninterface ParsedTime {\n hour24: number | null;\n minute: number | null;\n}\n\nfunction pad2(value: number): string {\n return value.toString().padStart(2, \"0\");\n}\n\n/** Parse a 24h `\"HH:MM\"` string into hour/minute numbers, or nulls when empty/invalid. */\nfunction parseValue(value: string): ParsedTime {\n const match = /^(\\d{1,2}):(\\d{1,2})$/.exec(value.trim());\n if (!match) return { hour24: null, minute: null };\n const hour24 = Number(match[1]);\n const minute = Number(match[2]);\n if (hour24 < 0 || hour24 > 23 || minute < 0 || minute > 59) {\n return { hour24: null, minute: null };\n }\n return { hour24, minute };\n}\n\n/** Convert a 24h hour into its 12h display hour (1–12). */\nfunction to12Hour(hour24: number): number {\n const mod = hour24 % 12;\n return mod === 0 ? 12 : mod;\n}\n\n/** Convert a 12h display hour + period into a 24h hour (0–23). */\nfunction to24Hour(hour12: number, period: Period): number {\n const base = hour12 % 12;\n return period === \"PM\" ? base + 12 : base;\n}\n\n/**\n * TimePicker — inline, dependency-free time picker with Material \"spinner column\" styling.\n *\n * Renders scrollable columns of selectable cells (hours, minutes, and AM/PM when\n * `use12Hours`). Always emits a 24h `\"HH:MM\"` string via `onChange`, regardless of\n * whether the 12h display is enabled.\n */\nexport function TimePicker({\n value,\n onChange,\n minuteStep = 5,\n use12Hours = false,\n label,\n helperText,\n disabled,\n className,\n}: TimePickerProps) {\n const id = useId();\n const { hour24, minute } = useMemo(() => parseValue(value), [value]);\n\n const period: Period = hour24 !== null && hour24 >= 12 ? \"PM\" : \"AM\";\n\n const hourCells = useMemo<number[]>(() => {\n if (use12Hours) {\n return Array.from({ length: 12 }, (_, index) => index + 1);\n }\n return Array.from({ length: 24 }, (_, index) => index);\n }, [use12Hours]);\n\n const minuteCells = useMemo<number[]>(() => {\n const step = minuteStep > 0 ? minuteStep : 1;\n const cells: number[] = [];\n for (let current = 0; current < 60; current += step) {\n cells.push(current);\n }\n return cells;\n }, [minuteStep]);\n\n const selectedHourDisplay = hour24 === null ? null : use12Hours ? to12Hour(hour24) : hour24;\n\n const emit = (nextHour24: number, nextMinute: number): void => {\n onChange(`${pad2(nextHour24)}:${pad2(nextMinute)}`);\n };\n\n const handleHour = (displayHour: number): void => {\n if (disabled) return;\n const nextMinute = minute ?? 0;\n const nextHour24 = use12Hours ? to24Hour(displayHour, period) : displayHour;\n emit(nextHour24, nextMinute);\n };\n\n const handleMinute = (nextMinute: number): void => {\n if (disabled) return;\n const baseHour24 = hour24 ?? (use12Hours ? to24Hour(12, \"AM\") : 0);\n emit(baseHour24, nextMinute);\n };\n\n const handlePeriod = (nextPeriod: Period): void => {\n if (disabled) return;\n const displayHour = selectedHourDisplay ?? 12;\n const nextMinute = minute ?? 0;\n emit(to24Hour(displayHour, nextPeriod), nextMinute);\n };\n\n return (\n <div className={cn(styles.wrapper, disabled && styles.disabled, className)}>\n {label && (\n <span id={`${id}-label`} className={styles.label}>\n {label}\n </span>\n )}\n <div className={styles.columns}>\n <ul role=\"listbox\" aria-label=\"Horas\" className={styles.column}>\n {hourCells.map((cell) => {\n const active = cell === selectedHourDisplay;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handleHour(cell)}\n >\n {use12Hours ? cell : pad2(cell)}\n </button>\n </li>\n );\n })}\n </ul>\n <ul role=\"listbox\" aria-label=\"Minutos\" className={styles.column}>\n {minuteCells.map((cell) => {\n const active = cell === minute;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handleMinute(cell)}\n >\n {pad2(cell)}\n </button>\n </li>\n );\n })}\n </ul>\n {use12Hours && (\n <ul role=\"listbox\" aria-label=\"Período\" className={styles.column}>\n {([\"AM\", \"PM\"] as Period[]).map((cell) => {\n const active = selectedHourDisplay !== null && cell === period;\n return (\n <li key={cell} className={styles.cellWrapper}>\n <button\n type=\"button\"\n role=\"option\"\n aria-selected={active}\n disabled={disabled}\n className={cn(styles.cell, active && styles.active)}\n onClick={() => handlePeriod(cell)}\n >\n {cell}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n {helperText && <span className={styles.helper}>{helperText}</span>}\n </div>\n );\n}\n"],"mappings":"iIAgCA,SAAS,EAAK,EAAuB,CACjC,OAAO,EAAM,SAAS,CAAC,CAAC,SAAS,EAAG,GAAG,CAC3C,CAGA,SAAS,EAAW,EAA2B,CAC3C,IAAM,EAAQ,wBAAwB,KAAK,EAAM,KAAK,CAAC,EACvD,GAAI,CAAC,EAAO,MAAO,CAAE,OAAQ,KAAM,OAAQ,IAAK,EAChD,IAAM,EAAS,OAAO,EAAM,EAAE,EACxB,EAAS,OAAO,EAAM,EAAE,EAI9B,OAHI,EAAS,GAAK,EAAS,IAAM,EAAS,GAAK,EAAS,GAC7C,CAAE,OAAQ,KAAM,OAAQ,IAAK,EAEjC,CAAE,SAAQ,QAAO,CAC5B,CAGA,SAAS,EAAS,EAAwB,CACtC,IAAM,EAAM,EAAS,GACrB,OAAO,IAAQ,EAAI,GAAK,CAC5B,CAGA,SAAS,EAAS,EAAgB,EAAwB,CACtD,IAAM,EAAO,EAAS,GACtB,OAAO,IAAW,KAAO,EAAO,GAAK,CACzC,CASA,SAAgB,EAAW,CACvB,QACA,WACA,aAAa,EACb,aAAa,GACb,QACA,aACA,WACA,aACgB,CAChB,IAAM,GAAA,EAAK,EAAA,MAAA,CAAM,EACX,CAAE,SAAQ,WAAA,EAAW,EAAA,QAAA,KAAc,EAAW,CAAK,EAAG,CAAC,CAAK,CAAC,EAE7D,EAAiB,IAAW,MAAQ,GAAU,GAAK,KAAO,KAE1D,GAAA,EAAY,EAAA,QAAA,KACV,EACO,MAAM,KAAK,CAAE,OAAQ,EAAG,GAAI,EAAG,IAAU,EAAQ,CAAC,EAEtD,MAAM,KAAK,CAAE,OAAQ,EAAG,GAAI,EAAG,IAAU,CAAK,EACtD,CAAC,CAAU,CAAC,EAET,GAAA,EAAc,EAAA,QAAA,KAAwB,CACxC,IAAM,EAAO,EAAa,EAAI,EAAa,EACrC,EAAkB,CAAC,EACzB,IAAK,IAAI,EAAU,EAAG,EAAU,GAAI,GAAW,EAC3C,EAAM,KAAK,CAAO,EAEtB,OAAO,CACX,EAAG,CAAC,CAAU,CAAC,EAET,EAAsB,IAAW,KAAO,KAAO,EAAa,EAAS,CAAM,EAAI,EAE/E,GAAQ,EAAoB,IAA6B,CAC3D,EAAS,GAAG,EAAK,CAAU,EAAE,GAAG,EAAK,CAAU,GAAG,CACtD,EAEM,EAAc,GAA8B,CAC9C,GAAI,EAAU,OACd,IAAM,EAAa,GAAU,EACvB,EAAa,EAAa,EAAS,EAAa,CAAM,EAAI,EAChE,EAAK,EAAY,CAAU,CAC/B,EAEM,EAAgB,GAA6B,CAC/C,GAAI,EAAU,OACd,IAAM,EAAa,IAAW,EAAa,EAAS,GAAI,IAAI,EAAI,GAChE,EAAK,EAAY,CAAU,CAC/B,EAEM,EAAgB,GAA6B,CAC/C,GAAI,EAAU,OACd,IAAM,EAAc,GAAuB,GACrC,EAAa,GAAU,EAC7B,EAAK,EAAS,EAAa,CAAU,EAAG,CAAU,CACtD,EAEA,OACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,GAAY,EAAA,QAAO,SAAU,CAAS,EAAzE,SAAA,CACK,IACG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAG,EAAG,QAAS,UAAW,EAAA,QAAO,MACtC,SAAA,CACC,CAAA,GAEV,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,QAAvB,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,KAAK,UAAU,aAAW,QAAQ,UAAW,EAAA,QAAO,OACnD,SAAA,EAAU,IAAK,GAAS,CACrB,IAAM,EAAS,IAAS,EACxB,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAe,UAAW,EAAA,QAAO,YAC7B,UAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,KAAK,SACL,gBAAe,EACL,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,MAAM,EAClD,YAAe,EAAW,CAAI,EAE7B,SAAA,EAAa,EAAO,EAAK,CAAI,CAC1B,CAAA,CACR,EAXK,CAWL,CAEZ,CAAC,CACD,CAAA,GACJ,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,KAAK,UAAU,aAAW,UAAU,UAAW,EAAA,QAAO,OACrD,SAAA,EAAY,IAAK,GAAS,CACvB,IAAM,EAAS,IAAS,EACxB,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAe,UAAW,EAAA,QAAO,YAC7B,UAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,KAAK,SACL,gBAAe,EACL,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,MAAM,EAClD,YAAe,EAAa,CAAI,EAE/B,SAAA,EAAK,CAAI,CACN,CAAA,CACR,EAXK,CAWL,CAEZ,CAAC,CACD,CAAA,EACH,IACG,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,KAAK,UAAU,aAAW,UAAU,UAAW,EAAA,QAAO,OACpD,SAAA,CAAC,KAAM,IAAI,CAAC,CAAc,IAAK,GAAS,CACtC,IAAM,EAAS,IAAwB,MAAQ,IAAS,EACxD,OACI,EAAA,EAAA,IAAA,CAAC,KAAD,CAAe,UAAW,EAAA,QAAO,YAC7B,UAAA,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,KAAK,SACL,gBAAe,EACL,WACV,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,MAAM,EAClD,YAAe,EAAa,CAAI,EAE/B,SAAA,CACG,CAAA,CACR,EAXK,CAWL,CAEZ,CAAC,CACD,CAAA,CAEP,IACJ,IAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,OAAS,SAAA,CAAiB,CAAA,CAChE,GAEb"}