tempest-react-sdk 0.78.0 → 0.80.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/bin/lib/openapi/generate.hostile.test.mjs +45 -4
- package/bin/lib/openapi/generate.mjs +303 -88
- package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
- package/bin/lib/openapi/generate.test.mjs +462 -1
- package/bin/lib/openapi/schema-to-zod.mjs +4 -3
- package/dist/access/Can.cjs.map +1 -1
- package/dist/access/Can.js.map +1 -1
- package/dist/access/access-control-context.cjs.map +1 -1
- package/dist/access/access-control-context.js.map +1 -1
- package/dist/access/create-role-access-control.cjs.map +1 -1
- package/dist/access/create-role-access-control.js.map +1 -1
- package/dist/access/permissions-from-token.cjs.map +1 -1
- package/dist/access/permissions-from-token.js.map +1 -1
- package/dist/access/use-can.cjs.map +1 -1
- package/dist/access/use-can.js.map +1 -1
- package/dist/app/AppProviders.cjs.map +1 -1
- package/dist/app/AppProviders.js.map +1 -1
- package/dist/audio/audio-bus.cjs.map +1 -1
- package/dist/audio/audio-bus.js.map +1 -1
- package/dist/audio/audio-output.cjs.map +1 -1
- package/dist/audio/audio-output.js.map +1 -1
- package/dist/audio/audio-player.cjs.map +1 -1
- package/dist/audio/audio-player.js.map +1 -1
- package/dist/audio/audio-recorder.cjs.map +1 -1
- package/dist/audio/audio-recorder.js.map +1 -1
- package/dist/audio/duration.cjs.map +1 -1
- package/dist/audio/duration.js.map +1 -1
- package/dist/audio/level-meter.cjs.map +1 -1
- package/dist/audio/level-meter.js.map +1 -1
- package/dist/audio/media-access.cjs.map +1 -1
- package/dist/audio/media-access.js.map +1 -1
- package/dist/audio/noise-floor.cjs.map +1 -1
- package/dist/audio/noise-floor.js.map +1 -1
- package/dist/audio/sfx-pool.cjs.map +1 -1
- package/dist/audio/sfx-pool.js.map +1 -1
- package/dist/audio/use-audio-bus.cjs.map +1 -1
- package/dist/audio/use-audio-bus.js.map +1 -1
- package/dist/audio/use-audio-recorder.cjs.map +1 -1
- package/dist/audio/use-audio-recorder.js.map +1 -1
- package/dist/audio/use-audio.cjs.map +1 -1
- package/dist/audio/use-audio.js.map +1 -1
- package/dist/audio/use-microphone.cjs +1 -1
- package/dist/audio/use-microphone.cjs.map +1 -1
- package/dist/audio/use-microphone.js +1 -5
- package/dist/audio/use-microphone.js.map +1 -1
- package/dist/audio/use-sfx-pool.cjs.map +1 -1
- package/dist/audio/use-sfx-pool.js.map +1 -1
- package/dist/audio/voice-activity.cjs.map +1 -1
- package/dist/audio/voice-activity.js.map +1 -1
- package/dist/audio/voice-chain-stages.cjs.map +1 -1
- package/dist/audio/voice-chain-stages.js.map +1 -1
- package/dist/audio/voice-chain.cjs.map +1 -1
- package/dist/audio/voice-chain.js.map +1 -1
- package/dist/audio/wav.cjs.map +1 -1
- package/dist/audio/wav.js.map +1 -1
- package/dist/auth/AuthGuard.cjs.map +1 -1
- package/dist/auth/AuthGuard.js.map +1 -1
- package/dist/auth/create-auth-store.cjs.map +1 -1
- package/dist/auth/create-auth-store.js.map +1 -1
- package/dist/auth/create-tempest-auth.cjs +1 -1
- package/dist/auth/create-tempest-auth.cjs.map +1 -1
- package/dist/auth/create-tempest-auth.js +1 -3
- package/dist/auth/create-tempest-auth.js.map +1 -1
- package/dist/auth/jwt.cjs.map +1 -1
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/lazy-with-retry.cjs.map +1 -1
- package/dist/auth/lazy-with-retry.js.map +1 -1
- package/dist/auth/passkey.cjs.map +1 -1
- package/dist/auth/passkey.js.map +1 -1
- package/dist/auth/refresh-queue.cjs.map +1 -1
- package/dist/auth/refresh-queue.js.map +1 -1
- package/dist/auth/use-passkey.cjs +1 -1
- package/dist/auth/use-passkey.cjs.map +1 -1
- package/dist/auth/use-passkey.js +1 -1
- package/dist/auth/use-passkey.js.map +1 -1
- package/dist/br/BrazilMap.cjs.map +1 -1
- package/dist/br/BrazilMap.js.map +1 -1
- package/dist/br/BrazilMap.module.cjs.map +1 -1
- package/dist/br/BrazilMap.module.js.map +1 -1
- package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
- package/dist/br/BrazilStateCitySelect.js.map +1 -1
- package/dist/br/BrazilStateMap.cjs.map +1 -1
- package/dist/br/BrazilStateMap.js.map +1 -1
- package/dist/br/MapLegend.cjs.map +1 -1
- package/dist/br/MapLegend.js.map +1 -1
- package/dist/br/MapLegend.module.cjs.map +1 -1
- package/dist/br/MapLegend.module.js.map +1 -1
- package/dist/br/MapMarkers.cjs.map +1 -1
- package/dist/br/MapMarkers.js.map +1 -1
- package/dist/br/MapTooltip.cjs.map +1 -1
- package/dist/br/MapTooltip.js.map +1 -1
- package/dist/br/MunicipalitySearch.cjs +1 -1
- package/dist/br/MunicipalitySearch.cjs.map +1 -1
- package/dist/br/MunicipalitySearch.js +2 -5
- package/dist/br/MunicipalitySearch.js.map +1 -1
- package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
- package/dist/br/MunicipalitySearch.module.js.map +1 -1
- package/dist/br/PixQRCode.cjs.map +1 -1
- package/dist/br/PixQRCode.js.map +1 -1
- package/dist/br/PixQRCode.module.cjs.map +1 -1
- package/dist/br/PixQRCode.module.js.map +1 -1
- package/dist/br/boleto.cjs.map +1 -1
- package/dist/br/boleto.js.map +1 -1
- package/dist/br/br-geo.cjs.map +1 -1
- package/dist/br/br-geo.js.map +1 -1
- package/dist/br/data/br-centroids.cjs.map +1 -1
- package/dist/br/data/br-centroids.js.map +1 -1
- package/dist/br/data/br-locations.cjs.map +1 -1
- package/dist/br/data/br-locations.js.map +1 -1
- package/dist/br/data/br-uf-geo.cjs.map +1 -1
- package/dist/br/data/br-uf-geo.js.map +1 -1
- package/dist/br/data/mun/AC.cjs.map +1 -1
- package/dist/br/data/mun/AC.js.map +1 -1
- package/dist/br/data/mun/AL.cjs.map +1 -1
- package/dist/br/data/mun/AL.js.map +1 -1
- package/dist/br/data/mun/AM.cjs.map +1 -1
- package/dist/br/data/mun/AM.js.map +1 -1
- package/dist/br/data/mun/AP.cjs.map +1 -1
- package/dist/br/data/mun/AP.js.map +1 -1
- package/dist/br/data/mun/BA.cjs.map +1 -1
- package/dist/br/data/mun/BA.js.map +1 -1
- package/dist/br/data/mun/CE.cjs.map +1 -1
- package/dist/br/data/mun/CE.js.map +1 -1
- package/dist/br/data/mun/DF.cjs.map +1 -1
- package/dist/br/data/mun/DF.js.map +1 -1
- package/dist/br/data/mun/ES.cjs.map +1 -1
- package/dist/br/data/mun/ES.js.map +1 -1
- package/dist/br/data/mun/GO.cjs.map +1 -1
- package/dist/br/data/mun/GO.js.map +1 -1
- package/dist/br/data/mun/MA.cjs.map +1 -1
- package/dist/br/data/mun/MA.js.map +1 -1
- package/dist/br/data/mun/MG.cjs.map +1 -1
- package/dist/br/data/mun/MG.js.map +1 -1
- package/dist/br/data/mun/MS.cjs.map +1 -1
- package/dist/br/data/mun/MS.js.map +1 -1
- package/dist/br/data/mun/MT.cjs.map +1 -1
- package/dist/br/data/mun/MT.js.map +1 -1
- package/dist/br/data/mun/PA.cjs.map +1 -1
- package/dist/br/data/mun/PA.js.map +1 -1
- package/dist/br/data/mun/PB.cjs.map +1 -1
- package/dist/br/data/mun/PB.js.map +1 -1
- package/dist/br/data/mun/PE.cjs.map +1 -1
- package/dist/br/data/mun/PE.js.map +1 -1
- package/dist/br/data/mun/PI.cjs.map +1 -1
- package/dist/br/data/mun/PI.js.map +1 -1
- package/dist/br/data/mun/PR.cjs.map +1 -1
- package/dist/br/data/mun/PR.js.map +1 -1
- package/dist/br/data/mun/RJ.cjs.map +1 -1
- package/dist/br/data/mun/RJ.js.map +1 -1
- package/dist/br/data/mun/RN.cjs.map +1 -1
- package/dist/br/data/mun/RN.js.map +1 -1
- package/dist/br/data/mun/RO.cjs.map +1 -1
- package/dist/br/data/mun/RO.js.map +1 -1
- package/dist/br/data/mun/RR.cjs.map +1 -1
- package/dist/br/data/mun/RR.js.map +1 -1
- package/dist/br/data/mun/RS.cjs.map +1 -1
- package/dist/br/data/mun/RS.js.map +1 -1
- package/dist/br/data/mun/SC.cjs.map +1 -1
- package/dist/br/data/mun/SC.js.map +1 -1
- package/dist/br/data/mun/SE.cjs.map +1 -1
- package/dist/br/data/mun/SE.js.map +1 -1
- package/dist/br/data/mun/SP.cjs.map +1 -1
- package/dist/br/data/mun/SP.js.map +1 -1
- package/dist/br/data/mun/TO.cjs.map +1 -1
- package/dist/br/data/mun/TO.js.map +1 -1
- package/dist/br/geocode.cjs.map +1 -1
- package/dist/br/geocode.js.map +1 -1
- package/dist/br/holidays.cjs.map +1 -1
- package/dist/br/holidays.js.map +1 -1
- package/dist/br/locations.cjs.map +1 -1
- package/dist/br/locations.js.map +1 -1
- package/dist/br/nfe.cjs.map +1 -1
- package/dist/br/nfe.js.map +1 -1
- package/dist/br/pix.cjs +1 -1
- package/dist/br/pix.cjs.map +1 -1
- package/dist/br/pix.js +108 -74
- package/dist/br/pix.js.map +1 -1
- package/dist/br/regions.cjs.map +1 -1
- package/dist/br/regions.js.map +1 -1
- package/dist/br/scales.cjs.map +1 -1
- package/dist/br/scales.js.map +1 -1
- package/dist/br/state-geo.cjs.map +1 -1
- package/dist/br/state-geo.js.map +1 -1
- package/dist/br/svg-utils.cjs.map +1 -1
- package/dist/br/svg-utils.js.map +1 -1
- package/dist/br/use-map-hover.cjs.map +1 -1
- package/dist/br/use-map-hover.js.map +1 -1
- package/dist/br/use-map-zoom.cjs.map +1 -1
- package/dist/br/use-map-zoom.js.map +1 -1
- package/dist/br/whatsapp.cjs.map +1 -1
- package/dist/br/whatsapp.js.map +1 -1
- package/dist/br.cjs.map +1 -1
- package/dist/br.d.ts +6 -2
- package/dist/br.js.map +1 -1
- package/dist/capture/barcode.cjs.map +1 -1
- package/dist/capture/barcode.js.map +1 -1
- package/dist/capture/media-recorder.cjs.map +1 -1
- package/dist/capture/media-recorder.js.map +1 -1
- package/dist/capture/use-barcode-scanner.cjs.map +1 -1
- package/dist/capture/use-barcode-scanner.js.map +1 -1
- package/dist/capture/use-screen-capture.cjs +1 -1
- package/dist/capture/use-screen-capture.cjs.map +1 -1
- package/dist/capture/use-screen-capture.js +1 -7
- package/dist/capture/use-screen-capture.js.map +1 -1
- package/dist/capture/use-speech-recognition.cjs +1 -1
- package/dist/capture/use-speech-recognition.cjs.map +1 -1
- package/dist/capture/use-speech-recognition.js +35 -36
- package/dist/capture/use-speech-recognition.js.map +1 -1
- package/dist/capture/use-torch.cjs.map +1 -1
- package/dist/capture/use-torch.js.map +1 -1
- package/dist/capture/use-video-recorder.cjs.map +1 -1
- package/dist/capture/use-video-recorder.js.map +1 -1
- package/dist/capture/video-recorder.cjs.map +1 -1
- package/dist/capture/video-recorder.js.map +1 -1
- package/dist/charts/AreaChart.cjs.map +1 -1
- package/dist/charts/AreaChart.js.map +1 -1
- package/dist/charts/BarChart.cjs.map +1 -1
- package/dist/charts/BarChart.js.map +1 -1
- package/dist/charts/LineChart.cjs.map +1 -1
- package/dist/charts/LineChart.js.map +1 -1
- package/dist/charts/PieChart.cjs.map +1 -1
- package/dist/charts/PieChart.js.map +1 -1
- package/dist/charts/RadarChart.cjs.map +1 -1
- package/dist/charts/RadarChart.js.map +1 -1
- package/dist/charts/palette.cjs.map +1 -1
- package/dist/charts/palette.js.map +1 -1
- package/dist/charts/scales.cjs.map +1 -1
- package/dist/charts/scales.js.map +1 -1
- package/dist/charts/types.cjs.map +1 -1
- package/dist/charts/types.js.map +1 -1
- package/dist/charts/use-chart-colors.cjs.map +1 -1
- package/dist/charts/use-chart-colors.js.map +1 -1
- package/dist/components/AIChat/AIChat.cjs +1 -1
- package/dist/components/AIChat/AIChat.cjs.map +1 -1
- package/dist/components/AIChat/AIChat.js +1 -5
- package/dist/components/AIChat/AIChat.js.map +1 -1
- package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
- package/dist/components/AIChat/AIChat.module.js.map +1 -1
- package/dist/components/AIChat/AIChatComposer.cjs +1 -1
- package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
- package/dist/components/AIChat/AIChatComposer.js +1 -7
- package/dist/components/AIChat/AIChatComposer.js.map +1 -1
- package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
- package/dist/components/AIChat/AIChatTurn.js.map +1 -1
- package/dist/components/AIChat/ai-chat-turns.cjs.map +1 -1
- package/dist/components/AIChat/ai-chat-turns.js.map +1 -1
- package/dist/components/Accordion/Accordion.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.js.map +1 -1
- package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.module.js.map +1 -1
- package/dist/components/Alert/Alert.cjs.map +1 -1
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Alert/Alert.module.cjs.map +1 -1
- package/dist/components/Alert/Alert.module.js.map +1 -1
- package/dist/components/AppBar/AppBar.cjs.map +1 -1
- package/dist/components/AppBar/AppBar.js.map +1 -1
- package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
- package/dist/components/AppBar/AppBar.module.js.map +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.cjs +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.js +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
- package/dist/components/AppShell/AppShell.cjs.map +1 -1
- package/dist/components/AppShell/AppShell.js.map +1 -1
- package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
- package/dist/components/AppShell/AppShell.module.js.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.cjs.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.js.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.cjs +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.js +1 -7
- package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.cjs +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.js +16 -21
- package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
- package/dist/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.module.js.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
- package/dist/components/Badge/Badge.cjs.map +1 -1
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Badge/Badge.module.cjs.map +1 -1
- package/dist/components/Badge/Badge.module.js.map +1 -1
- package/dist/components/Banner/Banner.cjs.map +1 -1
- package/dist/components/Banner/Banner.js.map +1 -1
- package/dist/components/Banner/Banner.module.cjs.map +1 -1
- package/dist/components/Banner/Banner.module.js.map +1 -1
- package/dist/components/BarList/BarList.cjs.map +1 -1
- package/dist/components/BarList/BarList.js.map +1 -1
- package/dist/components/BarList/BarList.module.cjs.map +1 -1
- package/dist/components/BarList/BarList.module.js.map +1 -1
- package/dist/components/BarList/bar-list-model.cjs.map +1 -1
- package/dist/components/BarList/bar-list-model.js.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
- package/dist/components/Button/Button.cjs.map +1 -1
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Button/Button.module.cjs.map +1 -1
- package/dist/components/Button/Button.module.js.map +1 -1
- package/dist/components/Button/ButtonContent.cjs.map +1 -1
- package/dist/components/Button/ButtonContent.js.map +1 -1
- package/dist/components/Button/ButtonSlot.cjs.map +1 -1
- package/dist/components/Button/ButtonSlot.js.map +1 -1
- package/dist/components/Button/button-class.cjs.map +1 -1
- package/dist/components/Button/button-class.js.map +1 -1
- package/dist/components/Button/link-rel.cjs.map +1 -1
- package/dist/components/Button/link-rel.js.map +1 -1
- package/dist/components/Button/slot.cjs.map +1 -1
- package/dist/components/Button/slot.js.map +1 -1
- package/dist/components/Calendar/Calendar.cjs.map +1 -1
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
- package/dist/components/Calendar/Calendar.module.js.map +1 -1
- package/dist/components/Card/Card.cjs.map +1 -1
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Card/Card.module.cjs.map +1 -1
- package/dist/components/Card/Card.module.js.map +1 -1
- package/dist/components/Carousel/Carousel.cjs.map +1 -1
- package/dist/components/Carousel/Carousel.js.map +1 -1
- package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
- package/dist/components/Carousel/Carousel.module.js.map +1 -1
- package/dist/components/Center/Center.cjs.map +1 -1
- package/dist/components/Center/Center.js.map +1 -1
- package/dist/components/Center/Center.module.cjs.map +1 -1
- package/dist/components/Center/Center.module.js.map +1 -1
- package/dist/components/Chat/Chat.cjs.map +1 -1
- package/dist/components/Chat/Chat.js.map +1 -1
- package/dist/components/Chat/Chat.module.cjs.map +1 -1
- package/dist/components/Chat/Chat.module.js.map +1 -1
- package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -1
- package/dist/components/Chat/ChatActionsMenu.js.map +1 -1
- package/dist/components/Chat/ChatAttachments.cjs.map +1 -1
- package/dist/components/Chat/ChatAttachments.js.map +1 -1
- package/dist/components/Chat/ChatBubble.cjs.map +1 -1
- package/dist/components/Chat/ChatBubble.js.map +1 -1
- package/dist/components/Chat/ChatComposer.cjs.map +1 -1
- package/dist/components/Chat/ChatComposer.js.map +1 -1
- package/dist/components/Chat/chat-groups.cjs +1 -1
- package/dist/components/Chat/chat-groups.cjs.map +1 -1
- package/dist/components/Chat/chat-groups.js +2 -6
- package/dist/components/Chat/chat-groups.js.map +1 -1
- package/dist/components/Chat/chat-receipt.cjs.map +1 -1
- package/dist/components/Chat/chat-receipt.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
- package/dist/components/ChipInput/ChipInput.cjs +1 -1
- package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
- package/dist/components/ChipInput/ChipInput.js +2 -12
- package/dist/components/ChipInput/ChipInput.js.map +1 -1
- package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
- package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
- package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
- package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
- package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
- package/dist/components/CodeBlock/tokenize.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
- package/dist/components/Collapsible/Collapsible.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
- package/dist/components/Combobox/Combobox.cjs.map +1 -1
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
- package/dist/components/Combobox/Combobox.module.js.map +1 -1
- package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -1
- package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -1
- package/dist/components/Command/Command.cjs +1 -1
- package/dist/components/Command/Command.cjs.map +1 -1
- package/dist/components/Command/Command.js +4 -11
- package/dist/components/Command/Command.js.map +1 -1
- package/dist/components/Command/Command.module.cjs.map +1 -1
- package/dist/components/Command/Command.module.js.map +1 -1
- package/dist/components/ConditionalWrapper/ConditionalWrapper.cjs.map +1 -1
- package/dist/components/ConditionalWrapper/ConditionalWrapper.js.map +1 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
- package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.js +1 -1
- package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
- package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
- package/dist/components/CopyButton/CopyButton.js.map +1 -1
- package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
- package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
- package/dist/components/DataList/DataList.cjs.map +1 -1
- package/dist/components/DataList/DataList.js.map +1 -1
- package/dist/components/DataList/DataList.module.cjs.map +1 -1
- package/dist/components/DataList/DataList.module.js.map +1 -1
- package/dist/components/DataTable/DataTable.cjs +1 -1
- package/dist/components/DataTable/DataTable.cjs.map +1 -1
- package/dist/components/DataTable/DataTable.js +6 -14
- package/dist/components/DataTable/DataTable.js.map +1 -1
- package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
- package/dist/components/DataTable/DataTable.module.js.map +1 -1
- package/dist/components/DataTable/EditableCell.cjs +1 -1
- package/dist/components/DataTable/EditableCell.cjs.map +1 -1
- package/dist/components/DataTable/EditableCell.js +1 -9
- package/dist/components/DataTable/EditableCell.js.map +1 -1
- package/dist/components/DataTable/LoadingRows.cjs.map +1 -1
- package/dist/components/DataTable/LoadingRows.js.map +1 -1
- package/dist/components/DataTable/edit-labels.cjs.map +1 -1
- package/dist/components/DataTable/edit-labels.js.map +1 -1
- package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
- package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
- package/dist/components/Divider/Divider.cjs.map +1 -1
- package/dist/components/Divider/Divider.js.map +1 -1
- package/dist/components/Divider/Divider.module.cjs.map +1 -1
- package/dist/components/Divider/Divider.module.js.map +1 -1
- package/dist/components/Drawer/Drawer.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.js.map +1 -1
- package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.module.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.js +2 -14
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
- package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
- package/dist/components/Dropzone/Dropzone.js.map +1 -1
- package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
- package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
- package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
- package/dist/components/ErrorState/ErrorState.js.map +1 -1
- package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
- package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
- package/dist/components/ErrorText/ErrorText.cjs.map +1 -1
- package/dist/components/ErrorText/ErrorText.js.map +1 -1
- package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
- package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.cjs +1 -1
- package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
- package/dist/components/FileUpload/FileUpload.js +7 -17
- package/dist/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
- package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
- package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar/FilterBar.js.map +1 -1
- package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
- package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
- package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
- package/dist/components/FilterBar/filter-apply.js.map +1 -1
- package/dist/components/FilterBar/filter-model.cjs.map +1 -1
- package/dist/components/FilterBar/filter-model.js.map +1 -1
- package/dist/components/FilterBar/filter-query.cjs +1 -1
- package/dist/components/FilterBar/filter-query.cjs.map +1 -1
- package/dist/components/FilterBar/filter-query.js +2 -5
- package/dist/components/FilterBar/filter-query.js.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.cjs.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.js.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.module.cjs.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.module.js.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
- package/dist/components/For/For.cjs.map +1 -1
- package/dist/components/For/For.js.map +1 -1
- package/dist/components/Form/Form.cjs.map +1 -1
- package/dist/components/Form/Form.js.map +1 -1
- package/dist/components/Form/Form.module.cjs.map +1 -1
- package/dist/components/Form/Form.module.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
- package/dist/components/HoverCard/HoverCard.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
- package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
- package/dist/components/Image/Image.cjs.map +1 -1
- package/dist/components/Image/Image.js.map +1 -1
- package/dist/components/Image/Image.module.cjs.map +1 -1
- package/dist/components/Image/Image.module.js.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
- package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.js +4 -8
- package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
- package/dist/components/ImageCropper/crop-geometry.cjs.map +1 -1
- package/dist/components/ImageCropper/crop-geometry.js.map +1 -1
- package/dist/components/Input/Input.cjs.map +1 -1
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Input/Input.module.cjs.map +1 -1
- package/dist/components/Input/Input.module.js.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
- package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
- package/dist/components/InstallButton/InstallButton.js.map +1 -1
- package/dist/components/InstallButton/InstallButton.module.cjs.map +1 -1
- package/dist/components/InstallButton/InstallButton.module.js.map +1 -1
- package/dist/components/InstallButton/install-hints.cjs.map +1 -1
- package/dist/components/InstallButton/install-hints.js.map +1 -1
- package/dist/components/Kanban/Kanban.cjs.map +1 -1
- package/dist/components/Kanban/Kanban.js.map +1 -1
- package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
- package/dist/components/Kanban/Kanban.module.js.map +1 -1
- package/dist/components/Kbd/Kbd.cjs.map +1 -1
- package/dist/components/Kbd/Kbd.js.map +1 -1
- package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
- package/dist/components/Kbd/Kbd.module.js.map +1 -1
- package/dist/components/Label/Label.cjs.map +1 -1
- package/dist/components/Label/Label.js.map +1 -1
- package/dist/components/Label/Label.module.cjs.map +1 -1
- package/dist/components/Label/Label.module.js.map +1 -1
- package/dist/components/Layout/Layout.cjs.map +1 -1
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Layout/Layout.module.cjs.map +1 -1
- package/dist/components/Layout/Layout.module.js.map +1 -1
- package/dist/components/Lightbox/Lightbox.cjs +1 -1
- package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
- package/dist/components/Lightbox/Lightbox.js +1 -1
- package/dist/components/Lightbox/Lightbox.js.map +1 -1
- package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
- package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
- package/dist/components/ListTile/ListTile.cjs.map +1 -1
- package/dist/components/ListTile/ListTile.js.map +1 -1
- package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
- package/dist/components/ListTile/ListTile.module.js.map +1 -1
- package/dist/components/Markdown/Markdown.cjs.map +1 -1
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
- package/dist/components/Markdown/Markdown.module.js.map +1 -1
- package/dist/components/Markdown/markdown-parse.cjs +2 -2
- package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
- package/dist/components/Markdown/markdown-parse.js +8 -27
- package/dist/components/Markdown/markdown-parse.js.map +1 -1
- package/dist/components/Masonry/Masonry.cjs.map +1 -1
- package/dist/components/Masonry/Masonry.js.map +1 -1
- package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
- package/dist/components/Masonry/Masonry.module.js.map +1 -1
- package/dist/components/Masonry/masonry-layout.cjs.map +1 -1
- package/dist/components/Masonry/masonry-layout.js.map +1 -1
- package/dist/components/Menubar/Menubar.cjs.map +1 -1
- package/dist/components/Menubar/Menubar.js.map +1 -1
- package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
- package/dist/components/Menubar/Menubar.module.js.map +1 -1
- package/dist/components/Modal/Modal.cjs.map +1 -1
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/Modal.module.cjs.map +1 -1
- package/dist/components/Modal/Modal.module.js.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
- package/dist/components/Money/Money.cjs.map +1 -1
- package/dist/components/Money/Money.js.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
- package/dist/components/NProgress/NProgress.cjs.map +1 -1
- package/dist/components/NProgress/NProgress.js.map +1 -1
- package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
- package/dist/components/NProgress/NProgress.module.js.map +1 -1
- package/dist/components/Navbar/Navbar.cjs.map +1 -1
- package/dist/components/Navbar/Navbar.js.map +1 -1
- package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
- package/dist/components/Navbar/Navbar.module.js.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
- package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
- package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
- package/dist/components/Page/Page.cjs.map +1 -1
- package/dist/components/Page/Page.js.map +1 -1
- package/dist/components/Page/Page.module.cjs.map +1 -1
- package/dist/components/Page/Page.module.js.map +1 -1
- package/dist/components/Pagination/Pagination.cjs.map +1 -1
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
- package/dist/components/Pagination/Pagination.module.js.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
- package/dist/components/PinInput/PinInput.cjs.map +1 -1
- package/dist/components/PinInput/PinInput.js.map +1 -1
- package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
- package/dist/components/PinInput/PinInput.module.js.map +1 -1
- package/dist/components/Popover/Popover.cjs.map +1 -1
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/Popover.module.cjs.map +1 -1
- package/dist/components/Popover/Popover.module.js.map +1 -1
- package/dist/components/Portal/Portal.cjs.map +1 -1
- package/dist/components/Portal/Portal.js.map +1 -1
- package/dist/components/Portal/anchor-position.cjs.map +1 -1
- package/dist/components/Portal/anchor-position.js.map +1 -1
- package/dist/components/Portal/escape-layer.cjs.map +1 -1
- package/dist/components/Portal/escape-layer.js.map +1 -1
- package/dist/components/Portal/portal-host.cjs.map +1 -1
- package/dist/components/Portal/portal-host.js.map +1 -1
- package/dist/components/Portal/tab-bridge.cjs +1 -1
- package/dist/components/Portal/tab-bridge.cjs.map +1 -1
- package/dist/components/Portal/tab-bridge.js +1 -5
- package/dist/components/Portal/tab-bridge.js.map +1 -1
- package/dist/components/Progress/Progress.cjs.map +1 -1
- package/dist/components/Progress/Progress.js.map +1 -1
- package/dist/components/Progress/Progress.module.cjs.map +1 -1
- package/dist/components/Progress/Progress.module.js.map +1 -1
- package/dist/components/QRCode/QRCode.cjs.map +1 -1
- package/dist/components/QRCode/QRCode.js.map +1 -1
- package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
- package/dist/components/QRCode/QRCode.module.js.map +1 -1
- package/dist/components/QRCode/qr-encode.cjs +1 -1
- package/dist/components/QRCode/qr-encode.cjs.map +1 -1
- package/dist/components/QRCode/qr-encode.js +7 -13
- package/dist/components/QRCode/qr-encode.js.map +1 -1
- package/dist/components/QRCode/qr-tables.cjs.map +1 -1
- package/dist/components/QRCode/qr-tables.js.map +1 -1
- package/dist/components/Radio/Radio.cjs.map +1 -1
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/Radio/Radio.module.cjs.map +1 -1
- package/dist/components/Radio/Radio.module.js.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
- package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
- package/dist/components/RatingStars/RatingStars.js.map +1 -1
- package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
- package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.js +10 -18
- package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
- package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
- package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
- package/dist/components/Resizable/Resizable.cjs +1 -1
- package/dist/components/Resizable/Resizable.cjs.map +1 -1
- package/dist/components/Resizable/Resizable.js +1 -9
- package/dist/components/Resizable/Resizable.js.map +1 -1
- package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
- package/dist/components/Resizable/Resizable.module.js.map +1 -1
- package/dist/components/Responsive/Responsive.cjs.map +1 -1
- package/dist/components/Responsive/Responsive.js.map +1 -1
- package/dist/components/Reveal/Reveal.cjs.map +1 -1
- package/dist/components/Reveal/Reveal.js.map +1 -1
- package/dist/components/Reveal/Reveal.module.cjs.map +1 -1
- package/dist/components/Reveal/Reveal.module.js.map +1 -1
- package/dist/components/Reveal/reveal-threshold.cjs.map +1 -1
- package/dist/components/Reveal/reveal-threshold.js.map +1 -1
- package/dist/components/SafeArea/SafeArea.cjs.map +1 -1
- package/dist/components/SafeArea/SafeArea.js.map +1 -1
- package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
- package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
- package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
- package/dist/components/Scheduler/Scheduler.js.map +1 -1
- package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
- package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
- package/dist/components/Scheduler/scheduler-layout.cjs.map +1 -1
- package/dist/components/Scheduler/scheduler-layout.js.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
- package/dist/components/SearchBar/SearchBar.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
- package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
- package/dist/components/Select/CaretIcon.cjs.map +1 -1
- package/dist/components/Select/CaretIcon.js.map +1 -1
- package/dist/components/Select/Select.cjs.map +1 -1
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/Select.module.cjs.map +1 -1
- package/dist/components/Select/Select.module.js.map +1 -1
- package/dist/components/Select/options.cjs.map +1 -1
- package/dist/components/Select/options.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.cjs +1 -1
- package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
- package/dist/components/Sidebar/Sidebar.js +13 -23
- package/dist/components/Sidebar/Sidebar.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
- package/dist/components/Sidebar/SidebarEntry.cjs.map +1 -1
- package/dist/components/Sidebar/SidebarEntry.js.map +1 -1
- package/dist/components/Sidebar/active-nav-key.cjs.map +1 -1
- package/dist/components/Sidebar/active-nav-key.js.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.cjs +1 -1
- package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.js +1 -5
- package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
- package/dist/components/Slider/Slider.cjs.map +1 -1
- package/dist/components/Slider/Slider.js.map +1 -1
- package/dist/components/Slider/Slider.module.cjs.map +1 -1
- package/dist/components/Slider/Slider.module.js.map +1 -1
- package/dist/components/Spacer/Spacer.cjs.map +1 -1
- package/dist/components/Spacer/Spacer.js.map +1 -1
- package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
- package/dist/components/Spacer/Spacer.module.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
- package/dist/components/Sparkline/Sparkline.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
- package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
- package/dist/components/Sparkline/sparkline-geometry.cjs.map +1 -1
- package/dist/components/Sparkline/sparkline-geometry.js.map +1 -1
- package/dist/components/Spinner/Spinner.cjs.map +1 -1
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
- package/dist/components/Spinner/Spinner.module.js.map +1 -1
- package/dist/components/Stat/Stat.cjs.map +1 -1
- package/dist/components/Stat/Stat.js.map +1 -1
- package/dist/components/Stat/Stat.module.cjs.map +1 -1
- package/dist/components/Stat/Stat.module.js.map +1 -1
- package/dist/components/Stepper/Stepper.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.module.js.map +1 -1
- package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
- package/dist/components/StepperInput/StepperInput.js.map +1 -1
- package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
- package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
- package/dist/components/Switch/Switch.cjs.map +1 -1
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Switch/Switch.module.cjs.map +1 -1
- package/dist/components/Switch/Switch.module.js.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
- package/dist/components/Table/Table.cjs.map +1 -1
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Table/Table.module.cjs.map +1 -1
- package/dist/components/Table/Table.module.js.map +1 -1
- package/dist/components/Tabs/Tabs.cjs.map +1 -1
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
- package/dist/components/Tabs/Tabs.module.js.map +1 -1
- package/dist/components/Tag/Tag.cjs.map +1 -1
- package/dist/components/Tag/Tag.js.map +1 -1
- package/dist/components/Tag/Tag.module.cjs.map +1 -1
- package/dist/components/Tag/Tag.module.js.map +1 -1
- package/dist/components/Textarea/Textarea.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.module.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
- package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
- package/dist/components/Timeline/Timeline.cjs.map +1 -1
- package/dist/components/Timeline/Timeline.js.map +1 -1
- package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
- package/dist/components/Timeline/Timeline.module.js.map +1 -1
- package/dist/components/Toast/Toast.module.cjs.map +1 -1
- package/dist/components/Toast/Toast.module.js.map +1 -1
- package/dist/components/Toast/ToastProvider.cjs.map +1 -1
- package/dist/components/Toast/ToastProvider.js.map +1 -1
- package/dist/components/Toggle/Toggle.cjs.map +1 -1
- package/dist/components/Toggle/Toggle.js.map +1 -1
- package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
- package/dist/components/Toggle/Toggle.module.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
- package/dist/components/Tour/Tour.cjs +1 -1
- package/dist/components/Tour/Tour.cjs.map +1 -1
- package/dist/components/Tour/Tour.js +1 -5
- package/dist/components/Tour/Tour.js.map +1 -1
- package/dist/components/Tour/Tour.module.cjs.map +1 -1
- package/dist/components/Tour/Tour.module.js.map +1 -1
- package/dist/components/Tour/tour-position.cjs.map +1 -1
- package/dist/components/Tour/tour-position.js.map +1 -1
- package/dist/components/Transfer/Transfer.cjs.map +1 -1
- package/dist/components/Transfer/Transfer.js.map +1 -1
- package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
- package/dist/components/Transfer/Transfer.module.js.map +1 -1
- package/dist/components/Transfer/transfer-state.cjs.map +1 -1
- package/dist/components/Transfer/transfer-state.js.map +1 -1
- package/dist/components/TreeView/TreeView.cjs.map +1 -1
- package/dist/components/TreeView/TreeView.js.map +1 -1
- package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
- package/dist/components/TreeView/TreeView.module.js.map +1 -1
- package/dist/components/TruncateText/TruncateText.cjs.map +1 -1
- package/dist/components/TruncateText/TruncateText.js.map +1 -1
- package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
- package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.cjs +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.cjs.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.js +1 -7
- package/dist/components/VideoPlayer/VideoPlayer.js.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
- package/dist/components/VideoPlayer/playback-rates.cjs.map +1 -1
- package/dist/components/VideoPlayer/playback-rates.js.map +1 -1
- package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
- package/dist/components/VirtualList/VirtualList.js.map +1 -1
- package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
- package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
- package/dist/components/Wizard/Wizard.cjs +1 -1
- package/dist/components/Wizard/Wizard.cjs.map +1 -1
- package/dist/components/Wizard/Wizard.js +4 -11
- package/dist/components/Wizard/Wizard.js.map +1 -1
- package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
- package/dist/components/Wizard/Wizard.module.js.map +1 -1
- package/dist/data/create-data-provider.cjs.map +1 -1
- package/dist/data/create-data-provider.js.map +1 -1
- package/dist/data/data-provider-context.cjs.map +1 -1
- package/dist/data/data-provider-context.js.map +1 -1
- package/dist/data/use-resource.cjs.map +1 -1
- package/dist/data/use-resource.js.map +1 -1
- package/dist/editor/RichTextEditor.cjs.map +1 -1
- package/dist/editor/RichTextEditor.js.map +1 -1
- package/dist/editor/RichTextEditor.module.cjs.map +1 -1
- package/dist/editor/RichTextEditor.module.js.map +1 -1
- package/dist/editor.js +1 -2
- package/dist/error-boundary/ErrorBoundary.cjs.map +1 -1
- package/dist/error-boundary/ErrorBoundary.js.map +1 -1
- package/dist/error-boundary/use-error-handler.cjs.map +1 -1
- package/dist/error-boundary/use-error-handler.js.map +1 -1
- package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
- package/dist/feature-flags/FeatureFlagsProvider.js.map +1 -1
- package/dist/feature-flags/growthbook-adapter.cjs.map +1 -1
- package/dist/feature-flags/growthbook-adapter.js.map +1 -1
- package/dist/feature-flags/in-memory-adapter.cjs.map +1 -1
- package/dist/feature-flags/in-memory-adapter.js.map +1 -1
- package/dist/feature-flags/launchdarkly-adapter.cjs.map +1 -1
- package/dist/feature-flags/launchdarkly-adapter.js.map +1 -1
- package/dist/forms/FormField.cjs.map +1 -1
- package/dist/forms/FormField.js.map +1 -1
- package/dist/forms/br-validators.cjs.map +1 -1
- package/dist/forms/br-validators.js.map +1 -1
- package/dist/forms/masked-inputs.cjs.map +1 -1
- package/dist/forms/masked-inputs.js.map +1 -1
- package/dist/forms/use-viacep.cjs.map +1 -1
- package/dist/forms/use-viacep.js.map +1 -1
- package/dist/forms/use-zod-form.cjs.map +1 -1
- package/dist/forms/use-zod-form.js.map +1 -1
- package/dist/forms/validate-form.cjs.map +1 -1
- package/dist/forms/validate-form.js.map +1 -1
- package/dist/forms/zod-resolver.cjs.map +1 -1
- package/dist/forms/zod-resolver.js.map +1 -1
- package/dist/geo/TrajectoryMap.cjs.map +1 -1
- package/dist/geo/TrajectoryMap.js.map +1 -1
- package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
- package/dist/geo/TrajectoryMap.module.js.map +1 -1
- package/dist/geo/bounds.cjs.map +1 -1
- package/dist/geo/bounds.js.map +1 -1
- package/dist/geo/create-position-tracker.cjs +1 -1
- package/dist/geo/create-position-tracker.cjs.map +1 -1
- package/dist/geo/create-position-tracker.js +1 -7
- package/dist/geo/create-position-tracker.js.map +1 -1
- package/dist/geo/distance.cjs.map +1 -1
- package/dist/geo/distance.js.map +1 -1
- package/dist/geo/estimate.cjs.map +1 -1
- package/dist/geo/estimate.js.map +1 -1
- package/dist/geo/leaflet-map.cjs.map +1 -1
- package/dist/geo/leaflet-map.js.map +1 -1
- package/dist/geo/projection.cjs.map +1 -1
- package/dist/geo/projection.js.map +1 -1
- package/dist/geo/routing.cjs.map +1 -1
- package/dist/geo/routing.js.map +1 -1
- package/dist/geo/types.cjs.map +1 -1
- package/dist/geo/types.js.map +1 -1
- package/dist/geo/use-position-tracker.cjs.map +1 -1
- package/dist/geo/use-position-tracker.js.map +1 -1
- package/dist/hooks/pwa-env.cjs.map +1 -1
- package/dist/hooks/pwa-env.js.map +1 -1
- package/dist/hooks/tab-sequence.cjs.map +1 -1
- package/dist/hooks/tab-sequence.js.map +1 -1
- package/dist/hooks/use-announce.cjs +1 -1
- package/dist/hooks/use-announce.cjs.map +1 -1
- package/dist/hooks/use-announce.js +2 -2
- package/dist/hooks/use-announce.js.map +1 -1
- package/dist/hooks/use-async.cjs.map +1 -1
- package/dist/hooks/use-async.js.map +1 -1
- package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
- package/dist/hooks/use-before-install-prompt.js.map +1 -1
- package/dist/hooks/use-breakpoint.cjs.map +1 -1
- package/dist/hooks/use-breakpoint.js.map +1 -1
- package/dist/hooks/use-click-outside.cjs.map +1 -1
- package/dist/hooks/use-click-outside.js.map +1 -1
- package/dist/hooks/use-client-filter.cjs.map +1 -1
- package/dist/hooks/use-client-filter.js.map +1 -1
- package/dist/hooks/use-clipboard.cjs.map +1 -1
- package/dist/hooks/use-clipboard.js.map +1 -1
- package/dist/hooks/use-countdown.cjs.map +1 -1
- package/dist/hooks/use-countdown.js.map +1 -1
- package/dist/hooks/use-counter.cjs.map +1 -1
- package/dist/hooks/use-counter.js.map +1 -1
- package/dist/hooks/use-debounce.cjs.map +1 -1
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-deep-memo.cjs.map +1 -1
- package/dist/hooks/use-deep-memo.js.map +1 -1
- package/dist/hooks/use-disclosure.cjs.map +1 -1
- package/dist/hooks/use-disclosure.js.map +1 -1
- package/dist/hooks/use-document-title.cjs.map +1 -1
- package/dist/hooks/use-document-title.js.map +1 -1
- package/dist/hooks/use-document-visibility.cjs.map +1 -1
- package/dist/hooks/use-document-visibility.js.map +1 -1
- package/dist/hooks/use-draft-filters.cjs.map +1 -1
- package/dist/hooks/use-draft-filters.js.map +1 -1
- package/dist/hooks/use-event-listener.cjs.map +1 -1
- package/dist/hooks/use-event-listener.js.map +1 -1
- package/dist/hooks/use-favicon.cjs.map +1 -1
- package/dist/hooks/use-favicon.js.map +1 -1
- package/dist/hooks/use-focus-trap.cjs.map +1 -1
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-fullscreen-element.cjs.map +1 -1
- package/dist/hooks/use-fullscreen-element.js.map +1 -1
- package/dist/hooks/use-fullscreen.cjs +1 -1
- package/dist/hooks/use-fullscreen.cjs.map +1 -1
- package/dist/hooks/use-fullscreen.js +7 -23
- package/dist/hooks/use-fullscreen.js.map +1 -1
- package/dist/hooks/use-geolocation.cjs.map +1 -1
- package/dist/hooks/use-geolocation.js.map +1 -1
- package/dist/hooks/use-hover.cjs.map +1 -1
- package/dist/hooks/use-hover.js.map +1 -1
- package/dist/hooks/use-idle.cjs.map +1 -1
- package/dist/hooks/use-idle.js.map +1 -1
- package/dist/hooks/use-install-prompt.cjs +1 -1
- package/dist/hooks/use-install-prompt.cjs.map +1 -1
- package/dist/hooks/use-install-prompt.js +1 -1
- package/dist/hooks/use-install-prompt.js.map +1 -1
- package/dist/hooks/use-intersection-observer.cjs.map +1 -1
- package/dist/hooks/use-intersection-observer.js.map +1 -1
- package/dist/hooks/use-interval.cjs.map +1 -1
- package/dist/hooks/use-interval.js.map +1 -1
- package/dist/hooks/use-is-first-render.cjs.map +1 -1
- package/dist/hooks/use-is-first-render.js.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
- package/dist/hooks/use-latest-ref.cjs.map +1 -1
- package/dist/hooks/use-latest-ref.js.map +1 -1
- package/dist/hooks/use-list-state.cjs.map +1 -1
- package/dist/hooks/use-list-state.js.map +1 -1
- package/dist/hooks/use-local-storage.cjs +1 -1
- package/dist/hooks/use-local-storage.cjs.map +1 -1
- package/dist/hooks/use-local-storage.js +2 -5
- package/dist/hooks/use-local-storage.js.map +1 -1
- package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
- package/dist/hooks/use-long-press-handlers.js.map +1 -1
- package/dist/hooks/use-long-press.cjs.map +1 -1
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-map.cjs.map +1 -1
- package/dist/hooks/use-map.js.map +1 -1
- package/dist/hooks/use-media-devices.cjs.map +1 -1
- package/dist/hooks/use-media-devices.js.map +1 -1
- package/dist/hooks/use-media-permission.cjs +1 -1
- package/dist/hooks/use-media-permission.cjs.map +1 -1
- package/dist/hooks/use-media-permission.js +2 -5
- package/dist/hooks/use-media-permission.js.map +1 -1
- package/dist/hooks/use-media-query.cjs.map +1 -1
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-object-url.cjs.map +1 -1
- package/dist/hooks/use-object-url.js.map +1 -1
- package/dist/hooks/use-online.cjs.map +1 -1
- package/dist/hooks/use-online.js.map +1 -1
- package/dist/hooks/use-pagination.cjs.map +1 -1
- package/dist/hooks/use-pagination.js.map +1 -1
- package/dist/hooks/use-previous.cjs.map +1 -1
- package/dist/hooks/use-previous.js.map +1 -1
- package/dist/hooks/use-push-to-talk.cjs.map +1 -1
- package/dist/hooks/use-push-to-talk.js.map +1 -1
- package/dist/hooks/use-queue.cjs.map +1 -1
- package/dist/hooks/use-queue.js.map +1 -1
- package/dist/hooks/use-resize-observer.cjs.map +1 -1
- package/dist/hooks/use-resize-observer.js.map +1 -1
- package/dist/hooks/use-scroll-lock.cjs.map +1 -1
- package/dist/hooks/use-scroll-lock.js.map +1 -1
- package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
- package/dist/hooks/use-scroll-overflow.js.map +1 -1
- package/dist/hooks/use-service-worker-update.cjs.map +1 -1
- package/dist/hooks/use-service-worker-update.js.map +1 -1
- package/dist/hooks/use-set.cjs.map +1 -1
- package/dist/hooks/use-set.js.map +1 -1
- package/dist/hooks/use-sortable.cjs.map +1 -1
- package/dist/hooks/use-sortable.js.map +1 -1
- package/dist/hooks/use-stable-callback.cjs.map +1 -1
- package/dist/hooks/use-stable-callback.js.map +1 -1
- package/dist/hooks/use-storage-estimate.cjs.map +1 -1
- package/dist/hooks/use-storage-estimate.js.map +1 -1
- package/dist/hooks/use-throttle.cjs.map +1 -1
- package/dist/hooks/use-throttle.js.map +1 -1
- package/dist/hooks/use-timeout.cjs.map +1 -1
- package/dist/hooks/use-timeout.js.map +1 -1
- package/dist/hooks/use-toggle.cjs.map +1 -1
- package/dist/hooks/use-toggle.js.map +1 -1
- package/dist/hooks/use-typewriter.cjs.map +1 -1
- package/dist/hooks/use-typewriter.js.map +1 -1
- package/dist/hooks/use-window-size.cjs.map +1 -1
- package/dist/hooks/use-window-size.js.map +1 -1
- package/dist/http/api-client.cjs +1 -1
- package/dist/http/api-client.cjs.map +1 -1
- package/dist/http/api-client.js +5 -1
- package/dist/http/api-client.js.map +1 -1
- package/dist/http/build-url.cjs +1 -1
- package/dist/http/build-url.cjs.map +1 -1
- package/dist/http/build-url.js +3 -1
- package/dist/http/build-url.js.map +1 -1
- package/dist/http/credential-scope.cjs.map +1 -1
- package/dist/http/credential-scope.js.map +1 -1
- package/dist/http/csrf.cjs.map +1 -1
- package/dist/http/csrf.js.map +1 -1
- package/dist/http/decode-response.cjs.map +1 -1
- package/dist/http/decode-response.js.map +1 -1
- package/dist/http/describe-api-error.cjs.map +1 -1
- package/dist/http/describe-api-error.js.map +1 -1
- package/dist/http/errors.cjs.map +1 -1
- package/dist/http/errors.js.map +1 -1
- package/dist/http/idempotency.cjs.map +1 -1
- package/dist/http/idempotency.js.map +1 -1
- package/dist/http/parse-response.cjs.map +1 -1
- package/dist/http/parse-response.js.map +1 -1
- package/dist/http/presigned-post.cjs +2 -0
- package/dist/http/presigned-post.cjs.map +1 -0
- package/dist/http/presigned-post.js +73 -0
- package/dist/http/presigned-post.js.map +1 -0
- package/dist/http/resumable-upload.cjs.map +1 -1
- package/dist/http/resumable-upload.js.map +1 -1
- package/dist/http/retry.cjs.map +1 -1
- package/dist/http/retry.js.map +1 -1
- package/dist/http/timeout.cjs.map +1 -1
- package/dist/http/timeout.js.map +1 -1
- package/dist/http/upload-with-progress.cjs +1 -1
- package/dist/http/upload-with-progress.cjs.map +1 -1
- package/dist/http/upload-with-progress.js +2 -7
- package/dist/http/upload-with-progress.js.map +1 -1
- package/dist/http/use-describe-api-error.cjs.map +1 -1
- package/dist/http/use-describe-api-error.js.map +1 -1
- package/dist/http/use-poll.cjs +1 -1
- package/dist/http/use-poll.cjs.map +1 -1
- package/dist/http/use-poll.js +2 -5
- package/dist/http/use-poll.js.map +1 -1
- package/dist/i18n/I18nProvider.cjs.map +1 -1
- package/dist/i18n/I18nProvider.js.map +1 -1
- package/dist/i18n/create-i18n.cjs.map +1 -1
- package/dist/i18n/create-i18n.js.map +1 -1
- package/dist/icons/Icon.cjs.map +1 -1
- package/dist/icons/Icon.js.map +1 -1
- package/dist/icons/IconPicker.cjs.map +1 -1
- package/dist/icons/IconPicker.js.map +1 -1
- package/dist/icons/IconPicker.module.cjs.map +1 -1
- package/dist/icons/IconPicker.module.js.map +1 -1
- package/dist/icons/IconProvider.cjs.map +1 -1
- package/dist/icons/IconProvider.js.map +1 -1
- package/dist/icons/alias.cjs.map +1 -1
- package/dist/icons/alias.js.map +1 -1
- package/dist/icons/generated/aliases.cjs.map +1 -1
- package/dist/icons/generated/aliases.js.map +1 -1
- package/dist/icons/generated/icon-names.cjs.map +1 -1
- package/dist/icons/generated/icon-names.js.map +1 -1
- package/dist/icons/generated/loaders.cjs.map +1 -1
- package/dist/icons/generated/loaders.js.map +1 -1
- package/dist/icons/generated/shard-00.cjs.map +1 -1
- package/dist/icons/generated/shard-00.js.map +1 -1
- package/dist/icons/generated/shard-01.cjs.map +1 -1
- package/dist/icons/generated/shard-01.js.map +1 -1
- package/dist/icons/generated/shard-02.cjs.map +1 -1
- package/dist/icons/generated/shard-02.js.map +1 -1
- package/dist/icons/generated/shard-03.cjs.map +1 -1
- package/dist/icons/generated/shard-03.js.map +1 -1
- package/dist/icons/generated/shard-04.cjs.map +1 -1
- package/dist/icons/generated/shard-04.js.map +1 -1
- package/dist/icons/generated/shard-05.cjs.map +1 -1
- package/dist/icons/generated/shard-05.js.map +1 -1
- package/dist/icons/generated/shard-06.cjs.map +1 -1
- package/dist/icons/generated/shard-06.js.map +1 -1
- package/dist/icons/generated/shard-07.cjs.map +1 -1
- package/dist/icons/generated/shard-07.js.map +1 -1
- package/dist/icons/generated/shard-08.cjs.map +1 -1
- package/dist/icons/generated/shard-08.js.map +1 -1
- package/dist/icons/generated/shard-09.cjs.map +1 -1
- package/dist/icons/generated/shard-09.js.map +1 -1
- package/dist/icons/generated/shard-10.cjs.map +1 -1
- package/dist/icons/generated/shard-10.js.map +1 -1
- package/dist/icons/generated/shard-11.cjs.map +1 -1
- package/dist/icons/generated/shard-11.js.map +1 -1
- package/dist/icons/generated/shard-12.cjs.map +1 -1
- package/dist/icons/generated/shard-12.js.map +1 -1
- package/dist/icons/generated/shard-13.cjs.map +1 -1
- package/dist/icons/generated/shard-13.js.map +1 -1
- package/dist/icons/generated/shard-14.cjs.map +1 -1
- package/dist/icons/generated/shard-14.js.map +1 -1
- package/dist/icons/generated/shard-15.cjs.map +1 -1
- package/dist/icons/generated/shard-15.js.map +1 -1
- package/dist/icons/generated/shard-16.cjs.map +1 -1
- package/dist/icons/generated/shard-16.js.map +1 -1
- package/dist/icons/generated/shard-17.cjs.map +1 -1
- package/dist/icons/generated/shard-17.js.map +1 -1
- package/dist/icons/generated/shard-18.cjs.map +1 -1
- package/dist/icons/generated/shard-18.js.map +1 -1
- package/dist/icons/generated/shard-19.cjs.map +1 -1
- package/dist/icons/generated/shard-19.js.map +1 -1
- package/dist/icons/generated/shard-20.cjs.map +1 -1
- package/dist/icons/generated/shard-20.js.map +1 -1
- package/dist/icons/generated/shard-21.cjs.map +1 -1
- package/dist/icons/generated/shard-21.js.map +1 -1
- package/dist/icons/generated/shard-22.cjs.map +1 -1
- package/dist/icons/generated/shard-22.js.map +1 -1
- package/dist/icons/generated/shard-23.cjs.map +1 -1
- package/dist/icons/generated/shard-23.js.map +1 -1
- package/dist/icons/generated/shard-24.cjs.map +1 -1
- package/dist/icons/generated/shard-24.js.map +1 -1
- package/dist/icons/generated/shard-25.cjs.map +1 -1
- package/dist/icons/generated/shard-25.js.map +1 -1
- package/dist/icons/generated/shard-26.cjs.map +1 -1
- package/dist/icons/generated/shard-26.js.map +1 -1
- package/dist/icons/generated/shard-27.cjs.map +1 -1
- package/dist/icons/generated/shard-27.js.map +1 -1
- package/dist/icons/generated/shard-28.cjs.map +1 -1
- package/dist/icons/generated/shard-28.js.map +1 -1
- package/dist/icons/generated/shard-29.cjs.map +1 -1
- package/dist/icons/generated/shard-29.js.map +1 -1
- package/dist/icons/generated/shard-30.cjs.map +1 -1
- package/dist/icons/generated/shard-30.js.map +1 -1
- package/dist/icons/generated/shard-31.cjs.map +1 -1
- package/dist/icons/generated/shard-31.js.map +1 -1
- package/dist/icons/generated/shard-32.cjs.map +1 -1
- package/dist/icons/generated/shard-32.js.map +1 -1
- package/dist/icons/generated/shard-33.cjs.map +1 -1
- package/dist/icons/generated/shard-33.js.map +1 -1
- package/dist/icons/generated/shard-34.cjs.map +1 -1
- package/dist/icons/generated/shard-34.js.map +1 -1
- package/dist/icons/generated/shard-35.cjs.map +1 -1
- package/dist/icons/generated/shard-35.js.map +1 -1
- package/dist/icons/generated/shard-36.cjs.map +1 -1
- package/dist/icons/generated/shard-36.js.map +1 -1
- package/dist/icons/generated/shard-37.cjs.map +1 -1
- package/dist/icons/generated/shard-37.js.map +1 -1
- package/dist/icons/generated/shard-38.cjs.map +1 -1
- package/dist/icons/generated/shard-38.js.map +1 -1
- package/dist/icons/generated/shard-39.cjs.map +1 -1
- package/dist/icons/generated/shard-39.js.map +1 -1
- package/dist/icons/generated/shard-40.cjs.map +1 -1
- package/dist/icons/generated/shard-40.js.map +1 -1
- package/dist/icons/generated/shard-41.cjs.map +1 -1
- package/dist/icons/generated/shard-41.js.map +1 -1
- package/dist/icons/generated/shard-42.cjs.map +1 -1
- package/dist/icons/generated/shard-42.js.map +1 -1
- package/dist/icons/generated/shard-43.cjs.map +1 -1
- package/dist/icons/generated/shard-43.js.map +1 -1
- package/dist/icons/generated/shard-44.cjs.map +1 -1
- package/dist/icons/generated/shard-44.js.map +1 -1
- package/dist/icons/generated/shard-45.cjs.map +1 -1
- package/dist/icons/generated/shard-45.js.map +1 -1
- package/dist/icons/icon-context.cjs.map +1 -1
- package/dist/icons/icon-context.js.map +1 -1
- package/dist/icons/is-icon-name.cjs.map +1 -1
- package/dist/icons/is-icon-name.js.map +1 -1
- package/dist/icons/material-symbols.cjs.map +1 -1
- package/dist/icons/material-symbols.js.map +1 -1
- package/dist/icons/normalize-icon-name.cjs.map +1 -1
- package/dist/icons/normalize-icon-name.js.map +1 -1
- package/dist/icons/shard-cache.cjs +1 -1
- package/dist/icons/shard-cache.cjs.map +1 -1
- package/dist/icons/shard-cache.js +2 -5
- package/dist/icons/shard-cache.js.map +1 -1
- package/dist/icons/use-icon.cjs.map +1 -1
- package/dist/icons/use-icon.js.map +1 -1
- package/dist/icons/validate-icon-name.cjs.map +1 -1
- package/dist/icons/validate-icon-name.js.map +1 -1
- package/dist/icons-virtual.cjs.map +1 -1
- package/dist/icons-virtual.js.map +1 -1
- package/dist/imaging/canvas.cjs.map +1 -1
- package/dist/imaging/canvas.js.map +1 -1
- package/dist/imaging/compress.cjs.map +1 -1
- package/dist/imaging/compress.js.map +1 -1
- package/dist/imaging/decode.cjs.map +1 -1
- package/dist/imaging/decode.js.map +1 -1
- package/dist/imaging/encode.cjs.map +1 -1
- package/dist/imaging/encode.js.map +1 -1
- package/dist/imaging/exceptions.cjs.map +1 -1
- package/dist/imaging/exceptions.js.map +1 -1
- package/dist/imaging/frame.cjs.map +1 -1
- package/dist/imaging/frame.js.map +1 -1
- package/dist/imaging/thumbnails.cjs.map +1 -1
- package/dist/imaging/thumbnails.js.map +1 -1
- package/dist/imaging/transform.cjs.map +1 -1
- package/dist/imaging/transform.js.map +1 -1
- package/dist/imaging/use-image-processing.cjs.map +1 -1
- package/dist/imaging/use-image-processing.js.map +1 -1
- package/dist/logger/logger.cjs.map +1 -1
- package/dist/logger/logger.js.map +1 -1
- package/dist/neural.cjs.map +1 -1
- package/dist/neural.js.map +1 -1
- package/dist/oauth/GoogleSignIn.cjs +1 -1
- package/dist/oauth/GoogleSignIn.cjs.map +1 -1
- package/dist/oauth/GoogleSignIn.js +6 -9
- package/dist/oauth/GoogleSignIn.js.map +1 -1
- package/dist/oauth/callback.cjs.map +1 -1
- package/dist/oauth/callback.js.map +1 -1
- package/dist/oauth/use-oauth-callback.cjs.map +1 -1
- package/dist/oauth/use-oauth-callback.js.map +1 -1
- package/dist/offline/conflict.cjs.map +1 -1
- package/dist/offline/conflict.js.map +1 -1
- package/dist/offline/create-offline-database.cjs.map +1 -1
- package/dist/offline/create-offline-database.js.map +1 -1
- package/dist/offline/create-offline-store.cjs +1 -1
- package/dist/offline/create-offline-store.cjs.map +1 -1
- package/dist/offline/create-offline-store.js +1 -5
- package/dist/offline/create-offline-store.js.map +1 -1
- package/dist/offline/create-offline-sync.cjs +1 -1
- package/dist/offline/create-offline-sync.cjs.map +1 -1
- package/dist/offline/create-offline-sync.js +9 -14
- package/dist/offline/create-offline-sync.js.map +1 -1
- package/dist/offline/use-offline-sync.cjs.map +1 -1
- package/dist/offline/use-offline-sync.js.map +1 -1
- package/dist/perf/cache-size.cjs.map +1 -1
- package/dist/perf/cache-size.js.map +1 -1
- package/dist/perf/device.cjs.map +1 -1
- package/dist/perf/device.js.map +1 -1
- package/dist/perf/format.cjs.map +1 -1
- package/dist/perf/format.js.map +1 -1
- package/dist/perf/profiler.cjs.map +1 -1
- package/dist/perf/profiler.js.map +1 -1
- package/dist/push/use-push-subscription.cjs.map +1 -1
- package/dist/push/use-push-subscription.js.map +1 -1
- package/dist/push/utils.cjs.map +1 -1
- package/dist/push/utils.js.map +1 -1
- package/dist/push/web-push-client.cjs.map +1 -1
- package/dist/push/web-push-client.js.map +1 -1
- package/dist/query/QueryProvider.cjs.map +1 -1
- package/dist/query/QueryProvider.js.map +1 -1
- package/dist/query/constants.cjs.map +1 -1
- package/dist/query/constants.js.map +1 -1
- package/dist/query/create-query-keys.cjs.map +1 -1
- package/dist/query/create-query-keys.js.map +1 -1
- package/dist/query/foreign-client-warning.cjs.map +1 -1
- package/dist/query/foreign-client-warning.js.map +1 -1
- package/dist/query/offline-persistence.cjs +1 -1
- package/dist/query/offline-persistence.cjs.map +1 -1
- package/dist/query/offline-persistence.js +2 -10
- package/dist/query/offline-persistence.js.map +1 -1
- package/dist/query/optimistic.cjs.map +1 -1
- package/dist/query/optimistic.js.map +1 -1
- package/dist/query/pagination.cjs.map +1 -1
- package/dist/query/pagination.js.map +1 -1
- package/dist/query/retry-policy.cjs.map +1 -1
- package/dist/query/retry-policy.js.map +1 -1
- package/dist/query/use-cursor-query.cjs.map +1 -1
- package/dist/query/use-cursor-query.js.map +1 -1
- package/dist/query/use-offline-mutation.cjs.map +1 -1
- package/dist/query/use-offline-mutation.js.map +1 -1
- package/dist/query/use-paginated-query.cjs.map +1 -1
- package/dist/query/use-paginated-query.js.map +1 -1
- package/dist/router/AppRouter.cjs.map +1 -1
- package/dist/router/AppRouter.js.map +1 -1
- package/dist/router/RouteGuard.cjs.map +1 -1
- package/dist/router/RouteGuard.js.map +1 -1
- package/dist/router/index.js +2 -2
- package/dist/share/share-or-download.cjs.map +1 -1
- package/dist/share/share-or-download.js.map +1 -1
- package/dist/share/share.cjs.map +1 -1
- package/dist/share/share.js.map +1 -1
- package/dist/sse/create-event-stream.cjs +1 -1
- package/dist/sse/create-event-stream.cjs.map +1 -1
- package/dist/sse/create-event-stream.js +44 -30
- package/dist/sse/create-event-stream.js.map +1 -1
- package/dist/sse/ticket-event-stream.cjs +2 -0
- package/dist/sse/ticket-event-stream.cjs.map +1 -0
- package/dist/sse/ticket-event-stream.js +41 -0
- package/dist/sse/ticket-event-stream.js.map +1 -0
- package/dist/sse/use-event-stream.cjs +1 -1
- package/dist/sse/use-event-stream.cjs.map +1 -1
- package/dist/sse/use-event-stream.js +7 -4
- package/dist/sse/use-event-stream.js.map +1 -1
- package/dist/store/create-selectors.cjs.map +1 -1
- package/dist/store/create-selectors.js.map +1 -1
- package/dist/store/create-store.cjs.map +1 -1
- package/dist/store/create-store.js.map +1 -1
- package/dist/sw/background-sync.cjs.map +1 -1
- package/dist/sw/background-sync.js.map +1 -1
- package/dist/sw/cache-inspect.cjs.map +1 -1
- package/dist/sw/cache-inspect.js.map +1 -1
- package/dist/sw/cache.cjs +1 -1
- package/dist/sw/cache.cjs.map +1 -1
- package/dist/sw/cache.js +2 -6
- package/dist/sw/cache.js.map +1 -1
- package/dist/sw/create-push-handler.cjs.map +1 -1
- package/dist/sw/create-push-handler.js.map +1 -1
- package/dist/sw/credential-headers.cjs.map +1 -1
- package/dist/sw/credential-headers.js.map +1 -1
- package/dist/sw/periodic-sync.cjs.map +1 -1
- package/dist/sw/periodic-sync.js.map +1 -1
- package/dist/sw/register-service-worker.cjs.map +1 -1
- package/dist/sw/register-service-worker.js.map +1 -1
- package/dist/sw/session-data.cjs.map +1 -1
- package/dist/sw/session-data.js.map +1 -1
- package/dist/tabular/assets.cjs.map +1 -1
- package/dist/tabular/assets.js.map +1 -1
- package/dist/tabular/cache.cjs.map +1 -1
- package/dist/tabular/cache.js.map +1 -1
- package/dist/tabular/compact.cjs.map +1 -1
- package/dist/tabular/compact.js.map +1 -1
- package/dist/tabular/exceptions.cjs.map +1 -1
- package/dist/tabular/exceptions.js.map +1 -1
- package/dist/tabular/manifest.cjs.map +1 -1
- package/dist/tabular/manifest.js.map +1 -1
- package/dist/tabular/predictor.cjs.map +1 -1
- package/dist/tabular/predictor.js.map +1 -1
- package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
- package/dist/tabular/use-tabular-predictor.js.map +1 -1
- package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
- package/dist/telemetry/TelemetryProvider.js.map +1 -1
- package/dist/telemetry/app-error-adapter.cjs.map +1 -1
- package/dist/telemetry/app-error-adapter.js.map +1 -1
- package/dist/telemetry/app-error-queue.cjs.map +1 -1
- package/dist/telemetry/app-error-queue.js.map +1 -1
- package/dist/telemetry/app-error-reporter.cjs.map +1 -1
- package/dist/telemetry/app-error-reporter.js.map +1 -1
- package/dist/telemetry/app-error-schema.cjs.map +1 -1
- package/dist/telemetry/app-error-schema.js.map +1 -1
- package/dist/telemetry/app-error-transport.cjs.map +1 -1
- package/dist/telemetry/app-error-transport.js.map +1 -1
- package/dist/telemetry/console-adapter.cjs.map +1 -1
- package/dist/telemetry/console-adapter.js.map +1 -1
- package/dist/telemetry/describe-app-error.cjs.map +1 -1
- package/dist/telemetry/describe-app-error.js.map +1 -1
- package/dist/telemetry/posthog-adapter.cjs +1 -1
- package/dist/telemetry/posthog-adapter.cjs.map +1 -1
- package/dist/telemetry/posthog-adapter.js +1 -5
- package/dist/telemetry/posthog-adapter.js.map +1 -1
- package/dist/telemetry/sentry-adapter.cjs.map +1 -1
- package/dist/telemetry/sentry-adapter.js.map +1 -1
- package/dist/tempest-react-sdk.cjs +1 -1
- package/dist/tempest-react-sdk.d.ts +440 -7
- package/dist/tempest-react-sdk.js +122 -120
- package/dist/testing/create-mock-handlers.cjs.map +1 -1
- package/dist/testing/create-mock-handlers.js.map +1 -1
- package/dist/testing.js +1 -2
- package/dist/theme/ThemeProvider.cjs.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/apply-theme.cjs.map +1 -1
- package/dist/theme/apply-theme.js.map +1 -1
- package/dist/theme/color.cjs.map +1 -1
- package/dist/theme/color.js.map +1 -1
- package/dist/theme/create-theme.cjs.map +1 -1
- package/dist/theme/create-theme.js.map +1 -1
- package/dist/theme/data-viz-ramps.cjs.map +1 -1
- package/dist/theme/data-viz-ramps.js.map +1 -1
- package/dist/theme/initial-theme.cjs.map +1 -1
- package/dist/theme/initial-theme.js.map +1 -1
- package/dist/theme/inverse-render.cjs.map +1 -1
- package/dist/theme/inverse-render.js.map +1 -1
- package/dist/theme/inverse-restore.cjs.map +1 -1
- package/dist/theme/inverse-restore.js.map +1 -1
- package/dist/theme/inverse-surface.cjs.map +1 -1
- package/dist/theme/inverse-surface.js.map +1 -1
- package/dist/theme/status-tokens.cjs.map +1 -1
- package/dist/theme/status-tokens.js.map +1 -1
- package/dist/theme/theme-presets.cjs.map +1 -1
- package/dist/theme/theme-presets.js.map +1 -1
- package/dist/utils/absent.cjs.map +1 -1
- package/dist/utils/absent.js.map +1 -1
- package/dist/utils/arrays.cjs.map +1 -1
- package/dist/utils/arrays.js.map +1 -1
- package/dist/utils/base64.cjs.map +1 -1
- package/dist/utils/base64.js.map +1 -1
- package/dist/utils/cn.cjs.map +1 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/compare-values.cjs.map +1 -1
- package/dist/utils/compare-values.js.map +1 -1
- package/dist/utils/compressed-storage.cjs.map +1 -1
- package/dist/utils/compressed-storage.js.map +1 -1
- package/dist/utils/csv.cjs.map +1 -1
- package/dist/utils/csv.js.map +1 -1
- package/dist/utils/dev-mode.cjs.map +1 -1
- package/dist/utils/dev-mode.js.map +1 -1
- package/dist/utils/duplicate-instance.cjs.map +1 -1
- package/dist/utils/duplicate-instance.js.map +1 -1
- package/dist/utils/format.cjs.map +1 -1
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/functions.cjs +1 -1
- package/dist/utils/functions.cjs.map +1 -1
- package/dist/utils/functions.js +1 -1
- package/dist/utils/functions.js.map +1 -1
- package/dist/utils/guards.cjs.map +1 -1
- package/dist/utils/guards.js.map +1 -1
- package/dist/utils/ids.cjs.map +1 -1
- package/dist/utils/ids.js.map +1 -1
- package/dist/utils/intl-cache.cjs.map +1 -1
- package/dist/utils/intl-cache.js.map +1 -1
- package/dist/utils/json-frame.cjs.map +1 -1
- package/dist/utils/json-frame.js.map +1 -1
- package/dist/utils/numbers.cjs.map +1 -1
- package/dist/utils/numbers.js.map +1 -1
- package/dist/utils/objects.cjs.map +1 -1
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/owner-fingerprint.cjs.map +1 -1
- package/dist/utils/owner-fingerprint.js.map +1 -1
- package/dist/utils/promises.cjs.map +1 -1
- package/dist/utils/promises.js.map +1 -1
- package/dist/utils/relative-time.cjs.map +1 -1
- package/dist/utils/relative-time.js.map +1 -1
- package/dist/utils/safe-url.cjs.map +1 -1
- package/dist/utils/safe-url.js.map +1 -1
- package/dist/utils/schema-like.cjs.map +1 -1
- package/dist/utils/schema-like.js.map +1 -1
- package/dist/utils/storage.cjs +1 -1
- package/dist/utils/storage.cjs.map +1 -1
- package/dist/utils/storage.js +2 -2
- package/dist/utils/storage.js.map +1 -1
- package/dist/utils/strings.cjs.map +1 -1
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/xlsx.cjs.map +1 -1
- package/dist/utils/xlsx.js.map +1 -1
- package/dist/vision/core/canvas.cjs.map +1 -1
- package/dist/vision/core/canvas.js.map +1 -1
- package/dist/vision/core/dtypes.cjs.map +1 -1
- package/dist/vision/core/dtypes.js.map +1 -1
- package/dist/vision/core/exceptions.cjs.map +1 -1
- package/dist/vision/core/exceptions.js.map +1 -1
- package/dist/vision/core/graph.cjs.map +1 -1
- package/dist/vision/core/graph.js.map +1 -1
- package/dist/vision/core/metadata.cjs +1 -1
- package/dist/vision/core/metadata.cjs.map +1 -1
- package/dist/vision/core/metadata.js +9 -26
- package/dist/vision/core/metadata.js.map +1 -1
- package/dist/vision/core/providers.cjs.map +1 -1
- package/dist/vision/core/providers.js.map +1 -1
- package/dist/vision/core/session.cjs.map +1 -1
- package/dist/vision/core/session.js.map +1 -1
- package/dist/vision/core/timing.cjs.map +1 -1
- package/dist/vision/core/timing.js.map +1 -1
- package/dist/vision/fusion.cjs.map +1 -1
- package/dist/vision/fusion.js.map +1 -1
- package/dist/vision/index.cjs.map +1 -1
- package/dist/vision/index.js.map +1 -1
- package/dist/vision/io/image.cjs.map +1 -1
- package/dist/vision/io/image.js.map +1 -1
- package/dist/vision/labels.cjs.map +1 -1
- package/dist/vision/labels.js.map +1 -1
- package/dist/vision/luminance.cjs.map +1 -1
- package/dist/vision/luminance.js.map +1 -1
- package/dist/vision/normalization.cjs.map +1 -1
- package/dist/vision/normalization.js.map +1 -1
- package/dist/vision/postprocess/classification.cjs.map +1 -1
- package/dist/vision/postprocess/classification.js.map +1 -1
- package/dist/vision/postprocess/detection.cjs.map +1 -1
- package/dist/vision/postprocess/detection.js.map +1 -1
- package/dist/vision/postprocess/segmentation.cjs.map +1 -1
- package/dist/vision/postprocess/segmentation.js.map +1 -1
- package/dist/vision/preprocess/image.cjs.map +1 -1
- package/dist/vision/preprocess/image.js.map +1 -1
- package/dist/vision/preprocess/pipeline.cjs.map +1 -1
- package/dist/vision/preprocess/pipeline.js.map +1 -1
- package/dist/vision/results.cjs.map +1 -1
- package/dist/vision/results.js.map +1 -1
- package/dist/vision/tasks/base.cjs.map +1 -1
- package/dist/vision/tasks/base.js.map +1 -1
- package/dist/vision/tasks/classifier.cjs.map +1 -1
- package/dist/vision/tasks/classifier.js.map +1 -1
- package/dist/vision/tasks/detectClassify.cjs.map +1 -1
- package/dist/vision/tasks/detectClassify.js.map +1 -1
- package/dist/vision/tasks/detector.cjs.map +1 -1
- package/dist/vision/tasks/detector.js.map +1 -1
- package/dist/vision/tasks/segmenter.cjs.map +1 -1
- package/dist/vision/tasks/segmenter.js.map +1 -1
- package/dist/vision/types.cjs.map +1 -1
- package/dist/vision/types.js.map +1 -1
- package/dist/vision/use-camera-stream.cjs +1 -1
- package/dist/vision/use-camera-stream.cjs.map +1 -1
- package/dist/vision/use-camera-stream.js +3 -9
- package/dist/vision/use-camera-stream.js.map +1 -1
- package/dist/vision/use-live-luminance.cjs +1 -1
- package/dist/vision/use-live-luminance.cjs.map +1 -1
- package/dist/vision/use-live-luminance.js +1 -5
- package/dist/vision/use-live-luminance.js.map +1 -1
- package/dist/vite/base-url.cjs.map +1 -1
- package/dist/vite/base-url.js.map +1 -1
- package/dist/vite/create-vite-config.cjs.map +1 -1
- package/dist/vite/create-vite-config.js.map +1 -1
- package/dist/vite/narrow-tokens.cjs.map +1 -1
- package/dist/vite/narrow-tokens.js.map +1 -1
- package/dist/vite/tempest-csp.cjs +1 -1
- package/dist/vite/tempest-csp.cjs.map +1 -1
- package/dist/vite/tempest-csp.js +2 -10
- package/dist/vite/tempest-csp.js.map +1 -1
- package/dist/vite/tempest-icons.cjs.map +1 -1
- package/dist/vite/tempest-icons.js.map +1 -1
- package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
- package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
- package/dist/vite/tempest-pwa-dev-sw.js +9 -16
- package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
- package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
- package/dist/vite/tempest-pwa-icons.js.map +1 -1
- package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
- package/dist/vite/tempest-pwa-manifest.js.map +1 -1
- package/dist/vite/tempest-styles.cjs.map +1 -1
- package/dist/vite/tempest-styles.js.map +1 -1
- package/dist/vite/tempest-vitest.cjs.map +1 -1
- package/dist/vite/tempest-vitest.js.map +1 -1
- package/dist/webrtc/link-stats.cjs.map +1 -1
- package/dist/webrtc/link-stats.js.map +1 -1
- package/dist/webrtc/mesh-quality.cjs.map +1 -1
- package/dist/webrtc/mesh-quality.js.map +1 -1
- package/dist/webrtc/opus-sdp.cjs.map +1 -1
- package/dist/webrtc/opus-sdp.js.map +1 -1
- package/dist/webrtc/peer-link.cjs +1 -1
- package/dist/webrtc/peer-link.cjs.map +1 -1
- package/dist/webrtc/peer-link.js +2 -5
- package/dist/webrtc/peer-link.js.map +1 -1
- package/dist/webrtc/peer-mesh.cjs +1 -1
- package/dist/webrtc/peer-mesh.cjs.map +1 -1
- package/dist/webrtc/peer-mesh.js +8 -24
- package/dist/webrtc/peer-mesh.js.map +1 -1
- package/dist/webrtc/sender-bitrate.cjs.map +1 -1
- package/dist/webrtc/sender-bitrate.js.map +1 -1
- package/dist/webrtc/use-link-stats.cjs.map +1 -1
- package/dist/webrtc/use-link-stats.js.map +1 -1
- package/dist/ws/create-web-socket.cjs +1 -1
- package/dist/ws/create-web-socket.cjs.map +1 -1
- package/dist/ws/create-web-socket.js +4 -22
- package/dist/ws/create-web-socket.js.map +1 -1
- package/dist/ws/resilience.cjs.map +1 -1
- package/dist/ws/resilience.js.map +1 -1
- package/dist/ws/use-web-socket.cjs.map +1 -1
- package/dist/ws/use-web-socket.js.map +1 -1
- package/package.json +9 -6
- package/template/package.json +1 -1
package/dist/br/pix.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pix.js","names":[],"sources":["../../src/br/pix.ts"],"sourcesContent":["/**\n * @tempest-limits file-lines — EMV®QRCPS-MPM for Pix: the TLV writer, the\n * CRC16-CCITT, the field catalogue with its nesting, key-type detection and the\n * parser that has to accept what other banks emit. Reader and writer live together\n * because each one is the other's test — a payload this file builds is a payload it\n * must parse back.\n */\nimport { validateCNPJ, validateCPF } from \"@/forms/br-validators\";\n\n/**\n * A Pix payload could not be built or read.\n *\n * Its own class so a caller can tell \"the operator typed a bad key\" apart from a\n * bug, and so an `ErrorBoundary` can render a form error instead of a crash.\n */\nexport class PixError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PixError\";\n }\n}\n\n/** The five key formats DICT accepts. */\nexport type PixKeyType = \"cpf\" | \"cnpj\" | \"email\" | \"phone\" | \"evp\";\n\n/** A key after normalisation, ready to go into the payload. */\nexport interface NormalizedPixKey {\n type: PixKeyType;\n /** The exact string written into the BR Code. */\n value: string;\n}\n\n/** One TLV as it appeared in a payload, unknown tags included. */\nexport interface PixField {\n /** Two-character tag, e.g. `\"59\"`. */\n id: string;\n /** Raw value, still encoded when the tag is itself a template. */\n value: string;\n}\n\n/** A BR Code that carries the key — the one you print on a poster. */\nexport interface PixStaticInput {\n kind?: \"static\";\n /** CPF, CNPJ, e-mail, phone or EVP. Validated and normalised. */\n key: string;\n /** Payee name. Truncated by the spec at 25 characters — longer throws. */\n merchantName: string;\n /** Payee city. Truncated by the spec at 15 characters — longer throws. */\n merchantCity: string;\n /** Amount in BRL. Omit for a payer-chooses-the-value QR. */\n amount?: number;\n /** Reference the PSP echoes back, `[A-Za-z0-9]{1,25}`. Defaults to `\"***\"`. */\n txid?: string;\n /** Free text shown by some wallets. Goes into tag 26, sub-tag 02. */\n description?: string;\n /** CEP, digits only. Optional tag 61. */\n postalCode?: string;\n /** Single-use QR: sets tag 01 to `\"12\"` instead of `\"11\"`. */\n oneTime?: boolean;\n}\n\n/** A BR Code that carries a URL the wallet fetches to learn the amount. */\nexport interface PixDynamicInput {\n kind: \"dynamic\";\n /**\n * `payloadLocation` — the https URL the wallet GETs, **without** the scheme,\n * exactly as BACEN specifies (`pix.example.com/qr/v2/abc`).\n */\n url: string;\n merchantName: string;\n merchantCity: string;\n postalCode?: string;\n /** Single-use QR. Defaults to `true`, which is what a dynamic QR normally is. */\n oneTime?: boolean;\n}\n\n/** Everything `pixPayload` accepts. */\nexport type PixInput = PixStaticInput | PixDynamicInput;\n\n/** A payload taken apart again. */\nexport interface PixData {\n /** `\"dynamic\"` when tag 26 carried a URL instead of a key. */\n kind: \"static\" | \"dynamic\";\n /** Present on a static payload. */\n key?: string;\n keyType?: PixKeyType;\n /** Present on a dynamic payload. */\n url?: string;\n merchantName: string;\n merchantCity: string;\n /** Reais. `undefined` when the payer chooses the amount. */\n amount?: number;\n /** ISO 4217 numeric. `\"986\"` for BRL. */\n currency: string;\n countryCode: string;\n merchantCategoryCode: string;\n /** `\"***\"` on a reusable static QR that identifies no single transaction. */\n txid?: string;\n description?: string;\n postalCode?: string;\n /** Tag 01 read as `\"12\"`. */\n oneTime: boolean;\n /** The four hex characters that closed the payload. */\n crc: string;\n /** Whether those four characters match a recomputed CRC. */\n crcValid: boolean;\n /** Every top-level TLV, in payload order, unknown tags included. */\n fields: PixField[];\n}\n\n/** Options for {@link parsePixPayload}. */\nexport interface ParsePixOptions {\n /**\n * Throw when the checksum does not match. Default `true`.\n *\n * Turn it off only to inspect a payload you already know is broken: a BR Code\n * whose CRC fails has been corrupted in transit, and the account it now points\n * at is not the account the payee published.\n */\n requireCrc?: boolean;\n}\n\n/**\n * Generator polynomial of CRC-16/CCITT-FALSE, `x^16 + x^12 + x^5 + 1`.\n *\n * Taken from the CRC catalogue entry `CRC-16/IBM-3740` (alias CCITT-FALSE):\n * `width=16 poly=0x1021 init=0xffff refin=false refout=false xorout=0x0000\n * check=0x29b1`. The BACEN \"Manual de Padrões para Iniciação do Pix\" names this\n * exact variant for tag 63.\n */\nconst CRC16_POLYNOMIAL = 0x1021;\n\n/** Register preset of CRC-16/CCITT-FALSE. Not zero — that is a different variant. */\nconst CRC16_INITIAL = 0xffff;\n\n/** Keeps the shift register 16 bits wide. */\nconst CRC16_MASK = 0xffff;\n\nconst TAG_PAYLOAD_FORMAT = \"00\";\nconst TAG_POINT_OF_INITIATION = \"01\";\nconst TAG_MERCHANT_ACCOUNT_INFO = \"26\";\nconst TAG_MERCHANT_CATEGORY_CODE = \"52\";\nconst TAG_TRANSACTION_CURRENCY = \"53\";\nconst TAG_TRANSACTION_AMOUNT = \"54\";\nconst TAG_COUNTRY_CODE = \"58\";\nconst TAG_MERCHANT_NAME = \"59\";\nconst TAG_MERCHANT_CITY = \"60\";\nconst TAG_POSTAL_CODE = \"61\";\nconst TAG_ADDITIONAL_DATA = \"62\";\nconst TAG_CRC = \"63\";\n\nconst MAI_TAG_GUI = \"00\";\nconst MAI_TAG_KEY = \"01\";\nconst MAI_TAG_DESCRIPTION = \"02\";\nconst MAI_TAG_URL = \"25\";\nconst ADDITIONAL_TAG_TXID = \"05\";\n\n/** Globally Unique Identifier that marks tag 26 as a Pix account. */\nconst PIX_GUI = \"br.gov.bcb.pix\";\n\nconst PAYLOAD_FORMAT_VERSION = \"01\";\nconst POINT_OF_INITIATION_REUSABLE = \"11\";\nconst POINT_OF_INITIATION_SINGLE_USE = \"12\";\nconst DEFAULT_MERCHANT_CATEGORY_CODE = \"0000\";\nconst CURRENCY_BRL = \"986\";\nconst COUNTRY_BR = \"BR\";\nconst TXID_UNSPECIFIED = \"***\";\n\nconst MAX_MERCHANT_NAME = 25;\nconst MAX_MERCHANT_CITY = 15;\nconst MAX_TXID = 25;\nconst MAX_TLV_VALUE = 99;\nconst MAX_EMAIL_KEY = 77;\n\n/**\n * Tag 54 as EMV® QRCPS-MPM writes it: digits, and at most one `.` as the decimal\n * mark, which \"may be present even if there are no decimals\" (`\"98.\"`). Up to two\n * decimals, the minor unit ISO 4217 gives BRL (`986`). No sign, exponent, comma,\n * hex prefix or whitespace — every one of which `Number()` would happily read.\n *\n * Zero (`\"0\"`, `\"0.00\"`) is accepted: EMV asks for a non-zero amount, but the BACEN\n * BR Code manual (v2, Table 1) gives `\"0\"` as an example value of tag 54, and the\n * parser reads payloads other PSPs emit — strict with what is malformed, tolerant\n * with what the Bacen spec accepts. The builder stays stricter: `pixPayload`\n * still refuses a non-positive amount, because it only writes what we choose to emit.\n */\nconst AMOUNT_FIELD = /^\\d+(?:\\.\\d{0,2})?$/;\n\n/** Width of tag 54: \"01..13\" in the BACEN BR Code manual, Table 1. */\nconst MAX_AMOUNT_FIELD = 13;\n\n/**\n * CRC-16/CCITT-FALSE of a string, as four upper-case hex characters.\n *\n * Bitwise rather than table-driven: 200-odd characters at 8 shifts each is\n * nothing, and a 256-entry table is 2 KB of payload every consumer of the `/br`\n * entry would carry.\n *\n * The input is taken as UTF-8 bytes. A Pix payload is ASCII by construction —\n * {@link pixPayload} rejects anything else — but the function is exported and a\n * caller may hand it arbitrary text, and hashing UTF-16 code units would then\n * disagree with every other implementation.\n *\n * @param input - Bytes to run through the register.\n * @returns Four upper-case hex characters, zero-padded.\n *\n * @example\n * pixCrc16(\"123456789\"); // \"29B1\" — the catalogue check value\n */\nexport function pixCrc16(input: string): string {\n const bytes = new TextEncoder().encode(input);\n let crc = CRC16_INITIAL;\n for (const byte of bytes) {\n crc ^= byte << 8;\n for (let bit = 0; bit < 8; bit += 1) {\n crc =\n (crc & 0x8000) !== 0\n ? ((crc << 1) ^ CRC16_POLYNOMIAL) & CRC16_MASK\n : (crc << 1) & CRC16_MASK;\n }\n }\n return crc.toString(16).toUpperCase().padStart(4, \"0\");\n}\n\n/** Digits of a possibly masked value. */\nfunction digits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/**\n * Drop diacritics and reject whatever is left outside printable ASCII.\n *\n * The BR Code character set has no room for accents, and a wallet that meets one\n * either fails to parse the QR or shows mojibake. Stripping them is lossy but\n * legible (\"São Paulo\" → \"Sao Paulo\"), which beats both alternatives; anything\n * that is not a diacritic — an emoji, a CJK character — is a mistake the caller\n * has to see, so it throws.\n */\nfunction toPayloadText(value: string, field: string): string {\n const stripped = value.normalize(\"NFD\").replace(/\\p{Diacritic}/gu, \"\");\n if (/[^\\x20-\\x7E]/.test(stripped)) {\n throw new PixError(\n `${field} has characters the BR Code cannot carry: ${JSON.stringify(value)}. ` +\n \"Use unaccented ASCII.\",\n );\n }\n return stripped;\n}\n\n/**\n * The EMV \"Common Character Set\" that an `ans` (Alphanumeric Special) field may\n * carry: printable ASCII, `0x20`–`0x7E`. Every root field of a BR Code is `ans`,\n * and the BACEN BR Code manual (v2, May 2020) only widened it from alphanumeric —\n * \"The restriction that established that only alphanumeric characters could be\n * used has been removed\" — not past it. Only the alternate-language template\n * (tag 64) is `String` and may carry another character set, and the builder\n * never writes it.\n */\nconst COMMON_CHARACTER_SET = /^[\\x20-\\x7E]*$/;\n\n/**\n * One `ID + 2-digit length + value` triple.\n *\n * The length is \"the number of characters included in the [value] field\" (EMV\n * MPM, as restated by the HKMA Common QR Code Specification §2; the BACEN manual:\n * \"size specifies how many characters\"). Inside the common character set a\n * character is one UTF-16 unit and one UTF-8 byte, so `value.length` is exact —\n * which is why a value outside it throws instead of being measured.\n *\n * @throws {PixError} When the value leaves the common character set or exceeds\n * the two-digit length.\n */\nfunction tlv(id: string, value: string): string {\n if (!COMMON_CHARACTER_SET.test(value)) {\n throw new PixError(\n `Tag ${id} has characters outside the EMV common character set (printable ASCII): ` +\n `${JSON.stringify(value)}.`,\n );\n }\n if (value.length > MAX_TLV_VALUE) {\n throw new PixError(\n `Tag ${id} is ${value.length} characters; the EMV length field holds at most ${MAX_TLV_VALUE}.`,\n );\n }\n return `${id}${String(value.length).padStart(2, \"0\")}${value}`;\n}\n\n/**\n * Classify a Pix key, or `null` when it matches no accepted format.\n *\n * !!! warning \"CPF and a national phone number are both eleven digits\"\n * `\"11987654321\"` is a valid mobile number and could be a CPF. The check\n * digits break the tie: an 11-digit string is a CPF when its DV validates and\n * a phone otherwise. Pass phone keys as `+5511987654321` to remove the guess\n * entirely.\n *\n * @param key - Raw key, masked or not.\n * @returns The key type, or `null`.\n */\nexport function pixKeyType(key: string): PixKeyType | null {\n const trimmed = key.trim();\n if (trimmed === \"\") return null;\n\n if (trimmed.includes(\"@\")) {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(trimmed) && trimmed.length <= MAX_EMAIL_KEY\n ? \"email\"\n : null;\n }\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmed)) {\n return \"evp\";\n }\n\n const numbers = digits(trimmed);\n if (numbers.length === 14) return validateCNPJ(numbers) ? \"cnpj\" : null;\n if (numbers.length === 11 && validateCPF(numbers)) return \"cpf\";\n if (trimmed.startsWith(\"+\")) {\n return /^\\+55\\d{10,11}$/.test(`+${numbers}`) ? \"phone\" : null;\n }\n if (numbers.length === 10 || numbers.length === 11) return \"phone\";\n if (numbers.length === 12 || numbers.length === 13) {\n return numbers.startsWith(\"55\") ? \"phone\" : null;\n }\n return null;\n}\n\n/**\n * Validate a Pix key and return the exact string to write into the payload.\n *\n * Normalisation per type: CPF and CNPJ lose their mask, a phone becomes E.164\n * with the `+55` country code, an EVP is lower-cased, and an e-mail is\n * lower-cased because DICT stores it that way — a key that differs only in case\n * would otherwise fail to resolve.\n *\n * All validation lives in {@link pixKeyType}; past that gate the normalisation is\n * total, which is why the phone branch strips a country code purely on length\n * rather than re-checking the shape.\n *\n * @param key - Raw key, masked or not.\n * @returns The type and the normalised value.\n * @throws {PixError} When the key matches no accepted format, or when a document\n * key fails its check digits.\n *\n * @example\n * normalizePixKey(\"123.456.789-09\"); // { type: \"cpf\", value: \"12345678909\" }\n * normalizePixKey(\"(11) 98765-4321\"); // { type: \"phone\", value: \"+5511987654321\" }\n */\nexport function normalizePixKey(key: string): NormalizedPixKey {\n const trimmed = key.trim();\n const type = pixKeyType(trimmed);\n if (type === null) {\n throw new PixError(\n `Not a Pix key: ${JSON.stringify(key)}. Expected a CPF, CNPJ, e-mail, ` +\n \"phone (+5511987654321) or EVP (UUID).\",\n );\n }\n\n if (type === \"email\") return { type, value: trimmed.toLowerCase() };\n if (type === \"evp\") return { type, value: trimmed.toLowerCase() };\n if (type === \"phone\") {\n const numbers = digits(trimmed);\n return { type, value: `+55${numbers.length > 11 ? numbers.slice(2) : numbers}` };\n }\n return { type, value: digits(trimmed) };\n}\n\n/**\n * Format an amount the way tag 54 wants it: dot separator, two decimals.\n *\n * Positivity is checked on the rounded field, not on the input: `0.004` is\n * positive and still writes `\"0.00\"`, a zero-value QR for a positive charge.\n */\nfunction toAmountField(amount: number): string {\n if (!Number.isFinite(amount)) {\n throw new PixError(`Amount must be a finite number, got ${amount}.`);\n }\n if (amount <= 0) {\n throw new PixError(\n `Amount must be positive, got ${amount}. Omit \\`amount\\` for a QR whose value the payer types.`,\n );\n }\n const field = amount.toFixed(2);\n if (Number(field) <= 0) {\n throw new PixError(\n `Amount ${amount} rounds to ${field} at two decimals. Omit \\`amount\\` for a QR whose value the payer types.`,\n );\n }\n if (field.length > 13) {\n throw new PixError(`Amount ${field} does not fit tag 54, which holds 13 characters.`);\n }\n return field;\n}\n\n/** Bound the two free-text identity fields the spec caps hard. */\nfunction toBoundedText(value: string, max: number, field: string): string {\n const text = toPayloadText(value.trim(), field);\n if (text === \"\") throw new PixError(`${field} is required.`);\n if (text.length > max) {\n throw new PixError(\n `${field} is ${text.length} characters; the BR Code allows ${max}. Shorten it — ` +\n \"truncating here would silently change what the payer sees.\",\n );\n }\n return text;\n}\n\n/** Tag 62, which exists only to carry the txid. */\nfunction additionalDataField(txid: string | undefined): string {\n const value = txid?.trim() ?? \"\";\n if (value === \"\" || value === TXID_UNSPECIFIED) {\n return tlv(TAG_ADDITIONAL_DATA, tlv(ADDITIONAL_TAG_TXID, TXID_UNSPECIFIED));\n }\n if (!new RegExp(`^[A-Za-z0-9]{1,${MAX_TXID}}$`).test(value)) {\n throw new PixError(\n `txid must be 1 to ${MAX_TXID} letters or digits, got ${JSON.stringify(txid)}.`,\n );\n }\n return tlv(TAG_ADDITIONAL_DATA, tlv(ADDITIONAL_TAG_TXID, value));\n}\n\n/** Tag 26 for a static payload: GUI, key and the optional description. */\nfunction staticMerchantAccount(input: PixStaticInput): string {\n const { value } = normalizePixKey(input.key);\n let inner = tlv(MAI_TAG_GUI, PIX_GUI) + tlv(MAI_TAG_KEY, value);\n const description = input.description?.trim();\n if (description !== undefined && description !== \"\") {\n inner += tlv(MAI_TAG_DESCRIPTION, toPayloadText(description, \"description\"));\n }\n if (inner.length > MAX_TLV_VALUE) {\n throw new PixError(\n `Tag 26 is ${inner.length} characters, over the ${MAX_TLV_VALUE} the length field allows. ` +\n \"Shorten `description`.\",\n );\n }\n return tlv(TAG_MERCHANT_ACCOUNT_INFO, inner);\n}\n\n/** Tag 26 for a dynamic payload: GUI plus the URL, and no key. */\nfunction dynamicMerchantAccount(input: PixDynamicInput): string {\n const url = toPayloadText(input.url.trim(), \"url\").replace(/^https?:\\/\\//i, \"\");\n if (url === \"\") throw new PixError(\"url is required for a dynamic BR Code.\");\n const inner = tlv(MAI_TAG_GUI, PIX_GUI) + tlv(MAI_TAG_URL, url);\n if (inner.length > MAX_TLV_VALUE) {\n throw new PixError(\n `Tag 26 is ${inner.length} characters, over the ${MAX_TLV_VALUE} the length field allows. ` +\n \"Shorten the payload URL.\",\n );\n }\n return tlv(TAG_MERCHANT_ACCOUNT_INFO, inner);\n}\n\n/**\n * Build a Pix \"Copia e Cola\" payload — the string behind a Pix QR code.\n *\n * The format is EMVCo MPM: a flat list of `ID + 2-digit length + value` triples,\n * closed by tag 63 holding a CRC-16/CCITT-FALSE over **everything before it,\n * including the literal `6304` header of tag 63 itself**. That last detail is the\n * one implementations get wrong; see {@link pixCrc16}.\n *\n * Two shapes come out of here:\n *\n * - **static** — tag 26 carries the key, so the QR is self-contained and can be\n * printed. Amount optional; a txid of `\"***\"` means \"identifies no single\n * transaction\", which is what a reusable poster QR wants.\n * - **dynamic** — tag 26 carries a URL instead, and the wallet fetches the amount\n * and payee from the PSP. Use it when the value is per-order. Defaults to\n * single-use (tag 01 = `12`).\n *\n * The distinction matters and is not cosmetic: a static QR settles against\n * whatever the payer typed, a dynamic one against what the PSP served, so a\n * charge that must reconcile to a cent needs the dynamic form.\n *\n * @param input - Static or dynamic payload description.\n * @returns The full payload, CRC included, ready to render as a QR or to copy.\n * @throws {PixError} On an unrecognised key, a field over its length cap, a\n * non-positive amount, or text that is not representable in the BR Code.\n *\n * @example\n * pixPayload({\n * key: \"12345678909\",\n * merchantName: \"Loja Tempest\",\n * merchantCity: \"São Paulo\",\n * amount: 25.5,\n * txid: \"PEDIDO123\",\n * });\n */\nexport function pixPayload(input: PixInput): string {\n const dynamic = input.kind === \"dynamic\";\n const oneTime = input.oneTime ?? dynamic;\n\n let payload = tlv(TAG_PAYLOAD_FORMAT, PAYLOAD_FORMAT_VERSION);\n payload += tlv(\n TAG_POINT_OF_INITIATION,\n oneTime ? POINT_OF_INITIATION_SINGLE_USE : POINT_OF_INITIATION_REUSABLE,\n );\n payload += dynamic ? dynamicMerchantAccount(input) : staticMerchantAccount(input);\n payload += tlv(TAG_MERCHANT_CATEGORY_CODE, DEFAULT_MERCHANT_CATEGORY_CODE);\n payload += tlv(TAG_TRANSACTION_CURRENCY, CURRENCY_BRL);\n if (!dynamic && input.amount !== undefined) {\n payload += tlv(TAG_TRANSACTION_AMOUNT, toAmountField(input.amount));\n }\n payload += tlv(TAG_COUNTRY_CODE, COUNTRY_BR);\n payload += tlv(\n TAG_MERCHANT_NAME,\n toBoundedText(input.merchantName, MAX_MERCHANT_NAME, \"merchantName\"),\n );\n payload += tlv(\n TAG_MERCHANT_CITY,\n toBoundedText(input.merchantCity, MAX_MERCHANT_CITY, \"merchantCity\"),\n );\n const postalCode = input.postalCode === undefined ? \"\" : digits(input.postalCode);\n if (postalCode !== \"\") payload += tlv(TAG_POSTAL_CODE, postalCode);\n payload += additionalDataField(dynamic ? TXID_UNSPECIFIED : input.txid);\n\n const withCrcHeader = `${payload}${TAG_CRC}04`;\n return `${withCrcHeader}${pixCrc16(withCrcHeader)}`;\n}\n\n/**\n * Split a flat run of TLVs. Stops cleanly at the first malformed triple.\n *\n * An ID may appear once per level. The BACEN BR Code manual (v2, May 2020)\n * states it for the root — \"there are no duplicate IDs in the document's root,\n * according to\" EMV® QRCPS-MPM;\n * the same holds here inside tags 26 and 62, which no conforming emitter\n * repeats either. Keeping the first of two values would give the caller one\n * reading of the payload while a wallet that keeps the last pays another.\n *\n * Lengths count characters (code points), as EMV defines them — see {@link tlv}.\n * A payload from another PSP may carry a `String` template (tag 64, or an\n * unreserved one) with non-ASCII text, where counting UTF-16 units would split\n * a character and misread every tag after it.\n *\n * @throws {PixError} When a length prefix is not two digits, runs past the end,\n * or an ID repeats at this level.\n */\nfunction parseTlv(text: string, where: string): PixField[] {\n const input = Array.from(text);\n const fields: PixField[] = [];\n let cursor = 0;\n while (cursor < input.length) {\n const id = input.slice(cursor, cursor + 2).join(\"\");\n const rawLength = input.slice(cursor + 2, cursor + 4).join(\"\");\n if (!/^\\d{2}$/.test(id) || !/^\\d{2}$/.test(rawLength)) {\n throw new PixError(\n `Malformed TLV in ${where} at offset ${cursor}: expected a 2-digit tag and length.`,\n );\n }\n const length = Number(rawLength);\n const start = cursor + 4;\n if (start + length > input.length) {\n throw new PixError(\n `Tag ${id} in ${where} declares ${length} characters but only ${input.length - start} remain.`,\n );\n }\n if (fields.some((field) => field.id === id)) {\n throw new PixError(\n `Tag ${id} in ${where} appears more than once; a BR Code carries each tag once per level.`,\n );\n }\n fields.push({ id, value: input.slice(start, start + length).join(\"\") });\n cursor = start + length;\n }\n return fields;\n}\n\n/** The value of a tag — unique per level, see {@link parseTlv} — or `undefined`. */\nfunction pick(fields: readonly PixField[], id: string): string | undefined {\n return fields.find((field) => field.id === id)?.value;\n}\n\n/**\n * Read tag 54 into reais.\n *\n * @throws {PixError} When the field is outside the EMV format\n * ({@link AMOUNT_FIELD}) or wider than 13 characters. Zero is read as `0`; see\n * {@link AMOUNT_FIELD} for why the reader accepts what `pixPayload` refuses.\n */\nfunction readAmountField(field: string): number {\n if (field.length > MAX_AMOUNT_FIELD || !AMOUNT_FIELD.test(field)) {\n throw new PixError(\n `Tag 54 (amount) must be an amount like \"25.50\", with \".\" as the decimal mark, ` +\n `at most two decimals and ${MAX_AMOUNT_FIELD} characters; got ${JSON.stringify(field)}.`,\n );\n }\n return Number(field);\n}\n\n/**\n * Read a Pix \"Copia e Cola\" payload back into its parts.\n *\n * Tolerant by design: tags the SDK does not know about are kept verbatim in\n * {@link PixData.fields} instead of raising, because PSPs do add their own\n * templates and a reader that rejects them is useless in production. What is\n * *not* tolerated is a broken frame — a length prefix that runs off the end, a\n * missing tag 63 — a checksum mismatch, which means the string was corrupted in\n * transit, or a payload with two readings: a tag repeated at the root or inside\n * tags 26 and 62, a tag 63 anywhere but at the end, a tag 26 with both a key and\n * a URL, or a tag 54 outside the EMV amount format. A preview built from one\n * reading while the wallet pays the other is the failure those rules exist for.\n *\n * Position is checked where EMV® QRCPS-MPM — the reference the BACEN manual\n * defers to — fixes it: tag 00 is the first object and tag 63 the last; every\n * other root tag may appear in any order. Before #475 an inner `6304` + CRC\n * followed by `5405…` and a second `6304` + CRC parsed as a priced payload,\n * while the same text cut at the first CRC was a valid payload with no amount.\n *\n * The CRC detects corruption, not authorship: whoever crafts a payload\n * recomputes it, so a valid CRC says nothing about who published the account.\n *\n * @param payload - The copia-e-cola string. Surrounding whitespace is ignored.\n * @param options - See {@link ParsePixOptions}.\n * @returns The decoded payload.\n * @throws {PixError} On a malformed frame, a missing CRC tag, a tag 00 that is\n * not first or a tag 63 that is not last, a repeated tag, a\n * tag 26 that is not a Pix account or that carries both a key and a URL, an\n * amount outside the EMV format, or — unless `requireCrc` is `false` — a CRC\n * mismatch.\n *\n * @example\n * const data = parsePixPayload(copied);\n * console.log(data.key, data.amount, data.txid);\n */\nexport function parsePixPayload(payload: string, options: ParsePixOptions = {}): PixData {\n const { requireCrc = true } = options;\n const text = payload.trim();\n if (text.length < 8) throw new PixError(\"Payload is too short to be a BR Code.\");\n\n const crcHeaderAt = text.length - 8;\n if (text.slice(crcHeaderAt, crcHeaderAt + 4) !== `${TAG_CRC}04`) {\n throw new PixError(\"Payload does not end in a `6304` CRC tag.\");\n }\n const crc = text.slice(-4).toUpperCase();\n const expected = pixCrc16(text.slice(0, -4));\n const crcValid = crc === expected;\n if (!crcValid && requireCrc) {\n throw new PixError(`CRC mismatch: payload says ${crc}, recomputed ${expected}.`);\n }\n\n const fields = parseTlv(text.slice(0, crcHeaderAt), \"payload\");\n if (fields[0]?.id !== TAG_PAYLOAD_FORMAT) {\n throw new PixError(\"Tag 00 (payload format indicator) must be the first tag of a BR Code.\");\n }\n if (fields.some((field) => field.id === TAG_CRC)) {\n throw new PixError(\n \"Tag 63 (CRC) must be the last tag of a BR Code; this payload carries another one before the end.\",\n );\n }\n const merchantAccount = pick(fields, TAG_MERCHANT_ACCOUNT_INFO);\n if (merchantAccount === undefined) {\n throw new PixError(\"Payload has no tag 26 (merchant account information).\");\n }\n const account = parseTlv(merchantAccount, \"tag 26\");\n const gui = pick(account, MAI_TAG_GUI);\n if (gui?.toLowerCase() !== PIX_GUI) {\n throw new PixError(\n `Tag 26 is not a Pix account: expected GUI ${PIX_GUI}, got ${JSON.stringify(gui)}.`,\n );\n }\n\n const url = pick(account, MAI_TAG_URL);\n const key = pick(account, MAI_TAG_KEY);\n if (url !== undefined && key !== undefined) {\n throw new PixError(\n \"Tag 26 carries both a key (01) and a URL (25); a BR Code is either static or dynamic, not both.\",\n );\n }\n const amountField = pick(fields, TAG_TRANSACTION_AMOUNT);\n const txid = pick(\n parseTlv(pick(fields, TAG_ADDITIONAL_DATA) ?? \"\", \"tag 62\"),\n ADDITIONAL_TAG_TXID,\n );\n\n return {\n kind: url === undefined ? \"static\" : \"dynamic\",\n ...(key === undefined ? {} : { key, keyType: pixKeyType(key) ?? undefined }),\n ...(url === undefined ? {} : { url }),\n merchantName: pick(fields, TAG_MERCHANT_NAME) ?? \"\",\n merchantCity: pick(fields, TAG_MERCHANT_CITY) ?? \"\",\n ...(amountField === undefined ? {} : { amount: readAmountField(amountField) }),\n currency: pick(fields, TAG_TRANSACTION_CURRENCY) ?? \"\",\n countryCode: pick(fields, TAG_COUNTRY_CODE) ?? \"\",\n merchantCategoryCode: pick(fields, TAG_MERCHANT_CATEGORY_CODE) ?? \"\",\n ...(txid === undefined ? {} : { txid }),\n ...(pick(account, MAI_TAG_DESCRIPTION) === undefined\n ? {}\n : { description: pick(account, MAI_TAG_DESCRIPTION) }),\n ...(pick(fields, TAG_POSTAL_CODE) === undefined\n ? {}\n : { postalCode: pick(fields, TAG_POSTAL_CODE) }),\n oneTime: pick(fields, TAG_POINT_OF_INITIATION) === POINT_OF_INITIATION_SINGLE_USE,\n crc,\n crcValid,\n fields,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pix.js","names":["PixError","message","CRC16_POLYNOMIAL","CRC16_INITIAL","CRC16_MASK","TAG_PAYLOAD_FORMAT","TAG_POINT_OF_INITIATION","TAG_MERCHANT_ACCOUNT_INFO","TAG_MERCHANT_CATEGORY_CODE","TAG_TRANSACTION_CURRENCY","TAG_TRANSACTION_AMOUNT","TAG_COUNTRY_CODE","TAG_MERCHANT_NAME","TAG_MERCHANT_CITY","TAG_POSTAL_CODE","TAG_ADDITIONAL_DATA","TAG_CRC","TAG_ALTERNATE_LANGUAGE","FIRST_UNRESERVED_TAG","MAI_TAG_GUI","MAI_TAG_KEY","MAI_TAG_DESCRIPTION","MAI_TAG_URL","ADDITIONAL_TAG_TXID","PIX_GUI","PAYLOAD_FORMAT_VERSION","POINT_OF_INITIATION_REUSABLE","POINT_OF_INITIATION_SINGLE_USE","DEFAULT_MERCHANT_CATEGORY_CODE","CURRENCY_BRL","COUNTRY_BR","TXID_UNSPECIFIED","MAX_MERCHANT_NAME","MAX_MERCHANT_CITY","MAX_TXID","MAX_TLV_VALUE","MAX_EMAIL_KEY","AMOUNT_FIELD","MAX_AMOUNT_FIELD","pixCrc16","bytes","input","crc","byte","bit","digits","value","toPayloadText","stripped","field","COMMON_CHARACTER_SET","tlv","id","pixKeyType","trimmed","key","numbers","validateCNPJ","validateCPF","normalizePixKey","type","toAmountField","amount","toBoundedText","text","max","additionalDataField","txid","staticMerchantAccount","inner","description","dynamicMerchantAccount","url","pixPayload","dynamic","oneTime","payload","postalCode","withCrcHeader","parseTlv","fields","cursor","rawLength","where","length","start","isStringFormatTag","ALTERNATE_LENGTH_UNITS","codePoint","frameIn","chars","remaining","end","width","assertSingleReading","body","unit","other","pick","readAmountField","parsePixPayload","options","crcHeaderAt","expected","crcValid","requireCrc","merchantAccount","account","gui","amountField"],"sources":["../../src/br/pix.ts"],"sourcesContent":["/**\n * @tempest-limits file-lines — EMV®QRCPS-MPM for Pix: the TLV writer, the\n * CRC16-CCITT, the field catalogue with its nesting, key-type detection and the\n * parser that has to accept what other banks emit. Reader and writer live together\n * because each one is the other's test — a payload this file builds is a payload it\n * must parse back.\n */\nimport { validateCNPJ, validateCPF } from \"@/forms/br-validators\";\n\n/**\n * A Pix payload could not be built or read.\n *\n * Its own class so a caller can tell \"the operator typed a bad key\" apart from a\n * bug, and so an `ErrorBoundary` can render a form error instead of a crash.\n */\nexport class PixError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PixError\";\n }\n}\n\n/** The five key formats DICT accepts. */\nexport type PixKeyType = \"cpf\" | \"cnpj\" | \"email\" | \"phone\" | \"evp\";\n\n/** A key after normalisation, ready to go into the payload. */\nexport interface NormalizedPixKey {\n type: PixKeyType;\n /** The exact string written into the BR Code. */\n value: string;\n}\n\n/** One TLV as it appeared in a payload, unknown tags included. */\nexport interface PixField {\n /** Two-character tag, e.g. `\"59\"`. */\n id: string;\n /** Raw value, still encoded when the tag is itself a template. */\n value: string;\n}\n\n/** A BR Code that carries the key — the one you print on a poster. */\nexport interface PixStaticInput {\n kind?: \"static\";\n /** CPF, CNPJ, e-mail, phone or EVP. Validated and normalised. */\n key: string;\n /** Payee name. Truncated by the spec at 25 characters — longer throws. */\n merchantName: string;\n /** Payee city. Truncated by the spec at 15 characters — longer throws. */\n merchantCity: string;\n /** Amount in BRL. Omit for a payer-chooses-the-value QR. */\n amount?: number;\n /** Reference the PSP echoes back, `[A-Za-z0-9]{1,25}`. Defaults to `\"***\"`. */\n txid?: string;\n /** Free text shown by some wallets. Goes into tag 26, sub-tag 02. */\n description?: string;\n /** CEP, digits only. Optional tag 61. */\n postalCode?: string;\n /** Single-use QR: sets tag 01 to `\"12\"` instead of `\"11\"`. */\n oneTime?: boolean;\n}\n\n/** A BR Code that carries a URL the wallet fetches to learn the amount. */\nexport interface PixDynamicInput {\n kind: \"dynamic\";\n /**\n * `payloadLocation` — the https URL the wallet GETs, **without** the scheme,\n * exactly as BACEN specifies (`pix.example.com/qr/v2/abc`).\n */\n url: string;\n merchantName: string;\n merchantCity: string;\n postalCode?: string;\n /** Single-use QR. Defaults to `true`, which is what a dynamic QR normally is. */\n oneTime?: boolean;\n}\n\n/** Everything `pixPayload` accepts. */\nexport type PixInput = PixStaticInput | PixDynamicInput;\n\n/** A payload taken apart again. */\nexport interface PixData {\n /** `\"dynamic\"` when tag 26 carried a URL instead of a key. */\n kind: \"static\" | \"dynamic\";\n /** Present on a static payload. */\n key?: string;\n keyType?: PixKeyType;\n /** Present on a dynamic payload. */\n url?: string;\n merchantName: string;\n merchantCity: string;\n /** Reais. `undefined` when the payer chooses the amount. */\n amount?: number;\n /** ISO 4217 numeric. `\"986\"` for BRL. */\n currency: string;\n countryCode: string;\n merchantCategoryCode: string;\n /** `\"***\"` on a reusable static QR that identifies no single transaction. */\n txid?: string;\n description?: string;\n postalCode?: string;\n /** Tag 01 read as `\"12\"`. */\n oneTime: boolean;\n /** The four hex characters that closed the payload. */\n crc: string;\n /** Whether those four characters match a recomputed CRC. */\n crcValid: boolean;\n /** Every top-level TLV, in payload order, unknown tags included. */\n fields: PixField[];\n}\n\n/** Options for {@link parsePixPayload}. */\nexport interface ParsePixOptions {\n /**\n * Throw when the checksum does not match. Default `true`.\n *\n * Turn it off only to inspect a payload you already know is broken: a BR Code\n * whose CRC fails has been corrupted in transit, and the account it now points\n * at is not the account the payee published.\n */\n requireCrc?: boolean;\n}\n\n/**\n * Generator polynomial of CRC-16/CCITT-FALSE, `x^16 + x^12 + x^5 + 1`.\n *\n * Taken from the CRC catalogue entry `CRC-16/IBM-3740` (alias CCITT-FALSE):\n * `width=16 poly=0x1021 init=0xffff refin=false refout=false xorout=0x0000\n * check=0x29b1`. The BACEN \"Manual de Padrões para Iniciação do Pix\" names this\n * exact variant for tag 63.\n */\nconst CRC16_POLYNOMIAL = 0x1021;\n\n/** Register preset of CRC-16/CCITT-FALSE. Not zero — that is a different variant. */\nconst CRC16_INITIAL = 0xffff;\n\n/** Keeps the shift register 16 bits wide. */\nconst CRC16_MASK = 0xffff;\n\nconst TAG_PAYLOAD_FORMAT = \"00\";\nconst TAG_POINT_OF_INITIATION = \"01\";\nconst TAG_MERCHANT_ACCOUNT_INFO = \"26\";\nconst TAG_MERCHANT_CATEGORY_CODE = \"52\";\nconst TAG_TRANSACTION_CURRENCY = \"53\";\nconst TAG_TRANSACTION_AMOUNT = \"54\";\nconst TAG_COUNTRY_CODE = \"58\";\nconst TAG_MERCHANT_NAME = \"59\";\nconst TAG_MERCHANT_CITY = \"60\";\nconst TAG_POSTAL_CODE = \"61\";\nconst TAG_ADDITIONAL_DATA = \"62\";\nconst TAG_CRC = \"63\";\nconst TAG_ALTERNATE_LANGUAGE = \"64\";\nconst FIRST_UNRESERVED_TAG = 80;\n\nconst MAI_TAG_GUI = \"00\";\nconst MAI_TAG_KEY = \"01\";\nconst MAI_TAG_DESCRIPTION = \"02\";\nconst MAI_TAG_URL = \"25\";\nconst ADDITIONAL_TAG_TXID = \"05\";\n\n/** Globally Unique Identifier that marks tag 26 as a Pix account. */\nconst PIX_GUI = \"br.gov.bcb.pix\";\n\nconst PAYLOAD_FORMAT_VERSION = \"01\";\nconst POINT_OF_INITIATION_REUSABLE = \"11\";\nconst POINT_OF_INITIATION_SINGLE_USE = \"12\";\nconst DEFAULT_MERCHANT_CATEGORY_CODE = \"0000\";\nconst CURRENCY_BRL = \"986\";\nconst COUNTRY_BR = \"BR\";\nconst TXID_UNSPECIFIED = \"***\";\n\nconst MAX_MERCHANT_NAME = 25;\nconst MAX_MERCHANT_CITY = 15;\nconst MAX_TXID = 25;\nconst MAX_TLV_VALUE = 99;\nconst MAX_EMAIL_KEY = 77;\n\n/**\n * Tag 54 as EMV® QRCPS-MPM writes it: digits, and at most one `.` as the decimal\n * mark, which \"may be present even if there are no decimals\" (`\"98.\"`). Up to two\n * decimals, the minor unit ISO 4217 gives BRL (`986`). No sign, exponent, comma,\n * hex prefix or whitespace — every one of which `Number()` would happily read.\n *\n * Zero (`\"0\"`, `\"0.00\"`) is accepted: EMV asks for a non-zero amount, but the BACEN\n * BR Code manual (v2, Table 1) gives `\"0\"` as an example value of tag 54, and the\n * parser reads payloads other PSPs emit — strict with what is malformed, tolerant\n * with what the Bacen spec accepts. The builder stays stricter: `pixPayload`\n * still refuses a non-positive amount, because it only writes what we choose to emit.\n */\nconst AMOUNT_FIELD = /^\\d+(?:\\.\\d{0,2})?$/;\n\n/** Width of tag 54: \"01..13\" in the BACEN BR Code manual, Table 1. */\nconst MAX_AMOUNT_FIELD = 13;\n\n/**\n * CRC-16/CCITT-FALSE of a string, as four upper-case hex characters.\n *\n * Bitwise rather than table-driven: 200-odd characters at 8 shifts each is\n * nothing, and a 256-entry table is 2 KB of payload every consumer of the `/br`\n * entry would carry.\n *\n * The input is taken as UTF-8 bytes. A Pix payload is ASCII by construction —\n * {@link pixPayload} rejects anything else — but the function is exported and a\n * caller may hand it arbitrary text, and hashing UTF-16 code units would then\n * disagree with every other implementation.\n *\n * @param input - Bytes to run through the register.\n * @returns Four upper-case hex characters, zero-padded.\n *\n * @example\n * pixCrc16(\"123456789\"); // \"29B1\" — the catalogue check value\n */\nexport function pixCrc16(input: string): string {\n const bytes = new TextEncoder().encode(input);\n let crc = CRC16_INITIAL;\n for (const byte of bytes) {\n crc ^= byte << 8;\n for (let bit = 0; bit < 8; bit += 1) {\n crc =\n (crc & 0x8000) !== 0\n ? ((crc << 1) ^ CRC16_POLYNOMIAL) & CRC16_MASK\n : (crc << 1) & CRC16_MASK;\n }\n }\n return crc.toString(16).toUpperCase().padStart(4, \"0\");\n}\n\n/** Digits of a possibly masked value. */\nfunction digits(value: string): string {\n return value.replace(/\\D/g, \"\");\n}\n\n/**\n * Drop diacritics and reject whatever is left outside printable ASCII.\n *\n * The BR Code character set has no room for accents, and a wallet that meets one\n * either fails to parse the QR or shows mojibake. Stripping them is lossy but\n * legible (\"São Paulo\" → \"Sao Paulo\"), which beats both alternatives; anything\n * that is not a diacritic — an emoji, a CJK character — is a mistake the caller\n * has to see, so it throws.\n */\nfunction toPayloadText(value: string, field: string): string {\n const stripped = value.normalize(\"NFD\").replace(/\\p{Diacritic}/gu, \"\");\n if (/[^\\x20-\\x7E]/.test(stripped)) {\n throw new PixError(\n `${field} has characters the BR Code cannot carry: ${JSON.stringify(value)}. ` +\n \"Use unaccented ASCII.\",\n );\n }\n return stripped;\n}\n\n/**\n * The EMV \"Common Character Set\" that an `ans` (Alphanumeric Special) field may\n * carry: printable ASCII, `0x20`–`0x7E`. Every root field of a BR Code is `ans`,\n * and the BACEN BR Code manual (v2, May 2020) only widened it from alphanumeric —\n * \"The restriction that established that only alphanumeric characters could be\n * used has been removed\" — not past it. Only the alternate-language template\n * (tag 64) and the unreserved templates 80–99 a PSP defines are `String` and\n * may carry another character set; the builder writes neither, and the reader\n * enforces the set on every other root tag (#497).\n */\nconst COMMON_CHARACTER_SET = /^[\\x20-\\x7E]*$/;\n\n/**\n * One `ID + 2-digit length + value` triple.\n *\n * The length is \"the number of characters included in the [value] field\" (EMV\n * MPM, as restated by the HKMA Common QR Code Specification §2; the BACEN manual:\n * \"size specifies how many characters\"). Inside the common character set a\n * character is one UTF-16 unit and one UTF-8 byte, so `value.length` is exact —\n * which is why a value outside it throws instead of being measured.\n *\n * @throws {PixError} When the value leaves the common character set or exceeds\n * the two-digit length.\n */\nfunction tlv(id: string, value: string): string {\n if (!COMMON_CHARACTER_SET.test(value)) {\n throw new PixError(\n `Tag ${id} has characters outside the EMV common character set (printable ASCII): ` +\n `${JSON.stringify(value)}.`,\n );\n }\n if (value.length > MAX_TLV_VALUE) {\n throw new PixError(\n `Tag ${id} is ${value.length} characters; the EMV length field holds at most ${MAX_TLV_VALUE}.`,\n );\n }\n return `${id}${String(value.length).padStart(2, \"0\")}${value}`;\n}\n\n/**\n * Classify a Pix key, or `null` when it matches no accepted format.\n *\n * !!! warning \"CPF and a national phone number are both eleven digits\"\n * `\"11987654321\"` is a valid mobile number and could be a CPF. The check\n * digits break the tie: an 11-digit string is a CPF when its DV validates and\n * a phone otherwise. Pass phone keys as `+5511987654321` to remove the guess\n * entirely.\n *\n * @param key - Raw key, masked or not.\n * @returns The key type, or `null`.\n */\nexport function pixKeyType(key: string): PixKeyType | null {\n const trimmed = key.trim();\n if (trimmed === \"\") return null;\n\n if (trimmed.includes(\"@\")) {\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/.test(trimmed) && trimmed.length <= MAX_EMAIL_KEY\n ? \"email\"\n : null;\n }\n if (/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(trimmed)) {\n return \"evp\";\n }\n\n const numbers = digits(trimmed);\n if (numbers.length === 14) return validateCNPJ(numbers) ? \"cnpj\" : null;\n if (numbers.length === 11 && validateCPF(numbers)) return \"cpf\";\n if (trimmed.startsWith(\"+\")) {\n return /^\\+55\\d{10,11}$/.test(`+${numbers}`) ? \"phone\" : null;\n }\n if (numbers.length === 10 || numbers.length === 11) return \"phone\";\n if (numbers.length === 12 || numbers.length === 13) {\n return numbers.startsWith(\"55\") ? \"phone\" : null;\n }\n return null;\n}\n\n/**\n * Validate a Pix key and return the exact string to write into the payload.\n *\n * Normalisation per type: CPF and CNPJ lose their mask, a phone becomes E.164\n * with the `+55` country code, an EVP is lower-cased, and an e-mail is\n * lower-cased because DICT stores it that way — a key that differs only in case\n * would otherwise fail to resolve.\n *\n * All validation lives in {@link pixKeyType}; past that gate the normalisation is\n * total, which is why the phone branch strips a country code purely on length\n * rather than re-checking the shape.\n *\n * @param key - Raw key, masked or not.\n * @returns The type and the normalised value.\n * @throws {PixError} When the key matches no accepted format, or when a document\n * key fails its check digits.\n *\n * @example\n * normalizePixKey(\"123.456.789-09\"); // { type: \"cpf\", value: \"12345678909\" }\n * normalizePixKey(\"(11) 98765-4321\"); // { type: \"phone\", value: \"+5511987654321\" }\n */\nexport function normalizePixKey(key: string): NormalizedPixKey {\n const trimmed = key.trim();\n const type = pixKeyType(trimmed);\n if (type === null) {\n throw new PixError(\n `Not a Pix key: ${JSON.stringify(key)}. Expected a CPF, CNPJ, e-mail, ` +\n \"phone (+5511987654321) or EVP (UUID).\",\n );\n }\n\n if (type === \"email\") return { type, value: trimmed.toLowerCase() };\n if (type === \"evp\") return { type, value: trimmed.toLowerCase() };\n if (type === \"phone\") {\n const numbers = digits(trimmed);\n return { type, value: `+55${numbers.length > 11 ? numbers.slice(2) : numbers}` };\n }\n return { type, value: digits(trimmed) };\n}\n\n/**\n * Format an amount the way tag 54 wants it: dot separator, two decimals.\n *\n * Positivity is checked on the rounded field, not on the input: `0.004` is\n * positive and still writes `\"0.00\"`, a zero-value QR for a positive charge.\n */\nfunction toAmountField(amount: number): string {\n if (!Number.isFinite(amount)) {\n throw new PixError(`Amount must be a finite number, got ${amount}.`);\n }\n if (amount <= 0) {\n throw new PixError(\n `Amount must be positive, got ${amount}. Omit \\`amount\\` for a QR whose value the payer types.`,\n );\n }\n const field = amount.toFixed(2);\n if (Number(field) <= 0) {\n throw new PixError(\n `Amount ${amount} rounds to ${field} at two decimals. Omit \\`amount\\` for a QR whose value the payer types.`,\n );\n }\n if (field.length > 13) {\n throw new PixError(`Amount ${field} does not fit tag 54, which holds 13 characters.`);\n }\n return field;\n}\n\n/** Bound the two free-text identity fields the spec caps hard. */\nfunction toBoundedText(value: string, max: number, field: string): string {\n const text = toPayloadText(value.trim(), field);\n if (text === \"\") throw new PixError(`${field} is required.`);\n if (text.length > max) {\n throw new PixError(\n `${field} is ${text.length} characters; the BR Code allows ${max}. Shorten it — ` +\n \"truncating here would silently change what the payer sees.\",\n );\n }\n return text;\n}\n\n/** Tag 62, which exists only to carry the txid. */\nfunction additionalDataField(txid: string | undefined): string {\n const value = txid?.trim() ?? \"\";\n if (value === \"\" || value === TXID_UNSPECIFIED) {\n return tlv(TAG_ADDITIONAL_DATA, tlv(ADDITIONAL_TAG_TXID, TXID_UNSPECIFIED));\n }\n if (!new RegExp(`^[A-Za-z0-9]{1,${MAX_TXID}}$`).test(value)) {\n throw new PixError(\n `txid must be 1 to ${MAX_TXID} letters or digits, got ${JSON.stringify(txid)}.`,\n );\n }\n return tlv(TAG_ADDITIONAL_DATA, tlv(ADDITIONAL_TAG_TXID, value));\n}\n\n/** Tag 26 for a static payload: GUI, key and the optional description. */\nfunction staticMerchantAccount(input: PixStaticInput): string {\n const { value } = normalizePixKey(input.key);\n let inner = tlv(MAI_TAG_GUI, PIX_GUI) + tlv(MAI_TAG_KEY, value);\n const description = input.description?.trim();\n if (description !== undefined && description !== \"\") {\n inner += tlv(MAI_TAG_DESCRIPTION, toPayloadText(description, \"description\"));\n }\n if (inner.length > MAX_TLV_VALUE) {\n throw new PixError(\n `Tag 26 is ${inner.length} characters, over the ${MAX_TLV_VALUE} the length field allows. ` +\n \"Shorten `description`.\",\n );\n }\n return tlv(TAG_MERCHANT_ACCOUNT_INFO, inner);\n}\n\n/** Tag 26 for a dynamic payload: GUI plus the URL, and no key. */\nfunction dynamicMerchantAccount(input: PixDynamicInput): string {\n const url = toPayloadText(input.url.trim(), \"url\").replace(/^https?:\\/\\//i, \"\");\n if (url === \"\") throw new PixError(\"url is required for a dynamic BR Code.\");\n const inner = tlv(MAI_TAG_GUI, PIX_GUI) + tlv(MAI_TAG_URL, url);\n if (inner.length > MAX_TLV_VALUE) {\n throw new PixError(\n `Tag 26 is ${inner.length} characters, over the ${MAX_TLV_VALUE} the length field allows. ` +\n \"Shorten the payload URL.\",\n );\n }\n return tlv(TAG_MERCHANT_ACCOUNT_INFO, inner);\n}\n\n/**\n * Build a Pix \"Copia e Cola\" payload — the string behind a Pix QR code.\n *\n * The format is EMVCo MPM: a flat list of `ID + 2-digit length + value` triples,\n * closed by tag 63 holding a CRC-16/CCITT-FALSE over **everything before it,\n * including the literal `6304` header of tag 63 itself**. That last detail is the\n * one implementations get wrong; see {@link pixCrc16}.\n *\n * Two shapes come out of here:\n *\n * - **static** — tag 26 carries the key, so the QR is self-contained and can be\n * printed. Amount optional; a txid of `\"***\"` means \"identifies no single\n * transaction\", which is what a reusable poster QR wants.\n * - **dynamic** — tag 26 carries a URL instead, and the wallet fetches the amount\n * and payee from the PSP. Use it when the value is per-order. Defaults to\n * single-use (tag 01 = `12`).\n *\n * The distinction matters and is not cosmetic: a static QR settles against\n * whatever the payer typed, a dynamic one against what the PSP served, so a\n * charge that must reconcile to a cent needs the dynamic form.\n *\n * @param input - Static or dynamic payload description.\n * @returns The full payload, CRC included, ready to render as a QR or to copy.\n * @throws {PixError} On an unrecognised key, a field over its length cap, a\n * non-positive amount, or text that is not representable in the BR Code.\n *\n * @example\n * pixPayload({\n * key: \"12345678909\",\n * merchantName: \"Loja Tempest\",\n * merchantCity: \"São Paulo\",\n * amount: 25.5,\n * txid: \"PEDIDO123\",\n * });\n */\nexport function pixPayload(input: PixInput): string {\n const dynamic = input.kind === \"dynamic\";\n const oneTime = input.oneTime ?? dynamic;\n\n let payload = tlv(TAG_PAYLOAD_FORMAT, PAYLOAD_FORMAT_VERSION);\n payload += tlv(\n TAG_POINT_OF_INITIATION,\n oneTime ? POINT_OF_INITIATION_SINGLE_USE : POINT_OF_INITIATION_REUSABLE,\n );\n payload += dynamic ? dynamicMerchantAccount(input) : staticMerchantAccount(input);\n payload += tlv(TAG_MERCHANT_CATEGORY_CODE, DEFAULT_MERCHANT_CATEGORY_CODE);\n payload += tlv(TAG_TRANSACTION_CURRENCY, CURRENCY_BRL);\n if (!dynamic && input.amount !== undefined) {\n payload += tlv(TAG_TRANSACTION_AMOUNT, toAmountField(input.amount));\n }\n payload += tlv(TAG_COUNTRY_CODE, COUNTRY_BR);\n payload += tlv(\n TAG_MERCHANT_NAME,\n toBoundedText(input.merchantName, MAX_MERCHANT_NAME, \"merchantName\"),\n );\n payload += tlv(\n TAG_MERCHANT_CITY,\n toBoundedText(input.merchantCity, MAX_MERCHANT_CITY, \"merchantCity\"),\n );\n const postalCode = input.postalCode === undefined ? \"\" : digits(input.postalCode);\n if (postalCode !== \"\") payload += tlv(TAG_POSTAL_CODE, postalCode);\n payload += additionalDataField(dynamic ? TXID_UNSPECIFIED : input.txid);\n\n const withCrcHeader = `${payload}${TAG_CRC}04`;\n return `${withCrcHeader}${pixCrc16(withCrcHeader)}`;\n}\n\n/**\n * Split a flat run of TLVs. Stops cleanly at the first malformed triple.\n *\n * An ID may appear once per level. The BACEN BR Code manual (v2, May 2020)\n * states it for the root — \"there are no duplicate IDs in the document's root,\n * according to\" EMV® QRCPS-MPM;\n * the same holds here inside tags 26 and 62, which no conforming emitter\n * repeats either. Keeping the first of two values would give the caller one\n * reading of the payload while a wallet that keeps the last pays another.\n *\n * Lengths count characters (code points), as EMV defines them — see {@link tlv}.\n * A payload from another PSP may carry a `String` template (tag 64, or an\n * unreserved one) with non-ASCII text, where counting UTF-16 units would split\n * a character and misread every tag after it.\n *\n * @throws {PixError} When a length prefix is not two digits, runs past the end,\n * or an ID repeats at this level.\n */\nfunction parseTlv(text: string, where: string): PixField[] {\n const input = Array.from(text);\n const fields: PixField[] = [];\n let cursor = 0;\n while (cursor < input.length) {\n const id = input.slice(cursor, cursor + 2).join(\"\");\n const rawLength = input.slice(cursor + 2, cursor + 4).join(\"\");\n if (!/^\\d{2}$/.test(id) || !/^\\d{2}$/.test(rawLength)) {\n throw new PixError(\n `Malformed TLV in ${where} at offset ${cursor}: expected a 2-digit tag and length.`,\n );\n }\n const length = Number(rawLength);\n const start = cursor + 4;\n if (start + length > input.length) {\n throw new PixError(\n `Tag ${id} in ${where} declares ${length} characters but only ${input.length - start} remain.`,\n );\n }\n if (fields.some((field) => field.id === id)) {\n throw new PixError(\n `Tag ${id} in ${where} appears more than once; a BR Code carries each tag once per level.`,\n );\n }\n fields.push({ id, value: input.slice(start, start + length).join(\"\") });\n cursor = start + length;\n }\n return fields;\n}\n\n/**\n * Whether a root tag is `String` format, the only kind that may leave the\n * {@link COMMON_CHARACTER_SET}: tag 64 (alternate language) and the unreserved\n * templates 80–99 a PSP may define — the two {@link parseTlv} counts code points\n * for. Every other root tag is `ans`, and so is every subfield of tags 26 and 62,\n * which sit inside an `ans` root value.\n */\nfunction isStringFormatTag(id: string): boolean {\n return id === TAG_ALTERNATE_LANGUAGE || Number(id) >= FIRST_UNRESERVED_TAG;\n}\n\n/**\n * The other length units a reader of a BR Code is known to count in, each as the\n * width of one code point. EMV counts characters, but a wallet that slices bytes\n * reads UTF-8 bytes and a JavaScript reader that trusts `.length` reads UTF-16\n * units; inside the {@link COMMON_CHARACTER_SET} all three agree.\n */\nconst ALTERNATE_LENGTH_UNITS: readonly {\n readonly name: string;\n readonly width: (codePoint: number) => number;\n}[] = [\n {\n name: \"UTF-8 bytes\",\n width: (codePoint: number): number =>\n codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : codePoint < 0x10000 ? 3 : 4,\n },\n {\n name: \"UTF-16 units\",\n width: (codePoint: number): number => (codePoint > 0xffff ? 2 : 1),\n },\n];\n\n/**\n * Frame a run of TLVs counting each length in another unit, or `null` when that\n * unit frames no complete reading.\n *\n * A length that ends inside a code point counts as no reading: the next \"tag\"\n * would start on a UTF-8 continuation byte or a low surrogate, never on two ASCII\n * digits, so a reader in that unit rejects the payload instead of paying it.\n */\nfunction frameIn(\n chars: readonly string[],\n width: (codePoint: number) => number,\n): PixField[] | null {\n const fields: PixField[] = [];\n let cursor = 0;\n while (cursor < chars.length) {\n const id = chars.slice(cursor, cursor + 2).join(\"\");\n const rawLength = chars.slice(cursor + 2, cursor + 4).join(\"\");\n if (!/^\\d{2}$/.test(id) || !/^\\d{2}$/.test(rawLength)) return null;\n let remaining = Number(rawLength);\n let end = cursor + 4;\n while (remaining > 0 && end < chars.length) {\n remaining -= width(chars[end]?.codePointAt(0) ?? 0);\n end += 1;\n }\n if (remaining !== 0) return null;\n fields.push({ id, value: chars.slice(cursor + 4, end).join(\"\") });\n cursor = end;\n }\n return fields;\n}\n\n/**\n * Refuse a root reading that depends on the unit its lengths are counted in.\n *\n * Measured for #497 on 0.78.0, each payload CRC-valid and built around tag 26\n * `a@b.co`: tag 59 = 10 × `é` + `5406999.00` parsed as `merchantName`\n * `\"éééééééééé5406999.00\"`, no amount, `crcValid: true`, while a reader counting\n * UTF-8 bytes reads tag 59 = `\"éééééééééé\"` plus tag 54 = `999.00` — the CRC\n * hashes the same bytes either way. The same text in tag 80 hid the amount the\n * same way, and 10 × `😀` + `5406999.00` hid it from a UTF-16 unit reader.\n *\n * Two rules close it. An `ans` field (see {@link isStringFormatTag}) outside the\n * {@link COMMON_CHARACTER_SET} throws, as the builder's {@link tlv} does. A\n * `String` field may keep its non-ASCII text, but only while no other length\n * unit frames the root into a different complete reading.\n *\n * @throws {PixError} When an `ans` root field leaves the common character set,\n * or when another length unit reads the root differently.\n */\nfunction assertSingleReading(body: string, fields: readonly PixField[]): void {\n for (const field of fields) {\n if (!isStringFormatTag(field.id) && !COMMON_CHARACTER_SET.test(field.value)) {\n throw new PixError(\n `Tag ${field.id} has characters outside the EMV common character set (printable ASCII): ` +\n `${JSON.stringify(field.value)}. Only tag 64 and the unreserved templates 80–99 may carry other text.`,\n );\n }\n }\n if (COMMON_CHARACTER_SET.test(body)) return;\n const chars = Array.from(body);\n for (const unit of ALTERNATE_LENGTH_UNITS) {\n const other = frameIn(chars, unit.width);\n if (other !== null && JSON.stringify(other) !== JSON.stringify(fields)) {\n throw new PixError(\n `Payload reads as other tags when its TLV lengths count ${unit.name}: ${other.map((field) => field.id).join()}.`,\n );\n }\n }\n}\n\n/** The value of a tag — unique per level, see {@link parseTlv} — or `undefined`. */\nfunction pick(fields: readonly PixField[], id: string): string | undefined {\n return fields.find((field) => field.id === id)?.value;\n}\n\n/**\n * Read tag 54 into reais.\n *\n * @throws {PixError} When the field is outside the EMV format\n * ({@link AMOUNT_FIELD}) or wider than 13 characters. Zero is read as `0`; see\n * {@link AMOUNT_FIELD} for why the reader accepts what `pixPayload` refuses.\n */\nfunction readAmountField(field: string): number {\n if (field.length > MAX_AMOUNT_FIELD || !AMOUNT_FIELD.test(field)) {\n throw new PixError(\n `Tag 54 (amount) must be an amount like \"25.50\", with \".\" as the decimal mark, ` +\n `at most two decimals and ${MAX_AMOUNT_FIELD} characters; got ${JSON.stringify(field)}.`,\n );\n }\n return Number(field);\n}\n\n/**\n * Read a Pix \"Copia e Cola\" payload back into its parts.\n *\n * Tolerant by design: tags the SDK does not know about are kept verbatim in\n * {@link PixData.fields} instead of raising, because PSPs do add their own\n * templates and a reader that rejects them is useless in production. What is\n * *not* tolerated is a broken frame — a length prefix that runs off the end, a\n * missing tag 63 — a checksum mismatch, which means the string was corrupted in\n * transit, or a payload with two readings: a tag repeated at the root or inside\n * tags 26 and 62, a tag 63 anywhere but at the end, a tag 26 with both a key and\n * a URL, a tag 54 outside the EMV amount format, non-ASCII text in an `ans`\n * field (every root tag but 64 and 80–99, and so every subfield of tags 26 and\n * 62), or `String` text that a reader counting UTF-8 bytes or UTF-16 units\n * frames into other tags (#497). A preview built from one\n * reading while the wallet pays the other is the failure those rules exist for.\n *\n * Position is checked where EMV® QRCPS-MPM — the reference the BACEN manual\n * defers to — fixes it: tag 00 is the first object and tag 63 the last; every\n * other root tag may appear in any order. Before #475 an inner `6304` + CRC\n * followed by `5405…` and a second `6304` + CRC parsed as a priced payload,\n * while the same text cut at the first CRC was a valid payload with no amount.\n *\n * The CRC detects corruption, not authorship: whoever crafts a payload\n * recomputes it, so a valid CRC says nothing about who published the account.\n *\n * @param payload - The copia-e-cola string. Surrounding whitespace is ignored.\n * @param options - See {@link ParsePixOptions}.\n * @returns The decoded payload.\n * @throws {PixError} On a malformed frame, a missing CRC tag, a tag 00 that is\n * not first or a tag 63 that is not last, a repeated tag, a\n * tag 26 that is not a Pix account or that carries both a key and a URL, an\n * amount outside the EMV format, non-ASCII text in an `ans` field, a payload\n * that another length unit reads differently, or — unless `requireCrc` is `false` — a CRC\n * mismatch.\n *\n * @example\n * const data = parsePixPayload(copied);\n * console.log(data.key, data.amount, data.txid);\n */\nexport function parsePixPayload(payload: string, options: ParsePixOptions = {}): PixData {\n const { requireCrc = true } = options;\n const text = payload.trim();\n if (text.length < 8) throw new PixError(\"Payload is too short to be a BR Code.\");\n\n const crcHeaderAt = text.length - 8;\n if (text.slice(crcHeaderAt, crcHeaderAt + 4) !== `${TAG_CRC}04`) {\n throw new PixError(\"Payload does not end in a `6304` CRC tag.\");\n }\n const crc = text.slice(-4).toUpperCase();\n const expected = pixCrc16(text.slice(0, -4));\n const crcValid = crc === expected;\n if (!crcValid && requireCrc) {\n throw new PixError(`CRC mismatch: payload says ${crc}, recomputed ${expected}.`);\n }\n\n const body = text.slice(0, crcHeaderAt);\n const fields = parseTlv(body, \"payload\");\n assertSingleReading(body, fields);\n if (fields[0]?.id !== TAG_PAYLOAD_FORMAT) {\n throw new PixError(\"Tag 00 (payload format indicator) must be the first tag of a BR Code.\");\n }\n if (fields.some((field) => field.id === TAG_CRC)) {\n throw new PixError(\n \"Tag 63 (CRC) must be the last tag of a BR Code; this payload carries another one before the end.\",\n );\n }\n const merchantAccount = pick(fields, TAG_MERCHANT_ACCOUNT_INFO);\n if (merchantAccount === undefined) {\n throw new PixError(\"Payload has no tag 26 (merchant account information).\");\n }\n const account = parseTlv(merchantAccount, \"tag 26\");\n const gui = pick(account, MAI_TAG_GUI);\n if (gui?.toLowerCase() !== PIX_GUI) {\n throw new PixError(\n `Tag 26 is not a Pix account: expected GUI ${PIX_GUI}, got ${JSON.stringify(gui)}.`,\n );\n }\n\n const url = pick(account, MAI_TAG_URL);\n const key = pick(account, MAI_TAG_KEY);\n if (url !== undefined && key !== undefined) {\n throw new PixError(\n \"Tag 26 carries both a key (01) and a URL (25); a BR Code is either static or dynamic, not both.\",\n );\n }\n const amountField = pick(fields, TAG_TRANSACTION_AMOUNT);\n const txid = pick(\n parseTlv(pick(fields, TAG_ADDITIONAL_DATA) ?? \"\", \"tag 62\"),\n ADDITIONAL_TAG_TXID,\n );\n\n return {\n kind: url === undefined ? \"static\" : \"dynamic\",\n ...(key === undefined ? {} : { key, keyType: pixKeyType(key) ?? undefined }),\n ...(url === undefined ? {} : { url }),\n merchantName: pick(fields, TAG_MERCHANT_NAME) ?? \"\",\n merchantCity: pick(fields, TAG_MERCHANT_CITY) ?? \"\",\n ...(amountField === undefined ? {} : { amount: readAmountField(amountField) }),\n currency: pick(fields, TAG_TRANSACTION_CURRENCY) ?? \"\",\n countryCode: pick(fields, TAG_COUNTRY_CODE) ?? \"\",\n merchantCategoryCode: pick(fields, TAG_MERCHANT_CATEGORY_CODE) ?? \"\",\n ...(txid === undefined ? {} : { txid }),\n ...(pick(account, MAI_TAG_DESCRIPTION) === undefined\n ? {}\n : { description: pick(account, MAI_TAG_DESCRIPTION) }),\n ...(pick(fields, TAG_POSTAL_CODE) === undefined\n ? {}\n : { postalCode: pick(fields, TAG_POSTAL_CODE) }),\n oneTime: pick(fields, TAG_POINT_OF_INITIATION) === POINT_OF_INITIATION_SINGLE_USE,\n crc,\n crcValid,\n fields,\n };\n}\n"],"mappings":"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"}
|
package/dist/br/regions.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regions.cjs","names":[],"sources":["../../src/br/regions.ts"],"sourcesContent":["import type { LegendItem } from \"./MapLegend\";\nimport type { BrRegion } from \"./locations\";\n\n/**\n * Categorical, distinguishable colors for the five IBGE macro-regions\n * (Tableau-10 family). Swap for your brand palette if needed.\n */\nexport const REGION_COLORS: Record<BrRegion, string> = {\n Norte: \"#4e79a7\",\n Nordeste: \"#f28e2b\",\n \"Centro-Oeste\": \"#59a14f\",\n Sudeste: \"#e15759\",\n Sul: \"#b07aa1\",\n};\n\n/** Legend entries (swatch + region name) for a region-colored map. */\nexport function regionLegendItems(): LegendItem[] {\n return (Object.keys(REGION_COLORS) as BrRegion[]).map((region) => ({\n color: REGION_COLORS[region],\n label: region,\n }));\n}\n"],"mappings":"AAOA,
|
|
1
|
+
{"version":3,"file":"regions.cjs","names":["REGION_COLORS","regionLegendItems","region"],"sources":["../../src/br/regions.ts"],"sourcesContent":["import type { LegendItem } from \"./MapLegend\";\nimport type { BrRegion } from \"./locations\";\n\n/**\n * Categorical, distinguishable colors for the five IBGE macro-regions\n * (Tableau-10 family). Swap for your brand palette if needed.\n */\nexport const REGION_COLORS: Record<BrRegion, string> = {\n Norte: \"#4e79a7\",\n Nordeste: \"#f28e2b\",\n \"Centro-Oeste\": \"#59a14f\",\n Sudeste: \"#e15759\",\n Sul: \"#b07aa1\",\n};\n\n/** Legend entries (swatch + region name) for a region-colored map. */\nexport function regionLegendItems(): LegendItem[] {\n return (Object.keys(REGION_COLORS) as BrRegion[]).map((region) => ({\n color: REGION_COLORS[region],\n label: region,\n }));\n}\n"],"mappings":"AAOA,IAAaA,EAA0C,CACnD,MAAO,UACP,SAAU,UACV,eAAgB,UAChB,QAAS,UACT,IAAK,SACT,EAGA,SAAgBC,GAAkC,CAC9C,OAAQ,OAAO,KAAKD,CAAa,CAAC,CAAgB,IAAK,IAAY,CAC/D,MAAOA,EAAcE,GACrB,MAAOA,CACX,EAAE,CACN,C"}
|
package/dist/br/regions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regions.js","names":[],"sources":["../../src/br/regions.ts"],"sourcesContent":["import type { LegendItem } from \"./MapLegend\";\nimport type { BrRegion } from \"./locations\";\n\n/**\n * Categorical, distinguishable colors for the five IBGE macro-regions\n * (Tableau-10 family). Swap for your brand palette if needed.\n */\nexport const REGION_COLORS: Record<BrRegion, string> = {\n Norte: \"#4e79a7\",\n Nordeste: \"#f28e2b\",\n \"Centro-Oeste\": \"#59a14f\",\n Sudeste: \"#e15759\",\n Sul: \"#b07aa1\",\n};\n\n/** Legend entries (swatch + region name) for a region-colored map. */\nexport function regionLegendItems(): LegendItem[] {\n return (Object.keys(REGION_COLORS) as BrRegion[]).map((region) => ({\n color: REGION_COLORS[region],\n label: region,\n }));\n}\n"],"mappings":";AAOA,
|
|
1
|
+
{"version":3,"file":"regions.js","names":["REGION_COLORS","regionLegendItems","region"],"sources":["../../src/br/regions.ts"],"sourcesContent":["import type { LegendItem } from \"./MapLegend\";\nimport type { BrRegion } from \"./locations\";\n\n/**\n * Categorical, distinguishable colors for the five IBGE macro-regions\n * (Tableau-10 family). Swap for your brand palette if needed.\n */\nexport const REGION_COLORS: Record<BrRegion, string> = {\n Norte: \"#4e79a7\",\n Nordeste: \"#f28e2b\",\n \"Centro-Oeste\": \"#59a14f\",\n Sudeste: \"#e15759\",\n Sul: \"#b07aa1\",\n};\n\n/** Legend entries (swatch + region name) for a region-colored map. */\nexport function regionLegendItems(): LegendItem[] {\n return (Object.keys(REGION_COLORS) as BrRegion[]).map((region) => ({\n color: REGION_COLORS[region],\n label: region,\n }));\n}\n"],"mappings":";AAOA,IAAaA,IAA0C;CACnD,OAAO;CACP,UAAU;CACV,gBAAgB;CAChB,SAAS;CACT,KAAK;AACT;AAGA,SAAgBC,IAAkC;CAC9C,OAAQ,OAAO,KAAKD,CAAa,CAAC,CAAgB,KAAK,OAAY;EAC/D,OAAOA,EAAcE;EACrB,OAAOA;CACX,EAAE;AACN"}
|
package/dist/br/scales.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scales.cjs","names":[],"sources":["../../src/br/scales.ts"],"sourcesContent":["import { lerpColor } from \"./svg-utils\";\n\n/** Maps a numeric value to a CSS color string. */\nexport type ColorScale = (value: number) => string;\n\n/**\n * Sequential, colorblind-safe palettes (ColorBrewer / Viridis families, public\n * domain). Ordered light → dark. Swap for your brand ramp if needed — any\n * ordered list of hex colors works with the scale builders below.\n */\nexport const SEQUENTIAL_BLUES = [\n \"#eff3ff\",\n \"#c6dbef\",\n \"#9ecae1\",\n \"#6baed6\",\n \"#3182bd\",\n \"#08519c\",\n] as const;\n\nexport const SEQUENTIAL_GREENS = [\n \"#edf8e9\",\n \"#c7e9c0\",\n \"#a1d99b\",\n \"#74c476\",\n \"#31a354\",\n \"#006d2c\",\n] as const;\n\nexport const SEQUENTIAL_VIRIDIS = [\n \"#440154\",\n \"#414487\",\n \"#2a788e\",\n \"#22a884\",\n \"#7ad151\",\n \"#fde725\",\n] as const;\n\n/** Diverging palette (red ↔ neutral ↔ blue), for signed metrics. */\nexport const DIVERGING_RDBU = [\n \"#b2182b\",\n \"#ef8a62\",\n \"#fddbc7\",\n \"#d1e5f0\",\n \"#67a9cf\",\n \"#2166ac\",\n] as const;\n\n/**\n * Interpolate a palette at `t ∈ [0, 1]`, blending between the two nearest\n * stops. `t <= 0` → first color, `t >= 1` → last.\n */\nexport function interpolatePalette(palette: readonly string[], t: number): string {\n if (palette.length === 0) return \"#000000\";\n if (palette.length === 1) return palette[0];\n const clamped = Math.max(0, Math.min(1, t));\n const scaled = clamped * (palette.length - 1);\n const i = Math.floor(scaled);\n if (i >= palette.length - 1) return palette[palette.length - 1];\n return lerpColor(palette[i], palette[i + 1], scaled - i);\n}\n\n/**\n * Continuous scale: linearly interpolate `palette` across `[min, max]`.\n *\n * @example\n * const color = sequentialScale(0, 100, SEQUENTIAL_BLUES);\n * <BrazilMap values={data} colorScale={color} />;\n */\nexport function sequentialScale(\n min: number,\n max: number,\n palette: readonly string[] = SEQUENTIAL_BLUES,\n): ColorScale {\n const span = max - min || 1;\n return (value) => interpolatePalette(palette, (value - min) / span);\n}\n\n/**\n * Reject an empty palette where a colour has to come out.\n *\n * `interpolatePalette` already guarded this and the two factories did not, so an\n * empty array made them index at `-1` and return `undefined` announced as\n * `string` — which reaches the DOM as `fill=\"undefined\"` and paints nothing,\n * with no error anywhere. Throwing at construction puts the failure on the line\n * that built the scale instead of on every shape it colours.\n *\n * @param palette - The palette handed to a scale factory.\n * @param factory - Name of the caller, used in the message.\n * @throws {Error} When the palette has no entries.\n * @returns Nothing.\n */\nfunction assertPalette(palette: readonly string[], factory: string): void {\n if (palette.length === 0) {\n throw new Error(`${factory}: palette must have at least one colour`);\n }\n}\n\n/**\n * Discrete scale: split `[min, max]` into `palette.length` equal buckets and\n * return the bucket's color (a classic choropleth \"quantize\" scale).\n */\nexport function quantizeScale(\n min: number,\n max: number,\n palette: readonly string[] = SEQUENTIAL_BLUES,\n): ColorScale {\n assertPalette(palette, \"quantizeScale\");\n const span = max - min || 1;\n const n = palette.length;\n return (value) => {\n const idx = Math.min(n - 1, Math.max(0, Math.floor(((value - min) / span) * n)));\n return palette[idx] as string;\n };\n}\n\n/**\n * Threshold scale: `palette[i]` applies to values in\n * `[thresholds[i-1], thresholds[i])`. `palette` must have\n * `thresholds.length + 1` entries.\n *\n * @example\n * const color = thresholdScale([10, 50, 100], SEQUENTIAL_GREENS.slice(0, 4));\n */\nexport function thresholdScale(\n thresholds: readonly number[],\n palette: readonly string[],\n): ColorScale {\n assertPalette(palette, \"thresholdScale\");\n return (value) => {\n let i = 0;\n while (i < thresholds.length && value >= (thresholds[i] as number)) i += 1;\n return palette[Math.min(i, palette.length - 1)] as string;\n };\n}\n"],"mappings":"mCAUA,
|
|
1
|
+
{"version":3,"file":"scales.cjs","names":["lerpColor","require_svg_utils","SEQUENTIAL_BLUES","SEQUENTIAL_GREENS","SEQUENTIAL_VIRIDIS","DIVERGING_RDBU","interpolatePalette","palette","scaled","t","sequentialScale","span","max","min","value","assertPalette","factory","quantizeScale","n","thresholdScale","i","thresholds"],"sources":["../../src/br/scales.ts"],"sourcesContent":["import { lerpColor } from \"./svg-utils\";\n\n/** Maps a numeric value to a CSS color string. */\nexport type ColorScale = (value: number) => string;\n\n/**\n * Sequential, colorblind-safe palettes (ColorBrewer / Viridis families, public\n * domain). Ordered light → dark. Swap for your brand ramp if needed — any\n * ordered list of hex colors works with the scale builders below.\n */\nexport const SEQUENTIAL_BLUES = [\n \"#eff3ff\",\n \"#c6dbef\",\n \"#9ecae1\",\n \"#6baed6\",\n \"#3182bd\",\n \"#08519c\",\n] as const;\n\nexport const SEQUENTIAL_GREENS = [\n \"#edf8e9\",\n \"#c7e9c0\",\n \"#a1d99b\",\n \"#74c476\",\n \"#31a354\",\n \"#006d2c\",\n] as const;\n\nexport const SEQUENTIAL_VIRIDIS = [\n \"#440154\",\n \"#414487\",\n \"#2a788e\",\n \"#22a884\",\n \"#7ad151\",\n \"#fde725\",\n] as const;\n\n/** Diverging palette (red ↔ neutral ↔ blue), for signed metrics. */\nexport const DIVERGING_RDBU = [\n \"#b2182b\",\n \"#ef8a62\",\n \"#fddbc7\",\n \"#d1e5f0\",\n \"#67a9cf\",\n \"#2166ac\",\n] as const;\n\n/**\n * Interpolate a palette at `t ∈ [0, 1]`, blending between the two nearest\n * stops. `t <= 0` → first color, `t >= 1` → last.\n */\nexport function interpolatePalette(palette: readonly string[], t: number): string {\n if (palette.length === 0) return \"#000000\";\n if (palette.length === 1) return palette[0];\n const clamped = Math.max(0, Math.min(1, t));\n const scaled = clamped * (palette.length - 1);\n const i = Math.floor(scaled);\n if (i >= palette.length - 1) return palette[palette.length - 1];\n return lerpColor(palette[i], palette[i + 1], scaled - i);\n}\n\n/**\n * Continuous scale: linearly interpolate `palette` across `[min, max]`.\n *\n * @example\n * const color = sequentialScale(0, 100, SEQUENTIAL_BLUES);\n * <BrazilMap values={data} colorScale={color} />;\n */\nexport function sequentialScale(\n min: number,\n max: number,\n palette: readonly string[] = SEQUENTIAL_BLUES,\n): ColorScale {\n const span = max - min || 1;\n return (value) => interpolatePalette(palette, (value - min) / span);\n}\n\n/**\n * Reject an empty palette where a colour has to come out.\n *\n * `interpolatePalette` already guarded this and the two factories did not, so an\n * empty array made them index at `-1` and return `undefined` announced as\n * `string` — which reaches the DOM as `fill=\"undefined\"` and paints nothing,\n * with no error anywhere. Throwing at construction puts the failure on the line\n * that built the scale instead of on every shape it colours.\n *\n * @param palette - The palette handed to a scale factory.\n * @param factory - Name of the caller, used in the message.\n * @throws {Error} When the palette has no entries.\n * @returns Nothing.\n */\nfunction assertPalette(palette: readonly string[], factory: string): void {\n if (palette.length === 0) {\n throw new Error(`${factory}: palette must have at least one colour`);\n }\n}\n\n/**\n * Discrete scale: split `[min, max]` into `palette.length` equal buckets and\n * return the bucket's color (a classic choropleth \"quantize\" scale).\n */\nexport function quantizeScale(\n min: number,\n max: number,\n palette: readonly string[] = SEQUENTIAL_BLUES,\n): ColorScale {\n assertPalette(palette, \"quantizeScale\");\n const span = max - min || 1;\n const n = palette.length;\n return (value) => {\n const idx = Math.min(n - 1, Math.max(0, Math.floor(((value - min) / span) * n)));\n return palette[idx] as string;\n };\n}\n\n/**\n * Threshold scale: `palette[i]` applies to values in\n * `[thresholds[i-1], thresholds[i])`. `palette` must have\n * `thresholds.length + 1` entries.\n *\n * @example\n * const color = thresholdScale([10, 50, 100], SEQUENTIAL_GREENS.slice(0, 4));\n */\nexport function thresholdScale(\n thresholds: readonly number[],\n palette: readonly string[],\n): ColorScale {\n assertPalette(palette, \"thresholdScale\");\n return (value) => {\n let i = 0;\n while (i < thresholds.length && value >= (thresholds[i] as number)) i += 1;\n return palette[Math.min(i, palette.length - 1)] as string;\n };\n}\n"],"mappings":"A,mCAUA,IAAaE,EAAmB,CAC5B,UACA,UACA,UACA,UACA,UACA,SACJ,EAEaC,EAAoB,CAC7B,UACA,UACA,UACA,UACA,UACA,SACJ,EAEaC,EAAqB,CAC9B,UACA,UACA,UACA,UACA,UACA,SACJ,EAGaC,EAAiB,CAC1B,UACA,UACA,UACA,UACA,UACA,SACJ,EAMA,SAAgBC,EAAmB,EAA4B,EAAmB,CAC9E,GAAIC,EAAQ,SAAW,EAAG,MAAO,UACjC,GAAIA,EAAQ,SAAW,EAAG,OAAOA,EAAQ,GAEzC,IAAMC,EADU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGC,CAAC,CAC1B,GAAWF,EAAQ,OAAS,GACrC,EAAI,KAAK,MAAMC,CAAM,EAE3B,OADI,GAAKD,EAAQ,OAAS,EAAUA,EAAQA,EAAQ,OAAS,GACtDP,EAAAA,UAAUO,EAAQ,GAAIA,EAAQ,EAAI,GAAIC,EAAS,CAAC,CAC3D,CASA,SAAgBE,EACZ,EACA,EACA,EAA6BR,EACnB,CACV,IAAMS,EAAOC,EAAMC,GAAO,EAC1B,MAAQ,IAAUP,EAAmBC,GAAUO,EAAQD,GAAOF,CAAI,CACtE,CAgBA,SAASI,EAAc,EAA4B,EAAuB,CACtE,GAAIR,EAAQ,SAAW,EACnB,MAAU,MAAM,GAAGS,EAAQ,wCAAwC,CAE3E,CAMA,SAAgBC,EACZ,EACA,EACA,EAA6Bf,EACnB,CACVa,EAAcR,EAAS,eAAe,EACtC,IAAMI,EAAOC,EAAMC,GAAO,EACpBK,EAAIX,EAAQ,OAClB,MAAQ,IAEGA,EADK,KAAK,IAAIW,EAAI,EAAG,KAAK,IAAI,EAAG,KAAK,OAAQJ,EAAQD,GAAOF,EAAQO,CAAC,CAAC,CAC/D,EAEvB,CAUA,SAAgBC,EACZ,EACA,EACU,CAEV,OADAJ,EAAcR,EAAS,gBAAgB,EAC/B,GAAU,CACd,IAAIa,EAAI,EACR,KAAOA,EAAIC,EAAW,QAAUP,GAAUO,EAAWD,IAAe,GAAK,EACzE,OAAOb,EAAQ,KAAK,IAAIa,EAAGb,EAAQ,OAAS,CAAC,EACjD,CACJ,C"}
|
package/dist/br/scales.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scales.js","names":[],"sources":["../../src/br/scales.ts"],"sourcesContent":["import { lerpColor } from \"./svg-utils\";\n\n/** Maps a numeric value to a CSS color string. */\nexport type ColorScale = (value: number) => string;\n\n/**\n * Sequential, colorblind-safe palettes (ColorBrewer / Viridis families, public\n * domain). Ordered light → dark. Swap for your brand ramp if needed — any\n * ordered list of hex colors works with the scale builders below.\n */\nexport const SEQUENTIAL_BLUES = [\n \"#eff3ff\",\n \"#c6dbef\",\n \"#9ecae1\",\n \"#6baed6\",\n \"#3182bd\",\n \"#08519c\",\n] as const;\n\nexport const SEQUENTIAL_GREENS = [\n \"#edf8e9\",\n \"#c7e9c0\",\n \"#a1d99b\",\n \"#74c476\",\n \"#31a354\",\n \"#006d2c\",\n] as const;\n\nexport const SEQUENTIAL_VIRIDIS = [\n \"#440154\",\n \"#414487\",\n \"#2a788e\",\n \"#22a884\",\n \"#7ad151\",\n \"#fde725\",\n] as const;\n\n/** Diverging palette (red ↔ neutral ↔ blue), for signed metrics. */\nexport const DIVERGING_RDBU = [\n \"#b2182b\",\n \"#ef8a62\",\n \"#fddbc7\",\n \"#d1e5f0\",\n \"#67a9cf\",\n \"#2166ac\",\n] as const;\n\n/**\n * Interpolate a palette at `t ∈ [0, 1]`, blending between the two nearest\n * stops. `t <= 0` → first color, `t >= 1` → last.\n */\nexport function interpolatePalette(palette: readonly string[], t: number): string {\n if (palette.length === 0) return \"#000000\";\n if (palette.length === 1) return palette[0];\n const clamped = Math.max(0, Math.min(1, t));\n const scaled = clamped * (palette.length - 1);\n const i = Math.floor(scaled);\n if (i >= palette.length - 1) return palette[palette.length - 1];\n return lerpColor(palette[i], palette[i + 1], scaled - i);\n}\n\n/**\n * Continuous scale: linearly interpolate `palette` across `[min, max]`.\n *\n * @example\n * const color = sequentialScale(0, 100, SEQUENTIAL_BLUES);\n * <BrazilMap values={data} colorScale={color} />;\n */\nexport function sequentialScale(\n min: number,\n max: number,\n palette: readonly string[] = SEQUENTIAL_BLUES,\n): ColorScale {\n const span = max - min || 1;\n return (value) => interpolatePalette(palette, (value - min) / span);\n}\n\n/**\n * Reject an empty palette where a colour has to come out.\n *\n * `interpolatePalette` already guarded this and the two factories did not, so an\n * empty array made them index at `-1` and return `undefined` announced as\n * `string` — which reaches the DOM as `fill=\"undefined\"` and paints nothing,\n * with no error anywhere. Throwing at construction puts the failure on the line\n * that built the scale instead of on every shape it colours.\n *\n * @param palette - The palette handed to a scale factory.\n * @param factory - Name of the caller, used in the message.\n * @throws {Error} When the palette has no entries.\n * @returns Nothing.\n */\nfunction assertPalette(palette: readonly string[], factory: string): void {\n if (palette.length === 0) {\n throw new Error(`${factory}: palette must have at least one colour`);\n }\n}\n\n/**\n * Discrete scale: split `[min, max]` into `palette.length` equal buckets and\n * return the bucket's color (a classic choropleth \"quantize\" scale).\n */\nexport function quantizeScale(\n min: number,\n max: number,\n palette: readonly string[] = SEQUENTIAL_BLUES,\n): ColorScale {\n assertPalette(palette, \"quantizeScale\");\n const span = max - min || 1;\n const n = palette.length;\n return (value) => {\n const idx = Math.min(n - 1, Math.max(0, Math.floor(((value - min) / span) * n)));\n return palette[idx] as string;\n };\n}\n\n/**\n * Threshold scale: `palette[i]` applies to values in\n * `[thresholds[i-1], thresholds[i])`. `palette` must have\n * `thresholds.length + 1` entries.\n *\n * @example\n * const color = thresholdScale([10, 50, 100], SEQUENTIAL_GREENS.slice(0, 4));\n */\nexport function thresholdScale(\n thresholds: readonly number[],\n palette: readonly string[],\n): ColorScale {\n assertPalette(palette, \"thresholdScale\");\n return (value) => {\n let i = 0;\n while (i < thresholds.length && value >= (thresholds[i] as number)) i += 1;\n return palette[Math.min(i, palette.length - 1)] as string;\n };\n}\n"],"mappings":";;AAUA,
|
|
1
|
+
{"version":3,"file":"scales.js","names":["SEQUENTIAL_BLUES","SEQUENTIAL_GREENS","SEQUENTIAL_VIRIDIS","DIVERGING_RDBU","interpolatePalette","palette","scaled","t","lerpColor","sequentialScale","span","max","min","value","assertPalette","factory","quantizeScale","n","thresholdScale","i","thresholds"],"sources":["../../src/br/scales.ts"],"sourcesContent":["import { lerpColor } from \"./svg-utils\";\n\n/** Maps a numeric value to a CSS color string. */\nexport type ColorScale = (value: number) => string;\n\n/**\n * Sequential, colorblind-safe palettes (ColorBrewer / Viridis families, public\n * domain). Ordered light → dark. Swap for your brand ramp if needed — any\n * ordered list of hex colors works with the scale builders below.\n */\nexport const SEQUENTIAL_BLUES = [\n \"#eff3ff\",\n \"#c6dbef\",\n \"#9ecae1\",\n \"#6baed6\",\n \"#3182bd\",\n \"#08519c\",\n] as const;\n\nexport const SEQUENTIAL_GREENS = [\n \"#edf8e9\",\n \"#c7e9c0\",\n \"#a1d99b\",\n \"#74c476\",\n \"#31a354\",\n \"#006d2c\",\n] as const;\n\nexport const SEQUENTIAL_VIRIDIS = [\n \"#440154\",\n \"#414487\",\n \"#2a788e\",\n \"#22a884\",\n \"#7ad151\",\n \"#fde725\",\n] as const;\n\n/** Diverging palette (red ↔ neutral ↔ blue), for signed metrics. */\nexport const DIVERGING_RDBU = [\n \"#b2182b\",\n \"#ef8a62\",\n \"#fddbc7\",\n \"#d1e5f0\",\n \"#67a9cf\",\n \"#2166ac\",\n] as const;\n\n/**\n * Interpolate a palette at `t ∈ [0, 1]`, blending between the two nearest\n * stops. `t <= 0` → first color, `t >= 1` → last.\n */\nexport function interpolatePalette(palette: readonly string[], t: number): string {\n if (palette.length === 0) return \"#000000\";\n if (palette.length === 1) return palette[0];\n const clamped = Math.max(0, Math.min(1, t));\n const scaled = clamped * (palette.length - 1);\n const i = Math.floor(scaled);\n if (i >= palette.length - 1) return palette[palette.length - 1];\n return lerpColor(palette[i], palette[i + 1], scaled - i);\n}\n\n/**\n * Continuous scale: linearly interpolate `palette` across `[min, max]`.\n *\n * @example\n * const color = sequentialScale(0, 100, SEQUENTIAL_BLUES);\n * <BrazilMap values={data} colorScale={color} />;\n */\nexport function sequentialScale(\n min: number,\n max: number,\n palette: readonly string[] = SEQUENTIAL_BLUES,\n): ColorScale {\n const span = max - min || 1;\n return (value) => interpolatePalette(palette, (value - min) / span);\n}\n\n/**\n * Reject an empty palette where a colour has to come out.\n *\n * `interpolatePalette` already guarded this and the two factories did not, so an\n * empty array made them index at `-1` and return `undefined` announced as\n * `string` — which reaches the DOM as `fill=\"undefined\"` and paints nothing,\n * with no error anywhere. Throwing at construction puts the failure on the line\n * that built the scale instead of on every shape it colours.\n *\n * @param palette - The palette handed to a scale factory.\n * @param factory - Name of the caller, used in the message.\n * @throws {Error} When the palette has no entries.\n * @returns Nothing.\n */\nfunction assertPalette(palette: readonly string[], factory: string): void {\n if (palette.length === 0) {\n throw new Error(`${factory}: palette must have at least one colour`);\n }\n}\n\n/**\n * Discrete scale: split `[min, max]` into `palette.length` equal buckets and\n * return the bucket's color (a classic choropleth \"quantize\" scale).\n */\nexport function quantizeScale(\n min: number,\n max: number,\n palette: readonly string[] = SEQUENTIAL_BLUES,\n): ColorScale {\n assertPalette(palette, \"quantizeScale\");\n const span = max - min || 1;\n const n = palette.length;\n return (value) => {\n const idx = Math.min(n - 1, Math.max(0, Math.floor(((value - min) / span) * n)));\n return palette[idx] as string;\n };\n}\n\n/**\n * Threshold scale: `palette[i]` applies to values in\n * `[thresholds[i-1], thresholds[i])`. `palette` must have\n * `thresholds.length + 1` entries.\n *\n * @example\n * const color = thresholdScale([10, 50, 100], SEQUENTIAL_GREENS.slice(0, 4));\n */\nexport function thresholdScale(\n thresholds: readonly number[],\n palette: readonly string[],\n): ColorScale {\n assertPalette(palette, \"thresholdScale\");\n return (value) => {\n let i = 0;\n while (i < thresholds.length && value >= (thresholds[i] as number)) i += 1;\n return palette[Math.min(i, palette.length - 1)] as string;\n };\n}\n"],"mappings":";;AAUA,IAAaA,IAAmB;CAC5B;CACA;CACA;CACA;CACA;CACA;AACJ,GAEaC,IAAoB;CAC7B;CACA;CACA;CACA;CACA;CACA;AACJ,GAEaC,IAAqB;CAC9B;CACA;CACA;CACA;CACA;CACA;AACJ,GAGaC,IAAiB;CAC1B;CACA;CACA;CACA;CACA;CACA;AACJ;AAMA,SAAgBC,EAAmB,GAA4B,GAAmB;CAC9E,IAAIC,EAAQ,WAAW,GAAG,OAAO;CACjC,IAAIA,EAAQ,WAAW,GAAG,OAAOA,EAAQ;CAEzC,IAAMC,IADU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGC,CAAC,CAC1B,KAAWF,EAAQ,SAAS,IACrC,IAAI,KAAK,MAAMC,CAAM;CAE3B,OADI,KAAKD,EAAQ,SAAS,IAAUA,EAAQA,EAAQ,SAAS,KACtDG,EAAUH,EAAQ,IAAIA,EAAQ,IAAI,IAAIC,IAAS,CAAC;AAC3D;AASA,SAAgBG,EACZ,GACA,GACA,IAA6BT,GACnB;CACV,IAAMU,IAAOC,IAAMC,KAAO;CAC1B,QAAQ,MAAUR,EAAmBC,IAAUQ,IAAQD,KAAOF,CAAI;AACtE;AAgBA,SAASI,EAAc,GAA4B,GAAuB;CACtE,IAAIT,EAAQ,WAAW,GACnB,MAAU,MAAM,GAAGU,EAAQ,wCAAwC;AAE3E;AAMA,SAAgBC,EACZ,GACA,GACA,IAA6BhB,GACnB;CACV,EAAcK,GAAS,eAAe;CACtC,IAAMK,IAAOC,IAAMC,KAAO,GACpBK,IAAIZ,EAAQ;CAClB,QAAQ,MAEGA,EADK,KAAK,IAAIY,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,OAAQJ,IAAQD,KAAOF,IAAQO,CAAC,CAAC,CAC/D;AAEvB;AAUA,SAAgBC,EACZ,GACA,GACU;CAEV,OADAJ,EAAcT,GAAS,gBAAgB,IAC/B,MAAU;EACd,IAAIc,IAAI;EACR,OAAOA,IAAIC,EAAW,UAAUP,KAAUO,EAAWD,KAAe,KAAK;EACzE,OAAOd,EAAQ,KAAK,IAAIc,GAAGd,EAAQ,SAAS,CAAC;CACjD;AACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-geo.cjs","names":[],"sources":["../../src/br/state-geo.ts"],"sourcesContent":["import type { BrUfGeometry } from \"./br-geo\";\nimport type { UF } from \"./locations\";\n\n/** One municipality feature within a state. */\nexport interface MunicipalityFeature {\n type: \"Feature\";\n properties: {\n /** 7-digit IBGE municipality code. */\n id: string;\n /** Municipality name. */\n name: string;\n /** Representative point `[longitude, latitude]` (area-weighted centroid). */\n centroid: [number, number];\n };\n geometry: BrUfGeometry;\n}\n\n/** Municipality boundaries for a single federative unit. */\nexport interface StateMunicipalities {\n type: \"FeatureCollection\";\n /** The federative unit these municipalities belong to. */\n uf: UF;\n features: MunicipalityFeature[];\n}\n\ntype GeoModule = { default: StateMunicipalities };\n\n// One explicit dynamic import per UF — each `data/mun/<UF>.json` becomes its own\n// lazy chunk, so `loadStateMunicipalities(\"SP\")` fetches only São Paulo's\n// geometry and the full ~2 MB municipal dataset never lands in one bundle.\nconst LOADERS: Record<UF, () => Promise<GeoModule>> = {\n AC: () => import(\"./data/mun/AC.json\") as unknown as Promise<GeoModule>,\n AL: () => import(\"./data/mun/AL.json\") as unknown as Promise<GeoModule>,\n AP: () => import(\"./data/mun/AP.json\") as unknown as Promise<GeoModule>,\n AM: () => import(\"./data/mun/AM.json\") as unknown as Promise<GeoModule>,\n BA: () => import(\"./data/mun/BA.json\") as unknown as Promise<GeoModule>,\n CE: () => import(\"./data/mun/CE.json\") as unknown as Promise<GeoModule>,\n DF: () => import(\"./data/mun/DF.json\") as unknown as Promise<GeoModule>,\n ES: () => import(\"./data/mun/ES.json\") as unknown as Promise<GeoModule>,\n GO: () => import(\"./data/mun/GO.json\") as unknown as Promise<GeoModule>,\n MA: () => import(\"./data/mun/MA.json\") as unknown as Promise<GeoModule>,\n MT: () => import(\"./data/mun/MT.json\") as unknown as Promise<GeoModule>,\n MS: () => import(\"./data/mun/MS.json\") as unknown as Promise<GeoModule>,\n MG: () => import(\"./data/mun/MG.json\") as unknown as Promise<GeoModule>,\n PA: () => import(\"./data/mun/PA.json\") as unknown as Promise<GeoModule>,\n PB: () => import(\"./data/mun/PB.json\") as unknown as Promise<GeoModule>,\n PR: () => import(\"./data/mun/PR.json\") as unknown as Promise<GeoModule>,\n PE: () => import(\"./data/mun/PE.json\") as unknown as Promise<GeoModule>,\n PI: () => import(\"./data/mun/PI.json\") as unknown as Promise<GeoModule>,\n RJ: () => import(\"./data/mun/RJ.json\") as unknown as Promise<GeoModule>,\n RN: () => import(\"./data/mun/RN.json\") as unknown as Promise<GeoModule>,\n RS: () => import(\"./data/mun/RS.json\") as unknown as Promise<GeoModule>,\n RO: () => import(\"./data/mun/RO.json\") as unknown as Promise<GeoModule>,\n RR: () => import(\"./data/mun/RR.json\") as unknown as Promise<GeoModule>,\n SC: () => import(\"./data/mun/SC.json\") as unknown as Promise<GeoModule>,\n SP: () => import(\"./data/mun/SP.json\") as unknown as Promise<GeoModule>,\n SE: () => import(\"./data/mun/SE.json\") as unknown as Promise<GeoModule>,\n TO: () => import(\"./data/mun/TO.json\") as unknown as Promise<GeoModule>,\n};\n\n/**\n * Lazily load the simplified municipality GeoJSON for a federative unit. Each\n * state's geometry is a separate chunk (~40-70 KB gzip), fetched on demand —\n * the full ~2 MB municipal dataset never lands in one bundle.\n *\n * @param uf - Federative unit acronym (e.g. `\"SP\"`).\n * @returns The municipality collection, or `null` for an unknown UF.\n *\n * @example\n * const sp = await loadStateMunicipalities(\"SP\");\n * sp?.features.length; // 644\n */\nexport async function loadStateMunicipalities(uf: UF): Promise<StateMunicipalities | null> {\n const loader = LOADERS[uf];\n if (!loader) return null;\n const mod = await loader();\n return mod.default ?? (mod as unknown as StateMunicipalities);\n}\n"],"mappings":"AA8BA,
|
|
1
|
+
{"version":3,"file":"state-geo.cjs","names":["LOADERS","loadStateMunicipalities","loader","uf","mod"],"sources":["../../src/br/state-geo.ts"],"sourcesContent":["import type { BrUfGeometry } from \"./br-geo\";\nimport type { UF } from \"./locations\";\n\n/** One municipality feature within a state. */\nexport interface MunicipalityFeature {\n type: \"Feature\";\n properties: {\n /** 7-digit IBGE municipality code. */\n id: string;\n /** Municipality name. */\n name: string;\n /** Representative point `[longitude, latitude]` (area-weighted centroid). */\n centroid: [number, number];\n };\n geometry: BrUfGeometry;\n}\n\n/** Municipality boundaries for a single federative unit. */\nexport interface StateMunicipalities {\n type: \"FeatureCollection\";\n /** The federative unit these municipalities belong to. */\n uf: UF;\n features: MunicipalityFeature[];\n}\n\ntype GeoModule = { default: StateMunicipalities };\n\n// One explicit dynamic import per UF — each `data/mun/<UF>.json` becomes its own\n// lazy chunk, so `loadStateMunicipalities(\"SP\")` fetches only São Paulo's\n// geometry and the full ~2 MB municipal dataset never lands in one bundle.\nconst LOADERS: Record<UF, () => Promise<GeoModule>> = {\n AC: () => import(\"./data/mun/AC.json\") as unknown as Promise<GeoModule>,\n AL: () => import(\"./data/mun/AL.json\") as unknown as Promise<GeoModule>,\n AP: () => import(\"./data/mun/AP.json\") as unknown as Promise<GeoModule>,\n AM: () => import(\"./data/mun/AM.json\") as unknown as Promise<GeoModule>,\n BA: () => import(\"./data/mun/BA.json\") as unknown as Promise<GeoModule>,\n CE: () => import(\"./data/mun/CE.json\") as unknown as Promise<GeoModule>,\n DF: () => import(\"./data/mun/DF.json\") as unknown as Promise<GeoModule>,\n ES: () => import(\"./data/mun/ES.json\") as unknown as Promise<GeoModule>,\n GO: () => import(\"./data/mun/GO.json\") as unknown as Promise<GeoModule>,\n MA: () => import(\"./data/mun/MA.json\") as unknown as Promise<GeoModule>,\n MT: () => import(\"./data/mun/MT.json\") as unknown as Promise<GeoModule>,\n MS: () => import(\"./data/mun/MS.json\") as unknown as Promise<GeoModule>,\n MG: () => import(\"./data/mun/MG.json\") as unknown as Promise<GeoModule>,\n PA: () => import(\"./data/mun/PA.json\") as unknown as Promise<GeoModule>,\n PB: () => import(\"./data/mun/PB.json\") as unknown as Promise<GeoModule>,\n PR: () => import(\"./data/mun/PR.json\") as unknown as Promise<GeoModule>,\n PE: () => import(\"./data/mun/PE.json\") as unknown as Promise<GeoModule>,\n PI: () => import(\"./data/mun/PI.json\") as unknown as Promise<GeoModule>,\n RJ: () => import(\"./data/mun/RJ.json\") as unknown as Promise<GeoModule>,\n RN: () => import(\"./data/mun/RN.json\") as unknown as Promise<GeoModule>,\n RS: () => import(\"./data/mun/RS.json\") as unknown as Promise<GeoModule>,\n RO: () => import(\"./data/mun/RO.json\") as unknown as Promise<GeoModule>,\n RR: () => import(\"./data/mun/RR.json\") as unknown as Promise<GeoModule>,\n SC: () => import(\"./data/mun/SC.json\") as unknown as Promise<GeoModule>,\n SP: () => import(\"./data/mun/SP.json\") as unknown as Promise<GeoModule>,\n SE: () => import(\"./data/mun/SE.json\") as unknown as Promise<GeoModule>,\n TO: () => import(\"./data/mun/TO.json\") as unknown as Promise<GeoModule>,\n};\n\n/**\n * Lazily load the simplified municipality GeoJSON for a federative unit. Each\n * state's geometry is a separate chunk (~40-70 KB gzip), fetched on demand —\n * the full ~2 MB municipal dataset never lands in one bundle.\n *\n * @param uf - Federative unit acronym (e.g. `\"SP\"`).\n * @returns The municipality collection, or `null` for an unknown UF.\n *\n * @example\n * const sp = await loadStateMunicipalities(\"SP\");\n * sp?.features.length; // 644\n */\nexport async function loadStateMunicipalities(uf: UF): Promise<StateMunicipalities | null> {\n const loader = LOADERS[uf];\n if (!loader) return null;\n const mod = await loader();\n return mod.default ?? (mod as unknown as StateMunicipalities);\n}\n"],"mappings":"AA8BA,IAAMA,EAAgD,CAClD,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,EACV,OAAA,QAAA,QAAA,CAAA,CAAA,SAAA,QAAU,mBAAA,CAAA,CACd,EAcA,eAAsBC,EAAwB,EAA6C,CACvF,IAAMC,EAASF,EAAQG,GACvB,GAAI,CAACD,EAAQ,OAAO,KACpB,IAAME,EAAM,MAAMF,EAAO,EACzB,OAAOE,EAAI,SAAYA,CAC3B,C"}
|
package/dist/br/state-geo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-geo.js","names":[],"sources":["../../src/br/state-geo.ts"],"sourcesContent":["import type { BrUfGeometry } from \"./br-geo\";\nimport type { UF } from \"./locations\";\n\n/** One municipality feature within a state. */\nexport interface MunicipalityFeature {\n type: \"Feature\";\n properties: {\n /** 7-digit IBGE municipality code. */\n id: string;\n /** Municipality name. */\n name: string;\n /** Representative point `[longitude, latitude]` (area-weighted centroid). */\n centroid: [number, number];\n };\n geometry: BrUfGeometry;\n}\n\n/** Municipality boundaries for a single federative unit. */\nexport interface StateMunicipalities {\n type: \"FeatureCollection\";\n /** The federative unit these municipalities belong to. */\n uf: UF;\n features: MunicipalityFeature[];\n}\n\ntype GeoModule = { default: StateMunicipalities };\n\n// One explicit dynamic import per UF — each `data/mun/<UF>.json` becomes its own\n// lazy chunk, so `loadStateMunicipalities(\"SP\")` fetches only São Paulo's\n// geometry and the full ~2 MB municipal dataset never lands in one bundle.\nconst LOADERS: Record<UF, () => Promise<GeoModule>> = {\n AC: () => import(\"./data/mun/AC.json\") as unknown as Promise<GeoModule>,\n AL: () => import(\"./data/mun/AL.json\") as unknown as Promise<GeoModule>,\n AP: () => import(\"./data/mun/AP.json\") as unknown as Promise<GeoModule>,\n AM: () => import(\"./data/mun/AM.json\") as unknown as Promise<GeoModule>,\n BA: () => import(\"./data/mun/BA.json\") as unknown as Promise<GeoModule>,\n CE: () => import(\"./data/mun/CE.json\") as unknown as Promise<GeoModule>,\n DF: () => import(\"./data/mun/DF.json\") as unknown as Promise<GeoModule>,\n ES: () => import(\"./data/mun/ES.json\") as unknown as Promise<GeoModule>,\n GO: () => import(\"./data/mun/GO.json\") as unknown as Promise<GeoModule>,\n MA: () => import(\"./data/mun/MA.json\") as unknown as Promise<GeoModule>,\n MT: () => import(\"./data/mun/MT.json\") as unknown as Promise<GeoModule>,\n MS: () => import(\"./data/mun/MS.json\") as unknown as Promise<GeoModule>,\n MG: () => import(\"./data/mun/MG.json\") as unknown as Promise<GeoModule>,\n PA: () => import(\"./data/mun/PA.json\") as unknown as Promise<GeoModule>,\n PB: () => import(\"./data/mun/PB.json\") as unknown as Promise<GeoModule>,\n PR: () => import(\"./data/mun/PR.json\") as unknown as Promise<GeoModule>,\n PE: () => import(\"./data/mun/PE.json\") as unknown as Promise<GeoModule>,\n PI: () => import(\"./data/mun/PI.json\") as unknown as Promise<GeoModule>,\n RJ: () => import(\"./data/mun/RJ.json\") as unknown as Promise<GeoModule>,\n RN: () => import(\"./data/mun/RN.json\") as unknown as Promise<GeoModule>,\n RS: () => import(\"./data/mun/RS.json\") as unknown as Promise<GeoModule>,\n RO: () => import(\"./data/mun/RO.json\") as unknown as Promise<GeoModule>,\n RR: () => import(\"./data/mun/RR.json\") as unknown as Promise<GeoModule>,\n SC: () => import(\"./data/mun/SC.json\") as unknown as Promise<GeoModule>,\n SP: () => import(\"./data/mun/SP.json\") as unknown as Promise<GeoModule>,\n SE: () => import(\"./data/mun/SE.json\") as unknown as Promise<GeoModule>,\n TO: () => import(\"./data/mun/TO.json\") as unknown as Promise<GeoModule>,\n};\n\n/**\n * Lazily load the simplified municipality GeoJSON for a federative unit. Each\n * state's geometry is a separate chunk (~40-70 KB gzip), fetched on demand —\n * the full ~2 MB municipal dataset never lands in one bundle.\n *\n * @param uf - Federative unit acronym (e.g. `\"SP\"`).\n * @returns The municipality collection, or `null` for an unknown UF.\n *\n * @example\n * const sp = await loadStateMunicipalities(\"SP\");\n * sp?.features.length; // 644\n */\nexport async function loadStateMunicipalities(uf: UF): Promise<StateMunicipalities | null> {\n const loader = LOADERS[uf];\n if (!loader) return null;\n const mod = await loader();\n return mod.default ?? (mod as unknown as StateMunicipalities);\n}\n"],"mappings":";AA8BA,
|
|
1
|
+
{"version":3,"file":"state-geo.js","names":["LOADERS","loadStateMunicipalities","loader","uf","mod"],"sources":["../../src/br/state-geo.ts"],"sourcesContent":["import type { BrUfGeometry } from \"./br-geo\";\nimport type { UF } from \"./locations\";\n\n/** One municipality feature within a state. */\nexport interface MunicipalityFeature {\n type: \"Feature\";\n properties: {\n /** 7-digit IBGE municipality code. */\n id: string;\n /** Municipality name. */\n name: string;\n /** Representative point `[longitude, latitude]` (area-weighted centroid). */\n centroid: [number, number];\n };\n geometry: BrUfGeometry;\n}\n\n/** Municipality boundaries for a single federative unit. */\nexport interface StateMunicipalities {\n type: \"FeatureCollection\";\n /** The federative unit these municipalities belong to. */\n uf: UF;\n features: MunicipalityFeature[];\n}\n\ntype GeoModule = { default: StateMunicipalities };\n\n// One explicit dynamic import per UF — each `data/mun/<UF>.json` becomes its own\n// lazy chunk, so `loadStateMunicipalities(\"SP\")` fetches only São Paulo's\n// geometry and the full ~2 MB municipal dataset never lands in one bundle.\nconst LOADERS: Record<UF, () => Promise<GeoModule>> = {\n AC: () => import(\"./data/mun/AC.json\") as unknown as Promise<GeoModule>,\n AL: () => import(\"./data/mun/AL.json\") as unknown as Promise<GeoModule>,\n AP: () => import(\"./data/mun/AP.json\") as unknown as Promise<GeoModule>,\n AM: () => import(\"./data/mun/AM.json\") as unknown as Promise<GeoModule>,\n BA: () => import(\"./data/mun/BA.json\") as unknown as Promise<GeoModule>,\n CE: () => import(\"./data/mun/CE.json\") as unknown as Promise<GeoModule>,\n DF: () => import(\"./data/mun/DF.json\") as unknown as Promise<GeoModule>,\n ES: () => import(\"./data/mun/ES.json\") as unknown as Promise<GeoModule>,\n GO: () => import(\"./data/mun/GO.json\") as unknown as Promise<GeoModule>,\n MA: () => import(\"./data/mun/MA.json\") as unknown as Promise<GeoModule>,\n MT: () => import(\"./data/mun/MT.json\") as unknown as Promise<GeoModule>,\n MS: () => import(\"./data/mun/MS.json\") as unknown as Promise<GeoModule>,\n MG: () => import(\"./data/mun/MG.json\") as unknown as Promise<GeoModule>,\n PA: () => import(\"./data/mun/PA.json\") as unknown as Promise<GeoModule>,\n PB: () => import(\"./data/mun/PB.json\") as unknown as Promise<GeoModule>,\n PR: () => import(\"./data/mun/PR.json\") as unknown as Promise<GeoModule>,\n PE: () => import(\"./data/mun/PE.json\") as unknown as Promise<GeoModule>,\n PI: () => import(\"./data/mun/PI.json\") as unknown as Promise<GeoModule>,\n RJ: () => import(\"./data/mun/RJ.json\") as unknown as Promise<GeoModule>,\n RN: () => import(\"./data/mun/RN.json\") as unknown as Promise<GeoModule>,\n RS: () => import(\"./data/mun/RS.json\") as unknown as Promise<GeoModule>,\n RO: () => import(\"./data/mun/RO.json\") as unknown as Promise<GeoModule>,\n RR: () => import(\"./data/mun/RR.json\") as unknown as Promise<GeoModule>,\n SC: () => import(\"./data/mun/SC.json\") as unknown as Promise<GeoModule>,\n SP: () => import(\"./data/mun/SP.json\") as unknown as Promise<GeoModule>,\n SE: () => import(\"./data/mun/SE.json\") as unknown as Promise<GeoModule>,\n TO: () => import(\"./data/mun/TO.json\") as unknown as Promise<GeoModule>,\n};\n\n/**\n * Lazily load the simplified municipality GeoJSON for a federative unit. Each\n * state's geometry is a separate chunk (~40-70 KB gzip), fetched on demand —\n * the full ~2 MB municipal dataset never lands in one bundle.\n *\n * @param uf - Federative unit acronym (e.g. `\"SP\"`).\n * @returns The municipality collection, or `null` for an unknown UF.\n *\n * @example\n * const sp = await loadStateMunicipalities(\"SP\");\n * sp?.features.length; // 644\n */\nexport async function loadStateMunicipalities(uf: UF): Promise<StateMunicipalities | null> {\n const loader = LOADERS[uf];\n if (!loader) return null;\n const mod = await loader();\n return mod.default ?? (mod as unknown as StateMunicipalities);\n}\n"],"mappings":";AA8BA,IAAMA,IAAgD;CAClD,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;CACjB,UAAU,OAAO;AACrB;AAcA,eAAsBC,EAAwB,GAA6C;CACvF,IAAMC,IAASF,EAAQG;CACvB,IAAI,CAACD,GAAQ,OAAO;CACpB,IAAME,IAAM,MAAMF,EAAO;CACzB,OAAOE,EAAI,WAAYA;AAC3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svg-utils.cjs","names":[],"sources":["../../src/br/svg-utils.ts"],"sourcesContent":["import type { FittedProjection } from \"@/geo/projection\";\nimport type { GeoBounds } from \"@/geo/types\";\nimport type { BrUfGeometry, Ring } from \"./br-geo\";\n\n/** Iterate every ring of a geometry (Polygon or MultiPolygon). */\nexport function ringsOf(geometry: BrUfGeometry): Ring[] {\n return geometry.type === \"MultiPolygon\"\n ? (geometry.coordinates as Ring[][]).flat()\n : (geometry.coordinates as Ring[]);\n}\n\n/** Bounding box across every coordinate of the given geometries. */\nexport function geometriesBounds(geometries: readonly BrUfGeometry[]): GeoBounds {\n let minLat = 90;\n let maxLat = -90;\n let minLon = 180;\n let maxLon = -180;\n for (const geometry of geometries) {\n for (const ring of ringsOf(geometry)) {\n for (const [lon, lat] of ring) {\n if (lat < minLat) minLat = lat;\n if (lat > maxLat) maxLat = lat;\n if (lon < minLon) minLon = lon;\n if (lon > maxLon) maxLon = lon;\n }\n }\n }\n return { minLatitude: minLat, maxLatitude: maxLat, minLongitude: minLon, maxLongitude: maxLon };\n}\n\n/** Build the SVG `d` path for a geometry (all rings, `evenodd` handles holes). */\nexport function geometryPath(geometry: BrUfGeometry, projection: FittedProjection): string {\n return ringsOf(geometry)\n .map((ring) => {\n const pts = ring.map(([lon, lat]) => {\n const p = projection.project({ latitude: lat, longitude: lon });\n return `${p.x.toFixed(1)},${p.y.toFixed(1)}`;\n });\n return `M${pts.join(\"L\")}Z`;\n })\n .join(\"\");\n}\n\n/** Rough visual centroid of a geometry (mean of its largest ring's points). */\nexport function geometryCentroid(\n geometry: BrUfGeometry,\n projection: FittedProjection,\n): { x: number; y: number } {\n const rings = ringsOf(geometry);\n const outer = rings.reduce((a, b) => (b.length > a.length ? b : a), rings[0] ?? []);\n let sx = 0;\n let sy = 0;\n for (const [lon, lat] of outer) {\n const p = projection.project({ latitude: lat, longitude: lon });\n sx += p.x;\n sy += p.y;\n }\n const n = outer.length || 1;\n return { x: sx / n, y: sy / n };\n}\n\n/** Linearly interpolate between two hex colors, returning an `rgb(...)` string. */\nexport function lerpColor(from: string, to: string, t: number): string {\n const parse = (c: string): [number, number, number] => {\n const hex = c.replace(\"#\", \"\");\n const full =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((ch) => ch + ch)\n .join(\"\")\n : hex;\n return [\n parseInt(full.slice(0, 2), 16),\n parseInt(full.slice(2, 4), 16),\n parseInt(full.slice(4, 6), 16),\n ];\n };\n const [r1, g1, b1] = parse(from);\n const [r2, g2, b2] = parse(to);\n const mix = (a: number, b: number): number => Math.round(a + (b - a) * t);\n return `rgb(${mix(r1, r2)}, ${mix(g1, g2)}, ${mix(b1, b2)})`;\n}\n"],"mappings":"AAKA,
|
|
1
|
+
{"version":3,"file":"svg-utils.cjs","names":["ringsOf","geometry","geometriesBounds","minLat","maxLat","minLon","maxLon","geometries","ring","lon","lat","geometryPath","p","projection","geometryCentroid","rings","outer","b","a","sx","sy","n","lerpColor","parse","hex","c","full","ch","r1","g1","b1","from","r2","g2","b2","to","mix","t"],"sources":["../../src/br/svg-utils.ts"],"sourcesContent":["import type { FittedProjection } from \"@/geo/projection\";\nimport type { GeoBounds } from \"@/geo/types\";\nimport type { BrUfGeometry, Ring } from \"./br-geo\";\n\n/** Iterate every ring of a geometry (Polygon or MultiPolygon). */\nexport function ringsOf(geometry: BrUfGeometry): Ring[] {\n return geometry.type === \"MultiPolygon\"\n ? (geometry.coordinates as Ring[][]).flat()\n : (geometry.coordinates as Ring[]);\n}\n\n/** Bounding box across every coordinate of the given geometries. */\nexport function geometriesBounds(geometries: readonly BrUfGeometry[]): GeoBounds {\n let minLat = 90;\n let maxLat = -90;\n let minLon = 180;\n let maxLon = -180;\n for (const geometry of geometries) {\n for (const ring of ringsOf(geometry)) {\n for (const [lon, lat] of ring) {\n if (lat < minLat) minLat = lat;\n if (lat > maxLat) maxLat = lat;\n if (lon < minLon) minLon = lon;\n if (lon > maxLon) maxLon = lon;\n }\n }\n }\n return { minLatitude: minLat, maxLatitude: maxLat, minLongitude: minLon, maxLongitude: maxLon };\n}\n\n/** Build the SVG `d` path for a geometry (all rings, `evenodd` handles holes). */\nexport function geometryPath(geometry: BrUfGeometry, projection: FittedProjection): string {\n return ringsOf(geometry)\n .map((ring) => {\n const pts = ring.map(([lon, lat]) => {\n const p = projection.project({ latitude: lat, longitude: lon });\n return `${p.x.toFixed(1)},${p.y.toFixed(1)}`;\n });\n return `M${pts.join(\"L\")}Z`;\n })\n .join(\"\");\n}\n\n/** Rough visual centroid of a geometry (mean of its largest ring's points). */\nexport function geometryCentroid(\n geometry: BrUfGeometry,\n projection: FittedProjection,\n): { x: number; y: number } {\n const rings = ringsOf(geometry);\n const outer = rings.reduce((a, b) => (b.length > a.length ? b : a), rings[0] ?? []);\n let sx = 0;\n let sy = 0;\n for (const [lon, lat] of outer) {\n const p = projection.project({ latitude: lat, longitude: lon });\n sx += p.x;\n sy += p.y;\n }\n const n = outer.length || 1;\n return { x: sx / n, y: sy / n };\n}\n\n/** Linearly interpolate between two hex colors, returning an `rgb(...)` string. */\nexport function lerpColor(from: string, to: string, t: number): string {\n const parse = (c: string): [number, number, number] => {\n const hex = c.replace(\"#\", \"\");\n const full =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((ch) => ch + ch)\n .join(\"\")\n : hex;\n return [\n parseInt(full.slice(0, 2), 16),\n parseInt(full.slice(2, 4), 16),\n parseInt(full.slice(4, 6), 16),\n ];\n };\n const [r1, g1, b1] = parse(from);\n const [r2, g2, b2] = parse(to);\n const mix = (a: number, b: number): number => Math.round(a + (b - a) * t);\n return `rgb(${mix(r1, r2)}, ${mix(g1, g2)}, ${mix(b1, b2)})`;\n}\n"],"mappings":"AAKA,SAAgBA,EAAQ,EAAgC,CACpD,OAAOC,EAAS,OAAS,eAClBA,EAAS,YAAyB,KAAK,EACvCA,EAAS,WACpB,CAGA,SAAgBC,EAAiB,EAAgD,CAC7E,IAAIC,EAAS,GACTC,EAAS,IACTC,EAAS,IACTC,EAAS,KACb,IAAK,IAAML,KAAYM,EACnB,IAAK,IAAMC,KAAQR,EAAQC,CAAQ,EAC/B,IAAK,GAAM,CAACQ,EAAKC,KAAQF,EACjBE,EAAMP,IAAQ,EAASO,GACvBA,EAAMN,IAAQ,EAASM,GACvBD,EAAMJ,IAAQ,EAASI,GACvBA,EAAMH,IAAQ,EAASG,GAIvC,MAAO,CAAE,YAAaN,EAAQ,YAAaC,EAAQ,aAAcC,EAAQ,aAAcC,CAAO,CAClG,CAGA,SAAgBK,EAAa,EAAwB,EAAsC,CACvF,OAAOX,EAAQC,CAAQ,CAAC,CACnB,IAAK,GAKK,IAJKO,EAAK,KAAK,CAACC,EAAKC,KAAS,CACjC,IAAME,EAAIC,EAAW,QAAQ,CAAE,SAAUH,EAAK,UAAWD,CAAI,CAAC,EAC9D,MAAO,GAAGG,EAAE,EAAE,QAAQ,CAAC,EAAE,GAAGA,EAAE,EAAE,QAAQ,CAAC,GAC7C,CACW,CAAA,CAAI,KAAK,GAAG,EAAE,EAC5B,CAAC,CACD,KAAK,EAAE,CAChB,CAGA,SAAgBE,EACZ,EACA,EACwB,CACxB,IAAMC,EAAQf,EAAQC,CAAQ,EACxBe,EAAQD,EAAM,QAAQ,EAAG,IAAOE,EAAE,OAASC,EAAE,OAASD,EAAIC,EAAIH,EAAM,IAAM,CAAC,CAAC,EAC9EI,EAAK,EACLC,EAAK,EACT,IAAK,GAAM,CAACX,EAAKC,KAAQM,EAAO,CAC5B,IAAMJ,EAAIC,EAAW,QAAQ,CAAE,SAAUH,EAAK,UAAWD,CAAI,CAAC,EAC9D,GAAMG,EAAE,EACR,GAAMA,EAAE,CACZ,CACA,IAAMS,EAAIL,EAAM,QAAU,EAC1B,MAAO,CAAE,EAAGG,EAAKE,EAAG,EAAGD,EAAKC,CAAE,CAClC,CAGA,SAAgBC,EAAU,EAAc,EAAY,EAAmB,CACnE,IAAMC,EAAS,GAAwC,CACnD,IAAMC,EAAMC,EAAE,QAAQ,IAAK,EAAE,EACvBC,EACFF,EAAI,SAAW,EACTA,EACK,MAAM,EAAE,CAAC,CACT,IAAK,GAAOG,EAAKA,CAAE,CAAC,CACpB,KAAK,EAAE,EACZH,EACV,MAAO,CACH,SAASE,EAAK,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,SAASA,EAAK,MAAM,EAAG,CAAC,EAAG,EAAE,EAC7B,SAASA,EAAK,MAAM,EAAG,CAAC,EAAG,EAAE,CACjC,CACJ,EACM,CAACE,EAAIC,EAAIC,GAAMP,EAAMQ,CAAI,EACzB,CAACC,EAAIC,EAAIC,GAAMX,EAAMY,CAAE,EACvBC,GAAO,EAAW,IAAsB,KAAK,MAAMlB,GAAKD,EAAIC,GAAKmB,CAAC,EACxE,MAAO,OAAOD,EAAIR,EAAII,CAAE,EAAE,IAAII,EAAIP,EAAII,CAAE,EAAE,IAAIG,EAAIN,EAAII,CAAE,EAAE,EAC9D,C"}
|
package/dist/br/svg-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"svg-utils.js","names":[],"sources":["../../src/br/svg-utils.ts"],"sourcesContent":["import type { FittedProjection } from \"@/geo/projection\";\nimport type { GeoBounds } from \"@/geo/types\";\nimport type { BrUfGeometry, Ring } from \"./br-geo\";\n\n/** Iterate every ring of a geometry (Polygon or MultiPolygon). */\nexport function ringsOf(geometry: BrUfGeometry): Ring[] {\n return geometry.type === \"MultiPolygon\"\n ? (geometry.coordinates as Ring[][]).flat()\n : (geometry.coordinates as Ring[]);\n}\n\n/** Bounding box across every coordinate of the given geometries. */\nexport function geometriesBounds(geometries: readonly BrUfGeometry[]): GeoBounds {\n let minLat = 90;\n let maxLat = -90;\n let minLon = 180;\n let maxLon = -180;\n for (const geometry of geometries) {\n for (const ring of ringsOf(geometry)) {\n for (const [lon, lat] of ring) {\n if (lat < minLat) minLat = lat;\n if (lat > maxLat) maxLat = lat;\n if (lon < minLon) minLon = lon;\n if (lon > maxLon) maxLon = lon;\n }\n }\n }\n return { minLatitude: minLat, maxLatitude: maxLat, minLongitude: minLon, maxLongitude: maxLon };\n}\n\n/** Build the SVG `d` path for a geometry (all rings, `evenodd` handles holes). */\nexport function geometryPath(geometry: BrUfGeometry, projection: FittedProjection): string {\n return ringsOf(geometry)\n .map((ring) => {\n const pts = ring.map(([lon, lat]) => {\n const p = projection.project({ latitude: lat, longitude: lon });\n return `${p.x.toFixed(1)},${p.y.toFixed(1)}`;\n });\n return `M${pts.join(\"L\")}Z`;\n })\n .join(\"\");\n}\n\n/** Rough visual centroid of a geometry (mean of its largest ring's points). */\nexport function geometryCentroid(\n geometry: BrUfGeometry,\n projection: FittedProjection,\n): { x: number; y: number } {\n const rings = ringsOf(geometry);\n const outer = rings.reduce((a, b) => (b.length > a.length ? b : a), rings[0] ?? []);\n let sx = 0;\n let sy = 0;\n for (const [lon, lat] of outer) {\n const p = projection.project({ latitude: lat, longitude: lon });\n sx += p.x;\n sy += p.y;\n }\n const n = outer.length || 1;\n return { x: sx / n, y: sy / n };\n}\n\n/** Linearly interpolate between two hex colors, returning an `rgb(...)` string. */\nexport function lerpColor(from: string, to: string, t: number): string {\n const parse = (c: string): [number, number, number] => {\n const hex = c.replace(\"#\", \"\");\n const full =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((ch) => ch + ch)\n .join(\"\")\n : hex;\n return [\n parseInt(full.slice(0, 2), 16),\n parseInt(full.slice(2, 4), 16),\n parseInt(full.slice(4, 6), 16),\n ];\n };\n const [r1, g1, b1] = parse(from);\n const [r2, g2, b2] = parse(to);\n const mix = (a: number, b: number): number => Math.round(a + (b - a) * t);\n return `rgb(${mix(r1, r2)}, ${mix(g1, g2)}, ${mix(b1, b2)})`;\n}\n"],"mappings":";AAKA,
|
|
1
|
+
{"version":3,"file":"svg-utils.js","names":["ringsOf","geometry","geometriesBounds","minLat","maxLat","minLon","maxLon","geometries","ring","lon","lat","geometryPath","p","projection","geometryCentroid","rings","outer","b","a","sx","sy","n","lerpColor","parse","hex","c","full","ch","r1","g1","b1","from","r2","g2","b2","to","mix","t"],"sources":["../../src/br/svg-utils.ts"],"sourcesContent":["import type { FittedProjection } from \"@/geo/projection\";\nimport type { GeoBounds } from \"@/geo/types\";\nimport type { BrUfGeometry, Ring } from \"./br-geo\";\n\n/** Iterate every ring of a geometry (Polygon or MultiPolygon). */\nexport function ringsOf(geometry: BrUfGeometry): Ring[] {\n return geometry.type === \"MultiPolygon\"\n ? (geometry.coordinates as Ring[][]).flat()\n : (geometry.coordinates as Ring[]);\n}\n\n/** Bounding box across every coordinate of the given geometries. */\nexport function geometriesBounds(geometries: readonly BrUfGeometry[]): GeoBounds {\n let minLat = 90;\n let maxLat = -90;\n let minLon = 180;\n let maxLon = -180;\n for (const geometry of geometries) {\n for (const ring of ringsOf(geometry)) {\n for (const [lon, lat] of ring) {\n if (lat < minLat) minLat = lat;\n if (lat > maxLat) maxLat = lat;\n if (lon < minLon) minLon = lon;\n if (lon > maxLon) maxLon = lon;\n }\n }\n }\n return { minLatitude: minLat, maxLatitude: maxLat, minLongitude: minLon, maxLongitude: maxLon };\n}\n\n/** Build the SVG `d` path for a geometry (all rings, `evenodd` handles holes). */\nexport function geometryPath(geometry: BrUfGeometry, projection: FittedProjection): string {\n return ringsOf(geometry)\n .map((ring) => {\n const pts = ring.map(([lon, lat]) => {\n const p = projection.project({ latitude: lat, longitude: lon });\n return `${p.x.toFixed(1)},${p.y.toFixed(1)}`;\n });\n return `M${pts.join(\"L\")}Z`;\n })\n .join(\"\");\n}\n\n/** Rough visual centroid of a geometry (mean of its largest ring's points). */\nexport function geometryCentroid(\n geometry: BrUfGeometry,\n projection: FittedProjection,\n): { x: number; y: number } {\n const rings = ringsOf(geometry);\n const outer = rings.reduce((a, b) => (b.length > a.length ? b : a), rings[0] ?? []);\n let sx = 0;\n let sy = 0;\n for (const [lon, lat] of outer) {\n const p = projection.project({ latitude: lat, longitude: lon });\n sx += p.x;\n sy += p.y;\n }\n const n = outer.length || 1;\n return { x: sx / n, y: sy / n };\n}\n\n/** Linearly interpolate between two hex colors, returning an `rgb(...)` string. */\nexport function lerpColor(from: string, to: string, t: number): string {\n const parse = (c: string): [number, number, number] => {\n const hex = c.replace(\"#\", \"\");\n const full =\n hex.length === 3\n ? hex\n .split(\"\")\n .map((ch) => ch + ch)\n .join(\"\")\n : hex;\n return [\n parseInt(full.slice(0, 2), 16),\n parseInt(full.slice(2, 4), 16),\n parseInt(full.slice(4, 6), 16),\n ];\n };\n const [r1, g1, b1] = parse(from);\n const [r2, g2, b2] = parse(to);\n const mix = (a: number, b: number): number => Math.round(a + (b - a) * t);\n return `rgb(${mix(r1, r2)}, ${mix(g1, g2)}, ${mix(b1, b2)})`;\n}\n"],"mappings":";AAKA,SAAgBA,EAAQ,GAAgC;CACpD,OAAOC,EAAS,SAAS,iBAClBA,EAAS,YAAyB,KAAK,IACvCA,EAAS;AACpB;AAGA,SAAgBC,EAAiB,GAAgD;CAC7E,IAAIC,IAAS,IACTC,IAAS,KACTC,IAAS,KACTC,IAAS;CACb,KAAK,IAAML,KAAYM,GACnB,KAAK,IAAMC,KAAQR,EAAQC,CAAQ,GAC/B,KAAK,IAAM,CAACQ,GAAKC,MAAQF,GAIrB,AAHIE,IAAMP,MAAQ,IAASO,IACvBA,IAAMN,MAAQ,IAASM,IACvBD,IAAMJ,MAAQ,IAASI,IACvBA,IAAMH,MAAQ,IAASG;CAIvC,OAAO;EAAE,aAAaN;EAAQ,aAAaC;EAAQ,cAAcC;EAAQ,cAAcC;CAAO;AAClG;AAGA,SAAgBK,EAAa,GAAwB,GAAsC;CACvF,OAAOX,EAAQC,CAAQ,CAAC,CACnB,KAAK,MAKK,IAJKO,EAAK,KAAK,CAACC,GAAKC,OAAS;EACjC,IAAME,IAAIC,EAAW,QAAQ;GAAE,UAAUH;GAAK,WAAWD;EAAI,CAAC;EAC9D,OAAO,GAAGG,EAAE,EAAE,QAAQ,CAAC,EAAE,GAAGA,EAAE,EAAE,QAAQ,CAAC;CAC7C,CACW,CAAA,CAAI,KAAK,GAAG,EAAE,EAC5B,CAAC,CACD,KAAK,EAAE;AAChB;AAGA,SAAgBE,EACZ,GACA,GACwB;CACxB,IAAMC,IAAQf,EAAQC,CAAQ,GACxBe,IAAQD,EAAM,QAAQ,GAAG,MAAOE,EAAE,SAASC,EAAE,SAASD,IAAIC,GAAIH,EAAM,MAAM,CAAC,CAAC,GAC9EI,IAAK,GACLC,IAAK;CACT,KAAK,IAAM,CAACX,GAAKC,MAAQM,GAAO;EAC5B,IAAMJ,IAAIC,EAAW,QAAQ;GAAE,UAAUH;GAAK,WAAWD;EAAI,CAAC;EAE9D,AADA,KAAMG,EAAE,GACR,KAAMA,EAAE;CACZ;CACA,IAAMS,IAAIL,EAAM,UAAU;CAC1B,OAAO;EAAE,GAAGG,IAAKE;EAAG,GAAGD,IAAKC;CAAE;AAClC;AAGA,SAAgBC,EAAU,GAAc,GAAY,GAAmB;CACnE,IAAMC,KAAS,MAAwC;EACnD,IAAMC,IAAMC,EAAE,QAAQ,KAAK,EAAE,GACvBC,IACFF,EAAI,WAAW,IACTA,EACK,MAAM,EAAE,CAAC,CACT,KAAK,MAAOG,IAAKA,CAAE,CAAC,CACpB,KAAK,EAAE,IACZH;EACV,OAAO;GACH,SAASE,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE;GAC7B,SAASA,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE;GAC7B,SAASA,EAAK,MAAM,GAAG,CAAC,GAAG,EAAE;EACjC;CACJ,GACM,CAACE,GAAIC,GAAIC,KAAMP,EAAMQ,CAAI,GACzB,CAACC,GAAIC,GAAIC,KAAMX,EAAMY,CAAE,GACvBC,KAAO,GAAW,MAAsB,KAAK,MAAMlB,KAAKD,IAAIC,KAAKmB,CAAC;CACxE,OAAO,OAAOD,EAAIR,GAAII,CAAE,EAAE,IAAII,EAAIP,GAAII,CAAE,EAAE,IAAIG,EAAIN,GAAII,CAAE,EAAE;AAC9D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-map-hover.cjs","names":[],"sources":["../../src/br/use-map-hover.ts"],"sourcesContent":["import { useCallback, useState, type MouseEvent, type RefObject } from \"react\";\n\n/** The currently hovered item plus cursor position within the map container. */\nexport interface MapHover<T> {\n item: T;\n x: number;\n y: number;\n}\n\n/**\n * Track which shape the cursor is over and where, for a floating map tooltip.\n * Positions are computed relative to `containerRef` so the tooltip can be\n * placed with plain `left`/`top` inside the (relatively positioned) container.\n */\nexport function useMapHover<T>(containerRef: RefObject<HTMLDivElement | null>): {\n hover: MapHover<T> | null;\n onMove: (item: T, event: MouseEvent) => void;\n onLeave: () => void;\n} {\n const [hover, setHover] = useState<MapHover<T> | null>(null);\n\n const onMove = useCallback(\n (item: T, event: MouseEvent): void => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n setHover({ item, x: event.clientX - rect.left, y: event.clientY - rect.top });\n },\n [containerRef],\n );\n\n const onLeave = useCallback((): void => setHover(null), []);\n\n return { hover, onMove, onLeave };\n}\n"],"mappings":"uBAcA,
|
|
1
|
+
{"version":3,"file":"use-map-hover.cjs","names":["useState","useCallback","react","useMapHover","hover","setHover","rect","containerRef","event"],"sources":["../../src/br/use-map-hover.ts"],"sourcesContent":["import { useCallback, useState, type MouseEvent, type RefObject } from \"react\";\n\n/** The currently hovered item plus cursor position within the map container. */\nexport interface MapHover<T> {\n item: T;\n x: number;\n y: number;\n}\n\n/**\n * Track which shape the cursor is over and where, for a floating map tooltip.\n * Positions are computed relative to `containerRef` so the tooltip can be\n * placed with plain `left`/`top` inside the (relatively positioned) container.\n */\nexport function useMapHover<T>(containerRef: RefObject<HTMLDivElement | null>): {\n hover: MapHover<T> | null;\n onMove: (item: T, event: MouseEvent) => void;\n onLeave: () => void;\n} {\n const [hover, setHover] = useState<MapHover<T> | null>(null);\n\n const onMove = useCallback(\n (item: T, event: MouseEvent): void => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n setHover({ item, x: event.clientX - rect.left, y: event.clientY - rect.top });\n },\n [containerRef],\n );\n\n const onLeave = useCallback((): void => setHover(null), []);\n\n return { hover, onMove, onLeave };\n}\n"],"mappings":"A,uBAcA,SAAgBG,EAAe,EAI7B,CACE,GAAM,CAACC,EAAOC,IAAA,EAAYL,EAAAA,SAAAA,CAA6B,IAAI,EAa3D,MAAO,CAAE,QAAO,QAAA,EAXDC,EAAAA,YAAAA,EACV,EAAS,IAA4B,CAClC,IAAMK,EAAOC,EAAa,SAAS,sBAAsB,EACpDD,GACLD,EAAS,CAAE,OAAM,EAAGG,EAAM,QAAUF,EAAK,KAAM,EAAGE,EAAM,QAAUF,EAAK,GAAI,CAAC,CAChF,EACA,CAACC,CAAY,CAKD,EAAQ,SAAA,EAFRN,EAAAA,YAAAA,KAAwBI,EAAS,IAAI,EAAG,CAAC,CAEjC,CAAQ,CACpC,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-map-hover.js","names":[],"sources":["../../src/br/use-map-hover.ts"],"sourcesContent":["import { useCallback, useState, type MouseEvent, type RefObject } from \"react\";\n\n/** The currently hovered item plus cursor position within the map container. */\nexport interface MapHover<T> {\n item: T;\n x: number;\n y: number;\n}\n\n/**\n * Track which shape the cursor is over and where, for a floating map tooltip.\n * Positions are computed relative to `containerRef` so the tooltip can be\n * placed with plain `left`/`top` inside the (relatively positioned) container.\n */\nexport function useMapHover<T>(containerRef: RefObject<HTMLDivElement | null>): {\n hover: MapHover<T> | null;\n onMove: (item: T, event: MouseEvent) => void;\n onLeave: () => void;\n} {\n const [hover, setHover] = useState<MapHover<T> | null>(null);\n\n const onMove = useCallback(\n (item: T, event: MouseEvent): void => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n setHover({ item, x: event.clientX - rect.left, y: event.clientY - rect.top });\n },\n [containerRef],\n );\n\n const onLeave = useCallback((): void => setHover(null), []);\n\n return { hover, onMove, onLeave };\n}\n"],"mappings":";;AAcA,
|
|
1
|
+
{"version":3,"file":"use-map-hover.js","names":["useMapHover","hover","setHover","useState","useCallback","rect","containerRef","event"],"sources":["../../src/br/use-map-hover.ts"],"sourcesContent":["import { useCallback, useState, type MouseEvent, type RefObject } from \"react\";\n\n/** The currently hovered item plus cursor position within the map container. */\nexport interface MapHover<T> {\n item: T;\n x: number;\n y: number;\n}\n\n/**\n * Track which shape the cursor is over and where, for a floating map tooltip.\n * Positions are computed relative to `containerRef` so the tooltip can be\n * placed with plain `left`/`top` inside the (relatively positioned) container.\n */\nexport function useMapHover<T>(containerRef: RefObject<HTMLDivElement | null>): {\n hover: MapHover<T> | null;\n onMove: (item: T, event: MouseEvent) => void;\n onLeave: () => void;\n} {\n const [hover, setHover] = useState<MapHover<T> | null>(null);\n\n const onMove = useCallback(\n (item: T, event: MouseEvent): void => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n setHover({ item, x: event.clientX - rect.left, y: event.clientY - rect.top });\n },\n [containerRef],\n );\n\n const onLeave = useCallback((): void => setHover(null), []);\n\n return { hover, onMove, onLeave };\n}\n"],"mappings":";;AAcA,SAAgBA,EAAe,GAI7B;CACE,IAAM,CAACC,GAAOC,KAAYC,EAA6B,IAAI;CAa3D,OAAO;EAAE;EAAO,QAXDC,GACV,GAAS,MAA4B;GAClC,IAAMC,IAAOC,EAAa,SAAS,sBAAsB;GACzD,AAAKD,KACLH,EAAS;IAAE;IAAM,GAAGK,EAAM,UAAUF,EAAK;IAAM,GAAGE,EAAM,UAAUF,EAAK;GAAI,CAAC;EAChF,GACA,CAACC,CAAY,CAKD;EAAQ,SAFRF,QAAwBF,EAAS,IAAI,GAAG,CAAC,CAEjC;CAAQ;AACpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-map-zoom.cjs","names":[],"sources":["../../src/br/use-map-zoom.ts"],"sourcesContent":["import { useCallback, useRef, useState, type PointerEvent, type WheelEvent } from \"react\";\n\n/** Pan/zoom transform state. */\nexport interface MapTransform {\n /** Zoom factor (1 = fit). */\n k: number;\n /** X translation in pixels. */\n x: number;\n /** Y translation in pixels. */\n y: number;\n}\n\nconst MIN_K = 1;\nconst MAX_K = 12;\n\nexport interface UseMapZoom {\n /** SVG `transform` string for the content `<g>`. */\n transform: string;\n /** Current zoom factor. */\n zoom: number;\n /** True when panned/zoomed away from the initial fit. */\n isTransformed: boolean;\n /** Reset to the initial fit. */\n reset: () => void;\n /** Handlers to spread on the `<svg>` element. */\n handlers: {\n onWheel?: (e: WheelEvent) => void;\n onPointerDown?: (e: PointerEvent) => void;\n onPointerMove?: (e: PointerEvent) => void;\n onPointerUp?: (e: PointerEvent) => void;\n onPointerLeave?: (e: PointerEvent) => void;\n onDoubleClick?: () => void;\n style?: { cursor: string; touchAction: string };\n };\n}\n\n/**\n * Wheel-zoom (anchored at the cursor) + drag-pan for an SVG map. Returns a\n * `transform` to apply to a content `<g>` and handlers for the `<svg>`. A no-op\n * (identity transform, empty handlers) when `enabled` is false.\n */\nexport function useMapZoom(enabled: boolean): UseMapZoom {\n const [t, setT] = useState<MapTransform>({ k: 1, x: 0, y: 0 });\n const drag = useRef<{ x: number; y: number; ox: number; oy: number } | null>(null);\n\n const reset = useCallback(() => setT({ k: 1, x: 0, y: 0 }), []);\n\n const onWheel = useCallback((e: WheelEvent) => {\n e.preventDefault();\n const rect = e.currentTarget.getBoundingClientRect();\n const cx = e.clientX - rect.left;\n const cy = e.clientY - rect.top;\n setT((prev) => {\n const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15;\n const k = Math.max(MIN_K, Math.min(MAX_K, prev.k * factor));\n const scale = k / prev.k;\n return { k, x: cx - (cx - prev.x) * scale, y: cy - (cy - prev.y) * scale };\n });\n }, []);\n\n const onPointerDown = useCallback((e: PointerEvent) => {\n drag.current = { x: e.clientX, y: e.clientY, ox: 0, oy: 0 };\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }, []);\n\n const onPointerMove = useCallback((e: PointerEvent) => {\n if (!drag.current) return;\n const dx = e.clientX - drag.current.x;\n const dy = e.clientY - drag.current.y;\n drag.current.x = e.clientX;\n drag.current.y = e.clientY;\n setT((prev) => ({ ...prev, x: prev.x + dx, y: prev.y + dy }));\n }, []);\n\n const endDrag = useCallback((e: PointerEvent) => {\n drag.current = null;\n e.currentTarget.releasePointerCapture?.(e.pointerId);\n }, []);\n\n if (!enabled) {\n return {\n transform: \"\",\n zoom: 1,\n isTransformed: false,\n reset,\n handlers: {},\n };\n }\n\n const isTransformed = t.k !== 1 || t.x !== 0 || t.y !== 0;\n return {\n transform: `translate(${t.x} ${t.y}) scale(${t.k})`,\n zoom: t.k,\n isTransformed,\n reset,\n handlers: {\n onWheel,\n onPointerDown,\n onPointerMove,\n onPointerUp: endDrag,\n onPointerLeave: endDrag,\n onDoubleClick: reset,\n style: { cursor: isTransformed ? \"grab\" : \"default\", touchAction: \"none\" },\n },\n };\n}\n"],"mappings":"uBAYA,
|
|
1
|
+
{"version":3,"file":"use-map-zoom.cjs","names":["useState","useRef","useCallback","react","MIN_K","MAX_K","useMapZoom","t","setT","drag","reset","onWheel","rect","cx","cy","factor","k","prev","scale","onPointerDown","onPointerMove","dx","dy","endDrag","enabled","isTransformed"],"sources":["../../src/br/use-map-zoom.ts"],"sourcesContent":["import { useCallback, useRef, useState, type PointerEvent, type WheelEvent } from \"react\";\n\n/** Pan/zoom transform state. */\nexport interface MapTransform {\n /** Zoom factor (1 = fit). */\n k: number;\n /** X translation in pixels. */\n x: number;\n /** Y translation in pixels. */\n y: number;\n}\n\nconst MIN_K = 1;\nconst MAX_K = 12;\n\nexport interface UseMapZoom {\n /** SVG `transform` string for the content `<g>`. */\n transform: string;\n /** Current zoom factor. */\n zoom: number;\n /** True when panned/zoomed away from the initial fit. */\n isTransformed: boolean;\n /** Reset to the initial fit. */\n reset: () => void;\n /** Handlers to spread on the `<svg>` element. */\n handlers: {\n onWheel?: (e: WheelEvent) => void;\n onPointerDown?: (e: PointerEvent) => void;\n onPointerMove?: (e: PointerEvent) => void;\n onPointerUp?: (e: PointerEvent) => void;\n onPointerLeave?: (e: PointerEvent) => void;\n onDoubleClick?: () => void;\n style?: { cursor: string; touchAction: string };\n };\n}\n\n/**\n * Wheel-zoom (anchored at the cursor) + drag-pan for an SVG map. Returns a\n * `transform` to apply to a content `<g>` and handlers for the `<svg>`. A no-op\n * (identity transform, empty handlers) when `enabled` is false.\n */\nexport function useMapZoom(enabled: boolean): UseMapZoom {\n const [t, setT] = useState<MapTransform>({ k: 1, x: 0, y: 0 });\n const drag = useRef<{ x: number; y: number; ox: number; oy: number } | null>(null);\n\n const reset = useCallback(() => setT({ k: 1, x: 0, y: 0 }), []);\n\n const onWheel = useCallback((e: WheelEvent) => {\n e.preventDefault();\n const rect = e.currentTarget.getBoundingClientRect();\n const cx = e.clientX - rect.left;\n const cy = e.clientY - rect.top;\n setT((prev) => {\n const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15;\n const k = Math.max(MIN_K, Math.min(MAX_K, prev.k * factor));\n const scale = k / prev.k;\n return { k, x: cx - (cx - prev.x) * scale, y: cy - (cy - prev.y) * scale };\n });\n }, []);\n\n const onPointerDown = useCallback((e: PointerEvent) => {\n drag.current = { x: e.clientX, y: e.clientY, ox: 0, oy: 0 };\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }, []);\n\n const onPointerMove = useCallback((e: PointerEvent) => {\n if (!drag.current) return;\n const dx = e.clientX - drag.current.x;\n const dy = e.clientY - drag.current.y;\n drag.current.x = e.clientX;\n drag.current.y = e.clientY;\n setT((prev) => ({ ...prev, x: prev.x + dx, y: prev.y + dy }));\n }, []);\n\n const endDrag = useCallback((e: PointerEvent) => {\n drag.current = null;\n e.currentTarget.releasePointerCapture?.(e.pointerId);\n }, []);\n\n if (!enabled) {\n return {\n transform: \"\",\n zoom: 1,\n isTransformed: false,\n reset,\n handlers: {},\n };\n }\n\n const isTransformed = t.k !== 1 || t.x !== 0 || t.y !== 0;\n return {\n transform: `translate(${t.x} ${t.y}) scale(${t.k})`,\n zoom: t.k,\n isTransformed,\n reset,\n handlers: {\n onWheel,\n onPointerDown,\n onPointerMove,\n onPointerUp: endDrag,\n onPointerLeave: endDrag,\n onDoubleClick: reset,\n style: { cursor: isTransformed ? \"grab\" : \"default\", touchAction: \"none\" },\n },\n };\n}\n"],"mappings":"A,uBAYA,IAAMI,EAAQ,EACRC,EAAQ,GA4Bd,SAAgBC,EAAW,EAA8B,CACrD,GAAM,CAACC,EAAGC,IAAA,EAAQR,EAAAA,SAAAA,CAAuB,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACvDS,GAAA,EAAOR,EAAAA,OAAAA,CAAgE,IAAI,EAE3ES,GAAA,EAAQR,EAAAA,YAAAA,KAAkBM,EAAK,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAAG,CAAC,CAAC,EAExDG,GAAA,EAAUT,EAAAA,YAAAA,CAAa,GAAkB,CAC3C,EAAE,eAAe,EACjB,IAAMU,EAAO,EAAE,cAAc,sBAAsB,EAC7CC,EAAK,EAAE,QAAUD,EAAK,KACtBE,EAAK,EAAE,QAAUF,EAAK,IAC5BJ,EAAM,GAAS,CACX,IAAMO,EAAS,EAAE,OAAS,EAAI,KAAO,EAAI,KACnCC,EAAI,KAAK,IAAIZ,EAAO,KAAK,IAAIC,EAAOY,EAAK,EAAIF,CAAM,CAAC,EACpDG,EAAQF,EAAIC,EAAK,EACvB,MAAO,CAAE,IAAG,EAAGJ,GAAMA,EAAKI,EAAK,GAAKC,EAAO,EAAGJ,GAAMA,EAAKG,EAAK,GAAKC,CAAM,CAC7E,CAAC,CACL,EAAG,CAAC,CAAC,EAECC,GAAA,EAAgBjB,EAAAA,YAAAA,CAAa,GAAoB,CACnD,EAAK,QAAU,CAAE,EAAG,EAAE,QAAS,EAAG,EAAE,QAAS,GAAI,EAAG,GAAI,CAAE,EAC1D,EAAE,cAAc,oBAAoB,EAAE,SAAS,CACnD,EAAG,CAAC,CAAC,EAECkB,GAAA,EAAgBlB,EAAAA,YAAAA,CAAa,GAAoB,CACnD,GAAI,CAACO,EAAK,QAAS,OACnB,IAAMY,EAAK,EAAE,QAAUZ,EAAK,QAAQ,EAC9Ba,EAAK,EAAE,QAAUb,EAAK,QAAQ,EACpC,EAAK,QAAQ,EAAI,EAAE,QACnB,EAAK,QAAQ,EAAI,EAAE,QACnBD,EAAM,IAAU,CAAE,GAAGS,EAAM,EAAGA,EAAK,EAAII,EAAI,EAAGJ,EAAK,EAAIK,CAAG,EAAE,CAChE,EAAG,CAAC,CAAC,EAECC,GAAA,EAAUrB,EAAAA,YAAAA,CAAa,GAAoB,CAC7C,EAAK,QAAU,KACf,EAAE,cAAc,wBAAwB,EAAE,SAAS,CACvD,EAAG,CAAC,CAAC,EAEL,GAAI,CAACsB,EACD,MAAO,CACH,UAAW,GACX,KAAM,EACN,cAAe,GACf,QACA,SAAU,CAAC,CACf,EAGJ,IAAMC,EAAgBlB,EAAE,IAAM,GAAKA,EAAE,IAAM,GAAKA,EAAE,IAAM,EACxD,MAAO,CACH,UAAW,aAAaA,EAAE,EAAE,GAAGA,EAAE,EAAE,UAAUA,EAAE,EAAE,GACjD,KAAMA,EAAE,EACR,gBACA,QACA,SAAU,CACN,UACA,gBACA,gBACA,YAAagB,EACb,eAAgBA,EAChB,cAAeb,EACf,MAAO,CAAE,OAAQe,EAAgB,OAAS,UAAW,YAAa,MAAO,CAC7E,CACJ,CACJ,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-map-zoom.js","names":[],"sources":["../../src/br/use-map-zoom.ts"],"sourcesContent":["import { useCallback, useRef, useState, type PointerEvent, type WheelEvent } from \"react\";\n\n/** Pan/zoom transform state. */\nexport interface MapTransform {\n /** Zoom factor (1 = fit). */\n k: number;\n /** X translation in pixels. */\n x: number;\n /** Y translation in pixels. */\n y: number;\n}\n\nconst MIN_K = 1;\nconst MAX_K = 12;\n\nexport interface UseMapZoom {\n /** SVG `transform` string for the content `<g>`. */\n transform: string;\n /** Current zoom factor. */\n zoom: number;\n /** True when panned/zoomed away from the initial fit. */\n isTransformed: boolean;\n /** Reset to the initial fit. */\n reset: () => void;\n /** Handlers to spread on the `<svg>` element. */\n handlers: {\n onWheel?: (e: WheelEvent) => void;\n onPointerDown?: (e: PointerEvent) => void;\n onPointerMove?: (e: PointerEvent) => void;\n onPointerUp?: (e: PointerEvent) => void;\n onPointerLeave?: (e: PointerEvent) => void;\n onDoubleClick?: () => void;\n style?: { cursor: string; touchAction: string };\n };\n}\n\n/**\n * Wheel-zoom (anchored at the cursor) + drag-pan for an SVG map. Returns a\n * `transform` to apply to a content `<g>` and handlers for the `<svg>`. A no-op\n * (identity transform, empty handlers) when `enabled` is false.\n */\nexport function useMapZoom(enabled: boolean): UseMapZoom {\n const [t, setT] = useState<MapTransform>({ k: 1, x: 0, y: 0 });\n const drag = useRef<{ x: number; y: number; ox: number; oy: number } | null>(null);\n\n const reset = useCallback(() => setT({ k: 1, x: 0, y: 0 }), []);\n\n const onWheel = useCallback((e: WheelEvent) => {\n e.preventDefault();\n const rect = e.currentTarget.getBoundingClientRect();\n const cx = e.clientX - rect.left;\n const cy = e.clientY - rect.top;\n setT((prev) => {\n const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15;\n const k = Math.max(MIN_K, Math.min(MAX_K, prev.k * factor));\n const scale = k / prev.k;\n return { k, x: cx - (cx - prev.x) * scale, y: cy - (cy - prev.y) * scale };\n });\n }, []);\n\n const onPointerDown = useCallback((e: PointerEvent) => {\n drag.current = { x: e.clientX, y: e.clientY, ox: 0, oy: 0 };\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }, []);\n\n const onPointerMove = useCallback((e: PointerEvent) => {\n if (!drag.current) return;\n const dx = e.clientX - drag.current.x;\n const dy = e.clientY - drag.current.y;\n drag.current.x = e.clientX;\n drag.current.y = e.clientY;\n setT((prev) => ({ ...prev, x: prev.x + dx, y: prev.y + dy }));\n }, []);\n\n const endDrag = useCallback((e: PointerEvent) => {\n drag.current = null;\n e.currentTarget.releasePointerCapture?.(e.pointerId);\n }, []);\n\n if (!enabled) {\n return {\n transform: \"\",\n zoom: 1,\n isTransformed: false,\n reset,\n handlers: {},\n };\n }\n\n const isTransformed = t.k !== 1 || t.x !== 0 || t.y !== 0;\n return {\n transform: `translate(${t.x} ${t.y}) scale(${t.k})`,\n zoom: t.k,\n isTransformed,\n reset,\n handlers: {\n onWheel,\n onPointerDown,\n onPointerMove,\n onPointerUp: endDrag,\n onPointerLeave: endDrag,\n onDoubleClick: reset,\n style: { cursor: isTransformed ? \"grab\" : \"default\", touchAction: \"none\" },\n },\n };\n}\n"],"mappings":";;AAYA,
|
|
1
|
+
{"version":3,"file":"use-map-zoom.js","names":["MIN_K","MAX_K","useMapZoom","t","setT","useState","drag","useRef","reset","useCallback","onWheel","rect","cx","cy","factor","k","prev","scale","onPointerDown","onPointerMove","dx","dy","endDrag","enabled","isTransformed"],"sources":["../../src/br/use-map-zoom.ts"],"sourcesContent":["import { useCallback, useRef, useState, type PointerEvent, type WheelEvent } from \"react\";\n\n/** Pan/zoom transform state. */\nexport interface MapTransform {\n /** Zoom factor (1 = fit). */\n k: number;\n /** X translation in pixels. */\n x: number;\n /** Y translation in pixels. */\n y: number;\n}\n\nconst MIN_K = 1;\nconst MAX_K = 12;\n\nexport interface UseMapZoom {\n /** SVG `transform` string for the content `<g>`. */\n transform: string;\n /** Current zoom factor. */\n zoom: number;\n /** True when panned/zoomed away from the initial fit. */\n isTransformed: boolean;\n /** Reset to the initial fit. */\n reset: () => void;\n /** Handlers to spread on the `<svg>` element. */\n handlers: {\n onWheel?: (e: WheelEvent) => void;\n onPointerDown?: (e: PointerEvent) => void;\n onPointerMove?: (e: PointerEvent) => void;\n onPointerUp?: (e: PointerEvent) => void;\n onPointerLeave?: (e: PointerEvent) => void;\n onDoubleClick?: () => void;\n style?: { cursor: string; touchAction: string };\n };\n}\n\n/**\n * Wheel-zoom (anchored at the cursor) + drag-pan for an SVG map. Returns a\n * `transform` to apply to a content `<g>` and handlers for the `<svg>`. A no-op\n * (identity transform, empty handlers) when `enabled` is false.\n */\nexport function useMapZoom(enabled: boolean): UseMapZoom {\n const [t, setT] = useState<MapTransform>({ k: 1, x: 0, y: 0 });\n const drag = useRef<{ x: number; y: number; ox: number; oy: number } | null>(null);\n\n const reset = useCallback(() => setT({ k: 1, x: 0, y: 0 }), []);\n\n const onWheel = useCallback((e: WheelEvent) => {\n e.preventDefault();\n const rect = e.currentTarget.getBoundingClientRect();\n const cx = e.clientX - rect.left;\n const cy = e.clientY - rect.top;\n setT((prev) => {\n const factor = e.deltaY < 0 ? 1.15 : 1 / 1.15;\n const k = Math.max(MIN_K, Math.min(MAX_K, prev.k * factor));\n const scale = k / prev.k;\n return { k, x: cx - (cx - prev.x) * scale, y: cy - (cy - prev.y) * scale };\n });\n }, []);\n\n const onPointerDown = useCallback((e: PointerEvent) => {\n drag.current = { x: e.clientX, y: e.clientY, ox: 0, oy: 0 };\n e.currentTarget.setPointerCapture?.(e.pointerId);\n }, []);\n\n const onPointerMove = useCallback((e: PointerEvent) => {\n if (!drag.current) return;\n const dx = e.clientX - drag.current.x;\n const dy = e.clientY - drag.current.y;\n drag.current.x = e.clientX;\n drag.current.y = e.clientY;\n setT((prev) => ({ ...prev, x: prev.x + dx, y: prev.y + dy }));\n }, []);\n\n const endDrag = useCallback((e: PointerEvent) => {\n drag.current = null;\n e.currentTarget.releasePointerCapture?.(e.pointerId);\n }, []);\n\n if (!enabled) {\n return {\n transform: \"\",\n zoom: 1,\n isTransformed: false,\n reset,\n handlers: {},\n };\n }\n\n const isTransformed = t.k !== 1 || t.x !== 0 || t.y !== 0;\n return {\n transform: `translate(${t.x} ${t.y}) scale(${t.k})`,\n zoom: t.k,\n isTransformed,\n reset,\n handlers: {\n onWheel,\n onPointerDown,\n onPointerMove,\n onPointerUp: endDrag,\n onPointerLeave: endDrag,\n onDoubleClick: reset,\n style: { cursor: isTransformed ? \"grab\" : \"default\", touchAction: \"none\" },\n },\n };\n}\n"],"mappings":";;AAYA,IAAMA,IAAQ,GACRC,IAAQ;AA4Bd,SAAgBC,EAAW,GAA8B;CACrD,IAAM,CAACC,GAAGC,KAAQC,EAAuB;EAAE,GAAG;EAAG,GAAG;EAAG,GAAG;CAAE,CAAC,GACvDC,IAAOC,EAAgE,IAAI,GAE3EC,IAAQC,QAAkBL,EAAK;EAAE,GAAG;EAAG,GAAG;EAAG,GAAG;CAAE,CAAC,GAAG,CAAC,CAAC,GAExDM,IAAUD,GAAa,MAAkB;EAC3C,EAAE,eAAe;EACjB,IAAME,IAAO,EAAE,cAAc,sBAAsB,GAC7CC,IAAK,EAAE,UAAUD,EAAK,MACtBE,IAAK,EAAE,UAAUF,EAAK;EAC5B,GAAM,MAAS;GACX,IAAMG,IAAS,EAAE,SAAS,IAAI,OAAO,IAAI,MACnCC,IAAI,KAAK,IAAIf,GAAO,KAAK,IAAIC,GAAOe,EAAK,IAAIF,CAAM,CAAC,GACpDG,IAAQF,IAAIC,EAAK;GACvB,OAAO;IAAE;IAAG,GAAGJ,KAAMA,IAAKI,EAAK,KAAKC;IAAO,GAAGJ,KAAMA,IAAKG,EAAK,KAAKC;GAAM;EAC7E,CAAC;CACL,GAAG,CAAC,CAAC,GAECC,IAAgBT,GAAa,MAAoB;EAEnD,AADA,EAAK,UAAU;GAAE,GAAG,EAAE;GAAS,GAAG,EAAE;GAAS,IAAI;GAAG,IAAI;EAAE,GAC1D,EAAE,cAAc,oBAAoB,EAAE,SAAS;CACnD,GAAG,CAAC,CAAC,GAECU,IAAgBV,GAAa,MAAoB;EACnD,IAAI,CAACH,EAAK,SAAS;EACnB,IAAMc,IAAK,EAAE,UAAUd,EAAK,QAAQ,GAC9Be,IAAK,EAAE,UAAUf,EAAK,QAAQ;EAGpC,AAFA,EAAK,QAAQ,IAAI,EAAE,SACnB,EAAK,QAAQ,IAAI,EAAE,SACnBF,GAAM,OAAU;GAAE,GAAGY;GAAM,GAAGA,EAAK,IAAII;GAAI,GAAGJ,EAAK,IAAIK;EAAG,EAAE;CAChE,GAAG,CAAC,CAAC,GAECC,IAAUb,GAAa,MAAoB;EAE7C,AADA,EAAK,UAAU,MACf,EAAE,cAAc,wBAAwB,EAAE,SAAS;CACvD,GAAG,CAAC,CAAC;CAEL,IAAI,CAACc,GACD,OAAO;EACH,WAAW;EACX,MAAM;EACN,eAAe;EACf;EACA,UAAU,CAAC;CACf;CAGJ,IAAMC,IAAgBrB,EAAE,MAAM,KAAKA,EAAE,MAAM,KAAKA,EAAE,MAAM;CACxD,OAAO;EACH,WAAW,aAAaA,EAAE,EAAE,GAAGA,EAAE,EAAE,UAAUA,EAAE,EAAE;EACjD,MAAMA,EAAE;EACR;EACA;EACA,UAAU;GACN;GACA;GACA;GACA,aAAamB;GACb,gBAAgBA;GAChB,eAAed;GACf,OAAO;IAAE,QAAQgB,IAAgB,SAAS;IAAW,aAAa;GAAO;EAC7E;CACJ;AACJ"}
|
package/dist/br/whatsapp.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whatsapp.cjs","names":[],"sources":["../../src/br/whatsapp.ts"],"sourcesContent":["/** Country calling code for Brazil, the digits `wa.me` needs in front of a national number. */\nconst BR_COUNTRY_CODE = \"55\";\n\nconst NATIONAL_LENGTHS = new Set([10, 11]);\nconst E164_MIN_WITH_COUNTRY_CODE = 12;\nconst E164_MAX = 15;\n\n/**\n * Normalise a phone number to the digits-only form `wa.me` accepts.\n *\n * A Brazilian number is stored almost everywhere **without** the country code —\n * ten digits for a landline, eleven for a mobile — and `wa.me` refuses anything\n * that is not fully qualified. Those two shapes get `55` in front; a number that\n * already carries a country code (12 to 15 digits, the E.164 range that no\n * Brazilian national number can reach) is returned untouched, so a foreign\n * client's number still works.\n *\n * Everything else returns an empty string rather than a best guess. Handing back\n * the digits as typed is what the naive version does, and it builds a `wa.me`\n * URL that opens WhatsApp on a number nobody owns — a typo becomes a dead chat\n * window instead of a disabled button.\n *\n * Trunk and carrier-selection prefixes (`0`, `021`, …) are **not** stripped: a\n * leading zero is ambiguous between the two, so a number carrying one reads as\n * invalid instead of being silently reinterpreted. Pass the plain number. The\n * leading zero is what rules it out even at a plausible length — no E.164\n * country code starts with `0`, so `011999998888` is a national number wearing a\n * trunk prefix, never an international one.\n *\n * @example\n * toWhatsAppNumber(\"(11) 99999-8888\"); // \"5511999998888\"\n * toWhatsAppNumber(\"+55 11 99999-8888\"); // \"5511999998888\"\n * toWhatsAppNumber(\"99999-8888\"); // \"\" — no area code, nothing to dial\n *\n * @param phone - Phone number in any shape: masked, spaced, `+`-prefixed.\n * @returns Digits ready for a `wa.me` link, or an empty string when the input\n * cannot be resolved to a dialable number.\n */\nexport function toWhatsAppNumber(phone: string): string {\n const digits = phone.replace(/\\D/g, \"\");\n if (NATIONAL_LENGTHS.has(digits.length)) return `${BR_COUNTRY_CODE}${digits}`;\n const withinE164 = digits.length >= E164_MIN_WITH_COUNTRY_CODE && digits.length <= E164_MAX;\n if (withinE164 && !digits.startsWith(\"0\")) return digits;\n return \"\";\n}\n\n/**\n * Build the `wa.me` deep link that opens a chat with an optional message\n * already typed.\n *\n * This is a **deep link, never a send**: the chat opens with the text ready and\n * the person presses send. That is the feature, not a limitation — it needs no\n * official Cloud API, no approved template and no business verification, and it\n * cannot let the UI claim a message was delivered when it was not.\n *\n * `api.whatsapp.com/send?phone=…` is deliberately not offered as an alternative\n * host: both resolve to the same chooser, and `wa.me` is the short form of it.\n *\n * @example\n * whatsAppUrl(\"(11) 99999-8888\", \"Seu horário é amanhã às 14h.\");\n * // \"https://wa.me/5511999998888?text=Seu%20hor%C3%A1rio%20%C3%A9%20amanh%C3%A3%20%C3%A0s%2014h.\"\n *\n * @param phone - Phone number in any shape; normalised by {@link toWhatsAppNumber}.\n * @param text - Message to pre-fill. Omitted or empty leaves the composer blank.\n * @returns The `https://wa.me/…` URL, or an empty string when the number cannot\n * be normalised.\n */\nexport function whatsAppUrl(phone: string, text?: string): string {\n const number = toWhatsAppNumber(phone);\n if (!number) return \"\";\n const url = `https://wa.me/${number}`;\n return text ? `${url}?text=${encodeURIComponent(text)}` : url;\n}\n\n/**\n * Open the WhatsApp chat in a new tab.\n *\n * @example\n * <Button onClick={() => openWhatsApp(client.phone, greeting)}>\n * Falar no WhatsApp\n * </Button>\n *\n * @param phone - Phone number in any shape; normalised by {@link toWhatsAppNumber}.\n * @param text - Message to pre-fill. Omitted or empty leaves the composer blank.\n * @returns `true` when a URL was built and the open was requested, `false` when\n * the number is unusable or there is no `window` (test runner, service worker,\n * build plugin). It reports the **request**, not the tab: opening with\n * `noopener` makes `window.open` return `null` even on success, so its result\n * cannot distinguish a blocked popup from an opened one.\n */\nexport function openWhatsApp(phone: string, text?: string): boolean {\n if (typeof window === \"undefined\") return false;\n const url = whatsAppUrl(phone, text);\n if (!url) return false;\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n return true;\n}\n"],"mappings":"AACA,
|
|
1
|
+
{"version":3,"file":"whatsapp.cjs","names":["NATIONAL_LENGTHS","E164_MIN_WITH_COUNTRY_CODE","E164_MAX","toWhatsAppNumber","digits","phone","whatsAppUrl","number","url","text","openWhatsApp"],"sources":["../../src/br/whatsapp.ts"],"sourcesContent":["/** Country calling code for Brazil, the digits `wa.me` needs in front of a national number. */\nconst BR_COUNTRY_CODE = \"55\";\n\nconst NATIONAL_LENGTHS = new Set([10, 11]);\nconst E164_MIN_WITH_COUNTRY_CODE = 12;\nconst E164_MAX = 15;\n\n/**\n * Normalise a phone number to the digits-only form `wa.me` accepts.\n *\n * A Brazilian number is stored almost everywhere **without** the country code —\n * ten digits for a landline, eleven for a mobile — and `wa.me` refuses anything\n * that is not fully qualified. Those two shapes get `55` in front; a number that\n * already carries a country code (12 to 15 digits, the E.164 range that no\n * Brazilian national number can reach) is returned untouched, so a foreign\n * client's number still works.\n *\n * Everything else returns an empty string rather than a best guess. Handing back\n * the digits as typed is what the naive version does, and it builds a `wa.me`\n * URL that opens WhatsApp on a number nobody owns — a typo becomes a dead chat\n * window instead of a disabled button.\n *\n * Trunk and carrier-selection prefixes (`0`, `021`, …) are **not** stripped: a\n * leading zero is ambiguous between the two, so a number carrying one reads as\n * invalid instead of being silently reinterpreted. Pass the plain number. The\n * leading zero is what rules it out even at a plausible length — no E.164\n * country code starts with `0`, so `011999998888` is a national number wearing a\n * trunk prefix, never an international one.\n *\n * @example\n * toWhatsAppNumber(\"(11) 99999-8888\"); // \"5511999998888\"\n * toWhatsAppNumber(\"+55 11 99999-8888\"); // \"5511999998888\"\n * toWhatsAppNumber(\"99999-8888\"); // \"\" — no area code, nothing to dial\n *\n * @param phone - Phone number in any shape: masked, spaced, `+`-prefixed.\n * @returns Digits ready for a `wa.me` link, or an empty string when the input\n * cannot be resolved to a dialable number.\n */\nexport function toWhatsAppNumber(phone: string): string {\n const digits = phone.replace(/\\D/g, \"\");\n if (NATIONAL_LENGTHS.has(digits.length)) return `${BR_COUNTRY_CODE}${digits}`;\n const withinE164 = digits.length >= E164_MIN_WITH_COUNTRY_CODE && digits.length <= E164_MAX;\n if (withinE164 && !digits.startsWith(\"0\")) return digits;\n return \"\";\n}\n\n/**\n * Build the `wa.me` deep link that opens a chat with an optional message\n * already typed.\n *\n * This is a **deep link, never a send**: the chat opens with the text ready and\n * the person presses send. That is the feature, not a limitation — it needs no\n * official Cloud API, no approved template and no business verification, and it\n * cannot let the UI claim a message was delivered when it was not.\n *\n * `api.whatsapp.com/send?phone=…` is deliberately not offered as an alternative\n * host: both resolve to the same chooser, and `wa.me` is the short form of it.\n *\n * @example\n * whatsAppUrl(\"(11) 99999-8888\", \"Seu horário é amanhã às 14h.\");\n * // \"https://wa.me/5511999998888?text=Seu%20hor%C3%A1rio%20%C3%A9%20amanh%C3%A3%20%C3%A0s%2014h.\"\n *\n * @param phone - Phone number in any shape; normalised by {@link toWhatsAppNumber}.\n * @param text - Message to pre-fill. Omitted or empty leaves the composer blank.\n * @returns The `https://wa.me/…` URL, or an empty string when the number cannot\n * be normalised.\n */\nexport function whatsAppUrl(phone: string, text?: string): string {\n const number = toWhatsAppNumber(phone);\n if (!number) return \"\";\n const url = `https://wa.me/${number}`;\n return text ? `${url}?text=${encodeURIComponent(text)}` : url;\n}\n\n/**\n * Open the WhatsApp chat in a new tab.\n *\n * @example\n * <Button onClick={() => openWhatsApp(client.phone, greeting)}>\n * Falar no WhatsApp\n * </Button>\n *\n * @param phone - Phone number in any shape; normalised by {@link toWhatsAppNumber}.\n * @param text - Message to pre-fill. Omitted or empty leaves the composer blank.\n * @returns `true` when a URL was built and the open was requested, `false` when\n * the number is unusable or there is no `window` (test runner, service worker,\n * build plugin). It reports the **request**, not the tab: opening with\n * `noopener` makes `window.open` return `null` even on success, so its result\n * cannot distinguish a blocked popup from an opened one.\n */\nexport function openWhatsApp(phone: string, text?: string): boolean {\n if (typeof window === \"undefined\") return false;\n const url = whatsAppUrl(phone, text);\n if (!url) return false;\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n return true;\n}\n"],"mappings":"AACA,IAEMA,EAAmB,IAAI,IAAI,CAAC,GAAI,EAAE,CAAC,EACnCC,EAA6B,GAC7BC,EAAW,GAiCjB,SAAgBC,EAAiB,EAAuB,CACpD,IAAMC,EAASC,EAAM,QAAQ,MAAO,EAAE,EAItC,OAHIL,EAAiB,IAAII,EAAO,MAAM,EAAU,KAAqBA,IAClDA,EAAO,QAAUH,GAA8BG,EAAO,QAAUF,GACjE,CAACE,EAAO,WAAW,GAAG,EAAUA,EAC3C,EACX,CAuBA,SAAgBE,EAAY,EAAe,EAAuB,CAC9D,IAAMC,EAASJ,EAAiBE,CAAK,EACrC,GAAI,CAACE,EAAQ,MAAO,GACpB,IAAMC,EAAM,iBAAiBD,IAC7B,OAAOE,EAAO,GAAGD,EAAI,QAAQ,mBAAmBC,CAAI,IAAMD,CAC9D,CAkBA,SAAgBE,EAAa,EAAe,EAAwB,CAChE,GAAI,OAAO,OAAW,IAAa,MAAO,GAC1C,IAAMF,EAAMF,EAAYD,EAAOI,CAAI,EAGnC,OAFKD,GACL,OAAO,KAAKA,EAAK,SAAU,qBAAqB,EACzC,IAFU,EAGrB,C"}
|