@sorayasm/vietri-ds 0.2.0 → 0.2.2
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/CHANGELOG.md +16 -0
- package/README.md +14 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +75 -73
- package/dist/index.js.map +1 -1
- package/dist/types/components/NavBar/NavBar.d.ts +8 -1
- package/dist/types/components/NavBar/NavBar.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/components/NavBar/NavBar.tsx","../src/components/LanguageSwitch/LanguageSwitch.tsx","../src/components/StatCard/StatCard.tsx","../src/components/DataTable/DataTable.tsx","../src/components/BarChart/BarChart.tsx","../src/components/Icon/Icon.tsx","../src/components/Chip/Chip.tsx","../src/components/VisuallyHidden/VisuallyHidden.tsx","../src/components/Footer/Footer.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Select/Select.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Drawer/Drawer.tsx","../src/components/CopyField/CopyField.tsx","../src/components/SkipLink/SkipLink.tsx","../src/components/Hero/Hero.tsx","../src/components/FeatureCard/FeatureCard.tsx","../src/components/Steps/Steps.tsx","../src/components/Timeline/Timeline.tsx","../src/components/ProfileCard/ProfileCard.tsx","../src/components/internal/stretched.ts","../src/components/MediaCard/MediaCard.tsx","../src/components/ContentRail/ContentRail.tsx","../src/components/VideoEmbed/VideoEmbed.tsx","../src/components/EpisodeList/EpisodeList.tsx","../src/components/PlaylistCard/PlaylistCard.tsx","../src/theme/tokens.ts","../src/theme/components.ts","../src/theme/base.ts","../src/theme/palettes.ts","../src/theme/editorial.ts","../src/theme/streaming.ts","../src/theme/observatory.ts","../src/theme/categorical.ts"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport AppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport Drawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport SvgIcon from \"@mui/material/SvgIcon\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { Button } from \"../Button\";\n\nexport interface NavLink {\n label: string;\n href: string;\n /** Marks the link of the current page (aria-current=\"page\"). */\n current?: boolean;\n}\n\nexport interface NavBarProps {\n /** Brand or name shown on the left. */\n brand: ReactNode;\n brandHref?: string;\n links: NavLink[];\n /** Extra elements on the right, for example a language selector. */\n actions?: ReactNode;\n /** Accessible name of the navigation. */\n ariaLabel?: string;\n /** Label of the button that opens the menu on small screens. */\n menuLabel?: string;\n /** Label of the button that closes the menu on small screens. */\n closeLabel?: string;\n}\n\nfunction MenuIcon() {\n return (\n <SvgIcon>\n <path d=\"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z\" />\n </SvgIcon>\n );\n}\n\nfunction NavLinkItem({\n link,\n onClick,\n}: {\n link: NavLink;\n onClick?: () => void;\n}) {\n return (\n <Link\n href={link.href}\n underline=\"none\"\n aria-current={link.current ? \"page\" : undefined}\n onClick={onClick}\n sx={{\n color: link.current ? \"text.primary\" : \"text.secondary\",\n fontWeight: link.current ? 600 : 500,\n \"&:hover\": { color: \"text.primary\" },\n }}\n >\n {link.label}\n </Link>\n );\n}\n\nexport function NavBar({\n brand,\n brandHref = \"/\",\n links,\n actions,\n ariaLabel = \"Main\",\n menuLabel = \"Menu\",\n closeLabel = \"Close menu\",\n}: NavBarProps) {\n const theme = useTheme();\n const isDesktop = useMediaQuery(theme.breakpoints.up(\"md\"), { noSsr: true });\n const [open, setOpen] = useState(false);\n const close = () => setOpen(false);\n\n return (\n <AppBar\n component=\"header\"\n position=\"sticky\"\n color=\"inherit\"\n elevation={0}\n sx={{\n bgcolor: \"background.default\",\n color: \"text.primary\",\n borderBottom: 1,\n borderColor: \"divider\",\n }}\n >\n <Toolbar\n sx={{\n justifyContent: \"space-between\",\n gap: 3,\n minHeight: { xs: 64, md: 72 },\n }}\n >\n <Link\n href={brandHref}\n underline=\"none\"\n color=\"text.primary\"\n sx={{ fontWeight: 600, letterSpacing: \"-0.03em\", fontSize: \"1.125rem\" }}\n >\n {brand}\n </Link>\n\n {isDesktop ? (\n <Stack direction=\"row\" alignItems=\"center\" spacing={4}>\n <Box component=\"nav\" aria-label={ariaLabel}>\n <Stack\n component=\"ul\"\n direction=\"row\"\n spacing={4}\n sx={{ listStyle: \"none\", m: 0, p: 0 }}\n >\n {links.map((link) => (\n <li key={link.href}>\n <NavLinkItem link={link} />\n </li>\n ))}\n </Stack>\n </Box>\n {actions}\n </Stack>\n ) : (\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n {actions}\n <IconButton\n edge=\"end\"\n color=\"inherit\"\n aria-label={menuLabel}\n aria-expanded={open}\n onClick={() => setOpen(true)}\n >\n <MenuIcon />\n </IconButton>\n </Stack>\n )}\n </Toolbar>\n\n {!isDesktop && (\n <Drawer anchor=\"right\" open={open} onClose={close}>\n <Box sx={{ width: 280, p: 3 }}>\n <Stack alignItems=\"flex-end\" sx={{ mb: 3 }}>\n <Button variant=\"text\" color=\"secondary\" onClick={close}>\n {closeLabel}\n </Button>\n </Stack>\n <Box component=\"nav\" aria-label={ariaLabel}>\n <Stack\n component=\"ul\"\n spacing={3}\n sx={{ listStyle: \"none\", m: 0, p: 0, fontSize: \"1.25rem\" }}\n >\n {links.map((link) => (\n <li key={link.href}>\n <NavLinkItem link={link} onClick={close} />\n </li>\n ))}\n </Stack>\n </Box>\n </Box>\n </Drawer>\n )}\n </AppBar>\n );\n}\n","import ToggleButton from \"@mui/material/ToggleButton\";\nimport ToggleButtonGroup from \"@mui/material/ToggleButtonGroup\";\n\nexport interface LanguageOption {\n value: string;\n label: string;\n}\n\nexport interface LanguageSwitchProps {\n value: string;\n onChange: (value: string) => void;\n options?: LanguageOption[];\n /** Accessible name of the group. */\n ariaLabel?: string;\n}\n\nconst defaultOptions: LanguageOption[] = [\n { value: \"en\", label: \"EN\" },\n { value: \"es\", label: \"ES\" },\n];\n\nexport function LanguageSwitch({\n value,\n onChange,\n options = defaultOptions,\n ariaLabel = \"Language\",\n}: LanguageSwitchProps) {\n return (\n <ToggleButtonGroup\n exclusive\n size=\"small\"\n value={value}\n aria-label={ariaLabel}\n onChange={(_event, next: string | null) => {\n // With \"exclusive\", clicking the active option returns null: we ignore it.\n if (next !== null) onChange(next);\n }}\n >\n {options.map((option) => (\n <ToggleButton key={option.value} value={option.value}>\n {option.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Card, CardContent } from \"../Card\";\nimport { Typography } from \"../Typography\";\n\nexport interface StatCardProps {\n /** Highlighted figure, for example \"+200\" or \"6 years\". */\n value: ReactNode;\n /** What the figure measures. */\n label: string;\n /** Optional supporting text. */\n description?: string;\n}\n\nexport function StatCard({ value, label, description }: StatCardProps) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h3\" component=\"p\">\n {value}\n </Typography>\n <Typography variant=\"body1\" sx={{ mt: 1 }}>\n {label}\n </Typography>\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {description}\n </Typography>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport Table from \"@mui/material/Table\";\nimport TableBody from \"@mui/material/TableBody\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableContainer from \"@mui/material/TableContainer\";\nimport TableHead from \"@mui/material/TableHead\";\nimport TableRow from \"@mui/material/TableRow\";\nimport TableSortLabel from \"@mui/material/TableSortLabel\";\nimport Typography from \"@mui/material/Typography\";\n\ntype SortDirection = \"asc\" | \"desc\";\n\nexport interface DataTableColumn<T> {\n /** Key of the row property this column displays. */\n key: string;\n header: string;\n align?: \"left\" | \"center\" | \"right\";\n /** Allows sorting the table by this column. */\n sortable?: boolean;\n /** Custom cell content. */\n render?: (row: T) => ReactNode;\n /** Value used for sorting, when it differs from the displayed value. */\n sortValue?: (row: T) => string | number;\n}\n\nexport interface DataTableProps<T extends object> {\n columns: DataTableColumn<T>[];\n rows: T[];\n getRowKey: (row: T) => string | number;\n /** Accessible title of the table. */\n caption?: string;\n emptyMessage?: string;\n}\n\nfunction rawValue<T extends object>(row: T, column: DataTableColumn<T>): unknown {\n return (row as unknown as Record<string, unknown>)[column.key];\n}\n\nfunction sortableValue<T extends object>(\n row: T,\n column: DataTableColumn<T>\n): string | number {\n if (column.sortValue) return column.sortValue(row);\n const raw = rawValue(row, column);\n return typeof raw === \"number\" ? raw : String(raw ?? \"\");\n}\n\nfunction compare(a: string | number, b: string | number): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true });\n}\n\nexport function DataTable<T extends object>({\n columns,\n rows,\n getRowKey,\n caption,\n emptyMessage = \"No data\",\n}: DataTableProps<T>) {\n const [sort, setSort] = useState<{ key: string; direction: SortDirection } | null>(\n null\n );\n\n const sortedRows = useMemo(() => {\n if (!sort) return rows;\n const column = columns.find((c) => c.key === sort.key);\n if (!column) return rows;\n const factor = sort.direction === \"asc\" ? 1 : -1;\n return [...rows].sort(\n (a, b) => factor * compare(sortableValue(a, column), sortableValue(b, column))\n );\n }, [rows, columns, sort]);\n\n const toggleSort = (key: string) => {\n setSort((current) =>\n current?.key === key && current.direction === \"asc\"\n ? { key, direction: \"desc\" }\n : { key, direction: \"asc\" }\n );\n };\n\n // With horizontal scroll, the container must be able to receive focus (WCAG 2.1.1).\n return (\n <TableContainer tabIndex={0} sx={{ overflowX: \"auto\" }}>\n <Table>\n {caption && (\n <Typography\n component=\"caption\"\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ captionSide: \"top\", textAlign: \"left\", pb: 2 }}\n >\n {caption}\n </Typography>\n )}\n <TableHead>\n <TableRow>\n {columns.map((column) => {\n const direction = sort?.key === column.key ? sort.direction : undefined;\n return (\n <TableCell\n key={column.key}\n align={column.align}\n sortDirection={direction ?? false}\n >\n {column.sortable ? (\n <TableSortLabel\n active={direction !== undefined}\n direction={direction ?? \"asc\"}\n onClick={() => toggleSort(column.key)}\n >\n {column.header}\n </TableSortLabel>\n ) : (\n column.header\n )}\n </TableCell>\n );\n })}\n </TableRow>\n </TableHead>\n <TableBody>\n {sortedRows.length === 0 ? (\n <TableRow>\n <TableCell colSpan={columns.length} align=\"center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n sortedRows.map((row) => (\n <TableRow key={getRowKey(row)}>\n {columns.map((column, index) => (\n <TableCell\n key={column.key}\n align={column.align}\n component={index === 0 ? \"th\" : \"td\"}\n scope={index === 0 ? \"row\" : undefined}\n >\n {column.render\n ? column.render(row)\n : String(rawValue(row, column) ?? \"\")}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </TableContainer>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\nexport interface BarChartDatum {\n label: string;\n value: number;\n}\n\nexport interface BarChartProps {\n data: BarChartDatum[];\n /** Visible chart title. */\n title?: string;\n /** Value that equals 100% of the bar. Defaults to the largest value in the data. */\n max?: number;\n /** How each value is displayed. Defaults to the plain number. */\n formatValue?: (value: number) => string;\n}\n\nexport function BarChart({\n data,\n title,\n max,\n formatValue = String,\n}: BarChartProps) {\n const upperBound = max ?? Math.max(0, ...data.map((datum) => datum.value));\n\n return (\n <Box component=\"figure\" sx={{ m: 0 }}>\n {title && (\n <Typography\n component=\"figcaption\"\n variant=\"overline\"\n color=\"text.secondary\"\n sx={{ display: \"block\", mb: 2 }}\n >\n {title}\n </Typography>\n )}\n <Stack component=\"ul\" spacing={1.5} sx={{ listStyle: \"none\", m: 0, p: 0 }}>\n {data.map((datum) => {\n const percent =\n upperBound > 0\n ? Math.min(100, Math.max(0, (datum.value / upperBound) * 100))\n : 0;\n const formatted = formatValue(datum.value);\n return (\n <Box\n component=\"li\"\n key={datum.label}\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(80px, 160px) 1fr auto\",\n alignItems: \"center\",\n columnGap: 2,\n }}\n >\n {/* The bar exposes the information to screen readers;\n the visible text is hidden so it is not read twice. */}\n <Typography variant=\"body2\" aria-hidden=\"true\">\n {datum.label}\n </Typography>\n <Box\n role=\"meter\"\n aria-label={datum.label}\n aria-valuemin={0}\n aria-valuemax={upperBound}\n aria-valuenow={datum.value}\n aria-valuetext={formatted}\n sx={{\n height: 12,\n borderRadius: 1,\n bgcolor: \"divider\",\n overflow: \"hidden\",\n }}\n >\n <Box\n style={{ width: `${percent}%` }}\n sx={{ height: \"100%\", bgcolor: \"primary.main\" }}\n />\n </Box>\n <Typography\n variant=\"body2\"\n aria-hidden=\"true\"\n sx={{ minWidth: 40, textAlign: \"right\", fontWeight: 600 }}\n >\n {formatted}\n </Typography>\n </Box>\n );\n })}\n </Stack>\n </Box>\n );\n}\n","import type { LucideIcon, LucideProps } from \"lucide-react\";\n\nexport interface IconProps extends Omit<LucideProps, \"ref\"> {\n icon: LucideIcon;\n /**\n * If the icon conveys something on its own, describe it here. Without\n * `label` the icon is decorative and hidden from screen readers.\n */\n label?: string;\n}\n\nexport function Icon({ icon: Glyph, label, size = 18, ...rest }: IconProps) {\n if (label) {\n return <Glyph size={size} role=\"img\" aria-label={label} {...rest} />;\n }\n return <Glyph size={size} aria-hidden=\"true\" focusable=\"false\" {...rest} />;\n}\n","import Box from \"@mui/material/Box\";\nimport MuiChip from \"@mui/material/Chip\";\nimport type { ChipProps } from \"@mui/material/Chip\";\nimport type { CategoryColor } from \"../../theme/categorical\";\n\nexport { MuiChip as Chip };\nexport type { ChipProps };\n\nexport interface CategoryChipProps\n extends Omit<ChipProps, \"color\" | \"variant\" | \"icon\" | \"sx\"> {\n /** Category color, from `createCategoryColors`. */\n color: CategoryColor;\n /** Shows a dot before the text. */\n dot?: boolean;\n}\n\n/**\n * Category chip (country, role, decade…). The palette colors meet AAA\n * contrast, and the category name is always shown as text.\n */\nexport function CategoryChip({ color, dot = false, ...rest }: CategoryChipProps) {\n return (\n <MuiChip\n size=\"small\"\n {...rest}\n icon={\n dot ? (\n <Box\n component=\"span\"\n aria-hidden=\"true\"\n sx={{ width: 8, height: 8, borderRadius: \"50%\", bgcolor: color.fg }}\n />\n ) : undefined\n }\n sx={{\n bgcolor: color.bg,\n color: color.fg,\n \"&.MuiChip-clickable:hover\": { bgcolor: color.bg, filter: \"brightness(0.95)\" },\n \"& .MuiChip-icon\": { color: color.fg, ml: 1, mr: -0.25 },\n }}\n />\n );\n}\n","import type { ComponentPropsWithoutRef } from \"react\";import Box from \"@mui/material/Box\";\n\n/**\n * Hides content visually while keeping it available to screen readers. Use it\n * for supporting text (\"opens in a new tab\") and for aria-live regions.\n */\nexport function VisuallyHidden(props: ComponentPropsWithoutRef<\"span\">) {\n return (\n <Box\n component=\"span\"\n sx={{\n border: 0,\n clip: \"rect(0 0 0 0)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n }}\n {...props}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Container from \"@mui/material/Container\";\nimport Divider from \"@mui/material/Divider\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { alpha, useTheme } from \"@mui/material/styles\";\nimport { Icon } from \"../Icon\";\nimport { ExternalLink } from \"../Icon/icons\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\nexport interface FooterLink {\n label: string;\n href: string;\n /** Opens in a new tab and tells screen readers about it. */\n external?: boolean;\n}\n\nexport interface FooterProps {\n /** Project or brand name. */\n title: ReactNode;\n description?: ReactNode;\n /** Contact lines: city, email, etc. */\n lines?: string[];\n links?: FooterLink[];\n /** Accessible name of the links list. */\n linksLabel?: string;\n /** Highlighted action, for example a button. */\n action?: ReactNode;\n legal?: ReactNode;\n /** Text for screen readers on external links. */\n externalLabel?: string;\n}\n\nexport function Footer({\n title,\n description,\n lines = [],\n links = [],\n linksLabel = \"Footer links\",\n action,\n legal,\n externalLabel = \"(opens in a new tab)\",\n}: FooterProps) {\n const { glow } = useTheme().vietri.color;\n return (\n <Box\n component=\"footer\"\n sx={(theme) => ({\n position: \"relative\",\n overflow: \"hidden\",\n py: 6,\n color: theme.vietri.color.onSurface,\n background: theme.vietri.gradient.surface,\n // The default focus ring is not visible on dark backgrounds.\n \"& a:focus-visible, & button:focus-visible\": {\n outline: \"2px solid\",\n outlineColor: theme.vietri.color.onSurface,\n outlineOffset: 3,\n },\n })}\n >\n {/* Decorative lights: they carry no information. Themes may turn them off. */}\n {glow && (\n <>\n <Box\n aria-hidden=\"true\"\n sx={{\n position: \"absolute\",\n top: -96,\n right: -96,\n width: 384,\n height: 384,\n borderRadius: \"50%\",\n bgcolor: alpha(glow[0], 0.22),\n filter: \"blur(64px)\",\n pointerEvents: \"none\",\n }}\n />\n <Box\n aria-hidden=\"true\"\n sx={{\n position: \"absolute\",\n bottom: -96,\n left: -96,\n width: 384,\n height: 384,\n borderRadius: \"50%\",\n bgcolor: alpha(glow[1], 0.22),\n filter: \"blur(64px)\",\n pointerEvents: \"none\",\n }}\n />\n </>\n )}\n\n <Container maxWidth=\"lg\" sx={{ position: \"relative\", zIndex: 1 }}>\n <Stack\n direction={{ xs: \"column\", sm: \"row\" }}\n justifyContent=\"space-between\"\n alignItems={{ xs: \"flex-start\", sm: \"center\" }}\n spacing={4}\n >\n <Stack spacing={1}>\n <Typography component=\"p\" variant=\"h6\">\n {title}\n </Typography>\n {description && (\n <Typography\n variant=\"body2\"\n sx={(theme) => ({\n maxWidth: 560,\n color: theme.vietri.color.onSurfaceSoft,\n })}\n >\n {description}\n </Typography>\n )}\n {lines.map((line) => (\n <Typography\n key={line}\n variant=\"body2\"\n sx={(theme) => ({ color: theme.vietri.color.onSurfaceSoft })}\n >\n {line}\n </Typography>\n ))}\n </Stack>\n\n <Stack spacing={2} alignItems={{ xs: \"flex-start\", sm: \"flex-end\" }}>\n {links.length > 0 && (\n <Box component=\"nav\" aria-label={linksLabel}>\n <Stack\n component=\"ul\"\n direction=\"row\"\n spacing={3}\n useFlexGap\n flexWrap=\"wrap\"\n sx={{ listStyle: \"none\", m: 0, p: 0 }}\n >\n {links.map((link) => (\n <li key={link.href}>\n <Link\n href={link.href}\n color=\"inherit\"\n underline=\"always\"\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 0.5 }}\n >\n {link.label}\n {link.external && (\n <>\n <Icon icon={ExternalLink} size={14} />\n <VisuallyHidden>{externalLabel}</VisuallyHidden>\n </>\n )}\n </Link>\n </li>\n ))}\n </Stack>\n </Box>\n )}\n {action}\n </Stack>\n </Stack>\n\n {legal && (\n <>\n <Divider\n sx={(theme) => ({\n my: 3,\n borderColor: alpha(theme.vietri.color.onSurface, 0.25),\n })}\n />\n <Typography\n variant=\"body2\"\n sx={(theme) => ({ color: theme.vietri.color.onSurfaceSoft })}\n >\n {legal}\n </Typography>\n </>\n )}\n </Container>\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface SectionHeaderProps {\n title: string;\n /** Small label above the title, with an optional icon. */\n eyebrow?: ReactNode;\n description?: ReactNode;\n /**\n * Heading level (h1–h6). It does not change the look: it keeps the page\n * hierarchy correct for screen readers.\n */\n level?: HeadingLevel;\n align?: \"left\" | \"center\";\n}\n\nexport function SectionHeader({\n title,\n eyebrow,\n description,\n level = 2,\n align = \"left\",\n}: SectionHeaderProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n return (\n <Stack spacing={1} sx={{ textAlign: align, alignItems: align === \"center\" ? \"center\" : \"flex-start\" }}>\n {eyebrow && (\n <Typography\n component=\"p\"\n variant=\"overline\"\n color=\"primary.main\"\n sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 0.75, lineHeight: 1.5 }}\n >\n {eyebrow}\n </Typography>\n )}\n <Typography component={heading} variant=\"h3\">\n {title}\n </Typography>\n {description && (\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ maxWidth: 680 }}>\n {description}\n </Typography>\n )}\n </Stack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport TextField from \"@mui/material/TextField\";\nimport Typography from \"@mui/material/Typography\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n /** Number shown on the right, for example artists per country. */\n count?: number;\n /** Element before the text, for example a color dot. It must be decorative. */\n adornment?: ReactNode;\n}\n\nexport interface SelectProps {\n /** Visible label and accessible name of the field. */\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: SelectOption[];\n helperText?: string;\n disabled?: boolean;\n fullWidth?: boolean;\n size?: \"small\" | \"medium\";\n id?: string;\n}\n\nexport function Select({\n label,\n value,\n onChange,\n options,\n helperText,\n disabled,\n fullWidth,\n size,\n id,\n}: SelectProps) {\n const byValue = new Map(options.map((option) => [option.value, option]));\n\n return (\n <TextField\n select\n id={id}\n label={label}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n helperText={helperText}\n disabled={disabled}\n fullWidth={fullWidth}\n size={size}\n slotProps={{\n select: {\n renderValue: (selected) => {\n const option = byValue.get(String(selected));\n if (!option) return \"\";\n return (\n <Box component=\"span\" sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 1 }}>\n {option.adornment}\n {option.label}\n </Box>\n );\n },\n },\n }}\n >\n {options.map((option) => (\n <MenuItem key={option.value} value={option.value} sx={{ gap: 1 }}>\n {option.adornment}\n {option.label}\n {option.count !== undefined && (\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\" sx={{ ml: \"auto\", pl: 2 }}>\n {option.count}\n </Typography>\n )}\n </MenuItem>\n ))}\n </TextField>\n );\n}\n","import { useId, type ReactNode } from \"react\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogContentText from \"@mui/material/DialogContentText\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport { Icon } from \"../Icon\";\nimport { X } from \"../Icon/icons\";\n\nexport interface DialogProps {\n open: boolean;\n onClose: () => void;\n /** Dialog title. It is also its accessible name. */\n title: string;\n /** Short text that explains the dialog. Screen readers read it when it opens. */\n description?: ReactNode;\n children?: ReactNode;\n /** Buttons at the bottom of the dialog. */\n actions?: ReactNode;\n closeLabel?: string;\n maxWidth?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n}\n\n/**\n * Modal dialog. It traps focus, closes with Escape and returns focus to the\n * element that opened it.\n */\nexport function Dialog({\n open,\n onClose,\n title,\n description,\n children,\n actions,\n closeLabel = \"Close\",\n maxWidth = \"sm\",\n}: DialogProps) {\n const titleId = useId();\n const descriptionId = useId();\n\n return (\n <MuiDialog\n open={open}\n onClose={onClose}\n fullWidth\n maxWidth={maxWidth}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n <DialogTitle id={titleId} sx={{ pr: 7 }}>\n {title}\n </DialogTitle>\n <IconButton\n aria-label={closeLabel}\n onClick={onClose}\n sx={{ position: \"absolute\", top: 8, right: 8 }}\n >\n <Icon icon={X} />\n </IconButton>\n <DialogContent>\n {description && (\n <DialogContentText id={descriptionId} sx={{ mb: children ? 2 : 0 }}>\n {description}\n </DialogContentText>\n )}\n {children}\n </DialogContent>\n {actions && <DialogActions sx={{ px: 3, pb: 2 }}>{actions}</DialogActions>}\n </MuiDialog>\n );\n}\n","import { useId, type ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Icon } from \"../Icon\";\nimport { X } from \"../Icon/icons\";\n\nexport interface DrawerProps {\n open: boolean;\n onClose: () => void;\n /** Panel title. It is also its accessible name. */\n title: string;\n /** Small label above the title, for example \"Archive profile\". */\n eyebrow?: ReactNode;\n children: ReactNode;\n /** Fixed content at the bottom of the panel, for example a button. */\n footer?: ReactNode;\n anchor?: \"left\" | \"right\";\n width?: number;\n closeLabel?: string;\n}\n\n/**\n * Modal side panel. It traps focus, closes with Escape and is announced as a\n * dialog named by its title.\n */\nexport function Drawer({\n open,\n onClose,\n title,\n eyebrow,\n children,\n footer,\n anchor = \"right\",\n width = 420,\n closeLabel = \"Close\",\n}: DrawerProps) {\n const titleId = useId();\n\n return (\n <MuiDrawer anchor={anchor} open={open} onClose={onClose}>\n <Box\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n sx={{\n width: { xs: \"100vw\", sm: width },\n maxWidth: \"100vw\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n sx={{ p: 3, pb: 1 }}\n >\n <Typography component=\"p\" variant=\"overline\" color=\"primary.main\">\n {eyebrow}\n </Typography>\n <IconButton aria-label={closeLabel} onClick={onClose} edge=\"end\">\n <Icon icon={X} />\n </IconButton>\n </Stack>\n <Box sx={{ px: 3, pb: 2, flex: 1, overflowY: \"auto\" }} tabIndex={0}>\n <Typography id={titleId} component=\"h2\" variant=\"h4\" sx={{ mb: 2 }}>\n {title}\n </Typography>\n {children}\n </Box>\n {footer && (\n <Box sx={{ p: 3, borderTop: 1, borderColor: \"divider\" }}>{footer}</Box>\n )}\n </Box>\n </MuiDrawer>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { Check, Copy } from \"../Icon/icons\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\nexport interface CopyFieldProps {\n /** What is being copied, for example \"HTML code to embed\". */\n label: string;\n value: string;\n copyLabel?: string;\n copiedLabel?: string;\n errorLabel?: string;\n /** Milliseconds the \"copied\" notice stays visible. */\n copiedDuration?: number;\n}\n\ntype Status = \"idle\" | \"copied\" | \"error\";\n\n/**\n * Code block with a copy button. The result is announced to screen readers\n * through an aria-live region.\n */\nexport function CopyField({\n label,\n value,\n copyLabel = \"Copy\",\n copiedLabel = \"Copied!\",\n errorLabel = \"Could not copy\",\n copiedDuration = 2000,\n}: CopyFieldProps) {\n const [status, setStatus] = useState<Status>(\"idle\");\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n async function handleCopy() {\n try {\n await navigator.clipboard.writeText(value);\n setStatus(\"copied\");\n } catch {\n setStatus(\"error\");\n }\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setStatus(\"idle\"), copiedDuration);\n }\n\n const message =\n status === \"copied\" ? copiedLabel : status === \"error\" ? errorLabel : \"\";\n\n return (\n <Stack spacing={1.5}>\n <Typography component=\"p\" variant=\"overline\" color=\"text.secondary\">\n {label}\n </Typography>\n <Box\n role=\"region\"\n aria-label={label}\n tabIndex={0}\n sx={{\n overflowX: \"auto\",\n p: 1.5,\n borderRadius: 1,\n border: 1,\n borderColor: \"divider\",\n bgcolor: \"background.default\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n fontSize: \"0.8125rem\",\n whiteSpace: \"pre\",\n }}\n >\n <code>{value}</code>\n </Box>\n <Button\n onClick={handleCopy}\n startIcon={<Icon icon={status === \"copied\" ? Check : Copy} />}\n fullWidth\n >\n {status === \"copied\" ? copiedLabel : copyLabel}\n </Button>\n <VisuallyHidden role=\"status\" aria-live=\"polite\">\n {message}\n </VisuallyHidden>\n </Stack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Link from \"@mui/material/Link\";\n\nexport interface SkipLinkProps {\n /** Id of the main content, for example \"#content\". */\n href: string;\n children?: ReactNode;\n}\n\n/**\n * \"Skip to content\" link (WCAG 2.4.1). It is the first element to receive\n * focus with Tab and it is only visible while it has focus.\n */\nexport function SkipLink({ href, children = \"Skip to content\" }: SkipLinkProps) {\n return (\n <Link\n href={href}\n sx={(theme) => ({\n position: \"fixed\",\n top: theme.spacing(1),\n left: theme.spacing(1),\n zIndex: theme.zIndex.tooltip + 1,\n px: 2,\n py: 1,\n borderRadius: 1,\n bgcolor: \"background.paper\",\n color: \"text.primary\",\n fontWeight: 600,\n textDecoration: \"none\",\n border: `2px solid ${theme.palette.primary.main}`,\n transform: \"translateY(-300%)\",\n \"&:focus\": { transform: \"translateY(0)\" },\n })}\n >\n {children}\n </Link>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Container from \"@mui/material/Container\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface HeroProps {\n title: string;\n /** Small label above the title. */\n eyebrow?: ReactNode;\n description?: ReactNode;\n /** Buttons or links under the text. */\n actions?: ReactNode;\n /** Heading level of the title (h1–h6). A page's hero is normally h1. */\n level?: HeadingLevel;\n align?: \"left\" | \"center\";\n}\n\n/**\n * Banner for the top of a page. It uses the theme surface color (flat) with\n * light text on top. Outlined and text buttons inside it take the text color\n * of the surface, so they stay visible.\n */\nexport function Hero({\n title,\n eyebrow,\n description,\n actions,\n level = 1,\n align = \"left\",\n}: HeroProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n const center = align === \"center\";\n\n return (\n <Box\n component=\"section\"\n sx={(theme) => ({\n py: { xs: 6, md: 10 },\n color: theme.vietri.color.onSurface,\n background: theme.vietri.gradient.surface,\n // Focus ring and secondary buttons that stay visible on a dark surface.\n \"& a:focus-visible, & button:focus-visible\": {\n outline: \"2px solid\",\n outlineColor: theme.vietri.color.onSurface,\n outlineOffset: 3,\n },\n \"& .MuiButton-outlined, & .MuiButton-text\": {\n color: \"inherit\",\n borderColor: \"currentColor\",\n },\n })}\n >\n <Container maxWidth=\"lg\">\n <Stack\n spacing={2}\n sx={{ alignItems: center ? \"center\" : \"flex-start\", textAlign: align }}\n >\n {eyebrow && (\n <Typography\n component=\"p\"\n variant=\"overline\"\n sx={(theme) => ({ color: theme.vietri.color.onSurfaceSoft })}\n >\n {eyebrow}\n </Typography>\n )}\n <Typography component={heading} variant=\"h2\" sx={{ maxWidth: 900 }}>\n {title}\n </Typography>\n {description && (\n <Typography\n variant=\"body1\"\n sx={(theme) => ({\n maxWidth: 680,\n color: theme.vietri.color.onSurfaceSoft,\n })}\n >\n {description}\n </Typography>\n )}\n {actions && (\n <Stack\n direction=\"row\"\n spacing={2}\n useFlexGap\n flexWrap=\"wrap\"\n sx={{ pt: 2, justifyContent: center ? \"center\" : \"flex-start\" }}\n >\n {actions}\n </Stack>\n )}\n </Stack>\n </Container>\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { Card, CardContent } from \"../Card\";\nimport { Icon } from \"../Icon\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface FeatureCardProps {\n /** Decorative icon (hidden from screen readers). */\n icon: LucideIcon;\n title: string;\n description?: ReactNode;\n /** Heading level of the title. Default 3. */\n level?: HeadingLevel;\n /** Extra content under the description, for example a list. */\n children?: ReactNode;\n}\n\n/** Card with an icon, a title and a short text. */\nexport function FeatureCard({\n icon,\n title,\n description,\n level = 3,\n children,\n}: FeatureCardProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n return (\n <Card sx={{ height: \"100%\" }}>\n <CardContent>\n <Box\n sx={(theme) => ({\n display: \"grid\",\n placeItems: \"center\",\n width: 44,\n height: 44,\n mb: 2,\n borderRadius: 2,\n bgcolor: theme.vietri.color.chip,\n color: theme.palette.primary.main,\n })}\n >\n <Icon icon={icon} size={22} />\n </Box>\n <Typography component={heading} variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {description}\n </Typography>\n )}\n {children && <Box sx={{ mt: 2 }}>{children}</Box>}\n </CardContent>\n </Card>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface Step {\n title: string;\n description?: ReactNode;\n}\n\nexport interface StepsProps {\n steps: Step[];\n /** Heading level of each step title. Default 3. */\n level?: HeadingLevel;\n /** Accessible name of the list, for example \"Methodology\". */\n ariaLabel?: string;\n}\n\n/**\n * Numbered process. It is an ordered list, so screen readers announce the\n * position of each step; the visible numbers are decorative.\n */\nexport function Steps({ steps, level = 3, ariaLabel }: StepsProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n return (\n <Box\n component=\"ol\"\n role=\"list\"\n aria-label={ariaLabel}\n sx={{\n listStyle: \"none\",\n m: 0,\n p: 0,\n display: \"grid\",\n gap: 3,\n gridTemplateColumns: {\n xs: \"1fr\",\n md: `repeat(${Math.max(steps.length, 1)}, minmax(0, 1fr))`,\n },\n }}\n >\n {steps.map((step, index) => (\n <li key={step.title}>\n <Stack spacing={1}>\n <Box\n aria-hidden=\"true\"\n sx={(theme) => ({\n display: \"grid\",\n placeItems: \"center\",\n width: 36,\n height: 36,\n borderRadius: \"50%\",\n fontWeight: 600,\n bgcolor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n })}\n >\n {index + 1}\n </Box>\n <Typography component={heading} variant=\"h6\">\n {step.title}\n </Typography>\n {step.description && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {step.description}\n </Typography>\n )}\n </Stack>\n </li>\n ))}\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface TimelineEntry {\n /** Unique id. It is also the anchor of the entry (`#id`). */\n id: string;\n /** Period or date, for example \"1920s\". */\n label: string;\n description?: ReactNode;\n content?: ReactNode;\n}\n\nexport interface TimelineProps {\n entries: TimelineEntry[];\n /** Heading level of each label. Default 3. */\n level?: HeadingLevel;\n /** Accessible name of the list, for example \"Timeline by decade\". */\n ariaLabel?: string;\n}\n\n/**\n * Vertical timeline. It is an ordered list; every entry has a heading, so\n * screen reader users can jump from period to period.\n */\nexport function Timeline({ entries, level = 3, ariaLabel }: TimelineProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n return (\n <Box\n component=\"ol\"\n role=\"list\"\n aria-label={ariaLabel}\n sx={{ listStyle: \"none\", m: 0, p: 0 }}\n >\n {entries.map((entry) => (\n <Box\n component=\"li\"\n key={entry.id}\n id={entry.id}\n sx={(theme) => ({\n position: \"relative\",\n pl: 4,\n pb: 5,\n scrollMarginTop: theme.spacing(10),\n // Vertical line between dots.\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n left: 7,\n top: 14,\n bottom: 0,\n width: 2,\n bgcolor: theme.palette.divider,\n },\n \"&:last-of-type\": { pb: 0 },\n \"&:last-of-type::before\": { display: \"none\" },\n })}\n >\n <Box\n aria-hidden=\"true\"\n sx={(theme) => ({\n position: \"absolute\",\n left: 0,\n top: 6,\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n bgcolor: theme.palette.primary.main,\n border: `3px solid ${theme.palette.background.default}`,\n boxSizing: \"border-box\",\n })}\n />\n <Typography component={heading} variant=\"h5\">\n {entry.label}\n </Typography>\n {entry.description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n {entry.description}\n </Typography>\n )}\n {entry.content && <Box sx={{ mt: 2 }}>{entry.content}</Box>}\n </Box>\n ))}\n </Box>\n );\n}\n","import Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { CategoryColor } from \"../../theme/categorical\";\nimport { Card, CardContent } from \"../Card\";\nimport { CategoryChip, Chip } from \"../Chip\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface ProfileTag {\n label: string;\n /** Category color, from `createCategoryColors`. Without it the chip is neutral. */\n color?: CategoryColor;\n}\n\nexport interface ProfileCardProps {\n name: string;\n /** Short epithet or description under the name. */\n subtitle?: string;\n bio?: string;\n tags?: ProfileTag[];\n /** Makes the whole card a link. */\n href?: string;\n /** Makes the whole card a button (for example to open a side panel). */\n onClick?: () => void;\n /** Heading level of the name. Default 3. */\n level?: HeadingLevel;\n /** Lines of bio shown before it is cut. Default 3. */\n bioLines?: number;\n}\n\n// The link sits inside the heading and its ::after covers the whole card\n// (\"stretched link\"): one tab stop, a real heading, and a card that is\n// entirely clickable. Position must be static so the card is the reference.\nconst stretchedLink: SxProps<Theme> = {\n position: \"static\",\n color: \"inherit\",\n font: \"inherit\",\n textAlign: \"left\",\n cursor: \"pointer\",\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n inset: 0,\n },\n};\n\n/**\n * Card for a person or profile. When it has `href` or `onClick` the whole\n * card is operable with mouse and keyboard, and the name stays a heading.\n */\nexport function ProfileCard({\n name,\n subtitle,\n bio,\n tags = [],\n href,\n onClick,\n level = 3,\n bioLines = 3,\n}: ProfileCardProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n const interactive = Boolean(href || onClick);\n\n const title = href ? (\n <Link href={href} underline=\"none\" sx={stretchedLink}>\n {name}\n </Link>\n ) : onClick ? (\n <Link component=\"button\" type=\"button\" onClick={onClick} underline=\"none\" sx={stretchedLink}>\n {name}\n </Link>\n ) : (\n name\n );\n\n return (\n <Card\n sx={(theme) => ({\n position: \"relative\",\n height: \"100%\",\n ...(interactive && { \"&:hover\": { borderColor: theme.palette.primary.main } }),\n // One focus ring for the whole card, instead of one around the name.\n \"&:has(:focus-visible)\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n \"& a:focus-visible, & button:focus-visible\": { outline: \"none\" },\n })}\n >\n <CardContent>\n <Typography component={heading} variant=\"h6\">\n {title}\n </Typography>\n {subtitle && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n )}\n {bio && (\n <Typography\n variant=\"body2\"\n sx={{\n mt: 1,\n display: \"-webkit-box\",\n WebkitLineClamp: bioLines,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {bio}\n </Typography>\n )}\n {tags.length > 0 && (\n <Stack direction=\"row\" spacing={1} useFlexGap flexWrap=\"wrap\" sx={{ mt: 2 }}>\n {tags.map((tag) =>\n tag.color ? (\n <CategoryChip key={tag.label} label={tag.label} color={tag.color} />\n ) : (\n <Chip key={tag.label} label={tag.label} size=\"small\" />\n )\n )}\n </Stack>\n )}\n </CardContent>\n </Card>\n );\n}\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\n/**\n * Link or button placed inside a heading whose ::after covers the whole card\n * (\"stretched link\"): one tab stop, a real heading and a fully clickable card.\n * Position must be static so the card is the positioning reference.\n */\nexport const stretchedLink: SxProps<Theme> = {\n position: \"static\",\n color: \"inherit\",\n font: \"inherit\",\n textAlign: \"left\",\n cursor: \"pointer\",\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n inset: 0,\n },\n};\n\n/** One focus ring for the whole card, instead of one around the inner link. */\nexport const cardFocusRing = (theme: Theme) => ({\n \"&:has(:focus-visible)\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n \"& a:focus-visible, & button:focus-visible\": { outline: \"none\" },\n});\n","import Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Typography from \"@mui/material/Typography\";\nimport { Card, CardContent } from \"../Card\";\nimport { Icon } from \"../Icon\";\nimport { Play } from \"../Icon/icons\";\nimport { cardFocusRing, stretchedLink } from \"../internal/stretched\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface MediaCardProps {\n title: string;\n /** Line under the title, for example the guest or the band. */\n subtitle?: string;\n /** Small label above the title, for example \"Season 1 · Episode 3\". */\n meta?: string;\n /** Thumbnail (16:9). Without it a plain surface is shown. */\n imageUrl?: string;\n /** Length shown over the thumbnail, for example \"42:10\". */\n duration?: string;\n /** Short label over the thumbnail, for example \"New\". */\n badge?: string;\n /** Makes the whole card a link. */\n href?: string;\n /** Makes the whole card a button. */\n onClick?: () => void;\n /** Heading level of the title. Default 3. */\n level?: HeadingLevel;\n /** Shows a play icon over the thumbnail. Default true. */\n playIcon?: boolean;\n}\n\n/**\n * Card for a video or an episode: a 16:9 thumbnail with a title. When it has\n * `href` or `onClick` the whole card is operable with mouse and keyboard and\n * the title stays a heading. The thumbnail is decorative (empty alt): the\n * title already names the content.\n */\nexport function MediaCard({\n title,\n subtitle,\n meta,\n imageUrl,\n duration,\n badge,\n href,\n onClick,\n level = 3,\n playIcon = true,\n}: MediaCardProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n const interactive = Boolean(href || onClick);\n\n const titleNode = href ? (\n <Link href={href} underline=\"none\" sx={stretchedLink}>\n {title}\n </Link>\n ) : onClick ? (\n <Link component=\"button\" type=\"button\" onClick={onClick} underline=\"none\" sx={stretchedLink}>\n {title}\n </Link>\n ) : (\n title\n );\n\n return (\n <Card\n sx={(theme) => ({\n position: \"relative\",\n height: \"100%\",\n overflow: \"hidden\",\n ...(interactive && { \"&:hover\": { borderColor: theme.palette.primary.main } }),\n ...cardFocusRing(theme),\n })}\n >\n <Box\n sx={(theme) => ({\n position: \"relative\",\n aspectRatio: \"16 / 9\",\n bgcolor: theme.vietri.color.chip,\n })}\n >\n {imageUrl && (\n <Box\n component=\"img\"\n src={imageUrl}\n alt=\"\"\n loading=\"lazy\"\n sx={{ display: \"block\", width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n )}\n {playIcon && (\n <Box\n aria-hidden=\"true\"\n sx={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n display: \"grid\",\n placeItems: \"center\",\n width: 48,\n height: 48,\n borderRadius: \"50%\",\n bgcolor: \"rgba(0, 0, 0, 0.8)\",\n color: \"#FFFFFF\",\n }}\n >\n <Icon icon={Play} size={22} />\n </Box>\n )}\n {badge && (\n <Box\n sx={(theme) => ({\n position: \"absolute\",\n top: 8,\n left: 8,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n bgcolor: theme.vietri.color.action[0],\n color: theme.vietri.color.onAction,\n })}\n >\n {badge}\n </Box>\n )}\n {duration && (\n <Box\n sx={{\n position: \"absolute\",\n right: 8,\n bottom: 8,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n bgcolor: \"rgba(0, 0, 0, 0.9)\",\n color: \"#FFFFFF\",\n }}\n >\n {duration}\n </Box>\n )}\n </Box>\n <CardContent>\n {meta && (\n <Typography component=\"p\" variant=\"overline\" color=\"text.secondary\">\n {meta}\n </Typography>\n )}\n <Typography component={heading} variant=\"h6\">\n {titleNode}\n </Typography>\n {subtitle && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { Children, useId, useRef, type ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Icon } from \"../Icon\";\nimport { ChevronLeft, ChevronRight } from \"../Icon/icons\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface ContentRailProps {\n /** Title of the row, for example \"Season 1\". It names the section. */\n title: string;\n /** The items of the row, usually MediaCards. */\n children: ReactNode;\n /** Heading level of the title. Default 2. */\n level?: HeadingLevel;\n /** Width of each item in pixels. Default 280. */\n itemWidth?: number;\n previousLabel?: string;\n nextLabel?: string;\n /** Extra element next to the arrows, for example a \"See all\" link. */\n action?: ReactNode;\n}\n\n/**\n * Horizontal row of items, like a season shelf. The row can be scrolled with\n * the arrows, with the mouse or touch, and with the keyboard: the scroll area\n * receives focus, and every interactive item inside it is reachable with Tab.\n */\nexport function ContentRail({\n title,\n children,\n level = 2,\n itemWidth = 280,\n previousLabel = \"Scroll left\",\n nextLabel = \"Scroll right\",\n action,\n}: ContentRailProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n const headingId = useId();\n const scroller = useRef<HTMLDivElement>(null);\n const items = Children.toArray(children);\n\n function scrollBy(direction: 1 | -1) {\n const element = scroller.current;\n if (!element) return;\n const reduceMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n element.scrollBy?.({\n left: direction * element.clientWidth * 0.8,\n behavior: reduceMotion ? \"auto\" : \"smooth\",\n });\n }\n\n return (\n <Box component=\"section\" aria-labelledby={headingId} sx={{ mb: 4 }}>\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n sx={{ mb: 2 }}\n >\n <Typography id={headingId} component={heading} variant=\"h5\">\n {title}\n </Typography>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n {action}\n <IconButton aria-label={previousLabel} onClick={() => scrollBy(-1)}>\n <Icon icon={ChevronLeft} />\n </IconButton>\n <IconButton aria-label={nextLabel} onClick={() => scrollBy(1)}>\n <Icon icon={ChevronRight} />\n </IconButton>\n </Stack>\n </Stack>\n <Box\n ref={scroller}\n tabIndex={0}\n sx={(theme) => ({\n overflowX: \"auto\",\n pb: 1,\n scrollSnapType: \"x proximity\",\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n })}\n >\n <Box\n component=\"ul\"\n role=\"list\"\n sx={{ listStyle: \"none\", m: 0, p: 0, display: \"flex\", gap: 2 }}\n >\n {items.map((item, index) => (\n <Box\n component=\"li\"\n key={index}\n sx={{ flex: `0 0 ${itemWidth}px`, scrollSnapAlign: \"start\" }}\n >\n {item}\n </Box>\n ))}\n </Box>\n </Box>\n </Box>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport { Icon } from \"../Icon\";\nimport { Play } from \"../Icon/icons\";\n\nexport interface VideoEmbedProps {\n /** YouTube video id, for example \"jNQXAC9IVRw\". */\n videoId: string;\n /** Title of the video. It is the accessible name of the player. */\n title: string;\n /** Image shown before the video loads. Without it a black surface is shown. */\n poster?: string;\n /** Start time in seconds. */\n start?: number;\n /**\n * When true (default) nothing is loaded from YouTube until the person\n * presses play: faster pages and no third-party tracking before consent.\n * When false the player loads right away.\n */\n lazy?: boolean;\n /** Label of the play button. Default \"Play video: {title}\". */\n playLabel?: string;\n}\n\nfunction embedUrl(videoId: string, start: number | undefined, autoplay: boolean) {\n const params = new URLSearchParams({ rel: \"0\", modestbranding: \"1\" });\n if (start) params.set(\"start\", String(Math.floor(start)));\n if (autoplay) params.set(\"autoplay\", \"1\");\n return `https://www.youtube-nocookie.com/embed/${encodeURIComponent(videoId)}?${params.toString()}`;\n}\n\n/**\n * Responsive 16:9 YouTube player. It uses the privacy-enhanced domain\n * (youtube-nocookie.com) and, by default, loads nothing until the person\n * presses play. After pressing play, focus moves to the player.\n */\nexport function VideoEmbed({\n videoId,\n title,\n poster,\n start,\n lazy = true,\n playLabel,\n}: VideoEmbedProps) {\n const [active, setActive] = useState(!lazy);\n const startedByUser = useRef(false);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n useEffect(() => {\n if (active && startedByUser.current) iframeRef.current?.focus();\n }, [active]);\n\n return (\n <Box\n sx={{\n position: \"relative\",\n width: \"100%\",\n aspectRatio: \"16 / 9\",\n overflow: \"hidden\",\n borderRadius: 2,\n bgcolor: \"#000000\",\n }}\n >\n {active ? (\n <iframe\n ref={iframeRef}\n src={embedUrl(videoId, start, startedByUser.current)}\n title={title}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n referrerPolicy=\"strict-origin-when-cross-origin\"\n loading=\"lazy\"\n style={{ position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\", border: 0 }}\n />\n ) : (\n <ButtonBase\n aria-label={playLabel ?? `Play video: ${title}`}\n onClick={() => {\n startedByUser.current = true;\n setActive(true);\n }}\n sx={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n \"&:focus-visible\": {\n outline: \"3px solid #FFFFFF\",\n outlineOffset: -6,\n },\n }}\n >\n {poster && (\n <Box\n component=\"img\"\n src={poster}\n alt=\"\"\n loading=\"lazy\"\n sx={{ position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n )}\n <Box\n aria-hidden=\"true\"\n sx={{\n position: \"relative\",\n display: \"grid\",\n placeItems: \"center\",\n width: 72,\n height: 72,\n borderRadius: \"50%\",\n bgcolor: \"rgba(0, 0, 0, 0.8)\",\n color: \"#FFFFFF\",\n }}\n >\n <Icon icon={Play} size={32} />\n </Box>\n </ButtonBase>\n )}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Typography from \"@mui/material/Typography\";\nimport type { Theme } from \"@mui/material/styles\";\nimport { stretchedLink } from \"../internal/stretched\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface Episode {\n id: string;\n /** Episode number, as published (it may not match the position in the list). */\n number: number;\n title: string;\n description?: string;\n /** Extra line, for example guest and duration. */\n meta?: string;\n /** Small thumbnail (16:9). */\n imageUrl?: string;\n /** Makes the row a link. */\n href?: string;\n}\n\nexport interface EpisodeListProps {\n episodes: Episode[];\n /** Id of the episode being watched. It is marked with aria-current. */\n currentId?: string;\n /** Makes every row a button and reports the chosen id. */\n onSelect?: (id: string) => void;\n /** Heading level of each title. Default 3. */\n level?: HeadingLevel;\n /** Accessible name of the list, for example \"Season 1\". */\n ariaLabel?: string;\n /** Text above each title. Default \"Episode N\". */\n episodeLabel?: (number: number) => string;\n /** Text shown on the current episode. Default \"Now playing\". */\n currentLabel?: string;\n}\n\nconst rowFocus = (theme: Theme) => ({\n \"&:has(:focus-visible)\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n \"& a:focus-visible, & button:focus-visible\": { outline: \"none\" },\n});\n\n/**\n * Vertical list of episodes. It is an ordered list; each title is a heading,\n * and the whole row is operable with mouse and keyboard when it has a link or\n * `onSelect`.\n */\nexport function EpisodeList({\n episodes,\n currentId,\n onSelect,\n level = 3,\n ariaLabel,\n episodeLabel = (number) => `Episode ${number}`,\n currentLabel = \"Now playing\",\n}: EpisodeListProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n\n return (\n <Box\n component=\"ol\"\n role=\"list\"\n aria-label={ariaLabel}\n sx={{ listStyle: \"none\", m: 0, p: 0 }}\n >\n {episodes.map((episode) => {\n const isCurrent = episode.id === currentId;\n const interactive = Boolean(onSelect || episode.href);\n\n const title = onSelect ? (\n <Link\n component=\"button\"\n type=\"button\"\n onClick={() => onSelect(episode.id)}\n aria-current={isCurrent ? \"true\" : undefined}\n underline=\"none\"\n sx={stretchedLink}\n >\n {episode.title}\n </Link>\n ) : episode.href ? (\n <Link\n href={episode.href}\n aria-current={isCurrent ? \"true\" : undefined}\n underline=\"none\"\n sx={stretchedLink}\n >\n {episode.title}\n </Link>\n ) : (\n episode.title\n );\n\n return (\n <Box\n component=\"li\"\n key={episode.id}\n sx={(theme) => ({\n position: \"relative\",\n display: \"flex\",\n gap: 2,\n p: 2,\n borderBottom: 1,\n borderColor: \"divider\",\n borderLeft: 4,\n borderLeftColor: isCurrent ? theme.palette.primary.main : \"transparent\",\n ...(interactive && { \"&:hover\": { bgcolor: theme.palette.action.hover } }),\n ...rowFocus(theme),\n })}\n >\n {episode.imageUrl && (\n <Box\n component=\"img\"\n src={episode.imageUrl}\n alt=\"\"\n loading=\"lazy\"\n sx={{\n flex: \"0 0 auto\",\n width: { xs: 112, sm: 160 },\n aspectRatio: \"16 / 9\",\n objectFit: \"cover\",\n borderRadius: 1,\n }}\n />\n )}\n <Box sx={{ minWidth: 0 }}>\n <Typography component=\"p\" variant=\"overline\" color=\"text.secondary\">\n {episodeLabel(episode.number)}\n {isCurrent && ` · ${currentLabel}`}\n </Typography>\n <Typography component={heading} variant=\"h6\">\n {title}\n </Typography>\n {episode.meta && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {episode.meta}\n </Typography>\n )}\n {episode.description && (\n <Typography\n variant=\"body2\"\n sx={{\n mt: 0.5,\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {episode.description}\n </Typography>\n )}\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Button } from \"../Button\";\nimport { Card, CardContent } from \"../Card\";\nimport { Icon } from \"../Icon\";\nimport { ExternalLink, Music } from \"../Icon/icons\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface PlaylistPlatform {\n /** Name shown on the button, for example \"Spotify\". */\n name: string;\n href: string;\n}\n\nexport interface PlaylistCardProps {\n title: string;\n description?: string;\n /** Square cover. Without it a plain surface with a music icon is shown. */\n imageUrl?: string;\n platforms: PlaylistPlatform[];\n /** Heading level of the title. Default 3. */\n level?: HeadingLevel;\n /** Accessible name of the list of platforms. Default \"Listen on\". */\n platformsLabel?: string;\n /** Text for screen readers on external links. */\n externalLabel?: string;\n}\n\n/**\n * Card for a playlist that lives on several music services. Each service is a\n * link that opens in a new tab. The accessible name of every link includes the\n * playlist title, so several cards on a page stay distinguishable.\n */\nexport function PlaylistCard({\n title,\n description,\n imageUrl,\n platforms,\n level = 3,\n platformsLabel = \"Listen on\",\n externalLabel = \"(opens in a new tab)\",\n}: PlaylistCardProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n\n return (\n <Card sx={{ height: \"100%\" }}>\n <Box\n sx={(theme) => ({\n aspectRatio: \"1 / 1\",\n display: \"grid\",\n placeItems: \"center\",\n bgcolor: theme.vietri.color.chip,\n color: theme.palette.text.secondary,\n })}\n >\n {imageUrl ? (\n <Box\n component=\"img\"\n src={imageUrl}\n alt=\"\"\n loading=\"lazy\"\n sx={{ display: \"block\", width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n ) : (\n <Icon icon={Music} size={48} />\n )}\n </Box>\n <CardContent>\n <Typography component={heading} variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {description}\n </Typography>\n )}\n {platforms.length > 0 && (\n <Stack\n component=\"ul\"\n role=\"list\"\n aria-label={platformsLabel}\n direction=\"row\"\n spacing={1}\n useFlexGap\n flexWrap=\"wrap\"\n sx={{ listStyle: \"none\", m: 0, mt: 2, p: 0 }}\n >\n {platforms.map((platform) => (\n <li key={platform.name}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n href={platform.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n endIcon={<Icon icon={ExternalLink} size={14} />}\n >\n {platform.name}\n <VisuallyHidden>\n {\" \"}\n – {title} {externalLabel}\n </VisuallyHidden>\n </Button>\n </li>\n ))}\n </Stack>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * Vietri DS design tokens that do not depend on the theme: spacing, radius,\n * typography, shadows and breakpoints. Colors live in `palettes.ts`, one\n * palette per theme.\n */\nimport type { GradientStops, ThemeColors } from \"./palettes\";\n\nexport type { GradientStops };\n\nexport function linearGradient(from: string, to: string, angle = 135): string {\n return `linear-gradient(${angle}deg, ${from} 0%, ${to} 100%)`;\n}\n\nexport interface Gradients {\n /** Footers, headers and banners. */\n surface: string;\n /** Primary buttons. */\n action: string;\n actionHover: string;\n}\n\n/**\n * Turns a palette's color pairs into CSS. When both colors of a pair are\n * equal the result looks flat, so flat themes and gradient themes share code.\n */\nexport function createGradients(\n colors: Pick<ThemeColors, \"surface\" | \"action\" | \"actionHover\">\n): Gradients {\n return {\n surface: linearGradient(...colors.surface),\n action: linearGradient(...colors.action),\n actionHover: linearGradient(...colors.actionHover),\n };\n}\n\nexport const tokens = {\n spacing: 8,\n radius: {\n sm: 4,\n md: 8,\n lg: 16,\n },\n typography: {\n fontFamily: '\"Inter\", \"Helvetica Neue\", Arial, sans-serif',\n fontWeight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n },\n },\n shadow: {\n sm: \"0 1px 2px rgba(0, 0, 0, 0.08)\",\n md: \"0 4px 12px rgba(0, 0, 0, 0.12)\",\n lg: \"0 12px 32px rgba(0, 0, 0, 0.16)\",\n },\n breakpoints: {\n xs: 0,\n sm: 600,\n md: 900,\n lg: 1200,\n xl: 1536,\n },\n} as const;\n","import type { ThemeOptions } from \"@mui/material/styles\";\nimport \"./augmentation\";\nimport { tokens } from \"./tokens\";\n\n/**\n * Visual identity of the MUI components. It lives in the theme so it\n * applies the same way to all three themes and to any app that uses Vietri.\n */\nexport const components: ThemeOptions[\"components\"] = {\n // Respects the system \"reduce motion\" preference (WCAG 2.3.3).\n MuiCssBaseline: {\n styleOverrides: `\n @media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n }\n `,\n },\n\n MuiButton: {\n defaultProps: { disableElevation: true },\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: tokens.radius.md,\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n }),\n // Primary action fill. Flat in most themes, a soft gradient in the\n // Observatory. The text color meets AA at both ends of the fill.\n containedPrimary: ({ theme }) => ({\n color: theme.vietri.color.onAction,\n backgroundImage: theme.vietri.gradient.action,\n \"&:hover\": { backgroundImage: theme.vietri.gradient.actionHover },\n \"&.Mui-disabled\": {\n backgroundImage: \"none\",\n color: theme.palette.action.disabled,\n },\n }),\n },\n },\n\n MuiLink: {\n styleOverrides: {\n root: ({ theme }) => ({\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 3,\n borderRadius: tokens.radius.sm,\n },\n }),\n },\n },\n\n MuiChip: {\n styleOverrides: {\n root: ({ ownerState, theme }) => {\n const isDefaultFilled =\n ownerState.variant === \"filled\" && ownerState.color === \"default\";\n return {\n fontWeight: tokens.typography.fontWeight.semibold,\n fontSize: \"0.75rem\",\n // MUI's default chip is translucent, so its text is only readable on\n // the surface it was designed for. Opaque colors keep it legible on\n // any surface (a dark chip on white, a light chip on purple…).\n ...(isDefaultFilled && {\n color: theme.vietri.color.onChip,\n backgroundColor: theme.vietri.color.chip,\n \"&.MuiChip-clickable:hover\": {\n backgroundColor: theme.vietri.color.chipHover,\n },\n }),\n };\n },\n },\n },\n\n MuiCard: {\n defaultProps: { variant: \"outlined\" },\n styleOverrides: {\n root: {\n borderRadius: tokens.radius.lg,\n backgroundImage: \"none\",\n },\n },\n },\n\n MuiCardActionArea: {\n styleOverrides: {\n root: ({ theme }) => ({\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n }),\n },\n },\n\n MuiDialog: {\n styleOverrides: {\n paper: { borderRadius: tokens.radius.lg, backgroundImage: \"none\" },\n },\n },\n\n MuiDrawer: {\n styleOverrides: {\n paper: { backgroundImage: \"none\" },\n },\n },\n\n // Field borders use the secondary text color to meet the 3:1 minimum\n // contrast for interface components (WCAG 1.4.11).\n MuiOutlinedInput: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: tokens.radius.md,\n \"& .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.text.secondary,\n },\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.text.primary,\n },\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.primary.main,\n },\n \"&.Mui-error .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.error.main,\n },\n \"&.Mui-disabled .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.divider,\n },\n }),\n },\n },\n\n MuiTableCell: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderBottomColor: theme.palette.divider,\n }),\n head: ({ theme }) => ({\n fontWeight: tokens.typography.fontWeight.semibold,\n color: theme.palette.text.primary,\n borderBottom: `2px solid ${theme.palette.text.primary}`,\n }),\n },\n },\n};\n","import { createTheme, type ThemeOptions } from \"@mui/material/styles\";\nimport \"./augmentation\";\nimport type { VietriExtras } from \"./augmentation\";\nimport { components } from \"./components\";\nimport type { ThemeColors } from \"./palettes\";\nimport { createGradients, tokens } from \"./tokens\";\n\nconst { typography, breakpoints } = tokens;\n\n/** Extras available on `theme.vietri` for components. */\nexport function vietriExtras(colors: ThemeColors): VietriExtras {\n return {\n color: colors,\n shadow: tokens.shadow,\n gradient: createGradients(colors),\n };\n}\n\n/**\n * Options shared by all themes: typography, shape, spacing, breakpoints and\n * component styles. Each theme only provides its own palette and gradients.\n */\nexport const baseOptions: ThemeOptions = {\n spacing: tokens.spacing,\n shape: { borderRadius: tokens.radius.md },\n breakpoints: { values: { ...breakpoints } },\n typography: {\n fontFamily: typography.fontFamily,\n fontWeightRegular: typography.fontWeight.regular,\n fontWeightMedium: typography.fontWeight.medium,\n fontWeightBold: typography.fontWeight.semibold,\n h1: {\n fontSize: \"clamp(3rem, 8vw, 7rem)\",\n fontWeight: typography.fontWeight.semibold,\n letterSpacing: \"-0.055em\",\n lineHeight: 0.95,\n },\n h2: {\n fontSize: \"clamp(2rem, 5vw, 4rem)\",\n fontWeight: typography.fontWeight.semibold,\n letterSpacing: \"-0.04em\",\n lineHeight: 1.05,\n },\n h3: {\n fontSize: \"clamp(1.5rem, 3vw, 2.25rem)\",\n fontWeight: typography.fontWeight.semibold,\n letterSpacing: \"-0.03em\",\n lineHeight: 1.15,\n },\n h4: {\n fontSize: \"1.5rem\",\n fontWeight: typography.fontWeight.semibold,\n letterSpacing: \"-0.02em\",\n lineHeight: 1.25,\n },\n h5: { fontSize: \"1.25rem\", fontWeight: typography.fontWeight.medium, lineHeight: 1.3 },\n h6: { fontSize: \"1.0625rem\", fontWeight: typography.fontWeight.medium, lineHeight: 1.4 },\n body1: { fontSize: \"1rem\", lineHeight: 1.6 },\n body2: { fontSize: \"0.875rem\", lineHeight: 1.55 },\n button: {\n fontWeight: typography.fontWeight.medium,\n textTransform: \"none\",\n letterSpacing: \"-0.01em\",\n },\n overline: {\n fontWeight: typography.fontWeight.medium,\n letterSpacing: \"0.12em\",\n },\n },\n components,\n};\n\n/**\n * Builds a complete theme from a palette: MUI palette, `theme.vietri` extras,\n * and everything shared in `baseOptions`.\n */\nexport function createVietriTheme(colors: ThemeColors) {\n return createTheme({\n ...baseOptions,\n vietri: vietriExtras(colors),\n palette: {\n mode: colors.mode,\n primary: { main: colors.primary, contrastText: colors.onPrimary },\n secondary: { main: colors.secondary, contrastText: colors.onSecondary },\n error: { main: colors.status.error, contrastText: colors.onStatus },\n warning: { main: colors.status.warning, contrastText: colors.onStatus },\n info: { main: colors.status.info, contrastText: colors.onStatus },\n success: { main: colors.status.success, contrastText: colors.onStatus },\n background: { default: colors.bg, paper: colors.paper },\n text: { primary: colors.ink, secondary: colors.inkSoft },\n divider: colors.line,\n },\n });\n}\n","/**\n * Color palettes — one per theme.\n *\n * Each theme (editorial, streaming, observatory) has its own identity:\n * - editorial → the portfolio: black, white and gold\n * - streaming → \"El Blues es Femenino\": deep purple, violet, magenta, orange\n * - observatory → the Observatorio MDB: teal, cyan, amber, coral, red, purple\n *\n * Every pair that carries text meets WCAG AA (4.5:1). Brand colors that are\n * too light or too dark to carry text on their own (gold on white, violet on\n * deep purple…) are only used as fills, next to a text color that does reach\n * 4.5:1, or replaced by a text-safe sibling (for example bronze for gold).\n */\n\n/** Pair of colors (from, to) that defines a gradient. Equal colors = flat. */\nexport type GradientStops = readonly [from: string, to: string];\n\nexport interface StatusColors {\n error: string;\n warning: string;\n info: string;\n success: string;\n}\n\nexport interface ThemeColors {\n mode: \"light\" | \"dark\";\n\n /** Page background. */\n bg: string;\n /** Cards, menus and dialogs. */\n paper: string;\n /** Primary text. */\n ink: string;\n /** Secondary text. */\n inkSoft: string;\n /** Dividers and hairlines. */\n line: string;\n\n /** MUI primary: links, outlines, selected states. Readable as text. */\n primary: string;\n onPrimary: string;\n /** MUI secondary: readable as text on bg and paper. */\n secondary: string;\n onSecondary: string;\n\n /** Fill of primary buttons. Flat when both colors are equal. */\n action: GradientStops;\n actionHover: GradientStops;\n /** Text on action fills. */\n onAction: string;\n\n /** Fill of footers, headers and banners. */\n surface: GradientStops;\n /** Text on surfaces. */\n onSurface: string;\n /** Secondary text on surfaces. */\n onSurfaceSoft: string;\n\n /** Default chip: opaque, so it is legible on any surface. */\n chip: string;\n chipHover: string;\n onChip: string;\n\n /**\n * Two decorative colors for soft blurred lights on surfaces, or `null` for\n * none. They carry no text. All current themes are flat, so they use null.\n */\n glow: readonly [string, string] | null;\n\n status: StatusColors;\n /** Text on status-colored buttons. */\n onStatus: string;\n\n /** Named brand colors, as supplied. Used by the Colors docs page. */\n brand: Record<string, string>;\n /** Colors derived from the brand to meet contrast (text-safe or hover). */\n derived: Record<string, string>;\n}\n\nconst flat = (color: string): GradientStops => [color, color];\n\nconst lightStatus: StatusColors = {\n error: \"#B91C1C\",\n warning: \"#92400E\",\n info: \"#0369A1\",\n success: \"#166534\",\n};\n\n/** Portfolio — black, white and gold. */\nexport const editorialColors: ThemeColors = {\n mode: \"light\",\n bg: \"#FFFFFF\",\n paper: \"#FFFFFF\",\n ink: \"#111111\",\n inkSoft: \"#555555\",\n line: \"#E4E4E4\",\n primary: \"#000000\",\n onPrimary: \"#FFFFFF\",\n secondary: \"#7A5718\",\n onSecondary: \"#FFFFFF\",\n action: flat(\"#DBAC5B\"),\n actionHover: flat(\"#FDD07A\"),\n onAction: \"#000000\",\n surface: flat(\"#000000\"),\n onSurface: \"#FFFFFF\",\n onSurfaceSoft: \"#D4D4D4\",\n chip: \"#F3EBDA\",\n chipHover: \"#E8DDC4\",\n onChip: \"#111111\",\n glow: null,\n status: lightStatus,\n onStatus: \"#FFFFFF\",\n brand: {\n black: \"#000000\",\n gold: \"#DBAC5B\",\n white: \"#FFFFFF\",\n goldLight: \"#FDD07A\",\n },\n derived: {\n /** Gold that reads as text on white (6.6:1). */\n bronze: \"#7A5718\",\n ink: \"#111111\",\n inkSoft: \"#555555\",\n },\n};\n\n/** El Blues es Femenino — deep purple, violet, magenta and orange. */\nexport const streamingColors: ThemeColors = {\n mode: \"dark\",\n bg: \"#20123A\",\n paper: \"#2D1B50\",\n ink: \"#FFFFFF\",\n inkSoft: \"#D5CAEB\",\n line: \"rgba(255, 255, 255, 0.14)\",\n primary: \"#F35F1C\",\n onPrimary: \"#20123A\",\n secondary: \"#B99BFF\",\n onSecondary: \"#20123A\",\n action: flat(\"#F35F1C\"),\n actionHover: flat(\"#FF7B3F\"),\n onAction: \"#20123A\",\n surface: flat(\"#693BCC\"),\n onSurface: \"#FFFFFF\",\n onSurfaceSoft: \"#EDE6FB\",\n chip: \"#3C2866\",\n chipHover: \"#4A3478\",\n onChip: \"#FFFFFF\",\n glow: null,\n status: {\n error: \"#F87171\",\n warning: \"#FBBF24\",\n info: \"#7DD3FC\",\n success: \"#4ADE80\",\n },\n onStatus: \"#20123A\",\n brand: {\n night: \"#20123A\",\n violet: \"#693BCC\",\n magenta: \"#CB1F9C\",\n orange: \"#F35F1C\",\n },\n derived: {\n /** Violet that reads as text on the night background (7.6:1). */\n lilac: \"#B99BFF\",\n /** Raised surface over night. */\n nightRaised: \"#2D1B50\",\n orangeHover: \"#FF7B3F\",\n },\n};\n\n/** Observatory — teal, cyan, amber, coral, red and deep purple. Flat colors. */\nexport const observatoryColors: ThemeColors = {\n mode: \"light\",\n bg: \"#F7F4FA\",\n paper: \"#FFFFFF\",\n ink: \"#2B1B3D\",\n inkSoft: \"#5D4F70\",\n line: \"#E3DCEB\",\n // Teal carries actions and links: it reads as text on white and carries\n // white text. Deep purple is the second voice.\n primary: \"#027381\",\n onPrimary: \"#FFFFFF\",\n secondary: \"#4A0875\",\n onSecondary: \"#FFFFFF\",\n action: flat(\"#027381\"),\n actionHover: flat(\"#015C68\"),\n onAction: \"#FFFFFF\",\n surface: flat(\"#4A0875\"),\n onSurface: \"#FFFFFF\",\n onSurfaceSoft: \"#E8DCF4\",\n chip: \"#EFE8F6\",\n chipHover: \"#E3D8EF\",\n onChip: \"#2B1B3D\",\n glow: null,\n status: {\n error: \"#C41E32\",\n warning: \"#92400E\",\n info: \"#0369A1\",\n success: \"#166534\",\n },\n onStatus: \"#FFFFFF\",\n // The seven colors of the palette. Cyan, amber, coral and vermilion are too\n // light to carry text on white: use them as fills, with dark text on top\n // (charts, categories, highlights).\n brand: {\n teal: \"#027381\",\n cyan: \"#0EB9CB\",\n amber: \"#FFC23D\",\n coral: \"#FF7751\",\n vermilion: \"#F33829\",\n crimson: \"#C41E32\",\n purple: \"#4A0875\",\n },\n derived: {\n /** Page background: a barely-there purple tint. */\n page: \"#F7F4FA\",\n ink: \"#2B1B3D\",\n inkSoft: \"#5D4F70\",\n /** Teal for the hovered primary action (7.7:1 with white). */\n tealDark: \"#015C68\",\n },\n};\n","import { createVietriTheme } from \"./base\";\nimport { editorialColors } from \"./palettes\";\n\nexport const editorialTheme = createVietriTheme(editorialColors);\n","import { createVietriTheme } from \"./base\";\nimport { streamingColors } from \"./palettes\";\n\nexport const streamingTheme = createVietriTheme(streamingColors);\n","import { createVietriTheme } from \"./base\";\nimport { observatoryColors } from \"./palettes\";\n\nexport const observatoryTheme = createVietriTheme(observatoryColors);\n","/**\n * Categorical palette for countries, roles, decades, etc.\n *\n * It replaces colors generated from a hash: every text/background pair has a\n * contrast of at least 7:1 (AAA), and color is never the only indicator,\n * because it is always shown next to a text label.\n */\nexport interface CategoryColor {\n /** Chip background. */\n bg: string;\n /** Text on the background (≥ 7:1). */\n fg: string;\n /** Dot or marker on white (≥ 3:1). */\n dot: string;\n}\n\nexport const categoryPalette: readonly CategoryColor[] = [\n { bg: \"#E0F2FE\", fg: \"#0C4A6E\", dot: \"#0284C7\" }, // sky\n { bg: \"#EDE9FE\", fg: \"#4C1D95\", dot: \"#7C3AED\" }, // violet\n { bg: \"#FFE4E6\", fg: \"#881337\", dot: \"#E11D48\" }, // rose\n { bg: \"#FEF3C7\", fg: \"#78350F\", dot: \"#D97706\" }, // amber\n { bg: \"#D1FAE5\", fg: \"#064E3B\", dot: \"#059669\" }, // emerald\n { bg: \"#FAE8FF\", fg: \"#701A75\", dot: \"#C026D3\" }, // fuchsia\n { bg: \"#CCFBF1\", fg: \"#134E4A\", dot: \"#0D9488\" }, // teal\n { bg: \"#FFEDD5\", fg: \"#7C2D12\", dot: \"#EA580C\" }, // orange\n { bg: \"#E0E7FF\", fg: \"#312E81\", dot: \"#4F46E5\" }, // indigo\n { bg: \"#ECFCCB\", fg: \"#365314\", dot: \"#65A30D\" }, // lime\n];\n\n/**\n * Assigns a color to each category by its position. Always pass the full,\n * ordered list so the same value gets the same color in every view.\n * With more categories than colors, colors repeat. Pass another palette (for\n * example `observatoryCategoryPalette`) to change the colors.\n */\nexport function createCategoryColors(\n keys: readonly string[],\n palette: readonly CategoryColor[] = categoryPalette\n): Record<string, CategoryColor> {\n const unique = Array.from(new Set(keys));\n return Object.fromEntries(\n unique.map((key, index) => [key, palette[index % palette.length]])\n );\n}\n\n/**\n * Observatory categories: the seven colors of the Observatory palette used as\n * fills. Light fills (cyan, amber, coral, vermilion) carry dark text; dark\n * fills carry white text. Every text pair meets AA (4.5:1). `dot` is a darker\n * shade of the same hue, so a marker is visible on white (≥ 3:1).\n *\n * Pass the categories ordered by importance (for example countries by number\n * of profiles) so the most frequent ones get the most distinct colors. With\n * more than 7 categories the colors repeat.\n */\nexport const observatoryCategoryPalette: readonly CategoryColor[] = [\n { bg: \"#027381\", fg: \"#FFFFFF\", dot: \"#027381\" }, // teal\n { bg: \"#FF7751\", fg: \"#2B1B3D\", dot: \"#C2410C\" }, // coral\n { bg: \"#FFC23D\", fg: \"#2B1B3D\", dot: \"#A16207\" }, // amber\n { bg: \"#4A0875\", fg: \"#FFFFFF\", dot: \"#4A0875\" }, // purple\n { bg: \"#0EB9CB\", fg: \"#2B1B3D\", dot: \"#0E7490\" }, // cyan\n { bg: \"#C41E32\", fg: \"#FFFFFF\", dot: \"#C41E32\" }, // crimson\n { bg: \"#F33829\", fg: \"#000000\", dot: \"#F33829\" }, // vermilion\n];\n"],"names":["MenuIcon","SvgIcon","jsx","NavLinkItem","link","onClick","Link","NavBar","brand","brandHref","links","actions","ariaLabel","menuLabel","closeLabel","theme","useTheme","isDesktop","useMediaQuery","open","setOpen","useState","close","jsxs","AppBar","Toolbar","Stack","Box","IconButton","Drawer","Button","defaultOptions","LanguageSwitch","value","onChange","options","ToggleButtonGroup","_event","next","option","ToggleButton","StatCard","label","description","Card","CardContent","Typography","rawValue","row","column","sortableValue","raw","compare","a","b","DataTable","columns","rows","getRowKey","caption","emptyMessage","sort","setSort","sortedRows","useMemo","c","factor","toggleSort","key","current","TableContainer","Table","TableHead","TableRow","direction","TableCell","TableSortLabel","TableBody","index","BarChart","data","title","max","formatValue","upperBound","datum","percent","formatted","Icon","Glyph","size","rest","CategoryChip","color","dot","MuiChip","VisuallyHidden","props","Footer","lines","linksLabel","action","legal","externalLabel","glow","Fragment","alpha","Container","line","ExternalLink","Divider","SectionHeader","eyebrow","level","align","heading","Select","helperText","disabled","fullWidth","id","byValue","TextField","event","selected","MenuItem","Dialog","onClose","children","maxWidth","titleId","useId","descriptionId","MuiDialog","DialogTitle","X","DialogContent","DialogContentText","DialogActions","footer","anchor","width","MuiDrawer","CopyField","copyLabel","copiedLabel","errorLabel","copiedDuration","status","setStatus","timer","useRef","useEffect","handleCopy","Check","Copy","SkipLink","href","Hero","center","FeatureCard","icon","Steps","steps","step","Timeline","entries","entry","stretchedLink","ProfileCard","name","subtitle","bio","tags","bioLines","interactive","tag","Chip","cardFocusRing","MediaCard","meta","imageUrl","duration","badge","playIcon","Play","ContentRail","itemWidth","previousLabel","nextLabel","headingId","scroller","items","Children","scrollBy","element","reduceMotion","ChevronLeft","ChevronRight","item","embedUrl","videoId","start","autoplay","params","VideoEmbed","poster","lazy","playLabel","active","setActive","startedByUser","iframeRef","ButtonBase","rowFocus","EpisodeList","episodes","currentId","onSelect","episodeLabel","number","currentLabel","episode","isCurrent","PlaylistCard","platforms","platformsLabel","Music","platform","linearGradient","from","to","angle","createGradients","colors","tokens","components","ownerState","isDefaultFilled","typography","breakpoints","vietriExtras","baseOptions","createVietriTheme","createTheme","flat","lightStatus","editorialColors","streamingColors","observatoryColors","editorialTheme","streamingTheme","observatoryTheme","categoryPalette","createCategoryColors","keys","palette","unique","observatoryCategoryPalette"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/NavBar/NavBar.tsx","../src/components/LanguageSwitch/LanguageSwitch.tsx","../src/components/StatCard/StatCard.tsx","../src/components/DataTable/DataTable.tsx","../src/components/BarChart/BarChart.tsx","../src/components/Icon/Icon.tsx","../src/components/Chip/Chip.tsx","../src/components/VisuallyHidden/VisuallyHidden.tsx","../src/components/Footer/Footer.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Select/Select.tsx","../src/components/Dialog/Dialog.tsx","../src/components/Drawer/Drawer.tsx","../src/components/CopyField/CopyField.tsx","../src/components/SkipLink/SkipLink.tsx","../src/components/Hero/Hero.tsx","../src/components/FeatureCard/FeatureCard.tsx","../src/components/Steps/Steps.tsx","../src/components/Timeline/Timeline.tsx","../src/components/ProfileCard/ProfileCard.tsx","../src/components/internal/stretched.ts","../src/components/MediaCard/MediaCard.tsx","../src/components/ContentRail/ContentRail.tsx","../src/components/VideoEmbed/VideoEmbed.tsx","../src/components/EpisodeList/EpisodeList.tsx","../src/components/PlaylistCard/PlaylistCard.tsx","../src/theme/tokens.ts","../src/theme/components.ts","../src/theme/base.ts","../src/theme/palettes.ts","../src/theme/editorial.ts","../src/theme/streaming.ts","../src/theme/observatory.ts","../src/theme/categorical.ts"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport AppBar from \"@mui/material/AppBar\";\nimport Box from \"@mui/material/Box\";\nimport Container from \"@mui/material/Container\";\nimport Drawer from \"@mui/material/Drawer\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport SvgIcon from \"@mui/material/SvgIcon\";\nimport Toolbar from \"@mui/material/Toolbar\";\nimport useMediaQuery from \"@mui/material/useMediaQuery\";\nimport { useTheme, type Breakpoint } from \"@mui/material/styles\";\nimport { Button } from \"../Button\";\n\nexport interface NavLink {\n label: string;\n href: string;\n /** Marks the link of the current page (aria-current=\"page\"). */\n current?: boolean;\n}\n\nexport interface NavBarProps {\n /** Brand or name shown on the left. */\n brand: ReactNode;\n brandHref?: string;\n links: NavLink[];\n /** Extra elements on the right, for example a language selector. */\n actions?: ReactNode;\n /** Accessible name of the navigation. */\n ariaLabel?: string;\n /** Label of the button that opens the menu on small screens. */\n menuLabel?: string;\n /** Label of the button that closes the menu on small screens. */\n closeLabel?: string;\n /**\n * Maximum width of the header content. Default \"lg\", the same width the\n * page content usually has, so the header lines up with it. Use `false` to\n * let it span the whole width.\n */\n maxWidth?: Breakpoint | false;\n}\n\nfunction MenuIcon() {\n return (\n <SvgIcon>\n <path d=\"M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z\" />\n </SvgIcon>\n );\n}\n\nfunction NavLinkItem({\n link,\n onClick,\n}: {\n link: NavLink;\n onClick?: () => void;\n}) {\n return (\n <Link\n href={link.href}\n underline=\"none\"\n aria-current={link.current ? \"page\" : undefined}\n onClick={onClick}\n sx={{\n color: link.current ? \"text.primary\" : \"text.secondary\",\n fontWeight: link.current ? 600 : 500,\n \"&:hover\": { color: \"text.primary\" },\n }}\n >\n {link.label}\n </Link>\n );\n}\n\nexport function NavBar({\n brand,\n brandHref = \"/\",\n links,\n actions,\n ariaLabel = \"Main\",\n menuLabel = \"Menu\",\n closeLabel = \"Close menu\",\n maxWidth = \"lg\",\n}: NavBarProps) {\n const theme = useTheme();\n const isDesktop = useMediaQuery(theme.breakpoints.up(\"md\"), { noSsr: true });\n const [open, setOpen] = useState(false);\n const close = () => setOpen(false);\n\n return (\n <AppBar\n component=\"header\"\n position=\"sticky\"\n color=\"inherit\"\n elevation={0}\n sx={{\n bgcolor: \"background.default\",\n color: \"text.primary\",\n borderBottom: 1,\n borderColor: \"divider\",\n }}\n >\n <Container maxWidth={maxWidth}>\n <Toolbar\n disableGutters\n sx={{\n justifyContent: \"space-between\",\n gap: 3,\n minHeight: { xs: 64, md: 72 },\n }}\n >\n <Link\n href={brandHref}\n underline=\"none\"\n color=\"text.primary\"\n sx={{ fontWeight: 600, letterSpacing: \"-0.03em\", fontSize: \"1.125rem\" }}\n >\n {brand}\n </Link>\n\n {isDesktop ? (\n <Stack direction=\"row\" alignItems=\"center\" spacing={4}>\n <Box component=\"nav\" aria-label={ariaLabel}>\n <Stack\n component=\"ul\"\n direction=\"row\"\n spacing={4}\n sx={{ listStyle: \"none\", m: 0, p: 0 }}\n >\n {links.map((link) => (\n <li key={link.href}>\n <NavLinkItem link={link} />\n </li>\n ))}\n </Stack>\n </Box>\n {actions}\n </Stack>\n ) : (\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n {actions}\n <IconButton\n edge=\"end\"\n color=\"inherit\"\n aria-label={menuLabel}\n aria-expanded={open}\n onClick={() => setOpen(true)}\n >\n <MenuIcon />\n </IconButton>\n </Stack>\n )}\n </Toolbar>\n </Container>\n\n {!isDesktop && (\n <Drawer anchor=\"right\" open={open} onClose={close}>\n <Box sx={{ width: 280, p: 3 }}>\n <Stack alignItems=\"flex-end\" sx={{ mb: 3 }}>\n <Button variant=\"text\" color=\"secondary\" onClick={close}>\n {closeLabel}\n </Button>\n </Stack>\n <Box component=\"nav\" aria-label={ariaLabel}>\n <Stack\n component=\"ul\"\n spacing={3}\n sx={{ listStyle: \"none\", m: 0, p: 0, fontSize: \"1.25rem\" }}\n >\n {links.map((link) => (\n <li key={link.href}>\n <NavLinkItem link={link} onClick={close} />\n </li>\n ))}\n </Stack>\n </Box>\n </Box>\n </Drawer>\n )}\n </AppBar>\n );\n}\n","import ToggleButton from \"@mui/material/ToggleButton\";\nimport ToggleButtonGroup from \"@mui/material/ToggleButtonGroup\";\n\nexport interface LanguageOption {\n value: string;\n label: string;\n}\n\nexport interface LanguageSwitchProps {\n value: string;\n onChange: (value: string) => void;\n options?: LanguageOption[];\n /** Accessible name of the group. */\n ariaLabel?: string;\n}\n\nconst defaultOptions: LanguageOption[] = [\n { value: \"en\", label: \"EN\" },\n { value: \"es\", label: \"ES\" },\n];\n\nexport function LanguageSwitch({\n value,\n onChange,\n options = defaultOptions,\n ariaLabel = \"Language\",\n}: LanguageSwitchProps) {\n return (\n <ToggleButtonGroup\n exclusive\n size=\"small\"\n value={value}\n aria-label={ariaLabel}\n onChange={(_event, next: string | null) => {\n // With \"exclusive\", clicking the active option returns null: we ignore it.\n if (next !== null) onChange(next);\n }}\n >\n {options.map((option) => (\n <ToggleButton key={option.value} value={option.value}>\n {option.label}\n </ToggleButton>\n ))}\n </ToggleButtonGroup>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Card, CardContent } from \"../Card\";\nimport { Typography } from \"../Typography\";\n\nexport interface StatCardProps {\n /** Highlighted figure, for example \"+200\" or \"6 years\". */\n value: ReactNode;\n /** What the figure measures. */\n label: string;\n /** Optional supporting text. */\n description?: string;\n}\n\nexport function StatCard({ value, label, description }: StatCardProps) {\n return (\n <Card>\n <CardContent>\n <Typography variant=\"h3\" component=\"p\">\n {value}\n </Typography>\n <Typography variant=\"body1\" sx={{ mt: 1 }}>\n {label}\n </Typography>\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 1 }}>\n {description}\n </Typography>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { useMemo, useState, type ReactNode } from \"react\";\nimport Table from \"@mui/material/Table\";\nimport TableBody from \"@mui/material/TableBody\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableContainer from \"@mui/material/TableContainer\";\nimport TableHead from \"@mui/material/TableHead\";\nimport TableRow from \"@mui/material/TableRow\";\nimport TableSortLabel from \"@mui/material/TableSortLabel\";\nimport Typography from \"@mui/material/Typography\";\n\ntype SortDirection = \"asc\" | \"desc\";\n\nexport interface DataTableColumn<T> {\n /** Key of the row property this column displays. */\n key: string;\n header: string;\n align?: \"left\" | \"center\" | \"right\";\n /** Allows sorting the table by this column. */\n sortable?: boolean;\n /** Custom cell content. */\n render?: (row: T) => ReactNode;\n /** Value used for sorting, when it differs from the displayed value. */\n sortValue?: (row: T) => string | number;\n}\n\nexport interface DataTableProps<T extends object> {\n columns: DataTableColumn<T>[];\n rows: T[];\n getRowKey: (row: T) => string | number;\n /** Accessible title of the table. */\n caption?: string;\n emptyMessage?: string;\n}\n\nfunction rawValue<T extends object>(row: T, column: DataTableColumn<T>): unknown {\n return (row as unknown as Record<string, unknown>)[column.key];\n}\n\nfunction sortableValue<T extends object>(\n row: T,\n column: DataTableColumn<T>\n): string | number {\n if (column.sortValue) return column.sortValue(row);\n const raw = rawValue(row, column);\n return typeof raw === \"number\" ? raw : String(raw ?? \"\");\n}\n\nfunction compare(a: string | number, b: string | number): number {\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n return String(a).localeCompare(String(b), undefined, { numeric: true });\n}\n\nexport function DataTable<T extends object>({\n columns,\n rows,\n getRowKey,\n caption,\n emptyMessage = \"No data\",\n}: DataTableProps<T>) {\n const [sort, setSort] = useState<{ key: string; direction: SortDirection } | null>(\n null\n );\n\n const sortedRows = useMemo(() => {\n if (!sort) return rows;\n const column = columns.find((c) => c.key === sort.key);\n if (!column) return rows;\n const factor = sort.direction === \"asc\" ? 1 : -1;\n return [...rows].sort(\n (a, b) => factor * compare(sortableValue(a, column), sortableValue(b, column))\n );\n }, [rows, columns, sort]);\n\n const toggleSort = (key: string) => {\n setSort((current) =>\n current?.key === key && current.direction === \"asc\"\n ? { key, direction: \"desc\" }\n : { key, direction: \"asc\" }\n );\n };\n\n // With horizontal scroll, the container must be able to receive focus (WCAG 2.1.1).\n return (\n <TableContainer tabIndex={0} sx={{ overflowX: \"auto\" }}>\n <Table>\n {caption && (\n <Typography\n component=\"caption\"\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ captionSide: \"top\", textAlign: \"left\", pb: 2 }}\n >\n {caption}\n </Typography>\n )}\n <TableHead>\n <TableRow>\n {columns.map((column) => {\n const direction = sort?.key === column.key ? sort.direction : undefined;\n return (\n <TableCell\n key={column.key}\n align={column.align}\n sortDirection={direction ?? false}\n >\n {column.sortable ? (\n <TableSortLabel\n active={direction !== undefined}\n direction={direction ?? \"asc\"}\n onClick={() => toggleSort(column.key)}\n >\n {column.header}\n </TableSortLabel>\n ) : (\n column.header\n )}\n </TableCell>\n );\n })}\n </TableRow>\n </TableHead>\n <TableBody>\n {sortedRows.length === 0 ? (\n <TableRow>\n <TableCell colSpan={columns.length} align=\"center\">\n {emptyMessage}\n </TableCell>\n </TableRow>\n ) : (\n sortedRows.map((row) => (\n <TableRow key={getRowKey(row)}>\n {columns.map((column, index) => (\n <TableCell\n key={column.key}\n align={column.align}\n component={index === 0 ? \"th\" : \"td\"}\n scope={index === 0 ? \"row\" : undefined}\n >\n {column.render\n ? column.render(row)\n : String(rawValue(row, column) ?? \"\")}\n </TableCell>\n ))}\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </TableContainer>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\nexport interface BarChartDatum {\n label: string;\n value: number;\n}\n\nexport interface BarChartProps {\n data: BarChartDatum[];\n /** Visible chart title. */\n title?: string;\n /** Value that equals 100% of the bar. Defaults to the largest value in the data. */\n max?: number;\n /** How each value is displayed. Defaults to the plain number. */\n formatValue?: (value: number) => string;\n}\n\nexport function BarChart({\n data,\n title,\n max,\n formatValue = String,\n}: BarChartProps) {\n const upperBound = max ?? Math.max(0, ...data.map((datum) => datum.value));\n\n return (\n <Box component=\"figure\" sx={{ m: 0 }}>\n {title && (\n <Typography\n component=\"figcaption\"\n variant=\"overline\"\n color=\"text.secondary\"\n sx={{ display: \"block\", mb: 2 }}\n >\n {title}\n </Typography>\n )}\n <Stack component=\"ul\" spacing={1.5} sx={{ listStyle: \"none\", m: 0, p: 0 }}>\n {data.map((datum) => {\n const percent =\n upperBound > 0\n ? Math.min(100, Math.max(0, (datum.value / upperBound) * 100))\n : 0;\n const formatted = formatValue(datum.value);\n return (\n <Box\n component=\"li\"\n key={datum.label}\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"minmax(80px, 160px) 1fr auto\",\n alignItems: \"center\",\n columnGap: 2,\n }}\n >\n {/* The bar exposes the information to screen readers;\n the visible text is hidden so it is not read twice. */}\n <Typography variant=\"body2\" aria-hidden=\"true\">\n {datum.label}\n </Typography>\n <Box\n role=\"meter\"\n aria-label={datum.label}\n aria-valuemin={0}\n aria-valuemax={upperBound}\n aria-valuenow={datum.value}\n aria-valuetext={formatted}\n sx={{\n height: 12,\n borderRadius: 1,\n bgcolor: \"divider\",\n overflow: \"hidden\",\n }}\n >\n <Box\n style={{ width: `${percent}%` }}\n sx={{ height: \"100%\", bgcolor: \"primary.main\" }}\n />\n </Box>\n <Typography\n variant=\"body2\"\n aria-hidden=\"true\"\n sx={{ minWidth: 40, textAlign: \"right\", fontWeight: 600 }}\n >\n {formatted}\n </Typography>\n </Box>\n );\n })}\n </Stack>\n </Box>\n );\n}\n","import type { LucideIcon, LucideProps } from \"lucide-react\";\n\nexport interface IconProps extends Omit<LucideProps, \"ref\"> {\n icon: LucideIcon;\n /**\n * If the icon conveys something on its own, describe it here. Without\n * `label` the icon is decorative and hidden from screen readers.\n */\n label?: string;\n}\n\nexport function Icon({ icon: Glyph, label, size = 18, ...rest }: IconProps) {\n if (label) {\n return <Glyph size={size} role=\"img\" aria-label={label} {...rest} />;\n }\n return <Glyph size={size} aria-hidden=\"true\" focusable=\"false\" {...rest} />;\n}\n","import Box from \"@mui/material/Box\";\nimport MuiChip from \"@mui/material/Chip\";\nimport type { ChipProps } from \"@mui/material/Chip\";\nimport type { CategoryColor } from \"../../theme/categorical\";\n\nexport { MuiChip as Chip };\nexport type { ChipProps };\n\nexport interface CategoryChipProps\n extends Omit<ChipProps, \"color\" | \"variant\" | \"icon\" | \"sx\"> {\n /** Category color, from `createCategoryColors`. */\n color: CategoryColor;\n /** Shows a dot before the text. */\n dot?: boolean;\n}\n\n/**\n * Category chip (country, role, decade…). The palette colors meet AAA\n * contrast, and the category name is always shown as text.\n */\nexport function CategoryChip({ color, dot = false, ...rest }: CategoryChipProps) {\n return (\n <MuiChip\n size=\"small\"\n {...rest}\n icon={\n dot ? (\n <Box\n component=\"span\"\n aria-hidden=\"true\"\n sx={{ width: 8, height: 8, borderRadius: \"50%\", bgcolor: color.fg }}\n />\n ) : undefined\n }\n sx={{\n bgcolor: color.bg,\n color: color.fg,\n \"&.MuiChip-clickable:hover\": { bgcolor: color.bg, filter: \"brightness(0.95)\" },\n \"& .MuiChip-icon\": { color: color.fg, ml: 1, mr: -0.25 },\n }}\n />\n );\n}\n","import type { ComponentPropsWithoutRef } from \"react\";import Box from \"@mui/material/Box\";\n\n/**\n * Hides content visually while keeping it available to screen readers. Use it\n * for supporting text (\"opens in a new tab\") and for aria-live regions.\n */\nexport function VisuallyHidden(props: ComponentPropsWithoutRef<\"span\">) {\n return (\n <Box\n component=\"span\"\n sx={{\n border: 0,\n clip: \"rect(0 0 0 0)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\",\n }}\n {...props}\n />\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Container from \"@mui/material/Container\";\nimport Divider from \"@mui/material/Divider\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { alpha, useTheme } from \"@mui/material/styles\";\nimport { Icon } from \"../Icon\";\nimport { ExternalLink } from \"../Icon/icons\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\nexport interface FooterLink {\n label: string;\n href: string;\n /** Opens in a new tab and tells screen readers about it. */\n external?: boolean;\n}\n\nexport interface FooterProps {\n /** Project or brand name. */\n title: ReactNode;\n description?: ReactNode;\n /** Contact lines: city, email, etc. */\n lines?: string[];\n links?: FooterLink[];\n /** Accessible name of the links list. */\n linksLabel?: string;\n /** Highlighted action, for example a button. */\n action?: ReactNode;\n legal?: ReactNode;\n /** Text for screen readers on external links. */\n externalLabel?: string;\n}\n\nexport function Footer({\n title,\n description,\n lines = [],\n links = [],\n linksLabel = \"Footer links\",\n action,\n legal,\n externalLabel = \"(opens in a new tab)\",\n}: FooterProps) {\n const { glow } = useTheme().vietri.color;\n return (\n <Box\n component=\"footer\"\n sx={(theme) => ({\n position: \"relative\",\n overflow: \"hidden\",\n py: 6,\n color: theme.vietri.color.onSurface,\n background: theme.vietri.gradient.surface,\n // The default focus ring is not visible on dark backgrounds.\n \"& a:focus-visible, & button:focus-visible\": {\n outline: \"2px solid\",\n outlineColor: theme.vietri.color.onSurface,\n outlineOffset: 3,\n },\n })}\n >\n {/* Decorative lights: they carry no information. Themes may turn them off. */}\n {glow && (\n <>\n <Box\n aria-hidden=\"true\"\n sx={{\n position: \"absolute\",\n top: -96,\n right: -96,\n width: 384,\n height: 384,\n borderRadius: \"50%\",\n bgcolor: alpha(glow[0], 0.22),\n filter: \"blur(64px)\",\n pointerEvents: \"none\",\n }}\n />\n <Box\n aria-hidden=\"true\"\n sx={{\n position: \"absolute\",\n bottom: -96,\n left: -96,\n width: 384,\n height: 384,\n borderRadius: \"50%\",\n bgcolor: alpha(glow[1], 0.22),\n filter: \"blur(64px)\",\n pointerEvents: \"none\",\n }}\n />\n </>\n )}\n\n <Container maxWidth=\"lg\" sx={{ position: \"relative\", zIndex: 1 }}>\n <Stack\n direction={{ xs: \"column\", sm: \"row\" }}\n justifyContent=\"space-between\"\n alignItems={{ xs: \"flex-start\", sm: \"center\" }}\n spacing={4}\n >\n <Stack spacing={1}>\n <Typography component=\"p\" variant=\"h6\">\n {title}\n </Typography>\n {description && (\n <Typography\n variant=\"body2\"\n sx={(theme) => ({\n maxWidth: 560,\n color: theme.vietri.color.onSurfaceSoft,\n })}\n >\n {description}\n </Typography>\n )}\n {lines.map((line) => (\n <Typography\n key={line}\n variant=\"body2\"\n sx={(theme) => ({ color: theme.vietri.color.onSurfaceSoft })}\n >\n {line}\n </Typography>\n ))}\n </Stack>\n\n <Stack spacing={2} alignItems={{ xs: \"flex-start\", sm: \"flex-end\" }}>\n {links.length > 0 && (\n <Box component=\"nav\" aria-label={linksLabel}>\n <Stack\n component=\"ul\"\n direction=\"row\"\n spacing={3}\n useFlexGap\n flexWrap=\"wrap\"\n sx={{ listStyle: \"none\", m: 0, p: 0 }}\n >\n {links.map((link) => (\n <li key={link.href}>\n <Link\n href={link.href}\n color=\"inherit\"\n underline=\"always\"\n target={link.external ? \"_blank\" : undefined}\n rel={link.external ? \"noopener noreferrer\" : undefined}\n sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 0.5 }}\n >\n {link.label}\n {link.external && (\n <>\n <Icon icon={ExternalLink} size={14} />\n <VisuallyHidden>{externalLabel}</VisuallyHidden>\n </>\n )}\n </Link>\n </li>\n ))}\n </Stack>\n </Box>\n )}\n {action}\n </Stack>\n </Stack>\n\n {legal && (\n <>\n <Divider\n sx={(theme) => ({\n my: 3,\n borderColor: alpha(theme.vietri.color.onSurface, 0.25),\n })}\n />\n <Typography\n variant=\"body2\"\n sx={(theme) => ({ color: theme.vietri.color.onSurfaceSoft })}\n >\n {legal}\n </Typography>\n </>\n )}\n </Container>\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface SectionHeaderProps {\n title: string;\n /** Small label above the title, with an optional icon. */\n eyebrow?: ReactNode;\n description?: ReactNode;\n /**\n * Heading level (h1–h6). It does not change the look: it keeps the page\n * hierarchy correct for screen readers.\n */\n level?: HeadingLevel;\n align?: \"left\" | \"center\";\n}\n\nexport function SectionHeader({\n title,\n eyebrow,\n description,\n level = 2,\n align = \"left\",\n}: SectionHeaderProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n return (\n <Stack spacing={1} sx={{ textAlign: align, alignItems: align === \"center\" ? \"center\" : \"flex-start\" }}>\n {eyebrow && (\n <Typography\n component=\"p\"\n variant=\"overline\"\n color=\"primary.main\"\n sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 0.75, lineHeight: 1.5 }}\n >\n {eyebrow}\n </Typography>\n )}\n <Typography component={heading} variant=\"h3\">\n {title}\n </Typography>\n {description && (\n <Typography variant=\"body1\" color=\"text.secondary\" sx={{ maxWidth: 680 }}>\n {description}\n </Typography>\n )}\n </Stack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport TextField from \"@mui/material/TextField\";\nimport Typography from \"@mui/material/Typography\";\n\nexport interface SelectOption {\n value: string;\n label: string;\n /** Number shown on the right, for example artists per country. */\n count?: number;\n /** Element before the text, for example a color dot. It must be decorative. */\n adornment?: ReactNode;\n}\n\nexport interface SelectProps {\n /** Visible label and accessible name of the field. */\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: SelectOption[];\n helperText?: string;\n disabled?: boolean;\n fullWidth?: boolean;\n size?: \"small\" | \"medium\";\n id?: string;\n}\n\nexport function Select({\n label,\n value,\n onChange,\n options,\n helperText,\n disabled,\n fullWidth,\n size,\n id,\n}: SelectProps) {\n const byValue = new Map(options.map((option) => [option.value, option]));\n\n return (\n <TextField\n select\n id={id}\n label={label}\n value={value}\n onChange={(event) => onChange(event.target.value)}\n helperText={helperText}\n disabled={disabled}\n fullWidth={fullWidth}\n size={size}\n slotProps={{\n select: {\n renderValue: (selected) => {\n const option = byValue.get(String(selected));\n if (!option) return \"\";\n return (\n <Box component=\"span\" sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 1 }}>\n {option.adornment}\n {option.label}\n </Box>\n );\n },\n },\n }}\n >\n {options.map((option) => (\n <MenuItem key={option.value} value={option.value} sx={{ gap: 1 }}>\n {option.adornment}\n {option.label}\n {option.count !== undefined && (\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\" sx={{ ml: \"auto\", pl: 2 }}>\n {option.count}\n </Typography>\n )}\n </MenuItem>\n ))}\n </TextField>\n );\n}\n","import { useId, type ReactNode } from \"react\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogContentText from \"@mui/material/DialogContentText\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport { Icon } from \"../Icon\";\nimport { X } from \"../Icon/icons\";\n\nexport interface DialogProps {\n open: boolean;\n onClose: () => void;\n /** Dialog title. It is also its accessible name. */\n title: string;\n /** Short text that explains the dialog. Screen readers read it when it opens. */\n description?: ReactNode;\n children?: ReactNode;\n /** Buttons at the bottom of the dialog. */\n actions?: ReactNode;\n closeLabel?: string;\n maxWidth?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n}\n\n/**\n * Modal dialog. It traps focus, closes with Escape and returns focus to the\n * element that opened it.\n */\nexport function Dialog({\n open,\n onClose,\n title,\n description,\n children,\n actions,\n closeLabel = \"Close\",\n maxWidth = \"sm\",\n}: DialogProps) {\n const titleId = useId();\n const descriptionId = useId();\n\n return (\n <MuiDialog\n open={open}\n onClose={onClose}\n fullWidth\n maxWidth={maxWidth}\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n <DialogTitle id={titleId} sx={{ pr: 7 }}>\n {title}\n </DialogTitle>\n <IconButton\n aria-label={closeLabel}\n onClick={onClose}\n sx={{ position: \"absolute\", top: 8, right: 8 }}\n >\n <Icon icon={X} />\n </IconButton>\n <DialogContent>\n {description && (\n <DialogContentText id={descriptionId} sx={{ mb: children ? 2 : 0 }}>\n {description}\n </DialogContentText>\n )}\n {children}\n </DialogContent>\n {actions && <DialogActions sx={{ px: 3, pb: 2 }}>{actions}</DialogActions>}\n </MuiDialog>\n );\n}\n","import { useId, type ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport MuiDrawer from \"@mui/material/Drawer\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Icon } from \"../Icon\";\nimport { X } from \"../Icon/icons\";\n\nexport interface DrawerProps {\n open: boolean;\n onClose: () => void;\n /** Panel title. It is also its accessible name. */\n title: string;\n /** Small label above the title, for example \"Archive profile\". */\n eyebrow?: ReactNode;\n children: ReactNode;\n /** Fixed content at the bottom of the panel, for example a button. */\n footer?: ReactNode;\n anchor?: \"left\" | \"right\";\n width?: number;\n closeLabel?: string;\n}\n\n/**\n * Modal side panel. It traps focus, closes with Escape and is announced as a\n * dialog named by its title.\n */\nexport function Drawer({\n open,\n onClose,\n title,\n eyebrow,\n children,\n footer,\n anchor = \"right\",\n width = 420,\n closeLabel = \"Close\",\n}: DrawerProps) {\n const titleId = useId();\n\n return (\n <MuiDrawer anchor={anchor} open={open} onClose={onClose}>\n <Box\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n sx={{\n width: { xs: \"100vw\", sm: width },\n maxWidth: \"100vw\",\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n sx={{ p: 3, pb: 1 }}\n >\n <Typography component=\"p\" variant=\"overline\" color=\"primary.main\">\n {eyebrow}\n </Typography>\n <IconButton aria-label={closeLabel} onClick={onClose} edge=\"end\">\n <Icon icon={X} />\n </IconButton>\n </Stack>\n <Box sx={{ px: 3, pb: 2, flex: 1, overflowY: \"auto\" }} tabIndex={0}>\n <Typography id={titleId} component=\"h2\" variant=\"h4\" sx={{ mb: 2 }}>\n {title}\n </Typography>\n {children}\n </Box>\n {footer && (\n <Box sx={{ p: 3, borderTop: 1, borderColor: \"divider\" }}>{footer}</Box>\n )}\n </Box>\n </MuiDrawer>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Button } from \"../Button\";\nimport { Icon } from \"../Icon\";\nimport { Check, Copy } from \"../Icon/icons\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\nexport interface CopyFieldProps {\n /** What is being copied, for example \"HTML code to embed\". */\n label: string;\n value: string;\n copyLabel?: string;\n copiedLabel?: string;\n errorLabel?: string;\n /** Milliseconds the \"copied\" notice stays visible. */\n copiedDuration?: number;\n}\n\ntype Status = \"idle\" | \"copied\" | \"error\";\n\n/**\n * Code block with a copy button. The result is announced to screen readers\n * through an aria-live region.\n */\nexport function CopyField({\n label,\n value,\n copyLabel = \"Copy\",\n copiedLabel = \"Copied!\",\n errorLabel = \"Could not copy\",\n copiedDuration = 2000,\n}: CopyFieldProps) {\n const [status, setStatus] = useState<Status>(\"idle\");\n const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n async function handleCopy() {\n try {\n await navigator.clipboard.writeText(value);\n setStatus(\"copied\");\n } catch {\n setStatus(\"error\");\n }\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setStatus(\"idle\"), copiedDuration);\n }\n\n const message =\n status === \"copied\" ? copiedLabel : status === \"error\" ? errorLabel : \"\";\n\n return (\n <Stack spacing={1.5}>\n <Typography component=\"p\" variant=\"overline\" color=\"text.secondary\">\n {label}\n </Typography>\n <Box\n role=\"region\"\n aria-label={label}\n tabIndex={0}\n sx={{\n overflowX: \"auto\",\n p: 1.5,\n borderRadius: 1,\n border: 1,\n borderColor: \"divider\",\n bgcolor: \"background.default\",\n fontFamily: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n fontSize: \"0.8125rem\",\n whiteSpace: \"pre\",\n }}\n >\n <code>{value}</code>\n </Box>\n <Button\n onClick={handleCopy}\n startIcon={<Icon icon={status === \"copied\" ? Check : Copy} />}\n fullWidth\n >\n {status === \"copied\" ? copiedLabel : copyLabel}\n </Button>\n <VisuallyHidden role=\"status\" aria-live=\"polite\">\n {message}\n </VisuallyHidden>\n </Stack>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Link from \"@mui/material/Link\";\n\nexport interface SkipLinkProps {\n /** Id of the main content, for example \"#content\". */\n href: string;\n children?: ReactNode;\n}\n\n/**\n * \"Skip to content\" link (WCAG 2.4.1). It is the first element to receive\n * focus with Tab and it is only visible while it has focus.\n */\nexport function SkipLink({ href, children = \"Skip to content\" }: SkipLinkProps) {\n return (\n <Link\n href={href}\n sx={(theme) => ({\n position: \"fixed\",\n top: theme.spacing(1),\n left: theme.spacing(1),\n zIndex: theme.zIndex.tooltip + 1,\n px: 2,\n py: 1,\n borderRadius: 1,\n bgcolor: \"background.paper\",\n color: \"text.primary\",\n fontWeight: 600,\n textDecoration: \"none\",\n border: `2px solid ${theme.palette.primary.main}`,\n transform: \"translateY(-300%)\",\n \"&:focus\": { transform: \"translateY(0)\" },\n })}\n >\n {children}\n </Link>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Container from \"@mui/material/Container\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ntype HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport interface HeroProps {\n title: string;\n /** Small label above the title. */\n eyebrow?: ReactNode;\n description?: ReactNode;\n /** Buttons or links under the text. */\n actions?: ReactNode;\n /** Heading level of the title (h1–h6). A page's hero is normally h1. */\n level?: HeadingLevel;\n align?: \"left\" | \"center\";\n}\n\n/**\n * Banner for the top of a page. It uses the theme surface color (flat) with\n * light text on top. Outlined and text buttons inside it take the text color\n * of the surface, so they stay visible.\n */\nexport function Hero({\n title,\n eyebrow,\n description,\n actions,\n level = 1,\n align = \"left\",\n}: HeroProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n const center = align === \"center\";\n\n return (\n <Box\n component=\"section\"\n sx={(theme) => ({\n py: { xs: 6, md: 10 },\n color: theme.vietri.color.onSurface,\n background: theme.vietri.gradient.surface,\n // Focus ring and secondary buttons that stay visible on a dark surface.\n \"& a:focus-visible, & button:focus-visible\": {\n outline: \"2px solid\",\n outlineColor: theme.vietri.color.onSurface,\n outlineOffset: 3,\n },\n \"& .MuiButton-outlined, & .MuiButton-text\": {\n color: \"inherit\",\n borderColor: \"currentColor\",\n },\n })}\n >\n <Container maxWidth=\"lg\">\n <Stack\n spacing={2}\n sx={{ alignItems: center ? \"center\" : \"flex-start\", textAlign: align }}\n >\n {eyebrow && (\n <Typography\n component=\"p\"\n variant=\"overline\"\n sx={(theme) => ({ color: theme.vietri.color.onSurfaceSoft })}\n >\n {eyebrow}\n </Typography>\n )}\n <Typography component={heading} variant=\"h2\" sx={{ maxWidth: 900 }}>\n {title}\n </Typography>\n {description && (\n <Typography\n variant=\"body1\"\n sx={(theme) => ({\n maxWidth: 680,\n color: theme.vietri.color.onSurfaceSoft,\n })}\n >\n {description}\n </Typography>\n )}\n {actions && (\n <Stack\n direction=\"row\"\n spacing={2}\n useFlexGap\n flexWrap=\"wrap\"\n sx={{ pt: 2, justifyContent: center ? \"center\" : \"flex-start\" }}\n >\n {actions}\n </Stack>\n )}\n </Stack>\n </Container>\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport type { LucideIcon } from \"lucide-react\";\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\nimport { Card, CardContent } from \"../Card\";\nimport { Icon } from \"../Icon\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface FeatureCardProps {\n /** Decorative icon (hidden from screen readers). */\n icon: LucideIcon;\n title: string;\n description?: ReactNode;\n /** Heading level of the title. Default 3. */\n level?: HeadingLevel;\n /** Extra content under the description, for example a list. */\n children?: ReactNode;\n}\n\n/** Card with an icon, a title and a short text. */\nexport function FeatureCard({\n icon,\n title,\n description,\n level = 3,\n children,\n}: FeatureCardProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n return (\n <Card sx={{ height: \"100%\" }}>\n <CardContent>\n <Box\n sx={(theme) => ({\n display: \"grid\",\n placeItems: \"center\",\n width: 44,\n height: 44,\n mb: 2,\n borderRadius: 2,\n bgcolor: theme.vietri.color.chip,\n color: theme.palette.primary.main,\n })}\n >\n <Icon icon={icon} size={22} />\n </Box>\n <Typography component={heading} variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {description}\n </Typography>\n )}\n {children && <Box sx={{ mt: 2 }}>{children}</Box>}\n </CardContent>\n </Card>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface Step {\n title: string;\n description?: ReactNode;\n}\n\nexport interface StepsProps {\n steps: Step[];\n /** Heading level of each step title. Default 3. */\n level?: HeadingLevel;\n /** Accessible name of the list, for example \"Methodology\". */\n ariaLabel?: string;\n}\n\n/**\n * Numbered process. It is an ordered list, so screen readers announce the\n * position of each step; the visible numbers are decorative.\n */\nexport function Steps({ steps, level = 3, ariaLabel }: StepsProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n return (\n <Box\n component=\"ol\"\n role=\"list\"\n aria-label={ariaLabel}\n sx={{\n listStyle: \"none\",\n m: 0,\n p: 0,\n display: \"grid\",\n gap: 3,\n gridTemplateColumns: {\n xs: \"1fr\",\n md: `repeat(${Math.max(steps.length, 1)}, minmax(0, 1fr))`,\n },\n }}\n >\n {steps.map((step, index) => (\n <li key={step.title}>\n <Stack spacing={1}>\n <Box\n aria-hidden=\"true\"\n sx={(theme) => ({\n display: \"grid\",\n placeItems: \"center\",\n width: 36,\n height: 36,\n borderRadius: \"50%\",\n fontWeight: 600,\n bgcolor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n })}\n >\n {index + 1}\n </Box>\n <Typography component={heading} variant=\"h6\">\n {step.title}\n </Typography>\n {step.description && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {step.description}\n </Typography>\n )}\n </Stack>\n </li>\n ))}\n </Box>\n );\n}\n","import type { ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport Typography from \"@mui/material/Typography\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface TimelineEntry {\n /** Unique id. It is also the anchor of the entry (`#id`). */\n id: string;\n /** Period or date, for example \"1920s\". */\n label: string;\n description?: ReactNode;\n content?: ReactNode;\n}\n\nexport interface TimelineProps {\n entries: TimelineEntry[];\n /** Heading level of each label. Default 3. */\n level?: HeadingLevel;\n /** Accessible name of the list, for example \"Timeline by decade\". */\n ariaLabel?: string;\n}\n\n/**\n * Vertical timeline. It is an ordered list; every entry has a heading, so\n * screen reader users can jump from period to period.\n */\nexport function Timeline({ entries, level = 3, ariaLabel }: TimelineProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n return (\n <Box\n component=\"ol\"\n role=\"list\"\n aria-label={ariaLabel}\n sx={{ listStyle: \"none\", m: 0, p: 0 }}\n >\n {entries.map((entry) => (\n <Box\n component=\"li\"\n key={entry.id}\n id={entry.id}\n sx={(theme) => ({\n position: \"relative\",\n pl: 4,\n pb: 5,\n scrollMarginTop: theme.spacing(10),\n // Vertical line between dots.\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n left: 7,\n top: 14,\n bottom: 0,\n width: 2,\n bgcolor: theme.palette.divider,\n },\n \"&:last-of-type\": { pb: 0 },\n \"&:last-of-type::before\": { display: \"none\" },\n })}\n >\n <Box\n aria-hidden=\"true\"\n sx={(theme) => ({\n position: \"absolute\",\n left: 0,\n top: 6,\n width: 16,\n height: 16,\n borderRadius: \"50%\",\n bgcolor: theme.palette.primary.main,\n border: `3px solid ${theme.palette.background.default}`,\n boxSizing: \"border-box\",\n })}\n />\n <Typography component={heading} variant=\"h5\">\n {entry.label}\n </Typography>\n {entry.description && (\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ mt: 0.5 }}>\n {entry.description}\n </Typography>\n )}\n {entry.content && <Box sx={{ mt: 2 }}>{entry.content}</Box>}\n </Box>\n ))}\n </Box>\n );\n}\n","import Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport type { CategoryColor } from \"../../theme/categorical\";\nimport { Card, CardContent } from \"../Card\";\nimport { CategoryChip, Chip } from \"../Chip\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface ProfileTag {\n label: string;\n /** Category color, from `createCategoryColors`. Without it the chip is neutral. */\n color?: CategoryColor;\n}\n\nexport interface ProfileCardProps {\n name: string;\n /** Short epithet or description under the name. */\n subtitle?: string;\n bio?: string;\n tags?: ProfileTag[];\n /** Makes the whole card a link. */\n href?: string;\n /** Makes the whole card a button (for example to open a side panel). */\n onClick?: () => void;\n /** Heading level of the name. Default 3. */\n level?: HeadingLevel;\n /** Lines of bio shown before it is cut. Default 3. */\n bioLines?: number;\n}\n\n// The link sits inside the heading and its ::after covers the whole card\n// (\"stretched link\"): one tab stop, a real heading, and a card that is\n// entirely clickable. Position must be static so the card is the reference.\nconst stretchedLink: SxProps<Theme> = {\n position: \"static\",\n color: \"inherit\",\n font: \"inherit\",\n textAlign: \"left\",\n cursor: \"pointer\",\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n inset: 0,\n },\n};\n\n/**\n * Card for a person or profile. When it has `href` or `onClick` the whole\n * card is operable with mouse and keyboard, and the name stays a heading.\n */\nexport function ProfileCard({\n name,\n subtitle,\n bio,\n tags = [],\n href,\n onClick,\n level = 3,\n bioLines = 3,\n}: ProfileCardProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n const interactive = Boolean(href || onClick);\n\n const title = href ? (\n <Link href={href} underline=\"none\" sx={stretchedLink}>\n {name}\n </Link>\n ) : onClick ? (\n <Link component=\"button\" type=\"button\" onClick={onClick} underline=\"none\" sx={stretchedLink}>\n {name}\n </Link>\n ) : (\n name\n );\n\n return (\n <Card\n sx={(theme) => ({\n position: \"relative\",\n height: \"100%\",\n ...(interactive && { \"&:hover\": { borderColor: theme.palette.primary.main } }),\n // One focus ring for the whole card, instead of one around the name.\n \"&:has(:focus-visible)\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n \"& a:focus-visible, & button:focus-visible\": { outline: \"none\" },\n })}\n >\n <CardContent>\n <Typography component={heading} variant=\"h6\">\n {title}\n </Typography>\n {subtitle && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n )}\n {bio && (\n <Typography\n variant=\"body2\"\n sx={{\n mt: 1,\n display: \"-webkit-box\",\n WebkitLineClamp: bioLines,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {bio}\n </Typography>\n )}\n {tags.length > 0 && (\n <Stack direction=\"row\" spacing={1} useFlexGap flexWrap=\"wrap\" sx={{ mt: 2 }}>\n {tags.map((tag) =>\n tag.color ? (\n <CategoryChip key={tag.label} label={tag.label} color={tag.color} />\n ) : (\n <Chip key={tag.label} label={tag.label} size=\"small\" />\n )\n )}\n </Stack>\n )}\n </CardContent>\n </Card>\n );\n}\n","import type { SxProps, Theme } from \"@mui/material/styles\";\n\n/**\n * Link or button placed inside a heading whose ::after covers the whole card\n * (\"stretched link\"): one tab stop, a real heading and a fully clickable card.\n * Position must be static so the card is the positioning reference.\n */\nexport const stretchedLink: SxProps<Theme> = {\n position: \"static\",\n color: \"inherit\",\n font: \"inherit\",\n textAlign: \"left\",\n cursor: \"pointer\",\n \"&::after\": {\n content: '\"\"',\n position: \"absolute\",\n inset: 0,\n },\n};\n\n/** One focus ring for the whole card, instead of one around the inner link. */\nexport const cardFocusRing = (theme: Theme) => ({\n \"&:has(:focus-visible)\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n \"& a:focus-visible, & button:focus-visible\": { outline: \"none\" },\n});\n","import Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Typography from \"@mui/material/Typography\";\nimport { Card, CardContent } from \"../Card\";\nimport { Icon } from \"../Icon\";\nimport { Play } from \"../Icon/icons\";\nimport { cardFocusRing, stretchedLink } from \"../internal/stretched\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface MediaCardProps {\n title: string;\n /** Line under the title, for example the guest or the band. */\n subtitle?: string;\n /** Small label above the title, for example \"Season 1 · Episode 3\". */\n meta?: string;\n /** Thumbnail (16:9). Without it a plain surface is shown. */\n imageUrl?: string;\n /** Length shown over the thumbnail, for example \"42:10\". */\n duration?: string;\n /** Short label over the thumbnail, for example \"New\". */\n badge?: string;\n /** Makes the whole card a link. */\n href?: string;\n /** Makes the whole card a button. */\n onClick?: () => void;\n /** Heading level of the title. Default 3. */\n level?: HeadingLevel;\n /** Shows a play icon over the thumbnail. Default true. */\n playIcon?: boolean;\n}\n\n/**\n * Card for a video or an episode: a 16:9 thumbnail with a title. When it has\n * `href` or `onClick` the whole card is operable with mouse and keyboard and\n * the title stays a heading. The thumbnail is decorative (empty alt): the\n * title already names the content.\n */\nexport function MediaCard({\n title,\n subtitle,\n meta,\n imageUrl,\n duration,\n badge,\n href,\n onClick,\n level = 3,\n playIcon = true,\n}: MediaCardProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n const interactive = Boolean(href || onClick);\n\n const titleNode = href ? (\n <Link href={href} underline=\"none\" sx={stretchedLink}>\n {title}\n </Link>\n ) : onClick ? (\n <Link component=\"button\" type=\"button\" onClick={onClick} underline=\"none\" sx={stretchedLink}>\n {title}\n </Link>\n ) : (\n title\n );\n\n return (\n <Card\n sx={(theme) => ({\n position: \"relative\",\n height: \"100%\",\n overflow: \"hidden\",\n ...(interactive && { \"&:hover\": { borderColor: theme.palette.primary.main } }),\n ...cardFocusRing(theme),\n })}\n >\n <Box\n sx={(theme) => ({\n position: \"relative\",\n aspectRatio: \"16 / 9\",\n bgcolor: theme.vietri.color.chip,\n })}\n >\n {imageUrl && (\n <Box\n component=\"img\"\n src={imageUrl}\n alt=\"\"\n loading=\"lazy\"\n sx={{ display: \"block\", width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n )}\n {playIcon && (\n <Box\n aria-hidden=\"true\"\n sx={{\n position: \"absolute\",\n top: \"50%\",\n left: \"50%\",\n transform: \"translate(-50%, -50%)\",\n display: \"grid\",\n placeItems: \"center\",\n width: 48,\n height: 48,\n borderRadius: \"50%\",\n bgcolor: \"rgba(0, 0, 0, 0.8)\",\n color: \"#FFFFFF\",\n }}\n >\n <Icon icon={Play} size={22} />\n </Box>\n )}\n {badge && (\n <Box\n sx={(theme) => ({\n position: \"absolute\",\n top: 8,\n left: 8,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n bgcolor: theme.vietri.color.action[0],\n color: theme.vietri.color.onAction,\n })}\n >\n {badge}\n </Box>\n )}\n {duration && (\n <Box\n sx={{\n position: \"absolute\",\n right: 8,\n bottom: 8,\n px: 1,\n py: 0.25,\n borderRadius: 1,\n fontSize: \"0.75rem\",\n fontWeight: 600,\n bgcolor: \"rgba(0, 0, 0, 0.9)\",\n color: \"#FFFFFF\",\n }}\n >\n {duration}\n </Box>\n )}\n </Box>\n <CardContent>\n {meta && (\n <Typography component=\"p\" variant=\"overline\" color=\"text.secondary\">\n {meta}\n </Typography>\n )}\n <Typography component={heading} variant=\"h6\">\n {titleNode}\n </Typography>\n {subtitle && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {subtitle}\n </Typography>\n )}\n </CardContent>\n </Card>\n );\n}\n","import { Children, useId, useRef, type ReactNode } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Icon } from \"../Icon\";\nimport { ChevronLeft, ChevronRight } from \"../Icon/icons\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface ContentRailProps {\n /** Title of the row, for example \"Season 1\". It names the section. */\n title: string;\n /** The items of the row, usually MediaCards. */\n children: ReactNode;\n /** Heading level of the title. Default 2. */\n level?: HeadingLevel;\n /** Width of each item in pixels. Default 280. */\n itemWidth?: number;\n previousLabel?: string;\n nextLabel?: string;\n /** Extra element next to the arrows, for example a \"See all\" link. */\n action?: ReactNode;\n}\n\n/**\n * Horizontal row of items, like a season shelf. The row can be scrolled with\n * the arrows, with the mouse or touch, and with the keyboard: the scroll area\n * receives focus, and every interactive item inside it is reachable with Tab.\n */\nexport function ContentRail({\n title,\n children,\n level = 2,\n itemWidth = 280,\n previousLabel = \"Scroll left\",\n nextLabel = \"Scroll right\",\n action,\n}: ContentRailProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n const headingId = useId();\n const scroller = useRef<HTMLDivElement>(null);\n const items = Children.toArray(children);\n\n function scrollBy(direction: 1 | -1) {\n const element = scroller.current;\n if (!element) return;\n const reduceMotion =\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n element.scrollBy?.({\n left: direction * element.clientWidth * 0.8,\n behavior: reduceMotion ? \"auto\" : \"smooth\",\n });\n }\n\n return (\n <Box component=\"section\" aria-labelledby={headingId} sx={{ mb: 4 }}>\n <Stack\n direction=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n sx={{ mb: 2 }}\n >\n <Typography id={headingId} component={heading} variant=\"h5\">\n {title}\n </Typography>\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n {action}\n <IconButton aria-label={previousLabel} onClick={() => scrollBy(-1)}>\n <Icon icon={ChevronLeft} />\n </IconButton>\n <IconButton aria-label={nextLabel} onClick={() => scrollBy(1)}>\n <Icon icon={ChevronRight} />\n </IconButton>\n </Stack>\n </Stack>\n <Box\n ref={scroller}\n tabIndex={0}\n sx={(theme) => ({\n overflowX: \"auto\",\n pb: 1,\n scrollSnapType: \"x proximity\",\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n })}\n >\n <Box\n component=\"ul\"\n role=\"list\"\n sx={{ listStyle: \"none\", m: 0, p: 0, display: \"flex\", gap: 2 }}\n >\n {items.map((item, index) => (\n <Box\n component=\"li\"\n key={index}\n sx={{ flex: `0 0 ${itemWidth}px`, scrollSnapAlign: \"start\" }}\n >\n {item}\n </Box>\n ))}\n </Box>\n </Box>\n </Box>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport Box from \"@mui/material/Box\";\nimport ButtonBase from \"@mui/material/ButtonBase\";\nimport { Icon } from \"../Icon\";\nimport { Play } from \"../Icon/icons\";\n\nexport interface VideoEmbedProps {\n /** YouTube video id, for example \"jNQXAC9IVRw\". */\n videoId: string;\n /** Title of the video. It is the accessible name of the player. */\n title: string;\n /** Image shown before the video loads. Without it a black surface is shown. */\n poster?: string;\n /** Start time in seconds. */\n start?: number;\n /**\n * When true (default) nothing is loaded from YouTube until the person\n * presses play: faster pages and no third-party tracking before consent.\n * When false the player loads right away.\n */\n lazy?: boolean;\n /** Label of the play button. Default \"Play video: {title}\". */\n playLabel?: string;\n}\n\nfunction embedUrl(videoId: string, start: number | undefined, autoplay: boolean) {\n const params = new URLSearchParams({ rel: \"0\", modestbranding: \"1\" });\n if (start) params.set(\"start\", String(Math.floor(start)));\n if (autoplay) params.set(\"autoplay\", \"1\");\n return `https://www.youtube-nocookie.com/embed/${encodeURIComponent(videoId)}?${params.toString()}`;\n}\n\n/**\n * Responsive 16:9 YouTube player. It uses the privacy-enhanced domain\n * (youtube-nocookie.com) and, by default, loads nothing until the person\n * presses play. After pressing play, focus moves to the player.\n */\nexport function VideoEmbed({\n videoId,\n title,\n poster,\n start,\n lazy = true,\n playLabel,\n}: VideoEmbedProps) {\n const [active, setActive] = useState(!lazy);\n const startedByUser = useRef(false);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n\n useEffect(() => {\n if (active && startedByUser.current) iframeRef.current?.focus();\n }, [active]);\n\n return (\n <Box\n sx={{\n position: \"relative\",\n width: \"100%\",\n aspectRatio: \"16 / 9\",\n overflow: \"hidden\",\n borderRadius: 2,\n bgcolor: \"#000000\",\n }}\n >\n {active ? (\n <iframe\n ref={iframeRef}\n src={embedUrl(videoId, start, startedByUser.current)}\n title={title}\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\"\n allowFullScreen\n referrerPolicy=\"strict-origin-when-cross-origin\"\n loading=\"lazy\"\n style={{ position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\", border: 0 }}\n />\n ) : (\n <ButtonBase\n aria-label={playLabel ?? `Play video: ${title}`}\n onClick={() => {\n startedByUser.current = true;\n setActive(true);\n }}\n sx={{\n position: \"absolute\",\n inset: 0,\n width: \"100%\",\n height: \"100%\",\n \"&:focus-visible\": {\n outline: \"3px solid #FFFFFF\",\n outlineOffset: -6,\n },\n }}\n >\n {poster && (\n <Box\n component=\"img\"\n src={poster}\n alt=\"\"\n loading=\"lazy\"\n sx={{ position: \"absolute\", inset: 0, width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n )}\n <Box\n aria-hidden=\"true\"\n sx={{\n position: \"relative\",\n display: \"grid\",\n placeItems: \"center\",\n width: 72,\n height: 72,\n borderRadius: \"50%\",\n bgcolor: \"rgba(0, 0, 0, 0.8)\",\n color: \"#FFFFFF\",\n }}\n >\n <Icon icon={Play} size={32} />\n </Box>\n </ButtonBase>\n )}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Typography from \"@mui/material/Typography\";\nimport type { Theme } from \"@mui/material/styles\";\nimport { stretchedLink } from \"../internal/stretched\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface Episode {\n id: string;\n /** Episode number, as published (it may not match the position in the list). */\n number: number;\n title: string;\n description?: string;\n /** Extra line, for example guest and duration. */\n meta?: string;\n /** Small thumbnail (16:9). */\n imageUrl?: string;\n /** Makes the row a link. */\n href?: string;\n}\n\nexport interface EpisodeListProps {\n episodes: Episode[];\n /** Id of the episode being watched. It is marked with aria-current. */\n currentId?: string;\n /** Makes every row a button and reports the chosen id. */\n onSelect?: (id: string) => void;\n /** Heading level of each title. Default 3. */\n level?: HeadingLevel;\n /** Accessible name of the list, for example \"Season 1\". */\n ariaLabel?: string;\n /** Text above each title. Default \"Episode N\". */\n episodeLabel?: (number: number) => string;\n /** Text shown on the current episode. Default \"Now playing\". */\n currentLabel?: string;\n}\n\nconst rowFocus = (theme: Theme) => ({\n \"&:has(:focus-visible)\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n \"& a:focus-visible, & button:focus-visible\": { outline: \"none\" },\n});\n\n/**\n * Vertical list of episodes. It is an ordered list; each title is a heading,\n * and the whole row is operable with mouse and keyboard when it has a link or\n * `onSelect`.\n */\nexport function EpisodeList({\n episodes,\n currentId,\n onSelect,\n level = 3,\n ariaLabel,\n episodeLabel = (number) => `Episode ${number}`,\n currentLabel = \"Now playing\",\n}: EpisodeListProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n\n return (\n <Box\n component=\"ol\"\n role=\"list\"\n aria-label={ariaLabel}\n sx={{ listStyle: \"none\", m: 0, p: 0 }}\n >\n {episodes.map((episode) => {\n const isCurrent = episode.id === currentId;\n const interactive = Boolean(onSelect || episode.href);\n\n const title = onSelect ? (\n <Link\n component=\"button\"\n type=\"button\"\n onClick={() => onSelect(episode.id)}\n aria-current={isCurrent ? \"true\" : undefined}\n underline=\"none\"\n sx={stretchedLink}\n >\n {episode.title}\n </Link>\n ) : episode.href ? (\n <Link\n href={episode.href}\n aria-current={isCurrent ? \"true\" : undefined}\n underline=\"none\"\n sx={stretchedLink}\n >\n {episode.title}\n </Link>\n ) : (\n episode.title\n );\n\n return (\n <Box\n component=\"li\"\n key={episode.id}\n sx={(theme) => ({\n position: \"relative\",\n display: \"flex\",\n gap: 2,\n p: 2,\n borderBottom: 1,\n borderColor: \"divider\",\n borderLeft: 4,\n borderLeftColor: isCurrent ? theme.palette.primary.main : \"transparent\",\n ...(interactive && { \"&:hover\": { bgcolor: theme.palette.action.hover } }),\n ...rowFocus(theme),\n })}\n >\n {episode.imageUrl && (\n <Box\n component=\"img\"\n src={episode.imageUrl}\n alt=\"\"\n loading=\"lazy\"\n sx={{\n flex: \"0 0 auto\",\n width: { xs: 112, sm: 160 },\n aspectRatio: \"16 / 9\",\n objectFit: \"cover\",\n borderRadius: 1,\n }}\n />\n )}\n <Box sx={{ minWidth: 0 }}>\n <Typography component=\"p\" variant=\"overline\" color=\"text.secondary\">\n {episodeLabel(episode.number)}\n {isCurrent && ` · ${currentLabel}`}\n </Typography>\n <Typography component={heading} variant=\"h6\">\n {title}\n </Typography>\n {episode.meta && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {episode.meta}\n </Typography>\n )}\n {episode.description && (\n <Typography\n variant=\"body2\"\n sx={{\n mt: 0.5,\n display: \"-webkit-box\",\n WebkitLineClamp: 2,\n WebkitBoxOrient: \"vertical\",\n overflow: \"hidden\",\n }}\n >\n {episode.description}\n </Typography>\n )}\n </Box>\n </Box>\n );\n })}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { Button } from \"../Button\";\nimport { Card, CardContent } from \"../Card\";\nimport { Icon } from \"../Icon\";\nimport { ExternalLink, Music } from \"../Icon/icons\";\nimport { VisuallyHidden } from \"../VisuallyHidden\";\n\ntype HeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface PlaylistPlatform {\n /** Name shown on the button, for example \"Spotify\". */\n name: string;\n href: string;\n}\n\nexport interface PlaylistCardProps {\n title: string;\n description?: string;\n /** Square cover. Without it a plain surface with a music icon is shown. */\n imageUrl?: string;\n platforms: PlaylistPlatform[];\n /** Heading level of the title. Default 3. */\n level?: HeadingLevel;\n /** Accessible name of the list of platforms. Default \"Listen on\". */\n platformsLabel?: string;\n /** Text for screen readers on external links. */\n externalLabel?: string;\n}\n\n/**\n * Card for a playlist that lives on several music services. Each service is a\n * link that opens in a new tab. The accessible name of every link includes the\n * playlist title, so several cards on a page stay distinguishable.\n */\nexport function PlaylistCard({\n title,\n description,\n imageUrl,\n platforms,\n level = 3,\n platformsLabel = \"Listen on\",\n externalLabel = \"(opens in a new tab)\",\n}: PlaylistCardProps) {\n const heading = `h${level}` as `h${HeadingLevel}`;\n\n return (\n <Card sx={{ height: \"100%\" }}>\n <Box\n sx={(theme) => ({\n aspectRatio: \"1 / 1\",\n display: \"grid\",\n placeItems: \"center\",\n bgcolor: theme.vietri.color.chip,\n color: theme.palette.text.secondary,\n })}\n >\n {imageUrl ? (\n <Box\n component=\"img\"\n src={imageUrl}\n alt=\"\"\n loading=\"lazy\"\n sx={{ display: \"block\", width: \"100%\", height: \"100%\", objectFit: \"cover\" }}\n />\n ) : (\n <Icon icon={Music} size={48} />\n )}\n </Box>\n <CardContent>\n <Typography component={heading} variant=\"h6\" gutterBottom>\n {title}\n </Typography>\n {description && (\n <Typography variant=\"body2\" color=\"text.secondary\">\n {description}\n </Typography>\n )}\n {platforms.length > 0 && (\n <Stack\n component=\"ul\"\n role=\"list\"\n aria-label={platformsLabel}\n direction=\"row\"\n spacing={1}\n useFlexGap\n flexWrap=\"wrap\"\n sx={{ listStyle: \"none\", m: 0, mt: 2, p: 0 }}\n >\n {platforms.map((platform) => (\n <li key={platform.name}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n href={platform.href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n endIcon={<Icon icon={ExternalLink} size={14} />}\n >\n {platform.name}\n <VisuallyHidden>\n {\" \"}\n – {title} {externalLabel}\n </VisuallyHidden>\n </Button>\n </li>\n ))}\n </Stack>\n )}\n </CardContent>\n </Card>\n );\n}\n","/**\n * Vietri DS design tokens that do not depend on the theme: spacing, radius,\n * typography, shadows and breakpoints. Colors live in `palettes.ts`, one\n * palette per theme.\n */\nimport type { GradientStops, ThemeColors } from \"./palettes\";\n\nexport type { GradientStops };\n\nexport function linearGradient(from: string, to: string, angle = 135): string {\n return `linear-gradient(${angle}deg, ${from} 0%, ${to} 100%)`;\n}\n\nexport interface Gradients {\n /** Footers, headers and banners. */\n surface: string;\n /** Primary buttons. */\n action: string;\n actionHover: string;\n}\n\n/**\n * Turns a palette's color pairs into CSS. When both colors of a pair are\n * equal the result looks flat, so flat themes and gradient themes share code.\n */\nexport function createGradients(\n colors: Pick<ThemeColors, \"surface\" | \"action\" | \"actionHover\">\n): Gradients {\n return {\n surface: linearGradient(...colors.surface),\n action: linearGradient(...colors.action),\n actionHover: linearGradient(...colors.actionHover),\n };\n}\n\nexport const tokens = {\n spacing: 8,\n radius: {\n sm: 4,\n md: 8,\n lg: 16,\n },\n typography: {\n fontFamily: '\"Inter\", \"Helvetica Neue\", Arial, sans-serif',\n fontWeight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n },\n },\n shadow: {\n sm: \"0 1px 2px rgba(0, 0, 0, 0.08)\",\n md: \"0 4px 12px rgba(0, 0, 0, 0.12)\",\n lg: \"0 12px 32px rgba(0, 0, 0, 0.16)\",\n },\n breakpoints: {\n xs: 0,\n sm: 600,\n md: 900,\n lg: 1200,\n xl: 1536,\n },\n} as const;\n","import type { ThemeOptions } from \"@mui/material/styles\";\nimport \"./augmentation\";\nimport { tokens } from \"./tokens\";\n\n/**\n * Visual identity of the MUI components. It lives in the theme so it\n * applies the same way to all three themes and to any app that uses Vietri.\n */\nexport const components: ThemeOptions[\"components\"] = {\n // Respects the system \"reduce motion\" preference (WCAG 2.3.3).\n MuiCssBaseline: {\n styleOverrides: `\n @media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n animation-iteration-count: 1 !important;\n transition-duration: 0.01ms !important;\n scroll-behavior: auto !important;\n }\n }\n `,\n },\n\n MuiButton: {\n defaultProps: { disableElevation: true },\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: tokens.radius.md,\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 2,\n },\n }),\n // Primary action fill. Flat in most themes, a soft gradient in the\n // Observatory. The text color meets AA at both ends of the fill.\n containedPrimary: ({ theme }) => ({\n color: theme.vietri.color.onAction,\n backgroundImage: theme.vietri.gradient.action,\n \"&:hover\": { backgroundImage: theme.vietri.gradient.actionHover },\n \"&.Mui-disabled\": {\n backgroundImage: \"none\",\n color: theme.palette.action.disabled,\n },\n }),\n },\n },\n\n MuiLink: {\n styleOverrides: {\n root: ({ theme }) => ({\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: 3,\n borderRadius: tokens.radius.sm,\n },\n }),\n },\n },\n\n MuiChip: {\n styleOverrides: {\n root: ({ ownerState, theme }) => {\n const isDefaultFilled =\n ownerState.variant === \"filled\" && ownerState.color === \"default\";\n return {\n fontWeight: tokens.typography.fontWeight.semibold,\n fontSize: \"0.75rem\",\n // MUI's default chip is translucent, so its text is only readable on\n // the surface it was designed for. Opaque colors keep it legible on\n // any surface (a dark chip on white, a light chip on purple…).\n ...(isDefaultFilled && {\n color: theme.vietri.color.onChip,\n backgroundColor: theme.vietri.color.chip,\n \"&.MuiChip-clickable:hover\": {\n backgroundColor: theme.vietri.color.chipHover,\n },\n }),\n };\n },\n },\n },\n\n MuiCard: {\n defaultProps: { variant: \"outlined\" },\n styleOverrides: {\n root: {\n borderRadius: tokens.radius.lg,\n backgroundImage: \"none\",\n },\n },\n },\n\n MuiCardActionArea: {\n styleOverrides: {\n root: ({ theme }) => ({\n \"&:focus-visible\": {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n }),\n },\n },\n\n MuiDialog: {\n styleOverrides: {\n paper: { borderRadius: tokens.radius.lg, backgroundImage: \"none\" },\n },\n },\n\n MuiDrawer: {\n styleOverrides: {\n paper: { backgroundImage: \"none\" },\n },\n },\n\n // Field borders use the secondary text color to meet the 3:1 minimum\n // contrast for interface components (WCAG 1.4.11).\n MuiOutlinedInput: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderRadius: tokens.radius.md,\n \"& .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.text.secondary,\n },\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.text.primary,\n },\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.primary.main,\n },\n \"&.Mui-error .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.error.main,\n },\n \"&.Mui-disabled .MuiOutlinedInput-notchedOutline\": {\n borderColor: theme.palette.divider,\n },\n }),\n },\n },\n\n MuiTableCell: {\n styleOverrides: {\n root: ({ theme }) => ({\n borderBottomColor: theme.palette.divider,\n }),\n head: ({ theme }) => ({\n fontWeight: tokens.typography.fontWeight.semibold,\n color: theme.palette.text.primary,\n borderBottom: `2px solid ${theme.palette.text.primary}`,\n }),\n },\n },\n};\n","import { createTheme, type ThemeOptions } from \"@mui/material/styles\";\nimport \"./augmentation\";\nimport type { VietriExtras } from \"./augmentation\";\nimport { components } from \"./components\";\nimport type { ThemeColors } from \"./palettes\";\nimport { createGradients, tokens } from \"./tokens\";\n\nconst { typography, breakpoints } = tokens;\n\n/** Extras available on `theme.vietri` for components. */\nexport function vietriExtras(colors: ThemeColors): VietriExtras {\n return {\n color: colors,\n shadow: tokens.shadow,\n gradient: createGradients(colors),\n };\n}\n\n/**\n * Options shared by all themes: typography, shape, spacing, breakpoints and\n * component styles. Each theme only provides its own palette and gradients.\n */\nexport const baseOptions: ThemeOptions = {\n spacing: tokens.spacing,\n shape: { borderRadius: tokens.radius.md },\n breakpoints: { values: { ...breakpoints } },\n typography: {\n fontFamily: typography.fontFamily,\n fontWeightRegular: typography.fontWeight.regular,\n fontWeightMedium: typography.fontWeight.medium,\n fontWeightBold: typography.fontWeight.semibold,\n h1: {\n fontSize: \"clamp(3rem, 8vw, 7rem)\",\n fontWeight: typography.fontWeight.semibold,\n letterSpacing: \"-0.055em\",\n lineHeight: 0.95,\n },\n h2: {\n fontSize: \"clamp(2rem, 5vw, 4rem)\",\n fontWeight: typography.fontWeight.semibold,\n letterSpacing: \"-0.04em\",\n lineHeight: 1.05,\n },\n h3: {\n fontSize: \"clamp(1.5rem, 3vw, 2.25rem)\",\n fontWeight: typography.fontWeight.semibold,\n letterSpacing: \"-0.03em\",\n lineHeight: 1.15,\n },\n h4: {\n fontSize: \"1.5rem\",\n fontWeight: typography.fontWeight.semibold,\n letterSpacing: \"-0.02em\",\n lineHeight: 1.25,\n },\n h5: { fontSize: \"1.25rem\", fontWeight: typography.fontWeight.medium, lineHeight: 1.3 },\n h6: { fontSize: \"1.0625rem\", fontWeight: typography.fontWeight.medium, lineHeight: 1.4 },\n body1: { fontSize: \"1rem\", lineHeight: 1.6 },\n body2: { fontSize: \"0.875rem\", lineHeight: 1.55 },\n button: {\n fontWeight: typography.fontWeight.medium,\n textTransform: \"none\",\n letterSpacing: \"-0.01em\",\n },\n overline: {\n fontWeight: typography.fontWeight.medium,\n letterSpacing: \"0.12em\",\n },\n },\n components,\n};\n\n/**\n * Builds a complete theme from a palette: MUI palette, `theme.vietri` extras,\n * and everything shared in `baseOptions`.\n */\nexport function createVietriTheme(colors: ThemeColors) {\n return createTheme({\n ...baseOptions,\n vietri: vietriExtras(colors),\n palette: {\n mode: colors.mode,\n primary: { main: colors.primary, contrastText: colors.onPrimary },\n secondary: { main: colors.secondary, contrastText: colors.onSecondary },\n error: { main: colors.status.error, contrastText: colors.onStatus },\n warning: { main: colors.status.warning, contrastText: colors.onStatus },\n info: { main: colors.status.info, contrastText: colors.onStatus },\n success: { main: colors.status.success, contrastText: colors.onStatus },\n background: { default: colors.bg, paper: colors.paper },\n text: { primary: colors.ink, secondary: colors.inkSoft },\n divider: colors.line,\n },\n });\n}\n","/**\n * Color palettes — one per theme.\n *\n * Each theme (editorial, streaming, observatory) has its own identity:\n * - editorial → the portfolio: black, white and gold\n * - streaming → \"El Blues es Femenino\": deep purple, violet, magenta, orange\n * - observatory → the Observatorio MDB: teal, cyan, amber, coral, red, purple\n *\n * Every pair that carries text meets WCAG AA (4.5:1). Brand colors that are\n * too light or too dark to carry text on their own (gold on white, violet on\n * deep purple…) are only used as fills, next to a text color that does reach\n * 4.5:1, or replaced by a text-safe sibling (for example bronze for gold).\n */\n\n/** Pair of colors (from, to) that defines a gradient. Equal colors = flat. */\nexport type GradientStops = readonly [from: string, to: string];\n\nexport interface StatusColors {\n error: string;\n warning: string;\n info: string;\n success: string;\n}\n\nexport interface ThemeColors {\n mode: \"light\" | \"dark\";\n\n /** Page background. */\n bg: string;\n /** Cards, menus and dialogs. */\n paper: string;\n /** Primary text. */\n ink: string;\n /** Secondary text. */\n inkSoft: string;\n /** Dividers and hairlines. */\n line: string;\n\n /** MUI primary: links, outlines, selected states. Readable as text. */\n primary: string;\n onPrimary: string;\n /** MUI secondary: readable as text on bg and paper. */\n secondary: string;\n onSecondary: string;\n\n /** Fill of primary buttons. Flat when both colors are equal. */\n action: GradientStops;\n actionHover: GradientStops;\n /** Text on action fills. */\n onAction: string;\n\n /** Fill of footers, headers and banners. */\n surface: GradientStops;\n /** Text on surfaces. */\n onSurface: string;\n /** Secondary text on surfaces. */\n onSurfaceSoft: string;\n\n /** Default chip: opaque, so it is legible on any surface. */\n chip: string;\n chipHover: string;\n onChip: string;\n\n /**\n * Two decorative colors for soft blurred lights on surfaces, or `null` for\n * none. They carry no text. All current themes are flat, so they use null.\n */\n glow: readonly [string, string] | null;\n\n status: StatusColors;\n /** Text on status-colored buttons. */\n onStatus: string;\n\n /** Named brand colors, as supplied. Used by the Colors docs page. */\n brand: Record<string, string>;\n /** Colors derived from the brand to meet contrast (text-safe or hover). */\n derived: Record<string, string>;\n}\n\nconst flat = (color: string): GradientStops => [color, color];\n\nconst lightStatus: StatusColors = {\n error: \"#B91C1C\",\n warning: \"#92400E\",\n info: \"#0369A1\",\n success: \"#166534\",\n};\n\n/** Portfolio — black, white and gold. */\nexport const editorialColors: ThemeColors = {\n mode: \"light\",\n bg: \"#FFFFFF\",\n paper: \"#FFFFFF\",\n ink: \"#111111\",\n inkSoft: \"#555555\",\n line: \"#E4E4E4\",\n primary: \"#000000\",\n onPrimary: \"#FFFFFF\",\n secondary: \"#7A5718\",\n onSecondary: \"#FFFFFF\",\n action: flat(\"#DBAC5B\"),\n actionHover: flat(\"#FDD07A\"),\n onAction: \"#000000\",\n surface: flat(\"#000000\"),\n onSurface: \"#FFFFFF\",\n onSurfaceSoft: \"#D4D4D4\",\n chip: \"#F3EBDA\",\n chipHover: \"#E8DDC4\",\n onChip: \"#111111\",\n glow: null,\n status: lightStatus,\n onStatus: \"#FFFFFF\",\n brand: {\n black: \"#000000\",\n gold: \"#DBAC5B\",\n white: \"#FFFFFF\",\n goldLight: \"#FDD07A\",\n },\n derived: {\n /** Gold that reads as text on white (6.6:1). */\n bronze: \"#7A5718\",\n ink: \"#111111\",\n inkSoft: \"#555555\",\n },\n};\n\n/** El Blues es Femenino — deep purple, violet, magenta and orange. */\nexport const streamingColors: ThemeColors = {\n mode: \"dark\",\n bg: \"#20123A\",\n paper: \"#2D1B50\",\n ink: \"#FFFFFF\",\n inkSoft: \"#D5CAEB\",\n line: \"rgba(255, 255, 255, 0.14)\",\n primary: \"#F35F1C\",\n onPrimary: \"#20123A\",\n secondary: \"#B99BFF\",\n onSecondary: \"#20123A\",\n action: flat(\"#F35F1C\"),\n actionHover: flat(\"#FF7B3F\"),\n onAction: \"#20123A\",\n surface: flat(\"#693BCC\"),\n onSurface: \"#FFFFFF\",\n onSurfaceSoft: \"#EDE6FB\",\n chip: \"#3C2866\",\n chipHover: \"#4A3478\",\n onChip: \"#FFFFFF\",\n glow: null,\n status: {\n error: \"#F87171\",\n warning: \"#FBBF24\",\n info: \"#7DD3FC\",\n success: \"#4ADE80\",\n },\n onStatus: \"#20123A\",\n brand: {\n night: \"#20123A\",\n violet: \"#693BCC\",\n magenta: \"#CB1F9C\",\n orange: \"#F35F1C\",\n },\n derived: {\n /** Violet that reads as text on the night background (7.6:1). */\n lilac: \"#B99BFF\",\n /** Raised surface over night. */\n nightRaised: \"#2D1B50\",\n orangeHover: \"#FF7B3F\",\n },\n};\n\n/** Observatory — teal, cyan, amber, coral, red and deep purple. Flat colors. */\nexport const observatoryColors: ThemeColors = {\n mode: \"light\",\n bg: \"#F7F4FA\",\n paper: \"#FFFFFF\",\n ink: \"#2B1B3D\",\n inkSoft: \"#5D4F70\",\n line: \"#E3DCEB\",\n // Teal carries actions and links: it reads as text on white and carries\n // white text. Deep purple is the second voice.\n primary: \"#027381\",\n onPrimary: \"#FFFFFF\",\n secondary: \"#4A0875\",\n onSecondary: \"#FFFFFF\",\n action: flat(\"#027381\"),\n actionHover: flat(\"#015C68\"),\n onAction: \"#FFFFFF\",\n surface: flat(\"#4A0875\"),\n onSurface: \"#FFFFFF\",\n onSurfaceSoft: \"#E8DCF4\",\n chip: \"#EFE8F6\",\n chipHover: \"#E3D8EF\",\n onChip: \"#2B1B3D\",\n glow: null,\n status: {\n error: \"#C41E32\",\n warning: \"#92400E\",\n info: \"#0369A1\",\n success: \"#166534\",\n },\n onStatus: \"#FFFFFF\",\n // The seven colors of the palette. Cyan, amber, coral and vermilion are too\n // light to carry text on white: use them as fills, with dark text on top\n // (charts, categories, highlights).\n brand: {\n teal: \"#027381\",\n cyan: \"#0EB9CB\",\n amber: \"#FFC23D\",\n coral: \"#FF7751\",\n vermilion: \"#F33829\",\n crimson: \"#C41E32\",\n purple: \"#4A0875\",\n },\n derived: {\n /** Page background: a barely-there purple tint. */\n page: \"#F7F4FA\",\n ink: \"#2B1B3D\",\n inkSoft: \"#5D4F70\",\n /** Teal for the hovered primary action (7.7:1 with white). */\n tealDark: \"#015C68\",\n },\n};\n","import { createVietriTheme } from \"./base\";\nimport { editorialColors } from \"./palettes\";\n\nexport const editorialTheme = createVietriTheme(editorialColors);\n","import { createVietriTheme } from \"./base\";\nimport { streamingColors } from \"./palettes\";\n\nexport const streamingTheme = createVietriTheme(streamingColors);\n","import { createVietriTheme } from \"./base\";\nimport { observatoryColors } from \"./palettes\";\n\nexport const observatoryTheme = createVietriTheme(observatoryColors);\n","/**\n * Categorical palette for countries, roles, decades, etc.\n *\n * It replaces colors generated from a hash: every text/background pair has a\n * contrast of at least 7:1 (AAA), and color is never the only indicator,\n * because it is always shown next to a text label.\n */\nexport interface CategoryColor {\n /** Chip background. */\n bg: string;\n /** Text on the background (≥ 7:1). */\n fg: string;\n /** Dot or marker on white (≥ 3:1). */\n dot: string;\n}\n\nexport const categoryPalette: readonly CategoryColor[] = [\n { bg: \"#E0F2FE\", fg: \"#0C4A6E\", dot: \"#0284C7\" }, // sky\n { bg: \"#EDE9FE\", fg: \"#4C1D95\", dot: \"#7C3AED\" }, // violet\n { bg: \"#FFE4E6\", fg: \"#881337\", dot: \"#E11D48\" }, // rose\n { bg: \"#FEF3C7\", fg: \"#78350F\", dot: \"#D97706\" }, // amber\n { bg: \"#D1FAE5\", fg: \"#064E3B\", dot: \"#059669\" }, // emerald\n { bg: \"#FAE8FF\", fg: \"#701A75\", dot: \"#C026D3\" }, // fuchsia\n { bg: \"#CCFBF1\", fg: \"#134E4A\", dot: \"#0D9488\" }, // teal\n { bg: \"#FFEDD5\", fg: \"#7C2D12\", dot: \"#EA580C\" }, // orange\n { bg: \"#E0E7FF\", fg: \"#312E81\", dot: \"#4F46E5\" }, // indigo\n { bg: \"#ECFCCB\", fg: \"#365314\", dot: \"#65A30D\" }, // lime\n];\n\n/**\n * Assigns a color to each category by its position. Always pass the full,\n * ordered list so the same value gets the same color in every view.\n * With more categories than colors, colors repeat. Pass another palette (for\n * example `observatoryCategoryPalette`) to change the colors.\n */\nexport function createCategoryColors(\n keys: readonly string[],\n palette: readonly CategoryColor[] = categoryPalette\n): Record<string, CategoryColor> {\n const unique = Array.from(new Set(keys));\n return Object.fromEntries(\n unique.map((key, index) => [key, palette[index % palette.length]])\n );\n}\n\n/**\n * Observatory categories: the seven colors of the Observatory palette used as\n * fills. Light fills (cyan, amber, coral, vermilion) carry dark text; dark\n * fills carry white text. Every text pair meets AA (4.5:1). `dot` is a darker\n * shade of the same hue, so a marker is visible on white (≥ 3:1).\n *\n * Pass the categories ordered by importance (for example countries by number\n * of profiles) so the most frequent ones get the most distinct colors. With\n * more than 7 categories the colors repeat.\n */\nexport const observatoryCategoryPalette: readonly CategoryColor[] = [\n { bg: \"#027381\", fg: \"#FFFFFF\", dot: \"#027381\" }, // teal\n { bg: \"#FF7751\", fg: \"#2B1B3D\", dot: \"#C2410C\" }, // coral\n { bg: \"#FFC23D\", fg: \"#2B1B3D\", dot: \"#A16207\" }, // amber\n { bg: \"#4A0875\", fg: \"#FFFFFF\", dot: \"#4A0875\" }, // purple\n { bg: \"#0EB9CB\", fg: \"#2B1B3D\", dot: \"#0E7490\" }, // cyan\n { bg: \"#C41E32\", fg: \"#FFFFFF\", dot: \"#C41E32\" }, // crimson\n { bg: \"#F33829\", fg: \"#000000\", dot: \"#F33829\" }, // vermilion\n];\n"],"names":["MenuIcon","SvgIcon","jsx","NavLinkItem","link","onClick","Link","NavBar","brand","brandHref","links","actions","ariaLabel","menuLabel","closeLabel","maxWidth","theme","useTheme","isDesktop","useMediaQuery","open","setOpen","useState","close","jsxs","AppBar","Container","Toolbar","Stack","Box","IconButton","Drawer","Button","defaultOptions","LanguageSwitch","value","onChange","options","ToggleButtonGroup","_event","next","option","ToggleButton","StatCard","label","description","Card","CardContent","Typography","rawValue","row","column","sortableValue","raw","compare","a","b","DataTable","columns","rows","getRowKey","caption","emptyMessage","sort","setSort","sortedRows","useMemo","c","factor","toggleSort","key","current","TableContainer","Table","TableHead","TableRow","direction","TableCell","TableSortLabel","TableBody","index","BarChart","data","title","max","formatValue","upperBound","datum","percent","formatted","Icon","Glyph","size","rest","CategoryChip","color","dot","MuiChip","VisuallyHidden","props","Footer","lines","linksLabel","action","legal","externalLabel","glow","Fragment","alpha","line","ExternalLink","Divider","SectionHeader","eyebrow","level","align","heading","Select","helperText","disabled","fullWidth","id","byValue","TextField","event","selected","MenuItem","Dialog","onClose","children","titleId","useId","descriptionId","MuiDialog","DialogTitle","X","DialogContent","DialogContentText","DialogActions","footer","anchor","width","MuiDrawer","CopyField","copyLabel","copiedLabel","errorLabel","copiedDuration","status","setStatus","timer","useRef","useEffect","handleCopy","Check","Copy","SkipLink","href","Hero","center","FeatureCard","icon","Steps","steps","step","Timeline","entries","entry","stretchedLink","ProfileCard","name","subtitle","bio","tags","bioLines","interactive","tag","Chip","cardFocusRing","MediaCard","meta","imageUrl","duration","badge","playIcon","Play","ContentRail","itemWidth","previousLabel","nextLabel","headingId","scroller","items","Children","scrollBy","element","reduceMotion","ChevronLeft","ChevronRight","item","embedUrl","videoId","start","autoplay","params","VideoEmbed","poster","lazy","playLabel","active","setActive","startedByUser","iframeRef","ButtonBase","rowFocus","EpisodeList","episodes","currentId","onSelect","episodeLabel","number","currentLabel","episode","isCurrent","PlaylistCard","platforms","platformsLabel","Music","platform","linearGradient","from","to","angle","createGradients","colors","tokens","components","ownerState","isDefaultFilled","typography","breakpoints","vietriExtras","baseOptions","createVietriTheme","createTheme","flat","lightStatus","editorialColors","streamingColors","observatoryColors","editorialTheme","streamingTheme","observatoryTheme","categoryPalette","createCategoryColors","keys","palette","unique","observatoryCategoryPalette"],"mappings":"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"}
|