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":"Badge.cjs","names":[],"sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type BadgeAppearance = \"soft\" | \"solid\" | \"outline\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type BadgeShape = \"pill\" | \"square\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n /** Visual style: soft (default tinted bg), solid (filled), outline (bordered). */\n appearance?: BadgeAppearance;\n size?: BadgeSize;\n /** Pill (default rounded) or square (slightly rounded). */\n shape?: BadgeShape;\n /** Renders a leading status dot in the badge color. */\n dot?: boolean;\n}\n\n/**\n * Pill / square status badge.\n *\n * - `variant` picks the tone (neutral, primary, success, warning, danger, info).\n * - `appearance` picks the style (soft, solid, outline).\n * - `dot` prepends a status dot in the same tone.\n */\nexport function Badge({\n variant = \"neutral\",\n appearance = \"soft\",\n size = \"md\",\n shape = \"pill\",\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={cn(\n styles.badge,\n styles[variant],\n appearance === \"solid\" && styles.solid,\n appearance === \"outline\" && styles.outline,\n styles[size],\n shape === \"square\" && styles.square,\n className,\n )}\n {...props}\n >\n {dot && <span className={styles.dot} aria-hidden />}\n {children}\n </span>\n );\n}\n"],"mappings":"yGA2BA,SAAgB,EAAM,CAClB,UAAU,UACV,aAAa,OACb,OAAO,KACP,QAAQ,OACR,MAAM,GACN,YACA,WACA,GAAG,GACQ,CACX,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CACI,UAAW,EAAA,GACP,EAAA,QAAO,MACP,EAAA,QAAO,GACP,IAAe,SAAW,EAAA,QAAO,MACjC,IAAe,WAAa,EAAA,QAAO,QACnC,EAAA,QAAO,GACP,IAAU,UAAY,EAAA,QAAO,OAC7B,CACJ,EACA,GAAI,WAVR,CAYK,IAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,IAAK,cAAA,EAAa,CAAA,EACjD,CACC,GAEd"}
1
+ {"version":3,"file":"Badge.cjs","names":[],"sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type BadgeAppearance = \"soft\" | \"solid\" | \"outline\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type BadgeShape = \"pill\" | \"square\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n /** Visual style: soft (default tinted bg), solid (filled), outline (bordered). */\n appearance?: BadgeAppearance;\n size?: BadgeSize;\n /** Pill (default rounded) or square (slightly rounded). */\n shape?: BadgeShape;\n /** Renders a leading status dot in the badge color. */\n dot?: boolean;\n}\n\n/**\n * Pill / square status badge.\n *\n * - `variant` picks the tone (neutral, primary, success, warning, danger, info).\n * - `appearance` picks the style (soft, solid, outline).\n * - `dot` prepends a status dot in the same tone.\n */\nexport function Badge({\n variant = \"neutral\",\n appearance = \"soft\",\n size = \"md\",\n shape = \"pill\",\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={cn(\n styles.badge,\n styles[variant],\n appearance === \"solid\" && styles.solid,\n appearance === \"outline\" && styles.outline,\n styles[size],\n shape === \"square\" && styles.square,\n className,\n )}\n {...props}\n >\n {dot && <span className={styles.dot} aria-hidden />}\n {children}\n </span>\n );\n}\n"],"mappings":"yGA2BA,SAAgB,EAAM,CAClB,UAAU,UACV,aAAa,OACb,OAAO,KACP,QAAQ,OACR,MAAM,GACN,YACA,WACA,GAAG,GACQ,CACX,OACI,EAAA,EAAA,KAAA,CAAC,OAAD,CACI,UAAW,EAAA,GACP,EAAA,QAAO,MACP,EAAA,QAAO,GACP,IAAe,SAAW,EAAA,QAAO,MACjC,IAAe,WAAa,EAAA,QAAO,QACnC,EAAA,QAAO,GACP,IAAU,UAAY,EAAA,QAAO,OAC7B,CACJ,EACA,GAAI,EAVR,SAAA,CAYK,IAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,IAAK,cAAA,EAAa,CAAA,EACjD,CACC,GAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"Badge.js","names":[],"sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type BadgeAppearance = \"soft\" | \"solid\" | \"outline\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type BadgeShape = \"pill\" | \"square\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n /** Visual style: soft (default tinted bg), solid (filled), outline (bordered). */\n appearance?: BadgeAppearance;\n size?: BadgeSize;\n /** Pill (default rounded) or square (slightly rounded). */\n shape?: BadgeShape;\n /** Renders a leading status dot in the badge color. */\n dot?: boolean;\n}\n\n/**\n * Pill / square status badge.\n *\n * - `variant` picks the tone (neutral, primary, success, warning, danger, info).\n * - `appearance` picks the style (soft, solid, outline).\n * - `dot` prepends a status dot in the same tone.\n */\nexport function Badge({\n variant = \"neutral\",\n appearance = \"soft\",\n size = \"md\",\n shape = \"pill\",\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={cn(\n styles.badge,\n styles[variant],\n appearance === \"solid\" && styles.solid,\n appearance === \"outline\" && styles.outline,\n styles[size],\n shape === \"square\" && styles.square,\n className,\n )}\n {...props}\n >\n {dot && <span className={styles.dot} aria-hidden />}\n {children}\n </span>\n );\n}\n"],"mappings":";;;;AA2BA,SAAgB,EAAM,EAClB,aAAU,WACV,gBAAa,QACb,UAAO,MACP,WAAQ,QACR,SAAM,IACN,cACA,aACA,GAAG,KACQ;CACX,OACI,kBAAC,QAAD;EACI,WAAW,EACP,EAAO,OACP,EAAO,IACP,MAAe,WAAW,EAAO,OACjC,MAAe,aAAa,EAAO,SACnC,EAAO,IACP,MAAU,YAAY,EAAO,QAC7B,CACJ;EACA,GAAI;YAVR,CAYK,KAAO,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAK,eAAA;EAAa,CAAA,GACjD,CACC;;AAEd"}
1
+ {"version":3,"file":"Badge.js","names":[],"sources":["../../../src/components/Badge/Badge.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Badge.module.css\";\n\nexport type BadgeVariant = \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"danger\" | \"info\";\nexport type BadgeAppearance = \"soft\" | \"solid\" | \"outline\";\nexport type BadgeSize = \"sm\" | \"md\" | \"lg\";\nexport type BadgeShape = \"pill\" | \"square\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant;\n /** Visual style: soft (default tinted bg), solid (filled), outline (bordered). */\n appearance?: BadgeAppearance;\n size?: BadgeSize;\n /** Pill (default rounded) or square (slightly rounded). */\n shape?: BadgeShape;\n /** Renders a leading status dot in the badge color. */\n dot?: boolean;\n}\n\n/**\n * Pill / square status badge.\n *\n * - `variant` picks the tone (neutral, primary, success, warning, danger, info).\n * - `appearance` picks the style (soft, solid, outline).\n * - `dot` prepends a status dot in the same tone.\n */\nexport function Badge({\n variant = \"neutral\",\n appearance = \"soft\",\n size = \"md\",\n shape = \"pill\",\n dot = false,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <span\n className={cn(\n styles.badge,\n styles[variant],\n appearance === \"solid\" && styles.solid,\n appearance === \"outline\" && styles.outline,\n styles[size],\n shape === \"square\" && styles.square,\n className,\n )}\n {...props}\n >\n {dot && <span className={styles.dot} aria-hidden />}\n {children}\n </span>\n );\n}\n"],"mappings":";;;;AA2BA,SAAgB,EAAM,EAClB,aAAU,WACV,gBAAa,QACb,UAAO,MACP,WAAQ,QACR,SAAM,IACN,cACA,aACA,GAAG,KACQ;CACX,OACI,kBAAC,QAAD;EACI,WAAW,EACP,EAAO,OACP,EAAO,IACP,MAAe,WAAW,EAAO,OACjC,MAAe,aAAa,EAAO,SACnC,EAAO,IACP,MAAU,YAAY,EAAO,QAC7B,CACJ;EACA,GAAI;EAVR,UAAA,CAYK,KAAO,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAK,eAAA;EAAa,CAAA,GACjD,CACC;;AAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"Banner.cjs","names":[],"sources":["../../../src/components/Banner/Banner.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Banner.module.css\";\n\nexport type BannerVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BannerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Visual variant. Default `\"info\"`. */\n variant?: BannerVariant;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional title displayed before description. */\n title?: ReactNode;\n /** Optional action button rendered on the right side. */\n action?: ReactNode;\n /** Show a dismiss button on the right. */\n dismissible?: boolean;\n /** Callback fired when the dismiss button is clicked. */\n onDismiss?: () => void;\n children?: ReactNode;\n}\n\n/**\n * Top-of-page persistent notice. Use for environment indicators\n * (\"Você está em sandbox\"), maintenance windows, account warnings.\n * Different from `Alert` (inline near a field) and `Toast` (transient).\n *\n * @example\n * <Banner variant=\"warning\" dismissible onDismiss={() => setOpen(false)}>\n * Sua assinatura expira em 3 dias.\n * </Banner>\n */\nexport function Banner({\n variant = \"info\",\n icon,\n title,\n action,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...props\n}: BannerProps) {\n const [open, setOpen] = useState(true);\n if (!open) return null;\n return (\n <div className={cn(styles.banner, styles[variant], className)} role=\"status\" {...props}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.body}>\n {title && <p className={styles.title}>{title}</p>}\n {children && <p className={styles.description}>{children}</p>}\n </div>\n {action && <div className={styles.action}>{action}</div>}\n {dismissible && (\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar\"\n onClick={() => {\n setOpen(false);\n onDismiss?.();\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n"],"mappings":"6HAiCA,SAAgB,EAAO,CACnB,UAAU,OACV,OACA,QACA,SACA,cAAc,GACd,YACA,YACA,WACA,GAAG,GACS,CACZ,GAAM,CAAC,EAAM,IAAA,EAAA,EAAA,SAAA,CAAoB,EAAI,EAErC,OADK,GAED,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,OAAQ,EAAA,QAAO,GAAU,CAAS,EAAG,KAAK,SAAS,GAAI,WAAjF,CACK,IAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,cAAO,CAAW,CAAA,GACnD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,cAAvB,CACK,IAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,eAAQ,CAAS,CAAA,EAC/C,IAAY,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,YAAc,UAAY,CAAA,CAC3D,IACJ,IAAU,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,gBAAS,CAAY,CAAA,EACtD,IACG,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,MAClB,aAAW,SACX,YAAe,CACX,EAAQ,EAAK,EACb,IAAY,CAChB,WACH,GAEO,CAAA,CAEX,IAtBS,IAwBtB"}
1
+ {"version":3,"file":"Banner.cjs","names":[],"sources":["../../../src/components/Banner/Banner.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Banner.module.css\";\n\nexport type BannerVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BannerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Visual variant. Default `\"info\"`. */\n variant?: BannerVariant;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional title displayed before description. */\n title?: ReactNode;\n /** Optional action button rendered on the right side. */\n action?: ReactNode;\n /** Show a dismiss button on the right. */\n dismissible?: boolean;\n /** Callback fired when the dismiss button is clicked. */\n onDismiss?: () => void;\n children?: ReactNode;\n}\n\n/**\n * Top-of-page persistent notice. Use for environment indicators\n * (\"Você está em sandbox\"), maintenance windows, account warnings.\n * Different from `Alert` (inline near a field) and `Toast` (transient).\n *\n * @example\n * <Banner variant=\"warning\" dismissible onDismiss={() => setOpen(false)}>\n * Sua assinatura expira em 3 dias.\n * </Banner>\n */\nexport function Banner({\n variant = \"info\",\n icon,\n title,\n action,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...props\n}: BannerProps) {\n const [open, setOpen] = useState(true);\n if (!open) return null;\n return (\n <div className={cn(styles.banner, styles[variant], className)} role=\"status\" {...props}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.body}>\n {title && <p className={styles.title}>{title}</p>}\n {children && <p className={styles.description}>{children}</p>}\n </div>\n {action && <div className={styles.action}>{action}</div>}\n {dismissible && (\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar\"\n onClick={() => {\n setOpen(false);\n onDismiss?.();\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n"],"mappings":"6HAiCA,SAAgB,EAAO,CACnB,UAAU,OACV,OACA,QACA,SACA,cAAc,GACd,YACA,YACA,WACA,GAAG,GACS,CACZ,GAAM,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAAS,EAAI,EAErC,OADK,GAED,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,OAAQ,EAAA,QAAO,GAAU,CAAS,EAAG,KAAK,SAAS,GAAI,EAAjF,SAAA,CACK,IAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,KAAO,SAAA,CAAW,CAAA,GACnD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAvB,SAAA,CACK,IAAS,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAS,CAAA,EAC/C,IAAY,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAA,QAAO,YAAc,UAAY,CAAA,CAC3D,IACJ,IAAU,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,OAAS,SAAA,CAAY,CAAA,EACtD,IACG,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,MAClB,aAAW,SACX,YAAe,CACX,EAAQ,EAAK,EACb,IAAY,CAChB,EACH,SAAA,GAEO,CAAA,CAEX,IAtBS,IAwBtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"Banner.js","names":[],"sources":["../../../src/components/Banner/Banner.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Banner.module.css\";\n\nexport type BannerVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BannerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Visual variant. Default `\"info\"`. */\n variant?: BannerVariant;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional title displayed before description. */\n title?: ReactNode;\n /** Optional action button rendered on the right side. */\n action?: ReactNode;\n /** Show a dismiss button on the right. */\n dismissible?: boolean;\n /** Callback fired when the dismiss button is clicked. */\n onDismiss?: () => void;\n children?: ReactNode;\n}\n\n/**\n * Top-of-page persistent notice. Use for environment indicators\n * (\"Você está em sandbox\"), maintenance windows, account warnings.\n * Different from `Alert` (inline near a field) and `Toast` (transient).\n *\n * @example\n * <Banner variant=\"warning\" dismissible onDismiss={() => setOpen(false)}>\n * Sua assinatura expira em 3 dias.\n * </Banner>\n */\nexport function Banner({\n variant = \"info\",\n icon,\n title,\n action,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...props\n}: BannerProps) {\n const [open, setOpen] = useState(true);\n if (!open) return null;\n return (\n <div className={cn(styles.banner, styles[variant], className)} role=\"status\" {...props}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.body}>\n {title && <p className={styles.title}>{title}</p>}\n {children && <p className={styles.description}>{children}</p>}\n </div>\n {action && <div className={styles.action}>{action}</div>}\n {dismissible && (\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar\"\n onClick={() => {\n setOpen(false);\n onDismiss?.();\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;AAiCA,SAAgB,EAAO,EACnB,aAAU,QACV,SACA,UACA,WACA,iBAAc,IACd,cACA,cACA,aACA,GAAG,KACS;CACZ,IAAM,CAAC,GAAM,KAAW,EAAS,EAAI;CAErC,OADK,IAED,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,QAAQ,EAAO,IAAU,CAAS;EAAG,MAAK;EAAS,GAAI;YAAjF;GACK,KAAQ,kBAAC,QAAD;IAAM,WAAW,EAAO;cAAO;GAAW,CAAA;GACnD,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAvB,CACK,KAAS,kBAAC,KAAD;KAAG,WAAW,EAAO;eAAQ;IAAS,CAAA,GAC/C,KAAY,kBAAC,KAAD;KAAG,WAAW,EAAO;KAAc;IAAY,CAAA,CAC3D;;GACJ,KAAU,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAS;GAAY,CAAA;GACtD,KACG,kBAAC,UAAD;IACI,MAAK;IACL,WAAW,EAAO;IAClB,cAAW;IACX,eAAe;KAEX,AADA,EAAQ,EAAK,GACb,IAAY;IAChB;cACH;GAEO,CAAA;EAEX;MAtBS;AAwBtB"}
1
+ {"version":3,"file":"Banner.js","names":[],"sources":["../../../src/components/Banner/Banner.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Banner.module.css\";\n\nexport type BannerVariant = \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface BannerProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Visual variant. Default `\"info\"`. */\n variant?: BannerVariant;\n /** Optional leading icon. */\n icon?: ReactNode;\n /** Optional title displayed before description. */\n title?: ReactNode;\n /** Optional action button rendered on the right side. */\n action?: ReactNode;\n /** Show a dismiss button on the right. */\n dismissible?: boolean;\n /** Callback fired when the dismiss button is clicked. */\n onDismiss?: () => void;\n children?: ReactNode;\n}\n\n/**\n * Top-of-page persistent notice. Use for environment indicators\n * (\"Você está em sandbox\"), maintenance windows, account warnings.\n * Different from `Alert` (inline near a field) and `Toast` (transient).\n *\n * @example\n * <Banner variant=\"warning\" dismissible onDismiss={() => setOpen(false)}>\n * Sua assinatura expira em 3 dias.\n * </Banner>\n */\nexport function Banner({\n variant = \"info\",\n icon,\n title,\n action,\n dismissible = false,\n onDismiss,\n className,\n children,\n ...props\n}: BannerProps) {\n const [open, setOpen] = useState(true);\n if (!open) return null;\n return (\n <div className={cn(styles.banner, styles[variant], className)} role=\"status\" {...props}>\n {icon && <span className={styles.icon}>{icon}</span>}\n <div className={styles.body}>\n {title && <p className={styles.title}>{title}</p>}\n {children && <p className={styles.description}>{children}</p>}\n </div>\n {action && <div className={styles.action}>{action}</div>}\n {dismissible && (\n <button\n type=\"button\"\n className={styles.close}\n aria-label=\"Fechar\"\n onClick={() => {\n setOpen(false);\n onDismiss?.();\n }}\n >\n ×\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;AAiCA,SAAgB,EAAO,EACnB,aAAU,QACV,SACA,UACA,WACA,iBAAc,IACd,cACA,cACA,aACA,GAAG,KACS;CACZ,IAAM,CAAC,GAAM,KAAW,EAAS,EAAI;CAErC,OADK,IAED,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,QAAQ,EAAO,IAAU,CAAS;EAAG,MAAK;EAAS,GAAI;EAAjF,UAAA;GACK,KAAQ,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAO,UAAA;GAAW,CAAA;GACnD,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAvB,UAAA,CACK,KAAS,kBAAC,KAAD;KAAG,WAAW,EAAO;KAAQ,UAAA;IAAS,CAAA,GAC/C,KAAY,kBAAC,KAAD;KAAG,WAAW,EAAO;KAAc;IAAY,CAAA,CAC3D;;GACJ,KAAU,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAS,UAAA;GAAY,CAAA;GACtD,KACG,kBAAC,UAAD;IACI,MAAK;IACL,WAAW,EAAO;IAClB,cAAW;IACX,eAAe;KAEX,AADA,EAAQ,EAAK,GACb,IAAY;IAChB;IACH,UAAA;GAEO,CAAA;EAEX;MAtBS;AAwBtB"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarcodeScanner.cjs","names":[],"sources":["../../../src/components/BarcodeScanner/BarcodeScanner.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — the scan loop is tuned\n * by the caller because the right values depend on the symbology and the device:\n * formats, intervalMs, repeatDelayMs, detector, paused, torch, aspectRatio. The rest\n * are the surfaces to fill when the API is missing (unsupported, footer, locale) and\n * the two outputs (onScan, onError).\n */\nimport { Flashlight, FlashlightOff, ScanLine } from \"lucide-react\";\nimport { type HTMLAttributes, type ReactNode } from \"react\";\n\nimport { useBarcodeScanner } from \"@/capture/use-barcode-scanner\";\nimport type { BarcodeDetectorLike, BarcodeFormat, BarcodeScanResult } from \"@/capture/barcode\";\nimport { cn } from \"@/utils/cn\";\n\nimport styles from \"./BarcodeScanner.module.css\";\n\n/** DOM attributes this component redefines. */\ntype OverriddenDomProps = \"children\" | \"onError\";\n\nexport interface BarcodeScannerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n OverriddenDomProps\n> {\n /** Called for every accepted read — repeats of the same value are suppressed. */\n onScan: (result: BarcodeScanResult) => void;\n /** Symbologies to look for. Defaults to QR + EAN-13 + Code 128. */\n formats?: readonly BarcodeFormat[];\n /** Stop looking without releasing the camera — set it while a confirmation is open. */\n paused?: boolean;\n /** A decoder to use instead of the native one, for Safari and Firefox. */\n detector?: BarcodeDetectorLike;\n /** How often a frame is examined, in ms. Default 200. */\n intervalMs?: number;\n /** Ignore the same value again for this long, in ms. Default 2500. */\n repeatDelayMs?: number;\n /** Offer the torch toggle when the camera has a lamp. Default `true`. */\n torch?: boolean;\n /** Viewport aspect ratio, `width / height`. Default `4 / 3`. */\n aspectRatio?: number;\n /** Locale for the labels. Default `\"pt-BR\"`. */\n locale?: \"pt-BR\" | \"en\";\n /** Under the viewport — an instruction, the code just read, a manual-entry link. */\n footer?: ReactNode;\n /**\n * Rendered instead of the camera when there is no decoder.\n *\n * Worth filling in: on iOS and Firefox this is the **only** thing the user sees, so\n * the fallback is usually a plain text field for typing the code.\n */\n unsupported?: ReactNode;\n /** A frame the engine refused to decode. Routine and usually transient. */\n onError?: (error: unknown) => void;\n}\n\nconst STRINGS = {\n \"pt-BR\": {\n viewport: \"Visor da câmera\",\n scanning: \"Procurando código…\",\n paused: \"Leitura pausada\",\n opening: \"Abrindo a câmera…\",\n hint: \"Aponte a câmera para o código.\",\n found: (value: string) => `Código lido: ${value}`,\n torchOn: \"Desligar lanterna\",\n torchOff: \"Ligar lanterna\",\n unsupported: \"Este navegador não decodifica códigos de barras.\",\n retry: \"Tentar de novo\",\n },\n en: {\n viewport: \"Camera viewport\",\n scanning: \"Looking for a code…\",\n paused: \"Scanning paused\",\n opening: \"Opening the camera…\",\n hint: \"Point the camera at the code.\",\n found: (value: string) => `Code read: ${value}`,\n torchOn: \"Turn torch off\",\n torchOff: \"Turn torch on\",\n unsupported: \"This browser cannot decode barcodes.\",\n retry: \"Try again\",\n },\n} as const;\n\n/**\n * Point the camera at a barcode and get its value.\n *\n * The counterpart to {@link QRCode}, which only encodes. Under it are\n * `useBarcodeScanner` (the detect loop and repeat suppression), `useCameraStream` (the\n * stream and its classified errors) and `useTorch`.\n *\n * **Mounting this opens the camera**, so mount it when the user asks to scan rather\n * than on a page that happens to contain a scanner: a permission prompt nobody\n * provoked is the surest way to earn a permanent block, and after that `getUserMedia`\n * rejects without ever prompting again. The usual shape is a button that reveals it.\n *\n * The `unsupported` slot is not a nicety. `BarcodeDetector` is Chromium-only — absent\n * on Firefox, on every browser on iOS, and on Chromium for Windows and Linux — so on a\n * large share of real devices the fallback *is* the feature. Give it a text field, or\n * inject a polyfill through `detector`.\n *\n * The preview itself is `aria-hidden`: a live camera frame has nothing to announce and\n * no audio to caption, so what a screen reader gets is the `role=\"status\"` line, which\n * says whether scanning is running and reads out each accepted code.\n *\n * @example\n * <BarcodeScanner\n * formats={[\"ean_13\"]}\n * onScan={({ rawValue }) => addToCart(rawValue)}\n * footer={<small>Aponte para o código de barras da embalagem.</small>}\n * unsupported={<ManualCodeInput onSubmit={addToCart} />}\n * />\n */\nexport function BarcodeScanner({\n onScan,\n formats,\n paused = false,\n detector,\n intervalMs,\n repeatDelayMs,\n torch = true,\n aspectRatio = 4 / 3,\n locale = \"pt-BR\",\n footer,\n unsupported,\n onError,\n className,\n ...rest\n}: BarcodeScannerProps) {\n const strings = STRINGS[locale];\n const {\n videoRef,\n status,\n error,\n supported,\n scanning,\n result,\n torch: lamp,\n retry,\n } = useBarcodeScanner({\n formats,\n paused,\n detector,\n intervalMs,\n repeatDelayMs,\n onScan,\n onError,\n });\n\n if (!supported) {\n return (\n <div className={cn(styles.scanner, className)} {...rest}>\n <p className={styles.notice}>{strings.unsupported}</p>\n {unsupported}\n </div>\n );\n }\n\n const message = result\n ? strings.found(result.rawValue)\n : paused\n ? strings.paused\n : scanning\n ? strings.scanning\n : strings.opening;\n\n return (\n <div className={cn(styles.scanner, className)} {...rest}>\n <div\n className={styles.viewport}\n style={{ aspectRatio: String(aspectRatio) }}\n aria-label={strings.viewport}\n role=\"group\"\n >\n <video\n ref={videoRef}\n className={styles.video}\n muted\n playsInline\n aria-hidden=\"true\"\n />\n\n {status === \"ready\" && (\n <div className={styles.frame} aria-hidden=\"true\">\n <span className={cn(styles.laser, scanning && styles.laserActive)} />\n </div>\n )}\n\n {torch && lamp.supported && (\n <button\n type=\"button\"\n className={styles.torch}\n onClick={() => void lamp.toggle()}\n aria-pressed={lamp.on}\n aria-label={lamp.on ? strings.torchOn : strings.torchOff}\n >\n {lamp.on ? (\n <FlashlightOff size={18} aria-hidden />\n ) : (\n <Flashlight size={18} aria-hidden />\n )}\n </button>\n )}\n\n {error && (\n <div className={styles.overlay} role=\"alert\">\n <p className={styles.overlayText}>{error.message}</p>\n <button type=\"button\" className={styles.retry} onClick={retry}>\n {strings.retry}\n </button>\n </div>\n )}\n </div>\n\n {!error && (\n <p className={styles.status} role=\"status\">\n <ScanLine size={14} aria-hidden className={styles.statusIcon} />\n {message}\n </p>\n )}\n\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BarcodeScanner.cjs","names":[],"sources":["../../../src/components/BarcodeScanner/BarcodeScanner.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — the scan loop is tuned\n * by the caller because the right values depend on the symbology and the device:\n * formats, intervalMs, repeatDelayMs, detector, paused, torch, aspectRatio. The rest\n * are the surfaces to fill when the API is missing (unsupported, footer, locale) and\n * the two outputs (onScan, onError).\n */\nimport { Flashlight, FlashlightOff, ScanLine } from \"lucide-react\";\nimport { type HTMLAttributes, type ReactNode } from \"react\";\n\nimport { useBarcodeScanner } from \"@/capture/use-barcode-scanner\";\nimport type { BarcodeDetectorLike, BarcodeFormat, BarcodeScanResult } from \"@/capture/barcode\";\nimport { cn } from \"@/utils/cn\";\n\nimport styles from \"./BarcodeScanner.module.css\";\n\n/** DOM attributes this component redefines. */\ntype OverriddenDomProps = \"children\" | \"onError\";\n\nexport interface BarcodeScannerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n OverriddenDomProps\n> {\n /** Called for every accepted read — repeats of the same value are suppressed. */\n onScan: (result: BarcodeScanResult) => void;\n /** Symbologies to look for. Defaults to QR + EAN-13 + Code 128. */\n formats?: readonly BarcodeFormat[];\n /** Stop looking without releasing the camera — set it while a confirmation is open. */\n paused?: boolean;\n /** A decoder to use instead of the native one, for Safari and Firefox. */\n detector?: BarcodeDetectorLike;\n /** How often a frame is examined, in ms. Default 200. */\n intervalMs?: number;\n /** Ignore the same value again for this long, in ms. Default 2500. */\n repeatDelayMs?: number;\n /** Offer the torch toggle when the camera has a lamp. Default `true`. */\n torch?: boolean;\n /** Viewport aspect ratio, `width / height`. Default `4 / 3`. */\n aspectRatio?: number;\n /** Locale for the labels. Default `\"pt-BR\"`. */\n locale?: \"pt-BR\" | \"en\";\n /** Under the viewport — an instruction, the code just read, a manual-entry link. */\n footer?: ReactNode;\n /**\n * Rendered instead of the camera when there is no decoder.\n *\n * Worth filling in: on iOS and Firefox this is the **only** thing the user sees, so\n * the fallback is usually a plain text field for typing the code.\n */\n unsupported?: ReactNode;\n /** A frame the engine refused to decode. Routine and usually transient. */\n onError?: (error: unknown) => void;\n}\n\nconst STRINGS = {\n \"pt-BR\": {\n viewport: \"Visor da câmera\",\n scanning: \"Procurando código…\",\n paused: \"Leitura pausada\",\n opening: \"Abrindo a câmera…\",\n hint: \"Aponte a câmera para o código.\",\n found: (value: string) => `Código lido: ${value}`,\n torchOn: \"Desligar lanterna\",\n torchOff: \"Ligar lanterna\",\n unsupported: \"Este navegador não decodifica códigos de barras.\",\n retry: \"Tentar de novo\",\n },\n en: {\n viewport: \"Camera viewport\",\n scanning: \"Looking for a code…\",\n paused: \"Scanning paused\",\n opening: \"Opening the camera…\",\n hint: \"Point the camera at the code.\",\n found: (value: string) => `Code read: ${value}`,\n torchOn: \"Turn torch off\",\n torchOff: \"Turn torch on\",\n unsupported: \"This browser cannot decode barcodes.\",\n retry: \"Try again\",\n },\n} as const;\n\n/**\n * Point the camera at a barcode and get its value.\n *\n * The counterpart to {@link QRCode}, which only encodes. Under it are\n * `useBarcodeScanner` (the detect loop and repeat suppression), `useCameraStream` (the\n * stream and its classified errors) and `useTorch`.\n *\n * **Mounting this opens the camera**, so mount it when the user asks to scan rather\n * than on a page that happens to contain a scanner: a permission prompt nobody\n * provoked is the surest way to earn a permanent block, and after that `getUserMedia`\n * rejects without ever prompting again. The usual shape is a button that reveals it.\n *\n * The `unsupported` slot is not a nicety. `BarcodeDetector` is Chromium-only — absent\n * on Firefox, on every browser on iOS, and on Chromium for Windows and Linux — so on a\n * large share of real devices the fallback *is* the feature. Give it a text field, or\n * inject a polyfill through `detector`.\n *\n * The preview itself is `aria-hidden`: a live camera frame has nothing to announce and\n * no audio to caption, so what a screen reader gets is the `role=\"status\"` line, which\n * says whether scanning is running and reads out each accepted code.\n *\n * @example\n * <BarcodeScanner\n * formats={[\"ean_13\"]}\n * onScan={({ rawValue }) => addToCart(rawValue)}\n * footer={<small>Aponte para o código de barras da embalagem.</small>}\n * unsupported={<ManualCodeInput onSubmit={addToCart} />}\n * />\n */\nexport function BarcodeScanner({\n onScan,\n formats,\n paused = false,\n detector,\n intervalMs,\n repeatDelayMs,\n torch = true,\n aspectRatio = 4 / 3,\n locale = \"pt-BR\",\n footer,\n unsupported,\n onError,\n className,\n ...rest\n}: BarcodeScannerProps) {\n const strings = STRINGS[locale];\n const {\n videoRef,\n status,\n error,\n supported,\n scanning,\n result,\n torch: lamp,\n retry,\n } = useBarcodeScanner({\n formats,\n paused,\n detector,\n intervalMs,\n repeatDelayMs,\n onScan,\n onError,\n });\n\n if (!supported) {\n return (\n <div className={cn(styles.scanner, className)} {...rest}>\n <p className={styles.notice}>{strings.unsupported}</p>\n {unsupported}\n </div>\n );\n }\n\n const message = result\n ? strings.found(result.rawValue)\n : paused\n ? strings.paused\n : scanning\n ? strings.scanning\n : strings.opening;\n\n return (\n <div className={cn(styles.scanner, className)} {...rest}>\n <div\n className={styles.viewport}\n style={{ aspectRatio: String(aspectRatio) }}\n aria-label={strings.viewport}\n role=\"group\"\n >\n <video\n ref={videoRef}\n className={styles.video}\n muted\n playsInline\n aria-hidden=\"true\"\n />\n\n {status === \"ready\" && (\n <div className={styles.frame} aria-hidden=\"true\">\n <span className={cn(styles.laser, scanning && styles.laserActive)} />\n </div>\n )}\n\n {torch && lamp.supported && (\n <button\n type=\"button\"\n className={styles.torch}\n onClick={() => void lamp.toggle()}\n aria-pressed={lamp.on}\n aria-label={lamp.on ? strings.torchOn : strings.torchOff}\n >\n {lamp.on ? (\n <FlashlightOff size={18} aria-hidden />\n ) : (\n <Flashlight size={18} aria-hidden />\n )}\n </button>\n )}\n\n {error && (\n <div className={styles.overlay} role=\"alert\">\n <p className={styles.overlayText}>{error.message}</p>\n <button type=\"button\" className={styles.retry} onClick={retry}>\n {strings.retry}\n </button>\n </div>\n )}\n </div>\n\n {!error && (\n <p className={styles.status} role=\"status\">\n <ScanLine size={14} aria-hidden className={styles.statusIcon} />\n {message}\n </p>\n )}\n\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarcodeScanner.js","names":[],"sources":["../../../src/components/BarcodeScanner/BarcodeScanner.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — the scan loop is tuned\n * by the caller because the right values depend on the symbology and the device:\n * formats, intervalMs, repeatDelayMs, detector, paused, torch, aspectRatio. The rest\n * are the surfaces to fill when the API is missing (unsupported, footer, locale) and\n * the two outputs (onScan, onError).\n */\nimport { Flashlight, FlashlightOff, ScanLine } from \"lucide-react\";\nimport { type HTMLAttributes, type ReactNode } from \"react\";\n\nimport { useBarcodeScanner } from \"@/capture/use-barcode-scanner\";\nimport type { BarcodeDetectorLike, BarcodeFormat, BarcodeScanResult } from \"@/capture/barcode\";\nimport { cn } from \"@/utils/cn\";\n\nimport styles from \"./BarcodeScanner.module.css\";\n\n/** DOM attributes this component redefines. */\ntype OverriddenDomProps = \"children\" | \"onError\";\n\nexport interface BarcodeScannerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n OverriddenDomProps\n> {\n /** Called for every accepted read — repeats of the same value are suppressed. */\n onScan: (result: BarcodeScanResult) => void;\n /** Symbologies to look for. Defaults to QR + EAN-13 + Code 128. */\n formats?: readonly BarcodeFormat[];\n /** Stop looking without releasing the camera — set it while a confirmation is open. */\n paused?: boolean;\n /** A decoder to use instead of the native one, for Safari and Firefox. */\n detector?: BarcodeDetectorLike;\n /** How often a frame is examined, in ms. Default 200. */\n intervalMs?: number;\n /** Ignore the same value again for this long, in ms. Default 2500. */\n repeatDelayMs?: number;\n /** Offer the torch toggle when the camera has a lamp. Default `true`. */\n torch?: boolean;\n /** Viewport aspect ratio, `width / height`. Default `4 / 3`. */\n aspectRatio?: number;\n /** Locale for the labels. Default `\"pt-BR\"`. */\n locale?: \"pt-BR\" | \"en\";\n /** Under the viewport — an instruction, the code just read, a manual-entry link. */\n footer?: ReactNode;\n /**\n * Rendered instead of the camera when there is no decoder.\n *\n * Worth filling in: on iOS and Firefox this is the **only** thing the user sees, so\n * the fallback is usually a plain text field for typing the code.\n */\n unsupported?: ReactNode;\n /** A frame the engine refused to decode. Routine and usually transient. */\n onError?: (error: unknown) => void;\n}\n\nconst STRINGS = {\n \"pt-BR\": {\n viewport: \"Visor da câmera\",\n scanning: \"Procurando código…\",\n paused: \"Leitura pausada\",\n opening: \"Abrindo a câmera…\",\n hint: \"Aponte a câmera para o código.\",\n found: (value: string) => `Código lido: ${value}`,\n torchOn: \"Desligar lanterna\",\n torchOff: \"Ligar lanterna\",\n unsupported: \"Este navegador não decodifica códigos de barras.\",\n retry: \"Tentar de novo\",\n },\n en: {\n viewport: \"Camera viewport\",\n scanning: \"Looking for a code…\",\n paused: \"Scanning paused\",\n opening: \"Opening the camera…\",\n hint: \"Point the camera at the code.\",\n found: (value: string) => `Code read: ${value}`,\n torchOn: \"Turn torch off\",\n torchOff: \"Turn torch on\",\n unsupported: \"This browser cannot decode barcodes.\",\n retry: \"Try again\",\n },\n} as const;\n\n/**\n * Point the camera at a barcode and get its value.\n *\n * The counterpart to {@link QRCode}, which only encodes. Under it are\n * `useBarcodeScanner` (the detect loop and repeat suppression), `useCameraStream` (the\n * stream and its classified errors) and `useTorch`.\n *\n * **Mounting this opens the camera**, so mount it when the user asks to scan rather\n * than on a page that happens to contain a scanner: a permission prompt nobody\n * provoked is the surest way to earn a permanent block, and after that `getUserMedia`\n * rejects without ever prompting again. The usual shape is a button that reveals it.\n *\n * The `unsupported` slot is not a nicety. `BarcodeDetector` is Chromium-only — absent\n * on Firefox, on every browser on iOS, and on Chromium for Windows and Linux — so on a\n * large share of real devices the fallback *is* the feature. Give it a text field, or\n * inject a polyfill through `detector`.\n *\n * The preview itself is `aria-hidden`: a live camera frame has nothing to announce and\n * no audio to caption, so what a screen reader gets is the `role=\"status\"` line, which\n * says whether scanning is running and reads out each accepted code.\n *\n * @example\n * <BarcodeScanner\n * formats={[\"ean_13\"]}\n * onScan={({ rawValue }) => addToCart(rawValue)}\n * footer={<small>Aponte para o código de barras da embalagem.</small>}\n * unsupported={<ManualCodeInput onSubmit={addToCart} />}\n * />\n */\nexport function BarcodeScanner({\n onScan,\n formats,\n paused = false,\n detector,\n intervalMs,\n repeatDelayMs,\n torch = true,\n aspectRatio = 4 / 3,\n locale = \"pt-BR\",\n footer,\n unsupported,\n onError,\n className,\n ...rest\n}: BarcodeScannerProps) {\n const strings = STRINGS[locale];\n const {\n videoRef,\n status,\n error,\n supported,\n scanning,\n result,\n torch: lamp,\n retry,\n } = useBarcodeScanner({\n formats,\n paused,\n detector,\n intervalMs,\n repeatDelayMs,\n onScan,\n onError,\n });\n\n if (!supported) {\n return (\n <div className={cn(styles.scanner, className)} {...rest}>\n <p className={styles.notice}>{strings.unsupported}</p>\n {unsupported}\n </div>\n );\n }\n\n const message = result\n ? strings.found(result.rawValue)\n : paused\n ? strings.paused\n : scanning\n ? strings.scanning\n : strings.opening;\n\n return (\n <div className={cn(styles.scanner, className)} {...rest}>\n <div\n className={styles.viewport}\n style={{ aspectRatio: String(aspectRatio) }}\n aria-label={strings.viewport}\n role=\"group\"\n >\n <video\n ref={videoRef}\n className={styles.video}\n muted\n playsInline\n aria-hidden=\"true\"\n />\n\n {status === \"ready\" && (\n <div className={styles.frame} aria-hidden=\"true\">\n <span className={cn(styles.laser, scanning && styles.laserActive)} />\n </div>\n )}\n\n {torch && lamp.supported && (\n <button\n type=\"button\"\n className={styles.torch}\n onClick={() => void lamp.toggle()}\n aria-pressed={lamp.on}\n aria-label={lamp.on ? strings.torchOn : strings.torchOff}\n >\n {lamp.on ? (\n <FlashlightOff size={18} aria-hidden />\n ) : (\n <Flashlight size={18} aria-hidden />\n )}\n </button>\n )}\n\n {error && (\n <div className={styles.overlay} role=\"alert\">\n <p className={styles.overlayText}>{error.message}</p>\n <button type=\"button\" className={styles.retry} onClick={retry}>\n {strings.retry}\n </button>\n </div>\n )}\n </div>\n\n {!error && (\n <p className={styles.status} role=\"status\">\n <ScanLine size={14} aria-hidden className={styles.statusIcon} />\n {message}\n </p>\n )}\n\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAsDA,IAAM,IAAU;CACZ,SAAS;EACL,UAAU;EACV,UAAU;EACV,QAAQ;EACR,SAAS;EACT,MAAM;EACN,QAAQ,MAAkB,gBAAgB;EAC1C,SAAS;EACT,UAAU;EACV,aAAa;EACb,OAAO;CACX;CACA,IAAI;EACA,UAAU;EACV,UAAU;EACV,QAAQ;EACR,SAAS;EACT,MAAM;EACN,QAAQ,MAAkB,cAAc;EACxC,SAAS;EACT,UAAU;EACV,aAAa;EACb,OAAO;CACX;AACJ;AA+BA,SAAgB,EAAe,EAC3B,WACA,YACA,YAAS,IACT,aACA,eACA,kBACA,WAAQ,IACR,iBAAc,IAAI,GAClB,YAAS,SACT,WACA,gBACA,YACA,cACA,GAAG,KACiB;CACpB,IAAM,IAAU,EAAQ,IAClB,EACF,aACA,WACA,UACA,cACA,aACA,WACA,OAAO,GACP,aACA,EAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,CAAC;CAED,IAAI,CAAC,GACD,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,SAAS,CAAS;EAAG,GAAI;YAAnD,CACI,kBAAC,KAAD;GAAG,WAAW,EAAO;aAAS,EAAQ;EAAe,CAAA,GACpD,CACA;;CAIb,IAAM,IAAU,IACV,EAAQ,MAAM,EAAO,QAAQ,IAC7B,IACE,EAAQ,SACR,IACE,EAAQ,WACR,EAAQ;CAElB,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,SAAS,CAAS;EAAG,GAAI;YAAnD;GACI,kBAAC,OAAD;IACI,WAAW,EAAO;IAClB,OAAO,EAAE,aAAa,OAAO,CAAW,EAAE;IAC1C,cAAY,EAAQ;IACpB,MAAK;cAJT;KAMI,kBAAC,SAAD;MACI,KAAK;MACL,WAAW,EAAO;MAClB,OAAA;MACA,aAAA;MACA,eAAY;KACf,CAAA;KAEA,MAAW,WACR,kBAAC,OAAD;MAAK,WAAW,EAAO;MAAO,eAAY;gBACtC,kBAAC,QAAD,EAAM,WAAW,EAAG,EAAO,OAAO,KAAY,EAAO,WAAW,EAAI,CAAA;KACnE,CAAA;KAGR,KAAS,EAAK,aACX,kBAAC,UAAD;MACI,MAAK;MACL,WAAW,EAAO;MAClB,eAAe,KAAK,EAAK,OAAO;MAChC,gBAAc,EAAK;MACnB,cAAY,EAAK,KAAK,EAAQ,UAAU,EAAQ;gBAE/C,EAAK,KACF,kBAAC,GAAD;OAAe,MAAM;OAAI,eAAA;MAAa,CAAA,IAEtC,kBAAC,GAAD;OAAY,MAAM;OAAI,eAAA;MAAa,CAAA;KAEnC,CAAA;KAGX,KACG,kBAAC,OAAD;MAAK,WAAW,EAAO;MAAS,MAAK;gBAArC,CACI,kBAAC,KAAD;OAAG,WAAW,EAAO;iBAAc,EAAM;MAAW,CAAA,GACpD,kBAAC,UAAD;OAAQ,MAAK;OAAS,WAAW,EAAO;OAAO,SAAS;iBACnD,EAAQ;MACL,CAAA,CACP;;IAER;;GAEJ,CAAC,KACE,kBAAC,KAAD;IAAG,WAAW,EAAO;IAAQ,MAAK;cAAlC,CACI,kBAAC,GAAD;KAAU,MAAM;KAAI,eAAA;KAAY,WAAW,EAAO;IAAa,CAAA,GAC9D,CACF;;GAGN,IAAS,kBAAC,OAAD;IAAK,WAAW,EAAO;cAAS;GAAY,CAAA,IAAI;EACzD;;AAEb"}
1
+ {"version":3,"file":"BarcodeScanner.js","names":[],"sources":["../../../src/components/BarcodeScanner/BarcodeScanner.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — the scan loop is tuned\n * by the caller because the right values depend on the symbology and the device:\n * formats, intervalMs, repeatDelayMs, detector, paused, torch, aspectRatio. The rest\n * are the surfaces to fill when the API is missing (unsupported, footer, locale) and\n * the two outputs (onScan, onError).\n */\nimport { Flashlight, FlashlightOff, ScanLine } from \"lucide-react\";\nimport { type HTMLAttributes, type ReactNode } from \"react\";\n\nimport { useBarcodeScanner } from \"@/capture/use-barcode-scanner\";\nimport type { BarcodeDetectorLike, BarcodeFormat, BarcodeScanResult } from \"@/capture/barcode\";\nimport { cn } from \"@/utils/cn\";\n\nimport styles from \"./BarcodeScanner.module.css\";\n\n/** DOM attributes this component redefines. */\ntype OverriddenDomProps = \"children\" | \"onError\";\n\nexport interface BarcodeScannerProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n OverriddenDomProps\n> {\n /** Called for every accepted read — repeats of the same value are suppressed. */\n onScan: (result: BarcodeScanResult) => void;\n /** Symbologies to look for. Defaults to QR + EAN-13 + Code 128. */\n formats?: readonly BarcodeFormat[];\n /** Stop looking without releasing the camera — set it while a confirmation is open. */\n paused?: boolean;\n /** A decoder to use instead of the native one, for Safari and Firefox. */\n detector?: BarcodeDetectorLike;\n /** How often a frame is examined, in ms. Default 200. */\n intervalMs?: number;\n /** Ignore the same value again for this long, in ms. Default 2500. */\n repeatDelayMs?: number;\n /** Offer the torch toggle when the camera has a lamp. Default `true`. */\n torch?: boolean;\n /** Viewport aspect ratio, `width / height`. Default `4 / 3`. */\n aspectRatio?: number;\n /** Locale for the labels. Default `\"pt-BR\"`. */\n locale?: \"pt-BR\" | \"en\";\n /** Under the viewport — an instruction, the code just read, a manual-entry link. */\n footer?: ReactNode;\n /**\n * Rendered instead of the camera when there is no decoder.\n *\n * Worth filling in: on iOS and Firefox this is the **only** thing the user sees, so\n * the fallback is usually a plain text field for typing the code.\n */\n unsupported?: ReactNode;\n /** A frame the engine refused to decode. Routine and usually transient. */\n onError?: (error: unknown) => void;\n}\n\nconst STRINGS = {\n \"pt-BR\": {\n viewport: \"Visor da câmera\",\n scanning: \"Procurando código…\",\n paused: \"Leitura pausada\",\n opening: \"Abrindo a câmera…\",\n hint: \"Aponte a câmera para o código.\",\n found: (value: string) => `Código lido: ${value}`,\n torchOn: \"Desligar lanterna\",\n torchOff: \"Ligar lanterna\",\n unsupported: \"Este navegador não decodifica códigos de barras.\",\n retry: \"Tentar de novo\",\n },\n en: {\n viewport: \"Camera viewport\",\n scanning: \"Looking for a code…\",\n paused: \"Scanning paused\",\n opening: \"Opening the camera…\",\n hint: \"Point the camera at the code.\",\n found: (value: string) => `Code read: ${value}`,\n torchOn: \"Turn torch off\",\n torchOff: \"Turn torch on\",\n unsupported: \"This browser cannot decode barcodes.\",\n retry: \"Try again\",\n },\n} as const;\n\n/**\n * Point the camera at a barcode and get its value.\n *\n * The counterpart to {@link QRCode}, which only encodes. Under it are\n * `useBarcodeScanner` (the detect loop and repeat suppression), `useCameraStream` (the\n * stream and its classified errors) and `useTorch`.\n *\n * **Mounting this opens the camera**, so mount it when the user asks to scan rather\n * than on a page that happens to contain a scanner: a permission prompt nobody\n * provoked is the surest way to earn a permanent block, and after that `getUserMedia`\n * rejects without ever prompting again. The usual shape is a button that reveals it.\n *\n * The `unsupported` slot is not a nicety. `BarcodeDetector` is Chromium-only — absent\n * on Firefox, on every browser on iOS, and on Chromium for Windows and Linux — so on a\n * large share of real devices the fallback *is* the feature. Give it a text field, or\n * inject a polyfill through `detector`.\n *\n * The preview itself is `aria-hidden`: a live camera frame has nothing to announce and\n * no audio to caption, so what a screen reader gets is the `role=\"status\"` line, which\n * says whether scanning is running and reads out each accepted code.\n *\n * @example\n * <BarcodeScanner\n * formats={[\"ean_13\"]}\n * onScan={({ rawValue }) => addToCart(rawValue)}\n * footer={<small>Aponte para o código de barras da embalagem.</small>}\n * unsupported={<ManualCodeInput onSubmit={addToCart} />}\n * />\n */\nexport function BarcodeScanner({\n onScan,\n formats,\n paused = false,\n detector,\n intervalMs,\n repeatDelayMs,\n torch = true,\n aspectRatio = 4 / 3,\n locale = \"pt-BR\",\n footer,\n unsupported,\n onError,\n className,\n ...rest\n}: BarcodeScannerProps) {\n const strings = STRINGS[locale];\n const {\n videoRef,\n status,\n error,\n supported,\n scanning,\n result,\n torch: lamp,\n retry,\n } = useBarcodeScanner({\n formats,\n paused,\n detector,\n intervalMs,\n repeatDelayMs,\n onScan,\n onError,\n });\n\n if (!supported) {\n return (\n <div className={cn(styles.scanner, className)} {...rest}>\n <p className={styles.notice}>{strings.unsupported}</p>\n {unsupported}\n </div>\n );\n }\n\n const message = result\n ? strings.found(result.rawValue)\n : paused\n ? strings.paused\n : scanning\n ? strings.scanning\n : strings.opening;\n\n return (\n <div className={cn(styles.scanner, className)} {...rest}>\n <div\n className={styles.viewport}\n style={{ aspectRatio: String(aspectRatio) }}\n aria-label={strings.viewport}\n role=\"group\"\n >\n <video\n ref={videoRef}\n className={styles.video}\n muted\n playsInline\n aria-hidden=\"true\"\n />\n\n {status === \"ready\" && (\n <div className={styles.frame} aria-hidden=\"true\">\n <span className={cn(styles.laser, scanning && styles.laserActive)} />\n </div>\n )}\n\n {torch && lamp.supported && (\n <button\n type=\"button\"\n className={styles.torch}\n onClick={() => void lamp.toggle()}\n aria-pressed={lamp.on}\n aria-label={lamp.on ? strings.torchOn : strings.torchOff}\n >\n {lamp.on ? (\n <FlashlightOff size={18} aria-hidden />\n ) : (\n <Flashlight size={18} aria-hidden />\n )}\n </button>\n )}\n\n {error && (\n <div className={styles.overlay} role=\"alert\">\n <p className={styles.overlayText}>{error.message}</p>\n <button type=\"button\" className={styles.retry} onClick={retry}>\n {strings.retry}\n </button>\n </div>\n )}\n </div>\n\n {!error && (\n <p className={styles.status} role=\"status\">\n <ScanLine size={14} aria-hidden className={styles.statusIcon} />\n {message}\n </p>\n )}\n\n {footer ? <div className={styles.footer}>{footer}</div> : null}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAsDA,IAAM,IAAU;CACZ,SAAS;EACL,UAAU;EACV,UAAU;EACV,QAAQ;EACR,SAAS;EACT,MAAM;EACN,QAAQ,MAAkB,gBAAgB;EAC1C,SAAS;EACT,UAAU;EACV,aAAa;EACb,OAAO;CACX;CACA,IAAI;EACA,UAAU;EACV,UAAU;EACV,QAAQ;EACR,SAAS;EACT,MAAM;EACN,QAAQ,MAAkB,cAAc;EACxC,SAAS;EACT,UAAU;EACV,aAAa;EACb,OAAO;CACX;AACJ;AA+BA,SAAgB,EAAe,EAC3B,WACA,YACA,YAAS,IACT,aACA,eACA,kBACA,WAAQ,IACR,iBAAc,IAAI,GAClB,YAAS,SACT,WACA,gBACA,YACA,cACA,GAAG,KACiB;CACpB,IAAM,IAAU,EAAQ,IAClB,EACF,aACA,WACA,UACA,cACA,aACA,WACA,OAAO,GACP,aACA,EAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;CACJ,CAAC;CAED,IAAI,CAAC,GACD,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,SAAS,CAAS;EAAG,GAAI;EAAnD,UAAA,CACI,kBAAC,KAAD;GAAG,WAAW,EAAO;GAAS,UAAA,EAAQ;EAAe,CAAA,GACpD,CACA;;CAIb,IAAM,IAAU,IACV,EAAQ,MAAM,EAAO,QAAQ,IAC7B,IACE,EAAQ,SACR,IACE,EAAQ,WACR,EAAQ;CAElB,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,SAAS,CAAS;EAAG,GAAI;EAAnD,UAAA;GACI,kBAAC,OAAD;IACI,WAAW,EAAO;IAClB,OAAO,EAAE,aAAa,OAAO,CAAW,EAAE;IAC1C,cAAY,EAAQ;IACpB,MAAK;IAJT,UAAA;KAMI,kBAAC,SAAD;MACI,KAAK;MACL,WAAW,EAAO;MAClB,OAAA;MACA,aAAA;MACA,eAAY;KACf,CAAA;KAEA,MAAW,WACR,kBAAC,OAAD;MAAK,WAAW,EAAO;MAAO,eAAY;MACtC,UAAA,kBAAC,QAAD,EAAM,WAAW,EAAG,EAAO,OAAO,KAAY,EAAO,WAAW,EAAI,CAAA;KACnE,CAAA;KAGR,KAAS,EAAK,aACX,kBAAC,UAAD;MACI,MAAK;MACL,WAAW,EAAO;MAClB,eAAe,KAAK,EAAK,OAAO;MAChC,gBAAc,EAAK;MACnB,cAAY,EAAK,KAAK,EAAQ,UAAU,EAAQ;MAE/C,UAAA,EAAK,KACF,kBAAC,GAAD;OAAe,MAAM;OAAI,eAAA;MAAa,CAAA,IAEtC,kBAAC,GAAD;OAAY,MAAM;OAAI,eAAA;MAAa,CAAA;KAEnC,CAAA;KAGX,KACG,kBAAC,OAAD;MAAK,WAAW,EAAO;MAAS,MAAK;MAArC,UAAA,CACI,kBAAC,KAAD;OAAG,WAAW,EAAO;OAAc,UAAA,EAAM;MAAW,CAAA,GACpD,kBAAC,UAAD;OAAQ,MAAK;OAAS,WAAW,EAAO;OAAO,SAAS;OACnD,UAAA,EAAQ;MACL,CAAA,CACP;;IAER;;GAEJ,CAAC,KACE,kBAAC,KAAD;IAAG,WAAW,EAAO;IAAQ,MAAK;IAAlC,UAAA,CACI,kBAAC,GAAD;KAAU,MAAM;KAAI,eAAA;KAAY,WAAW,EAAO;IAAa,CAAA,GAC9D,CACF;;GAGN,IAAS,kBAAC,OAAD;IAAK,WAAW,EAAO;IAAS,UAAA;GAAY,CAAA,IAAI;EACzD;;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"BottomNavigation.cjs","names":[],"sources":["../../../src/components/BottomNavigation/BottomNavigation.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomNavigation.module.css\";\n\nexport interface BottomNavigationItem {\n /** Unique identifier — used as React key and for value matching. */\n key: string;\n /** Visible label. */\n label: ReactNode;\n /** Icon rendered above the label. */\n icon?: ReactNode;\n /** Optional badge content rendered above the icon. */\n badge?: ReactNode;\n /** When true, the item is not selectable. */\n disabled?: boolean;\n}\n\nexport interface BottomNavigationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n items: BottomNavigationItem[];\n /** Selected key. */\n value: string;\n /** Called with the new selected key on click. */\n onChange: (key: string) => void;\n /** Show label below each icon. Default `true`. */\n showLabels?: boolean;\n}\n\n/**\n * Fixed-bottom mobile tab bar. 3–5 items recommended. Pair with\n * `<Show below=\"md\">` to render only on mobile.\n *\n * @example\n * <Show below=\"md\">\n * <BottomNavigation\n * items={[\n * { key: \"home\", label: \"Início\", icon: <Home /> },\n * { key: \"search\", label: \"Buscar\", icon: <Search /> },\n * { key: \"profile\", label: \"Perfil\", icon: <User /> },\n * ]}\n * value={tab}\n * onChange={setTab}\n * />\n * </Show>\n */\nexport function BottomNavigation({\n items,\n value,\n onChange,\n showLabels = true,\n className,\n ...props\n}: BottomNavigationProps) {\n return (\n <nav className={cn(styles.bar, className)} aria-label=\"Navegação principal\" {...props}>\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange(item.key)}\n >\n <span className={styles.iconWrap}>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n {showLabels && <span className={styles.label}>{item.label}</span>}\n </button>\n );\n })}\n </nav>\n );\n}\n"],"mappings":"oHA4CA,SAAgB,EAAiB,CAC7B,QACA,QACA,WACA,aAAa,GACb,YACA,GAAG,GACmB,CACtB,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,CAAS,EAAG,aAAW,sBAAsB,GAAI,WAC3E,EAAM,IAAK,GAAS,CACjB,IAAM,EAAS,EAAK,MAAQ,EAC5B,OACI,EAAA,EAAA,KAAA,CAAC,SAAD,CAEI,KAAK,SACL,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,MAAM,EAClD,eAAc,EAAS,OAAS,IAAA,GAChC,SAAU,EAAK,SACf,YAAe,EAAS,EAAK,GAAG,WANpC,EAQI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,kBAAxB,CACK,EAAK,OAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,cAAO,EAAK,IAAW,CAAA,EAC5D,EAAK,QAAU,IAAA,KACZ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,EAAK,KAAY,CAAA,CAEnD,IACL,IAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,eAAQ,EAAK,KAAY,CAAA,CAC5D,GAdC,EAAK,GAcN,CAEhB,CAAC,CACA,CAAA,CAEb"}
1
+ {"version":3,"file":"BottomNavigation.cjs","names":[],"sources":["../../../src/components/BottomNavigation/BottomNavigation.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomNavigation.module.css\";\n\nexport interface BottomNavigationItem {\n /** Unique identifier — used as React key and for value matching. */\n key: string;\n /** Visible label. */\n label: ReactNode;\n /** Icon rendered above the label. */\n icon?: ReactNode;\n /** Optional badge content rendered above the icon. */\n badge?: ReactNode;\n /** When true, the item is not selectable. */\n disabled?: boolean;\n}\n\nexport interface BottomNavigationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n items: BottomNavigationItem[];\n /** Selected key. */\n value: string;\n /** Called with the new selected key on click. */\n onChange: (key: string) => void;\n /** Show label below each icon. Default `true`. */\n showLabels?: boolean;\n}\n\n/**\n * Fixed-bottom mobile tab bar. 3–5 items recommended. Pair with\n * `<Show below=\"md\">` to render only on mobile.\n *\n * @example\n * <Show below=\"md\">\n * <BottomNavigation\n * items={[\n * { key: \"home\", label: \"Início\", icon: <Home /> },\n * { key: \"search\", label: \"Buscar\", icon: <Search /> },\n * { key: \"profile\", label: \"Perfil\", icon: <User /> },\n * ]}\n * value={tab}\n * onChange={setTab}\n * />\n * </Show>\n */\nexport function BottomNavigation({\n items,\n value,\n onChange,\n showLabels = true,\n className,\n ...props\n}: BottomNavigationProps) {\n return (\n <nav className={cn(styles.bar, className)} aria-label=\"Navegação principal\" {...props}>\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange(item.key)}\n >\n <span className={styles.iconWrap}>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n {showLabels && <span className={styles.label}>{item.label}</span>}\n </button>\n );\n })}\n </nav>\n );\n}\n"],"mappings":"oHA4CA,SAAgB,EAAiB,CAC7B,QACA,QACA,WACA,aAAa,GACb,YACA,GAAG,GACmB,CACtB,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,CAAS,EAAG,aAAW,sBAAsB,GAAI,EAC3E,SAAA,EAAM,IAAK,GAAS,CACjB,IAAM,EAAS,EAAK,MAAQ,EAC5B,OACI,EAAA,EAAA,KAAA,CAAC,SAAD,CAEI,KAAK,SACL,UAAW,EAAA,GAAG,EAAA,QAAO,KAAM,GAAU,EAAA,QAAO,MAAM,EAClD,eAAc,EAAS,OAAS,IAAA,GAChC,SAAU,EAAK,SACf,YAAe,EAAS,EAAK,GAAG,EANpC,SAAA,EAQI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,SAAxB,SAAA,CACK,EAAK,OAAQ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,KAAO,SAAA,EAAK,IAAW,CAAA,EAC5D,EAAK,QAAU,IAAA,KACZ,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,EAAK,KAAY,CAAA,CAEnD,CACL,CAAA,EAAA,IAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,MAAQ,SAAA,EAAK,KAAY,CAAA,CAC5D,CAdC,EAAA,EAAK,GAcN,CAEhB,CAAC,CACA,CAAA,CAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"BottomNavigation.js","names":[],"sources":["../../../src/components/BottomNavigation/BottomNavigation.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomNavigation.module.css\";\n\nexport interface BottomNavigationItem {\n /** Unique identifier — used as React key and for value matching. */\n key: string;\n /** Visible label. */\n label: ReactNode;\n /** Icon rendered above the label. */\n icon?: ReactNode;\n /** Optional badge content rendered above the icon. */\n badge?: ReactNode;\n /** When true, the item is not selectable. */\n disabled?: boolean;\n}\n\nexport interface BottomNavigationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n items: BottomNavigationItem[];\n /** Selected key. */\n value: string;\n /** Called with the new selected key on click. */\n onChange: (key: string) => void;\n /** Show label below each icon. Default `true`. */\n showLabels?: boolean;\n}\n\n/**\n * Fixed-bottom mobile tab bar. 3–5 items recommended. Pair with\n * `<Show below=\"md\">` to render only on mobile.\n *\n * @example\n * <Show below=\"md\">\n * <BottomNavigation\n * items={[\n * { key: \"home\", label: \"Início\", icon: <Home /> },\n * { key: \"search\", label: \"Buscar\", icon: <Search /> },\n * { key: \"profile\", label: \"Perfil\", icon: <User /> },\n * ]}\n * value={tab}\n * onChange={setTab}\n * />\n * </Show>\n */\nexport function BottomNavigation({\n items,\n value,\n onChange,\n showLabels = true,\n className,\n ...props\n}: BottomNavigationProps) {\n return (\n <nav className={cn(styles.bar, className)} aria-label=\"Navegação principal\" {...props}>\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange(item.key)}\n >\n <span className={styles.iconWrap}>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n {showLabels && <span className={styles.label}>{item.label}</span>}\n </button>\n );\n })}\n </nav>\n );\n}\n"],"mappings":";;;;AA4CA,SAAgB,EAAiB,EAC7B,UACA,UACA,aACA,gBAAa,IACb,cACA,GAAG,KACmB;CACtB,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,KAAK,CAAS;EAAG,cAAW;EAAsB,GAAI;YAC3E,EAAM,KAAK,MAAS;GACjB,IAAM,IAAS,EAAK,QAAQ;GAC5B,OACI,kBAAC,UAAD;IAEI,MAAK;IACL,WAAW,EAAG,EAAO,MAAM,KAAU,EAAO,MAAM;IAClD,gBAAc,IAAS,SAAS,KAAA;IAChC,UAAU,EAAK;IACf,eAAe,EAAS,EAAK,GAAG;cANpC,CAQI,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAxB,CACK,EAAK,QAAQ,kBAAC,QAAD;MAAM,WAAW,EAAO;gBAAO,EAAK;KAAW,CAAA,GAC5D,EAAK,UAAU,KAAA,KACZ,kBAAC,QAAD;MAAM,WAAW,EAAO;gBAAQ,EAAK;KAAY,CAAA,CAEnD;QACL,KAAc,kBAAC,QAAD;KAAM,WAAW,EAAO;eAAQ,EAAK;IAAY,CAAA,CAC5D;MAdC,EAAK,GAcN;EAEhB,CAAC;CACA,CAAA;AAEb"}
1
+ {"version":3,"file":"BottomNavigation.js","names":[],"sources":["../../../src/components/BottomNavigation/BottomNavigation.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomNavigation.module.css\";\n\nexport interface BottomNavigationItem {\n /** Unique identifier — used as React key and for value matching. */\n key: string;\n /** Visible label. */\n label: ReactNode;\n /** Icon rendered above the label. */\n icon?: ReactNode;\n /** Optional badge content rendered above the icon. */\n badge?: ReactNode;\n /** When true, the item is not selectable. */\n disabled?: boolean;\n}\n\nexport interface BottomNavigationProps extends Omit<HTMLAttributes<HTMLElement>, \"onChange\"> {\n items: BottomNavigationItem[];\n /** Selected key. */\n value: string;\n /** Called with the new selected key on click. */\n onChange: (key: string) => void;\n /** Show label below each icon. Default `true`. */\n showLabels?: boolean;\n}\n\n/**\n * Fixed-bottom mobile tab bar. 3–5 items recommended. Pair with\n * `<Show below=\"md\">` to render only on mobile.\n *\n * @example\n * <Show below=\"md\">\n * <BottomNavigation\n * items={[\n * { key: \"home\", label: \"Início\", icon: <Home /> },\n * { key: \"search\", label: \"Buscar\", icon: <Search /> },\n * { key: \"profile\", label: \"Perfil\", icon: <User /> },\n * ]}\n * value={tab}\n * onChange={setTab}\n * />\n * </Show>\n */\nexport function BottomNavigation({\n items,\n value,\n onChange,\n showLabels = true,\n className,\n ...props\n}: BottomNavigationProps) {\n return (\n <nav className={cn(styles.bar, className)} aria-label=\"Navegação principal\" {...props}>\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cn(styles.item, active && styles.active)}\n aria-current={active ? \"page\" : undefined}\n disabled={item.disabled}\n onClick={() => onChange(item.key)}\n >\n <span className={styles.iconWrap}>\n {item.icon && <span className={styles.icon}>{item.icon}</span>}\n {item.badge !== undefined && (\n <span className={styles.badge}>{item.badge}</span>\n )}\n </span>\n {showLabels && <span className={styles.label}>{item.label}</span>}\n </button>\n );\n })}\n </nav>\n );\n}\n"],"mappings":";;;;AA4CA,SAAgB,EAAiB,EAC7B,UACA,UACA,aACA,gBAAa,IACb,cACA,GAAG,KACmB;CACtB,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,KAAK,CAAS;EAAG,cAAW;EAAsB,GAAI;EAC3E,UAAA,EAAM,KAAK,MAAS;GACjB,IAAM,IAAS,EAAK,QAAQ;GAC5B,OACI,kBAAC,UAAD;IAEI,MAAK;IACL,WAAW,EAAG,EAAO,MAAM,KAAU,EAAO,MAAM;IAClD,gBAAc,IAAS,SAAS,KAAA;IAChC,UAAU,EAAK;IACf,eAAe,EAAS,EAAK,GAAG;IANpC,UAAA,CAQI,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAxB,UAAA,CACK,EAAK,QAAQ,kBAAC,QAAD;MAAM,WAAW,EAAO;MAAO,UAAA,EAAK;KAAW,CAAA,GAC5D,EAAK,UAAU,KAAA,KACZ,kBAAC,QAAD;MAAM,WAAW,EAAO;MAAQ,UAAA,EAAK;KAAY,CAAA,CAEnD;IACL,CAAA,GAAA,KAAc,kBAAC,QAAD;KAAM,WAAW,EAAO;KAAQ,UAAA,EAAK;IAAY,CAAA,CAC5D;GAdC,GAAA,EAAK,GAcN;EAEhB,CAAC;CACA,CAAA;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.cjs","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomSheet.module.css\";\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Controlled open state. */\n open: boolean;\n /** Fires when user dismisses (backdrop click, Esc, swipe). */\n onClose: () => void;\n /** Optional title rendered at the top of the sheet. */\n title?: ReactNode;\n /** Show a drag handle indicator at the top. Default `true`. */\n showHandle?: boolean;\n /** When `true`, clicking the backdrop closes the sheet. Default `true`. */\n dismissOnBackdrop?: boolean;\n /** When `true`, pressing Esc closes the sheet. Default `true`. */\n dismissOnEsc?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Slide-up modal panel — mobile-style sheet anchored to the bottom edge.\n * Uses portal + safe-area padding + scroll lock.\n *\n * @example\n * <BottomSheet open={open} onClose={() => setOpen(false)} title=\"Filters\">\n * <FilterForm />\n * </BottomSheet>\n */\nexport function BottomSheet({\n open,\n onClose,\n title,\n showHandle = true,\n dismissOnBackdrop = true,\n dismissOnEsc = true,\n className,\n children,\n ...props\n}: BottomSheetProps) {\n useEffect(() => {\n if (!open || !dismissOnEsc) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, dismissOnEsc, onClose]);\n\n useEffect(() => {\n if (!open) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [open]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div className={styles.root} role=\"dialog\" aria-modal=\"true\">\n <div\n className={styles.backdrop}\n onClick={() => dismissOnBackdrop && onClose()}\n aria-hidden=\"true\"\n />\n <div className={cn(styles.sheet, className)} {...props}>\n {showHandle && (\n <button\n type=\"button\"\n className={styles.handle}\n aria-label=\"Arrastar para fechar\"\n onClick={onClose}\n >\n <span className={styles.handleBar} />\n </button>\n )}\n {title && <div className={styles.title}>{title}</div>}\n <div className={styles.body}>{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"yJA+BA,SAAgB,EAAY,CACxB,OACA,UACA,QACA,aAAa,GACb,oBAAoB,GACpB,eAAe,GACf,YACA,WACA,GAAG,GACc,CAqBjB,OApBA,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,CAAC,GAAQ,CAAC,EAAc,OAC5B,IAAM,EAAW,GAAqB,CAC9B,EAAE,MAAQ,UAAU,EAAQ,CACpC,EAEA,OADA,OAAO,iBAAiB,UAAW,CAAO,MAC7B,OAAO,oBAAoB,UAAW,CAAO,CAC9D,EAAG,CAAC,EAAM,EAAc,CAAO,CAAC,GAEhC,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,CAAC,EAAM,OACX,IAAM,EAAW,SAAS,KAAK,MAAM,SAErC,MADA,UAAS,KAAK,MAAM,SAAW,aAClB,CACT,SAAS,KAAK,MAAM,SAAW,CACnC,CACJ,EAAG,CAAC,CAAI,CAAC,EAEL,CAAC,GAAQ,OAAO,SAAa,IAAoB,MAErD,EAAA,EAAA,aAAA,EACI,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAM,KAAK,SAAS,aAAW,gBAAtD,EACI,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,UAAW,EAAA,QAAO,SAClB,YAAe,GAAqB,EAAQ,EAC5C,cAAY,MACf,CAAA,GACD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,MAAO,CAAS,EAAG,GAAI,WAAjD,CACK,IACG,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,OAClB,aAAW,uBACX,QAAS,YAET,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,SAAY,CAAA,CAChC,CAAA,EAEX,IAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,eAAQ,CAAW,CAAA,GACpD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAO,UAAc,CAAA,CAC3C,GACJ,IACL,SAAS,IACb,CACJ"}
1
+ {"version":3,"file":"BottomSheet.cjs","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomSheet.module.css\";\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Controlled open state. */\n open: boolean;\n /** Fires when user dismisses (backdrop click, Esc, swipe). */\n onClose: () => void;\n /** Optional title rendered at the top of the sheet. */\n title?: ReactNode;\n /** Show a drag handle indicator at the top. Default `true`. */\n showHandle?: boolean;\n /** When `true`, clicking the backdrop closes the sheet. Default `true`. */\n dismissOnBackdrop?: boolean;\n /** When `true`, pressing Esc closes the sheet. Default `true`. */\n dismissOnEsc?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Slide-up modal panel — mobile-style sheet anchored to the bottom edge.\n * Uses portal + safe-area padding + scroll lock.\n *\n * @example\n * <BottomSheet open={open} onClose={() => setOpen(false)} title=\"Filters\">\n * <FilterForm />\n * </BottomSheet>\n */\nexport function BottomSheet({\n open,\n onClose,\n title,\n showHandle = true,\n dismissOnBackdrop = true,\n dismissOnEsc = true,\n className,\n children,\n ...props\n}: BottomSheetProps) {\n useEffect(() => {\n if (!open || !dismissOnEsc) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, dismissOnEsc, onClose]);\n\n useEffect(() => {\n if (!open) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [open]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div className={styles.root} role=\"dialog\" aria-modal=\"true\">\n <div\n className={styles.backdrop}\n onClick={() => dismissOnBackdrop && onClose()}\n aria-hidden=\"true\"\n />\n <div className={cn(styles.sheet, className)} {...props}>\n {showHandle && (\n <button\n type=\"button\"\n className={styles.handle}\n aria-label=\"Arrastar para fechar\"\n onClick={onClose}\n >\n <span className={styles.handleBar} />\n </button>\n )}\n {title && <div className={styles.title}>{title}</div>}\n <div className={styles.body}>{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"yJA+BA,SAAgB,EAAY,CACxB,OACA,UACA,QACA,aAAa,GACb,oBAAoB,GACpB,eAAe,GACf,YACA,WACA,GAAG,GACc,CAqBjB,OApBA,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,CAAC,GAAQ,CAAC,EAAc,OAC5B,IAAM,EAAW,GAAqB,CAC9B,EAAE,MAAQ,UAAU,EAAQ,CACpC,EAEA,OADA,OAAO,iBAAiB,UAAW,CAAO,MAC7B,OAAO,oBAAoB,UAAW,CAAO,CAC9D,EAAG,CAAC,EAAM,EAAc,CAAO,CAAC,GAEhC,EAAA,EAAA,UAAA,KAAgB,CACZ,GAAI,CAAC,EAAM,OACX,IAAM,EAAW,SAAS,KAAK,MAAM,SAErC,MADA,UAAS,KAAK,MAAM,SAAW,aAClB,CACT,SAAS,KAAK,MAAM,SAAW,CACnC,CACJ,EAAG,CAAC,CAAI,CAAC,EAEL,CAAC,GAAQ,OAAO,SAAa,IAAoB,MAErD,EAAO,EAAA,aAAA,EACH,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAM,KAAK,SAAS,aAAW,OAAtD,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,UAAW,EAAA,QAAO,SAClB,YAAe,GAAqB,EAAQ,EAC5C,cAAY,MACf,CAAA,GACD,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,EAAA,GAAG,EAAA,QAAO,MAAO,CAAS,EAAG,GAAI,EAAjD,SAAA,CACK,IACG,EAAA,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAW,EAAA,QAAO,OAClB,aAAW,uBACX,QAAS,EAET,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,SAAY,CAAA,CAChC,CAAA,EAEX,IAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,MAAQ,SAAA,CAAW,CAAA,GACpD,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAA,QAAO,KAAO,UAAc,CAAA,CAC3C,CACJ,CAAA,CAAA,CACL,CAAA,EAAA,SAAS,IACb,CACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.js","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomSheet.module.css\";\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Controlled open state. */\n open: boolean;\n /** Fires when user dismisses (backdrop click, Esc, swipe). */\n onClose: () => void;\n /** Optional title rendered at the top of the sheet. */\n title?: ReactNode;\n /** Show a drag handle indicator at the top. Default `true`. */\n showHandle?: boolean;\n /** When `true`, clicking the backdrop closes the sheet. Default `true`. */\n dismissOnBackdrop?: boolean;\n /** When `true`, pressing Esc closes the sheet. Default `true`. */\n dismissOnEsc?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Slide-up modal panel — mobile-style sheet anchored to the bottom edge.\n * Uses portal + safe-area padding + scroll lock.\n *\n * @example\n * <BottomSheet open={open} onClose={() => setOpen(false)} title=\"Filters\">\n * <FilterForm />\n * </BottomSheet>\n */\nexport function BottomSheet({\n open,\n onClose,\n title,\n showHandle = true,\n dismissOnBackdrop = true,\n dismissOnEsc = true,\n className,\n children,\n ...props\n}: BottomSheetProps) {\n useEffect(() => {\n if (!open || !dismissOnEsc) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, dismissOnEsc, onClose]);\n\n useEffect(() => {\n if (!open) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [open]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div className={styles.root} role=\"dialog\" aria-modal=\"true\">\n <div\n className={styles.backdrop}\n onClick={() => dismissOnBackdrop && onClose()}\n aria-hidden=\"true\"\n />\n <div className={cn(styles.sheet, className)} {...props}>\n {showHandle && (\n <button\n type=\"button\"\n className={styles.handle}\n aria-label=\"Arrastar para fechar\"\n onClick={onClose}\n >\n <span className={styles.handleBar} />\n </button>\n )}\n {title && <div className={styles.title}>{title}</div>}\n <div className={styles.body}>{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":";;;;;;AA+BA,SAAgB,EAAY,EACxB,SACA,YACA,UACA,gBAAa,IACb,uBAAoB,IACpB,kBAAe,IACf,cACA,aACA,GAAG,KACc;CAqBjB,OApBA,QAAgB;EACZ,IAAI,CAAC,KAAQ,CAAC,GAAc;EAC5B,IAAM,KAAW,MAAqB;GAClC,AAAI,EAAE,QAAQ,YAAU,EAAQ;EACpC;EAEA,OADA,OAAO,iBAAiB,WAAW,CAAO,SAC7B,OAAO,oBAAoB,WAAW,CAAO;CAC9D,GAAG;EAAC;EAAM;EAAc;CAAO,CAAC,GAEhC,QAAgB;EACZ,IAAI,CAAC,GAAM;EACX,IAAM,IAAW,SAAS,KAAK,MAAM;EAErC,OADA,SAAS,KAAK,MAAM,WAAW,gBAClB;GACT,SAAS,KAAK,MAAM,WAAW;EACnC;CACJ,GAAG,CAAC,CAAI,CAAC,GAEL,CAAC,KAAQ,OAAO,WAAa,MAAoB,OAE9C,EACH,kBAAC,OAAD;EAAK,WAAW,EAAO;EAAM,MAAK;EAAS,cAAW;YAAtD,CACI,kBAAC,OAAD;GACI,WAAW,EAAO;GAClB,eAAe,KAAqB,EAAQ;GAC5C,eAAY;EACf,CAAA,GACD,kBAAC,OAAD;GAAK,WAAW,EAAG,EAAO,OAAO,CAAS;GAAG,GAAI;aAAjD;IACK,KACG,kBAAC,UAAD;KACI,MAAK;KACL,WAAW,EAAO;KAClB,cAAW;KACX,SAAS;eAET,kBAAC,QAAD,EAAM,WAAW,EAAO,UAAY,CAAA;IAChC,CAAA;IAEX,KAAS,kBAAC,OAAD;KAAK,WAAW,EAAO;eAAQ;IAAW,CAAA;IACpD,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAO;IAAc,CAAA;GAC3C;IACJ;KACL,SAAS,IACb;AACJ"}
1
+ {"version":3,"file":"BottomSheet.js","names":[],"sources":["../../../src/components/BottomSheet/BottomSheet.tsx"],"sourcesContent":["import { useEffect } from \"react\";\nimport type { HTMLAttributes, ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./BottomSheet.module.css\";\n\nexport interface BottomSheetProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n /** Controlled open state. */\n open: boolean;\n /** Fires when user dismisses (backdrop click, Esc, swipe). */\n onClose: () => void;\n /** Optional title rendered at the top of the sheet. */\n title?: ReactNode;\n /** Show a drag handle indicator at the top. Default `true`. */\n showHandle?: boolean;\n /** When `true`, clicking the backdrop closes the sheet. Default `true`. */\n dismissOnBackdrop?: boolean;\n /** When `true`, pressing Esc closes the sheet. Default `true`. */\n dismissOnEsc?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Slide-up modal panel — mobile-style sheet anchored to the bottom edge.\n * Uses portal + safe-area padding + scroll lock.\n *\n * @example\n * <BottomSheet open={open} onClose={() => setOpen(false)} title=\"Filters\">\n * <FilterForm />\n * </BottomSheet>\n */\nexport function BottomSheet({\n open,\n onClose,\n title,\n showHandle = true,\n dismissOnBackdrop = true,\n dismissOnEsc = true,\n className,\n children,\n ...props\n}: BottomSheetProps) {\n useEffect(() => {\n if (!open || !dismissOnEsc) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, dismissOnEsc, onClose]);\n\n useEffect(() => {\n if (!open) return;\n const previous = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = previous;\n };\n }, [open]);\n\n if (!open || typeof document === \"undefined\") return null;\n\n return createPortal(\n <div className={styles.root} role=\"dialog\" aria-modal=\"true\">\n <div\n className={styles.backdrop}\n onClick={() => dismissOnBackdrop && onClose()}\n aria-hidden=\"true\"\n />\n <div className={cn(styles.sheet, className)} {...props}>\n {showHandle && (\n <button\n type=\"button\"\n className={styles.handle}\n aria-label=\"Arrastar para fechar\"\n onClick={onClose}\n >\n <span className={styles.handleBar} />\n </button>\n )}\n {title && <div className={styles.title}>{title}</div>}\n <div className={styles.body}>{children}</div>\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":";;;;;;AA+BA,SAAgB,EAAY,EACxB,SACA,YACA,UACA,gBAAa,IACb,uBAAoB,IACpB,kBAAe,IACf,cACA,aACA,GAAG,KACc;CAqBjB,OApBA,QAAgB;EACZ,IAAI,CAAC,KAAQ,CAAC,GAAc;EAC5B,IAAM,KAAW,MAAqB;GAClC,AAAI,EAAE,QAAQ,YAAU,EAAQ;EACpC;EAEA,OADA,OAAO,iBAAiB,WAAW,CAAO,SAC7B,OAAO,oBAAoB,WAAW,CAAO;CAC9D,GAAG;EAAC;EAAM;EAAc;CAAO,CAAC,GAEhC,QAAgB;EACZ,IAAI,CAAC,GAAM;EACX,IAAM,IAAW,SAAS,KAAK,MAAM;EAErC,OADA,SAAS,KAAK,MAAM,WAAW,gBAClB;GACT,SAAS,KAAK,MAAM,WAAW;EACnC;CACJ,GAAG,CAAC,CAAI,CAAC,GAEL,CAAC,KAAQ,OAAO,WAAa,MAAoB,OAE9C,EACH,kBAAC,OAAD;EAAK,WAAW,EAAO;EAAM,MAAK;EAAS,cAAW;EAAtD,UAAA,CACI,kBAAC,OAAD;GACI,WAAW,EAAO;GAClB,eAAe,KAAqB,EAAQ;GAC5C,eAAY;EACf,CAAA,GACD,kBAAC,OAAD;GAAK,WAAW,EAAG,EAAO,OAAO,CAAS;GAAG,GAAI;GAAjD,UAAA;IACK,KACG,kBAAC,UAAD;KACI,MAAK;KACL,WAAW,EAAO;KAClB,cAAW;KACX,SAAS;KAET,UAAA,kBAAC,QAAD,EAAM,WAAW,EAAO,UAAY,CAAA;IAChC,CAAA;IAEX,KAAS,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAQ,UAAA;IAAW,CAAA;IACpD,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAO;IAAc,CAAA;GAC3C;EACJ,CAAA,CAAA;CACL,CAAA,GAAA,SAAS,IACb;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumbs.cjs","names":[],"sources":["../../../src/components/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Breadcrumbs.module.css\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n separator?: ReactNode;\n className?: string;\n}\n\n/**\n * Hierarchical navigation breadcrumbs. The last item is rendered as plain\n * text with `aria-current=\"page\"`. Items with neither `href` nor `onClick`\n * also render as text (intermediate but non-clickable).\n */\nexport function Breadcrumbs({ items, separator = \"/\", className }: BreadcrumbsProps) {\n return (\n <nav aria-label=\"breadcrumb\" className={cn(styles.nav, className)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const interactive = !isLast && (item.href || item.onClick);\n return (\n <Fragment key={index}>\n <span className={styles.item}>\n {interactive ? (\n <a\n href={item.href}\n onClick={(event) => {\n if (item.onClick) {\n event.preventDefault();\n item.onClick();\n }\n }}\n className={styles.link}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? \"page\" : undefined}\n className={isLast ? styles.current : undefined}\n >\n {item.label}\n </span>\n )}\n </span>\n {!isLast && (\n <span className={styles.separator} aria-hidden>\n {separator}\n </span>\n )}\n </Fragment>\n );\n })}\n </nav>\n );\n}\n"],"mappings":"kIAsBA,SAAgB,EAAY,CAAE,QAAO,YAAY,IAAK,aAA+B,CACjF,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,aAAW,aAAa,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,CAAS,WAC3D,EAAM,KAAK,EAAM,IAAU,CACxB,IAAM,EAAS,IAAU,EAAM,OAAS,EAClC,EAAc,CAAC,IAAW,EAAK,MAAQ,EAAK,SAClD,OACI,EAAA,EAAA,KAAA,CAAC,EAAA,SAAD,CAAA,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,cACnB,GACG,EAAA,EAAA,IAAA,CAAC,IAAD,CACI,KAAM,EAAK,KACX,QAAU,GAAU,CACZ,EAAK,UACL,EAAM,eAAe,EACrB,EAAK,QAAQ,EAErB,EACA,UAAW,EAAA,QAAO,cAEjB,EAAK,KACP,CAAA,GAEH,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,eAAc,EAAS,OAAS,IAAA,GAChC,UAAW,EAAS,EAAA,QAAO,QAAU,IAAA,YAEpC,EAAK,KACJ,CAAA,CAER,CAAA,EACL,CAAC,IACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,UAAW,cAAA,YAC9B,CACC,CAAA,CAEJ,CAAA,EA7BK,CA6BL,CAElB,CAAC,CACA,CAAA,CAEb"}
1
+ {"version":3,"file":"Breadcrumbs.cjs","names":[],"sources":["../../../src/components/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Breadcrumbs.module.css\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n separator?: ReactNode;\n className?: string;\n}\n\n/**\n * Hierarchical navigation breadcrumbs. The last item is rendered as plain\n * text with `aria-current=\"page\"`. Items with neither `href` nor `onClick`\n * also render as text (intermediate but non-clickable).\n */\nexport function Breadcrumbs({ items, separator = \"/\", className }: BreadcrumbsProps) {\n return (\n <nav aria-label=\"breadcrumb\" className={cn(styles.nav, className)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const interactive = !isLast && (item.href || item.onClick);\n return (\n <Fragment key={index}>\n <span className={styles.item}>\n {interactive ? (\n <a\n href={item.href}\n onClick={(event) => {\n if (item.onClick) {\n event.preventDefault();\n item.onClick();\n }\n }}\n className={styles.link}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? \"page\" : undefined}\n className={isLast ? styles.current : undefined}\n >\n {item.label}\n </span>\n )}\n </span>\n {!isLast && (\n <span className={styles.separator} aria-hidden>\n {separator}\n </span>\n )}\n </Fragment>\n );\n })}\n </nav>\n );\n}\n"],"mappings":"kIAsBA,SAAgB,EAAY,CAAE,QAAO,YAAY,IAAK,aAA+B,CACjF,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,aAAW,aAAa,UAAW,EAAA,GAAG,EAAA,QAAO,IAAK,CAAS,EAC3D,SAAA,EAAM,KAAK,EAAM,IAAU,CACxB,IAAM,EAAS,IAAU,EAAM,OAAS,EAClC,EAAc,CAAC,IAAW,EAAK,MAAQ,EAAK,SAClD,OACI,EAAA,EAAA,KAAA,CAAC,EAAA,SAAD,CAAA,SAAA,EACI,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,KACnB,SAAA,GACG,EAAA,EAAA,IAAA,CAAC,IAAD,CACI,KAAM,EAAK,KACX,QAAU,GAAU,CACZ,EAAK,UACL,EAAM,eAAe,EACrB,EAAK,QAAQ,EAErB,EACA,UAAW,EAAA,QAAO,KAEjB,SAAA,EAAK,KACP,CAAA,GAEH,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,eAAc,EAAS,OAAS,IAAA,GAChC,UAAW,EAAS,EAAA,QAAO,QAAU,IAAA,GAEpC,SAAA,EAAK,KACJ,CAAA,CAER,CAAA,EACL,CAAC,IACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,UAAW,cAAA,GAC9B,SAAA,CACC,CAAA,CAEJ,CAAA,EA7BK,CA6BL,CAElB,CAAC,CACA,CAAA,CAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Breadcrumbs.js","names":[],"sources":["../../../src/components/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Breadcrumbs.module.css\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n separator?: ReactNode;\n className?: string;\n}\n\n/**\n * Hierarchical navigation breadcrumbs. The last item is rendered as plain\n * text with `aria-current=\"page\"`. Items with neither `href` nor `onClick`\n * also render as text (intermediate but non-clickable).\n */\nexport function Breadcrumbs({ items, separator = \"/\", className }: BreadcrumbsProps) {\n return (\n <nav aria-label=\"breadcrumb\" className={cn(styles.nav, className)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const interactive = !isLast && (item.href || item.onClick);\n return (\n <Fragment key={index}>\n <span className={styles.item}>\n {interactive ? (\n <a\n href={item.href}\n onClick={(event) => {\n if (item.onClick) {\n event.preventDefault();\n item.onClick();\n }\n }}\n className={styles.link}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? \"page\" : undefined}\n className={isLast ? styles.current : undefined}\n >\n {item.label}\n </span>\n )}\n </span>\n {!isLast && (\n <span className={styles.separator} aria-hidden>\n {separator}\n </span>\n )}\n </Fragment>\n );\n })}\n </nav>\n );\n}\n"],"mappings":";;;;;AAsBA,SAAgB,EAAY,EAAE,UAAO,eAAY,KAAK,gBAA+B;CACjF,OACI,kBAAC,OAAD;EAAK,cAAW;EAAa,WAAW,EAAG,EAAO,KAAK,CAAS;YAC3D,EAAM,KAAK,GAAM,MAAU;GACxB,IAAM,IAAS,MAAU,EAAM,SAAS,GAClC,IAAc,CAAC,MAAW,EAAK,QAAQ,EAAK;GAClD,OACI,kBAAC,GAAD,EAAA,UAAA,CACI,kBAAC,QAAD;IAAM,WAAW,EAAO;cACnB,IACG,kBAAC,KAAD;KACI,MAAM,EAAK;KACX,UAAU,MAAU;MAChB,AAAI,EAAK,YACL,EAAM,eAAe,GACrB,EAAK,QAAQ;KAErB;KACA,WAAW,EAAO;eAEjB,EAAK;IACP,CAAA,IAEH,kBAAC,QAAD;KACI,gBAAc,IAAS,SAAS,KAAA;KAChC,WAAW,IAAS,EAAO,UAAU,KAAA;eAEpC,EAAK;IACJ,CAAA;GAER,CAAA,GACL,CAAC,KACE,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAW,eAAA;cAC9B;GACC,CAAA,CAEJ,EAAA,GA7BK,CA6BL;EAElB,CAAC;CACA,CAAA;AAEb"}
1
+ {"version":3,"file":"Breadcrumbs.js","names":[],"sources":["../../../src/components/Breadcrumbs/Breadcrumbs.tsx"],"sourcesContent":["import { Fragment } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Breadcrumbs.module.css\";\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps {\n items: BreadcrumbItem[];\n separator?: ReactNode;\n className?: string;\n}\n\n/**\n * Hierarchical navigation breadcrumbs. The last item is rendered as plain\n * text with `aria-current=\"page\"`. Items with neither `href` nor `onClick`\n * also render as text (intermediate but non-clickable).\n */\nexport function Breadcrumbs({ items, separator = \"/\", className }: BreadcrumbsProps) {\n return (\n <nav aria-label=\"breadcrumb\" className={cn(styles.nav, className)}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const interactive = !isLast && (item.href || item.onClick);\n return (\n <Fragment key={index}>\n <span className={styles.item}>\n {interactive ? (\n <a\n href={item.href}\n onClick={(event) => {\n if (item.onClick) {\n event.preventDefault();\n item.onClick();\n }\n }}\n className={styles.link}\n >\n {item.label}\n </a>\n ) : (\n <span\n aria-current={isLast ? \"page\" : undefined}\n className={isLast ? styles.current : undefined}\n >\n {item.label}\n </span>\n )}\n </span>\n {!isLast && (\n <span className={styles.separator} aria-hidden>\n {separator}\n </span>\n )}\n </Fragment>\n );\n })}\n </nav>\n );\n}\n"],"mappings":";;;;;AAsBA,SAAgB,EAAY,EAAE,UAAO,eAAY,KAAK,gBAA+B;CACjF,OACI,kBAAC,OAAD;EAAK,cAAW;EAAa,WAAW,EAAG,EAAO,KAAK,CAAS;EAC3D,UAAA,EAAM,KAAK,GAAM,MAAU;GACxB,IAAM,IAAS,MAAU,EAAM,SAAS,GAClC,IAAc,CAAC,MAAW,EAAK,QAAQ,EAAK;GAClD,OACI,kBAAC,GAAD,EAAA,UAAA,CACI,kBAAC,QAAD;IAAM,WAAW,EAAO;IACnB,UAAA,IACG,kBAAC,KAAD;KACI,MAAM,EAAK;KACX,UAAU,MAAU;MAChB,AAAI,EAAK,YACL,EAAM,eAAe,GACrB,EAAK,QAAQ;KAErB;KACA,WAAW,EAAO;KAEjB,UAAA,EAAK;IACP,CAAA,IAEH,kBAAC,QAAD;KACI,gBAAc,IAAS,SAAS,KAAA;KAChC,WAAW,IAAS,EAAO,UAAU,KAAA;KAEpC,UAAA,EAAK;IACJ,CAAA;GAER,CAAA,GACL,CAAC,KACE,kBAAC,QAAD;IAAM,WAAW,EAAO;IAAW,eAAA;IAC9B,UAAA;GACC,CAAA,CAEJ,EAAA,GA7BK,CA6BL;EAElB,CAAC;CACA,CAAA;AAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Button.cjs","names":[],"sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — this is the design system's button: variant, size,\n * loading, fullWidth, iconOnly, pill, leftIcon and rightIcon are the whole\n * vocabulary every screen composes from. Eight orthogonal knobs on the most-used\n * component is the API working — the count rule is looking for two components fused\n * together, and there is only one here.\n */\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant =\n \"primary\" | \"secondary\" | \"danger\" | \"success\" | \"ghost\" | \"soft\" | \"outline\" | \"link\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n /** Removes horizontal padding and forces a square footprint (use with `aria-label`). */\n iconOnly?: boolean;\n /** Pill-shaped border radius. */\n pill?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\n/**\n * Primary action button with variants, sizes and a loading state that\n * preserves layout via an absolutely-positioned spinner.\n *\n * Variants: `primary` (solid), `secondary` (neutral), `danger`, `success`,\n * `ghost` (transparent), `soft` (tinted), `outline` (bordered), `link`.\n *\n * Sizes are density-aware — they read from `--tempest-control-height-*`\n * tokens which respond to the `data-tempest-density` attribute.\n */\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n iconOnly = false,\n pill = false,\n leftIcon,\n rightIcon,\n disabled,\n className,\n children,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={cn(\n styles.button,\n styles[variant],\n styles[size],\n iconOnly && styles.iconOnly,\n pill && styles.pill,\n loading && styles.loading,\n fullWidth && styles.fullWidth,\n className,\n )}\n disabled={disabled || loading}\n {...props}\n >\n {loading && (\n <span className={styles.spinner} aria-hidden>\n <SpinnerIcon />\n </span>\n )}\n <span className={cn(styles.content, loading && styles.hiddenText)}>\n {leftIcon}\n {children}\n {rightIcon}\n </span>\n </button>\n );\n}\n\nfunction SpinnerIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21 12a9 9 0 1 1-6.219-8.56\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n"],"mappings":"0GAsCA,SAAgB,EAAO,CACnB,UAAU,UACV,OAAO,KACP,UAAU,GACV,YAAY,GACZ,WAAW,GACX,OAAO,GACP,WACA,YACA,WACA,YACA,WACA,GAAG,GACS,CACZ,OACI,EAAA,EAAA,KAAA,CAAC,SAAD,CACI,UAAW,EAAA,GACP,EAAA,QAAO,OACP,EAAA,QAAO,GACP,EAAA,QAAO,GACP,GAAY,EAAA,QAAO,SACnB,GAAQ,EAAA,QAAO,KACf,GAAW,EAAA,QAAO,QAClB,GAAa,EAAA,QAAO,UACpB,CACJ,EACA,SAAU,GAAY,EACtB,GAAI,WAZR,CAcK,IACG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,QAAS,cAAA,aAC7B,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,CAAA,CACZ,CAAA,GAEV,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,GAAW,EAAA,QAAO,UAAU,WAAhE,CACK,EACA,EACA,CACC,GACF,GAEhB,CAEA,SAAS,GAAc,CACnB,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,uCAEN,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,EAAE,8BACF,OAAO,eACP,YAAY,IACZ,cAAc,OACjB,CAAA,CACA,CAAA,CAEb"}
1
+ {"version":3,"file":"Button.cjs","names":[],"sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — this is the design system's button: variant, size,\n * loading, fullWidth, iconOnly, pill, leftIcon and rightIcon are the whole\n * vocabulary every screen composes from. Eight orthogonal knobs on the most-used\n * component is the API working — the count rule is looking for two components fused\n * together, and there is only one here.\n */\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant =\n \"primary\" | \"secondary\" | \"danger\" | \"success\" | \"ghost\" | \"soft\" | \"outline\" | \"link\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n /** Removes horizontal padding and forces a square footprint (use with `aria-label`). */\n iconOnly?: boolean;\n /** Pill-shaped border radius. */\n pill?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\n/**\n * Primary action button with variants, sizes and a loading state that\n * preserves layout via an absolutely-positioned spinner.\n *\n * Variants: `primary` (solid), `secondary` (neutral), `danger`, `success`,\n * `ghost` (transparent), `soft` (tinted), `outline` (bordered), `link`.\n *\n * Sizes are density-aware — they read from `--tempest-control-height-*`\n * tokens which respond to the `data-tempest-density` attribute.\n */\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n iconOnly = false,\n pill = false,\n leftIcon,\n rightIcon,\n disabled,\n className,\n children,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={cn(\n styles.button,\n styles[variant],\n styles[size],\n iconOnly && styles.iconOnly,\n pill && styles.pill,\n loading && styles.loading,\n fullWidth && styles.fullWidth,\n className,\n )}\n disabled={disabled || loading}\n {...props}\n >\n {loading && (\n <span className={styles.spinner} aria-hidden>\n <SpinnerIcon />\n </span>\n )}\n <span className={cn(styles.content, loading && styles.hiddenText)}>\n {leftIcon}\n {children}\n {rightIcon}\n </span>\n </button>\n );\n}\n\nfunction SpinnerIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21 12a9 9 0 1 1-6.219-8.56\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n"],"mappings":"0GAsCA,SAAgB,EAAO,CACnB,UAAU,UACV,OAAO,KACP,UAAU,GACV,YAAY,GACZ,WAAW,GACX,OAAO,GACP,WACA,YACA,WACA,YACA,WACA,GAAG,GACS,CACZ,OACI,EAAA,EAAA,KAAA,CAAC,SAAD,CACI,UAAW,EAAA,GACP,EAAA,QAAO,OACP,EAAA,QAAO,GACP,EAAA,QAAO,GACP,GAAY,EAAA,QAAO,SACnB,GAAQ,EAAA,QAAO,KACf,GAAW,EAAA,QAAO,QAClB,GAAa,EAAA,QAAO,UACpB,CACJ,EACA,SAAU,GAAY,EACtB,GAAI,EAZR,SAAA,CAcK,IACG,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAA,QAAO,QAAS,cAAA,GAC7B,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,CAAA,CACZ,CAAA,GAEV,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAA,GAAG,EAAA,QAAO,QAAS,GAAW,EAAA,QAAO,UAAU,EAAhE,SAAA,CACK,EACA,EACA,CACC,CACF,CAAA,CAAA,GAEhB,CAEA,SAAS,GAAc,CACnB,OACI,EAAA,EAAA,IAAA,CAAC,MAAD,CACI,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CACI,EAAE,8BACF,OAAO,eACP,YAAY,IACZ,cAAc,OACjB,CAAA,CACA,CAAA,CAEb"}
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","names":[],"sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — this is the design system's button: variant, size,\n * loading, fullWidth, iconOnly, pill, leftIcon and rightIcon are the whole\n * vocabulary every screen composes from. Eight orthogonal knobs on the most-used\n * component is the API working — the count rule is looking for two components fused\n * together, and there is only one here.\n */\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant =\n \"primary\" | \"secondary\" | \"danger\" | \"success\" | \"ghost\" | \"soft\" | \"outline\" | \"link\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n /** Removes horizontal padding and forces a square footprint (use with `aria-label`). */\n iconOnly?: boolean;\n /** Pill-shaped border radius. */\n pill?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\n/**\n * Primary action button with variants, sizes and a loading state that\n * preserves layout via an absolutely-positioned spinner.\n *\n * Variants: `primary` (solid), `secondary` (neutral), `danger`, `success`,\n * `ghost` (transparent), `soft` (tinted), `outline` (bordered), `link`.\n *\n * Sizes are density-aware — they read from `--tempest-control-height-*`\n * tokens which respond to the `data-tempest-density` attribute.\n */\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n iconOnly = false,\n pill = false,\n leftIcon,\n rightIcon,\n disabled,\n className,\n children,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={cn(\n styles.button,\n styles[variant],\n styles[size],\n iconOnly && styles.iconOnly,\n pill && styles.pill,\n loading && styles.loading,\n fullWidth && styles.fullWidth,\n className,\n )}\n disabled={disabled || loading}\n {...props}\n >\n {loading && (\n <span className={styles.spinner} aria-hidden>\n <SpinnerIcon />\n </span>\n )}\n <span className={cn(styles.content, loading && styles.hiddenText)}>\n {leftIcon}\n {children}\n {rightIcon}\n </span>\n </button>\n );\n}\n\nfunction SpinnerIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21 12a9 9 0 1 1-6.219-8.56\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n"],"mappings":";;;;AAsCA,SAAgB,EAAO,EACnB,aAAU,WACV,UAAO,MACP,aAAU,IACV,eAAY,IACZ,cAAW,IACX,UAAO,IACP,aACA,cACA,aACA,cACA,aACA,GAAG,KACS;CACZ,OACI,kBAAC,UAAD;EACI,WAAW,EACP,EAAO,QACP,EAAO,IACP,EAAO,IACP,KAAY,EAAO,UACnB,KAAQ,EAAO,MACf,KAAW,EAAO,SAClB,KAAa,EAAO,WACpB,CACJ;EACA,UAAU,KAAY;EACtB,GAAI;YAZR,CAcK,KACG,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAS,eAAA;aAC7B,kBAAC,GAAD,CAAc,CAAA;EACZ,CAAA,GAEV,kBAAC,QAAD;GAAM,WAAW,EAAG,EAAO,SAAS,KAAW,EAAO,UAAU;aAAhE;IACK;IACA;IACA;GACC;IACF;;AAEhB;AAEA,SAAS,IAAc;CACnB,OACI,kBAAC,OAAD;EACI,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;YAEN,kBAAC,QAAD;GACI,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;EACjB,CAAA;CACA,CAAA;AAEb"}
1
+ {"version":3,"file":"Button.js","names":[],"sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — this is the design system's button: variant, size,\n * loading, fullWidth, iconOnly, pill, leftIcon and rightIcon are the whole\n * vocabulary every screen composes from. Eight orthogonal knobs on the most-used\n * component is the API working — the count rule is looking for two components fused\n * together, and there is only one here.\n */\nimport type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Button.module.css\";\n\nexport type ButtonVariant =\n \"primary\" | \"secondary\" | \"danger\" | \"success\" | \"ghost\" | \"soft\" | \"outline\" | \"link\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n /** Removes horizontal padding and forces a square footprint (use with `aria-label`). */\n iconOnly?: boolean;\n /** Pill-shaped border radius. */\n pill?: boolean;\n leftIcon?: ReactNode;\n rightIcon?: ReactNode;\n}\n\n/**\n * Primary action button with variants, sizes and a loading state that\n * preserves layout via an absolutely-positioned spinner.\n *\n * Variants: `primary` (solid), `secondary` (neutral), `danger`, `success`,\n * `ghost` (transparent), `soft` (tinted), `outline` (bordered), `link`.\n *\n * Sizes are density-aware — they read from `--tempest-control-height-*`\n * tokens which respond to the `data-tempest-density` attribute.\n */\nexport function Button({\n variant = \"primary\",\n size = \"md\",\n loading = false,\n fullWidth = false,\n iconOnly = false,\n pill = false,\n leftIcon,\n rightIcon,\n disabled,\n className,\n children,\n ...props\n}: ButtonProps) {\n return (\n <button\n className={cn(\n styles.button,\n styles[variant],\n styles[size],\n iconOnly && styles.iconOnly,\n pill && styles.pill,\n loading && styles.loading,\n fullWidth && styles.fullWidth,\n className,\n )}\n disabled={disabled || loading}\n {...props}\n >\n {loading && (\n <span className={styles.spinner} aria-hidden>\n <SpinnerIcon />\n </span>\n )}\n <span className={cn(styles.content, loading && styles.hiddenText)}>\n {leftIcon}\n {children}\n {rightIcon}\n </span>\n </button>\n );\n}\n\nfunction SpinnerIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M21 12a9 9 0 1 1-6.219-8.56\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n"],"mappings":";;;;AAsCA,SAAgB,EAAO,EACnB,aAAU,WACV,UAAO,MACP,aAAU,IACV,eAAY,IACZ,cAAW,IACX,UAAO,IACP,aACA,cACA,aACA,cACA,aACA,GAAG,KACS;CACZ,OACI,kBAAC,UAAD;EACI,WAAW,EACP,EAAO,QACP,EAAO,IACP,EAAO,IACP,KAAY,EAAO,UACnB,KAAQ,EAAO,MACf,KAAW,EAAO,SAClB,KAAa,EAAO,WACpB,CACJ;EACA,UAAU,KAAY;EACtB,GAAI;EAZR,UAAA,CAcK,KACG,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAS,eAAA;GAC7B,UAAA,kBAAC,GAAD,CAAc,CAAA;EACZ,CAAA,GAEV,kBAAC,QAAD;GAAM,WAAW,EAAG,EAAO,SAAS,KAAW,EAAO,UAAU;GAAhE,UAAA;IACK;IACA;IACA;GACC;EACF,CAAA,CAAA;;AAEhB;AAEA,SAAS,IAAc;CACnB,OACI,kBAAC,OAAD;EACI,OAAM;EACN,QAAO;EACP,SAAQ;EACR,MAAK;EACL,OAAM;EAEN,UAAA,kBAAC,QAAD;GACI,GAAE;GACF,QAAO;GACP,aAAY;GACZ,eAAc;EACjB,CAAA;CACA,CAAA;AAEb"}
@@ -1,2 +1,2 @@
1
- const e=require("../../utils/cn.cjs"),t=require("./Calendar.module.cjs");let n=require("react"),r=require("react/jsx-runtime");var i=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],a=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],o=42;function s(e,t,n){return new Date(e,t,n)}function c(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function l(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function u(e,t,n){let r=c(e).getTime();return!!(t&&r<c(t).getTime()||n&&r>c(n).getTime())}function d(e,t){let n=e.getFullYear(),r=e.getMonth(),i=s(n,r,1-(s(n,r,1).getDay()-t+7)%7),a=[];for(let e=0;e<o;e+=1)a.push(s(i.getFullYear(),i.getMonth(),i.getDate()+e));return a}function f({value:f,defaultValue:p,onChange:m,month:h,onMonthChange:g,minDate:_,maxDate:v,weekStartsOn:y=0,className:b,...x}){let S=f!==void 0,[C,w]=(0,n.useState)(p),T=S?f:C,E=h!==void 0,[D,O]=(0,n.useState)(()=>{let e=h??f??p??new Date;return s(e.getFullYear(),e.getMonth(),1)}),k=E?s(h.getFullYear(),h.getMonth(),1):D,[A,j]=(0,n.useState)(null),M=(0,n.useRef)(null),N=(0,n.useMemo)(()=>c(new Date),[]),P=(0,n.useMemo)(()=>d(k,y),[k,y]),F=(0,n.useMemo)(()=>Array.from({length:7},(e,t)=>i[(t+y)%7]),[y]),I=(0,n.useCallback)(e=>{let t=s(k.getFullYear(),k.getMonth()+e,1);g&&g(t),E||O(t)},[k,g,E]),L=(0,n.useCallback)(e=>{u(e,_,v)||(m&&m(e),S||w(e))},[_,v,m,S]),R=(0,n.useCallback)(e=>{let t=Math.max(0,Math.min(o-1,e));j(t);let n=M.current;n&&n.querySelectorAll(`button[data-day]`)[t]?.focus()},[]),z=(0,n.useCallback)((e,t)=>{switch(e.key){case`ArrowLeft`:e.preventDefault(),R(t-1);break;case`ArrowRight`:e.preventDefault(),R(t+1);break;case`ArrowUp`:e.preventDefault(),R(t-7);break;case`ArrowDown`:e.preventDefault(),R(t+7);break;case`Enter`:case` `:e.preventDefault(),L(P[t]);break;default:break}},[R,L,P]);return(0,r.jsxs)(`div`,{className:e.cn(t.default.root,b),...x,children:[(0,r.jsxs)(`div`,{className:t.default.header,children:[(0,r.jsx)(`button`,{type:`button`,className:t.default.nav,"aria-label":`Previous month`,onClick:()=>I(-1),children:`‹`}),(0,r.jsxs)(`span`,{className:t.default.title,"aria-live":`polite`,children:[a[k.getMonth()],` `,k.getFullYear()]}),(0,r.jsx)(`button`,{type:`button`,className:t.default.nav,"aria-label":`Next month`,onClick:()=>I(1),children:`›`})]}),(0,r.jsx)(`div`,{className:t.default.weekdays,role:`row`,children:F.map(e=>(0,r.jsx)(`span`,{className:t.default.weekday,role:`columnheader`,children:e},e))}),(0,r.jsx)(`div`,{className:t.default.grid,role:`grid`,ref:M,children:P.map((n,i)=>{let a=n.getMonth()===k.getMonth(),o=T?l(n,T):!1,s=l(n,N),c=u(n,_,v),d=A===null?a&&n.getDate()===1:A===i;return(0,r.jsx)(`button`,{type:`button`,"data-day":!0,role:`gridcell`,className:e.cn(t.default.day,!a&&t.default.outside,o&&t.default.selected,s&&t.default.today),"aria-pressed":o,"aria-selected":o,"aria-current":s?`date`:void 0,disabled:c,tabIndex:d?0:-1,onClick:()=>L(n),onKeyDown:e=>z(e,i),children:n.getDate()},i)})})]})}exports.Calendar=f;
1
+ const e=require("../../utils/cn.cjs"),t=require("./Calendar.module.cjs");let n=require("react"),r=require("react/jsx-runtime");var i=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`],a=[`January`,`February`,`March`,`April`,`May`,`June`,`July`,`August`,`September`,`October`,`November`,`December`],o=42;function s(e,t,n){return new Date(e,t,n)}function c(e){return new Date(e.getFullYear(),e.getMonth(),e.getDate())}function l(e,t){return e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate()}function u(e,t,n){let r=c(e).getTime();return!!(t&&r<c(t).getTime()||n&&r>c(n).getTime())}function d(e,t){let n=e.getFullYear(),r=e.getMonth(),i=s(n,r,1-(s(n,r,1).getDay()-t+7)%7),a=[];for(let e=0;e<o;e+=1)a.push(s(i.getFullYear(),i.getMonth(),i.getDate()+e));return a}function f({value:o,defaultValue:f,onChange:p,month:m,onMonthChange:h,minDate:g,maxDate:_,weekStartsOn:v=0,className:y,...b}){let x=o!==void 0,[S,C]=(0,n.useState)(f),w=x?o:S,T=m!==void 0,[E,D]=(0,n.useState)(()=>{let e=m??o??f??new Date;return s(e.getFullYear(),e.getMonth(),1)}),O=T?s(m.getFullYear(),m.getMonth(),1):E,[k,A]=(0,n.useState)(null),j=(0,n.useRef)(null),M=(0,n.useMemo)(()=>c(new Date),[]),N=(0,n.useMemo)(()=>d(O,v),[O,v]),P=(0,n.useMemo)(()=>Array.from({length:7},(e,t)=>i[(t+v)%7]),[v]),F=(0,n.useCallback)(e=>{let t=s(O.getFullYear(),O.getMonth()+e,1);h&&h(t),T||D(t)},[O,h,T]),I=(0,n.useCallback)(e=>{u(e,g,_)||(p&&p(e),x||C(e))},[g,_,p,x]),L=(0,n.useCallback)(e=>{let t=Math.max(0,Math.min(41,e));A(t);let n=j.current;n&&n.querySelectorAll(`button[data-day]`)[t]?.focus()},[]),R=(0,n.useCallback)((e,t)=>{switch(e.key){case`ArrowLeft`:e.preventDefault(),L(t-1);break;case`ArrowRight`:e.preventDefault(),L(t+1);break;case`ArrowUp`:e.preventDefault(),L(t-7);break;case`ArrowDown`:e.preventDefault(),L(t+7);break;case`Enter`:case` `:e.preventDefault(),I(N[t])}},[L,I,N]);return(0,r.jsxs)(`div`,{className:e.cn(t.default.root,y),...b,children:[(0,r.jsxs)(`div`,{className:t.default.header,children:[(0,r.jsx)(`button`,{type:`button`,className:t.default.nav,"aria-label":`Previous month`,onClick:()=>F(-1),children:`‹`}),(0,r.jsxs)(`span`,{className:t.default.title,"aria-live":`polite`,children:[a[O.getMonth()],` `,O.getFullYear()]}),(0,r.jsx)(`button`,{type:`button`,className:t.default.nav,"aria-label":`Next month`,onClick:()=>F(1),children:`›`})]}),(0,r.jsx)(`div`,{className:t.default.weekdays,role:`row`,children:P.map(e=>(0,r.jsx)(`span`,{className:t.default.weekday,role:`columnheader`,children:e},e))}),(0,r.jsx)(`div`,{className:t.default.grid,role:`grid`,ref:j,children:N.map((n,i)=>{let a=n.getMonth()===O.getMonth(),o=w?l(n,w):!1,s=l(n,M),c=u(n,g,_),d=k===null?a&&n.getDate()===1:k===i;return(0,r.jsx)(`button`,{type:`button`,"data-day":!0,role:`gridcell`,className:e.cn(t.default.day,!a&&t.default.outside,o&&t.default.selected,s&&t.default.today),"aria-pressed":o,"aria-selected":o,"aria-current":s?`date`:void 0,disabled:c,tabIndex:d?0:-1,onClick:()=>I(n),onKeyDown:e=>R(e,i),children:n.getDate()},i)})})]})}exports.Calendar=f;
2
2
  //# sourceMappingURL=Calendar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Calendar.cjs","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — a date grid is\n * controlled two ways at once — the selected day (value, defaultValue, onChange) and\n * the visible month (month, onMonthChange) — inside the bounds (minDate, maxDate,\n * weekStartsOn). The body builds the grid and owns roving focus and keyboard\n * navigation, which read the same cursor date.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Calendar.module.css\";\n\nexport type WeekStart = 0 | 1;\n\nexport interface CalendarProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\"\n> {\n /** Controlled selected date. */\n value?: Date;\n /** Initial selected date for the uncontrolled case. */\n defaultValue?: Date;\n /** Called with the newly selected date. */\n onChange?: (date: Date) => void;\n /** Controlled visible month (any day within it). */\n month?: Date;\n /** Called when the visible month changes (prev/next). */\n onMonthChange?: (month: Date) => void;\n /** Earliest selectable date (inclusive). */\n minDate?: Date;\n /** Latest selectable date (inclusive). */\n maxDate?: Date;\n /** First column of the week — `0` Sunday (default) or `1` Monday. */\n weekStartsOn?: WeekStart;\n}\n\nconst WEEKDAY_LABELS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nconst DAYS_IN_GRID = 42;\n\n/**\n * Build a `Date` at midnight local time for the given year/month/day.\n *\n * @param year - Full year.\n * @param month - Zero-based month index.\n * @param day - Day of the month.\n * @returns A normalized `Date`.\n */\nfunction makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month, day);\n}\n\n/**\n * Strip the time portion so two dates can be compared by calendar day.\n *\n * @param date - The date to normalize.\n * @returns A new `Date` at local midnight.\n */\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n/**\n * Whether two dates fall on the same calendar day.\n *\n * @param a - First date.\n * @param b - Second date.\n * @returns `true` when year, month and day match.\n */\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/**\n * Whether a date is outside the inclusive `[minDate, maxDate]` window.\n *\n * @param date - The candidate day.\n * @param minDate - Optional lower bound.\n * @param maxDate - Optional upper bound.\n * @returns `true` when the date is disabled.\n */\nfunction isOutOfRange(date: Date, minDate?: Date, maxDate?: Date): boolean {\n const day = startOfDay(date).getTime();\n if (minDate && day < startOfDay(minDate).getTime()) return true;\n if (maxDate && day > startOfDay(maxDate).getTime()) return true;\n return false;\n}\n\n/**\n * Compute the 42-cell (6x7) grid of dates covering the given month, padded with\n * leading/trailing days from the adjacent months.\n *\n * @param month - Any date within the target month.\n * @param weekStartsOn - First column of the week.\n * @returns An array of 42 `Date` objects.\n */\nfunction buildGrid(month: Date, weekStartsOn: WeekStart): Date[] {\n const year = month.getFullYear();\n const monthIndex = month.getMonth();\n const firstOfMonth = makeDate(year, monthIndex, 1);\n const firstWeekday = firstOfMonth.getDay();\n const leading = (firstWeekday - weekStartsOn + 7) % 7;\n const start = makeDate(year, monthIndex, 1 - leading);\n\n const cells: Date[] = [];\n for (let i = 0; i < DAYS_IN_GRID; i += 1) {\n cells.push(makeDate(start.getFullYear(), start.getMonth(), start.getDate() + i));\n }\n return cells;\n}\n\n/**\n * Standalone month-grid date picker. Renders a header with the month/year and\n * prev/next buttons, a weekday row, and a 6x7 grid of day buttons. Selection and\n * the visible month can each be controlled or uncontrolled. Grid arithmetic uses\n * plain `Date` math — no external date libraries.\n *\n * Keyboard: arrow keys move focus by day (left/right) or week (up/down), and\n * Enter/Space selects the focused day.\n */\nexport function Calendar({\n value,\n defaultValue,\n onChange,\n month,\n onMonthChange,\n minDate,\n maxDate,\n weekStartsOn = 0,\n className,\n ...props\n}: CalendarProps) {\n const isSelectionControlled = value !== undefined;\n const [internalSelected, setInternalSelected] = useState<Date | undefined>(defaultValue);\n const selected = isSelectionControlled ? value : internalSelected;\n\n const isMonthControlled = month !== undefined;\n const [internalMonth, setInternalMonth] = useState<Date>(() => {\n const base = month ?? value ?? defaultValue ?? new Date();\n return makeDate(base.getFullYear(), base.getMonth(), 1);\n });\n const visibleMonth = isMonthControlled\n ? makeDate(month.getFullYear(), month.getMonth(), 1)\n : internalMonth;\n\n const [focusedDay, setFocusedDay] = useState<number | null>(null);\n const gridRef = useRef<HTMLDivElement | null>(null);\n\n const today = useMemo(() => startOfDay(new Date()), []);\n const cells = useMemo(\n () => buildGrid(visibleMonth, weekStartsOn),\n [visibleMonth, weekStartsOn],\n );\n\n const weekdayLabels = useMemo(() => {\n return Array.from({ length: 7 }, (_, i) => WEEKDAY_LABELS[(i + weekStartsOn) % 7]);\n }, [weekStartsOn]);\n\n const changeMonth = useCallback(\n (offset: number): void => {\n const next = makeDate(visibleMonth.getFullYear(), visibleMonth.getMonth() + offset, 1);\n if (onMonthChange) onMonthChange(next);\n if (!isMonthControlled) setInternalMonth(next);\n },\n [visibleMonth, onMonthChange, isMonthControlled],\n );\n\n const selectDate = useCallback(\n (date: Date): void => {\n if (isOutOfRange(date, minDate, maxDate)) return;\n if (onChange) onChange(date);\n if (!isSelectionControlled) setInternalSelected(date);\n },\n [minDate, maxDate, onChange, isSelectionControlled],\n );\n\n const focusCell = useCallback((index: number): void => {\n const clamped = Math.max(0, Math.min(DAYS_IN_GRID - 1, index));\n setFocusedDay(clamped);\n const grid = gridRef.current;\n if (!grid) return;\n const buttons = grid.querySelectorAll<HTMLButtonElement>(\"button[data-day]\");\n buttons[clamped]?.focus();\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number): void => {\n switch (event.key) {\n case \"ArrowLeft\":\n event.preventDefault();\n focusCell(index - 1);\n break;\n case \"ArrowRight\":\n event.preventDefault();\n focusCell(index + 1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n focusCell(index - 7);\n break;\n case \"ArrowDown\":\n event.preventDefault();\n focusCell(index + 7);\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n selectDate(cells[index]);\n break;\n default:\n break;\n }\n },\n [focusCell, selectDate, cells],\n );\n\n return (\n <div className={cn(styles.root, className)} {...props}>\n <div className={styles.header}>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Previous month\"\n onClick={() => changeMonth(-1)}\n >\n {\"‹\"}\n </button>\n <span className={styles.title} aria-live=\"polite\">\n {MONTH_LABELS[visibleMonth.getMonth()]} {visibleMonth.getFullYear()}\n </span>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Next month\"\n onClick={() => changeMonth(1)}\n >\n {\"›\"}\n </button>\n </div>\n\n <div className={styles.weekdays} role=\"row\">\n {weekdayLabels.map((label) => (\n <span key={label} className={styles.weekday} role=\"columnheader\">\n {label}\n </span>\n ))}\n </div>\n\n <div className={styles.grid} role=\"grid\" ref={gridRef}>\n {cells.map((date, index) => {\n const inMonth = date.getMonth() === visibleMonth.getMonth();\n const isSelected = selected ? isSameDay(date, selected) : false;\n const isToday = isSameDay(date, today);\n const disabled = isOutOfRange(date, minDate, maxDate);\n const isFocusTarget =\n focusedDay === null\n ? inMonth && date.getDate() === 1\n : focusedDay === index;\n return (\n <button\n key={index}\n type=\"button\"\n data-day\n role=\"gridcell\"\n className={cn(\n styles.day,\n !inMonth && styles.outside,\n isSelected && styles.selected,\n isToday && styles.today,\n )}\n aria-pressed={isSelected}\n aria-selected={isSelected}\n aria-current={isToday ? \"date\" : undefined}\n disabled={disabled}\n tabIndex={isFocusTarget ? 0 : -1}\n onClick={() => selectDate(date)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Calendar.cjs","names":[],"sources":["../../../src/components/Calendar/Calendar.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — a date grid is\n * controlled two ways at once — the selected day (value, defaultValue, onChange) and\n * the visible month (month, onMonthChange) — inside the bounds (minDate, maxDate,\n * weekStartsOn). The body builds the grid and owns roving focus and keyboard\n * navigation, which read the same cursor date.\n */\nimport { useCallback, useMemo, useRef, useState } from \"react\";\nimport type { HTMLAttributes, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Calendar.module.css\";\n\nexport type WeekStart = 0 | 1;\n\nexport interface CalendarProps extends Omit<\n HTMLAttributes<HTMLDivElement>,\n \"onChange\" | \"defaultValue\"\n> {\n /** Controlled selected date. */\n value?: Date;\n /** Initial selected date for the uncontrolled case. */\n defaultValue?: Date;\n /** Called with the newly selected date. */\n onChange?: (date: Date) => void;\n /** Controlled visible month (any day within it). */\n month?: Date;\n /** Called when the visible month changes (prev/next). */\n onMonthChange?: (month: Date) => void;\n /** Earliest selectable date (inclusive). */\n minDate?: Date;\n /** Latest selectable date (inclusive). */\n maxDate?: Date;\n /** First column of the week — `0` Sunday (default) or `1` Monday. */\n weekStartsOn?: WeekStart;\n}\n\nconst WEEKDAY_LABELS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\nconst MONTH_LABELS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nconst DAYS_IN_GRID = 42;\n\n/**\n * Build a `Date` at midnight local time for the given year/month/day.\n *\n * @param year - Full year.\n * @param month - Zero-based month index.\n * @param day - Day of the month.\n * @returns A normalized `Date`.\n */\nfunction makeDate(year: number, month: number, day: number): Date {\n return new Date(year, month, day);\n}\n\n/**\n * Strip the time portion so two dates can be compared by calendar day.\n *\n * @param date - The date to normalize.\n * @returns A new `Date` at local midnight.\n */\nfunction startOfDay(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\n}\n\n/**\n * Whether two dates fall on the same calendar day.\n *\n * @param a - First date.\n * @param b - Second date.\n * @returns `true` when year, month and day match.\n */\nfunction isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\n/**\n * Whether a date is outside the inclusive `[minDate, maxDate]` window.\n *\n * @param date - The candidate day.\n * @param minDate - Optional lower bound.\n * @param maxDate - Optional upper bound.\n * @returns `true` when the date is disabled.\n */\nfunction isOutOfRange(date: Date, minDate?: Date, maxDate?: Date): boolean {\n const day = startOfDay(date).getTime();\n if (minDate && day < startOfDay(minDate).getTime()) return true;\n if (maxDate && day > startOfDay(maxDate).getTime()) return true;\n return false;\n}\n\n/**\n * Compute the 42-cell (6x7) grid of dates covering the given month, padded with\n * leading/trailing days from the adjacent months.\n *\n * @param month - Any date within the target month.\n * @param weekStartsOn - First column of the week.\n * @returns An array of 42 `Date` objects.\n */\nfunction buildGrid(month: Date, weekStartsOn: WeekStart): Date[] {\n const year = month.getFullYear();\n const monthIndex = month.getMonth();\n const firstOfMonth = makeDate(year, monthIndex, 1);\n const firstWeekday = firstOfMonth.getDay();\n const leading = (firstWeekday - weekStartsOn + 7) % 7;\n const start = makeDate(year, monthIndex, 1 - leading);\n\n const cells: Date[] = [];\n for (let i = 0; i < DAYS_IN_GRID; i += 1) {\n cells.push(makeDate(start.getFullYear(), start.getMonth(), start.getDate() + i));\n }\n return cells;\n}\n\n/**\n * Standalone month-grid date picker. Renders a header with the month/year and\n * prev/next buttons, a weekday row, and a 6x7 grid of day buttons. Selection and\n * the visible month can each be controlled or uncontrolled. Grid arithmetic uses\n * plain `Date` math — no external date libraries.\n *\n * Keyboard: arrow keys move focus by day (left/right) or week (up/down), and\n * Enter/Space selects the focused day.\n */\nexport function Calendar({\n value,\n defaultValue,\n onChange,\n month,\n onMonthChange,\n minDate,\n maxDate,\n weekStartsOn = 0,\n className,\n ...props\n}: CalendarProps) {\n const isSelectionControlled = value !== undefined;\n const [internalSelected, setInternalSelected] = useState<Date | undefined>(defaultValue);\n const selected = isSelectionControlled ? value : internalSelected;\n\n const isMonthControlled = month !== undefined;\n const [internalMonth, setInternalMonth] = useState<Date>(() => {\n const base = month ?? value ?? defaultValue ?? new Date();\n return makeDate(base.getFullYear(), base.getMonth(), 1);\n });\n const visibleMonth = isMonthControlled\n ? makeDate(month.getFullYear(), month.getMonth(), 1)\n : internalMonth;\n\n const [focusedDay, setFocusedDay] = useState<number | null>(null);\n const gridRef = useRef<HTMLDivElement | null>(null);\n\n const today = useMemo(() => startOfDay(new Date()), []);\n const cells = useMemo(\n () => buildGrid(visibleMonth, weekStartsOn),\n [visibleMonth, weekStartsOn],\n );\n\n const weekdayLabels = useMemo(() => {\n return Array.from({ length: 7 }, (_, i) => WEEKDAY_LABELS[(i + weekStartsOn) % 7]);\n }, [weekStartsOn]);\n\n const changeMonth = useCallback(\n (offset: number): void => {\n const next = makeDate(visibleMonth.getFullYear(), visibleMonth.getMonth() + offset, 1);\n if (onMonthChange) onMonthChange(next);\n if (!isMonthControlled) setInternalMonth(next);\n },\n [visibleMonth, onMonthChange, isMonthControlled],\n );\n\n const selectDate = useCallback(\n (date: Date): void => {\n if (isOutOfRange(date, minDate, maxDate)) return;\n if (onChange) onChange(date);\n if (!isSelectionControlled) setInternalSelected(date);\n },\n [minDate, maxDate, onChange, isSelectionControlled],\n );\n\n const focusCell = useCallback((index: number): void => {\n const clamped = Math.max(0, Math.min(DAYS_IN_GRID - 1, index));\n setFocusedDay(clamped);\n const grid = gridRef.current;\n if (!grid) return;\n const buttons = grid.querySelectorAll<HTMLButtonElement>(\"button[data-day]\");\n buttons[clamped]?.focus();\n }, []);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLButtonElement>, index: number): void => {\n switch (event.key) {\n case \"ArrowLeft\":\n event.preventDefault();\n focusCell(index - 1);\n break;\n case \"ArrowRight\":\n event.preventDefault();\n focusCell(index + 1);\n break;\n case \"ArrowUp\":\n event.preventDefault();\n focusCell(index - 7);\n break;\n case \"ArrowDown\":\n event.preventDefault();\n focusCell(index + 7);\n break;\n case \"Enter\":\n case \" \":\n event.preventDefault();\n selectDate(cells[index]);\n break;\n default:\n break;\n }\n },\n [focusCell, selectDate, cells],\n );\n\n return (\n <div className={cn(styles.root, className)} {...props}>\n <div className={styles.header}>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Previous month\"\n onClick={() => changeMonth(-1)}\n >\n {\"‹\"}\n </button>\n <span className={styles.title} aria-live=\"polite\">\n {MONTH_LABELS[visibleMonth.getMonth()]} {visibleMonth.getFullYear()}\n </span>\n <button\n type=\"button\"\n className={styles.nav}\n aria-label=\"Next month\"\n onClick={() => changeMonth(1)}\n >\n {\"›\"}\n </button>\n </div>\n\n <div className={styles.weekdays} role=\"row\">\n {weekdayLabels.map((label) => (\n <span key={label} className={styles.weekday} role=\"columnheader\">\n {label}\n </span>\n ))}\n </div>\n\n <div className={styles.grid} role=\"grid\" ref={gridRef}>\n {cells.map((date, index) => {\n const inMonth = date.getMonth() === visibleMonth.getMonth();\n const isSelected = selected ? isSameDay(date, selected) : false;\n const isToday = isSameDay(date, today);\n const disabled = isOutOfRange(date, minDate, maxDate);\n const isFocusTarget =\n focusedDay === null\n ? inMonth && date.getDate() === 1\n : focusedDay === index;\n return (\n <button\n key={index}\n type=\"button\"\n data-day\n role=\"gridcell\"\n className={cn(\n styles.day,\n !inMonth && styles.outside,\n isSelected && styles.selected,\n isToday && styles.today,\n )}\n aria-pressed={isSelected}\n aria-selected={isSelected}\n aria-current={isToday ? \"date\" : undefined}\n disabled={disabled}\n tabIndex={isFocusTarget ? 0 : -1}\n onClick={() => selectDate(date)}\n onKeyDown={(event) => handleKeyDown(event, index)}\n >\n {date.getDate()}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}