tempest-react-sdk 0.78.0 → 0.80.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/bin/lib/openapi/generate.hostile.test.mjs +45 -4
- package/bin/lib/openapi/generate.mjs +303 -88
- package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
- package/bin/lib/openapi/generate.test.mjs +462 -1
- package/bin/lib/openapi/schema-to-zod.mjs +4 -3
- package/dist/access/Can.cjs.map +1 -1
- package/dist/access/Can.js.map +1 -1
- package/dist/access/access-control-context.cjs.map +1 -1
- package/dist/access/access-control-context.js.map +1 -1
- package/dist/access/create-role-access-control.cjs.map +1 -1
- package/dist/access/create-role-access-control.js.map +1 -1
- package/dist/access/permissions-from-token.cjs.map +1 -1
- package/dist/access/permissions-from-token.js.map +1 -1
- package/dist/access/use-can.cjs.map +1 -1
- package/dist/access/use-can.js.map +1 -1
- package/dist/app/AppProviders.cjs.map +1 -1
- package/dist/app/AppProviders.js.map +1 -1
- package/dist/audio/audio-bus.cjs.map +1 -1
- package/dist/audio/audio-bus.js.map +1 -1
- package/dist/audio/audio-output.cjs.map +1 -1
- package/dist/audio/audio-output.js.map +1 -1
- package/dist/audio/audio-player.cjs.map +1 -1
- package/dist/audio/audio-player.js.map +1 -1
- package/dist/audio/audio-recorder.cjs.map +1 -1
- package/dist/audio/audio-recorder.js.map +1 -1
- package/dist/audio/duration.cjs.map +1 -1
- package/dist/audio/duration.js.map +1 -1
- package/dist/audio/level-meter.cjs.map +1 -1
- package/dist/audio/level-meter.js.map +1 -1
- package/dist/audio/media-access.cjs.map +1 -1
- package/dist/audio/media-access.js.map +1 -1
- package/dist/audio/noise-floor.cjs.map +1 -1
- package/dist/audio/noise-floor.js.map +1 -1
- package/dist/audio/sfx-pool.cjs.map +1 -1
- package/dist/audio/sfx-pool.js.map +1 -1
- package/dist/audio/use-audio-bus.cjs.map +1 -1
- package/dist/audio/use-audio-bus.js.map +1 -1
- package/dist/audio/use-audio-recorder.cjs.map +1 -1
- package/dist/audio/use-audio-recorder.js.map +1 -1
- package/dist/audio/use-audio.cjs.map +1 -1
- package/dist/audio/use-audio.js.map +1 -1
- package/dist/audio/use-microphone.cjs +1 -1
- package/dist/audio/use-microphone.cjs.map +1 -1
- package/dist/audio/use-microphone.js +1 -5
- package/dist/audio/use-microphone.js.map +1 -1
- package/dist/audio/use-sfx-pool.cjs.map +1 -1
- package/dist/audio/use-sfx-pool.js.map +1 -1
- package/dist/audio/voice-activity.cjs.map +1 -1
- package/dist/audio/voice-activity.js.map +1 -1
- package/dist/audio/voice-chain-stages.cjs.map +1 -1
- package/dist/audio/voice-chain-stages.js.map +1 -1
- package/dist/audio/voice-chain.cjs.map +1 -1
- package/dist/audio/voice-chain.js.map +1 -1
- package/dist/audio/wav.cjs.map +1 -1
- package/dist/audio/wav.js.map +1 -1
- package/dist/auth/AuthGuard.cjs.map +1 -1
- package/dist/auth/AuthGuard.js.map +1 -1
- package/dist/auth/create-auth-store.cjs.map +1 -1
- package/dist/auth/create-auth-store.js.map +1 -1
- package/dist/auth/create-tempest-auth.cjs +1 -1
- package/dist/auth/create-tempest-auth.cjs.map +1 -1
- package/dist/auth/create-tempest-auth.js +1 -3
- package/dist/auth/create-tempest-auth.js.map +1 -1
- package/dist/auth/jwt.cjs.map +1 -1
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/lazy-with-retry.cjs.map +1 -1
- package/dist/auth/lazy-with-retry.js.map +1 -1
- package/dist/auth/passkey.cjs.map +1 -1
- package/dist/auth/passkey.js.map +1 -1
- package/dist/auth/refresh-queue.cjs.map +1 -1
- package/dist/auth/refresh-queue.js.map +1 -1
- package/dist/auth/use-passkey.cjs +1 -1
- package/dist/auth/use-passkey.cjs.map +1 -1
- package/dist/auth/use-passkey.js +1 -1
- package/dist/auth/use-passkey.js.map +1 -1
- package/dist/br/BrazilMap.cjs.map +1 -1
- package/dist/br/BrazilMap.js.map +1 -1
- package/dist/br/BrazilMap.module.cjs.map +1 -1
- package/dist/br/BrazilMap.module.js.map +1 -1
- package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
- package/dist/br/BrazilStateCitySelect.js.map +1 -1
- package/dist/br/BrazilStateMap.cjs.map +1 -1
- package/dist/br/BrazilStateMap.js.map +1 -1
- package/dist/br/MapLegend.cjs.map +1 -1
- package/dist/br/MapLegend.js.map +1 -1
- package/dist/br/MapLegend.module.cjs.map +1 -1
- package/dist/br/MapLegend.module.js.map +1 -1
- package/dist/br/MapMarkers.cjs.map +1 -1
- package/dist/br/MapMarkers.js.map +1 -1
- package/dist/br/MapTooltip.cjs.map +1 -1
- package/dist/br/MapTooltip.js.map +1 -1
- package/dist/br/MunicipalitySearch.cjs +1 -1
- package/dist/br/MunicipalitySearch.cjs.map +1 -1
- package/dist/br/MunicipalitySearch.js +2 -5
- package/dist/br/MunicipalitySearch.js.map +1 -1
- package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
- package/dist/br/MunicipalitySearch.module.js.map +1 -1
- package/dist/br/PixQRCode.cjs.map +1 -1
- package/dist/br/PixQRCode.js.map +1 -1
- package/dist/br/PixQRCode.module.cjs.map +1 -1
- package/dist/br/PixQRCode.module.js.map +1 -1
- package/dist/br/boleto.cjs.map +1 -1
- package/dist/br/boleto.js.map +1 -1
- package/dist/br/br-geo.cjs.map +1 -1
- package/dist/br/br-geo.js.map +1 -1
- package/dist/br/data/br-centroids.cjs.map +1 -1
- package/dist/br/data/br-centroids.js.map +1 -1
- package/dist/br/data/br-locations.cjs.map +1 -1
- package/dist/br/data/br-locations.js.map +1 -1
- package/dist/br/data/br-uf-geo.cjs.map +1 -1
- package/dist/br/data/br-uf-geo.js.map +1 -1
- package/dist/br/data/mun/AC.cjs.map +1 -1
- package/dist/br/data/mun/AC.js.map +1 -1
- package/dist/br/data/mun/AL.cjs.map +1 -1
- package/dist/br/data/mun/AL.js.map +1 -1
- package/dist/br/data/mun/AM.cjs.map +1 -1
- package/dist/br/data/mun/AM.js.map +1 -1
- package/dist/br/data/mun/AP.cjs.map +1 -1
- package/dist/br/data/mun/AP.js.map +1 -1
- package/dist/br/data/mun/BA.cjs.map +1 -1
- package/dist/br/data/mun/BA.js.map +1 -1
- package/dist/br/data/mun/CE.cjs.map +1 -1
- package/dist/br/data/mun/CE.js.map +1 -1
- package/dist/br/data/mun/DF.cjs.map +1 -1
- package/dist/br/data/mun/DF.js.map +1 -1
- package/dist/br/data/mun/ES.cjs.map +1 -1
- package/dist/br/data/mun/ES.js.map +1 -1
- package/dist/br/data/mun/GO.cjs.map +1 -1
- package/dist/br/data/mun/GO.js.map +1 -1
- package/dist/br/data/mun/MA.cjs.map +1 -1
- package/dist/br/data/mun/MA.js.map +1 -1
- package/dist/br/data/mun/MG.cjs.map +1 -1
- package/dist/br/data/mun/MG.js.map +1 -1
- package/dist/br/data/mun/MS.cjs.map +1 -1
- package/dist/br/data/mun/MS.js.map +1 -1
- package/dist/br/data/mun/MT.cjs.map +1 -1
- package/dist/br/data/mun/MT.js.map +1 -1
- package/dist/br/data/mun/PA.cjs.map +1 -1
- package/dist/br/data/mun/PA.js.map +1 -1
- package/dist/br/data/mun/PB.cjs.map +1 -1
- package/dist/br/data/mun/PB.js.map +1 -1
- package/dist/br/data/mun/PE.cjs.map +1 -1
- package/dist/br/data/mun/PE.js.map +1 -1
- package/dist/br/data/mun/PI.cjs.map +1 -1
- package/dist/br/data/mun/PI.js.map +1 -1
- package/dist/br/data/mun/PR.cjs.map +1 -1
- package/dist/br/data/mun/PR.js.map +1 -1
- package/dist/br/data/mun/RJ.cjs.map +1 -1
- package/dist/br/data/mun/RJ.js.map +1 -1
- package/dist/br/data/mun/RN.cjs.map +1 -1
- package/dist/br/data/mun/RN.js.map +1 -1
- package/dist/br/data/mun/RO.cjs.map +1 -1
- package/dist/br/data/mun/RO.js.map +1 -1
- package/dist/br/data/mun/RR.cjs.map +1 -1
- package/dist/br/data/mun/RR.js.map +1 -1
- package/dist/br/data/mun/RS.cjs.map +1 -1
- package/dist/br/data/mun/RS.js.map +1 -1
- package/dist/br/data/mun/SC.cjs.map +1 -1
- package/dist/br/data/mun/SC.js.map +1 -1
- package/dist/br/data/mun/SE.cjs.map +1 -1
- package/dist/br/data/mun/SE.js.map +1 -1
- package/dist/br/data/mun/SP.cjs.map +1 -1
- package/dist/br/data/mun/SP.js.map +1 -1
- package/dist/br/data/mun/TO.cjs.map +1 -1
- package/dist/br/data/mun/TO.js.map +1 -1
- package/dist/br/geocode.cjs.map +1 -1
- package/dist/br/geocode.js.map +1 -1
- package/dist/br/holidays.cjs.map +1 -1
- package/dist/br/holidays.js.map +1 -1
- package/dist/br/locations.cjs.map +1 -1
- package/dist/br/locations.js.map +1 -1
- package/dist/br/nfe.cjs.map +1 -1
- package/dist/br/nfe.js.map +1 -1
- package/dist/br/pix.cjs +1 -1
- package/dist/br/pix.cjs.map +1 -1
- package/dist/br/pix.js +108 -74
- package/dist/br/pix.js.map +1 -1
- package/dist/br/regions.cjs.map +1 -1
- package/dist/br/regions.js.map +1 -1
- package/dist/br/scales.cjs.map +1 -1
- package/dist/br/scales.js.map +1 -1
- package/dist/br/state-geo.cjs.map +1 -1
- package/dist/br/state-geo.js.map +1 -1
- package/dist/br/svg-utils.cjs.map +1 -1
- package/dist/br/svg-utils.js.map +1 -1
- package/dist/br/use-map-hover.cjs.map +1 -1
- package/dist/br/use-map-hover.js.map +1 -1
- package/dist/br/use-map-zoom.cjs.map +1 -1
- package/dist/br/use-map-zoom.js.map +1 -1
- package/dist/br/whatsapp.cjs.map +1 -1
- package/dist/br/whatsapp.js.map +1 -1
- package/dist/br.cjs.map +1 -1
- package/dist/br.d.ts +6 -2
- package/dist/br.js.map +1 -1
- package/dist/capture/barcode.cjs.map +1 -1
- package/dist/capture/barcode.js.map +1 -1
- package/dist/capture/media-recorder.cjs.map +1 -1
- package/dist/capture/media-recorder.js.map +1 -1
- package/dist/capture/use-barcode-scanner.cjs.map +1 -1
- package/dist/capture/use-barcode-scanner.js.map +1 -1
- package/dist/capture/use-screen-capture.cjs +1 -1
- package/dist/capture/use-screen-capture.cjs.map +1 -1
- package/dist/capture/use-screen-capture.js +1 -7
- package/dist/capture/use-screen-capture.js.map +1 -1
- package/dist/capture/use-speech-recognition.cjs +1 -1
- package/dist/capture/use-speech-recognition.cjs.map +1 -1
- package/dist/capture/use-speech-recognition.js +35 -36
- package/dist/capture/use-speech-recognition.js.map +1 -1
- package/dist/capture/use-torch.cjs.map +1 -1
- package/dist/capture/use-torch.js.map +1 -1
- package/dist/capture/use-video-recorder.cjs.map +1 -1
- package/dist/capture/use-video-recorder.js.map +1 -1
- package/dist/capture/video-recorder.cjs.map +1 -1
- package/dist/capture/video-recorder.js.map +1 -1
- package/dist/charts/AreaChart.cjs.map +1 -1
- package/dist/charts/AreaChart.js.map +1 -1
- package/dist/charts/BarChart.cjs.map +1 -1
- package/dist/charts/BarChart.js.map +1 -1
- package/dist/charts/LineChart.cjs.map +1 -1
- package/dist/charts/LineChart.js.map +1 -1
- package/dist/charts/PieChart.cjs.map +1 -1
- package/dist/charts/PieChart.js.map +1 -1
- package/dist/charts/RadarChart.cjs.map +1 -1
- package/dist/charts/RadarChart.js.map +1 -1
- package/dist/charts/palette.cjs.map +1 -1
- package/dist/charts/palette.js.map +1 -1
- package/dist/charts/scales.cjs.map +1 -1
- package/dist/charts/scales.js.map +1 -1
- package/dist/charts/types.cjs.map +1 -1
- package/dist/charts/types.js.map +1 -1
- package/dist/charts/use-chart-colors.cjs.map +1 -1
- package/dist/charts/use-chart-colors.js.map +1 -1
- package/dist/components/AIChat/AIChat.cjs +1 -1
- package/dist/components/AIChat/AIChat.cjs.map +1 -1
- package/dist/components/AIChat/AIChat.js +1 -5
- package/dist/components/AIChat/AIChat.js.map +1 -1
- package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
- package/dist/components/AIChat/AIChat.module.js.map +1 -1
- package/dist/components/AIChat/AIChatComposer.cjs +1 -1
- package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
- package/dist/components/AIChat/AIChatComposer.js +1 -7
- package/dist/components/AIChat/AIChatComposer.js.map +1 -1
- package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
- package/dist/components/AIChat/AIChatTurn.js.map +1 -1
- package/dist/components/AIChat/ai-chat-turns.cjs.map +1 -1
- package/dist/components/AIChat/ai-chat-turns.js.map +1 -1
- package/dist/components/Accordion/Accordion.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.js.map +1 -1
- package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.module.js.map +1 -1
- package/dist/components/Alert/Alert.cjs.map +1 -1
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Alert/Alert.module.cjs.map +1 -1
- package/dist/components/Alert/Alert.module.js.map +1 -1
- package/dist/components/AppBar/AppBar.cjs.map +1 -1
- package/dist/components/AppBar/AppBar.js.map +1 -1
- package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
- package/dist/components/AppBar/AppBar.module.js.map +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.cjs +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.js +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
- package/dist/components/AppShell/AppShell.cjs.map +1 -1
- package/dist/components/AppShell/AppShell.js.map +1 -1
- package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
- package/dist/components/AppShell/AppShell.module.js.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.cjs.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.js.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.cjs +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.js +1 -7
- package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.cjs +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.js +16 -21
- package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
- package/dist/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.module.js.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
- package/dist/components/Badge/Badge.cjs.map +1 -1
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Badge/Badge.module.cjs.map +1 -1
- package/dist/components/Badge/Badge.module.js.map +1 -1
- package/dist/components/Banner/Banner.cjs.map +1 -1
- package/dist/components/Banner/Banner.js.map +1 -1
- package/dist/components/Banner/Banner.module.cjs.map +1 -1
- package/dist/components/Banner/Banner.module.js.map +1 -1
- package/dist/components/BarList/BarList.cjs.map +1 -1
- package/dist/components/BarList/BarList.js.map +1 -1
- package/dist/components/BarList/BarList.module.cjs.map +1 -1
- package/dist/components/BarList/BarList.module.js.map +1 -1
- package/dist/components/BarList/bar-list-model.cjs.map +1 -1
- package/dist/components/BarList/bar-list-model.js.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
- package/dist/components/Button/Button.cjs.map +1 -1
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Button/Button.module.cjs.map +1 -1
- package/dist/components/Button/Button.module.js.map +1 -1
- package/dist/components/Button/ButtonContent.cjs.map +1 -1
- package/dist/components/Button/ButtonContent.js.map +1 -1
- package/dist/components/Button/ButtonSlot.cjs.map +1 -1
- package/dist/components/Button/ButtonSlot.js.map +1 -1
- package/dist/components/Button/button-class.cjs.map +1 -1
- package/dist/components/Button/button-class.js.map +1 -1
- package/dist/components/Button/link-rel.cjs.map +1 -1
- package/dist/components/Button/link-rel.js.map +1 -1
- package/dist/components/Button/slot.cjs.map +1 -1
- package/dist/components/Button/slot.js.map +1 -1
- package/dist/components/Calendar/Calendar.cjs.map +1 -1
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
- package/dist/components/Calendar/Calendar.module.js.map +1 -1
- package/dist/components/Card/Card.cjs.map +1 -1
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Card/Card.module.cjs.map +1 -1
- package/dist/components/Card/Card.module.js.map +1 -1
- package/dist/components/Carousel/Carousel.cjs.map +1 -1
- package/dist/components/Carousel/Carousel.js.map +1 -1
- package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
- package/dist/components/Carousel/Carousel.module.js.map +1 -1
- package/dist/components/Center/Center.cjs.map +1 -1
- package/dist/components/Center/Center.js.map +1 -1
- package/dist/components/Center/Center.module.cjs.map +1 -1
- package/dist/components/Center/Center.module.js.map +1 -1
- package/dist/components/Chat/Chat.cjs.map +1 -1
- package/dist/components/Chat/Chat.js.map +1 -1
- package/dist/components/Chat/Chat.module.cjs.map +1 -1
- package/dist/components/Chat/Chat.module.js.map +1 -1
- package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -1
- package/dist/components/Chat/ChatActionsMenu.js.map +1 -1
- package/dist/components/Chat/ChatAttachments.cjs.map +1 -1
- package/dist/components/Chat/ChatAttachments.js.map +1 -1
- package/dist/components/Chat/ChatBubble.cjs.map +1 -1
- package/dist/components/Chat/ChatBubble.js.map +1 -1
- package/dist/components/Chat/ChatComposer.cjs.map +1 -1
- package/dist/components/Chat/ChatComposer.js.map +1 -1
- package/dist/components/Chat/chat-groups.cjs +1 -1
- package/dist/components/Chat/chat-groups.cjs.map +1 -1
- package/dist/components/Chat/chat-groups.js +2 -6
- package/dist/components/Chat/chat-groups.js.map +1 -1
- package/dist/components/Chat/chat-receipt.cjs.map +1 -1
- package/dist/components/Chat/chat-receipt.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
- package/dist/components/ChipInput/ChipInput.cjs +1 -1
- package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
- package/dist/components/ChipInput/ChipInput.js +2 -12
- package/dist/components/ChipInput/ChipInput.js.map +1 -1
- package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
- package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
- package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
- package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
- package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
- package/dist/components/CodeBlock/tokenize.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
- package/dist/components/Collapsible/Collapsible.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
- package/dist/components/Combobox/Combobox.cjs.map +1 -1
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
- package/dist/components/Combobox/Combobox.module.js.map +1 -1
- package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -1
- package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -1
- package/dist/components/Command/Command.cjs +1 -1
- package/dist/components/Command/Command.cjs.map +1 -1
- package/dist/components/Command/Command.js +4 -11
- package/dist/components/Command/Command.js.map +1 -1
- package/dist/components/Command/Command.module.cjs.map +1 -1
- package/dist/components/Command/Command.module.js.map +1 -1
- package/dist/components/ConditionalWrapper/ConditionalWrapper.cjs.map +1 -1
- package/dist/components/ConditionalWrapper/ConditionalWrapper.js.map +1 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
- package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.js +1 -1
- package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
- package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
- package/dist/components/CopyButton/CopyButton.js.map +1 -1
- package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
- package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
- package/dist/components/DataList/DataList.cjs.map +1 -1
- package/dist/components/DataList/DataList.js.map +1 -1
- package/dist/components/DataList/DataList.module.cjs.map +1 -1
- package/dist/components/DataList/DataList.module.js.map +1 -1
- package/dist/components/DataTable/DataTable.cjs +1 -1
- package/dist/components/DataTable/DataTable.cjs.map +1 -1
- package/dist/components/DataTable/DataTable.js +6 -14
- package/dist/components/DataTable/DataTable.js.map +1 -1
- package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
- package/dist/components/DataTable/DataTable.module.js.map +1 -1
- package/dist/components/DataTable/EditableCell.cjs +1 -1
- package/dist/components/DataTable/EditableCell.cjs.map +1 -1
- package/dist/components/DataTable/EditableCell.js +1 -9
- package/dist/components/DataTable/EditableCell.js.map +1 -1
- package/dist/components/DataTable/LoadingRows.cjs.map +1 -1
- package/dist/components/DataTable/LoadingRows.js.map +1 -1
- package/dist/components/DataTable/edit-labels.cjs.map +1 -1
- package/dist/components/DataTable/edit-labels.js.map +1 -1
- package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
- package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
- package/dist/components/Divider/Divider.cjs.map +1 -1
- package/dist/components/Divider/Divider.js.map +1 -1
- package/dist/components/Divider/Divider.module.cjs.map +1 -1
- package/dist/components/Divider/Divider.module.js.map +1 -1
- package/dist/components/Drawer/Drawer.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.js.map +1 -1
- package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.module.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.js +2 -14
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
- package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
- package/dist/components/Dropzone/Dropzone.js.map +1 -1
- package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
- package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
- package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
- package/dist/components/ErrorState/ErrorState.js.map +1 -1
- package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
- package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
- package/dist/components/ErrorText/ErrorText.cjs.map +1 -1
- package/dist/components/ErrorText/ErrorText.js.map +1 -1
- package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
- package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.cjs +1 -1
- package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
- package/dist/components/FileUpload/FileUpload.js +7 -17
- package/dist/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
- package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
- package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar/FilterBar.js.map +1 -1
- package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
- package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
- package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
- package/dist/components/FilterBar/filter-apply.js.map +1 -1
- package/dist/components/FilterBar/filter-model.cjs.map +1 -1
- package/dist/components/FilterBar/filter-model.js.map +1 -1
- package/dist/components/FilterBar/filter-query.cjs +1 -1
- package/dist/components/FilterBar/filter-query.cjs.map +1 -1
- package/dist/components/FilterBar/filter-query.js +2 -5
- package/dist/components/FilterBar/filter-query.js.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.cjs.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.js.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.module.cjs.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.module.js.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
- package/dist/components/For/For.cjs.map +1 -1
- package/dist/components/For/For.js.map +1 -1
- package/dist/components/Form/Form.cjs.map +1 -1
- package/dist/components/Form/Form.js.map +1 -1
- package/dist/components/Form/Form.module.cjs.map +1 -1
- package/dist/components/Form/Form.module.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
- package/dist/components/HoverCard/HoverCard.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
- package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
- package/dist/components/Image/Image.cjs.map +1 -1
- package/dist/components/Image/Image.js.map +1 -1
- package/dist/components/Image/Image.module.cjs.map +1 -1
- package/dist/components/Image/Image.module.js.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
- package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.js +4 -8
- package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
- package/dist/components/ImageCropper/crop-geometry.cjs.map +1 -1
- package/dist/components/ImageCropper/crop-geometry.js.map +1 -1
- package/dist/components/Input/Input.cjs.map +1 -1
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Input/Input.module.cjs.map +1 -1
- package/dist/components/Input/Input.module.js.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
- package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
- package/dist/components/InstallButton/InstallButton.js.map +1 -1
- package/dist/components/InstallButton/InstallButton.module.cjs.map +1 -1
- package/dist/components/InstallButton/InstallButton.module.js.map +1 -1
- package/dist/components/InstallButton/install-hints.cjs.map +1 -1
- package/dist/components/InstallButton/install-hints.js.map +1 -1
- package/dist/components/Kanban/Kanban.cjs.map +1 -1
- package/dist/components/Kanban/Kanban.js.map +1 -1
- package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
- package/dist/components/Kanban/Kanban.module.js.map +1 -1
- package/dist/components/Kbd/Kbd.cjs.map +1 -1
- package/dist/components/Kbd/Kbd.js.map +1 -1
- package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
- package/dist/components/Kbd/Kbd.module.js.map +1 -1
- package/dist/components/Label/Label.cjs.map +1 -1
- package/dist/components/Label/Label.js.map +1 -1
- package/dist/components/Label/Label.module.cjs.map +1 -1
- package/dist/components/Label/Label.module.js.map +1 -1
- package/dist/components/Layout/Layout.cjs.map +1 -1
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Layout/Layout.module.cjs.map +1 -1
- package/dist/components/Layout/Layout.module.js.map +1 -1
- package/dist/components/Lightbox/Lightbox.cjs +1 -1
- package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
- package/dist/components/Lightbox/Lightbox.js +1 -1
- package/dist/components/Lightbox/Lightbox.js.map +1 -1
- package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
- package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
- package/dist/components/ListTile/ListTile.cjs.map +1 -1
- package/dist/components/ListTile/ListTile.js.map +1 -1
- package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
- package/dist/components/ListTile/ListTile.module.js.map +1 -1
- package/dist/components/Markdown/Markdown.cjs.map +1 -1
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
- package/dist/components/Markdown/Markdown.module.js.map +1 -1
- package/dist/components/Markdown/markdown-parse.cjs +2 -2
- package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
- package/dist/components/Markdown/markdown-parse.js +8 -27
- package/dist/components/Markdown/markdown-parse.js.map +1 -1
- package/dist/components/Masonry/Masonry.cjs.map +1 -1
- package/dist/components/Masonry/Masonry.js.map +1 -1
- package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
- package/dist/components/Masonry/Masonry.module.js.map +1 -1
- package/dist/components/Masonry/masonry-layout.cjs.map +1 -1
- package/dist/components/Masonry/masonry-layout.js.map +1 -1
- package/dist/components/Menubar/Menubar.cjs.map +1 -1
- package/dist/components/Menubar/Menubar.js.map +1 -1
- package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
- package/dist/components/Menubar/Menubar.module.js.map +1 -1
- package/dist/components/Modal/Modal.cjs.map +1 -1
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/Modal.module.cjs.map +1 -1
- package/dist/components/Modal/Modal.module.js.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
- package/dist/components/Money/Money.cjs.map +1 -1
- package/dist/components/Money/Money.js.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
- package/dist/components/NProgress/NProgress.cjs.map +1 -1
- package/dist/components/NProgress/NProgress.js.map +1 -1
- package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
- package/dist/components/NProgress/NProgress.module.js.map +1 -1
- package/dist/components/Navbar/Navbar.cjs.map +1 -1
- package/dist/components/Navbar/Navbar.js.map +1 -1
- package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
- package/dist/components/Navbar/Navbar.module.js.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
- package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
- package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
- package/dist/components/Page/Page.cjs.map +1 -1
- package/dist/components/Page/Page.js.map +1 -1
- package/dist/components/Page/Page.module.cjs.map +1 -1
- package/dist/components/Page/Page.module.js.map +1 -1
- package/dist/components/Pagination/Pagination.cjs.map +1 -1
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
- package/dist/components/Pagination/Pagination.module.js.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
- package/dist/components/PinInput/PinInput.cjs.map +1 -1
- package/dist/components/PinInput/PinInput.js.map +1 -1
- package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
- package/dist/components/PinInput/PinInput.module.js.map +1 -1
- package/dist/components/Popover/Popover.cjs.map +1 -1
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/Popover.module.cjs.map +1 -1
- package/dist/components/Popover/Popover.module.js.map +1 -1
- package/dist/components/Portal/Portal.cjs.map +1 -1
- package/dist/components/Portal/Portal.js.map +1 -1
- package/dist/components/Portal/anchor-position.cjs.map +1 -1
- package/dist/components/Portal/anchor-position.js.map +1 -1
- package/dist/components/Portal/escape-layer.cjs.map +1 -1
- package/dist/components/Portal/escape-layer.js.map +1 -1
- package/dist/components/Portal/portal-host.cjs.map +1 -1
- package/dist/components/Portal/portal-host.js.map +1 -1
- package/dist/components/Portal/tab-bridge.cjs +1 -1
- package/dist/components/Portal/tab-bridge.cjs.map +1 -1
- package/dist/components/Portal/tab-bridge.js +1 -5
- package/dist/components/Portal/tab-bridge.js.map +1 -1
- package/dist/components/Progress/Progress.cjs.map +1 -1
- package/dist/components/Progress/Progress.js.map +1 -1
- package/dist/components/Progress/Progress.module.cjs.map +1 -1
- package/dist/components/Progress/Progress.module.js.map +1 -1
- package/dist/components/QRCode/QRCode.cjs.map +1 -1
- package/dist/components/QRCode/QRCode.js.map +1 -1
- package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
- package/dist/components/QRCode/QRCode.module.js.map +1 -1
- package/dist/components/QRCode/qr-encode.cjs +1 -1
- package/dist/components/QRCode/qr-encode.cjs.map +1 -1
- package/dist/components/QRCode/qr-encode.js +7 -13
- package/dist/components/QRCode/qr-encode.js.map +1 -1
- package/dist/components/QRCode/qr-tables.cjs.map +1 -1
- package/dist/components/QRCode/qr-tables.js.map +1 -1
- package/dist/components/Radio/Radio.cjs.map +1 -1
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/Radio/Radio.module.cjs.map +1 -1
- package/dist/components/Radio/Radio.module.js.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
- package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
- package/dist/components/RatingStars/RatingStars.js.map +1 -1
- package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
- package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.js +10 -18
- package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
- package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
- package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
- package/dist/components/Resizable/Resizable.cjs +1 -1
- package/dist/components/Resizable/Resizable.cjs.map +1 -1
- package/dist/components/Resizable/Resizable.js +1 -9
- package/dist/components/Resizable/Resizable.js.map +1 -1
- package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
- package/dist/components/Resizable/Resizable.module.js.map +1 -1
- package/dist/components/Responsive/Responsive.cjs.map +1 -1
- package/dist/components/Responsive/Responsive.js.map +1 -1
- package/dist/components/Reveal/Reveal.cjs.map +1 -1
- package/dist/components/Reveal/Reveal.js.map +1 -1
- package/dist/components/Reveal/Reveal.module.cjs.map +1 -1
- package/dist/components/Reveal/Reveal.module.js.map +1 -1
- package/dist/components/Reveal/reveal-threshold.cjs.map +1 -1
- package/dist/components/Reveal/reveal-threshold.js.map +1 -1
- package/dist/components/SafeArea/SafeArea.cjs.map +1 -1
- package/dist/components/SafeArea/SafeArea.js.map +1 -1
- package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
- package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
- package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
- package/dist/components/Scheduler/Scheduler.js.map +1 -1
- package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
- package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
- package/dist/components/Scheduler/scheduler-layout.cjs.map +1 -1
- package/dist/components/Scheduler/scheduler-layout.js.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
- package/dist/components/SearchBar/SearchBar.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
- package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
- package/dist/components/Select/CaretIcon.cjs.map +1 -1
- package/dist/components/Select/CaretIcon.js.map +1 -1
- package/dist/components/Select/Select.cjs.map +1 -1
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/Select.module.cjs.map +1 -1
- package/dist/components/Select/Select.module.js.map +1 -1
- package/dist/components/Select/options.cjs.map +1 -1
- package/dist/components/Select/options.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.cjs +1 -1
- package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
- package/dist/components/Sidebar/Sidebar.js +13 -23
- package/dist/components/Sidebar/Sidebar.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
- package/dist/components/Sidebar/SidebarEntry.cjs.map +1 -1
- package/dist/components/Sidebar/SidebarEntry.js.map +1 -1
- package/dist/components/Sidebar/active-nav-key.cjs.map +1 -1
- package/dist/components/Sidebar/active-nav-key.js.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.cjs +1 -1
- package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.js +1 -5
- package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
- package/dist/components/Slider/Slider.cjs.map +1 -1
- package/dist/components/Slider/Slider.js.map +1 -1
- package/dist/components/Slider/Slider.module.cjs.map +1 -1
- package/dist/components/Slider/Slider.module.js.map +1 -1
- package/dist/components/Spacer/Spacer.cjs.map +1 -1
- package/dist/components/Spacer/Spacer.js.map +1 -1
- package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
- package/dist/components/Spacer/Spacer.module.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
- package/dist/components/Sparkline/Sparkline.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
- package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
- package/dist/components/Sparkline/sparkline-geometry.cjs.map +1 -1
- package/dist/components/Sparkline/sparkline-geometry.js.map +1 -1
- package/dist/components/Spinner/Spinner.cjs.map +1 -1
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
- package/dist/components/Spinner/Spinner.module.js.map +1 -1
- package/dist/components/Stat/Stat.cjs.map +1 -1
- package/dist/components/Stat/Stat.js.map +1 -1
- package/dist/components/Stat/Stat.module.cjs.map +1 -1
- package/dist/components/Stat/Stat.module.js.map +1 -1
- package/dist/components/Stepper/Stepper.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.module.js.map +1 -1
- package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
- package/dist/components/StepperInput/StepperInput.js.map +1 -1
- package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
- package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
- package/dist/components/Switch/Switch.cjs.map +1 -1
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Switch/Switch.module.cjs.map +1 -1
- package/dist/components/Switch/Switch.module.js.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
- package/dist/components/Table/Table.cjs.map +1 -1
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Table/Table.module.cjs.map +1 -1
- package/dist/components/Table/Table.module.js.map +1 -1
- package/dist/components/Tabs/Tabs.cjs.map +1 -1
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
- package/dist/components/Tabs/Tabs.module.js.map +1 -1
- package/dist/components/Tag/Tag.cjs.map +1 -1
- package/dist/components/Tag/Tag.js.map +1 -1
- package/dist/components/Tag/Tag.module.cjs.map +1 -1
- package/dist/components/Tag/Tag.module.js.map +1 -1
- package/dist/components/Textarea/Textarea.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.module.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
- package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
- package/dist/components/Timeline/Timeline.cjs.map +1 -1
- package/dist/components/Timeline/Timeline.js.map +1 -1
- package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
- package/dist/components/Timeline/Timeline.module.js.map +1 -1
- package/dist/components/Toast/Toast.module.cjs.map +1 -1
- package/dist/components/Toast/Toast.module.js.map +1 -1
- package/dist/components/Toast/ToastProvider.cjs.map +1 -1
- package/dist/components/Toast/ToastProvider.js.map +1 -1
- package/dist/components/Toggle/Toggle.cjs.map +1 -1
- package/dist/components/Toggle/Toggle.js.map +1 -1
- package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
- package/dist/components/Toggle/Toggle.module.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
- package/dist/components/Tour/Tour.cjs +1 -1
- package/dist/components/Tour/Tour.cjs.map +1 -1
- package/dist/components/Tour/Tour.js +1 -5
- package/dist/components/Tour/Tour.js.map +1 -1
- package/dist/components/Tour/Tour.module.cjs.map +1 -1
- package/dist/components/Tour/Tour.module.js.map +1 -1
- package/dist/components/Tour/tour-position.cjs.map +1 -1
- package/dist/components/Tour/tour-position.js.map +1 -1
- package/dist/components/Transfer/Transfer.cjs.map +1 -1
- package/dist/components/Transfer/Transfer.js.map +1 -1
- package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
- package/dist/components/Transfer/Transfer.module.js.map +1 -1
- package/dist/components/Transfer/transfer-state.cjs.map +1 -1
- package/dist/components/Transfer/transfer-state.js.map +1 -1
- package/dist/components/TreeView/TreeView.cjs.map +1 -1
- package/dist/components/TreeView/TreeView.js.map +1 -1
- package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
- package/dist/components/TreeView/TreeView.module.js.map +1 -1
- package/dist/components/TruncateText/TruncateText.cjs.map +1 -1
- package/dist/components/TruncateText/TruncateText.js.map +1 -1
- package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
- package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.cjs +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.cjs.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.js +1 -7
- package/dist/components/VideoPlayer/VideoPlayer.js.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
- package/dist/components/VideoPlayer/playback-rates.cjs.map +1 -1
- package/dist/components/VideoPlayer/playback-rates.js.map +1 -1
- package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
- package/dist/components/VirtualList/VirtualList.js.map +1 -1
- package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
- package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
- package/dist/components/Wizard/Wizard.cjs +1 -1
- package/dist/components/Wizard/Wizard.cjs.map +1 -1
- package/dist/components/Wizard/Wizard.js +4 -11
- package/dist/components/Wizard/Wizard.js.map +1 -1
- package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
- package/dist/components/Wizard/Wizard.module.js.map +1 -1
- package/dist/data/create-data-provider.cjs.map +1 -1
- package/dist/data/create-data-provider.js.map +1 -1
- package/dist/data/data-provider-context.cjs.map +1 -1
- package/dist/data/data-provider-context.js.map +1 -1
- package/dist/data/use-resource.cjs.map +1 -1
- package/dist/data/use-resource.js.map +1 -1
- package/dist/editor/RichTextEditor.cjs.map +1 -1
- package/dist/editor/RichTextEditor.js.map +1 -1
- package/dist/editor/RichTextEditor.module.cjs.map +1 -1
- package/dist/editor/RichTextEditor.module.js.map +1 -1
- package/dist/editor.js +1 -2
- package/dist/error-boundary/ErrorBoundary.cjs.map +1 -1
- package/dist/error-boundary/ErrorBoundary.js.map +1 -1
- package/dist/error-boundary/use-error-handler.cjs.map +1 -1
- package/dist/error-boundary/use-error-handler.js.map +1 -1
- package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
- package/dist/feature-flags/FeatureFlagsProvider.js.map +1 -1
- package/dist/feature-flags/growthbook-adapter.cjs.map +1 -1
- package/dist/feature-flags/growthbook-adapter.js.map +1 -1
- package/dist/feature-flags/in-memory-adapter.cjs.map +1 -1
- package/dist/feature-flags/in-memory-adapter.js.map +1 -1
- package/dist/feature-flags/launchdarkly-adapter.cjs.map +1 -1
- package/dist/feature-flags/launchdarkly-adapter.js.map +1 -1
- package/dist/forms/FormField.cjs.map +1 -1
- package/dist/forms/FormField.js.map +1 -1
- package/dist/forms/br-validators.cjs.map +1 -1
- package/dist/forms/br-validators.js.map +1 -1
- package/dist/forms/masked-inputs.cjs.map +1 -1
- package/dist/forms/masked-inputs.js.map +1 -1
- package/dist/forms/use-viacep.cjs.map +1 -1
- package/dist/forms/use-viacep.js.map +1 -1
- package/dist/forms/use-zod-form.cjs.map +1 -1
- package/dist/forms/use-zod-form.js.map +1 -1
- package/dist/forms/validate-form.cjs.map +1 -1
- package/dist/forms/validate-form.js.map +1 -1
- package/dist/forms/zod-resolver.cjs.map +1 -1
- package/dist/forms/zod-resolver.js.map +1 -1
- package/dist/geo/TrajectoryMap.cjs.map +1 -1
- package/dist/geo/TrajectoryMap.js.map +1 -1
- package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
- package/dist/geo/TrajectoryMap.module.js.map +1 -1
- package/dist/geo/bounds.cjs.map +1 -1
- package/dist/geo/bounds.js.map +1 -1
- package/dist/geo/create-position-tracker.cjs +1 -1
- package/dist/geo/create-position-tracker.cjs.map +1 -1
- package/dist/geo/create-position-tracker.js +1 -7
- package/dist/geo/create-position-tracker.js.map +1 -1
- package/dist/geo/distance.cjs.map +1 -1
- package/dist/geo/distance.js.map +1 -1
- package/dist/geo/estimate.cjs.map +1 -1
- package/dist/geo/estimate.js.map +1 -1
- package/dist/geo/leaflet-map.cjs.map +1 -1
- package/dist/geo/leaflet-map.js.map +1 -1
- package/dist/geo/projection.cjs.map +1 -1
- package/dist/geo/projection.js.map +1 -1
- package/dist/geo/routing.cjs.map +1 -1
- package/dist/geo/routing.js.map +1 -1
- package/dist/geo/types.cjs.map +1 -1
- package/dist/geo/types.js.map +1 -1
- package/dist/geo/use-position-tracker.cjs.map +1 -1
- package/dist/geo/use-position-tracker.js.map +1 -1
- package/dist/hooks/pwa-env.cjs.map +1 -1
- package/dist/hooks/pwa-env.js.map +1 -1
- package/dist/hooks/tab-sequence.cjs.map +1 -1
- package/dist/hooks/tab-sequence.js.map +1 -1
- package/dist/hooks/use-announce.cjs +1 -1
- package/dist/hooks/use-announce.cjs.map +1 -1
- package/dist/hooks/use-announce.js +2 -2
- package/dist/hooks/use-announce.js.map +1 -1
- package/dist/hooks/use-async.cjs.map +1 -1
- package/dist/hooks/use-async.js.map +1 -1
- package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
- package/dist/hooks/use-before-install-prompt.js.map +1 -1
- package/dist/hooks/use-breakpoint.cjs.map +1 -1
- package/dist/hooks/use-breakpoint.js.map +1 -1
- package/dist/hooks/use-click-outside.cjs.map +1 -1
- package/dist/hooks/use-click-outside.js.map +1 -1
- package/dist/hooks/use-client-filter.cjs.map +1 -1
- package/dist/hooks/use-client-filter.js.map +1 -1
- package/dist/hooks/use-clipboard.cjs.map +1 -1
- package/dist/hooks/use-clipboard.js.map +1 -1
- package/dist/hooks/use-countdown.cjs.map +1 -1
- package/dist/hooks/use-countdown.js.map +1 -1
- package/dist/hooks/use-counter.cjs.map +1 -1
- package/dist/hooks/use-counter.js.map +1 -1
- package/dist/hooks/use-debounce.cjs.map +1 -1
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-deep-memo.cjs.map +1 -1
- package/dist/hooks/use-deep-memo.js.map +1 -1
- package/dist/hooks/use-disclosure.cjs.map +1 -1
- package/dist/hooks/use-disclosure.js.map +1 -1
- package/dist/hooks/use-document-title.cjs.map +1 -1
- package/dist/hooks/use-document-title.js.map +1 -1
- package/dist/hooks/use-document-visibility.cjs.map +1 -1
- package/dist/hooks/use-document-visibility.js.map +1 -1
- package/dist/hooks/use-draft-filters.cjs.map +1 -1
- package/dist/hooks/use-draft-filters.js.map +1 -1
- package/dist/hooks/use-event-listener.cjs.map +1 -1
- package/dist/hooks/use-event-listener.js.map +1 -1
- package/dist/hooks/use-favicon.cjs.map +1 -1
- package/dist/hooks/use-favicon.js.map +1 -1
- package/dist/hooks/use-focus-trap.cjs.map +1 -1
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-fullscreen-element.cjs.map +1 -1
- package/dist/hooks/use-fullscreen-element.js.map +1 -1
- package/dist/hooks/use-fullscreen.cjs +1 -1
- package/dist/hooks/use-fullscreen.cjs.map +1 -1
- package/dist/hooks/use-fullscreen.js +7 -23
- package/dist/hooks/use-fullscreen.js.map +1 -1
- package/dist/hooks/use-geolocation.cjs.map +1 -1
- package/dist/hooks/use-geolocation.js.map +1 -1
- package/dist/hooks/use-hover.cjs.map +1 -1
- package/dist/hooks/use-hover.js.map +1 -1
- package/dist/hooks/use-idle.cjs.map +1 -1
- package/dist/hooks/use-idle.js.map +1 -1
- package/dist/hooks/use-install-prompt.cjs +1 -1
- package/dist/hooks/use-install-prompt.cjs.map +1 -1
- package/dist/hooks/use-install-prompt.js +1 -1
- package/dist/hooks/use-install-prompt.js.map +1 -1
- package/dist/hooks/use-intersection-observer.cjs.map +1 -1
- package/dist/hooks/use-intersection-observer.js.map +1 -1
- package/dist/hooks/use-interval.cjs.map +1 -1
- package/dist/hooks/use-interval.js.map +1 -1
- package/dist/hooks/use-is-first-render.cjs.map +1 -1
- package/dist/hooks/use-is-first-render.js.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
- package/dist/hooks/use-latest-ref.cjs.map +1 -1
- package/dist/hooks/use-latest-ref.js.map +1 -1
- package/dist/hooks/use-list-state.cjs.map +1 -1
- package/dist/hooks/use-list-state.js.map +1 -1
- package/dist/hooks/use-local-storage.cjs +1 -1
- package/dist/hooks/use-local-storage.cjs.map +1 -1
- package/dist/hooks/use-local-storage.js +2 -5
- package/dist/hooks/use-local-storage.js.map +1 -1
- package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
- package/dist/hooks/use-long-press-handlers.js.map +1 -1
- package/dist/hooks/use-long-press.cjs.map +1 -1
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-map.cjs.map +1 -1
- package/dist/hooks/use-map.js.map +1 -1
- package/dist/hooks/use-media-devices.cjs.map +1 -1
- package/dist/hooks/use-media-devices.js.map +1 -1
- package/dist/hooks/use-media-permission.cjs +1 -1
- package/dist/hooks/use-media-permission.cjs.map +1 -1
- package/dist/hooks/use-media-permission.js +2 -5
- package/dist/hooks/use-media-permission.js.map +1 -1
- package/dist/hooks/use-media-query.cjs.map +1 -1
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-object-url.cjs.map +1 -1
- package/dist/hooks/use-object-url.js.map +1 -1
- package/dist/hooks/use-online.cjs.map +1 -1
- package/dist/hooks/use-online.js.map +1 -1
- package/dist/hooks/use-pagination.cjs.map +1 -1
- package/dist/hooks/use-pagination.js.map +1 -1
- package/dist/hooks/use-previous.cjs.map +1 -1
- package/dist/hooks/use-previous.js.map +1 -1
- package/dist/hooks/use-push-to-talk.cjs.map +1 -1
- package/dist/hooks/use-push-to-talk.js.map +1 -1
- package/dist/hooks/use-queue.cjs.map +1 -1
- package/dist/hooks/use-queue.js.map +1 -1
- package/dist/hooks/use-resize-observer.cjs.map +1 -1
- package/dist/hooks/use-resize-observer.js.map +1 -1
- package/dist/hooks/use-scroll-lock.cjs.map +1 -1
- package/dist/hooks/use-scroll-lock.js.map +1 -1
- package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
- package/dist/hooks/use-scroll-overflow.js.map +1 -1
- package/dist/hooks/use-service-worker-update.cjs.map +1 -1
- package/dist/hooks/use-service-worker-update.js.map +1 -1
- package/dist/hooks/use-set.cjs.map +1 -1
- package/dist/hooks/use-set.js.map +1 -1
- package/dist/hooks/use-sortable.cjs.map +1 -1
- package/dist/hooks/use-sortable.js.map +1 -1
- package/dist/hooks/use-stable-callback.cjs.map +1 -1
- package/dist/hooks/use-stable-callback.js.map +1 -1
- package/dist/hooks/use-storage-estimate.cjs.map +1 -1
- package/dist/hooks/use-storage-estimate.js.map +1 -1
- package/dist/hooks/use-throttle.cjs.map +1 -1
- package/dist/hooks/use-throttle.js.map +1 -1
- package/dist/hooks/use-timeout.cjs.map +1 -1
- package/dist/hooks/use-timeout.js.map +1 -1
- package/dist/hooks/use-toggle.cjs.map +1 -1
- package/dist/hooks/use-toggle.js.map +1 -1
- package/dist/hooks/use-typewriter.cjs.map +1 -1
- package/dist/hooks/use-typewriter.js.map +1 -1
- package/dist/hooks/use-window-size.cjs.map +1 -1
- package/dist/hooks/use-window-size.js.map +1 -1
- package/dist/http/api-client.cjs +1 -1
- package/dist/http/api-client.cjs.map +1 -1
- package/dist/http/api-client.js +5 -1
- package/dist/http/api-client.js.map +1 -1
- package/dist/http/build-url.cjs +1 -1
- package/dist/http/build-url.cjs.map +1 -1
- package/dist/http/build-url.js +3 -1
- package/dist/http/build-url.js.map +1 -1
- package/dist/http/credential-scope.cjs.map +1 -1
- package/dist/http/credential-scope.js.map +1 -1
- package/dist/http/csrf.cjs.map +1 -1
- package/dist/http/csrf.js.map +1 -1
- package/dist/http/decode-response.cjs.map +1 -1
- package/dist/http/decode-response.js.map +1 -1
- package/dist/http/describe-api-error.cjs.map +1 -1
- package/dist/http/describe-api-error.js.map +1 -1
- package/dist/http/errors.cjs.map +1 -1
- package/dist/http/errors.js.map +1 -1
- package/dist/http/idempotency.cjs.map +1 -1
- package/dist/http/idempotency.js.map +1 -1
- package/dist/http/parse-response.cjs.map +1 -1
- package/dist/http/parse-response.js.map +1 -1
- package/dist/http/presigned-post.cjs +2 -0
- package/dist/http/presigned-post.cjs.map +1 -0
- package/dist/http/presigned-post.js +73 -0
- package/dist/http/presigned-post.js.map +1 -0
- package/dist/http/resumable-upload.cjs.map +1 -1
- package/dist/http/resumable-upload.js.map +1 -1
- package/dist/http/retry.cjs.map +1 -1
- package/dist/http/retry.js.map +1 -1
- package/dist/http/timeout.cjs.map +1 -1
- package/dist/http/timeout.js.map +1 -1
- package/dist/http/upload-with-progress.cjs +1 -1
- package/dist/http/upload-with-progress.cjs.map +1 -1
- package/dist/http/upload-with-progress.js +2 -7
- package/dist/http/upload-with-progress.js.map +1 -1
- package/dist/http/use-describe-api-error.cjs.map +1 -1
- package/dist/http/use-describe-api-error.js.map +1 -1
- package/dist/http/use-poll.cjs +1 -1
- package/dist/http/use-poll.cjs.map +1 -1
- package/dist/http/use-poll.js +2 -5
- package/dist/http/use-poll.js.map +1 -1
- package/dist/i18n/I18nProvider.cjs.map +1 -1
- package/dist/i18n/I18nProvider.js.map +1 -1
- package/dist/i18n/create-i18n.cjs.map +1 -1
- package/dist/i18n/create-i18n.js.map +1 -1
- package/dist/icons/Icon.cjs.map +1 -1
- package/dist/icons/Icon.js.map +1 -1
- package/dist/icons/IconPicker.cjs.map +1 -1
- package/dist/icons/IconPicker.js.map +1 -1
- package/dist/icons/IconPicker.module.cjs.map +1 -1
- package/dist/icons/IconPicker.module.js.map +1 -1
- package/dist/icons/IconProvider.cjs.map +1 -1
- package/dist/icons/IconProvider.js.map +1 -1
- package/dist/icons/alias.cjs.map +1 -1
- package/dist/icons/alias.js.map +1 -1
- package/dist/icons/generated/aliases.cjs.map +1 -1
- package/dist/icons/generated/aliases.js.map +1 -1
- package/dist/icons/generated/icon-names.cjs.map +1 -1
- package/dist/icons/generated/icon-names.js.map +1 -1
- package/dist/icons/generated/loaders.cjs.map +1 -1
- package/dist/icons/generated/loaders.js.map +1 -1
- package/dist/icons/generated/shard-00.cjs.map +1 -1
- package/dist/icons/generated/shard-00.js.map +1 -1
- package/dist/icons/generated/shard-01.cjs.map +1 -1
- package/dist/icons/generated/shard-01.js.map +1 -1
- package/dist/icons/generated/shard-02.cjs.map +1 -1
- package/dist/icons/generated/shard-02.js.map +1 -1
- package/dist/icons/generated/shard-03.cjs.map +1 -1
- package/dist/icons/generated/shard-03.js.map +1 -1
- package/dist/icons/generated/shard-04.cjs.map +1 -1
- package/dist/icons/generated/shard-04.js.map +1 -1
- package/dist/icons/generated/shard-05.cjs.map +1 -1
- package/dist/icons/generated/shard-05.js.map +1 -1
- package/dist/icons/generated/shard-06.cjs.map +1 -1
- package/dist/icons/generated/shard-06.js.map +1 -1
- package/dist/icons/generated/shard-07.cjs.map +1 -1
- package/dist/icons/generated/shard-07.js.map +1 -1
- package/dist/icons/generated/shard-08.cjs.map +1 -1
- package/dist/icons/generated/shard-08.js.map +1 -1
- package/dist/icons/generated/shard-09.cjs.map +1 -1
- package/dist/icons/generated/shard-09.js.map +1 -1
- package/dist/icons/generated/shard-10.cjs.map +1 -1
- package/dist/icons/generated/shard-10.js.map +1 -1
- package/dist/icons/generated/shard-11.cjs.map +1 -1
- package/dist/icons/generated/shard-11.js.map +1 -1
- package/dist/icons/generated/shard-12.cjs.map +1 -1
- package/dist/icons/generated/shard-12.js.map +1 -1
- package/dist/icons/generated/shard-13.cjs.map +1 -1
- package/dist/icons/generated/shard-13.js.map +1 -1
- package/dist/icons/generated/shard-14.cjs.map +1 -1
- package/dist/icons/generated/shard-14.js.map +1 -1
- package/dist/icons/generated/shard-15.cjs.map +1 -1
- package/dist/icons/generated/shard-15.js.map +1 -1
- package/dist/icons/generated/shard-16.cjs.map +1 -1
- package/dist/icons/generated/shard-16.js.map +1 -1
- package/dist/icons/generated/shard-17.cjs.map +1 -1
- package/dist/icons/generated/shard-17.js.map +1 -1
- package/dist/icons/generated/shard-18.cjs.map +1 -1
- package/dist/icons/generated/shard-18.js.map +1 -1
- package/dist/icons/generated/shard-19.cjs.map +1 -1
- package/dist/icons/generated/shard-19.js.map +1 -1
- package/dist/icons/generated/shard-20.cjs.map +1 -1
- package/dist/icons/generated/shard-20.js.map +1 -1
- package/dist/icons/generated/shard-21.cjs.map +1 -1
- package/dist/icons/generated/shard-21.js.map +1 -1
- package/dist/icons/generated/shard-22.cjs.map +1 -1
- package/dist/icons/generated/shard-22.js.map +1 -1
- package/dist/icons/generated/shard-23.cjs.map +1 -1
- package/dist/icons/generated/shard-23.js.map +1 -1
- package/dist/icons/generated/shard-24.cjs.map +1 -1
- package/dist/icons/generated/shard-24.js.map +1 -1
- package/dist/icons/generated/shard-25.cjs.map +1 -1
- package/dist/icons/generated/shard-25.js.map +1 -1
- package/dist/icons/generated/shard-26.cjs.map +1 -1
- package/dist/icons/generated/shard-26.js.map +1 -1
- package/dist/icons/generated/shard-27.cjs.map +1 -1
- package/dist/icons/generated/shard-27.js.map +1 -1
- package/dist/icons/generated/shard-28.cjs.map +1 -1
- package/dist/icons/generated/shard-28.js.map +1 -1
- package/dist/icons/generated/shard-29.cjs.map +1 -1
- package/dist/icons/generated/shard-29.js.map +1 -1
- package/dist/icons/generated/shard-30.cjs.map +1 -1
- package/dist/icons/generated/shard-30.js.map +1 -1
- package/dist/icons/generated/shard-31.cjs.map +1 -1
- package/dist/icons/generated/shard-31.js.map +1 -1
- package/dist/icons/generated/shard-32.cjs.map +1 -1
- package/dist/icons/generated/shard-32.js.map +1 -1
- package/dist/icons/generated/shard-33.cjs.map +1 -1
- package/dist/icons/generated/shard-33.js.map +1 -1
- package/dist/icons/generated/shard-34.cjs.map +1 -1
- package/dist/icons/generated/shard-34.js.map +1 -1
- package/dist/icons/generated/shard-35.cjs.map +1 -1
- package/dist/icons/generated/shard-35.js.map +1 -1
- package/dist/icons/generated/shard-36.cjs.map +1 -1
- package/dist/icons/generated/shard-36.js.map +1 -1
- package/dist/icons/generated/shard-37.cjs.map +1 -1
- package/dist/icons/generated/shard-37.js.map +1 -1
- package/dist/icons/generated/shard-38.cjs.map +1 -1
- package/dist/icons/generated/shard-38.js.map +1 -1
- package/dist/icons/generated/shard-39.cjs.map +1 -1
- package/dist/icons/generated/shard-39.js.map +1 -1
- package/dist/icons/generated/shard-40.cjs.map +1 -1
- package/dist/icons/generated/shard-40.js.map +1 -1
- package/dist/icons/generated/shard-41.cjs.map +1 -1
- package/dist/icons/generated/shard-41.js.map +1 -1
- package/dist/icons/generated/shard-42.cjs.map +1 -1
- package/dist/icons/generated/shard-42.js.map +1 -1
- package/dist/icons/generated/shard-43.cjs.map +1 -1
- package/dist/icons/generated/shard-43.js.map +1 -1
- package/dist/icons/generated/shard-44.cjs.map +1 -1
- package/dist/icons/generated/shard-44.js.map +1 -1
- package/dist/icons/generated/shard-45.cjs.map +1 -1
- package/dist/icons/generated/shard-45.js.map +1 -1
- package/dist/icons/icon-context.cjs.map +1 -1
- package/dist/icons/icon-context.js.map +1 -1
- package/dist/icons/is-icon-name.cjs.map +1 -1
- package/dist/icons/is-icon-name.js.map +1 -1
- package/dist/icons/material-symbols.cjs.map +1 -1
- package/dist/icons/material-symbols.js.map +1 -1
- package/dist/icons/normalize-icon-name.cjs.map +1 -1
- package/dist/icons/normalize-icon-name.js.map +1 -1
- package/dist/icons/shard-cache.cjs +1 -1
- package/dist/icons/shard-cache.cjs.map +1 -1
- package/dist/icons/shard-cache.js +2 -5
- package/dist/icons/shard-cache.js.map +1 -1
- package/dist/icons/use-icon.cjs.map +1 -1
- package/dist/icons/use-icon.js.map +1 -1
- package/dist/icons/validate-icon-name.cjs.map +1 -1
- package/dist/icons/validate-icon-name.js.map +1 -1
- package/dist/icons-virtual.cjs.map +1 -1
- package/dist/icons-virtual.js.map +1 -1
- package/dist/imaging/canvas.cjs.map +1 -1
- package/dist/imaging/canvas.js.map +1 -1
- package/dist/imaging/compress.cjs.map +1 -1
- package/dist/imaging/compress.js.map +1 -1
- package/dist/imaging/decode.cjs.map +1 -1
- package/dist/imaging/decode.js.map +1 -1
- package/dist/imaging/encode.cjs.map +1 -1
- package/dist/imaging/encode.js.map +1 -1
- package/dist/imaging/exceptions.cjs.map +1 -1
- package/dist/imaging/exceptions.js.map +1 -1
- package/dist/imaging/frame.cjs.map +1 -1
- package/dist/imaging/frame.js.map +1 -1
- package/dist/imaging/thumbnails.cjs.map +1 -1
- package/dist/imaging/thumbnails.js.map +1 -1
- package/dist/imaging/transform.cjs.map +1 -1
- package/dist/imaging/transform.js.map +1 -1
- package/dist/imaging/use-image-processing.cjs.map +1 -1
- package/dist/imaging/use-image-processing.js.map +1 -1
- package/dist/logger/logger.cjs.map +1 -1
- package/dist/logger/logger.js.map +1 -1
- package/dist/neural.cjs.map +1 -1
- package/dist/neural.js.map +1 -1
- package/dist/oauth/GoogleSignIn.cjs +1 -1
- package/dist/oauth/GoogleSignIn.cjs.map +1 -1
- package/dist/oauth/GoogleSignIn.js +6 -9
- package/dist/oauth/GoogleSignIn.js.map +1 -1
- package/dist/oauth/callback.cjs.map +1 -1
- package/dist/oauth/callback.js.map +1 -1
- package/dist/oauth/use-oauth-callback.cjs.map +1 -1
- package/dist/oauth/use-oauth-callback.js.map +1 -1
- package/dist/offline/conflict.cjs.map +1 -1
- package/dist/offline/conflict.js.map +1 -1
- package/dist/offline/create-offline-database.cjs.map +1 -1
- package/dist/offline/create-offline-database.js.map +1 -1
- package/dist/offline/create-offline-store.cjs +1 -1
- package/dist/offline/create-offline-store.cjs.map +1 -1
- package/dist/offline/create-offline-store.js +1 -5
- package/dist/offline/create-offline-store.js.map +1 -1
- package/dist/offline/create-offline-sync.cjs +1 -1
- package/dist/offline/create-offline-sync.cjs.map +1 -1
- package/dist/offline/create-offline-sync.js +9 -14
- package/dist/offline/create-offline-sync.js.map +1 -1
- package/dist/offline/use-offline-sync.cjs.map +1 -1
- package/dist/offline/use-offline-sync.js.map +1 -1
- package/dist/perf/cache-size.cjs.map +1 -1
- package/dist/perf/cache-size.js.map +1 -1
- package/dist/perf/device.cjs.map +1 -1
- package/dist/perf/device.js.map +1 -1
- package/dist/perf/format.cjs.map +1 -1
- package/dist/perf/format.js.map +1 -1
- package/dist/perf/profiler.cjs.map +1 -1
- package/dist/perf/profiler.js.map +1 -1
- package/dist/push/use-push-subscription.cjs.map +1 -1
- package/dist/push/use-push-subscription.js.map +1 -1
- package/dist/push/utils.cjs.map +1 -1
- package/dist/push/utils.js.map +1 -1
- package/dist/push/web-push-client.cjs.map +1 -1
- package/dist/push/web-push-client.js.map +1 -1
- package/dist/query/QueryProvider.cjs.map +1 -1
- package/dist/query/QueryProvider.js.map +1 -1
- package/dist/query/constants.cjs.map +1 -1
- package/dist/query/constants.js.map +1 -1
- package/dist/query/create-query-keys.cjs.map +1 -1
- package/dist/query/create-query-keys.js.map +1 -1
- package/dist/query/foreign-client-warning.cjs.map +1 -1
- package/dist/query/foreign-client-warning.js.map +1 -1
- package/dist/query/offline-persistence.cjs +1 -1
- package/dist/query/offline-persistence.cjs.map +1 -1
- package/dist/query/offline-persistence.js +2 -10
- package/dist/query/offline-persistence.js.map +1 -1
- package/dist/query/optimistic.cjs.map +1 -1
- package/dist/query/optimistic.js.map +1 -1
- package/dist/query/pagination.cjs.map +1 -1
- package/dist/query/pagination.js.map +1 -1
- package/dist/query/retry-policy.cjs.map +1 -1
- package/dist/query/retry-policy.js.map +1 -1
- package/dist/query/use-cursor-query.cjs.map +1 -1
- package/dist/query/use-cursor-query.js.map +1 -1
- package/dist/query/use-offline-mutation.cjs.map +1 -1
- package/dist/query/use-offline-mutation.js.map +1 -1
- package/dist/query/use-paginated-query.cjs.map +1 -1
- package/dist/query/use-paginated-query.js.map +1 -1
- package/dist/router/AppRouter.cjs.map +1 -1
- package/dist/router/AppRouter.js.map +1 -1
- package/dist/router/RouteGuard.cjs.map +1 -1
- package/dist/router/RouteGuard.js.map +1 -1
- package/dist/router/index.js +2 -2
- package/dist/share/share-or-download.cjs.map +1 -1
- package/dist/share/share-or-download.js.map +1 -1
- package/dist/share/share.cjs.map +1 -1
- package/dist/share/share.js.map +1 -1
- package/dist/sse/create-event-stream.cjs +1 -1
- package/dist/sse/create-event-stream.cjs.map +1 -1
- package/dist/sse/create-event-stream.js +44 -30
- package/dist/sse/create-event-stream.js.map +1 -1
- package/dist/sse/ticket-event-stream.cjs +2 -0
- package/dist/sse/ticket-event-stream.cjs.map +1 -0
- package/dist/sse/ticket-event-stream.js +41 -0
- package/dist/sse/ticket-event-stream.js.map +1 -0
- package/dist/sse/use-event-stream.cjs +1 -1
- package/dist/sse/use-event-stream.cjs.map +1 -1
- package/dist/sse/use-event-stream.js +7 -4
- package/dist/sse/use-event-stream.js.map +1 -1
- package/dist/store/create-selectors.cjs.map +1 -1
- package/dist/store/create-selectors.js.map +1 -1
- package/dist/store/create-store.cjs.map +1 -1
- package/dist/store/create-store.js.map +1 -1
- package/dist/sw/background-sync.cjs.map +1 -1
- package/dist/sw/background-sync.js.map +1 -1
- package/dist/sw/cache-inspect.cjs.map +1 -1
- package/dist/sw/cache-inspect.js.map +1 -1
- package/dist/sw/cache.cjs +1 -1
- package/dist/sw/cache.cjs.map +1 -1
- package/dist/sw/cache.js +2 -6
- package/dist/sw/cache.js.map +1 -1
- package/dist/sw/create-push-handler.cjs.map +1 -1
- package/dist/sw/create-push-handler.js.map +1 -1
- package/dist/sw/credential-headers.cjs.map +1 -1
- package/dist/sw/credential-headers.js.map +1 -1
- package/dist/sw/periodic-sync.cjs.map +1 -1
- package/dist/sw/periodic-sync.js.map +1 -1
- package/dist/sw/register-service-worker.cjs.map +1 -1
- package/dist/sw/register-service-worker.js.map +1 -1
- package/dist/sw/session-data.cjs.map +1 -1
- package/dist/sw/session-data.js.map +1 -1
- package/dist/tabular/assets.cjs.map +1 -1
- package/dist/tabular/assets.js.map +1 -1
- package/dist/tabular/cache.cjs.map +1 -1
- package/dist/tabular/cache.js.map +1 -1
- package/dist/tabular/compact.cjs.map +1 -1
- package/dist/tabular/compact.js.map +1 -1
- package/dist/tabular/exceptions.cjs.map +1 -1
- package/dist/tabular/exceptions.js.map +1 -1
- package/dist/tabular/manifest.cjs.map +1 -1
- package/dist/tabular/manifest.js.map +1 -1
- package/dist/tabular/predictor.cjs.map +1 -1
- package/dist/tabular/predictor.js.map +1 -1
- package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
- package/dist/tabular/use-tabular-predictor.js.map +1 -1
- package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
- package/dist/telemetry/TelemetryProvider.js.map +1 -1
- package/dist/telemetry/app-error-adapter.cjs.map +1 -1
- package/dist/telemetry/app-error-adapter.js.map +1 -1
- package/dist/telemetry/app-error-queue.cjs.map +1 -1
- package/dist/telemetry/app-error-queue.js.map +1 -1
- package/dist/telemetry/app-error-reporter.cjs.map +1 -1
- package/dist/telemetry/app-error-reporter.js.map +1 -1
- package/dist/telemetry/app-error-schema.cjs.map +1 -1
- package/dist/telemetry/app-error-schema.js.map +1 -1
- package/dist/telemetry/app-error-transport.cjs.map +1 -1
- package/dist/telemetry/app-error-transport.js.map +1 -1
- package/dist/telemetry/console-adapter.cjs.map +1 -1
- package/dist/telemetry/console-adapter.js.map +1 -1
- package/dist/telemetry/describe-app-error.cjs.map +1 -1
- package/dist/telemetry/describe-app-error.js.map +1 -1
- package/dist/telemetry/posthog-adapter.cjs +1 -1
- package/dist/telemetry/posthog-adapter.cjs.map +1 -1
- package/dist/telemetry/posthog-adapter.js +1 -5
- package/dist/telemetry/posthog-adapter.js.map +1 -1
- package/dist/telemetry/sentry-adapter.cjs.map +1 -1
- package/dist/telemetry/sentry-adapter.js.map +1 -1
- package/dist/tempest-react-sdk.cjs +1 -1
- package/dist/tempest-react-sdk.d.ts +440 -7
- package/dist/tempest-react-sdk.js +122 -120
- package/dist/testing/create-mock-handlers.cjs.map +1 -1
- package/dist/testing/create-mock-handlers.js.map +1 -1
- package/dist/testing.js +1 -2
- package/dist/theme/ThemeProvider.cjs.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/apply-theme.cjs.map +1 -1
- package/dist/theme/apply-theme.js.map +1 -1
- package/dist/theme/color.cjs.map +1 -1
- package/dist/theme/color.js.map +1 -1
- package/dist/theme/create-theme.cjs.map +1 -1
- package/dist/theme/create-theme.js.map +1 -1
- package/dist/theme/data-viz-ramps.cjs.map +1 -1
- package/dist/theme/data-viz-ramps.js.map +1 -1
- package/dist/theme/initial-theme.cjs.map +1 -1
- package/dist/theme/initial-theme.js.map +1 -1
- package/dist/theme/inverse-render.cjs.map +1 -1
- package/dist/theme/inverse-render.js.map +1 -1
- package/dist/theme/inverse-restore.cjs.map +1 -1
- package/dist/theme/inverse-restore.js.map +1 -1
- package/dist/theme/inverse-surface.cjs.map +1 -1
- package/dist/theme/inverse-surface.js.map +1 -1
- package/dist/theme/status-tokens.cjs.map +1 -1
- package/dist/theme/status-tokens.js.map +1 -1
- package/dist/theme/theme-presets.cjs.map +1 -1
- package/dist/theme/theme-presets.js.map +1 -1
- package/dist/utils/absent.cjs.map +1 -1
- package/dist/utils/absent.js.map +1 -1
- package/dist/utils/arrays.cjs.map +1 -1
- package/dist/utils/arrays.js.map +1 -1
- package/dist/utils/base64.cjs.map +1 -1
- package/dist/utils/base64.js.map +1 -1
- package/dist/utils/cn.cjs.map +1 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/compare-values.cjs.map +1 -1
- package/dist/utils/compare-values.js.map +1 -1
- package/dist/utils/compressed-storage.cjs.map +1 -1
- package/dist/utils/compressed-storage.js.map +1 -1
- package/dist/utils/csv.cjs.map +1 -1
- package/dist/utils/csv.js.map +1 -1
- package/dist/utils/dev-mode.cjs.map +1 -1
- package/dist/utils/dev-mode.js.map +1 -1
- package/dist/utils/duplicate-instance.cjs.map +1 -1
- package/dist/utils/duplicate-instance.js.map +1 -1
- package/dist/utils/format.cjs.map +1 -1
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/functions.cjs +1 -1
- package/dist/utils/functions.cjs.map +1 -1
- package/dist/utils/functions.js +1 -1
- package/dist/utils/functions.js.map +1 -1
- package/dist/utils/guards.cjs.map +1 -1
- package/dist/utils/guards.js.map +1 -1
- package/dist/utils/ids.cjs.map +1 -1
- package/dist/utils/ids.js.map +1 -1
- package/dist/utils/intl-cache.cjs.map +1 -1
- package/dist/utils/intl-cache.js.map +1 -1
- package/dist/utils/json-frame.cjs.map +1 -1
- package/dist/utils/json-frame.js.map +1 -1
- package/dist/utils/numbers.cjs.map +1 -1
- package/dist/utils/numbers.js.map +1 -1
- package/dist/utils/objects.cjs.map +1 -1
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/owner-fingerprint.cjs.map +1 -1
- package/dist/utils/owner-fingerprint.js.map +1 -1
- package/dist/utils/promises.cjs.map +1 -1
- package/dist/utils/promises.js.map +1 -1
- package/dist/utils/relative-time.cjs.map +1 -1
- package/dist/utils/relative-time.js.map +1 -1
- package/dist/utils/safe-url.cjs.map +1 -1
- package/dist/utils/safe-url.js.map +1 -1
- package/dist/utils/schema-like.cjs.map +1 -1
- package/dist/utils/schema-like.js.map +1 -1
- package/dist/utils/storage.cjs +1 -1
- package/dist/utils/storage.cjs.map +1 -1
- package/dist/utils/storage.js +2 -2
- package/dist/utils/storage.js.map +1 -1
- package/dist/utils/strings.cjs.map +1 -1
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/xlsx.cjs.map +1 -1
- package/dist/utils/xlsx.js.map +1 -1
- package/dist/vision/core/canvas.cjs.map +1 -1
- package/dist/vision/core/canvas.js.map +1 -1
- package/dist/vision/core/dtypes.cjs.map +1 -1
- package/dist/vision/core/dtypes.js.map +1 -1
- package/dist/vision/core/exceptions.cjs.map +1 -1
- package/dist/vision/core/exceptions.js.map +1 -1
- package/dist/vision/core/graph.cjs.map +1 -1
- package/dist/vision/core/graph.js.map +1 -1
- package/dist/vision/core/metadata.cjs +1 -1
- package/dist/vision/core/metadata.cjs.map +1 -1
- package/dist/vision/core/metadata.js +9 -26
- package/dist/vision/core/metadata.js.map +1 -1
- package/dist/vision/core/providers.cjs.map +1 -1
- package/dist/vision/core/providers.js.map +1 -1
- package/dist/vision/core/session.cjs.map +1 -1
- package/dist/vision/core/session.js.map +1 -1
- package/dist/vision/core/timing.cjs.map +1 -1
- package/dist/vision/core/timing.js.map +1 -1
- package/dist/vision/fusion.cjs.map +1 -1
- package/dist/vision/fusion.js.map +1 -1
- package/dist/vision/index.cjs.map +1 -1
- package/dist/vision/index.js.map +1 -1
- package/dist/vision/io/image.cjs.map +1 -1
- package/dist/vision/io/image.js.map +1 -1
- package/dist/vision/labels.cjs.map +1 -1
- package/dist/vision/labels.js.map +1 -1
- package/dist/vision/luminance.cjs.map +1 -1
- package/dist/vision/luminance.js.map +1 -1
- package/dist/vision/normalization.cjs.map +1 -1
- package/dist/vision/normalization.js.map +1 -1
- package/dist/vision/postprocess/classification.cjs.map +1 -1
- package/dist/vision/postprocess/classification.js.map +1 -1
- package/dist/vision/postprocess/detection.cjs.map +1 -1
- package/dist/vision/postprocess/detection.js.map +1 -1
- package/dist/vision/postprocess/segmentation.cjs.map +1 -1
- package/dist/vision/postprocess/segmentation.js.map +1 -1
- package/dist/vision/preprocess/image.cjs.map +1 -1
- package/dist/vision/preprocess/image.js.map +1 -1
- package/dist/vision/preprocess/pipeline.cjs.map +1 -1
- package/dist/vision/preprocess/pipeline.js.map +1 -1
- package/dist/vision/results.cjs.map +1 -1
- package/dist/vision/results.js.map +1 -1
- package/dist/vision/tasks/base.cjs.map +1 -1
- package/dist/vision/tasks/base.js.map +1 -1
- package/dist/vision/tasks/classifier.cjs.map +1 -1
- package/dist/vision/tasks/classifier.js.map +1 -1
- package/dist/vision/tasks/detectClassify.cjs.map +1 -1
- package/dist/vision/tasks/detectClassify.js.map +1 -1
- package/dist/vision/tasks/detector.cjs.map +1 -1
- package/dist/vision/tasks/detector.js.map +1 -1
- package/dist/vision/tasks/segmenter.cjs.map +1 -1
- package/dist/vision/tasks/segmenter.js.map +1 -1
- package/dist/vision/types.cjs.map +1 -1
- package/dist/vision/types.js.map +1 -1
- package/dist/vision/use-camera-stream.cjs +1 -1
- package/dist/vision/use-camera-stream.cjs.map +1 -1
- package/dist/vision/use-camera-stream.js +3 -9
- package/dist/vision/use-camera-stream.js.map +1 -1
- package/dist/vision/use-live-luminance.cjs +1 -1
- package/dist/vision/use-live-luminance.cjs.map +1 -1
- package/dist/vision/use-live-luminance.js +1 -5
- package/dist/vision/use-live-luminance.js.map +1 -1
- package/dist/vite/base-url.cjs.map +1 -1
- package/dist/vite/base-url.js.map +1 -1
- package/dist/vite/create-vite-config.cjs.map +1 -1
- package/dist/vite/create-vite-config.js.map +1 -1
- package/dist/vite/narrow-tokens.cjs.map +1 -1
- package/dist/vite/narrow-tokens.js.map +1 -1
- package/dist/vite/tempest-csp.cjs +1 -1
- package/dist/vite/tempest-csp.cjs.map +1 -1
- package/dist/vite/tempest-csp.js +2 -10
- package/dist/vite/tempest-csp.js.map +1 -1
- package/dist/vite/tempest-icons.cjs.map +1 -1
- package/dist/vite/tempest-icons.js.map +1 -1
- package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
- package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
- package/dist/vite/tempest-pwa-dev-sw.js +9 -16
- package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
- package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
- package/dist/vite/tempest-pwa-icons.js.map +1 -1
- package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
- package/dist/vite/tempest-pwa-manifest.js.map +1 -1
- package/dist/vite/tempest-styles.cjs.map +1 -1
- package/dist/vite/tempest-styles.js.map +1 -1
- package/dist/vite/tempest-vitest.cjs.map +1 -1
- package/dist/vite/tempest-vitest.js.map +1 -1
- package/dist/webrtc/link-stats.cjs.map +1 -1
- package/dist/webrtc/link-stats.js.map +1 -1
- package/dist/webrtc/mesh-quality.cjs.map +1 -1
- package/dist/webrtc/mesh-quality.js.map +1 -1
- package/dist/webrtc/opus-sdp.cjs.map +1 -1
- package/dist/webrtc/opus-sdp.js.map +1 -1
- package/dist/webrtc/peer-link.cjs +1 -1
- package/dist/webrtc/peer-link.cjs.map +1 -1
- package/dist/webrtc/peer-link.js +2 -5
- package/dist/webrtc/peer-link.js.map +1 -1
- package/dist/webrtc/peer-mesh.cjs +1 -1
- package/dist/webrtc/peer-mesh.cjs.map +1 -1
- package/dist/webrtc/peer-mesh.js +8 -24
- package/dist/webrtc/peer-mesh.js.map +1 -1
- package/dist/webrtc/sender-bitrate.cjs.map +1 -1
- package/dist/webrtc/sender-bitrate.js.map +1 -1
- package/dist/webrtc/use-link-stats.cjs.map +1 -1
- package/dist/webrtc/use-link-stats.js.map +1 -1
- package/dist/ws/create-web-socket.cjs +1 -1
- package/dist/ws/create-web-socket.cjs.map +1 -1
- package/dist/ws/create-web-socket.js +4 -22
- package/dist/ws/create-web-socket.js.map +1 -1
- package/dist/ws/resilience.cjs.map +1 -1
- package/dist/ws/resilience.js.map +1 -1
- package/dist/ws/use-web-socket.cjs.map +1 -1
- package/dist/ws/use-web-socket.js.map +1 -1
- package/package.json +9 -6
- package/template/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.js","names":[],"sources":["../../../src/components/Command/Command.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, function-lines — a command palette is a filtered\n * listbox with its own keyboard contract: the body holds the query, the flattened\n * result list, the active index and the Escape/Enter handling, all of which read\n * each other on every keystroke.\n */\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport { useFocusTrap } from \"@/hooks/use-focus-trap\";\nimport styles from \"./Command.module.css\";\nimport { usePortalHost } from \"../Portal/portal-host\";\n\nexport interface CommandItem {\n /** Stable unique identifier for the item. */\n id: string;\n /** Human-readable label shown in the list and matched against the query. */\n label: string;\n /** Optional group heading; items sharing a group are rendered together. */\n group?: string;\n /** Extra terms matched against the query in addition to `label`. */\n keywords?: string[];\n /** Invoked when the item is chosen (click or Enter on the active row). */\n onSelect: () => void;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nexport interface CommandProps {\n /** Whether the palette is visible. */\n open: boolean;\n /** Called with the next open state (Escape, selection, backdrop click). */\n onOpenChange: (open: boolean) => void;\n /** Candidate items to filter and display. */\n items: CommandItem[];\n /** Placeholder for the search input. */\n placeholder?: string;\n /** Rendered when no item matches the current query. */\n emptyMessage?: ReactNode;\n /** Forwarded to the dialog element. */\n className?: string;\n}\n\ninterface CommandGroup {\n name: string | undefined;\n items: CommandItem[];\n}\n\n/**\n * Case-insensitively test whether `item` matches `query` by substring against\n * its label and any keywords. An empty query matches everything.\n *\n * @param item - The candidate command item.\n * @param query - The lowercased search query.\n * @returns `true` when the item should be shown.\n */\nfunction matchesQuery(item: CommandItem, query: string): boolean {\n if (query === \"\") return true;\n if (item.label.toLowerCase().includes(query)) return true;\n return (item.keywords ?? []).some((keyword) => keyword.toLowerCase().includes(query));\n}\n\n/**\n * Partition a flat item list into ordered groups, preserving first-seen order\n * for both groups and the items within them.\n *\n * @param items - The (already filtered) items to group.\n * @returns An ordered list of groups.\n */\nfunction groupItems(items: CommandItem[]): CommandGroup[] {\n const groups: CommandGroup[] = [];\n const indexByName = new Map<string | undefined, number>();\n for (const item of items) {\n const existing = indexByName.get(item.group);\n if (existing === undefined) {\n indexByName.set(item.group, groups.length);\n groups.push({ name: item.group, items: [item] });\n } else {\n groups[existing]!.items.push(item);\n }\n }\n return groups;\n}\n\n/**\n * A ⌘K-style command palette: an overlay dialog with a search input that\n * substring-filters items by label and keywords, groups results, and supports\n * full keyboard navigation (Arrow up/down, Enter, Escape). Traps focus while\n * open.\n */\nexport function Command({\n open,\n onOpenChange,\n items,\n placeholder = \"Type a command…\",\n emptyMessage = \"No results\",\n className,\n}: CommandProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const [query, setQuery] = useState<string>(\"\");\n const [activeIndex, setActiveIndex] = useState<number>(0);\n const listId = \"tempest-command-list\";\n\n useFocusTrap(dialogRef, open);\n\n const filtered = useMemo<CommandItem[]>(() => {\n const normalized = query.trim().toLowerCase();\n const visible = items.filter((item) => matchesQuery(item, normalized));\n return groupItems(visible).flatMap((group) => group.items);\n }, [items, query]);\n\n const groups = useMemo<CommandGroup[]>(() => groupItems(filtered), [filtered]);\n\n // Reset transient state whenever the palette opens.\n useEffect(() => {\n if (open) {\n setQuery(\"\");\n setActiveIndex(0);\n }\n }, [open]);\n\n // Keep the active index within bounds as the filtered list shrinks/grows.\n useEffect(() => {\n setActiveIndex((index) => {\n if (filtered.length === 0) return 0;\n return Math.min(index, filtered.length - 1);\n });\n }, [filtered.length]);\n\n const portalHost = usePortalHost();\n\n if (!open || !portalHost) return null;\n\n function selectItem(item: CommandItem): void {\n item.onSelect();\n onOpenChange(false);\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onOpenChange(false);\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n if (filtered.length === 0) return;\n setActiveIndex((index) => (index + 1) % filtered.length);\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n if (filtered.length === 0) return;\n setActiveIndex((index) => (index - 1 + filtered.length) % filtered.length);\n return;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n const item = filtered[activeIndex];\n if (item) selectItem(item);\n }\n }\n\n let renderIndex = -1;\n\n return createPortal(\n <div className={styles.overlay} role=\"presentation\" onClick={() => onOpenChange(false)}>\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n className={cn(styles.dialog, className)}\n onClick={(event) => event.stopPropagation()}\n >\n <div className={styles.inputRow}>\n <SearchIcon />\n <input\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n autoFocus\n className={styles.input}\n placeholder={placeholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n </div>\n <ul id={listId} role=\"listbox\" className={styles.list}>\n {filtered.length === 0 ? (\n <li className={styles.empty}>{emptyMessage}</li>\n ) : (\n groups.map((group) => (\n <li key={group.name ?? \"__ungrouped__\"} className={styles.group}>\n {group.name && (\n <div className={styles.groupHeading}>{group.name}</div>\n )}\n <ul role=\"presentation\" className={styles.groupList}>\n {group.items.map((item) => {\n renderIndex += 1;\n const isActive = renderIndex === activeIndex;\n const index = renderIndex;\n return (\n <li\n key={item.id}\n role=\"option\"\n aria-selected={isActive}\n className={cn(\n styles.option,\n isActive && styles.active,\n )}\n onMouseMove={() => setActiveIndex(index)}\n onClick={() => selectItem(item)}\n >\n {item.icon && (\n <span className={styles.icon}>{item.icon}</span>\n )}\n <span className={styles.label}>{item.label}</span>\n </li>\n );\n })}\n </ul>\n </li>\n ))\n )}\n </ul>\n </div>\n </div>,\n portalHost,\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n className={styles.searchIcon}\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M20 20l-3.5-3.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Command.js","names":["styles","Command_module_default","matchesQuery","query","item","keyword","groupItems","groups","indexByName","items","existing","Command","dialogRef","useRef","setQuery","useState","activeIndex","setActiveIndex","listId","open","filtered","useMemo","normalized","group","useEffect","index","portalHost","usePortalHost","selectItem","onOpenChange","handleKeyDown","event","renderIndex","createPortal","cn","className","SearchIcon","emptyMessage","isActive"],"sources":["../../../src/components/Command/Command.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, function-lines — a command palette is a filtered\n * listbox with its own keyboard contract: the body holds the query, the flattened\n * result list, the active index and the Escape/Enter handling, all of which read\n * each other on every keystroke.\n */\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { cn } from \"@/utils/cn\";\nimport { useFocusTrap } from \"@/hooks/use-focus-trap\";\nimport styles from \"./Command.module.css\";\nimport { usePortalHost } from \"../Portal/portal-host\";\n\nexport interface CommandItem {\n /** Stable unique identifier for the item. */\n id: string;\n /** Human-readable label shown in the list and matched against the query. */\n label: string;\n /** Optional group heading; items sharing a group are rendered together. */\n group?: string;\n /** Extra terms matched against the query in addition to `label`. */\n keywords?: string[];\n /** Invoked when the item is chosen (click or Enter on the active row). */\n onSelect: () => void;\n /** Optional leading icon. */\n icon?: ReactNode;\n}\n\nexport interface CommandProps {\n /** Whether the palette is visible. */\n open: boolean;\n /** Called with the next open state (Escape, selection, backdrop click). */\n onOpenChange: (open: boolean) => void;\n /** Candidate items to filter and display. */\n items: CommandItem[];\n /** Placeholder for the search input. */\n placeholder?: string;\n /** Rendered when no item matches the current query. */\n emptyMessage?: ReactNode;\n /** Forwarded to the dialog element. */\n className?: string;\n}\n\ninterface CommandGroup {\n name: string | undefined;\n items: CommandItem[];\n}\n\n/**\n * Case-insensitively test whether `item` matches `query` by substring against\n * its label and any keywords. An empty query matches everything.\n *\n * @param item - The candidate command item.\n * @param query - The lowercased search query.\n * @returns `true` when the item should be shown.\n */\nfunction matchesQuery(item: CommandItem, query: string): boolean {\n if (query === \"\") return true;\n if (item.label.toLowerCase().includes(query)) return true;\n return (item.keywords ?? []).some((keyword) => keyword.toLowerCase().includes(query));\n}\n\n/**\n * Partition a flat item list into ordered groups, preserving first-seen order\n * for both groups and the items within them.\n *\n * @param items - The (already filtered) items to group.\n * @returns An ordered list of groups.\n */\nfunction groupItems(items: CommandItem[]): CommandGroup[] {\n const groups: CommandGroup[] = [];\n const indexByName = new Map<string | undefined, number>();\n for (const item of items) {\n const existing = indexByName.get(item.group);\n if (existing === undefined) {\n indexByName.set(item.group, groups.length);\n groups.push({ name: item.group, items: [item] });\n } else {\n groups[existing]!.items.push(item);\n }\n }\n return groups;\n}\n\n/**\n * A ⌘K-style command palette: an overlay dialog with a search input that\n * substring-filters items by label and keywords, groups results, and supports\n * full keyboard navigation (Arrow up/down, Enter, Escape). Traps focus while\n * open.\n */\nexport function Command({\n open,\n onOpenChange,\n items,\n placeholder = \"Type a command…\",\n emptyMessage = \"No results\",\n className,\n}: CommandProps) {\n const dialogRef = useRef<HTMLDivElement>(null);\n const [query, setQuery] = useState<string>(\"\");\n const [activeIndex, setActiveIndex] = useState<number>(0);\n const listId = \"tempest-command-list\";\n\n useFocusTrap(dialogRef, open);\n\n const filtered = useMemo<CommandItem[]>(() => {\n const normalized = query.trim().toLowerCase();\n const visible = items.filter((item) => matchesQuery(item, normalized));\n return groupItems(visible).flatMap((group) => group.items);\n }, [items, query]);\n\n const groups = useMemo<CommandGroup[]>(() => groupItems(filtered), [filtered]);\n\n // Reset transient state whenever the palette opens.\n useEffect(() => {\n if (open) {\n setQuery(\"\");\n setActiveIndex(0);\n }\n }, [open]);\n\n // Keep the active index within bounds as the filtered list shrinks/grows.\n useEffect(() => {\n setActiveIndex((index) => {\n if (filtered.length === 0) return 0;\n return Math.min(index, filtered.length - 1);\n });\n }, [filtered.length]);\n\n const portalHost = usePortalHost();\n\n if (!open || !portalHost) return null;\n\n function selectItem(item: CommandItem): void {\n item.onSelect();\n onOpenChange(false);\n }\n\n function handleKeyDown(event: React.KeyboardEvent<HTMLInputElement>): void {\n if (event.key === \"Escape\") {\n event.preventDefault();\n onOpenChange(false);\n return;\n }\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n if (filtered.length === 0) return;\n setActiveIndex((index) => (index + 1) % filtered.length);\n return;\n }\n if (event.key === \"ArrowUp\") {\n event.preventDefault();\n if (filtered.length === 0) return;\n setActiveIndex((index) => (index - 1 + filtered.length) % filtered.length);\n return;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n const item = filtered[activeIndex];\n if (item) selectItem(item);\n }\n }\n\n let renderIndex = -1;\n\n return createPortal(\n <div className={styles.overlay} role=\"presentation\" onClick={() => onOpenChange(false)}>\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Command palette\"\n className={cn(styles.dialog, className)}\n onClick={(event) => event.stopPropagation()}\n >\n <div className={styles.inputRow}>\n <SearchIcon />\n <input\n type=\"text\"\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n autoFocus\n className={styles.input}\n placeholder={placeholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={handleKeyDown}\n />\n </div>\n <ul id={listId} role=\"listbox\" className={styles.list}>\n {filtered.length === 0 ? (\n <li className={styles.empty}>{emptyMessage}</li>\n ) : (\n groups.map((group) => (\n <li key={group.name ?? \"__ungrouped__\"} className={styles.group}>\n {group.name && (\n <div className={styles.groupHeading}>{group.name}</div>\n )}\n <ul role=\"presentation\" className={styles.groupList}>\n {group.items.map((item) => {\n renderIndex += 1;\n const isActive = renderIndex === activeIndex;\n const index = renderIndex;\n return (\n <li\n key={item.id}\n role=\"option\"\n aria-selected={isActive}\n className={cn(\n styles.option,\n isActive && styles.active,\n )}\n onMouseMove={() => setActiveIndex(index)}\n onClick={() => selectItem(item)}\n >\n {item.icon && (\n <span className={styles.icon}>{item.icon}</span>\n )}\n <span className={styles.label}>{item.label}</span>\n </li>\n );\n })}\n </ul>\n </li>\n ))\n )}\n </ul>\n </div>\n </div>,\n portalHost,\n );\n}\n\nfunction SearchIcon() {\n return (\n <svg\n className={styles.searchIcon}\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"7\" stroke=\"currentColor\" strokeWidth=\"2\" />\n <path d=\"M20 20l-3.5-3.5\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.module.cjs","names":[],"sources":["../../../src/components/Command/Command.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(15, 23, 42, 0.55);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: max(10vh, var(--tempest-safe-area-top)) var(--tempest-space-4) var(--tempest-space-4)\n var(--tempest-space-4);\n z-index: var(--tempest-z-modal);\n animation: tempest-fade-in var(--tempest-duration-base) var(--tempest-ease-out);\n}\n\n.dialog {\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border-radius: var(--tempest-radius-xl);\n box-shadow: var(--tempest-shadow-xl);\n border: 1px solid var(--tempest-border);\n width: 100%;\n max-width: 640px;\n max-height: 70vh;\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: tempest-modal-in var(--tempest-duration-base) var(--tempest-ease-emphasized);\n}\n\n.inputRow {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-4) var(--tempest-space-5);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.searchIcon {\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-normal);\n}\n\n.input::placeholder {\n color: var(--tempest-text-muted);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: var(--tempest-space-2);\n overflow-y: auto;\n}\n\n.group {\n list-style: none;\n}\n\n.group + .group {\n margin-top: var(--tempest-space-2);\n}\n\n.groupHeading {\n padding: var(--tempest-space-2) var(--tempest-space-3);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--tempest-text-muted);\n}\n\n.groupList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-md);\n cursor: pointer;\n color: var(--tempest-text);\n transition: var(--tempest-transition-color);\n}\n\n.option.active {\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n box-shadow: inset 3px 0 0 0 var(--tempest-selected-indicator);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.empty {\n list-style: none;\n padding: var(--tempest-space-6) var(--tempest-space-3);\n text-align: center;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n}\n\n@keyframes tempest-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes tempest-modal-in {\n from {\n opacity: 0;\n transform: translateY(-12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Command.module.cjs","names":["overlay","tempestFadeIn","dialog","tempestModalIn","inputRow","searchIcon","input","list","group","groupHeading","groupList","option","active","icon","label","empty","Command_module_default"],"sources":["../../../src/components/Command/Command.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(15, 23, 42, 0.55);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: max(10vh, var(--tempest-safe-area-top)) var(--tempest-space-4) var(--tempest-space-4)\n var(--tempest-space-4);\n z-index: var(--tempest-z-modal);\n animation: tempest-fade-in var(--tempest-duration-base) var(--tempest-ease-out);\n}\n\n.dialog {\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border-radius: var(--tempest-radius-xl);\n box-shadow: var(--tempest-shadow-xl);\n border: 1px solid var(--tempest-border);\n width: 100%;\n max-width: 640px;\n max-height: 70vh;\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: tempest-modal-in var(--tempest-duration-base) var(--tempest-ease-emphasized);\n}\n\n.inputRow {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-4) var(--tempest-space-5);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.searchIcon {\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-normal);\n}\n\n.input::placeholder {\n color: var(--tempest-text-muted);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: var(--tempest-space-2);\n overflow-y: auto;\n}\n\n.group {\n list-style: none;\n}\n\n.group + .group {\n margin-top: var(--tempest-space-2);\n}\n\n.groupHeading {\n padding: var(--tempest-space-2) var(--tempest-space-3);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--tempest-text-muted);\n}\n\n.groupList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-md);\n cursor: pointer;\n color: var(--tempest-text);\n transition: var(--tempest-transition-color);\n}\n\n.option.active {\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n box-shadow: inset 3px 0 0 0 var(--tempest-selected-indicator);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.empty {\n list-style: none;\n padding: var(--tempest-space-6) var(--tempest-space-3);\n text-align: center;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n}\n\n@keyframes tempest-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes tempest-modal-in {\n from {\n opacity: 0;\n transform: translateY(-12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Command.module.js","names":[],"sources":["../../../src/components/Command/Command.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(15, 23, 42, 0.55);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: max(10vh, var(--tempest-safe-area-top)) var(--tempest-space-4) var(--tempest-space-4)\n var(--tempest-space-4);\n z-index: var(--tempest-z-modal);\n animation: tempest-fade-in var(--tempest-duration-base) var(--tempest-ease-out);\n}\n\n.dialog {\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border-radius: var(--tempest-radius-xl);\n box-shadow: var(--tempest-shadow-xl);\n border: 1px solid var(--tempest-border);\n width: 100%;\n max-width: 640px;\n max-height: 70vh;\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: tempest-modal-in var(--tempest-duration-base) var(--tempest-ease-emphasized);\n}\n\n.inputRow {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-4) var(--tempest-space-5);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.searchIcon {\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-normal);\n}\n\n.input::placeholder {\n color: var(--tempest-text-muted);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: var(--tempest-space-2);\n overflow-y: auto;\n}\n\n.group {\n list-style: none;\n}\n\n.group + .group {\n margin-top: var(--tempest-space-2);\n}\n\n.groupHeading {\n padding: var(--tempest-space-2) var(--tempest-space-3);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--tempest-text-muted);\n}\n\n.groupList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-md);\n cursor: pointer;\n color: var(--tempest-text);\n transition: var(--tempest-transition-color);\n}\n\n.option.active {\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n box-shadow: inset 3px 0 0 0 var(--tempest-selected-indicator);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.empty {\n list-style: none;\n padding: var(--tempest-space-6) var(--tempest-space-3);\n text-align: center;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n}\n\n@keyframes tempest-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes tempest-modal-in {\n from {\n opacity: 0;\n transform: translateY(-12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Command.module.js","names":["overlay","tempestFadeIn","dialog","tempestModalIn","inputRow","searchIcon","input","list","group","groupHeading","groupList","option","active","icon","label","empty","Command_module_default"],"sources":["../../../src/components/Command/Command.module.css"],"sourcesContent":[".overlay {\n position: fixed;\n inset: 0;\n background-color: rgba(15, 23, 42, 0.55);\n backdrop-filter: blur(2px);\n -webkit-backdrop-filter: blur(2px);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: max(10vh, var(--tempest-safe-area-top)) var(--tempest-space-4) var(--tempest-space-4)\n var(--tempest-space-4);\n z-index: var(--tempest-z-modal);\n animation: tempest-fade-in var(--tempest-duration-base) var(--tempest-ease-out);\n}\n\n.dialog {\n background-color: var(--tempest-bg);\n color: var(--tempest-text);\n border-radius: var(--tempest-radius-xl);\n box-shadow: var(--tempest-shadow-xl);\n border: 1px solid var(--tempest-border);\n width: 100%;\n max-width: 640px;\n max-height: 70vh;\n max-height: 70dvh;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: tempest-modal-in var(--tempest-duration-base) var(--tempest-ease-emphasized);\n}\n\n.inputRow {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-4) var(--tempest-space-5);\n border-bottom: 1px solid var(--tempest-border);\n}\n\n.searchIcon {\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n border: none;\n outline: none;\n background: transparent;\n color: var(--tempest-text);\n font-size: var(--tempest-text-base);\n line-height: var(--tempest-leading-normal);\n}\n\n.input::placeholder {\n color: var(--tempest-text-muted);\n}\n\n.list {\n list-style: none;\n margin: 0;\n padding: var(--tempest-space-2);\n overflow-y: auto;\n}\n\n.group {\n list-style: none;\n}\n\n.group + .group {\n margin-top: var(--tempest-space-2);\n}\n\n.groupHeading {\n padding: var(--tempest-space-2) var(--tempest-space-3);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--tempest-text-muted);\n}\n\n.groupList {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n.option {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-3);\n padding: var(--tempest-space-2) var(--tempest-space-3);\n border-radius: var(--tempest-radius-md);\n cursor: pointer;\n color: var(--tempest-text);\n transition: var(--tempest-transition-color);\n}\n\n.option.active {\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n box-shadow: inset 3px 0 0 0 var(--tempest-selected-indicator);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tempest-text-muted);\n flex-shrink: 0;\n}\n\n.label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.empty {\n list-style: none;\n padding: var(--tempest-space-6) var(--tempest-space-3);\n text-align: center;\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-sm);\n}\n\n@keyframes tempest-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes tempest-modal-in {\n from {\n opacity: 0;\n transform: translateY(-12px) scale(0.98);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .overlay,\n .dialog {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionalWrapper.cjs","names":[],"sources":["../../../src/components/ConditionalWrapper/ConditionalWrapper.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nexport interface ConditionalWrapperProps {\n /** When `true`, the children are passed through `wrapper`. */\n condition: boolean;\n /** Wrapping function applied to the children when `condition` is `true`. */\n wrapper: (children: ReactNode) => ReactNode;\n /** Content that may be wrapped. */\n children: ReactNode;\n}\n\n/**\n * Conditionally wraps its children with `wrapper`.\n *\n * Renders `wrapper(children)` when `condition` is `true`, otherwise renders the\n * children unchanged. Avoids duplicating a subtree just to add an optional\n * wrapping element (e.g. a link, tooltip or boundary).\n *\n * @param props - The conditional-wrapper props.\n * @returns The wrapped children when `condition` is `true`, else the children.\n */\nexport function ConditionalWrapper({\n condition,\n wrapper,\n children,\n}: ConditionalWrapperProps): ReactNode {\n return condition ? wrapper(children) : <>{children}</>;\n}\n"],"mappings":"mCAqBA,
|
|
1
|
+
{"version":3,"file":"ConditionalWrapper.cjs","names":["_Fragment","react_jsx_runtime","ConditionalWrapper","condition","wrapper","children"],"sources":["../../../src/components/ConditionalWrapper/ConditionalWrapper.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nexport interface ConditionalWrapperProps {\n /** When `true`, the children are passed through `wrapper`. */\n condition: boolean;\n /** Wrapping function applied to the children when `condition` is `true`. */\n wrapper: (children: ReactNode) => ReactNode;\n /** Content that may be wrapped. */\n children: ReactNode;\n}\n\n/**\n * Conditionally wraps its children with `wrapper`.\n *\n * Renders `wrapper(children)` when `condition` is `true`, otherwise renders the\n * children unchanged. Avoids duplicating a subtree just to add an optional\n * wrapping element (e.g. a link, tooltip or boundary).\n *\n * @param props - The conditional-wrapper props.\n * @returns The wrapped children when `condition` is `true`, else the children.\n */\nexport function ConditionalWrapper({\n condition,\n wrapper,\n children,\n}: ConditionalWrapperProps): ReactNode {\n return condition ? wrapper(children) : <>{children}</>;\n}\n"],"mappings":"A,mCAqBA,SAAgBE,EAAmB,CAC/B,YACA,UACA,YACmC,CACnC,OAAOC,EAAYC,EAAQC,CAAQ,GAAI,EAAAJ,EAAA,IAAA,CAAAD,EAAAA,SAAA,CAAG,UAAW,CAAA,CACzD,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionalWrapper.js","names":[],"sources":["../../../src/components/ConditionalWrapper/ConditionalWrapper.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nexport interface ConditionalWrapperProps {\n /** When `true`, the children are passed through `wrapper`. */\n condition: boolean;\n /** Wrapping function applied to the children when `condition` is `true`. */\n wrapper: (children: ReactNode) => ReactNode;\n /** Content that may be wrapped. */\n children: ReactNode;\n}\n\n/**\n * Conditionally wraps its children with `wrapper`.\n *\n * Renders `wrapper(children)` when `condition` is `true`, otherwise renders the\n * children unchanged. Avoids duplicating a subtree just to add an optional\n * wrapping element (e.g. a link, tooltip or boundary).\n *\n * @param props - The conditional-wrapper props.\n * @returns The wrapped children when `condition` is `true`, else the children.\n */\nexport function ConditionalWrapper({\n condition,\n wrapper,\n children,\n}: ConditionalWrapperProps): ReactNode {\n return condition ? wrapper(children) : <>{children}</>;\n}\n"],"mappings":";;AAqBA,
|
|
1
|
+
{"version":3,"file":"ConditionalWrapper.js","names":["_Fragment","ConditionalWrapper","condition","wrapper","children","Fragment"],"sources":["../../../src/components/ConditionalWrapper/ConditionalWrapper.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nexport interface ConditionalWrapperProps {\n /** When `true`, the children are passed through `wrapper`. */\n condition: boolean;\n /** Wrapping function applied to the children when `condition` is `true`. */\n wrapper: (children: ReactNode) => ReactNode;\n /** Content that may be wrapped. */\n children: ReactNode;\n}\n\n/**\n * Conditionally wraps its children with `wrapper`.\n *\n * Renders `wrapper(children)` when `condition` is `true`, otherwise renders the\n * children unchanged. Avoids duplicating a subtree just to add an optional\n * wrapping element (e.g. a link, tooltip or boundary).\n *\n * @param props - The conditional-wrapper props.\n * @returns The wrapped children when `condition` is `true`, else the children.\n */\nexport function ConditionalWrapper({\n condition,\n wrapper,\n children,\n}: ConditionalWrapperProps): ReactNode {\n return condition ? wrapper(children) : <>{children}</>;\n}\n"],"mappings":";;AAqBA,SAAgBC,EAAmB,EAC/B,cACA,YACA,eACmC;CACnC,OAAOC,IAAYC,EAAQC,CAAQ,IAAI,kBAAAJ,GAAA,EAAG,YAAW,CAAA;AACzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.cjs","names":[],"sources":["../../../src/components/ConfirmDialog/ConfirmDialog.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a confirmation is a question (title, description),\n * two buttons whose copy the app must own (confirmLabel, cancelLabel), a\n * destructive-or-not tone (variant), and the async state of the answer (loading,\n * onConfirm, onCancel, open). Fewer props means the app writes the dialog again\n * around a Modal.\n */\nimport type { ReactNode } from \"react\";\nimport { Button } from \"@/components/Button\";\nimport { Modal } from \"@/components/Modal\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: ReactNode;\n description?: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"primary\" | \"danger\";\n loading?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\n/**\n * Quick confirmation prompt built on top of {@link Modal}. Use for destructive\n * actions with `variant=\"danger\"`.\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n variant = \"primary\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onCancel}\n title={title}\n size=\"sm\"\n footer={\n <>\n <Button variant=\"secondary\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={variant} loading={loading} onClick={() => void onConfirm()}>\n {confirmLabel}\n </Button>\n </>\n }\n >\n {description}\n </Modal>\n );\n}\n"],"mappings":"2GA2BA,
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.cjs","names":["Modal","_Fragment","Button","require_Button","require_Modal","react_jsx_runtime","ConfirmDialog","onCancel","loading","cancelLabel","onConfirm","confirmLabel","description"],"sources":["../../../src/components/ConfirmDialog/ConfirmDialog.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a confirmation is a question (title, description),\n * two buttons whose copy the app must own (confirmLabel, cancelLabel), a\n * destructive-or-not tone (variant), and the async state of the answer (loading,\n * onConfirm, onCancel, open). Fewer props means the app writes the dialog again\n * around a Modal.\n */\nimport type { ReactNode } from \"react\";\nimport { Button } from \"@/components/Button\";\nimport { Modal } from \"@/components/Modal\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: ReactNode;\n description?: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"primary\" | \"danger\";\n loading?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\n/**\n * Quick confirmation prompt built on top of {@link Modal}. Use for destructive\n * actions with `variant=\"danger\"`.\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n variant = \"primary\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onCancel}\n title={title}\n size=\"sm\"\n footer={\n <>\n <Button variant=\"secondary\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={variant} loading={loading} onClick={() => void onConfirm()}>\n {confirmLabel}\n </Button>\n </>\n }\n >\n {description}\n </Modal>\n );\n}\n"],"mappings":"A,2GA2BA,SAAgBM,EAAc,CAC1B,OACA,QACA,cACA,eAAe,YACf,cAAc,WACd,UAAU,UACV,UAAU,GACV,YACA,YACmB,CACnB,OACI,EAAAD,EAAA,IAAA,CAACL,EAAAA,MAAD,CACU,OACN,QAASO,EACF,QACP,KAAK,KACL,QACI,EAAAF,EAAA,KAAA,CAAAJ,EAAAA,SAAA,CAAA,SAAA,EACI,EAAAI,EAAA,IAAA,CAACH,EAAAA,OAAD,CAAQ,QAAQ,YAAY,QAASK,EAAU,SAAUC,EACpD,SAAAC,CACG,CAAA,GACR,EAAAJ,EAAA,IAAA,CAACH,EAAAA,OAAD,CAAiB,UAAkB,UAAS,YAAe,KAAKQ,EAAU,EACrE,SAAAC,CACG,CAAA,CACV,CAAA,CAAA,EAGL,SAAAC,CACE,CAAA,CAEf,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.js","names":[],"sources":["../../../src/components/ConfirmDialog/ConfirmDialog.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a confirmation is a question (title, description),\n * two buttons whose copy the app must own (confirmLabel, cancelLabel), a\n * destructive-or-not tone (variant), and the async state of the answer (loading,\n * onConfirm, onCancel, open). Fewer props means the app writes the dialog again\n * around a Modal.\n */\nimport type { ReactNode } from \"react\";\nimport { Button } from \"@/components/Button\";\nimport { Modal } from \"@/components/Modal\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: ReactNode;\n description?: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"primary\" | \"danger\";\n loading?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\n/**\n * Quick confirmation prompt built on top of {@link Modal}. Use for destructive\n * actions with `variant=\"danger\"`.\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n variant = \"primary\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onCancel}\n title={title}\n size=\"sm\"\n footer={\n <>\n <Button variant=\"secondary\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={variant} loading={loading} onClick={() => void onConfirm()}>\n {confirmLabel}\n </Button>\n </>\n }\n >\n {description}\n </Modal>\n );\n}\n"],"mappings":";;;;AA2BA,
|
|
1
|
+
{"version":3,"file":"ConfirmDialog.js","names":["_Fragment","ConfirmDialog","Modal","onCancel","Fragment","Button","loading","cancelLabel","onConfirm","confirmLabel","description"],"sources":["../../../src/components/ConfirmDialog/ConfirmDialog.tsx"],"sourcesContent":["/**\n * @tempest-limits props-count — a confirmation is a question (title, description),\n * two buttons whose copy the app must own (confirmLabel, cancelLabel), a\n * destructive-or-not tone (variant), and the async state of the answer (loading,\n * onConfirm, onCancel, open). Fewer props means the app writes the dialog again\n * around a Modal.\n */\nimport type { ReactNode } from \"react\";\nimport { Button } from \"@/components/Button\";\nimport { Modal } from \"@/components/Modal\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n title: ReactNode;\n description?: ReactNode;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"primary\" | \"danger\";\n loading?: boolean;\n onConfirm: () => void | Promise<void>;\n onCancel: () => void;\n}\n\n/**\n * Quick confirmation prompt built on top of {@link Modal}. Use for destructive\n * actions with `variant=\"danger\"`.\n */\nexport function ConfirmDialog({\n open,\n title,\n description,\n confirmLabel = \"Confirmar\",\n cancelLabel = \"Cancelar\",\n variant = \"primary\",\n loading = false,\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) {\n return (\n <Modal\n open={open}\n onClose={onCancel}\n title={title}\n size=\"sm\"\n footer={\n <>\n <Button variant=\"secondary\" onClick={onCancel} disabled={loading}>\n {cancelLabel}\n </Button>\n <Button variant={variant} loading={loading} onClick={() => void onConfirm()}>\n {confirmLabel}\n </Button>\n </>\n }\n >\n {description}\n </Modal>\n );\n}\n"],"mappings":";;;;AA2BA,SAAgBC,EAAc,EAC1B,SACA,UACA,gBACA,kBAAe,aACf,iBAAc,YACd,aAAU,WACV,aAAU,IACV,cACA,eACmB;CACnB,OACI,kBAACC,GAAD;EACU;EACN,SAASC;EACF;EACP,MAAK;EACL,QACI,kBAAAH,GAAA,EAAA,UAAA,CACI,kBAACK,GAAD;GAAQ,SAAQ;GAAY,SAASF;GAAU,UAAUG;GACpD,UAAAC;EACG,CAAA,GACR,kBAACF,GAAD;GAAiB;GAAkB;GAAS,eAAe,KAAKG,EAAU;GACrE,UAAAC;EACG,CAAA,CACV,EAAA,CAAA;EAGL,UAAAC;CACE,CAAA;AAEf"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../utils/cn.cjs"),t=require("../Portal/escape-layer.cjs"),n=require("../Portal/Portal.cjs"),r=require("./ContextMenu.module.cjs");let i=require("react"),a=require("react/jsx-runtime");var o=10;function s(e){return`separator`in e&&e.separator===!0}function c({items:c,children:u,className:d,trigger:f=`contextmenu`,longPressDelay:p=500,viewportMargin:m=8}){let[h,g]=(0,i.useState)(!1),[_,v]=(0,i.useState)({x:0,y:0}),[y,b]=(0,i.useState)(-1),x=(0,i.useId)(),[S,C]=(0,i.useState)(null),w=(0,i.useRef)([]),T=(0,i.useRef)(null),E=(0,i.useRef)(null),D=c.map((e,t)=>!s(e)&&!e.disabled?t:-1).filter(e=>e!==-1),O=(0,i.useCallback)(()=>{g(!1),b(-1)},[]),k=(0,i.useCallback)(e=>{v(e),b(-1),g(!0)},[]),A=(0,i.useCallback)(()=>{T.current!==null&&(clearTimeout(T.current),T.current=null),E.current=null},[]);(0,i.useEffect)(()=>A,[A]);let j=e=>{f!==`click`&&(e.preventDefault(),k({x:e.clientX,y:e.clientY}))},M=e=>{f!==`contextmenu`&&k({x:e.clientX,y:e.clientY})},N=e=>{if(p<=0||e.pointerType===`mouse`)return;let t={x:e.clientX,y:e.clientY};E.current=t,A(),E.current=t,T.current=setTimeout(()=>{T.current=null,E.current=null,l(),k(t)},p)},P=e=>{let t=E.current;t&&T.current!==null&&Math.hypot(e.clientX-t.x,e.clientY-t.y)>o&&A()};t.useEscapeLayer(h,O),(0,i.useEffect)(()=>{if(!h)return;let e=e=>{let t=t=>{e.preventDefault(),b(t),w.current[t]?.focus()};if(D.length===0)return;let n=D.indexOf(y);e.key===`ArrowDown`&&t(D[(n+1)%D.length]??-1),e.key===`ArrowUp`&&t(D[(n-1+D.length)%D.length]??-1),e.key===`Home`&&t(D[0]??-1),e.key===`End`&&t(D[D.length-1]??-1)},t=e=>{S&&!S.contains(e.target)&&O()};return window.addEventListener(`keydown`,e),window.addEventListener(`mousedown`,t),window.addEventListener(`resize`,O),window.addEventListener(`scroll`,O,!0),()=>{window.removeEventListener(`keydown`,e),window.removeEventListener(`mousedown`,t),window.removeEventListener(`resize`,O),window.removeEventListener(`scroll`,O,!0)}},[h,y,D,O,S]),(0,i.useLayoutEffect)(()=>{if(!h||!S)return;S.focus({preventScroll:!0});let{offsetWidth:e,offsetHeight:t}=S;if(e===0&&t===0)return;let n=window.innerWidth-e-m,r=window.innerHeight-t-m,i=Math.max(m,Math.min(_.x,n)),a=Math.max(m,Math.min(_.y,r));(i!==_.x||a!==_.y)&&v({x:i,y:a})},[h,S,_.x,_.y,m]);let F=e=>{e.onSelect?.(),O()};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(`span`,{className:r.default.root,onContextMenu:j,onClick:M,onPointerDown:N,onPointerMove:P,onPointerUp:A,onPointerCancel:A,children:u}),h&&(0,a.jsx)(n.Portal,{children:(0,a.jsx)(`ul`,{ref:C,id:x,role:`menu`,"aria-orientation":`vertical`,tabIndex:-1,className:e.cn(r.default.menu,d),style:{top:_.y,left:_.x},children:c.map((t,n)=>s(t)?(0,a.jsx)(`li`,{role:`separator`,className:r.default.separator,"aria-hidden":!0},`separator-${n}`):(0,a.jsx)(`li`,{role:`none`,children:(0,a.jsx)(`button`,{ref:e=>{w.current[n]=e},type:`button`,role:`menuitem`,className:e.cn(r.default.item,t.danger&&r.default.danger,y===n&&r.default.active),disabled:t.disabled,onClick:()=>F(t),onMouseEnter:()=>b(n),children:t.label})},`item-${n}`))})})]})}function l(){typeof window
|
|
1
|
+
const e=require("../../utils/cn.cjs"),t=require("../Portal/escape-layer.cjs"),n=require("../Portal/Portal.cjs"),r=require("./ContextMenu.module.cjs");let i=require("react"),a=require("react/jsx-runtime");var o=10;function s(e){return`separator`in e&&e.separator===!0}function c({items:c,children:u,className:d,trigger:f=`contextmenu`,longPressDelay:p=500,viewportMargin:m=8}){let[h,g]=(0,i.useState)(!1),[_,v]=(0,i.useState)({x:0,y:0}),[y,b]=(0,i.useState)(-1),x=(0,i.useId)(),[S,C]=(0,i.useState)(null),w=(0,i.useRef)([]),T=(0,i.useRef)(null),E=(0,i.useRef)(null),D=c.map((e,t)=>!s(e)&&!e.disabled?t:-1).filter(e=>e!==-1),O=(0,i.useCallback)(()=>{g(!1),b(-1)},[]),k=(0,i.useCallback)(e=>{v(e),b(-1),g(!0)},[]),A=(0,i.useCallback)(()=>{T.current!==null&&(clearTimeout(T.current),T.current=null),E.current=null},[]);(0,i.useEffect)(()=>A,[A]);let j=e=>{f!==`click`&&(e.preventDefault(),k({x:e.clientX,y:e.clientY}))},M=e=>{f!==`contextmenu`&&k({x:e.clientX,y:e.clientY})},N=e=>{if(p<=0||e.pointerType===`mouse`)return;let t={x:e.clientX,y:e.clientY};E.current=t,A(),E.current=t,T.current=setTimeout(()=>{T.current=null,E.current=null,l(),k(t)},p)},P=e=>{let t=E.current;t&&T.current!==null&&Math.hypot(e.clientX-t.x,e.clientY-t.y)>o&&A()};t.useEscapeLayer(h,O),(0,i.useEffect)(()=>{if(!h)return;let e=e=>{let t=t=>{e.preventDefault(),b(t),w.current[t]?.focus()};if(D.length===0)return;let n=D.indexOf(y);e.key===`ArrowDown`&&t(D[(n+1)%D.length]??-1),e.key===`ArrowUp`&&t(D[(n-1+D.length)%D.length]??-1),e.key===`Home`&&t(D[0]??-1),e.key===`End`&&t(D[D.length-1]??-1)},t=e=>{S&&!S.contains(e.target)&&O()};return window.addEventListener(`keydown`,e),window.addEventListener(`mousedown`,t),window.addEventListener(`resize`,O),window.addEventListener(`scroll`,O,!0),()=>{window.removeEventListener(`keydown`,e),window.removeEventListener(`mousedown`,t),window.removeEventListener(`resize`,O),window.removeEventListener(`scroll`,O,!0)}},[h,y,D,O,S]),(0,i.useLayoutEffect)(()=>{if(!h||!S)return;S.focus({preventScroll:!0});let{offsetWidth:e,offsetHeight:t}=S;if(e===0&&t===0)return;let n=window.innerWidth-e-m,r=window.innerHeight-t-m,i=Math.max(m,Math.min(_.x,n)),a=Math.max(m,Math.min(_.y,r));(i!==_.x||a!==_.y)&&v({x:i,y:a})},[h,S,_.x,_.y,m]);let F=e=>{e.onSelect?.(),O()};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(`span`,{className:r.default.root,onContextMenu:j,onClick:M,onPointerDown:N,onPointerMove:P,onPointerUp:A,onPointerCancel:A,children:u}),h&&(0,a.jsx)(n.Portal,{children:(0,a.jsx)(`ul`,{ref:C,id:x,role:`menu`,"aria-orientation":`vertical`,tabIndex:-1,className:e.cn(r.default.menu,d),style:{top:_.y,left:_.x},children:c.map((t,n)=>s(t)?(0,a.jsx)(`li`,{role:`separator`,className:r.default.separator,"aria-hidden":!0},`separator-${n}`):(0,a.jsx)(`li`,{role:`none`,children:(0,a.jsx)(`button`,{ref:e=>{w.current[n]=e},type:`button`,role:`menuitem`,className:e.cn(r.default.item,t.danger&&r.default.danger,y===n&&r.default.active),disabled:t.disabled,onClick:()=>F(t),onMouseEnter:()=>b(n),children:t.label})},`item-${n}`))})})]})}function l(){typeof window<`u`&&window.addEventListener(`click`,e=>{e.preventDefault(),e.stopPropagation()},{capture:!0,once:!0})}exports.ContextMenu=c;
|
|
2
2
|
//# sourceMappingURL=ContextMenu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.cjs","names":[],"sources":["../../../src/components/ContextMenu/ContextMenu.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines function-lines — the body owns one anchor point and\n * everything that reads from it: the three ways a menu opens (right click, long\n * press, click), the clamp that keeps it inside the viewport, and roving focus\n * for the keyboard path. Splitting them would hand the same geometry to three\n * files.\n */\nimport { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport type { PointerEvent as ReactPointerEvent, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"@/components/Portal\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport styles from \"./ContextMenu.module.css\";\n\nexport type ContextMenuItem =\n | {\n label: ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n danger?: boolean;\n }\n | { separator: true };\n\n/** How the menu is opened by a pointer. Touch always gets the long press. */\nexport type ContextMenuTrigger = \"contextmenu\" | \"click\" | \"both\";\n\nexport interface ContextMenuProps {\n /** Menu entries — selectable items and separators. */\n items: ContextMenuItem[];\n /** Trigger area. Right-clicking anywhere within opens the menu at the cursor. */\n children: ReactNode;\n /** Extra class names forwarded to the menu element. */\n className?: string;\n /**\n * Which pointer gesture opens the menu. Default `\"contextmenu\"`.\n *\n * `\"click\"` is the `⋮` button case, where a right click is the wrong gesture\n * on the desktop and impossible on touch. `\"both\"` keeps the right click and\n * adds the left one.\n */\n trigger?: ContextMenuTrigger;\n /**\n * Hold, in ms, that opens the menu from a coarse pointer. Default `500`.\n *\n * Set `0` to turn the long press off. It is on by default because touch has\n * no right click: measured in Chrome with touch emulation (Pixel 7 and\n * iPhone 13 profiles), a 900 ms hold fires `pointerdown`, `touchstart`,\n * `pointerup`, `touchend` and `click` — and no `contextmenu` at all. Every\n * action behind this menu was unreachable on a phone.\n */\n longPressDelay?: number;\n /**\n * Gap, in px, kept between the menu and the edge of the viewport. Default `8`.\n */\n viewportMargin?: number;\n}\n\ninterface Position {\n x: number;\n y: number;\n}\n\n/** Movement, in px, that reads as a scroll rather than a hold. */\nconst LONG_PRESS_MOVE_TOLERANCE = 10;\n\nfunction isSeparator(item: ContextMenuItem): item is { separator: true } {\n return \"separator\" in item && item.separator === true;\n}\n\n/**\n * Context menu — right click, long press, or click.\n *\n * - Opens at the pointer on `contextmenu`, and on a long press from touch or pen,\n * which is the gesture those pointers have instead of a right click. `trigger`\n * adds or replaces the mouse gesture; the long press is independent of it.\n * - Clamped inside the viewport after it mounts, so a menu opened near an edge\n * moves in rather than overflowing — measured before the clamp: a 180 px menu\n * opened at `x=235` in a 320 px window ran 95 px off screen, cutting the right\n * edge off every label.\n * - Rendered through a {@link Portal} so it escapes parent overflow/stacking\n * contexts.\n * - Closes on outside click, Escape, scroll, resize, or item selection.\n * - Arrow Up/Down move focus across selectable items and wrap; Home/End jump to\n * the ends; Enter activates the focused item. The menu itself takes focus when\n * it opens, so a screen reader announces it instead of staying on the trigger.\n *\n * @param props - The context menu props.\n * @returns The trigger wrapper plus the portalled menu when open.\n */\nexport function ContextMenu({\n items,\n children,\n className,\n trigger = \"contextmenu\",\n longPressDelay = 500,\n viewportMargin = 8,\n}: ContextMenuProps) {\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<Position>({ x: 0, y: 0 });\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const id = useId();\n const [menuNode, setMenuNode] = useState<HTMLUListElement | null>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressOrigin = useRef<Position | null>(null);\n\n const selectableIndexes = items\n .map((item, index) => (!isSeparator(item) && !item.disabled ? index : -1))\n .filter((i) => i !== -1);\n\n const close = useCallback((): void => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n const openAt = useCallback((point: Position): void => {\n setPosition(point);\n setActiveIndex(-1);\n setOpen(true);\n }, []);\n\n const cancelLongPress = useCallback((): void => {\n if (longPressTimer.current !== null) {\n clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n }\n longPressOrigin.current = null;\n }, []);\n\n useEffect(() => cancelLongPress, [cancelLongPress]);\n\n const handleContextMenu = (event: React.MouseEvent): void => {\n if (trigger === \"click\") return;\n event.preventDefault();\n openAt({ x: event.clientX, y: event.clientY });\n };\n\n const handleClick = (event: React.MouseEvent): void => {\n if (trigger === \"contextmenu\") return;\n openAt({ x: event.clientX, y: event.clientY });\n };\n\n /**\n * Start the hold that stands in for a right click on a coarse pointer.\n *\n * A mouse is excluded: it has `contextmenu`, and holding the left button is\n * how a drag starts.\n */\n const handlePointerDown = (event: ReactPointerEvent): void => {\n if (longPressDelay <= 0 || event.pointerType === \"mouse\") return;\n const point = { x: event.clientX, y: event.clientY };\n longPressOrigin.current = point;\n cancelLongPress();\n longPressOrigin.current = point;\n longPressTimer.current = setTimeout(() => {\n longPressTimer.current = null;\n longPressOrigin.current = null;\n suppressNextClick();\n openAt(point);\n }, longPressDelay);\n };\n\n /**\n * Cancel the hold once the finger travels — otherwise every scroll that\n * starts on the trigger opens a menu, which is the difference between a\n * usable long press and an infuriating one.\n */\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const origin = longPressOrigin.current;\n if (!origin || longPressTimer.current === null) return;\n if (\n Math.hypot(event.clientX - origin.x, event.clientY - origin.y) >\n LONG_PRESS_MOVE_TOLERANCE\n ) {\n cancelLongPress();\n }\n };\n\n useEscapeLayer(open, close);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent): void => {\n const move = (next: number): void => {\n event.preventDefault();\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n };\n if (selectableIndexes.length === 0) return;\n const current = selectableIndexes.indexOf(activeIndex);\n if (event.key === \"ArrowDown\") {\n move(selectableIndexes[(current + 1) % selectableIndexes.length] ?? -1);\n }\n if (event.key === \"ArrowUp\") {\n move(\n selectableIndexes[\n (current - 1 + selectableIndexes.length) % selectableIndexes.length\n ] ?? -1,\n );\n }\n if (event.key === \"Home\") {\n move(selectableIndexes[0] ?? -1);\n }\n if (event.key === \"End\") {\n move(selectableIndexes[selectableIndexes.length - 1] ?? -1);\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (menuNode && !menuNode.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n window.addEventListener(\"resize\", close);\n window.addEventListener(\"scroll\", close, true);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n window.removeEventListener(\"resize\", close);\n window.removeEventListener(\"scroll\", close, true);\n };\n }, [open, activeIndex, selectableIndexes, close, menuNode]);\n\n /**\n * Pull the menu inside the viewport, and take focus.\n *\n * Keyed off the node rather than off `open`, because {@link Portal} renders\n * `null` on its first pass and mounts on an effect — an effect that reads a\n * ref when `open` flips runs while the menu does not exist yet, measures\n * nothing and focuses nothing. A callback ref in state is what makes this\n * run on the render that has the element.\n *\n * `useLayoutEffect` runs before paint, so the menu is never painted at the\n * overflowing position first.\n *\n * The size comes from `offsetWidth`/`offsetHeight` rather than from\n * `getBoundingClientRect`, which reports the **transformed** box: the menu\n * enters at `scale(0.96)`, so the rect is 4% small and the clamp lets the\n * grown menu back over the edge. Measured in Chrome at 320 px wide, a 180 px\n * menu came back at `right: 316` against a margin that asked for 312.\n */\n useLayoutEffect(() => {\n if (!open || !menuNode) return;\n menuNode.focus({ preventScroll: true });\n const { offsetWidth, offsetHeight } = menuNode;\n if (offsetWidth === 0 && offsetHeight === 0) return;\n const maxLeft = window.innerWidth - offsetWidth - viewportMargin;\n const maxTop = window.innerHeight - offsetHeight - viewportMargin;\n const left = Math.max(viewportMargin, Math.min(position.x, maxLeft));\n const top = Math.max(viewportMargin, Math.min(position.y, maxTop));\n if (left !== position.x || top !== position.y) setPosition({ x: left, y: top });\n }, [open, menuNode, position.x, position.y, viewportMargin]);\n\n const handleSelect = (item: Extract<ContextMenuItem, { label: ReactNode }>): void => {\n item.onSelect?.();\n close();\n };\n\n return (\n <>\n <span\n className={styles.root}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={cancelLongPress}\n onPointerCancel={cancelLongPress}\n >\n {children}\n </span>\n {open && (\n <Portal>\n <ul\n ref={setMenuNode}\n id={id}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n className={cn(styles.menu, className)}\n style={{ top: position.y, left: position.x }}\n >\n {items.map((item, index) => {\n if (isSeparator(item)) {\n return (\n <li\n key={`separator-${index}`}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n return (\n <li key={`item-${index}`} role=\"none\">\n <button\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n styles.item,\n item.danger && styles.danger,\n activeIndex === index && styles.active,\n )}\n disabled={item.disabled}\n onClick={() => handleSelect(item)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {item.label}\n </button>\n </li>\n );\n })}\n </ul>\n </Portal>\n )}\n </>\n );\n}\n\n/**\n * Swallow the click a finger leaves behind after a long press.\n *\n * The hold fires while the finger is still down, so the browser goes on to\n * deliver `pointerup` and then `click` to whatever is under it — measured, that\n * is the same element the menu was just opened from. Without this, opening the\n * menu on a chat bubble also opens the bubble.\n *\n * Capture phase and `once`, so the listener never outlives the gesture that\n * installed it, and a later genuine click is untouched.\n */\nfunction suppressNextClick(): void {\n if (typeof window === \"undefined\") return;\n window.addEventListener(\n \"click\",\n (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n },\n { capture: true, once: true },\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContextMenu.cjs","names":["useState","useId","useRef","useCallback","_Fragment","styles","Portal","cn","require_cn","require_escape_layer","require_Portal","require_ContextMenu_module","react","react_jsx_runtime","LONG_PRESS_MOVE_TOLERANCE","isSeparator","item","ContextMenu","open","setOpen","position","setPosition","activeIndex","setActiveIndex","id","menuNode","setMenuNode","itemRefs","longPressTimer","longPressOrigin","selectableIndexes","items","index","i","close","openAt","point","cancelLongPress","handleContextMenu","trigger","event","handleClick","handlePointerDown","longPressDelay","suppressNextClick","handlePointerMove","origin","onKey","move","next","current","onDown","offsetWidth","offsetHeight","maxLeft","viewportMargin","maxTop","left","top","handleSelect","className","el"],"sources":["../../../src/components/ContextMenu/ContextMenu.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines function-lines — the body owns one anchor point and\n * everything that reads from it: the three ways a menu opens (right click, long\n * press, click), the clamp that keeps it inside the viewport, and roving focus\n * for the keyboard path. Splitting them would hand the same geometry to three\n * files.\n */\nimport { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport type { PointerEvent as ReactPointerEvent, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"@/components/Portal\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport styles from \"./ContextMenu.module.css\";\n\nexport type ContextMenuItem =\n | {\n label: ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n danger?: boolean;\n }\n | { separator: true };\n\n/** How the menu is opened by a pointer. Touch always gets the long press. */\nexport type ContextMenuTrigger = \"contextmenu\" | \"click\" | \"both\";\n\nexport interface ContextMenuProps {\n /** Menu entries — selectable items and separators. */\n items: ContextMenuItem[];\n /** Trigger area. Right-clicking anywhere within opens the menu at the cursor. */\n children: ReactNode;\n /** Extra class names forwarded to the menu element. */\n className?: string;\n /**\n * Which pointer gesture opens the menu. Default `\"contextmenu\"`.\n *\n * `\"click\"` is the `⋮` button case, where a right click is the wrong gesture\n * on the desktop and impossible on touch. `\"both\"` keeps the right click and\n * adds the left one.\n */\n trigger?: ContextMenuTrigger;\n /**\n * Hold, in ms, that opens the menu from a coarse pointer. Default `500`.\n *\n * Set `0` to turn the long press off. It is on by default because touch has\n * no right click: measured in Chrome with touch emulation (Pixel 7 and\n * iPhone 13 profiles), a 900 ms hold fires `pointerdown`, `touchstart`,\n * `pointerup`, `touchend` and `click` — and no `contextmenu` at all. Every\n * action behind this menu was unreachable on a phone.\n */\n longPressDelay?: number;\n /**\n * Gap, in px, kept between the menu and the edge of the viewport. Default `8`.\n */\n viewportMargin?: number;\n}\n\ninterface Position {\n x: number;\n y: number;\n}\n\n/** Movement, in px, that reads as a scroll rather than a hold. */\nconst LONG_PRESS_MOVE_TOLERANCE = 10;\n\nfunction isSeparator(item: ContextMenuItem): item is { separator: true } {\n return \"separator\" in item && item.separator === true;\n}\n\n/**\n * Context menu — right click, long press, or click.\n *\n * - Opens at the pointer on `contextmenu`, and on a long press from touch or pen,\n * which is the gesture those pointers have instead of a right click. `trigger`\n * adds or replaces the mouse gesture; the long press is independent of it.\n * - Clamped inside the viewport after it mounts, so a menu opened near an edge\n * moves in rather than overflowing — measured before the clamp: a 180 px menu\n * opened at `x=235` in a 320 px window ran 95 px off screen, cutting the right\n * edge off every label.\n * - Rendered through a {@link Portal} so it escapes parent overflow/stacking\n * contexts.\n * - Closes on outside click, Escape, scroll, resize, or item selection.\n * - Arrow Up/Down move focus across selectable items and wrap; Home/End jump to\n * the ends; Enter activates the focused item. The menu itself takes focus when\n * it opens, so a screen reader announces it instead of staying on the trigger.\n *\n * @param props - The context menu props.\n * @returns The trigger wrapper plus the portalled menu when open.\n */\nexport function ContextMenu({\n items,\n children,\n className,\n trigger = \"contextmenu\",\n longPressDelay = 500,\n viewportMargin = 8,\n}: ContextMenuProps) {\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<Position>({ x: 0, y: 0 });\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const id = useId();\n const [menuNode, setMenuNode] = useState<HTMLUListElement | null>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressOrigin = useRef<Position | null>(null);\n\n const selectableIndexes = items\n .map((item, index) => (!isSeparator(item) && !item.disabled ? index : -1))\n .filter((i) => i !== -1);\n\n const close = useCallback((): void => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n const openAt = useCallback((point: Position): void => {\n setPosition(point);\n setActiveIndex(-1);\n setOpen(true);\n }, []);\n\n const cancelLongPress = useCallback((): void => {\n if (longPressTimer.current !== null) {\n clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n }\n longPressOrigin.current = null;\n }, []);\n\n useEffect(() => cancelLongPress, [cancelLongPress]);\n\n const handleContextMenu = (event: React.MouseEvent): void => {\n if (trigger === \"click\") return;\n event.preventDefault();\n openAt({ x: event.clientX, y: event.clientY });\n };\n\n const handleClick = (event: React.MouseEvent): void => {\n if (trigger === \"contextmenu\") return;\n openAt({ x: event.clientX, y: event.clientY });\n };\n\n /**\n * Start the hold that stands in for a right click on a coarse pointer.\n *\n * A mouse is excluded: it has `contextmenu`, and holding the left button is\n * how a drag starts.\n */\n const handlePointerDown = (event: ReactPointerEvent): void => {\n if (longPressDelay <= 0 || event.pointerType === \"mouse\") return;\n const point = { x: event.clientX, y: event.clientY };\n longPressOrigin.current = point;\n cancelLongPress();\n longPressOrigin.current = point;\n longPressTimer.current = setTimeout(() => {\n longPressTimer.current = null;\n longPressOrigin.current = null;\n suppressNextClick();\n openAt(point);\n }, longPressDelay);\n };\n\n /**\n * Cancel the hold once the finger travels — otherwise every scroll that\n * starts on the trigger opens a menu, which is the difference between a\n * usable long press and an infuriating one.\n */\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const origin = longPressOrigin.current;\n if (!origin || longPressTimer.current === null) return;\n if (\n Math.hypot(event.clientX - origin.x, event.clientY - origin.y) >\n LONG_PRESS_MOVE_TOLERANCE\n ) {\n cancelLongPress();\n }\n };\n\n useEscapeLayer(open, close);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent): void => {\n const move = (next: number): void => {\n event.preventDefault();\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n };\n if (selectableIndexes.length === 0) return;\n const current = selectableIndexes.indexOf(activeIndex);\n if (event.key === \"ArrowDown\") {\n move(selectableIndexes[(current + 1) % selectableIndexes.length] ?? -1);\n }\n if (event.key === \"ArrowUp\") {\n move(\n selectableIndexes[\n (current - 1 + selectableIndexes.length) % selectableIndexes.length\n ] ?? -1,\n );\n }\n if (event.key === \"Home\") {\n move(selectableIndexes[0] ?? -1);\n }\n if (event.key === \"End\") {\n move(selectableIndexes[selectableIndexes.length - 1] ?? -1);\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (menuNode && !menuNode.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n window.addEventListener(\"resize\", close);\n window.addEventListener(\"scroll\", close, true);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n window.removeEventListener(\"resize\", close);\n window.removeEventListener(\"scroll\", close, true);\n };\n }, [open, activeIndex, selectableIndexes, close, menuNode]);\n\n /**\n * Pull the menu inside the viewport, and take focus.\n *\n * Keyed off the node rather than off `open`, because {@link Portal} renders\n * `null` on its first pass and mounts on an effect — an effect that reads a\n * ref when `open` flips runs while the menu does not exist yet, measures\n * nothing and focuses nothing. A callback ref in state is what makes this\n * run on the render that has the element.\n *\n * `useLayoutEffect` runs before paint, so the menu is never painted at the\n * overflowing position first.\n *\n * The size comes from `offsetWidth`/`offsetHeight` rather than from\n * `getBoundingClientRect`, which reports the **transformed** box: the menu\n * enters at `scale(0.96)`, so the rect is 4% small and the clamp lets the\n * grown menu back over the edge. Measured in Chrome at 320 px wide, a 180 px\n * menu came back at `right: 316` against a margin that asked for 312.\n */\n useLayoutEffect(() => {\n if (!open || !menuNode) return;\n menuNode.focus({ preventScroll: true });\n const { offsetWidth, offsetHeight } = menuNode;\n if (offsetWidth === 0 && offsetHeight === 0) return;\n const maxLeft = window.innerWidth - offsetWidth - viewportMargin;\n const maxTop = window.innerHeight - offsetHeight - viewportMargin;\n const left = Math.max(viewportMargin, Math.min(position.x, maxLeft));\n const top = Math.max(viewportMargin, Math.min(position.y, maxTop));\n if (left !== position.x || top !== position.y) setPosition({ x: left, y: top });\n }, [open, menuNode, position.x, position.y, viewportMargin]);\n\n const handleSelect = (item: Extract<ContextMenuItem, { label: ReactNode }>): void => {\n item.onSelect?.();\n close();\n };\n\n return (\n <>\n <span\n className={styles.root}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={cancelLongPress}\n onPointerCancel={cancelLongPress}\n >\n {children}\n </span>\n {open && (\n <Portal>\n <ul\n ref={setMenuNode}\n id={id}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n className={cn(styles.menu, className)}\n style={{ top: position.y, left: position.x }}\n >\n {items.map((item, index) => {\n if (isSeparator(item)) {\n return (\n <li\n key={`separator-${index}`}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n return (\n <li key={`item-${index}`} role=\"none\">\n <button\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n styles.item,\n item.danger && styles.danger,\n activeIndex === index && styles.active,\n )}\n disabled={item.disabled}\n onClick={() => handleSelect(item)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {item.label}\n </button>\n </li>\n );\n })}\n </ul>\n </Portal>\n )}\n </>\n );\n}\n\n/**\n * Swallow the click a finger leaves behind after a long press.\n *\n * The hold fires while the finger is still down, so the browser goes on to\n * deliver `pointerup` and then `click` to whatever is under it — measured, that\n * is the same element the menu was just opened from. Without this, opening the\n * menu on a chat bubble also opens the bubble.\n *\n * Capture phase and `once`, so the listener never outlives the gesture that\n * installed it, and a later genuine click is untouched.\n */\nfunction suppressNextClick(): void {\n if (typeof window === \"undefined\") return;\n window.addEventListener(\n \"click\",\n (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n },\n { capture: true, once: true },\n );\n}\n"],"mappings":"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"}
|
|
@@ -127,7 +127,7 @@ function h({ items: h, children: _, className: v, trigger: y = "contextmenu", lo
|
|
|
127
127
|
}) })] });
|
|
128
128
|
}
|
|
129
129
|
function g() {
|
|
130
|
-
typeof window
|
|
130
|
+
typeof window < "u" && window.addEventListener("click", (e) => {
|
|
131
131
|
e.preventDefault(), e.stopPropagation();
|
|
132
132
|
}, {
|
|
133
133
|
capture: !0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.js","names":[],"sources":["../../../src/components/ContextMenu/ContextMenu.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines function-lines — the body owns one anchor point and\n * everything that reads from it: the three ways a menu opens (right click, long\n * press, click), the clamp that keeps it inside the viewport, and roving focus\n * for the keyboard path. Splitting them would hand the same geometry to three\n * files.\n */\nimport { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport type { PointerEvent as ReactPointerEvent, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"@/components/Portal\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport styles from \"./ContextMenu.module.css\";\n\nexport type ContextMenuItem =\n | {\n label: ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n danger?: boolean;\n }\n | { separator: true };\n\n/** How the menu is opened by a pointer. Touch always gets the long press. */\nexport type ContextMenuTrigger = \"contextmenu\" | \"click\" | \"both\";\n\nexport interface ContextMenuProps {\n /** Menu entries — selectable items and separators. */\n items: ContextMenuItem[];\n /** Trigger area. Right-clicking anywhere within opens the menu at the cursor. */\n children: ReactNode;\n /** Extra class names forwarded to the menu element. */\n className?: string;\n /**\n * Which pointer gesture opens the menu. Default `\"contextmenu\"`.\n *\n * `\"click\"` is the `⋮` button case, where a right click is the wrong gesture\n * on the desktop and impossible on touch. `\"both\"` keeps the right click and\n * adds the left one.\n */\n trigger?: ContextMenuTrigger;\n /**\n * Hold, in ms, that opens the menu from a coarse pointer. Default `500`.\n *\n * Set `0` to turn the long press off. It is on by default because touch has\n * no right click: measured in Chrome with touch emulation (Pixel 7 and\n * iPhone 13 profiles), a 900 ms hold fires `pointerdown`, `touchstart`,\n * `pointerup`, `touchend` and `click` — and no `contextmenu` at all. Every\n * action behind this menu was unreachable on a phone.\n */\n longPressDelay?: number;\n /**\n * Gap, in px, kept between the menu and the edge of the viewport. Default `8`.\n */\n viewportMargin?: number;\n}\n\ninterface Position {\n x: number;\n y: number;\n}\n\n/** Movement, in px, that reads as a scroll rather than a hold. */\nconst LONG_PRESS_MOVE_TOLERANCE = 10;\n\nfunction isSeparator(item: ContextMenuItem): item is { separator: true } {\n return \"separator\" in item && item.separator === true;\n}\n\n/**\n * Context menu — right click, long press, or click.\n *\n * - Opens at the pointer on `contextmenu`, and on a long press from touch or pen,\n * which is the gesture those pointers have instead of a right click. `trigger`\n * adds or replaces the mouse gesture; the long press is independent of it.\n * - Clamped inside the viewport after it mounts, so a menu opened near an edge\n * moves in rather than overflowing — measured before the clamp: a 180 px menu\n * opened at `x=235` in a 320 px window ran 95 px off screen, cutting the right\n * edge off every label.\n * - Rendered through a {@link Portal} so it escapes parent overflow/stacking\n * contexts.\n * - Closes on outside click, Escape, scroll, resize, or item selection.\n * - Arrow Up/Down move focus across selectable items and wrap; Home/End jump to\n * the ends; Enter activates the focused item. The menu itself takes focus when\n * it opens, so a screen reader announces it instead of staying on the trigger.\n *\n * @param props - The context menu props.\n * @returns The trigger wrapper plus the portalled menu when open.\n */\nexport function ContextMenu({\n items,\n children,\n className,\n trigger = \"contextmenu\",\n longPressDelay = 500,\n viewportMargin = 8,\n}: ContextMenuProps) {\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<Position>({ x: 0, y: 0 });\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const id = useId();\n const [menuNode, setMenuNode] = useState<HTMLUListElement | null>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressOrigin = useRef<Position | null>(null);\n\n const selectableIndexes = items\n .map((item, index) => (!isSeparator(item) && !item.disabled ? index : -1))\n .filter((i) => i !== -1);\n\n const close = useCallback((): void => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n const openAt = useCallback((point: Position): void => {\n setPosition(point);\n setActiveIndex(-1);\n setOpen(true);\n }, []);\n\n const cancelLongPress = useCallback((): void => {\n if (longPressTimer.current !== null) {\n clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n }\n longPressOrigin.current = null;\n }, []);\n\n useEffect(() => cancelLongPress, [cancelLongPress]);\n\n const handleContextMenu = (event: React.MouseEvent): void => {\n if (trigger === \"click\") return;\n event.preventDefault();\n openAt({ x: event.clientX, y: event.clientY });\n };\n\n const handleClick = (event: React.MouseEvent): void => {\n if (trigger === \"contextmenu\") return;\n openAt({ x: event.clientX, y: event.clientY });\n };\n\n /**\n * Start the hold that stands in for a right click on a coarse pointer.\n *\n * A mouse is excluded: it has `contextmenu`, and holding the left button is\n * how a drag starts.\n */\n const handlePointerDown = (event: ReactPointerEvent): void => {\n if (longPressDelay <= 0 || event.pointerType === \"mouse\") return;\n const point = { x: event.clientX, y: event.clientY };\n longPressOrigin.current = point;\n cancelLongPress();\n longPressOrigin.current = point;\n longPressTimer.current = setTimeout(() => {\n longPressTimer.current = null;\n longPressOrigin.current = null;\n suppressNextClick();\n openAt(point);\n }, longPressDelay);\n };\n\n /**\n * Cancel the hold once the finger travels — otherwise every scroll that\n * starts on the trigger opens a menu, which is the difference between a\n * usable long press and an infuriating one.\n */\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const origin = longPressOrigin.current;\n if (!origin || longPressTimer.current === null) return;\n if (\n Math.hypot(event.clientX - origin.x, event.clientY - origin.y) >\n LONG_PRESS_MOVE_TOLERANCE\n ) {\n cancelLongPress();\n }\n };\n\n useEscapeLayer(open, close);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent): void => {\n const move = (next: number): void => {\n event.preventDefault();\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n };\n if (selectableIndexes.length === 0) return;\n const current = selectableIndexes.indexOf(activeIndex);\n if (event.key === \"ArrowDown\") {\n move(selectableIndexes[(current + 1) % selectableIndexes.length] ?? -1);\n }\n if (event.key === \"ArrowUp\") {\n move(\n selectableIndexes[\n (current - 1 + selectableIndexes.length) % selectableIndexes.length\n ] ?? -1,\n );\n }\n if (event.key === \"Home\") {\n move(selectableIndexes[0] ?? -1);\n }\n if (event.key === \"End\") {\n move(selectableIndexes[selectableIndexes.length - 1] ?? -1);\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (menuNode && !menuNode.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n window.addEventListener(\"resize\", close);\n window.addEventListener(\"scroll\", close, true);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n window.removeEventListener(\"resize\", close);\n window.removeEventListener(\"scroll\", close, true);\n };\n }, [open, activeIndex, selectableIndexes, close, menuNode]);\n\n /**\n * Pull the menu inside the viewport, and take focus.\n *\n * Keyed off the node rather than off `open`, because {@link Portal} renders\n * `null` on its first pass and mounts on an effect — an effect that reads a\n * ref when `open` flips runs while the menu does not exist yet, measures\n * nothing and focuses nothing. A callback ref in state is what makes this\n * run on the render that has the element.\n *\n * `useLayoutEffect` runs before paint, so the menu is never painted at the\n * overflowing position first.\n *\n * The size comes from `offsetWidth`/`offsetHeight` rather than from\n * `getBoundingClientRect`, which reports the **transformed** box: the menu\n * enters at `scale(0.96)`, so the rect is 4% small and the clamp lets the\n * grown menu back over the edge. Measured in Chrome at 320 px wide, a 180 px\n * menu came back at `right: 316` against a margin that asked for 312.\n */\n useLayoutEffect(() => {\n if (!open || !menuNode) return;\n menuNode.focus({ preventScroll: true });\n const { offsetWidth, offsetHeight } = menuNode;\n if (offsetWidth === 0 && offsetHeight === 0) return;\n const maxLeft = window.innerWidth - offsetWidth - viewportMargin;\n const maxTop = window.innerHeight - offsetHeight - viewportMargin;\n const left = Math.max(viewportMargin, Math.min(position.x, maxLeft));\n const top = Math.max(viewportMargin, Math.min(position.y, maxTop));\n if (left !== position.x || top !== position.y) setPosition({ x: left, y: top });\n }, [open, menuNode, position.x, position.y, viewportMargin]);\n\n const handleSelect = (item: Extract<ContextMenuItem, { label: ReactNode }>): void => {\n item.onSelect?.();\n close();\n };\n\n return (\n <>\n <span\n className={styles.root}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={cancelLongPress}\n onPointerCancel={cancelLongPress}\n >\n {children}\n </span>\n {open && (\n <Portal>\n <ul\n ref={setMenuNode}\n id={id}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n className={cn(styles.menu, className)}\n style={{ top: position.y, left: position.x }}\n >\n {items.map((item, index) => {\n if (isSeparator(item)) {\n return (\n <li\n key={`separator-${index}`}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n return (\n <li key={`item-${index}`} role=\"none\">\n <button\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n styles.item,\n item.danger && styles.danger,\n activeIndex === index && styles.active,\n )}\n disabled={item.disabled}\n onClick={() => handleSelect(item)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {item.label}\n </button>\n </li>\n );\n })}\n </ul>\n </Portal>\n )}\n </>\n );\n}\n\n/**\n * Swallow the click a finger leaves behind after a long press.\n *\n * The hold fires while the finger is still down, so the browser goes on to\n * deliver `pointerup` and then `click` to whatever is under it — measured, that\n * is the same element the menu was just opened from. Without this, opening the\n * menu on a chat bubble also opens the bubble.\n *\n * Capture phase and `once`, so the listener never outlives the gesture that\n * installed it, and a later genuine click is untouched.\n */\nfunction suppressNextClick(): void {\n if (typeof window === \"undefined\") return;\n window.addEventListener(\n \"click\",\n (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n },\n { capture: true, once: true },\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContextMenu.js","names":["_Fragment","styles","ContextMenu_module_default","Fragment$1","LONG_PRESS_MOVE_TOLERANCE","isSeparator","item","ContextMenu","open","setOpen","useState","position","setPosition","activeIndex","setActiveIndex","id","useId","menuNode","setMenuNode","itemRefs","useRef","longPressTimer","longPressOrigin","selectableIndexes","items","index","i","close","useCallback","openAt","point","cancelLongPress","handleContextMenu","trigger","event","handleClick","handlePointerDown","longPressDelay","suppressNextClick","handlePointerMove","origin","useEscapeLayer","useEffect","onKey","move","next","current","onDown","useLayoutEffect","offsetWidth","offsetHeight","maxLeft","viewportMargin","maxTop","left","top","handleSelect","Portal","cn","className","el"],"sources":["../../../src/components/ContextMenu/ContextMenu.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines function-lines — the body owns one anchor point and\n * everything that reads from it: the three ways a menu opens (right click, long\n * press, click), the clamp that keeps it inside the viewport, and roving focus\n * for the keyboard path. Splitting them would hand the same geometry to three\n * files.\n */\nimport { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from \"react\";\nimport type { PointerEvent as ReactPointerEvent, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"@/components/Portal\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport styles from \"./ContextMenu.module.css\";\n\nexport type ContextMenuItem =\n | {\n label: ReactNode;\n onSelect?: () => void;\n disabled?: boolean;\n danger?: boolean;\n }\n | { separator: true };\n\n/** How the menu is opened by a pointer. Touch always gets the long press. */\nexport type ContextMenuTrigger = \"contextmenu\" | \"click\" | \"both\";\n\nexport interface ContextMenuProps {\n /** Menu entries — selectable items and separators. */\n items: ContextMenuItem[];\n /** Trigger area. Right-clicking anywhere within opens the menu at the cursor. */\n children: ReactNode;\n /** Extra class names forwarded to the menu element. */\n className?: string;\n /**\n * Which pointer gesture opens the menu. Default `\"contextmenu\"`.\n *\n * `\"click\"` is the `⋮` button case, where a right click is the wrong gesture\n * on the desktop and impossible on touch. `\"both\"` keeps the right click and\n * adds the left one.\n */\n trigger?: ContextMenuTrigger;\n /**\n * Hold, in ms, that opens the menu from a coarse pointer. Default `500`.\n *\n * Set `0` to turn the long press off. It is on by default because touch has\n * no right click: measured in Chrome with touch emulation (Pixel 7 and\n * iPhone 13 profiles), a 900 ms hold fires `pointerdown`, `touchstart`,\n * `pointerup`, `touchend` and `click` — and no `contextmenu` at all. Every\n * action behind this menu was unreachable on a phone.\n */\n longPressDelay?: number;\n /**\n * Gap, in px, kept between the menu and the edge of the viewport. Default `8`.\n */\n viewportMargin?: number;\n}\n\ninterface Position {\n x: number;\n y: number;\n}\n\n/** Movement, in px, that reads as a scroll rather than a hold. */\nconst LONG_PRESS_MOVE_TOLERANCE = 10;\n\nfunction isSeparator(item: ContextMenuItem): item is { separator: true } {\n return \"separator\" in item && item.separator === true;\n}\n\n/**\n * Context menu — right click, long press, or click.\n *\n * - Opens at the pointer on `contextmenu`, and on a long press from touch or pen,\n * which is the gesture those pointers have instead of a right click. `trigger`\n * adds or replaces the mouse gesture; the long press is independent of it.\n * - Clamped inside the viewport after it mounts, so a menu opened near an edge\n * moves in rather than overflowing — measured before the clamp: a 180 px menu\n * opened at `x=235` in a 320 px window ran 95 px off screen, cutting the right\n * edge off every label.\n * - Rendered through a {@link Portal} so it escapes parent overflow/stacking\n * contexts.\n * - Closes on outside click, Escape, scroll, resize, or item selection.\n * - Arrow Up/Down move focus across selectable items and wrap; Home/End jump to\n * the ends; Enter activates the focused item. The menu itself takes focus when\n * it opens, so a screen reader announces it instead of staying on the trigger.\n *\n * @param props - The context menu props.\n * @returns The trigger wrapper plus the portalled menu when open.\n */\nexport function ContextMenu({\n items,\n children,\n className,\n trigger = \"contextmenu\",\n longPressDelay = 500,\n viewportMargin = 8,\n}: ContextMenuProps) {\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<Position>({ x: 0, y: 0 });\n const [activeIndex, setActiveIndex] = useState<number>(-1);\n const id = useId();\n const [menuNode, setMenuNode] = useState<HTMLUListElement | null>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const longPressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const longPressOrigin = useRef<Position | null>(null);\n\n const selectableIndexes = items\n .map((item, index) => (!isSeparator(item) && !item.disabled ? index : -1))\n .filter((i) => i !== -1);\n\n const close = useCallback((): void => {\n setOpen(false);\n setActiveIndex(-1);\n }, []);\n\n const openAt = useCallback((point: Position): void => {\n setPosition(point);\n setActiveIndex(-1);\n setOpen(true);\n }, []);\n\n const cancelLongPress = useCallback((): void => {\n if (longPressTimer.current !== null) {\n clearTimeout(longPressTimer.current);\n longPressTimer.current = null;\n }\n longPressOrigin.current = null;\n }, []);\n\n useEffect(() => cancelLongPress, [cancelLongPress]);\n\n const handleContextMenu = (event: React.MouseEvent): void => {\n if (trigger === \"click\") return;\n event.preventDefault();\n openAt({ x: event.clientX, y: event.clientY });\n };\n\n const handleClick = (event: React.MouseEvent): void => {\n if (trigger === \"contextmenu\") return;\n openAt({ x: event.clientX, y: event.clientY });\n };\n\n /**\n * Start the hold that stands in for a right click on a coarse pointer.\n *\n * A mouse is excluded: it has `contextmenu`, and holding the left button is\n * how a drag starts.\n */\n const handlePointerDown = (event: ReactPointerEvent): void => {\n if (longPressDelay <= 0 || event.pointerType === \"mouse\") return;\n const point = { x: event.clientX, y: event.clientY };\n longPressOrigin.current = point;\n cancelLongPress();\n longPressOrigin.current = point;\n longPressTimer.current = setTimeout(() => {\n longPressTimer.current = null;\n longPressOrigin.current = null;\n suppressNextClick();\n openAt(point);\n }, longPressDelay);\n };\n\n /**\n * Cancel the hold once the finger travels — otherwise every scroll that\n * starts on the trigger opens a menu, which is the difference between a\n * usable long press and an infuriating one.\n */\n const handlePointerMove = (event: ReactPointerEvent): void => {\n const origin = longPressOrigin.current;\n if (!origin || longPressTimer.current === null) return;\n if (\n Math.hypot(event.clientX - origin.x, event.clientY - origin.y) >\n LONG_PRESS_MOVE_TOLERANCE\n ) {\n cancelLongPress();\n }\n };\n\n useEscapeLayer(open, close);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent): void => {\n const move = (next: number): void => {\n event.preventDefault();\n setActiveIndex(next);\n itemRefs.current[next]?.focus();\n };\n if (selectableIndexes.length === 0) return;\n const current = selectableIndexes.indexOf(activeIndex);\n if (event.key === \"ArrowDown\") {\n move(selectableIndexes[(current + 1) % selectableIndexes.length] ?? -1);\n }\n if (event.key === \"ArrowUp\") {\n move(\n selectableIndexes[\n (current - 1 + selectableIndexes.length) % selectableIndexes.length\n ] ?? -1,\n );\n }\n if (event.key === \"Home\") {\n move(selectableIndexes[0] ?? -1);\n }\n if (event.key === \"End\") {\n move(selectableIndexes[selectableIndexes.length - 1] ?? -1);\n }\n };\n const onDown = (event: MouseEvent): void => {\n if (menuNode && !menuNode.contains(event.target as Node)) close();\n };\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onDown);\n window.addEventListener(\"resize\", close);\n window.addEventListener(\"scroll\", close, true);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onDown);\n window.removeEventListener(\"resize\", close);\n window.removeEventListener(\"scroll\", close, true);\n };\n }, [open, activeIndex, selectableIndexes, close, menuNode]);\n\n /**\n * Pull the menu inside the viewport, and take focus.\n *\n * Keyed off the node rather than off `open`, because {@link Portal} renders\n * `null` on its first pass and mounts on an effect — an effect that reads a\n * ref when `open` flips runs while the menu does not exist yet, measures\n * nothing and focuses nothing. A callback ref in state is what makes this\n * run on the render that has the element.\n *\n * `useLayoutEffect` runs before paint, so the menu is never painted at the\n * overflowing position first.\n *\n * The size comes from `offsetWidth`/`offsetHeight` rather than from\n * `getBoundingClientRect`, which reports the **transformed** box: the menu\n * enters at `scale(0.96)`, so the rect is 4% small and the clamp lets the\n * grown menu back over the edge. Measured in Chrome at 320 px wide, a 180 px\n * menu came back at `right: 316` against a margin that asked for 312.\n */\n useLayoutEffect(() => {\n if (!open || !menuNode) return;\n menuNode.focus({ preventScroll: true });\n const { offsetWidth, offsetHeight } = menuNode;\n if (offsetWidth === 0 && offsetHeight === 0) return;\n const maxLeft = window.innerWidth - offsetWidth - viewportMargin;\n const maxTop = window.innerHeight - offsetHeight - viewportMargin;\n const left = Math.max(viewportMargin, Math.min(position.x, maxLeft));\n const top = Math.max(viewportMargin, Math.min(position.y, maxTop));\n if (left !== position.x || top !== position.y) setPosition({ x: left, y: top });\n }, [open, menuNode, position.x, position.y, viewportMargin]);\n\n const handleSelect = (item: Extract<ContextMenuItem, { label: ReactNode }>): void => {\n item.onSelect?.();\n close();\n };\n\n return (\n <>\n <span\n className={styles.root}\n onContextMenu={handleContextMenu}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={cancelLongPress}\n onPointerCancel={cancelLongPress}\n >\n {children}\n </span>\n {open && (\n <Portal>\n <ul\n ref={setMenuNode}\n id={id}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n className={cn(styles.menu, className)}\n style={{ top: position.y, left: position.x }}\n >\n {items.map((item, index) => {\n if (isSeparator(item)) {\n return (\n <li\n key={`separator-${index}`}\n role=\"separator\"\n className={styles.separator}\n aria-hidden\n />\n );\n }\n return (\n <li key={`item-${index}`} role=\"none\">\n <button\n ref={(el) => {\n itemRefs.current[index] = el;\n }}\n type=\"button\"\n role=\"menuitem\"\n className={cn(\n styles.item,\n item.danger && styles.danger,\n activeIndex === index && styles.active,\n )}\n disabled={item.disabled}\n onClick={() => handleSelect(item)}\n onMouseEnter={() => setActiveIndex(index)}\n >\n {item.label}\n </button>\n </li>\n );\n })}\n </ul>\n </Portal>\n )}\n </>\n );\n}\n\n/**\n * Swallow the click a finger leaves behind after a long press.\n *\n * The hold fires while the finger is still down, so the browser goes on to\n * deliver `pointerup` and then `click` to whatever is under it — measured, that\n * is the same element the menu was just opened from. Without this, opening the\n * menu on a chat bubble also opens the bubble.\n *\n * Capture phase and `once`, so the listener never outlives the gesture that\n * installed it, and a later genuine click is untouched.\n */\nfunction suppressNextClick(): void {\n if (typeof window === \"undefined\") return;\n window.addEventListener(\n \"click\",\n (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n },\n { capture: true, once: true },\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.module.cjs","names":[],"sources":["../../../src/components/ContextMenu/ContextMenu.module.css"],"sourcesContent":[".root {\n display: contents;\n}\n\n/*\n * A hold on a coarse pointer is this component's right click, and the platform\n * has its own ideas about what a hold means: iOS raises the callout and both\n * platforms start a text selection. Scoped to `pointer: coarse` so a mouse user\n * keeps ordinary selection over the same content.\n */\n@media (pointer: coarse) {\n .root {\n -webkit-touch-callout: none;\n user-select: none;\n }\n}\n\n/*\n * The menu takes focus when it opens so a screen reader announces it, and that\n * focus gets no ring of its own: measured in Chrome, focusing it from a long\n * press still matches `:focus-visible`, which drew a heavy ring around the whole\n * menu after every touch. The indicator that matters is on the focused item,\n * which is where the arrow keys move next.\n */\n.menu:focus {\n outline: none;\n}\n\n.menu {\n position: fixed;\n z-index: var(--tempest-z-popover);\n min-width: 180px;\n max-width: 320px;\n background-color: var(--tempest-bg);\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-1);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n list-style: none;\n margin: 0;\n animation: tempest-context-menu-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n width: 100%;\n padding: var(--tempest-space-2) var(--tempest-space-3);\n background: none;\n border: none;\n border-radius: var(--tempest-radius-sm);\n color: var(--tempest-text);\n font-family: inherit;\n font-size: inherit;\n line-height: var(--tempest-leading-snug);\n text-align: left;\n cursor: pointer;\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .item:hover:not(:disabled) {\n background-color: var(--tempest-surface);\n }\n}\n\n.item:focus,\n.item.active {\n outline: none;\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n box-shadow: inset 3px 0 0 0 var(--tempest-selected-indicator);\n}\n\n.item:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.item.danger {\n color: var(--tempest-danger);\n}\n\n.separator {\n height: 1px;\n background-color: var(--tempest-border);\n margin: var(--tempest-space-1) 0;\n}\n\n@keyframes tempest-context-menu-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .menu {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"ContextMenu.module.cjs","names":["root","menu","tempestContextMenuIn","item","active","danger","separator","ContextMenu_module_default"],"sources":["../../../src/components/ContextMenu/ContextMenu.module.css"],"sourcesContent":[".root {\n display: contents;\n}\n\n/*\n * A hold on a coarse pointer is this component's right click, and the platform\n * has its own ideas about what a hold means: iOS raises the callout and both\n * platforms start a text selection. Scoped to `pointer: coarse` so a mouse user\n * keeps ordinary selection over the same content.\n */\n@media (pointer: coarse) {\n .root {\n -webkit-touch-callout: none;\n user-select: none;\n }\n}\n\n/*\n * The menu takes focus when it opens so a screen reader announces it, and that\n * focus gets no ring of its own: measured in Chrome, focusing it from a long\n * press still matches `:focus-visible`, which drew a heavy ring around the whole\n * menu after every touch. The indicator that matters is on the focused item,\n * which is where the arrow keys move next.\n */\n.menu:focus {\n outline: none;\n}\n\n.menu {\n position: fixed;\n z-index: var(--tempest-z-popover);\n min-width: 180px;\n max-width: 320px;\n background-color: var(--tempest-bg);\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-1);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n list-style: none;\n margin: 0;\n animation: tempest-context-menu-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n width: 100%;\n padding: var(--tempest-space-2) var(--tempest-space-3);\n background: none;\n border: none;\n border-radius: var(--tempest-radius-sm);\n color: var(--tempest-text);\n font-family: inherit;\n font-size: inherit;\n line-height: var(--tempest-leading-snug);\n text-align: left;\n cursor: pointer;\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .item:hover:not(:disabled) {\n background-color: var(--tempest-surface);\n }\n}\n\n.item:focus,\n.item.active {\n outline: none;\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n box-shadow: inset 3px 0 0 0 var(--tempest-selected-indicator);\n}\n\n.item:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.item.danger {\n color: var(--tempest-danger);\n}\n\n.separator {\n height: 1px;\n background-color: var(--tempest-border);\n margin: var(--tempest-space-1) 0;\n}\n\n@keyframes tempest-context-menu-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .menu {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.module.js","names":[],"sources":["../../../src/components/ContextMenu/ContextMenu.module.css"],"sourcesContent":[".root {\n display: contents;\n}\n\n/*\n * A hold on a coarse pointer is this component's right click, and the platform\n * has its own ideas about what a hold means: iOS raises the callout and both\n * platforms start a text selection. Scoped to `pointer: coarse` so a mouse user\n * keeps ordinary selection over the same content.\n */\n@media (pointer: coarse) {\n .root {\n -webkit-touch-callout: none;\n user-select: none;\n }\n}\n\n/*\n * The menu takes focus when it opens so a screen reader announces it, and that\n * focus gets no ring of its own: measured in Chrome, focusing it from a long\n * press still matches `:focus-visible`, which drew a heavy ring around the whole\n * menu after every touch. The indicator that matters is on the focused item,\n * which is where the arrow keys move next.\n */\n.menu:focus {\n outline: none;\n}\n\n.menu {\n position: fixed;\n z-index: var(--tempest-z-popover);\n min-width: 180px;\n max-width: 320px;\n background-color: var(--tempest-bg);\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-1);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n list-style: none;\n margin: 0;\n animation: tempest-context-menu-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n width: 100%;\n padding: var(--tempest-space-2) var(--tempest-space-3);\n background: none;\n border: none;\n border-radius: var(--tempest-radius-sm);\n color: var(--tempest-text);\n font-family: inherit;\n font-size: inherit;\n line-height: var(--tempest-leading-snug);\n text-align: left;\n cursor: pointer;\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .item:hover:not(:disabled) {\n background-color: var(--tempest-surface);\n }\n}\n\n.item:focus,\n.item.active {\n outline: none;\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n box-shadow: inset 3px 0 0 0 var(--tempest-selected-indicator);\n}\n\n.item:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.item.danger {\n color: var(--tempest-danger);\n}\n\n.separator {\n height: 1px;\n background-color: var(--tempest-border);\n margin: var(--tempest-space-1) 0;\n}\n\n@keyframes tempest-context-menu-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .menu {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"ContextMenu.module.js","names":["root","menu","tempestContextMenuIn","item","active","danger","separator","ContextMenu_module_default"],"sources":["../../../src/components/ContextMenu/ContextMenu.module.css"],"sourcesContent":[".root {\n display: contents;\n}\n\n/*\n * A hold on a coarse pointer is this component's right click, and the platform\n * has its own ideas about what a hold means: iOS raises the callout and both\n * platforms start a text selection. Scoped to `pointer: coarse` so a mouse user\n * keeps ordinary selection over the same content.\n */\n@media (pointer: coarse) {\n .root {\n -webkit-touch-callout: none;\n user-select: none;\n }\n}\n\n/*\n * The menu takes focus when it opens so a screen reader announces it, and that\n * focus gets no ring of its own: measured in Chrome, focusing it from a long\n * press still matches `:focus-visible`, which drew a heavy ring around the whole\n * menu after every touch. The indicator that matters is on the focused item,\n * which is where the arrow keys move next.\n */\n.menu:focus {\n outline: none;\n}\n\n.menu {\n position: fixed;\n z-index: var(--tempest-z-popover);\n min-width: 180px;\n max-width: 320px;\n background-color: var(--tempest-bg);\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-1);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-base);\n list-style: none;\n margin: 0;\n animation: tempest-context-menu-in var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: var(--tempest-space-2);\n width: 100%;\n padding: var(--tempest-space-2) var(--tempest-space-3);\n background: none;\n border: none;\n border-radius: var(--tempest-radius-sm);\n color: var(--tempest-text);\n font-family: inherit;\n font-size: inherit;\n line-height: var(--tempest-leading-snug);\n text-align: left;\n cursor: pointer;\n transition: var(--tempest-transition-color);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .item:hover:not(:disabled) {\n background-color: var(--tempest-surface);\n }\n}\n\n.item:focus,\n.item.active {\n outline: none;\n background-color: var(--tempest-primary-soft);\n color: var(--tempest-primary-on-soft);\n box-shadow: inset 3px 0 0 0 var(--tempest-selected-indicator);\n}\n\n.item:disabled {\n opacity: 0.55;\n cursor: not-allowed;\n}\n\n.item.danger {\n color: var(--tempest-danger);\n}\n\n.separator {\n height: 1px;\n background-color: var(--tempest-border);\n margin: var(--tempest-space-1) 0;\n}\n\n@keyframes tempest-context-menu-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .menu {\n animation: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyButton.cjs","names":[],"sources":["../../../src/components/CopyButton/CopyButton.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./CopyButton.module.css\";\n\nexport interface CopyButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Text written to the clipboard when the button is clicked. */\n value: string;\n /** How long (ms) the \"copied\" state stays active before resetting. Defaults to 2000. */\n timeout?: number;\n /** Optional label. Falls back to \"Copy\" / \"Copied\" based on state. */\n children?: ReactNode;\n /** Called after a successful clipboard write. */\n onCopied?: () => void;\n}\n\n/**\n * Button that copies a string to the clipboard and shows a transient \"copied\"\n * state for `timeout` milliseconds.\n *\n * When `children` are provided they are rendered in both states; otherwise the\n * label toggles between \"Copy\" and \"Copied\". The reset timer is cleared on\n * unmount to avoid setting state on an unmounted component.\n *\n * @tempest-limits empty-catch — `navigator.clipboard.writeText` rejects when the\n * page is not a secure context, when the document is not focused, or when the user\n * denied the permission. None of those are recoverable here and none deserve an\n * error surface: the button simply never enters the \"copied\" state, which is the\n * feedback the user needs.\n *\n * @example\n * <CopyButton value=\"npm i tempest-react-sdk\" />\n */\nexport function CopyButton({\n value,\n timeout = 2000,\n children,\n onCopied,\n className,\n onClick,\n ...props\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopied?.();\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), timeout);\n } catch {\n /* empty */\n }\n },\n [value, timeout, onCopied, onClick],\n );\n\n return (\n <button\n type=\"button\"\n className={cn(styles.button, copied && styles.copied, className)}\n data-copied={copied || undefined}\n onClick={handleClick}\n {...props}\n >\n {children ?? (copied ? \"Copied\" : \"Copy\")}\n </button>\n );\n}\n"],"mappings":"iIAiCA,
|
|
1
|
+
{"version":3,"file":"CopyButton.cjs","names":["useState","useRef","useCallback","cn","styles","require_cn","require_CopyButton_module","react","react_jsx_runtime","CopyButton","props","copied","setCopied","timerRef","handleClick","onClick","event","value","onCopied","timeout","className","children"],"sources":["../../../src/components/CopyButton/CopyButton.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./CopyButton.module.css\";\n\nexport interface CopyButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Text written to the clipboard when the button is clicked. */\n value: string;\n /** How long (ms) the \"copied\" state stays active before resetting. Defaults to 2000. */\n timeout?: number;\n /** Optional label. Falls back to \"Copy\" / \"Copied\" based on state. */\n children?: ReactNode;\n /** Called after a successful clipboard write. */\n onCopied?: () => void;\n}\n\n/**\n * Button that copies a string to the clipboard and shows a transient \"copied\"\n * state for `timeout` milliseconds.\n *\n * When `children` are provided they are rendered in both states; otherwise the\n * label toggles between \"Copy\" and \"Copied\". The reset timer is cleared on\n * unmount to avoid setting state on an unmounted component.\n *\n * @tempest-limits empty-catch — `navigator.clipboard.writeText` rejects when the\n * page is not a secure context, when the document is not focused, or when the user\n * denied the permission. None of those are recoverable here and none deserve an\n * error surface: the button simply never enters the \"copied\" state, which is the\n * feedback the user needs.\n *\n * @example\n * <CopyButton value=\"npm i tempest-react-sdk\" />\n */\nexport function CopyButton({\n value,\n timeout = 2000,\n children,\n onCopied,\n className,\n onClick,\n ...props\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopied?.();\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), timeout);\n } catch {\n /* empty */\n }\n },\n [value, timeout, onCopied, onClick],\n );\n\n return (\n <button\n type=\"button\"\n className={cn(styles.button, copied && styles.copied, className)}\n data-copied={copied || undefined}\n onClick={handleClick}\n {...props}\n >\n {children ?? (copied ? \"Copied\" : \"Copy\")}\n </button>\n );\n}\n"],"mappings":"A,iIAiCA,SAAgBS,EAAW,CACvB,QACA,UAAU,IACV,WACA,WACA,YACA,UACA,GAAGC,GACa,CAChB,GAAM,CAACC,EAAQC,IAAA,EAAaZ,EAAAA,SAAAA,CAAS,EAAK,EACpCa,GAAA,EAAWZ,EAAAA,OAAAA,CAA6C,IAAI,GAElE,EAAAM,EAAA,UAAA,SACiB,CACLM,EAAS,UAAY,MAAM,aAAaA,EAAS,OAAO,CAChE,EACD,CAAC,CAAC,EAEL,IAAMC,GAAA,EAAcZ,EAAAA,YAAAA,CAChB,KAAO,IAA+C,CAClDa,IAAUC,CAAK,EACf,GAAI,CACA,MAAM,UAAU,UAAU,UAAUC,CAAK,EACzCL,EAAU,EAAI,EACdM,IAAW,EACPL,EAAS,UAAY,MAAM,aAAaA,EAAS,OAAO,EAC5D,EAAS,QAAU,eAAiBD,EAAU,EAAK,EAAGO,CAAO,CACjE,MAAQ,CAER,CACJ,EACA,CAACF,EAAOE,EAASD,EAAUH,CAAO,CACtC,EAEA,OACI,EAAAP,EAAA,IAAA,CAAC,SAAD,CACI,KAAK,SACL,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,OAAQO,GAAUP,EAAAA,QAAO,OAAQgB,CAAS,EAC/D,cAAaT,GAAU,IAAA,GACvB,QAASG,EACT,GAAIJ,EAEH,SAAAW,IAAaV,EAAS,SAAW,OAC9B,CAAA,CAEhB,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyButton.js","names":[],"sources":["../../../src/components/CopyButton/CopyButton.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./CopyButton.module.css\";\n\nexport interface CopyButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Text written to the clipboard when the button is clicked. */\n value: string;\n /** How long (ms) the \"copied\" state stays active before resetting. Defaults to 2000. */\n timeout?: number;\n /** Optional label. Falls back to \"Copy\" / \"Copied\" based on state. */\n children?: ReactNode;\n /** Called after a successful clipboard write. */\n onCopied?: () => void;\n}\n\n/**\n * Button that copies a string to the clipboard and shows a transient \"copied\"\n * state for `timeout` milliseconds.\n *\n * When `children` are provided they are rendered in both states; otherwise the\n * label toggles between \"Copy\" and \"Copied\". The reset timer is cleared on\n * unmount to avoid setting state on an unmounted component.\n *\n * @tempest-limits empty-catch — `navigator.clipboard.writeText` rejects when the\n * page is not a secure context, when the document is not focused, or when the user\n * denied the permission. None of those are recoverable here and none deserve an\n * error surface: the button simply never enters the \"copied\" state, which is the\n * feedback the user needs.\n *\n * @example\n * <CopyButton value=\"npm i tempest-react-sdk\" />\n */\nexport function CopyButton({\n value,\n timeout = 2000,\n children,\n onCopied,\n className,\n onClick,\n ...props\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopied?.();\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), timeout);\n } catch {\n /* empty */\n }\n },\n [value, timeout, onCopied, onClick],\n );\n\n return (\n <button\n type=\"button\"\n className={cn(styles.button, copied && styles.copied, className)}\n data-copied={copied || undefined}\n onClick={handleClick}\n {...props}\n >\n {children ?? (copied ? \"Copied\" : \"Copy\")}\n </button>\n );\n}\n"],"mappings":";;;;;AAiCA,
|
|
1
|
+
{"version":3,"file":"CopyButton.js","names":["styles","CopyButton_module_default","CopyButton","props","copied","setCopied","useState","timerRef","useRef","handleClick","useCallback","event","value","onCopied","timeout","onClick","cn","className","children"],"sources":["../../../src/components/CopyButton/CopyButton.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./CopyButton.module.css\";\n\nexport interface CopyButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** Text written to the clipboard when the button is clicked. */\n value: string;\n /** How long (ms) the \"copied\" state stays active before resetting. Defaults to 2000. */\n timeout?: number;\n /** Optional label. Falls back to \"Copy\" / \"Copied\" based on state. */\n children?: ReactNode;\n /** Called after a successful clipboard write. */\n onCopied?: () => void;\n}\n\n/**\n * Button that copies a string to the clipboard and shows a transient \"copied\"\n * state for `timeout` milliseconds.\n *\n * When `children` are provided they are rendered in both states; otherwise the\n * label toggles between \"Copy\" and \"Copied\". The reset timer is cleared on\n * unmount to avoid setting state on an unmounted component.\n *\n * @tempest-limits empty-catch — `navigator.clipboard.writeText` rejects when the\n * page is not a secure context, when the document is not focused, or when the user\n * denied the permission. None of those are recoverable here and none deserve an\n * error surface: the button simply never enters the \"copied\" state, which is the\n * feedback the user needs.\n *\n * @example\n * <CopyButton value=\"npm i tempest-react-sdk\" />\n */\nexport function CopyButton({\n value,\n timeout = 2000,\n children,\n onCopied,\n className,\n onClick,\n ...props\n}: CopyButtonProps) {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n return () => {\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleClick = useCallback(\n async (event: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n try {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopied?.();\n if (timerRef.current !== null) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), timeout);\n } catch {\n /* empty */\n }\n },\n [value, timeout, onCopied, onClick],\n );\n\n return (\n <button\n type=\"button\"\n className={cn(styles.button, copied && styles.copied, className)}\n data-copied={copied || undefined}\n onClick={handleClick}\n {...props}\n >\n {children ?? (copied ? \"Copied\" : \"Copy\")}\n </button>\n );\n}\n"],"mappings":";;;;;AAiCA,SAAgBE,EAAW,EACvB,UACA,aAAU,KACV,aACA,aACA,cACA,YACA,GAAGC,KACa;CAChB,IAAM,CAACC,GAAQC,KAAaC,EAAS,EAAK,GACpCC,IAAWC,EAA6C,IAAI;CAElE,cACiB;EACT,AAAID,EAAS,YAAY,QAAM,aAAaA,EAAS,OAAO;CAChE,GACD,CAAC,CAAC;CAEL,IAAME,IAAcC,EAChB,OAAO,MAA+C;EAClD,IAAUC,CAAK;EACf,IAAI;GAKA,AAJA,MAAM,UAAU,UAAU,UAAUC,CAAK,GACzCP,EAAU,EAAI,GACdQ,IAAW,GACPN,EAAS,YAAY,QAAM,aAAaA,EAAS,OAAO,GAC5D,EAAS,UAAU,iBAAiBF,EAAU,EAAK,GAAGS,CAAO;EACjE,QAAQ,CAER;CACJ,GACA;EAACF;EAAOE;EAASD;EAAUE;CAAO,CACtC;CAEA,OACI,kBAAC,UAAD;EACI,MAAK;EACL,WAAWC,EAAGhB,EAAO,QAAQI,KAAUJ,EAAO,QAAQiB,CAAS;EAC/D,eAAab,KAAU,KAAA;EACvB,SAASK;EACT,GAAIN;EAEH,UAAAe,MAAad,IAAS,WAAW;CAC9B,CAAA;AAEhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyButton.module.cjs","names":[],"sources":["../../../src/components/CopyButton/CopyButton.module.css"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--tempest-space-1);\n padding: var(--tempest-space-1) var(--tempest-space-3);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n line-height: var(--tempest-leading-snug);\n cursor: pointer;\n transition: background-color var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.button:hover {\n background-color: var(--tempest-surface-2);\n}\n\n.copied {\n color: var(--tempest-primary-foreground, var(--tempest-text-on-primary));\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"CopyButton.module.cjs","names":["button","copied","CopyButton_module_default"],"sources":["../../../src/components/CopyButton/CopyButton.module.css"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--tempest-space-1);\n padding: var(--tempest-space-1) var(--tempest-space-3);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n line-height: var(--tempest-leading-snug);\n cursor: pointer;\n transition: background-color var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.button:hover {\n background-color: var(--tempest-surface-2);\n}\n\n.copied {\n color: var(--tempest-primary-foreground, var(--tempest-text-on-primary));\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopyButton.module.js","names":[],"sources":["../../../src/components/CopyButton/CopyButton.module.css"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--tempest-space-1);\n padding: var(--tempest-space-1) var(--tempest-space-3);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n line-height: var(--tempest-leading-snug);\n cursor: pointer;\n transition: background-color var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.button:hover {\n background-color: var(--tempest-surface-2);\n}\n\n.copied {\n color: var(--tempest-primary-foreground, var(--tempest-text-on-primary));\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"CopyButton.module.js","names":["button","copied","CopyButton_module_default"],"sources":["../../../src/components/CopyButton/CopyButton.module.css"],"sourcesContent":[".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--tempest-space-1);\n padding: var(--tempest-space-1) var(--tempest-space-3);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-sans);\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-medium);\n line-height: var(--tempest-leading-snug);\n cursor: pointer;\n transition: background-color var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.button:hover {\n background-color: var(--tempest-surface-2);\n}\n\n.copied {\n color: var(--tempest-primary-foreground, var(--tempest-text-on-primary));\n background-color: var(--tempest-primary);\n border-color: var(--tempest-primary);\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataList.cjs","names":[],"sources":["../../../src/components/DataList/DataList.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DataList.module.css\";\n\nexport interface DataListProps<T> extends HTMLAttributes<HTMLUListElement> {\n /** The collection to render, one `<li>` per item. */\n items: readonly T[];\n /** Renders the contents of each list item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** Derives a stable React key for each item (defaults to the index). */\n keyExtractor?: (item: T, index: number) => string | number;\n /** Node rendered in place of the list when `items` is empty. */\n empty?: ReactNode;\n}\n\n/**\n * Generic, typed list that renders a `<ul>` with one `<li>` per item.\n *\n * The component is generic over the item type so `renderItem` and\n * `keyExtractor` infer their argument types from `items`. When `items` is\n * empty it renders `empty` (or nothing) instead of an empty list.\n *\n * @param items - The collection to render.\n * @param renderItem - Renders the contents of each list item.\n * @param keyExtractor - Optional stable key derivation (defaults to index).\n * @param empty - Optional node shown when there are no items.\n * @returns The rendered list, or the `empty` node when there are no items.\n */\nexport function DataList<T>({\n items,\n renderItem,\n keyExtractor,\n empty,\n className,\n ...props\n}: DataListProps<T>) {\n if (items.length === 0) {\n return <>{empty ?? null}</>;\n }\n\n return (\n <ul className={cn(styles.list, className)} {...props}>\n {items.map((item, index) => (\n <li key={keyExtractor ? keyExtractor(item, index) : index} className={styles.item}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":"4GA4BA,
|
|
1
|
+
{"version":3,"file":"DataList.cjs","names":["_Fragment","cn","styles","require_cn","require_DataList_module","react_jsx_runtime","DataList","props","items","empty","className","renderItem","item","index","keyExtractor"],"sources":["../../../src/components/DataList/DataList.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DataList.module.css\";\n\nexport interface DataListProps<T> extends HTMLAttributes<HTMLUListElement> {\n /** The collection to render, one `<li>` per item. */\n items: readonly T[];\n /** Renders the contents of each list item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** Derives a stable React key for each item (defaults to the index). */\n keyExtractor?: (item: T, index: number) => string | number;\n /** Node rendered in place of the list when `items` is empty. */\n empty?: ReactNode;\n}\n\n/**\n * Generic, typed list that renders a `<ul>` with one `<li>` per item.\n *\n * The component is generic over the item type so `renderItem` and\n * `keyExtractor` infer their argument types from `items`. When `items` is\n * empty it renders `empty` (or nothing) instead of an empty list.\n *\n * @param items - The collection to render.\n * @param renderItem - Renders the contents of each list item.\n * @param keyExtractor - Optional stable key derivation (defaults to index).\n * @param empty - Optional node shown when there are no items.\n * @returns The rendered list, or the `empty` node when there are no items.\n */\nexport function DataList<T>({\n items,\n renderItem,\n keyExtractor,\n empty,\n className,\n ...props\n}: DataListProps<T>) {\n if (items.length === 0) {\n return <>{empty ?? null}</>;\n }\n\n return (\n <ul className={cn(styles.list, className)} {...props}>\n {items.map((item, index) => (\n <li key={keyExtractor ? keyExtractor(item, index) : index} className={styles.item}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":"A,4GA4BA,SAAgBM,EAAY,CACxB,QACA,aACA,eACA,QACA,YACA,GAAGC,GACc,CAKjB,OAJIC,EAAM,SAAW,GACV,EAAAH,EAAA,IAAA,CAAAL,EAAAA,SAAA,CAAA,SAAGS,GAAS,IAAO,CAAA,GAI1B,EAAAJ,EAAA,IAAA,CAAC,KAAD,CAAI,UAAWJ,EAAAA,GAAGC,EAAAA,QAAO,KAAMQ,CAAS,EAAG,GAAIH,EAC1C,SAAAC,EAAM,KAAK,EAAM,KACd,EAAAH,EAAA,IAAA,CAAC,KAAD,CAA2D,UAAWH,EAAAA,QAAO,KACxE,SAAAS,EAAWC,EAAMC,CAAK,CACvB,EAFKC,EAAeA,EAAaF,EAAMC,CAAK,EAAIA,CAEhD,CACP,CACD,CAAA,CAEZ,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataList.js","names":[],"sources":["../../../src/components/DataList/DataList.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DataList.module.css\";\n\nexport interface DataListProps<T> extends HTMLAttributes<HTMLUListElement> {\n /** The collection to render, one `<li>` per item. */\n items: readonly T[];\n /** Renders the contents of each list item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** Derives a stable React key for each item (defaults to the index). */\n keyExtractor?: (item: T, index: number) => string | number;\n /** Node rendered in place of the list when `items` is empty. */\n empty?: ReactNode;\n}\n\n/**\n * Generic, typed list that renders a `<ul>` with one `<li>` per item.\n *\n * The component is generic over the item type so `renderItem` and\n * `keyExtractor` infer their argument types from `items`. When `items` is\n * empty it renders `empty` (or nothing) instead of an empty list.\n *\n * @param items - The collection to render.\n * @param renderItem - Renders the contents of each list item.\n * @param keyExtractor - Optional stable key derivation (defaults to index).\n * @param empty - Optional node shown when there are no items.\n * @returns The rendered list, or the `empty` node when there are no items.\n */\nexport function DataList<T>({\n items,\n renderItem,\n keyExtractor,\n empty,\n className,\n ...props\n}: DataListProps<T>) {\n if (items.length === 0) {\n return <>{empty ?? null}</>;\n }\n\n return (\n <ul className={cn(styles.list, className)} {...props}>\n {items.map((item, index) => (\n <li key={keyExtractor ? keyExtractor(item, index) : index} className={styles.item}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;;AA4BA,
|
|
1
|
+
{"version":3,"file":"DataList.js","names":["_Fragment","styles","DataList_module_default","DataList","props","items","Fragment","empty","cn","className","renderItem","item","index","keyExtractor"],"sources":["../../../src/components/DataList/DataList.tsx"],"sourcesContent":["import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./DataList.module.css\";\n\nexport interface DataListProps<T> extends HTMLAttributes<HTMLUListElement> {\n /** The collection to render, one `<li>` per item. */\n items: readonly T[];\n /** Renders the contents of each list item. */\n renderItem: (item: T, index: number) => ReactNode;\n /** Derives a stable React key for each item (defaults to the index). */\n keyExtractor?: (item: T, index: number) => string | number;\n /** Node rendered in place of the list when `items` is empty. */\n empty?: ReactNode;\n}\n\n/**\n * Generic, typed list that renders a `<ul>` with one `<li>` per item.\n *\n * The component is generic over the item type so `renderItem` and\n * `keyExtractor` infer their argument types from `items`. When `items` is\n * empty it renders `empty` (or nothing) instead of an empty list.\n *\n * @param items - The collection to render.\n * @param renderItem - Renders the contents of each list item.\n * @param keyExtractor - Optional stable key derivation (defaults to index).\n * @param empty - Optional node shown when there are no items.\n * @returns The rendered list, or the `empty` node when there are no items.\n */\nexport function DataList<T>({\n items,\n renderItem,\n keyExtractor,\n empty,\n className,\n ...props\n}: DataListProps<T>) {\n if (items.length === 0) {\n return <>{empty ?? null}</>;\n }\n\n return (\n <ul className={cn(styles.list, className)} {...props}>\n {items.map((item, index) => (\n <li key={keyExtractor ? keyExtractor(item, index) : index} className={styles.item}>\n {renderItem(item, index)}\n </li>\n ))}\n </ul>\n );\n}\n"],"mappings":";;;;AA4BA,SAAgBG,EAAY,EACxB,UACA,eACA,iBACA,UACA,cACA,GAAGC,KACc;CAKjB,OAJIC,EAAM,WAAW,IACV,kBAAAL,GAAA,EAAA,UAAGO,KAAS,KAAO,CAAA,IAI1B,kBAAC,MAAD;EAAI,WAAWC,EAAGP,EAAO,MAAMQ,CAAS;EAAG,GAAIL;EAC1C,UAAAC,EAAM,KAAK,GAAM,MACd,kBAAC,MAAD;GAA2D,WAAWJ,EAAO;GACxE,UAAAS,EAAWC,GAAMC,CAAK;EACvB,GAFKC,IAAeA,EAAaF,GAAMC,CAAK,IAAIA,CAEhD,CACP;CACD,CAAA;AAEZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataList.module.cjs","names":[],"sources":["../../../src/components/DataList/DataList.module.css"],"sourcesContent":[".list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-2);\n}\n\n.item {\n margin: 0;\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"DataList.module.cjs","names":["list","item","DataList_module_default"],"sources":["../../../src/components/DataList/DataList.module.css"],"sourcesContent":[".list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-2);\n}\n\n.item {\n margin: 0;\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataList.module.js","names":[],"sources":["../../../src/components/DataList/DataList.module.css"],"sourcesContent":[".list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-2);\n}\n\n.item {\n margin: 0;\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"DataList.module.js","names":["list","item","DataList_module_default"],"sources":["../../../src/components/DataList/DataList.module.css"],"sourcesContent":[".list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-2);\n}\n\n.item {\n margin: 0;\n}\n"],"mappings":";"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../utils/cn.cjs"),t=require("../../hooks/use-pagination.cjs"),n=require("../../hooks/use-announce.cjs"),r=require("../Pagination/Pagination.cjs"),i=require("../SearchBar/SearchBar.cjs"),a=require("../Table/Table.cjs"),o=require("../../utils/compare-values.cjs"),s=require("./DataTable.module.cjs"),c=require("./EditableCell.cjs"),ee=require("./LoadingRows.cjs"),te=require("./use-dev-warnings.cjs"),ne=require("./edit-labels.cjs");let l=require("react"),u=require("react/jsx-runtime");function d(e,t){return`${String(e)}::${String(t)}`}function f(e){return typeof e.header==`string`?e.header:String(e.key)}function p({data:p,columns:m,pageSize:h,searchable:g=!1,searchKeys:_,initialSort:re,rowKey:v=(e,t)=>t,emptyMessage:ie,onCellChange:y,editLabels:b,totalItems:ae,page:x,onPageChange:S,onPageSizeChange:C,pageSizeOptions:oe,manualSort:se,onSortChange:ce,manualSearch:le,onSearchChange:ue,loading:w=!1,className:de,...fe}){let T=h??10,[E,pe]=(0,l.useState)(``),[D,me]=(0,l.useState)(re??null),{page:he,setPage:ge}=t.usePagination(1,T),_e=n.useAnnounce(),O=ae!==void 0,k=se??O,A=le??O,j=x??he,M=(0,l.useCallback)(e=>{x===void 0&&ge(e),S?.(e)},[x,ge,S]),ve=(0,l.useCallback)(e=>{C?.(e),j!==1&&M(1)},[C,j,M]);te.useDevWarnings({serverMode:O,controlledPage:x,onPageChange:S,pageSizeControlled:h!==void 0,onPageSizeChange:C,sortIsManual:k,hasSortableColumn:m.some(e=>e.sortable),onSortChange:ce,searchable:g,onSearchChange:ue});let[N,P]=(0,l.useState)(null),[F,I]=(0,l.useState)(null),[L,R]=(0,l.useState)({}),[z,B]=(0,l.useState)({}),[ye,V]=(0,l.useState)({}),H=(0,l.useMemo)(()=>({...ne.DEFAULT_EDIT_LABELS,...b}),[b]),U=y!==void 0&&m.some(e=>e.editable),be=(0,l.useMemo)(()=>!g||A?[]:_&&_.length>0?_:m.filter(e=>{let t=p.find(t=>t[e.key]!=null),n=t?t[e.key]:void 0;return typeof n==`string`||typeof n==`number`}).map(e=>e.key),[g,A,_,m,p]),W=(0,l.useMemo)(()=>{let e=E.trim().toLowerCase();return!e||!g||A?p:p.filter(t=>be.some(n=>{let r=t[n];return r!=null&&String(r).toLowerCase().includes(e)}))},[p,E,g,A,be]),G=(0,l.useMemo)(()=>{if(!D||k)return W;let e=D.direction===`asc`?1:-1;return[...W].sort((t,n)=>o.compareValues(t[D.key],n[D.key])*e)},[W,D,k]),xe=ae??G.length,K=Math.max(1,Math.ceil(xe/T));(0,l.useEffect)(()=>{!O&&j>K&&M(K)},[O,j,K,M]);let q=O?j:Math.min(j,K),J=(0,l.useMemo)(()=>{if(O)return G;let e=(q-1)*T;return G.slice(e,e+T)},[O,G,q,T]);function Se(e){let t=D,n=!t||t.key!==e?{key:e,direction:`asc`}:t.direction===`asc`?{key:e,direction:`desc`}:null;me(n),ce?.(n)}let Y=(0,l.useCallback)(e=>(q-1)*T+e,[q,T]),X=(0,l.useMemo)(()=>{if(!U)return[];let e=[];return J.forEach((t,n)=>{let r=v(t,Y(n));for(let t of m)t.editable&&e.push(d(r,t.key))}),e},[U,J,m,Y]),Z=(0,l.useCallback)((e,t,n)=>n in L?L[n]:e[t.key],[L]),Ce=(0,l.useCallback)(async(e,t,n)=>{V(t=>({...t,[e]:!0}));try{await y?.(n),_e(H.saved(f(t)))}catch(n){R(t=>{let n={...t};return delete n[e],n});let r=n instanceof Error&&n.message?n.message:H.saveFailed(f(t));B(t=>({...t,[e]:r}))}finally{V(t=>{let n={...t};return delete n[e],n})}},[y,_e,H]),Q=(0,l.useCallback)((e,t)=>{if(t===`none`){P(null),I(e);return}let n=X.indexOf(e),r=X[n+(t===`next`?1:-1)];
|
|
1
|
+
const e=require("../../utils/cn.cjs"),t=require("../../hooks/use-pagination.cjs"),n=require("../../hooks/use-announce.cjs"),r=require("../Pagination/Pagination.cjs"),i=require("../SearchBar/SearchBar.cjs"),a=require("../Table/Table.cjs"),o=require("../../utils/compare-values.cjs"),s=require("./DataTable.module.cjs"),c=require("./EditableCell.cjs"),ee=require("./LoadingRows.cjs"),te=require("./use-dev-warnings.cjs"),ne=require("./edit-labels.cjs");let l=require("react"),u=require("react/jsx-runtime");function d(e,t){return`${String(e)}::${String(t)}`}function f(e){return typeof e.header==`string`?e.header:String(e.key)}function p({data:p,columns:m,pageSize:h,searchable:g=!1,searchKeys:_,initialSort:re,rowKey:v=(e,t)=>t,emptyMessage:ie,onCellChange:y,editLabels:b,totalItems:ae,page:x,onPageChange:S,onPageSizeChange:C,pageSizeOptions:oe,manualSort:se,onSortChange:ce,manualSearch:le,onSearchChange:ue,loading:w=!1,className:de,...fe}){let T=h??10,[E,pe]=(0,l.useState)(``),[D,me]=(0,l.useState)(re??null),{page:he,setPage:ge}=t.usePagination(1,T),_e=n.useAnnounce(),O=ae!==void 0,k=se??O,A=le??O,j=x??he,M=(0,l.useCallback)(e=>{x===void 0&&ge(e),S?.(e)},[x,ge,S]),ve=(0,l.useCallback)(e=>{C?.(e),j!==1&&M(1)},[C,j,M]);te.useDevWarnings({serverMode:O,controlledPage:x,onPageChange:S,pageSizeControlled:h!==void 0,onPageSizeChange:C,sortIsManual:k,hasSortableColumn:m.some(e=>e.sortable),onSortChange:ce,searchable:g,onSearchChange:ue});let[N,P]=(0,l.useState)(null),[F,I]=(0,l.useState)(null),[L,R]=(0,l.useState)({}),[z,B]=(0,l.useState)({}),[ye,V]=(0,l.useState)({}),H=(0,l.useMemo)(()=>({...ne.DEFAULT_EDIT_LABELS,...b}),[b]),U=y!==void 0&&m.some(e=>e.editable),be=(0,l.useMemo)(()=>!g||A?[]:_&&_.length>0?_:m.filter(e=>{let t=p.find(t=>t[e.key]!=null),n=t?t[e.key]:void 0;return typeof n==`string`||typeof n==`number`}).map(e=>e.key),[g,A,_,m,p]),W=(0,l.useMemo)(()=>{let e=E.trim().toLowerCase();return!e||!g||A?p:p.filter(t=>be.some(n=>{let r=t[n];return r!=null&&String(r).toLowerCase().includes(e)}))},[p,E,g,A,be]),G=(0,l.useMemo)(()=>{if(!D||k)return W;let e=D.direction===`asc`?1:-1;return[...W].sort((t,n)=>o.compareValues(t[D.key],n[D.key])*e)},[W,D,k]),xe=ae??G.length,K=Math.max(1,Math.ceil(xe/T));(0,l.useEffect)(()=>{!O&&j>K&&M(K)},[O,j,K,M]);let q=O?j:Math.min(j,K),J=(0,l.useMemo)(()=>{if(O)return G;let e=(q-1)*T;return G.slice(e,e+T)},[O,G,q,T]);function Se(e){let t=D,n=!t||t.key!==e?{key:e,direction:`asc`}:t.direction===`asc`?{key:e,direction:`desc`}:null;me(n),ce?.(n)}let Y=(0,l.useCallback)(e=>(q-1)*T+e,[q,T]),X=(0,l.useMemo)(()=>{if(!U)return[];let e=[];return J.forEach((t,n)=>{let r=v(t,Y(n));for(let t of m)t.editable&&e.push(d(r,t.key))}),e},[U,J,m,Y]),Z=(0,l.useCallback)((e,t,n)=>n in L?L[n]:e[t.key],[L]),Ce=(0,l.useCallback)(async(e,t,n)=>{V(t=>({...t,[e]:!0}));try{await y?.(n),_e(H.saved(f(t)))}catch(n){R(t=>{let n={...t};return delete n[e],n});let r=n instanceof Error&&n.message?n.message:H.saveFailed(f(t));B(t=>({...t,[e]:r}))}finally{V(t=>{let n={...t};return delete n[e],n})}},[y,_e,H]),Q=(0,l.useCallback)((e,t)=>{if(t===`none`){P(null),I(e);return}let n=X.indexOf(e),r=X[n+(t===`next`?1:-1)];r===void 0?(P(null),I(e)):(P(r),I(null))},[X]),we=(0,l.useCallback)((e,t,n,r,i,a)=>{let o=Z(e,t,n);if(i===(t.formatEdit?t.formatEdit(e):String(o??``))){Q(n,a);return}let s=t.parse?t.parse(i,e):t.editorType===`number`?Number(i):i.trim(),c=t.validate?.(s,e)??null;c?B(e=>({...e,[n]:c})):(B(e=>{let t={...e};return delete t[n],t}),R(e=>({...e,[n]:s})),Q(n,a),Ce(n,t,{row:e,key:t.key,value:s,previous:o,rowIndex:Y(r)}))},[Z,Q,Ce,Y]),Te=(0,l.useMemo)(()=>m.map(e=>{let t=D?.key===e.key?D?.direction===`asc`?` ▲`:` ▼`:``,n=e.sortable?(0,u.jsxs)(`button`,{type:`button`,className:s.default.sortButton,onClick:()=>Se(e.key),"aria-label":`Ordenar por ${f(e)}`,children:[e.header,(0,u.jsx)(`span`,{className:s.default.sortIndicator,"aria-hidden":!0,children:t})]}):e.header,r=t=>e.render?e.render(t):t[e.key]??null,i=(t,n)=>{let r={...t,[e.key]:n};return e.render?e.render(r):r[e.key]??null},a=U&&e.editable===!0;return{key:String(e.key),header:n,align:e.align,priority:e.priority,width:e.width,render:a?(t,n)=>{let r=d(v(t,Y(n)),e.key),a=Z(t,e,r),o=e.formatEdit?e.formatEdit(t):String(a??``);return(0,u.jsx)(c.EditableCell,{text:o,columnLabel:f(e),rowNumber:n+1,inputType:e.editorType??`text`,editing:N===r,refocus:F===r,saving:ye[r]===!0,error:z[r]??null,errorId:`tempest-cell-error-${r.replace(/[^\w-]/g,`_`)}`,labels:H,onOpen:()=>{P(r),I(null)},onCommit:(i,a)=>we(t,e,r,n,i,a),onCancel:()=>{P(null),I(r),B(e=>{let t={...e};return delete t[r],t})},children:i(t,a)})}:r}}),[m,D,U,N,F,ye,z,H,L,Y,we]),$=w&&J.length===0;return(0,u.jsxs)(`div`,{className:e.cn(s.default.wrapper,de),...fe,children:[g&&(0,u.jsx)(i.SearchBar,{value:E,onChange:e=>{pe(e),M(1),ue?.(e)},wrapperClassName:s.default.search}),(0,u.jsx)(`div`,{className:e.cn(w&&!$&&s.default.pending),"aria-busy":w||void 0,"data-testid":`tempest-datatable-body`,children:$?(0,u.jsx)(ee.LoadingRows,{columns:Te.length,rows:Math.min(T,8)}):(0,u.jsx)(a.Table,{columns:Te,data:J,rowKey:(e,t)=>v(e,Y(t)),emptyMessage:ie})}),(K>1||C!==void 0)&&(0,u.jsx)(r.Pagination,{page:q,totalPages:K,onPageChange:M,totalItems:xe,pageSize:T,pageSizeOptions:oe,onPageSizeChange:C&&ve})]})}exports.DataTable=p;
|
|
2
2
|
//# sourceMappingURL=DataTable.cjs.map
|