@12-apps/ui 6.5.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.
Files changed (86) hide show
  1. package/dist/{chunk-3KWD5Y5O.js → chunk-RXE5CUUE.js} +8 -4
  2. package/dist/chunk-RXE5CUUE.js.map +1 -0
  3. package/dist/data-display/Alert.js +1 -1
  4. package/dist/data-display/AsyncStateContainer.js +2 -1
  5. package/dist/data-display/AsyncStateContainer.js.map +1 -1
  6. package/dist/data-display/Banner.js +4 -2
  7. package/dist/data-display/Banner.js.map +1 -1
  8. package/dist/data-display/CardKit.js +3 -1
  9. package/dist/data-display/CardKit.js.map +1 -1
  10. package/dist/data-display/Carousel.js +5 -2
  11. package/dist/data-display/Carousel.js.map +1 -1
  12. package/dist/data-display/DataViews.js +8 -7
  13. package/dist/data-display/DataViews.js.map +1 -1
  14. package/dist/data-display/Lightbox.js +147 -117
  15. package/dist/data-display/Lightbox.js.map +1 -1
  16. package/dist/data-display/MapPreview.js +14 -10
  17. package/dist/data-display/MapPreview.js.map +1 -1
  18. package/dist/pt-BR.js +46 -3
  19. package/dist/pt-BR.js.map +1 -1
  20. package/dist/types/components/data-display/Alert/Alert.d.ts +9 -2
  21. package/dist/types/components/data-display/Alert/Alert.d.ts.map +1 -1
  22. package/dist/types/components/data-display/Alert/Alert.types.d.ts +25 -9
  23. package/dist/types/components/data-display/Alert/Alert.types.d.ts.map +1 -1
  24. package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.d.ts.map +1 -1
  25. package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.types.d.ts +6 -0
  26. package/dist/types/components/data-display/AsyncStateContainer/AsyncStateContainer.types.d.ts.map +1 -1
  27. package/dist/types/components/data-display/Banner/Banner.d.ts.map +1 -1
  28. package/dist/types/components/data-display/Banner/Banner.types.d.ts +2 -0
  29. package/dist/types/components/data-display/Banner/Banner.types.d.ts.map +1 -1
  30. package/dist/types/components/data-display/CardKit/card-actions-context.d.ts +3 -1
  31. package/dist/types/components/data-display/CardKit/card-actions-context.d.ts.map +1 -1
  32. package/dist/types/components/data-display/Carousel/Carousel.chrome.d.ts +3 -0
  33. package/dist/types/components/data-display/Carousel/Carousel.chrome.d.ts.map +1 -1
  34. package/dist/types/components/data-display/Carousel/Carousel.parts.d.ts.map +1 -1
  35. package/dist/types/components/data-display/Carousel/Carousel.types.d.ts +7 -0
  36. package/dist/types/components/data-display/Carousel/Carousel.types.d.ts.map +1 -1
  37. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts +25 -0
  38. package/dist/types/components/data-display/DataViews/data-views-copy.d.ts.map +1 -1
  39. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts.map +1 -1
  40. package/dist/types/components/data-display/DataViews/data-views-table-parts.d.ts.map +1 -1
  41. package/dist/types/components/data-display/Lightbox/Lightbox.d.ts.map +1 -1
  42. package/dist/types/components/data-display/Lightbox/Lightbox.types.d.ts +9 -0
  43. package/dist/types/components/data-display/Lightbox/Lightbox.types.d.ts.map +1 -1
  44. package/dist/types/components/data-display/Lightbox/LightboxControls.d.ts.map +1 -1
  45. package/dist/types/components/data-display/Lightbox/lightbox-copy-context.d.ts +17 -0
  46. package/dist/types/components/data-display/Lightbox/lightbox-copy-context.d.ts.map +1 -0
  47. package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts +7 -0
  48. package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts.map +1 -1
  49. package/dist/types/components/data-display/MapPreview/MapLayers.d.ts.map +1 -1
  50. package/dist/types/components/data-display/MapPreview/MapPreview.types.d.ts +9 -0
  51. package/dist/types/components/data-display/MapPreview/MapPreview.types.d.ts.map +1 -1
  52. package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts +2 -0
  53. package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts.map +1 -1
  54. package/dist/types/copy.d.ts +53 -0
  55. package/dist/types/copy.d.ts.map +1 -1
  56. package/dist/types/pt-BR.d.ts +5 -1
  57. package/dist/types/pt-BR.d.ts.map +1 -1
  58. package/package.json +1 -1
  59. package/src/components/data-display/Alert/Alert.tsx +22 -5
  60. package/src/components/data-display/Alert/Alert.types.ts +20 -10
  61. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.tsx +2 -1
  62. package/src/components/data-display/AsyncStateContainer/AsyncStateContainer.types.ts +6 -0
  63. package/src/components/data-display/Banner/Banner.tsx +5 -2
  64. package/src/components/data-display/Banner/Banner.types.ts +2 -0
  65. package/src/components/data-display/CardKit/card-actions-context.tsx +4 -0
  66. package/src/components/data-display/Carousel/Carousel.chrome.tsx +5 -0
  67. package/src/components/data-display/Carousel/Carousel.parts.tsx +4 -3
  68. package/src/components/data-display/Carousel/Carousel.types.ts +7 -0
  69. package/src/components/data-display/DataViews/data-views-copy.ts +25 -0
  70. package/src/components/data-display/DataViews/data-views-display-tabs.tsx +2 -2
  71. package/src/components/data-display/DataViews/data-views-export.tsx +1 -1
  72. package/src/components/data-display/DataViews/data-views-layout-context.tsx +3 -1
  73. package/src/components/data-display/DataViews/data-views-more-filters.tsx +2 -2
  74. package/src/components/data-display/DataViews/data-views-range-pill.tsx +1 -1
  75. package/src/components/data-display/DataViews/data-views-table-parts.tsx +1 -0
  76. package/src/components/data-display/Lightbox/Lightbox.tsx +3 -0
  77. package/src/components/data-display/Lightbox/Lightbox.types.ts +9 -0
  78. package/src/components/data-display/Lightbox/LightboxControls.tsx +28 -15
  79. package/src/components/data-display/Lightbox/lightbox-copy-context.tsx +42 -0
  80. package/src/components/data-display/MapPreview/MapControlBar.tsx +17 -9
  81. package/src/components/data-display/MapPreview/MapLayers.tsx +2 -0
  82. package/src/components/data-display/MapPreview/MapPreview.types.ts +10 -0
  83. package/src/components/data-display/MapPreview/MapSearchBar.tsx +4 -1
  84. package/src/copy.ts +57 -0
  85. package/src/pt-BR.ts +48 -1
  86. package/dist/chunk-3KWD5Y5O.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/components/data-display/Carousel/Carousel.tsx","../../src/components/data-display/Carousel/Carousel.hooks.ts","../../src/components/data-display/Carousel/Carousel.parts.tsx","../../src/components/data-display/Carousel/Carousel.chrome.tsx","../../src/components/data-display/Carousel/Carousel.slide.tsx","../../src/components/data-display/Carousel/Carousel.styles.ts"],"sourcesContent":["import { Box, CircularProgress, Fade, Slide, useTheme, Zoom } from '@mui/material';\nimport React, { useCallback, useRef } from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { useCarouselNavigation } from './Carousel.hooks';\nimport { CarouselChrome } from './Carousel.chrome';\nimport { CarouselTrack } from './Carousel.slide';\nimport { containerStyles } from './Carousel.styles';\nimport type { CarouselItem, CarouselProps } from './Carousel.types';\nimport { muiColor } from '../../../tokens/scales';\n\nexport { CarouselArrows, CarouselIndicators, CarouselThumbnails } from './Carousel.parts';\n\nconst DEFAULTS = {\n variant: 'default',\n size: 'md',\n color: 'primary',\n autoPlay: false,\n autoPlayInterval: 3000,\n loop: true,\n showIndicators: true,\n showArrows: true,\n showThumbnails: false,\n glow: false,\n pulse: false,\n glass: false,\n gradient: false,\n loading: false,\n disabled: false,\n height: 400,\n width: '100%',\n pauseOnHover: true,\n indicatorPosition: 'bottom',\n arrowPosition: 'overlay',\n animation: 'slide',\n} satisfies Partial<CarouselProps>;\n\ntype ResolvedCarouselProps = CarouselProps & Required<Pick<CarouselProps, keyof typeof DEFAULTS>>;\n\n/**\n * `flip` reuses Slide with a fixed direction — MUI has no flip transition, and a\n * slide from one side reads closer to a flip than a fade does.\n */\nconst TRANSITIONS = { fade: Fade, zoom: Zoom, flip: Slide, slide: Slide } as const;\n\nexport const Carousel: React.FC<CarouselProps> = (props) => {\n const resolved = withDefaults(props, DEFAULTS) as ResolvedCarouselProps;\n const {\n items, variant, size, color, autoPlay, autoPlayInterval, loop, loading, disabled,\n className, style, height, width, pauseOnHover, onClick, onChange, onFocus, onBlur,\n animation, glow, pulse, glass, gradient,\n } = resolved;\n\n const theme = useTheme();\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { activeIndex, handleNext, handlePrev, handleSelect, hoverProps } = useCarouselNavigation({\n count: items.length,\n loop,\n autoPlay,\n autoPlayInterval,\n pauseOnHover,\n disabled,\n onChange,\n });\n\n const handleItemClick = useCallback(\n (item: CarouselItem, index: number) => {\n if (!disabled) {\n onClick?.(item, index);\n }\n },\n [disabled, onClick],\n );\n\n const frameSx = containerStyles({\n theme, variant, size, color, height, width, glow, pulse, glass, gradient,\n });\n\n if (loading) {\n return (\n <Box sx={{ ...frameSx, display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <CircularProgress color={muiColor(color, 'inherit')} />\n </Box>\n );\n }\n\n return (\n <Box\n ref={containerRef}\n className={className}\n data-testid=\"carousel-container\"\n sx={{ ...frameSx, ...style }}\n onFocus={onFocus}\n onBlur={onBlur}\n {...hoverProps}\n >\n <CarouselTrack\n items={items}\n activeIndex={activeIndex}\n variant={variant}\n animation={animation}\n transition={TRANSITIONS[animation] ?? Slide}\n clickable={Boolean(onClick)}\n onSelect={handleItemClick}\n />\n\n <CarouselChrome\n {...resolved}\n activeIndex={activeIndex}\n onPrev={handlePrev}\n onNext={handleNext}\n onSelect={handleSelect}\n />\n </Box>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface CarouselNavigationInput {\n count: number;\n loop: boolean;\n autoPlay: boolean;\n autoPlayInterval: number;\n pauseOnHover: boolean;\n disabled: boolean;\n onChange?: (index: number) => void;\n}\n\n/**\n * Steps `current` by `step`, wrapping when `loop` allows it and stopping at the\n * end when it does not. Returns the same index it was given when there is\n * nowhere to go, which is what lets the caller skip a no-op `onChange`.\n */\nconst stepIndex = (current: number, step: number, count: number, loop: boolean) => {\n const next = current + step;\n\n if (next >= count) return loop ? 0 : current;\n if (next < 0) return loop ? count - 1 : 0;\n return next;\n};\n\n/**\n * Which slide is showing and everything that changes it: the arrows, an\n * indicator click, and the autoplay timer.\n *\n * Hover is tracked here rather than in the component because its only job is to\n * pause that timer.\n */\nexport const useCarouselNavigation = ({\n count,\n loop,\n autoPlay,\n autoPlayInterval,\n pauseOnHover,\n disabled,\n onChange,\n}: CarouselNavigationInput) => {\n const [activeIndex, setActiveIndex] = useState(0);\n const [isHovered, setIsHovered] = useState(false);\n const intervalRef = useRef<number | null>(null);\n\n const goBy = useCallback(\n (step: number) => {\n setActiveIndex((prev) => {\n const next = stepIndex(prev, step, count, loop);\n if (next !== prev) {\n onChange?.(next);\n }\n return next;\n });\n },\n [count, loop, onChange],\n );\n\n const handleNext = useCallback(() => goBy(1), [goBy]);\n const handlePrev = useCallback(() => goBy(-1), [goBy]);\n\n const handleSelect = useCallback(\n (index: number) => {\n setActiveIndex(index);\n onChange?.(index);\n },\n [onChange],\n );\n\n useEffect(() => {\n if (!autoPlay || isHovered || disabled) return;\n\n intervalRef.current = window.setInterval(handleNext, autoPlayInterval);\n\n return () => {\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n };\n }, [autoPlay, autoPlayInterval, isHovered, disabled, handleNext]);\n\n const hoverProps = {\n onMouseEnter: () => pauseOnHover && setIsHovered(true),\n onMouseLeave: () => pauseOnHover && setIsHovered(false),\n };\n\n return { activeIndex, handleNext, handlePrev, handleSelect, hoverProps };\n};\n","import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos';\nimport ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos';\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\nimport { alpha, Box, IconButton, Typography, useTheme } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\nimport React from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { accentFor, muiSize } from '../../../tokens/scales';\n\nimport type {\n CarouselArrowsProps,\n CarouselIndicatorsProps,\n CarouselItem,\n CarouselThumbnailsProps,\n} from './Carousel.types';\n\ntype IndicatorPosition = NonNullable<CarouselIndicatorsProps['position']>;\ntype IndicatorVariant = NonNullable<CarouselIndicatorsProps['variant']>;\ntype Color = NonNullable<CarouselIndicatorsProps['color']>;\n\n/** Fires `onSelect` for the keys a native button would treat as activation. */\nconst activateOnKey = (onSelect: () => void) => (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect();\n }\n};\n\nconst INDICATOR_POSITIONS = (theme: Theme): Record<IndicatorPosition, CSSObject> => ({\n top: { top: theme.spacing(2), left: '50%', transform: 'translateX(-50%)' },\n bottom: { bottom: theme.spacing(2), left: '50%', transform: 'translateX(-50%)' },\n left: {\n left: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n },\n right: {\n right: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n },\n});\n\ninterface IndicatorProps {\n index: number;\n isActive: boolean;\n color: Color;\n onSelect: () => void;\n}\n\n/** Attributes every indicator variant carries, whatever it draws. */\nconst indicatorAttrs = (index: number, isActive: boolean) => ({\n 'aria-label': `Go to slide ${index + 1}`,\n 'data-testid': `carousel-indicator-${index}`,\n 'data-active': isActive,\n});\n\nconst LineIndicator: React.FC<IndicatorProps> = ({ index, isActive, color, onSelect }) => {\n const theme = useTheme();\n\n return (\n <Box\n role=\"button\"\n tabIndex={0}\n {...indicatorAttrs(index, isActive)}\n sx={{\n width: isActive ? 30 : 20,\n height: 3,\n backgroundColor: isActive\n ? accentFor(theme, color).main\n : alpha(accentFor(theme, color).main, 0.3),\n borderRadius: 1.5,\n transition: theme.transitions.create(['width', 'background-color']),\n cursor: 'pointer',\n }}\n onClick={onSelect}\n onKeyDown={activateOnKey(onSelect)}\n />\n );\n};\n\nconst NumberIndicator: React.FC<IndicatorProps> = ({ index, isActive, color, onSelect }) => {\n const theme = useTheme();\n\n return (\n <Box\n role=\"button\"\n tabIndex={0}\n {...indicatorAttrs(index, isActive)}\n sx={{\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n backgroundColor: isActive ? accentFor(theme, color).main : 'transparent',\n color: isActive ? accentFor(theme, color).contrastText : accentFor(theme, color).main,\n border: `1px solid ${accentFor(theme, color).main}`,\n fontSize: '0.75rem',\n fontWeight: isActive ? 'bold' : 'normal',\n cursor: 'pointer',\n transition: theme.transitions.create(['all']),\n }}\n onClick={onSelect}\n onKeyDown={activateOnKey(onSelect)}\n >\n {index + 1}\n </Box>\n );\n};\n\nconst DotIndicator: React.FC<IndicatorProps> = ({ index, isActive, color, onSelect }) => {\n const theme = useTheme();\n\n return (\n <IconButton\n size=\"small\"\n {...indicatorAttrs(index, isActive)}\n onClick={onSelect}\n sx={{\n p: 0.5,\n color: isActive ? accentFor(theme, color).main : alpha(accentFor(theme, color).main, 0.3),\n transform: isActive ? 'scale(1.2)' : 'scale(1)',\n transition: theme.transitions.create(['transform', 'color']),\n }}\n >\n <FiberManualRecordIcon fontSize=\"small\" />\n </IconButton>\n );\n};\n\nconst INDICATORS: Record<IndicatorVariant, React.FC<IndicatorProps>> = {\n lines: LineIndicator,\n numbers: NumberIndicator,\n dots: DotIndicator,\n};\n\nconst INDICATORS_DEFAULTS = {\n position: 'bottom',\n color: 'primary',\n variant: 'dots',\n} satisfies Partial<CarouselIndicatorsProps>;\n\nexport const CarouselIndicators: React.FC<CarouselIndicatorsProps> = (props) => {\n const { count, activeIndex, onSelect, position, color, variant, className, style } = withDefaults(\n props,\n INDICATORS_DEFAULTS,\n ) as CarouselIndicatorsProps & Required<Pick<CarouselIndicatorsProps, keyof typeof INDICATORS_DEFAULTS>>;\n\n const theme = useTheme();\n const Indicator = INDICATORS[variant] ?? DotIndicator;\n\n return (\n <Box\n className={className}\n data-testid=\"carousel-indicators\"\n sx={{\n position: 'absolute',\n display: 'flex',\n gap: 1,\n zIndex: 2,\n ...(INDICATOR_POSITIONS(theme)[position] ?? INDICATOR_POSITIONS(theme).bottom),\n ...style,\n }}\n >\n {Array.from({ length: count }).map((_, index) => (\n <Indicator\n key={index}\n index={index}\n isActive={index === activeIndex}\n color={color}\n onSelect={() => onSelect(index)}\n />\n ))}\n </Box>\n );\n};\n\nconst ARROWS_DEFAULTS = {\n position: 'overlay',\n disabled: false,\n disablePrev: false,\n disableNext: false,\n color: 'primary',\n size: 'md',\n} satisfies Partial<CarouselArrowsProps>;\n\n/**\n * All three positions place the arrow the same way; only `overlay` fades it back\n * until hovered, and only `outside` sits it clear of the frame.\n */\nconst arrowSx = (theme: Theme, color: Color, isOverlay: boolean): CSSObject => ({\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 3,\n backgroundColor: alpha(theme.palette.background.paper, 0.8),\n color: accentFor(theme, color).main,\n '&:disabled': { opacity: 0.3 },\n ...(isOverlay\n ? {\n opacity: 0.7,\n '&:hover': { backgroundColor: theme.palette.background.paper, opacity: 1 },\n }\n : { '&:hover': { backgroundColor: theme.palette.background.paper } }),\n});\n\nexport const CarouselArrows: React.FC<CarouselArrowsProps> = (props) => {\n const {\n onPrev, onNext, position, disabled, disablePrev, disableNext, color, size, className, style,\n } = withDefaults(props, ARROWS_DEFAULTS) as CarouselArrowsProps &\n Required<Pick<CarouselArrowsProps, keyof typeof ARROWS_DEFAULTS>>;\n\n const theme = useTheme();\n const sx = arrowSx(theme, color, position === 'overlay');\n const offset = position === 'outside' ? -40 : 8;\n\n return (\n <Box data-testid=\"carousel-navigation\">\n <IconButton\n onClick={onPrev}\n disabled={disabled || disablePrev}\n size={muiSize(size)}\n className={className}\n aria-label=\"Previous slide\"\n data-testid=\"carousel-prev-button\"\n sx={{ ...sx, left: offset, ...style }}\n >\n <ArrowBackIosIcon />\n </IconButton>\n\n <IconButton\n onClick={onNext}\n disabled={disabled || disableNext}\n aria-label=\"Next slide\"\n size={muiSize(size)}\n className={className}\n data-testid=\"carousel-next-button\"\n sx={{ ...sx, right: offset, ...style }}\n >\n <ArrowForwardIosIcon />\n </IconButton>\n </Box>\n );\n};\n\nconst THUMBNAIL_SIZES = { xs: 40, sm: 60, md: 80, lg: 100, xl: 120 } as const;\nconst DEFAULT_THUMBNAIL_SIZE = 60;\n\nconst Thumbnail: React.FC<{\n item: CarouselItem;\n index: number;\n isActive: boolean;\n side: number;\n onSelect: () => void;\n}> = ({ item, index, isActive, side, onSelect }) => {\n const theme = useTheme();\n\n return (\n <Box\n onClick={onSelect}\n data-testid={`carousel-thumbnail-${index}`}\n data-active={isActive}\n sx={{\n width: side,\n height: side,\n border: `2px solid ${isActive ? theme.palette.primary.main : 'transparent'}`,\n borderRadius: 1,\n overflow: 'hidden',\n cursor: 'pointer',\n opacity: isActive ? 1 : 0.6,\n transition: theme.transitions.create(['opacity', 'border-color']),\n '&:hover': { opacity: 1 },\n }}\n >\n {item.image ? (\n <Box\n component=\"img\"\n src={item.image}\n alt={item.alt || item.title}\n sx={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n // No image to show, so the slide's number stands in for it.\n <Box\n sx={{\n width: '100%',\n height: '100%',\n backgroundColor: theme.palette.grey[300],\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Typography variant=\"caption\">{index + 1}</Typography>\n </Box>\n )}\n </Box>\n );\n};\n\nexport const CarouselThumbnails: React.FC<CarouselThumbnailsProps> = ({\n items,\n activeIndex,\n onSelect,\n size = 'sm',\n className,\n style,\n}) => {\n const theme = useTheme();\n const side = THUMBNAIL_SIZES[size as keyof typeof THUMBNAIL_SIZES] ?? DEFAULT_THUMBNAIL_SIZE;\n\n return (\n <Box\n className={className}\n data-testid=\"carousel-thumbnails\"\n sx={{\n position: 'absolute',\n // Hung below the frame, clear of its own height plus a gap.\n bottom: -side - 16,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n gap: 1,\n p: 1,\n backgroundColor: alpha(theme.palette.background.paper, 0.9),\n borderRadius: 1,\n ...style,\n }}\n >\n {items.map((item, index) => (\n <Thumbnail\n key={item.id}\n item={item}\n index={index}\n isActive={index === activeIndex}\n side={side}\n onSelect={() => onSelect(index)}\n />\n ))}\n </Box>\n );\n};\n","import React from 'react';\n\nimport { CarouselArrows, CarouselIndicators, CarouselThumbnails } from './Carousel.parts';\nimport type {\n CarouselArrowsProps,\n CarouselIndicatorsProps,\n CarouselItem,\n CarouselThumbnailsProps,\n} from './Carousel.types';\n\ntype IndicatorPosition = NonNullable<CarouselIndicatorsProps['position']>;\ntype Color = NonNullable<CarouselIndicatorsProps['color']>;\n\nexport interface CarouselChromeProps {\n items: CarouselItem[];\n activeIndex: number;\n loop: boolean;\n disabled: boolean;\n showArrows: boolean;\n showIndicators: boolean;\n showThumbnails: boolean;\n arrowPosition: NonNullable<CarouselArrowsProps['position']>;\n indicatorPosition: IndicatorPosition;\n color: Color;\n size: NonNullable<CarouselThumbnailsProps['size']>;\n onPrev: () => void;\n onNext: () => void;\n onSelect: (index: number) => void;\n}\n\n/**\n * Everything drawn over the slides: the arrows, the indicators and the thumbnail\n * strip. Each is independently switchable, so they travel together rather than\n * as three conditional blocks inside the carousel's own render.\n */\nexport const CarouselChrome: React.FC<CarouselChromeProps> = ({\n items,\n activeIndex,\n loop,\n disabled,\n showArrows,\n showIndicators,\n showThumbnails,\n arrowPosition,\n indicatorPosition,\n color,\n size,\n onPrev,\n onNext,\n onSelect,\n}) => (\n <>\n {showArrows && !disabled && (\n <CarouselArrows\n onPrev={onPrev}\n onNext={onNext}\n position={arrowPosition}\n color={color}\n disablePrev={!loop && activeIndex === 0}\n disableNext={!loop && activeIndex === items.length - 1}\n />\n )}\n\n {showIndicators && (\n <CarouselIndicators\n count={items.length}\n activeIndex={activeIndex}\n onSelect={onSelect}\n position={indicatorPosition}\n color={color}\n />\n )}\n\n {showThumbnails && (\n <CarouselThumbnails\n items={items}\n activeIndex={activeIndex}\n onSelect={onSelect}\n size={size}\n />\n )}\n </>\n);\n","import { Box, Paper, Typography, useTheme } from '@mui/material';\nimport React from 'react';\n\nimport type { CarouselItem, CarouselProps } from './Carousel.types';\n\nexport interface CarouselSlideProps {\n item: CarouselItem;\n index: number;\n isActive: boolean;\n variant: NonNullable<CarouselProps['variant']>;\n clickable: boolean;\n onSelect: (item: CarouselItem, index: number) => void;\n}\n\n/**\n * A slide's caption. Over an image it is white with a shadow so it stays legible\n * against whatever the photograph happens to be; on a bare surface it uses the\n * ordinary text colours.\n */\nconst SlideCaption: React.FC<Pick<CarouselItem, 'title' | 'description' | 'content' | 'image'>> = ({\n title,\n description,\n content,\n image,\n}) => (\n <Box sx={{ position: 'relative', zIndex: 1, textAlign: 'center', p: 3 }}>\n {title && (\n <Typography\n variant=\"h5\"\n sx={{\n color: image ? 'white' : 'text.primary',\n textShadow: image ? '0 2px 4px rgba(0,0,0,0.5)' : 'none',\n mb: 1,\n }}\n >\n {title}\n </Typography>\n )}\n\n {description && (\n <Typography\n variant=\"body1\"\n sx={{\n color: image ? 'white' : 'text.secondary',\n textShadow: image ? '0 1px 2px rgba(0,0,0,0.5)' : 'none',\n }}\n >\n {description}\n </Typography>\n )}\n\n {content}\n </Box>\n);\n\nexport const CarouselSlide: React.FC<CarouselSlideProps> = ({\n item,\n index,\n isActive,\n variant,\n clickable,\n onSelect,\n}) => {\n const theme = useTheme();\n\n const content = (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n cursor: clickable ? 'pointer' : 'default',\n position: 'relative',\n }}\n onClick={() => onSelect(item, index)}\n >\n {item.image && (\n <Box\n component=\"img\"\n src={item.image}\n alt={item.alt || item.title}\n sx={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n />\n )}\n\n <SlideCaption\n title={item.title}\n description={item.description}\n content={item.content}\n image={item.image}\n />\n </Box>\n );\n\n // The cards variant gives each slide its own raised surface, and lifts the\n // active one further so the stack reads as a deck rather than a strip.\n if (variant === 'cards') {\n return (\n <Paper\n elevation={isActive ? 8 : 2}\n sx={{\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n transform: isActive ? 'scale(1)' : 'scale(0.9)',\n transition: theme.transitions.create(['transform', 'box-shadow']),\n }}\n >\n {content}\n </Paper>\n );\n }\n\n return content;\n};\n\nexport interface CarouselTrackProps {\n items: CarouselItem[];\n activeIndex: number;\n variant: NonNullable<CarouselProps['variant']>;\n animation: NonNullable<CarouselProps['animation']>;\n transition: React.ElementType;\n clickable: boolean;\n onSelect: (item: CarouselItem, index: number) => void;\n}\n\n/**\n * The slides themselves. Every slide stays mounted and absolutely positioned so\n * the transition has both the outgoing and incoming one to work with; `display`\n * is what actually hides the rest.\n */\nexport const CarouselTrack: React.FC<CarouselTrackProps> = ({\n items,\n activeIndex,\n variant,\n animation,\n transition: Transition,\n clickable,\n onSelect,\n}) => (\n <Box\n data-testid=\"carousel-track\"\n sx={{\n width: '100%',\n height: '100%',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {items.map((item, index) => (\n <Transition\n key={item.id}\n in={index === activeIndex}\n timeout={600}\n {...(animation === 'flip' && { direction: 'left' as const })}\n >\n <Box\n data-testid={`carousel-slide-${index}`}\n data-active={index === activeIndex}\n sx={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n display: index === activeIndex ? 'block' : 'none',\n }}\n >\n <CarouselSlide\n item={item}\n index={index}\n isActive={index === activeIndex}\n variant={variant}\n clickable={clickable}\n onSelect={onSelect}\n />\n </Box>\n </Transition>\n ))}\n </Box>\n);\n","import { alpha } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nimport type { CarouselProps } from './Carousel.types';\nimport { accentFor } from '../../../tokens/scales';\n\ntype Variant = NonNullable<CarouselProps['variant']>;\ntype Size = NonNullable<CarouselProps['size']>;\ntype Color = NonNullable<CarouselProps['color']>;\n\nconst SIZES: Record<Size, { height: number; fontSize: string }> = {\n xs: { height: 200, fontSize: '0.75rem' },\n sm: { height: 300, fontSize: '0.875rem' },\n md: { height: 400, fontSize: '1rem' },\n lg: { height: 500, fontSize: '1.125rem' },\n xl: { height: 600, fontSize: '1.25rem' },\n};\n\nconst sizeStyles = (size: Size) => SIZES[size] ?? SIZES.md;\n\ninterface ContainerStyleInput {\n theme: Theme;\n variant: Variant;\n size: Size;\n color: Color;\n height: number | string;\n width: number | string;\n glow: boolean;\n pulse: boolean;\n glass: boolean;\n gradient: boolean;\n}\n\n/**\n * Each variant's own additions to the shared frame. The old switch re-spread the\n * same base, glow and pulse objects in all six arms before adding these; only\n * these differ, so the shared prefix is applied once by `containerStyles`.\n */\nconst SURFACES: Record<Variant, (input: ContainerStyleInput) => CSSObject> = {\n glass: ({ theme, color, glass }) => ({\n backgroundColor: alpha(theme.palette.background.paper, glass ? 0.1 : 0.9),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(accentFor(theme, color).main, 0.2)}`,\n }),\n\n gradient: ({ theme, color, gradient }) => ({\n background: gradient\n ? `linear-gradient(135deg, ${alpha(accentFor(theme, color).light, 0.1)}, ${alpha(accentFor(theme, color).dark, 0.1)})`\n : 'transparent',\n }),\n\n elevated: ({ theme }) => ({ boxShadow: theme.shadows[8] }),\n\n minimal: () => ({ border: 'none', boxShadow: 'none' }),\n\n cards: ({ theme }) => ({ padding: theme.spacing(2) }),\n\n default: () => ({}),\n};\n\nexport const containerStyles = (input: ContainerStyleInput): CSSObject => {\n const { theme, variant, size, color, height, width, glow, pulse } = input;\n const accent = accentFor(theme, color).main;\n\n return {\n position: 'relative' as const,\n width,\n // A numeric height is taken literally; anything else falls back to the size\n // preset, since a percentage cannot resolve against an unsized parent here.\n height: typeof height === 'number' ? height : sizeStyles(size).height,\n overflow: 'hidden',\n borderRadius: theme.spacing(1),\n transition: theme.transitions.create(['all'], {\n duration: theme.transitions.duration.standard,\n }),\n ...(glow && { boxShadow: `0 0 30px ${alpha(accent, 0.4)}` }),\n ...(pulse && {\n animation: 'pulse 2s infinite',\n '@keyframes pulse': {\n '0%': { boxShadow: `0 0 0 0 ${alpha(accent, 0.4)}` },\n '70%': { boxShadow: `0 0 0 20px ${alpha(accent, 0)}` },\n '100%': { boxShadow: `0 0 0 0 ${alpha(accent, 0)}` },\n },\n }),\n ...(SURFACES[variant] ?? SURFACES.default)(input),\n };\n};\n"],"mappings":"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","names":["Box","useTheme","useCallback","useRef","jsx","jsxs","Box","Typography","useTheme","jsx","jsxs","alpha","alpha","jsx","jsxs","useTheme","useRef","useCallback","Box"]}
1
+ {"version":3,"sources":["../../src/components/data-display/Carousel/Carousel.tsx","../../src/components/data-display/Carousel/Carousel.hooks.ts","../../src/components/data-display/Carousel/Carousel.parts.tsx","../../src/components/data-display/Carousel/Carousel.chrome.tsx","../../src/components/data-display/Carousel/Carousel.slide.tsx","../../src/components/data-display/Carousel/Carousel.styles.ts"],"sourcesContent":["import { Box, CircularProgress, Fade, Slide, useTheme, Zoom } from '@mui/material';\nimport React, { useCallback, useRef } from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { useCarouselNavigation } from './Carousel.hooks';\nimport { CarouselChrome } from './Carousel.chrome';\nimport { CarouselTrack } from './Carousel.slide';\nimport { containerStyles } from './Carousel.styles';\nimport type { CarouselItem, CarouselProps } from './Carousel.types';\nimport { muiColor } from '../../../tokens/scales';\n\nexport { CarouselArrows, CarouselIndicators, CarouselThumbnails } from './Carousel.parts';\n\nconst DEFAULTS = {\n variant: 'default',\n size: 'md',\n color: 'primary',\n autoPlay: false,\n autoPlayInterval: 3000,\n loop: true,\n showIndicators: true,\n showArrows: true,\n showThumbnails: false,\n glow: false,\n pulse: false,\n glass: false,\n gradient: false,\n loading: false,\n disabled: false,\n height: 400,\n width: '100%',\n pauseOnHover: true,\n indicatorPosition: 'bottom',\n arrowPosition: 'overlay',\n animation: 'slide',\n} satisfies Partial<CarouselProps>;\n\ntype ResolvedCarouselProps = CarouselProps & Required<Pick<CarouselProps, keyof typeof DEFAULTS>>;\n\n/**\n * `flip` reuses Slide with a fixed direction — MUI has no flip transition, and a\n * slide from one side reads closer to a flip than a fade does.\n */\nconst TRANSITIONS = { fade: Fade, zoom: Zoom, flip: Slide, slide: Slide } as const;\n\nexport const Carousel: React.FC<CarouselProps> = (props) => {\n const resolved = withDefaults(props, DEFAULTS) as ResolvedCarouselProps;\n const {\n items, variant, size, color, autoPlay, autoPlayInterval, loop, loading, disabled,\n className, style, height, width, pauseOnHover, onClick, onChange, onFocus, onBlur,\n animation, glow, pulse, glass, gradient,\n } = resolved;\n\n const theme = useTheme();\n const containerRef = useRef<HTMLDivElement>(null);\n\n const { activeIndex, handleNext, handlePrev, handleSelect, hoverProps } = useCarouselNavigation({\n count: items.length,\n loop,\n autoPlay,\n autoPlayInterval,\n pauseOnHover,\n disabled,\n onChange,\n });\n\n const handleItemClick = useCallback(\n (item: CarouselItem, index: number) => {\n if (!disabled) {\n onClick?.(item, index);\n }\n },\n [disabled, onClick],\n );\n\n const frameSx = containerStyles({\n theme, variant, size, color, height, width, glow, pulse, glass, gradient,\n });\n\n if (loading) {\n return (\n <Box sx={{ ...frameSx, display: 'flex', justifyContent: 'center', alignItems: 'center' }}>\n <CircularProgress color={muiColor(color, 'inherit')} />\n </Box>\n );\n }\n\n return (\n <Box\n ref={containerRef}\n className={className}\n data-testid=\"carousel-container\"\n sx={{ ...frameSx, ...style }}\n onFocus={onFocus}\n onBlur={onBlur}\n {...hoverProps}\n >\n <CarouselTrack\n items={items}\n activeIndex={activeIndex}\n variant={variant}\n animation={animation}\n transition={TRANSITIONS[animation] ?? Slide}\n clickable={Boolean(onClick)}\n onSelect={handleItemClick}\n />\n\n <CarouselChrome\n {...resolved}\n activeIndex={activeIndex}\n onPrev={handlePrev}\n onNext={handleNext}\n onSelect={handleSelect}\n />\n </Box>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface CarouselNavigationInput {\n count: number;\n loop: boolean;\n autoPlay: boolean;\n autoPlayInterval: number;\n pauseOnHover: boolean;\n disabled: boolean;\n onChange?: (index: number) => void;\n}\n\n/**\n * Steps `current` by `step`, wrapping when `loop` allows it and stopping at the\n * end when it does not. Returns the same index it was given when there is\n * nowhere to go, which is what lets the caller skip a no-op `onChange`.\n */\nconst stepIndex = (current: number, step: number, count: number, loop: boolean) => {\n const next = current + step;\n\n if (next >= count) return loop ? 0 : current;\n if (next < 0) return loop ? count - 1 : 0;\n return next;\n};\n\n/**\n * Which slide is showing and everything that changes it: the arrows, an\n * indicator click, and the autoplay timer.\n *\n * Hover is tracked here rather than in the component because its only job is to\n * pause that timer.\n */\nexport const useCarouselNavigation = ({\n count,\n loop,\n autoPlay,\n autoPlayInterval,\n pauseOnHover,\n disabled,\n onChange,\n}: CarouselNavigationInput) => {\n const [activeIndex, setActiveIndex] = useState(0);\n const [isHovered, setIsHovered] = useState(false);\n const intervalRef = useRef<number | null>(null);\n\n const goBy = useCallback(\n (step: number) => {\n setActiveIndex((prev) => {\n const next = stepIndex(prev, step, count, loop);\n if (next !== prev) {\n onChange?.(next);\n }\n return next;\n });\n },\n [count, loop, onChange],\n );\n\n const handleNext = useCallback(() => goBy(1), [goBy]);\n const handlePrev = useCallback(() => goBy(-1), [goBy]);\n\n const handleSelect = useCallback(\n (index: number) => {\n setActiveIndex(index);\n onChange?.(index);\n },\n [onChange],\n );\n\n useEffect(() => {\n if (!autoPlay || isHovered || disabled) return;\n\n intervalRef.current = window.setInterval(handleNext, autoPlayInterval);\n\n return () => {\n if (intervalRef.current) {\n window.clearInterval(intervalRef.current);\n }\n };\n }, [autoPlay, autoPlayInterval, isHovered, disabled, handleNext]);\n\n const hoverProps = {\n onMouseEnter: () => pauseOnHover && setIsHovered(true),\n onMouseLeave: () => pauseOnHover && setIsHovered(false),\n };\n\n return { activeIndex, handleNext, handlePrev, handleSelect, hoverProps };\n};\n","import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos';\nimport ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos';\nimport FiberManualRecordIcon from '@mui/icons-material/FiberManualRecord';\nimport { alpha, Box, IconButton, Typography, useTheme } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\nimport React from 'react';\n\nimport { withDefaults } from '../../../utils/withDefaults';\n\nimport { accentFor, muiSize } from '../../../tokens/scales';\n\nimport type {\n CarouselArrowsProps,\n CarouselIndicatorsProps,\n CarouselItem,\n CarouselThumbnailsProps,\n} from './Carousel.types';\n\ntype IndicatorPosition = NonNullable<CarouselIndicatorsProps['position']>;\ntype IndicatorVariant = NonNullable<CarouselIndicatorsProps['variant']>;\ntype Color = NonNullable<CarouselIndicatorsProps['color']>;\n\n/** Fires `onSelect` for the keys a native button would treat as activation. */\nconst activateOnKey = (onSelect: () => void) => (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onSelect();\n }\n};\n\nconst INDICATOR_POSITIONS = (theme: Theme): Record<IndicatorPosition, CSSObject> => ({\n top: { top: theme.spacing(2), left: '50%', transform: 'translateX(-50%)' },\n bottom: { bottom: theme.spacing(2), left: '50%', transform: 'translateX(-50%)' },\n left: {\n left: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n },\n right: {\n right: theme.spacing(2),\n top: '50%',\n transform: 'translateY(-50%)',\n flexDirection: 'column',\n },\n});\n\ninterface IndicatorProps {\n index: number;\n isActive: boolean;\n color: Color;\n onSelect: () => void;\n}\n\n/** Attributes every indicator variant carries, whatever it draws. */\nconst indicatorAttrs = (index: number, isActive: boolean) => ({\n 'aria-label': `Go to slide ${index + 1}`,\n 'data-testid': `carousel-indicator-${index}`,\n 'data-active': isActive,\n});\n\nconst LineIndicator: React.FC<IndicatorProps> = ({ index, isActive, color, onSelect }) => {\n const theme = useTheme();\n\n return (\n <Box\n role=\"button\"\n tabIndex={0}\n {...indicatorAttrs(index, isActive)}\n sx={{\n width: isActive ? 30 : 20,\n height: 3,\n backgroundColor: isActive\n ? accentFor(theme, color).main\n : alpha(accentFor(theme, color).main, 0.3),\n borderRadius: 1.5,\n transition: theme.transitions.create(['width', 'background-color']),\n cursor: 'pointer',\n }}\n onClick={onSelect}\n onKeyDown={activateOnKey(onSelect)}\n />\n );\n};\n\nconst NumberIndicator: React.FC<IndicatorProps> = ({ index, isActive, color, onSelect }) => {\n const theme = useTheme();\n\n return (\n <Box\n role=\"button\"\n tabIndex={0}\n {...indicatorAttrs(index, isActive)}\n sx={{\n width: 24,\n height: 24,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: '50%',\n backgroundColor: isActive ? accentFor(theme, color).main : 'transparent',\n color: isActive ? accentFor(theme, color).contrastText : accentFor(theme, color).main,\n border: `1px solid ${accentFor(theme, color).main}`,\n fontSize: '0.75rem',\n fontWeight: isActive ? 'bold' : 'normal',\n cursor: 'pointer',\n transition: theme.transitions.create(['all']),\n }}\n onClick={onSelect}\n onKeyDown={activateOnKey(onSelect)}\n >\n {index + 1}\n </Box>\n );\n};\n\nconst DotIndicator: React.FC<IndicatorProps> = ({ index, isActive, color, onSelect }) => {\n const theme = useTheme();\n\n return (\n <IconButton\n size=\"small\"\n {...indicatorAttrs(index, isActive)}\n onClick={onSelect}\n sx={{\n p: 0.5,\n color: isActive ? accentFor(theme, color).main : alpha(accentFor(theme, color).main, 0.3),\n transform: isActive ? 'scale(1.2)' : 'scale(1)',\n transition: theme.transitions.create(['transform', 'color']),\n }}\n >\n <FiberManualRecordIcon fontSize=\"small\" />\n </IconButton>\n );\n};\n\nconst INDICATORS: Record<IndicatorVariant, React.FC<IndicatorProps>> = {\n lines: LineIndicator,\n numbers: NumberIndicator,\n dots: DotIndicator,\n};\n\nconst INDICATORS_DEFAULTS = {\n position: 'bottom',\n color: 'primary',\n variant: 'dots',\n} satisfies Partial<CarouselIndicatorsProps>;\n\nexport const CarouselIndicators: React.FC<CarouselIndicatorsProps> = (props) => {\n const { count, activeIndex, onSelect, position, color, variant, className, style } = withDefaults(\n props,\n INDICATORS_DEFAULTS,\n ) as CarouselIndicatorsProps & Required<Pick<CarouselIndicatorsProps, keyof typeof INDICATORS_DEFAULTS>>;\n\n const theme = useTheme();\n const Indicator = INDICATORS[variant] ?? DotIndicator;\n\n return (\n <Box\n className={className}\n data-testid=\"carousel-indicators\"\n sx={{\n position: 'absolute',\n display: 'flex',\n gap: 1,\n zIndex: 2,\n ...(INDICATOR_POSITIONS(theme)[position] ?? INDICATOR_POSITIONS(theme).bottom),\n ...style,\n }}\n >\n {Array.from({ length: count }).map((_, index) => (\n <Indicator\n key={index}\n index={index}\n isActive={index === activeIndex}\n color={color}\n onSelect={() => onSelect(index)}\n />\n ))}\n </Box>\n );\n};\n\nconst ARROWS_DEFAULTS = {\n position: 'overlay',\n disabled: false,\n disablePrev: false,\n disableNext: false,\n color: 'primary',\n size: 'md',\n} satisfies Partial<CarouselArrowsProps>;\n\n/**\n * All three positions place the arrow the same way; only `overlay` fades it back\n * until hovered, and only `outside` sits it clear of the frame.\n */\nconst arrowSx = (theme: Theme, color: Color, isOverlay: boolean): CSSObject => ({\n position: 'absolute',\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 3,\n backgroundColor: alpha(theme.palette.background.paper, 0.8),\n color: accentFor(theme, color).main,\n '&:disabled': { opacity: 0.3 },\n ...(isOverlay\n ? {\n opacity: 0.7,\n '&:hover': { backgroundColor: theme.palette.background.paper, opacity: 1 },\n }\n : { '&:hover': { backgroundColor: theme.palette.background.paper } }),\n});\n\nexport const CarouselArrows: React.FC<CarouselArrowsProps> = (props) => {\n const {\n copy, onPrev, onNext, position, disabled, disablePrev, disableNext, color, size, className,\n style,\n } = withDefaults(props, ARROWS_DEFAULTS) as CarouselArrowsProps &\n Required<Pick<CarouselArrowsProps, keyof typeof ARROWS_DEFAULTS>>;\n\n const theme = useTheme();\n const sx = arrowSx(theme, color, position === 'overlay');\n const offset = position === 'outside' ? -40 : 8;\n\n return (\n <Box data-testid=\"carousel-navigation\">\n <IconButton\n onClick={onPrev}\n disabled={disabled || disablePrev}\n size={muiSize(size)}\n className={className}\n aria-label={copy.previous}\n data-testid=\"carousel-prev-button\"\n sx={{ ...sx, left: offset, ...style }}\n >\n <ArrowBackIosIcon />\n </IconButton>\n\n <IconButton\n onClick={onNext}\n disabled={disabled || disableNext}\n aria-label={copy.next}\n size={muiSize(size)}\n className={className}\n data-testid=\"carousel-next-button\"\n sx={{ ...sx, right: offset, ...style }}\n >\n <ArrowForwardIosIcon />\n </IconButton>\n </Box>\n );\n};\n\nconst THUMBNAIL_SIZES = { xs: 40, sm: 60, md: 80, lg: 100, xl: 120 } as const;\nconst DEFAULT_THUMBNAIL_SIZE = 60;\n\nconst Thumbnail: React.FC<{\n item: CarouselItem;\n index: number;\n isActive: boolean;\n side: number;\n onSelect: () => void;\n}> = ({ item, index, isActive, side, onSelect }) => {\n const theme = useTheme();\n\n return (\n <Box\n onClick={onSelect}\n data-testid={`carousel-thumbnail-${index}`}\n data-active={isActive}\n sx={{\n width: side,\n height: side,\n border: `2px solid ${isActive ? theme.palette.primary.main : 'transparent'}`,\n borderRadius: 1,\n overflow: 'hidden',\n cursor: 'pointer',\n opacity: isActive ? 1 : 0.6,\n transition: theme.transitions.create(['opacity', 'border-color']),\n '&:hover': { opacity: 1 },\n }}\n >\n {item.image ? (\n <Box\n component=\"img\"\n src={item.image}\n alt={item.alt || item.title}\n sx={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n // No image to show, so the slide's number stands in for it.\n <Box\n sx={{\n width: '100%',\n height: '100%',\n backgroundColor: theme.palette.grey[300],\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Typography variant=\"caption\">{index + 1}</Typography>\n </Box>\n )}\n </Box>\n );\n};\n\nexport const CarouselThumbnails: React.FC<CarouselThumbnailsProps> = ({\n items,\n activeIndex,\n onSelect,\n size = 'sm',\n className,\n style,\n}) => {\n const theme = useTheme();\n const side = THUMBNAIL_SIZES[size as keyof typeof THUMBNAIL_SIZES] ?? DEFAULT_THUMBNAIL_SIZE;\n\n return (\n <Box\n className={className}\n data-testid=\"carousel-thumbnails\"\n sx={{\n position: 'absolute',\n // Hung below the frame, clear of its own height plus a gap.\n bottom: -side - 16,\n left: '50%',\n transform: 'translateX(-50%)',\n display: 'flex',\n gap: 1,\n p: 1,\n backgroundColor: alpha(theme.palette.background.paper, 0.9),\n borderRadius: 1,\n ...style,\n }}\n >\n {items.map((item, index) => (\n <Thumbnail\n key={item.id}\n item={item}\n index={index}\n isActive={index === activeIndex}\n side={side}\n onSelect={() => onSelect(index)}\n />\n ))}\n </Box>\n );\n};\n","import React from 'react';\n\nimport { CarouselArrows, CarouselIndicators, CarouselThumbnails } from './Carousel.parts';\nimport type { CarouselCopy } from '../../../copy';\nimport type {\n CarouselArrowsProps,\n CarouselIndicatorsProps,\n CarouselItem,\n CarouselThumbnailsProps,\n} from './Carousel.types';\n\ntype IndicatorPosition = NonNullable<CarouselIndicatorsProps['position']>;\ntype Color = NonNullable<CarouselIndicatorsProps['color']>;\n\nexport interface CarouselChromeProps {\n /** The two arrows' accessible names, from the mount. */\n copy: CarouselCopy;\n items: CarouselItem[];\n activeIndex: number;\n loop: boolean;\n disabled: boolean;\n showArrows: boolean;\n showIndicators: boolean;\n showThumbnails: boolean;\n arrowPosition: NonNullable<CarouselArrowsProps['position']>;\n indicatorPosition: IndicatorPosition;\n color: Color;\n size: NonNullable<CarouselThumbnailsProps['size']>;\n onPrev: () => void;\n onNext: () => void;\n onSelect: (index: number) => void;\n}\n\n/**\n * Everything drawn over the slides: the arrows, the indicators and the thumbnail\n * strip. Each is independently switchable, so they travel together rather than\n * as three conditional blocks inside the carousel's own render.\n */\nexport const CarouselChrome: React.FC<CarouselChromeProps> = ({\n copy,\n items,\n activeIndex,\n loop,\n disabled,\n showArrows,\n showIndicators,\n showThumbnails,\n arrowPosition,\n indicatorPosition,\n color,\n size,\n onPrev,\n onNext,\n onSelect,\n}) => (\n <>\n {showArrows && !disabled && (\n <CarouselArrows\n copy={copy}\n onPrev={onPrev}\n onNext={onNext}\n position={arrowPosition}\n color={color}\n disablePrev={!loop && activeIndex === 0}\n disableNext={!loop && activeIndex === items.length - 1}\n />\n )}\n\n {showIndicators && (\n <CarouselIndicators\n count={items.length}\n activeIndex={activeIndex}\n onSelect={onSelect}\n position={indicatorPosition}\n color={color}\n />\n )}\n\n {showThumbnails && (\n <CarouselThumbnails\n items={items}\n activeIndex={activeIndex}\n onSelect={onSelect}\n size={size}\n />\n )}\n </>\n);\n","import { Box, Paper, Typography, useTheme } from '@mui/material';\nimport React from 'react';\n\nimport type { CarouselItem, CarouselProps } from './Carousel.types';\n\nexport interface CarouselSlideProps {\n item: CarouselItem;\n index: number;\n isActive: boolean;\n variant: NonNullable<CarouselProps['variant']>;\n clickable: boolean;\n onSelect: (item: CarouselItem, index: number) => void;\n}\n\n/**\n * A slide's caption. Over an image it is white with a shadow so it stays legible\n * against whatever the photograph happens to be; on a bare surface it uses the\n * ordinary text colours.\n */\nconst SlideCaption: React.FC<Pick<CarouselItem, 'title' | 'description' | 'content' | 'image'>> = ({\n title,\n description,\n content,\n image,\n}) => (\n <Box sx={{ position: 'relative', zIndex: 1, textAlign: 'center', p: 3 }}>\n {title && (\n <Typography\n variant=\"h5\"\n sx={{\n color: image ? 'white' : 'text.primary',\n textShadow: image ? '0 2px 4px rgba(0,0,0,0.5)' : 'none',\n mb: 1,\n }}\n >\n {title}\n </Typography>\n )}\n\n {description && (\n <Typography\n variant=\"body1\"\n sx={{\n color: image ? 'white' : 'text.secondary',\n textShadow: image ? '0 1px 2px rgba(0,0,0,0.5)' : 'none',\n }}\n >\n {description}\n </Typography>\n )}\n\n {content}\n </Box>\n);\n\nexport const CarouselSlide: React.FC<CarouselSlideProps> = ({\n item,\n index,\n isActive,\n variant,\n clickable,\n onSelect,\n}) => {\n const theme = useTheme();\n\n const content = (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n cursor: clickable ? 'pointer' : 'default',\n position: 'relative',\n }}\n onClick={() => onSelect(item, index)}\n >\n {item.image && (\n <Box\n component=\"img\"\n src={item.image}\n alt={item.alt || item.title}\n sx={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n />\n )}\n\n <SlideCaption\n title={item.title}\n description={item.description}\n content={item.content}\n image={item.image}\n />\n </Box>\n );\n\n // The cards variant gives each slide its own raised surface, and lifts the\n // active one further so the stack reads as a deck rather than a strip.\n if (variant === 'cards') {\n return (\n <Paper\n elevation={isActive ? 8 : 2}\n sx={{\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n transform: isActive ? 'scale(1)' : 'scale(0.9)',\n transition: theme.transitions.create(['transform', 'box-shadow']),\n }}\n >\n {content}\n </Paper>\n );\n }\n\n return content;\n};\n\nexport interface CarouselTrackProps {\n items: CarouselItem[];\n activeIndex: number;\n variant: NonNullable<CarouselProps['variant']>;\n animation: NonNullable<CarouselProps['animation']>;\n transition: React.ElementType;\n clickable: boolean;\n onSelect: (item: CarouselItem, index: number) => void;\n}\n\n/**\n * The slides themselves. Every slide stays mounted and absolutely positioned so\n * the transition has both the outgoing and incoming one to work with; `display`\n * is what actually hides the rest.\n */\nexport const CarouselTrack: React.FC<CarouselTrackProps> = ({\n items,\n activeIndex,\n variant,\n animation,\n transition: Transition,\n clickable,\n onSelect,\n}) => (\n <Box\n data-testid=\"carousel-track\"\n sx={{\n width: '100%',\n height: '100%',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {items.map((item, index) => (\n <Transition\n key={item.id}\n in={index === activeIndex}\n timeout={600}\n {...(animation === 'flip' && { direction: 'left' as const })}\n >\n <Box\n data-testid={`carousel-slide-${index}`}\n data-active={index === activeIndex}\n sx={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n display: index === activeIndex ? 'block' : 'none',\n }}\n >\n <CarouselSlide\n item={item}\n index={index}\n isActive={index === activeIndex}\n variant={variant}\n clickable={clickable}\n onSelect={onSelect}\n />\n </Box>\n </Transition>\n ))}\n </Box>\n);\n","import { alpha } from '@mui/material';\nimport type { CSSObject, Theme } from '@mui/material';\n\nimport type { CarouselProps } from './Carousel.types';\nimport { accentFor } from '../../../tokens/scales';\n\ntype Variant = NonNullable<CarouselProps['variant']>;\ntype Size = NonNullable<CarouselProps['size']>;\ntype Color = NonNullable<CarouselProps['color']>;\n\nconst SIZES: Record<Size, { height: number; fontSize: string }> = {\n xs: { height: 200, fontSize: '0.75rem' },\n sm: { height: 300, fontSize: '0.875rem' },\n md: { height: 400, fontSize: '1rem' },\n lg: { height: 500, fontSize: '1.125rem' },\n xl: { height: 600, fontSize: '1.25rem' },\n};\n\nconst sizeStyles = (size: Size) => SIZES[size] ?? SIZES.md;\n\ninterface ContainerStyleInput {\n theme: Theme;\n variant: Variant;\n size: Size;\n color: Color;\n height: number | string;\n width: number | string;\n glow: boolean;\n pulse: boolean;\n glass: boolean;\n gradient: boolean;\n}\n\n/**\n * Each variant's own additions to the shared frame. The old switch re-spread the\n * same base, glow and pulse objects in all six arms before adding these; only\n * these differ, so the shared prefix is applied once by `containerStyles`.\n */\nconst SURFACES: Record<Variant, (input: ContainerStyleInput) => CSSObject> = {\n glass: ({ theme, color, glass }) => ({\n backgroundColor: alpha(theme.palette.background.paper, glass ? 0.1 : 0.9),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(accentFor(theme, color).main, 0.2)}`,\n }),\n\n gradient: ({ theme, color, gradient }) => ({\n background: gradient\n ? `linear-gradient(135deg, ${alpha(accentFor(theme, color).light, 0.1)}, ${alpha(accentFor(theme, color).dark, 0.1)})`\n : 'transparent',\n }),\n\n elevated: ({ theme }) => ({ boxShadow: theme.shadows[8] }),\n\n minimal: () => ({ border: 'none', boxShadow: 'none' }),\n\n cards: ({ theme }) => ({ padding: theme.spacing(2) }),\n\n default: () => ({}),\n};\n\nexport const containerStyles = (input: ContainerStyleInput): CSSObject => {\n const { theme, variant, size, color, height, width, glow, pulse } = input;\n const accent = accentFor(theme, color).main;\n\n return {\n position: 'relative' as const,\n width,\n // A numeric height is taken literally; anything else falls back to the size\n // preset, since a percentage cannot resolve against an unsized parent here.\n height: typeof height === 'number' ? height : sizeStyles(size).height,\n overflow: 'hidden',\n borderRadius: theme.spacing(1),\n transition: theme.transitions.create(['all'], {\n duration: theme.transitions.duration.standard,\n }),\n ...(glow && { boxShadow: `0 0 30px ${alpha(accent, 0.4)}` }),\n ...(pulse && {\n animation: 'pulse 2s infinite',\n '@keyframes pulse': {\n '0%': { boxShadow: `0 0 0 0 ${alpha(accent, 0.4)}` },\n '70%': { boxShadow: `0 0 0 20px ${alpha(accent, 0)}` },\n '100%': { boxShadow: `0 0 0 0 ${alpha(accent, 0)}` },\n },\n }),\n ...(SURFACES[variant] ?? SURFACES.default)(input),\n };\n};\n"],"mappings":"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","names":["Box","useTheme","useCallback","useRef","jsx","jsxs","Box","Typography","useTheme","jsx","jsxs","alpha","alpha","jsx","jsxs","useTheme","useRef","useCallback","Box"]}
@@ -53,7 +53,7 @@ import {
53
53
  } from "../chunk-HR7KRGJQ.js";
54
54
  import {
55
55
  Alert
56
- } from "../chunk-3KWD5Y5O.js";
56
+ } from "../chunk-RXE5CUUE.js";
57
57
  import "../chunk-ARNQIGA4.js";
58
58
  import {
59
59
  fadeInScaleAnimation
@@ -1945,7 +1945,7 @@ function RangeBounds({
1945
1945
  component: "p",
1946
1946
  "data-testid": `${testId}-inclusive`,
1947
1947
  sx: { mt: 0.75, fontSize: "0.75rem", color: "text.disabled" },
1948
- children: "Ambas as datas entram no resultado."
1948
+ children: copy.filters.rangeInclusiveNote
1949
1949
  }
1950
1950
  )
1951
1951
  ] });
@@ -3140,7 +3140,7 @@ function MoreTrigger({
3140
3140
  },
3141
3141
  children: [
3142
3142
  /* @__PURE__ */ jsx21(FilterAltRoundedIcon, { fontSize: "small" }),
3143
- !compact && /* @__PURE__ */ jsx21(Box, { component: "span", sx: { display: { xs: "none", sm: "inline" } }, children: "Mais" }),
3143
+ !compact && /* @__PURE__ */ jsx21(Box, { component: "span", sx: { display: { xs: "none", sm: "inline" } }, children: copy.filters.moreTriggerLabel }),
3144
3144
  /* @__PURE__ */ jsx21(
3145
3145
  Box,
3146
3146
  {
@@ -3179,7 +3179,7 @@ function MoreHeading() {
3179
3179
  borderColor: "divider"
3180
3180
  },
3181
3181
  children: [
3182
- /* @__PURE__ */ jsx21(Text, { variant: "caption", as: "span", children: /* @__PURE__ */ jsx21(Box, { component: "span", sx: { textTransform: "uppercase", letterSpacing: 0.5, color: "text.disabled" }, children: "Mais filtros" }) }),
3182
+ /* @__PURE__ */ jsx21(Text, { variant: "caption", as: "span", children: /* @__PURE__ */ jsx21(Box, { component: "span", sx: { textTransform: "uppercase", letterSpacing: 0.5, color: "text.disabled" }, children: copy.filters.moreHeading }) }),
3183
3183
  /* @__PURE__ */ jsx21(Text, { variant: "caption", as: "span", children: /* @__PURE__ */ jsx21(Box, { component: "span", sx: { ml: "auto", color: "text.disabled" }, children: copy.filters.overflowNote }) })
3184
3184
  ]
3185
3185
  }
@@ -4350,7 +4350,7 @@ function SortTab({
4350
4350
  },
4351
4351
  direction
4352
4352
  )) }),
4353
- /* @__PURE__ */ jsx27(Text, { variant: "caption", as: "p", children: /* @__PURE__ */ jsx27(Box, { component: "span", sx: { px: 0.5, color: "text.secondary" }, children: "Campo" }) }),
4353
+ /* @__PURE__ */ jsx27(Text, { variant: "caption", as: "p", children: /* @__PURE__ */ jsx27(Box, { component: "span", sx: { px: 0.5, color: "text.secondary" }, children: copy.display.fieldHeading }) }),
4354
4354
  fields.map((field) => /* @__PURE__ */ jsx27(
4355
4355
  SortFieldRow,
4356
4356
  {
@@ -4461,7 +4461,7 @@ function DisplayTab({ testIdPrefix }) {
4461
4461
  ...canUseBoard ? ["board"] : []
4462
4462
  ];
4463
4463
  return /* @__PURE__ */ jsxs19(Box, { sx: { p: 1 }, children: [
4464
- /* @__PURE__ */ jsx27(Text, { variant: "caption", as: "p", children: /* @__PURE__ */ jsx27(Box, { component: "span", sx: { px: 0.5, color: "text.secondary" }, children: "Formato" }) }),
4464
+ /* @__PURE__ */ jsx27(Text, { variant: "caption", as: "p", children: /* @__PURE__ */ jsx27(Box, { component: "span", sx: { px: 0.5, color: "text.secondary" }, children: copy.display.formatHeading }) }),
4465
4465
  /* @__PURE__ */ jsx27(
4466
4466
  Box,
4467
4467
  {
@@ -4757,7 +4757,7 @@ function ExportTrigger({
4757
4757
  title: compact ? copy.export.trigger : void 0,
4758
4758
  children: /* @__PURE__ */ jsxs21(Box, { component: "span", sx: { display: "inline-flex", alignItems: "center", gap: 0.5 }, children: [
4759
4759
  busy ? /* @__PURE__ */ jsx29(CircularProgress, { size: 14 }) : /* @__PURE__ */ jsx29(DownloadRoundedIcon, { fontSize: "small" }),
4760
- !compact && /* @__PURE__ */ jsx29(Box, { component: "span", sx: { display: { xs: "none", sm: "inline" } }, children: "Exportar" }),
4760
+ !compact && /* @__PURE__ */ jsx29(Box, { component: "span", sx: { display: { xs: "none", sm: "inline" } }, children: copy.export.triggerLabel }),
4761
4761
  !compact && /* @__PURE__ */ jsx29(KeyboardArrowDownRoundedIcon4, { fontSize: "small" })
4762
4762
  ] })
4763
4763
  }
@@ -6379,6 +6379,7 @@ function ViewMutationErrorAlert({
6379
6379
  title: copy.nav.updateFailed,
6380
6380
  description: error,
6381
6381
  closable: true,
6382
+ closeLabel: copy.nav.dismissError,
6382
6383
  onClose,
6383
6384
  "data-testid": `${testIdPrefix}-views-mutation-error`
6384
6385
  }