tempest-react-sdk 0.77.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/alias/collect.mjs +20 -3
- package/bin/lib/alias/index.mjs +12 -1
- package/bin/lib/alias/index.test.mjs +24 -0
- package/bin/lib/css/analyze.test.mjs +21 -1
- package/bin/lib/css/collect.mjs +14 -0
- package/bin/lib/css/extract.mjs +63 -5
- package/bin/lib/css/extract.test.mjs +110 -1
- package/bin/lib/css/fix.e2e.test.mjs +50 -0
- package/bin/lib/css/index.mjs +6 -1
- package/bin/lib/fs/contain.mjs +50 -0
- package/bin/lib/icons/generate.mjs +28 -3
- package/bin/lib/icons/generate.test.mjs +57 -1
- package/bin/lib/openapi/escape.mjs +20 -6
- package/bin/lib/openapi/generate.encode.test.mjs +120 -0
- package/bin/lib/openapi/generate.hostile.test.mjs +38 -9
- package/bin/lib/openapi/generate.mjs +203 -64
- package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
- package/bin/lib/openapi/generate.test.mjs +270 -3
- package/bin/lib/openapi/schema-to-zod.mjs +5 -3
- package/bin/tempest-gen.test.mjs +188 -0
- package/bin/tempest.mjs +120 -44
- 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 +185 -114
- 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 -71
- 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 +16 -5
- 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 +1 -1
- package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.js +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 +1 -1
- package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
- package/dist/components/CodeBlock/tokenize.js +54 -25
- 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 +6 -6
- package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
- package/dist/components/Markdown/markdown-parse.js +94 -96
- 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 +1 -1
- package/dist/http/resumable-upload.cjs.map +1 -1
- package/dist/http/resumable-upload.js +141 -105
- package/dist/http/resumable-upload.js.map +1 -1
- package/dist/http/retry.cjs +1 -1
- package/dist/http/retry.cjs.map +1 -1
- package/dist/http/retry.js +5 -6
- 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 +1 -1
- package/dist/sw/background-sync.cjs.map +1 -1
- package/dist/sw/background-sync.js +32 -31
- 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/sw.d.ts +46 -8
- 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 +1 -1
- package/dist/telemetry/app-error-reporter.cjs.map +1 -1
- package/dist/telemetry/app-error-reporter.js +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 +448 -15
- package/dist/tempest-react-sdk.js +119 -119
- 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 +3 -3
- package/dist/utils/csv.cjs.map +1 -1
- package/dist/utils/csv.js +11 -10
- 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/{telemetry/app-error-owner.cjs → utils/owner-fingerprint.cjs} +2 -2
- package/dist/utils/owner-fingerprint.cjs.map +1 -0
- package/dist/{telemetry/app-error-owner.js → utils/owner-fingerprint.js} +3 -3
- package/dist/utils/owner-fingerprint.js.map +1 -0
- 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 +2 -2
- package/dist/vite/tempest-csp.cjs.map +1 -1
- package/dist/vite/tempest-csp.js +69 -66
- 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/vite.d.ts +5 -3
- 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/telemetry/app-error-owner.cjs.map +0 -1
- package/dist/telemetry/app-error-owner.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordInput.cjs","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — on top of the SDK's shared field props,\n * showStrength/strength/strengthLabels are the meter and toggleLabels is the\n * show/hide button's accessible name — both need their copy from the app, since\n * neither can be translated by the SDK.\n */\nimport { forwardRef, useId, useState } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PasswordInput.module.css\";\n\nexport type PasswordStrength = 0 | 1 | 2 | 3 | 4;\n\nexport interface PasswordInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\"\n> {\n /** Label rendered above the input. */\n label?: ReactNode;\n /** Helper text below — replaced by `error` when set. */\n helperText?: ReactNode;\n /** Error message. Adds `aria-invalid` + red border. */\n error?: string;\n /** Visual size of the input. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show a strength meter below the field. Default `false`. */\n showStrength?: boolean;\n /** Override the automatic strength calc (0–4). */\n strength?: PasswordStrength;\n /** Custom labels per strength level (5 entries). */\n strengthLabels?: readonly [string, string, string, string, string];\n /** Custom toggle button labels for accessibility. */\n toggleLabels?: { show: string; hide: string };\n}\n\nconst DEFAULT_STRENGTH_LABELS = [\"Muito fraca\", \"Fraca\", \"Razoável\", \"Forte\", \"Excelente\"] as const;\n\nexport function estimatePasswordStrength(value: string): PasswordStrength {\n if (!value) return 0;\n let score = 0;\n if (value.length >= 8) score += 1;\n if (value.length >= 12) score += 1;\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1;\n if (/[0-9]/.test(value)) score += 1;\n if (/[^A-Za-z0-9]/.test(value)) score += 1;\n return Math.min(4, score) as PasswordStrength;\n}\n\n/**\n * Password field with toggle-visibility button and optional strength meter.\n *\n * @example\n * <PasswordInput label=\"Senha\" showStrength autoComplete=\"new-password\" />\n */\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n {\n label,\n helperText,\n error,\n size = \"md\",\n showStrength = false,\n strength,\n strengthLabels = DEFAULT_STRENGTH_LABELS,\n toggleLabels = { show: \"Mostrar senha\", hide: \"Esconder senha\" },\n className,\n value,\n defaultValue,\n id,\n ...inputProps\n },\n ref,\n ) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const describedById = error\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined;\n const [revealed, setRevealed] = useState<boolean>(false);\n const stringValue = String((value ?? defaultValue ?? \"\") as string);\n const computedStrength: PasswordStrength =\n strength ?? estimatePasswordStrength(stringValue);\n\n return (\n <div className={cn(styles.wrapper, styles[size], error && styles.error, className)}>\n {label && (\n <label htmlFor={inputId} className={styles.label}>\n {label}\n </label>\n )}\n <div className={styles.field}>\n <input\n ref={ref}\n {...inputProps}\n id={inputId}\n value={value}\n defaultValue={defaultValue}\n type={revealed ? \"text\" : \"password\"}\n aria-invalid={!!error}\n aria-describedby={describedById}\n className={styles.input}\n />\n <button\n type=\"button\"\n className={styles.toggle}\n aria-label={revealed ? toggleLabels.hide : toggleLabels.show}\n aria-pressed={revealed}\n onClick={() => setRevealed((on) => !on)}\n >\n {revealed ? \"🙈\" : \"👁\"}\n </button>\n </div>\n {showStrength && (\n <div\n className={cn(styles.strength, styles[`level${computedStrength}`])}\n aria-label={strengthLabels[computedStrength]}\n >\n <div className={styles.strengthBar}>\n <span style={{ width: `${(computedStrength / 4) * 100}%` }} />\n </div>\n <span className={styles.strengthLabel}>\n {strengthLabels[computedStrength]}\n </span>\n </div>\n )}\n {error ? (\n <span id={`${inputId}-error`} className={styles.errorText}>\n {error}\n </span>\n ) : helperText ? (\n <span id={`${inputId}-helper`} className={styles.helper}>\n {helperText}\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":"oIAmCA,
|
|
1
|
+
{"version":3,"file":"PasswordInput.cjs","names":["forwardRef","useId","useState","cn","styles","require_cn","require_PasswordInput_module","react","react_jsx_runtime","DEFAULT_STRENGTH_LABELS","estimatePasswordStrength","value","score","PasswordInput","inputProps","generatedId","inputId","id","describedById","error","helperText","revealed","setRevealed","computedStrength","strength","defaultValue","size","className","label","toggleLabels","on","showStrength","strengthLabels"],"sources":["../../../src/components/PasswordInput/PasswordInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — on top of the SDK's shared field props,\n * showStrength/strength/strengthLabels are the meter and toggleLabels is the\n * show/hide button's accessible name — both need their copy from the app, since\n * neither can be translated by the SDK.\n */\nimport { forwardRef, useId, useState } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PasswordInput.module.css\";\n\nexport type PasswordStrength = 0 | 1 | 2 | 3 | 4;\n\nexport interface PasswordInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\"\n> {\n /** Label rendered above the input. */\n label?: ReactNode;\n /** Helper text below — replaced by `error` when set. */\n helperText?: ReactNode;\n /** Error message. Adds `aria-invalid` + red border. */\n error?: string;\n /** Visual size of the input. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show a strength meter below the field. Default `false`. */\n showStrength?: boolean;\n /** Override the automatic strength calc (0–4). */\n strength?: PasswordStrength;\n /** Custom labels per strength level (5 entries). */\n strengthLabels?: readonly [string, string, string, string, string];\n /** Custom toggle button labels for accessibility. */\n toggleLabels?: { show: string; hide: string };\n}\n\nconst DEFAULT_STRENGTH_LABELS = [\"Muito fraca\", \"Fraca\", \"Razoável\", \"Forte\", \"Excelente\"] as const;\n\nexport function estimatePasswordStrength(value: string): PasswordStrength {\n if (!value) return 0;\n let score = 0;\n if (value.length >= 8) score += 1;\n if (value.length >= 12) score += 1;\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1;\n if (/[0-9]/.test(value)) score += 1;\n if (/[^A-Za-z0-9]/.test(value)) score += 1;\n return Math.min(4, score) as PasswordStrength;\n}\n\n/**\n * Password field with toggle-visibility button and optional strength meter.\n *\n * @example\n * <PasswordInput label=\"Senha\" showStrength autoComplete=\"new-password\" />\n */\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n {\n label,\n helperText,\n error,\n size = \"md\",\n showStrength = false,\n strength,\n strengthLabels = DEFAULT_STRENGTH_LABELS,\n toggleLabels = { show: \"Mostrar senha\", hide: \"Esconder senha\" },\n className,\n value,\n defaultValue,\n id,\n ...inputProps\n },\n ref,\n ) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const describedById = error\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined;\n const [revealed, setRevealed] = useState<boolean>(false);\n const stringValue = String((value ?? defaultValue ?? \"\") as string);\n const computedStrength: PasswordStrength =\n strength ?? estimatePasswordStrength(stringValue);\n\n return (\n <div className={cn(styles.wrapper, styles[size], error && styles.error, className)}>\n {label && (\n <label htmlFor={inputId} className={styles.label}>\n {label}\n </label>\n )}\n <div className={styles.field}>\n <input\n ref={ref}\n {...inputProps}\n id={inputId}\n value={value}\n defaultValue={defaultValue}\n type={revealed ? \"text\" : \"password\"}\n aria-invalid={!!error}\n aria-describedby={describedById}\n className={styles.input}\n />\n <button\n type=\"button\"\n className={styles.toggle}\n aria-label={revealed ? toggleLabels.hide : toggleLabels.show}\n aria-pressed={revealed}\n onClick={() => setRevealed((on) => !on)}\n >\n {revealed ? \"🙈\" : \"👁\"}\n </button>\n </div>\n {showStrength && (\n <div\n className={cn(styles.strength, styles[`level${computedStrength}`])}\n aria-label={strengthLabels[computedStrength]}\n >\n <div className={styles.strengthBar}>\n <span style={{ width: `${(computedStrength / 4) * 100}%` }} />\n </div>\n <span className={styles.strengthLabel}>\n {strengthLabels[computedStrength]}\n </span>\n </div>\n )}\n {error ? (\n <span id={`${inputId}-error`} className={styles.errorText}>\n {error}\n </span>\n ) : helperText ? (\n <span id={`${inputId}-helper`} className={styles.helper}>\n {helperText}\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":"A,oIAmCA,IAAMS,EAA0B,CAAC,cAAe,QAAS,WAAY,QAAS,WAAW,EAEzF,SAAgBC,EAAyB,EAAiC,CACtE,GAAI,CAACC,EAAO,MAAO,GACnB,IAAIC,EAAQ,EAMZ,OALID,EAAM,QAAU,IAAG,GAAS,GAC5BA,EAAM,QAAU,KAAI,GAAS,GAC7B,QAAQ,KAAKA,CAAK,GAAK,QAAQ,KAAKA,CAAK,IAAG,GAAS,GACrD,QAAQ,KAAKA,CAAK,IAAG,GAAS,GAC9B,eAAe,KAAKA,CAAK,IAAG,GAAS,GAClC,KAAK,IAAI,EAAGC,CAAK,CAC5B,CAQA,IAAaC,GAAA,EAAgBb,EAAAA,WAAAA,CACzB,SACI,CACI,QACA,aACA,QACA,OAAO,KACP,eAAe,GACf,WACA,iBAAiBS,EACjB,eAAe,CAAE,KAAM,gBAAiB,KAAM,gBAAiB,EAC/D,YACA,QACA,eACA,KACA,GAAGK,GAEP,EACF,CACE,IAAMC,GAAA,EAAcd,EAAAA,MAAAA,CAAM,EACpBe,EAAUC,GAAMF,EAChBG,EAAgBC,EAChB,GAAGH,EAAQ,QACXI,EACE,GAAGJ,EAAQ,SACX,IAAA,GACF,CAACK,EAAUC,IAAA,EAAepB,EAAAA,SAAAA,CAAkB,EAAK,EAEjDqB,EACFC,GAAYd,EAFI,OAAQC,GAASc,GAAgB,EAEZ,CAAW,EAEpD,OACI,EAAAjB,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,QAASA,EAAAA,QAAOsB,GAAOP,GAASf,EAAAA,QAAO,MAAOuB,CAAS,EAAjF,SAAA,CACKC,IACG,EAAApB,EAAA,IAAA,CAAC,QAAD,CAAO,QAASQ,EAAS,UAAWZ,EAAAA,QAAO,MACtC,SAAAwB,CACE,CAAA,GAEX,EAAApB,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWJ,EAAAA,QAAO,MAAvB,SAAA,EACI,EAAAI,EAAA,IAAA,CAAC,QAAD,CACS,MACL,GAAIM,EACJ,GAAIE,EACG,QACO,eACd,KAAMK,EAAW,OAAS,WAC1B,eAAc,CAAC,CAACF,EAChB,mBAAkBD,EAClB,UAAWd,EAAAA,QAAO,KACrB,CAAA,GACD,EAAAI,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAWJ,EAAAA,QAAO,OAClB,aAAYiB,EAAWQ,EAAa,KAAOA,EAAa,KACxD,eAAcR,EACd,YAAeC,EAAa,GAAO,CAACQ,CAAE,EAErC,SAAAT,EAAW,KAAO,IACf,CAAA,CACP,C,GACJU,IACG,EAAAvB,EAAA,KAAA,CAAC,MAAD,CACI,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,SAAUA,EAAAA,QAAO,QAAQmB,IAAmB,EACjE,aAAYS,EAAeT,GAF/B,SAAA,EAII,EAAAf,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWJ,EAAAA,QAAO,YACnB,UAAA,EAAAI,EAAA,IAAA,CAAC,OAAD,CAAM,MAAO,CAAE,MAAO,GAAIe,EAAmB,EAAK,IAAI,EAAG,CAAI,CAAA,CAC5D,CAAA,GACL,EAAAf,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWJ,EAAAA,QAAO,cACnB,SAAA4B,EAAeT,EACd,CAAA,CACL,C,GAERJ,GACG,EAAAX,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAGQ,EAAQ,QAAS,UAAWZ,EAAAA,QAAO,UAC3C,SAAAe,CACC,CAAA,EACNC,GACA,EAAAZ,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,GAAGQ,EAAQ,SAAU,UAAWZ,EAAAA,QAAO,OAC5C,SAAAgB,CACC,CAAA,EACN,IACH,C,EAEb,CACJ,E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordInput.js","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — on top of the SDK's shared field props,\n * showStrength/strength/strengthLabels are the meter and toggleLabels is the\n * show/hide button's accessible name — both need their copy from the app, since\n * neither can be translated by the SDK.\n */\nimport { forwardRef, useId, useState } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PasswordInput.module.css\";\n\nexport type PasswordStrength = 0 | 1 | 2 | 3 | 4;\n\nexport interface PasswordInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\"\n> {\n /** Label rendered above the input. */\n label?: ReactNode;\n /** Helper text below — replaced by `error` when set. */\n helperText?: ReactNode;\n /** Error message. Adds `aria-invalid` + red border. */\n error?: string;\n /** Visual size of the input. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show a strength meter below the field. Default `false`. */\n showStrength?: boolean;\n /** Override the automatic strength calc (0–4). */\n strength?: PasswordStrength;\n /** Custom labels per strength level (5 entries). */\n strengthLabels?: readonly [string, string, string, string, string];\n /** Custom toggle button labels for accessibility. */\n toggleLabels?: { show: string; hide: string };\n}\n\nconst DEFAULT_STRENGTH_LABELS = [\"Muito fraca\", \"Fraca\", \"Razoável\", \"Forte\", \"Excelente\"] as const;\n\nexport function estimatePasswordStrength(value: string): PasswordStrength {\n if (!value) return 0;\n let score = 0;\n if (value.length >= 8) score += 1;\n if (value.length >= 12) score += 1;\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1;\n if (/[0-9]/.test(value)) score += 1;\n if (/[^A-Za-z0-9]/.test(value)) score += 1;\n return Math.min(4, score) as PasswordStrength;\n}\n\n/**\n * Password field with toggle-visibility button and optional strength meter.\n *\n * @example\n * <PasswordInput label=\"Senha\" showStrength autoComplete=\"new-password\" />\n */\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n {\n label,\n helperText,\n error,\n size = \"md\",\n showStrength = false,\n strength,\n strengthLabels = DEFAULT_STRENGTH_LABELS,\n toggleLabels = { show: \"Mostrar senha\", hide: \"Esconder senha\" },\n className,\n value,\n defaultValue,\n id,\n ...inputProps\n },\n ref,\n ) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const describedById = error\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined;\n const [revealed, setRevealed] = useState<boolean>(false);\n const stringValue = String((value ?? defaultValue ?? \"\") as string);\n const computedStrength: PasswordStrength =\n strength ?? estimatePasswordStrength(stringValue);\n\n return (\n <div className={cn(styles.wrapper, styles[size], error && styles.error, className)}>\n {label && (\n <label htmlFor={inputId} className={styles.label}>\n {label}\n </label>\n )}\n <div className={styles.field}>\n <input\n ref={ref}\n {...inputProps}\n id={inputId}\n value={value}\n defaultValue={defaultValue}\n type={revealed ? \"text\" : \"password\"}\n aria-invalid={!!error}\n aria-describedby={describedById}\n className={styles.input}\n />\n <button\n type=\"button\"\n className={styles.toggle}\n aria-label={revealed ? toggleLabels.hide : toggleLabels.show}\n aria-pressed={revealed}\n onClick={() => setRevealed((on) => !on)}\n >\n {revealed ? \"🙈\" : \"👁\"}\n </button>\n </div>\n {showStrength && (\n <div\n className={cn(styles.strength, styles[`level${computedStrength}`])}\n aria-label={strengthLabels[computedStrength]}\n >\n <div className={styles.strengthBar}>\n <span style={{ width: `${(computedStrength / 4) * 100}%` }} />\n </div>\n <span className={styles.strengthLabel}>\n {strengthLabels[computedStrength]}\n </span>\n </div>\n )}\n {error ? (\n <span id={`${inputId}-error`} className={styles.errorText}>\n {error}\n </span>\n ) : helperText ? (\n <span id={`${inputId}-helper`} className={styles.helper}>\n {helperText}\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":";;;;;AAmCA,
|
|
1
|
+
{"version":3,"file":"PasswordInput.js","names":["styles","PasswordInput_module_default","DEFAULT_STRENGTH_LABELS","estimatePasswordStrength","value","score","PasswordInput","forwardRef","inputProps","generatedId","useId","inputId","id","describedById","error","helperText","revealed","setRevealed","useState","computedStrength","strength","defaultValue","cn","size","className","label","toggleLabels","on","showStrength","strengthLabels"],"sources":["../../../src/components/PasswordInput/PasswordInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — on top of the SDK's shared field props,\n * showStrength/strength/strengthLabels are the meter and toggleLabels is the\n * show/hide button's accessible name — both need their copy from the app, since\n * neither can be translated by the SDK.\n */\nimport { forwardRef, useId, useState } from \"react\";\nimport type { InputHTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PasswordInput.module.css\";\n\nexport type PasswordStrength = 0 | 1 | 2 | 3 | 4;\n\nexport interface PasswordInputProps extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"size\"\n> {\n /** Label rendered above the input. */\n label?: ReactNode;\n /** Helper text below — replaced by `error` when set. */\n helperText?: ReactNode;\n /** Error message. Adds `aria-invalid` + red border. */\n error?: string;\n /** Visual size of the input. */\n size?: \"sm\" | \"md\" | \"lg\";\n /** Show a strength meter below the field. Default `false`. */\n showStrength?: boolean;\n /** Override the automatic strength calc (0–4). */\n strength?: PasswordStrength;\n /** Custom labels per strength level (5 entries). */\n strengthLabels?: readonly [string, string, string, string, string];\n /** Custom toggle button labels for accessibility. */\n toggleLabels?: { show: string; hide: string };\n}\n\nconst DEFAULT_STRENGTH_LABELS = [\"Muito fraca\", \"Fraca\", \"Razoável\", \"Forte\", \"Excelente\"] as const;\n\nexport function estimatePasswordStrength(value: string): PasswordStrength {\n if (!value) return 0;\n let score = 0;\n if (value.length >= 8) score += 1;\n if (value.length >= 12) score += 1;\n if (/[a-z]/.test(value) && /[A-Z]/.test(value)) score += 1;\n if (/[0-9]/.test(value)) score += 1;\n if (/[^A-Za-z0-9]/.test(value)) score += 1;\n return Math.min(4, score) as PasswordStrength;\n}\n\n/**\n * Password field with toggle-visibility button and optional strength meter.\n *\n * @example\n * <PasswordInput label=\"Senha\" showStrength autoComplete=\"new-password\" />\n */\nexport const PasswordInput = forwardRef<HTMLInputElement, PasswordInputProps>(\n function PasswordInput(\n {\n label,\n helperText,\n error,\n size = \"md\",\n showStrength = false,\n strength,\n strengthLabels = DEFAULT_STRENGTH_LABELS,\n toggleLabels = { show: \"Mostrar senha\", hide: \"Esconder senha\" },\n className,\n value,\n defaultValue,\n id,\n ...inputProps\n },\n ref,\n ) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const describedById = error\n ? `${inputId}-error`\n : helperText\n ? `${inputId}-helper`\n : undefined;\n const [revealed, setRevealed] = useState<boolean>(false);\n const stringValue = String((value ?? defaultValue ?? \"\") as string);\n const computedStrength: PasswordStrength =\n strength ?? estimatePasswordStrength(stringValue);\n\n return (\n <div className={cn(styles.wrapper, styles[size], error && styles.error, className)}>\n {label && (\n <label htmlFor={inputId} className={styles.label}>\n {label}\n </label>\n )}\n <div className={styles.field}>\n <input\n ref={ref}\n {...inputProps}\n id={inputId}\n value={value}\n defaultValue={defaultValue}\n type={revealed ? \"text\" : \"password\"}\n aria-invalid={!!error}\n aria-describedby={describedById}\n className={styles.input}\n />\n <button\n type=\"button\"\n className={styles.toggle}\n aria-label={revealed ? toggleLabels.hide : toggleLabels.show}\n aria-pressed={revealed}\n onClick={() => setRevealed((on) => !on)}\n >\n {revealed ? \"🙈\" : \"👁\"}\n </button>\n </div>\n {showStrength && (\n <div\n className={cn(styles.strength, styles[`level${computedStrength}`])}\n aria-label={strengthLabels[computedStrength]}\n >\n <div className={styles.strengthBar}>\n <span style={{ width: `${(computedStrength / 4) * 100}%` }} />\n </div>\n <span className={styles.strengthLabel}>\n {strengthLabels[computedStrength]}\n </span>\n </div>\n )}\n {error ? (\n <span id={`${inputId}-error`} className={styles.errorText}>\n {error}\n </span>\n ) : helperText ? (\n <span id={`${inputId}-helper`} className={styles.helper}>\n {helperText}\n </span>\n ) : null}\n </div>\n );\n },\n);\n"],"mappings":";;;;;AAmCA,IAAME,IAA0B;CAAC;CAAe;CAAS;CAAY;CAAS;AAAW;AAEzF,SAAgBC,EAAyB,GAAiC;CACtE,IAAI,CAACC,GAAO,OAAO;CACnB,IAAIC,IAAQ;CAMZ,OALID,EAAM,UAAU,MAAG,KAAS,IAC5BA,EAAM,UAAU,OAAI,KAAS,IAC7B,QAAQ,KAAKA,CAAK,KAAK,QAAQ,KAAKA,CAAK,MAAG,KAAS,IACrD,QAAQ,KAAKA,CAAK,MAAG,KAAS,IAC9B,eAAe,KAAKA,CAAK,MAAG,KAAS,IAClC,KAAK,IAAI,GAAGC,CAAK;AAC5B;AAQA,IAAaC,IAAgBC,EACzB,SACI,EACI,UACA,eACA,UACA,UAAO,MACP,kBAAe,IACf,aACA,oBAAiBL,GACjB,kBAAe;CAAE,MAAM;CAAiB,MAAM;AAAiB,GAC/D,cACA,UACA,iBACA,OACA,GAAGM,KAEP,GACF;CACE,IAAMC,IAAcC,EAAM,GACpBC,IAAUC,KAAMH,GAChBI,IAAgBC,IAChB,GAAGH,EAAQ,UACXI,IACE,GAAGJ,EAAQ,WACX,KAAA,GACF,CAACK,GAAUC,KAAeC,EAAkB,EAAK,GAEjDC,IACFC,KAAYjB,EAFI,OAAQC,KAASiB,KAAgB,EAEZ,CAAW;CAEpD,OACI,kBAAC,OAAD;EAAK,WAAWC,EAAGtB,EAAO,SAASA,EAAOuB,IAAOT,KAASd,EAAO,OAAOwB,CAAS;EAAjF,UAAA;GACKC,KACG,kBAAC,SAAD;IAAO,SAASd;IAAS,WAAWX,EAAO;IACtC,UAAAyB;GACE,CAAA;GAEX,kBAAC,OAAD;IAAK,WAAWzB,EAAO;IAAvB,UAAA,CACI,kBAAC,SAAD;KACS;KACL,GAAIQ;KACJ,IAAIG;KACG;KACO;KACd,MAAMK,IAAW,SAAS;KAC1B,gBAAc,CAAC,CAACF;KAChB,oBAAkBD;KAClB,WAAWb,EAAO;IACrB,CAAA,GACD,kBAAC,UAAD;KACI,MAAK;KACL,WAAWA,EAAO;KAClB,cAAYgB,IAAWU,EAAa,OAAOA,EAAa;KACxD,gBAAcV;KACd,eAAeC,GAAa,MAAO,CAACU,CAAE;KAErC,UAAAX,IAAW,OAAO;IACf,CAAA,CACP;;GACJY,KACG,kBAAC,OAAD;IACI,WAAWN,EAAGtB,EAAO,UAAUA,EAAO,QAAQmB,IAAmB;IACjE,cAAYU,EAAeV;IAF/B,UAAA,CAII,kBAAC,OAAD;KAAK,WAAWnB,EAAO;KACnB,UAAA,kBAAC,QAAD,EAAM,OAAO,EAAE,OAAO,GAAImB,IAAmB,IAAK,IAAI,GAAG,EAAI,CAAA;IAC5D,CAAA,GACL,kBAAC,QAAD;KAAM,WAAWnB,EAAO;KACnB,UAAA6B,EAAeV;IACd,CAAA,CACL;;GAERL,IACG,kBAAC,QAAD;IAAM,IAAI,GAAGH,EAAQ;IAAS,WAAWX,EAAO;IAC3C,UAAAc;GACC,CAAA,IACNC,IACA,kBAAC,QAAD;IAAM,IAAI,GAAGJ,EAAQ;IAAU,WAAWX,EAAO;IAC5C,UAAAe;GACC,CAAA,IACN;EACH;;AAEb,CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordInput.module.cjs","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.input {\n flex: 1 1 auto;\n border: 0;\n background: transparent;\n outline: 0;\n color: var(--tempest-text);\n font: inherit;\n font-family: var(--tempest-font-sans);\n}\n\n.sm .input {\n padding: 6px 8px;\n font-size: var(--tempest-text-sm);\n}\n\n.md .input {\n padding: 8px 12px;\n font-size: var(--tempest-text-md);\n}\n\n.lg .input {\n padding: 10px 14px;\n font-size: var(--tempest-text-lg);\n}\n\n.toggle {\n flex: 0 0 auto;\n background: none;\n border: 0;\n cursor: pointer;\n padding: 0 12px;\n font-size: 16px;\n color: var(--tempest-text-muted);\n}\n\n.toggle:hover {\n color: var(--tempest-text);\n}\n\n.error .field {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n\n.strength {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n font-size: var(--tempest-text-xs);\n}\n\n.strengthBar {\n flex: 1 1 auto;\n height: 4px;\n background: var(--tempest-border);\n border-radius: var(--tempest-radius-full);\n overflow: hidden;\n}\n\n.strengthBar > span {\n display: block;\n height: 100%;\n transition: width var(--tempest-duration-base, 200ms);\n}\n\n.strengthLabel {\n color: var(--tempest-text-muted);\n flex: 0 0 auto;\n}\n\n.level0 .strengthBar > span,\n.level1 .strengthBar > span {\n background: var(--tempest-danger-solid, var(--tempest-danger));\n}\n\n.level2 .strengthBar > span {\n background: var(--tempest-warning-solid, var(--tempest-warning));\n}\n\n.level3 .strengthBar > span,\n.level4 .strengthBar > span {\n background: var(--tempest-success-solid, var(--tempest-success));\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"PasswordInput.module.cjs","names":["wrapper","label","field","input","sm","md","lg","toggle","error","helper","errorText","strength","strengthBar","strengthLabel","level0","level1","level2","level3","level4","PasswordInput_module_default"],"sources":["../../../src/components/PasswordInput/PasswordInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.input {\n flex: 1 1 auto;\n border: 0;\n background: transparent;\n outline: 0;\n color: var(--tempest-text);\n font: inherit;\n font-family: var(--tempest-font-sans);\n}\n\n.sm .input {\n padding: 6px 8px;\n font-size: var(--tempest-text-sm);\n}\n\n.md .input {\n padding: 8px 12px;\n font-size: var(--tempest-text-md);\n}\n\n.lg .input {\n padding: 10px 14px;\n font-size: var(--tempest-text-lg);\n}\n\n.toggle {\n flex: 0 0 auto;\n background: none;\n border: 0;\n cursor: pointer;\n padding: 0 12px;\n font-size: 16px;\n color: var(--tempest-text-muted);\n}\n\n.toggle:hover {\n color: var(--tempest-text);\n}\n\n.error .field {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n\n.strength {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n font-size: var(--tempest-text-xs);\n}\n\n.strengthBar {\n flex: 1 1 auto;\n height: 4px;\n background: var(--tempest-border);\n border-radius: var(--tempest-radius-full);\n overflow: hidden;\n}\n\n.strengthBar > span {\n display: block;\n height: 100%;\n transition: width var(--tempest-duration-base, 200ms);\n}\n\n.strengthLabel {\n color: var(--tempest-text-muted);\n flex: 0 0 auto;\n}\n\n.level0 .strengthBar > span,\n.level1 .strengthBar > span {\n background: var(--tempest-danger-solid, var(--tempest-danger));\n}\n\n.level2 .strengthBar > span {\n background: var(--tempest-warning-solid, var(--tempest-warning));\n}\n\n.level3 .strengthBar > span,\n.level4 .strengthBar > span {\n background: var(--tempest-success-solid, var(--tempest-success));\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PasswordInput.module.js","names":[],"sources":["../../../src/components/PasswordInput/PasswordInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.input {\n flex: 1 1 auto;\n border: 0;\n background: transparent;\n outline: 0;\n color: var(--tempest-text);\n font: inherit;\n font-family: var(--tempest-font-sans);\n}\n\n.sm .input {\n padding: 6px 8px;\n font-size: var(--tempest-text-sm);\n}\n\n.md .input {\n padding: 8px 12px;\n font-size: var(--tempest-text-md);\n}\n\n.lg .input {\n padding: 10px 14px;\n font-size: var(--tempest-text-lg);\n}\n\n.toggle {\n flex: 0 0 auto;\n background: none;\n border: 0;\n cursor: pointer;\n padding: 0 12px;\n font-size: 16px;\n color: var(--tempest-text-muted);\n}\n\n.toggle:hover {\n color: var(--tempest-text);\n}\n\n.error .field {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n\n.strength {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n font-size: var(--tempest-text-xs);\n}\n\n.strengthBar {\n flex: 1 1 auto;\n height: 4px;\n background: var(--tempest-border);\n border-radius: var(--tempest-radius-full);\n overflow: hidden;\n}\n\n.strengthBar > span {\n display: block;\n height: 100%;\n transition: width var(--tempest-duration-base, 200ms);\n}\n\n.strengthLabel {\n color: var(--tempest-text-muted);\n flex: 0 0 auto;\n}\n\n.level0 .strengthBar > span,\n.level1 .strengthBar > span {\n background: var(--tempest-danger-solid, var(--tempest-danger));\n}\n\n.level2 .strengthBar > span {\n background: var(--tempest-warning-solid, var(--tempest-warning));\n}\n\n.level3 .strengthBar > span,\n.level4 .strengthBar > span {\n background: var(--tempest-success-solid, var(--tempest-success));\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"PasswordInput.module.js","names":["wrapper","label","field","input","sm","md","lg","toggle","error","helper","errorText","strength","strengthBar","strengthLabel","level0","level1","level2","level3","level4","PasswordInput_module_default"],"sources":["../../../src/components/PasswordInput/PasswordInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n width: 100%;\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.field:focus-within {\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.input {\n flex: 1 1 auto;\n border: 0;\n background: transparent;\n outline: 0;\n color: var(--tempest-text);\n font: inherit;\n font-family: var(--tempest-font-sans);\n}\n\n.sm .input {\n padding: 6px 8px;\n font-size: var(--tempest-text-sm);\n}\n\n.md .input {\n padding: 8px 12px;\n font-size: var(--tempest-text-md);\n}\n\n.lg .input {\n padding: 10px 14px;\n font-size: var(--tempest-text-lg);\n}\n\n.toggle {\n flex: 0 0 auto;\n background: none;\n border: 0;\n cursor: pointer;\n padding: 0 12px;\n font-size: 16px;\n color: var(--tempest-text-muted);\n}\n\n.toggle:hover {\n color: var(--tempest-text);\n}\n\n.error .field {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n\n.strength {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n font-size: var(--tempest-text-xs);\n}\n\n.strengthBar {\n flex: 1 1 auto;\n height: 4px;\n background: var(--tempest-border);\n border-radius: var(--tempest-radius-full);\n overflow: hidden;\n}\n\n.strengthBar > span {\n display: block;\n height: 100%;\n transition: width var(--tempest-duration-base, 200ms);\n}\n\n.strengthLabel {\n color: var(--tempest-text-muted);\n flex: 0 0 auto;\n}\n\n.level0 .strengthBar > span,\n.level1 .strengthBar > span {\n background: var(--tempest-danger-solid, var(--tempest-danger));\n}\n\n.level2 .strengthBar > span {\n background: var(--tempest-warning-solid, var(--tempest-warning));\n}\n\n.level3 .strengthBar > span,\n.level4 .strengthBar > span {\n background: var(--tempest-success-solid, var(--tempest-success));\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PinInput.cjs","names":[],"sources":["../../../src/components/PinInput/PinInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count, function-lines — one input per digit, so length,\n * type, masked and autoFocus shape the boxes while\n * value/defaultValue/onChange/onComplete drive them as a single value. The body owns\n * the per-box refs, paste distribution and backspace traversal, which only make\n * sense with the whole array in scope.\n */\nimport { forwardRef, useEffect, useId, useRef, useState } from \"react\";\nimport type { ChangeEvent, ClipboardEvent, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PinInput.module.css\";\n\nexport type PinInputType = \"numeric\" | \"alphanumeric\";\nexport type PinInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface PinInputProps {\n /** Number of cells. Default `6`. */\n length?: number;\n /** Allowed character set. `numeric` (default) rejects letters, `alphanumeric` allows both. */\n type?: PinInputType;\n /** Visual size. Default `\"md\"`. */\n size?: PinInputSize;\n /** Controlled value. */\n value?: string;\n /** Initial value (uncontrolled mode). */\n defaultValue?: string;\n /** Fires on every change with the current concatenated value. */\n onChange?: (value: string) => void;\n /** Fires when the user fills the last cell. */\n onComplete?: (value: string) => void;\n /** Show characters obscured (`*`). Default `false`. */\n masked?: boolean;\n /** Label rendered above the cells. */\n label?: string;\n /** Helper text below the cells. */\n helperText?: string;\n /** Error message — turns cells red and replaces helperText. */\n error?: string;\n /** Disable all cells. */\n disabled?: boolean;\n /** Auto-focus the first cell on mount. Default `false`. */\n autoFocus?: boolean;\n /** id for the wrapping group label association. */\n id?: string;\n className?: string;\n}\n\nconst NUMERIC = /[0-9]/;\nconst ALNUM = /[A-Za-z0-9]/;\n\n/**\n * One-time-password style input — N independent cells, paste support, auto-\n * advance on input, backspace flows back, arrow keys navigate.\n *\n * @example\n * <PinInput length={6} type=\"numeric\" onComplete={(otp) => verify(otp)} />\n */\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(function PinInput(\n {\n length = 6,\n type = \"numeric\",\n size = \"md\",\n value,\n defaultValue,\n onChange,\n onComplete,\n masked = false,\n label,\n helperText,\n error,\n disabled = false,\n autoFocus = false,\n id,\n className,\n },\n ref,\n) {\n const internalId = useId();\n const wrapperId = id ?? internalId;\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string>(defaultValue ?? \"\");\n const current = isControlled ? (value ?? \"\") : internal;\n const cells = Array.from({ length }, (_, index) => current[index] ?? \"\");\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = type === \"numeric\" ? NUMERIC : ALNUM;\n\n useEffect(() => {\n if (autoFocus) inputsRef.current[0]?.focus();\n }, [autoFocus]);\n\n const update = (next: string): void => {\n const trimmed = next.slice(0, length);\n if (!isControlled) setInternal(trimmed);\n onChange?.(trimmed);\n if (trimmed.length === length) onComplete?.(trimmed);\n };\n\n const focusCell = (index: number): void => {\n const safe = Math.max(0, Math.min(length - 1, index));\n inputsRef.current[safe]?.focus();\n inputsRef.current[safe]?.select();\n };\n\n const onCellChange = (index: number) => (event: ChangeEvent<HTMLInputElement>) => {\n const char = event.target.value.slice(-1);\n if (char && !pattern.test(char)) return;\n const next = cells.slice();\n next[index] = char;\n update(next.join(\"\"));\n if (char) focusCell(index + 1);\n };\n\n const onCellKeyDown = (index: number) => (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Backspace\") {\n if (!cells[index] && index > 0) {\n event.preventDefault();\n const next = cells.slice();\n next[index - 1] = \"\";\n update(next.join(\"\"));\n focusCell(index - 1);\n }\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(index - 1);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(index + 1);\n }\n };\n\n const onPaste = (event: ClipboardEvent<HTMLInputElement>): void => {\n const text = event.clipboardData\n .getData(\"text\")\n .split(\"\")\n .filter((c) => pattern.test(c))\n .join(\"\");\n if (!text) return;\n event.preventDefault();\n update(text);\n focusCell(Math.min(length - 1, text.length));\n };\n\n return (\n <div\n ref={ref}\n className={cn(styles.wrapper, error && styles.error, className)}\n id={wrapperId}\n >\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.cells, styles[size])} role=\"group\" aria-label={label}>\n {cells.map((cell, index) => (\n <input\n key={index}\n ref={(node) => {\n inputsRef.current[index] = node;\n }}\n type={masked ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={index === 0 ? \"one-time-code\" : \"off\"}\n maxLength={1}\n value={cell}\n disabled={disabled}\n className={styles.cell}\n aria-label={`Dígito ${index + 1}`}\n aria-invalid={!!error}\n onChange={onCellChange(index)}\n onKeyDown={onCellKeyDown(index)}\n onPaste={onPaste}\n />\n ))}\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"PinInput.cjs","names":["forwardRef","useId","useState","useRef","cn","styles","require_cn","require_PinInput_module","react","react_jsx_runtime","NUMERIC","ALNUM","PinInput","internalId","wrapperId","id","isControlled","value","internal","setInternal","defaultValue","current","cells","index","inputsRef","pattern","type","autoFocus","update","trimmed","next","length","onChange","onComplete","focusCell","safe","onCellChange","char","event","onCellKeyDown","onPaste","text","c","error","className","label","size","node","masked","cell","helperText"],"sources":["../../../src/components/PinInput/PinInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count, function-lines — one input per digit, so length,\n * type, masked and autoFocus shape the boxes while\n * value/defaultValue/onChange/onComplete drive them as a single value. The body owns\n * the per-box refs, paste distribution and backspace traversal, which only make\n * sense with the whole array in scope.\n */\nimport { forwardRef, useEffect, useId, useRef, useState } from \"react\";\nimport type { ChangeEvent, ClipboardEvent, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PinInput.module.css\";\n\nexport type PinInputType = \"numeric\" | \"alphanumeric\";\nexport type PinInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface PinInputProps {\n /** Number of cells. Default `6`. */\n length?: number;\n /** Allowed character set. `numeric` (default) rejects letters, `alphanumeric` allows both. */\n type?: PinInputType;\n /** Visual size. Default `\"md\"`. */\n size?: PinInputSize;\n /** Controlled value. */\n value?: string;\n /** Initial value (uncontrolled mode). */\n defaultValue?: string;\n /** Fires on every change with the current concatenated value. */\n onChange?: (value: string) => void;\n /** Fires when the user fills the last cell. */\n onComplete?: (value: string) => void;\n /** Show characters obscured (`*`). Default `false`. */\n masked?: boolean;\n /** Label rendered above the cells. */\n label?: string;\n /** Helper text below the cells. */\n helperText?: string;\n /** Error message — turns cells red and replaces helperText. */\n error?: string;\n /** Disable all cells. */\n disabled?: boolean;\n /** Auto-focus the first cell on mount. Default `false`. */\n autoFocus?: boolean;\n /** id for the wrapping group label association. */\n id?: string;\n className?: string;\n}\n\nconst NUMERIC = /[0-9]/;\nconst ALNUM = /[A-Za-z0-9]/;\n\n/**\n * One-time-password style input — N independent cells, paste support, auto-\n * advance on input, backspace flows back, arrow keys navigate.\n *\n * @example\n * <PinInput length={6} type=\"numeric\" onComplete={(otp) => verify(otp)} />\n */\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(function PinInput(\n {\n length = 6,\n type = \"numeric\",\n size = \"md\",\n value,\n defaultValue,\n onChange,\n onComplete,\n masked = false,\n label,\n helperText,\n error,\n disabled = false,\n autoFocus = false,\n id,\n className,\n },\n ref,\n) {\n const internalId = useId();\n const wrapperId = id ?? internalId;\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string>(defaultValue ?? \"\");\n const current = isControlled ? (value ?? \"\") : internal;\n const cells = Array.from({ length }, (_, index) => current[index] ?? \"\");\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = type === \"numeric\" ? NUMERIC : ALNUM;\n\n useEffect(() => {\n if (autoFocus) inputsRef.current[0]?.focus();\n }, [autoFocus]);\n\n const update = (next: string): void => {\n const trimmed = next.slice(0, length);\n if (!isControlled) setInternal(trimmed);\n onChange?.(trimmed);\n if (trimmed.length === length) onComplete?.(trimmed);\n };\n\n const focusCell = (index: number): void => {\n const safe = Math.max(0, Math.min(length - 1, index));\n inputsRef.current[safe]?.focus();\n inputsRef.current[safe]?.select();\n };\n\n const onCellChange = (index: number) => (event: ChangeEvent<HTMLInputElement>) => {\n const char = event.target.value.slice(-1);\n if (char && !pattern.test(char)) return;\n const next = cells.slice();\n next[index] = char;\n update(next.join(\"\"));\n if (char) focusCell(index + 1);\n };\n\n const onCellKeyDown = (index: number) => (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Backspace\") {\n if (!cells[index] && index > 0) {\n event.preventDefault();\n const next = cells.slice();\n next[index - 1] = \"\";\n update(next.join(\"\"));\n focusCell(index - 1);\n }\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(index - 1);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(index + 1);\n }\n };\n\n const onPaste = (event: ClipboardEvent<HTMLInputElement>): void => {\n const text = event.clipboardData\n .getData(\"text\")\n .split(\"\")\n .filter((c) => pattern.test(c))\n .join(\"\");\n if (!text) return;\n event.preventDefault();\n update(text);\n focusCell(Math.min(length - 1, text.length));\n };\n\n return (\n <div\n ref={ref}\n className={cn(styles.wrapper, error && styles.error, className)}\n id={wrapperId}\n >\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.cells, styles[size])} role=\"group\" aria-label={label}>\n {cells.map((cell, index) => (\n <input\n key={index}\n ref={(node) => {\n inputsRef.current[index] = node;\n }}\n type={masked ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={index === 0 ? \"one-time-code\" : \"off\"}\n maxLength={1}\n value={cell}\n disabled={disabled}\n className={styles.cell}\n aria-label={`Dígito ${index + 1}`}\n aria-invalid={!!error}\n onChange={onCellChange(index)}\n onKeyDown={onCellKeyDown(index)}\n onPaste={onPaste}\n />\n ))}\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n"],"mappings":"A,+HA+CA,IAAMU,EAAU,QACVC,EAAQ,cASDC,GAAA,EAAWZ,EAAAA,WAAAA,CAA0C,SAC9D,CACI,SAAS,EACT,OAAO,UACP,OAAO,KACP,QACA,eACA,WACA,aACA,SAAS,GACT,QACA,aACA,QACA,WAAW,GACX,YAAY,GACZ,KACA,aAEJ,EACF,CACE,IAAMa,GAAA,EAAaZ,EAAAA,MAAAA,CAAM,EACnBa,EAAYC,GAAMF,EAClBG,EAAeC,IAAU,IAAA,GACzB,CAACC,EAAUC,IAAA,EAAejB,EAAAA,SAAAA,CAAiBkB,GAAgB,EAAE,EAC7DC,EAAUL,EAAgBC,GAAS,GAAMC,EACzCI,EAAQ,MAAM,KAAK,CAAE,QAAO,GAAI,EAAG,IAAUD,EAAQE,IAAU,EAAE,EACjEC,GAAA,EAAYrB,EAAAA,OAAAA,CAAoC,CAAC,CAAC,EAClDsB,EAAUC,IAAS,UAAYhB,EAAUC,GAE/C,EAAAH,EAAA,UAAA,KAAgB,CACRmB,GAAWH,EAAU,QAAQ,EAAE,EAAE,MAAM,CAC/C,EAAG,CAACG,CAAS,CAAC,EAEd,IAAMC,EAAU,GAAuB,CACnC,IAAMC,EAAUC,EAAK,MAAM,EAAGC,CAAM,EAC/Bf,GAAcG,EAAYU,CAAO,EACtCG,IAAWH,CAAO,EACdA,EAAQ,SAAWE,GAAQE,IAAaJ,CAAO,CACvD,EAEMK,EAAa,GAAwB,CACvC,IAAMC,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIJ,EAAS,EAAGR,CAAK,CAAC,EACpDC,EAAU,QAAQW,EAAK,EAAE,MAAM,EAC/BX,EAAU,QAAQW,EAAK,EAAE,OAAO,CACpC,EAEMC,EAAgB,GAAmB,GAAyC,CAC9E,IAAMC,EAAOC,EAAM,OAAO,MAAM,MAAM,EAAE,EACxC,GAAID,GAAQ,CAACZ,EAAQ,KAAKY,CAAI,EAAG,OACjC,IAAMP,EAAOR,EAAM,MAAM,EACzB,EAAKC,GAASc,EACdT,EAAOE,EAAK,KAAK,EAAE,CAAC,EAChBO,GAAMH,EAAUX,EAAQ,CAAC,CACjC,EAEMgB,EAAiB,GAAmB,GAA2C,CACjF,GAAID,EAAM,MAAQ,YACV,IAAA,CAAChB,EAAMC,IAAUA,EAAQ,EAAG,CAC5Be,EAAM,eAAe,EACrB,IAAMR,EAAOR,EAAM,MAAM,EACzB,EAAKC,EAAQ,GAAK,GAClBK,EAAOE,EAAK,KAAK,EAAE,CAAC,EACpBI,EAAUX,EAAQ,CAAC,CACvB,OACOe,EAAM,MAAQ,aACrBA,EAAM,eAAe,EACrBJ,EAAUX,EAAQ,CAAC,GACZe,EAAM,MAAQ,eACrBA,EAAM,eAAe,EACrBJ,EAAUX,EAAQ,CAAC,EAE3B,EAEMiB,EAAW,GAAkD,CAC/D,IAAMC,EAAOH,EAAM,cACd,QAAQ,MAAM,CAAC,CACf,MAAM,EAAE,CAAC,CACT,OAAQ,GAAMb,EAAQ,KAAKiB,CAAC,CAAC,CAAC,CAC9B,KAAK,EAAE,EACPD,IACLH,EAAM,eAAe,EACrBV,EAAOa,CAAI,EACXP,EAAU,KAAK,IAAIH,EAAS,EAAGU,EAAK,MAAM,CAAC,EAC/C,EAEA,OACI,EAAAhC,EAAA,KAAA,CAAC,MAAD,CACS,MACL,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,QAASsC,GAAStC,EAAAA,QAAO,MAAOuC,CAAS,EAC9D,GAAI9B,EAHR,SAAA,CAKK+B,IAAS,EAAApC,EAAA,IAAA,CAAC,QAAD,CAAO,UAAWJ,EAAAA,QAAO,MAAQ,SAAAwC,CAAa,CAAA,GACxD,EAAApC,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,MAAOA,EAAAA,QAAOyC,EAAK,EAAG,KAAK,QAAQ,aAAYD,EACpE,SAAAvB,EAAM,KAAK,EAAM,KACd,EAAAb,EAAA,IAAA,CAAC,QAAD,CAEI,IAAM,GAAS,CACX,EAAU,QAAQc,GAASwB,CAC/B,EACA,KAAMC,EAAS,WAAa,OAC5B,UAAWtB,IAAS,UAAY,UAAY,OAC5C,aAAcH,IAAU,EAAI,gBAAkB,MAC9C,UAAW,EACX,MAAO0B,EACG,WACV,UAAW5C,EAAAA,QAAO,KAClB,aAAY,UAAUkB,EAAQ,IAC9B,eAAc,CAAC,CAACoB,EAChB,SAAUP,EAAab,CAAK,EAC5B,UAAWgB,EAAchB,CAAK,EACrB,SACZ,EAhBQA,CAgBR,CACJ,CACA,CAAA,EACJoB,GACG,EAAAlC,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWJ,EAAAA,QAAO,UAAY,SAAAsC,CAAY,CAAA,EAChDO,GACA,EAAAzC,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWJ,EAAAA,QAAO,OAAS,SAAA6C,CAAiB,CAAA,EAClD,IACH,C,EAEb,CAAC,E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PinInput.js","names":[],"sources":["../../../src/components/PinInput/PinInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count, function-lines — one input per digit, so length,\n * type, masked and autoFocus shape the boxes while\n * value/defaultValue/onChange/onComplete drive them as a single value. The body owns\n * the per-box refs, paste distribution and backspace traversal, which only make\n * sense with the whole array in scope.\n */\nimport { forwardRef, useEffect, useId, useRef, useState } from \"react\";\nimport type { ChangeEvent, ClipboardEvent, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PinInput.module.css\";\n\nexport type PinInputType = \"numeric\" | \"alphanumeric\";\nexport type PinInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface PinInputProps {\n /** Number of cells. Default `6`. */\n length?: number;\n /** Allowed character set. `numeric` (default) rejects letters, `alphanumeric` allows both. */\n type?: PinInputType;\n /** Visual size. Default `\"md\"`. */\n size?: PinInputSize;\n /** Controlled value. */\n value?: string;\n /** Initial value (uncontrolled mode). */\n defaultValue?: string;\n /** Fires on every change with the current concatenated value. */\n onChange?: (value: string) => void;\n /** Fires when the user fills the last cell. */\n onComplete?: (value: string) => void;\n /** Show characters obscured (`*`). Default `false`. */\n masked?: boolean;\n /** Label rendered above the cells. */\n label?: string;\n /** Helper text below the cells. */\n helperText?: string;\n /** Error message — turns cells red and replaces helperText. */\n error?: string;\n /** Disable all cells. */\n disabled?: boolean;\n /** Auto-focus the first cell on mount. Default `false`. */\n autoFocus?: boolean;\n /** id for the wrapping group label association. */\n id?: string;\n className?: string;\n}\n\nconst NUMERIC = /[0-9]/;\nconst ALNUM = /[A-Za-z0-9]/;\n\n/**\n * One-time-password style input — N independent cells, paste support, auto-\n * advance on input, backspace flows back, arrow keys navigate.\n *\n * @example\n * <PinInput length={6} type=\"numeric\" onComplete={(otp) => verify(otp)} />\n */\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(function PinInput(\n {\n length = 6,\n type = \"numeric\",\n size = \"md\",\n value,\n defaultValue,\n onChange,\n onComplete,\n masked = false,\n label,\n helperText,\n error,\n disabled = false,\n autoFocus = false,\n id,\n className,\n },\n ref,\n) {\n const internalId = useId();\n const wrapperId = id ?? internalId;\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string>(defaultValue ?? \"\");\n const current = isControlled ? (value ?? \"\") : internal;\n const cells = Array.from({ length }, (_, index) => current[index] ?? \"\");\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = type === \"numeric\" ? NUMERIC : ALNUM;\n\n useEffect(() => {\n if (autoFocus) inputsRef.current[0]?.focus();\n }, [autoFocus]);\n\n const update = (next: string): void => {\n const trimmed = next.slice(0, length);\n if (!isControlled) setInternal(trimmed);\n onChange?.(trimmed);\n if (trimmed.length === length) onComplete?.(trimmed);\n };\n\n const focusCell = (index: number): void => {\n const safe = Math.max(0, Math.min(length - 1, index));\n inputsRef.current[safe]?.focus();\n inputsRef.current[safe]?.select();\n };\n\n const onCellChange = (index: number) => (event: ChangeEvent<HTMLInputElement>) => {\n const char = event.target.value.slice(-1);\n if (char && !pattern.test(char)) return;\n const next = cells.slice();\n next[index] = char;\n update(next.join(\"\"));\n if (char) focusCell(index + 1);\n };\n\n const onCellKeyDown = (index: number) => (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Backspace\") {\n if (!cells[index] && index > 0) {\n event.preventDefault();\n const next = cells.slice();\n next[index - 1] = \"\";\n update(next.join(\"\"));\n focusCell(index - 1);\n }\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(index - 1);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(index + 1);\n }\n };\n\n const onPaste = (event: ClipboardEvent<HTMLInputElement>): void => {\n const text = event.clipboardData\n .getData(\"text\")\n .split(\"\")\n .filter((c) => pattern.test(c))\n .join(\"\");\n if (!text) return;\n event.preventDefault();\n update(text);\n focusCell(Math.min(length - 1, text.length));\n };\n\n return (\n <div\n ref={ref}\n className={cn(styles.wrapper, error && styles.error, className)}\n id={wrapperId}\n >\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.cells, styles[size])} role=\"group\" aria-label={label}>\n {cells.map((cell, index) => (\n <input\n key={index}\n ref={(node) => {\n inputsRef.current[index] = node;\n }}\n type={masked ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={index === 0 ? \"one-time-code\" : \"off\"}\n maxLength={1}\n value={cell}\n disabled={disabled}\n className={styles.cell}\n aria-label={`Dígito ${index + 1}`}\n aria-invalid={!!error}\n onChange={onCellChange(index)}\n onKeyDown={onCellKeyDown(index)}\n onPaste={onPaste}\n />\n ))}\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;AA+CA,
|
|
1
|
+
{"version":3,"file":"PinInput.js","names":["styles","PinInput_module_default","NUMERIC","ALNUM","PinInput","forwardRef","internalId","useId","wrapperId","id","isControlled","value","internal","setInternal","useState","defaultValue","current","cells","index","inputsRef","useRef","pattern","type","autoFocus","update","trimmed","next","length","onChange","onComplete","focusCell","safe","onCellChange","char","event","onCellKeyDown","onPaste","text","c","cn","error","className","label","size","node","masked","cell","helperText"],"sources":["../../../src/components/PinInput/PinInput.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count, function-lines — one input per digit, so length,\n * type, masked and autoFocus shape the boxes while\n * value/defaultValue/onChange/onComplete drive them as a single value. The body owns\n * the per-box refs, paste distribution and backspace traversal, which only make\n * sense with the whole array in scope.\n */\nimport { forwardRef, useEffect, useId, useRef, useState } from \"react\";\nimport type { ChangeEvent, ClipboardEvent, KeyboardEvent } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./PinInput.module.css\";\n\nexport type PinInputType = \"numeric\" | \"alphanumeric\";\nexport type PinInputSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface PinInputProps {\n /** Number of cells. Default `6`. */\n length?: number;\n /** Allowed character set. `numeric` (default) rejects letters, `alphanumeric` allows both. */\n type?: PinInputType;\n /** Visual size. Default `\"md\"`. */\n size?: PinInputSize;\n /** Controlled value. */\n value?: string;\n /** Initial value (uncontrolled mode). */\n defaultValue?: string;\n /** Fires on every change with the current concatenated value. */\n onChange?: (value: string) => void;\n /** Fires when the user fills the last cell. */\n onComplete?: (value: string) => void;\n /** Show characters obscured (`*`). Default `false`. */\n masked?: boolean;\n /** Label rendered above the cells. */\n label?: string;\n /** Helper text below the cells. */\n helperText?: string;\n /** Error message — turns cells red and replaces helperText. */\n error?: string;\n /** Disable all cells. */\n disabled?: boolean;\n /** Auto-focus the first cell on mount. Default `false`. */\n autoFocus?: boolean;\n /** id for the wrapping group label association. */\n id?: string;\n className?: string;\n}\n\nconst NUMERIC = /[0-9]/;\nconst ALNUM = /[A-Za-z0-9]/;\n\n/**\n * One-time-password style input — N independent cells, paste support, auto-\n * advance on input, backspace flows back, arrow keys navigate.\n *\n * @example\n * <PinInput length={6} type=\"numeric\" onComplete={(otp) => verify(otp)} />\n */\nexport const PinInput = forwardRef<HTMLDivElement, PinInputProps>(function PinInput(\n {\n length = 6,\n type = \"numeric\",\n size = \"md\",\n value,\n defaultValue,\n onChange,\n onComplete,\n masked = false,\n label,\n helperText,\n error,\n disabled = false,\n autoFocus = false,\n id,\n className,\n },\n ref,\n) {\n const internalId = useId();\n const wrapperId = id ?? internalId;\n const isControlled = value !== undefined;\n const [internal, setInternal] = useState<string>(defaultValue ?? \"\");\n const current = isControlled ? (value ?? \"\") : internal;\n const cells = Array.from({ length }, (_, index) => current[index] ?? \"\");\n const inputsRef = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = type === \"numeric\" ? NUMERIC : ALNUM;\n\n useEffect(() => {\n if (autoFocus) inputsRef.current[0]?.focus();\n }, [autoFocus]);\n\n const update = (next: string): void => {\n const trimmed = next.slice(0, length);\n if (!isControlled) setInternal(trimmed);\n onChange?.(trimmed);\n if (trimmed.length === length) onComplete?.(trimmed);\n };\n\n const focusCell = (index: number): void => {\n const safe = Math.max(0, Math.min(length - 1, index));\n inputsRef.current[safe]?.focus();\n inputsRef.current[safe]?.select();\n };\n\n const onCellChange = (index: number) => (event: ChangeEvent<HTMLInputElement>) => {\n const char = event.target.value.slice(-1);\n if (char && !pattern.test(char)) return;\n const next = cells.slice();\n next[index] = char;\n update(next.join(\"\"));\n if (char) focusCell(index + 1);\n };\n\n const onCellKeyDown = (index: number) => (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key === \"Backspace\") {\n if (!cells[index] && index > 0) {\n event.preventDefault();\n const next = cells.slice();\n next[index - 1] = \"\";\n update(next.join(\"\"));\n focusCell(index - 1);\n }\n } else if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n focusCell(index - 1);\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n focusCell(index + 1);\n }\n };\n\n const onPaste = (event: ClipboardEvent<HTMLInputElement>): void => {\n const text = event.clipboardData\n .getData(\"text\")\n .split(\"\")\n .filter((c) => pattern.test(c))\n .join(\"\");\n if (!text) return;\n event.preventDefault();\n update(text);\n focusCell(Math.min(length - 1, text.length));\n };\n\n return (\n <div\n ref={ref}\n className={cn(styles.wrapper, error && styles.error, className)}\n id={wrapperId}\n >\n {label && <label className={styles.label}>{label}</label>}\n <div className={cn(styles.cells, styles[size])} role=\"group\" aria-label={label}>\n {cells.map((cell, index) => (\n <input\n key={index}\n ref={(node) => {\n inputsRef.current[index] = node;\n }}\n type={masked ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={index === 0 ? \"one-time-code\" : \"off\"}\n maxLength={1}\n value={cell}\n disabled={disabled}\n className={styles.cell}\n aria-label={`Dígito ${index + 1}`}\n aria-invalid={!!error}\n onChange={onCellChange(index)}\n onKeyDown={onCellKeyDown(index)}\n onPaste={onPaste}\n />\n ))}\n </div>\n {error ? (\n <span className={styles.errorText}>{error}</span>\n ) : helperText ? (\n <span className={styles.helper}>{helperText}</span>\n ) : null}\n </div>\n );\n});\n"],"mappings":";;;;;AA+CA,IAAME,IAAU,SACVC,IAAQ,eASDC,IAAWC,EAA0C,SAC9D,EACI,YAAS,GACT,UAAO,WACP,UAAO,MACP,UACA,iBACA,aACA,eACA,YAAS,IACT,UACA,eACA,UACA,cAAW,IACX,eAAY,IACZ,OACA,gBAEJ,GACF;CACE,IAAMC,IAAaC,EAAM,GACnBC,IAAYC,KAAMH,GAClBI,IAAeC,MAAU,KAAA,GACzB,CAACC,GAAUC,KAAeC,EAAiBC,KAAgB,EAAE,GAC7DC,IAAUN,IAAgBC,KAAS,KAAMC,GACzCK,IAAQ,MAAM,KAAK,EAAE,UAAO,IAAI,GAAG,MAAUD,EAAQE,MAAU,EAAE,GACjEC,IAAYC,EAAoC,CAAC,CAAC,GAClDC,IAAUC,MAAS,YAAYpB,IAAUC;CAE/C,QAAgB;EACZ,AAAIoB,KAAWJ,EAAU,QAAQ,EAAE,EAAE,MAAM;CAC/C,GAAG,CAACI,CAAS,CAAC;CAEd,IAAMC,KAAU,MAAuB;EACnC,IAAMC,IAAUC,EAAK,MAAM,GAAGC,CAAM;EAGpC,AAFKjB,KAAcG,EAAYY,CAAO,GACtCG,IAAWH,CAAO,GACdA,EAAQ,WAAWE,KAAQE,IAAaJ,CAAO;CACvD,GAEMK,KAAa,MAAwB;EACvC,IAAMC,IAAO,KAAK,IAAI,GAAG,KAAK,IAAIJ,IAAS,GAAGT,CAAK,CAAC;EAEpD,AADAC,EAAU,QAAQY,EAAK,EAAE,MAAM,GAC/BZ,EAAU,QAAQY,EAAK,EAAE,OAAO;CACpC,GAEMC,KAAgB,OAAmB,MAAyC;EAC9E,IAAMC,IAAOC,EAAM,OAAO,MAAM,MAAM,EAAE;EACxC,IAAID,KAAQ,CAACZ,EAAQ,KAAKY,CAAI,GAAG;EACjC,IAAMP,IAAOT,EAAM,MAAM;EAGzB,AAFA,EAAKC,KAASe,GACdT,EAAOE,EAAK,KAAK,EAAE,CAAC,GAChBO,KAAMH,EAAUZ,IAAQ,CAAC;CACjC,GAEMiB,KAAiB,OAAmB,MAA2C;EACjF,IAAID,EAAM,QAAQ,aACV;OAAA,CAACjB,EAAMC,MAAUA,IAAQ,GAAG;IAC5B,EAAM,eAAe;IACrB,IAAMQ,IAAOT,EAAM,MAAM;IAGzB,AAFA,EAAKC,IAAQ,KAAK,IAClBM,EAAOE,EAAK,KAAK,EAAE,CAAC,GACpBI,EAAUZ,IAAQ,CAAC;GACvB;SACG,AAAIgB,EAAM,QAAQ,eACrBA,EAAM,eAAe,GACrBJ,EAAUZ,IAAQ,CAAC,KACZgB,EAAM,QAAQ,iBACrBA,EAAM,eAAe,GACrBJ,EAAUZ,IAAQ,CAAC;CAE3B,GAEMkB,KAAW,MAAkD;EAC/D,IAAMC,IAAOH,EAAM,cACd,QAAQ,MAAM,CAAC,CACf,MAAM,EAAE,CAAC,CACT,QAAQ,MAAMb,EAAQ,KAAKiB,CAAC,CAAC,CAAC,CAC9B,KAAK,EAAE;EACZ,AAAKD,MACLH,EAAM,eAAe,GACrBV,EAAOa,CAAI,GACXP,EAAU,KAAK,IAAIH,IAAS,GAAGU,EAAK,MAAM,CAAC;CAC/C;CAEA,OACI,kBAAC,OAAD;EACS;EACL,WAAWE,EAAGvC,EAAO,SAASwC,KAASxC,EAAO,OAAOyC,CAAS;EAC9D,IAAIjC;EAHR,UAAA;GAKKkC,KAAS,kBAAC,SAAD;IAAO,WAAW1C,EAAO;IAAQ,UAAA0C;GAAa,CAAA;GACxD,kBAAC,OAAD;IAAK,WAAWH,EAAGvC,EAAO,OAAOA,EAAO2C,EAAK;IAAG,MAAK;IAAQ,cAAYD;IACpE,UAAAzB,EAAM,KAAK,GAAM,MACd,kBAAC,SAAD;KAEI,MAAM,MAAS;MACX,EAAU,QAAQC,KAAS0B;KAC/B;KACA,MAAMC,IAAS,aAAa;KAC5B,WAAWvB,MAAS,YAAY,YAAY;KAC5C,cAAcJ,MAAU,IAAI,kBAAkB;KAC9C,WAAW;KACX,OAAO4B;KACG;KACV,WAAW9C,EAAO;KAClB,cAAY,UAAUkB,IAAQ;KAC9B,gBAAc,CAAC,CAACsB;KAChB,UAAUR,EAAad,CAAK;KAC5B,WAAWiB,EAAcjB,CAAK;KACrB;IACZ,GAhBQA,CAgBR,CACJ;GACA,CAAA;GACJsB,IACG,kBAAC,QAAD;IAAM,WAAWxC,EAAO;IAAY,UAAAwC;GAAY,CAAA,IAChDO,IACA,kBAAC,QAAD;IAAM,WAAW/C,EAAO;IAAS,UAAA+C;GAAiB,CAAA,IAClD;EACH;;AAEb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PinInput.module.cjs","names":[],"sources":["../../../src/components/PinInput/PinInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.cells {\n display: flex;\n gap: var(--tempest-space-2);\n}\n\n.cell {\n flex: 0 0 auto;\n text-align: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono, var(--tempest-font-sans));\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.cells.sm .cell {\n width: 32px;\n height: 36px;\n font-size: var(--tempest-text-md);\n}\n\n.cells.md .cell {\n width: 44px;\n height: 52px;\n font-size: var(--tempest-text-lg);\n}\n\n.cells.lg .cell {\n width: 56px;\n height: 64px;\n font-size: var(--tempest-text-xl);\n}\n\n.cell:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.cell:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.error .cell {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"PinInput.module.cjs","names":["wrapper","label","cells","cell","sm","md","lg","error","helper","errorText","PinInput_module_default"],"sources":["../../../src/components/PinInput/PinInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.cells {\n display: flex;\n gap: var(--tempest-space-2);\n}\n\n.cell {\n flex: 0 0 auto;\n text-align: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono, var(--tempest-font-sans));\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.cells.sm .cell {\n width: 32px;\n height: 36px;\n font-size: var(--tempest-text-md);\n}\n\n.cells.md .cell {\n width: 44px;\n height: 52px;\n font-size: var(--tempest-text-lg);\n}\n\n.cells.lg .cell {\n width: 56px;\n height: 64px;\n font-size: var(--tempest-text-xl);\n}\n\n.cell:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.cell:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.error .cell {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PinInput.module.js","names":[],"sources":["../../../src/components/PinInput/PinInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.cells {\n display: flex;\n gap: var(--tempest-space-2);\n}\n\n.cell {\n flex: 0 0 auto;\n text-align: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono, var(--tempest-font-sans));\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.cells.sm .cell {\n width: 32px;\n height: 36px;\n font-size: var(--tempest-text-md);\n}\n\n.cells.md .cell {\n width: 44px;\n height: 52px;\n font-size: var(--tempest-text-lg);\n}\n\n.cells.lg .cell {\n width: 56px;\n height: 64px;\n font-size: var(--tempest-text-xl);\n}\n\n.cell:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.cell:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.error .cell {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"PinInput.module.js","names":["wrapper","label","cells","cell","sm","md","lg","error","helper","errorText","PinInput_module_default"],"sources":["../../../src/components/PinInput/PinInput.module.css"],"sourcesContent":[".wrapper {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-1);\n font-family: var(--tempest-font-sans);\n}\n\n.label {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n color: var(--tempest-text);\n}\n\n.cells {\n display: flex;\n gap: var(--tempest-space-2);\n}\n\n.cell {\n flex: 0 0 auto;\n text-align: center;\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n background: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono, var(--tempest-font-sans));\n transition: border-color var(--tempest-duration-fast, 120ms);\n}\n\n.cells.sm .cell {\n width: 32px;\n height: 36px;\n font-size: var(--tempest-text-md);\n}\n\n.cells.md .cell {\n width: 44px;\n height: 52px;\n font-size: var(--tempest-text-lg);\n}\n\n.cells.lg .cell {\n width: 56px;\n height: 64px;\n font-size: var(--tempest-text-xl);\n}\n\n.cell:focus {\n outline: none;\n border-color: var(--tempest-primary);\n box-shadow: 0 0 0 var(--tempest-focus-ring-width, 2px)\n var(--tempest-focus-ring-color, currentColor);\n}\n\n.cell:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n.error .cell {\n border-color: var(--tempest-danger-border, var(--tempest-danger));\n}\n\n.helper {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-text-muted);\n}\n\n.errorText {\n font-size: var(--tempest-text-xs);\n color: var(--tempest-danger-fg, var(--tempest-danger));\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.cjs","names":[],"sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — trigger and children are the two halves, placement\n * is where it lands, portal is whether it escapes the tree, and open/onOpenChange/defaultOpen is the standard controlled-\n * or-not pair. closeOnEsc and closeOnOutsideClick are separate because a popover\n * holding a form wants one and not the other.\n */\nimport { useCallback, useEffect, useId, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { Portal } from \"@/components/Portal\";\nimport { useAnchorPosition } from \"@/components/Portal/anchor-position\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport { usePortalTabOrder } from \"@/components/Portal/tab-bridge\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Popover.module.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n /** Trigger element. Receives `onClick`/`aria-expanded`/`aria-controls`. */\n trigger: ReactElement<{\n onClick?: (e: React.MouseEvent) => void;\n \"aria-expanded\"?: boolean;\n \"aria-controls\"?: string;\n }>;\n children: ReactNode;\n placement?: PopoverPlacement;\n /**\n * Render the panel in a portal, positioned against the trigger. Default `true`.\n *\n * In flow, any ancestor with `overflow` other than `visible` clips the panel —\n * inside a `DataTable` cell only 3% of it was visible (measured in Chrome at\n * 1440 px). In a portal it escapes the clip, flips to the opposite side when\n * the requested one has no room, and follows the trigger on scroll and resize.\n * `false` keeps the in-flow panel.\n */\n portal?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Called when the user toggles or dismisses. */\n onOpenChange?: (open: boolean) => void;\n /** Default open state for uncontrolled usage. */\n defaultOpen?: boolean;\n /** Close on Escape. Default true. */\n closeOnEsc?: boolean;\n /** Close on outside click. Default true. */\n closeOnOutsideClick?: boolean;\n className?: string;\n}\n\n/** Gap between trigger and panel, in px — the in-flow CSS uses the same 8 px. */\nconst POPOVER_OFFSET = 8;\n\n/**\n * Lightweight popover. Renders a panel anchored to a trigger, dismissed on\n * outside click / Escape.\n *\n * Portalled by default, with viewport-aware placement: the panel flips to the\n * opposite side when the requested one overflows, and is clamped inside the\n * viewport otherwise.\n */\nexport function Popover({\n trigger,\n children,\n placement = \"bottom\",\n portal = true,\n open,\n onOpenChange,\n defaultOpen = false,\n closeOnEsc = true,\n closeOnOutsideClick = true,\n className,\n}: PopoverProps) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);\n const isOpen = isControlled ? open : internalOpen;\n const id = useId();\n const [rootNode, setRootNode] = useState<HTMLSpanElement | null>(null);\n const [panelNode, setPanelNode] = useState<HTMLDivElement | null>(null);\n const floatingStyle = useAnchorPosition({\n anchor: rootNode,\n floating: panelNode,\n side: placement,\n align: \"center\",\n offset: POPOVER_OFFSET,\n enabled: portal && isOpen,\n });\n usePortalTabOrder({ enabled: portal && isOpen, anchor: rootNode, panel: panelNode });\n\n const setOpen = useCallback(\n (next: boolean): void => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n useEscapeLayer(isOpen && closeOnEsc, () => setOpen(false));\n\n /**\n * Dismiss on a press outside both trigger and panel.\n *\n * The panel is checked on its own because in a portal it is not inside the\n * trigger's wrapper, and a press inside it — on a form field, say — would\n * otherwise count as outside.\n */\n useEffect(() => {\n if (!isOpen) return;\n const onDown = (event: MouseEvent): void => {\n if (!closeOnOutsideClick) return;\n const target = event.target as Node;\n if (rootNode?.contains(target) || panelNode?.contains(target)) return;\n setOpen(false);\n };\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [isOpen, closeOnOutsideClick, setOpen, rootNode, panelNode]);\n\n const handleTriggerClick = (event: React.MouseEvent): void => {\n trigger.props.onClick?.(event);\n setOpen(!isOpen);\n };\n\n const triggerClone = {\n ...trigger,\n props: {\n ...trigger.props,\n onClick: handleTriggerClick,\n \"aria-expanded\": isOpen,\n \"aria-controls\": id,\n },\n } as ReactElement;\n\n const panel = (\n <div\n ref={setPanelNode}\n id={id}\n role=\"dialog\"\n className={cn(styles.popover, portal ? styles.portalled : styles[placement], className)}\n style={floatingStyle}\n >\n {children}\n </div>\n );\n\n return (\n <span ref={setRootNode} className={styles.root}>\n {triggerClone}\n {isOpen && (portal ? <Portal>{panel}</Portal> : panel)}\n </span>\n );\n}\n"],"mappings":"yRAkDA,
|
|
1
|
+
{"version":3,"file":"Popover.cjs","names":["useState","useId","useAnchorPosition","useCallback","cn","styles","Portal","require_cn","require_escape_layer","require_Portal","require_anchor_position","require_tab_bridge","require_Popover_module","react","react_jsx_runtime","POPOVER_OFFSET","Popover","isControlled","open","internalOpen","setInternalOpen","defaultOpen","isOpen","id","rootNode","setRootNode","panelNode","setPanelNode","floatingStyle","placement","portal","setOpen","next","onOpenChange","closeOnEsc","onDown","closeOnOutsideClick","target","event","handleTriggerClick","trigger","triggerClone","panel","className"],"sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — trigger and children are the two halves, placement\n * is where it lands, portal is whether it escapes the tree, and open/onOpenChange/defaultOpen is the standard controlled-\n * or-not pair. closeOnEsc and closeOnOutsideClick are separate because a popover\n * holding a form wants one and not the other.\n */\nimport { useCallback, useEffect, useId, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { Portal } from \"@/components/Portal\";\nimport { useAnchorPosition } from \"@/components/Portal/anchor-position\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport { usePortalTabOrder } from \"@/components/Portal/tab-bridge\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Popover.module.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n /** Trigger element. Receives `onClick`/`aria-expanded`/`aria-controls`. */\n trigger: ReactElement<{\n onClick?: (e: React.MouseEvent) => void;\n \"aria-expanded\"?: boolean;\n \"aria-controls\"?: string;\n }>;\n children: ReactNode;\n placement?: PopoverPlacement;\n /**\n * Render the panel in a portal, positioned against the trigger. Default `true`.\n *\n * In flow, any ancestor with `overflow` other than `visible` clips the panel —\n * inside a `DataTable` cell only 3% of it was visible (measured in Chrome at\n * 1440 px). In a portal it escapes the clip, flips to the opposite side when\n * the requested one has no room, and follows the trigger on scroll and resize.\n * `false` keeps the in-flow panel.\n */\n portal?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Called when the user toggles or dismisses. */\n onOpenChange?: (open: boolean) => void;\n /** Default open state for uncontrolled usage. */\n defaultOpen?: boolean;\n /** Close on Escape. Default true. */\n closeOnEsc?: boolean;\n /** Close on outside click. Default true. */\n closeOnOutsideClick?: boolean;\n className?: string;\n}\n\n/** Gap between trigger and panel, in px — the in-flow CSS uses the same 8 px. */\nconst POPOVER_OFFSET = 8;\n\n/**\n * Lightweight popover. Renders a panel anchored to a trigger, dismissed on\n * outside click / Escape.\n *\n * Portalled by default, with viewport-aware placement: the panel flips to the\n * opposite side when the requested one overflows, and is clamped inside the\n * viewport otherwise.\n */\nexport function Popover({\n trigger,\n children,\n placement = \"bottom\",\n portal = true,\n open,\n onOpenChange,\n defaultOpen = false,\n closeOnEsc = true,\n closeOnOutsideClick = true,\n className,\n}: PopoverProps) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);\n const isOpen = isControlled ? open : internalOpen;\n const id = useId();\n const [rootNode, setRootNode] = useState<HTMLSpanElement | null>(null);\n const [panelNode, setPanelNode] = useState<HTMLDivElement | null>(null);\n const floatingStyle = useAnchorPosition({\n anchor: rootNode,\n floating: panelNode,\n side: placement,\n align: \"center\",\n offset: POPOVER_OFFSET,\n enabled: portal && isOpen,\n });\n usePortalTabOrder({ enabled: portal && isOpen, anchor: rootNode, panel: panelNode });\n\n const setOpen = useCallback(\n (next: boolean): void => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n useEscapeLayer(isOpen && closeOnEsc, () => setOpen(false));\n\n /**\n * Dismiss on a press outside both trigger and panel.\n *\n * The panel is checked on its own because in a portal it is not inside the\n * trigger's wrapper, and a press inside it — on a form field, say — would\n * otherwise count as outside.\n */\n useEffect(() => {\n if (!isOpen) return;\n const onDown = (event: MouseEvent): void => {\n if (!closeOnOutsideClick) return;\n const target = event.target as Node;\n if (rootNode?.contains(target) || panelNode?.contains(target)) return;\n setOpen(false);\n };\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [isOpen, closeOnOutsideClick, setOpen, rootNode, panelNode]);\n\n const handleTriggerClick = (event: React.MouseEvent): void => {\n trigger.props.onClick?.(event);\n setOpen(!isOpen);\n };\n\n const triggerClone = {\n ...trigger,\n props: {\n ...trigger.props,\n onClick: handleTriggerClick,\n \"aria-expanded\": isOpen,\n \"aria-controls\": id,\n },\n } as ReactElement;\n\n const panel = (\n <div\n ref={setPanelNode}\n id={id}\n role=\"dialog\"\n className={cn(styles.popover, portal ? styles.portalled : styles[placement], className)}\n style={floatingStyle}\n >\n {children}\n </div>\n );\n\n return (\n <span ref={setRootNode} className={styles.root}>\n {triggerClone}\n {isOpen && (portal ? <Portal>{panel}</Portal> : panel)}\n </span>\n );\n}\n"],"mappings":"A,yRAkDA,IAAMe,EAAiB,EAUvB,SAAgBC,EAAQ,CACpB,UACA,WACA,YAAY,SACZ,SAAS,GACT,OACA,eACA,cAAc,GACd,aAAa,GACb,sBAAsB,GACtB,aACa,CACb,IAAMC,EAAeC,IAAS,IAAA,GACxB,CAACC,EAAcC,IAAA,EAAmBpB,EAAAA,SAAAA,CAAkBqB,CAAW,EAC/DC,EAASL,EAAeC,EAAOC,EAC/BI,GAAA,EAAKtB,EAAAA,MAAAA,CAAM,EACX,CAACuB,EAAUC,IAAA,EAAezB,EAAAA,SAAAA,CAAiC,IAAI,EAC/D,CAAC0B,EAAWC,IAAA,EAAgB3B,EAAAA,SAAAA,CAAgC,IAAI,EAChE4B,EAAgB1B,EAAAA,kBAAkB,CACpC,OAAQsB,EACR,SAAUE,EACV,KAAMG,EACN,MAAO,SACP,OAAQd,EACR,QAASe,GAAUR,CACvB,CAAC,EACDX,EAAA,kBAAkB,CAAE,QAASmB,GAAUR,EAAQ,OAAQE,EAAU,MAAOE,CAAU,CAAC,EAEnF,IAAMK,GAAA,EAAU5B,EAAAA,YAAAA,CACX,GAAwB,CAChBc,GAAcG,EAAgBY,CAAI,EACvCC,IAAeD,CAAI,CACvB,EACA,CAACf,EAAcgB,CAAY,CAC/B,EAEAzB,EAAA,eAAec,GAAUY,MAAkBH,EAAQ,EAAK,CAAC,GASzD,EAAAlB,EAAA,UAAA,KAAgB,CACZ,GAAI,CAACS,EAAQ,OACb,IAAMa,EAAU,GAA4B,CACxC,GAAI,CAACC,EAAqB,OAC1B,IAAMC,EAASC,EAAM,OACjBd,GAAU,SAASa,CAAM,GAAKX,GAAW,SAASW,CAAM,GAC5DN,EAAQ,EAAK,CACjB,EAEA,OADA,OAAO,iBAAiB,YAAaI,CAAM,MAC9B,CACT,OAAO,oBAAoB,YAAaA,CAAM,CAClD,CACJ,EAAG,CAACb,EAAQc,EAAqBL,EAASP,EAAUE,CAAS,CAAC,EAE9D,IAAMa,EAAsB,GAAkC,CAC1DC,EAAQ,MAAM,UAAUF,CAAK,EAC7BP,EAAQ,CAACT,CAAM,CACnB,EAEMmB,EAAe,CACjB,GAAGD,EACH,MAAO,CACH,GAAGA,EAAQ,MACX,QAASD,EACT,gBAAiBjB,EACjB,gBAAiBC,CACrB,CACJ,EAEMmB,GACF,EAAA5B,EAAA,IAAA,CAAC,MAAD,CACI,IAAKa,EACD,KACJ,KAAK,SACL,UAAWvB,EAAAA,GAAGC,EAAAA,QAAO,QAASyB,EAASzB,EAAAA,QAAO,UAAYA,EAAAA,QAAOwB,GAAYc,CAAS,EACtF,MAAOf,EAEN,UACA,CAAA,EAGT,OACI,EAAAd,EAAA,KAAA,CAAC,OAAD,CAAM,IAAKW,EAAa,UAAWpB,EAAAA,QAAO,KAA1C,SAAA,CACKoC,EACAnB,IAAWQ,GAAS,EAAAhB,EAAA,IAAA,CAACR,EAAAA,OAAD,CAAA,SAASoC,CAAc,CAAA,EAAIA,EAC9C,C,EAEd,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.js","names":[],"sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — trigger and children are the two halves, placement\n * is where it lands, portal is whether it escapes the tree, and open/onOpenChange/defaultOpen is the standard controlled-\n * or-not pair. closeOnEsc and closeOnOutsideClick are separate because a popover\n * holding a form wants one and not the other.\n */\nimport { useCallback, useEffect, useId, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { Portal } from \"@/components/Portal\";\nimport { useAnchorPosition } from \"@/components/Portal/anchor-position\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport { usePortalTabOrder } from \"@/components/Portal/tab-bridge\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Popover.module.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n /** Trigger element. Receives `onClick`/`aria-expanded`/`aria-controls`. */\n trigger: ReactElement<{\n onClick?: (e: React.MouseEvent) => void;\n \"aria-expanded\"?: boolean;\n \"aria-controls\"?: string;\n }>;\n children: ReactNode;\n placement?: PopoverPlacement;\n /**\n * Render the panel in a portal, positioned against the trigger. Default `true`.\n *\n * In flow, any ancestor with `overflow` other than `visible` clips the panel —\n * inside a `DataTable` cell only 3% of it was visible (measured in Chrome at\n * 1440 px). In a portal it escapes the clip, flips to the opposite side when\n * the requested one has no room, and follows the trigger on scroll and resize.\n * `false` keeps the in-flow panel.\n */\n portal?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Called when the user toggles or dismisses. */\n onOpenChange?: (open: boolean) => void;\n /** Default open state for uncontrolled usage. */\n defaultOpen?: boolean;\n /** Close on Escape. Default true. */\n closeOnEsc?: boolean;\n /** Close on outside click. Default true. */\n closeOnOutsideClick?: boolean;\n className?: string;\n}\n\n/** Gap between trigger and panel, in px — the in-flow CSS uses the same 8 px. */\nconst POPOVER_OFFSET = 8;\n\n/**\n * Lightweight popover. Renders a panel anchored to a trigger, dismissed on\n * outside click / Escape.\n *\n * Portalled by default, with viewport-aware placement: the panel flips to the\n * opposite side when the requested one overflows, and is clamped inside the\n * viewport otherwise.\n */\nexport function Popover({\n trigger,\n children,\n placement = \"bottom\",\n portal = true,\n open,\n onOpenChange,\n defaultOpen = false,\n closeOnEsc = true,\n closeOnOutsideClick = true,\n className,\n}: PopoverProps) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);\n const isOpen = isControlled ? open : internalOpen;\n const id = useId();\n const [rootNode, setRootNode] = useState<HTMLSpanElement | null>(null);\n const [panelNode, setPanelNode] = useState<HTMLDivElement | null>(null);\n const floatingStyle = useAnchorPosition({\n anchor: rootNode,\n floating: panelNode,\n side: placement,\n align: \"center\",\n offset: POPOVER_OFFSET,\n enabled: portal && isOpen,\n });\n usePortalTabOrder({ enabled: portal && isOpen, anchor: rootNode, panel: panelNode });\n\n const setOpen = useCallback(\n (next: boolean): void => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n useEscapeLayer(isOpen && closeOnEsc, () => setOpen(false));\n\n /**\n * Dismiss on a press outside both trigger and panel.\n *\n * The panel is checked on its own because in a portal it is not inside the\n * trigger's wrapper, and a press inside it — on a form field, say — would\n * otherwise count as outside.\n */\n useEffect(() => {\n if (!isOpen) return;\n const onDown = (event: MouseEvent): void => {\n if (!closeOnOutsideClick) return;\n const target = event.target as Node;\n if (rootNode?.contains(target) || panelNode?.contains(target)) return;\n setOpen(false);\n };\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [isOpen, closeOnOutsideClick, setOpen, rootNode, panelNode]);\n\n const handleTriggerClick = (event: React.MouseEvent): void => {\n trigger.props.onClick?.(event);\n setOpen(!isOpen);\n };\n\n const triggerClone = {\n ...trigger,\n props: {\n ...trigger.props,\n onClick: handleTriggerClick,\n \"aria-expanded\": isOpen,\n \"aria-controls\": id,\n },\n } as ReactElement;\n\n const panel = (\n <div\n ref={setPanelNode}\n id={id}\n role=\"dialog\"\n className={cn(styles.popover, portal ? styles.portalled : styles[placement], className)}\n style={floatingStyle}\n >\n {children}\n </div>\n );\n\n return (\n <span ref={setRootNode} className={styles.root}>\n {triggerClone}\n {isOpen && (portal ? <Portal>{panel}</Portal> : panel)}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;AAkDA,
|
|
1
|
+
{"version":3,"file":"Popover.js","names":["styles","Popover_module_default","POPOVER_OFFSET","Popover","isControlled","open","internalOpen","setInternalOpen","useState","defaultOpen","isOpen","id","useId","rootNode","setRootNode","panelNode","setPanelNode","floatingStyle","useAnchorPosition","placement","portal","setOpen","useCallback","next","onOpenChange","useEscapeLayer","closeOnEsc","useEffect","onDown","closeOnOutsideClick","target","event","handleTriggerClick","trigger","triggerClone","panel","cn","className","Portal"],"sources":["../../../src/components/Popover/Popover.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — trigger and children are the two halves, placement\n * is where it lands, portal is whether it escapes the tree, and open/onOpenChange/defaultOpen is the standard controlled-\n * or-not pair. closeOnEsc and closeOnOutsideClick are separate because a popover\n * holding a form wants one and not the other.\n */\nimport { useCallback, useEffect, useId, useState } from \"react\";\nimport type { ReactElement, ReactNode } from \"react\";\nimport { Portal } from \"@/components/Portal\";\nimport { useAnchorPosition } from \"@/components/Portal/anchor-position\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport { usePortalTabOrder } from \"@/components/Portal/tab-bridge\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Popover.module.css\";\n\nexport type PopoverPlacement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface PopoverProps {\n /** Trigger element. Receives `onClick`/`aria-expanded`/`aria-controls`. */\n trigger: ReactElement<{\n onClick?: (e: React.MouseEvent) => void;\n \"aria-expanded\"?: boolean;\n \"aria-controls\"?: string;\n }>;\n children: ReactNode;\n placement?: PopoverPlacement;\n /**\n * Render the panel in a portal, positioned against the trigger. Default `true`.\n *\n * In flow, any ancestor with `overflow` other than `visible` clips the panel —\n * inside a `DataTable` cell only 3% of it was visible (measured in Chrome at\n * 1440 px). In a portal it escapes the clip, flips to the opposite side when\n * the requested one has no room, and follows the trigger on scroll and resize.\n * `false` keeps the in-flow panel.\n */\n portal?: boolean;\n /** Controlled open state. */\n open?: boolean;\n /** Called when the user toggles or dismisses. */\n onOpenChange?: (open: boolean) => void;\n /** Default open state for uncontrolled usage. */\n defaultOpen?: boolean;\n /** Close on Escape. Default true. */\n closeOnEsc?: boolean;\n /** Close on outside click. Default true. */\n closeOnOutsideClick?: boolean;\n className?: string;\n}\n\n/** Gap between trigger and panel, in px — the in-flow CSS uses the same 8 px. */\nconst POPOVER_OFFSET = 8;\n\n/**\n * Lightweight popover. Renders a panel anchored to a trigger, dismissed on\n * outside click / Escape.\n *\n * Portalled by default, with viewport-aware placement: the panel flips to the\n * opposite side when the requested one overflows, and is clamped inside the\n * viewport otherwise.\n */\nexport function Popover({\n trigger,\n children,\n placement = \"bottom\",\n portal = true,\n open,\n onOpenChange,\n defaultOpen = false,\n closeOnEsc = true,\n closeOnOutsideClick = true,\n className,\n}: PopoverProps) {\n const isControlled = open !== undefined;\n const [internalOpen, setInternalOpen] = useState<boolean>(defaultOpen);\n const isOpen = isControlled ? open : internalOpen;\n const id = useId();\n const [rootNode, setRootNode] = useState<HTMLSpanElement | null>(null);\n const [panelNode, setPanelNode] = useState<HTMLDivElement | null>(null);\n const floatingStyle = useAnchorPosition({\n anchor: rootNode,\n floating: panelNode,\n side: placement,\n align: \"center\",\n offset: POPOVER_OFFSET,\n enabled: portal && isOpen,\n });\n usePortalTabOrder({ enabled: portal && isOpen, anchor: rootNode, panel: panelNode });\n\n const setOpen = useCallback(\n (next: boolean): void => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange],\n );\n\n useEscapeLayer(isOpen && closeOnEsc, () => setOpen(false));\n\n /**\n * Dismiss on a press outside both trigger and panel.\n *\n * The panel is checked on its own because in a portal it is not inside the\n * trigger's wrapper, and a press inside it — on a form field, say — would\n * otherwise count as outside.\n */\n useEffect(() => {\n if (!isOpen) return;\n const onDown = (event: MouseEvent): void => {\n if (!closeOnOutsideClick) return;\n const target = event.target as Node;\n if (rootNode?.contains(target) || panelNode?.contains(target)) return;\n setOpen(false);\n };\n window.addEventListener(\"mousedown\", onDown);\n return () => {\n window.removeEventListener(\"mousedown\", onDown);\n };\n }, [isOpen, closeOnOutsideClick, setOpen, rootNode, panelNode]);\n\n const handleTriggerClick = (event: React.MouseEvent): void => {\n trigger.props.onClick?.(event);\n setOpen(!isOpen);\n };\n\n const triggerClone = {\n ...trigger,\n props: {\n ...trigger.props,\n onClick: handleTriggerClick,\n \"aria-expanded\": isOpen,\n \"aria-controls\": id,\n },\n } as ReactElement;\n\n const panel = (\n <div\n ref={setPanelNode}\n id={id}\n role=\"dialog\"\n className={cn(styles.popover, portal ? styles.portalled : styles[placement], className)}\n style={floatingStyle}\n >\n {children}\n </div>\n );\n\n return (\n <span ref={setRootNode} className={styles.root}>\n {triggerClone}\n {isOpen && (portal ? <Portal>{panel}</Portal> : panel)}\n </span>\n );\n}\n"],"mappings":";;;;;;;;;AAkDA,IAAME,IAAiB;AAUvB,SAAgBC,EAAQ,EACpB,YACA,aACA,eAAY,UACZ,YAAS,IACT,SACA,iBACA,iBAAc,IACd,gBAAa,IACb,yBAAsB,IACtB,gBACa;CACb,IAAMC,IAAeC,MAAS,KAAA,GACxB,CAACC,GAAcC,KAAmBC,EAAkBC,CAAW,GAC/DC,IAASN,IAAeC,IAAOC,GAC/BK,IAAKC,EAAM,GACX,CAACC,GAAUC,KAAeN,EAAiC,IAAI,GAC/D,CAACO,GAAWC,KAAgBR,EAAgC,IAAI,GAChES,IAAgBC,EAAkB;EACpC,QAAQL;EACR,UAAUE;EACV,MAAMI;EACN,OAAO;EACP,QAAQjB;EACR,SAASkB,KAAUV;CACvB,CAAC;CACD,EAAkB;EAAE,SAASU,KAAUV;EAAQ,QAAQG;EAAU,OAAOE;CAAU,CAAC;CAEnF,IAAMM,IAAUC,GACX,MAAwB;EAErB,AADKlB,KAAcG,EAAgBgB,CAAI,GACvCC,IAAeD,CAAI;CACvB,GACA,CAACnB,GAAcoB,CAAY,CAC/B;CAWA,AATAC,EAAef,KAAUgB,SAAkBL,EAAQ,EAAK,CAAC,GASzDM,QAAgB;EACZ,IAAI,CAACjB,GAAQ;EACb,IAAMkB,KAAU,MAA4B;GACxC,IAAI,CAACC,GAAqB;GAC1B,IAAMC,IAASC,EAAM;GACrB,AAAIlB,GAAU,SAASiB,CAAM,KAAKf,GAAW,SAASe,CAAM,KAC5DT,EAAQ,EAAK;EACjB;EAEA,OADA,OAAO,iBAAiB,aAAaO,CAAM,SAC9B;GACT,OAAO,oBAAoB,aAAaA,CAAM;EAClD;CACJ,GAAG;EAAClB;EAAQmB;EAAqBR;EAASR;EAAUE;CAAS,CAAC;CAE9D,IAAMiB,KAAsB,MAAkC;EAE1D,AADAC,EAAQ,MAAM,UAAUF,CAAK,GAC7BV,EAAQ,CAACX,CAAM;CACnB,GAEMwB,IAAe;EACjB,GAAGD;EACH,OAAO;GACH,GAAGA,EAAQ;GACX,SAASD;GACT,iBAAiBtB;GACjB,iBAAiBC;EACrB;CACJ,GAEMwB,IACF,kBAAC,OAAD;EACI,KAAKnB;EACD;EACJ,MAAK;EACL,WAAWoB,EAAGpC,EAAO,SAASoB,IAASpB,EAAO,YAAYA,EAAOmB,IAAYkB,CAAS;EACtF,OAAOpB;EAEN;CACA,CAAA;CAGT,OACI,kBAAC,QAAD;EAAM,KAAKH;EAAa,WAAWd,EAAO;EAA1C,UAAA,CACKkC,GACAxB,MAAWU,IAAS,kBAACkB,GAAD,EAAA,UAASH,EAAc,CAAA,IAAIA,EAC9C;;AAEd"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.module.cjs","names":[],"sources":["../../../src/components/Popover/Popover.module.css"],"sourcesContent":[".root {\n position: relative;\n display: inline-flex;\n}\n\n.popover {\n position: absolute;\n z-index: var(--tempest-z-popover);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n min-width: 200px;\n max-width: 320px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n animation: tempest-popover-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.popover:focus {\n outline: none;\n}\n\n.portalled {\n --tempest-popover-tx: 0;\n}\n\n/* Placements (center-aligned across the trigger). */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n\n@keyframes tempest-popover-in {\n from {\n opacity: 0;\n transform: translate(var(--tempest-popover-tx, -50%), 4px);\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .popover {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Popover.module.cjs","names":["root","popover","tempestPopoverIn","portalled","top","bottom","left","right","Popover_module_default"],"sources":["../../../src/components/Popover/Popover.module.css"],"sourcesContent":[".root {\n position: relative;\n display: inline-flex;\n}\n\n.popover {\n position: absolute;\n z-index: var(--tempest-z-popover);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n min-width: 200px;\n max-width: 320px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n animation: tempest-popover-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.popover:focus {\n outline: none;\n}\n\n.portalled {\n --tempest-popover-tx: 0;\n}\n\n/* Placements (center-aligned across the trigger). */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n\n@keyframes tempest-popover-in {\n from {\n opacity: 0;\n transform: translate(var(--tempest-popover-tx, -50%), 4px);\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .popover {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.module.js","names":[],"sources":["../../../src/components/Popover/Popover.module.css"],"sourcesContent":[".root {\n position: relative;\n display: inline-flex;\n}\n\n.popover {\n position: absolute;\n z-index: var(--tempest-z-popover);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n min-width: 200px;\n max-width: 320px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n animation: tempest-popover-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.popover:focus {\n outline: none;\n}\n\n.portalled {\n --tempest-popover-tx: 0;\n}\n\n/* Placements (center-aligned across the trigger). */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n\n@keyframes tempest-popover-in {\n from {\n opacity: 0;\n transform: translate(var(--tempest-popover-tx, -50%), 4px);\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .popover {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Popover.module.js","names":["root","popover","tempestPopoverIn","portalled","top","bottom","left","right","Popover_module_default"],"sources":["../../../src/components/Popover/Popover.module.css"],"sourcesContent":[".root {\n position: relative;\n display: inline-flex;\n}\n\n.popover {\n position: absolute;\n z-index: var(--tempest-z-popover);\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n box-shadow: var(--tempest-shadow-lg);\n padding: var(--tempest-space-3) var(--tempest-space-4);\n min-width: 200px;\n max-width: 320px;\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-snug);\n animation: tempest-popover-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.popover:focus {\n outline: none;\n}\n\n.portalled {\n --tempest-popover-tx: 0;\n}\n\n/* Placements (center-aligned across the trigger). */\n.top {\n bottom: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.bottom {\n top: calc(100% + 8px);\n left: 50%;\n transform: translateX(-50%);\n}\n.left {\n right: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n.right {\n left: calc(100% + 8px);\n top: 50%;\n transform: translateY(-50%);\n}\n\n@keyframes tempest-popover-in {\n from {\n opacity: 0;\n transform: translate(var(--tempest-popover-tx, -50%), 4px);\n }\n to {\n opacity: 1;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .popover {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Portal.cjs","names":[],"sources":["../../../src/components/Portal/Portal.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { usePortalHost } from \"./portal-host\";\n\nexport interface PortalProps {\n /** Content rendered through the portal. */\n children: ReactNode;\n /**\n * Target DOM node to render into.\n *\n * Defaults to the fullscreen element while one is presented, and to\n * `document.body` otherwise.\n */\n container?: Element | null;\n}\n\n/**\n * Renders its children into a different part of the DOM tree via a React portal.\n *\n * Useful for overlays (modals, tooltips, dropdowns) that must escape parent\n * overflow/stacking contexts.\n *\n * Without `container` the target is the element currently presented fullscreen,\n * and `document.body` the rest of the time. `body` alone would be wrong during\n * fullscreen: the browser paints only the fullscreen element's subtree, so an\n * overlay mounted outside it is invisible and unclickable while looking perfectly\n * healthy in the DOM. Passing `container` opts out of that and pins the target.\n *\n * SSR-safe: renders `null` on the server and on the first client render, then\n * mounts the portal after hydration (when `document` is available).\n *\n * @param props - The portal props.\n * @returns The portal node once mounted, otherwise `null`.\n */\nexport function Portal({ children, container }: PortalProps): ReactNode {\n const [mounted, setMounted] = useState(false);\n const host = usePortalHost();\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n const target = container ?? host;\n if (!mounted || !target) return null;\n\n return createPortal(children, target);\n}\n"],"mappings":"mFAkCA,
|
|
1
|
+
{"version":3,"file":"Portal.cjs","names":["useState","usePortalHost","createPortal","require_portal_host","react","react_dom","Portal","mounted","setMounted","host","target","container","children"],"sources":["../../../src/components/Portal/Portal.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { usePortalHost } from \"./portal-host\";\n\nexport interface PortalProps {\n /** Content rendered through the portal. */\n children: ReactNode;\n /**\n * Target DOM node to render into.\n *\n * Defaults to the fullscreen element while one is presented, and to\n * `document.body` otherwise.\n */\n container?: Element | null;\n}\n\n/**\n * Renders its children into a different part of the DOM tree via a React portal.\n *\n * Useful for overlays (modals, tooltips, dropdowns) that must escape parent\n * overflow/stacking contexts.\n *\n * Without `container` the target is the element currently presented fullscreen,\n * and `document.body` the rest of the time. `body` alone would be wrong during\n * fullscreen: the browser paints only the fullscreen element's subtree, so an\n * overlay mounted outside it is invisible and unclickable while looking perfectly\n * healthy in the DOM. Passing `container` opts out of that and pins the target.\n *\n * SSR-safe: renders `null` on the server and on the first client render, then\n * mounts the portal after hydration (when `document` is available).\n *\n * @param props - The portal props.\n * @returns The portal node once mounted, otherwise `null`.\n */\nexport function Portal({ children, container }: PortalProps): ReactNode {\n const [mounted, setMounted] = useState(false);\n const host = usePortalHost();\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n const target = container ?? host;\n if (!mounted || !target) return null;\n\n return createPortal(children, target);\n}\n"],"mappings":"A,mFAkCA,SAAgBM,EAAO,CAAE,WAAU,aAAqC,CACpE,GAAM,CAACC,EAASC,IAAA,EAAcR,EAAAA,SAAAA,CAAS,EAAK,EACtCS,EAAOR,EAAAA,cAAc,GAE3B,EAAAG,EAAA,UAAA,MACII,EAAW,EAAI,MACFA,EAAW,EAAK,GAC9B,CAAC,CAAC,EAEL,IAAME,EAASC,GAAaF,EAG5B,MAFI,CAACF,GAAW,CAACG,EAAe,MAEhC,EAAOR,EAAAA,aAAAA,CAAaU,EAAUF,CAAM,CACxC,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Portal.js","names":[],"sources":["../../../src/components/Portal/Portal.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { usePortalHost } from \"./portal-host\";\n\nexport interface PortalProps {\n /** Content rendered through the portal. */\n children: ReactNode;\n /**\n * Target DOM node to render into.\n *\n * Defaults to the fullscreen element while one is presented, and to\n * `document.body` otherwise.\n */\n container?: Element | null;\n}\n\n/**\n * Renders its children into a different part of the DOM tree via a React portal.\n *\n * Useful for overlays (modals, tooltips, dropdowns) that must escape parent\n * overflow/stacking contexts.\n *\n * Without `container` the target is the element currently presented fullscreen,\n * and `document.body` the rest of the time. `body` alone would be wrong during\n * fullscreen: the browser paints only the fullscreen element's subtree, so an\n * overlay mounted outside it is invisible and unclickable while looking perfectly\n * healthy in the DOM. Passing `container` opts out of that and pins the target.\n *\n * SSR-safe: renders `null` on the server and on the first client render, then\n * mounts the portal after hydration (when `document` is available).\n *\n * @param props - The portal props.\n * @returns The portal node once mounted, otherwise `null`.\n */\nexport function Portal({ children, container }: PortalProps): ReactNode {\n const [mounted, setMounted] = useState(false);\n const host = usePortalHost();\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n const target = container ?? host;\n if (!mounted || !target) return null;\n\n return createPortal(children, target);\n}\n"],"mappings":";;;;AAkCA,
|
|
1
|
+
{"version":3,"file":"Portal.js","names":["Portal","mounted","setMounted","useState","host","usePortalHost","target","container","createPortal","children"],"sources":["../../../src/components/Portal/Portal.tsx"],"sourcesContent":["import { useEffect, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { usePortalHost } from \"./portal-host\";\n\nexport interface PortalProps {\n /** Content rendered through the portal. */\n children: ReactNode;\n /**\n * Target DOM node to render into.\n *\n * Defaults to the fullscreen element while one is presented, and to\n * `document.body` otherwise.\n */\n container?: Element | null;\n}\n\n/**\n * Renders its children into a different part of the DOM tree via a React portal.\n *\n * Useful for overlays (modals, tooltips, dropdowns) that must escape parent\n * overflow/stacking contexts.\n *\n * Without `container` the target is the element currently presented fullscreen,\n * and `document.body` the rest of the time. `body` alone would be wrong during\n * fullscreen: the browser paints only the fullscreen element's subtree, so an\n * overlay mounted outside it is invisible and unclickable while looking perfectly\n * healthy in the DOM. Passing `container` opts out of that and pins the target.\n *\n * SSR-safe: renders `null` on the server and on the first client render, then\n * mounts the portal after hydration (when `document` is available).\n *\n * @param props - The portal props.\n * @returns The portal node once mounted, otherwise `null`.\n */\nexport function Portal({ children, container }: PortalProps): ReactNode {\n const [mounted, setMounted] = useState(false);\n const host = usePortalHost();\n\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n const target = container ?? host;\n if (!mounted || !target) return null;\n\n return createPortal(children, target);\n}\n"],"mappings":";;;;AAkCA,SAAgBA,EAAO,EAAE,aAAU,gBAAqC;CACpE,IAAM,CAACC,GAASC,KAAcC,EAAS,EAAK,GACtCC,IAAOC,EAAc;CAE3B,SACIH,EAAW,EAAI,SACFA,EAAW,EAAK,IAC9B,CAAC,CAAC;CAEL,IAAMI,IAASC,KAAaH;CAG5B,OAFI,CAACH,KAAW,CAACK,IAAe,OAEzBE,EAAaC,GAAUH,CAAM;AACxC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor-position.cjs","names":[],"sources":["../../../src/components/Portal/anchor-position.ts"],"sourcesContent":["import { useLayoutEffect, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\n\n/** Side of the anchor a floating layer is placed on. */\nexport type AnchorSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/** Alignment of the floating layer along the anchor's edge. */\nexport type AnchorAlign = \"start\" | \"center\" | \"end\";\n\n/** The viewport-relative box a placement is computed from. */\nexport interface AnchorRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** Everything {@link computeAnchorPosition} needs, all in CSS pixels. */\nexport interface AnchorGeometry {\n anchor: AnchorRect;\n width: number;\n height: number;\n viewportWidth: number;\n viewportHeight: number;\n side: AnchorSide;\n align: AnchorAlign;\n offset: number;\n margin: number;\n}\n\n/** A resolved placement: viewport coordinates plus the side actually used. */\nexport interface AnchorPlacement {\n top: number;\n left: number;\n side: AnchorSide;\n}\n\n/** What {@link useAnchorPosition} keeps between measurements. */\ninterface MeasuredPlacement extends AnchorPlacement {\n /** The anchor's width, when the layer matches it. */\n width: number | undefined;\n}\n\nconst OPPOSITE: Record<AnchorSide, AnchorSide> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\n/** Distance kept between a floating layer and the viewport edge, in px. */\nexport const ANCHOR_VIEWPORT_MARGIN = 8;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, Math.max(min, max)));\n}\n\nfunction mainAxis(geometry: AnchorGeometry, side: AnchorSide): number {\n const { anchor, width, height, offset } = geometry;\n switch (side) {\n case \"top\":\n return anchor.top - offset - height;\n case \"bottom\":\n return anchor.top + anchor.height + offset;\n case \"left\":\n return anchor.left - offset - width;\n case \"right\":\n default:\n return anchor.left + anchor.width + offset;\n }\n}\n\nfunction fits(geometry: AnchorGeometry, side: AnchorSide): boolean {\n const { width, height, viewportWidth, viewportHeight, margin } = geometry;\n const start = mainAxis(geometry, side);\n const size = side === \"top\" || side === \"bottom\" ? height : width;\n const limit = side === \"top\" || side === \"bottom\" ? viewportHeight : viewportWidth;\n return start >= margin && start + size <= limit - margin;\n}\n\nfunction crossAxis(start: number, length: number, size: number, align: AnchorAlign): number {\n if (align === \"start\") return start;\n if (align === \"end\") return start + length - size;\n return start + (length - size) / 2;\n}\n\n/**\n * Place a floating layer next to its anchor, inside the viewport.\n *\n * The requested side wins when the layer fits there. When it does not and the\n * opposite side does, the layer flips — the case that matters is the action menu\n * of the last row of a table near the bottom of the screen, which would otherwise\n * open below the fold. When neither side fits, the requested one is kept and the\n * layer is clamped, because a partially visible menu the user can scroll to beats\n * one that jumps sides depending on a pixel.\n *\n * Both axes are then clamped to the viewport minus `margin`.\n *\n * @param geometry - The anchor box, the floating layer's size, the viewport, and\n * the requested placement.\n * @returns The viewport coordinates for a `position: fixed` layer, and the side\n * that was used after flipping.\n */\nexport function computeAnchorPosition(geometry: AnchorGeometry): AnchorPlacement {\n const { anchor, width, height, viewportWidth, viewportHeight, align, margin } = geometry;\n const requested = geometry.side;\n const flipped = OPPOSITE[requested];\n const side = !fits(geometry, requested) && fits(geometry, flipped) ? flipped : requested;\n const vertical = side === \"top\" || side === \"bottom\";\n const main = mainAxis(geometry, side);\n const top = vertical ? main : crossAxis(anchor.top, anchor.height, height, align);\n const left = vertical ? crossAxis(anchor.left, anchor.width, width, align) : main;\n return {\n top: clamp(top, margin, viewportHeight - height - margin),\n left: clamp(left, margin, viewportWidth - width - margin),\n side,\n };\n}\n\n/** Options of {@link useAnchorPosition}. */\nexport interface AnchorPositionOptions {\n /** Element the layer is anchored to. */\n anchor: HTMLElement | null;\n /** The floating layer itself, once mounted. */\n floating: HTMLElement | null;\n side: AnchorSide;\n align: AnchorAlign;\n /** Gap between anchor and layer, in px. */\n offset: number;\n /** When false the hook does nothing and returns `undefined`. */\n enabled: boolean;\n /**\n * Give the layer the anchor's width — a listbox under its input. Default\n * `false`.\n */\n matchWidth?: boolean;\n}\n\n/**\n * Keep a portalled layer glued to its anchor.\n *\n * Takes the floating element as a value rather than a ref, because `Portal`\n * renders `null` on its first pass and mounts in an effect: a layout effect keyed\n * off `open` would run while the layer does not exist and measure nothing. With\n * the node held in state (a callback ref), the effect runs on the render that has\n * it, and `useLayoutEffect` settles the position before the first paint.\n *\n * The size comes from `offsetWidth`/`offsetHeight`, not from\n * `getBoundingClientRect`, which reports the transformed box — the layers enter\n * with a `translate`/`scale` animation, and the transformed rect would place them\n * a few pixels off. The anchor's rect is the right one to read: it is where the\n * trigger is painted.\n *\n * Scroll (captured, so a scrolling table wrapper counts) and resize reposition the\n * layer on the next animation frame, so a menu open inside a table that scrolls\n * follows its row instead of floating where the row used to be. So does a change\n * in the size of either box, through a `ResizeObserver`: a combobox list flipped\n * above its input shrinks as the user types, and a multi-select field grows a\n * line as chips are added — without the observer the list would keep its old\n * top and float away from the field, or cover it.\n *\n * With `matchWidth` the anchor's width is written to the layer **before** its\n * height is read, so the height is measured at the width it will be painted at —\n * a list whose options wrap at the narrower width is taller.\n *\n * The unmeasured first pass is **not** hidden with `visibility: hidden`: an\n * element under it cannot take focus, and the menu's focus effect runs before\n * the measured re-render, so the first entry silently kept no focus (measured in\n * Chrome; jsdom does not enforce it). Nothing is painted at the unmeasured\n * position anyway — the layout effect re-renders before the browser paints.\n *\n * @param options - Anchor, floating node, placement, and whether it is active.\n * @returns A `position: fixed` style for the layer, or `undefined` when disabled.\n */\nexport function useAnchorPosition({\n anchor,\n floating,\n side,\n align,\n offset,\n enabled,\n matchWidth = false,\n}: AnchorPositionOptions): CSSProperties | undefined {\n const [placement, setPlacement] = useState<MeasuredPlacement | null>(null);\n\n useLayoutEffect(() => {\n if (!enabled || !anchor || !floating) {\n setPlacement(null);\n return;\n }\n const update = (): void => {\n const rect = anchor.getBoundingClientRect();\n const width = matchWidth ? rect.width : undefined;\n if (width !== undefined) floating.style.setProperty(\"width\", `${width}px`);\n const position = computeAnchorPosition({\n anchor: { top: rect.top, left: rect.left, width: rect.width, height: rect.height },\n width: floating.offsetWidth,\n height: floating.offsetHeight,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n side,\n align,\n offset,\n margin: ANCHOR_VIEWPORT_MARGIN,\n });\n const next: MeasuredPlacement = { ...position, width };\n setPlacement((current) =>\n current &&\n current.top === next.top &&\n current.left === next.left &&\n current.side === next.side &&\n current.width === next.width\n ? current\n : next,\n );\n };\n update();\n let frame = 0;\n const schedule = (): void => {\n if (frame !== 0) return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n update();\n });\n };\n window.addEventListener(\"scroll\", schedule, { capture: true, passive: true });\n window.addEventListener(\"resize\", schedule);\n const observer =\n typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(schedule);\n observer?.observe(floating);\n observer?.observe(anchor);\n return () => {\n observer?.disconnect();\n if (frame !== 0) cancelAnimationFrame(frame);\n window.removeEventListener(\"scroll\", schedule, { capture: true });\n window.removeEventListener(\"resize\", schedule);\n };\n }, [enabled, anchor, floating, side, align, offset, matchWidth]);\n\n if (!enabled) return undefined;\n return {\n position: \"fixed\",\n top: placement?.top ?? 0,\n left: placement?.left ?? 0,\n width: placement?.width,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anchor-position.cjs","names":["useState","react","OPPOSITE","clamp","min","value","max","mainAxis","geometry","side","anchor","offset","height","width","fits","start","size","limit","viewportHeight","viewportWidth","margin","crossAxis","align","length","computeAnchorPosition","requested","flipped","vertical","main","top","left","useAnchorPosition","placement","setPlacement","enabled","floating","update","rect","matchWidth","next","current","frame","schedule","observer"],"sources":["../../../src/components/Portal/anchor-position.ts"],"sourcesContent":["import { useLayoutEffect, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\n\n/** Side of the anchor a floating layer is placed on. */\nexport type AnchorSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/** Alignment of the floating layer along the anchor's edge. */\nexport type AnchorAlign = \"start\" | \"center\" | \"end\";\n\n/** The viewport-relative box a placement is computed from. */\nexport interface AnchorRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** Everything {@link computeAnchorPosition} needs, all in CSS pixels. */\nexport interface AnchorGeometry {\n anchor: AnchorRect;\n width: number;\n height: number;\n viewportWidth: number;\n viewportHeight: number;\n side: AnchorSide;\n align: AnchorAlign;\n offset: number;\n margin: number;\n}\n\n/** A resolved placement: viewport coordinates plus the side actually used. */\nexport interface AnchorPlacement {\n top: number;\n left: number;\n side: AnchorSide;\n}\n\n/** What {@link useAnchorPosition} keeps between measurements. */\ninterface MeasuredPlacement extends AnchorPlacement {\n /** The anchor's width, when the layer matches it. */\n width: number | undefined;\n}\n\nconst OPPOSITE: Record<AnchorSide, AnchorSide> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\n/** Distance kept between a floating layer and the viewport edge, in px. */\nexport const ANCHOR_VIEWPORT_MARGIN = 8;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, Math.max(min, max)));\n}\n\nfunction mainAxis(geometry: AnchorGeometry, side: AnchorSide): number {\n const { anchor, width, height, offset } = geometry;\n switch (side) {\n case \"top\":\n return anchor.top - offset - height;\n case \"bottom\":\n return anchor.top + anchor.height + offset;\n case \"left\":\n return anchor.left - offset - width;\n case \"right\":\n default:\n return anchor.left + anchor.width + offset;\n }\n}\n\nfunction fits(geometry: AnchorGeometry, side: AnchorSide): boolean {\n const { width, height, viewportWidth, viewportHeight, margin } = geometry;\n const start = mainAxis(geometry, side);\n const size = side === \"top\" || side === \"bottom\" ? height : width;\n const limit = side === \"top\" || side === \"bottom\" ? viewportHeight : viewportWidth;\n return start >= margin && start + size <= limit - margin;\n}\n\nfunction crossAxis(start: number, length: number, size: number, align: AnchorAlign): number {\n if (align === \"start\") return start;\n if (align === \"end\") return start + length - size;\n return start + (length - size) / 2;\n}\n\n/**\n * Place a floating layer next to its anchor, inside the viewport.\n *\n * The requested side wins when the layer fits there. When it does not and the\n * opposite side does, the layer flips — the case that matters is the action menu\n * of the last row of a table near the bottom of the screen, which would otherwise\n * open below the fold. When neither side fits, the requested one is kept and the\n * layer is clamped, because a partially visible menu the user can scroll to beats\n * one that jumps sides depending on a pixel.\n *\n * Both axes are then clamped to the viewport minus `margin`.\n *\n * @param geometry - The anchor box, the floating layer's size, the viewport, and\n * the requested placement.\n * @returns The viewport coordinates for a `position: fixed` layer, and the side\n * that was used after flipping.\n */\nexport function computeAnchorPosition(geometry: AnchorGeometry): AnchorPlacement {\n const { anchor, width, height, viewportWidth, viewportHeight, align, margin } = geometry;\n const requested = geometry.side;\n const flipped = OPPOSITE[requested];\n const side = !fits(geometry, requested) && fits(geometry, flipped) ? flipped : requested;\n const vertical = side === \"top\" || side === \"bottom\";\n const main = mainAxis(geometry, side);\n const top = vertical ? main : crossAxis(anchor.top, anchor.height, height, align);\n const left = vertical ? crossAxis(anchor.left, anchor.width, width, align) : main;\n return {\n top: clamp(top, margin, viewportHeight - height - margin),\n left: clamp(left, margin, viewportWidth - width - margin),\n side,\n };\n}\n\n/** Options of {@link useAnchorPosition}. */\nexport interface AnchorPositionOptions {\n /** Element the layer is anchored to. */\n anchor: HTMLElement | null;\n /** The floating layer itself, once mounted. */\n floating: HTMLElement | null;\n side: AnchorSide;\n align: AnchorAlign;\n /** Gap between anchor and layer, in px. */\n offset: number;\n /** When false the hook does nothing and returns `undefined`. */\n enabled: boolean;\n /**\n * Give the layer the anchor's width — a listbox under its input. Default\n * `false`.\n */\n matchWidth?: boolean;\n}\n\n/**\n * Keep a portalled layer glued to its anchor.\n *\n * Takes the floating element as a value rather than a ref, because `Portal`\n * renders `null` on its first pass and mounts in an effect: a layout effect keyed\n * off `open` would run while the layer does not exist and measure nothing. With\n * the node held in state (a callback ref), the effect runs on the render that has\n * it, and `useLayoutEffect` settles the position before the first paint.\n *\n * The size comes from `offsetWidth`/`offsetHeight`, not from\n * `getBoundingClientRect`, which reports the transformed box — the layers enter\n * with a `translate`/`scale` animation, and the transformed rect would place them\n * a few pixels off. The anchor's rect is the right one to read: it is where the\n * trigger is painted.\n *\n * Scroll (captured, so a scrolling table wrapper counts) and resize reposition the\n * layer on the next animation frame, so a menu open inside a table that scrolls\n * follows its row instead of floating where the row used to be. So does a change\n * in the size of either box, through a `ResizeObserver`: a combobox list flipped\n * above its input shrinks as the user types, and a multi-select field grows a\n * line as chips are added — without the observer the list would keep its old\n * top and float away from the field, or cover it.\n *\n * With `matchWidth` the anchor's width is written to the layer **before** its\n * height is read, so the height is measured at the width it will be painted at —\n * a list whose options wrap at the narrower width is taller.\n *\n * The unmeasured first pass is **not** hidden with `visibility: hidden`: an\n * element under it cannot take focus, and the menu's focus effect runs before\n * the measured re-render, so the first entry silently kept no focus (measured in\n * Chrome; jsdom does not enforce it). Nothing is painted at the unmeasured\n * position anyway — the layout effect re-renders before the browser paints.\n *\n * @param options - Anchor, floating node, placement, and whether it is active.\n * @returns A `position: fixed` style for the layer, or `undefined` when disabled.\n */\nexport function useAnchorPosition({\n anchor,\n floating,\n side,\n align,\n offset,\n enabled,\n matchWidth = false,\n}: AnchorPositionOptions): CSSProperties | undefined {\n const [placement, setPlacement] = useState<MeasuredPlacement | null>(null);\n\n useLayoutEffect(() => {\n if (!enabled || !anchor || !floating) {\n setPlacement(null);\n return;\n }\n const update = (): void => {\n const rect = anchor.getBoundingClientRect();\n const width = matchWidth ? rect.width : undefined;\n if (width !== undefined) floating.style.setProperty(\"width\", `${width}px`);\n const position = computeAnchorPosition({\n anchor: { top: rect.top, left: rect.left, width: rect.width, height: rect.height },\n width: floating.offsetWidth,\n height: floating.offsetHeight,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n side,\n align,\n offset,\n margin: ANCHOR_VIEWPORT_MARGIN,\n });\n const next: MeasuredPlacement = { ...position, width };\n setPlacement((current) =>\n current &&\n current.top === next.top &&\n current.left === next.left &&\n current.side === next.side &&\n current.width === next.width\n ? current\n : next,\n );\n };\n update();\n let frame = 0;\n const schedule = (): void => {\n if (frame !== 0) return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n update();\n });\n };\n window.addEventListener(\"scroll\", schedule, { capture: true, passive: true });\n window.addEventListener(\"resize\", schedule);\n const observer =\n typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(schedule);\n observer?.observe(floating);\n observer?.observe(anchor);\n return () => {\n observer?.disconnect();\n if (frame !== 0) cancelAnimationFrame(frame);\n window.removeEventListener(\"scroll\", schedule, { capture: true });\n window.removeEventListener(\"resize\", schedule);\n };\n }, [enabled, anchor, floating, side, align, offset, matchWidth]);\n\n if (!enabled) return undefined;\n return {\n position: \"fixed\",\n top: placement?.top ?? 0,\n left: placement?.left ?? 0,\n width: placement?.width,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor-position.js","names":[],"sources":["../../../src/components/Portal/anchor-position.ts"],"sourcesContent":["import { useLayoutEffect, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\n\n/** Side of the anchor a floating layer is placed on. */\nexport type AnchorSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/** Alignment of the floating layer along the anchor's edge. */\nexport type AnchorAlign = \"start\" | \"center\" | \"end\";\n\n/** The viewport-relative box a placement is computed from. */\nexport interface AnchorRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** Everything {@link computeAnchorPosition} needs, all in CSS pixels. */\nexport interface AnchorGeometry {\n anchor: AnchorRect;\n width: number;\n height: number;\n viewportWidth: number;\n viewportHeight: number;\n side: AnchorSide;\n align: AnchorAlign;\n offset: number;\n margin: number;\n}\n\n/** A resolved placement: viewport coordinates plus the side actually used. */\nexport interface AnchorPlacement {\n top: number;\n left: number;\n side: AnchorSide;\n}\n\n/** What {@link useAnchorPosition} keeps between measurements. */\ninterface MeasuredPlacement extends AnchorPlacement {\n /** The anchor's width, when the layer matches it. */\n width: number | undefined;\n}\n\nconst OPPOSITE: Record<AnchorSide, AnchorSide> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\n/** Distance kept between a floating layer and the viewport edge, in px. */\nexport const ANCHOR_VIEWPORT_MARGIN = 8;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, Math.max(min, max)));\n}\n\nfunction mainAxis(geometry: AnchorGeometry, side: AnchorSide): number {\n const { anchor, width, height, offset } = geometry;\n switch (side) {\n case \"top\":\n return anchor.top - offset - height;\n case \"bottom\":\n return anchor.top + anchor.height + offset;\n case \"left\":\n return anchor.left - offset - width;\n case \"right\":\n default:\n return anchor.left + anchor.width + offset;\n }\n}\n\nfunction fits(geometry: AnchorGeometry, side: AnchorSide): boolean {\n const { width, height, viewportWidth, viewportHeight, margin } = geometry;\n const start = mainAxis(geometry, side);\n const size = side === \"top\" || side === \"bottom\" ? height : width;\n const limit = side === \"top\" || side === \"bottom\" ? viewportHeight : viewportWidth;\n return start >= margin && start + size <= limit - margin;\n}\n\nfunction crossAxis(start: number, length: number, size: number, align: AnchorAlign): number {\n if (align === \"start\") return start;\n if (align === \"end\") return start + length - size;\n return start + (length - size) / 2;\n}\n\n/**\n * Place a floating layer next to its anchor, inside the viewport.\n *\n * The requested side wins when the layer fits there. When it does not and the\n * opposite side does, the layer flips — the case that matters is the action menu\n * of the last row of a table near the bottom of the screen, which would otherwise\n * open below the fold. When neither side fits, the requested one is kept and the\n * layer is clamped, because a partially visible menu the user can scroll to beats\n * one that jumps sides depending on a pixel.\n *\n * Both axes are then clamped to the viewport minus `margin`.\n *\n * @param geometry - The anchor box, the floating layer's size, the viewport, and\n * the requested placement.\n * @returns The viewport coordinates for a `position: fixed` layer, and the side\n * that was used after flipping.\n */\nexport function computeAnchorPosition(geometry: AnchorGeometry): AnchorPlacement {\n const { anchor, width, height, viewportWidth, viewportHeight, align, margin } = geometry;\n const requested = geometry.side;\n const flipped = OPPOSITE[requested];\n const side = !fits(geometry, requested) && fits(geometry, flipped) ? flipped : requested;\n const vertical = side === \"top\" || side === \"bottom\";\n const main = mainAxis(geometry, side);\n const top = vertical ? main : crossAxis(anchor.top, anchor.height, height, align);\n const left = vertical ? crossAxis(anchor.left, anchor.width, width, align) : main;\n return {\n top: clamp(top, margin, viewportHeight - height - margin),\n left: clamp(left, margin, viewportWidth - width - margin),\n side,\n };\n}\n\n/** Options of {@link useAnchorPosition}. */\nexport interface AnchorPositionOptions {\n /** Element the layer is anchored to. */\n anchor: HTMLElement | null;\n /** The floating layer itself, once mounted. */\n floating: HTMLElement | null;\n side: AnchorSide;\n align: AnchorAlign;\n /** Gap between anchor and layer, in px. */\n offset: number;\n /** When false the hook does nothing and returns `undefined`. */\n enabled: boolean;\n /**\n * Give the layer the anchor's width — a listbox under its input. Default\n * `false`.\n */\n matchWidth?: boolean;\n}\n\n/**\n * Keep a portalled layer glued to its anchor.\n *\n * Takes the floating element as a value rather than a ref, because `Portal`\n * renders `null` on its first pass and mounts in an effect: a layout effect keyed\n * off `open` would run while the layer does not exist and measure nothing. With\n * the node held in state (a callback ref), the effect runs on the render that has\n * it, and `useLayoutEffect` settles the position before the first paint.\n *\n * The size comes from `offsetWidth`/`offsetHeight`, not from\n * `getBoundingClientRect`, which reports the transformed box — the layers enter\n * with a `translate`/`scale` animation, and the transformed rect would place them\n * a few pixels off. The anchor's rect is the right one to read: it is where the\n * trigger is painted.\n *\n * Scroll (captured, so a scrolling table wrapper counts) and resize reposition the\n * layer on the next animation frame, so a menu open inside a table that scrolls\n * follows its row instead of floating where the row used to be. So does a change\n * in the size of either box, through a `ResizeObserver`: a combobox list flipped\n * above its input shrinks as the user types, and a multi-select field grows a\n * line as chips are added — without the observer the list would keep its old\n * top and float away from the field, or cover it.\n *\n * With `matchWidth` the anchor's width is written to the layer **before** its\n * height is read, so the height is measured at the width it will be painted at —\n * a list whose options wrap at the narrower width is taller.\n *\n * The unmeasured first pass is **not** hidden with `visibility: hidden`: an\n * element under it cannot take focus, and the menu's focus effect runs before\n * the measured re-render, so the first entry silently kept no focus (measured in\n * Chrome; jsdom does not enforce it). Nothing is painted at the unmeasured\n * position anyway — the layout effect re-renders before the browser paints.\n *\n * @param options - Anchor, floating node, placement, and whether it is active.\n * @returns A `position: fixed` style for the layer, or `undefined` when disabled.\n */\nexport function useAnchorPosition({\n anchor,\n floating,\n side,\n align,\n offset,\n enabled,\n matchWidth = false,\n}: AnchorPositionOptions): CSSProperties | undefined {\n const [placement, setPlacement] = useState<MeasuredPlacement | null>(null);\n\n useLayoutEffect(() => {\n if (!enabled || !anchor || !floating) {\n setPlacement(null);\n return;\n }\n const update = (): void => {\n const rect = anchor.getBoundingClientRect();\n const width = matchWidth ? rect.width : undefined;\n if (width !== undefined) floating.style.setProperty(\"width\", `${width}px`);\n const position = computeAnchorPosition({\n anchor: { top: rect.top, left: rect.left, width: rect.width, height: rect.height },\n width: floating.offsetWidth,\n height: floating.offsetHeight,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n side,\n align,\n offset,\n margin: ANCHOR_VIEWPORT_MARGIN,\n });\n const next: MeasuredPlacement = { ...position, width };\n setPlacement((current) =>\n current &&\n current.top === next.top &&\n current.left === next.left &&\n current.side === next.side &&\n current.width === next.width\n ? current\n : next,\n );\n };\n update();\n let frame = 0;\n const schedule = (): void => {\n if (frame !== 0) return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n update();\n });\n };\n window.addEventListener(\"scroll\", schedule, { capture: true, passive: true });\n window.addEventListener(\"resize\", schedule);\n const observer =\n typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(schedule);\n observer?.observe(floating);\n observer?.observe(anchor);\n return () => {\n observer?.disconnect();\n if (frame !== 0) cancelAnimationFrame(frame);\n window.removeEventListener(\"scroll\", schedule, { capture: true });\n window.removeEventListener(\"resize\", schedule);\n };\n }, [enabled, anchor, floating, side, align, offset, matchWidth]);\n\n if (!enabled) return undefined;\n return {\n position: \"fixed\",\n top: placement?.top ?? 0,\n left: placement?.left ?? 0,\n width: placement?.width,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anchor-position.js","names":["OPPOSITE","clamp","min","value","max","mainAxis","geometry","side","anchor","offset","height","width","fits","start","size","limit","viewportHeight","viewportWidth","margin","crossAxis","align","length","computeAnchorPosition","requested","flipped","vertical","main","top","left","useAnchorPosition","placement","setPlacement","useState","useLayoutEffect","enabled","floating","update","rect","matchWidth","next","current","frame","schedule","observer"],"sources":["../../../src/components/Portal/anchor-position.ts"],"sourcesContent":["import { useLayoutEffect, useState } from \"react\";\nimport type { CSSProperties } from \"react\";\n\n/** Side of the anchor a floating layer is placed on. */\nexport type AnchorSide = \"top\" | \"bottom\" | \"left\" | \"right\";\n\n/** Alignment of the floating layer along the anchor's edge. */\nexport type AnchorAlign = \"start\" | \"center\" | \"end\";\n\n/** The viewport-relative box a placement is computed from. */\nexport interface AnchorRect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\n/** Everything {@link computeAnchorPosition} needs, all in CSS pixels. */\nexport interface AnchorGeometry {\n anchor: AnchorRect;\n width: number;\n height: number;\n viewportWidth: number;\n viewportHeight: number;\n side: AnchorSide;\n align: AnchorAlign;\n offset: number;\n margin: number;\n}\n\n/** A resolved placement: viewport coordinates plus the side actually used. */\nexport interface AnchorPlacement {\n top: number;\n left: number;\n side: AnchorSide;\n}\n\n/** What {@link useAnchorPosition} keeps between measurements. */\ninterface MeasuredPlacement extends AnchorPlacement {\n /** The anchor's width, when the layer matches it. */\n width: number | undefined;\n}\n\nconst OPPOSITE: Record<AnchorSide, AnchorSide> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n};\n\n/** Distance kept between a floating layer and the viewport edge, in px. */\nexport const ANCHOR_VIEWPORT_MARGIN = 8;\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(value, Math.max(min, max)));\n}\n\nfunction mainAxis(geometry: AnchorGeometry, side: AnchorSide): number {\n const { anchor, width, height, offset } = geometry;\n switch (side) {\n case \"top\":\n return anchor.top - offset - height;\n case \"bottom\":\n return anchor.top + anchor.height + offset;\n case \"left\":\n return anchor.left - offset - width;\n case \"right\":\n default:\n return anchor.left + anchor.width + offset;\n }\n}\n\nfunction fits(geometry: AnchorGeometry, side: AnchorSide): boolean {\n const { width, height, viewportWidth, viewportHeight, margin } = geometry;\n const start = mainAxis(geometry, side);\n const size = side === \"top\" || side === \"bottom\" ? height : width;\n const limit = side === \"top\" || side === \"bottom\" ? viewportHeight : viewportWidth;\n return start >= margin && start + size <= limit - margin;\n}\n\nfunction crossAxis(start: number, length: number, size: number, align: AnchorAlign): number {\n if (align === \"start\") return start;\n if (align === \"end\") return start + length - size;\n return start + (length - size) / 2;\n}\n\n/**\n * Place a floating layer next to its anchor, inside the viewport.\n *\n * The requested side wins when the layer fits there. When it does not and the\n * opposite side does, the layer flips — the case that matters is the action menu\n * of the last row of a table near the bottom of the screen, which would otherwise\n * open below the fold. When neither side fits, the requested one is kept and the\n * layer is clamped, because a partially visible menu the user can scroll to beats\n * one that jumps sides depending on a pixel.\n *\n * Both axes are then clamped to the viewport minus `margin`.\n *\n * @param geometry - The anchor box, the floating layer's size, the viewport, and\n * the requested placement.\n * @returns The viewport coordinates for a `position: fixed` layer, and the side\n * that was used after flipping.\n */\nexport function computeAnchorPosition(geometry: AnchorGeometry): AnchorPlacement {\n const { anchor, width, height, viewportWidth, viewportHeight, align, margin } = geometry;\n const requested = geometry.side;\n const flipped = OPPOSITE[requested];\n const side = !fits(geometry, requested) && fits(geometry, flipped) ? flipped : requested;\n const vertical = side === \"top\" || side === \"bottom\";\n const main = mainAxis(geometry, side);\n const top = vertical ? main : crossAxis(anchor.top, anchor.height, height, align);\n const left = vertical ? crossAxis(anchor.left, anchor.width, width, align) : main;\n return {\n top: clamp(top, margin, viewportHeight - height - margin),\n left: clamp(left, margin, viewportWidth - width - margin),\n side,\n };\n}\n\n/** Options of {@link useAnchorPosition}. */\nexport interface AnchorPositionOptions {\n /** Element the layer is anchored to. */\n anchor: HTMLElement | null;\n /** The floating layer itself, once mounted. */\n floating: HTMLElement | null;\n side: AnchorSide;\n align: AnchorAlign;\n /** Gap between anchor and layer, in px. */\n offset: number;\n /** When false the hook does nothing and returns `undefined`. */\n enabled: boolean;\n /**\n * Give the layer the anchor's width — a listbox under its input. Default\n * `false`.\n */\n matchWidth?: boolean;\n}\n\n/**\n * Keep a portalled layer glued to its anchor.\n *\n * Takes the floating element as a value rather than a ref, because `Portal`\n * renders `null` on its first pass and mounts in an effect: a layout effect keyed\n * off `open` would run while the layer does not exist and measure nothing. With\n * the node held in state (a callback ref), the effect runs on the render that has\n * it, and `useLayoutEffect` settles the position before the first paint.\n *\n * The size comes from `offsetWidth`/`offsetHeight`, not from\n * `getBoundingClientRect`, which reports the transformed box — the layers enter\n * with a `translate`/`scale` animation, and the transformed rect would place them\n * a few pixels off. The anchor's rect is the right one to read: it is where the\n * trigger is painted.\n *\n * Scroll (captured, so a scrolling table wrapper counts) and resize reposition the\n * layer on the next animation frame, so a menu open inside a table that scrolls\n * follows its row instead of floating where the row used to be. So does a change\n * in the size of either box, through a `ResizeObserver`: a combobox list flipped\n * above its input shrinks as the user types, and a multi-select field grows a\n * line as chips are added — without the observer the list would keep its old\n * top and float away from the field, or cover it.\n *\n * With `matchWidth` the anchor's width is written to the layer **before** its\n * height is read, so the height is measured at the width it will be painted at —\n * a list whose options wrap at the narrower width is taller.\n *\n * The unmeasured first pass is **not** hidden with `visibility: hidden`: an\n * element under it cannot take focus, and the menu's focus effect runs before\n * the measured re-render, so the first entry silently kept no focus (measured in\n * Chrome; jsdom does not enforce it). Nothing is painted at the unmeasured\n * position anyway — the layout effect re-renders before the browser paints.\n *\n * @param options - Anchor, floating node, placement, and whether it is active.\n * @returns A `position: fixed` style for the layer, or `undefined` when disabled.\n */\nexport function useAnchorPosition({\n anchor,\n floating,\n side,\n align,\n offset,\n enabled,\n matchWidth = false,\n}: AnchorPositionOptions): CSSProperties | undefined {\n const [placement, setPlacement] = useState<MeasuredPlacement | null>(null);\n\n useLayoutEffect(() => {\n if (!enabled || !anchor || !floating) {\n setPlacement(null);\n return;\n }\n const update = (): void => {\n const rect = anchor.getBoundingClientRect();\n const width = matchWidth ? rect.width : undefined;\n if (width !== undefined) floating.style.setProperty(\"width\", `${width}px`);\n const position = computeAnchorPosition({\n anchor: { top: rect.top, left: rect.left, width: rect.width, height: rect.height },\n width: floating.offsetWidth,\n height: floating.offsetHeight,\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n side,\n align,\n offset,\n margin: ANCHOR_VIEWPORT_MARGIN,\n });\n const next: MeasuredPlacement = { ...position, width };\n setPlacement((current) =>\n current &&\n current.top === next.top &&\n current.left === next.left &&\n current.side === next.side &&\n current.width === next.width\n ? current\n : next,\n );\n };\n update();\n let frame = 0;\n const schedule = (): void => {\n if (frame !== 0) return;\n frame = requestAnimationFrame(() => {\n frame = 0;\n update();\n });\n };\n window.addEventListener(\"scroll\", schedule, { capture: true, passive: true });\n window.addEventListener(\"resize\", schedule);\n const observer =\n typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(schedule);\n observer?.observe(floating);\n observer?.observe(anchor);\n return () => {\n observer?.disconnect();\n if (frame !== 0) cancelAnimationFrame(frame);\n window.removeEventListener(\"scroll\", schedule, { capture: true });\n window.removeEventListener(\"resize\", schedule);\n };\n }, [enabled, anchor, floating, side, align, offset, matchWidth]);\n\n if (!enabled) return undefined;\n return {\n position: \"fixed\",\n top: placement?.top ?? 0,\n left: placement?.left ?? 0,\n width: placement?.width,\n };\n}\n"],"mappings":"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"}
|