tempest-react-sdk 0.77.0 → 0.79.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/bin/lib/alias/collect.mjs +20 -3
- package/bin/lib/alias/index.mjs +12 -1
- package/bin/lib/alias/index.test.mjs +24 -0
- package/bin/lib/css/analyze.test.mjs +21 -1
- package/bin/lib/css/collect.mjs +14 -0
- package/bin/lib/css/extract.mjs +63 -5
- package/bin/lib/css/extract.test.mjs +110 -1
- package/bin/lib/css/fix.e2e.test.mjs +50 -0
- package/bin/lib/css/index.mjs +6 -1
- package/bin/lib/fs/contain.mjs +50 -0
- package/bin/lib/icons/generate.mjs +28 -3
- package/bin/lib/icons/generate.test.mjs +57 -1
- package/bin/lib/openapi/escape.mjs +20 -6
- package/bin/lib/openapi/generate.encode.test.mjs +120 -0
- package/bin/lib/openapi/generate.hostile.test.mjs +38 -9
- package/bin/lib/openapi/generate.mjs +203 -64
- package/bin/lib/openapi/generate.pagination.test.mjs +3 -2
- package/bin/lib/openapi/generate.test.mjs +270 -3
- package/bin/lib/openapi/schema-to-zod.mjs +5 -3
- package/bin/tempest-gen.test.mjs +188 -0
- package/bin/tempest.mjs +120 -44
- package/dist/access/Can.cjs.map +1 -1
- package/dist/access/Can.js.map +1 -1
- package/dist/access/access-control-context.cjs.map +1 -1
- package/dist/access/access-control-context.js.map +1 -1
- package/dist/access/create-role-access-control.cjs.map +1 -1
- package/dist/access/create-role-access-control.js.map +1 -1
- package/dist/access/permissions-from-token.cjs.map +1 -1
- package/dist/access/permissions-from-token.js.map +1 -1
- package/dist/access/use-can.cjs.map +1 -1
- package/dist/access/use-can.js.map +1 -1
- package/dist/app/AppProviders.cjs.map +1 -1
- package/dist/app/AppProviders.js.map +1 -1
- package/dist/audio/audio-bus.cjs.map +1 -1
- package/dist/audio/audio-bus.js.map +1 -1
- package/dist/audio/audio-output.cjs.map +1 -1
- package/dist/audio/audio-output.js.map +1 -1
- package/dist/audio/audio-player.cjs.map +1 -1
- package/dist/audio/audio-player.js.map +1 -1
- package/dist/audio/audio-recorder.cjs.map +1 -1
- package/dist/audio/audio-recorder.js.map +1 -1
- package/dist/audio/duration.cjs.map +1 -1
- package/dist/audio/duration.js.map +1 -1
- package/dist/audio/level-meter.cjs.map +1 -1
- package/dist/audio/level-meter.js.map +1 -1
- package/dist/audio/media-access.cjs.map +1 -1
- package/dist/audio/media-access.js.map +1 -1
- package/dist/audio/noise-floor.cjs.map +1 -1
- package/dist/audio/noise-floor.js.map +1 -1
- package/dist/audio/sfx-pool.cjs.map +1 -1
- package/dist/audio/sfx-pool.js.map +1 -1
- package/dist/audio/use-audio-bus.cjs.map +1 -1
- package/dist/audio/use-audio-bus.js.map +1 -1
- package/dist/audio/use-audio-recorder.cjs.map +1 -1
- package/dist/audio/use-audio-recorder.js.map +1 -1
- package/dist/audio/use-audio.cjs.map +1 -1
- package/dist/audio/use-audio.js.map +1 -1
- package/dist/audio/use-microphone.cjs +1 -1
- package/dist/audio/use-microphone.cjs.map +1 -1
- package/dist/audio/use-microphone.js +1 -5
- package/dist/audio/use-microphone.js.map +1 -1
- package/dist/audio/use-sfx-pool.cjs.map +1 -1
- package/dist/audio/use-sfx-pool.js.map +1 -1
- package/dist/audio/voice-activity.cjs.map +1 -1
- package/dist/audio/voice-activity.js.map +1 -1
- package/dist/audio/voice-chain-stages.cjs.map +1 -1
- package/dist/audio/voice-chain-stages.js.map +1 -1
- package/dist/audio/voice-chain.cjs.map +1 -1
- package/dist/audio/voice-chain.js.map +1 -1
- package/dist/audio/wav.cjs.map +1 -1
- package/dist/audio/wav.js.map +1 -1
- package/dist/auth/AuthGuard.cjs.map +1 -1
- package/dist/auth/AuthGuard.js.map +1 -1
- package/dist/auth/create-auth-store.cjs.map +1 -1
- package/dist/auth/create-auth-store.js.map +1 -1
- package/dist/auth/create-tempest-auth.cjs +1 -1
- package/dist/auth/create-tempest-auth.cjs.map +1 -1
- package/dist/auth/create-tempest-auth.js +185 -114
- package/dist/auth/create-tempest-auth.js.map +1 -1
- package/dist/auth/jwt.cjs.map +1 -1
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/lazy-with-retry.cjs.map +1 -1
- package/dist/auth/lazy-with-retry.js.map +1 -1
- package/dist/auth/passkey.cjs.map +1 -1
- package/dist/auth/passkey.js.map +1 -1
- package/dist/auth/refresh-queue.cjs.map +1 -1
- package/dist/auth/refresh-queue.js.map +1 -1
- package/dist/auth/use-passkey.cjs +1 -1
- package/dist/auth/use-passkey.cjs.map +1 -1
- package/dist/auth/use-passkey.js +1 -1
- package/dist/auth/use-passkey.js.map +1 -1
- package/dist/br/BrazilMap.cjs.map +1 -1
- package/dist/br/BrazilMap.js.map +1 -1
- package/dist/br/BrazilMap.module.cjs.map +1 -1
- package/dist/br/BrazilMap.module.js.map +1 -1
- package/dist/br/BrazilStateCitySelect.cjs.map +1 -1
- package/dist/br/BrazilStateCitySelect.js.map +1 -1
- package/dist/br/BrazilStateMap.cjs.map +1 -1
- package/dist/br/BrazilStateMap.js.map +1 -1
- package/dist/br/MapLegend.cjs.map +1 -1
- package/dist/br/MapLegend.js.map +1 -1
- package/dist/br/MapLegend.module.cjs.map +1 -1
- package/dist/br/MapLegend.module.js.map +1 -1
- package/dist/br/MapMarkers.cjs.map +1 -1
- package/dist/br/MapMarkers.js.map +1 -1
- package/dist/br/MapTooltip.cjs.map +1 -1
- package/dist/br/MapTooltip.js.map +1 -1
- package/dist/br/MunicipalitySearch.cjs +1 -1
- package/dist/br/MunicipalitySearch.cjs.map +1 -1
- package/dist/br/MunicipalitySearch.js +2 -5
- package/dist/br/MunicipalitySearch.js.map +1 -1
- package/dist/br/MunicipalitySearch.module.cjs.map +1 -1
- package/dist/br/MunicipalitySearch.module.js.map +1 -1
- package/dist/br/PixQRCode.cjs.map +1 -1
- package/dist/br/PixQRCode.js.map +1 -1
- package/dist/br/PixQRCode.module.cjs.map +1 -1
- package/dist/br/PixQRCode.module.js.map +1 -1
- package/dist/br/boleto.cjs.map +1 -1
- package/dist/br/boleto.js.map +1 -1
- package/dist/br/br-geo.cjs.map +1 -1
- package/dist/br/br-geo.js.map +1 -1
- package/dist/br/data/br-centroids.cjs.map +1 -1
- package/dist/br/data/br-centroids.js.map +1 -1
- package/dist/br/data/br-locations.cjs.map +1 -1
- package/dist/br/data/br-locations.js.map +1 -1
- package/dist/br/data/br-uf-geo.cjs.map +1 -1
- package/dist/br/data/br-uf-geo.js.map +1 -1
- package/dist/br/data/mun/AC.cjs.map +1 -1
- package/dist/br/data/mun/AC.js.map +1 -1
- package/dist/br/data/mun/AL.cjs.map +1 -1
- package/dist/br/data/mun/AL.js.map +1 -1
- package/dist/br/data/mun/AM.cjs.map +1 -1
- package/dist/br/data/mun/AM.js.map +1 -1
- package/dist/br/data/mun/AP.cjs.map +1 -1
- package/dist/br/data/mun/AP.js.map +1 -1
- package/dist/br/data/mun/BA.cjs.map +1 -1
- package/dist/br/data/mun/BA.js.map +1 -1
- package/dist/br/data/mun/CE.cjs.map +1 -1
- package/dist/br/data/mun/CE.js.map +1 -1
- package/dist/br/data/mun/DF.cjs.map +1 -1
- package/dist/br/data/mun/DF.js.map +1 -1
- package/dist/br/data/mun/ES.cjs.map +1 -1
- package/dist/br/data/mun/ES.js.map +1 -1
- package/dist/br/data/mun/GO.cjs.map +1 -1
- package/dist/br/data/mun/GO.js.map +1 -1
- package/dist/br/data/mun/MA.cjs.map +1 -1
- package/dist/br/data/mun/MA.js.map +1 -1
- package/dist/br/data/mun/MG.cjs.map +1 -1
- package/dist/br/data/mun/MG.js.map +1 -1
- package/dist/br/data/mun/MS.cjs.map +1 -1
- package/dist/br/data/mun/MS.js.map +1 -1
- package/dist/br/data/mun/MT.cjs.map +1 -1
- package/dist/br/data/mun/MT.js.map +1 -1
- package/dist/br/data/mun/PA.cjs.map +1 -1
- package/dist/br/data/mun/PA.js.map +1 -1
- package/dist/br/data/mun/PB.cjs.map +1 -1
- package/dist/br/data/mun/PB.js.map +1 -1
- package/dist/br/data/mun/PE.cjs.map +1 -1
- package/dist/br/data/mun/PE.js.map +1 -1
- package/dist/br/data/mun/PI.cjs.map +1 -1
- package/dist/br/data/mun/PI.js.map +1 -1
- package/dist/br/data/mun/PR.cjs.map +1 -1
- package/dist/br/data/mun/PR.js.map +1 -1
- package/dist/br/data/mun/RJ.cjs.map +1 -1
- package/dist/br/data/mun/RJ.js.map +1 -1
- package/dist/br/data/mun/RN.cjs.map +1 -1
- package/dist/br/data/mun/RN.js.map +1 -1
- package/dist/br/data/mun/RO.cjs.map +1 -1
- package/dist/br/data/mun/RO.js.map +1 -1
- package/dist/br/data/mun/RR.cjs.map +1 -1
- package/dist/br/data/mun/RR.js.map +1 -1
- package/dist/br/data/mun/RS.cjs.map +1 -1
- package/dist/br/data/mun/RS.js.map +1 -1
- package/dist/br/data/mun/SC.cjs.map +1 -1
- package/dist/br/data/mun/SC.js.map +1 -1
- package/dist/br/data/mun/SE.cjs.map +1 -1
- package/dist/br/data/mun/SE.js.map +1 -1
- package/dist/br/data/mun/SP.cjs.map +1 -1
- package/dist/br/data/mun/SP.js.map +1 -1
- package/dist/br/data/mun/TO.cjs.map +1 -1
- package/dist/br/data/mun/TO.js.map +1 -1
- package/dist/br/geocode.cjs.map +1 -1
- package/dist/br/geocode.js.map +1 -1
- package/dist/br/holidays.cjs.map +1 -1
- package/dist/br/holidays.js.map +1 -1
- package/dist/br/locations.cjs.map +1 -1
- package/dist/br/locations.js.map +1 -1
- package/dist/br/nfe.cjs.map +1 -1
- package/dist/br/nfe.js.map +1 -1
- package/dist/br/pix.cjs +1 -1
- package/dist/br/pix.cjs.map +1 -1
- package/dist/br/pix.js +108 -71
- package/dist/br/pix.js.map +1 -1
- package/dist/br/regions.cjs.map +1 -1
- package/dist/br/regions.js.map +1 -1
- package/dist/br/scales.cjs.map +1 -1
- package/dist/br/scales.js.map +1 -1
- package/dist/br/state-geo.cjs.map +1 -1
- package/dist/br/state-geo.js.map +1 -1
- package/dist/br/svg-utils.cjs.map +1 -1
- package/dist/br/svg-utils.js.map +1 -1
- package/dist/br/use-map-hover.cjs.map +1 -1
- package/dist/br/use-map-hover.js.map +1 -1
- package/dist/br/use-map-zoom.cjs.map +1 -1
- package/dist/br/use-map-zoom.js.map +1 -1
- package/dist/br/whatsapp.cjs.map +1 -1
- package/dist/br/whatsapp.js.map +1 -1
- package/dist/br.cjs.map +1 -1
- package/dist/br.d.ts +16 -5
- package/dist/br.js.map +1 -1
- package/dist/capture/barcode.cjs.map +1 -1
- package/dist/capture/barcode.js.map +1 -1
- package/dist/capture/media-recorder.cjs.map +1 -1
- package/dist/capture/media-recorder.js.map +1 -1
- package/dist/capture/use-barcode-scanner.cjs.map +1 -1
- package/dist/capture/use-barcode-scanner.js.map +1 -1
- package/dist/capture/use-screen-capture.cjs +1 -1
- package/dist/capture/use-screen-capture.cjs.map +1 -1
- package/dist/capture/use-screen-capture.js +1 -7
- package/dist/capture/use-screen-capture.js.map +1 -1
- package/dist/capture/use-speech-recognition.cjs +1 -1
- package/dist/capture/use-speech-recognition.cjs.map +1 -1
- package/dist/capture/use-speech-recognition.js +35 -36
- package/dist/capture/use-speech-recognition.js.map +1 -1
- package/dist/capture/use-torch.cjs.map +1 -1
- package/dist/capture/use-torch.js.map +1 -1
- package/dist/capture/use-video-recorder.cjs.map +1 -1
- package/dist/capture/use-video-recorder.js.map +1 -1
- package/dist/capture/video-recorder.cjs.map +1 -1
- package/dist/capture/video-recorder.js.map +1 -1
- package/dist/charts/AreaChart.cjs.map +1 -1
- package/dist/charts/AreaChart.js.map +1 -1
- package/dist/charts/BarChart.cjs.map +1 -1
- package/dist/charts/BarChart.js.map +1 -1
- package/dist/charts/LineChart.cjs.map +1 -1
- package/dist/charts/LineChart.js.map +1 -1
- package/dist/charts/PieChart.cjs.map +1 -1
- package/dist/charts/PieChart.js.map +1 -1
- package/dist/charts/RadarChart.cjs.map +1 -1
- package/dist/charts/RadarChart.js.map +1 -1
- package/dist/charts/palette.cjs.map +1 -1
- package/dist/charts/palette.js.map +1 -1
- package/dist/charts/scales.cjs.map +1 -1
- package/dist/charts/scales.js.map +1 -1
- package/dist/charts/types.cjs.map +1 -1
- package/dist/charts/types.js.map +1 -1
- package/dist/charts/use-chart-colors.cjs.map +1 -1
- package/dist/charts/use-chart-colors.js.map +1 -1
- package/dist/components/AIChat/AIChat.cjs +1 -1
- package/dist/components/AIChat/AIChat.cjs.map +1 -1
- package/dist/components/AIChat/AIChat.js +1 -5
- package/dist/components/AIChat/AIChat.js.map +1 -1
- package/dist/components/AIChat/AIChat.module.cjs.map +1 -1
- package/dist/components/AIChat/AIChat.module.js.map +1 -1
- package/dist/components/AIChat/AIChatComposer.cjs +1 -1
- package/dist/components/AIChat/AIChatComposer.cjs.map +1 -1
- package/dist/components/AIChat/AIChatComposer.js +1 -7
- package/dist/components/AIChat/AIChatComposer.js.map +1 -1
- package/dist/components/AIChat/AIChatTurn.cjs.map +1 -1
- package/dist/components/AIChat/AIChatTurn.js.map +1 -1
- package/dist/components/AIChat/ai-chat-turns.cjs.map +1 -1
- package/dist/components/AIChat/ai-chat-turns.js.map +1 -1
- package/dist/components/Accordion/Accordion.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.js.map +1 -1
- package/dist/components/Accordion/Accordion.module.cjs.map +1 -1
- package/dist/components/Accordion/Accordion.module.js.map +1 -1
- package/dist/components/Alert/Alert.cjs.map +1 -1
- package/dist/components/Alert/Alert.js.map +1 -1
- package/dist/components/Alert/Alert.module.cjs.map +1 -1
- package/dist/components/Alert/Alert.module.js.map +1 -1
- package/dist/components/AppBar/AppBar.cjs.map +1 -1
- package/dist/components/AppBar/AppBar.js.map +1 -1
- package/dist/components/AppBar/AppBar.module.cjs.map +1 -1
- package/dist/components/AppBar/AppBar.module.js.map +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.cjs +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.cjs.map +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.js +1 -1
- package/dist/components/AppBar/use-sticky-body-warning.js.map +1 -1
- package/dist/components/AppShell/AppShell.cjs.map +1 -1
- package/dist/components/AppShell/AppShell.js.map +1 -1
- package/dist/components/AppShell/AppShell.module.cjs.map +1 -1
- package/dist/components/AppShell/AppShell.module.js.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.cjs.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.js.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.module.cjs.map +1 -1
- package/dist/components/AspectRatio/AspectRatio.module.js.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.cjs +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.cjs.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.js +1 -7
- package/dist/components/AudioPlayer/AudioPlayer.js.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.module.cjs.map +1 -1
- package/dist/components/AudioPlayer/AudioPlayer.module.js.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.cjs +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.cjs.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.js +16 -21
- package/dist/components/AudioRecorder/AudioRecorder.js.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.module.cjs.map +1 -1
- package/dist/components/AudioRecorder/AudioRecorder.module.js.map +1 -1
- package/dist/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.js.map +1 -1
- package/dist/components/Avatar/Avatar.module.cjs.map +1 -1
- package/dist/components/Avatar/Avatar.module.js.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.cjs.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.js.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.module.cjs.map +1 -1
- package/dist/components/AvatarGroup/AvatarGroup.module.js.map +1 -1
- package/dist/components/Badge/Badge.cjs.map +1 -1
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Badge/Badge.module.cjs.map +1 -1
- package/dist/components/Badge/Badge.module.js.map +1 -1
- package/dist/components/Banner/Banner.cjs.map +1 -1
- package/dist/components/Banner/Banner.js.map +1 -1
- package/dist/components/Banner/Banner.module.cjs.map +1 -1
- package/dist/components/Banner/Banner.module.js.map +1 -1
- package/dist/components/BarList/BarList.cjs.map +1 -1
- package/dist/components/BarList/BarList.js.map +1 -1
- package/dist/components/BarList/BarList.module.cjs.map +1 -1
- package/dist/components/BarList/BarList.module.js.map +1 -1
- package/dist/components/BarList/bar-list-model.cjs.map +1 -1
- package/dist/components/BarList/bar-list-model.js.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.cjs.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.js.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.module.cjs.map +1 -1
- package/dist/components/BarcodeScanner/BarcodeScanner.module.js.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.cjs.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.js.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.module.cjs.map +1 -1
- package/dist/components/BottomNavigation/BottomNavigation.module.js.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.cjs.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.js.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.module.cjs.map +1 -1
- package/dist/components/BottomSheet/BottomSheet.module.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.cjs.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.module.cjs.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.module.js.map +1 -1
- package/dist/components/Button/Button.cjs.map +1 -1
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Button/Button.module.cjs.map +1 -1
- package/dist/components/Button/Button.module.js.map +1 -1
- package/dist/components/Button/ButtonContent.cjs.map +1 -1
- package/dist/components/Button/ButtonContent.js.map +1 -1
- package/dist/components/Button/ButtonSlot.cjs.map +1 -1
- package/dist/components/Button/ButtonSlot.js.map +1 -1
- package/dist/components/Button/button-class.cjs.map +1 -1
- package/dist/components/Button/button-class.js.map +1 -1
- package/dist/components/Button/link-rel.cjs.map +1 -1
- package/dist/components/Button/link-rel.js.map +1 -1
- package/dist/components/Button/slot.cjs.map +1 -1
- package/dist/components/Button/slot.js.map +1 -1
- package/dist/components/Calendar/Calendar.cjs.map +1 -1
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Calendar/Calendar.module.cjs.map +1 -1
- package/dist/components/Calendar/Calendar.module.js.map +1 -1
- package/dist/components/Card/Card.cjs.map +1 -1
- package/dist/components/Card/Card.js.map +1 -1
- package/dist/components/Card/Card.module.cjs.map +1 -1
- package/dist/components/Card/Card.module.js.map +1 -1
- package/dist/components/Carousel/Carousel.cjs.map +1 -1
- package/dist/components/Carousel/Carousel.js.map +1 -1
- package/dist/components/Carousel/Carousel.module.cjs.map +1 -1
- package/dist/components/Carousel/Carousel.module.js.map +1 -1
- package/dist/components/Center/Center.cjs.map +1 -1
- package/dist/components/Center/Center.js.map +1 -1
- package/dist/components/Center/Center.module.cjs.map +1 -1
- package/dist/components/Center/Center.module.js.map +1 -1
- package/dist/components/Chat/Chat.cjs.map +1 -1
- package/dist/components/Chat/Chat.js.map +1 -1
- package/dist/components/Chat/Chat.module.cjs.map +1 -1
- package/dist/components/Chat/Chat.module.js.map +1 -1
- package/dist/components/Chat/ChatActionsMenu.cjs.map +1 -1
- package/dist/components/Chat/ChatActionsMenu.js.map +1 -1
- package/dist/components/Chat/ChatAttachments.cjs.map +1 -1
- package/dist/components/Chat/ChatAttachments.js.map +1 -1
- package/dist/components/Chat/ChatBubble.cjs.map +1 -1
- package/dist/components/Chat/ChatBubble.js.map +1 -1
- package/dist/components/Chat/ChatComposer.cjs.map +1 -1
- package/dist/components/Chat/ChatComposer.js.map +1 -1
- package/dist/components/Chat/chat-groups.cjs +1 -1
- package/dist/components/Chat/chat-groups.cjs.map +1 -1
- package/dist/components/Chat/chat-groups.js +2 -6
- package/dist/components/Chat/chat-groups.js.map +1 -1
- package/dist/components/Chat/chat-receipt.cjs.map +1 -1
- package/dist/components/Chat/chat-receipt.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.cjs.map +1 -1
- package/dist/components/Checkbox/Checkbox.module.js.map +1 -1
- package/dist/components/ChipInput/ChipInput.cjs +1 -1
- package/dist/components/ChipInput/ChipInput.cjs.map +1 -1
- package/dist/components/ChipInput/ChipInput.js +2 -12
- package/dist/components/ChipInput/ChipInput.js.map +1 -1
- package/dist/components/ChipInput/ChipInput.module.cjs.map +1 -1
- package/dist/components/ChipInput/ChipInput.module.js.map +1 -1
- package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
- package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.cjs +1 -1
- package/dist/components/CodeBlock/CodeBlock.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.js +1 -1
- package/dist/components/CodeBlock/CodeBlock.js.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.cjs.map +1 -1
- package/dist/components/CodeBlock/CodeBlock.module.js.map +1 -1
- package/dist/components/CodeBlock/tokenize.cjs +1 -1
- package/dist/components/CodeBlock/tokenize.cjs.map +1 -1
- package/dist/components/CodeBlock/tokenize.js +54 -25
- package/dist/components/CodeBlock/tokenize.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.cjs.map +1 -1
- package/dist/components/Collapsible/Collapsible.js.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.cjs.map +1 -1
- package/dist/components/Collapsible/Collapsible.module.js.map +1 -1
- package/dist/components/Combobox/Combobox.cjs.map +1 -1
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Combobox/Combobox.module.cjs.map +1 -1
- package/dist/components/Combobox/Combobox.module.js.map +1 -1
- package/dist/components/Combobox/use-listbox-dismiss.cjs.map +1 -1
- package/dist/components/Combobox/use-listbox-dismiss.js.map +1 -1
- package/dist/components/Command/Command.cjs +1 -1
- package/dist/components/Command/Command.cjs.map +1 -1
- package/dist/components/Command/Command.js +4 -11
- package/dist/components/Command/Command.js.map +1 -1
- package/dist/components/Command/Command.module.cjs.map +1 -1
- package/dist/components/Command/Command.module.js.map +1 -1
- package/dist/components/ConditionalWrapper/ConditionalWrapper.cjs.map +1 -1
- package/dist/components/ConditionalWrapper/ConditionalWrapper.js.map +1 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.cjs.map +1 -1
- package/dist/components/ConfirmDialog/ConfirmDialog.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.cjs +1 -1
- package/dist/components/ContextMenu/ContextMenu.cjs.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.js +1 -1
- package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.module.cjs.map +1 -1
- package/dist/components/ContextMenu/ContextMenu.module.js.map +1 -1
- package/dist/components/CopyButton/CopyButton.cjs.map +1 -1
- package/dist/components/CopyButton/CopyButton.js.map +1 -1
- package/dist/components/CopyButton/CopyButton.module.cjs.map +1 -1
- package/dist/components/CopyButton/CopyButton.module.js.map +1 -1
- package/dist/components/DataList/DataList.cjs.map +1 -1
- package/dist/components/DataList/DataList.js.map +1 -1
- package/dist/components/DataList/DataList.module.cjs.map +1 -1
- package/dist/components/DataList/DataList.module.js.map +1 -1
- package/dist/components/DataTable/DataTable.cjs +1 -1
- package/dist/components/DataTable/DataTable.cjs.map +1 -1
- package/dist/components/DataTable/DataTable.js +6 -14
- package/dist/components/DataTable/DataTable.js.map +1 -1
- package/dist/components/DataTable/DataTable.module.cjs.map +1 -1
- package/dist/components/DataTable/DataTable.module.js.map +1 -1
- package/dist/components/DataTable/EditableCell.cjs +1 -1
- package/dist/components/DataTable/EditableCell.cjs.map +1 -1
- package/dist/components/DataTable/EditableCell.js +1 -9
- package/dist/components/DataTable/EditableCell.js.map +1 -1
- package/dist/components/DataTable/LoadingRows.cjs.map +1 -1
- package/dist/components/DataTable/LoadingRows.js.map +1 -1
- package/dist/components/DataTable/edit-labels.cjs.map +1 -1
- package/dist/components/DataTable/edit-labels.js.map +1 -1
- package/dist/components/DataTable/use-dev-warnings.cjs.map +1 -1
- package/dist/components/DataTable/use-dev-warnings.js.map +1 -1
- package/dist/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.cjs.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.js.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.module.cjs.map +1 -1
- package/dist/components/DateRangePicker/DateRangePicker.module.js.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.cjs.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.js.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.module.cjs.map +1 -1
- package/dist/components/DescriptionList/DescriptionList.module.js.map +1 -1
- package/dist/components/Divider/Divider.cjs.map +1 -1
- package/dist/components/Divider/Divider.js.map +1 -1
- package/dist/components/Divider/Divider.module.cjs.map +1 -1
- package/dist/components/Divider/Divider.module.js.map +1 -1
- package/dist/components/Drawer/Drawer.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.js.map +1 -1
- package/dist/components/Drawer/Drawer.module.cjs.map +1 -1
- package/dist/components/Drawer/Drawer.module.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.cjs +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.js +2 -14
- package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.module.cjs.map +1 -1
- package/dist/components/DropdownMenu/DropdownMenu.module.js.map +1 -1
- package/dist/components/Dropzone/Dropzone.cjs.map +1 -1
- package/dist/components/Dropzone/Dropzone.js.map +1 -1
- package/dist/components/Dropzone/Dropzone.module.cjs.map +1 -1
- package/dist/components/Dropzone/Dropzone.module.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.cjs.map +1 -1
- package/dist/components/EmptyState/EmptyState.js.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.cjs.map +1 -1
- package/dist/components/EmptyState/EmptyState.module.js.map +1 -1
- package/dist/components/ErrorState/ErrorState.cjs.map +1 -1
- package/dist/components/ErrorState/ErrorState.js.map +1 -1
- package/dist/components/ErrorState/ErrorState.module.cjs.map +1 -1
- package/dist/components/ErrorState/ErrorState.module.js.map +1 -1
- package/dist/components/ErrorText/ErrorText.cjs.map +1 -1
- package/dist/components/ErrorText/ErrorText.js.map +1 -1
- package/dist/components/ErrorText/ErrorText.module.cjs.map +1 -1
- package/dist/components/ErrorText/ErrorText.module.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.cjs +1 -1
- package/dist/components/FileUpload/FileUpload.cjs.map +1 -1
- package/dist/components/FileUpload/FileUpload.js +7 -17
- package/dist/components/FileUpload/FileUpload.js.map +1 -1
- package/dist/components/FileUpload/FileUpload.module.cjs.map +1 -1
- package/dist/components/FileUpload/FileUpload.module.js.map +1 -1
- package/dist/components/FilterBar/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar/FilterBar.js.map +1 -1
- package/dist/components/FilterBar/FilterBar.module.cjs.map +1 -1
- package/dist/components/FilterBar/FilterBar.module.js.map +1 -1
- package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
- package/dist/components/FilterBar/filter-apply.js.map +1 -1
- package/dist/components/FilterBar/filter-model.cjs.map +1 -1
- package/dist/components/FilterBar/filter-model.js.map +1 -1
- package/dist/components/FilterBar/filter-query.cjs +1 -1
- package/dist/components/FilterBar/filter-query.cjs.map +1 -1
- package/dist/components/FilterBar/filter-query.js +2 -5
- package/dist/components/FilterBar/filter-query.js.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.cjs.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.js.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.module.cjs.map +1 -1
- package/dist/components/FilterPanel/FilterPanel.module.js.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.cjs.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.js.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.module.cjs.map +1 -1
- package/dist/components/FloatingActionButton/FloatingActionButton.module.js.map +1 -1
- package/dist/components/For/For.cjs.map +1 -1
- package/dist/components/For/For.js.map +1 -1
- package/dist/components/Form/Form.cjs.map +1 -1
- package/dist/components/Form/Form.js.map +1 -1
- package/dist/components/Form/Form.module.cjs.map +1 -1
- package/dist/components/Form/Form.module.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.cjs.map +1 -1
- package/dist/components/HoverCard/HoverCard.js.map +1 -1
- package/dist/components/HoverCard/HoverCard.module.cjs.map +1 -1
- package/dist/components/HoverCard/HoverCard.module.js.map +1 -1
- package/dist/components/Image/Image.cjs.map +1 -1
- package/dist/components/Image/Image.js.map +1 -1
- package/dist/components/Image/Image.module.cjs.map +1 -1
- package/dist/components/Image/Image.module.js.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.cjs +1 -1
- package/dist/components/ImageCropper/ImageCropper.cjs.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.js +4 -8
- package/dist/components/ImageCropper/ImageCropper.js.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.module.cjs.map +1 -1
- package/dist/components/ImageCropper/ImageCropper.module.js.map +1 -1
- package/dist/components/ImageCropper/crop-geometry.cjs.map +1 -1
- package/dist/components/ImageCropper/crop-geometry.js.map +1 -1
- package/dist/components/Input/Input.cjs.map +1 -1
- package/dist/components/Input/Input.js.map +1 -1
- package/dist/components/Input/Input.module.cjs.map +1 -1
- package/dist/components/Input/Input.module.js.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.cjs.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.js.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.module.cjs.map +1 -1
- package/dist/components/InstallBanner/InstallBanner.module.js.map +1 -1
- package/dist/components/InstallButton/InstallButton.cjs.map +1 -1
- package/dist/components/InstallButton/InstallButton.js.map +1 -1
- package/dist/components/InstallButton/InstallButton.module.cjs.map +1 -1
- package/dist/components/InstallButton/InstallButton.module.js.map +1 -1
- package/dist/components/InstallButton/install-hints.cjs.map +1 -1
- package/dist/components/InstallButton/install-hints.js.map +1 -1
- package/dist/components/Kanban/Kanban.cjs.map +1 -1
- package/dist/components/Kanban/Kanban.js.map +1 -1
- package/dist/components/Kanban/Kanban.module.cjs.map +1 -1
- package/dist/components/Kanban/Kanban.module.js.map +1 -1
- package/dist/components/Kbd/Kbd.cjs.map +1 -1
- package/dist/components/Kbd/Kbd.js.map +1 -1
- package/dist/components/Kbd/Kbd.module.cjs.map +1 -1
- package/dist/components/Kbd/Kbd.module.js.map +1 -1
- package/dist/components/Label/Label.cjs.map +1 -1
- package/dist/components/Label/Label.js.map +1 -1
- package/dist/components/Label/Label.module.cjs.map +1 -1
- package/dist/components/Label/Label.module.js.map +1 -1
- package/dist/components/Layout/Layout.cjs.map +1 -1
- package/dist/components/Layout/Layout.js.map +1 -1
- package/dist/components/Layout/Layout.module.cjs.map +1 -1
- package/dist/components/Layout/Layout.module.js.map +1 -1
- package/dist/components/Lightbox/Lightbox.cjs +1 -1
- package/dist/components/Lightbox/Lightbox.cjs.map +1 -1
- package/dist/components/Lightbox/Lightbox.js +1 -1
- package/dist/components/Lightbox/Lightbox.js.map +1 -1
- package/dist/components/Lightbox/Lightbox.module.cjs.map +1 -1
- package/dist/components/Lightbox/Lightbox.module.js.map +1 -1
- package/dist/components/ListTile/ListTile.cjs.map +1 -1
- package/dist/components/ListTile/ListTile.js.map +1 -1
- package/dist/components/ListTile/ListTile.module.cjs.map +1 -1
- package/dist/components/ListTile/ListTile.module.js.map +1 -1
- package/dist/components/Markdown/Markdown.cjs.map +1 -1
- package/dist/components/Markdown/Markdown.js.map +1 -1
- package/dist/components/Markdown/Markdown.module.cjs.map +1 -1
- package/dist/components/Markdown/Markdown.module.js.map +1 -1
- package/dist/components/Markdown/markdown-parse.cjs +6 -6
- package/dist/components/Markdown/markdown-parse.cjs.map +1 -1
- package/dist/components/Markdown/markdown-parse.js +94 -96
- package/dist/components/Markdown/markdown-parse.js.map +1 -1
- package/dist/components/Masonry/Masonry.cjs.map +1 -1
- package/dist/components/Masonry/Masonry.js.map +1 -1
- package/dist/components/Masonry/Masonry.module.cjs.map +1 -1
- package/dist/components/Masonry/Masonry.module.js.map +1 -1
- package/dist/components/Masonry/masonry-layout.cjs.map +1 -1
- package/dist/components/Masonry/masonry-layout.js.map +1 -1
- package/dist/components/Menubar/Menubar.cjs.map +1 -1
- package/dist/components/Menubar/Menubar.js.map +1 -1
- package/dist/components/Menubar/Menubar.module.cjs.map +1 -1
- package/dist/components/Menubar/Menubar.module.js.map +1 -1
- package/dist/components/Modal/Modal.cjs.map +1 -1
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Modal/Modal.module.cjs.map +1 -1
- package/dist/components/Modal/Modal.module.js.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.cjs.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.js.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.module.cjs.map +1 -1
- package/dist/components/ModalsManager/ModalsManager.module.js.map +1 -1
- package/dist/components/Money/Money.cjs.map +1 -1
- package/dist/components/Money/Money.js.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.js.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.module.cjs.map +1 -1
- package/dist/components/MultiSelect/MultiSelect.module.js.map +1 -1
- package/dist/components/NProgress/NProgress.cjs.map +1 -1
- package/dist/components/NProgress/NProgress.js.map +1 -1
- package/dist/components/NProgress/NProgress.module.cjs.map +1 -1
- package/dist/components/NProgress/NProgress.module.js.map +1 -1
- package/dist/components/Navbar/Navbar.cjs.map +1 -1
- package/dist/components/Navbar/Navbar.js.map +1 -1
- package/dist/components/Navbar/Navbar.module.cjs.map +1 -1
- package/dist/components/Navbar/Navbar.module.js.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.js.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.module.cjs.map +1 -1
- package/dist/components/NavigationMenu/NavigationMenu.module.js.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.cjs.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.js.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.module.cjs.map +1 -1
- package/dist/components/NavigationRail/NavigationRail.module.js.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.cjs.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.js.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.module.cjs.map +1 -1
- package/dist/components/NotificationCenter/NotificationCenter.module.js.map +1 -1
- package/dist/components/NotificationCenter/use-notification-inbox.cjs.map +1 -1
- package/dist/components/NotificationCenter/use-notification-inbox.js.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.cjs.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.js.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.module.cjs.map +1 -1
- package/dist/components/OfflineIndicator/OfflineIndicator.module.js.map +1 -1
- package/dist/components/Page/Page.cjs.map +1 -1
- package/dist/components/Page/Page.js.map +1 -1
- package/dist/components/Page/Page.module.cjs.map +1 -1
- package/dist/components/Page/Page.module.js.map +1 -1
- package/dist/components/Pagination/Pagination.cjs.map +1 -1
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Pagination/Pagination.module.cjs.map +1 -1
- package/dist/components/Pagination/Pagination.module.js.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.cjs.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.js.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.module.cjs.map +1 -1
- package/dist/components/PasswordInput/PasswordInput.module.js.map +1 -1
- package/dist/components/PinInput/PinInput.cjs.map +1 -1
- package/dist/components/PinInput/PinInput.js.map +1 -1
- package/dist/components/PinInput/PinInput.module.cjs.map +1 -1
- package/dist/components/PinInput/PinInput.module.js.map +1 -1
- package/dist/components/Popover/Popover.cjs.map +1 -1
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/Popover.module.cjs.map +1 -1
- package/dist/components/Popover/Popover.module.js.map +1 -1
- package/dist/components/Portal/Portal.cjs.map +1 -1
- package/dist/components/Portal/Portal.js.map +1 -1
- package/dist/components/Portal/anchor-position.cjs.map +1 -1
- package/dist/components/Portal/anchor-position.js.map +1 -1
- package/dist/components/Portal/escape-layer.cjs.map +1 -1
- package/dist/components/Portal/escape-layer.js.map +1 -1
- package/dist/components/Portal/portal-host.cjs.map +1 -1
- package/dist/components/Portal/portal-host.js.map +1 -1
- package/dist/components/Portal/tab-bridge.cjs +1 -1
- package/dist/components/Portal/tab-bridge.cjs.map +1 -1
- package/dist/components/Portal/tab-bridge.js +1 -5
- package/dist/components/Portal/tab-bridge.js.map +1 -1
- package/dist/components/Progress/Progress.cjs.map +1 -1
- package/dist/components/Progress/Progress.js.map +1 -1
- package/dist/components/Progress/Progress.module.cjs.map +1 -1
- package/dist/components/Progress/Progress.module.js.map +1 -1
- package/dist/components/QRCode/QRCode.cjs.map +1 -1
- package/dist/components/QRCode/QRCode.js.map +1 -1
- package/dist/components/QRCode/QRCode.module.cjs.map +1 -1
- package/dist/components/QRCode/QRCode.module.js.map +1 -1
- package/dist/components/QRCode/qr-encode.cjs +1 -1
- package/dist/components/QRCode/qr-encode.cjs.map +1 -1
- package/dist/components/QRCode/qr-encode.js +7 -13
- package/dist/components/QRCode/qr-encode.js.map +1 -1
- package/dist/components/QRCode/qr-tables.cjs.map +1 -1
- package/dist/components/QRCode/qr-tables.js.map +1 -1
- package/dist/components/Radio/Radio.cjs.map +1 -1
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/Radio/Radio.module.cjs.map +1 -1
- package/dist/components/Radio/Radio.module.js.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.cjs.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.js.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.module.cjs.map +1 -1
- package/dist/components/RangeSlider/RangeSlider.module.js.map +1 -1
- package/dist/components/RatingStars/RatingStars.cjs.map +1 -1
- package/dist/components/RatingStars/RatingStars.js.map +1 -1
- package/dist/components/RatingStars/RatingStars.module.cjs.map +1 -1
- package/dist/components/RatingStars/RatingStars.module.js.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.cjs +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.cjs.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.js +10 -18
- package/dist/components/RefreshIndicator/RefreshIndicator.js.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.module.cjs.map +1 -1
- package/dist/components/RefreshIndicator/RefreshIndicator.module.js.map +1 -1
- package/dist/components/RelativeTime/RelativeTime.cjs.map +1 -1
- package/dist/components/RelativeTime/RelativeTime.js.map +1 -1
- package/dist/components/Resizable/Resizable.cjs +1 -1
- package/dist/components/Resizable/Resizable.cjs.map +1 -1
- package/dist/components/Resizable/Resizable.js +1 -9
- package/dist/components/Resizable/Resizable.js.map +1 -1
- package/dist/components/Resizable/Resizable.module.cjs.map +1 -1
- package/dist/components/Resizable/Resizable.module.js.map +1 -1
- package/dist/components/Responsive/Responsive.cjs.map +1 -1
- package/dist/components/Responsive/Responsive.js.map +1 -1
- package/dist/components/Reveal/Reveal.cjs.map +1 -1
- package/dist/components/Reveal/Reveal.js.map +1 -1
- package/dist/components/Reveal/Reveal.module.cjs.map +1 -1
- package/dist/components/Reveal/Reveal.module.js.map +1 -1
- package/dist/components/Reveal/reveal-threshold.cjs.map +1 -1
- package/dist/components/Reveal/reveal-threshold.js.map +1 -1
- package/dist/components/SafeArea/SafeArea.cjs.map +1 -1
- package/dist/components/SafeArea/SafeArea.js.map +1 -1
- package/dist/components/SafeArea/SafeArea.module.cjs.map +1 -1
- package/dist/components/SafeArea/SafeArea.module.js.map +1 -1
- package/dist/components/Scheduler/Scheduler.cjs.map +1 -1
- package/dist/components/Scheduler/Scheduler.js.map +1 -1
- package/dist/components/Scheduler/Scheduler.module.cjs.map +1 -1
- package/dist/components/Scheduler/Scheduler.module.js.map +1 -1
- package/dist/components/Scheduler/scheduler-layout.cjs.map +1 -1
- package/dist/components/Scheduler/scheduler-layout.js.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.cjs.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.module.cjs.map +1 -1
- package/dist/components/ScrollArea/ScrollArea.module.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.cjs.map +1 -1
- package/dist/components/SearchBar/SearchBar.js.map +1 -1
- package/dist/components/SearchBar/SearchBar.module.cjs.map +1 -1
- package/dist/components/SearchBar/SearchBar.module.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.cjs.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.js.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.module.cjs.map +1 -1
- package/dist/components/SectionHeader/SectionHeader.module.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.cjs.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.js.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.module.cjs.map +1 -1
- package/dist/components/SegmentedControl/SegmentedControl.module.js.map +1 -1
- package/dist/components/Select/CaretIcon.cjs.map +1 -1
- package/dist/components/Select/CaretIcon.js.map +1 -1
- package/dist/components/Select/Select.cjs.map +1 -1
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Select/Select.module.cjs.map +1 -1
- package/dist/components/Select/Select.module.js.map +1 -1
- package/dist/components/Select/options.cjs.map +1 -1
- package/dist/components/Select/options.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.cjs +1 -1
- package/dist/components/Sidebar/Sidebar.cjs.map +1 -1
- package/dist/components/Sidebar/Sidebar.js +13 -23
- package/dist/components/Sidebar/Sidebar.js.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.cjs.map +1 -1
- package/dist/components/Sidebar/Sidebar.module.js.map +1 -1
- package/dist/components/Sidebar/SidebarEntry.cjs.map +1 -1
- package/dist/components/Sidebar/SidebarEntry.js.map +1 -1
- package/dist/components/Sidebar/active-nav-key.cjs.map +1 -1
- package/dist/components/Sidebar/active-nav-key.js.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.cjs +1 -1
- package/dist/components/SignaturePad/SignaturePad.cjs.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.js +1 -5
- package/dist/components/SignaturePad/SignaturePad.js.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.module.cjs.map +1 -1
- package/dist/components/SignaturePad/SignaturePad.module.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.cjs.map +1 -1
- package/dist/components/Skeleton/Skeleton.module.js.map +1 -1
- package/dist/components/Slider/Slider.cjs.map +1 -1
- package/dist/components/Slider/Slider.js.map +1 -1
- package/dist/components/Slider/Slider.module.cjs.map +1 -1
- package/dist/components/Slider/Slider.module.js.map +1 -1
- package/dist/components/Spacer/Spacer.cjs.map +1 -1
- package/dist/components/Spacer/Spacer.js.map +1 -1
- package/dist/components/Spacer/Spacer.module.cjs.map +1 -1
- package/dist/components/Spacer/Spacer.module.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.cjs.map +1 -1
- package/dist/components/Sparkline/Sparkline.js.map +1 -1
- package/dist/components/Sparkline/Sparkline.module.cjs.map +1 -1
- package/dist/components/Sparkline/Sparkline.module.js.map +1 -1
- package/dist/components/Sparkline/sparkline-geometry.cjs.map +1 -1
- package/dist/components/Sparkline/sparkline-geometry.js.map +1 -1
- package/dist/components/Spinner/Spinner.cjs.map +1 -1
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/Spinner/Spinner.module.cjs.map +1 -1
- package/dist/components/Spinner/Spinner.module.js.map +1 -1
- package/dist/components/Stat/Stat.cjs.map +1 -1
- package/dist/components/Stat/Stat.js.map +1 -1
- package/dist/components/Stat/Stat.module.cjs.map +1 -1
- package/dist/components/Stat/Stat.module.js.map +1 -1
- package/dist/components/Stepper/Stepper.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.js.map +1 -1
- package/dist/components/Stepper/Stepper.module.cjs.map +1 -1
- package/dist/components/Stepper/Stepper.module.js.map +1 -1
- package/dist/components/StepperInput/StepperInput.cjs.map +1 -1
- package/dist/components/StepperInput/StepperInput.js.map +1 -1
- package/dist/components/StepperInput/StepperInput.module.cjs.map +1 -1
- package/dist/components/StepperInput/StepperInput.module.js.map +1 -1
- package/dist/components/Switch/Switch.cjs.map +1 -1
- package/dist/components/Switch/Switch.js.map +1 -1
- package/dist/components/Switch/Switch.module.cjs.map +1 -1
- package/dist/components/Switch/Switch.module.js.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.cjs.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.js.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.cjs.map +1 -1
- package/dist/components/SyncStatusBadge/SyncStatusBadge.module.js.map +1 -1
- package/dist/components/Table/Table.cjs.map +1 -1
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Table/Table.module.cjs.map +1 -1
- package/dist/components/Table/Table.module.js.map +1 -1
- package/dist/components/Tabs/Tabs.cjs.map +1 -1
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tabs/Tabs.module.cjs.map +1 -1
- package/dist/components/Tabs/Tabs.module.js.map +1 -1
- package/dist/components/Tag/Tag.cjs.map +1 -1
- package/dist/components/Tag/Tag.js.map +1 -1
- package/dist/components/Tag/Tag.module.cjs.map +1 -1
- package/dist/components/Tag/Tag.module.js.map +1 -1
- package/dist/components/Textarea/Textarea.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.js.map +1 -1
- package/dist/components/Textarea/Textarea.module.cjs.map +1 -1
- package/dist/components/Textarea/Textarea.module.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.cjs.map +1 -1
- package/dist/components/TimePicker/TimePicker.js.map +1 -1
- package/dist/components/TimePicker/TimePicker.module.cjs.map +1 -1
- package/dist/components/TimePicker/TimePicker.module.js.map +1 -1
- package/dist/components/Timeline/Timeline.cjs.map +1 -1
- package/dist/components/Timeline/Timeline.js.map +1 -1
- package/dist/components/Timeline/Timeline.module.cjs.map +1 -1
- package/dist/components/Timeline/Timeline.module.js.map +1 -1
- package/dist/components/Toast/Toast.module.cjs.map +1 -1
- package/dist/components/Toast/Toast.module.js.map +1 -1
- package/dist/components/Toast/ToastProvider.cjs.map +1 -1
- package/dist/components/Toast/ToastProvider.js.map +1 -1
- package/dist/components/Toggle/Toggle.cjs.map +1 -1
- package/dist/components/Toggle/Toggle.js.map +1 -1
- package/dist/components/Toggle/Toggle.module.cjs.map +1 -1
- package/dist/components/Toggle/Toggle.module.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.cjs.map +1 -1
- package/dist/components/ToggleGroup/ToggleGroup.module.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.cjs.map +1 -1
- package/dist/components/Tooltip/Tooltip.module.js.map +1 -1
- package/dist/components/Tour/Tour.cjs +1 -1
- package/dist/components/Tour/Tour.cjs.map +1 -1
- package/dist/components/Tour/Tour.js +1 -5
- package/dist/components/Tour/Tour.js.map +1 -1
- package/dist/components/Tour/Tour.module.cjs.map +1 -1
- package/dist/components/Tour/Tour.module.js.map +1 -1
- package/dist/components/Tour/tour-position.cjs.map +1 -1
- package/dist/components/Tour/tour-position.js.map +1 -1
- package/dist/components/Transfer/Transfer.cjs.map +1 -1
- package/dist/components/Transfer/Transfer.js.map +1 -1
- package/dist/components/Transfer/Transfer.module.cjs.map +1 -1
- package/dist/components/Transfer/Transfer.module.js.map +1 -1
- package/dist/components/Transfer/transfer-state.cjs.map +1 -1
- package/dist/components/Transfer/transfer-state.js.map +1 -1
- package/dist/components/TreeView/TreeView.cjs.map +1 -1
- package/dist/components/TreeView/TreeView.js.map +1 -1
- package/dist/components/TreeView/TreeView.module.cjs.map +1 -1
- package/dist/components/TreeView/TreeView.module.js.map +1 -1
- package/dist/components/TruncateText/TruncateText.cjs.map +1 -1
- package/dist/components/TruncateText/TruncateText.js.map +1 -1
- package/dist/components/TruncateText/TruncateText.module.cjs.map +1 -1
- package/dist/components/TruncateText/TruncateText.module.js.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.cjs.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.js.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.module.cjs.map +1 -1
- package/dist/components/UpdatePrompt/UpdatePrompt.module.js.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.cjs +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.cjs.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.js +1 -7
- package/dist/components/VideoPlayer/VideoPlayer.js.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.module.cjs.map +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.module.js.map +1 -1
- package/dist/components/VideoPlayer/playback-rates.cjs.map +1 -1
- package/dist/components/VideoPlayer/playback-rates.js.map +1 -1
- package/dist/components/VirtualList/VirtualList.cjs.map +1 -1
- package/dist/components/VirtualList/VirtualList.js.map +1 -1
- package/dist/components/VirtualList/VirtualList.module.cjs.map +1 -1
- package/dist/components/VirtualList/VirtualList.module.js.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.cjs.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.js.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.module.cjs.map +1 -1
- package/dist/components/VirtualTable/VirtualTable.module.js.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.cjs.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.js.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.cjs.map +1 -1
- package/dist/components/VisuallyHidden/VisuallyHidden.module.js.map +1 -1
- package/dist/components/Wizard/Wizard.cjs +1 -1
- package/dist/components/Wizard/Wizard.cjs.map +1 -1
- package/dist/components/Wizard/Wizard.js +4 -11
- package/dist/components/Wizard/Wizard.js.map +1 -1
- package/dist/components/Wizard/Wizard.module.cjs.map +1 -1
- package/dist/components/Wizard/Wizard.module.js.map +1 -1
- package/dist/data/create-data-provider.cjs.map +1 -1
- package/dist/data/create-data-provider.js.map +1 -1
- package/dist/data/data-provider-context.cjs.map +1 -1
- package/dist/data/data-provider-context.js.map +1 -1
- package/dist/data/use-resource.cjs.map +1 -1
- package/dist/data/use-resource.js.map +1 -1
- package/dist/editor/RichTextEditor.cjs.map +1 -1
- package/dist/editor/RichTextEditor.js.map +1 -1
- package/dist/editor/RichTextEditor.module.cjs.map +1 -1
- package/dist/editor/RichTextEditor.module.js.map +1 -1
- package/dist/editor.js +1 -2
- package/dist/error-boundary/ErrorBoundary.cjs.map +1 -1
- package/dist/error-boundary/ErrorBoundary.js.map +1 -1
- package/dist/error-boundary/use-error-handler.cjs.map +1 -1
- package/dist/error-boundary/use-error-handler.js.map +1 -1
- package/dist/feature-flags/FeatureFlagsProvider.cjs.map +1 -1
- package/dist/feature-flags/FeatureFlagsProvider.js.map +1 -1
- package/dist/feature-flags/growthbook-adapter.cjs.map +1 -1
- package/dist/feature-flags/growthbook-adapter.js.map +1 -1
- package/dist/feature-flags/in-memory-adapter.cjs.map +1 -1
- package/dist/feature-flags/in-memory-adapter.js.map +1 -1
- package/dist/feature-flags/launchdarkly-adapter.cjs.map +1 -1
- package/dist/feature-flags/launchdarkly-adapter.js.map +1 -1
- package/dist/forms/FormField.cjs.map +1 -1
- package/dist/forms/FormField.js.map +1 -1
- package/dist/forms/br-validators.cjs.map +1 -1
- package/dist/forms/br-validators.js.map +1 -1
- package/dist/forms/masked-inputs.cjs.map +1 -1
- package/dist/forms/masked-inputs.js.map +1 -1
- package/dist/forms/use-viacep.cjs.map +1 -1
- package/dist/forms/use-viacep.js.map +1 -1
- package/dist/forms/use-zod-form.cjs.map +1 -1
- package/dist/forms/use-zod-form.js.map +1 -1
- package/dist/forms/validate-form.cjs.map +1 -1
- package/dist/forms/validate-form.js.map +1 -1
- package/dist/forms/zod-resolver.cjs.map +1 -1
- package/dist/forms/zod-resolver.js.map +1 -1
- package/dist/geo/TrajectoryMap.cjs.map +1 -1
- package/dist/geo/TrajectoryMap.js.map +1 -1
- package/dist/geo/TrajectoryMap.module.cjs.map +1 -1
- package/dist/geo/TrajectoryMap.module.js.map +1 -1
- package/dist/geo/bounds.cjs.map +1 -1
- package/dist/geo/bounds.js.map +1 -1
- package/dist/geo/create-position-tracker.cjs +1 -1
- package/dist/geo/create-position-tracker.cjs.map +1 -1
- package/dist/geo/create-position-tracker.js +1 -7
- package/dist/geo/create-position-tracker.js.map +1 -1
- package/dist/geo/distance.cjs.map +1 -1
- package/dist/geo/distance.js.map +1 -1
- package/dist/geo/estimate.cjs.map +1 -1
- package/dist/geo/estimate.js.map +1 -1
- package/dist/geo/leaflet-map.cjs.map +1 -1
- package/dist/geo/leaflet-map.js.map +1 -1
- package/dist/geo/projection.cjs.map +1 -1
- package/dist/geo/projection.js.map +1 -1
- package/dist/geo/routing.cjs.map +1 -1
- package/dist/geo/routing.js.map +1 -1
- package/dist/geo/types.cjs.map +1 -1
- package/dist/geo/types.js.map +1 -1
- package/dist/geo/use-position-tracker.cjs.map +1 -1
- package/dist/geo/use-position-tracker.js.map +1 -1
- package/dist/hooks/pwa-env.cjs.map +1 -1
- package/dist/hooks/pwa-env.js.map +1 -1
- package/dist/hooks/tab-sequence.cjs.map +1 -1
- package/dist/hooks/tab-sequence.js.map +1 -1
- package/dist/hooks/use-announce.cjs +1 -1
- package/dist/hooks/use-announce.cjs.map +1 -1
- package/dist/hooks/use-announce.js +2 -2
- package/dist/hooks/use-announce.js.map +1 -1
- package/dist/hooks/use-async.cjs.map +1 -1
- package/dist/hooks/use-async.js.map +1 -1
- package/dist/hooks/use-before-install-prompt.cjs.map +1 -1
- package/dist/hooks/use-before-install-prompt.js.map +1 -1
- package/dist/hooks/use-breakpoint.cjs.map +1 -1
- package/dist/hooks/use-breakpoint.js.map +1 -1
- package/dist/hooks/use-click-outside.cjs.map +1 -1
- package/dist/hooks/use-click-outside.js.map +1 -1
- package/dist/hooks/use-client-filter.cjs.map +1 -1
- package/dist/hooks/use-client-filter.js.map +1 -1
- package/dist/hooks/use-clipboard.cjs.map +1 -1
- package/dist/hooks/use-clipboard.js.map +1 -1
- package/dist/hooks/use-countdown.cjs.map +1 -1
- package/dist/hooks/use-countdown.js.map +1 -1
- package/dist/hooks/use-counter.cjs.map +1 -1
- package/dist/hooks/use-counter.js.map +1 -1
- package/dist/hooks/use-debounce.cjs.map +1 -1
- package/dist/hooks/use-debounce.js.map +1 -1
- package/dist/hooks/use-deep-memo.cjs.map +1 -1
- package/dist/hooks/use-deep-memo.js.map +1 -1
- package/dist/hooks/use-disclosure.cjs.map +1 -1
- package/dist/hooks/use-disclosure.js.map +1 -1
- package/dist/hooks/use-document-title.cjs.map +1 -1
- package/dist/hooks/use-document-title.js.map +1 -1
- package/dist/hooks/use-document-visibility.cjs.map +1 -1
- package/dist/hooks/use-document-visibility.js.map +1 -1
- package/dist/hooks/use-draft-filters.cjs.map +1 -1
- package/dist/hooks/use-draft-filters.js.map +1 -1
- package/dist/hooks/use-event-listener.cjs.map +1 -1
- package/dist/hooks/use-event-listener.js.map +1 -1
- package/dist/hooks/use-favicon.cjs.map +1 -1
- package/dist/hooks/use-favicon.js.map +1 -1
- package/dist/hooks/use-focus-trap.cjs.map +1 -1
- package/dist/hooks/use-focus-trap.js.map +1 -1
- package/dist/hooks/use-fullscreen-element.cjs.map +1 -1
- package/dist/hooks/use-fullscreen-element.js.map +1 -1
- package/dist/hooks/use-fullscreen.cjs +1 -1
- package/dist/hooks/use-fullscreen.cjs.map +1 -1
- package/dist/hooks/use-fullscreen.js +7 -23
- package/dist/hooks/use-fullscreen.js.map +1 -1
- package/dist/hooks/use-geolocation.cjs.map +1 -1
- package/dist/hooks/use-geolocation.js.map +1 -1
- package/dist/hooks/use-hover.cjs.map +1 -1
- package/dist/hooks/use-hover.js.map +1 -1
- package/dist/hooks/use-idle.cjs.map +1 -1
- package/dist/hooks/use-idle.js.map +1 -1
- package/dist/hooks/use-install-prompt.cjs +1 -1
- package/dist/hooks/use-install-prompt.cjs.map +1 -1
- package/dist/hooks/use-install-prompt.js +1 -1
- package/dist/hooks/use-install-prompt.js.map +1 -1
- package/dist/hooks/use-intersection-observer.cjs.map +1 -1
- package/dist/hooks/use-intersection-observer.js.map +1 -1
- package/dist/hooks/use-interval.cjs.map +1 -1
- package/dist/hooks/use-interval.js.map +1 -1
- package/dist/hooks/use-is-first-render.cjs.map +1 -1
- package/dist/hooks/use-is-first-render.js.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.cjs.map +1 -1
- package/dist/hooks/use-keyboard-shortcut.js.map +1 -1
- package/dist/hooks/use-latest-ref.cjs.map +1 -1
- package/dist/hooks/use-latest-ref.js.map +1 -1
- package/dist/hooks/use-list-state.cjs.map +1 -1
- package/dist/hooks/use-list-state.js.map +1 -1
- package/dist/hooks/use-local-storage.cjs +1 -1
- package/dist/hooks/use-local-storage.cjs.map +1 -1
- package/dist/hooks/use-local-storage.js +2 -5
- package/dist/hooks/use-local-storage.js.map +1 -1
- package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
- package/dist/hooks/use-long-press-handlers.js.map +1 -1
- package/dist/hooks/use-long-press.cjs.map +1 -1
- package/dist/hooks/use-long-press.js.map +1 -1
- package/dist/hooks/use-map.cjs.map +1 -1
- package/dist/hooks/use-map.js.map +1 -1
- package/dist/hooks/use-media-devices.cjs.map +1 -1
- package/dist/hooks/use-media-devices.js.map +1 -1
- package/dist/hooks/use-media-permission.cjs +1 -1
- package/dist/hooks/use-media-permission.cjs.map +1 -1
- package/dist/hooks/use-media-permission.js +2 -5
- package/dist/hooks/use-media-permission.js.map +1 -1
- package/dist/hooks/use-media-query.cjs.map +1 -1
- package/dist/hooks/use-media-query.js.map +1 -1
- package/dist/hooks/use-object-url.cjs.map +1 -1
- package/dist/hooks/use-object-url.js.map +1 -1
- package/dist/hooks/use-online.cjs.map +1 -1
- package/dist/hooks/use-online.js.map +1 -1
- package/dist/hooks/use-pagination.cjs.map +1 -1
- package/dist/hooks/use-pagination.js.map +1 -1
- package/dist/hooks/use-previous.cjs.map +1 -1
- package/dist/hooks/use-previous.js.map +1 -1
- package/dist/hooks/use-push-to-talk.cjs.map +1 -1
- package/dist/hooks/use-push-to-talk.js.map +1 -1
- package/dist/hooks/use-queue.cjs.map +1 -1
- package/dist/hooks/use-queue.js.map +1 -1
- package/dist/hooks/use-resize-observer.cjs.map +1 -1
- package/dist/hooks/use-resize-observer.js.map +1 -1
- package/dist/hooks/use-scroll-lock.cjs.map +1 -1
- package/dist/hooks/use-scroll-lock.js.map +1 -1
- package/dist/hooks/use-scroll-overflow.cjs.map +1 -1
- package/dist/hooks/use-scroll-overflow.js.map +1 -1
- package/dist/hooks/use-service-worker-update.cjs.map +1 -1
- package/dist/hooks/use-service-worker-update.js.map +1 -1
- package/dist/hooks/use-set.cjs.map +1 -1
- package/dist/hooks/use-set.js.map +1 -1
- package/dist/hooks/use-sortable.cjs.map +1 -1
- package/dist/hooks/use-sortable.js.map +1 -1
- package/dist/hooks/use-stable-callback.cjs.map +1 -1
- package/dist/hooks/use-stable-callback.js.map +1 -1
- package/dist/hooks/use-storage-estimate.cjs.map +1 -1
- package/dist/hooks/use-storage-estimate.js.map +1 -1
- package/dist/hooks/use-throttle.cjs.map +1 -1
- package/dist/hooks/use-throttle.js.map +1 -1
- package/dist/hooks/use-timeout.cjs.map +1 -1
- package/dist/hooks/use-timeout.js.map +1 -1
- package/dist/hooks/use-toggle.cjs.map +1 -1
- package/dist/hooks/use-toggle.js.map +1 -1
- package/dist/hooks/use-typewriter.cjs.map +1 -1
- package/dist/hooks/use-typewriter.js.map +1 -1
- package/dist/hooks/use-window-size.cjs.map +1 -1
- package/dist/hooks/use-window-size.js.map +1 -1
- package/dist/http/api-client.cjs.map +1 -1
- package/dist/http/api-client.js.map +1 -1
- package/dist/http/build-url.cjs.map +1 -1
- package/dist/http/build-url.js.map +1 -1
- package/dist/http/credential-scope.cjs.map +1 -1
- package/dist/http/credential-scope.js.map +1 -1
- package/dist/http/csrf.cjs.map +1 -1
- package/dist/http/csrf.js.map +1 -1
- package/dist/http/decode-response.cjs.map +1 -1
- package/dist/http/decode-response.js.map +1 -1
- package/dist/http/describe-api-error.cjs.map +1 -1
- package/dist/http/describe-api-error.js.map +1 -1
- package/dist/http/errors.cjs.map +1 -1
- package/dist/http/errors.js.map +1 -1
- package/dist/http/idempotency.cjs.map +1 -1
- package/dist/http/idempotency.js.map +1 -1
- package/dist/http/parse-response.cjs.map +1 -1
- package/dist/http/parse-response.js.map +1 -1
- package/dist/http/resumable-upload.cjs +1 -1
- package/dist/http/resumable-upload.cjs.map +1 -1
- package/dist/http/resumable-upload.js +141 -105
- package/dist/http/resumable-upload.js.map +1 -1
- package/dist/http/retry.cjs +1 -1
- package/dist/http/retry.cjs.map +1 -1
- package/dist/http/retry.js +5 -6
- package/dist/http/retry.js.map +1 -1
- package/dist/http/timeout.cjs.map +1 -1
- package/dist/http/timeout.js.map +1 -1
- package/dist/http/upload-with-progress.cjs +1 -1
- package/dist/http/upload-with-progress.cjs.map +1 -1
- package/dist/http/upload-with-progress.js +2 -7
- package/dist/http/upload-with-progress.js.map +1 -1
- package/dist/http/use-describe-api-error.cjs.map +1 -1
- package/dist/http/use-describe-api-error.js.map +1 -1
- package/dist/http/use-poll.cjs +1 -1
- package/dist/http/use-poll.cjs.map +1 -1
- package/dist/http/use-poll.js +2 -5
- package/dist/http/use-poll.js.map +1 -1
- package/dist/i18n/I18nProvider.cjs.map +1 -1
- package/dist/i18n/I18nProvider.js.map +1 -1
- package/dist/i18n/create-i18n.cjs.map +1 -1
- package/dist/i18n/create-i18n.js.map +1 -1
- package/dist/icons/Icon.cjs.map +1 -1
- package/dist/icons/Icon.js.map +1 -1
- package/dist/icons/IconPicker.cjs.map +1 -1
- package/dist/icons/IconPicker.js.map +1 -1
- package/dist/icons/IconPicker.module.cjs.map +1 -1
- package/dist/icons/IconPicker.module.js.map +1 -1
- package/dist/icons/IconProvider.cjs.map +1 -1
- package/dist/icons/IconProvider.js.map +1 -1
- package/dist/icons/alias.cjs.map +1 -1
- package/dist/icons/alias.js.map +1 -1
- package/dist/icons/generated/aliases.cjs.map +1 -1
- package/dist/icons/generated/aliases.js.map +1 -1
- package/dist/icons/generated/icon-names.cjs.map +1 -1
- package/dist/icons/generated/icon-names.js.map +1 -1
- package/dist/icons/generated/loaders.cjs.map +1 -1
- package/dist/icons/generated/loaders.js.map +1 -1
- package/dist/icons/generated/shard-00.cjs.map +1 -1
- package/dist/icons/generated/shard-00.js.map +1 -1
- package/dist/icons/generated/shard-01.cjs.map +1 -1
- package/dist/icons/generated/shard-01.js.map +1 -1
- package/dist/icons/generated/shard-02.cjs.map +1 -1
- package/dist/icons/generated/shard-02.js.map +1 -1
- package/dist/icons/generated/shard-03.cjs.map +1 -1
- package/dist/icons/generated/shard-03.js.map +1 -1
- package/dist/icons/generated/shard-04.cjs.map +1 -1
- package/dist/icons/generated/shard-04.js.map +1 -1
- package/dist/icons/generated/shard-05.cjs.map +1 -1
- package/dist/icons/generated/shard-05.js.map +1 -1
- package/dist/icons/generated/shard-06.cjs.map +1 -1
- package/dist/icons/generated/shard-06.js.map +1 -1
- package/dist/icons/generated/shard-07.cjs.map +1 -1
- package/dist/icons/generated/shard-07.js.map +1 -1
- package/dist/icons/generated/shard-08.cjs.map +1 -1
- package/dist/icons/generated/shard-08.js.map +1 -1
- package/dist/icons/generated/shard-09.cjs.map +1 -1
- package/dist/icons/generated/shard-09.js.map +1 -1
- package/dist/icons/generated/shard-10.cjs.map +1 -1
- package/dist/icons/generated/shard-10.js.map +1 -1
- package/dist/icons/generated/shard-11.cjs.map +1 -1
- package/dist/icons/generated/shard-11.js.map +1 -1
- package/dist/icons/generated/shard-12.cjs.map +1 -1
- package/dist/icons/generated/shard-12.js.map +1 -1
- package/dist/icons/generated/shard-13.cjs.map +1 -1
- package/dist/icons/generated/shard-13.js.map +1 -1
- package/dist/icons/generated/shard-14.cjs.map +1 -1
- package/dist/icons/generated/shard-14.js.map +1 -1
- package/dist/icons/generated/shard-15.cjs.map +1 -1
- package/dist/icons/generated/shard-15.js.map +1 -1
- package/dist/icons/generated/shard-16.cjs.map +1 -1
- package/dist/icons/generated/shard-16.js.map +1 -1
- package/dist/icons/generated/shard-17.cjs.map +1 -1
- package/dist/icons/generated/shard-17.js.map +1 -1
- package/dist/icons/generated/shard-18.cjs.map +1 -1
- package/dist/icons/generated/shard-18.js.map +1 -1
- package/dist/icons/generated/shard-19.cjs.map +1 -1
- package/dist/icons/generated/shard-19.js.map +1 -1
- package/dist/icons/generated/shard-20.cjs.map +1 -1
- package/dist/icons/generated/shard-20.js.map +1 -1
- package/dist/icons/generated/shard-21.cjs.map +1 -1
- package/dist/icons/generated/shard-21.js.map +1 -1
- package/dist/icons/generated/shard-22.cjs.map +1 -1
- package/dist/icons/generated/shard-22.js.map +1 -1
- package/dist/icons/generated/shard-23.cjs.map +1 -1
- package/dist/icons/generated/shard-23.js.map +1 -1
- package/dist/icons/generated/shard-24.cjs.map +1 -1
- package/dist/icons/generated/shard-24.js.map +1 -1
- package/dist/icons/generated/shard-25.cjs.map +1 -1
- package/dist/icons/generated/shard-25.js.map +1 -1
- package/dist/icons/generated/shard-26.cjs.map +1 -1
- package/dist/icons/generated/shard-26.js.map +1 -1
- package/dist/icons/generated/shard-27.cjs.map +1 -1
- package/dist/icons/generated/shard-27.js.map +1 -1
- package/dist/icons/generated/shard-28.cjs.map +1 -1
- package/dist/icons/generated/shard-28.js.map +1 -1
- package/dist/icons/generated/shard-29.cjs.map +1 -1
- package/dist/icons/generated/shard-29.js.map +1 -1
- package/dist/icons/generated/shard-30.cjs.map +1 -1
- package/dist/icons/generated/shard-30.js.map +1 -1
- package/dist/icons/generated/shard-31.cjs.map +1 -1
- package/dist/icons/generated/shard-31.js.map +1 -1
- package/dist/icons/generated/shard-32.cjs.map +1 -1
- package/dist/icons/generated/shard-32.js.map +1 -1
- package/dist/icons/generated/shard-33.cjs.map +1 -1
- package/dist/icons/generated/shard-33.js.map +1 -1
- package/dist/icons/generated/shard-34.cjs.map +1 -1
- package/dist/icons/generated/shard-34.js.map +1 -1
- package/dist/icons/generated/shard-35.cjs.map +1 -1
- package/dist/icons/generated/shard-35.js.map +1 -1
- package/dist/icons/generated/shard-36.cjs.map +1 -1
- package/dist/icons/generated/shard-36.js.map +1 -1
- package/dist/icons/generated/shard-37.cjs.map +1 -1
- package/dist/icons/generated/shard-37.js.map +1 -1
- package/dist/icons/generated/shard-38.cjs.map +1 -1
- package/dist/icons/generated/shard-38.js.map +1 -1
- package/dist/icons/generated/shard-39.cjs.map +1 -1
- package/dist/icons/generated/shard-39.js.map +1 -1
- package/dist/icons/generated/shard-40.cjs.map +1 -1
- package/dist/icons/generated/shard-40.js.map +1 -1
- package/dist/icons/generated/shard-41.cjs.map +1 -1
- package/dist/icons/generated/shard-41.js.map +1 -1
- package/dist/icons/generated/shard-42.cjs.map +1 -1
- package/dist/icons/generated/shard-42.js.map +1 -1
- package/dist/icons/generated/shard-43.cjs.map +1 -1
- package/dist/icons/generated/shard-43.js.map +1 -1
- package/dist/icons/generated/shard-44.cjs.map +1 -1
- package/dist/icons/generated/shard-44.js.map +1 -1
- package/dist/icons/generated/shard-45.cjs.map +1 -1
- package/dist/icons/generated/shard-45.js.map +1 -1
- package/dist/icons/icon-context.cjs.map +1 -1
- package/dist/icons/icon-context.js.map +1 -1
- package/dist/icons/is-icon-name.cjs.map +1 -1
- package/dist/icons/is-icon-name.js.map +1 -1
- package/dist/icons/material-symbols.cjs.map +1 -1
- package/dist/icons/material-symbols.js.map +1 -1
- package/dist/icons/normalize-icon-name.cjs.map +1 -1
- package/dist/icons/normalize-icon-name.js.map +1 -1
- package/dist/icons/shard-cache.cjs +1 -1
- package/dist/icons/shard-cache.cjs.map +1 -1
- package/dist/icons/shard-cache.js +2 -5
- package/dist/icons/shard-cache.js.map +1 -1
- package/dist/icons/use-icon.cjs.map +1 -1
- package/dist/icons/use-icon.js.map +1 -1
- package/dist/icons/validate-icon-name.cjs.map +1 -1
- package/dist/icons/validate-icon-name.js.map +1 -1
- package/dist/icons-virtual.cjs.map +1 -1
- package/dist/icons-virtual.js.map +1 -1
- package/dist/imaging/canvas.cjs.map +1 -1
- package/dist/imaging/canvas.js.map +1 -1
- package/dist/imaging/compress.cjs.map +1 -1
- package/dist/imaging/compress.js.map +1 -1
- package/dist/imaging/decode.cjs.map +1 -1
- package/dist/imaging/decode.js.map +1 -1
- package/dist/imaging/encode.cjs.map +1 -1
- package/dist/imaging/encode.js.map +1 -1
- package/dist/imaging/exceptions.cjs.map +1 -1
- package/dist/imaging/exceptions.js.map +1 -1
- package/dist/imaging/frame.cjs.map +1 -1
- package/dist/imaging/frame.js.map +1 -1
- package/dist/imaging/thumbnails.cjs.map +1 -1
- package/dist/imaging/thumbnails.js.map +1 -1
- package/dist/imaging/transform.cjs.map +1 -1
- package/dist/imaging/transform.js.map +1 -1
- package/dist/imaging/use-image-processing.cjs.map +1 -1
- package/dist/imaging/use-image-processing.js.map +1 -1
- package/dist/logger/logger.cjs.map +1 -1
- package/dist/logger/logger.js.map +1 -1
- package/dist/neural.cjs.map +1 -1
- package/dist/neural.js.map +1 -1
- package/dist/oauth/GoogleSignIn.cjs +1 -1
- package/dist/oauth/GoogleSignIn.cjs.map +1 -1
- package/dist/oauth/GoogleSignIn.js +6 -9
- package/dist/oauth/GoogleSignIn.js.map +1 -1
- package/dist/oauth/callback.cjs.map +1 -1
- package/dist/oauth/callback.js.map +1 -1
- package/dist/oauth/use-oauth-callback.cjs.map +1 -1
- package/dist/oauth/use-oauth-callback.js.map +1 -1
- package/dist/offline/conflict.cjs.map +1 -1
- package/dist/offline/conflict.js.map +1 -1
- package/dist/offline/create-offline-database.cjs.map +1 -1
- package/dist/offline/create-offline-database.js.map +1 -1
- package/dist/offline/create-offline-store.cjs +1 -1
- package/dist/offline/create-offline-store.cjs.map +1 -1
- package/dist/offline/create-offline-store.js +1 -5
- package/dist/offline/create-offline-store.js.map +1 -1
- package/dist/offline/create-offline-sync.cjs +1 -1
- package/dist/offline/create-offline-sync.cjs.map +1 -1
- package/dist/offline/create-offline-sync.js +9 -14
- package/dist/offline/create-offline-sync.js.map +1 -1
- package/dist/offline/use-offline-sync.cjs.map +1 -1
- package/dist/offline/use-offline-sync.js.map +1 -1
- package/dist/perf/cache-size.cjs.map +1 -1
- package/dist/perf/cache-size.js.map +1 -1
- package/dist/perf/device.cjs.map +1 -1
- package/dist/perf/device.js.map +1 -1
- package/dist/perf/format.cjs.map +1 -1
- package/dist/perf/format.js.map +1 -1
- package/dist/perf/profiler.cjs.map +1 -1
- package/dist/perf/profiler.js.map +1 -1
- package/dist/push/use-push-subscription.cjs.map +1 -1
- package/dist/push/use-push-subscription.js.map +1 -1
- package/dist/push/utils.cjs.map +1 -1
- package/dist/push/utils.js.map +1 -1
- package/dist/push/web-push-client.cjs.map +1 -1
- package/dist/push/web-push-client.js.map +1 -1
- package/dist/query/QueryProvider.cjs.map +1 -1
- package/dist/query/QueryProvider.js.map +1 -1
- package/dist/query/constants.cjs.map +1 -1
- package/dist/query/constants.js.map +1 -1
- package/dist/query/create-query-keys.cjs.map +1 -1
- package/dist/query/create-query-keys.js.map +1 -1
- package/dist/query/foreign-client-warning.cjs.map +1 -1
- package/dist/query/foreign-client-warning.js.map +1 -1
- package/dist/query/offline-persistence.cjs +1 -1
- package/dist/query/offline-persistence.cjs.map +1 -1
- package/dist/query/offline-persistence.js +2 -10
- package/dist/query/offline-persistence.js.map +1 -1
- package/dist/query/optimistic.cjs.map +1 -1
- package/dist/query/optimistic.js.map +1 -1
- package/dist/query/pagination.cjs.map +1 -1
- package/dist/query/pagination.js.map +1 -1
- package/dist/query/retry-policy.cjs.map +1 -1
- package/dist/query/retry-policy.js.map +1 -1
- package/dist/query/use-cursor-query.cjs.map +1 -1
- package/dist/query/use-cursor-query.js.map +1 -1
- package/dist/query/use-offline-mutation.cjs.map +1 -1
- package/dist/query/use-offline-mutation.js.map +1 -1
- package/dist/query/use-paginated-query.cjs.map +1 -1
- package/dist/query/use-paginated-query.js.map +1 -1
- package/dist/router/AppRouter.cjs.map +1 -1
- package/dist/router/AppRouter.js.map +1 -1
- package/dist/router/RouteGuard.cjs.map +1 -1
- package/dist/router/RouteGuard.js.map +1 -1
- package/dist/router/index.js +2 -2
- package/dist/share/share-or-download.cjs.map +1 -1
- package/dist/share/share-or-download.js.map +1 -1
- package/dist/share/share.cjs.map +1 -1
- package/dist/share/share.js.map +1 -1
- package/dist/sse/create-event-stream.cjs.map +1 -1
- package/dist/sse/create-event-stream.js.map +1 -1
- package/dist/sse/use-event-stream.cjs.map +1 -1
- package/dist/sse/use-event-stream.js.map +1 -1
- package/dist/store/create-selectors.cjs.map +1 -1
- package/dist/store/create-selectors.js.map +1 -1
- package/dist/store/create-store.cjs.map +1 -1
- package/dist/store/create-store.js.map +1 -1
- package/dist/sw/background-sync.cjs +1 -1
- package/dist/sw/background-sync.cjs.map +1 -1
- package/dist/sw/background-sync.js +32 -31
- package/dist/sw/background-sync.js.map +1 -1
- package/dist/sw/cache-inspect.cjs.map +1 -1
- package/dist/sw/cache-inspect.js.map +1 -1
- package/dist/sw/cache.cjs +1 -1
- package/dist/sw/cache.cjs.map +1 -1
- package/dist/sw/cache.js +2 -6
- package/dist/sw/cache.js.map +1 -1
- package/dist/sw/create-push-handler.cjs.map +1 -1
- package/dist/sw/create-push-handler.js.map +1 -1
- package/dist/sw/credential-headers.cjs.map +1 -1
- package/dist/sw/credential-headers.js.map +1 -1
- package/dist/sw/periodic-sync.cjs.map +1 -1
- package/dist/sw/periodic-sync.js.map +1 -1
- package/dist/sw/register-service-worker.cjs.map +1 -1
- package/dist/sw/register-service-worker.js.map +1 -1
- package/dist/sw/session-data.cjs.map +1 -1
- package/dist/sw/session-data.js.map +1 -1
- package/dist/sw.d.ts +46 -8
- package/dist/tabular/assets.cjs.map +1 -1
- package/dist/tabular/assets.js.map +1 -1
- package/dist/tabular/cache.cjs.map +1 -1
- package/dist/tabular/cache.js.map +1 -1
- package/dist/tabular/compact.cjs.map +1 -1
- package/dist/tabular/compact.js.map +1 -1
- package/dist/tabular/exceptions.cjs.map +1 -1
- package/dist/tabular/exceptions.js.map +1 -1
- package/dist/tabular/manifest.cjs.map +1 -1
- package/dist/tabular/manifest.js.map +1 -1
- package/dist/tabular/predictor.cjs.map +1 -1
- package/dist/tabular/predictor.js.map +1 -1
- package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
- package/dist/tabular/use-tabular-predictor.js.map +1 -1
- package/dist/telemetry/TelemetryProvider.cjs.map +1 -1
- package/dist/telemetry/TelemetryProvider.js.map +1 -1
- package/dist/telemetry/app-error-adapter.cjs.map +1 -1
- package/dist/telemetry/app-error-adapter.js.map +1 -1
- package/dist/telemetry/app-error-queue.cjs.map +1 -1
- package/dist/telemetry/app-error-queue.js.map +1 -1
- package/dist/telemetry/app-error-reporter.cjs +1 -1
- package/dist/telemetry/app-error-reporter.cjs.map +1 -1
- package/dist/telemetry/app-error-reporter.js +1 -1
- package/dist/telemetry/app-error-reporter.js.map +1 -1
- package/dist/telemetry/app-error-schema.cjs.map +1 -1
- package/dist/telemetry/app-error-schema.js.map +1 -1
- package/dist/telemetry/app-error-transport.cjs.map +1 -1
- package/dist/telemetry/app-error-transport.js.map +1 -1
- package/dist/telemetry/console-adapter.cjs.map +1 -1
- package/dist/telemetry/console-adapter.js.map +1 -1
- package/dist/telemetry/describe-app-error.cjs.map +1 -1
- package/dist/telemetry/describe-app-error.js.map +1 -1
- package/dist/telemetry/posthog-adapter.cjs +1 -1
- package/dist/telemetry/posthog-adapter.cjs.map +1 -1
- package/dist/telemetry/posthog-adapter.js +1 -5
- package/dist/telemetry/posthog-adapter.js.map +1 -1
- package/dist/telemetry/sentry-adapter.cjs.map +1 -1
- package/dist/telemetry/sentry-adapter.js.map +1 -1
- package/dist/tempest-react-sdk.cjs +1 -1
- package/dist/tempest-react-sdk.d.ts +448 -15
- package/dist/tempest-react-sdk.js +119 -119
- package/dist/testing/create-mock-handlers.cjs.map +1 -1
- package/dist/testing/create-mock-handlers.js.map +1 -1
- package/dist/testing.js +1 -2
- package/dist/theme/ThemeProvider.cjs.map +1 -1
- package/dist/theme/ThemeProvider.js.map +1 -1
- package/dist/theme/apply-theme.cjs.map +1 -1
- package/dist/theme/apply-theme.js.map +1 -1
- package/dist/theme/color.cjs.map +1 -1
- package/dist/theme/color.js.map +1 -1
- package/dist/theme/create-theme.cjs.map +1 -1
- package/dist/theme/create-theme.js.map +1 -1
- package/dist/theme/data-viz-ramps.cjs.map +1 -1
- package/dist/theme/data-viz-ramps.js.map +1 -1
- package/dist/theme/initial-theme.cjs.map +1 -1
- package/dist/theme/initial-theme.js.map +1 -1
- package/dist/theme/inverse-render.cjs.map +1 -1
- package/dist/theme/inverse-render.js.map +1 -1
- package/dist/theme/inverse-restore.cjs.map +1 -1
- package/dist/theme/inverse-restore.js.map +1 -1
- package/dist/theme/inverse-surface.cjs.map +1 -1
- package/dist/theme/inverse-surface.js.map +1 -1
- package/dist/theme/status-tokens.cjs.map +1 -1
- package/dist/theme/status-tokens.js.map +1 -1
- package/dist/theme/theme-presets.cjs.map +1 -1
- package/dist/theme/theme-presets.js.map +1 -1
- package/dist/utils/absent.cjs.map +1 -1
- package/dist/utils/absent.js.map +1 -1
- package/dist/utils/arrays.cjs.map +1 -1
- package/dist/utils/arrays.js.map +1 -1
- package/dist/utils/base64.cjs.map +1 -1
- package/dist/utils/base64.js.map +1 -1
- package/dist/utils/cn.cjs.map +1 -1
- package/dist/utils/cn.js.map +1 -1
- package/dist/utils/compare-values.cjs.map +1 -1
- package/dist/utils/compare-values.js.map +1 -1
- package/dist/utils/compressed-storage.cjs.map +1 -1
- package/dist/utils/compressed-storage.js.map +1 -1
- package/dist/utils/csv.cjs +3 -3
- package/dist/utils/csv.cjs.map +1 -1
- package/dist/utils/csv.js +11 -10
- package/dist/utils/csv.js.map +1 -1
- package/dist/utils/dev-mode.cjs.map +1 -1
- package/dist/utils/dev-mode.js.map +1 -1
- package/dist/utils/duplicate-instance.cjs.map +1 -1
- package/dist/utils/duplicate-instance.js.map +1 -1
- package/dist/utils/format.cjs.map +1 -1
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/functions.cjs +1 -1
- package/dist/utils/functions.cjs.map +1 -1
- package/dist/utils/functions.js +1 -1
- package/dist/utils/functions.js.map +1 -1
- package/dist/utils/guards.cjs.map +1 -1
- package/dist/utils/guards.js.map +1 -1
- package/dist/utils/ids.cjs.map +1 -1
- package/dist/utils/ids.js.map +1 -1
- package/dist/utils/intl-cache.cjs.map +1 -1
- package/dist/utils/intl-cache.js.map +1 -1
- package/dist/utils/json-frame.cjs.map +1 -1
- package/dist/utils/json-frame.js.map +1 -1
- package/dist/utils/numbers.cjs.map +1 -1
- package/dist/utils/numbers.js.map +1 -1
- package/dist/utils/objects.cjs.map +1 -1
- package/dist/utils/objects.js.map +1 -1
- package/dist/{telemetry/app-error-owner.cjs → utils/owner-fingerprint.cjs} +2 -2
- package/dist/utils/owner-fingerprint.cjs.map +1 -0
- package/dist/{telemetry/app-error-owner.js → utils/owner-fingerprint.js} +3 -3
- package/dist/utils/owner-fingerprint.js.map +1 -0
- package/dist/utils/promises.cjs.map +1 -1
- package/dist/utils/promises.js.map +1 -1
- package/dist/utils/relative-time.cjs.map +1 -1
- package/dist/utils/relative-time.js.map +1 -1
- package/dist/utils/safe-url.cjs.map +1 -1
- package/dist/utils/safe-url.js.map +1 -1
- package/dist/utils/schema-like.cjs.map +1 -1
- package/dist/utils/schema-like.js.map +1 -1
- package/dist/utils/storage.cjs +1 -1
- package/dist/utils/storage.cjs.map +1 -1
- package/dist/utils/storage.js +2 -2
- package/dist/utils/storage.js.map +1 -1
- package/dist/utils/strings.cjs.map +1 -1
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/xlsx.cjs.map +1 -1
- package/dist/utils/xlsx.js.map +1 -1
- package/dist/vision/core/canvas.cjs.map +1 -1
- package/dist/vision/core/canvas.js.map +1 -1
- package/dist/vision/core/dtypes.cjs.map +1 -1
- package/dist/vision/core/dtypes.js.map +1 -1
- package/dist/vision/core/exceptions.cjs.map +1 -1
- package/dist/vision/core/exceptions.js.map +1 -1
- package/dist/vision/core/graph.cjs.map +1 -1
- package/dist/vision/core/graph.js.map +1 -1
- package/dist/vision/core/metadata.cjs +1 -1
- package/dist/vision/core/metadata.cjs.map +1 -1
- package/dist/vision/core/metadata.js +9 -26
- package/dist/vision/core/metadata.js.map +1 -1
- package/dist/vision/core/providers.cjs.map +1 -1
- package/dist/vision/core/providers.js.map +1 -1
- package/dist/vision/core/session.cjs.map +1 -1
- package/dist/vision/core/session.js.map +1 -1
- package/dist/vision/core/timing.cjs.map +1 -1
- package/dist/vision/core/timing.js.map +1 -1
- package/dist/vision/fusion.cjs.map +1 -1
- package/dist/vision/fusion.js.map +1 -1
- package/dist/vision/index.cjs.map +1 -1
- package/dist/vision/index.js.map +1 -1
- package/dist/vision/io/image.cjs.map +1 -1
- package/dist/vision/io/image.js.map +1 -1
- package/dist/vision/labels.cjs.map +1 -1
- package/dist/vision/labels.js.map +1 -1
- package/dist/vision/luminance.cjs.map +1 -1
- package/dist/vision/luminance.js.map +1 -1
- package/dist/vision/normalization.cjs.map +1 -1
- package/dist/vision/normalization.js.map +1 -1
- package/dist/vision/postprocess/classification.cjs.map +1 -1
- package/dist/vision/postprocess/classification.js.map +1 -1
- package/dist/vision/postprocess/detection.cjs.map +1 -1
- package/dist/vision/postprocess/detection.js.map +1 -1
- package/dist/vision/postprocess/segmentation.cjs.map +1 -1
- package/dist/vision/postprocess/segmentation.js.map +1 -1
- package/dist/vision/preprocess/image.cjs.map +1 -1
- package/dist/vision/preprocess/image.js.map +1 -1
- package/dist/vision/preprocess/pipeline.cjs.map +1 -1
- package/dist/vision/preprocess/pipeline.js.map +1 -1
- package/dist/vision/results.cjs.map +1 -1
- package/dist/vision/results.js.map +1 -1
- package/dist/vision/tasks/base.cjs.map +1 -1
- package/dist/vision/tasks/base.js.map +1 -1
- package/dist/vision/tasks/classifier.cjs.map +1 -1
- package/dist/vision/tasks/classifier.js.map +1 -1
- package/dist/vision/tasks/detectClassify.cjs.map +1 -1
- package/dist/vision/tasks/detectClassify.js.map +1 -1
- package/dist/vision/tasks/detector.cjs.map +1 -1
- package/dist/vision/tasks/detector.js.map +1 -1
- package/dist/vision/tasks/segmenter.cjs.map +1 -1
- package/dist/vision/tasks/segmenter.js.map +1 -1
- package/dist/vision/types.cjs.map +1 -1
- package/dist/vision/types.js.map +1 -1
- package/dist/vision/use-camera-stream.cjs +1 -1
- package/dist/vision/use-camera-stream.cjs.map +1 -1
- package/dist/vision/use-camera-stream.js +3 -9
- package/dist/vision/use-camera-stream.js.map +1 -1
- package/dist/vision/use-live-luminance.cjs +1 -1
- package/dist/vision/use-live-luminance.cjs.map +1 -1
- package/dist/vision/use-live-luminance.js +1 -5
- package/dist/vision/use-live-luminance.js.map +1 -1
- package/dist/vite/base-url.cjs.map +1 -1
- package/dist/vite/base-url.js.map +1 -1
- package/dist/vite/create-vite-config.cjs.map +1 -1
- package/dist/vite/create-vite-config.js.map +1 -1
- package/dist/vite/narrow-tokens.cjs.map +1 -1
- package/dist/vite/narrow-tokens.js.map +1 -1
- package/dist/vite/tempest-csp.cjs +2 -2
- package/dist/vite/tempest-csp.cjs.map +1 -1
- package/dist/vite/tempest-csp.js +69 -66
- package/dist/vite/tempest-csp.js.map +1 -1
- package/dist/vite/tempest-icons.cjs.map +1 -1
- package/dist/vite/tempest-icons.js.map +1 -1
- package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
- package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
- package/dist/vite/tempest-pwa-dev-sw.js +9 -16
- package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
- package/dist/vite/tempest-pwa-icons.cjs.map +1 -1
- package/dist/vite/tempest-pwa-icons.js.map +1 -1
- package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
- package/dist/vite/tempest-pwa-manifest.js.map +1 -1
- package/dist/vite/tempest-styles.cjs.map +1 -1
- package/dist/vite/tempest-styles.js.map +1 -1
- package/dist/vite/tempest-vitest.cjs.map +1 -1
- package/dist/vite/tempest-vitest.js.map +1 -1
- package/dist/vite.d.ts +5 -3
- package/dist/webrtc/link-stats.cjs.map +1 -1
- package/dist/webrtc/link-stats.js.map +1 -1
- package/dist/webrtc/mesh-quality.cjs.map +1 -1
- package/dist/webrtc/mesh-quality.js.map +1 -1
- package/dist/webrtc/opus-sdp.cjs.map +1 -1
- package/dist/webrtc/opus-sdp.js.map +1 -1
- package/dist/webrtc/peer-link.cjs +1 -1
- package/dist/webrtc/peer-link.cjs.map +1 -1
- package/dist/webrtc/peer-link.js +2 -5
- package/dist/webrtc/peer-link.js.map +1 -1
- package/dist/webrtc/peer-mesh.cjs +1 -1
- package/dist/webrtc/peer-mesh.cjs.map +1 -1
- package/dist/webrtc/peer-mesh.js +8 -24
- package/dist/webrtc/peer-mesh.js.map +1 -1
- package/dist/webrtc/sender-bitrate.cjs.map +1 -1
- package/dist/webrtc/sender-bitrate.js.map +1 -1
- package/dist/webrtc/use-link-stats.cjs.map +1 -1
- package/dist/webrtc/use-link-stats.js.map +1 -1
- package/dist/ws/create-web-socket.cjs +1 -1
- package/dist/ws/create-web-socket.cjs.map +1 -1
- package/dist/ws/create-web-socket.js +4 -22
- package/dist/ws/create-web-socket.js.map +1 -1
- package/dist/ws/resilience.cjs.map +1 -1
- package/dist/ws/resilience.js.map +1 -1
- package/dist/ws/use-web-socket.cjs.map +1 -1
- package/dist/ws/use-web-socket.js.map +1 -1
- package/package.json +9 -6
- package/template/package.json +1 -1
- package/dist/telemetry/app-error-owner.cjs.map +0 -1
- package/dist/telemetry/app-error-owner.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-hints.js","names":[],"sources":["../../../src/components/InstallButton/install-hints.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nimport type { InstallMethod } from \"@/hooks/use-install-prompt\";\n\n/** What an install affordance needs to render the instruction for a method. */\nexport interface InstallHintInput {\n /** The strategy `useInstallPrompt` resolved. */\n method: InstallMethod;\n /** An `intent://` URL that re-opens the page in Chrome on Android, if any. */\n openInChromeIntent: string | null;\n}\n\n/** Renders the instruction shown when the browser has no install prompt. */\nexport type RenderInstallHint = (input: InstallHintInput) => ReactNode;\n\n/**\n * The default instruction for a browser that cannot be prompted.\n *\n * Written out rather than left to the app because every app wrote the same two\n * sentences, and getting them wrong is invisible: an iOS user who is told to\n * look for an \"Install\" menu never finds one, because Safari puts it behind the\n * Share sheet.\n *\n * On an Android fork the copy also offers the `intent://` link the SDK already\n * builds — reopening the page in Chrome is the only path that reaches a real\n * install on a browser whose menu has no install entry at all.\n *\n * @param input - The resolved method and the optional Chrome intent.\n * @returns The instruction, or `null` when the method needs none.\n */\nexport function defaultInstallHint({ method, openInChromeIntent }: InstallHintInput): ReactNode {\n if (method === \"ios\") {\n return (\n <>\n Toque em <strong>Compartilhar</strong> e escolha{\" \"}\n <strong>Adicionar à Tela de Início</strong>.\n </>\n );\n }\n if (method === \"manual\") {\n return (\n <>\n Abra o menu do navegador (<strong>⋮</strong>) e escolha{\" \"}\n <strong>Instalar app</strong>.\n {openInChromeIntent ? (\n <>\n {\" \"}\n Se não houver essa opção, <a href={openInChromeIntent}>abra no Chrome</a>.\n </>\n ) : null}\n </>\n );\n }\n return null;\n}\n"],"mappings":";;AA8BA,
|
|
1
|
+
{"version":3,"file":"install-hints.js","names":["_Fragment","defaultInstallHint","method","Fragment","openInChromeIntent"],"sources":["../../../src/components/InstallButton/install-hints.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\n\nimport type { InstallMethod } from \"@/hooks/use-install-prompt\";\n\n/** What an install affordance needs to render the instruction for a method. */\nexport interface InstallHintInput {\n /** The strategy `useInstallPrompt` resolved. */\n method: InstallMethod;\n /** An `intent://` URL that re-opens the page in Chrome on Android, if any. */\n openInChromeIntent: string | null;\n}\n\n/** Renders the instruction shown when the browser has no install prompt. */\nexport type RenderInstallHint = (input: InstallHintInput) => ReactNode;\n\n/**\n * The default instruction for a browser that cannot be prompted.\n *\n * Written out rather than left to the app because every app wrote the same two\n * sentences, and getting them wrong is invisible: an iOS user who is told to\n * look for an \"Install\" menu never finds one, because Safari puts it behind the\n * Share sheet.\n *\n * On an Android fork the copy also offers the `intent://` link the SDK already\n * builds — reopening the page in Chrome is the only path that reaches a real\n * install on a browser whose menu has no install entry at all.\n *\n * @param input - The resolved method and the optional Chrome intent.\n * @returns The instruction, or `null` when the method needs none.\n */\nexport function defaultInstallHint({ method, openInChromeIntent }: InstallHintInput): ReactNode {\n if (method === \"ios\") {\n return (\n <>\n Toque em <strong>Compartilhar</strong> e escolha{\" \"}\n <strong>Adicionar à Tela de Início</strong>.\n </>\n );\n }\n if (method === \"manual\") {\n return (\n <>\n Abra o menu do navegador (<strong>⋮</strong>) e escolha{\" \"}\n <strong>Instalar app</strong>.\n {openInChromeIntent ? (\n <>\n {\" \"}\n Se não houver essa opção, <a href={openInChromeIntent}>abra no Chrome</a>.\n </>\n ) : null}\n </>\n );\n }\n return null;\n}\n"],"mappings":";;AA8BA,SAAgBC,EAAmB,EAAE,WAAQ,yBAAmD;CAuB5F,OAtBIC,MAAW,QAEP,kBAAAF,GAAA,EAAA,UAAA;EAAE;EACW,kBAAC,UAAD,EAAA,UAAQ,eAAoB,CAAA;EAAC;EAAW;EACjD,kBAAC,UAAD,EAAA,UAAQ,6BAAkC,CAAA;EAAC;CAC7C,EAAA,CAAA,IAGNE,MAAW,WAEP,kBAAAF,GAAA,EAAA,UAAA;EAAE;EAC4B,kBAAC,UAAD,EAAA,UAAQ,IAAS,CAAA;EAAC;EAAY;EACxD,kBAAC,UAAD,EAAA,UAAQ,eAAoB,CAAA;EAAC;EAC5BI,IACG,kBAAAJ,GAAA,EAAA,UAAA;GACK;GAAI;GACqB,kBAAC,KAAD;IAAG,MAAMI;IAAoB,UAAA;GAAiB,CAAA;GAAC;EAC3E,EAAA,CAAA,IACF;CACN,EAAA,CAAA,IAGH;AACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kanban.cjs","names":[],"sources":["../../../src/components/Kanban/Kanban.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — drag-and-drop needs an\n * accessible twin: cardRoleDescription and label exist so the keyboard path\n * announces what the pointer path shows, and renderCard/emptyLabel are the slots.\n * The body is the move calculation shared by both paths.\n */\n/* eslint-disable react-hooks/refs -- `getItemProps` is called during render and its\n handlers close over `useSortable`'s mirror refs, so the rule reports the call site\n here. The refs are only written from event handlers and read from a window\n listener; the two reads that were genuinely render-time (the drag group in the\n rendered class/aria, and the group lookup inside `commit`) were fixed instead of\n silenced — see the hook's docstring. */\nimport { useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { useSortable } from \"@/hooks/use-sortable\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kanban.module.css\";\n\n/** One card on the board. */\nexport interface KanbanCard {\n /** Stable identifier, unique across the whole board. */\n id: string;\n /** Card body. A string renders as the card's title. */\n content: ReactNode;\n}\n\n/** One column of the board. */\nexport interface KanbanColumn {\n /** Stable identifier, used as the drop group. */\n id: string;\n /** Column heading. */\n title: ReactNode;\n /** Cards in display order. */\n cards: KanbanCard[];\n /**\n * Refuses drops into this column. The cards inside can still be picked up and\n * moved elsewhere — a \"done\" column that no longer accepts work, for instance.\n */\n locked?: boolean;\n}\n\n/** Where a card ended up. */\nexport interface KanbanMove {\n cardId: string;\n fromColumn: string;\n toColumn: string;\n /** Index within the destination column. */\n toIndex: number;\n}\n\nexport interface KanbanProps {\n columns: KanbanColumn[];\n /**\n * Called once per committed move — on pointer release or on a keyboard drop.\n * You own the data: apply the move and pass the new `columns` back.\n */\n onMove: (move: KanbanMove) => void;\n /** Renders a card. Defaults to its `content`. */\n renderCard?: (card: KanbanCard, column: KanbanColumn) => ReactNode;\n /** Text shown in a column with no cards. */\n emptyLabel?: ReactNode;\n /** Announced per card, so a screen reader user learns the keyboard contract. */\n cardRoleDescription?: string;\n /**\n * Accessible name of the board. A `listbox` without a name is unusable with a\n * screen reader, so this has a default rather than being optional in practice.\n */\n label?: string;\n /** Blocks all dragging. */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Kanban board: columns of cards, reorderable within a column and movable across\n * columns, by pointer **or** keyboard.\n *\n * The drag machine is `useSortable` — the board does not reimplement it. Cards are\n * indexed globally across columns so a single sortable can span the whole board;\n * the component translates that flat index back into `{ column, index }` for\n * `onMove`, which is the shape an app actually needs.\n *\n * Nothing is mutated here: `onMove` reports the intent once and the parent applies\n * it. That keeps the board a controlled value and avoids a re-render per pointer\n * frame.\n *\n * ARIA shape: **one `listbox` per column**, named by the column title, containing\n * only `option` cards. A single board-wide listbox does not survive the markup a\n * board needs — `listbox` requires `option`/`group` children, and the column header\n * and card wrapper in between break that ownership. Per-column listboxes also read\n * better: a screen reader announces which column it is in and how many cards it\n * holds. The column header is a plain `div`, not a `<header>`, because outside a\n * sectioning element every `<header>` becomes a page-level banner landmark — with\n * three columns that is three duplicate banners. An **empty** column is not marked\n * as a listbox at all: a listbox with zero options fails `aria-required-children`,\n * and \"no cards\" is exactly zero options.\n *\n * Known limitation: a **keyboard** move can only target positions that hold a card,\n * because the move walks the flat index space of existing cards. Dropping into an\n * empty column works by pointer; by keyboard it does not. Moving a card to a column\n * that already has one card, then reordering, is the workaround until column-switch\n * keys land.\n *\n * @example\n * ```tsx\n * const [columns, setColumns] = useState<KanbanColumn[]>([\n * { id: \"todo\", title: \"A fazer\", cards: [{ id: \"1\", content: \"Corrigir login\" }] },\n * { id: \"doing\", title: \"Fazendo\", cards: [] },\n * { id: \"done\", title: \"Feito\", cards: [], locked: true },\n * ]);\n *\n * <Kanban\n * columns={columns}\n * onMove={({ cardId, fromColumn, toColumn, toIndex }) =>\n * setColumns((current) => applyKanbanMove(current, { cardId, fromColumn, toColumn, toIndex }))\n * }\n * />\n * ```\n */\nexport function Kanban({\n columns,\n onMove,\n renderCard,\n emptyLabel = \"Nenhum card\",\n cardRoleDescription = \"Card do quadro — Espaço pega, setas movem, Espaço solta\",\n label = \"Quadro\",\n disabled = false,\n className,\n}: KanbanProps) {\n /**\n * Flat view of every card, in column order.\n *\n * `useSortable` works on a single index space, so the board flattens itself and\n * keeps the mapping back to `{ column, index }` here — the only place that has\n * to know both shapes.\n */\n const flat = useMemo(\n () =>\n columns.flatMap((column, columnIndex) =>\n column.cards.map((card, cardIndex) => ({ card, column, columnIndex, cardIndex })),\n ),\n [columns],\n );\n\n const sortable = useSortable({\n itemCount: flat.length,\n disabled,\n roleDescription: cardRoleDescription,\n onReorder: ({ from, to, fromGroup, toGroup }) => {\n const source = flat[from];\n if (!source) return;\n\n const destinationId = toGroup ?? fromGroup ?? source.column.id;\n const destination = columns.find((column) => column.id === destinationId);\n if (!destination || destination.locked) return;\n\n const target = flat[to];\n const toIndex =\n target && target.column.id === destinationId\n ? target.cardIndex\n : destination.cards.length;\n\n onMove({\n cardId: source.card.id,\n fromColumn: source.column.id,\n toColumn: destinationId,\n toIndex,\n });\n },\n });\n\n /**\n * First flat index of each column.\n *\n * Derived instead of counted with a mutable `flatIndex++` during render: a\n * render-scoped counter mutated inside the map is exactly the pattern the React\n * Compiler rules reject, and for good reason — a partial or replayed render\n * would resume from a half-advanced counter.\n */\n const columnOffsets = useMemo(() => {\n const offsets: number[] = [];\n let start = 0;\n for (const column of columns) {\n offsets.push(start);\n start += column.cards.length;\n }\n return offsets;\n }, [columns]);\n\n return (\n <div className={cn(styles.board, className)} aria-label={label} ref={sortable.setContainer}>\n {columns.map((column, columnIndex) => {\n const isDropTarget = sortable.overGroup === column.id && !column.locked;\n return (\n <div\n key={column.id}\n className={cn(\n styles.column,\n isDropTarget && styles.columnActive,\n column.locked && styles.columnLocked,\n )}\n >\n <div className={styles.columnHeader}>\n <span className={styles.columnTitle}>{column.title}</span>\n <span className={styles.count}>{column.cards.length}</span>\n </div>\n\n <div\n className={styles.cards}\n {...(column.cards.length > 0 ? sortable.getListProps() : {})}\n aria-label={typeof column.title === \"string\" ? column.title : column.id}\n >\n {column.cards.map((card, cardIndex) => {\n const index = columnOffsets[columnIndex] + cardIndex;\n const isActive = sortable.activeIndex === index;\n const isOver = sortable.overIndex === index && !isActive;\n return (\n <div\n key={card.id}\n {...sortable.getItemProps(index, column.id)}\n className={cn(\n styles.card,\n isActive && styles.cardActive,\n isOver && styles.cardOver,\n )}\n >\n {renderCard ? renderCard(card, column) : card.content}\n </div>\n );\n })}\n\n {column.cards.length === 0 ? (\n <div\n {...sortable.getEmptyGroupProps(column.id)}\n className={styles.empty}\n >\n {emptyLabel}\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Apply a {@link KanbanMove} to a column list, returning new arrays.\n *\n * Exported because every consumer needs the same reducer.\n *\n * `toIndex` is the position of the card that was dropped **onto**, read from the\n * board as it looked before the move. Inserting at that same index *after* removing\n * the dragged card lands where the user aimed in both directions — moving down, the\n * removal shifts the target up by one and the insertion lands after it; moving up,\n * nothing shifted. Compensating for the shift (the \"obvious\" `toIndex - 1`) is what\n * turns a one-step move down into a no-op.\n *\n * @param columns - Current board.\n * @param move - The move reported by `onMove`.\n * @returns A new column list, or the same reference when the move cannot apply.\n */\nexport function applyKanbanMove(columns: KanbanColumn[], move: KanbanMove): KanbanColumn[] {\n const fromColumn = columns.find((column) => column.id === move.fromColumn);\n const card = fromColumn?.cards.find((candidate) => candidate.id === move.cardId);\n if (!fromColumn || !card) return columns;\n\n const insertAt = move.toIndex;\n\n return columns.map((column) => {\n if (column.id === move.fromColumn && column.id === move.toColumn) {\n const without = column.cards.filter((candidate) => candidate.id !== move.cardId);\n without.splice(insertAt, 0, card);\n return { ...column, cards: without };\n }\n if (column.id === move.fromColumn) {\n return { ...column, cards: column.cards.filter((c) => c.id !== move.cardId) };\n }\n if (column.id === move.toColumn) {\n const next = column.cards.slice();\n next.splice(insertAt, 0, card);\n return { ...column, cards: next };\n }\n return column;\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Kanban.cjs","names":["useMemo","useSortable","cn","styles","require_cn","require_use_sortable","require_Kanban_module","react","react_jsx_runtime","Kanban","flat","columns","column","sortable","cardRoleDescription","source","from","destinationId","toGroup","fromGroup","destination","target","to","toIndex","onMove","columnOffsets","offsets","start","className","label","isDropTarget","index","columnIndex","cardIndex","isActive","isOver","renderCard","card","emptyLabel","applyKanbanMove","fromColumn","move","candidate","insertAt","without","c","next"],"sources":["../../../src/components/Kanban/Kanban.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — drag-and-drop needs an\n * accessible twin: cardRoleDescription and label exist so the keyboard path\n * announces what the pointer path shows, and renderCard/emptyLabel are the slots.\n * The body is the move calculation shared by both paths.\n */\n/* eslint-disable react-hooks/refs -- `getItemProps` is called during render and its\n handlers close over `useSortable`'s mirror refs, so the rule reports the call site\n here. The refs are only written from event handlers and read from a window\n listener; the two reads that were genuinely render-time (the drag group in the\n rendered class/aria, and the group lookup inside `commit`) were fixed instead of\n silenced — see the hook's docstring. */\nimport { useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { useSortable } from \"@/hooks/use-sortable\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kanban.module.css\";\n\n/** One card on the board. */\nexport interface KanbanCard {\n /** Stable identifier, unique across the whole board. */\n id: string;\n /** Card body. A string renders as the card's title. */\n content: ReactNode;\n}\n\n/** One column of the board. */\nexport interface KanbanColumn {\n /** Stable identifier, used as the drop group. */\n id: string;\n /** Column heading. */\n title: ReactNode;\n /** Cards in display order. */\n cards: KanbanCard[];\n /**\n * Refuses drops into this column. The cards inside can still be picked up and\n * moved elsewhere — a \"done\" column that no longer accepts work, for instance.\n */\n locked?: boolean;\n}\n\n/** Where a card ended up. */\nexport interface KanbanMove {\n cardId: string;\n fromColumn: string;\n toColumn: string;\n /** Index within the destination column. */\n toIndex: number;\n}\n\nexport interface KanbanProps {\n columns: KanbanColumn[];\n /**\n * Called once per committed move — on pointer release or on a keyboard drop.\n * You own the data: apply the move and pass the new `columns` back.\n */\n onMove: (move: KanbanMove) => void;\n /** Renders a card. Defaults to its `content`. */\n renderCard?: (card: KanbanCard, column: KanbanColumn) => ReactNode;\n /** Text shown in a column with no cards. */\n emptyLabel?: ReactNode;\n /** Announced per card, so a screen reader user learns the keyboard contract. */\n cardRoleDescription?: string;\n /**\n * Accessible name of the board. A `listbox` without a name is unusable with a\n * screen reader, so this has a default rather than being optional in practice.\n */\n label?: string;\n /** Blocks all dragging. */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Kanban board: columns of cards, reorderable within a column and movable across\n * columns, by pointer **or** keyboard.\n *\n * The drag machine is `useSortable` — the board does not reimplement it. Cards are\n * indexed globally across columns so a single sortable can span the whole board;\n * the component translates that flat index back into `{ column, index }` for\n * `onMove`, which is the shape an app actually needs.\n *\n * Nothing is mutated here: `onMove` reports the intent once and the parent applies\n * it. That keeps the board a controlled value and avoids a re-render per pointer\n * frame.\n *\n * ARIA shape: **one `listbox` per column**, named by the column title, containing\n * only `option` cards. A single board-wide listbox does not survive the markup a\n * board needs — `listbox` requires `option`/`group` children, and the column header\n * and card wrapper in between break that ownership. Per-column listboxes also read\n * better: a screen reader announces which column it is in and how many cards it\n * holds. The column header is a plain `div`, not a `<header>`, because outside a\n * sectioning element every `<header>` becomes a page-level banner landmark — with\n * three columns that is three duplicate banners. An **empty** column is not marked\n * as a listbox at all: a listbox with zero options fails `aria-required-children`,\n * and \"no cards\" is exactly zero options.\n *\n * Known limitation: a **keyboard** move can only target positions that hold a card,\n * because the move walks the flat index space of existing cards. Dropping into an\n * empty column works by pointer; by keyboard it does not. Moving a card to a column\n * that already has one card, then reordering, is the workaround until column-switch\n * keys land.\n *\n * @example\n * ```tsx\n * const [columns, setColumns] = useState<KanbanColumn[]>([\n * { id: \"todo\", title: \"A fazer\", cards: [{ id: \"1\", content: \"Corrigir login\" }] },\n * { id: \"doing\", title: \"Fazendo\", cards: [] },\n * { id: \"done\", title: \"Feito\", cards: [], locked: true },\n * ]);\n *\n * <Kanban\n * columns={columns}\n * onMove={({ cardId, fromColumn, toColumn, toIndex }) =>\n * setColumns((current) => applyKanbanMove(current, { cardId, fromColumn, toColumn, toIndex }))\n * }\n * />\n * ```\n */\nexport function Kanban({\n columns,\n onMove,\n renderCard,\n emptyLabel = \"Nenhum card\",\n cardRoleDescription = \"Card do quadro — Espaço pega, setas movem, Espaço solta\",\n label = \"Quadro\",\n disabled = false,\n className,\n}: KanbanProps) {\n /**\n * Flat view of every card, in column order.\n *\n * `useSortable` works on a single index space, so the board flattens itself and\n * keeps the mapping back to `{ column, index }` here — the only place that has\n * to know both shapes.\n */\n const flat = useMemo(\n () =>\n columns.flatMap((column, columnIndex) =>\n column.cards.map((card, cardIndex) => ({ card, column, columnIndex, cardIndex })),\n ),\n [columns],\n );\n\n const sortable = useSortable({\n itemCount: flat.length,\n disabled,\n roleDescription: cardRoleDescription,\n onReorder: ({ from, to, fromGroup, toGroup }) => {\n const source = flat[from];\n if (!source) return;\n\n const destinationId = toGroup ?? fromGroup ?? source.column.id;\n const destination = columns.find((column) => column.id === destinationId);\n if (!destination || destination.locked) return;\n\n const target = flat[to];\n const toIndex =\n target && target.column.id === destinationId\n ? target.cardIndex\n : destination.cards.length;\n\n onMove({\n cardId: source.card.id,\n fromColumn: source.column.id,\n toColumn: destinationId,\n toIndex,\n });\n },\n });\n\n /**\n * First flat index of each column.\n *\n * Derived instead of counted with a mutable `flatIndex++` during render: a\n * render-scoped counter mutated inside the map is exactly the pattern the React\n * Compiler rules reject, and for good reason — a partial or replayed render\n * would resume from a half-advanced counter.\n */\n const columnOffsets = useMemo(() => {\n const offsets: number[] = [];\n let start = 0;\n for (const column of columns) {\n offsets.push(start);\n start += column.cards.length;\n }\n return offsets;\n }, [columns]);\n\n return (\n <div className={cn(styles.board, className)} aria-label={label} ref={sortable.setContainer}>\n {columns.map((column, columnIndex) => {\n const isDropTarget = sortable.overGroup === column.id && !column.locked;\n return (\n <div\n key={column.id}\n className={cn(\n styles.column,\n isDropTarget && styles.columnActive,\n column.locked && styles.columnLocked,\n )}\n >\n <div className={styles.columnHeader}>\n <span className={styles.columnTitle}>{column.title}</span>\n <span className={styles.count}>{column.cards.length}</span>\n </div>\n\n <div\n className={styles.cards}\n {...(column.cards.length > 0 ? sortable.getListProps() : {})}\n aria-label={typeof column.title === \"string\" ? column.title : column.id}\n >\n {column.cards.map((card, cardIndex) => {\n const index = columnOffsets[columnIndex] + cardIndex;\n const isActive = sortable.activeIndex === index;\n const isOver = sortable.overIndex === index && !isActive;\n return (\n <div\n key={card.id}\n {...sortable.getItemProps(index, column.id)}\n className={cn(\n styles.card,\n isActive && styles.cardActive,\n isOver && styles.cardOver,\n )}\n >\n {renderCard ? renderCard(card, column) : card.content}\n </div>\n );\n })}\n\n {column.cards.length === 0 ? (\n <div\n {...sortable.getEmptyGroupProps(column.id)}\n className={styles.empty}\n >\n {emptyLabel}\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Apply a {@link KanbanMove} to a column list, returning new arrays.\n *\n * Exported because every consumer needs the same reducer.\n *\n * `toIndex` is the position of the card that was dropped **onto**, read from the\n * board as it looked before the move. Inserting at that same index *after* removing\n * the dragged card lands where the user aimed in both directions — moving down, the\n * removal shifts the target up by one and the insertion lands after it; moving up,\n * nothing shifted. Compensating for the shift (the \"obvious\" `toIndex - 1`) is what\n * turns a one-step move down into a no-op.\n *\n * @param columns - Current board.\n * @param move - The move reported by `onMove`.\n * @returns A new column list, or the same reference when the move cannot apply.\n */\nexport function applyKanbanMove(columns: KanbanColumn[], move: KanbanMove): KanbanColumn[] {\n const fromColumn = columns.find((column) => column.id === move.fromColumn);\n const card = fromColumn?.cards.find((candidate) => candidate.id === move.cardId);\n if (!fromColumn || !card) return columns;\n\n const insertAt = move.toIndex;\n\n return columns.map((column) => {\n if (column.id === move.fromColumn && column.id === move.toColumn) {\n const without = column.cards.filter((candidate) => candidate.id !== move.cardId);\n without.splice(insertAt, 0, card);\n return { ...column, cards: without };\n }\n if (column.id === move.fromColumn) {\n return { ...column, cards: column.cards.filter((c) => c.id !== move.cardId) };\n }\n if (column.id === move.toColumn) {\n const next = column.cards.slice();\n next.splice(insertAt, 0, card);\n return { ...column, cards: next };\n }\n return column;\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kanban.js","names":[],"sources":["../../../src/components/Kanban/Kanban.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — drag-and-drop needs an\n * accessible twin: cardRoleDescription and label exist so the keyboard path\n * announces what the pointer path shows, and renderCard/emptyLabel are the slots.\n * The body is the move calculation shared by both paths.\n */\n/* eslint-disable react-hooks/refs -- `getItemProps` is called during render and its\n handlers close over `useSortable`'s mirror refs, so the rule reports the call site\n here. The refs are only written from event handlers and read from a window\n listener; the two reads that were genuinely render-time (the drag group in the\n rendered class/aria, and the group lookup inside `commit`) were fixed instead of\n silenced — see the hook's docstring. */\nimport { useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { useSortable } from \"@/hooks/use-sortable\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kanban.module.css\";\n\n/** One card on the board. */\nexport interface KanbanCard {\n /** Stable identifier, unique across the whole board. */\n id: string;\n /** Card body. A string renders as the card's title. */\n content: ReactNode;\n}\n\n/** One column of the board. */\nexport interface KanbanColumn {\n /** Stable identifier, used as the drop group. */\n id: string;\n /** Column heading. */\n title: ReactNode;\n /** Cards in display order. */\n cards: KanbanCard[];\n /**\n * Refuses drops into this column. The cards inside can still be picked up and\n * moved elsewhere — a \"done\" column that no longer accepts work, for instance.\n */\n locked?: boolean;\n}\n\n/** Where a card ended up. */\nexport interface KanbanMove {\n cardId: string;\n fromColumn: string;\n toColumn: string;\n /** Index within the destination column. */\n toIndex: number;\n}\n\nexport interface KanbanProps {\n columns: KanbanColumn[];\n /**\n * Called once per committed move — on pointer release or on a keyboard drop.\n * You own the data: apply the move and pass the new `columns` back.\n */\n onMove: (move: KanbanMove) => void;\n /** Renders a card. Defaults to its `content`. */\n renderCard?: (card: KanbanCard, column: KanbanColumn) => ReactNode;\n /** Text shown in a column with no cards. */\n emptyLabel?: ReactNode;\n /** Announced per card, so a screen reader user learns the keyboard contract. */\n cardRoleDescription?: string;\n /**\n * Accessible name of the board. A `listbox` without a name is unusable with a\n * screen reader, so this has a default rather than being optional in practice.\n */\n label?: string;\n /** Blocks all dragging. */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Kanban board: columns of cards, reorderable within a column and movable across\n * columns, by pointer **or** keyboard.\n *\n * The drag machine is `useSortable` — the board does not reimplement it. Cards are\n * indexed globally across columns so a single sortable can span the whole board;\n * the component translates that flat index back into `{ column, index }` for\n * `onMove`, which is the shape an app actually needs.\n *\n * Nothing is mutated here: `onMove` reports the intent once and the parent applies\n * it. That keeps the board a controlled value and avoids a re-render per pointer\n * frame.\n *\n * ARIA shape: **one `listbox` per column**, named by the column title, containing\n * only `option` cards. A single board-wide listbox does not survive the markup a\n * board needs — `listbox` requires `option`/`group` children, and the column header\n * and card wrapper in between break that ownership. Per-column listboxes also read\n * better: a screen reader announces which column it is in and how many cards it\n * holds. The column header is a plain `div`, not a `<header>`, because outside a\n * sectioning element every `<header>` becomes a page-level banner landmark — with\n * three columns that is three duplicate banners. An **empty** column is not marked\n * as a listbox at all: a listbox with zero options fails `aria-required-children`,\n * and \"no cards\" is exactly zero options.\n *\n * Known limitation: a **keyboard** move can only target positions that hold a card,\n * because the move walks the flat index space of existing cards. Dropping into an\n * empty column works by pointer; by keyboard it does not. Moving a card to a column\n * that already has one card, then reordering, is the workaround until column-switch\n * keys land.\n *\n * @example\n * ```tsx\n * const [columns, setColumns] = useState<KanbanColumn[]>([\n * { id: \"todo\", title: \"A fazer\", cards: [{ id: \"1\", content: \"Corrigir login\" }] },\n * { id: \"doing\", title: \"Fazendo\", cards: [] },\n * { id: \"done\", title: \"Feito\", cards: [], locked: true },\n * ]);\n *\n * <Kanban\n * columns={columns}\n * onMove={({ cardId, fromColumn, toColumn, toIndex }) =>\n * setColumns((current) => applyKanbanMove(current, { cardId, fromColumn, toColumn, toIndex }))\n * }\n * />\n * ```\n */\nexport function Kanban({\n columns,\n onMove,\n renderCard,\n emptyLabel = \"Nenhum card\",\n cardRoleDescription = \"Card do quadro — Espaço pega, setas movem, Espaço solta\",\n label = \"Quadro\",\n disabled = false,\n className,\n}: KanbanProps) {\n /**\n * Flat view of every card, in column order.\n *\n * `useSortable` works on a single index space, so the board flattens itself and\n * keeps the mapping back to `{ column, index }` here — the only place that has\n * to know both shapes.\n */\n const flat = useMemo(\n () =>\n columns.flatMap((column, columnIndex) =>\n column.cards.map((card, cardIndex) => ({ card, column, columnIndex, cardIndex })),\n ),\n [columns],\n );\n\n const sortable = useSortable({\n itemCount: flat.length,\n disabled,\n roleDescription: cardRoleDescription,\n onReorder: ({ from, to, fromGroup, toGroup }) => {\n const source = flat[from];\n if (!source) return;\n\n const destinationId = toGroup ?? fromGroup ?? source.column.id;\n const destination = columns.find((column) => column.id === destinationId);\n if (!destination || destination.locked) return;\n\n const target = flat[to];\n const toIndex =\n target && target.column.id === destinationId\n ? target.cardIndex\n : destination.cards.length;\n\n onMove({\n cardId: source.card.id,\n fromColumn: source.column.id,\n toColumn: destinationId,\n toIndex,\n });\n },\n });\n\n /**\n * First flat index of each column.\n *\n * Derived instead of counted with a mutable `flatIndex++` during render: a\n * render-scoped counter mutated inside the map is exactly the pattern the React\n * Compiler rules reject, and for good reason — a partial or replayed render\n * would resume from a half-advanced counter.\n */\n const columnOffsets = useMemo(() => {\n const offsets: number[] = [];\n let start = 0;\n for (const column of columns) {\n offsets.push(start);\n start += column.cards.length;\n }\n return offsets;\n }, [columns]);\n\n return (\n <div className={cn(styles.board, className)} aria-label={label} ref={sortable.setContainer}>\n {columns.map((column, columnIndex) => {\n const isDropTarget = sortable.overGroup === column.id && !column.locked;\n return (\n <div\n key={column.id}\n className={cn(\n styles.column,\n isDropTarget && styles.columnActive,\n column.locked && styles.columnLocked,\n )}\n >\n <div className={styles.columnHeader}>\n <span className={styles.columnTitle}>{column.title}</span>\n <span className={styles.count}>{column.cards.length}</span>\n </div>\n\n <div\n className={styles.cards}\n {...(column.cards.length > 0 ? sortable.getListProps() : {})}\n aria-label={typeof column.title === \"string\" ? column.title : column.id}\n >\n {column.cards.map((card, cardIndex) => {\n const index = columnOffsets[columnIndex] + cardIndex;\n const isActive = sortable.activeIndex === index;\n const isOver = sortable.overIndex === index && !isActive;\n return (\n <div\n key={card.id}\n {...sortable.getItemProps(index, column.id)}\n className={cn(\n styles.card,\n isActive && styles.cardActive,\n isOver && styles.cardOver,\n )}\n >\n {renderCard ? renderCard(card, column) : card.content}\n </div>\n );\n })}\n\n {column.cards.length === 0 ? (\n <div\n {...sortable.getEmptyGroupProps(column.id)}\n className={styles.empty}\n >\n {emptyLabel}\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Apply a {@link KanbanMove} to a column list, returning new arrays.\n *\n * Exported because every consumer needs the same reducer.\n *\n * `toIndex` is the position of the card that was dropped **onto**, read from the\n * board as it looked before the move. Inserting at that same index *after* removing\n * the dragged card lands where the user aimed in both directions — moving down, the\n * removal shifts the target up by one and the insertion lands after it; moving up,\n * nothing shifted. Compensating for the shift (the \"obvious\" `toIndex - 1`) is what\n * turns a one-step move down into a no-op.\n *\n * @param columns - Current board.\n * @param move - The move reported by `onMove`.\n * @returns A new column list, or the same reference when the move cannot apply.\n */\nexport function applyKanbanMove(columns: KanbanColumn[], move: KanbanMove): KanbanColumn[] {\n const fromColumn = columns.find((column) => column.id === move.fromColumn);\n const card = fromColumn?.cards.find((candidate) => candidate.id === move.cardId);\n if (!fromColumn || !card) return columns;\n\n const insertAt = move.toIndex;\n\n return columns.map((column) => {\n if (column.id === move.fromColumn && column.id === move.toColumn) {\n const without = column.cards.filter((candidate) => candidate.id !== move.cardId);\n without.splice(insertAt, 0, card);\n return { ...column, cards: without };\n }\n if (column.id === move.fromColumn) {\n return { ...column, cards: column.cards.filter((c) => c.id !== move.cardId) };\n }\n if (column.id === move.toColumn) {\n const next = column.cards.slice();\n next.splice(insertAt, 0, card);\n return { ...column, cards: next };\n }\n return column;\n });\n}\n"],"mappings":";;;;;;AAuHA,SAAgB,EAAO,EACnB,YACA,WACA,eACA,gBAAa,eACb,yBAAsB,2DACtB,WAAQ,UACR,cAAW,IACX,gBACY;CAQZ,IAAM,IAAO,QAEL,EAAQ,SAAS,GAAQ,MACrB,EAAO,MAAM,KAAK,GAAM,OAAe;EAAE;EAAM;EAAQ;EAAa;CAAU,EAAE,CACpF,GACJ,CAAC,CAAO,CACZ,GAEM,IAAW,EAAY;EACzB,WAAW,EAAK;EAChB;EACA,iBAAiB;EACjB,YAAY,EAAE,SAAM,OAAI,cAAW,iBAAc;GAC7C,IAAM,IAAS,EAAK;GACpB,IAAI,CAAC,GAAQ;GAEb,IAAM,IAAgB,KAAW,KAAa,EAAO,OAAO,IACtD,IAAc,EAAQ,MAAM,MAAW,EAAO,OAAO,CAAa;GACxE,IAAI,CAAC,KAAe,EAAY,QAAQ;GAExC,IAAM,IAAS,EAAK,IACd,IACF,KAAU,EAAO,OAAO,OAAO,IACzB,EAAO,YACP,EAAY,MAAM;GAE5B,EAAO;IACH,QAAQ,EAAO,KAAK;IACpB,YAAY,EAAO,OAAO;IAC1B,UAAU;IACV;GACJ,CAAC;EACL;CACJ,CAAC,GAUK,IAAgB,QAAc;EAChC,IAAM,IAAoB,CAAC,GACvB,IAAQ;EACZ,KAAK,IAAM,KAAU,GAEjB,AADA,EAAQ,KAAK,CAAK,GAClB,KAAS,EAAO,MAAM;EAE1B,OAAO;CACX,GAAG,CAAC,CAAO,CAAC;CAEZ,OACI,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,OAAO,CAAS;EAAG,cAAY;EAAO,KAAK,EAAS;EACzE,UAAA,EAAQ,KAAK,GAAQ,MAAgB;GAClC,IAAM,IAAe,EAAS,cAAc,EAAO,MAAM,CAAC,EAAO;GACjE,OACI,kBAAC,OAAD;IAEI,WAAW,EACP,EAAO,QACP,KAAgB,EAAO,cACvB,EAAO,UAAU,EAAO,YAC5B;IANJ,UAAA,CAQI,kBAAC,OAAD;KAAK,WAAW,EAAO;KAAvB,UAAA,CACI,kBAAC,QAAD;MAAM,WAAW,EAAO;MAAc,UAAA,EAAO;KAAY,CAAA,GACzD,kBAAC,QAAD;MAAM,WAAW,EAAO;MAAQ,UAAA,EAAO,MAAM;KAAa,CAAA,CACzD;IAEL,CAAA,GAAA,kBAAC,OAAD;KACI,WAAW,EAAO;KAClB,GAAK,EAAO,MAAM,SAAS,IAAI,EAAS,aAAa,IAAI,CAAC;KAC1D,cAAY,OAAO,EAAO,SAAU,WAAW,EAAO,QAAQ,EAAO;KAHzE,UAAA,CAKK,EAAO,MAAM,KAAK,GAAM,MAAc;MACnC,IAAM,IAAQ,EAAc,KAAe,GACrC,IAAW,EAAS,gBAAgB,GACpC,IAAS,EAAS,cAAc,KAAS,CAAC;MAChD,OACI,kBAAC,OAAD;OAEI,GAAI,EAAS,aAAa,GAAO,EAAO,EAAE;OAC1C,WAAW,EACP,EAAO,MACP,KAAY,EAAO,YACnB,KAAU,EAAO,QACrB;OAEC,UAAA,IAAa,EAAW,GAAM,CAAM,IAAI,EAAK;MAC7C,GATI,EAAK,EAST;KAEb,CAAC,GAEA,EAAO,MAAM,WAAW,IACrB,kBAAC,OAAD;MACI,GAAI,EAAS,mBAAmB,EAAO,EAAE;MACzC,WAAW,EAAO;MAEjB,UAAA;KACA,CAAA,IACL,IACH;IACJ,CAAA,CAAA;GA7CI,GAAA,EAAO,EA6CX;EAEb,CAAC;CACA,CAAA;AAEb;AAkBA,SAAgB,EAAgB,GAAyB,GAAkC;CACvF,IAAM,IAAa,EAAQ,MAAM,MAAW,EAAO,OAAO,EAAK,UAAU,GACnE,IAAO,GAAY,MAAM,MAAM,MAAc,EAAU,OAAO,EAAK,MAAM;CAC/E,IAAI,CAAC,KAAc,CAAC,GAAM,OAAO;CAEjC,IAAM,IAAW,EAAK;CAEtB,OAAO,EAAQ,KAAK,MAAW;EAC3B,IAAI,EAAO,OAAO,EAAK,cAAc,EAAO,OAAO,EAAK,UAAU;GAC9D,IAAM,IAAU,EAAO,MAAM,QAAQ,MAAc,EAAU,OAAO,EAAK,MAAM;GAE/E,OADA,EAAQ,OAAO,GAAU,GAAG,CAAI,GACzB;IAAE,GAAG;IAAQ,OAAO;GAAQ;EACvC;EACA,IAAI,EAAO,OAAO,EAAK,YACnB,OAAO;GAAE,GAAG;GAAQ,OAAO,EAAO,MAAM,QAAQ,MAAM,EAAE,OAAO,EAAK,MAAM;EAAE;EAEhF,IAAI,EAAO,OAAO,EAAK,UAAU;GAC7B,IAAM,IAAO,EAAO,MAAM,MAAM;GAEhC,OADA,EAAK,OAAO,GAAU,GAAG,CAAI,GACtB;IAAE,GAAG;IAAQ,OAAO;GAAK;EACpC;EACA,OAAO;CACX,CAAC;AACL"}
|
|
1
|
+
{"version":3,"file":"Kanban.js","names":["styles","Kanban_module_default","Kanban","flat","useMemo","columns","column","sortable","useSortable","cardRoleDescription","source","from","destinationId","toGroup","fromGroup","destination","target","to","toIndex","columnOffsets","offsets","start","cn","className","label","isDropTarget","index","columnIndex","cardIndex","isActive","isOver","renderCard","card","emptyLabel","applyKanbanMove","fromColumn","move","candidate","insertAt","without","c","next"],"sources":["../../../src/components/Kanban/Kanban.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — drag-and-drop needs an\n * accessible twin: cardRoleDescription and label exist so the keyboard path\n * announces what the pointer path shows, and renderCard/emptyLabel are the slots.\n * The body is the move calculation shared by both paths.\n */\n/* eslint-disable react-hooks/refs -- `getItemProps` is called during render and its\n handlers close over `useSortable`'s mirror refs, so the rule reports the call site\n here. The refs are only written from event handlers and read from a window\n listener; the two reads that were genuinely render-time (the drag group in the\n rendered class/aria, and the group lookup inside `commit`) were fixed instead of\n silenced — see the hook's docstring. */\nimport { useMemo } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { useSortable } from \"@/hooks/use-sortable\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kanban.module.css\";\n\n/** One card on the board. */\nexport interface KanbanCard {\n /** Stable identifier, unique across the whole board. */\n id: string;\n /** Card body. A string renders as the card's title. */\n content: ReactNode;\n}\n\n/** One column of the board. */\nexport interface KanbanColumn {\n /** Stable identifier, used as the drop group. */\n id: string;\n /** Column heading. */\n title: ReactNode;\n /** Cards in display order. */\n cards: KanbanCard[];\n /**\n * Refuses drops into this column. The cards inside can still be picked up and\n * moved elsewhere — a \"done\" column that no longer accepts work, for instance.\n */\n locked?: boolean;\n}\n\n/** Where a card ended up. */\nexport interface KanbanMove {\n cardId: string;\n fromColumn: string;\n toColumn: string;\n /** Index within the destination column. */\n toIndex: number;\n}\n\nexport interface KanbanProps {\n columns: KanbanColumn[];\n /**\n * Called once per committed move — on pointer release or on a keyboard drop.\n * You own the data: apply the move and pass the new `columns` back.\n */\n onMove: (move: KanbanMove) => void;\n /** Renders a card. Defaults to its `content`. */\n renderCard?: (card: KanbanCard, column: KanbanColumn) => ReactNode;\n /** Text shown in a column with no cards. */\n emptyLabel?: ReactNode;\n /** Announced per card, so a screen reader user learns the keyboard contract. */\n cardRoleDescription?: string;\n /**\n * Accessible name of the board. A `listbox` without a name is unusable with a\n * screen reader, so this has a default rather than being optional in practice.\n */\n label?: string;\n /** Blocks all dragging. */\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * Kanban board: columns of cards, reorderable within a column and movable across\n * columns, by pointer **or** keyboard.\n *\n * The drag machine is `useSortable` — the board does not reimplement it. Cards are\n * indexed globally across columns so a single sortable can span the whole board;\n * the component translates that flat index back into `{ column, index }` for\n * `onMove`, which is the shape an app actually needs.\n *\n * Nothing is mutated here: `onMove` reports the intent once and the parent applies\n * it. That keeps the board a controlled value and avoids a re-render per pointer\n * frame.\n *\n * ARIA shape: **one `listbox` per column**, named by the column title, containing\n * only `option` cards. A single board-wide listbox does not survive the markup a\n * board needs — `listbox` requires `option`/`group` children, and the column header\n * and card wrapper in between break that ownership. Per-column listboxes also read\n * better: a screen reader announces which column it is in and how many cards it\n * holds. The column header is a plain `div`, not a `<header>`, because outside a\n * sectioning element every `<header>` becomes a page-level banner landmark — with\n * three columns that is three duplicate banners. An **empty** column is not marked\n * as a listbox at all: a listbox with zero options fails `aria-required-children`,\n * and \"no cards\" is exactly zero options.\n *\n * Known limitation: a **keyboard** move can only target positions that hold a card,\n * because the move walks the flat index space of existing cards. Dropping into an\n * empty column works by pointer; by keyboard it does not. Moving a card to a column\n * that already has one card, then reordering, is the workaround until column-switch\n * keys land.\n *\n * @example\n * ```tsx\n * const [columns, setColumns] = useState<KanbanColumn[]>([\n * { id: \"todo\", title: \"A fazer\", cards: [{ id: \"1\", content: \"Corrigir login\" }] },\n * { id: \"doing\", title: \"Fazendo\", cards: [] },\n * { id: \"done\", title: \"Feito\", cards: [], locked: true },\n * ]);\n *\n * <Kanban\n * columns={columns}\n * onMove={({ cardId, fromColumn, toColumn, toIndex }) =>\n * setColumns((current) => applyKanbanMove(current, { cardId, fromColumn, toColumn, toIndex }))\n * }\n * />\n * ```\n */\nexport function Kanban({\n columns,\n onMove,\n renderCard,\n emptyLabel = \"Nenhum card\",\n cardRoleDescription = \"Card do quadro — Espaço pega, setas movem, Espaço solta\",\n label = \"Quadro\",\n disabled = false,\n className,\n}: KanbanProps) {\n /**\n * Flat view of every card, in column order.\n *\n * `useSortable` works on a single index space, so the board flattens itself and\n * keeps the mapping back to `{ column, index }` here — the only place that has\n * to know both shapes.\n */\n const flat = useMemo(\n () =>\n columns.flatMap((column, columnIndex) =>\n column.cards.map((card, cardIndex) => ({ card, column, columnIndex, cardIndex })),\n ),\n [columns],\n );\n\n const sortable = useSortable({\n itemCount: flat.length,\n disabled,\n roleDescription: cardRoleDescription,\n onReorder: ({ from, to, fromGroup, toGroup }) => {\n const source = flat[from];\n if (!source) return;\n\n const destinationId = toGroup ?? fromGroup ?? source.column.id;\n const destination = columns.find((column) => column.id === destinationId);\n if (!destination || destination.locked) return;\n\n const target = flat[to];\n const toIndex =\n target && target.column.id === destinationId\n ? target.cardIndex\n : destination.cards.length;\n\n onMove({\n cardId: source.card.id,\n fromColumn: source.column.id,\n toColumn: destinationId,\n toIndex,\n });\n },\n });\n\n /**\n * First flat index of each column.\n *\n * Derived instead of counted with a mutable `flatIndex++` during render: a\n * render-scoped counter mutated inside the map is exactly the pattern the React\n * Compiler rules reject, and for good reason — a partial or replayed render\n * would resume from a half-advanced counter.\n */\n const columnOffsets = useMemo(() => {\n const offsets: number[] = [];\n let start = 0;\n for (const column of columns) {\n offsets.push(start);\n start += column.cards.length;\n }\n return offsets;\n }, [columns]);\n\n return (\n <div className={cn(styles.board, className)} aria-label={label} ref={sortable.setContainer}>\n {columns.map((column, columnIndex) => {\n const isDropTarget = sortable.overGroup === column.id && !column.locked;\n return (\n <div\n key={column.id}\n className={cn(\n styles.column,\n isDropTarget && styles.columnActive,\n column.locked && styles.columnLocked,\n )}\n >\n <div className={styles.columnHeader}>\n <span className={styles.columnTitle}>{column.title}</span>\n <span className={styles.count}>{column.cards.length}</span>\n </div>\n\n <div\n className={styles.cards}\n {...(column.cards.length > 0 ? sortable.getListProps() : {})}\n aria-label={typeof column.title === \"string\" ? column.title : column.id}\n >\n {column.cards.map((card, cardIndex) => {\n const index = columnOffsets[columnIndex] + cardIndex;\n const isActive = sortable.activeIndex === index;\n const isOver = sortable.overIndex === index && !isActive;\n return (\n <div\n key={card.id}\n {...sortable.getItemProps(index, column.id)}\n className={cn(\n styles.card,\n isActive && styles.cardActive,\n isOver && styles.cardOver,\n )}\n >\n {renderCard ? renderCard(card, column) : card.content}\n </div>\n );\n })}\n\n {column.cards.length === 0 ? (\n <div\n {...sortable.getEmptyGroupProps(column.id)}\n className={styles.empty}\n >\n {emptyLabel}\n </div>\n ) : null}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\n/**\n * Apply a {@link KanbanMove} to a column list, returning new arrays.\n *\n * Exported because every consumer needs the same reducer.\n *\n * `toIndex` is the position of the card that was dropped **onto**, read from the\n * board as it looked before the move. Inserting at that same index *after* removing\n * the dragged card lands where the user aimed in both directions — moving down, the\n * removal shifts the target up by one and the insertion lands after it; moving up,\n * nothing shifted. Compensating for the shift (the \"obvious\" `toIndex - 1`) is what\n * turns a one-step move down into a no-op.\n *\n * @param columns - Current board.\n * @param move - The move reported by `onMove`.\n * @returns A new column list, or the same reference when the move cannot apply.\n */\nexport function applyKanbanMove(columns: KanbanColumn[], move: KanbanMove): KanbanColumn[] {\n const fromColumn = columns.find((column) => column.id === move.fromColumn);\n const card = fromColumn?.cards.find((candidate) => candidate.id === move.cardId);\n if (!fromColumn || !card) return columns;\n\n const insertAt = move.toIndex;\n\n return columns.map((column) => {\n if (column.id === move.fromColumn && column.id === move.toColumn) {\n const without = column.cards.filter((candidate) => candidate.id !== move.cardId);\n without.splice(insertAt, 0, card);\n return { ...column, cards: without };\n }\n if (column.id === move.fromColumn) {\n return { ...column, cards: column.cards.filter((c) => c.id !== move.cardId) };\n }\n if (column.id === move.toColumn) {\n const next = column.cards.slice();\n next.splice(insertAt, 0, card);\n return { ...column, cards: next };\n }\n return column;\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kanban.module.cjs","names":[],"sources":["../../../src/components/Kanban/Kanban.module.css"],"sourcesContent":[".board {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-4);\n overflow-x: auto;\n overscroll-behavior-x: contain;\n padding-bottom: var(--tempest-space-2);\n}\n\n.column {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-3);\n flex: 0 0 var(--tempest-kanban-column-width, 260px);\n min-width: 0;\n padding: var(--tempest-space-3);\n background-color: var(--tempest-surface);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n transition:\n background-color var(--tempest-duration-fast) var(--tempest-ease-out),\n border-color var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.columnActive {\n border-color: var(--tempest-primary);\n background-color: var(--tempest-primary-soft);\n}\n\n.columnLocked {\n opacity: 0.75;\n}\n\n.columnHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-2);\n}\n\n.columnTitle {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n}\n\n.count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding-inline: var(--tempest-space-2);\n border-radius: var(--tempest-radius-full);\n background-color: var(--tempest-surface-3);\n color: var(--tempest-text);\n font-size: var(--tempest-text-xs);\n font-variant-numeric: tabular-nums;\n}\n\n.cards {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-2);\n min-height: 48px;\n}\n\n.card {\n padding: var(--tempest-space-3);\n background-color: var(--tempest-bg);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n box-shadow: var(--tempest-shadow-xs);\n color: var(--tempest-text);\n font-size: var(--tempest-text-sm);\n cursor: grab;\n touch-action: none;\n user-select: none;\n}\n\n.card:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.cardActive {\n cursor: grabbing;\n opacity: 0.55;\n box-shadow: var(--tempest-shadow-md);\n}\n\n.cardOver {\n border-color: var(--tempest-primary);\n box-shadow: 0 -2px 0 0 var(--tempest-primary);\n}\n\n.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 48px;\n border: 1px dashed var(--tempest-border-strong);\n border-radius: var(--tempest-radius-md);\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-xs);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .column {\n transition: none;\n }\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Kanban.module.cjs","names":["board","column","columnActive","columnLocked","columnHeader","columnTitle","count","cards","card","cardActive","cardOver","empty","Kanban_module_default"],"sources":["../../../src/components/Kanban/Kanban.module.css"],"sourcesContent":[".board {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-4);\n overflow-x: auto;\n overscroll-behavior-x: contain;\n padding-bottom: var(--tempest-space-2);\n}\n\n.column {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-3);\n flex: 0 0 var(--tempest-kanban-column-width, 260px);\n min-width: 0;\n padding: var(--tempest-space-3);\n background-color: var(--tempest-surface);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n transition:\n background-color var(--tempest-duration-fast) var(--tempest-ease-out),\n border-color var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.columnActive {\n border-color: var(--tempest-primary);\n background-color: var(--tempest-primary-soft);\n}\n\n.columnLocked {\n opacity: 0.75;\n}\n\n.columnHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-2);\n}\n\n.columnTitle {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n}\n\n.count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding-inline: var(--tempest-space-2);\n border-radius: var(--tempest-radius-full);\n background-color: var(--tempest-surface-3);\n color: var(--tempest-text);\n font-size: var(--tempest-text-xs);\n font-variant-numeric: tabular-nums;\n}\n\n.cards {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-2);\n min-height: 48px;\n}\n\n.card {\n padding: var(--tempest-space-3);\n background-color: var(--tempest-bg);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n box-shadow: var(--tempest-shadow-xs);\n color: var(--tempest-text);\n font-size: var(--tempest-text-sm);\n cursor: grab;\n touch-action: none;\n user-select: none;\n}\n\n.card:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.cardActive {\n cursor: grabbing;\n opacity: 0.55;\n box-shadow: var(--tempest-shadow-md);\n}\n\n.cardOver {\n border-color: var(--tempest-primary);\n box-shadow: 0 -2px 0 0 var(--tempest-primary);\n}\n\n.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 48px;\n border: 1px dashed var(--tempest-border-strong);\n border-radius: var(--tempest-radius-md);\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-xs);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .column {\n transition: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kanban.module.js","names":[],"sources":["../../../src/components/Kanban/Kanban.module.css"],"sourcesContent":[".board {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-4);\n overflow-x: auto;\n overscroll-behavior-x: contain;\n padding-bottom: var(--tempest-space-2);\n}\n\n.column {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-3);\n flex: 0 0 var(--tempest-kanban-column-width, 260px);\n min-width: 0;\n padding: var(--tempest-space-3);\n background-color: var(--tempest-surface);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n transition:\n background-color var(--tempest-duration-fast) var(--tempest-ease-out),\n border-color var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.columnActive {\n border-color: var(--tempest-primary);\n background-color: var(--tempest-primary-soft);\n}\n\n.columnLocked {\n opacity: 0.75;\n}\n\n.columnHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-2);\n}\n\n.columnTitle {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n}\n\n.count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding-inline: var(--tempest-space-2);\n border-radius: var(--tempest-radius-full);\n background-color: var(--tempest-surface-3);\n color: var(--tempest-text);\n font-size: var(--tempest-text-xs);\n font-variant-numeric: tabular-nums;\n}\n\n.cards {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-2);\n min-height: 48px;\n}\n\n.card {\n padding: var(--tempest-space-3);\n background-color: var(--tempest-bg);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n box-shadow: var(--tempest-shadow-xs);\n color: var(--tempest-text);\n font-size: var(--tempest-text-sm);\n cursor: grab;\n touch-action: none;\n user-select: none;\n}\n\n.card:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.cardActive {\n cursor: grabbing;\n opacity: 0.55;\n box-shadow: var(--tempest-shadow-md);\n}\n\n.cardOver {\n border-color: var(--tempest-primary);\n box-shadow: 0 -2px 0 0 var(--tempest-primary);\n}\n\n.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 48px;\n border: 1px dashed var(--tempest-border-strong);\n border-radius: var(--tempest-radius-md);\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-xs);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .column {\n transition: none;\n }\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Kanban.module.js","names":["board","column","columnActive","columnLocked","columnHeader","columnTitle","count","cards","card","cardActive","cardOver","empty","Kanban_module_default"],"sources":["../../../src/components/Kanban/Kanban.module.css"],"sourcesContent":[".board {\n display: flex;\n align-items: flex-start;\n gap: var(--tempest-space-4);\n overflow-x: auto;\n overscroll-behavior-x: contain;\n padding-bottom: var(--tempest-space-2);\n}\n\n.column {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-3);\n flex: 0 0 var(--tempest-kanban-column-width, 260px);\n min-width: 0;\n padding: var(--tempest-space-3);\n background-color: var(--tempest-surface);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-lg);\n transition:\n background-color var(--tempest-duration-fast) var(--tempest-ease-out),\n border-color var(--tempest-duration-fast) var(--tempest-ease-out);\n}\n\n.columnActive {\n border-color: var(--tempest-primary);\n background-color: var(--tempest-primary-soft);\n}\n\n.columnLocked {\n opacity: 0.75;\n}\n\n.columnHeader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--tempest-space-2);\n}\n\n.columnTitle {\n font-size: var(--tempest-text-sm);\n font-weight: var(--tempest-weight-semibold);\n color: var(--tempest-text);\n}\n\n.count {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 22px;\n height: 22px;\n padding-inline: var(--tempest-space-2);\n border-radius: var(--tempest-radius-full);\n background-color: var(--tempest-surface-3);\n color: var(--tempest-text);\n font-size: var(--tempest-text-xs);\n font-variant-numeric: tabular-nums;\n}\n\n.cards {\n display: flex;\n flex-direction: column;\n gap: var(--tempest-space-2);\n min-height: 48px;\n}\n\n.card {\n padding: var(--tempest-space-3);\n background-color: var(--tempest-bg);\n border: 1px solid var(--tempest-border);\n border-radius: var(--tempest-radius-md);\n box-shadow: var(--tempest-shadow-xs);\n color: var(--tempest-text);\n font-size: var(--tempest-text-sm);\n cursor: grab;\n touch-action: none;\n user-select: none;\n}\n\n.card:focus-visible {\n outline: var(--tempest-focus-ring-width) solid var(--tempest-focus-ring-color);\n outline-offset: var(--tempest-focus-ring-offset);\n}\n\n.cardActive {\n cursor: grabbing;\n opacity: 0.55;\n box-shadow: var(--tempest-shadow-md);\n}\n\n.cardOver {\n border-color: var(--tempest-primary);\n box-shadow: 0 -2px 0 0 var(--tempest-primary);\n}\n\n.empty {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 48px;\n border: 1px dashed var(--tempest-border-strong);\n border-radius: var(--tempest-radius-md);\n color: var(--tempest-text-muted);\n font-size: var(--tempest-text-xs);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .column {\n transition: none;\n }\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.cjs","names":[],"sources":["../../../src/components/Kbd/Kbd.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kbd.module.css\";\n\nexport type KbdSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n size?: KbdSize;\n}\n\n/**\n * Renders a `<kbd>` styled like a keyboard key — useful for shortcut hints.\n * Compose multiple keys by rendering siblings: `<Kbd>Ctrl</Kbd> + <Kbd>K</Kbd>`.\n */\nexport function Kbd({ size = \"md\", className, children, ...props }: KbdProps) {\n return (\n <kbd className={cn(styles.kbd, styles[size], className)} {...props}>\n {children}\n </kbd>\n );\n}\n"],"mappings":"uGAcA,
|
|
1
|
+
{"version":3,"file":"Kbd.cjs","names":["cn","styles","require_cn","require_Kbd_module","react_jsx_runtime","Kbd","props","size","className"],"sources":["../../../src/components/Kbd/Kbd.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kbd.module.css\";\n\nexport type KbdSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n size?: KbdSize;\n}\n\n/**\n * Renders a `<kbd>` styled like a keyboard key — useful for shortcut hints.\n * Compose multiple keys by rendering siblings: `<Kbd>Ctrl</Kbd> + <Kbd>K</Kbd>`.\n */\nexport function Kbd({ size = \"md\", className, children, ...props }: KbdProps) {\n return (\n <kbd className={cn(styles.kbd, styles[size], className)} {...props}>\n {children}\n </kbd>\n );\n}\n"],"mappings":"A,uGAcA,SAAgBK,EAAI,CAAE,OAAO,KAAM,YAAW,WAAU,GAAGC,GAAmB,CAC1E,OACI,EAAAF,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWJ,EAAAA,GAAGC,EAAAA,QAAO,IAAKA,EAAAA,QAAOM,GAAOC,CAAS,EAAG,GAAIF,EACxD,UACA,CAAA,CAEb,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.js","names":[],"sources":["../../../src/components/Kbd/Kbd.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kbd.module.css\";\n\nexport type KbdSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n size?: KbdSize;\n}\n\n/**\n * Renders a `<kbd>` styled like a keyboard key — useful for shortcut hints.\n * Compose multiple keys by rendering siblings: `<Kbd>Ctrl</Kbd> + <Kbd>K</Kbd>`.\n */\nexport function Kbd({ size = \"md\", className, children, ...props }: KbdProps) {\n return (\n <kbd className={cn(styles.kbd, styles[size], className)} {...props}>\n {children}\n </kbd>\n );\n}\n"],"mappings":";;;;AAcA,
|
|
1
|
+
{"version":3,"file":"Kbd.js","names":["styles","Kbd_module_default","Kbd","props","cn","size","className"],"sources":["../../../src/components/Kbd/Kbd.tsx"],"sourcesContent":["import type { HTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Kbd.module.css\";\n\nexport type KbdSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface KbdProps extends HTMLAttributes<HTMLElement> {\n size?: KbdSize;\n}\n\n/**\n * Renders a `<kbd>` styled like a keyboard key — useful for shortcut hints.\n * Compose multiple keys by rendering siblings: `<Kbd>Ctrl</Kbd> + <Kbd>K</Kbd>`.\n */\nexport function Kbd({ size = \"md\", className, children, ...props }: KbdProps) {\n return (\n <kbd className={cn(styles.kbd, styles[size], className)} {...props}>\n {children}\n </kbd>\n );\n}\n"],"mappings":";;;;AAcA,SAAgBE,EAAI,EAAE,UAAO,MAAM,cAAW,aAAU,GAAGC,KAAmB;CAC1E,OACI,kBAAC,OAAD;EAAK,WAAWC,EAAGJ,EAAO,KAAKA,EAAOK,IAAOC,CAAS;EAAG,GAAIH;EACxD;CACA,CAAA;AAEb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.module.cjs","names":[],"sources":["../../../src/components/Kbd/Kbd.module.css"],"sourcesContent":[".kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.6em;\n padding: 0 var(--tempest-space-2);\n border: 1px solid var(--tempest-border-strong);\n border-bottom-width: 2px;\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n line-height: var(--tempest-leading-snug);\n box-shadow: var(--tempest-shadow-xs);\n white-space: nowrap;\n}\n\n.sm {\n font-size: var(--tempest-text-2xs);\n padding: 0 var(--tempest-space-1);\n}\n\n.md {\n font-size: var(--tempest-text-xs);\n}\n\n.lg {\n font-size: var(--tempest-text-sm);\n padding: 0 var(--tempest-space-2);\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Kbd.module.cjs","names":["kbd","sm","md","lg","Kbd_module_default"],"sources":["../../../src/components/Kbd/Kbd.module.css"],"sourcesContent":[".kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.6em;\n padding: 0 var(--tempest-space-2);\n border: 1px solid var(--tempest-border-strong);\n border-bottom-width: 2px;\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n line-height: var(--tempest-leading-snug);\n box-shadow: var(--tempest-shadow-xs);\n white-space: nowrap;\n}\n\n.sm {\n font-size: var(--tempest-text-2xs);\n padding: 0 var(--tempest-space-1);\n}\n\n.md {\n font-size: var(--tempest-text-xs);\n}\n\n.lg {\n font-size: var(--tempest-text-sm);\n padding: 0 var(--tempest-space-2);\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Kbd.module.js","names":[],"sources":["../../../src/components/Kbd/Kbd.module.css"],"sourcesContent":[".kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.6em;\n padding: 0 var(--tempest-space-2);\n border: 1px solid var(--tempest-border-strong);\n border-bottom-width: 2px;\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n line-height: var(--tempest-leading-snug);\n box-shadow: var(--tempest-shadow-xs);\n white-space: nowrap;\n}\n\n.sm {\n font-size: var(--tempest-text-2xs);\n padding: 0 var(--tempest-space-1);\n}\n\n.md {\n font-size: var(--tempest-text-xs);\n}\n\n.lg {\n font-size: var(--tempest-text-sm);\n padding: 0 var(--tempest-space-2);\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Kbd.module.js","names":["kbd","sm","md","lg","Kbd_module_default"],"sources":["../../../src/components/Kbd/Kbd.module.css"],"sourcesContent":[".kbd {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 1.6em;\n padding: 0 var(--tempest-space-2);\n border: 1px solid var(--tempest-border-strong);\n border-bottom-width: 2px;\n border-radius: var(--tempest-radius-sm);\n background-color: var(--tempest-surface);\n color: var(--tempest-text);\n font-family: var(--tempest-font-mono);\n font-size: var(--tempest-text-xs);\n font-weight: var(--tempest-weight-semibold);\n line-height: var(--tempest-leading-snug);\n box-shadow: var(--tempest-shadow-xs);\n white-space: nowrap;\n}\n\n.sm {\n font-size: var(--tempest-text-2xs);\n padding: 0 var(--tempest-space-1);\n}\n\n.md {\n font-size: var(--tempest-text-xs);\n}\n\n.lg {\n font-size: var(--tempest-text-sm);\n padding: 0 var(--tempest-space-2);\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Label.cjs","names":[],"sources":["../../../src/components/Label/Label.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { LabelHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Label.module.css\";\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** When `true` appends a danger-colored asterisk marking the field as required. */\n required?: boolean;\n}\n\n/**\n * A form `<label>`. Associate it with a control via `htmlFor`. When `required`\n * is set, a decorative asterisk (`aria-hidden`) is appended.\n *\n * @param props - {@link LabelProps}.\n * @returns The label element.\n */\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n { required = false, className, children, ...props },\n ref,\n) {\n return (\n <label ref={ref} className={cn(styles.label, className)} {...props}>\n {children}\n {required && (\n <span className={styles.asterisk} aria-hidden>\n *\n </span>\n )}\n </label>\n );\n});\n"],"mappings":"4HAiBA,
|
|
1
|
+
{"version":3,"file":"Label.cjs","names":["forwardRef","cn","styles","require_cn","require_Label_module","react","react_jsx_runtime","Label","props","className","children","required"],"sources":["../../../src/components/Label/Label.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { LabelHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Label.module.css\";\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** When `true` appends a danger-colored asterisk marking the field as required. */\n required?: boolean;\n}\n\n/**\n * A form `<label>`. Associate it with a control via `htmlFor`. When `required`\n * is set, a decorative asterisk (`aria-hidden`) is appended.\n *\n * @param props - {@link LabelProps}.\n * @returns The label element.\n */\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n { required = false, className, children, ...props },\n ref,\n) {\n return (\n <label ref={ref} className={cn(styles.label, className)} {...props}>\n {children}\n {required && (\n <span className={styles.asterisk} aria-hidden>\n *\n </span>\n )}\n </label>\n );\n});\n"],"mappings":"A,4HAiBA,IAAaO,GAAA,EAAQP,EAAAA,WAAAA,CAAyC,SAC1D,CAAE,WAAW,GAAO,YAAW,WAAU,GAAGQ,GAC5C,EACF,CACE,OACI,EAAAF,EAAA,KAAA,CAAC,QAAD,CAAY,MAAK,UAAWL,EAAAA,GAAGC,EAAAA,QAAO,MAAOO,CAAS,EAAG,GAAID,EAA7D,SAAA,CACKE,EACAC,IACG,EAAAL,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWJ,EAAAA,QAAO,SAAU,cAAA,GAAY,SAAA,GAExC,CAAA,CAEP,C,EAEf,CAAC,E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Label.js","names":[],"sources":["../../../src/components/Label/Label.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { LabelHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Label.module.css\";\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** When `true` appends a danger-colored asterisk marking the field as required. */\n required?: boolean;\n}\n\n/**\n * A form `<label>`. Associate it with a control via `htmlFor`. When `required`\n * is set, a decorative asterisk (`aria-hidden`) is appended.\n *\n * @param props - {@link LabelProps}.\n * @returns The label element.\n */\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n { required = false, className, children, ...props },\n ref,\n) {\n return (\n <label ref={ref} className={cn(styles.label, className)} {...props}>\n {children}\n {required && (\n <span className={styles.asterisk} aria-hidden>\n *\n </span>\n )}\n </label>\n );\n});\n"],"mappings":";;;;;AAiBA,
|
|
1
|
+
{"version":3,"file":"Label.js","names":["styles","Label_module_default","Label","forwardRef","props","cn","className","children","required"],"sources":["../../../src/components/Label/Label.tsx"],"sourcesContent":["import { forwardRef } from \"react\";\nimport type { LabelHTMLAttributes } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport styles from \"./Label.module.css\";\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n /** When `true` appends a danger-colored asterisk marking the field as required. */\n required?: boolean;\n}\n\n/**\n * A form `<label>`. Associate it with a control via `htmlFor`. When `required`\n * is set, a decorative asterisk (`aria-hidden`) is appended.\n *\n * @param props - {@link LabelProps}.\n * @returns The label element.\n */\nexport const Label = forwardRef<HTMLLabelElement, LabelProps>(function Label(\n { required = false, className, children, ...props },\n ref,\n) {\n return (\n <label ref={ref} className={cn(styles.label, className)} {...props}>\n {children}\n {required && (\n <span className={styles.asterisk} aria-hidden>\n *\n </span>\n )}\n </label>\n );\n});\n"],"mappings":";;;;;AAiBA,IAAaE,IAAQC,EAAyC,SAC1D,EAAE,cAAW,IAAO,cAAW,aAAU,GAAGC,KAC5C,GACF;CACE,OACI,kBAAC,SAAD;EAAY;EAAK,WAAWC,EAAGL,EAAO,OAAOM,CAAS;EAAG,GAAIF;EAA7D,UAAA,CACKG,GACAC,KACG,kBAAC,QAAD;GAAM,WAAWR,EAAO;GAAU,eAAA;GAAY,UAAA;EAExC,CAAA,CAEP;;AAEf,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Label.module.cjs","names":[],"sources":["../../../src/components/Label/Label.module.css"],"sourcesContent":[".label {\n display: inline-flex;\n align-items: center;\n gap: var(--tempest-space-1);\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}\n\n.asterisk {\n color: var(--tempest-danger);\n font-weight: var(--tempest-weight-semibold);\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Label.module.cjs","names":["label","asterisk","Label_module_default"],"sources":["../../../src/components/Label/Label.module.css"],"sourcesContent":[".label {\n display: inline-flex;\n align-items: center;\n gap: var(--tempest-space-1);\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}\n\n.asterisk {\n color: var(--tempest-danger);\n font-weight: var(--tempest-weight-semibold);\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Label.module.js","names":[],"sources":["../../../src/components/Label/Label.module.css"],"sourcesContent":[".label {\n display: inline-flex;\n align-items: center;\n gap: var(--tempest-space-1);\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}\n\n.asterisk {\n color: var(--tempest-danger);\n font-weight: var(--tempest-weight-semibold);\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Label.module.js","names":["label","asterisk","Label_module_default"],"sources":["../../../src/components/Label/Label.module.css"],"sourcesContent":[".label {\n display: inline-flex;\n align-items: center;\n gap: var(--tempest-space-1);\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}\n\n.asterisk {\n color: var(--tempest-danger);\n font-weight: var(--tempest-weight-semibold);\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.cjs","names":[],"sources":["../../../src/components/Layout/Layout.tsx"],"sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./Layout.module.css\";\n\nexport type ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n size?: ContainerSize;\n}\n\n/**\n * Page-level horizontal container with a max-width preset and responsive\n * side padding (`space-4` mobile / `space-6` tablet / `space-8` desktop).\n */\nexport function Container({ size = \"lg\", className, children, ...props }: ContainerProps) {\n return (\n <div className={cn(styles.container, styles[size], className)} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Responsive value — either a single value applied at all breakpoints, or\n * an object with `mobile` / `tablet` / `desktop` overrides. Apps can mix\n * any combination; `mobile` is the base, `tablet` / `desktop` cascade up.\n */\nexport type ResponsiveValue<T> =\n | T\n | {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n };\n\nfunction isResponsiveObject<T>(value: ResponsiveValue<T>): value is {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n} {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (\"mobile\" in value || \"tablet\" in value || \"desktop\" in value)\n );\n}\n\nfunction pickResponsive<T>(\n value: ResponsiveValue<T> | undefined,\n device: \"mobile\" | \"tablet\" | \"desktop\",\n): T | undefined {\n if (value === undefined) return undefined;\n if (!isResponsiveObject(value)) return value;\n if (device === \"desktop\") return value.desktop ?? value.tablet ?? value.mobile;\n if (device === \"tablet\") return value.tablet ?? value.mobile ?? value.desktop;\n return value.mobile ?? value.tablet ?? value.desktop;\n}\n\nexport type StackAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type StackJustify = \"start\" | \"center\" | \"end\" | \"between\";\nexport type StackDirection = \"vertical\" | \"horizontal\";\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Direction. Accepts responsive object — e.g. `{ mobile: \"vertical\", desktop: \"horizontal\" }`. */\n direction?: ResponsiveValue<StackDirection>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n align?: StackAlign;\n justify?: StackJustify;\n wrap?: boolean;\n children?: ReactNode;\n}\n\nfunction resolveGap(gap: number | string | undefined): string | undefined {\n if (gap === undefined) return undefined;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction deviceFromBreakpoint(\n isMobile: boolean,\n isTablet: boolean,\n): \"mobile\" | \"tablet\" | \"desktop\" {\n if (isMobile) return \"mobile\";\n if (isTablet) return \"tablet\";\n return \"desktop\";\n}\n\n/** Flex-based vertical or horizontal stack with a numeric `gap`. */\nexport function Stack({\n direction = \"vertical\",\n gap = 2,\n align,\n justify,\n wrap = false,\n className,\n style,\n children,\n ...props\n}: StackProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const finalDirection: StackDirection = pickResponsive(direction, device) ?? \"vertical\";\n const finalGap = resolveGap(pickResponsive(gap, device));\n const finalStyle: CSSProperties = { gap: finalGap, ...style };\n const justifyClass =\n justify === \"between\"\n ? styles.justifyBetween\n : justify === \"center\"\n ? styles.justifyCenter\n : justify === \"end\"\n ? styles.justifyEnd\n : justify === \"start\"\n ? styles.justifyStart\n : undefined;\n return (\n <div\n className={cn(\n styles.stack,\n finalDirection === \"vertical\" ? styles.vertical : styles.horizontal,\n align && styles[align],\n justifyClass,\n wrap && styles.wrap,\n className,\n )}\n style={finalStyle}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Number of columns or a custom `grid-template-columns` value. Accepts responsive object. */\n columns?: ResponsiveValue<number | string>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n children?: ReactNode;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string | undefined {\n if (columns === undefined) return undefined;\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\n/** Simple CSS-Grid wrapper for equal-width or custom column layouts. */\nexport function Grid({ columns = 2, gap = 4, className, style, children, ...props }: GridProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const templateColumns = resolveColumns(pickResponsive(columns, device));\n const finalGap = resolveGap(pickResponsive(gap, device));\n return (\n <div\n className={cn(styles.grid, className)}\n style={{ gridTemplateColumns: templateColumns, gap: finalGap, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"sJAeA,
|
|
1
|
+
{"version":3,"file":"Layout.cjs","names":["cn","styles","useBreakpoint","require_cn","require_use_breakpoint","require_Layout_module","react_jsx_runtime","Container","props","size","className","isResponsiveObject","value","pickResponsive","device","resolveGap","gap","deviceFromBreakpoint","isMobile","isTablet","Stack","finalDirection","direction","finalStyle","style","justifyClass","justify","align","wrap","resolveColumns","columns","Grid","templateColumns","finalGap"],"sources":["../../../src/components/Layout/Layout.tsx"],"sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./Layout.module.css\";\n\nexport type ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n size?: ContainerSize;\n}\n\n/**\n * Page-level horizontal container with a max-width preset and responsive\n * side padding (`space-4` mobile / `space-6` tablet / `space-8` desktop).\n */\nexport function Container({ size = \"lg\", className, children, ...props }: ContainerProps) {\n return (\n <div className={cn(styles.container, styles[size], className)} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Responsive value — either a single value applied at all breakpoints, or\n * an object with `mobile` / `tablet` / `desktop` overrides. Apps can mix\n * any combination; `mobile` is the base, `tablet` / `desktop` cascade up.\n */\nexport type ResponsiveValue<T> =\n | T\n | {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n };\n\nfunction isResponsiveObject<T>(value: ResponsiveValue<T>): value is {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n} {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (\"mobile\" in value || \"tablet\" in value || \"desktop\" in value)\n );\n}\n\nfunction pickResponsive<T>(\n value: ResponsiveValue<T> | undefined,\n device: \"mobile\" | \"tablet\" | \"desktop\",\n): T | undefined {\n if (value === undefined) return undefined;\n if (!isResponsiveObject(value)) return value;\n if (device === \"desktop\") return value.desktop ?? value.tablet ?? value.mobile;\n if (device === \"tablet\") return value.tablet ?? value.mobile ?? value.desktop;\n return value.mobile ?? value.tablet ?? value.desktop;\n}\n\nexport type StackAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type StackJustify = \"start\" | \"center\" | \"end\" | \"between\";\nexport type StackDirection = \"vertical\" | \"horizontal\";\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Direction. Accepts responsive object — e.g. `{ mobile: \"vertical\", desktop: \"horizontal\" }`. */\n direction?: ResponsiveValue<StackDirection>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n align?: StackAlign;\n justify?: StackJustify;\n wrap?: boolean;\n children?: ReactNode;\n}\n\nfunction resolveGap(gap: number | string | undefined): string | undefined {\n if (gap === undefined) return undefined;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction deviceFromBreakpoint(\n isMobile: boolean,\n isTablet: boolean,\n): \"mobile\" | \"tablet\" | \"desktop\" {\n if (isMobile) return \"mobile\";\n if (isTablet) return \"tablet\";\n return \"desktop\";\n}\n\n/** Flex-based vertical or horizontal stack with a numeric `gap`. */\nexport function Stack({\n direction = \"vertical\",\n gap = 2,\n align,\n justify,\n wrap = false,\n className,\n style,\n children,\n ...props\n}: StackProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const finalDirection: StackDirection = pickResponsive(direction, device) ?? \"vertical\";\n const finalGap = resolveGap(pickResponsive(gap, device));\n const finalStyle: CSSProperties = { gap: finalGap, ...style };\n const justifyClass =\n justify === \"between\"\n ? styles.justifyBetween\n : justify === \"center\"\n ? styles.justifyCenter\n : justify === \"end\"\n ? styles.justifyEnd\n : justify === \"start\"\n ? styles.justifyStart\n : undefined;\n return (\n <div\n className={cn(\n styles.stack,\n finalDirection === \"vertical\" ? styles.vertical : styles.horizontal,\n align && styles[align],\n justifyClass,\n wrap && styles.wrap,\n className,\n )}\n style={finalStyle}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Number of columns or a custom `grid-template-columns` value. Accepts responsive object. */\n columns?: ResponsiveValue<number | string>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n children?: ReactNode;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string | undefined {\n if (columns === undefined) return undefined;\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\n/** Simple CSS-Grid wrapper for equal-width or custom column layouts. */\nexport function Grid({ columns = 2, gap = 4, className, style, children, ...props }: GridProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const templateColumns = resolveColumns(pickResponsive(columns, device));\n const finalGap = resolveGap(pickResponsive(gap, device));\n return (\n <div\n className={cn(styles.grid, className)}\n style={{ gridTemplateColumns: templateColumns, gap: finalGap, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"A,sJAeA,SAAgBO,EAAU,CAAE,OAAO,KAAM,YAAW,WAAU,GAAGC,GAAyB,CACtF,OACI,EAAAF,EAAA,IAAA,CAAC,MAAD,CAAK,UAAWN,EAAAA,GAAGC,EAAAA,QAAO,UAAWA,EAAAA,QAAOQ,GAAOC,CAAS,EAAG,GAAIF,EAC9D,UACA,CAAA,CAEb,CAeA,SAASG,EAAsB,EAI7B,CACE,OACI,OAAOC,GAAU,YACjBA,IACC,WAAYA,GAAS,WAAYA,GAAS,YAAaA,EAEhE,CAEA,SAASC,EACL,EACA,EACa,CACb,GAAID,IAAU,IAAA,GAId,OAHKD,EAAmBC,CAAK,EACzBE,IAAW,UAAkBF,EAAM,SAAWA,EAAM,QAAUA,EAAM,OACpEE,IAAW,SAAiBF,EAAM,QAAUA,EAAM,QAAUA,EAAM,QAC/DA,EAAM,QAAUA,EAAM,QAAUA,EAAM,QAHNA,CAI3C,CAiBA,SAASG,EAAW,EAAsD,CACtE,GAAIC,IAAQ,IAAA,GACZ,OAAO,OAAOA,GAAQ,SAAW,GAAGA,EAAM,EAAE,IAAMA,CACtD,CAEA,SAASC,EACL,EACA,EAC+B,CAG/B,OAFIC,EAAiB,SACjBC,EAAiB,SACd,SACX,CAGA,SAAgBC,EAAM,CAClB,YAAY,WACZ,MAAM,EACN,QACA,UACA,OAAO,GACP,YACA,QACA,WACA,GAAGZ,GACQ,CACX,GAAM,CAAE,WAAU,YAAaN,EAAAA,cAAc,EACvCY,EAASG,EAAqBC,EAAUC,CAAQ,EAChDE,EAAiCR,EAAeS,EAAWR,CAAM,GAAK,WAEtES,EAA4B,CAAE,IADnBR,EAAWF,EAAeG,EAAKF,CAAM,CACb,EAAU,GAAGU,CAAM,EACtDC,EACFC,IAAY,UACNzB,EAAAA,QAAO,eACPyB,IAAY,SACVzB,EAAAA,QAAO,cACPyB,IAAY,MACVzB,EAAAA,QAAO,WACPyB,IAAY,QACVzB,EAAAA,QAAO,aACP,IAAA,GAChB,OACI,EAAAK,EAAA,IAAA,CAAC,MAAD,CACI,UAAWN,EAAAA,GACPC,EAAAA,QAAO,MACPoB,IAAmB,WAAapB,EAAAA,QAAO,SAAWA,EAAAA,QAAO,WACzD0B,GAAS1B,EAAAA,QAAO0B,GAChBF,EACAG,GAAQ3B,EAAAA,QAAO,KACfS,CACJ,EACA,MAAOa,EACP,GAAIf,EAEH,UACA,CAAA,CAEb,CAUA,SAASqB,EAAe,EAA0D,CAC9E,GAAIC,IAAY,IAAA,GAChB,OAAO,OAAOA,GAAY,SAAW,UAAUA,EAAQ,mBAAqBA,CAChF,CAGA,SAAgBC,EAAK,CAAE,UAAU,EAAG,MAAM,EAAG,YAAW,QAAO,WAAU,GAAGvB,GAAoB,CAC5F,GAAM,CAAE,WAAU,YAAaN,EAAAA,cAAc,EACvCY,EAASG,EAAqBC,EAAUC,CAAQ,EAChDa,EAAkBH,EAAehB,EAAeiB,EAAShB,CAAM,CAAC,EAChEmB,EAAWlB,EAAWF,EAAeG,EAAKF,CAAM,CAAC,EACvD,OACI,EAAAR,EAAA,IAAA,CAAC,MAAD,CACI,UAAWN,EAAAA,GAAGC,EAAAA,QAAO,KAAMS,CAAS,EACpC,MAAO,CAAE,oBAAqBsB,EAAiB,IAAKC,EAAU,GAAGT,CAAM,EACvE,GAAIhB,EAEH,UACA,CAAA,CAEb,C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.js","names":[],"sources":["../../../src/components/Layout/Layout.tsx"],"sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./Layout.module.css\";\n\nexport type ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n size?: ContainerSize;\n}\n\n/**\n * Page-level horizontal container with a max-width preset and responsive\n * side padding (`space-4` mobile / `space-6` tablet / `space-8` desktop).\n */\nexport function Container({ size = \"lg\", className, children, ...props }: ContainerProps) {\n return (\n <div className={cn(styles.container, styles[size], className)} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Responsive value — either a single value applied at all breakpoints, or\n * an object with `mobile` / `tablet` / `desktop` overrides. Apps can mix\n * any combination; `mobile` is the base, `tablet` / `desktop` cascade up.\n */\nexport type ResponsiveValue<T> =\n | T\n | {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n };\n\nfunction isResponsiveObject<T>(value: ResponsiveValue<T>): value is {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n} {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (\"mobile\" in value || \"tablet\" in value || \"desktop\" in value)\n );\n}\n\nfunction pickResponsive<T>(\n value: ResponsiveValue<T> | undefined,\n device: \"mobile\" | \"tablet\" | \"desktop\",\n): T | undefined {\n if (value === undefined) return undefined;\n if (!isResponsiveObject(value)) return value;\n if (device === \"desktop\") return value.desktop ?? value.tablet ?? value.mobile;\n if (device === \"tablet\") return value.tablet ?? value.mobile ?? value.desktop;\n return value.mobile ?? value.tablet ?? value.desktop;\n}\n\nexport type StackAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type StackJustify = \"start\" | \"center\" | \"end\" | \"between\";\nexport type StackDirection = \"vertical\" | \"horizontal\";\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Direction. Accepts responsive object — e.g. `{ mobile: \"vertical\", desktop: \"horizontal\" }`. */\n direction?: ResponsiveValue<StackDirection>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n align?: StackAlign;\n justify?: StackJustify;\n wrap?: boolean;\n children?: ReactNode;\n}\n\nfunction resolveGap(gap: number | string | undefined): string | undefined {\n if (gap === undefined) return undefined;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction deviceFromBreakpoint(\n isMobile: boolean,\n isTablet: boolean,\n): \"mobile\" | \"tablet\" | \"desktop\" {\n if (isMobile) return \"mobile\";\n if (isTablet) return \"tablet\";\n return \"desktop\";\n}\n\n/** Flex-based vertical or horizontal stack with a numeric `gap`. */\nexport function Stack({\n direction = \"vertical\",\n gap = 2,\n align,\n justify,\n wrap = false,\n className,\n style,\n children,\n ...props\n}: StackProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const finalDirection: StackDirection = pickResponsive(direction, device) ?? \"vertical\";\n const finalGap = resolveGap(pickResponsive(gap, device));\n const finalStyle: CSSProperties = { gap: finalGap, ...style };\n const justifyClass =\n justify === \"between\"\n ? styles.justifyBetween\n : justify === \"center\"\n ? styles.justifyCenter\n : justify === \"end\"\n ? styles.justifyEnd\n : justify === \"start\"\n ? styles.justifyStart\n : undefined;\n return (\n <div\n className={cn(\n styles.stack,\n finalDirection === \"vertical\" ? styles.vertical : styles.horizontal,\n align && styles[align],\n justifyClass,\n wrap && styles.wrap,\n className,\n )}\n style={finalStyle}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Number of columns or a custom `grid-template-columns` value. Accepts responsive object. */\n columns?: ResponsiveValue<number | string>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n children?: ReactNode;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string | undefined {\n if (columns === undefined) return undefined;\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\n/** Simple CSS-Grid wrapper for equal-width or custom column layouts. */\nexport function Grid({ columns = 2, gap = 4, className, style, children, ...props }: GridProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const templateColumns = resolveColumns(pickResponsive(columns, device));\n const finalGap = resolveGap(pickResponsive(gap, device));\n return (\n <div\n className={cn(styles.grid, className)}\n style={{ gridTemplateColumns: templateColumns, gap: finalGap, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;AAeA,
|
|
1
|
+
{"version":3,"file":"Layout.js","names":["styles","Layout_module_default","Container","props","cn","size","className","isResponsiveObject","value","pickResponsive","device","resolveGap","gap","deviceFromBreakpoint","isMobile","isTablet","Stack","useBreakpoint","finalDirection","direction","finalStyle","style","justifyClass","justify","align","wrap","resolveColumns","columns","Grid","templateColumns","finalGap"],"sources":["../../../src/components/Layout/Layout.tsx"],"sourcesContent":["import type { CSSProperties, HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"@/utils/cn\";\nimport { useBreakpoint } from \"@/hooks/use-breakpoint\";\nimport styles from \"./Layout.module.css\";\n\nexport type ContainerSize = \"sm\" | \"md\" | \"lg\" | \"xl\" | \"full\";\n\nexport interface ContainerProps extends HTMLAttributes<HTMLDivElement> {\n size?: ContainerSize;\n}\n\n/**\n * Page-level horizontal container with a max-width preset and responsive\n * side padding (`space-4` mobile / `space-6` tablet / `space-8` desktop).\n */\nexport function Container({ size = \"lg\", className, children, ...props }: ContainerProps) {\n return (\n <div className={cn(styles.container, styles[size], className)} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Responsive value — either a single value applied at all breakpoints, or\n * an object with `mobile` / `tablet` / `desktop` overrides. Apps can mix\n * any combination; `mobile` is the base, `tablet` / `desktop` cascade up.\n */\nexport type ResponsiveValue<T> =\n | T\n | {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n };\n\nfunction isResponsiveObject<T>(value: ResponsiveValue<T>): value is {\n mobile?: T;\n tablet?: T;\n desktop?: T;\n} {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (\"mobile\" in value || \"tablet\" in value || \"desktop\" in value)\n );\n}\n\nfunction pickResponsive<T>(\n value: ResponsiveValue<T> | undefined,\n device: \"mobile\" | \"tablet\" | \"desktop\",\n): T | undefined {\n if (value === undefined) return undefined;\n if (!isResponsiveObject(value)) return value;\n if (device === \"desktop\") return value.desktop ?? value.tablet ?? value.mobile;\n if (device === \"tablet\") return value.tablet ?? value.mobile ?? value.desktop;\n return value.mobile ?? value.tablet ?? value.desktop;\n}\n\nexport type StackAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type StackJustify = \"start\" | \"center\" | \"end\" | \"between\";\nexport type StackDirection = \"vertical\" | \"horizontal\";\n\nexport interface StackProps extends HTMLAttributes<HTMLDivElement> {\n /** Direction. Accepts responsive object — e.g. `{ mobile: \"vertical\", desktop: \"horizontal\" }`. */\n direction?: ResponsiveValue<StackDirection>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n align?: StackAlign;\n justify?: StackJustify;\n wrap?: boolean;\n children?: ReactNode;\n}\n\nfunction resolveGap(gap: number | string | undefined): string | undefined {\n if (gap === undefined) return undefined;\n return typeof gap === \"number\" ? `${gap * 4}px` : gap;\n}\n\nfunction deviceFromBreakpoint(\n isMobile: boolean,\n isTablet: boolean,\n): \"mobile\" | \"tablet\" | \"desktop\" {\n if (isMobile) return \"mobile\";\n if (isTablet) return \"tablet\";\n return \"desktop\";\n}\n\n/** Flex-based vertical or horizontal stack with a numeric `gap`. */\nexport function Stack({\n direction = \"vertical\",\n gap = 2,\n align,\n justify,\n wrap = false,\n className,\n style,\n children,\n ...props\n}: StackProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const finalDirection: StackDirection = pickResponsive(direction, device) ?? \"vertical\";\n const finalGap = resolveGap(pickResponsive(gap, device));\n const finalStyle: CSSProperties = { gap: finalGap, ...style };\n const justifyClass =\n justify === \"between\"\n ? styles.justifyBetween\n : justify === \"center\"\n ? styles.justifyCenter\n : justify === \"end\"\n ? styles.justifyEnd\n : justify === \"start\"\n ? styles.justifyStart\n : undefined;\n return (\n <div\n className={cn(\n styles.stack,\n finalDirection === \"vertical\" ? styles.vertical : styles.horizontal,\n align && styles[align],\n justifyClass,\n wrap && styles.wrap,\n className,\n )}\n style={finalStyle}\n {...props}\n >\n {children}\n </div>\n );\n}\n\nexport interface GridProps extends HTMLAttributes<HTMLDivElement> {\n /** Number of columns or a custom `grid-template-columns` value. Accepts responsive object. */\n columns?: ResponsiveValue<number | string>;\n /** Gap as a CSS length. Numbers map to a multiple of the 4px scale. Accepts responsive object. */\n gap?: ResponsiveValue<number | string>;\n children?: ReactNode;\n}\n\nfunction resolveColumns(columns: number | string | undefined): string | undefined {\n if (columns === undefined) return undefined;\n return typeof columns === \"number\" ? `repeat(${columns}, minmax(0, 1fr))` : columns;\n}\n\n/** Simple CSS-Grid wrapper for equal-width or custom column layouts. */\nexport function Grid({ columns = 2, gap = 4, className, style, children, ...props }: GridProps) {\n const { isMobile, isTablet } = useBreakpoint();\n const device = deviceFromBreakpoint(isMobile, isTablet);\n const templateColumns = resolveColumns(pickResponsive(columns, device));\n const finalGap = resolveGap(pickResponsive(gap, device));\n return (\n <div\n className={cn(styles.grid, className)}\n style={{ gridTemplateColumns: templateColumns, gap: finalGap, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;AAeA,SAAgBE,EAAU,EAAE,UAAO,MAAM,cAAW,aAAU,GAAGC,KAAyB;CACtF,OACI,kBAAC,OAAD;EAAK,WAAWC,EAAGJ,EAAO,WAAWA,EAAOK,IAAOC,CAAS;EAAG,GAAIH;EAC9D;CACA,CAAA;AAEb;AAeA,SAASI,EAAsB,GAI7B;CACE,OACI,OAAOC,KAAU,cACjBA,MACC,YAAYA,KAAS,YAAYA,KAAS,aAAaA;AAEhE;AAEA,SAASC,EACL,GACA,GACa;CACb,IAAID,MAAU,KAAA,GAId,OAHKD,EAAmBC,CAAK,IACzBE,MAAW,YAAkBF,EAAM,WAAWA,EAAM,UAAUA,EAAM,SACpEE,MAAW,WAAiBF,EAAM,UAAUA,EAAM,UAAUA,EAAM,UAC/DA,EAAM,UAAUA,EAAM,UAAUA,EAAM,UAHNA;AAI3C;AAiBA,SAASG,EAAW,GAAsD;CACtE,IAAIC,MAAQ,KAAA,GACZ,OAAO,OAAOA,KAAQ,WAAW,GAAGA,IAAM,EAAE,MAAMA;AACtD;AAEA,SAASC,EACL,GACA,GAC+B;CAG/B,OAFIC,IAAiB,WACjBC,IAAiB,WACd;AACX;AAGA,SAAgBC,EAAM,EAClB,eAAY,YACZ,SAAM,GACN,UACA,YACA,UAAO,IACP,cACA,UACA,aACA,GAAGb,KACQ;CACX,IAAM,EAAE,aAAU,gBAAac,EAAc,GACvCP,IAASG,EAAqBC,GAAUC,CAAQ,GAChDG,IAAiCT,EAAeU,GAAWT,CAAM,KAAK,YAEtEU,IAA4B;EAAE,KADnBT,EAAWF,EAAeG,GAAKF,CAAM,CACb;EAAU,GAAGW;CAAM,GACtDC,IACFC,MAAY,YACNvB,EAAO,iBACPuB,MAAY,WACVvB,EAAO,gBACPuB,MAAY,QACVvB,EAAO,aACPuB,MAAY,UACVvB,EAAO,eACP,KAAA;CAChB,OACI,kBAAC,OAAD;EACI,WAAWI,EACPJ,EAAO,OACPkB,MAAmB,aAAalB,EAAO,WAAWA,EAAO,YACzDwB,KAASxB,EAAOwB,IAChBF,GACAG,KAAQzB,EAAO,MACfM,CACJ;EACA,OAAOc;EACP,GAAIjB;EAEH;CACA,CAAA;AAEb;AAUA,SAASuB,EAAe,GAA0D;CAC9E,IAAIC,MAAY,KAAA,GAChB,OAAO,OAAOA,KAAY,WAAW,UAAUA,EAAQ,qBAAqBA;AAChF;AAGA,SAAgBC,EAAK,EAAE,aAAU,GAAG,SAAM,GAAG,cAAW,UAAO,aAAU,GAAGzB,KAAoB;CAC5F,IAAM,EAAE,aAAU,gBAAac,EAAc,GACvCP,IAASG,EAAqBC,GAAUC,CAAQ,GAChDc,IAAkBH,EAAejB,EAAekB,GAASjB,CAAM,CAAC,GAChEoB,IAAWnB,EAAWF,EAAeG,GAAKF,CAAM,CAAC;CACvD,OACI,kBAAC,OAAD;EACI,WAAWN,EAAGJ,EAAO,MAAMM,CAAS;EACpC,OAAO;GAAE,qBAAqBuB;GAAiB,KAAKC;GAAU,GAAGT;EAAM;EACvE,GAAIlB;EAEH;CACA,CAAA;AAEb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.module.cjs","names":[],"sources":["../../../src/components/Layout/Layout.module.css"],"sourcesContent":[".container {\n margin-left: auto;\n margin-right: auto;\n padding-left: var(--tempest-space-4);\n padding-right: var(--tempest-space-4);\n width: 100%;\n}\n\n/* Responsive horizontal padding — wider on larger viewports. */\n@media (min-width: 768px) {\n .container {\n padding-left: var(--tempest-space-6);\n padding-right: var(--tempest-space-6);\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n padding-left: var(--tempest-space-8);\n padding-right: var(--tempest-space-8);\n }\n}\n\n.container.sm {\n max-width: 640px;\n}\n.container.md {\n max-width: 768px;\n}\n.container.lg {\n max-width: 1024px;\n}\n.container.xl {\n max-width: 1280px;\n}\n.container.full {\n max-width: 100%;\n}\n\n.stack {\n display: flex;\n}\n\n.stack.vertical {\n flex-direction: column;\n}\n.stack.horizontal {\n flex-direction: row;\n}\n.stack.center {\n align-items: center;\n}\n.stack.start {\n align-items: flex-start;\n}\n.stack.end {\n align-items: flex-end;\n}\n.stack.stretch {\n align-items: stretch;\n}\n.stack.justifyStart {\n justify-content: flex-start;\n}\n.stack.justifyCenter {\n justify-content: center;\n}\n.stack.justifyEnd {\n justify-content: flex-end;\n}\n.stack.justifyBetween {\n justify-content: space-between;\n}\n.stack.wrap {\n flex-wrap: wrap;\n}\n\n.grid {\n display: grid;\n width: 100%;\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Layout.module.cjs","names":["container","sm","md","lg","xl","full","stack","vertical","horizontal","center","start","end","stretch","justifyStart","justifyCenter","justifyEnd","justifyBetween","wrap","grid","Layout_module_default"],"sources":["../../../src/components/Layout/Layout.module.css"],"sourcesContent":[".container {\n margin-left: auto;\n margin-right: auto;\n padding-left: var(--tempest-space-4);\n padding-right: var(--tempest-space-4);\n width: 100%;\n}\n\n/* Responsive horizontal padding — wider on larger viewports. */\n@media (min-width: 768px) {\n .container {\n padding-left: var(--tempest-space-6);\n padding-right: var(--tempest-space-6);\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n padding-left: var(--tempest-space-8);\n padding-right: var(--tempest-space-8);\n }\n}\n\n.container.sm {\n max-width: 640px;\n}\n.container.md {\n max-width: 768px;\n}\n.container.lg {\n max-width: 1024px;\n}\n.container.xl {\n max-width: 1280px;\n}\n.container.full {\n max-width: 100%;\n}\n\n.stack {\n display: flex;\n}\n\n.stack.vertical {\n flex-direction: column;\n}\n.stack.horizontal {\n flex-direction: row;\n}\n.stack.center {\n align-items: center;\n}\n.stack.start {\n align-items: flex-start;\n}\n.stack.end {\n align-items: flex-end;\n}\n.stack.stretch {\n align-items: stretch;\n}\n.stack.justifyStart {\n justify-content: flex-start;\n}\n.stack.justifyCenter {\n justify-content: center;\n}\n.stack.justifyEnd {\n justify-content: flex-end;\n}\n.stack.justifyBetween {\n justify-content: space-between;\n}\n.stack.wrap {\n flex-wrap: wrap;\n}\n\n.grid {\n display: grid;\n width: 100%;\n}\n"],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.module.js","names":[],"sources":["../../../src/components/Layout/Layout.module.css"],"sourcesContent":[".container {\n margin-left: auto;\n margin-right: auto;\n padding-left: var(--tempest-space-4);\n padding-right: var(--tempest-space-4);\n width: 100%;\n}\n\n/* Responsive horizontal padding — wider on larger viewports. */\n@media (min-width: 768px) {\n .container {\n padding-left: var(--tempest-space-6);\n padding-right: var(--tempest-space-6);\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n padding-left: var(--tempest-space-8);\n padding-right: var(--tempest-space-8);\n }\n}\n\n.container.sm {\n max-width: 640px;\n}\n.container.md {\n max-width: 768px;\n}\n.container.lg {\n max-width: 1024px;\n}\n.container.xl {\n max-width: 1280px;\n}\n.container.full {\n max-width: 100%;\n}\n\n.stack {\n display: flex;\n}\n\n.stack.vertical {\n flex-direction: column;\n}\n.stack.horizontal {\n flex-direction: row;\n}\n.stack.center {\n align-items: center;\n}\n.stack.start {\n align-items: flex-start;\n}\n.stack.end {\n align-items: flex-end;\n}\n.stack.stretch {\n align-items: stretch;\n}\n.stack.justifyStart {\n justify-content: flex-start;\n}\n.stack.justifyCenter {\n justify-content: center;\n}\n.stack.justifyEnd {\n justify-content: flex-end;\n}\n.stack.justifyBetween {\n justify-content: space-between;\n}\n.stack.wrap {\n flex-wrap: wrap;\n}\n\n.grid {\n display: grid;\n width: 100%;\n}\n"],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"Layout.module.js","names":["container","sm","md","lg","xl","full","stack","vertical","horizontal","center","start","end","stretch","justifyStart","justifyCenter","justifyEnd","justifyBetween","wrap","grid","Layout_module_default"],"sources":["../../../src/components/Layout/Layout.module.css"],"sourcesContent":[".container {\n margin-left: auto;\n margin-right: auto;\n padding-left: var(--tempest-space-4);\n padding-right: var(--tempest-space-4);\n width: 100%;\n}\n\n/* Responsive horizontal padding — wider on larger viewports. */\n@media (min-width: 768px) {\n .container {\n padding-left: var(--tempest-space-6);\n padding-right: var(--tempest-space-6);\n }\n}\n\n@media (min-width: 1024px) {\n .container {\n padding-left: var(--tempest-space-8);\n padding-right: var(--tempest-space-8);\n }\n}\n\n.container.sm {\n max-width: 640px;\n}\n.container.md {\n max-width: 768px;\n}\n.container.lg {\n max-width: 1024px;\n}\n.container.xl {\n max-width: 1280px;\n}\n.container.full {\n max-width: 100%;\n}\n\n.stack {\n display: flex;\n}\n\n.stack.vertical {\n flex-direction: column;\n}\n.stack.horizontal {\n flex-direction: row;\n}\n.stack.center {\n align-items: center;\n}\n.stack.start {\n align-items: flex-start;\n}\n.stack.end {\n align-items: flex-end;\n}\n.stack.stretch {\n align-items: stretch;\n}\n.stack.justifyStart {\n justify-content: flex-start;\n}\n.stack.justifyCenter {\n justify-content: center;\n}\n.stack.justifyEnd {\n justify-content: flex-end;\n}\n.stack.justifyBetween {\n justify-content: space-between;\n}\n.stack.wrap {\n flex-wrap: wrap;\n}\n\n.grid {\n display: grid;\n width: 100%;\n}\n"],"mappings":";"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../utils/cn.cjs"),t=require("../Portal/escape-layer.cjs"),n=require("../../hooks/use-focus-trap.cjs"),r=require("../Portal/Portal.cjs"),i=require("../../hooks/use-scroll-lock.cjs"),a=require("./Lightbox.module.cjs");let o=require("react"),s=require("react/jsx-runtime"),c=require("lucide-react");function l({items:l,open:u,index:d=0,onIndexChange:f,onClose:p,showThumbnails:m,showCounter:h=!0,loop:g=!0,closeLabel:_=`Close`,previousLabel:v=`Previous image`,nextLabel:y=`Next image`,className:b}){let x=(0,o.useRef)(null),[S,C]=(0,o.useState)(d),w=f!==void 0,T=w?d:S;n.useFocusTrap(x,u),i.useScrollLock(u);let E=(0,o.useCallback)(e=>{if(l.length===0)return;let t=g?(e+l.length)%l.length:Math.max(0,Math.min(e,l.length-1));w||C(t),f?.(t)},[w,l.length,g,f]);if((0,o.useEffect)(()=>{w||C(d)},[d,w]),t.useEscapeLayer(u,p),(0,o.useEffect)(()=>{if(!u)return;function e(e){switch(e.key){case`ArrowRight`:E(T+1);break;case`ArrowLeft`:E(T-1);break;case`Home`:E(0);break;case`End`:E(l.length-1);break;default:return}e.preventDefault()}return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[T,l.length,E,u]),(0,o.useEffect)(()=>{if(
|
|
1
|
+
const e=require("../../utils/cn.cjs"),t=require("../Portal/escape-layer.cjs"),n=require("../../hooks/use-focus-trap.cjs"),r=require("../Portal/Portal.cjs"),i=require("../../hooks/use-scroll-lock.cjs"),a=require("./Lightbox.module.cjs");let o=require("react"),s=require("react/jsx-runtime"),c=require("lucide-react");function l({items:l,open:u,index:d=0,onIndexChange:f,onClose:p,showThumbnails:m,showCounter:h=!0,loop:g=!0,closeLabel:_=`Close`,previousLabel:v=`Previous image`,nextLabel:y=`Next image`,className:b}){let x=(0,o.useRef)(null),[S,C]=(0,o.useState)(d),w=f!==void 0,T=w?d:S;n.useFocusTrap(x,u),i.useScrollLock(u);let E=(0,o.useCallback)(e=>{if(l.length===0)return;let t=g?(e+l.length)%l.length:Math.max(0,Math.min(e,l.length-1));w||C(t),f?.(t)},[w,l.length,g,f]);if((0,o.useEffect)(()=>{w||C(d)},[d,w]),t.useEscapeLayer(u,p),(0,o.useEffect)(()=>{if(!u)return;function e(e){switch(e.key){case`ArrowRight`:E(T+1);break;case`ArrowLeft`:E(T-1);break;case`Home`:E(0);break;case`End`:E(l.length-1);break;default:return}e.preventDefault()}return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[T,l.length,E,u]),(0,o.useEffect)(()=>{if(u&&typeof Image<`u`)for(let e of[-1,1]){let t=l[(T+e+l.length)%l.length];if(!t)continue;let n=new Image;n.src=t.src}},[T,l,u]),!u||l.length===0)return null;let D=l[Math.max(0,Math.min(T,l.length-1))],O=m??l.length>1,k=l.length>1;return(0,s.jsx)(r.Portal,{children:(0,s.jsxs)(`div`,{ref:x,role:`dialog`,"aria-modal":`true`,"aria-label":D.alt,className:e.cn(a.default.overlay,b),children:[(0,s.jsxs)(`div`,{className:a.default.topBar,children:[h&&k?(0,s.jsxs)(`span`,{className:a.default.counter,children:[T+1,` / `,l.length]}):(0,s.jsx)(`span`,{}),(0,s.jsx)(`button`,{type:`button`,className:a.default.iconButton,"aria-label":_,onClick:p,children:(0,s.jsx)(c.X,{size:20})})]}),(0,s.jsxs)(`div`,{className:a.default.stage,children:[k?(0,s.jsx)(`button`,{type:`button`,className:e.cn(a.default.iconButton,a.default.nav),"aria-label":v,disabled:!g&&T===0,onClick:()=>E(T-1),children:(0,s.jsx)(c.ChevronLeft,{size:24})}):null,(0,s.jsxs)(`figure`,{className:a.default.figure,children:[(0,s.jsx)(`img`,{src:D.src,alt:D.alt,className:a.default.image}),D.caption?(0,s.jsx)(`figcaption`,{className:a.default.caption,children:D.caption}):null]}),k?(0,s.jsx)(`button`,{type:`button`,className:e.cn(a.default.iconButton,a.default.nav),"aria-label":y,disabled:!g&&T===l.length-1,onClick:()=>E(T+1),children:(0,s.jsx)(c.ChevronRight,{size:24})}):null]}),O&&k?(0,s.jsx)(`div`,{className:a.default.thumbnails,role:`tablist`,"aria-label":D.alt,children:l.map((t,n)=>(0,s.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":n===T,"aria-label":t.alt,className:e.cn(a.default.thumbnail,n===T&&a.default.thumbnailActive),onClick:()=>E(n),children:(0,s.jsx)(`img`,{src:t.thumbnail??t.src,alt:``,className:a.default.thumbnailImage})},`${t.src}-${n}`))}):null]})})}exports.Lightbox=l;
|
|
2
2
|
//# sourceMappingURL=Lightbox.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Lightbox.cjs","names":[],"sources":["../../../src/components/Lightbox/Lightbox.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — closeLabel,\n * previousLabel and nextLabel are three separate strings an app has to translate,\n * showThumbnails/showCounter/loop are the chrome, and items/index/\n * onIndexChange/open/onClose are the controlled contract. The body is the focus\n * trap, the key handling and the swipe, which all move the same index.\n */\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useFocusTrap } from \"@/hooks/use-focus-trap\";\nimport { useScrollLock } from \"@/hooks/use-scroll-lock\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"../Portal\";\nimport styles from \"./Lightbox.module.css\";\n\n/** One item of the gallery. */\nexport interface LightboxItem {\n /** Full-size image URL. */\n src: string;\n /** Alt text. Required: a gallery of unlabeled images is unusable with a screen reader. */\n alt: string;\n /** Caption rendered under the image. */\n caption?: string;\n /** Thumbnail URL for the strip. Falls back to `src`. */\n thumbnail?: string;\n}\n\nexport interface LightboxProps {\n items: LightboxItem[];\n /** Whether the overlay is open. */\n open: boolean;\n /** Index shown while open. Default `0`. */\n index?: number;\n onIndexChange?: (index: number) => void;\n onClose: () => void;\n /** Renders the thumbnail strip. Default `true` when there is more than one item. */\n showThumbnails?: boolean;\n /** Renders the `3 / 12` counter. Default `true`. */\n showCounter?: boolean;\n /**\n * Wrap around at the ends. Default `true` — in a photo viewer, hitting a dead\n * end at the last image reads as a bug more often than as a boundary.\n */\n loop?: boolean;\n closeLabel?: string;\n previousLabel?: string;\n nextLabel?: string;\n className?: string;\n}\n\n/**\n * Full-screen image viewer with keyboard navigation.\n *\n * `Esc` closes, `←`/`→` walk the gallery, `Home`/`End` jump to the ends. Focus is\n * trapped inside while open and the page behind is scroll-locked, so the overlay\n * behaves like the dialog it is instead of a fancy `<div>` the keyboard can escape.\n *\n * Only the current image is mounted; neighbours are **preloaded** via `Image()` so\n * pressing `→` does not flash an empty frame.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n * const [index, setIndex] = useState(0);\n *\n * <Lightbox\n * open={open}\n * items={photos.map((p) => ({ src: p.url, alt: p.description }))}\n * index={index}\n * onIndexChange={setIndex}\n * onClose={() => setOpen(false)}\n * />\n * ```\n */\nexport function Lightbox({\n items,\n open,\n index = 0,\n onIndexChange,\n onClose,\n showThumbnails,\n showCounter = true,\n loop = true,\n closeLabel = \"Close\",\n previousLabel = \"Previous image\",\n nextLabel = \"Next image\",\n className,\n}: LightboxProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [internalIndex, setInternalIndex] = useState(index);\n const isControlled = onIndexChange !== undefined;\n const current = isControlled ? index : internalIndex;\n\n useFocusTrap(containerRef, open);\n useScrollLock(open);\n\n const move = useCallback(\n (next: number): void => {\n if (items.length === 0) return;\n const target = loop\n ? (next + items.length) % items.length\n : Math.max(0, Math.min(next, items.length - 1));\n if (!isControlled) setInternalIndex(target);\n onIndexChange?.(target);\n },\n [isControlled, items.length, loop, onIndexChange],\n );\n\n useEffect(() => {\n if (!isControlled) setInternalIndex(index);\n }, [index, isControlled]);\n\n useEscapeLayer(open, onClose);\n\n useEffect(() => {\n if (!open) return;\n function onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case \"ArrowRight\":\n move(current + 1);\n break;\n case \"ArrowLeft\":\n move(current - 1);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(items.length - 1);\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [current, items.length, move, open]);\n\n useEffect(() => {\n if (!open || typeof Image === \"undefined\") return;\n for (const offset of [-1, 1]) {\n const neighbour = items[(current + offset + items.length) % items.length];\n if (!neighbour) continue;\n const preload = new Image();\n preload.src = neighbour.src;\n }\n }, [current, items, open]);\n\n if (!open || items.length === 0) return null;\n\n const item = items[Math.max(0, Math.min(current, items.length - 1))];\n const withThumbnails = showThumbnails ?? items.length > 1;\n const multiple = items.length > 1;\n\n return (\n <Portal>\n <div\n ref={containerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={item.alt}\n className={cn(styles.overlay, className)}\n >\n <div className={styles.topBar}>\n {showCounter && multiple ? (\n <span className={styles.counter}>\n {current + 1} / {items.length}\n </span>\n ) : (\n <span />\n )}\n <button\n type=\"button\"\n className={styles.iconButton}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <X size={20} />\n </button>\n </div>\n\n <div className={styles.stage}>\n {multiple ? (\n <button\n type=\"button\"\n className={cn(styles.iconButton, styles.nav)}\n aria-label={previousLabel}\n disabled={!loop && current === 0}\n onClick={() => move(current - 1)}\n >\n <ChevronLeft size={24} />\n </button>\n ) : null}\n\n <figure className={styles.figure}>\n <img src={item.src} alt={item.alt} className={styles.image} />\n {item.caption ? (\n <figcaption className={styles.caption}>{item.caption}</figcaption>\n ) : null}\n </figure>\n\n {multiple ? (\n <button\n type=\"button\"\n className={cn(styles.iconButton, styles.nav)}\n aria-label={nextLabel}\n disabled={!loop && current === items.length - 1}\n onClick={() => move(current + 1)}\n >\n <ChevronRight size={24} />\n </button>\n ) : null}\n </div>\n\n {withThumbnails && multiple ? (\n <div className={styles.thumbnails} role=\"tablist\" aria-label={item.alt}>\n {items.map((entry, entryIndex) => (\n <button\n key={`${entry.src}-${entryIndex}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={entryIndex === current}\n aria-label={entry.alt}\n className={cn(\n styles.thumbnail,\n entryIndex === current && styles.thumbnailActive,\n )}\n onClick={() => move(entryIndex)}\n >\n <img\n src={entry.thumbnail ?? entry.src}\n alt=\"\"\n className={styles.thumbnailImage}\n />\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </Portal>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Lightbox.cjs","names":["useRef","useState","useCallback","Portal","cn","styles","X","ChevronLeft","ChevronRight","require_cn","require_escape_layer","require_use_focus_trap","require_Portal","require_use_scroll_lock","require_Lightbox_module","react","react_jsx_runtime","lucide_react","Lightbox","containerRef","internalIndex","setInternalIndex","index","isControlled","onIndexChange","current","open","move","items","target","loop","next","onClose","onKeyDown","event","offset","neighbour","preload","item","withThumbnails","showThumbnails","multiple","className","showCounter","closeLabel","previousLabel","nextLabel","entryIndex","entry"],"sources":["../../../src/components/Lightbox/Lightbox.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — closeLabel,\n * previousLabel and nextLabel are three separate strings an app has to translate,\n * showThumbnails/showCounter/loop are the chrome, and items/index/\n * onIndexChange/open/onClose are the controlled contract. The body is the focus\n * trap, the key handling and the swipe, which all move the same index.\n */\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useFocusTrap } from \"@/hooks/use-focus-trap\";\nimport { useScrollLock } from \"@/hooks/use-scroll-lock\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"../Portal\";\nimport styles from \"./Lightbox.module.css\";\n\n/** One item of the gallery. */\nexport interface LightboxItem {\n /** Full-size image URL. */\n src: string;\n /** Alt text. Required: a gallery of unlabeled images is unusable with a screen reader. */\n alt: string;\n /** Caption rendered under the image. */\n caption?: string;\n /** Thumbnail URL for the strip. Falls back to `src`. */\n thumbnail?: string;\n}\n\nexport interface LightboxProps {\n items: LightboxItem[];\n /** Whether the overlay is open. */\n open: boolean;\n /** Index shown while open. Default `0`. */\n index?: number;\n onIndexChange?: (index: number) => void;\n onClose: () => void;\n /** Renders the thumbnail strip. Default `true` when there is more than one item. */\n showThumbnails?: boolean;\n /** Renders the `3 / 12` counter. Default `true`. */\n showCounter?: boolean;\n /**\n * Wrap around at the ends. Default `true` — in a photo viewer, hitting a dead\n * end at the last image reads as a bug more often than as a boundary.\n */\n loop?: boolean;\n closeLabel?: string;\n previousLabel?: string;\n nextLabel?: string;\n className?: string;\n}\n\n/**\n * Full-screen image viewer with keyboard navigation.\n *\n * `Esc` closes, `←`/`→` walk the gallery, `Home`/`End` jump to the ends. Focus is\n * trapped inside while open and the page behind is scroll-locked, so the overlay\n * behaves like the dialog it is instead of a fancy `<div>` the keyboard can escape.\n *\n * Only the current image is mounted; neighbours are **preloaded** via `Image()` so\n * pressing `→` does not flash an empty frame.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n * const [index, setIndex] = useState(0);\n *\n * <Lightbox\n * open={open}\n * items={photos.map((p) => ({ src: p.url, alt: p.description }))}\n * index={index}\n * onIndexChange={setIndex}\n * onClose={() => setOpen(false)}\n * />\n * ```\n */\nexport function Lightbox({\n items,\n open,\n index = 0,\n onIndexChange,\n onClose,\n showThumbnails,\n showCounter = true,\n loop = true,\n closeLabel = \"Close\",\n previousLabel = \"Previous image\",\n nextLabel = \"Next image\",\n className,\n}: LightboxProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [internalIndex, setInternalIndex] = useState(index);\n const isControlled = onIndexChange !== undefined;\n const current = isControlled ? index : internalIndex;\n\n useFocusTrap(containerRef, open);\n useScrollLock(open);\n\n const move = useCallback(\n (next: number): void => {\n if (items.length === 0) return;\n const target = loop\n ? (next + items.length) % items.length\n : Math.max(0, Math.min(next, items.length - 1));\n if (!isControlled) setInternalIndex(target);\n onIndexChange?.(target);\n },\n [isControlled, items.length, loop, onIndexChange],\n );\n\n useEffect(() => {\n if (!isControlled) setInternalIndex(index);\n }, [index, isControlled]);\n\n useEscapeLayer(open, onClose);\n\n useEffect(() => {\n if (!open) return;\n function onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case \"ArrowRight\":\n move(current + 1);\n break;\n case \"ArrowLeft\":\n move(current - 1);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(items.length - 1);\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [current, items.length, move, open]);\n\n useEffect(() => {\n if (!open || typeof Image === \"undefined\") return;\n for (const offset of [-1, 1]) {\n const neighbour = items[(current + offset + items.length) % items.length];\n if (!neighbour) continue;\n const preload = new Image();\n preload.src = neighbour.src;\n }\n }, [current, items, open]);\n\n if (!open || items.length === 0) return null;\n\n const item = items[Math.max(0, Math.min(current, items.length - 1))];\n const withThumbnails = showThumbnails ?? items.length > 1;\n const multiple = items.length > 1;\n\n return (\n <Portal>\n <div\n ref={containerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={item.alt}\n className={cn(styles.overlay, className)}\n >\n <div className={styles.topBar}>\n {showCounter && multiple ? (\n <span className={styles.counter}>\n {current + 1} / {items.length}\n </span>\n ) : (\n <span />\n )}\n <button\n type=\"button\"\n className={styles.iconButton}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <X size={20} />\n </button>\n </div>\n\n <div className={styles.stage}>\n {multiple ? (\n <button\n type=\"button\"\n className={cn(styles.iconButton, styles.nav)}\n aria-label={previousLabel}\n disabled={!loop && current === 0}\n onClick={() => move(current - 1)}\n >\n <ChevronLeft size={24} />\n </button>\n ) : null}\n\n <figure className={styles.figure}>\n <img src={item.src} alt={item.alt} className={styles.image} />\n {item.caption ? (\n <figcaption className={styles.caption}>{item.caption}</figcaption>\n ) : null}\n </figure>\n\n {multiple ? (\n <button\n type=\"button\"\n className={cn(styles.iconButton, styles.nav)}\n aria-label={nextLabel}\n disabled={!loop && current === items.length - 1}\n onClick={() => move(current + 1)}\n >\n <ChevronRight size={24} />\n </button>\n ) : null}\n </div>\n\n {withThumbnails && multiple ? (\n <div className={styles.thumbnails} role=\"tablist\" aria-label={item.alt}>\n {items.map((entry, entryIndex) => (\n <button\n key={`${entry.src}-${entryIndex}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={entryIndex === current}\n aria-label={entry.alt}\n className={cn(\n styles.thumbnail,\n entryIndex === current && styles.thumbnailActive,\n )}\n onClick={() => move(entryIndex)}\n >\n <img\n src={entry.thumbnail ?? entry.src}\n alt=\"\"\n className={styles.thumbnailImage}\n />\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </Portal>\n );\n}\n"],"mappings":"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"}
|
|
@@ -50,7 +50,7 @@ function h({ items: h, open: g, index: _ = 0, onIndexChange: v, onClose: y, show
|
|
|
50
50
|
M,
|
|
51
51
|
g
|
|
52
52
|
]), s(() => {
|
|
53
|
-
if (
|
|
53
|
+
if (g && typeof Image < "u") for (let e of [-1, 1]) {
|
|
54
54
|
let t = h[(j + e + h.length) % h.length];
|
|
55
55
|
if (!t) continue;
|
|
56
56
|
let n = new Image();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Lightbox.js","names":[],"sources":["../../../src/components/Lightbox/Lightbox.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — closeLabel,\n * previousLabel and nextLabel are three separate strings an app has to translate,\n * showThumbnails/showCounter/loop are the chrome, and items/index/\n * onIndexChange/open/onClose are the controlled contract. The body is the focus\n * trap, the key handling and the swipe, which all move the same index.\n */\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useFocusTrap } from \"@/hooks/use-focus-trap\";\nimport { useScrollLock } from \"@/hooks/use-scroll-lock\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"../Portal\";\nimport styles from \"./Lightbox.module.css\";\n\n/** One item of the gallery. */\nexport interface LightboxItem {\n /** Full-size image URL. */\n src: string;\n /** Alt text. Required: a gallery of unlabeled images is unusable with a screen reader. */\n alt: string;\n /** Caption rendered under the image. */\n caption?: string;\n /** Thumbnail URL for the strip. Falls back to `src`. */\n thumbnail?: string;\n}\n\nexport interface LightboxProps {\n items: LightboxItem[];\n /** Whether the overlay is open. */\n open: boolean;\n /** Index shown while open. Default `0`. */\n index?: number;\n onIndexChange?: (index: number) => void;\n onClose: () => void;\n /** Renders the thumbnail strip. Default `true` when there is more than one item. */\n showThumbnails?: boolean;\n /** Renders the `3 / 12` counter. Default `true`. */\n showCounter?: boolean;\n /**\n * Wrap around at the ends. Default `true` — in a photo viewer, hitting a dead\n * end at the last image reads as a bug more often than as a boundary.\n */\n loop?: boolean;\n closeLabel?: string;\n previousLabel?: string;\n nextLabel?: string;\n className?: string;\n}\n\n/**\n * Full-screen image viewer with keyboard navigation.\n *\n * `Esc` closes, `←`/`→` walk the gallery, `Home`/`End` jump to the ends. Focus is\n * trapped inside while open and the page behind is scroll-locked, so the overlay\n * behaves like the dialog it is instead of a fancy `<div>` the keyboard can escape.\n *\n * Only the current image is mounted; neighbours are **preloaded** via `Image()` so\n * pressing `→` does not flash an empty frame.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n * const [index, setIndex] = useState(0);\n *\n * <Lightbox\n * open={open}\n * items={photos.map((p) => ({ src: p.url, alt: p.description }))}\n * index={index}\n * onIndexChange={setIndex}\n * onClose={() => setOpen(false)}\n * />\n * ```\n */\nexport function Lightbox({\n items,\n open,\n index = 0,\n onIndexChange,\n onClose,\n showThumbnails,\n showCounter = true,\n loop = true,\n closeLabel = \"Close\",\n previousLabel = \"Previous image\",\n nextLabel = \"Next image\",\n className,\n}: LightboxProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [internalIndex, setInternalIndex] = useState(index);\n const isControlled = onIndexChange !== undefined;\n const current = isControlled ? index : internalIndex;\n\n useFocusTrap(containerRef, open);\n useScrollLock(open);\n\n const move = useCallback(\n (next: number): void => {\n if (items.length === 0) return;\n const target = loop\n ? (next + items.length) % items.length\n : Math.max(0, Math.min(next, items.length - 1));\n if (!isControlled) setInternalIndex(target);\n onIndexChange?.(target);\n },\n [isControlled, items.length, loop, onIndexChange],\n );\n\n useEffect(() => {\n if (!isControlled) setInternalIndex(index);\n }, [index, isControlled]);\n\n useEscapeLayer(open, onClose);\n\n useEffect(() => {\n if (!open) return;\n function onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case \"ArrowRight\":\n move(current + 1);\n break;\n case \"ArrowLeft\":\n move(current - 1);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(items.length - 1);\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [current, items.length, move, open]);\n\n useEffect(() => {\n if (!open || typeof Image === \"undefined\") return;\n for (const offset of [-1, 1]) {\n const neighbour = items[(current + offset + items.length) % items.length];\n if (!neighbour) continue;\n const preload = new Image();\n preload.src = neighbour.src;\n }\n }, [current, items, open]);\n\n if (!open || items.length === 0) return null;\n\n const item = items[Math.max(0, Math.min(current, items.length - 1))];\n const withThumbnails = showThumbnails ?? items.length > 1;\n const multiple = items.length > 1;\n\n return (\n <Portal>\n <div\n ref={containerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={item.alt}\n className={cn(styles.overlay, className)}\n >\n <div className={styles.topBar}>\n {showCounter && multiple ? (\n <span className={styles.counter}>\n {current + 1} / {items.length}\n </span>\n ) : (\n <span />\n )}\n <button\n type=\"button\"\n className={styles.iconButton}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <X size={20} />\n </button>\n </div>\n\n <div className={styles.stage}>\n {multiple ? (\n <button\n type=\"button\"\n className={cn(styles.iconButton, styles.nav)}\n aria-label={previousLabel}\n disabled={!loop && current === 0}\n onClick={() => move(current - 1)}\n >\n <ChevronLeft size={24} />\n </button>\n ) : null}\n\n <figure className={styles.figure}>\n <img src={item.src} alt={item.alt} className={styles.image} />\n {item.caption ? (\n <figcaption className={styles.caption}>{item.caption}</figcaption>\n ) : null}\n </figure>\n\n {multiple ? (\n <button\n type=\"button\"\n className={cn(styles.iconButton, styles.nav)}\n aria-label={nextLabel}\n disabled={!loop && current === items.length - 1}\n onClick={() => move(current + 1)}\n >\n <ChevronRight size={24} />\n </button>\n ) : null}\n </div>\n\n {withThumbnails && multiple ? (\n <div className={styles.thumbnails} role=\"tablist\" aria-label={item.alt}>\n {items.map((entry, entryIndex) => (\n <button\n key={`${entry.src}-${entryIndex}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={entryIndex === current}\n aria-label={entry.alt}\n className={cn(\n styles.thumbnail,\n entryIndex === current && styles.thumbnailActive,\n )}\n onClick={() => move(entryIndex)}\n >\n <img\n src={entry.thumbnail ?? entry.src}\n alt=\"\"\n className={styles.thumbnailImage}\n />\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </Portal>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Lightbox.js","names":["styles","Lightbox_module_default","Lightbox","containerRef","useRef","internalIndex","setInternalIndex","useState","index","isControlled","onIndexChange","current","useFocusTrap","open","useScrollLock","move","useCallback","items","target","loop","next","useEffect","useEscapeLayer","onClose","onKeyDown","event","offset","neighbour","preload","item","withThumbnails","showThumbnails","multiple","Portal","cn","className","showCounter","closeLabel","X","previousLabel","ChevronLeft","nextLabel","ChevronRight","entryIndex","entry"],"sources":["../../../src/components/Lightbox/Lightbox.tsx"],"sourcesContent":["/**\n * @tempest-limits file-lines, props-count, function-lines — closeLabel,\n * previousLabel and nextLabel are three separate strings an app has to translate,\n * showThumbnails/showCounter/loop are the chrome, and items/index/\n * onIndexChange/open/onClose are the controlled contract. The body is the focus\n * trap, the key handling and the swipe, which all move the same index.\n */\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useFocusTrap } from \"@/hooks/use-focus-trap\";\nimport { useScrollLock } from \"@/hooks/use-scroll-lock\";\nimport { useEscapeLayer } from \"@/components/Portal/escape-layer\";\nimport { cn } from \"@/utils/cn\";\nimport { Portal } from \"../Portal\";\nimport styles from \"./Lightbox.module.css\";\n\n/** One item of the gallery. */\nexport interface LightboxItem {\n /** Full-size image URL. */\n src: string;\n /** Alt text. Required: a gallery of unlabeled images is unusable with a screen reader. */\n alt: string;\n /** Caption rendered under the image. */\n caption?: string;\n /** Thumbnail URL for the strip. Falls back to `src`. */\n thumbnail?: string;\n}\n\nexport interface LightboxProps {\n items: LightboxItem[];\n /** Whether the overlay is open. */\n open: boolean;\n /** Index shown while open. Default `0`. */\n index?: number;\n onIndexChange?: (index: number) => void;\n onClose: () => void;\n /** Renders the thumbnail strip. Default `true` when there is more than one item. */\n showThumbnails?: boolean;\n /** Renders the `3 / 12` counter. Default `true`. */\n showCounter?: boolean;\n /**\n * Wrap around at the ends. Default `true` — in a photo viewer, hitting a dead\n * end at the last image reads as a bug more often than as a boundary.\n */\n loop?: boolean;\n closeLabel?: string;\n previousLabel?: string;\n nextLabel?: string;\n className?: string;\n}\n\n/**\n * Full-screen image viewer with keyboard navigation.\n *\n * `Esc` closes, `←`/`→` walk the gallery, `Home`/`End` jump to the ends. Focus is\n * trapped inside while open and the page behind is scroll-locked, so the overlay\n * behaves like the dialog it is instead of a fancy `<div>` the keyboard can escape.\n *\n * Only the current image is mounted; neighbours are **preloaded** via `Image()` so\n * pressing `→` does not flash an empty frame.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n * const [index, setIndex] = useState(0);\n *\n * <Lightbox\n * open={open}\n * items={photos.map((p) => ({ src: p.url, alt: p.description }))}\n * index={index}\n * onIndexChange={setIndex}\n * onClose={() => setOpen(false)}\n * />\n * ```\n */\nexport function Lightbox({\n items,\n open,\n index = 0,\n onIndexChange,\n onClose,\n showThumbnails,\n showCounter = true,\n loop = true,\n closeLabel = \"Close\",\n previousLabel = \"Previous image\",\n nextLabel = \"Next image\",\n className,\n}: LightboxProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const [internalIndex, setInternalIndex] = useState(index);\n const isControlled = onIndexChange !== undefined;\n const current = isControlled ? index : internalIndex;\n\n useFocusTrap(containerRef, open);\n useScrollLock(open);\n\n const move = useCallback(\n (next: number): void => {\n if (items.length === 0) return;\n const target = loop\n ? (next + items.length) % items.length\n : Math.max(0, Math.min(next, items.length - 1));\n if (!isControlled) setInternalIndex(target);\n onIndexChange?.(target);\n },\n [isControlled, items.length, loop, onIndexChange],\n );\n\n useEffect(() => {\n if (!isControlled) setInternalIndex(index);\n }, [index, isControlled]);\n\n useEscapeLayer(open, onClose);\n\n useEffect(() => {\n if (!open) return;\n function onKeyDown(event: KeyboardEvent): void {\n switch (event.key) {\n case \"ArrowRight\":\n move(current + 1);\n break;\n case \"ArrowLeft\":\n move(current - 1);\n break;\n case \"Home\":\n move(0);\n break;\n case \"End\":\n move(items.length - 1);\n break;\n default:\n return;\n }\n event.preventDefault();\n }\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [current, items.length, move, open]);\n\n useEffect(() => {\n if (!open || typeof Image === \"undefined\") return;\n for (const offset of [-1, 1]) {\n const neighbour = items[(current + offset + items.length) % items.length];\n if (!neighbour) continue;\n const preload = new Image();\n preload.src = neighbour.src;\n }\n }, [current, items, open]);\n\n if (!open || items.length === 0) return null;\n\n const item = items[Math.max(0, Math.min(current, items.length - 1))];\n const withThumbnails = showThumbnails ?? items.length > 1;\n const multiple = items.length > 1;\n\n return (\n <Portal>\n <div\n ref={containerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={item.alt}\n className={cn(styles.overlay, className)}\n >\n <div className={styles.topBar}>\n {showCounter && multiple ? (\n <span className={styles.counter}>\n {current + 1} / {items.length}\n </span>\n ) : (\n <span />\n )}\n <button\n type=\"button\"\n className={styles.iconButton}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <X size={20} />\n </button>\n </div>\n\n <div className={styles.stage}>\n {multiple ? (\n <button\n type=\"button\"\n className={cn(styles.iconButton, styles.nav)}\n aria-label={previousLabel}\n disabled={!loop && current === 0}\n onClick={() => move(current - 1)}\n >\n <ChevronLeft size={24} />\n </button>\n ) : null}\n\n <figure className={styles.figure}>\n <img src={item.src} alt={item.alt} className={styles.image} />\n {item.caption ? (\n <figcaption className={styles.caption}>{item.caption}</figcaption>\n ) : null}\n </figure>\n\n {multiple ? (\n <button\n type=\"button\"\n className={cn(styles.iconButton, styles.nav)}\n aria-label={nextLabel}\n disabled={!loop && current === items.length - 1}\n onClick={() => move(current + 1)}\n >\n <ChevronRight size={24} />\n </button>\n ) : null}\n </div>\n\n {withThumbnails && multiple ? (\n <div className={styles.thumbnails} role=\"tablist\" aria-label={item.alt}>\n {items.map((entry, entryIndex) => (\n <button\n key={`${entry.src}-${entryIndex}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={entryIndex === current}\n aria-label={entry.alt}\n className={cn(\n styles.thumbnail,\n entryIndex === current && styles.thumbnailActive,\n )}\n onClick={() => move(entryIndex)}\n >\n <img\n src={entry.thumbnail ?? entry.src}\n alt=\"\"\n className={styles.thumbnailImage}\n />\n </button>\n ))}\n </div>\n ) : null}\n </div>\n </Portal>\n );\n}\n"],"mappings":"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"}
|