tempest-react-sdk 0.78.0 → 0.79.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.mjs +168 -64
- package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
- package/bin/lib/openapi/generate.test.mjs +263 -1
- 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.map +1 -1
- package/dist/http/api-client.js.map +1 -1
- package/dist/http/build-url.cjs.map +1 -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/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.map +1 -1
- package/dist/sse/create-event-stream.js.map +1 -1
- package/dist/sse/use-event-stream.cjs.map +1 -1
- 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 +234 -3
- package/dist/tempest-react-sdk.js +85 -85
- 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/vision/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../src/vision/types.ts"],"sourcesContent":["/** @generated Vendored from @mauriciobenjamin700/ort-vision-sdk-web. Do not hand-edit — regenerate with `npm run vendor:vision`. */\n/**\n * Public output types returned by the SDK's vision tasks.\n *\n * These types form the contract between the SDK and its callers. They mirror\n * the Python `ort-vision-sdk` output dataclasses 1-to-1.\n *\n * Naming is intentionally compatible with the Ultralytics / torchvision idiom\n * (`cls`, `conf`, `box`, `xyxy`, `xywh`, normalized variants) so code ported\n * from those projects keeps working with minimal edits. The original verbose\n * names (`classId`, `className`, `confidence`, `bbox`) are still populated for\n * backwards compatibility.\n */\n\nimport { ImageLoadError } from \"./core/exceptions\";\n\n/**\n * HWC RGB uint8 image — the canonical image format used across the SDK.\n *\n * `data.length` must equal `width * height * 3`. The buffer is laid out row\n * by row, top-to-bottom, with each pixel as `[R, G, B]`.\n *\n * The pixels can also be produced on first read — see {@link RGBImage.deferred}.\n * Reading `data` is the same either way.\n */\nexport class RGBImage {\n private _data: Uint8Array | null;\n private _materialize: (() => Uint8Array) | null = null;\n\n constructor(\n data: Uint8Array,\n public readonly width: number,\n public readonly height: number,\n ) {\n RGBImage._check(data, width, height);\n this._data = data;\n }\n\n /**\n * An image whose pixels are computed the first time `data` is read.\n *\n * Used by the decoder for frames it can hand to preprocessing without\n * reading back: a 1080p `getImageData` plus the RGBA→RGB copy is most of\n * the `load` stage (9.4 ms vs 1.9 ms for the GPU-side copy, measured in\n * Chromium), and a camera loop that only reads boxes never needs it.\n *\n * @param width Width in pixels.\n * @param height Height in pixels.\n * @param materialize Produces the `width * height * 3` buffer; called at most\n * once, and must keep returning the pixels of the moment the image was\n * made — snapshot whatever it reads from.\n * @returns The image. Built without the constructor, which would need the\n * very buffer this defers.\n */\n static deferred(width: number, height: number, materialize: () => Uint8Array): RGBImage {\n const image = Object.create(RGBImage.prototype) as RGBImage;\n Object.assign(image, { width, height, _data: null, _materialize: materialize });\n return image;\n }\n\n /**\n * The HWC RGB pixels, materialized on first read for a deferred image.\n *\n * @throws {@link ImageLoadError} if a deferred image's buffer has the wrong length.\n */\n get data(): Uint8Array {\n if (this._data === null) {\n const data = (this._materialize as () => Uint8Array)();\n RGBImage._check(data, this.width, this.height);\n this._data = data;\n this._materialize = null;\n }\n return this._data;\n }\n\n /**\n * Validate a buffer's length against the image size.\n *\n * @param data The pixels.\n * @param width Width in pixels.\n * @param height Height in pixels.\n * @throws {@link ImageLoadError} if `data.length !== width * height * 3`.\n */\n private static _check(data: Uint8Array, width: number, height: number): void {\n if (data.length !== width * height * 3) {\n throw new ImageLoadError(\n `RGBImage data length ${data.length} does not match width * height * 3 = ${\n width * height * 3\n }.`,\n );\n }\n }\n}\n\n/**\n * Axis-aligned bounding box in absolute pixel coordinates (xyxy format).\n *\n * Coordinates refer to the original input image (before any internal resize),\n * so callers can map detections back onto their source image without any\n * additional bookkeeping.\n */\nexport class BoundingBox {\n constructor(\n public readonly x1: number,\n public readonly y1: number,\n public readonly x2: number,\n public readonly y2: number,\n ) {}\n\n /** Box width in pixels (clamped to non-negative). */\n get width(): number {\n return Math.max(0, this.x2 - this.x1);\n }\n\n /** Box height in pixels (clamped to non-negative). */\n get height(): number {\n return Math.max(0, this.y2 - this.y1);\n }\n\n /** Box area in pixels squared. */\n get area(): number {\n return this.width * this.height;\n }\n\n /** The box as `[x1, y1, x2, y2]` in absolute pixels (Ultralytics-style). */\n get xyxy(): readonly [number, number, number, number] {\n return [this.x1, this.y1, this.x2, this.y2];\n }\n\n /**\n * The box as `[cx, cy, w, h]` with `(cx, cy)` at the center.\n *\n * Matches Ultralytics' `boxes.xywh` and YOLO's native head format. For the\n * top-left `[x, y, w, h]` convention, use {@link asXywh}.\n */\n get xywh(): readonly [number, number, number, number] {\n return [(this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2, this.width, this.height];\n }\n\n /**\n * The box as `[x1, y1, x2, y2]` normalized to `[0, 1]`.\n *\n * @param origShape `[height, width]` of the source image, in pixels.\n */\n xyxyn(origShape: readonly [number, number]): readonly [number, number, number, number] {\n const [h, w] = origShape;\n if (w <= 0 || h <= 0) return [0, 0, 0, 0];\n return [this.x1 / w, this.y1 / h, this.x2 / w, this.y2 / h];\n }\n\n /**\n * The box as `[cx, cy, w, h]` normalized to `[0, 1]`.\n *\n * @param origShape `[height, width]` of the source image, in pixels.\n */\n xywhn(origShape: readonly [number, number]): readonly [number, number, number, number] {\n const [h, w] = origShape;\n if (w <= 0 || h <= 0) return [0, 0, 0, 0];\n const [cx, cy, bw, bh] = this.xywh;\n return [cx / w, cy / h, bw / w, bh / h];\n }\n\n /** Returns `[x1, y1, x2, y2]`. */\n asXyxy(): readonly [number, number, number, number] {\n return [this.x1, this.y1, this.x2, this.y2];\n }\n\n /**\n * Returns `[x, y, width, height]` with `(x, y)` at the **top-left**.\n *\n * Note: this is the top-left convention. Ultralytics' `xywh` getter uses\n * **center** coordinates — for that, read {@link xywh}.\n */\n asXywh(): readonly [number, number, number, number] {\n return [this.x1, this.y1, this.width, this.height];\n }\n\n /** Returns `[x1, y1, x2, y2]` truncated to integers, useful for slicing arrays. */\n asIntXyxy(): readonly [number, number, number, number] {\n return [Math.trunc(this.x1), Math.trunc(this.y1), Math.trunc(this.x2), Math.trunc(this.y2)];\n }\n}\n\n/**\n * Probability assigned to a single class for a classification prediction.\n *\n * `cls` / `name` / `conf` are Ultralytics-style aliases populated alongside\n * the verbose `classId` / `className` / `probability` fields.\n */\nexport interface ClassProbability {\n readonly classId: number;\n readonly className: string;\n readonly probability: number;\n /** Alias for `classId` (Ultralytics-style). */\n readonly cls: number;\n /** Alias for `className`. */\n readonly name: string;\n /** Alias for `probability` (Ultralytics-style). */\n readonly conf: number;\n}\n\n/**\n * Output of an image classification inference.\n */\nexport interface ClassificationResult {\n readonly classId: number;\n readonly className: string;\n readonly confidence: number;\n /** Alias for `classId` (Ultralytics-style). */\n readonly cls: number;\n /** Alias for `className`. */\n readonly name: string;\n /** Alias for `confidence` (Ultralytics-style). */\n readonly conf: number;\n /** The original input image as an HWC RGB uint8 array. */\n readonly image: RGBImage;\n /**\n * Probabilities per class, sorted in descending order. The first entry\n * mirrors `classId`, `className`, and `confidence`. When `topK` was passed\n * to `predict`, the array is truncated to that length.\n */\n readonly probabilities: readonly ClassProbability[];\n}\n\n/**\n * Single detected object produced by an object-detection model.\n */\nexport interface DetectionResult {\n readonly classId: number;\n readonly className: string;\n readonly confidence: number;\n readonly bbox: BoundingBox;\n /** Alias for `classId` (Ultralytics-style). */\n readonly cls: number;\n /** Alias for `className`. */\n readonly name: string;\n /** Alias for `confidence` (Ultralytics-style). */\n readonly conf: number;\n /** Alias for `bbox` (Ultralytics-style). */\n readonly box: BoundingBox;\n /**\n * The original image cropped to `bbox`, HWC RGB uint8. Empty boxes\n * (zero area) yield a zero-sized `RGBImage`.\n */\n readonly croppedImage: RGBImage;\n /**\n * What a second, classification stage predicted **for this crop** —\n * populated only by {@link DetectClassify}, and `null` for a plain detector.\n *\n * Kept as its own field rather than folded into `classId`/`className`\n * because the two answers are different questions: the detector says *what\n * kind of object this is*, the classifier says *which sub-category the object\n * belongs to*, and collapsing them would lose one of the two.\n */\n readonly classification?: ClassificationResult | null;\n /**\n * Binary foreground mask for this object, shaped to `bbox` in original-image\n * pixels — the same contract {@link SegmentationResult.mask} uses.\n *\n * Populated only by a `detect_segment_classify` pipeline, where a\n * segmentation stage ran inside the crop. `null` everywhere else.\n */\n readonly mask?: Mask | null;\n}\n\n/**\n * Single-channel binary or grayscale mask, laid out row-major.\n *\n * `data.length` must equal `width * height`. For binary masks, values are\n * `0` (background) or `255` (foreground); soft masks may use the full\n * `[0, 255]` range.\n */\nexport class Mask {\n constructor(\n public readonly data: Uint8Array,\n public readonly width: number,\n public readonly height: number,\n ) {\n if (data.length !== width * height) {\n throw new ImageLoadError(\n `Mask data length ${data.length} does not match width * height = ${\n width * height\n }.`,\n );\n }\n }\n}\n\n/**\n * Single segmented instance produced by an instance-segmentation model.\n *\n * Mirrors {@link DetectionResult} and adds the per-instance binary mask\n * plus a \"ready-to-display\" background-removed crop.\n */\nexport interface SegmentationResult {\n readonly classId: number;\n readonly className: string;\n readonly confidence: number;\n readonly bbox: BoundingBox;\n /** Alias for `classId` (Ultralytics-style). */\n readonly cls: number;\n /** Alias for `className`. */\n readonly name: string;\n /** Alias for `confidence` (Ultralytics-style). */\n readonly conf: number;\n /** Alias for `bbox` (Ultralytics-style). */\n readonly box: BoundingBox;\n /**\n * Binary mask cropped to `bbox`. Values are `0` (background) or `255`\n * (foreground). Empty boxes yield a zero-sized `Mask`.\n */\n readonly mask: Mask;\n /**\n * The original image cropped to `bbox` with background pixels (where\n * `mask.data[i] === 0`) zeroed out. Empty boxes yield a zero-sized\n * `RGBImage`.\n */\n readonly segmentedImage: RGBImage;\n}\n"],"mappings":";;AAyBA,IAAa,IAAb,MAAa,EAAS;CAME;CACA;CANpB;CACA,eAAkD;CAElD,YACI,GACA,GACA,GACF;EAEE,AAJgB,KAAA,QAAA,GACA,KAAA,SAAA,GAEhB,EAAS,OAAO,GAAM,GAAO,CAAM,GACnC,KAAK,QAAQ;CACjB;CAkBA,OAAO,SAAS,GAAe,GAAgB,GAAyC;EACpF,IAAM,IAAQ,OAAO,OAAO,EAAS,SAAS;EAE9C,OADA,OAAO,OAAO,GAAO;GAAE;GAAO;GAAQ,OAAO;GAAM,cAAc;EAAY,CAAC,GACvE;CACX;CAOA,IAAI,OAAmB;EACnB,IAAI,KAAK,UAAU,MAAM;GACrB,IAAM,IAAQ,KAAK,aAAkC;GAGrD,AAFA,EAAS,OAAO,GAAM,KAAK,OAAO,KAAK,MAAM,GAC7C,KAAK,QAAQ,GACb,KAAK,eAAe;EACxB;EACA,OAAO,KAAK;CAChB;CAUA,OAAe,OAAO,GAAkB,GAAe,GAAsB;EACzE,IAAI,EAAK,WAAW,IAAQ,IAAS,GACjC,MAAM,IAAI,EACN,wBAAwB,EAAK,OAAO,uCAChC,IAAQ,IAAS,EACpB,EACL;CAER;AACJ,GASa,IAAb,MAAyB;CAED;CACA;CACA;CACA;CAJpB,YACI,GACA,GACA,GACA,GACF;EADkB,AAHA,KAAA,KAAA,GACA,KAAA,KAAA,GACA,KAAA,KAAA,GACA,KAAA,KAAA;CACjB;CAGH,IAAI,QAAgB;EAChB,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,EAAE;CACxC;CAGA,IAAI,SAAiB;EACjB,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,EAAE;CACxC;CAGA,IAAI,OAAe;EACf,OAAO,KAAK,QAAQ,KAAK;CAC7B;CAGA,IAAI,OAAkD;EAClD,OAAO;GAAC,KAAK;GAAI,KAAK;GAAI,KAAK;GAAI,KAAK;EAAE;CAC9C;CAQA,IAAI,OAAkD;EAClD,OAAO;IAAE,KAAK,KAAK,KAAK,MAAM;IAAI,KAAK,KAAK,KAAK,MAAM;GAAG,KAAK;GAAO,KAAK;EAAM;CACrF;CAOA,MAAM,GAAiF;EACnF,IAAM,CAAC,GAAG,KAAK;EAEf,OADI,KAAK,KAAK,KAAK,IAAU;GAAC;GAAG;GAAG;GAAG;EAAC,IACjC;GAAC,KAAK,KAAK;GAAG,KAAK,KAAK;GAAG,KAAK,KAAK;GAAG,KAAK,KAAK;EAAC;CAC9D;CAOA,MAAM,GAAiF;EACnF,IAAM,CAAC,GAAG,KAAK;EACf,IAAI,KAAK,KAAK,KAAK,GAAG,OAAO;GAAC;GAAG;GAAG;GAAG;EAAC;EACxC,IAAM,CAAC,GAAI,GAAI,GAAI,KAAM,KAAK;EAC9B,OAAO;GAAC,IAAK;GAAG,IAAK;GAAG,IAAK;GAAG,IAAK;EAAC;CAC1C;CAGA,SAAoD;EAChD,OAAO;GAAC,KAAK;GAAI,KAAK;GAAI,KAAK;GAAI,KAAK;EAAE;CAC9C;CAQA,SAAoD;EAChD,OAAO;GAAC,KAAK;GAAI,KAAK;GAAI,KAAK;GAAO,KAAK;EAAM;CACrD;CAGA,YAAuD;EACnD,OAAO;GAAC,KAAK,MAAM,KAAK,EAAE;GAAG,KAAK,MAAM,KAAK,EAAE;GAAG,KAAK,MAAM,KAAK,EAAE;GAAG,KAAK,MAAM,KAAK,EAAE;EAAC;CAC9F;AACJ,GA2Fa,IAAb,MAAkB;CAEM;CACA;CACA;CAHpB,YACI,GACA,GACA,GACF;EACE,IAJgB,KAAA,OAAA,GACA,KAAA,QAAA,GACA,KAAA,SAAA,GAEZ,EAAK,WAAW,IAAQ,GACxB,MAAM,IAAI,EACN,oBAAoB,EAAK,OAAO,mCAC5B,IAAQ,EACX,EACL;CAER;AACJ"}
|
|
1
|
+
{"version":3,"file":"types.js","names":["RGBImage","width","height","data","image","materialize","ImageLoadError","BoundingBox","x1","y1","x2","y2","h","w","origShape","cx","cy","bw","bh","Mask"],"sources":["../../src/vision/types.ts"],"sourcesContent":["/** @generated Vendored from @mauriciobenjamin700/ort-vision-sdk-web. Do not hand-edit — regenerate with `npm run vendor:vision`. */\n/**\n * Public output types returned by the SDK's vision tasks.\n *\n * These types form the contract between the SDK and its callers. They mirror\n * the Python `ort-vision-sdk` output dataclasses 1-to-1.\n *\n * Naming is intentionally compatible with the Ultralytics / torchvision idiom\n * (`cls`, `conf`, `box`, `xyxy`, `xywh`, normalized variants) so code ported\n * from those projects keeps working with minimal edits. The original verbose\n * names (`classId`, `className`, `confidence`, `bbox`) are still populated for\n * backwards compatibility.\n */\n\nimport { ImageLoadError } from \"./core/exceptions\";\n\n/**\n * HWC RGB uint8 image — the canonical image format used across the SDK.\n *\n * `data.length` must equal `width * height * 3`. The buffer is laid out row\n * by row, top-to-bottom, with each pixel as `[R, G, B]`.\n *\n * The pixels can also be produced on first read — see {@link RGBImage.deferred}.\n * Reading `data` is the same either way.\n */\nexport class RGBImage {\n private _data: Uint8Array | null;\n private _materialize: (() => Uint8Array) | null = null;\n\n constructor(\n data: Uint8Array,\n public readonly width: number,\n public readonly height: number,\n ) {\n RGBImage._check(data, width, height);\n this._data = data;\n }\n\n /**\n * An image whose pixels are computed the first time `data` is read.\n *\n * Used by the decoder for frames it can hand to preprocessing without\n * reading back: a 1080p `getImageData` plus the RGBA→RGB copy is most of\n * the `load` stage (9.4 ms vs 1.9 ms for the GPU-side copy, measured in\n * Chromium), and a camera loop that only reads boxes never needs it.\n *\n * @param width Width in pixels.\n * @param height Height in pixels.\n * @param materialize Produces the `width * height * 3` buffer; called at most\n * once, and must keep returning the pixels of the moment the image was\n * made — snapshot whatever it reads from.\n * @returns The image. Built without the constructor, which would need the\n * very buffer this defers.\n */\n static deferred(width: number, height: number, materialize: () => Uint8Array): RGBImage {\n const image = Object.create(RGBImage.prototype) as RGBImage;\n Object.assign(image, { width, height, _data: null, _materialize: materialize });\n return image;\n }\n\n /**\n * The HWC RGB pixels, materialized on first read for a deferred image.\n *\n * @throws {@link ImageLoadError} if a deferred image's buffer has the wrong length.\n */\n get data(): Uint8Array {\n if (this._data === null) {\n const data = (this._materialize as () => Uint8Array)();\n RGBImage._check(data, this.width, this.height);\n this._data = data;\n this._materialize = null;\n }\n return this._data;\n }\n\n /**\n * Validate a buffer's length against the image size.\n *\n * @param data The pixels.\n * @param width Width in pixels.\n * @param height Height in pixels.\n * @throws {@link ImageLoadError} if `data.length !== width * height * 3`.\n */\n private static _check(data: Uint8Array, width: number, height: number): void {\n if (data.length !== width * height * 3) {\n throw new ImageLoadError(\n `RGBImage data length ${data.length} does not match width * height * 3 = ${\n width * height * 3\n }.`,\n );\n }\n }\n}\n\n/**\n * Axis-aligned bounding box in absolute pixel coordinates (xyxy format).\n *\n * Coordinates refer to the original input image (before any internal resize),\n * so callers can map detections back onto their source image without any\n * additional bookkeeping.\n */\nexport class BoundingBox {\n constructor(\n public readonly x1: number,\n public readonly y1: number,\n public readonly x2: number,\n public readonly y2: number,\n ) {}\n\n /** Box width in pixels (clamped to non-negative). */\n get width(): number {\n return Math.max(0, this.x2 - this.x1);\n }\n\n /** Box height in pixels (clamped to non-negative). */\n get height(): number {\n return Math.max(0, this.y2 - this.y1);\n }\n\n /** Box area in pixels squared. */\n get area(): number {\n return this.width * this.height;\n }\n\n /** The box as `[x1, y1, x2, y2]` in absolute pixels (Ultralytics-style). */\n get xyxy(): readonly [number, number, number, number] {\n return [this.x1, this.y1, this.x2, this.y2];\n }\n\n /**\n * The box as `[cx, cy, w, h]` with `(cx, cy)` at the center.\n *\n * Matches Ultralytics' `boxes.xywh` and YOLO's native head format. For the\n * top-left `[x, y, w, h]` convention, use {@link asXywh}.\n */\n get xywh(): readonly [number, number, number, number] {\n return [(this.x1 + this.x2) / 2, (this.y1 + this.y2) / 2, this.width, this.height];\n }\n\n /**\n * The box as `[x1, y1, x2, y2]` normalized to `[0, 1]`.\n *\n * @param origShape `[height, width]` of the source image, in pixels.\n */\n xyxyn(origShape: readonly [number, number]): readonly [number, number, number, number] {\n const [h, w] = origShape;\n if (w <= 0 || h <= 0) return [0, 0, 0, 0];\n return [this.x1 / w, this.y1 / h, this.x2 / w, this.y2 / h];\n }\n\n /**\n * The box as `[cx, cy, w, h]` normalized to `[0, 1]`.\n *\n * @param origShape `[height, width]` of the source image, in pixels.\n */\n xywhn(origShape: readonly [number, number]): readonly [number, number, number, number] {\n const [h, w] = origShape;\n if (w <= 0 || h <= 0) return [0, 0, 0, 0];\n const [cx, cy, bw, bh] = this.xywh;\n return [cx / w, cy / h, bw / w, bh / h];\n }\n\n /** Returns `[x1, y1, x2, y2]`. */\n asXyxy(): readonly [number, number, number, number] {\n return [this.x1, this.y1, this.x2, this.y2];\n }\n\n /**\n * Returns `[x, y, width, height]` with `(x, y)` at the **top-left**.\n *\n * Note: this is the top-left convention. Ultralytics' `xywh` getter uses\n * **center** coordinates — for that, read {@link xywh}.\n */\n asXywh(): readonly [number, number, number, number] {\n return [this.x1, this.y1, this.width, this.height];\n }\n\n /** Returns `[x1, y1, x2, y2]` truncated to integers, useful for slicing arrays. */\n asIntXyxy(): readonly [number, number, number, number] {\n return [Math.trunc(this.x1), Math.trunc(this.y1), Math.trunc(this.x2), Math.trunc(this.y2)];\n }\n}\n\n/**\n * Probability assigned to a single class for a classification prediction.\n *\n * `cls` / `name` / `conf` are Ultralytics-style aliases populated alongside\n * the verbose `classId` / `className` / `probability` fields.\n */\nexport interface ClassProbability {\n readonly classId: number;\n readonly className: string;\n readonly probability: number;\n /** Alias for `classId` (Ultralytics-style). */\n readonly cls: number;\n /** Alias for `className`. */\n readonly name: string;\n /** Alias for `probability` (Ultralytics-style). */\n readonly conf: number;\n}\n\n/**\n * Output of an image classification inference.\n */\nexport interface ClassificationResult {\n readonly classId: number;\n readonly className: string;\n readonly confidence: number;\n /** Alias for `classId` (Ultralytics-style). */\n readonly cls: number;\n /** Alias for `className`. */\n readonly name: string;\n /** Alias for `confidence` (Ultralytics-style). */\n readonly conf: number;\n /** The original input image as an HWC RGB uint8 array. */\n readonly image: RGBImage;\n /**\n * Probabilities per class, sorted in descending order. The first entry\n * mirrors `classId`, `className`, and `confidence`. When `topK` was passed\n * to `predict`, the array is truncated to that length.\n */\n readonly probabilities: readonly ClassProbability[];\n}\n\n/**\n * Single detected object produced by an object-detection model.\n */\nexport interface DetectionResult {\n readonly classId: number;\n readonly className: string;\n readonly confidence: number;\n readonly bbox: BoundingBox;\n /** Alias for `classId` (Ultralytics-style). */\n readonly cls: number;\n /** Alias for `className`. */\n readonly name: string;\n /** Alias for `confidence` (Ultralytics-style). */\n readonly conf: number;\n /** Alias for `bbox` (Ultralytics-style). */\n readonly box: BoundingBox;\n /**\n * The original image cropped to `bbox`, HWC RGB uint8. Empty boxes\n * (zero area) yield a zero-sized `RGBImage`.\n */\n readonly croppedImage: RGBImage;\n /**\n * What a second, classification stage predicted **for this crop** —\n * populated only by {@link DetectClassify}, and `null` for a plain detector.\n *\n * Kept as its own field rather than folded into `classId`/`className`\n * because the two answers are different questions: the detector says *what\n * kind of object this is*, the classifier says *which sub-category the object\n * belongs to*, and collapsing them would lose one of the two.\n */\n readonly classification?: ClassificationResult | null;\n /**\n * Binary foreground mask for this object, shaped to `bbox` in original-image\n * pixels — the same contract {@link SegmentationResult.mask} uses.\n *\n * Populated only by a `detect_segment_classify` pipeline, where a\n * segmentation stage ran inside the crop. `null` everywhere else.\n */\n readonly mask?: Mask | null;\n}\n\n/**\n * Single-channel binary or grayscale mask, laid out row-major.\n *\n * `data.length` must equal `width * height`. For binary masks, values are\n * `0` (background) or `255` (foreground); soft masks may use the full\n * `[0, 255]` range.\n */\nexport class Mask {\n constructor(\n public readonly data: Uint8Array,\n public readonly width: number,\n public readonly height: number,\n ) {\n if (data.length !== width * height) {\n throw new ImageLoadError(\n `Mask data length ${data.length} does not match width * height = ${\n width * height\n }.`,\n );\n }\n }\n}\n\n/**\n * Single segmented instance produced by an instance-segmentation model.\n *\n * Mirrors {@link DetectionResult} and adds the per-instance binary mask\n * plus a \"ready-to-display\" background-removed crop.\n */\nexport interface SegmentationResult {\n readonly classId: number;\n readonly className: string;\n readonly confidence: number;\n readonly bbox: BoundingBox;\n /** Alias for `classId` (Ultralytics-style). */\n readonly cls: number;\n /** Alias for `className`. */\n readonly name: string;\n /** Alias for `confidence` (Ultralytics-style). */\n readonly conf: number;\n /** Alias for `bbox` (Ultralytics-style). */\n readonly box: BoundingBox;\n /**\n * Binary mask cropped to `bbox`. Values are `0` (background) or `255`\n * (foreground). Empty boxes yield a zero-sized `Mask`.\n */\n readonly mask: Mask;\n /**\n * The original image cropped to `bbox` with background pixels (where\n * `mask.data[i] === 0`) zeroed out. Empty boxes yield a zero-sized\n * `RGBImage`.\n */\n readonly segmentedImage: RGBImage;\n}\n"],"mappings":";;AAyBA,IAAaA,IAAb,MAAaA,EAAS;CAME;CACA;CANpB;CACA,eAAkD;CAElD,YACI,GACA,GACA,GACF;EAEE,AAJgB,KAAA,QAAAC,GACA,KAAA,SAAAC,GAEhBF,EAAS,OAAOG,GAAMF,GAAOC,CAAM,GACnC,KAAK,QAAQC;CACjB;CAkBA,OAAO,SAAS,GAAe,GAAgB,GAAyC;EACpF,IAAMC,IAAQ,OAAO,OAAOJ,EAAS,SAAS;EAE9C,OADA,OAAO,OAAOI,GAAO;GAAE;GAAO;GAAQ,OAAO;GAAM,cAAcC;EAAY,CAAC,GACvED;CACX;CAOA,IAAI,OAAmB;EACnB,IAAI,KAAK,UAAU,MAAM;GACrB,IAAMD,IAAQ,KAAK,aAAkC;GAGrD,AAFAH,EAAS,OAAOG,GAAM,KAAK,OAAO,KAAK,MAAM,GAC7C,KAAK,QAAQA,GACb,KAAK,eAAe;EACxB;EACA,OAAO,KAAK;CAChB;CAUA,OAAe,OAAO,GAAkB,GAAe,GAAsB;EACzE,IAAIA,EAAK,WAAWF,IAAQC,IAAS,GACjC,MAAM,IAAII,EACN,wBAAwBH,EAAK,OAAO,uCAChCF,IAAQC,IAAS,EACpB,EACL;CAER;AACJ,GASaK,IAAb,MAAyB;CAED;CACA;CACA;CACA;CAJpB,YACI,GACA,GACA,GACA,GACF;EADkB,AAHA,KAAA,KAAAC,GACA,KAAA,KAAAC,GACA,KAAA,KAAAC,GACA,KAAA,KAAAC;CACjB;CAGH,IAAI,QAAgB;EAChB,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,EAAE;CACxC;CAGA,IAAI,SAAiB;EACjB,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,KAAK,EAAE;CACxC;CAGA,IAAI,OAAe;EACf,OAAO,KAAK,QAAQ,KAAK;CAC7B;CAGA,IAAI,OAAkD;EAClD,OAAO;GAAC,KAAK;GAAI,KAAK;GAAI,KAAK;GAAI,KAAK;EAAE;CAC9C;CAQA,IAAI,OAAkD;EAClD,OAAO;IAAE,KAAK,KAAK,KAAK,MAAM;IAAI,KAAK,KAAK,KAAK,MAAM;GAAG,KAAK;GAAO,KAAK;EAAM;CACrF;CAOA,MAAM,GAAiF;EACnF,IAAM,CAACC,GAAGC,KAAKC;EAEf,OADID,KAAK,KAAKD,KAAK,IAAU;GAAC;GAAG;GAAG;GAAG;EAAC,IACjC;GAAC,KAAK,KAAKC;GAAG,KAAK,KAAKD;GAAG,KAAK,KAAKC;GAAG,KAAK,KAAKD;EAAC;CAC9D;CAOA,MAAM,GAAiF;EACnF,IAAM,CAACA,GAAGC,KAAKC;EACf,IAAID,KAAK,KAAKD,KAAK,GAAG,OAAO;GAAC;GAAG;GAAG;GAAG;EAAC;EACxC,IAAM,CAACG,GAAIC,GAAIC,GAAIC,KAAM,KAAK;EAC9B,OAAO;GAACH,IAAKF;GAAGG,IAAKJ;GAAGK,IAAKJ;GAAGK,IAAKN;EAAC;CAC1C;CAGA,SAAoD;EAChD,OAAO;GAAC,KAAK;GAAI,KAAK;GAAI,KAAK;GAAI,KAAK;EAAE;CAC9C;CAQA,SAAoD;EAChD,OAAO;GAAC,KAAK;GAAI,KAAK;GAAI,KAAK;GAAO,KAAK;EAAM;CACrD;CAGA,YAAuD;EACnD,OAAO;GAAC,KAAK,MAAM,KAAK,EAAE;GAAG,KAAK,MAAM,KAAK,EAAE;GAAG,KAAK,MAAM,KAAK,EAAE;GAAG,KAAK,MAAM,KAAK,EAAE;EAAC;CAC9F;AACJ,GA2FaO,IAAb,MAAkB;CAEM;CACA;CACA;CAHpB,YACI,GACA,GACA,GACF;EACE,IAJgB,KAAA,OAAAhB,GACA,KAAA,QAAAF,GACA,KAAA,SAAAC,GAEZC,EAAK,WAAWF,IAAQC,GACxB,MAAM,IAAII,EACN,oBAAoBH,EAAK,OAAO,mCAC5BF,IAAQC,EACX,EACL;CAER;AACJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../hooks/use-latest-ref.cjs"),t=require("../audio/media-access.cjs");let n=require("react");var r={video:{facingMode:{ideal:`environment`},width:{ideal:1920},height:{ideal:1080}},audio:!1};function i({kind:e,message:t}){return{kind:e===`not-found`?`no-camera`:e,message:t}}function a(e){return i(t.classifyMediaError(e,`camera`))}function o(o={}){let[s,c]=(0,n.useState)(`loading`),[l,u]=(0,n.useState)(null),[d,f]=(0,n.useState)(null),[p,m]=(0,n.useState)(0),h=(0,n.useRef)(null),g=e.useLatestRef(o.constraints??r),_=o.enabled??!0;return(0,n.useEffect)(()=>{let e=!1,n=null,r=null;async function o(){if(!_)
|
|
1
|
+
const e=require("../hooks/use-latest-ref.cjs"),t=require("../audio/media-access.cjs");let n=require("react");var r={video:{facingMode:{ideal:`environment`},width:{ideal:1920},height:{ideal:1080}},audio:!1};function i({kind:e,message:t}){return{kind:e===`not-found`?`no-camera`:e,message:t}}function a(e){return i(t.classifyMediaError(e,`camera`))}function o(o={}){let[s,c]=(0,n.useState)(`loading`),[l,u]=(0,n.useState)(null),[d,f]=(0,n.useState)(null),[p,m]=(0,n.useState)(0),h=(0,n.useRef)(null),g=e.useLatestRef(o.constraints??r),_=o.enabled??!0;return(0,n.useEffect)(()=>{let e=!1,n=null,r=null;async function o(){if(!_)c(`idle`),u(null);else if(c(`loading`),u(null),typeof navigator>`u`||!navigator.mediaDevices||typeof navigator.mediaDevices.getUserMedia!=`function`)e||(u(i(t.missingCaptureApiError(`camera`))),c(`error`));else try{if(n=await navigator.mediaDevices.getUserMedia(g.current),e){n.getTracks().forEach(e=>e.stop());return}let t=h.current;if(!t){n.getTracks().forEach(e=>e.stop());return}r=t,t.srcObject=n,f(n),await t.play().catch(()=>void 0),e||c(`ready`)}catch(t){e||(u(a(t)),c(`error`))}}return o(),()=>{e=!0,n&&n.getTracks().forEach(e=>e.stop()),r&&(r.srcObject=null),f(null)}},[p,_,g]),{status:s,error:l,videoRef:h,stream:d,retry:()=>m(e=>e+1)}}exports.useCameraStream=o;
|
|
2
2
|
//# sourceMappingURL=use-camera-stream.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-camera-stream.cjs","names":[],"sources":["../../src/vision/use-camera-stream.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\n\nimport {\n classifyMediaError,\n missingCaptureApiError,\n type MediaAccessError,\n} from \"@/audio/media-access\";\n\n/** Lifecycle status of the camera stream. */\nexport type CameraStreamStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\n/** Classified reason a camera stream could not be acquired. */\nexport type CameraStreamErrorKind =\n \"unsupported\" | \"permission-denied\" | \"no-camera\" | \"in-use\" | \"insecure\" | \"unknown\";\n\n/** A classified camera error with a human-readable, English message. */\nexport interface CameraStreamError {\n kind: CameraStreamErrorKind;\n message: string;\n}\n\n/** Options for {@link useCameraStream}. */\nexport interface UseCameraStreamOptions {\n /**\n * Constraints passed to `getUserMedia`. Defaults to the rear\n * (\"environment\") camera at Full-HD ideal resolution with audio off.\n * Read when the stream (re)starts — change it and call `retry()` to apply.\n */\n constraints?: MediaStreamConstraints;\n /**\n * Hold off acquiring the camera until this is `true`. Default `true`.\n *\n * The point is to be able to *not* prompt. A permission prompt costs the user a\n * decision and, if they refuse, costs the app the feature permanently — so a\n * surface that already knows it cannot do its job (a barcode scanner in a browser\n * with no decoder) must not open the camera to then say so. Flipping this to `false`\n * also releases a stream that is already live.\n */\n enabled?: boolean;\n}\n\n/** Value returned by {@link useCameraStream}. */\nexport interface UseCameraStreamApi {\n /** Current lifecycle status. */\n status: CameraStreamStatus;\n /** The classified error, or `null` while not in the `error` status. */\n error: CameraStreamError | null;\n /** Attach to a `<video ref={…} />`. The stream is wired to it once ready. */\n videoRef: RefObject<HTMLVideoElement | null>;\n /**\n * The live stream, or `null`.\n *\n * Exposed for the things that need the **track** rather than the picture — the LED\n * torch (`useTorch`), the real frame size from `getSettings()`, recording it with\n * `useVideoRecorder`. Do not stop it yourself: the hook owns its lifetime and\n * releases it on unmount and on `retry()`.\n */\n stream: MediaStream | null;\n /** Manually re-attempt after an error (e.g. the user changed permissions). */\n retry: () => void;\n}\n\n/** Rear-camera Full-HD defaults used when no `constraints` are supplied. */\nconst DEFAULT_CONSTRAINTS: MediaStreamConstraints = {\n video: {\n facingMode: { ideal: \"environment\" },\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n },\n audio: false,\n};\n\n/**\n * Re-label a {@link MediaAccessError} as a {@link CameraStreamError}.\n *\n * The classification itself lives in one place for the whole SDK\n * (`classifyMediaError`), so a microphone and a camera failure are never explained\n * two different ways. Only the name of one kind differs: this surface shipped\n * `\"no-camera\"` where the shared taxonomy says `\"not-found\"`, and renaming a\n * published union member would break every consumer switching on it.\n *\n * @param error - The shared classification.\n * @returns The same error under this module's kind names.\n */\nfunction toCameraError({ kind, message }: MediaAccessError): CameraStreamError {\n return { kind: kind === \"not-found\" ? \"no-camera\" : kind, message };\n}\n\n/**\n * Map an unknown `getUserMedia` failure into a {@link CameraStreamError}. Secure-context\n * and environment checks run first (they are the reason `getUserMedia` is missing or\n * rejects), then the `DOMException.name` is mapped to a stable `kind`.\n */\nfunction classifyError(err: unknown): CameraStreamError {\n return toCameraError(classifyMediaError(err, \"camera\"));\n}\n\n/**\n * Acquire a `MediaStream` via `getUserMedia`, attach it to a `<video>` element,\n * and expose status/error so the page can render permission and error states.\n * The stream is automatically released on unmount or retry.\n *\n * Defaults to the rear (\"environment\") camera; desktops fall back to whatever\n * single camera they expose. Pass `options.constraints` to override, or\n * `options.enabled: false` to render the surface without prompting for the camera\n * at all.\n *\n * Implementation notes:\n * - Cleanup detaches the stream from a *snapshotted* video node, so it releases\n * the same element it attached to even if the page remounts the `<video>`.\n * - When `getUserMedia` is missing, an insecure context is the usual cause, so\n * the hook prefers that (actionable) error; otherwise it reports `unsupported`.\n * - `video.play()` rejections are swallowed: autoplay may be blocked, but the\n * user gesture that opened the camera usually counts and playback resumes on\n * the next interaction.\n *\n * @param options - optional configuration (see {@link UseCameraStreamOptions}).\n * @returns The stream status, classified error, a `videoRef` to attach, the live\n * `stream` for whatever needs the track itself, and a `retry()` to re-attempt\n * acquisition.\n */\nexport function useCameraStream(options: UseCameraStreamOptions = {}): UseCameraStreamApi {\n const [status, setStatus] = useState<CameraStreamStatus>(\"loading\");\n const [error, setError] = useState<CameraStreamError | null>(null);\n const [live, setLive] = useState<MediaStream | null>(null);\n const [retryToken, setRetryToken] = useState(0);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const constraintsRef = useLatestRef(options.constraints ?? DEFAULT_CONSTRAINTS);\n\n const enabled = options.enabled ?? true;\n\n useEffect(() => {\n let cancelled = false;\n let stream: MediaStream | null = null;\n let attachedVideo: HTMLVideoElement | null = null;\n\n async function start(): Promise<void> {\n if (!enabled) {\n setStatus(\"idle\");\n setError(null);\n return;\n }\n setStatus(\"loading\");\n setError(null);\n\n if (\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices ||\n typeof navigator.mediaDevices.getUserMedia !== \"function\"\n ) {\n if (!cancelled) {\n setError(toCameraError(missingCaptureApiError(\"camera\")));\n setStatus(\"error\");\n }\n return;\n }\n\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraintsRef.current);\n if (cancelled) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n const video = videoRef.current;\n if (!video) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n attachedVideo = video;\n video.srcObject = stream;\n setLive(stream);\n await video.play().catch(() => undefined);\n if (!cancelled) setStatus(\"ready\");\n } catch (err) {\n if (!cancelled) {\n setError(classifyError(err));\n setStatus(\"error\");\n }\n }\n }\n\n void start();\n\n return () => {\n cancelled = true;\n if (stream) {\n stream.getTracks().forEach((track) => track.stop());\n }\n if (attachedVideo) {\n attachedVideo.srcObject = null;\n }\n setLive(null);\n };\n }, [retryToken, enabled, constraintsRef]);\n\n return {\n status,\n error,\n videoRef,\n stream: live,\n retry: () => setRetryToken((n) => n + 1),\n };\n}\n"],"mappings":"6GAgEA,IAAM,EAA8C,CAChD,MAAO,CACH,WAAY,CAAE,MAAO,aAAc,EACnC,MAAO,CAAE,MAAO,IAAK,EACrB,OAAQ,CAAE,MAAO,IAAK,CAC1B,EACA,MAAO,EACX,EAcA,SAAS,EAAc,CAAE,OAAM,WAAgD,CAC3E,MAAO,CAAE,KAAM,IAAS,YAAc,YAAc,EAAM,SAAQ,CACtE,CAOA,SAAS,EAAc,EAAiC,CACpD,OAAO,EAAc,EAAA,mBAAmB,EAAK,QAAQ,CAAC,CAC1D,CA0BA,SAAgB,EAAgB,EAAkC,CAAC,EAAuB,CACtF,GAAM,CAAC,EAAQ,IAAA,EAAa,EAAA,SAAA,CAA6B,SAAS,EAC5D,CAAC,EAAO,IAAA,EAAY,EAAA,SAAA,CAAmC,IAAI,EAC3D,CAAC,EAAM,IAAA,EAAW,EAAA,SAAA,CAA6B,IAAI,EACnD,CAAC,EAAY,IAAA,EAAiB,EAAA,SAAA,CAAS,CAAC,EACxC,GAAA,EAAW,EAAA,OAAA,CAAgC,IAAI,EAC/C,EAAiB,EAAA,aAAa,EAAQ,aAAe,CAAmB,EAExE,EAAU,EAAQ,SAAW,GAkEnC,OAhEA,EAAA,EAAA,UAAA,KAAgB,CACZ,IAAI,EAAY,GACZ,EAA6B,KAC7B,EAAyC,KAE7C,eAAe,GAAuB,CAClC,GAAI,CAAC,EAAS,CACV,EAAU,MAAM,EAChB,EAAS,IAAI,EACb,MACJ,CAIA,GAHA,EAAU,SAAS,EACnB,EAAS,IAAI,EAGT,OAAO,UAAc,KACrB,CAAC,UAAU,cACX,OAAO,UAAU,aAAa,cAAiB,WACjD,CACO,IACD,EAAS,EAAc,EAAA,uBAAuB,QAAQ,CAAC,CAAC,EACxD,EAAU,OAAO,GAErB,MACJ,CAEA,GAAI,CAEA,GADA,EAAS,MAAM,UAAU,aAAa,aAAa,EAAe,OAAO,EACrE,EAAW,CACX,EAAO,UAAU,CAAC,CAAC,QAAS,GAAU,EAAM,KAAK,CAAC,EAClD,MACJ,CACA,IAAM,EAAQ,EAAS,QACvB,GAAI,CAAC,EAAO,CACR,EAAO,UAAU,CAAC,CAAC,QAAS,GAAU,EAAM,KAAK,CAAC,EAClD,MACJ,CACA,EAAgB,EAChB,EAAM,UAAY,EAClB,EAAQ,CAAM,EACd,MAAM,EAAM,KAAK,CAAC,CAAC,UAAY,IAAA,EAAS,EACnC,GAAW,EAAU,OAAO,CACrC,OAAS,EAAK,CACL,IACD,EAAS,EAAc,CAAG,CAAC,EAC3B,EAAU,OAAO,EAEzB,CACJ,CAIA,OAFA,EAAW,MAEE,CACT,EAAY,GACR,GACA,EAAO,UAAU,CAAC,CAAC,QAAS,GAAU,EAAM,KAAK,CAAC,EAElD,IACA,EAAc,UAAY,MAE9B,EAAQ,IAAI,CAChB,CACJ,EAAG,CAAC,EAAY,EAAS,CAAc,CAAC,EAEjC,CACH,SACA,QACA,WACA,OAAQ,EACR,UAAa,EAAe,GAAM,EAAI,CAAC,CAC3C,CACJ"}
|
|
1
|
+
{"version":3,"file":"use-camera-stream.cjs","names":["classifyMediaError","useState","useRef","useLatestRef","missingCaptureApiError","require_use_latest_ref","require_media_access","react","DEFAULT_CONSTRAINTS","toCameraError","kind","classifyError","err","useCameraStream","status","setStatus","error","setError","live","setLive","retryToken","setRetryToken","videoRef","constraintsRef","options","enabled","cancelled","stream","attachedVideo","start","track","video","n"],"sources":["../../src/vision/use-camera-stream.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\n\nimport {\n classifyMediaError,\n missingCaptureApiError,\n type MediaAccessError,\n} from \"@/audio/media-access\";\n\n/** Lifecycle status of the camera stream. */\nexport type CameraStreamStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\n/** Classified reason a camera stream could not be acquired. */\nexport type CameraStreamErrorKind =\n \"unsupported\" | \"permission-denied\" | \"no-camera\" | \"in-use\" | \"insecure\" | \"unknown\";\n\n/** A classified camera error with a human-readable, English message. */\nexport interface CameraStreamError {\n kind: CameraStreamErrorKind;\n message: string;\n}\n\n/** Options for {@link useCameraStream}. */\nexport interface UseCameraStreamOptions {\n /**\n * Constraints passed to `getUserMedia`. Defaults to the rear\n * (\"environment\") camera at Full-HD ideal resolution with audio off.\n * Read when the stream (re)starts — change it and call `retry()` to apply.\n */\n constraints?: MediaStreamConstraints;\n /**\n * Hold off acquiring the camera until this is `true`. Default `true`.\n *\n * The point is to be able to *not* prompt. A permission prompt costs the user a\n * decision and, if they refuse, costs the app the feature permanently — so a\n * surface that already knows it cannot do its job (a barcode scanner in a browser\n * with no decoder) must not open the camera to then say so. Flipping this to `false`\n * also releases a stream that is already live.\n */\n enabled?: boolean;\n}\n\n/** Value returned by {@link useCameraStream}. */\nexport interface UseCameraStreamApi {\n /** Current lifecycle status. */\n status: CameraStreamStatus;\n /** The classified error, or `null` while not in the `error` status. */\n error: CameraStreamError | null;\n /** Attach to a `<video ref={…} />`. The stream is wired to it once ready. */\n videoRef: RefObject<HTMLVideoElement | null>;\n /**\n * The live stream, or `null`.\n *\n * Exposed for the things that need the **track** rather than the picture — the LED\n * torch (`useTorch`), the real frame size from `getSettings()`, recording it with\n * `useVideoRecorder`. Do not stop it yourself: the hook owns its lifetime and\n * releases it on unmount and on `retry()`.\n */\n stream: MediaStream | null;\n /** Manually re-attempt after an error (e.g. the user changed permissions). */\n retry: () => void;\n}\n\n/** Rear-camera Full-HD defaults used when no `constraints` are supplied. */\nconst DEFAULT_CONSTRAINTS: MediaStreamConstraints = {\n video: {\n facingMode: { ideal: \"environment\" },\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n },\n audio: false,\n};\n\n/**\n * Re-label a {@link MediaAccessError} as a {@link CameraStreamError}.\n *\n * The classification itself lives in one place for the whole SDK\n * (`classifyMediaError`), so a microphone and a camera failure are never explained\n * two different ways. Only the name of one kind differs: this surface shipped\n * `\"no-camera\"` where the shared taxonomy says `\"not-found\"`, and renaming a\n * published union member would break every consumer switching on it.\n *\n * @param error - The shared classification.\n * @returns The same error under this module's kind names.\n */\nfunction toCameraError({ kind, message }: MediaAccessError): CameraStreamError {\n return { kind: kind === \"not-found\" ? \"no-camera\" : kind, message };\n}\n\n/**\n * Map an unknown `getUserMedia` failure into a {@link CameraStreamError}. Secure-context\n * and environment checks run first (they are the reason `getUserMedia` is missing or\n * rejects), then the `DOMException.name` is mapped to a stable `kind`.\n */\nfunction classifyError(err: unknown): CameraStreamError {\n return toCameraError(classifyMediaError(err, \"camera\"));\n}\n\n/**\n * Acquire a `MediaStream` via `getUserMedia`, attach it to a `<video>` element,\n * and expose status/error so the page can render permission and error states.\n * The stream is automatically released on unmount or retry.\n *\n * Defaults to the rear (\"environment\") camera; desktops fall back to whatever\n * single camera they expose. Pass `options.constraints` to override, or\n * `options.enabled: false` to render the surface without prompting for the camera\n * at all.\n *\n * Implementation notes:\n * - Cleanup detaches the stream from a *snapshotted* video node, so it releases\n * the same element it attached to even if the page remounts the `<video>`.\n * - When `getUserMedia` is missing, an insecure context is the usual cause, so\n * the hook prefers that (actionable) error; otherwise it reports `unsupported`.\n * - `video.play()` rejections are swallowed: autoplay may be blocked, but the\n * user gesture that opened the camera usually counts and playback resumes on\n * the next interaction.\n *\n * @param options - optional configuration (see {@link UseCameraStreamOptions}).\n * @returns The stream status, classified error, a `videoRef` to attach, the live\n * `stream` for whatever needs the track itself, and a `retry()` to re-attempt\n * acquisition.\n */\nexport function useCameraStream(options: UseCameraStreamOptions = {}): UseCameraStreamApi {\n const [status, setStatus] = useState<CameraStreamStatus>(\"loading\");\n const [error, setError] = useState<CameraStreamError | null>(null);\n const [live, setLive] = useState<MediaStream | null>(null);\n const [retryToken, setRetryToken] = useState(0);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const constraintsRef = useLatestRef(options.constraints ?? DEFAULT_CONSTRAINTS);\n\n const enabled = options.enabled ?? true;\n\n useEffect(() => {\n let cancelled = false;\n let stream: MediaStream | null = null;\n let attachedVideo: HTMLVideoElement | null = null;\n\n async function start(): Promise<void> {\n if (!enabled) {\n setStatus(\"idle\");\n setError(null);\n return;\n }\n setStatus(\"loading\");\n setError(null);\n\n if (\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices ||\n typeof navigator.mediaDevices.getUserMedia !== \"function\"\n ) {\n if (!cancelled) {\n setError(toCameraError(missingCaptureApiError(\"camera\")));\n setStatus(\"error\");\n }\n return;\n }\n\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraintsRef.current);\n if (cancelled) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n const video = videoRef.current;\n if (!video) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n attachedVideo = video;\n video.srcObject = stream;\n setLive(stream);\n await video.play().catch(() => undefined);\n if (!cancelled) setStatus(\"ready\");\n } catch (err) {\n if (!cancelled) {\n setError(classifyError(err));\n setStatus(\"error\");\n }\n }\n }\n\n void start();\n\n return () => {\n cancelled = true;\n if (stream) {\n stream.getTracks().forEach((track) => track.stop());\n }\n if (attachedVideo) {\n attachedVideo.srcObject = null;\n }\n setLive(null);\n };\n }, [retryToken, enabled, constraintsRef]);\n\n return {\n status,\n error,\n videoRef,\n stream: live,\n retry: () => setRetryToken((n) => n + 1),\n };\n}\n"],"mappings":"A,6GAgEA,IAAMQ,EAA8C,CAChD,MAAO,CACH,WAAY,CAAE,MAAO,aAAc,EACnC,MAAO,CAAE,MAAO,IAAK,EACrB,OAAQ,CAAE,MAAO,IAAK,CAC1B,EACA,MAAO,EACX,EAcA,SAASC,EAAc,CAAE,OAAM,WAAgD,CAC3E,MAAO,CAAE,KAAMC,IAAS,YAAc,YAAcA,EAAM,SAAQ,CACtE,CAOA,SAASC,EAAc,EAAiC,CACpD,OAAOF,EAAcT,EAAAA,mBAAmBY,EAAK,QAAQ,CAAC,CAC1D,CA0BA,SAAgBC,EAAgB,EAAkC,CAAC,EAAuB,CACtF,GAAM,CAACC,EAAQC,IAAA,EAAad,EAAAA,SAAAA,CAA6B,SAAS,EAC5D,CAACe,EAAOC,IAAA,EAAYhB,EAAAA,SAAAA,CAAmC,IAAI,EAC3D,CAACiB,EAAMC,IAAA,EAAWlB,EAAAA,SAAAA,CAA6B,IAAI,EACnD,CAACmB,EAAYC,IAAA,EAAiBpB,EAAAA,SAAAA,CAAS,CAAC,EACxCqB,GAAA,EAAWpB,EAAAA,OAAAA,CAAgC,IAAI,EAC/CqB,EAAiBpB,EAAAA,aAAaqB,EAAQ,aAAehB,CAAmB,EAExEiB,EAAUD,EAAQ,SAAW,GAkEnC,OAhEA,EAAAjB,EAAA,UAAA,KAAgB,CACZ,IAAImB,EAAY,GACZC,EAA6B,KAC7BC,EAAyC,KAE7C,eAAeC,GAAuB,CAClC,GAAI,CAACJ,EACDV,EAAU,MAAM,EAChBE,EAAS,IAAI,OAMjB,GAHAF,EAAU,SAAS,EACnBE,EAAS,IAAI,EAGT,OAAO,UAAc,KACrB,CAAC,UAAU,cACX,OAAO,UAAU,aAAa,cAAiB,WAE1CS,IACDT,EAASR,EAAcL,EAAAA,uBAAuB,QAAQ,CAAC,CAAC,EACxDW,EAAU,OAAO,QAKzB,GAAI,CAEA,GADA,EAAS,MAAM,UAAU,aAAa,aAAaQ,EAAe,OAAO,EACrEG,EAAW,CACXC,EAAO,UAAU,CAAC,CAAC,QAAS,GAAUG,EAAM,KAAK,CAAC,EAClD,MACJ,CACA,IAAMC,EAAQT,EAAS,QACvB,GAAI,CAACS,EAAO,CACRJ,EAAO,UAAU,CAAC,CAAC,QAAS,GAAUG,EAAM,KAAK,CAAC,EAClD,MACJ,CACA,EAAgBC,EAChB,EAAM,UAAYJ,EAClBR,EAAQQ,CAAM,EACd,MAAMI,EAAM,KAAK,CAAC,CAAC,UAAY,IAAA,EAAS,EACnCL,GAAWX,EAAU,OAAO,CACrC,OAASH,EAAK,CACLc,IACDT,EAASN,EAAcC,CAAG,CAAC,EAC3BG,EAAU,OAAO,EAEzB,CACJ,CAIA,OAFAc,EAAW,MAEE,CACT,EAAY,GACRF,GACAA,EAAO,UAAU,CAAC,CAAC,QAAS,GAAUG,EAAM,KAAK,CAAC,EAElDF,IACA,EAAc,UAAY,MAE9BT,EAAQ,IAAI,CAChB,CACJ,EAAG,CAACC,EAAYK,EAASF,CAAc,CAAC,EAEjC,CACH,SACA,QACA,WACA,OAAQL,EACR,UAAaG,EAAe,GAAMW,EAAI,CAAC,CAC3C,CACJ,C"}
|
|
@@ -24,15 +24,9 @@ function l(t = {}) {
|
|
|
24
24
|
return r(() => {
|
|
25
25
|
let e = !1, t = null, r = null;
|
|
26
26
|
async function i() {
|
|
27
|
-
if (!y)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
if (u("loading"), f(null), typeof navigator > "u" || !navigator.mediaDevices || typeof navigator.mediaDevices.getUserMedia != "function") {
|
|
32
|
-
e || (f(s(n("camera"))), u("error"));
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
try {
|
|
27
|
+
if (!y) u("idle"), f(null);
|
|
28
|
+
else if (u("loading"), f(null), typeof navigator > "u" || !navigator.mediaDevices || typeof navigator.mediaDevices.getUserMedia != "function") e || (f(s(n("camera"))), u("error"));
|
|
29
|
+
else try {
|
|
36
30
|
if (t = await navigator.mediaDevices.getUserMedia(v.current), e) {
|
|
37
31
|
t.getTracks().forEach((e) => e.stop());
|
|
38
32
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-camera-stream.js","names":[],"sources":["../../src/vision/use-camera-stream.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\n\nimport {\n classifyMediaError,\n missingCaptureApiError,\n type MediaAccessError,\n} from \"@/audio/media-access\";\n\n/** Lifecycle status of the camera stream. */\nexport type CameraStreamStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\n/** Classified reason a camera stream could not be acquired. */\nexport type CameraStreamErrorKind =\n \"unsupported\" | \"permission-denied\" | \"no-camera\" | \"in-use\" | \"insecure\" | \"unknown\";\n\n/** A classified camera error with a human-readable, English message. */\nexport interface CameraStreamError {\n kind: CameraStreamErrorKind;\n message: string;\n}\n\n/** Options for {@link useCameraStream}. */\nexport interface UseCameraStreamOptions {\n /**\n * Constraints passed to `getUserMedia`. Defaults to the rear\n * (\"environment\") camera at Full-HD ideal resolution with audio off.\n * Read when the stream (re)starts — change it and call `retry()` to apply.\n */\n constraints?: MediaStreamConstraints;\n /**\n * Hold off acquiring the camera until this is `true`. Default `true`.\n *\n * The point is to be able to *not* prompt. A permission prompt costs the user a\n * decision and, if they refuse, costs the app the feature permanently — so a\n * surface that already knows it cannot do its job (a barcode scanner in a browser\n * with no decoder) must not open the camera to then say so. Flipping this to `false`\n * also releases a stream that is already live.\n */\n enabled?: boolean;\n}\n\n/** Value returned by {@link useCameraStream}. */\nexport interface UseCameraStreamApi {\n /** Current lifecycle status. */\n status: CameraStreamStatus;\n /** The classified error, or `null` while not in the `error` status. */\n error: CameraStreamError | null;\n /** Attach to a `<video ref={…} />`. The stream is wired to it once ready. */\n videoRef: RefObject<HTMLVideoElement | null>;\n /**\n * The live stream, or `null`.\n *\n * Exposed for the things that need the **track** rather than the picture — the LED\n * torch (`useTorch`), the real frame size from `getSettings()`, recording it with\n * `useVideoRecorder`. Do not stop it yourself: the hook owns its lifetime and\n * releases it on unmount and on `retry()`.\n */\n stream: MediaStream | null;\n /** Manually re-attempt after an error (e.g. the user changed permissions). */\n retry: () => void;\n}\n\n/** Rear-camera Full-HD defaults used when no `constraints` are supplied. */\nconst DEFAULT_CONSTRAINTS: MediaStreamConstraints = {\n video: {\n facingMode: { ideal: \"environment\" },\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n },\n audio: false,\n};\n\n/**\n * Re-label a {@link MediaAccessError} as a {@link CameraStreamError}.\n *\n * The classification itself lives in one place for the whole SDK\n * (`classifyMediaError`), so a microphone and a camera failure are never explained\n * two different ways. Only the name of one kind differs: this surface shipped\n * `\"no-camera\"` where the shared taxonomy says `\"not-found\"`, and renaming a\n * published union member would break every consumer switching on it.\n *\n * @param error - The shared classification.\n * @returns The same error under this module's kind names.\n */\nfunction toCameraError({ kind, message }: MediaAccessError): CameraStreamError {\n return { kind: kind === \"not-found\" ? \"no-camera\" : kind, message };\n}\n\n/**\n * Map an unknown `getUserMedia` failure into a {@link CameraStreamError}. Secure-context\n * and environment checks run first (they are the reason `getUserMedia` is missing or\n * rejects), then the `DOMException.name` is mapped to a stable `kind`.\n */\nfunction classifyError(err: unknown): CameraStreamError {\n return toCameraError(classifyMediaError(err, \"camera\"));\n}\n\n/**\n * Acquire a `MediaStream` via `getUserMedia`, attach it to a `<video>` element,\n * and expose status/error so the page can render permission and error states.\n * The stream is automatically released on unmount or retry.\n *\n * Defaults to the rear (\"environment\") camera; desktops fall back to whatever\n * single camera they expose. Pass `options.constraints` to override, or\n * `options.enabled: false` to render the surface without prompting for the camera\n * at all.\n *\n * Implementation notes:\n * - Cleanup detaches the stream from a *snapshotted* video node, so it releases\n * the same element it attached to even if the page remounts the `<video>`.\n * - When `getUserMedia` is missing, an insecure context is the usual cause, so\n * the hook prefers that (actionable) error; otherwise it reports `unsupported`.\n * - `video.play()` rejections are swallowed: autoplay may be blocked, but the\n * user gesture that opened the camera usually counts and playback resumes on\n * the next interaction.\n *\n * @param options - optional configuration (see {@link UseCameraStreamOptions}).\n * @returns The stream status, classified error, a `videoRef` to attach, the live\n * `stream` for whatever needs the track itself, and a `retry()` to re-attempt\n * acquisition.\n */\nexport function useCameraStream(options: UseCameraStreamOptions = {}): UseCameraStreamApi {\n const [status, setStatus] = useState<CameraStreamStatus>(\"loading\");\n const [error, setError] = useState<CameraStreamError | null>(null);\n const [live, setLive] = useState<MediaStream | null>(null);\n const [retryToken, setRetryToken] = useState(0);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const constraintsRef = useLatestRef(options.constraints ?? DEFAULT_CONSTRAINTS);\n\n const enabled = options.enabled ?? true;\n\n useEffect(() => {\n let cancelled = false;\n let stream: MediaStream | null = null;\n let attachedVideo: HTMLVideoElement | null = null;\n\n async function start(): Promise<void> {\n if (!enabled) {\n setStatus(\"idle\");\n setError(null);\n return;\n }\n setStatus(\"loading\");\n setError(null);\n\n if (\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices ||\n typeof navigator.mediaDevices.getUserMedia !== \"function\"\n ) {\n if (!cancelled) {\n setError(toCameraError(missingCaptureApiError(\"camera\")));\n setStatus(\"error\");\n }\n return;\n }\n\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraintsRef.current);\n if (cancelled) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n const video = videoRef.current;\n if (!video) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n attachedVideo = video;\n video.srcObject = stream;\n setLive(stream);\n await video.play().catch(() => undefined);\n if (!cancelled) setStatus(\"ready\");\n } catch (err) {\n if (!cancelled) {\n setError(classifyError(err));\n setStatus(\"error\");\n }\n }\n }\n\n void start();\n\n return () => {\n cancelled = true;\n if (stream) {\n stream.getTracks().forEach((track) => track.stop());\n }\n if (attachedVideo) {\n attachedVideo.srcObject = null;\n }\n setLive(null);\n };\n }, [retryToken, enabled, constraintsRef]);\n\n return {\n status,\n error,\n videoRef,\n stream: live,\n retry: () => setRetryToken((n) => n + 1),\n };\n}\n"],"mappings":";;;;AAgEA,IAAM,IAA8C;CAChD,OAAO;EACH,YAAY,EAAE,OAAO,cAAc;EACnC,OAAO,EAAE,OAAO,KAAK;EACrB,QAAQ,EAAE,OAAO,KAAK;CAC1B;CACA,OAAO;AACX;AAcA,SAAS,EAAc,EAAE,SAAM,cAAgD;CAC3E,OAAO;EAAE,MAAM,MAAS,cAAc,cAAc;EAAM;CAAQ;AACtE;AAOA,SAAS,EAAc,GAAiC;CACpD,OAAO,EAAc,EAAmB,GAAK,QAAQ,CAAC;AAC1D;AA0BA,SAAgB,EAAgB,IAAkC,CAAC,GAAuB;CACtF,IAAM,CAAC,GAAQ,KAAa,EAA6B,SAAS,GAC5D,CAAC,GAAO,KAAY,EAAmC,IAAI,GAC3D,CAAC,GAAM,KAAW,EAA6B,IAAI,GACnD,CAAC,GAAY,KAAiB,EAAS,CAAC,GACxC,IAAW,EAAgC,IAAI,GAC/C,IAAiB,EAAa,EAAQ,eAAe,CAAmB,GAExE,IAAU,EAAQ,WAAW;CAkEnC,OAhEA,QAAgB;EACZ,IAAI,IAAY,IACZ,IAA6B,MAC7B,IAAyC;EAE7C,eAAe,IAAuB;GAClC,IAAI,CAAC,GAAS;IAEV,AADA,EAAU,MAAM,GAChB,EAAS,IAAI;IACb;GACJ;GAIA,IAHA,EAAU,SAAS,GACnB,EAAS,IAAI,GAGT,OAAO,YAAc,OACrB,CAAC,UAAU,gBACX,OAAO,UAAU,aAAa,gBAAiB,YACjD;IACE,AAAK,MACD,EAAS,EAAc,EAAuB,QAAQ,CAAC,CAAC,GACxD,EAAU,OAAO;IAErB;GACJ;GAEA,IAAI;IAEA,IADA,IAAS,MAAM,UAAU,aAAa,aAAa,EAAe,OAAO,GACrE,GAAW;KACX,EAAO,UAAU,CAAC,CAAC,SAAS,MAAU,EAAM,KAAK,CAAC;KAClD;IACJ;IACA,IAAM,IAAQ,EAAS;IACvB,IAAI,CAAC,GAAO;KACR,EAAO,UAAU,CAAC,CAAC,SAAS,MAAU,EAAM,KAAK,CAAC;KAClD;IACJ;IAKA,AAJA,IAAgB,GAChB,EAAM,YAAY,GAClB,EAAQ,CAAM,GACd,MAAM,EAAM,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS,GACnC,KAAW,EAAU,OAAO;GACrC,SAAS,GAAK;IACV,AAAK,MACD,EAAS,EAAc,CAAG,CAAC,GAC3B,EAAU,OAAO;GAEzB;EACJ;EAIA,OAFA,EAAW,SAEE;GAQT,AAPA,IAAY,IACR,KACA,EAAO,UAAU,CAAC,CAAC,SAAS,MAAU,EAAM,KAAK,CAAC,GAElD,MACA,EAAc,YAAY,OAE9B,EAAQ,IAAI;EAChB;CACJ,GAAG;EAAC;EAAY;EAAS;CAAc,CAAC,GAEjC;EACH;EACA;EACA;EACA,QAAQ;EACR,aAAa,GAAe,MAAM,IAAI,CAAC;CAC3C;AACJ"}
|
|
1
|
+
{"version":3,"file":"use-camera-stream.js","names":["DEFAULT_CONSTRAINTS","toCameraError","kind","classifyError","classifyMediaError","err","useCameraStream","status","setStatus","useState","error","setError","live","setLive","retryToken","setRetryToken","videoRef","useRef","constraintsRef","useLatestRef","options","enabled","useEffect","cancelled","stream","attachedVideo","start","missingCaptureApiError","track","video","n"],"sources":["../../src/vision/use-camera-stream.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { useLatestRef } from \"@/hooks/use-latest-ref\";\n\nimport {\n classifyMediaError,\n missingCaptureApiError,\n type MediaAccessError,\n} from \"@/audio/media-access\";\n\n/** Lifecycle status of the camera stream. */\nexport type CameraStreamStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\n/** Classified reason a camera stream could not be acquired. */\nexport type CameraStreamErrorKind =\n \"unsupported\" | \"permission-denied\" | \"no-camera\" | \"in-use\" | \"insecure\" | \"unknown\";\n\n/** A classified camera error with a human-readable, English message. */\nexport interface CameraStreamError {\n kind: CameraStreamErrorKind;\n message: string;\n}\n\n/** Options for {@link useCameraStream}. */\nexport interface UseCameraStreamOptions {\n /**\n * Constraints passed to `getUserMedia`. Defaults to the rear\n * (\"environment\") camera at Full-HD ideal resolution with audio off.\n * Read when the stream (re)starts — change it and call `retry()` to apply.\n */\n constraints?: MediaStreamConstraints;\n /**\n * Hold off acquiring the camera until this is `true`. Default `true`.\n *\n * The point is to be able to *not* prompt. A permission prompt costs the user a\n * decision and, if they refuse, costs the app the feature permanently — so a\n * surface that already knows it cannot do its job (a barcode scanner in a browser\n * with no decoder) must not open the camera to then say so. Flipping this to `false`\n * also releases a stream that is already live.\n */\n enabled?: boolean;\n}\n\n/** Value returned by {@link useCameraStream}. */\nexport interface UseCameraStreamApi {\n /** Current lifecycle status. */\n status: CameraStreamStatus;\n /** The classified error, or `null` while not in the `error` status. */\n error: CameraStreamError | null;\n /** Attach to a `<video ref={…} />`. The stream is wired to it once ready. */\n videoRef: RefObject<HTMLVideoElement | null>;\n /**\n * The live stream, or `null`.\n *\n * Exposed for the things that need the **track** rather than the picture — the LED\n * torch (`useTorch`), the real frame size from `getSettings()`, recording it with\n * `useVideoRecorder`. Do not stop it yourself: the hook owns its lifetime and\n * releases it on unmount and on `retry()`.\n */\n stream: MediaStream | null;\n /** Manually re-attempt after an error (e.g. the user changed permissions). */\n retry: () => void;\n}\n\n/** Rear-camera Full-HD defaults used when no `constraints` are supplied. */\nconst DEFAULT_CONSTRAINTS: MediaStreamConstraints = {\n video: {\n facingMode: { ideal: \"environment\" },\n width: { ideal: 1920 },\n height: { ideal: 1080 },\n },\n audio: false,\n};\n\n/**\n * Re-label a {@link MediaAccessError} as a {@link CameraStreamError}.\n *\n * The classification itself lives in one place for the whole SDK\n * (`classifyMediaError`), so a microphone and a camera failure are never explained\n * two different ways. Only the name of one kind differs: this surface shipped\n * `\"no-camera\"` where the shared taxonomy says `\"not-found\"`, and renaming a\n * published union member would break every consumer switching on it.\n *\n * @param error - The shared classification.\n * @returns The same error under this module's kind names.\n */\nfunction toCameraError({ kind, message }: MediaAccessError): CameraStreamError {\n return { kind: kind === \"not-found\" ? \"no-camera\" : kind, message };\n}\n\n/**\n * Map an unknown `getUserMedia` failure into a {@link CameraStreamError}. Secure-context\n * and environment checks run first (they are the reason `getUserMedia` is missing or\n * rejects), then the `DOMException.name` is mapped to a stable `kind`.\n */\nfunction classifyError(err: unknown): CameraStreamError {\n return toCameraError(classifyMediaError(err, \"camera\"));\n}\n\n/**\n * Acquire a `MediaStream` via `getUserMedia`, attach it to a `<video>` element,\n * and expose status/error so the page can render permission and error states.\n * The stream is automatically released on unmount or retry.\n *\n * Defaults to the rear (\"environment\") camera; desktops fall back to whatever\n * single camera they expose. Pass `options.constraints` to override, or\n * `options.enabled: false` to render the surface without prompting for the camera\n * at all.\n *\n * Implementation notes:\n * - Cleanup detaches the stream from a *snapshotted* video node, so it releases\n * the same element it attached to even if the page remounts the `<video>`.\n * - When `getUserMedia` is missing, an insecure context is the usual cause, so\n * the hook prefers that (actionable) error; otherwise it reports `unsupported`.\n * - `video.play()` rejections are swallowed: autoplay may be blocked, but the\n * user gesture that opened the camera usually counts and playback resumes on\n * the next interaction.\n *\n * @param options - optional configuration (see {@link UseCameraStreamOptions}).\n * @returns The stream status, classified error, a `videoRef` to attach, the live\n * `stream` for whatever needs the track itself, and a `retry()` to re-attempt\n * acquisition.\n */\nexport function useCameraStream(options: UseCameraStreamOptions = {}): UseCameraStreamApi {\n const [status, setStatus] = useState<CameraStreamStatus>(\"loading\");\n const [error, setError] = useState<CameraStreamError | null>(null);\n const [live, setLive] = useState<MediaStream | null>(null);\n const [retryToken, setRetryToken] = useState(0);\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const constraintsRef = useLatestRef(options.constraints ?? DEFAULT_CONSTRAINTS);\n\n const enabled = options.enabled ?? true;\n\n useEffect(() => {\n let cancelled = false;\n let stream: MediaStream | null = null;\n let attachedVideo: HTMLVideoElement | null = null;\n\n async function start(): Promise<void> {\n if (!enabled) {\n setStatus(\"idle\");\n setError(null);\n return;\n }\n setStatus(\"loading\");\n setError(null);\n\n if (\n typeof navigator === \"undefined\" ||\n !navigator.mediaDevices ||\n typeof navigator.mediaDevices.getUserMedia !== \"function\"\n ) {\n if (!cancelled) {\n setError(toCameraError(missingCaptureApiError(\"camera\")));\n setStatus(\"error\");\n }\n return;\n }\n\n try {\n stream = await navigator.mediaDevices.getUserMedia(constraintsRef.current);\n if (cancelled) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n const video = videoRef.current;\n if (!video) {\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n attachedVideo = video;\n video.srcObject = stream;\n setLive(stream);\n await video.play().catch(() => undefined);\n if (!cancelled) setStatus(\"ready\");\n } catch (err) {\n if (!cancelled) {\n setError(classifyError(err));\n setStatus(\"error\");\n }\n }\n }\n\n void start();\n\n return () => {\n cancelled = true;\n if (stream) {\n stream.getTracks().forEach((track) => track.stop());\n }\n if (attachedVideo) {\n attachedVideo.srcObject = null;\n }\n setLive(null);\n };\n }, [retryToken, enabled, constraintsRef]);\n\n return {\n status,\n error,\n videoRef,\n stream: live,\n retry: () => setRetryToken((n) => n + 1),\n };\n}\n"],"mappings":";;;;AAgEA,IAAMA,IAA8C;CAChD,OAAO;EACH,YAAY,EAAE,OAAO,cAAc;EACnC,OAAO,EAAE,OAAO,KAAK;EACrB,QAAQ,EAAE,OAAO,KAAK;CAC1B;CACA,OAAO;AACX;AAcA,SAASC,EAAc,EAAE,SAAM,cAAgD;CAC3E,OAAO;EAAE,MAAMC,MAAS,cAAc,cAAcA;EAAM;CAAQ;AACtE;AAOA,SAASC,EAAc,GAAiC;CACpD,OAAOF,EAAcG,EAAmBC,GAAK,QAAQ,CAAC;AAC1D;AA0BA,SAAgBC,EAAgB,IAAkC,CAAC,GAAuB;CACtF,IAAM,CAACC,GAAQC,KAAaC,EAA6B,SAAS,GAC5D,CAACC,GAAOC,KAAYF,EAAmC,IAAI,GAC3D,CAACG,GAAMC,KAAWJ,EAA6B,IAAI,GACnD,CAACK,GAAYC,KAAiBN,EAAS,CAAC,GACxCO,IAAWC,EAAgC,IAAI,GAC/CC,IAAiBC,EAAaC,EAAQ,eAAepB,CAAmB,GAExEqB,IAAUD,EAAQ,WAAW;CAkEnC,OAhEAE,QAAgB;EACZ,IAAIC,IAAY,IACZC,IAA6B,MAC7BC,IAAyC;EAE7C,eAAeC,IAAuB;GAClC,IAAI,CAACL,GAED,AADAb,EAAU,MAAM,GAChBG,EAAS,IAAI;QAMjB,IAHAH,EAAU,SAAS,GACnBG,EAAS,IAAI,GAGT,OAAO,YAAc,OACrB,CAAC,UAAU,gBACX,OAAO,UAAU,aAAa,gBAAiB,YAE/C,AAAKY,MACDZ,EAASV,EAAc0B,EAAuB,QAAQ,CAAC,CAAC,GACxDnB,EAAU,OAAO;QAKzB,IAAI;IAEA,IADA,IAAS,MAAM,UAAU,aAAa,aAAaU,EAAe,OAAO,GACrEK,GAAW;KACX,EAAO,UAAU,CAAC,CAAC,SAAS,MAAUK,EAAM,KAAK,CAAC;KAClD;IACJ;IACA,IAAMC,IAAQb,EAAS;IACvB,IAAI,CAACa,GAAO;KACR,EAAO,UAAU,CAAC,CAAC,SAAS,MAAUD,EAAM,KAAK,CAAC;KAClD;IACJ;IAKA,AAJA,IAAgBC,GAChB,EAAM,YAAYL,GAClBX,EAAQW,CAAM,GACd,MAAMK,EAAM,KAAK,CAAC,CAAC,YAAY,KAAA,CAAS,GACnCN,KAAWf,EAAU,OAAO;GACrC,SAASH,GAAK;IACV,AAAKkB,MACDZ,EAASR,EAAcE,CAAG,CAAC,GAC3BG,EAAU,OAAO;GAEzB;EACJ;EAIA,OAFAkB,EAAW,SAEE;GAQT,AAPA,IAAY,IACRF,KACAA,EAAO,UAAU,CAAC,CAAC,SAAS,MAAUI,EAAM,KAAK,CAAC,GAElDH,MACA,EAAc,YAAY,OAE9BZ,EAAQ,IAAI;EAChB;CACJ,GAAG;EAACC;EAAYO;EAASH;CAAc,CAAC,GAEjC;EACH;EACA;EACA;EACA,QAAQN;EACR,aAAaG,GAAe,MAAMe,IAAI,CAAC;CAC3C;AACJ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./luminance.cjs");let t=require("react");function n(n,{enabled:r=!0,intervalMs:i=160}={}){let[a,o]=(0,t.useState)(0),s=(0,t.useRef)(null);return(0,t.useEffect)(()=>{if(!r||typeof window>`u`)return;s.current||=document.createElement(`canvas`);let t=0,a=0,c=r=>{let l=n.current
|
|
1
|
+
const e=require("./luminance.cjs");let t=require("react");function n(n,{enabled:r=!0,intervalMs:i=160}={}){let[a,o]=(0,t.useState)(0),s=(0,t.useRef)(null);return(0,t.useEffect)(()=>{if(!r||typeof window>`u`)return;s.current||=document.createElement(`canvas`);let t=0,a=0,c=r=>{let l=n.current;!l||l.readyState<2||l.videoWidth===0||r-a>=i&&(a=r,o(e.computeImageLuminance(l,s.current??void 0))),t=window.requestAnimationFrame(c)};return t=window.requestAnimationFrame(c),()=>window.cancelAnimationFrame(t)},[n,r,i]),a}exports.useLiveLuminance=n;
|
|
2
2
|
//# sourceMappingURL=use-live-luminance.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-live-luminance.cjs","names":[],"sources":["../../src/vision/use-live-luminance.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { computeImageLuminance } from \"./luminance\";\n\n/** Options for {@link useLiveLuminance}. */\nexport interface UseLiveLuminanceOptions {\n /** When `false` the loop is paused (e.g. while a capture is in flight). Default: `true`. */\n enabled?: boolean;\n /** Throttle measurements in milliseconds. Default: `160` (~6 fps), plenty for UX. */\n intervalMs?: number;\n}\n\n/**\n * Sample mean luminance from a `<video>` source on a `requestAnimationFrame`\n * loop and expose the rolling value. Sampling is throttled by `intervalMs` and\n * paused whenever `enabled` is `false` or the video is not ready yet\n * (`readyState < 2` or `videoWidth === 0`).\n *\n * One offscreen canvas is reused across frames to avoid GC pressure. Designed\n * to feed a live brightness bar / border color on a camera page.\n *\n * @param videoRef - ref to the `<video>` element to sample.\n * @param options - optional configuration (see {@link UseLiveLuminanceOptions}).\n * @returns The rolling mean luminance in `0..255` (`0` until the first sample).\n */\nexport function useLiveLuminance(\n videoRef: RefObject<HTMLVideoElement | null>,\n { enabled = true, intervalMs = 160 }: UseLiveLuminanceOptions = {},\n): number {\n const [luminance, setLuminance] = useState(0);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n if (!enabled) return;\n if (typeof window === \"undefined\") return;\n if (!canvasRef.current) canvasRef.current = document.createElement(\"canvas\");\n\n let rafId = 0;\n let lastSampledAt = 0;\n\n const tick = (timestamp: number): void => {\n const video = videoRef.current;\n if (!video || video.readyState < 2 || video.videoWidth === 0) {\n rafId = window.requestAnimationFrame(tick);\n return;\n }\n if (timestamp - lastSampledAt >= intervalMs) {\n lastSampledAt = timestamp;\n setLuminance(computeImageLuminance(video, canvasRef.current ?? undefined));\n }\n rafId = window.requestAnimationFrame(tick);\n };\n\n rafId = window.requestAnimationFrame(tick);\n return () => window.cancelAnimationFrame(rafId);\n }, [videoRef, enabled, intervalMs]);\n\n return luminance;\n}\n"],"mappings":"0DAwBA,
|
|
1
|
+
{"version":3,"file":"use-live-luminance.cjs","names":["useState","useRef","computeImageLuminance","require_luminance","react","useLiveLuminance","luminance","setLuminance","canvasRef","enabled","rafId","lastSampledAt","tick","video","videoRef","timestamp","intervalMs"],"sources":["../../src/vision/use-live-luminance.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { computeImageLuminance } from \"./luminance\";\n\n/** Options for {@link useLiveLuminance}. */\nexport interface UseLiveLuminanceOptions {\n /** When `false` the loop is paused (e.g. while a capture is in flight). Default: `true`. */\n enabled?: boolean;\n /** Throttle measurements in milliseconds. Default: `160` (~6 fps), plenty for UX. */\n intervalMs?: number;\n}\n\n/**\n * Sample mean luminance from a `<video>` source on a `requestAnimationFrame`\n * loop and expose the rolling value. Sampling is throttled by `intervalMs` and\n * paused whenever `enabled` is `false` or the video is not ready yet\n * (`readyState < 2` or `videoWidth === 0`).\n *\n * One offscreen canvas is reused across frames to avoid GC pressure. Designed\n * to feed a live brightness bar / border color on a camera page.\n *\n * @param videoRef - ref to the `<video>` element to sample.\n * @param options - optional configuration (see {@link UseLiveLuminanceOptions}).\n * @returns The rolling mean luminance in `0..255` (`0` until the first sample).\n */\nexport function useLiveLuminance(\n videoRef: RefObject<HTMLVideoElement | null>,\n { enabled = true, intervalMs = 160 }: UseLiveLuminanceOptions = {},\n): number {\n const [luminance, setLuminance] = useState(0);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n if (!enabled) return;\n if (typeof window === \"undefined\") return;\n if (!canvasRef.current) canvasRef.current = document.createElement(\"canvas\");\n\n let rafId = 0;\n let lastSampledAt = 0;\n\n const tick = (timestamp: number): void => {\n const video = videoRef.current;\n if (!video || video.readyState < 2 || video.videoWidth === 0) {\n rafId = window.requestAnimationFrame(tick);\n return;\n }\n if (timestamp - lastSampledAt >= intervalMs) {\n lastSampledAt = timestamp;\n setLuminance(computeImageLuminance(video, canvasRef.current ?? undefined));\n }\n rafId = window.requestAnimationFrame(tick);\n };\n\n rafId = window.requestAnimationFrame(tick);\n return () => window.cancelAnimationFrame(rafId);\n }, [videoRef, enabled, intervalMs]);\n\n return luminance;\n}\n"],"mappings":"A,0DAwBA,SAAgBK,EACZ,EACA,CAAE,UAAU,GAAM,aAAa,KAAiC,CAAC,EAC3D,CACN,GAAM,CAACC,EAAWC,IAAA,EAAgBP,EAAAA,SAAAA,CAAS,CAAC,EACtCQ,GAAA,EAAYP,EAAAA,OAAAA,CAAiC,IAAI,EA2BvD,OAzBA,EAAAG,EAAA,UAAA,KAAgB,CAEZ,GADI,CAACK,GACD,OAAO,OAAW,IAAa,OACnC,AAAwBD,EAAU,UAAU,SAAS,cAAc,QAAQ,EAE3E,IAAIE,EAAQ,EACRC,EAAgB,EAEdC,EAAQ,GAA4B,CACtC,IAAMC,EAAQC,EAAS,QACnB,CAACD,GAASA,EAAM,WAAa,GAAKA,EAAM,aAAe,GAIvDE,EAAYJ,GAAiBK,IAC7B,EAAgBD,EAChBR,EAAaL,EAAAA,sBAAsBW,EAAOL,EAAU,SAAW,IAAA,EAAS,CAAC,GAE7E,EAAQ,OAAO,sBAAsBI,CAAI,CAC7C,EAGA,MADA,GAAQ,OAAO,sBAAsBA,CAAI,MAC5B,OAAO,qBAAqBF,CAAK,CAClD,EAAG,CAACI,EAAUL,EAASO,CAAU,CAAC,EAE3BV,CACX,C"}
|
|
@@ -8,11 +8,7 @@ function i(i, { enabled: a = !0, intervalMs: o = 160 } = {}) {
|
|
|
8
8
|
l.current ||= document.createElement("canvas");
|
|
9
9
|
let t = 0, n = 0, r = (a) => {
|
|
10
10
|
let s = i.current;
|
|
11
|
-
|
|
12
|
-
t = window.requestAnimationFrame(r);
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
a - n >= o && (n = a, c(e(s, l.current ?? void 0))), t = window.requestAnimationFrame(r);
|
|
11
|
+
!s || s.readyState < 2 || s.videoWidth === 0 || a - n >= o && (n = a, c(e(s, l.current ?? void 0))), t = window.requestAnimationFrame(r);
|
|
16
12
|
};
|
|
17
13
|
return t = window.requestAnimationFrame(r), () => window.cancelAnimationFrame(t);
|
|
18
14
|
}, [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-live-luminance.js","names":[],"sources":["../../src/vision/use-live-luminance.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { computeImageLuminance } from \"./luminance\";\n\n/** Options for {@link useLiveLuminance}. */\nexport interface UseLiveLuminanceOptions {\n /** When `false` the loop is paused (e.g. while a capture is in flight). Default: `true`. */\n enabled?: boolean;\n /** Throttle measurements in milliseconds. Default: `160` (~6 fps), plenty for UX. */\n intervalMs?: number;\n}\n\n/**\n * Sample mean luminance from a `<video>` source on a `requestAnimationFrame`\n * loop and expose the rolling value. Sampling is throttled by `intervalMs` and\n * paused whenever `enabled` is `false` or the video is not ready yet\n * (`readyState < 2` or `videoWidth === 0`).\n *\n * One offscreen canvas is reused across frames to avoid GC pressure. Designed\n * to feed a live brightness bar / border color on a camera page.\n *\n * @param videoRef - ref to the `<video>` element to sample.\n * @param options - optional configuration (see {@link UseLiveLuminanceOptions}).\n * @returns The rolling mean luminance in `0..255` (`0` until the first sample).\n */\nexport function useLiveLuminance(\n videoRef: RefObject<HTMLVideoElement | null>,\n { enabled = true, intervalMs = 160 }: UseLiveLuminanceOptions = {},\n): number {\n const [luminance, setLuminance] = useState(0);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n if (!enabled) return;\n if (typeof window === \"undefined\") return;\n if (!canvasRef.current) canvasRef.current = document.createElement(\"canvas\");\n\n let rafId = 0;\n let lastSampledAt = 0;\n\n const tick = (timestamp: number): void => {\n const video = videoRef.current;\n if (!video || video.readyState < 2 || video.videoWidth === 0) {\n rafId = window.requestAnimationFrame(tick);\n return;\n }\n if (timestamp - lastSampledAt >= intervalMs) {\n lastSampledAt = timestamp;\n setLuminance(computeImageLuminance(video, canvasRef.current ?? undefined));\n }\n rafId = window.requestAnimationFrame(tick);\n };\n\n rafId = window.requestAnimationFrame(tick);\n return () => window.cancelAnimationFrame(rafId);\n }, [videoRef, enabled, intervalMs]);\n\n return luminance;\n}\n"],"mappings":";;;AAwBA,
|
|
1
|
+
{"version":3,"file":"use-live-luminance.js","names":["useLiveLuminance","luminance","setLuminance","useState","canvasRef","useRef","useEffect","enabled","rafId","lastSampledAt","tick","video","videoRef","timestamp","intervalMs","computeImageLuminance"],"sources":["../../src/vision/use-live-luminance.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from \"react\";\nimport { computeImageLuminance } from \"./luminance\";\n\n/** Options for {@link useLiveLuminance}. */\nexport interface UseLiveLuminanceOptions {\n /** When `false` the loop is paused (e.g. while a capture is in flight). Default: `true`. */\n enabled?: boolean;\n /** Throttle measurements in milliseconds. Default: `160` (~6 fps), plenty for UX. */\n intervalMs?: number;\n}\n\n/**\n * Sample mean luminance from a `<video>` source on a `requestAnimationFrame`\n * loop and expose the rolling value. Sampling is throttled by `intervalMs` and\n * paused whenever `enabled` is `false` or the video is not ready yet\n * (`readyState < 2` or `videoWidth === 0`).\n *\n * One offscreen canvas is reused across frames to avoid GC pressure. Designed\n * to feed a live brightness bar / border color on a camera page.\n *\n * @param videoRef - ref to the `<video>` element to sample.\n * @param options - optional configuration (see {@link UseLiveLuminanceOptions}).\n * @returns The rolling mean luminance in `0..255` (`0` until the first sample).\n */\nexport function useLiveLuminance(\n videoRef: RefObject<HTMLVideoElement | null>,\n { enabled = true, intervalMs = 160 }: UseLiveLuminanceOptions = {},\n): number {\n const [luminance, setLuminance] = useState(0);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n if (!enabled) return;\n if (typeof window === \"undefined\") return;\n if (!canvasRef.current) canvasRef.current = document.createElement(\"canvas\");\n\n let rafId = 0;\n let lastSampledAt = 0;\n\n const tick = (timestamp: number): void => {\n const video = videoRef.current;\n if (!video || video.readyState < 2 || video.videoWidth === 0) {\n rafId = window.requestAnimationFrame(tick);\n return;\n }\n if (timestamp - lastSampledAt >= intervalMs) {\n lastSampledAt = timestamp;\n setLuminance(computeImageLuminance(video, canvasRef.current ?? undefined));\n }\n rafId = window.requestAnimationFrame(tick);\n };\n\n rafId = window.requestAnimationFrame(tick);\n return () => window.cancelAnimationFrame(rafId);\n }, [videoRef, enabled, intervalMs]);\n\n return luminance;\n}\n"],"mappings":";;;AAwBA,SAAgBA,EACZ,GACA,EAAE,aAAU,IAAM,gBAAa,QAAiC,CAAC,GAC3D;CACN,IAAM,CAACC,GAAWC,KAAgBC,EAAS,CAAC,GACtCC,IAAYC,EAAiC,IAAI;CA2BvD,OAzBAC,QAAgB;EAEZ,IADI,CAACC,KACD,OAAO,SAAW,KAAa;EACnC,AAAwBH,EAAU,YAAU,SAAS,cAAc,QAAQ;EAE3E,IAAII,IAAQ,GACRC,IAAgB,GAEdC,KAAQ,MAA4B;GACtC,IAAMC,IAAQC,EAAS;GACvB,AAAI,CAACD,KAASA,EAAM,aAAa,KAAKA,EAAM,eAAe,KAIvDE,IAAYJ,KAAiBK,MAC7B,IAAgBD,GAChBX,EAAaa,EAAsBJ,GAAOP,EAAU,WAAW,KAAA,CAAS,CAAC,IAE7E,IAAQ,OAAO,sBAAsBM,CAAI;EAC7C;EAGA,OADA,IAAQ,OAAO,sBAAsBA,CAAI,SAC5B,OAAO,qBAAqBF,CAAK;CAClD,GAAG;EAACI;EAAUL;EAASO;CAAU,CAAC,GAE3Bb;AACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-url.cjs","names":[],"sources":["../../src/vite/base-url.ts"],"sourcesContent":["/**\n * The resolved Vite `base` as a prefix that always ends in a slash.\n *\n * One rule, three call sites: the manifest prefixes the URLs it precaches, and\n * the dev middleware matches the paths the browser asks for. They have to agree\n * by definition — when they drift, dev serves `/app/sw.js` while the manifest\n * precached `/sw.js`, and the symptom only appears on a subpath deploy, which is\n * the least exercised configuration there is.\n *\n * @param base - Vite's resolved `base`, with or without a trailing slash.\n * @returns The same base, guaranteed to end in `/`.\n */\nexport function basePrefix(base: string): string {\n return base.endsWith(\"/\") ? base : `${base}/`;\n}\n"],"mappings":"AAYA,
|
|
1
|
+
{"version":3,"file":"base-url.cjs","names":["basePrefix","base"],"sources":["../../src/vite/base-url.ts"],"sourcesContent":["/**\n * The resolved Vite `base` as a prefix that always ends in a slash.\n *\n * One rule, three call sites: the manifest prefixes the URLs it precaches, and\n * the dev middleware matches the paths the browser asks for. They have to agree\n * by definition — when they drift, dev serves `/app/sw.js` while the manifest\n * precached `/sw.js`, and the symptom only appears on a subpath deploy, which is\n * the least exercised configuration there is.\n *\n * @param base - Vite's resolved `base`, with or without a trailing slash.\n * @returns The same base, guaranteed to end in `/`.\n */\nexport function basePrefix(base: string): string {\n return base.endsWith(\"/\") ? base : `${base}/`;\n}\n"],"mappings":"AAYA,SAAgBA,EAAW,EAAsB,CAC7C,OAAOC,EAAK,SAAS,GAAG,EAAIA,EAAO,GAAGA,EAAK,EAC/C,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-url.js","names":[],"sources":["../../src/vite/base-url.ts"],"sourcesContent":["/**\n * The resolved Vite `base` as a prefix that always ends in a slash.\n *\n * One rule, three call sites: the manifest prefixes the URLs it precaches, and\n * the dev middleware matches the paths the browser asks for. They have to agree\n * by definition — when they drift, dev serves `/app/sw.js` while the manifest\n * precached `/sw.js`, and the symptom only appears on a subpath deploy, which is\n * the least exercised configuration there is.\n *\n * @param base - Vite's resolved `base`, with or without a trailing slash.\n * @returns The same base, guaranteed to end in `/`.\n */\nexport function basePrefix(base: string): string {\n return base.endsWith(\"/\") ? base : `${base}/`;\n}\n"],"mappings":";AAYA,
|
|
1
|
+
{"version":3,"file":"base-url.js","names":["basePrefix","base"],"sources":["../../src/vite/base-url.ts"],"sourcesContent":["/**\n * The resolved Vite `base` as a prefix that always ends in a slash.\n *\n * One rule, three call sites: the manifest prefixes the URLs it precaches, and\n * the dev middleware matches the paths the browser asks for. They have to agree\n * by definition — when they drift, dev serves `/app/sw.js` while the manifest\n * precached `/sw.js`, and the symptom only appears on a subpath deploy, which is\n * the least exercised configuration there is.\n *\n * @param base - Vite's resolved `base`, with or without a trailing slash.\n * @returns The same base, guaranteed to end in `/`.\n */\nexport function basePrefix(base: string): string {\n return base.endsWith(\"/\") ? base : `${base}/`;\n}\n"],"mappings":";AAYA,SAAgBA,EAAW,GAAsB;CAC7C,OAAOC,EAAK,SAAS,GAAG,IAAIA,IAAO,GAAGA,EAAK;AAC/C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-vite-config.cjs","names":[],"sources":["../../src/vite/create-vite-config.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { defineConfig } from \"vite\";\nimport type { PluginOption, ProxyOptions, UserConfig } from \"vite\";\n\nimport { tempestIcons, type TempestIconsOptions } from \"./tempest-icons\";\nimport { tempestVitest } from \"./tempest-vitest\";\n\n/**\n * A Vite proxy entry: either a target URL string (expanded to\n * `{ target, changeOrigin: true }`) or a raw Vite `ProxyOptions` object.\n */\nexport type ProxyEntry = string | Record<string, unknown>;\n\nexport interface CreateViteConfigOptions {\n /**\n * Source directory aliased to `@`, relative to the project root.\n * Default: `\"src\"` (so `@/components/Button` → `<root>/src/components/Button`).\n */\n srcDir?: string;\n /** Dev server port. Default: `5173`. */\n port?: number;\n /** Dev server host. Default: `\"127.0.0.1\"`. */\n host?: string | boolean;\n /** Open the browser on `dev` start. Default: `false`. */\n open?: boolean;\n /**\n * Dev proxy table. String values are expanded to\n * `{ target, changeOrigin: true }`; objects are passed through untouched.\n *\n * @example { \"/api\": \"http://127.0.0.1:8000\" }\n */\n proxy?: Record<string, ProxyEntry>;\n /** Extra path aliases merged on top of the default `@` → src alias. */\n alias?: Record<string, string>;\n /** Vite plugins appended after `@vitejs/plugin-react`. */\n plugins?: unknown[];\n /**\n * The `tempestIcons()` plugin, which generates `virtual:tempest-icons` from the\n * icon slugs your source mentions. On by default — it only ever removes\n * requests. Pass `false` to leave it out, or an options object to configure the\n * scan.\n */\n icons?: boolean | TempestIconsOptions;\n /**\n * Arbitrary Vite config (a `UserConfig` object) deep-merged last, for\n * escape-hatch overrides (build target, define, extra `server` keys, …).\n */\n overrides?: Record<string, unknown>;\n}\n\n/**\n * The resulting Vite config object. Typed loosely so the SDK's published\n * declarations stay free of `vite`'s internal types; assign it straight to a\n * `vite.config.ts` default export.\n */\nexport type TempestViteConfig = Record<string, unknown>;\n\nfunction normalizeProxy(proxy: Record<string, ProxyEntry>): Record<string, ProxyOptions> {\n const out: Record<string, ProxyOptions> = {};\n for (const [path, value] of Object.entries(proxy)) {\n out[path] =\n typeof value === \"string\"\n ? { target: value, changeOrigin: true }\n : (value as ProxyOptions);\n }\n return out;\n}\n\n/**\n * Load `@vitejs/plugin-react` when a config is built, not when this module loads.\n *\n * The plugin is an optional peer, and every helper of `tempest-react-sdk/vite`\n * ships through one barrel. A top-level import made the whole barrel require it:\n * a project without the React plugin could not load a config importing only\n * `tempestVitest` or `tempestCsp` (`ERR_MODULE_NOT_FOUND`, #401). Vite resolves a\n * promise in `plugins` before using it, so {@link createViteConfig} stays\n * synchronous and only it needs the peer.\n *\n * @returns The React plugin, once its module has loaded.\n */\nfunction reactPlugin(): Promise<PluginOption> {\n return import(\"@vitejs/plugin-react\").then((module) => module.default());\n}\n\n/**\n * Build a Tempest-flavored Vite config for a React app: the `@vitejs/plugin-react`\n * plugin, the `@` → `src` import alias, sane dev-server defaults and\n * {@link tempestVitest}, which lets a Vitest suite import the SDK — so a\n * consuming app's `vite.config.ts` is a single call instead of repeated\n * boilerplate. Everything is overridable.\n *\n * Import it from the dedicated Node entry point:\n *\n * @example\n * // vite.config.ts\n * import { createViteConfig } from \"tempest-react-sdk/vite\";\n *\n * export default createViteConfig({\n * proxy: { \"/api\": \"http://127.0.0.1:8000\" },\n * });\n */\nexport function createViteConfig(options: CreateViteConfigOptions = {}): TempestViteConfig {\n const {\n srcDir = \"src\",\n port = 5173,\n host = \"127.0.0.1\",\n open = false,\n proxy,\n alias = {},\n plugins = [],\n icons = true,\n overrides = {},\n } = options;\n\n const overridesConfig = overrides as UserConfig;\n const iconsPlugin = icons\n ? [tempestIcons({ dir: srcDir, ...(typeof icons === \"object\" ? icons : {}) })]\n : [];\n\n const base: UserConfig = {\n plugins: [\n reactPlugin(),\n ...iconsPlugin,\n tempestVitest(),\n ...plugins,\n ] as UserConfig[\"plugins\"],\n resolve: {\n alias: {\n \"@\": resolve(process.cwd(), srcDir),\n ...alias,\n },\n },\n server: {\n port,\n host,\n open,\n ...(proxy ? { proxy: normalizeProxy(proxy) } : {}),\n },\n };\n\n const merged: UserConfig = {\n ...base,\n ...overridesConfig,\n plugins: [...(base.plugins ?? []), ...(overridesConfig.plugins ?? [])],\n resolve: { ...base.resolve, ...overridesConfig.resolve },\n server: { ...base.server, ...overridesConfig.server },\n };\n\n return defineConfig(merged) as TempestViteConfig;\n}\n"],"mappings":"sHAyDA,
|
|
1
|
+
{"version":3,"file":"create-vite-config.cjs","names":["tempestIcons","tempestVitest","resolve","defineConfig","require_tempest_icons","require_tempest_vitest","node_path","vite","normalizeProxy","out","path","value","proxy","reactPlugin","module","createViteConfig","options","overridesConfig","overrides","iconsPlugin","icons","srcDir","base","plugins","alias","merged"],"sources":["../../src/vite/create-vite-config.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { defineConfig } from \"vite\";\nimport type { PluginOption, ProxyOptions, UserConfig } from \"vite\";\n\nimport { tempestIcons, type TempestIconsOptions } from \"./tempest-icons\";\nimport { tempestVitest } from \"./tempest-vitest\";\n\n/**\n * A Vite proxy entry: either a target URL string (expanded to\n * `{ target, changeOrigin: true }`) or a raw Vite `ProxyOptions` object.\n */\nexport type ProxyEntry = string | Record<string, unknown>;\n\nexport interface CreateViteConfigOptions {\n /**\n * Source directory aliased to `@`, relative to the project root.\n * Default: `\"src\"` (so `@/components/Button` → `<root>/src/components/Button`).\n */\n srcDir?: string;\n /** Dev server port. Default: `5173`. */\n port?: number;\n /** Dev server host. Default: `\"127.0.0.1\"`. */\n host?: string | boolean;\n /** Open the browser on `dev` start. Default: `false`. */\n open?: boolean;\n /**\n * Dev proxy table. String values are expanded to\n * `{ target, changeOrigin: true }`; objects are passed through untouched.\n *\n * @example { \"/api\": \"http://127.0.0.1:8000\" }\n */\n proxy?: Record<string, ProxyEntry>;\n /** Extra path aliases merged on top of the default `@` → src alias. */\n alias?: Record<string, string>;\n /** Vite plugins appended after `@vitejs/plugin-react`. */\n plugins?: unknown[];\n /**\n * The `tempestIcons()` plugin, which generates `virtual:tempest-icons` from the\n * icon slugs your source mentions. On by default — it only ever removes\n * requests. Pass `false` to leave it out, or an options object to configure the\n * scan.\n */\n icons?: boolean | TempestIconsOptions;\n /**\n * Arbitrary Vite config (a `UserConfig` object) deep-merged last, for\n * escape-hatch overrides (build target, define, extra `server` keys, …).\n */\n overrides?: Record<string, unknown>;\n}\n\n/**\n * The resulting Vite config object. Typed loosely so the SDK's published\n * declarations stay free of `vite`'s internal types; assign it straight to a\n * `vite.config.ts` default export.\n */\nexport type TempestViteConfig = Record<string, unknown>;\n\nfunction normalizeProxy(proxy: Record<string, ProxyEntry>): Record<string, ProxyOptions> {\n const out: Record<string, ProxyOptions> = {};\n for (const [path, value] of Object.entries(proxy)) {\n out[path] =\n typeof value === \"string\"\n ? { target: value, changeOrigin: true }\n : (value as ProxyOptions);\n }\n return out;\n}\n\n/**\n * Load `@vitejs/plugin-react` when a config is built, not when this module loads.\n *\n * The plugin is an optional peer, and every helper of `tempest-react-sdk/vite`\n * ships through one barrel. A top-level import made the whole barrel require it:\n * a project without the React plugin could not load a config importing only\n * `tempestVitest` or `tempestCsp` (`ERR_MODULE_NOT_FOUND`, #401). Vite resolves a\n * promise in `plugins` before using it, so {@link createViteConfig} stays\n * synchronous and only it needs the peer.\n *\n * @returns The React plugin, once its module has loaded.\n */\nfunction reactPlugin(): Promise<PluginOption> {\n return import(\"@vitejs/plugin-react\").then((module) => module.default());\n}\n\n/**\n * Build a Tempest-flavored Vite config for a React app: the `@vitejs/plugin-react`\n * plugin, the `@` → `src` import alias, sane dev-server defaults and\n * {@link tempestVitest}, which lets a Vitest suite import the SDK — so a\n * consuming app's `vite.config.ts` is a single call instead of repeated\n * boilerplate. Everything is overridable.\n *\n * Import it from the dedicated Node entry point:\n *\n * @example\n * // vite.config.ts\n * import { createViteConfig } from \"tempest-react-sdk/vite\";\n *\n * export default createViteConfig({\n * proxy: { \"/api\": \"http://127.0.0.1:8000\" },\n * });\n */\nexport function createViteConfig(options: CreateViteConfigOptions = {}): TempestViteConfig {\n const {\n srcDir = \"src\",\n port = 5173,\n host = \"127.0.0.1\",\n open = false,\n proxy,\n alias = {},\n plugins = [],\n icons = true,\n overrides = {},\n } = options;\n\n const overridesConfig = overrides as UserConfig;\n const iconsPlugin = icons\n ? [tempestIcons({ dir: srcDir, ...(typeof icons === \"object\" ? icons : {}) })]\n : [];\n\n const base: UserConfig = {\n plugins: [\n reactPlugin(),\n ...iconsPlugin,\n tempestVitest(),\n ...plugins,\n ] as UserConfig[\"plugins\"],\n resolve: {\n alias: {\n \"@\": resolve(process.cwd(), srcDir),\n ...alias,\n },\n },\n server: {\n port,\n host,\n open,\n ...(proxy ? { proxy: normalizeProxy(proxy) } : {}),\n },\n };\n\n const merged: UserConfig = {\n ...base,\n ...overridesConfig,\n plugins: [...(base.plugins ?? []), ...(overridesConfig.plugins ?? [])],\n resolve: { ...base.resolve, ...overridesConfig.resolve },\n server: { ...base.server, ...overridesConfig.server },\n };\n\n return defineConfig(merged) as TempestViteConfig;\n}\n"],"mappings":"A,sHAyDA,SAASQ,EAAe,EAAiE,CACrF,IAAMC,EAAoC,CAAC,EAC3C,IAAK,GAAM,CAACC,EAAMC,KAAU,OAAO,QAAQC,CAAK,EAC5C,EAAIF,GACA,OAAOC,GAAU,SACX,CAAE,OAAQA,EAAO,aAAc,EAAK,EACnCA,EAEf,OAAOF,CACX,CAcA,SAASI,GAAqC,CAC1C,OAAO,OAAO,uBAAuB,CAAC,KAAM,GAAWC,EAAO,QAAQ,CAAC,CAC3E,CAmBA,SAAgBC,EAAiB,EAAmC,CAAC,EAAsB,CACvF,GAAM,CACF,SAAS,MACT,OAAO,KACP,OAAO,YACP,OAAO,GACP,QACA,QAAQ,CAAC,EACT,UAAU,CAAC,EACX,QAAQ,GACR,YAAY,CAAC,GACbC,EAEEC,EAAkBC,EAClBC,EAAcC,EACd,CAACpB,EAAAA,aAAa,CAAE,IAAKqB,EAAQ,GAAI,OAAOD,GAAU,SAAWA,EAAQ,CAAC,CAAG,CAAC,CAAC,EAC3E,CAAC,EAEDE,EAAmB,CACrB,QAAS,CACLT,EAAY,EACZ,GAAGM,EACHlB,EAAAA,cAAc,EACd,GAAGsB,CACP,EACA,QAAS,CACL,MAAO,CACH,KAAA,EAAKrB,EAAAA,QAAAA,CAAQ,QAAQ,IAAI,EAAGmB,CAAM,EAClC,GAAGG,CACP,CACJ,EACA,OAAQ,CACJ,OACA,OACA,OACA,GAAIZ,EAAQ,CAAE,MAAOJ,EAAeI,CAAK,CAAE,EAAI,CAAC,CACpD,CACJ,EAEMa,EAAqB,CACvB,GAAGH,EACH,GAAGL,EACH,QAAS,CAAC,GAAIK,EAAK,SAAW,CAAC,EAAI,GAAIL,EAAgB,SAAW,CAAC,CAAE,EACrE,QAAS,CAAE,GAAGK,EAAK,QAAS,GAAGL,EAAgB,OAAQ,EACvD,OAAQ,CAAE,GAAGK,EAAK,OAAQ,GAAGL,EAAgB,MAAO,CACxD,EAEA,OAAA,EAAOd,EAAAA,aAAAA,CAAasB,CAAM,CAC9B,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-vite-config.js","names":[],"sources":["../../src/vite/create-vite-config.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { defineConfig } from \"vite\";\nimport type { PluginOption, ProxyOptions, UserConfig } from \"vite\";\n\nimport { tempestIcons, type TempestIconsOptions } from \"./tempest-icons\";\nimport { tempestVitest } from \"./tempest-vitest\";\n\n/**\n * A Vite proxy entry: either a target URL string (expanded to\n * `{ target, changeOrigin: true }`) or a raw Vite `ProxyOptions` object.\n */\nexport type ProxyEntry = string | Record<string, unknown>;\n\nexport interface CreateViteConfigOptions {\n /**\n * Source directory aliased to `@`, relative to the project root.\n * Default: `\"src\"` (so `@/components/Button` → `<root>/src/components/Button`).\n */\n srcDir?: string;\n /** Dev server port. Default: `5173`. */\n port?: number;\n /** Dev server host. Default: `\"127.0.0.1\"`. */\n host?: string | boolean;\n /** Open the browser on `dev` start. Default: `false`. */\n open?: boolean;\n /**\n * Dev proxy table. String values are expanded to\n * `{ target, changeOrigin: true }`; objects are passed through untouched.\n *\n * @example { \"/api\": \"http://127.0.0.1:8000\" }\n */\n proxy?: Record<string, ProxyEntry>;\n /** Extra path aliases merged on top of the default `@` → src alias. */\n alias?: Record<string, string>;\n /** Vite plugins appended after `@vitejs/plugin-react`. */\n plugins?: unknown[];\n /**\n * The `tempestIcons()` plugin, which generates `virtual:tempest-icons` from the\n * icon slugs your source mentions. On by default — it only ever removes\n * requests. Pass `false` to leave it out, or an options object to configure the\n * scan.\n */\n icons?: boolean | TempestIconsOptions;\n /**\n * Arbitrary Vite config (a `UserConfig` object) deep-merged last, for\n * escape-hatch overrides (build target, define, extra `server` keys, …).\n */\n overrides?: Record<string, unknown>;\n}\n\n/**\n * The resulting Vite config object. Typed loosely so the SDK's published\n * declarations stay free of `vite`'s internal types; assign it straight to a\n * `vite.config.ts` default export.\n */\nexport type TempestViteConfig = Record<string, unknown>;\n\nfunction normalizeProxy(proxy: Record<string, ProxyEntry>): Record<string, ProxyOptions> {\n const out: Record<string, ProxyOptions> = {};\n for (const [path, value] of Object.entries(proxy)) {\n out[path] =\n typeof value === \"string\"\n ? { target: value, changeOrigin: true }\n : (value as ProxyOptions);\n }\n return out;\n}\n\n/**\n * Load `@vitejs/plugin-react` when a config is built, not when this module loads.\n *\n * The plugin is an optional peer, and every helper of `tempest-react-sdk/vite`\n * ships through one barrel. A top-level import made the whole barrel require it:\n * a project without the React plugin could not load a config importing only\n * `tempestVitest` or `tempestCsp` (`ERR_MODULE_NOT_FOUND`, #401). Vite resolves a\n * promise in `plugins` before using it, so {@link createViteConfig} stays\n * synchronous and only it needs the peer.\n *\n * @returns The React plugin, once its module has loaded.\n */\nfunction reactPlugin(): Promise<PluginOption> {\n return import(\"@vitejs/plugin-react\").then((module) => module.default());\n}\n\n/**\n * Build a Tempest-flavored Vite config for a React app: the `@vitejs/plugin-react`\n * plugin, the `@` → `src` import alias, sane dev-server defaults and\n * {@link tempestVitest}, which lets a Vitest suite import the SDK — so a\n * consuming app's `vite.config.ts` is a single call instead of repeated\n * boilerplate. Everything is overridable.\n *\n * Import it from the dedicated Node entry point:\n *\n * @example\n * // vite.config.ts\n * import { createViteConfig } from \"tempest-react-sdk/vite\";\n *\n * export default createViteConfig({\n * proxy: { \"/api\": \"http://127.0.0.1:8000\" },\n * });\n */\nexport function createViteConfig(options: CreateViteConfigOptions = {}): TempestViteConfig {\n const {\n srcDir = \"src\",\n port = 5173,\n host = \"127.0.0.1\",\n open = false,\n proxy,\n alias = {},\n plugins = [],\n icons = true,\n overrides = {},\n } = options;\n\n const overridesConfig = overrides as UserConfig;\n const iconsPlugin = icons\n ? [tempestIcons({ dir: srcDir, ...(typeof icons === \"object\" ? icons : {}) })]\n : [];\n\n const base: UserConfig = {\n plugins: [\n reactPlugin(),\n ...iconsPlugin,\n tempestVitest(),\n ...plugins,\n ] as UserConfig[\"plugins\"],\n resolve: {\n alias: {\n \"@\": resolve(process.cwd(), srcDir),\n ...alias,\n },\n },\n server: {\n port,\n host,\n open,\n ...(proxy ? { proxy: normalizeProxy(proxy) } : {}),\n },\n };\n\n const merged: UserConfig = {\n ...base,\n ...overridesConfig,\n plugins: [...(base.plugins ?? []), ...(overridesConfig.plugins ?? [])],\n resolve: { ...base.resolve, ...overridesConfig.resolve },\n server: { ...base.server, ...overridesConfig.server },\n };\n\n return defineConfig(merged) as TempestViteConfig;\n}\n"],"mappings":";;;;;AAyDA,
|
|
1
|
+
{"version":3,"file":"create-vite-config.js","names":["normalizeProxy","out","path","value","proxy","reactPlugin","module","createViteConfig","options","overridesConfig","overrides","iconsPlugin","icons","tempestIcons","srcDir","base","tempestVitest","plugins","resolve","alias","merged","defineConfig"],"sources":["../../src/vite/create-vite-config.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { defineConfig } from \"vite\";\nimport type { PluginOption, ProxyOptions, UserConfig } from \"vite\";\n\nimport { tempestIcons, type TempestIconsOptions } from \"./tempest-icons\";\nimport { tempestVitest } from \"./tempest-vitest\";\n\n/**\n * A Vite proxy entry: either a target URL string (expanded to\n * `{ target, changeOrigin: true }`) or a raw Vite `ProxyOptions` object.\n */\nexport type ProxyEntry = string | Record<string, unknown>;\n\nexport interface CreateViteConfigOptions {\n /**\n * Source directory aliased to `@`, relative to the project root.\n * Default: `\"src\"` (so `@/components/Button` → `<root>/src/components/Button`).\n */\n srcDir?: string;\n /** Dev server port. Default: `5173`. */\n port?: number;\n /** Dev server host. Default: `\"127.0.0.1\"`. */\n host?: string | boolean;\n /** Open the browser on `dev` start. Default: `false`. */\n open?: boolean;\n /**\n * Dev proxy table. String values are expanded to\n * `{ target, changeOrigin: true }`; objects are passed through untouched.\n *\n * @example { \"/api\": \"http://127.0.0.1:8000\" }\n */\n proxy?: Record<string, ProxyEntry>;\n /** Extra path aliases merged on top of the default `@` → src alias. */\n alias?: Record<string, string>;\n /** Vite plugins appended after `@vitejs/plugin-react`. */\n plugins?: unknown[];\n /**\n * The `tempestIcons()` plugin, which generates `virtual:tempest-icons` from the\n * icon slugs your source mentions. On by default — it only ever removes\n * requests. Pass `false` to leave it out, or an options object to configure the\n * scan.\n */\n icons?: boolean | TempestIconsOptions;\n /**\n * Arbitrary Vite config (a `UserConfig` object) deep-merged last, for\n * escape-hatch overrides (build target, define, extra `server` keys, …).\n */\n overrides?: Record<string, unknown>;\n}\n\n/**\n * The resulting Vite config object. Typed loosely so the SDK's published\n * declarations stay free of `vite`'s internal types; assign it straight to a\n * `vite.config.ts` default export.\n */\nexport type TempestViteConfig = Record<string, unknown>;\n\nfunction normalizeProxy(proxy: Record<string, ProxyEntry>): Record<string, ProxyOptions> {\n const out: Record<string, ProxyOptions> = {};\n for (const [path, value] of Object.entries(proxy)) {\n out[path] =\n typeof value === \"string\"\n ? { target: value, changeOrigin: true }\n : (value as ProxyOptions);\n }\n return out;\n}\n\n/**\n * Load `@vitejs/plugin-react` when a config is built, not when this module loads.\n *\n * The plugin is an optional peer, and every helper of `tempest-react-sdk/vite`\n * ships through one barrel. A top-level import made the whole barrel require it:\n * a project without the React plugin could not load a config importing only\n * `tempestVitest` or `tempestCsp` (`ERR_MODULE_NOT_FOUND`, #401). Vite resolves a\n * promise in `plugins` before using it, so {@link createViteConfig} stays\n * synchronous and only it needs the peer.\n *\n * @returns The React plugin, once its module has loaded.\n */\nfunction reactPlugin(): Promise<PluginOption> {\n return import(\"@vitejs/plugin-react\").then((module) => module.default());\n}\n\n/**\n * Build a Tempest-flavored Vite config for a React app: the `@vitejs/plugin-react`\n * plugin, the `@` → `src` import alias, sane dev-server defaults and\n * {@link tempestVitest}, which lets a Vitest suite import the SDK — so a\n * consuming app's `vite.config.ts` is a single call instead of repeated\n * boilerplate. Everything is overridable.\n *\n * Import it from the dedicated Node entry point:\n *\n * @example\n * // vite.config.ts\n * import { createViteConfig } from \"tempest-react-sdk/vite\";\n *\n * export default createViteConfig({\n * proxy: { \"/api\": \"http://127.0.0.1:8000\" },\n * });\n */\nexport function createViteConfig(options: CreateViteConfigOptions = {}): TempestViteConfig {\n const {\n srcDir = \"src\",\n port = 5173,\n host = \"127.0.0.1\",\n open = false,\n proxy,\n alias = {},\n plugins = [],\n icons = true,\n overrides = {},\n } = options;\n\n const overridesConfig = overrides as UserConfig;\n const iconsPlugin = icons\n ? [tempestIcons({ dir: srcDir, ...(typeof icons === \"object\" ? icons : {}) })]\n : [];\n\n const base: UserConfig = {\n plugins: [\n reactPlugin(),\n ...iconsPlugin,\n tempestVitest(),\n ...plugins,\n ] as UserConfig[\"plugins\"],\n resolve: {\n alias: {\n \"@\": resolve(process.cwd(), srcDir),\n ...alias,\n },\n },\n server: {\n port,\n host,\n open,\n ...(proxy ? { proxy: normalizeProxy(proxy) } : {}),\n },\n };\n\n const merged: UserConfig = {\n ...base,\n ...overridesConfig,\n plugins: [...(base.plugins ?? []), ...(overridesConfig.plugins ?? [])],\n resolve: { ...base.resolve, ...overridesConfig.resolve },\n server: { ...base.server, ...overridesConfig.server },\n };\n\n return defineConfig(merged) as TempestViteConfig;\n}\n"],"mappings":";;;;;AAyDA,SAASA,EAAe,GAAiE;CACrF,IAAMC,IAAoC,CAAC;CAC3C,KAAK,IAAM,CAACC,GAAMC,MAAU,OAAO,QAAQC,CAAK,GAC5C,EAAIF,KACA,OAAOC,KAAU,WACX;EAAE,QAAQA;EAAO,cAAc;CAAK,IACnCA;CAEf,OAAOF;AACX;AAcA,SAASI,IAAqC;CAC1C,OAAO,OAAO,uBAAuB,CAAC,MAAM,MAAWC,EAAO,QAAQ,CAAC;AAC3E;AAmBA,SAAgBC,EAAiB,IAAmC,CAAC,GAAsB;CACvF,IAAM,EACF,YAAS,OACT,UAAO,MACP,UAAO,aACP,UAAO,IACP,UACA,WAAQ,CAAC,GACT,aAAU,CAAC,GACX,WAAQ,IACR,eAAY,CAAC,MACbC,GAEEC,IAAkBC,GAClBC,IAAcC,IACd,CAACC,EAAa;EAAE,KAAKC;EAAQ,GAAI,OAAOF,KAAU,WAAWA,IAAQ,CAAC;CAAG,CAAC,CAAC,IAC3E,CAAC,GAEDG,IAAmB;EACrB,SAAS;GACLV,EAAY;GACZ,GAAGM;GACHK,EAAc;GACd,GAAGC;EACP;EACA,SAAS,EACL,OAAO;GACH,KAAKC,EAAQ,QAAQ,IAAI,GAAGJ,CAAM;GAClC,GAAGK;EACP,EACJ;EACA,QAAQ;GACJ;GACA;GACA;GACA,GAAIf,IAAQ,EAAE,OAAOJ,EAAeI,CAAK,EAAE,IAAI,CAAC;EACpD;CACJ,GAEMgB,IAAqB;EACvB,GAAGL;EACH,GAAGN;EACH,SAAS,CAAC,GAAIM,EAAK,WAAW,CAAC,GAAI,GAAIN,EAAgB,WAAW,CAAC,CAAE;EACrE,SAAS;GAAE,GAAGM,EAAK;GAAS,GAAGN,EAAgB;EAAQ;EACvD,QAAQ;GAAE,GAAGM,EAAK;GAAQ,GAAGN,EAAgB;EAAO;CACxD;CAEA,OAAOY,EAAaD,CAAM;AAC9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"narrow-tokens.cjs","names":[],"sources":["../../src/vite/narrow-tokens.ts"],"sourcesContent":["/**\n * Cut the token sheet down to the tokens a set of stylesheets can reach.\n *\n * Once every component loads its own stylesheet, `tokens.css` stops being a rounding\n * error and becomes the biggest single thing an app downloads: measured on a probe\n * app mounting `Button`, `Card` and `Badge`, the sheet is 2516 B brotli of a 4927 B\n * total. The components read 105 of its 223 tokens, so the other 118 are bytes\n * nothing on the page can consult.\n *\n * The cut is a reachability closure, not a filter: a token's value routinely names\n * another token (`--tempest-primary: var(--tempest-primary-500)`), so keeping only\n * the names a stylesheet mentions literally would keep aliases whose targets were\n * dropped — `var()` would resolve to nothing and the component would render with the\n * property unset, which is worse than shipping the whole sheet.\n */\n\n/** A token block: one selector and the custom properties it declares, in order. */\ninterface TokenBlock {\n /** The block's selector text, e.g. `:root` or `[data-tempest-theme=dark]`. */\n selector: string;\n /** Declaration name → value, in source order. */\n declarations: Map<string, string>;\n}\n\n/**\n * Any custom property being read, not only the `--tempest-*` ones.\n *\n * Deliberately wider than the tokens this cut is about. `tokens.css` also carries\n * the `--lightningcss-light`/`--lightningcss-dark` pair the compiler emits, which\n * nothing reads today — measured: two declarations, zero reads — and which a\n * `--tempest-`-only scan would therefore always drop. That is the right answer right\n * up until one rule uses `light-dark()`, at which point the compiler emits the read\n * and a narrow scan would drop the pair it depends on. Matching every custom\n * property costs nothing (a name the sheet does not declare is discarded) and makes\n * the closure correct for names this file does not know about.\n */\nconst TOKEN_REFERENCE = /var\\(\\s*(--[A-Za-z0-9-]+)/g;\n\n/**\n * A token name being assembled at runtime rather than written out.\n *\n * `style={{ color: `var(--tempest-${tone})` }}` names a token no static scan can\n * know, so a cut made without it would drop the one the app is about to read. The\n * caller falls back to the whole sheet when this matches — the same shape as the\n * plugin's own namespace-import fallback, and for the same reason: serve more than\n * asked for rather than less than needed.\n */\nconst DYNAMIC_TOKEN = /--tempest-[A-Za-z0-9-]*(?:\\$\\{|[\"'`]\\s*\\+|\\s*\\+\\s*[\"'`])/;\n\n/**\n * Parse a token stylesheet into its blocks.\n *\n * Written against the compiler's own output, which is already valid and flat — every\n * block in `tokens.css` is either a bare selector or one nested inside a single\n * at-rule — so a brace-depth reader is enough and a full parser would not be more\n * correct here.\n *\n * @param css - Contents of `tokens.css`.\n * @returns One entry per block that declares anything.\n */\nexport function parseTokenBlocks(css: string): TokenBlock[] {\n const blocks: TokenBlock[] = [];\n for (const match of css.matchAll(/([^{}]+)\\{([^{}]*)\\}/g)) {\n const declarations = new Map<string, string>();\n for (const declaration of (match[2] ?? \"\").split(\";\")) {\n const colon = declaration.indexOf(\":\");\n if (colon < 0) continue;\n const name = declaration.slice(0, colon).trim();\n if (name) declarations.set(name, declaration.slice(colon + 1).trim());\n }\n if (declarations.size === 0) continue;\n blocks.push({ selector: (match[1] ?? \"\").trim(), declarations });\n }\n return blocks;\n}\n\n/**\n * Every token a body of CSS reaches, following token-to-token references.\n *\n * @param blocks - The parsed token sheet.\n * @param usage - CSS and source text to scan for `var(--tempest-*)`.\n * @returns The reachable token names.\n */\nexport function reachableTokens(blocks: readonly TokenBlock[], usage: string): Set<string> {\n const declared = new Set<string>();\n for (const block of blocks) for (const name of block.declarations.keys()) declared.add(name);\n\n const reached = new Set<string>();\n const queue = [...usage.matchAll(TOKEN_REFERENCE)].map((match) => match[1] ?? \"\");\n while (queue.length > 0) {\n const token = queue.pop() ?? \"\";\n if (reached.has(token) || !declared.has(token)) continue;\n reached.add(token);\n for (const block of blocks) {\n const value = block.declarations.get(token);\n if (value === undefined) continue;\n for (const match of value.matchAll(TOKEN_REFERENCE)) queue.push(match[1] ?? \"\");\n }\n }\n return reached;\n}\n\n/**\n * Rebuild the token sheet with only the tokens a set of stylesheets reaches.\n *\n * Companion declarations that are not custom properties travel with the block that\n * survives — `color-scheme` is the one, and dropping it would leave the browser\n * painting its own surfaces (scrollbar, `<select>` popup, autofill) in the wrong\n * theme while every `.tempest_*` rule was correct.\n *\n * @param tokensCss - Contents of `tokens.css`.\n * @param usage - The CSS the app will load, plus its own source, scanned for reads.\n * @returns The narrowed sheet, or `null` when a token name is built at runtime and\n * no static answer is safe.\n */\nexport function narrowTokens(tokensCss: string, usage: string): string | null {\n if (DYNAMIC_TOKEN.test(usage)) return null;\n\n const blocks = parseTokenBlocks(tokensCss);\n const reached = reachableTokens(blocks, usage);\n if (reached.size === 0) return null;\n\n const out: string[] = [];\n for (const block of blocks) {\n const kept = [...block.declarations].filter(\n ([name]) => name.startsWith(\"--\") === false || reached.has(name),\n );\n if (kept.every(([name]) => name.startsWith(\"--\") === false)) continue;\n out.push(`${block.selector}{${kept.map(([name, value]) => `${name}:${value}`).join(\";\")}}`);\n }\n return out.join(\"\\n\");\n}\n"],"mappings":"AAoCA,
|
|
1
|
+
{"version":3,"file":"narrow-tokens.cjs","names":["TOKEN_REFERENCE","DYNAMIC_TOKEN","parseTokenBlocks","blocks","match","css","declarations","declaration","colon","name","reachableTokens","declared","block","reached","queue","usage","token","value","narrowTokens","tokensCss","out","kept"],"sources":["../../src/vite/narrow-tokens.ts"],"sourcesContent":["/**\n * Cut the token sheet down to the tokens a set of stylesheets can reach.\n *\n * Once every component loads its own stylesheet, `tokens.css` stops being a rounding\n * error and becomes the biggest single thing an app downloads: measured on a probe\n * app mounting `Button`, `Card` and `Badge`, the sheet is 2516 B brotli of a 4927 B\n * total. The components read 105 of its 223 tokens, so the other 118 are bytes\n * nothing on the page can consult.\n *\n * The cut is a reachability closure, not a filter: a token's value routinely names\n * another token (`--tempest-primary: var(--tempest-primary-500)`), so keeping only\n * the names a stylesheet mentions literally would keep aliases whose targets were\n * dropped — `var()` would resolve to nothing and the component would render with the\n * property unset, which is worse than shipping the whole sheet.\n */\n\n/** A token block: one selector and the custom properties it declares, in order. */\ninterface TokenBlock {\n /** The block's selector text, e.g. `:root` or `[data-tempest-theme=dark]`. */\n selector: string;\n /** Declaration name → value, in source order. */\n declarations: Map<string, string>;\n}\n\n/**\n * Any custom property being read, not only the `--tempest-*` ones.\n *\n * Deliberately wider than the tokens this cut is about. `tokens.css` also carries\n * the `--lightningcss-light`/`--lightningcss-dark` pair the compiler emits, which\n * nothing reads today — measured: two declarations, zero reads — and which a\n * `--tempest-`-only scan would therefore always drop. That is the right answer right\n * up until one rule uses `light-dark()`, at which point the compiler emits the read\n * and a narrow scan would drop the pair it depends on. Matching every custom\n * property costs nothing (a name the sheet does not declare is discarded) and makes\n * the closure correct for names this file does not know about.\n */\nconst TOKEN_REFERENCE = /var\\(\\s*(--[A-Za-z0-9-]+)/g;\n\n/**\n * A token name being assembled at runtime rather than written out.\n *\n * `style={{ color: `var(--tempest-${tone})` }}` names a token no static scan can\n * know, so a cut made without it would drop the one the app is about to read. The\n * caller falls back to the whole sheet when this matches — the same shape as the\n * plugin's own namespace-import fallback, and for the same reason: serve more than\n * asked for rather than less than needed.\n */\nconst DYNAMIC_TOKEN = /--tempest-[A-Za-z0-9-]*(?:\\$\\{|[\"'`]\\s*\\+|\\s*\\+\\s*[\"'`])/;\n\n/**\n * Parse a token stylesheet into its blocks.\n *\n * Written against the compiler's own output, which is already valid and flat — every\n * block in `tokens.css` is either a bare selector or one nested inside a single\n * at-rule — so a brace-depth reader is enough and a full parser would not be more\n * correct here.\n *\n * @param css - Contents of `tokens.css`.\n * @returns One entry per block that declares anything.\n */\nexport function parseTokenBlocks(css: string): TokenBlock[] {\n const blocks: TokenBlock[] = [];\n for (const match of css.matchAll(/([^{}]+)\\{([^{}]*)\\}/g)) {\n const declarations = new Map<string, string>();\n for (const declaration of (match[2] ?? \"\").split(\";\")) {\n const colon = declaration.indexOf(\":\");\n if (colon < 0) continue;\n const name = declaration.slice(0, colon).trim();\n if (name) declarations.set(name, declaration.slice(colon + 1).trim());\n }\n if (declarations.size === 0) continue;\n blocks.push({ selector: (match[1] ?? \"\").trim(), declarations });\n }\n return blocks;\n}\n\n/**\n * Every token a body of CSS reaches, following token-to-token references.\n *\n * @param blocks - The parsed token sheet.\n * @param usage - CSS and source text to scan for `var(--tempest-*)`.\n * @returns The reachable token names.\n */\nexport function reachableTokens(blocks: readonly TokenBlock[], usage: string): Set<string> {\n const declared = new Set<string>();\n for (const block of blocks) for (const name of block.declarations.keys()) declared.add(name);\n\n const reached = new Set<string>();\n const queue = [...usage.matchAll(TOKEN_REFERENCE)].map((match) => match[1] ?? \"\");\n while (queue.length > 0) {\n const token = queue.pop() ?? \"\";\n if (reached.has(token) || !declared.has(token)) continue;\n reached.add(token);\n for (const block of blocks) {\n const value = block.declarations.get(token);\n if (value === undefined) continue;\n for (const match of value.matchAll(TOKEN_REFERENCE)) queue.push(match[1] ?? \"\");\n }\n }\n return reached;\n}\n\n/**\n * Rebuild the token sheet with only the tokens a set of stylesheets reaches.\n *\n * Companion declarations that are not custom properties travel with the block that\n * survives — `color-scheme` is the one, and dropping it would leave the browser\n * painting its own surfaces (scrollbar, `<select>` popup, autofill) in the wrong\n * theme while every `.tempest_*` rule was correct.\n *\n * @param tokensCss - Contents of `tokens.css`.\n * @param usage - The CSS the app will load, plus its own source, scanned for reads.\n * @returns The narrowed sheet, or `null` when a token name is built at runtime and\n * no static answer is safe.\n */\nexport function narrowTokens(tokensCss: string, usage: string): string | null {\n if (DYNAMIC_TOKEN.test(usage)) return null;\n\n const blocks = parseTokenBlocks(tokensCss);\n const reached = reachableTokens(blocks, usage);\n if (reached.size === 0) return null;\n\n const out: string[] = [];\n for (const block of blocks) {\n const kept = [...block.declarations].filter(\n ([name]) => name.startsWith(\"--\") === false || reached.has(name),\n );\n if (kept.every(([name]) => name.startsWith(\"--\") === false)) continue;\n out.push(`${block.selector}{${kept.map(([name, value]) => `${name}:${value}`).join(\";\")}}`);\n }\n return out.join(\"\\n\");\n}\n"],"mappings":"AAoCA,IAAMA,EAAkB,6BAWlBC,EAAgB,2DAatB,SAAgBC,EAAiB,EAA2B,CACxD,IAAMC,EAAuB,CAAC,EAC9B,IAAK,IAAMC,KAASC,EAAI,SAAS,uBAAuB,EAAG,CACvD,IAAMC,EAAe,IAAI,IACzB,IAAK,IAAMC,KAAgBH,EAAM,IAAM,GAAA,CAAI,MAAM,GAAG,EAAG,CACnD,IAAMI,EAAQD,EAAY,QAAQ,GAAG,EACrC,GAAIC,EAAQ,EAAG,SACf,IAAMC,EAAOF,EAAY,MAAM,EAAGC,CAAK,CAAC,CAAC,KAAK,EAC1CC,GAAMH,EAAa,IAAIG,EAAMF,EAAY,MAAMC,EAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CACxE,CACIF,EAAa,OAAS,GAC1BH,EAAO,KAAK,CAAE,UAAWC,EAAM,IAAM,GAAA,CAAI,KAAK,EAAG,cAAa,CAAC,CACnE,CACA,OAAOD,CACX,CASA,SAAgBO,EAAgB,EAA+B,EAA4B,CACvF,IAAMC,EAAW,IAAI,IACrB,IAAK,IAAMC,KAAST,EAAQ,IAAK,IAAMM,KAAQG,EAAM,aAAa,KAAK,EAAGD,EAAS,IAAIF,CAAI,EAE3F,IAAMI,EAAU,IAAI,IACdC,EAAQ,CAAC,GAAGC,EAAM,SAASf,CAAe,CAAC,CAAC,CAAC,IAAK,GAAUI,EAAM,IAAM,EAAE,EAChF,KAAOU,EAAM,OAAS,GAAG,CACrB,IAAME,EAAQF,EAAM,IAAI,GAAK,GAC7B,GAAI,GAAQ,IAAIE,CAAK,GAAML,EAAS,IAAIK,CAAK,EAC7C,GAAQ,IAAIA,CAAK,EACjB,IAAK,IAAMJ,KAAST,EAAQ,CACxB,IAAMc,EAAQL,EAAM,aAAa,IAAII,CAAK,EAC1C,GAAIC,IAAU,IAAA,GACd,IAAK,IAAMb,KAASa,EAAM,SAASjB,CAAe,EAAGc,EAAM,KAAKV,EAAM,IAAM,EAAE,CAClF,CALiB,CAMrB,CACA,OAAOS,CACX,CAeA,SAAgBK,EAAa,EAAmB,EAA8B,CAC1E,GAAIjB,EAAc,KAAKc,CAAK,EAAG,OAAO,KAEtC,IAAMZ,EAASD,EAAiBiB,CAAS,EACnCN,EAAUH,EAAgBP,EAAQY,CAAK,EAC7C,GAAIF,EAAQ,OAAS,EAAG,OAAO,KAE/B,IAAMO,EAAgB,CAAC,EACvB,IAAK,IAAMR,KAAST,EAAQ,CACxB,IAAMkB,EAAO,CAAC,GAAGT,EAAM,YAAY,CAAC,CAAC,QAChC,CAACH,KAAUA,EAAK,WAAW,IAAI,IAAM,IAASI,EAAQ,IAAIJ,CAAI,CACnE,EACIY,EAAK,OAAO,CAACZ,KAAUA,EAAK,WAAW,IAAI,IAAM,EAAK,GAC1DW,EAAI,KAAK,GAAGR,EAAM,SAAS,GAAGS,EAAK,KAAK,CAACZ,EAAMQ,KAAW,GAAGR,EAAK,GAAGQ,GAAO,CAAC,CAAC,KAAK,GAAG,EAAE,EAAE,CAC9F,CACA,OAAOG,EAAI,KAAK;CAAI,CACxB,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"narrow-tokens.js","names":[],"sources":["../../src/vite/narrow-tokens.ts"],"sourcesContent":["/**\n * Cut the token sheet down to the tokens a set of stylesheets can reach.\n *\n * Once every component loads its own stylesheet, `tokens.css` stops being a rounding\n * error and becomes the biggest single thing an app downloads: measured on a probe\n * app mounting `Button`, `Card` and `Badge`, the sheet is 2516 B brotli of a 4927 B\n * total. The components read 105 of its 223 tokens, so the other 118 are bytes\n * nothing on the page can consult.\n *\n * The cut is a reachability closure, not a filter: a token's value routinely names\n * another token (`--tempest-primary: var(--tempest-primary-500)`), so keeping only\n * the names a stylesheet mentions literally would keep aliases whose targets were\n * dropped — `var()` would resolve to nothing and the component would render with the\n * property unset, which is worse than shipping the whole sheet.\n */\n\n/** A token block: one selector and the custom properties it declares, in order. */\ninterface TokenBlock {\n /** The block's selector text, e.g. `:root` or `[data-tempest-theme=dark]`. */\n selector: string;\n /** Declaration name → value, in source order. */\n declarations: Map<string, string>;\n}\n\n/**\n * Any custom property being read, not only the `--tempest-*` ones.\n *\n * Deliberately wider than the tokens this cut is about. `tokens.css` also carries\n * the `--lightningcss-light`/`--lightningcss-dark` pair the compiler emits, which\n * nothing reads today — measured: two declarations, zero reads — and which a\n * `--tempest-`-only scan would therefore always drop. That is the right answer right\n * up until one rule uses `light-dark()`, at which point the compiler emits the read\n * and a narrow scan would drop the pair it depends on. Matching every custom\n * property costs nothing (a name the sheet does not declare is discarded) and makes\n * the closure correct for names this file does not know about.\n */\nconst TOKEN_REFERENCE = /var\\(\\s*(--[A-Za-z0-9-]+)/g;\n\n/**\n * A token name being assembled at runtime rather than written out.\n *\n * `style={{ color: `var(--tempest-${tone})` }}` names a token no static scan can\n * know, so a cut made without it would drop the one the app is about to read. The\n * caller falls back to the whole sheet when this matches — the same shape as the\n * plugin's own namespace-import fallback, and for the same reason: serve more than\n * asked for rather than less than needed.\n */\nconst DYNAMIC_TOKEN = /--tempest-[A-Za-z0-9-]*(?:\\$\\{|[\"'`]\\s*\\+|\\s*\\+\\s*[\"'`])/;\n\n/**\n * Parse a token stylesheet into its blocks.\n *\n * Written against the compiler's own output, which is already valid and flat — every\n * block in `tokens.css` is either a bare selector or one nested inside a single\n * at-rule — so a brace-depth reader is enough and a full parser would not be more\n * correct here.\n *\n * @param css - Contents of `tokens.css`.\n * @returns One entry per block that declares anything.\n */\nexport function parseTokenBlocks(css: string): TokenBlock[] {\n const blocks: TokenBlock[] = [];\n for (const match of css.matchAll(/([^{}]+)\\{([^{}]*)\\}/g)) {\n const declarations = new Map<string, string>();\n for (const declaration of (match[2] ?? \"\").split(\";\")) {\n const colon = declaration.indexOf(\":\");\n if (colon < 0) continue;\n const name = declaration.slice(0, colon).trim();\n if (name) declarations.set(name, declaration.slice(colon + 1).trim());\n }\n if (declarations.size === 0) continue;\n blocks.push({ selector: (match[1] ?? \"\").trim(), declarations });\n }\n return blocks;\n}\n\n/**\n * Every token a body of CSS reaches, following token-to-token references.\n *\n * @param blocks - The parsed token sheet.\n * @param usage - CSS and source text to scan for `var(--tempest-*)`.\n * @returns The reachable token names.\n */\nexport function reachableTokens(blocks: readonly TokenBlock[], usage: string): Set<string> {\n const declared = new Set<string>();\n for (const block of blocks) for (const name of block.declarations.keys()) declared.add(name);\n\n const reached = new Set<string>();\n const queue = [...usage.matchAll(TOKEN_REFERENCE)].map((match) => match[1] ?? \"\");\n while (queue.length > 0) {\n const token = queue.pop() ?? \"\";\n if (reached.has(token) || !declared.has(token)) continue;\n reached.add(token);\n for (const block of blocks) {\n const value = block.declarations.get(token);\n if (value === undefined) continue;\n for (const match of value.matchAll(TOKEN_REFERENCE)) queue.push(match[1] ?? \"\");\n }\n }\n return reached;\n}\n\n/**\n * Rebuild the token sheet with only the tokens a set of stylesheets reaches.\n *\n * Companion declarations that are not custom properties travel with the block that\n * survives — `color-scheme` is the one, and dropping it would leave the browser\n * painting its own surfaces (scrollbar, `<select>` popup, autofill) in the wrong\n * theme while every `.tempest_*` rule was correct.\n *\n * @param tokensCss - Contents of `tokens.css`.\n * @param usage - The CSS the app will load, plus its own source, scanned for reads.\n * @returns The narrowed sheet, or `null` when a token name is built at runtime and\n * no static answer is safe.\n */\nexport function narrowTokens(tokensCss: string, usage: string): string | null {\n if (DYNAMIC_TOKEN.test(usage)) return null;\n\n const blocks = parseTokenBlocks(tokensCss);\n const reached = reachableTokens(blocks, usage);\n if (reached.size === 0) return null;\n\n const out: string[] = [];\n for (const block of blocks) {\n const kept = [...block.declarations].filter(\n ([name]) => name.startsWith(\"--\") === false || reached.has(name),\n );\n if (kept.every(([name]) => name.startsWith(\"--\") === false)) continue;\n out.push(`${block.selector}{${kept.map(([name, value]) => `${name}:${value}`).join(\";\")}}`);\n }\n return out.join(\"\\n\");\n}\n"],"mappings":";AAoCA,
|
|
1
|
+
{"version":3,"file":"narrow-tokens.js","names":["TOKEN_REFERENCE","DYNAMIC_TOKEN","parseTokenBlocks","blocks","match","css","declarations","declaration","colon","name","reachableTokens","declared","block","reached","queue","usage","token","value","narrowTokens","tokensCss","out","kept"],"sources":["../../src/vite/narrow-tokens.ts"],"sourcesContent":["/**\n * Cut the token sheet down to the tokens a set of stylesheets can reach.\n *\n * Once every component loads its own stylesheet, `tokens.css` stops being a rounding\n * error and becomes the biggest single thing an app downloads: measured on a probe\n * app mounting `Button`, `Card` and `Badge`, the sheet is 2516 B brotli of a 4927 B\n * total. The components read 105 of its 223 tokens, so the other 118 are bytes\n * nothing on the page can consult.\n *\n * The cut is a reachability closure, not a filter: a token's value routinely names\n * another token (`--tempest-primary: var(--tempest-primary-500)`), so keeping only\n * the names a stylesheet mentions literally would keep aliases whose targets were\n * dropped — `var()` would resolve to nothing and the component would render with the\n * property unset, which is worse than shipping the whole sheet.\n */\n\n/** A token block: one selector and the custom properties it declares, in order. */\ninterface TokenBlock {\n /** The block's selector text, e.g. `:root` or `[data-tempest-theme=dark]`. */\n selector: string;\n /** Declaration name → value, in source order. */\n declarations: Map<string, string>;\n}\n\n/**\n * Any custom property being read, not only the `--tempest-*` ones.\n *\n * Deliberately wider than the tokens this cut is about. `tokens.css` also carries\n * the `--lightningcss-light`/`--lightningcss-dark` pair the compiler emits, which\n * nothing reads today — measured: two declarations, zero reads — and which a\n * `--tempest-`-only scan would therefore always drop. That is the right answer right\n * up until one rule uses `light-dark()`, at which point the compiler emits the read\n * and a narrow scan would drop the pair it depends on. Matching every custom\n * property costs nothing (a name the sheet does not declare is discarded) and makes\n * the closure correct for names this file does not know about.\n */\nconst TOKEN_REFERENCE = /var\\(\\s*(--[A-Za-z0-9-]+)/g;\n\n/**\n * A token name being assembled at runtime rather than written out.\n *\n * `style={{ color: `var(--tempest-${tone})` }}` names a token no static scan can\n * know, so a cut made without it would drop the one the app is about to read. The\n * caller falls back to the whole sheet when this matches — the same shape as the\n * plugin's own namespace-import fallback, and for the same reason: serve more than\n * asked for rather than less than needed.\n */\nconst DYNAMIC_TOKEN = /--tempest-[A-Za-z0-9-]*(?:\\$\\{|[\"'`]\\s*\\+|\\s*\\+\\s*[\"'`])/;\n\n/**\n * Parse a token stylesheet into its blocks.\n *\n * Written against the compiler's own output, which is already valid and flat — every\n * block in `tokens.css` is either a bare selector or one nested inside a single\n * at-rule — so a brace-depth reader is enough and a full parser would not be more\n * correct here.\n *\n * @param css - Contents of `tokens.css`.\n * @returns One entry per block that declares anything.\n */\nexport function parseTokenBlocks(css: string): TokenBlock[] {\n const blocks: TokenBlock[] = [];\n for (const match of css.matchAll(/([^{}]+)\\{([^{}]*)\\}/g)) {\n const declarations = new Map<string, string>();\n for (const declaration of (match[2] ?? \"\").split(\";\")) {\n const colon = declaration.indexOf(\":\");\n if (colon < 0) continue;\n const name = declaration.slice(0, colon).trim();\n if (name) declarations.set(name, declaration.slice(colon + 1).trim());\n }\n if (declarations.size === 0) continue;\n blocks.push({ selector: (match[1] ?? \"\").trim(), declarations });\n }\n return blocks;\n}\n\n/**\n * Every token a body of CSS reaches, following token-to-token references.\n *\n * @param blocks - The parsed token sheet.\n * @param usage - CSS and source text to scan for `var(--tempest-*)`.\n * @returns The reachable token names.\n */\nexport function reachableTokens(blocks: readonly TokenBlock[], usage: string): Set<string> {\n const declared = new Set<string>();\n for (const block of blocks) for (const name of block.declarations.keys()) declared.add(name);\n\n const reached = new Set<string>();\n const queue = [...usage.matchAll(TOKEN_REFERENCE)].map((match) => match[1] ?? \"\");\n while (queue.length > 0) {\n const token = queue.pop() ?? \"\";\n if (reached.has(token) || !declared.has(token)) continue;\n reached.add(token);\n for (const block of blocks) {\n const value = block.declarations.get(token);\n if (value === undefined) continue;\n for (const match of value.matchAll(TOKEN_REFERENCE)) queue.push(match[1] ?? \"\");\n }\n }\n return reached;\n}\n\n/**\n * Rebuild the token sheet with only the tokens a set of stylesheets reaches.\n *\n * Companion declarations that are not custom properties travel with the block that\n * survives — `color-scheme` is the one, and dropping it would leave the browser\n * painting its own surfaces (scrollbar, `<select>` popup, autofill) in the wrong\n * theme while every `.tempest_*` rule was correct.\n *\n * @param tokensCss - Contents of `tokens.css`.\n * @param usage - The CSS the app will load, plus its own source, scanned for reads.\n * @returns The narrowed sheet, or `null` when a token name is built at runtime and\n * no static answer is safe.\n */\nexport function narrowTokens(tokensCss: string, usage: string): string | null {\n if (DYNAMIC_TOKEN.test(usage)) return null;\n\n const blocks = parseTokenBlocks(tokensCss);\n const reached = reachableTokens(blocks, usage);\n if (reached.size === 0) return null;\n\n const out: string[] = [];\n for (const block of blocks) {\n const kept = [...block.declarations].filter(\n ([name]) => name.startsWith(\"--\") === false || reached.has(name),\n );\n if (kept.every(([name]) => name.startsWith(\"--\") === false)) continue;\n out.push(`${block.selector}{${kept.map(([name, value]) => `${name}:${value}`).join(\";\")}}`);\n }\n return out.join(\"\\n\");\n}\n"],"mappings":";AAoCA,IAAMA,IAAkB,8BAWlBC,IAAgB;AAatB,SAAgBC,EAAiB,GAA2B;CACxD,IAAMC,IAAuB,CAAC;CAC9B,KAAK,IAAMC,KAASC,EAAI,SAAS,uBAAuB,GAAG;EACvD,IAAMC,oBAAe,IAAI,IAAoB;EAC7C,KAAK,IAAMC,MAAgBH,EAAM,MAAM,GAAA,CAAI,MAAM,GAAG,GAAG;GACnD,IAAMI,IAAQD,EAAY,QAAQ,GAAG;GACrC,IAAIC,IAAQ,GAAG;GACf,IAAMC,IAAOF,EAAY,MAAM,GAAGC,CAAK,CAAC,CAAC,KAAK;GAC9C,AAAIC,KAAMH,EAAa,IAAIG,GAAMF,EAAY,MAAMC,IAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;EACxE;EACA,AAAIF,EAAa,SAAS,KAC1BH,EAAO,KAAK;GAAE,WAAWC,EAAM,MAAM,GAAA,CAAI,KAAK;GAAG;EAAa,CAAC;CACnE;CACA,OAAOD;AACX;AASA,SAAgBO,EAAgB,GAA+B,GAA4B;CACvF,IAAMC,oBAAW,IAAI,IAAY;CACjC,KAAK,IAAMC,KAAST,GAAQ,KAAK,IAAMM,KAAQG,EAAM,aAAa,KAAK,GAAG,EAAS,IAAIH,CAAI;CAE3F,IAAMI,oBAAU,IAAI,IAAY,GAC1BC,IAAQ,CAAC,GAAGC,EAAM,SAASf,CAAe,CAAC,CAAC,CAAC,KAAK,MAAUI,EAAM,MAAM,EAAE;CAChF,OAAOU,EAAM,SAAS,IAAG;EACrB,IAAME,IAAQF,EAAM,IAAI,KAAK;EAC7B,IAAI,GAAQ,IAAIE,CAAK,KAAML,EAAS,IAAIK,CAAK,GAC7C;KAAQ,IAAIA,CAAK;GACjB,KAAK,IAAMJ,KAAST,GAAQ;IACxB,IAAMc,IAAQL,EAAM,aAAa,IAAII,CAAK;IAC1C,IAAIC,MAAU,KAAA,GACd,KAAK,IAAMb,KAASa,EAAM,SAASjB,CAAe,GAAG,EAAM,KAAKI,EAAM,MAAM,EAAE;GAClF;EALiB;CAMrB;CACA,OAAOS;AACX;AAeA,SAAgBK,EAAa,GAAmB,GAA8B;CAC1E,IAAIjB,EAAc,KAAKc,CAAK,GAAG,OAAO;CAEtC,IAAMZ,IAASD,EAAiBiB,CAAS,GACnCN,IAAUH,EAAgBP,GAAQY,CAAK;CAC7C,IAAIF,EAAQ,SAAS,GAAG,OAAO;CAE/B,IAAMO,IAAgB,CAAC;CACvB,KAAK,IAAMR,KAAST,GAAQ;EACxB,IAAMkB,IAAO,CAAC,GAAGT,EAAM,YAAY,CAAC,CAAC,QAChC,CAACH,OAAUA,EAAK,WAAW,IAAI,MAAM,MAASI,EAAQ,IAAIJ,CAAI,CACnE;EACA,AAAIY,EAAK,OAAO,CAACZ,OAAUA,EAAK,WAAW,IAAI,MAAM,EAAK,KAC1DW,EAAI,KAAK,GAAGR,EAAM,SAAS,GAAGS,EAAK,KAAK,CAACZ,GAAMQ,OAAW,GAAGR,EAAK,GAAGQ,GAAO,CAAC,CAAC,KAAK,GAAG,EAAE,EAAE;CAC9F;CACA,OAAOG,EAAI,KAAK,IAAI;AACxB"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
let e=require("node:crypto");var t=new Set([`frame-ancestors`,`report-uri`,`sandbox`]),n=[{module:/[\\/]forms[\\/]use-viacep\.(?:[cm]?js|tsx?)$/,origin:`https://viacep.com.br`,from:`tempest-react-sdk useViaCEP`}],r={"script-src-elem":[`script-src`,`default-src`],"script-src-attr":[`script-src`,`default-src`],"style-src-elem":[`style-src`,`default-src`],"style-src-attr":[`style-src`,`default-src`],"worker-src":[`child-src`,`script-src`,`default-src`],"frame-src":[`child-src`,`default-src`],"fenced-frame-src":[`frame-src`,`child-src`,`default-src`],"child-src":[`default-src`],"connect-src":[`default-src`],"font-src":[`default-src`],"img-src":[`default-src`],"manifest-src":[`default-src`],"media-src":[`default-src`],"object-src":[`default-src`],"prefetch-src":[`default-src`],"script-src":[`default-src`],"style-src":[`default-src`]};function i(e,t){for(let n of r[t]??[])if(n in e)return e[n]}var a=/^(?:https?|wss?):\/\//i,o=/^((?:https?|wss?):\/\/\*\.[a-z0-9.-]+(?::\d+)?)(?:[/?#].*)?$/i;function s(e,t){let n=e.trim();if(n.startsWith(`/`)&&!n.startsWith(`//`))return;let r=o.exec(n);if(r)return r[1].toLowerCase();if(a.test(n))try{let e=new URL(n);return`${e.protocol}//${e.host}`}catch{throw Error(`tempestCsp: ${t} is not a valid URL: "${e}"`)}throw Error(`tempestCsp: ${t} must be an absolute http(s)/ws(s) URL or a root-relative path, got "${e}"`)}function c(e){let t={};for(let n of e.split(`;`)){let[e,...r]=n.trim().split(/\s+/);if(!e)continue;let i=e.toLowerCase();i in t||(t[i]=r)}return t}function l(e,n){return Object.entries(e).filter(([e])=>n===`header`||!t.has(e)).map(([e,t])=>[e,...t].join(` `)).join(`; `)}function u(e,t){return e.toLowerCase()===t}function d(e){return e.every(e=>u(e,`'none'`))}function f(e){return e.replace(/^'(?:sha\d{3}|nonce)-/i,e=>e.toLowerCase())}function p(e,t){let n=e.filter(e=>!u(e,`'none'`)||t.length===0);for(let e of t)n.includes(e)||n.push(e);return n.length===0?[`'none'`]:n}function m(t){return`'sha256-${(0,e.createHash)(`sha256`).update(t,`utf8`).digest(`base64`)}'`}function h(e){return e.replace(/'|'|'/gi,`'`).replace(/"/gi,`"`).replace(/&/gi,`&`)}function g(e){let t={};for(let n of e.matchAll(/([^\s=<>/]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g))t[n[1].toLowerCase()]=h(n[2]??n[3]??n[4]??``);return t}function _(e){let t=[...e.matchAll(/<meta\b[^>]*>/gi)].filter(e=>g(e[0])[`http-equiv`]?.toLowerCase()===`content-security-policy`);if(t.length===0)return{html:e};if(t.length>1)throw Error(`tempestCsp: index.html declares more than one Content-Security-Policy <meta>; merge them into one`);let n=t[0];return{html:e.slice(0,n.index)+e.slice(n.index+n[0].length).replace(/^[ \t]*\r?\n/,``),declared:c(g(n[0]).content??``)}}function v(e,t){let n=RegExp(`<${t}\\b([^>]*)>([\\s\\S]*?)</${t}>`,`gi`),r=[];for(let i of e.matchAll(n)){let e=g(`<x ${i[1]}>`);if(t===`script`&&`src`in e||i[2].length===0)continue;let n=m(i[2]);r.includes(n)||r.push(n)}return r}function y(e,t){let n=`<meta http-equiv="Content-Security-Policy" content="${t.replace(/&/g,`&`).replace(/"/g,`"`)}" />`,r=/<meta\b[^>]*\bcharset\s*=[^>]*>/i.exec(e),i=/<head\b[^>]*>/i.exec(e),a=r!==null&&i!==null&&/<(?:script|link|style)\b/i.test(e.slice(i.index,r.index)),o=r&&i&&r.index>i.index&&!a?r:i;if(!o)return`${n}\n${e}`;let s=o.index+o[0].length;return`${e.slice(0,s)}\n ${n}${e.slice(s)}`}function b(e){let t=[];for(let n of Object.values(e.bundle??{}))n.type===`chunk`&&t.push(...n.moduleIds??Object.keys(n.modules??{}));return t}function x(e={}){let{connect:t=[],env:r=!0,sockets:o=!0,wasm:c=!0,inlineStyles:m=!0,directives:h={},dev:g=!0,log:x=!0,onPolicy:S}=e,C=Object.fromEntries(Object.entries(h).map(([e,t])=>[e.toLowerCase(),t])),w,T=[],E=``;function D(e,t,n){t===void 0||e.some(e=>e.origin===t)||e.push({origin:t,from:n})}function O(e){let n=[],i=e.env??{},o=[e.envPrefix??`VITE_`].flat();if(r===!0)for(let[e,t]of Object.entries(i))o.some(t=>e.startsWith(t))&&typeof t==`string`&&a.test(t.trim())&&D(n,s(t,`env ${e}`),`env ${e}`);else if(Array.isArray(r))for(let t of r){let r=i[t];
|
|
1
|
+
let e=require("node:crypto");var t=new Set([`frame-ancestors`,`report-uri`,`sandbox`]),n=[{module:/[\\/]forms[\\/]use-viacep\.(?:[cm]?js|tsx?)$/,origin:`https://viacep.com.br`,from:`tempest-react-sdk useViaCEP`}],r={"script-src-elem":[`script-src`,`default-src`],"script-src-attr":[`script-src`,`default-src`],"style-src-elem":[`style-src`,`default-src`],"style-src-attr":[`style-src`,`default-src`],"worker-src":[`child-src`,`script-src`,`default-src`],"frame-src":[`child-src`,`default-src`],"fenced-frame-src":[`frame-src`,`child-src`,`default-src`],"child-src":[`default-src`],"connect-src":[`default-src`],"font-src":[`default-src`],"img-src":[`default-src`],"manifest-src":[`default-src`],"media-src":[`default-src`],"object-src":[`default-src`],"prefetch-src":[`default-src`],"script-src":[`default-src`],"style-src":[`default-src`]};function i(e,t){for(let n of r[t]??[])if(n in e)return e[n]}var a=/^(?:https?|wss?):\/\//i,o=/^((?:https?|wss?):\/\/\*\.[a-z0-9.-]+(?::\d+)?)(?:[/?#].*)?$/i;function s(e,t){let n=e.trim();if(n.startsWith(`/`)&&!n.startsWith(`//`))return;let r=o.exec(n);if(r)return r[1].toLowerCase();if(a.test(n))try{let e=new URL(n);return`${e.protocol}//${e.host}`}catch{throw Error(`tempestCsp: ${t} is not a valid URL: "${e}"`)}throw Error(`tempestCsp: ${t} must be an absolute http(s)/ws(s) URL or a root-relative path, got "${e}"`)}function c(e){let t={};for(let n of e.split(`;`)){let[e,...r]=n.trim().split(/\s+/);if(!e)continue;let i=e.toLowerCase();i in t||(t[i]=r)}return t}function l(e,n){return Object.entries(e).filter(([e])=>n===`header`||!t.has(e)).map(([e,t])=>[e,...t].join(` `)).join(`; `)}function u(e,t){return e.toLowerCase()===t}function d(e){return e.every(e=>u(e,`'none'`))}function f(e){return e.replace(/^'(?:sha\d{3}|nonce)-/i,e=>e.toLowerCase())}function p(e,t){let n=e.filter(e=>!u(e,`'none'`)||t.length===0);for(let e of t)n.includes(e)||n.push(e);return n.length===0?[`'none'`]:n}function m(t){return`'sha256-${(0,e.createHash)(`sha256`).update(t,`utf8`).digest(`base64`)}'`}function h(e){return e.replace(/'|'|'/gi,`'`).replace(/"/gi,`"`).replace(/&/gi,`&`)}function g(e){let t={};for(let n of e.matchAll(/([^\s=<>/]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/g))t[n[1].toLowerCase()]=h(n[2]??n[3]??n[4]??``);return t}function _(e){let t=[...e.matchAll(/<meta\b[^>]*>/gi)].filter(e=>g(e[0])[`http-equiv`]?.toLowerCase()===`content-security-policy`);if(t.length===0)return{html:e};if(t.length>1)throw Error(`tempestCsp: index.html declares more than one Content-Security-Policy <meta>; merge them into one`);let n=t[0];return{html:e.slice(0,n.index)+e.slice(n.index+n[0].length).replace(/^[ \t]*\r?\n/,``),declared:c(g(n[0]).content??``)}}function v(e,t){let n=RegExp(`<${t}\\b([^>]*)>([\\s\\S]*?)</${t}>`,`gi`),r=[];for(let i of e.matchAll(n)){let e=g(`<x ${i[1]}>`);if(t===`script`&&`src`in e||i[2].length===0)continue;let n=m(i[2]);r.includes(n)||r.push(n)}return r}function y(e,t){let n=`<meta http-equiv="Content-Security-Policy" content="${t.replace(/&/g,`&`).replace(/"/g,`"`)}" />`,r=/<meta\b[^>]*\bcharset\s*=[^>]*>/i.exec(e),i=/<head\b[^>]*>/i.exec(e),a=r!==null&&i!==null&&/<(?:script|link|style)\b/i.test(e.slice(i.index,r.index)),o=r&&i&&r.index>i.index&&!a?r:i;if(!o)return`${n}\n${e}`;let s=o.index+o[0].length;return`${e.slice(0,s)}\n ${n}${e.slice(s)}`}function b(e){let t=[];for(let n of Object.values(e.bundle??{}))n.type===`chunk`&&t.push(...n.moduleIds??Object.keys(n.modules??{}));return t}function x(e={}){let{connect:t=[],env:r=!0,sockets:o=!0,wasm:c=!0,inlineStyles:m=!0,directives:h={},dev:g=!0,log:x=!0,onPolicy:S}=e,C=Object.fromEntries(Object.entries(h).map(([e,t])=>[e.toLowerCase(),t])),w,T=[],E=``;function D(e,t,n){t===void 0||e.some(e=>e.origin===t)||e.push({origin:t,from:n})}function O(e){let n=[],i=e.env??{},o=[e.envPrefix??`VITE_`].flat();if(r===!0)for(let[e,t]of Object.entries(i))o.some(t=>e.startsWith(t))&&typeof t==`string`&&a.test(t.trim())&&D(n,s(t,`env ${e}`),`env ${e}`);else if(Array.isArray(r))for(let t of r){let r=i[t];typeof r!=`string`||r.trim()===``?e.logger.warn(`tempestCsp: env ${t} is empty — nothing added to connect-src`):D(n,s(r,`env ${t}`),`env ${t}`)}return t.forEach((t,r)=>{!t||t.trim()===``?e.logger.warn(`tempestCsp: connect[${r}] is empty — skipped, nothing added to connect-src`):D(n,s(t,`connect[${r}]`),`connect[${r}]`)}),n}function k(e){let t=[...e];if(!o)return t;for(let{origin:n}of e){let e=n.replace(/^http(s?):/i,`ws$1:`);e!==n&&D(t,e,`sockets (${n})`)}return t}function A(e,t){let n=e?[`'self'`,e]:[`'self'`],r={"default-src":[...n],"script-src":c?[...n,`'wasm-unsafe-eval'`]:[...n],"style-src":m||t?[...n,`'unsafe-inline'`]:[...n],"img-src":[...n,`data:`,`blob:`],"font-src":[...n,`data:`],"media-src":[...n,`blob:`],"connect-src":[`'self'`,`blob:`,`data:`],"worker-src":[...n,`blob:`],"manifest-src":[...n],"object-src":[`'none'`],"base-uri":[`'self'`],"form-action":[`'self'`]};for(let[e,t]of Object.entries(C))t===!1?delete r[e]:r[e]=p(r[e]??[],t);return r}function j(e,t){let n={};for(let[r,a]of Object.entries(e)){if(r in t){n[r]=t[r];continue}let e=i(t,r),o=C[r];e===void 0?n[r]=a:Array.isArray(o)?n[r]=p(e,o):a.length>0&&d(a)&&(n[r]=a)}for(let[e,r]of Object.entries(t))n[e]??=r;for(let[e,r]of Object.entries(C)){if(!(e in t))continue;if(r===!1){delete n[e];continue}let i=r.filter(n=>!t[e].includes(n));i.length>0&&w?.logger.warn(`tempestCsp: index.html declares ${e}, so directives["${e}"] is not added to it (${i.join(` `)}); the plugin never loosens a declared policy — add them to the <meta> instead`)}return n}function M(e,t,n){if(!n||!w)return;let r=n.map(f);if(n.some(e=>u(e,`'unsafe-inline'`))&&!r.some(e=>/^'(?:sha\d{3}|nonce)-/.test(e)))return;let i=v(e,`script`).filter(e=>!r.includes(e));i.length!==0&&w.logger.warn(`tempestCsp: the Content-Security-Policy declared in index.html blocks ${i.length} inline <script> (${t} ${n.join(` `)}); the plugin never loosens a declared policy, so add ${i.join(` `)} to ${t}`)}return{name:`tempest-csp`,configResolved(e){w=e,T=O(e)},transformIndexHtml:{order:`post`,handler(e,t){let r=w?.command===`serve`;if(r&&!g)return e;let o=k(T),c=w?.base??`/`,f=a.test(c)?s(c,`base`):void 0;f&&D(o,f,`base`);let m=r?[]:b(t);for(let e of n)(r||m.some(t=>e.module.test(t)))&&D(o,e.origin,e.from);let h=o,{html:C,declared:O={}}=_(e),N=A(f,r),P=e=>!(e in O)&&i(O,e)===void 0;P(`script-src`)&&!(`script-src-elem`in O)&&(N[`script-src`]=p(N[`script-src`]??[],v(C,`script`))),P(`style-src`)&&!(`style-src-elem`in O)&&!N[`style-src`]?.some(e=>u(e,`'unsafe-inline'`))&&(N[`style-src`]=p(N[`style-src`]??[],v(C,`style`)));let F=j(N,O),I=h.map(e=>e.origin),L=i(O,`connect-src`),R=F[`connect-src`]??L;R!==void 0&&d(R)&&(`connect-src`in O||L!==void 0)?I.length>0&&w?.logger.warn(`tempestCsp: index.html declares connect-src ${R.join(` `)||`with no source`}${`connect-src`in O?``:` (through default-src)`}, so these origins stay out and requests to them will be blocked: ${I.join(` `)}`):(`connect-src`in F||I.length>0||L===void 0)&&(F[`connect-src`]=p(R??[`'self'`],I));let z=`script-src-elem`in O?`script-src-elem`:`script-src`;M(C,z,F[z]??i(O,z));let B={directives:F,meta:l(F,`meta`),header:l(F,`header`),connect:h,command:r?`serve`:`build`};if(x&&w&&B.header!==E){E=B.header;let e=h.map(e=>` ${e.origin} ← ${e.from}`);w.logger.info([`tempest-csp: connect-src ${(F[`connect-src`]??L??[]).join(` `)}`,...e.length>0?e:[` (no cross-origin endpoint: only 'self')`]].join(`
|
|
2
2
|
`))}return S?.(B),y(C,B.meta)}}}}exports.cspOrigin=s,exports.parseCsp=c,exports.serializeCsp=l,exports.tempestCsp=x;
|
|
3
3
|
//# sourceMappingURL=tempest-csp.cjs.map
|