@12-apps/ui 6.6.0 → 6.7.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/dist/{chunk-3KWD5Y5O.js → chunk-RXE5CUUE.js} +8 -4
- package/dist/chunk-RXE5CUUE.js.map +1 -0
- package/dist/data-display/Alert.js +1 -1
- package/dist/data-display/AsyncStateContainer.js +2 -1
- package/dist/data-display/AsyncStateContainer.js.map +1 -1
- package/dist/data-display/Banner.js +4 -2
- package/dist/data-display/Banner.js.map +1 -1
- package/dist/data-display/CardKit.js +3 -1
- package/dist/data-display/CardKit.js.map +1 -1
- package/dist/data-display/Carousel.js +5 -2
- package/dist/data-display/Carousel.js.map +1 -1
- package/dist/data-display/DataViews.js +2 -1
- package/dist/data-display/DataViews.js.map +1 -1
- package/dist/data-display/Lightbox.js +147 -117
- package/dist/data-display/Lightbox.js.map +1 -1
- package/dist/data-display/MapPreview.js +14 -10
- package/dist/data-display/MapPreview.js.map +1 -1
- package/dist/pt-BR.js +37 -1
- package/dist/pt-BR.js.map +1 -1
- package/dist/types/components/data-display/Alert/Alert.d.ts +9 -2
- package/dist/types/components/data-display/Alert/Alert.d.ts.map +1 -1
- package/dist/types/components/data-display/Alert/Alert.types.d.ts +25 -9
- package/dist/types/components/data-display/Alert/Alert.types.d.ts.map +1 -1
- package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.d.ts.map +1 -1
- package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.types.d.ts +6 -0
- package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.types.d.ts.map +1 -1
- package/dist/types/components/data-display/Banner/Banner.d.ts.map +1 -1
- package/dist/types/components/data-display/Banner/Banner.types.d.ts +2 -0
- package/dist/types/components/data-display/Banner/Banner.types.d.ts.map +1 -1
- package/dist/types/components/data-display/CardKit/card-actions-context.d.ts +3 -1
- package/dist/types/components/data-display/CardKit/card-actions-context.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.chrome.d.ts +3 -0
- package/dist/types/components/data-display/Carousel/Carousel.chrome.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.parts.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.types.d.ts +7 -0
- package/dist/types/components/data-display/Carousel/Carousel.types.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +2 -0
- package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-table-parts.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/Lightbox.types.d.ts +9 -0
- package/dist/types/components/data-display/Lightbox/Lightbox.types.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/LightboxControls.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/lightbox-copy-context.d.ts +17 -0
- package/dist/types/components/data-display/Lightbox/lightbox-copy-context.d.ts.map +1 -0
- package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts +7 -0
- package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapLayers.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapPreview.types.d.ts +9 -0
- package/dist/types/components/data-display/MapPreview/MapPreview.types.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts +2 -0
- package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts.map +1 -1
- package/dist/types/copy.d.ts +53 -0
- package/dist/types/copy.d.ts.map +1 -1
- package/dist/types/pt-BR.d.ts +5 -1
- package/dist/types/pt-BR.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/data-display/Alert/Alert.tsx +22 -5
- package/src/components/data-display/Alert/Alert.types.ts +20 -10
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.tsx +2 -1
- package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.types.ts +6 -0
- package/src/components/data-display/Banner/Banner.tsx +5 -2
- package/src/components/data-display/Banner/Banner.types.ts +2 -0
- package/src/components/data-display/CardKit/card-actions-context.tsx +4 -0
- package/src/components/data-display/Carousel/Carousel.chrome.tsx +5 -0
- package/src/components/data-display/Carousel/Carousel.parts.tsx +4 -3
- package/src/components/data-display/Carousel/Carousel.types.ts +7 -0
- package/src/components/data-display/DataViews/data-views-copy.ts +2 -0
- package/src/components/data-display/DataViews/data-views-table-parts.tsx +1 -0
- package/src/components/data-display/Lightbox/Lightbox.tsx +3 -0
- package/src/components/data-display/Lightbox/Lightbox.types.ts +9 -0
- package/src/components/data-display/Lightbox/LightboxControls.tsx +28 -15
- package/src/components/data-display/Lightbox/lightbox-copy-context.tsx +42 -0
- package/src/components/data-display/MapPreview/MapControlBar.tsx +17 -9
- package/src/components/data-display/MapPreview/MapLayers.tsx +2 -0
- package/src/components/data-display/MapPreview/MapPreview.types.ts +10 -0
- package/src/components/data-display/MapPreview/MapSearchBar.tsx +4 -1
- package/src/copy.ts +57 -0
- package/src/pt-BR.ts +41 -1
- package/dist/chunk-3KWD5Y5O.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/data-display/Lightbox/Lightbox.tsx","../../src/components/data-display/Lightbox/Lightbox.constants.ts","../../src/components/data-display/Lightbox/Lightbox.helpers.ts","../../src/components/data-display/Lightbox/LightboxMedia.tsx","../../src/components/data-display/Lightbox/LightboxCurrentMedia.tsx","../../src/components/data-display/Lightbox/LightboxControls.tsx","../../src/components/data-display/Lightbox/LightboxOverlay.tsx","../../src/components/data-display/Lightbox/LightboxStage.tsx","../../src/components/data-display/Lightbox/LightboxThumbnails.tsx","../../src/components/data-display/Lightbox/useLightbox.ts","../../src/components/data-display/Lightbox/Lightbox.hooks.ts"],"sourcesContent":["import { Dialog, Fade, Typography } from '@mui/material';\nimport React from 'react';\n\nimport { makeTestId } from './Lightbox.constants';\nimport { resolveLightboxProps } from './Lightbox.helpers';\nimport type { LightboxProps, LightboxRef } from './Lightbox.types';\nimport { LightboxCurrentMedia } from './LightboxCurrentMedia';\nimport { LightboxOverlay } from './LightboxOverlay';\nimport { LightboxStage } from './LightboxStage';\nimport { LightboxThumbnails } from './LightboxThumbnails';\nimport { useLightbox } from './useLightbox';\n\nconst DIALOG_STATIC_PROPS = {\n maxWidth: false,\n fullScreen: true,\n TransitionComponent: Fade,\n TransitionProps: { timeout: 300 },\n PaperProps: { sx: { background: 'rgba(0, 0, 0, 0.9)', backdropFilter: 'blur(2px)' } },\n 'aria-label': 'Lightbox',\n 'aria-labelledby': 'lightbox-title',\n role: 'dialog',\n 'aria-modal': 'true',\n} as const;\n\nexport const Lightbox = React.forwardRef<LightboxRef, LightboxProps>((componentProps, ref) => {\n const props = resolveLightboxProps(componentProps);\n const { isOpen, items, loop, autoplay, showControls, showCaptions, thumbnails, zoomable } = props;\n const { className, style, dataTestId } = props;\n\n const testId = makeTestId(dataTestId);\n const lightbox = useLightbox(props, ref);\n const { currentIndex, currentItem, zoom } = lightbox;\n\n return (\n <Dialog\n open={isOpen}\n onClose={lightbox.close}\n {...DIALOG_STATIC_PROPS}\n className={className}\n style={style}\n onTouchStart={lightbox.handleTouchStart}\n onTouchEnd={lightbox.handleTouchEnd}\n data-testid={dataTestId || 'lightbox'}\n >\n {/* Visually hidden title for screen readers */}\n <Typography id=\"lightbox-title\" variant=\"h6\" sx={{ position: 'absolute', left: -10000 }}>\n Lightbox - {currentItem?.alt || `Item ${currentIndex + 1} of ${items.length}`}\n </Typography>\n\n <LightboxOverlay\n testId={testId}\n itemCount={items.length}\n currentIndex={currentIndex}\n showControls={showControls}\n loop={loop}\n autoplay={autoplay}\n canZoom={lightbox.canZoom}\n isAutoPlaying={lightbox.isAutoPlaying}\n onClose={lightbox.close}\n onPrev={lightbox.prev}\n onNext={lightbox.next}\n onZoomIn={zoom.zoomIn}\n onZoomOut={zoom.zoomOut}\n onResetZoom={zoom.resetZoom}\n onToggleAutoplay={() => lightbox.setIsAutoPlaying((playing) => !playing)}\n />\n\n <LightboxStage\n items={items}\n currentItem={currentItem}\n currentIndex={currentIndex}\n isLoading={lightbox.isLoading}\n showCaptions={showCaptions}\n thumbnails={thumbnails}\n testId={testId}\n media={\n <LightboxCurrentMedia\n item={currentItem}\n index={currentIndex}\n total={items.length}\n zoomable={zoomable}\n zoom={zoom}\n testId={testId}\n onLoadingChange={lightbox.setIsLoading}\n onWheel={lightbox.handleWheel}\n />\n }\n thumbnailStrip={\n thumbnails &&\n items.length > 1 && (\n <LightboxThumbnails\n items={items}\n currentIndex={currentIndex}\n testId={testId}\n onSelect={lightbox.goToIndex}\n />\n )\n }\n />\n </Dialog>\n );\n});\n\nLightbox.displayName = 'Lightbox';\n\nexport default Lightbox;\n","export const MIN_ZOOM = 0.5;\nexport const MAX_ZOOM = 5;\nexport const ZOOM_STEP = 1.2;\n// Each wheel notch is ~100 deltaY, so this makes one notch a 1x zoom change.\nexport const WHEEL_ZOOM_FACTOR = 0.01;\n\nexport const DEFAULT_AUTOPLAY_INTERVAL_MS = 4000;\nexport const MIN_SWIPE_DISTANCE = 50;\nexport const OVERLAY_Z_INDEX = 1000;\n\nconst SCRIM = 'rgba(0, 0, 0, 0.5)';\nconst SCRIM_HOVER = 'rgba(0, 0, 0, 0.7)';\n\nexport const overlayButtonSx = {\n color: 'white',\n backgroundColor: SCRIM,\n '&:hover': { backgroundColor: SCRIM_HOVER },\n} as const;\n\n// The arrows drop their hover treatment at the ends of a non-looping gallery and\n// dim instead, so a disabled arrow does not look pressable.\nexport const navButtonSx = {\n color: 'white',\n backgroundColor: SCRIM,\n '&:hover:not(:disabled)': { backgroundColor: SCRIM_HOVER },\n '&:disabled': { color: 'rgba(255, 255, 255, 0.3)' },\n} as const;\n\nexport const captionSx = {\n color: 'white',\n textAlign: 'center',\n backgroundColor: SCRIM_HOVER,\n borderRadius: 1,\n} as const;\n\nexport const counterSx = {\n color: 'white',\n fontSize: '0.875rem',\n backgroundColor: SCRIM,\n borderRadius: 1,\n} as const;\n\nexport const thumbnailStripSx = {\n background: SCRIM,\n borderRadius: 1,\n} as const;\n\n// Every element gets `${dataTestId}-suffix` when the caller supplied an id, and\n// `lightbox-suffix` otherwise.\nexport const makeTestId =\n (dataTestId?: string) =>\n (suffix: string): string =>\n dataTestId ? `${dataTestId}-${suffix}` : `lightbox-${suffix}`;\n","import type { LightboxProps } from './Lightbox.types';\n\ntype LightboxDefaultedKeys =\n | 'isOpen'\n | 'items'\n | 'startIndex'\n | 'showControls'\n | 'showCaptions'\n | 'loop'\n | 'autoplay'\n | 'thumbnails'\n | 'zoomable';\n\nexport type ResolvedLightboxProps = LightboxProps &\n Required<Pick<LightboxProps, LightboxDefaultedKeys>>;\n\nconst LIGHTBOX_DEFAULTS: Pick<LightboxProps, LightboxDefaultedKeys> = {\n isOpen: false,\n items: [],\n startIndex: 0,\n showControls: true,\n showCaptions: true,\n loop: false,\n autoplay: false,\n thumbnails: false,\n zoomable: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would.\nconst definedProps = (props: LightboxProps): Partial<LightboxProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<LightboxProps>;\n\n// Applied as a merge rather than destructuring defaults, which would otherwise\n// put nine branches into the component's own complexity budget.\nexport const resolveLightboxProps = (props: LightboxProps): ResolvedLightboxProps =>\n ({ ...LIGHTBOX_DEFAULTS, ...definedProps(props) }) as ResolvedLightboxProps;\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { LightboxItem } from './Lightbox.types';\n\nexport interface LightboxMediaProps {\n item: LightboxItem;\n index: number;\n total: number;\n zoomLevel: number;\n panOffset: { x: number; y: number };\n zoomable: boolean;\n isDragging: boolean;\n testId: (suffix: string) => string;\n onLoadStart: () => void;\n onLoaded: () => void;\n onWheel: (event: React.WheelEvent) => void;\n onDoubleClick: () => void;\n}\n\nconst cursorFor = (zoomLevel: number, zoomable: boolean): string => {\n if (zoomLevel > 1) return 'move';\n return zoomable ? 'zoom-in' : 'default';\n};\n\nexport const LightboxMedia: FC<LightboxMediaProps> = ({\n item,\n index,\n total,\n zoomLevel,\n panOffset,\n zoomable,\n isDragging,\n testId,\n onLoadStart,\n onLoaded,\n onWheel,\n onDoubleClick,\n}) => {\n if (item.type === 'video') {\n return (\n <video\n src={item.src}\n controls\n style={{ maxWidth: '90vw', maxHeight: '80vh', objectFit: 'contain' }}\n onLoadStart={onLoadStart}\n onLoadedData={onLoaded}\n aria-label={item.alt || `Video ${index + 1} of ${total}`}\n data-testid={testId('video')}\n />\n );\n }\n\n return (\n <img\n src={item.src}\n alt={item.alt || `Image ${index + 1} of ${total}`}\n style={{\n // At 1x the image is bounded by the viewport; once zoomed it is allowed\n // to overflow so there is something to pan around.\n maxWidth: zoomLevel === 1 ? '90vw' : 'none',\n maxHeight: zoomLevel === 1 ? '80vh' : 'none',\n transform: `scale(${zoomLevel}) translate(${panOffset.x}px, ${panOffset.y}px)`,\n transformOrigin: 'center',\n cursor: cursorFor(zoomLevel, zoomable),\n transition: isDragging ? 'none' : 'transform 0.2s ease',\n objectFit: 'contain',\n }}\n onLoad={onLoaded}\n onWheel={onWheel}\n onDoubleClick={onDoubleClick}\n draggable={false}\n data-testid={testId('image')}\n />\n );\n};\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { ZoomState } from './Lightbox.hooks';\nimport type { LightboxItem } from './Lightbox.types';\nimport { LightboxMedia } from './LightboxMedia';\n\nexport interface LightboxCurrentMediaProps {\n item?: LightboxItem;\n index: number;\n total: number;\n zoomable: boolean;\n zoom: ZoomState;\n testId: (suffix: string) => string;\n onLoadingChange: (loading: boolean) => void;\n onWheel: (event: React.WheelEvent) => void;\n}\n\n// Wires the active item to the zoom state. Double-clicking zooms in, or snaps\n// back to 1x if already zoomed.\nexport const LightboxCurrentMedia: FC<LightboxCurrentMediaProps> = ({\n item,\n index,\n total,\n zoomable,\n zoom,\n testId,\n onLoadingChange,\n onWheel,\n}) => {\n if (!item) return null;\n\n return (\n <LightboxMedia\n item={item}\n index={index}\n total={total}\n zoomLevel={zoom.zoomLevel}\n panOffset={zoom.panOffset}\n zoomable={zoomable}\n // Drag-panning is not wired up, so the transform transition is always on.\n isDragging={false}\n testId={testId}\n onLoadStart={() => onLoadingChange(true)}\n onLoaded={() => onLoadingChange(false)}\n onWheel={onWheel}\n onDoubleClick={zoom.zoomLevel > 1 ? zoom.resetZoom : zoom.zoomIn}\n />\n );\n};\n","import PrevIcon from '@mui/icons-material/ChevronLeft';\nimport NextIcon from '@mui/icons-material/ChevronRight';\nimport CloseIcon from '@mui/icons-material/Close';\nimport PauseIcon from '@mui/icons-material/Pause';\nimport PlayIcon from '@mui/icons-material/PlayArrow';\nimport ResetZoomIcon from '@mui/icons-material/RestartAlt';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport { Box, IconButton } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { navButtonSx, OVERLAY_Z_INDEX, overlayButtonSx } from './Lightbox.constants';\n\ntype TestId = (suffix: string) => string;\n\nexport const LightboxCloseButton: FC<{ testId: TestId; onClose: () => void }> = ({\n testId,\n onClose,\n}) => (\n <IconButton\n onClick={onClose}\n sx={{ ...overlayButtonSx, position: 'absolute', top: 16, right: 16, zIndex: OVERLAY_Z_INDEX }}\n aria-label=\"Close lightbox\"\n data-testid={testId('close')}\n >\n <CloseIcon />\n </IconButton>\n);\n\nconst arrowSx = (side: 'left' | 'right') =>\n ({\n ...navButtonSx,\n position: 'absolute',\n [side]: 16,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: OVERLAY_Z_INDEX,\n }) as const;\n\nexport interface LightboxNavButtonsProps {\n testId: TestId;\n atStart: boolean;\n atEnd: boolean;\n onPrev: () => void;\n onNext: () => void;\n}\n\nexport const LightboxNavButtons: FC<LightboxNavButtonsProps> = ({\n testId,\n atStart,\n atEnd,\n onPrev,\n onNext,\n}) => (\n <>\n <IconButton\n onClick={onPrev}\n disabled={atStart}\n sx={arrowSx('left')}\n aria-label=\"Previous item\"\n data-testid={testId('prev')}\n >\n <PrevIcon />\n </IconButton>\n\n <IconButton\n onClick={onNext}\n disabled={atEnd}\n sx={arrowSx('right')}\n aria-label=\"Next item\"\n data-testid={testId('next')}\n >\n <NextIcon />\n </IconButton>\n </>\n);\n\nexport interface LightboxZoomControlsProps {\n testId: TestId;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetZoom: () => void;\n}\n\nexport const LightboxZoomControls: FC<LightboxZoomControlsProps> = ({\n testId,\n onZoomIn,\n onZoomOut,\n onResetZoom,\n}) => (\n <Box\n sx={{\n position: 'absolute',\n top: 16,\n left: 16,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n zIndex: OVERLAY_Z_INDEX,\n }}\n data-testid={testId('zoom-controls')}\n >\n <IconButton onClick={onZoomIn} sx={overlayButtonSx} aria-label=\"Zoom in\" data-testid={testId('zoom-in')}>\n <ZoomInIcon />\n </IconButton>\n <IconButton\n onClick={onZoomOut}\n sx={overlayButtonSx}\n aria-label=\"Zoom out\"\n data-testid={testId('zoom-out')}\n >\n <ZoomOutIcon />\n </IconButton>\n <IconButton\n onClick={onResetZoom}\n sx={overlayButtonSx}\n aria-label=\"Reset zoom\"\n data-testid={testId('zoom-reset')}\n >\n <ResetZoomIcon />\n </IconButton>\n </Box>\n);\n\nexport interface LightboxAutoplayButtonProps {\n testId: TestId;\n isAutoPlaying: boolean;\n onToggle: () => void;\n}\n\nexport const LightboxAutoplayButton: FC<LightboxAutoplayButtonProps> = ({\n testId,\n isAutoPlaying,\n onToggle,\n}) => (\n <IconButton\n onClick={onToggle}\n sx={{\n ...overlayButtonSx,\n position: 'absolute',\n top: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: OVERLAY_Z_INDEX,\n }}\n aria-label={isAutoPlaying ? 'Pause slideshow' : 'Start slideshow'}\n data-testid={testId('autoplay')}\n >\n {isAutoPlaying ? <PauseIcon /> : <PlayIcon />}\n </IconButton>\n);\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { LightboxProps } from './Lightbox.types';\nimport {\n LightboxAutoplayButton,\n LightboxCloseButton,\n LightboxNavButtons,\n LightboxZoomControls,\n} from './LightboxControls';\n\nexport interface LightboxOverlayProps {\n testId: (suffix: string) => string;\n itemCount: number;\n currentIndex: number;\n showControls: boolean;\n loop: boolean;\n autoplay: LightboxProps['autoplay'];\n canZoom: boolean;\n isAutoPlaying: boolean;\n onClose: () => void;\n onPrev: () => void;\n onNext: () => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetZoom: () => void;\n onToggleAutoplay: () => void;\n}\n\n// Everything that floats above the media: dismiss, step, zoom and slideshow.\nexport const LightboxOverlay: FC<LightboxOverlayProps> = ({\n testId,\n itemCount,\n currentIndex,\n showControls,\n loop,\n autoplay,\n canZoom,\n isAutoPlaying,\n onClose,\n onPrev,\n onNext,\n onZoomIn,\n onZoomOut,\n onResetZoom,\n onToggleAutoplay,\n}) => {\n const hasMultiple = itemCount > 1;\n\n return (\n <>\n <LightboxCloseButton testId={testId} onClose={onClose} />\n\n {showControls && hasMultiple && (\n <LightboxNavButtons\n testId={testId}\n // A non-looping gallery runs out of moves at either end.\n atStart={!loop && currentIndex === 0}\n atEnd={!loop && currentIndex === itemCount - 1}\n onPrev={onPrev}\n onNext={onNext}\n />\n )}\n\n {canZoom && (\n <LightboxZoomControls\n testId={testId}\n onZoomIn={onZoomIn}\n onZoomOut={onZoomOut}\n onResetZoom={onResetZoom}\n />\n )}\n\n {autoplay && hasMultiple && (\n <LightboxAutoplayButton\n testId={testId}\n isAutoPlaying={isAutoPlaying}\n onToggle={onToggleAutoplay}\n />\n )}\n </>\n );\n};\n","import { Box, CircularProgress, DialogContent, Typography } from '@mui/material';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\n\nimport { captionSx, counterSx } from './Lightbox.constants';\nimport type { LightboxItem } from './Lightbox.types';\n\ntype TestId = (suffix: string) => string;\n\nexport interface LightboxStageProps {\n items: LightboxItem[];\n currentItem?: LightboxItem;\n currentIndex: number;\n isLoading: boolean;\n showCaptions: boolean;\n thumbnails: boolean;\n testId: TestId;\n media: ReactNode;\n thumbnailStrip: ReactNode;\n}\n\n// The viewport itself: the media, whatever floats over it, and the filmstrip.\nexport const LightboxStage: FC<LightboxStageProps> = ({\n items,\n currentItem,\n currentIndex,\n isLoading,\n showCaptions,\n thumbnails,\n testId,\n media,\n thumbnailStrip,\n}) => (\n <DialogContent\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n position: 'relative',\n height: '100vh',\n overflow: 'hidden',\n }}\n data-testid={testId('content')}\n >\n {isLoading && (\n <CircularProgress\n sx={{ position: 'absolute', color: 'white', zIndex: 999 }}\n data-testid={testId('loading')}\n />\n )}\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n }}\n data-testid={testId('image-container')}\n >\n {media}\n </Box>\n\n {showCaptions && currentItem?.caption && (\n <Typography\n id=\"lightbox-description\"\n sx={{\n ...captionSx,\n position: 'absolute',\n // Sit above the filmstrip when there is one.\n bottom: thumbnails ? 120 : 16,\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: '80vw',\n padding: 2,\n }}\n data-testid={testId('caption')}\n >\n {currentItem.caption}\n </Typography>\n )}\n\n {items.length > 1 && (\n <Typography\n sx={{ ...counterSx, position: 'absolute', top: 70, right: 16, padding: '4px 8px' }}\n aria-live=\"polite\"\n data-testid={testId('counter')}\n >\n {currentIndex + 1} / {items.length}\n </Typography>\n )}\n\n {thumbnailStrip}\n </DialogContent>\n);\n","import PlayIcon from '@mui/icons-material/PlayArrow';\nimport { Box } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { thumbnailStripSx } from './Lightbox.constants';\nimport type { LightboxItem } from './Lightbox.types';\n\nconst THUMB_WIDTH = 60;\nconst THUMB_HEIGHT = 40;\n\nconst VideoThumbnail: FC = () => (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n background: 'rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <PlayIcon sx={{ color: 'white', fontSize: 16 }} />\n </Box>\n);\n\nexport interface LightboxThumbnailsProps {\n items: LightboxItem[];\n currentIndex: number;\n testId: (suffix: string) => string;\n onSelect: (index: number) => void;\n}\n\nexport const LightboxThumbnails: FC<LightboxThumbnailsProps> = ({\n items,\n currentIndex,\n testId,\n onSelect,\n}) => (\n <Box\n sx={{\n ...thumbnailStripSx,\n position: 'absolute',\n bottom: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n gap: 1,\n maxWidth: '90vw',\n overflowX: 'auto',\n padding: 1,\n }}\n data-testid={testId('thumbnails')}\n >\n {items.map((item, index) => (\n <Box\n key={`${item.src}-${index}`}\n onClick={() => onSelect(index)}\n sx={{\n width: THUMB_WIDTH,\n height: THUMB_HEIGHT,\n cursor: 'pointer',\n border: currentIndex === index ? '2px solid white' : '2px solid transparent',\n borderRadius: 0.5,\n overflow: 'hidden',\n flexShrink: 0,\n '&:hover': { border: '2px solid rgba(255, 255, 255, 0.7)' },\n }}\n data-testid={testId(`thumbnail-${index}`)}\n >\n {item.type === 'video' ? (\n <VideoThumbnail />\n ) : (\n <img\n src={item.src}\n alt={item.alt || `Thumbnail ${index + 1}`}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n )}\n </Box>\n ))}\n </Box>\n);\n","import { useCallback, useImperativeHandle, useState } from 'react';\nimport type React from 'react';\n\nimport {\n useAutoplay,\n useLightboxKeyboard,\n useNavigation,\n usePreloader,\n useSwipe,\n useWheelZoom,\n useZoomState,\n} from './Lightbox.hooks';\nimport type { ResolvedLightboxProps } from './Lightbox.helpers';\nimport type { LightboxRef } from './Lightbox.types';\n\n// Wires the independent concerns together in dependency order: zoom, then\n// navigation (which resets zoom), then autoplay (which advances), then the\n// input handlers that close.\nexport const useLightbox = (\n { isOpen, onClose, items, startIndex, showControls, loop, autoplay, zoomable }: ResolvedLightboxProps,\n ref: React.ForwardedRef<LightboxRef>,\n) => {\n const [isLoading, setIsLoading] = useState(false);\n\n const preloadImage = usePreloader();\n const zoom = useZoomState();\n\n const { currentIndex, goToIndex, next, prev } = useNavigation({\n items,\n loop,\n startIndex,\n resetZoom: zoom.resetZoom,\n preloadImage,\n });\n\n const currentItem = items[currentIndex];\n const canZoom = Boolean(zoomable && currentItem && currentItem.type !== 'video');\n\n const handleWheel = useWheelZoom({ enabled: canZoom, setZoomLevel: zoom.setZoomLevel });\n\n const { isAutoPlaying, setIsAutoPlaying, stopAutoplay } = useAutoplay({\n isOpen,\n autoplay,\n itemCount: items.length,\n currentIndex,\n next,\n });\n\n const close = useCallback(() => {\n stopAutoplay();\n onClose();\n }, [stopAutoplay, onClose]);\n\n // open() with no argument starts at the first item.\n const open = useCallback((index = 0) => goToIndex(index), [goToIndex]);\n\n useImperativeHandle(ref, () => ({ open, close, next, prev, goTo: goToIndex }));\n\n useLightboxKeyboard({ isOpen, showControls, autoplay, close, prev, next, setIsAutoPlaying });\n\n const { handleTouchStart, handleTouchEnd } = useSwipe({ prev, next, close });\n\n return {\n currentIndex,\n currentItem,\n canZoom,\n isLoading,\n setIsLoading,\n isAutoPlaying,\n setIsAutoPlaying,\n zoom,\n handleWheel,\n goToIndex,\n next,\n prev,\n close,\n handleTouchStart,\n handleTouchEnd,\n };\n};\n","import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n DEFAULT_AUTOPLAY_INTERVAL_MS,\n MAX_ZOOM,\n MIN_SWIPE_DISTANCE,\n MIN_ZOOM,\n WHEEL_ZOOM_FACTOR,\n ZOOM_STEP,\n} from './Lightbox.constants';\nimport type { LightboxItem, LightboxProps } from './Lightbox.types';\n\nconst clampZoom = (zoom: number): number => Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));\n\n// Items with no explicit type are images.\nconst isImageItem = (item?: LightboxItem): item is LightboxItem =>\n Boolean(item && (item.type === 'image' || !item.type));\n\n// Images are fetched once and remembered, so stepping back to one is instant.\nexport const usePreloader = () => {\n const [preloadedImages, setPreloadedImages] = useState<Set<string>>(new Set());\n\n return useCallback(\n (src: string) => {\n if (preloadedImages.has(src)) return;\n\n const img = new window.Image();\n img.onload = () => setPreloadedImages((prev) => new Set([...prev, src]));\n img.src = src;\n },\n [preloadedImages],\n );\n};\n\nexport interface ZoomState {\n zoomLevel: number;\n panOffset: { x: number; y: number };\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n resetZoom: () => void;\n zoomIn: () => void;\n zoomOut: () => void;\n}\n\nexport const useZoomState = (): ZoomState => {\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panOffset, setPanOffset] = useState({ x: 0, y: 0 });\n\n const resetZoom = useCallback(() => {\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }, []);\n\n const zoomIn = useCallback(() => setZoomLevel((prev) => Math.min(MAX_ZOOM, prev * ZOOM_STEP)), []);\n const zoomOut = useCallback(\n () => setZoomLevel((prev) => Math.max(MIN_ZOOM, prev / ZOOM_STEP)),\n [],\n );\n\n return { zoomLevel, panOffset, setZoomLevel, resetZoom, zoomIn, zoomOut };\n};\n\nexport const useWheelZoom = ({\n enabled,\n setZoomLevel,\n}: {\n enabled: boolean;\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n}) =>\n useCallback(\n (event: React.WheelEvent) => {\n if (!enabled) return;\n\n event.preventDefault();\n // Scrolling up (negative deltaY) zooms in.\n setZoomLevel((prev) => clampZoom(prev + event.deltaY * -WHEEL_ZOOM_FACTOR));\n },\n [enabled, setZoomLevel],\n );\n\nexport const useNavigation = ({\n items,\n loop,\n startIndex,\n resetZoom,\n preloadImage,\n}: {\n items: LightboxItem[];\n loop: boolean;\n startIndex: number;\n resetZoom: () => void;\n preloadImage: (src: string) => void;\n}) => {\n const [currentIndex, setCurrentIndex] = useState(\n Math.max(0, Math.min(startIndex, items.length - 1)),\n );\n\n const goToIndex = useCallback(\n (index: number) => {\n if (items.length === 0) return;\n\n // Looping wraps both ways; otherwise the index sticks at the ends.\n const newIndex = loop\n ? ((index % items.length) + items.length) % items.length\n : Math.max(0, Math.min(index, items.length - 1));\n\n setCurrentIndex(newIndex);\n resetZoom();\n\n // Fetch the neighbours so a step in either direction shows immediately.\n [items[newIndex - 1], items[newIndex + 1]]\n .filter(isImageItem)\n .forEach((item) => preloadImage(item.src));\n },\n [items, loop, resetZoom, preloadImage],\n );\n\n const next = useCallback(() => {\n if (currentIndex < items.length - 1 || loop) goToIndex(currentIndex + 1);\n }, [currentIndex, items.length, loop, goToIndex]);\n\n const prev = useCallback(() => {\n if (currentIndex > 0 || loop) goToIndex(currentIndex - 1);\n }, [currentIndex, loop, goToIndex]);\n\n return { currentIndex, goToIndex, next, prev };\n};\n\nexport const useAutoplay = ({\n isOpen,\n autoplay,\n itemCount,\n currentIndex,\n next,\n}: {\n isOpen: boolean;\n autoplay: LightboxProps['autoplay'];\n itemCount: number;\n currentIndex: number;\n next: () => void;\n}) => {\n const [isAutoPlaying, setIsAutoPlaying] = useState(false);\n const timerRef = useRef<number | undefined>(undefined);\n\n useEffect(() => {\n if (!isAutoPlaying || !autoplay || itemCount <= 1) return;\n\n const interval =\n typeof autoplay === 'object'\n ? autoplay.interval || DEFAULT_AUTOPLAY_INTERVAL_MS\n : DEFAULT_AUTOPLAY_INTERVAL_MS;\n\n timerRef.current = window.setTimeout(next, interval);\n\n return () => window.clearTimeout(timerRef.current);\n }, [isAutoPlaying, autoplay, currentIndex, next, itemCount]);\n\n // Opening a gallery with more than one item starts the slideshow.\n useEffect(() => {\n setIsAutoPlaying(Boolean(isOpen && autoplay && itemCount > 1));\n }, [isOpen, autoplay, itemCount]);\n\n const stopAutoplay = useCallback(() => {\n setIsAutoPlaying(false);\n window.clearTimeout(timerRef.current);\n }, []);\n\n return { isAutoPlaying, setIsAutoPlaying, stopAutoplay };\n};\n\nexport const useLightboxKeyboard = ({\n isOpen,\n showControls,\n autoplay,\n close,\n prev,\n next,\n setIsAutoPlaying,\n}: {\n isOpen: boolean;\n showControls: boolean;\n autoplay: LightboxProps['autoplay'];\n close: () => void;\n prev: () => void;\n next: () => void;\n setIsAutoPlaying: React.Dispatch<React.SetStateAction<boolean>>;\n}) => {\n useEffect(() => {\n if (!isOpen) return;\n\n const arrows: Record<string, () => void> = { ArrowLeft: prev, ArrowRight: next };\n\n const handleKeyDown = (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Escape') {\n close();\n return;\n }\n\n const arrow = arrows[event.key];\n if (arrow && showControls) {\n event.preventDefault();\n arrow();\n return;\n }\n\n if (event.key === ' ') {\n event.preventDefault();\n if (autoplay) setIsAutoPlaying((playing) => !playing);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, showControls, close, prev, next, autoplay, setIsAutoPlaying]);\n};\n\n// Horizontal swipes step through the gallery; a downward swipe dismisses it.\nexport const useSwipe = ({\n prev,\n next,\n close,\n}: {\n prev: () => void;\n next: () => void;\n close: () => void;\n}) => {\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n\n const handleTouchStart = useCallback((event: React.TouchEvent) => {\n const touch = event.touches.length === 1 ? event.touches[0] : undefined;\n if (touch) touchStartRef.current = { x: touch.clientX, y: touch.clientY };\n }, []);\n\n const handleTouchEnd = useCallback(\n (event: React.TouchEvent) => {\n const start = touchStartRef.current;\n const touch = event.changedTouches[0];\n touchStartRef.current = null;\n if (!start || !touch) return;\n\n const deltaX = touch.clientX - start.x;\n const deltaY = touch.clientY - start.y;\n\n // Whichever axis moved further decides what the gesture meant.\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n if (Math.abs(deltaX) > MIN_SWIPE_DISTANCE) {\n if (deltaX > 0) prev();\n else next();\n }\n return;\n }\n\n if (deltaY > MIN_SWIPE_DISTANCE) close();\n },\n [prev, next, close],\n );\n\n return { handleTouchStart, handleTouchEnd };\n};\n"],"mappings":"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","names":["Typography","jsx","jsx","Fragment","jsx","jsxs","Box","jsx","jsxs","Box","PlayIcon","Box","jsx","Box","PlayIcon","useCallback","useState","useState","useCallback","jsx","jsxs","Typography"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/data-display/Lightbox/Lightbox.tsx","../../src/components/data-display/Lightbox/Lightbox.constants.ts","../../src/components/data-display/Lightbox/Lightbox.helpers.ts","../../src/components/data-display/Lightbox/lightbox-copy-context.tsx","../../src/components/data-display/Lightbox/LightboxMedia.tsx","../../src/components/data-display/Lightbox/LightboxCurrentMedia.tsx","../../src/components/data-display/Lightbox/LightboxControls.tsx","../../src/components/data-display/Lightbox/LightboxOverlay.tsx","../../src/components/data-display/Lightbox/LightboxStage.tsx","../../src/components/data-display/Lightbox/LightboxThumbnails.tsx","../../src/components/data-display/Lightbox/useLightbox.ts","../../src/components/data-display/Lightbox/Lightbox.hooks.ts"],"sourcesContent":["import { Dialog, Fade, Typography } from '@mui/material';\nimport React from 'react';\n\nimport { makeTestId } from './Lightbox.constants';\nimport { resolveLightboxProps } from './Lightbox.helpers';\nimport { LightboxCopyProvider } from './lightbox-copy-context';\nimport type { LightboxProps, LightboxRef } from './Lightbox.types';\nimport { LightboxCurrentMedia } from './LightboxCurrentMedia';\nimport { LightboxOverlay } from './LightboxOverlay';\nimport { LightboxStage } from './LightboxStage';\nimport { LightboxThumbnails } from './LightboxThumbnails';\nimport { useLightbox } from './useLightbox';\n\nconst DIALOG_STATIC_PROPS = {\n maxWidth: false,\n fullScreen: true,\n TransitionComponent: Fade,\n TransitionProps: { timeout: 300 },\n PaperProps: { sx: { background: 'rgba(0, 0, 0, 0.9)', backdropFilter: 'blur(2px)' } },\n 'aria-label': 'Lightbox',\n 'aria-labelledby': 'lightbox-title',\n role: 'dialog',\n 'aria-modal': 'true',\n} as const;\n\nexport const Lightbox = React.forwardRef<LightboxRef, LightboxProps>((componentProps, ref) => {\n const props = resolveLightboxProps(componentProps);\n const { isOpen, items, loop, autoplay, showControls, showCaptions, thumbnails, zoomable } = props;\n const { className, style, dataTestId } = props;\n\n const testId = makeTestId(dataTestId);\n const lightbox = useLightbox(props, ref);\n const { currentIndex, currentItem, zoom } = lightbox;\n\n return (\n <LightboxCopyProvider copy={props.copy}>\n <Dialog\n open={isOpen}\n onClose={lightbox.close}\n {...DIALOG_STATIC_PROPS}\n className={className}\n style={style}\n onTouchStart={lightbox.handleTouchStart}\n onTouchEnd={lightbox.handleTouchEnd}\n data-testid={dataTestId || 'lightbox'}\n >\n {/* Visually hidden title for screen readers */}\n <Typography id=\"lightbox-title\" variant=\"h6\" sx={{ position: 'absolute', left: -10000 }}>\n Lightbox - {currentItem?.alt || `Item ${currentIndex + 1} of ${items.length}`}\n </Typography>\n\n <LightboxOverlay\n testId={testId}\n itemCount={items.length}\n currentIndex={currentIndex}\n showControls={showControls}\n loop={loop}\n autoplay={autoplay}\n canZoom={lightbox.canZoom}\n isAutoPlaying={lightbox.isAutoPlaying}\n onClose={lightbox.close}\n onPrev={lightbox.prev}\n onNext={lightbox.next}\n onZoomIn={zoom.zoomIn}\n onZoomOut={zoom.zoomOut}\n onResetZoom={zoom.resetZoom}\n onToggleAutoplay={() => lightbox.setIsAutoPlaying((playing) => !playing)}\n />\n\n <LightboxStage\n items={items}\n currentItem={currentItem}\n currentIndex={currentIndex}\n isLoading={lightbox.isLoading}\n showCaptions={showCaptions}\n thumbnails={thumbnails}\n testId={testId}\n media={\n <LightboxCurrentMedia\n item={currentItem}\n index={currentIndex}\n total={items.length}\n zoomable={zoomable}\n zoom={zoom}\n testId={testId}\n onLoadingChange={lightbox.setIsLoading}\n onWheel={lightbox.handleWheel}\n />\n }\n thumbnailStrip={\n thumbnails &&\n items.length > 1 && (\n <LightboxThumbnails\n items={items}\n currentIndex={currentIndex}\n testId={testId}\n onSelect={lightbox.goToIndex}\n />\n )\n }\n />\n </Dialog>\n </LightboxCopyProvider>\n );\n});\n\nLightbox.displayName = 'Lightbox';\n\nexport default Lightbox;\n","export const MIN_ZOOM = 0.5;\nexport const MAX_ZOOM = 5;\nexport const ZOOM_STEP = 1.2;\n// Each wheel notch is ~100 deltaY, so this makes one notch a 1x zoom change.\nexport const WHEEL_ZOOM_FACTOR = 0.01;\n\nexport const DEFAULT_AUTOPLAY_INTERVAL_MS = 4000;\nexport const MIN_SWIPE_DISTANCE = 50;\nexport const OVERLAY_Z_INDEX = 1000;\n\nconst SCRIM = 'rgba(0, 0, 0, 0.5)';\nconst SCRIM_HOVER = 'rgba(0, 0, 0, 0.7)';\n\nexport const overlayButtonSx = {\n color: 'white',\n backgroundColor: SCRIM,\n '&:hover': { backgroundColor: SCRIM_HOVER },\n} as const;\n\n// The arrows drop their hover treatment at the ends of a non-looping gallery and\n// dim instead, so a disabled arrow does not look pressable.\nexport const navButtonSx = {\n color: 'white',\n backgroundColor: SCRIM,\n '&:hover:not(:disabled)': { backgroundColor: SCRIM_HOVER },\n '&:disabled': { color: 'rgba(255, 255, 255, 0.3)' },\n} as const;\n\nexport const captionSx = {\n color: 'white',\n textAlign: 'center',\n backgroundColor: SCRIM_HOVER,\n borderRadius: 1,\n} as const;\n\nexport const counterSx = {\n color: 'white',\n fontSize: '0.875rem',\n backgroundColor: SCRIM,\n borderRadius: 1,\n} as const;\n\nexport const thumbnailStripSx = {\n background: SCRIM,\n borderRadius: 1,\n} as const;\n\n// Every element gets `${dataTestId}-suffix` when the caller supplied an id, and\n// `lightbox-suffix` otherwise.\nexport const makeTestId =\n (dataTestId?: string) =>\n (suffix: string): string =>\n dataTestId ? `${dataTestId}-${suffix}` : `lightbox-${suffix}`;\n","import type { LightboxProps } from './Lightbox.types';\n\ntype LightboxDefaultedKeys =\n | 'isOpen'\n | 'items'\n | 'startIndex'\n | 'showControls'\n | 'showCaptions'\n | 'loop'\n | 'autoplay'\n | 'thumbnails'\n | 'zoomable';\n\nexport type ResolvedLightboxProps = LightboxProps &\n Required<Pick<LightboxProps, LightboxDefaultedKeys>>;\n\nconst LIGHTBOX_DEFAULTS: Pick<LightboxProps, LightboxDefaultedKeys> = {\n isOpen: false,\n items: [],\n startIndex: 0,\n showControls: true,\n showCaptions: true,\n loop: false,\n autoplay: false,\n thumbnails: false,\n zoomable: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would.\nconst definedProps = (props: LightboxProps): Partial<LightboxProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<LightboxProps>;\n\n// Applied as a merge rather than destructuring defaults, which would otherwise\n// put nine branches into the component's own complexity budget.\nexport const resolveLightboxProps = (props: LightboxProps): ResolvedLightboxProps =>\n ({ ...LIGHTBOX_DEFAULTS, ...definedProps(props) }) as ResolvedLightboxProps;\n","'use client';\n\nimport { createContext, useContext, type ReactNode } from 'react';\nimport React from 'react';\n\nimport type { LightboxCopy } from '../../../copy';\n\n/**\n * The lightbox's words, for the four control components that render them.\n *\n * A CONTEXT rather than props: the viewer is `Lightbox` → `LightboxOverlay` →\n * three separate control clusters, and threading one object down three hops is\n * how a copy port comes to exist, be required, and go unread. It stays a\n * single REQUIRED prop at the mount, which is the only place a host answers.\n */\nconst LightboxCopyContext = createContext<LightboxCopy | null>(null);\n\nexport function LightboxCopyProvider({\n copy,\n children,\n}: {\n copy: LightboxCopy;\n children: ReactNode;\n}): React.JSX.Element {\n return <LightboxCopyContext.Provider value={copy}>{children}</LightboxCopyContext.Provider>;\n}\n\n/**\n * The words this viewer renders — THROWS outside a provider rather than\n * falling back.\n *\n * Every one of them is an aria-label on a glyph, so a fallback would be the\n * one failure nobody sees in review: the sighted path renders identically\n * whichever language it is in.\n */\nexport function useLightboxCopy(): LightboxCopy {\n const copy = useContext(LightboxCopyContext);\n if (!copy) {\n throw new Error('useLightboxCopy must be rendered inside a <LightboxCopyProvider>');\n }\n return copy;\n}\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { LightboxItem } from './Lightbox.types';\n\nexport interface LightboxMediaProps {\n item: LightboxItem;\n index: number;\n total: number;\n zoomLevel: number;\n panOffset: { x: number; y: number };\n zoomable: boolean;\n isDragging: boolean;\n testId: (suffix: string) => string;\n onLoadStart: () => void;\n onLoaded: () => void;\n onWheel: (event: React.WheelEvent) => void;\n onDoubleClick: () => void;\n}\n\nconst cursorFor = (zoomLevel: number, zoomable: boolean): string => {\n if (zoomLevel > 1) return 'move';\n return zoomable ? 'zoom-in' : 'default';\n};\n\nexport const LightboxMedia: FC<LightboxMediaProps> = ({\n item,\n index,\n total,\n zoomLevel,\n panOffset,\n zoomable,\n isDragging,\n testId,\n onLoadStart,\n onLoaded,\n onWheel,\n onDoubleClick,\n}) => {\n if (item.type === 'video') {\n return (\n <video\n src={item.src}\n controls\n style={{ maxWidth: '90vw', maxHeight: '80vh', objectFit: 'contain' }}\n onLoadStart={onLoadStart}\n onLoadedData={onLoaded}\n aria-label={item.alt || `Video ${index + 1} of ${total}`}\n data-testid={testId('video')}\n />\n );\n }\n\n return (\n <img\n src={item.src}\n alt={item.alt || `Image ${index + 1} of ${total}`}\n style={{\n // At 1x the image is bounded by the viewport; once zoomed it is allowed\n // to overflow so there is something to pan around.\n maxWidth: zoomLevel === 1 ? '90vw' : 'none',\n maxHeight: zoomLevel === 1 ? '80vh' : 'none',\n transform: `scale(${zoomLevel}) translate(${panOffset.x}px, ${panOffset.y}px)`,\n transformOrigin: 'center',\n cursor: cursorFor(zoomLevel, zoomable),\n transition: isDragging ? 'none' : 'transform 0.2s ease',\n objectFit: 'contain',\n }}\n onLoad={onLoaded}\n onWheel={onWheel}\n onDoubleClick={onDoubleClick}\n draggable={false}\n data-testid={testId('image')}\n />\n );\n};\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { ZoomState } from './Lightbox.hooks';\nimport type { LightboxItem } from './Lightbox.types';\nimport { LightboxMedia } from './LightboxMedia';\n\nexport interface LightboxCurrentMediaProps {\n item?: LightboxItem;\n index: number;\n total: number;\n zoomable: boolean;\n zoom: ZoomState;\n testId: (suffix: string) => string;\n onLoadingChange: (loading: boolean) => void;\n onWheel: (event: React.WheelEvent) => void;\n}\n\n// Wires the active item to the zoom state. Double-clicking zooms in, or snaps\n// back to 1x if already zoomed.\nexport const LightboxCurrentMedia: FC<LightboxCurrentMediaProps> = ({\n item,\n index,\n total,\n zoomable,\n zoom,\n testId,\n onLoadingChange,\n onWheel,\n}) => {\n if (!item) return null;\n\n return (\n <LightboxMedia\n item={item}\n index={index}\n total={total}\n zoomLevel={zoom.zoomLevel}\n panOffset={zoom.panOffset}\n zoomable={zoomable}\n // Drag-panning is not wired up, so the transform transition is always on.\n isDragging={false}\n testId={testId}\n onLoadStart={() => onLoadingChange(true)}\n onLoaded={() => onLoadingChange(false)}\n onWheel={onWheel}\n onDoubleClick={zoom.zoomLevel > 1 ? zoom.resetZoom : zoom.zoomIn}\n />\n );\n};\n","import PrevIcon from '@mui/icons-material/ChevronLeft';\nimport NextIcon from '@mui/icons-material/ChevronRight';\nimport CloseIcon from '@mui/icons-material/Close';\nimport PauseIcon from '@mui/icons-material/Pause';\nimport PlayIcon from '@mui/icons-material/PlayArrow';\nimport ResetZoomIcon from '@mui/icons-material/RestartAlt';\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\nimport { Box, IconButton } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { navButtonSx, OVERLAY_Z_INDEX, overlayButtonSx } from './Lightbox.constants';\nimport { useLightboxCopy } from './lightbox-copy-context';\n\ntype TestId = (suffix: string) => string;\n\nexport const LightboxCloseButton: FC<{ testId: TestId; onClose: () => void }> = ({\n testId,\n onClose,\n}) => {\n const copy = useLightboxCopy();\n return (\n <IconButton\n onClick={onClose}\n sx={{ ...overlayButtonSx, position: 'absolute', top: 16, right: 16, zIndex: OVERLAY_Z_INDEX }}\n aria-label={copy.close}\n data-testid={testId('close')}\n >\n <CloseIcon />\n </IconButton>\n );\n};\n\nconst arrowSx = (side: 'left' | 'right') =>\n ({\n ...navButtonSx,\n position: 'absolute',\n [side]: 16,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: OVERLAY_Z_INDEX,\n }) as const;\n\nexport interface LightboxNavButtonsProps {\n testId: TestId;\n atStart: boolean;\n atEnd: boolean;\n onPrev: () => void;\n onNext: () => void;\n}\n\nexport const LightboxNavButtons: FC<LightboxNavButtonsProps> = ({\n testId,\n atStart,\n atEnd,\n onPrev,\n onNext,\n}) => {\n const copy = useLightboxCopy();\n return (\n <>\n <IconButton\n onClick={onPrev}\n disabled={atStart}\n sx={arrowSx('left')}\n aria-label={copy.previous}\n data-testid={testId('prev')}\n >\n <PrevIcon />\n </IconButton>\n\n <IconButton\n onClick={onNext}\n disabled={atEnd}\n sx={arrowSx('right')}\n aria-label={copy.next}\n data-testid={testId('next')}\n >\n <NextIcon />\n </IconButton>\n </>\n );\n};\n\nexport interface LightboxZoomControlsProps {\n testId: TestId;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetZoom: () => void;\n}\n\nexport const LightboxZoomControls: FC<LightboxZoomControlsProps> = ({\n testId,\n onZoomIn,\n onZoomOut,\n onResetZoom,\n}) => {\n const copy = useLightboxCopy();\n return (\n <Box\n sx={{\n position: 'absolute',\n top: 16,\n left: 16,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n zIndex: OVERLAY_Z_INDEX,\n }}\n data-testid={testId('zoom-controls')}\n >\n <IconButton onClick={onZoomIn} sx={overlayButtonSx} aria-label={copy.zoomIn} data-testid={testId('zoom-in')}>\n <ZoomInIcon />\n </IconButton>\n <IconButton\n onClick={onZoomOut}\n sx={overlayButtonSx}\n aria-label={copy.zoomOut}\n data-testid={testId('zoom-out')}\n >\n <ZoomOutIcon />\n </IconButton>\n <IconButton\n onClick={onResetZoom}\n sx={overlayButtonSx}\n aria-label={copy.resetZoom}\n data-testid={testId('zoom-reset')}\n >\n <ResetZoomIcon />\n </IconButton>\n </Box>\n );\n};\n\nexport interface LightboxAutoplayButtonProps {\n testId: TestId;\n isAutoPlaying: boolean;\n onToggle: () => void;\n}\n\nexport const LightboxAutoplayButton: FC<LightboxAutoplayButtonProps> = ({\n testId,\n isAutoPlaying,\n onToggle,\n}) => {\n const copy = useLightboxCopy();\n return (\n <IconButton\n onClick={onToggle}\n sx={{\n ...overlayButtonSx,\n position: 'absolute',\n top: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: OVERLAY_Z_INDEX,\n }}\n aria-label={isAutoPlaying ? copy.pause : copy.play}\n data-testid={testId('autoplay')}\n >\n {isAutoPlaying ? <PauseIcon /> : <PlayIcon />}\n </IconButton>\n );\n};\n","import type { FC } from 'react';\nimport React from 'react';\n\nimport type { LightboxProps } from './Lightbox.types';\nimport {\n LightboxAutoplayButton,\n LightboxCloseButton,\n LightboxNavButtons,\n LightboxZoomControls,\n} from './LightboxControls';\n\nexport interface LightboxOverlayProps {\n testId: (suffix: string) => string;\n itemCount: number;\n currentIndex: number;\n showControls: boolean;\n loop: boolean;\n autoplay: LightboxProps['autoplay'];\n canZoom: boolean;\n isAutoPlaying: boolean;\n onClose: () => void;\n onPrev: () => void;\n onNext: () => void;\n onZoomIn: () => void;\n onZoomOut: () => void;\n onResetZoom: () => void;\n onToggleAutoplay: () => void;\n}\n\n// Everything that floats above the media: dismiss, step, zoom and slideshow.\nexport const LightboxOverlay: FC<LightboxOverlayProps> = ({\n testId,\n itemCount,\n currentIndex,\n showControls,\n loop,\n autoplay,\n canZoom,\n isAutoPlaying,\n onClose,\n onPrev,\n onNext,\n onZoomIn,\n onZoomOut,\n onResetZoom,\n onToggleAutoplay,\n}) => {\n const hasMultiple = itemCount > 1;\n\n return (\n <>\n <LightboxCloseButton testId={testId} onClose={onClose} />\n\n {showControls && hasMultiple && (\n <LightboxNavButtons\n testId={testId}\n // A non-looping gallery runs out of moves at either end.\n atStart={!loop && currentIndex === 0}\n atEnd={!loop && currentIndex === itemCount - 1}\n onPrev={onPrev}\n onNext={onNext}\n />\n )}\n\n {canZoom && (\n <LightboxZoomControls\n testId={testId}\n onZoomIn={onZoomIn}\n onZoomOut={onZoomOut}\n onResetZoom={onResetZoom}\n />\n )}\n\n {autoplay && hasMultiple && (\n <LightboxAutoplayButton\n testId={testId}\n isAutoPlaying={isAutoPlaying}\n onToggle={onToggleAutoplay}\n />\n )}\n </>\n );\n};\n","import { Box, CircularProgress, DialogContent, Typography } from '@mui/material';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\n\nimport { captionSx, counterSx } from './Lightbox.constants';\nimport type { LightboxItem } from './Lightbox.types';\n\ntype TestId = (suffix: string) => string;\n\nexport interface LightboxStageProps {\n items: LightboxItem[];\n currentItem?: LightboxItem;\n currentIndex: number;\n isLoading: boolean;\n showCaptions: boolean;\n thumbnails: boolean;\n testId: TestId;\n media: ReactNode;\n thumbnailStrip: ReactNode;\n}\n\n// The viewport itself: the media, whatever floats over it, and the filmstrip.\nexport const LightboxStage: FC<LightboxStageProps> = ({\n items,\n currentItem,\n currentIndex,\n isLoading,\n showCaptions,\n thumbnails,\n testId,\n media,\n thumbnailStrip,\n}) => (\n <DialogContent\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n position: 'relative',\n height: '100vh',\n overflow: 'hidden',\n }}\n data-testid={testId('content')}\n >\n {isLoading && (\n <CircularProgress\n sx={{ position: 'absolute', color: 'white', zIndex: 999 }}\n data-testid={testId('loading')}\n />\n )}\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '100%',\n height: '100%',\n }}\n data-testid={testId('image-container')}\n >\n {media}\n </Box>\n\n {showCaptions && currentItem?.caption && (\n <Typography\n id=\"lightbox-description\"\n sx={{\n ...captionSx,\n position: 'absolute',\n // Sit above the filmstrip when there is one.\n bottom: thumbnails ? 120 : 16,\n left: '50%',\n transform: 'translateX(-50%)',\n maxWidth: '80vw',\n padding: 2,\n }}\n data-testid={testId('caption')}\n >\n {currentItem.caption}\n </Typography>\n )}\n\n {items.length > 1 && (\n <Typography\n sx={{ ...counterSx, position: 'absolute', top: 70, right: 16, padding: '4px 8px' }}\n aria-live=\"polite\"\n data-testid={testId('counter')}\n >\n {currentIndex + 1} / {items.length}\n </Typography>\n )}\n\n {thumbnailStrip}\n </DialogContent>\n);\n","import PlayIcon from '@mui/icons-material/PlayArrow';\nimport { Box } from '@mui/material';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { thumbnailStripSx } from './Lightbox.constants';\nimport type { LightboxItem } from './Lightbox.types';\n\nconst THUMB_WIDTH = 60;\nconst THUMB_HEIGHT = 40;\n\nconst VideoThumbnail: FC = () => (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n background: 'rgba(255, 255, 255, 0.1)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <PlayIcon sx={{ color: 'white', fontSize: 16 }} />\n </Box>\n);\n\nexport interface LightboxThumbnailsProps {\n items: LightboxItem[];\n currentIndex: number;\n testId: (suffix: string) => string;\n onSelect: (index: number) => void;\n}\n\nexport const LightboxThumbnails: FC<LightboxThumbnailsProps> = ({\n items,\n currentIndex,\n testId,\n onSelect,\n}) => (\n <Box\n sx={{\n ...thumbnailStripSx,\n position: 'absolute',\n bottom: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n gap: 1,\n maxWidth: '90vw',\n overflowX: 'auto',\n padding: 1,\n }}\n data-testid={testId('thumbnails')}\n >\n {items.map((item, index) => (\n <Box\n key={`${item.src}-${index}`}\n onClick={() => onSelect(index)}\n sx={{\n width: THUMB_WIDTH,\n height: THUMB_HEIGHT,\n cursor: 'pointer',\n border: currentIndex === index ? '2px solid white' : '2px solid transparent',\n borderRadius: 0.5,\n overflow: 'hidden',\n flexShrink: 0,\n '&:hover': { border: '2px solid rgba(255, 255, 255, 0.7)' },\n }}\n data-testid={testId(`thumbnail-${index}`)}\n >\n {item.type === 'video' ? (\n <VideoThumbnail />\n ) : (\n <img\n src={item.src}\n alt={item.alt || `Thumbnail ${index + 1}`}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n )}\n </Box>\n ))}\n </Box>\n);\n","import { useCallback, useImperativeHandle, useState } from 'react';\nimport type React from 'react';\n\nimport {\n useAutoplay,\n useLightboxKeyboard,\n useNavigation,\n usePreloader,\n useSwipe,\n useWheelZoom,\n useZoomState,\n} from './Lightbox.hooks';\nimport type { ResolvedLightboxProps } from './Lightbox.helpers';\nimport type { LightboxRef } from './Lightbox.types';\n\n// Wires the independent concerns together in dependency order: zoom, then\n// navigation (which resets zoom), then autoplay (which advances), then the\n// input handlers that close.\nexport const useLightbox = (\n { isOpen, onClose, items, startIndex, showControls, loop, autoplay, zoomable }: ResolvedLightboxProps,\n ref: React.ForwardedRef<LightboxRef>,\n) => {\n const [isLoading, setIsLoading] = useState(false);\n\n const preloadImage = usePreloader();\n const zoom = useZoomState();\n\n const { currentIndex, goToIndex, next, prev } = useNavigation({\n items,\n loop,\n startIndex,\n resetZoom: zoom.resetZoom,\n preloadImage,\n });\n\n const currentItem = items[currentIndex];\n const canZoom = Boolean(zoomable && currentItem && currentItem.type !== 'video');\n\n const handleWheel = useWheelZoom({ enabled: canZoom, setZoomLevel: zoom.setZoomLevel });\n\n const { isAutoPlaying, setIsAutoPlaying, stopAutoplay } = useAutoplay({\n isOpen,\n autoplay,\n itemCount: items.length,\n currentIndex,\n next,\n });\n\n const close = useCallback(() => {\n stopAutoplay();\n onClose();\n }, [stopAutoplay, onClose]);\n\n // open() with no argument starts at the first item.\n const open = useCallback((index = 0) => goToIndex(index), [goToIndex]);\n\n useImperativeHandle(ref, () => ({ open, close, next, prev, goTo: goToIndex }));\n\n useLightboxKeyboard({ isOpen, showControls, autoplay, close, prev, next, setIsAutoPlaying });\n\n const { handleTouchStart, handleTouchEnd } = useSwipe({ prev, next, close });\n\n return {\n currentIndex,\n currentItem,\n canZoom,\n isLoading,\n setIsLoading,\n isAutoPlaying,\n setIsAutoPlaying,\n zoom,\n handleWheel,\n goToIndex,\n next,\n prev,\n close,\n handleTouchStart,\n handleTouchEnd,\n };\n};\n","import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n DEFAULT_AUTOPLAY_INTERVAL_MS,\n MAX_ZOOM,\n MIN_SWIPE_DISTANCE,\n MIN_ZOOM,\n WHEEL_ZOOM_FACTOR,\n ZOOM_STEP,\n} from './Lightbox.constants';\nimport type { LightboxItem, LightboxProps } from './Lightbox.types';\n\nconst clampZoom = (zoom: number): number => Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));\n\n// Items with no explicit type are images.\nconst isImageItem = (item?: LightboxItem): item is LightboxItem =>\n Boolean(item && (item.type === 'image' || !item.type));\n\n// Images are fetched once and remembered, so stepping back to one is instant.\nexport const usePreloader = () => {\n const [preloadedImages, setPreloadedImages] = useState<Set<string>>(new Set());\n\n return useCallback(\n (src: string) => {\n if (preloadedImages.has(src)) return;\n\n const img = new window.Image();\n img.onload = () => setPreloadedImages((prev) => new Set([...prev, src]));\n img.src = src;\n },\n [preloadedImages],\n );\n};\n\nexport interface ZoomState {\n zoomLevel: number;\n panOffset: { x: number; y: number };\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n resetZoom: () => void;\n zoomIn: () => void;\n zoomOut: () => void;\n}\n\nexport const useZoomState = (): ZoomState => {\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panOffset, setPanOffset] = useState({ x: 0, y: 0 });\n\n const resetZoom = useCallback(() => {\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }, []);\n\n const zoomIn = useCallback(() => setZoomLevel((prev) => Math.min(MAX_ZOOM, prev * ZOOM_STEP)), []);\n const zoomOut = useCallback(\n () => setZoomLevel((prev) => Math.max(MIN_ZOOM, prev / ZOOM_STEP)),\n [],\n );\n\n return { zoomLevel, panOffset, setZoomLevel, resetZoom, zoomIn, zoomOut };\n};\n\nexport const useWheelZoom = ({\n enabled,\n setZoomLevel,\n}: {\n enabled: boolean;\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n}) =>\n useCallback(\n (event: React.WheelEvent) => {\n if (!enabled) return;\n\n event.preventDefault();\n // Scrolling up (negative deltaY) zooms in.\n setZoomLevel((prev) => clampZoom(prev + event.deltaY * -WHEEL_ZOOM_FACTOR));\n },\n [enabled, setZoomLevel],\n );\n\nexport const useNavigation = ({\n items,\n loop,\n startIndex,\n resetZoom,\n preloadImage,\n}: {\n items: LightboxItem[];\n loop: boolean;\n startIndex: number;\n resetZoom: () => void;\n preloadImage: (src: string) => void;\n}) => {\n const [currentIndex, setCurrentIndex] = useState(\n Math.max(0, Math.min(startIndex, items.length - 1)),\n );\n\n const goToIndex = useCallback(\n (index: number) => {\n if (items.length === 0) return;\n\n // Looping wraps both ways; otherwise the index sticks at the ends.\n const newIndex = loop\n ? ((index % items.length) + items.length) % items.length\n : Math.max(0, Math.min(index, items.length - 1));\n\n setCurrentIndex(newIndex);\n resetZoom();\n\n // Fetch the neighbours so a step in either direction shows immediately.\n [items[newIndex - 1], items[newIndex + 1]]\n .filter(isImageItem)\n .forEach((item) => preloadImage(item.src));\n },\n [items, loop, resetZoom, preloadImage],\n );\n\n const next = useCallback(() => {\n if (currentIndex < items.length - 1 || loop) goToIndex(currentIndex + 1);\n }, [currentIndex, items.length, loop, goToIndex]);\n\n const prev = useCallback(() => {\n if (currentIndex > 0 || loop) goToIndex(currentIndex - 1);\n }, [currentIndex, loop, goToIndex]);\n\n return { currentIndex, goToIndex, next, prev };\n};\n\nexport const useAutoplay = ({\n isOpen,\n autoplay,\n itemCount,\n currentIndex,\n next,\n}: {\n isOpen: boolean;\n autoplay: LightboxProps['autoplay'];\n itemCount: number;\n currentIndex: number;\n next: () => void;\n}) => {\n const [isAutoPlaying, setIsAutoPlaying] = useState(false);\n const timerRef = useRef<number | undefined>(undefined);\n\n useEffect(() => {\n if (!isAutoPlaying || !autoplay || itemCount <= 1) return;\n\n const interval =\n typeof autoplay === 'object'\n ? autoplay.interval || DEFAULT_AUTOPLAY_INTERVAL_MS\n : DEFAULT_AUTOPLAY_INTERVAL_MS;\n\n timerRef.current = window.setTimeout(next, interval);\n\n return () => window.clearTimeout(timerRef.current);\n }, [isAutoPlaying, autoplay, currentIndex, next, itemCount]);\n\n // Opening a gallery with more than one item starts the slideshow.\n useEffect(() => {\n setIsAutoPlaying(Boolean(isOpen && autoplay && itemCount > 1));\n }, [isOpen, autoplay, itemCount]);\n\n const stopAutoplay = useCallback(() => {\n setIsAutoPlaying(false);\n window.clearTimeout(timerRef.current);\n }, []);\n\n return { isAutoPlaying, setIsAutoPlaying, stopAutoplay };\n};\n\nexport const useLightboxKeyboard = ({\n isOpen,\n showControls,\n autoplay,\n close,\n prev,\n next,\n setIsAutoPlaying,\n}: {\n isOpen: boolean;\n showControls: boolean;\n autoplay: LightboxProps['autoplay'];\n close: () => void;\n prev: () => void;\n next: () => void;\n setIsAutoPlaying: React.Dispatch<React.SetStateAction<boolean>>;\n}) => {\n useEffect(() => {\n if (!isOpen) return;\n\n const arrows: Record<string, () => void> = { ArrowLeft: prev, ArrowRight: next };\n\n const handleKeyDown = (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Escape') {\n close();\n return;\n }\n\n const arrow = arrows[event.key];\n if (arrow && showControls) {\n event.preventDefault();\n arrow();\n return;\n }\n\n if (event.key === ' ') {\n event.preventDefault();\n if (autoplay) setIsAutoPlaying((playing) => !playing);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, showControls, close, prev, next, autoplay, setIsAutoPlaying]);\n};\n\n// Horizontal swipes step through the gallery; a downward swipe dismisses it.\nexport const useSwipe = ({\n prev,\n next,\n close,\n}: {\n prev: () => void;\n next: () => void;\n close: () => void;\n}) => {\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n\n const handleTouchStart = useCallback((event: React.TouchEvent) => {\n const touch = event.touches.length === 1 ? event.touches[0] : undefined;\n if (touch) touchStartRef.current = { x: touch.clientX, y: touch.clientY };\n }, []);\n\n const handleTouchEnd = useCallback(\n (event: React.TouchEvent) => {\n const start = touchStartRef.current;\n const touch = event.changedTouches[0];\n touchStartRef.current = null;\n if (!start || !touch) return;\n\n const deltaX = touch.clientX - start.x;\n const deltaY = touch.clientY - start.y;\n\n // Whichever axis moved further decides what the gesture meant.\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n if (Math.abs(deltaX) > MIN_SWIPE_DISTANCE) {\n if (deltaX > 0) prev();\n else next();\n }\n return;\n }\n\n if (deltaY > MIN_SWIPE_DISTANCE) close();\n },\n [prev, next, close],\n );\n\n return { handleTouchStart, handleTouchEnd };\n};\n"],"mappings":"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","names":["Typography","jsx","jsx","jsx","Fragment","jsx","jsxs","Box","jsx","jsxs","Box","PlayIcon","Box","jsx","Box","PlayIcon","useCallback","useState","useState","useCallback","jsx","jsxs","Typography"]}
|
|
@@ -83,6 +83,7 @@ var ControlButton = styled(IconButton)(({ theme }) => ({
|
|
|
83
83
|
}
|
|
84
84
|
}));
|
|
85
85
|
var MapControlBar = ({
|
|
86
|
+
copy,
|
|
86
87
|
zoom,
|
|
87
88
|
mapType,
|
|
88
89
|
onZoomIn,
|
|
@@ -91,34 +92,34 @@ var MapControlBar = ({
|
|
|
91
92
|
onToggleMapType,
|
|
92
93
|
onToggleFullscreen
|
|
93
94
|
}) => /* @__PURE__ */ jsxs(MapControls, { "data-testid": "map-controls", children: [
|
|
94
|
-
/* @__PURE__ */ jsx(Tooltip, { title:
|
|
95
|
+
/* @__PURE__ */ jsx(Tooltip, { title: copy.zoomIn, placement: "left", children: /* @__PURE__ */ jsx(
|
|
95
96
|
ControlButton,
|
|
96
97
|
{
|
|
97
98
|
size: "small",
|
|
98
99
|
onClick: onZoomIn,
|
|
99
|
-
"aria-label":
|
|
100
|
+
"aria-label": copy.zoomIn,
|
|
100
101
|
"data-testid": "zoom-in-button",
|
|
101
102
|
disabled: zoom >= MAX_ZOOM,
|
|
102
103
|
children: /* @__PURE__ */ jsx(ZoomInIcon, { fontSize: "small" })
|
|
103
104
|
}
|
|
104
105
|
) }),
|
|
105
|
-
/* @__PURE__ */ jsx(Tooltip, { title:
|
|
106
|
+
/* @__PURE__ */ jsx(Tooltip, { title: copy.zoomOut, placement: "left", children: /* @__PURE__ */ jsx(
|
|
106
107
|
ControlButton,
|
|
107
108
|
{
|
|
108
109
|
size: "small",
|
|
109
110
|
onClick: onZoomOut,
|
|
110
|
-
"aria-label":
|
|
111
|
+
"aria-label": copy.zoomOut,
|
|
111
112
|
"data-testid": "zoom-out-button",
|
|
112
113
|
disabled: zoom <= MIN_ZOOM,
|
|
113
114
|
children: /* @__PURE__ */ jsx(ZoomOutIcon, { fontSize: "small" })
|
|
114
115
|
}
|
|
115
116
|
) }),
|
|
116
|
-
/* @__PURE__ */ jsx(Tooltip, { title:
|
|
117
|
+
/* @__PURE__ */ jsx(Tooltip, { title: copy.center, placement: "left", children: /* @__PURE__ */ jsx(
|
|
117
118
|
ControlButton,
|
|
118
119
|
{
|
|
119
120
|
size: "small",
|
|
120
121
|
onClick: onCenter,
|
|
121
|
-
"aria-label":
|
|
122
|
+
"aria-label": copy.center,
|
|
122
123
|
"data-testid": "center-button",
|
|
123
124
|
children: /* @__PURE__ */ jsx(CenterIcon, { fontSize: "small" })
|
|
124
125
|
}
|
|
@@ -128,17 +129,17 @@ var MapControlBar = ({
|
|
|
128
129
|
{
|
|
129
130
|
size: "small",
|
|
130
131
|
onClick: onToggleMapType,
|
|
131
|
-
"aria-label":
|
|
132
|
+
"aria-label": copy.mapType,
|
|
132
133
|
"data-testid": "map-type-button",
|
|
133
134
|
children: /* @__PURE__ */ jsx(LayersIcon, { fontSize: "small" })
|
|
134
135
|
}
|
|
135
136
|
) }),
|
|
136
|
-
/* @__PURE__ */ jsx(Tooltip, { title:
|
|
137
|
+
/* @__PURE__ */ jsx(Tooltip, { title: copy.fullscreen, placement: "left", children: /* @__PURE__ */ jsx(
|
|
137
138
|
ControlButton,
|
|
138
139
|
{
|
|
139
140
|
size: "small",
|
|
140
141
|
onClick: onToggleFullscreen,
|
|
141
|
-
"aria-label":
|
|
142
|
+
"aria-label": copy.fullscreen,
|
|
142
143
|
"data-testid": "fullscreen-button",
|
|
143
144
|
children: /* @__PURE__ */ jsx(FullscreenIcon, { fontSize: "small" })
|
|
144
145
|
}
|
|
@@ -216,6 +217,7 @@ var SearchField = styled2(TextField)(({ theme }) => ({
|
|
|
216
217
|
}
|
|
217
218
|
}));
|
|
218
219
|
var MapSearchBar = ({
|
|
220
|
+
label,
|
|
219
221
|
value,
|
|
220
222
|
placeholder,
|
|
221
223
|
isSearching,
|
|
@@ -234,7 +236,7 @@ var MapSearchBar = ({
|
|
|
234
236
|
startAdornment: /* @__PURE__ */ jsx3(InputAdornment, { position: "start", children: /* @__PURE__ */ jsx3(SearchIcon, { fontSize: "small", sx: { opacity: isSearching ? 0.5 : 1 } }) })
|
|
235
237
|
},
|
|
236
238
|
disabled: isSearching,
|
|
237
|
-
"aria-label":
|
|
239
|
+
"aria-label": label
|
|
238
240
|
}
|
|
239
241
|
) });
|
|
240
242
|
|
|
@@ -255,6 +257,7 @@ var MapLayers = ({ settings, zoom, mapType, search, controls }) => {
|
|
|
255
257
|
settings.showSearch && /* @__PURE__ */ jsx4(
|
|
256
258
|
MapSearchBar,
|
|
257
259
|
{
|
|
260
|
+
label: settings.copy.search,
|
|
258
261
|
value: search.searchValue,
|
|
259
262
|
placeholder: settings.searchPlaceholder,
|
|
260
263
|
isSearching: search.isSearching,
|
|
@@ -265,6 +268,7 @@ var MapLayers = ({ settings, zoom, mapType, search, controls }) => {
|
|
|
265
268
|
settings.showControls && /* @__PURE__ */ jsx4(
|
|
266
269
|
MapControlBar,
|
|
267
270
|
{
|
|
271
|
+
copy: settings.copy,
|
|
268
272
|
zoom,
|
|
269
273
|
mapType,
|
|
270
274
|
onZoomIn: controls.handleZoomIn,
|