@cere/cere-design-system 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/dist/buttons.d.mts +27 -22
- package/dist/buttons.d.ts +27 -22
- package/dist/buttons.js +5 -5
- package/dist/buttons.mjs +4 -4
- package/dist/charts.d.mts +1 -23
- package/dist/charts.d.ts +1 -23
- package/dist/charts.js +2 -9
- package/dist/charts.js.map +1 -1
- package/dist/charts.mjs +1 -8
- package/dist/{chunk-THQKYTQE.js → chunk-2KDN37PQ.js} +28 -32
- package/dist/chunk-2KDN37PQ.js.map +1 -0
- package/dist/{chunk-3WCMINE5.mjs → chunk-34LFXT6C.mjs} +25 -29
- package/dist/chunk-34LFXT6C.mjs.map +1 -0
- package/dist/chunk-3KCXCVOX.mjs +411 -0
- package/dist/chunk-3KCXCVOX.mjs.map +1 -0
- package/dist/{chunk-NXTVJ6PY.js → chunk-4OKTICU5.js} +10 -10
- package/dist/chunk-4OKTICU5.js.map +1 -0
- package/dist/{chunk-FN5YL4BK.js → chunk-72TQ56EP.js} +47 -45
- package/dist/chunk-72TQ56EP.js.map +1 -0
- package/dist/{chunk-QYYQYZHV.js → chunk-7KXKK2RE.js} +3 -5
- package/dist/chunk-7KXKK2RE.js.map +1 -0
- package/dist/{chunk-CCN6M4LI.js → chunk-ARSCL4ZZ.js} +18 -10
- package/dist/chunk-ARSCL4ZZ.js.map +1 -0
- package/dist/chunk-AWVNEU6R.mjs +1478 -0
- package/dist/chunk-AWVNEU6R.mjs.map +1 -0
- package/dist/{chunk-CUCKULYC.mjs → chunk-BH4FNZKK.mjs} +74 -1260
- package/dist/chunk-BH4FNZKK.mjs.map +1 -0
- package/dist/{chunk-FFZ5S7PQ.mjs → chunk-BOQPWZIB.mjs} +6 -5
- package/dist/chunk-BOQPWZIB.mjs.map +1 -0
- package/dist/chunk-BT7XUTT5.mjs +392 -0
- package/dist/chunk-BT7XUTT5.mjs.map +1 -0
- package/dist/{chunk-ATIFLPH6.mjs → chunk-D7D25O6E.mjs} +4 -2
- package/dist/{chunk-ATIFLPH6.mjs.map → chunk-D7D25O6E.mjs.map} +1 -1
- package/dist/{chunk-JS4IB5IU.mjs → chunk-DRGMEIPT.mjs} +2 -2
- package/dist/chunk-DRGMEIPT.mjs.map +1 -0
- package/dist/{chunk-KF2Y7HO3.js → chunk-DZXNYLVG.js} +43 -246
- package/dist/chunk-DZXNYLVG.js.map +1 -0
- package/dist/{chunk-IE6GCHDI.mjs → chunk-GR52ENYI.mjs} +26 -29
- package/dist/chunk-GR52ENYI.mjs.map +1 -0
- package/dist/chunk-GTBKQXXI.js +1472 -0
- package/dist/chunk-GTBKQXXI.js.map +1 -0
- package/dist/{chunk-463SRKKD.js → chunk-HJ24WKU4.js} +14 -5
- package/dist/chunk-HJ24WKU4.js.map +1 -0
- package/dist/{chunk-EOF3QNPF.js → chunk-KKIKOIMP.js} +140 -1028
- package/dist/chunk-KKIKOIMP.js.map +1 -0
- package/dist/{chunk-MNM6HE72.js → chunk-LVJSKRX3.js} +16 -15
- package/dist/chunk-LVJSKRX3.js.map +1 -0
- package/dist/{chunk-KPDYKK3V.js → chunk-PFZZJZ64.js} +8 -8
- package/dist/{chunk-KPDYKK3V.js.map → chunk-PFZZJZ64.js.map} +1 -1
- package/dist/{chunk-KVBMZNWT.mjs → chunk-POCAW2G4.mjs} +18 -10
- package/dist/chunk-POCAW2G4.mjs.map +1 -0
- package/dist/{chunk-L2TIGA7I.js → chunk-QCFLZ7X3.js} +39 -42
- package/dist/chunk-QCFLZ7X3.js.map +1 -0
- package/dist/{chunk-6EUAU67C.mjs → chunk-SG2TD7FQ.mjs} +8 -8
- package/dist/chunk-SG2TD7FQ.mjs.map +1 -0
- package/dist/{chunk-QY65OUAC.mjs → chunk-SSFALO6S.mjs} +13 -4
- package/dist/chunk-SSFALO6S.mjs.map +1 -0
- package/dist/{chunk-PWF2NJDB.mjs → chunk-WC2TCWXK.mjs} +82 -14
- package/dist/chunk-WC2TCWXK.mjs.map +1 -0
- package/dist/{chunk-ZGCN5WCG.js → chunk-XZZZ4MZV.js} +83 -15
- package/dist/chunk-XZZZ4MZV.js.map +1 -0
- package/dist/chunk-YCDCQSYH.js +411 -0
- package/dist/chunk-YCDCQSYH.js.map +1 -0
- package/dist/{chunk-CWJ4OU6W.mjs → chunk-ZDAZYIXB.mjs} +2 -4
- package/dist/chunk-ZDAZYIXB.mjs.map +1 -0
- package/dist/feedback.d.mts +20 -8
- package/dist/feedback.d.ts +20 -8
- package/dist/feedback.js +5 -5
- package/dist/feedback.mjs +4 -4
- package/dist/fonts/HumanSans-BlackOblique.otf +0 -0
- package/dist/fonts/HumanSans-Thin.otf +0 -0
- package/dist/fonts/HumanSans-ThinOblique.otf +0 -0
- package/dist/fonts/human-sans-font.css +88 -0
- package/dist/fonts/human-sans.css +3 -0
- package/dist/fonts/inter.css +3 -0
- package/dist/icons.d.mts +2 -3
- package/dist/icons.d.ts +2 -3
- package/dist/icons.js +2 -2
- package/dist/icons.mjs +1 -1
- package/dist/index.d.mts +37 -8
- package/dist/index.d.ts +37 -8
- package/dist/index.js +23 -90
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +46 -113
- package/dist/index.mjs.map +1 -1
- package/dist/inputs.d.mts +23 -3
- package/dist/inputs.d.ts +23 -3
- package/dist/inputs.js +5 -5
- package/dist/inputs.js.map +1 -1
- package/dist/inputs.mjs +15 -15
- package/dist/layout.d.mts +37 -283
- package/dist/layout.d.ts +37 -283
- package/dist/layout.js +8 -32
- package/dist/layout.js.map +1 -1
- package/dist/layout.mjs +16 -40
- package/dist/navigation.d.mts +9 -114
- package/dist/navigation.d.ts +9 -114
- package/dist/navigation.js +5 -9
- package/dist/navigation.js.map +1 -1
- package/dist/navigation.mjs +6 -10
- package/dist/third-party.d.mts +3 -527
- package/dist/third-party.d.ts +3 -527
- package/dist/third-party.js +2 -40
- package/dist/third-party.js.map +1 -1
- package/dist/third-party.mjs +3 -41
- package/dist/tokens.css +45 -71
- package/dist/utilities.js +2 -4
- package/dist/utilities.js.map +1 -1
- package/dist/utilities.mjs +2 -4
- package/package.json +23 -9
- package/dist/WorkflowNode-BnxXO6t_.d.mts +0 -46
- package/dist/WorkflowNode-BnxXO6t_.d.ts +0 -46
- package/dist/chunk-27JEWSWA.mjs +0 -233
- package/dist/chunk-27JEWSWA.mjs.map +0 -1
- package/dist/chunk-3WCMINE5.mjs.map +0 -1
- package/dist/chunk-463SRKKD.js.map +0 -1
- package/dist/chunk-6EUAU67C.mjs.map +0 -1
- package/dist/chunk-AIY6222Q.js +0 -11
- package/dist/chunk-AIY6222Q.js.map +0 -1
- package/dist/chunk-AJBM7IE6.mjs +0 -2366
- package/dist/chunk-AJBM7IE6.mjs.map +0 -1
- package/dist/chunk-CCN6M4LI.js.map +0 -1
- package/dist/chunk-CUCKULYC.mjs.map +0 -1
- package/dist/chunk-CWJ4OU6W.mjs.map +0 -1
- package/dist/chunk-EOF3QNPF.js.map +0 -1
- package/dist/chunk-FFZ5S7PQ.mjs.map +0 -1
- package/dist/chunk-FN5YL4BK.js.map +0 -1
- package/dist/chunk-HLH2VWXL.js +0 -2658
- package/dist/chunk-HLH2VWXL.js.map +0 -1
- package/dist/chunk-IE6GCHDI.mjs.map +0 -1
- package/dist/chunk-JS4IB5IU.mjs.map +0 -1
- package/dist/chunk-KF2Y7HO3.js.map +0 -1
- package/dist/chunk-KVBMZNWT.mjs.map +0 -1
- package/dist/chunk-L2TIGA7I.js.map +0 -1
- package/dist/chunk-MNM6HE72.js.map +0 -1
- package/dist/chunk-NXTVJ6PY.js.map +0 -1
- package/dist/chunk-PWF2NJDB.mjs.map +0 -1
- package/dist/chunk-QD6RLAO2.mjs +0 -11
- package/dist/chunk-QD6RLAO2.mjs.map +0 -1
- package/dist/chunk-QY65OUAC.mjs.map +0 -1
- package/dist/chunk-QYYQYZHV.js.map +0 -1
- package/dist/chunk-T7LPABOL.mjs +0 -595
- package/dist/chunk-T7LPABOL.mjs.map +0 -1
- package/dist/chunk-THQKYTQE.js.map +0 -1
- package/dist/chunk-X7E6GMFL.js +0 -233
- package/dist/chunk-X7E6GMFL.js.map +0 -1
- package/dist/chunk-XF66WQZE.mjs +0 -1535
- package/dist/chunk-XF66WQZE.mjs.map +0 -1
- package/dist/chunk-YQOZPLTY.js +0 -1535
- package/dist/chunk-YQOZPLTY.js.map +0 -1
- package/dist/chunk-ZGCN5WCG.js.map +0 -1
- package/dist/index.css +0 -79
- package/dist/index.css.map +0 -1
- /package/dist/{HumanSans-Black-C4YJONK7.otf → fonts/HumanSans-Black.otf} +0 -0
- /package/dist/{HumanSans-Bold-4EAJ3L3T.otf → fonts/HumanSans-Bold.otf} +0 -0
- /package/dist/{HumanSans-BoldOblique-4D325T4F.otf → fonts/HumanSans-BoldOblique.otf} +0 -0
- /package/dist/{HumanSans-ExtraLight-VL7DEKQ4.otf → fonts/HumanSans-ExtraLight.otf} +0 -0
- /package/dist/{HumanSans-ExtraLightOblique-VK2JTUXF.otf → fonts/HumanSans-ExtraLightOblique.otf} +0 -0
- /package/dist/{HumanSans-Light-YV7AFKRB.otf → fonts/HumanSans-Light.otf} +0 -0
- /package/dist/{HumanSans-LightOblique-VIXV7QA6.otf → fonts/HumanSans-LightOblique.otf} +0 -0
- /package/dist/{HumanSans-Medium-UULJ3PIR.otf → fonts/HumanSans-Medium.otf} +0 -0
- /package/dist/{HumanSans-MediumOblique-M7FHDZRS.otf → fonts/HumanSans-MediumOblique.otf} +0 -0
- /package/dist/{HumanSans-Regular-QMFEP3F6.otf → fonts/HumanSans-Regular.otf} +0 -0
- /package/dist/{HumanSans-RegularOblique-YPKQJAAM.otf → fonts/HumanSans-RegularOblique.otf} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/layout/Logo.tsx","../src/components/layout/Dialog.tsx","../src/components/layout/KpiCard.tsx","../src/components/layout/AgentAvatar.tsx","../src/components/layout/NumberedList.tsx","../src/components/layout/Drawer.tsx","../src/components/layout/drawerWidth.ts","../src/components/layout/MetaField.tsx","../src/components/layout/ScrollableRow.tsx","../src/components/layout/SectionRow.tsx","../src/components/layout/GradientSurface.tsx","../src/components/layout/DefinitionRow.tsx","../src/components/layout/PanelDialog.tsx","../src/components/layout/SplitDialogContent.tsx","../src/components/layout/List.tsx","../src/components/layout/Avatar.tsx","../src/components/layout/Table.tsx","../src/components/layout/Grid.tsx","../src/components/layout/Breadcrumbs.tsx","../src/components/layout/Accordion.tsx","../src/components/layout/Paper.tsx","../src/components/layout/Divider.tsx","../src/components/layout/Stack.tsx","../src/components/layout/Box.tsx","../src/components/layout/Container.tsx","../src/components/layout/AppBar.tsx","../src/components/layout/Collapse.tsx","../src/components/layout/EntityHeader/EntityHeader.tsx"],"sourcesContent":["import Stack from '@mui/material/Stack';\nimport { styled } from '@mui/material/styles';\nimport { svgIconClasses } from '@mui/material/SvgIcon';\nimport { PropsWithChildren, ReactElement } from 'react';\nimport { CereIcon } from '../icons/CereIcon';\n\ntype LogoSize = 'large' | 'medium' | 'small';\n\nexport type LogoProps = PropsWithChildren<{\n icon?: ReactElement;\n size?: LogoSize;\n}>;\n\nconst sizesMap: Record<LogoSize, number> = {\n large: 38,\n medium: 32,\n small: 24,\n};\n\nconst Container = styled(Stack)({\n [`& .${svgIconClasses.root}`]: {\n fontSize: 'inherit',\n },\n});\n\nexport const Logo = ({ children, size = 'medium', icon = <CereIcon color=\"primary\" /> }: LogoProps) => (\n <Container direction=\"row\" alignItems=\"center\" spacing={2} fontSize={sizesMap[size]}>\n {icon}\n {children && <Stack>{children}</Stack>}\n </Container>\n);\n","import React, { ReactNode } from 'react';\nimport MuiDialog from '@mui/material/Dialog';\nimport type { DialogProps as MuiDialogProps } from '@mui/material/Dialog';\nimport DialogTitle from '@mui/material/DialogTitle';\nimport DialogContent from '@mui/material/DialogContent';\nimport DialogActions from '@mui/material/DialogActions';\nimport Button from '@mui/material/Button';\nimport IconButton from '@mui/material/IconButton';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Divider from '@mui/material/Divider';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport CloseIcon from '@mui/icons-material/Close';\n\n/**\n * **PaperProps merge order.**\n *\n * The component pre-sets `PaperProps.sx = { minHeight: ... }` and then\n * spreads consumer-supplied `PaperProps` over it:\n * ```\n * PaperProps={{ sx: { minHeight: ... }, ...dialogProps.PaperProps }}\n * ```\n * Consumer `PaperProps.sx` will override the component's `minHeight`.\n * Consumer `PaperProps` keys other than `sx` are passed through unchanged.\n * To extend the `sx` rather than replace it, pass an array:\n * ```\n * PaperProps={{ sx: [{ minHeight: '400px' }, { borderRadius: 2 }] }}\n * ```\n */\nexport interface DialogProps extends Omit<MuiDialogProps, 'title'> {\n open: boolean;\n title: ReactNode;\n onClose: () => void;\n onSubmit?: () => void;\n submitLabel?: string;\n cancelLabel?: string;\n isLoading?: boolean;\n disableSubmit?: boolean;\n showActions?: boolean;\n headerAction?: ReactNode;\n fullWidth?: boolean;\n maxWidth?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n children: ReactNode;\n dividers?: boolean;\n confirmBeforeClose?: boolean;\n /**\n * Custom actions to render instead of default actions\n * If provided, showActions is ignored and custom actions are used\n */\n customActions?: ReactNode;\n}\n\nexport const Dialog: React.FC<DialogProps> = ({\n open,\n title,\n onClose,\n onSubmit,\n submitLabel = 'Save',\n cancelLabel = 'Cancel',\n isLoading = false,\n disableSubmit = false,\n showActions = true,\n headerAction,\n fullWidth = true,\n maxWidth = 'md',\n children,\n dividers = true,\n confirmBeforeClose = false,\n customActions,\n ...dialogProps\n}) => {\n const handleCloseAttempt = (e?: React.MouseEvent) => {\n if (e) e.stopPropagation();\n onClose();\n };\n\n return (\n <MuiDialog\n open={open}\n onClose={(_, reason) => {\n if (confirmBeforeClose) return;\n if (reason === 'backdropClick' || reason === 'escapeKeyDown') {\n onClose();\n }\n }}\n fullWidth={fullWidth}\n maxWidth={maxWidth}\n {...dialogProps}\n PaperProps={{\n sx: { minHeight: dialogProps.fullScreen ? undefined : 'auto' },\n ...dialogProps.PaperProps\n }}\n >\n <DialogTitle sx={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', p: 2 }}>\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n {typeof title === 'string' ? (\n <Typography variant=\"h6\">{title}</Typography>\n ) : (\n title\n )}\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n {headerAction}\n <IconButton\n edge=\"end\"\n color=\"inherit\"\n onClick={handleCloseAttempt}\n aria-label=\"close\"\n >\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n\n {dividers && <Divider />}\n\n <DialogContent dividers={dividers}>\n {children}\n </DialogContent>\n\n {(showActions || customActions) && (\n <>\n {dividers && <Divider />}\n <DialogActions>\n {customActions || (\n <>\n <Button\n onClick={handleCloseAttempt}\n disabled={isLoading}\n >\n {cancelLabel}\n </Button>\n {onSubmit && (\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={onSubmit}\n disabled={disableSubmit || isLoading}\n startIcon={isLoading ? <CircularProgress size={20} /> : undefined}\n >\n {submitLabel}\n </Button>\n )}\n </>\n )}\n </DialogActions>\n </>\n )}\n </MuiDialog>\n );\n};\n\n","import * as React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { Theme } from '@mui/material/styles';\n\nexport type KpiTone = 'violet' | 'blue' | 'green' | 'orange' | 'pink' | 'neutral';\n\nexport interface KpiCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Optional leading glyph rendered before the label row. */\n icon?: React.ReactNode;\n /** Short caption rendered in the eyebrow style above the value. */\n label: string;\n /** The headline KPI value. Can be a string, number, or composed node. */\n value: React.ReactNode;\n /** Optional sub line rendered under the value. */\n sub?: string;\n /**\n * Accent color applied to the left stripe.\n * @default 'neutral'\n */\n tone?: KpiTone;\n}\n\nconst toneColor = (tone: KpiTone, theme: Theme): string => {\n switch (tone) {\n case 'violet':\n return theme.palette.primary.main;\n case 'blue':\n return theme.palette.info.main;\n case 'green':\n return theme.palette.success.main;\n case 'orange':\n return theme.palette.warning.main;\n case 'pink':\n return theme.palette.secondary?.main ?? theme.palette.primary.main;\n case 'neutral':\n default:\n return theme.palette.grey[300];\n }\n};\n\n/**\n * KpiCard — a single metric tile for dashboards.\n *\n * Lays out an optional icon + uppercase label on top, a large value beneath,\n * and an optional sub line. A vertical stripe on the left uses `tone` for the\n * accent color. All typography pulls from the DS-augmented variants.\n *\n * Lives in `layout/` per the constitution: KpiCard is a data-display tile,\n * not a feedback signal.\n */\nexport const KpiCard = React.forwardRef<HTMLDivElement, KpiCardProps>(\n function KpiCard({ icon, label, value, sub, tone = 'neutral', ...rest }, ref) {\n return (\n <Box\n ref={ref}\n data-tone={tone}\n {...rest}\n sx={(theme) => ({\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n padding: 2,\n paddingLeft: 2.5,\n borderRadius: 1.5,\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n overflow: 'hidden',\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: 4,\n backgroundColor: toneColor(tone, theme),\n },\n })}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.75 }}>\n {icon && (\n <Box sx={{ display: 'inline-flex', color: 'text.secondary' }}>{icon}</Box>\n )}\n <Typography variant=\"eyebrow\" component=\"span\">\n {label}\n </Typography>\n </Box>\n <Typography variant=\"panelTitle\" component=\"div\">\n {value}\n </Typography>\n {sub && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary' }}>\n {sub}\n </Typography>\n )}\n </Box>\n );\n },\n);\n","import * as React from 'react';\nimport Box from '@mui/material/Box';\nimport type { Theme } from '@mui/material/styles';\n\n/**\n * djb2-ish hash. Deterministic, ASCII-safe, stable across runtimes. The\n * only requirement is that it be evenly distributed mod the palette\n * length so the same `seed` always picks the same shade.\n */\nconst hashSeed = (seed: string): number => {\n let h = 5381;\n for (let i = 0; i < seed.length; i += 1) {\n h = ((h << 5) + h + seed.charCodeAt(i)) & 0xffffffff;\n }\n return Math.abs(h);\n};\n\n/**\n * Brand-coloured palette resolved from theme tokens at render time. Three\n * distinct shades, no hard-coded hex (the earlier draft duplicated entries\n * and pulled from CSS vars).\n */\nconst palette = (theme: Theme): readonly string[] => [\n theme.palette.primary.main,\n theme.palette.primary.dark,\n theme.palette.secondary?.main ?? theme.palette.primary.main,\n];\n\nexport interface AgentAvatarProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Stable string keyed to the agent identity; same seed always picks the same palette. */\n seed: string;\n /** Used as the source of the initial glyph (first letter, upper-cased). */\n name: string;\n /** Pixel size. Accepts the three preset sizes or any number. @default 40 */\n size?: 32 | 40 | 56 | number;\n /** Adds an outer drop shadow for use over plain surfaces. */\n shadow?: boolean;\n /** When set, renders an `<img>` in place of the initial. */\n iconUrl?: string;\n /** Optional override for the accessible label; defaults to `name`. */\n ariaLabel?: string;\n}\n\n/**\n * Brand-coloured avatar tile that auto-derives a palette shade from `seed`.\n *\n * Renders the first letter of `name` by default; if `iconUrl` is provided,\n * renders the image full-bleed instead. White glyph; optional outer\n * shadow pulled from the MUI theme elevation scale.\n */\nexport const AgentAvatar = React.forwardRef<HTMLDivElement, AgentAvatarProps>(\n function AgentAvatar(\n { seed, name, size = 40, shadow = false, iconUrl, ariaLabel, ...rest },\n ref,\n ) {\n const initial = (name?.trim()?.[0] ?? '?').toUpperCase();\n const radius = Math.round(size * 0.28);\n\n return (\n <Box\n ref={ref}\n role=\"img\"\n aria-label={ariaLabel ?? name}\n {...rest}\n sx={(theme) => {\n const colors = palette(theme);\n const paletteIndex = hashSeed(seed) % colors.length;\n return {\n width: size,\n height: size,\n borderRadius: `${radius}px`,\n backgroundColor: colors[paletteIndex],\n color: theme.palette.common.white,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 700,\n fontSize: Math.round(size * 0.42),\n lineHeight: 1,\n overflow: 'hidden',\n flexShrink: 0,\n boxShadow: shadow ? theme.shadows[3] : 'inset 0 1px 0 rgba(255,255,255,0.2)',\n userSelect: 'none',\n };\n }}\n >\n {iconUrl ? (\n <Box\n component=\"img\"\n src={iconUrl}\n alt=\"\"\n sx={{ width: '100%', height: '100%', objectFit: 'cover' }}\n />\n ) : (\n <span aria-hidden=\"true\">{initial}</span>\n )}\n </Box>\n );\n },\n);\n","import * as React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport type { Theme } from '@mui/material/styles';\n\nexport type NumberedListTone =\n | 'violet'\n | 'blue'\n | 'green'\n | 'orange'\n | 'pink'\n | 'neutral';\n\nexport interface NumberedListItem {\n /** Row title rendered next to the badge. */\n title: string;\n /** Optional secondary line under the title. */\n detail?: React.ReactNode;\n /** Optional trailing action (button, link, chip) aligned to the right. */\n cta?: React.ReactNode;\n}\n\nexport interface NumberedListProps\n extends Omit<React.OlHTMLAttributes<HTMLOListElement>, 'children'> {\n /** Rows to render in order. */\n items: NumberedListItem[];\n /** Accent color for the numbered badges. @default 'violet' */\n tone?: NumberedListTone;\n /** First badge number. @default 1 */\n startAt?: number;\n}\n\nconst toneColors = (tone: NumberedListTone, theme: Theme): { bg: string; fg: string } => {\n switch (tone) {\n case 'blue':\n return { bg: theme.palette.info.light, fg: theme.palette.info.dark };\n case 'green':\n return { bg: theme.palette.success.light, fg: theme.palette.success.dark };\n case 'orange':\n return { bg: theme.palette.warning.light, fg: theme.palette.warning.dark };\n case 'pink':\n return {\n bg: theme.palette.secondary?.light ?? theme.palette.primary.light,\n fg: theme.palette.secondary?.main ?? theme.palette.primary.main,\n };\n case 'neutral':\n return { bg: theme.palette.grey[100], fg: theme.palette.text.primary };\n case 'violet':\n default:\n return { bg: theme.palette.primary.light, fg: theme.palette.primary.main };\n }\n};\n\n/**\n * NumberedList — ordered list with numbered tinted badges.\n *\n * Use for onboarding checklists, sequence walkthroughs, and other ordered\n * step lists. Badges pull their tint from the design system palette via\n * `tone`. `startAt` lets you chain lists across pages without resetting.\n */\nexport const NumberedList = React.forwardRef<HTMLOListElement, NumberedListProps>(\n function NumberedList({ items, tone = 'violet', startAt = 1, ...rest }, ref) {\n return (\n <Box\n ref={ref}\n component=\"ol\"\n data-tone={tone}\n {...rest}\n sx={(theme) => {\n const { bg, fg } = toneColors(tone, theme);\n return {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 1.5,\n '--numbered-list-bg': bg,\n '--numbered-list-fg': fg,\n };\n }}\n >\n {items.map((item, idx) => (\n <Box\n key={`${idx}-${item.title}`}\n component=\"li\"\n sx={{ display: 'flex', alignItems: 'flex-start', gap: 1.5 }}\n >\n <Box\n aria-hidden=\"true\"\n sx={{\n flexShrink: 0,\n width: 28,\n height: 28,\n borderRadius: '50%',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontWeight: 700,\n fontSize: 13,\n backgroundColor: 'var(--numbered-list-bg)',\n color: 'var(--numbered-list-fg)',\n }}\n >\n {startAt + idx}\n </Box>\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography variant=\"subtitle1\" component=\"div\">\n {item.title}\n </Typography>\n {item.detail && (\n <Typography\n variant=\"body2\"\n component=\"div\"\n sx={{ color: 'text.secondary', mt: 0.25 }}\n >\n {item.detail}\n </Typography>\n )}\n </Box>\n {item.cta && <Box sx={{ flexShrink: 0 }}>{item.cta}</Box>}\n </Box>\n ))}\n </Box>\n );\n },\n);\n","import React, { ReactNode } from 'react';\nimport MuiDrawer, { DrawerProps as MuiDrawerProps } from '@mui/material/Drawer';\nimport { styled } from '@mui/material/styles';\nimport Box from '@mui/material/Box';\nimport type { BoxProps } from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport Typography from '@mui/material/Typography';\nimport Divider from '@mui/material/Divider';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport CloseIcon from '@mui/icons-material/Close';\nimport { resolveDrawerWidth, type DrawerWidth } from './drawerWidth';\n\nexport interface DrawerProps extends Omit<MuiDrawerProps, 'title'> {\n /**\n * Width of the drawer when open. Accepts a single value (number or CSS\n * string like `\"100vw\"`) or a responsive object keyed by MUI breakpoint\n * (`{ xs, sm, md, lg, xl }`). Responsive widths are mobile-first: `xs`\n * is the base, each named breakpoint overrides at that breakpoint and up.\n * @default 400 for temporary/persistent, 240 for permanent\n */\n width?: DrawerWidth;\n /**\n * Width of the drawer when collapsed (mini variant)\n * @default 72\n */\n miniWidth?: number;\n /**\n * Whether the drawer is in collapsed/mini state\n * @default false\n */\n collapsed?: boolean;\n /**\n * Title to display in the drawer header\n */\n title?: ReactNode;\n /**\n * Custom header content (replaces title if provided)\n */\n header?: ReactNode;\n /**\n * Show close button in header\n * @default true for temporary variant, false for permanent\n */\n showCloseButton?: boolean;\n /**\n * Tab labels for tabbed drawer content\n */\n tabs?: string[];\n /**\n * Active tab index\n */\n activeTab?: number;\n /**\n * Callback when tab changes\n */\n onTabChange?: (index: number) => void;\n /**\n * Footer content (actions, buttons, etc.)\n */\n footer?: ReactNode;\n /**\n * Props for drawer content container\n */\n contentProps?: BoxProps;\n /**\n * Anchor position\n * @default 'right'\n */\n anchor?: 'left' | 'right' | 'top' | 'bottom';\n /**\n * Top offset in pixels (e.g., for header + breadcrumbs)\n * @default 0\n */\n topOffset?: number;\n}\n\nconst StyledDrawer = styled(MuiDrawer, {\n shouldForwardProp: (prop) => prop !== 'width' && prop !== 'miniWidth' && prop !== 'collapsed' && prop !== 'topOffset',\n})<Pick<DrawerProps, 'width' | 'miniWidth' | 'collapsed' | 'topOffset'>>(({ theme, width, miniWidth = 72, collapsed, topOffset = 0 }) => {\n const widthCss = collapsed\n ? { width: miniWidth }\n : resolveDrawerWidth(width, theme, 240);\n return {\n ...widthCss,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n ...widthCss,\n boxSizing: 'border-box',\n boxShadow: '0px 2px 10px rgba(0, 0, 0, 0.05)',\n transition: theme.transitions.create(['width', 'top', 'height'], {\n easing: theme.transitions.easing.sharp,\n duration: theme.transitions.duration.enteringScreen,\n }),\n overflow: 'visible', // Let internal content handle scrolling\n display: 'flex',\n flexDirection: 'column',\n top: `${topOffset}px !important`,\n height: topOffset > 0 ? `calc(100% - ${topOffset}px) !important` : '100%',\n zIndex: `${theme.zIndex.modal} !important`, // Use modal zIndex to be above everything except AppBar (which is modal + 1)\n },\n };\n});\n\n/**\n * Drawer component for navigation drawers and side panels\n * Can be used as a replacement for Dialog for better UX\n * \n * @example\n * ```tsx\n * // Simple drawer\n * <Drawer open={true} variant=\"temporary\" width={400} title=\"Settings\" onClose={handleClose}>\n * <Box p={2}>Content here</Box>\n * </Drawer>\n * \n * // Drawer with tabs\n * <Drawer \n * open={true} \n * variant=\"temporary\" \n * width={600} \n * title=\"Edit Stream\"\n * tabs={['General', 'Rules', 'Settings']}\n * activeTab={activeTab}\n * onTabChange={setActiveTab}\n * onClose={handleClose}\n * >\n * <Box p={2}>{tabContent}</Box>\n * </Drawer>\n * ```\n */\nexport const Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(function Drawer(\n {\n width,\n miniWidth = 72,\n collapsed = false,\n title,\n header,\n showCloseButton,\n tabs,\n activeTab = 0,\n onTabChange,\n footer,\n contentProps,\n anchor = 'right',\n variant = 'temporary',\n topOffset = 0,\n children,\n onClose,\n ...props\n },\n ref,\n) {\n // Determine default width based on variant\n const defaultWidth = variant === 'temporary' || variant === 'persistent' ? 400 : 240;\n const finalWidth = width ?? defaultWidth;\n \n // Determine if close button should be shown\n const shouldShowClose = showCloseButton ?? (variant === 'temporary' || variant === 'persistent');\n \n // Determine if we should show header\n const hasHeader = title || header || shouldShowClose || tabs;\n \n return (\n <StyledDrawer\n ref={ref}\n width={finalWidth}\n miniWidth={miniWidth}\n collapsed={collapsed}\n anchor={anchor}\n variant={variant}\n topOffset={topOffset}\n onClose={onClose}\n ModalProps={{\n ...props.ModalProps,\n style: {\n zIndex: topOffset > 0 ? undefined : undefined, // Let styled component handle zIndex\n },\n }}\n BackdropProps={{\n ...props.BackdropProps,\n style: {\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n },\n }}\n {...props}\n >\n {hasHeader && (\n <>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n p: 2,\n minHeight: 64,\n borderBottom: 1,\n borderColor: 'divider',\n }}\n >\n {header || (\n <>\n <Box sx={{ flex: 1 }}>\n {typeof title === 'string' ? (\n <Typography variant=\"h6\">{title}</Typography>\n ) : (\n title\n )}\n </Box>\n {shouldShowClose && onClose && (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n onClose(e, 'backdropClick');\n }}\n size=\"small\"\n sx={{ ml: 1 }}\n aria-label=\"close\"\n >\n <CloseIcon />\n </IconButton>\n )}\n </>\n )}\n </Box>\n {tabs && tabs.length > 0 && (\n <Tabs\n value={activeTab}\n onChange={(_, newValue) => onTabChange?.(newValue)}\n variant={tabs.length > 4 ? \"scrollable\" : \"standard\"}\n scrollButtons={tabs.length > 4 ? \"auto\" : false}\n sx={{\n borderBottom: 1,\n borderColor: 'divider',\n px: 2,\n '& .MuiTabs-scrollableContainer': {\n overflow: 'auto',\n },\n }}\n >\n {tabs.map((tab, index) => (\n <Tab key={index} label={tab} />\n ))}\n </Tabs>\n )}\n </>\n )}\n \n <Box\n sx={{\n flex: 1,\n overflow: 'auto',\n display: 'flex',\n flexDirection: 'column',\n }}\n {...contentProps}\n >\n {children}\n </Box>\n \n {footer && (\n <>\n <Divider />\n <Box\n sx={{\n p: 2,\n borderTop: 1,\n borderColor: 'divider',\n }}\n >\n {footer}\n </Box>\n </>\n )}\n </StyledDrawer>\n );\n});\n\nexport default Drawer;\n\n","import type { Theme } from '@mui/material/styles';\n\nexport type DrawerWidthValue = number | string;\n\n/**\n * Per-breakpoint drawer widths. `xs` sets the base width (mobile-first);\n * `sm`/`md`/`lg`/`xl` override at and above the named MUI breakpoint.\n */\nexport interface ResponsiveDrawerWidth {\n xs?: DrawerWidthValue;\n sm?: DrawerWidthValue;\n md?: DrawerWidthValue;\n lg?: DrawerWidthValue;\n xl?: DrawerWidthValue;\n}\n\nexport type DrawerWidth = DrawerWidthValue | ResponsiveDrawerWidth;\n\n/**\n * Resolve a `width` prop into a style object usable by `styled()`.\n *\n * - Number/string input returns a single `{ width }` rule.\n * - Object input produces a mobile-first base width (from `xs`, or\n * `defaultWidth` if `xs` is missing) plus breakpoint-scoped overrides\n * for each of sm/md/lg/xl that was provided.\n */\nexport function resolveDrawerWidth(\n width: DrawerWidth | undefined,\n theme: Theme,\n defaultWidth?: DrawerWidthValue,\n): Record<string, unknown> & { width?: DrawerWidthValue } {\n if (width === undefined) {\n return { width: defaultWidth };\n }\n if (typeof width === 'number' || typeof width === 'string') {\n return { width };\n }\n const base = width.xs ?? defaultWidth;\n const css: Record<string, unknown> & { width?: DrawerWidthValue } = { width: base };\n (['sm', 'md', 'lg', 'xl'] as const).forEach((bp) => {\n const value = width[bp];\n if (value !== undefined) {\n css[theme.breakpoints.up(bp)] = { width: value };\n }\n });\n return css;\n}\n","import React, { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\n\nexport interface MetaFieldProps {\n /** Uppercase eyebrow label displayed above the value. */\n label: string;\n /** Value to display. String values get a `title` attribute for overflow tooltips. */\n value: ReactNode;\n /** Render the value in a monospace font (for IDs, durations, paths). */\n mono?: boolean;\n /**\n * Override the auto-generated `title` attribute. Useful when the value is a\n * ReactNode but you still want a hover tooltip, or to customize the string\n * shown on hover.\n */\n title?: string;\n}\n\n/**\n * MetaField — a compact label-over-value column for metadata lists.\n *\n * Wraps its content in a min-width-0 flex column so it collapses cleanly\n * inside responsive grids. The value truncates with an ellipsis and shows\n * the full text on hover (for string values by default).\n *\n * @example\n * ```tsx\n * <MetaField label=\"Run ID\" value=\"run_abc123\" mono />\n * <MetaField label=\"Status\" value={<StatusBadge status=\"ok\" />} />\n * ```\n */\nexport const MetaField = React.forwardRef<HTMLDivElement, MetaFieldProps>(function MetaField(\n { label, value, mono = false, title },\n ref,\n) {\n const resolvedTitle = title ?? (typeof value === 'string' ? value : undefined);\n return (\n <Box ref={ref} sx={{ display: 'flex', flexDirection: 'column', gap: 0.25, minWidth: 0 }}>\n <Typography\n variant=\"caption\"\n sx={{\n color: 'text.secondary',\n textTransform: 'uppercase',\n letterSpacing: 0.4,\n fontSize: 10,\n fontWeight: 600,\n }}\n >\n {label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{\n fontFamily: mono ? 'monospace' : undefined,\n fontSize: 13,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={resolvedTitle}\n >\n {value}\n </Typography>\n </Box>\n );\n});\n","import React, { useEffect, useRef, useState, ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\n\nconst EDGE_TOLERANCE_PX = 4;\n\nexport interface ScrollableRowProps {\n /** Row content. Rendered in a horizontally-scrolling flex container. */\n children: ReactNode;\n /** Accessible label for the left chevron. @default 'Scroll left' */\n leftLabel?: string;\n /** Accessible label for the right chevron. @default 'Scroll right' */\n rightLabel?: string;\n /**\n * Minimum nudge distance (px) when a chevron is clicked. The component\n * scrolls by max(minNudge, clientWidth * nudgeFraction). @default 160\n */\n minNudge?: number;\n /** Fraction of the viewport scrolled per chevron click. @default 0.6 */\n nudgeFraction?: number;\n}\n\n/**\n * ScrollableRow — a horizontally-scrolling container that reveals chevron\n * buttons at the left and right edges only when content actually overflows.\n *\n * Works with any children (chips, cards, pills). Uses a `ResizeObserver` on\n * both the scroller and its children plus a `MutationObserver` to catch\n * children being added/removed, so the chevrons stay in sync with real\n * layout.\n */\nexport const ScrollableRow: React.FC<ScrollableRowProps> = ({\n children,\n leftLabel = 'Scroll left',\n rightLabel = 'Scroll right',\n minNudge = 160,\n nudgeFraction = 0.6,\n}) => {\n const scrollerRef = useRef<HTMLDivElement>(null);\n const [canLeft, setCanLeft] = useState(false);\n const [canRight, setCanRight] = useState(false);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n\n const update = () => {\n setCanLeft(el.scrollLeft > EDGE_TOLERANCE_PX);\n setCanRight(el.scrollLeft + el.clientWidth < el.scrollWidth - EDGE_TOLERANCE_PX);\n };\n update();\n\n el.addEventListener('scroll', update, { passive: true });\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(update) : null;\n ro?.observe(el);\n for (const c of Array.from(el.children)) ro?.observe(c as Element);\n\n // Only watches direct children of the scroller; if consumers wrap content\n // in an extra layer, the outer ResizeObserver(el) above catches size changes.\n const mo = typeof MutationObserver !== 'undefined'\n ? new MutationObserver(() => {\n for (const c of Array.from(el.children)) ro?.observe(c as Element);\n update();\n })\n : null;\n mo?.observe(el, { childList: true });\n\n return () => {\n el.removeEventListener('scroll', update);\n ro?.disconnect();\n mo?.disconnect();\n };\n }, []);\n\n const nudge = (dir: -1 | 1) => {\n const el = scrollerRef.current;\n if (!el) return;\n el.scrollBy({ left: dir * Math.max(minNudge, el.clientWidth * nudgeFraction), behavior: 'smooth' });\n };\n\n return (\n <Box sx={{ position: 'relative', flex: 1, minWidth: 0 }}>\n <Box\n ref={scrollerRef}\n data-scrollable-row-scroller\n sx={{\n display: 'flex',\n gap: 1,\n overflowX: 'auto',\n overflowY: 'hidden',\n scrollbarWidth: 'thin',\n py: 0.25,\n }}\n >\n {children}\n </Box>\n\n {canLeft && (\n <IconButton\n size=\"small\"\n aria-label={leftLabel}\n onClick={() => nudge(-1)}\n sx={{\n position: 'absolute',\n left: -6,\n top: '50%',\n transform: 'translateY(-50%)',\n bgcolor: 'background.paper',\n boxShadow: 1,\n '&:hover': { bgcolor: 'background.paper' },\n }}\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </IconButton>\n )}\n\n {canRight && (\n <IconButton\n size=\"small\"\n aria-label={rightLabel}\n onClick={() => nudge(1)}\n sx={{\n position: 'absolute',\n right: -6,\n top: '50%',\n transform: 'translateY(-50%)',\n bgcolor: 'background.paper',\n boxShadow: 1,\n '&:hover': { bgcolor: 'background.paper' },\n }}\n >\n <ChevronRightIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n );\n};\n","import React, { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport { ScrollableRow } from './ScrollableRow';\n\nexport interface SectionRowProps {\n /** Section title (e.g. \"Published by alice\"). Rendered as an h2-equivalent. */\n title: ReactNode;\n /** Optional sublabel below the title (e.g. \"3 agents\"). */\n subtitle?: ReactNode;\n /** Optional right-aligned slot in the header (e.g. a \"See all →\" link). */\n action?: ReactNode;\n /** Accessible labels for the scroll chevrons. */\n leftLabel?: string;\n rightLabel?: string;\n /** Tiles / cards rendered inside the horizontally-scrolling track. */\n children: ReactNode;\n}\n\n/**\n * SectionRow — header (title + subtitle + right-side action) on top of a\n * ScrollableRow track. Use for \"category row\" or \"publisher row\" layouts in\n * marketplace / library / dashboard contexts. The scroll mechanics and edge\n * chevrons come from ScrollableRow.\n */\nexport const SectionRow = React.forwardRef<HTMLElement, SectionRowProps>(function SectionRow(\n { title, subtitle, action, leftLabel, rightLabel, children },\n ref,\n) {\n return (\n <Box ref={ref} component=\"section\" sx={{ mb: 4 }}>\n <Box\n component=\"header\"\n sx={{\n display: 'flex',\n alignItems: 'flex-end',\n justifyContent: 'space-between',\n gap: 1.5,\n mb: 1.5,\n }}\n >\n <Box sx={{ minWidth: 0 }}>\n <Typography component=\"h2\" variant=\"h6\" sx={{ m: 0 }}>\n {title}\n </Typography>\n {subtitle && (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {subtitle}\n </Typography>\n )}\n </Box>\n {action && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>{action}</Box>\n )}\n </Box>\n <ScrollableRow leftLabel={leftLabel} rightLabel={rightLabel}>\n {children}\n </ScrollableRow>\n </Box>\n );\n});\n","import React, { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport { robPrimaryPalette, robPaletteExtended } from '../../theme/primitives';\n\n/**\n * Brand-canonical color anchors for palette[0] (ROB identity gradient).\n * Sourced from primitives so a single edit propagates everywhere.\n * Palettes 1-5 are decorative and keep inline hex.\n */\nexport const GRADIENT_ANCHORS_0 = {\n d1: robPaletteExtended.nearBlack2, // #0d0627\n d2: robPaletteExtended.nearBlack4, // #23194b\n ev: robPrimaryPalette.electricViolet, // #8B00EC\n fd: robPrimaryPalette.fandango, // #BD32A7\n} as const;\n\n/**\n * Six brand gradient palettes. Each entry defines the base gradient plus two\n * radial-gradient blob colors stamped on top of it. Add to / re-order this\n * array carefully — the marketplace cycles slides through these indices and\n * relies on a stable visual identity per row.\n *\n * Palette[0] anchors are sourced from GRADIENT_ANCHORS_0 (brand primitives).\n * Palettes 1-5 are decorative; their interpolated stops stay inline.\n */\n/* eslint-disable no-restricted-syntax */\nconst PALETTES = [\n {\n base: `linear-gradient(115deg, ${GRADIENT_ANCHORS_0.d1} 0%, ${GRADIENT_ANCHORS_0.d2} 55%, ${GRADIENT_ANCHORS_0.ev} 130%)`,\n blobA: GRADIENT_ANCHORS_0.fd,\n blobB: GRADIENT_ANCHORS_0.ev,\n },\n { base: 'linear-gradient(115deg, #2a1635 0%, #5b2a55 55%, #c75a8a 130%)', blobA: '#ff7ea8', blobB: '#ffd1a8' },\n { base: 'linear-gradient(115deg, #0e2a2c 0%, #1d5d63 55%, #59c6c4 130%)', blobA: '#59c6c4', blobB: '#2bb0a0' },\n { base: 'linear-gradient(115deg, #131534 0%, #2c3a8c 55%, #6088e8 130%)', blobA: '#6088e8', blobB: '#3b5db8' },\n { base: 'linear-gradient(115deg, #1a0f30 0%, #3d2a78 55%, #8a5cf6 130%)', blobA: '#a892ff', blobB: '#6b4cf0' },\n { base: 'linear-gradient(115deg, #2b1124 0%, #6d2244 55%, #d44a7a 130%)', blobA: '#d44a7a', blobB: '#a8345e' },\n] as const;\n/* eslint-enable no-restricted-syntax */\n\n/** Number of distinct gradient palettes. Useful for sizing slide cycles deterministically. */\nexport const GRADIENT_PALETTE_COUNT = PALETTES.length;\n\nexport interface GradientSurfaceProps {\n /**\n * Which palette to use. Any integer (positive or negative) — the value is\n * wrapped modulo the palette count, so callers can pass their own counter\n * (`rowIndex + tileIndex`, slide index, etc.) without worrying about range.\n */\n index: number;\n /** Optional body rendered over the gradient + blobs. */\n children?: ReactNode;\n /** Style overrides on the surface. */\n sx?: SxProps<Theme>;\n}\n\n/**\n * GradientSurface — a positioned, gradient-painted surface with two soft blob\n * accents. Owns the brand palette cycle so consumers don't redeclare gradient\n * colors per route. Pair with absolute-positioned children for hero artwork.\n */\nexport const GradientSurface = React.forwardRef<HTMLDivElement, GradientSurfaceProps>(\n function GradientSurface({ index, children, sx }, ref) {\n const wrapped = ((index % GRADIENT_PALETTE_COUNT) + GRADIENT_PALETTE_COUNT) % GRADIENT_PALETTE_COUNT;\n const palette = PALETTES[wrapped];\n return (\n <Box\n ref={ref}\n data-gradient-index={wrapped}\n sx={[\n {\n position: 'relative',\n overflow: 'hidden',\n background: palette.base,\n color: 'common.white',\n '&::before, &::after': {\n content: '\"\"',\n position: 'absolute',\n pointerEvents: 'none',\n borderRadius: '50%',\n filter: 'blur(6px)',\n },\n '&::before': {\n width: 460,\n height: 460,\n top: -120,\n right: -120,\n opacity: 0.7,\n background: `radial-gradient(circle, ${palette.blobA} 0%, transparent 70%)`,\n },\n '&::after': {\n width: 520,\n height: 520,\n bottom: -180,\n left: -160,\n opacity: 0.55,\n background: `radial-gradient(circle, ${palette.blobB} 0%, transparent 70%)`,\n },\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n >\n {children}\n </Box>\n );\n },\n);\n","import React, { ReactNode } from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\n\nexport interface DefinitionRowProps {\n /** Optional leading icon (e.g. a scope or category glyph). */\n icon?: ReactNode;\n /** Primary label rendered on the left side. */\n label: ReactNode;\n /** Optional secondary line under the label (e.g. type, scope path). */\n sublabel?: ReactNode;\n /** Primary right-side content (e.g. `read`, `optional`). */\n value?: ReactNode;\n /** Secondary right-side line under the value (e.g. constraint, default). */\n hint?: ReactNode;\n /** Reduce vertical padding for compact lists. */\n dense?: boolean;\n /** Draw a bottom divider. The last row in a list never draws. @default true */\n divider?: boolean;\n}\n\n/**\n * DefinitionRow — `icon · label / sublabel … value / hint` row primitive\n * for description-list style content (scope tables, settings, key/value\n * panels).\n */\nexport const DefinitionRow = React.forwardRef<HTMLDivElement, DefinitionRowProps>(\n function DefinitionRow(\n { icon, label, sublabel, value, hint, dense = false, divider = true },\n ref,\n ) {\n return (\n <Box\n ref={ref}\n data-density={dense ? 'dense' : 'normal'}\n sx={{\n py: dense ? 0.75 : 1.25,\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n ...(divider && {\n borderBottom: '1px solid',\n borderColor: 'divider',\n '&:last-child': { borderBottom: 'none' },\n }),\n }}\n >\n {icon && (\n <Box sx={{ display: 'flex', alignItems: 'center', color: 'text.secondary' }}>\n {icon}\n </Box>\n )}\n <Box sx={{ minWidth: 0, flex: 1 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 500, lineHeight: 1.2 }}>\n {label}\n </Typography>\n {sublabel && (\n <Typography variant=\"caption\" sx={{ color: 'text.secondary' }}>\n {sublabel}\n </Typography>\n )}\n </Box>\n {(value || hint) && (\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-end',\n textAlign: 'right',\n }}\n >\n {value && (\n <Typography variant=\"body2\" sx={{ color: 'text.secondary' }}>\n {value}\n </Typography>\n )}\n {hint && (\n <Typography variant=\"caption\" sx={{ color: 'text.disabled' }}>\n {hint}\n </Typography>\n )}\n </Box>\n )}\n </Box>\n );\n },\n);\n","import { ReactNode, forwardRef } from 'react';\nimport MuiDialog from '@mui/material/Dialog';\nimport IconButton from '@mui/material/IconButton';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport Slide from '@mui/material/Slide';\nimport type { TransitionProps } from '@mui/material/transitions';\nimport type { SxProps, Theme } from '@mui/material/styles';\nimport CloseIcon from '@mui/icons-material/Close';\n\nexport type PanelDialogWidth = 'sm' | 'md' | 'lg' | 'xl';\nexport type PanelDialogSide = 'right' | 'center';\nexport type PanelDialogTransition = 'fade' | 'slide-up' | 'slide-left';\n\nexport interface PanelDialogProps {\n /** Controls visibility. */\n open: boolean;\n /** Fires when the user closes (close button, backdrop click, ESC). */\n onClose: () => void;\n /** Optional title rendered in the header. Used as the dialog accessible name when a string. */\n title?: ReactNode;\n /** Optional right-aligned slot in the header (e.g. install + share buttons). */\n headerActions?: ReactNode;\n /** Panel width. @default 'md' */\n width?: PanelDialogWidth;\n /** Where the panel docks. `right` slides in from the right edge; `center` is a regular centered panel. @default 'right' */\n side?: PanelDialogSide;\n /** Override the accessible name when `title` is not a string. */\n ariaLabel?: string;\n /**\n * Drop the header bar entirely (no title row, no border). The close button\n * still renders but floats absolute over the top-right of the body. Use when\n * the body content has its own hero / chrome.\n */\n hideHeader?: boolean;\n /** Style overrides on the dialog paper (border-radius, shadow, width tweaks). */\n paperSx?: SxProps<Theme>;\n /** Style overrides on the modal backdrop (e.g. tint, blur). */\n backdropSx?: SxProps<Theme>;\n /**\n * Entry transition. Defaults to `slide-left` for `side='right'` and `fade`\n * for `side='center'`.\n */\n transition?: PanelDialogTransition;\n /** Body content. */\n children: ReactNode;\n}\n\nconst WIDTH_PX: Record<PanelDialogWidth, number> = {\n sm: 420,\n md: 640,\n lg: 880,\n xl: 1080,\n};\n\nconst SlideLeft = forwardRef<HTMLElement, TransitionProps & { children: React.ReactElement<unknown, string> }>(\n function SlideLeft(props, ref) {\n return <Slide direction=\"left\" ref={ref} {...props} />;\n },\n);\n\nconst SlideUp = forwardRef<HTMLElement, TransitionProps & { children: React.ReactElement<unknown, string> }>(\n function SlideUp(props, ref) {\n return <Slide direction=\"up\" ref={ref} {...props} />;\n },\n);\n\n/**\n * PanelDialog — a right-anchored (or centered) slide-in panel for detail\n * views, inspectors, and side sheets. Built on MUI Dialog; focus trap and\n * ESC-to-close come from MUI. Use Dialog for centered modal-with-Save/Cancel.\n */\nexport function PanelDialog({\n open,\n onClose,\n title,\n headerActions,\n width = 'md',\n side = 'right',\n ariaLabel,\n hideHeader = false,\n paperSx,\n backdropSx,\n transition,\n children,\n}: PanelDialogProps) {\n const accessibleName = ariaLabel ?? (typeof title === 'string' ? title : undefined);\n const isRight = side === 'right';\n const resolvedTransition: PanelDialogTransition = transition ?? (isRight ? 'slide-left' : 'fade');\n\n const TransitionComponent =\n resolvedTransition === 'slide-left'\n ? SlideLeft\n : resolvedTransition === 'slide-up'\n ? SlideUp\n : undefined;\n\n const paperBaseSx: SxProps<Theme> = {\n width: WIDTH_PX[width],\n maxWidth: '100%',\n // Lay paper children out as a flex column so the body can `flex: 1` and\n // own its own scroll region.\n display: 'flex',\n flexDirection: 'column',\n ...(isRight && {\n position: 'absolute',\n right: 0,\n top: 0,\n bottom: 0,\n margin: 0,\n // Use dynamic viewport units so mobile browsers (esp. iOS Safari) don't\n // pop the layout when the URL bar shows/hides.\n maxHeight: '100dvh',\n height: '100dvh',\n borderRadius: 0,\n }),\n };\n\n return (\n <MuiDialog\n open={open}\n onClose={onClose}\n slots={TransitionComponent ? { transition: TransitionComponent } : undefined}\n slotProps={{\n paper: {\n 'aria-label': accessibleName,\n sx: [paperBaseSx, ...(Array.isArray(paperSx) ? paperSx : [paperSx])],\n },\n ...(backdropSx ? { backdrop: { sx: backdropSx } } : {}),\n }}\n >\n {!hideHeader && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n px: 2,\n py: 1.5,\n borderBottom: '1px solid',\n borderColor: 'divider',\n }}\n >\n <Box sx={{ display: 'flex', alignItems: 'center', minWidth: 0 }}>\n {typeof title === 'string' ? (\n <Typography variant=\"h6\" noWrap>\n {title}\n </Typography>\n ) : (\n title\n )}\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n {headerActions}\n <IconButton aria-label=\"Close\" onClick={onClose} edge=\"end\" size=\"small\">\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </Box>\n )}\n\n {hideHeader && (\n <IconButton\n aria-label=\"Close\"\n onClick={onClose}\n size=\"small\"\n sx={{\n position: 'absolute',\n top: 12,\n right: 12,\n zIndex: 2,\n bgcolor: 'background.paper',\n boxShadow: 1,\n '&:hover': { bgcolor: 'background.paper' },\n }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n )}\n\n <Box sx={{ flex: 1, overflow: 'auto', minHeight: 0 }}>{children}</Box>\n </MuiDialog>\n );\n}\n","import React from 'react';\nimport Box from '@mui/material/Box';\nimport type { SxProps, Theme } from '@mui/material/styles';\n\nexport interface SplitDialogContentProps {\n left: React.ReactNode;\n right: React.ReactNode;\n /** Width of the right (aside) column in px. @default 320 */\n rightWidth?: number;\n /** Viewport breakpoint (px) below which the layout collapses to one column. @default 860 */\n collapseBelow?: number;\n sx?: SxProps<Theme>;\n}\n\n/**\n * Two-column dialog body used by detail / info modals: primary content on\n * the left, sticky meta panel on the right. Collapses to a single column on\n * narrow viewports.\n *\n * Compose inside a `<PanelDialog>`:\n * <PanelDialog ...>\n * <SplitDialogContent left={...} right={...} />\n * </PanelDialog>\n */\nexport const SplitDialogContent = React.forwardRef<HTMLDivElement, SplitDialogContentProps>(\n function SplitDialogContent({ left, right, rightWidth = 320, collapseBelow = 860, sx }, ref) {\n return (\n <Box\n ref={ref}\n sx={{\n display: 'grid',\n gridTemplateColumns: `1fr ${rightWidth}px`,\n gap: '28px',\n // Right padding reserves room for the floating close button on PanelDialog.\n padding: '28px 56px 36px 36px',\n overflowY: 'auto',\n [`@media (max-width: ${collapseBelow}px)`]: {\n gridTemplateColumns: '1fr',\n padding: '22px 56px 28px 22px',\n },\n ...sx,\n }}\n >\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: '22px', minWidth: 0 }}>\n {left}\n </Box>\n <Box component=\"aside\" sx={{ display: 'flex', flexDirection: 'column', gap: '14px' }}>\n {right}\n </Box>\n </Box>\n );\n});\n","import React from 'react';\nimport MuiList from '@mui/material/List';\nimport type { ListProps as MuiListProps } from '@mui/material/List';\nimport MuiListItem from '@mui/material/ListItem';\nimport type { ListItemProps as MuiListItemProps } from '@mui/material/ListItem';\nimport ListItemText from '@mui/material/ListItemText';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction';\nimport { styled } from '@mui/material/styles';\nexport type ListProps = MuiListProps\n\nexport const List = React.forwardRef<HTMLUListElement, ListProps>(function List(props, ref) {\n return <MuiList ref={ref} {...props} />;\n});\n\nexport interface ListItemProps extends MuiListItemProps {\n primary?: React.ReactNode;\n secondary?: React.ReactNode;\n icon?: React.ReactNode;\n action?: React.ReactNode;\n hoverable?: boolean;\n}\n\nconst StyledListItem = styled(MuiListItem, {\n shouldForwardProp: (prop) => prop !== 'hoverable',\n})<{ hoverable?: boolean }>(({ hoverable = true, theme }) => ({\n border: `1px solid ${theme.palette.grey[200]}`,\n borderRadius: 8,\n marginBottom: 8,\n ...(hoverable && {\n '&:hover': {\n backgroundColor: theme.palette.grey[50],\n },\n }),\n}));\n\nexport const ListItem = React.forwardRef<HTMLLIElement, ListItemProps>(function ListItem(\n { primary, secondary, icon, action, hoverable = true, children, ...props },\n ref,\n) {\n return (\n <StyledListItem ref={ref} hoverable={hoverable} {...props}>\n {icon && <ListItemIcon>{icon}</ListItemIcon>}\n {(primary || secondary) && (\n <ListItemText\n primary={primary}\n secondary={secondary}\n />\n )}\n {children}\n {action && (action)}\n </StyledListItem>\n );\n});\n\nexport { ListItemText, ListItemIcon, ListItemSecondaryAction };\n\n","import React from 'react';\nimport MuiAvatar, { AvatarProps as MuiAvatarProps } from '@mui/material/Avatar';\nimport { styled } from '@mui/material/styles';\nexport interface AvatarProps extends MuiAvatarProps {\n size?: 'small' | 'medium' | 'large' | number;\n}\n\nconst sizeMap = {\n small: 32,\n medium: 40,\n large: 56,\n};\n\nconst StyledAvatar = styled(MuiAvatar, {\n shouldForwardProp: (prop) => prop !== 'avatarSize',\n})<{ avatarSize?: number }>(({ avatarSize = 40, theme }) => ({\n width: avatarSize,\n height: avatarSize,\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n fontWeight: 600,\n}));\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(function Avatar(\n { size = 'medium', ...props },\n ref,\n) {\n const avatarSize = typeof size === 'number' ? size : sizeMap[size];\n\n return <StyledAvatar ref={ref} avatarSize={avatarSize} {...props} />;\n});\n\n","import React from 'react';\nimport MuiTable from '@mui/material/Table';\nimport type { TableProps as MuiTableProps } 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 { styled } from '@mui/material/styles';\nexport interface TableProps extends MuiTableProps {\n stickyHeader?: boolean;\n}\n\nconst StyledTableContainer = styled(TableContainer)(({ theme }) => ({\n borderRadius: 8,\n border: `1px solid ${theme.palette.grey[200]}`,\n}));\n\nconst StyledTableHead = styled(TableHead)(({ theme }) => ({\n backgroundColor: theme.palette.grey[50],\n '& .MuiTableCell-head': {\n fontWeight: 600,\n color: theme.palette.text.primary,\n },\n}));\n\n\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(function Table(\n { stickyHeader = false, children, ...props },\n ref,\n) {\n return (\n <StyledTableContainer>\n <MuiTable ref={ref} stickyHeader={stickyHeader} {...props}>\n {children}\n </MuiTable>\n </StyledTableContainer>\n );\n});\n\nexport interface TableHeaderProps {\n columns: Array<{\n id: string;\n label: string;\n sortable?: boolean;\n align?: 'left' | 'center' | 'right';\n }>;\n orderBy?: string;\n order?: 'asc' | 'desc';\n onSort?: (columnId: string) => void;\n}\n\nexport const TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n function TableHeader({ columns, orderBy, order = 'asc', onSort }, ref) {\n return (\n <StyledTableHead ref={ref}>\n <TableRow>\n {columns.map((column) => (\n <TableCell key={column.id} align={column.align || 'left'}>\n {column.sortable && onSort ? (\n <TableSortLabel\n active={orderBy === column.id}\n direction={orderBy === column.id ? order : 'asc'}\n onClick={() => onSort(column.id)}\n >\n {column.label}\n </TableSortLabel>\n ) : (\n column.label\n )}\n </TableCell>\n ))}\n </TableRow>\n </StyledTableHead>\n );\n },\n);\n\nexport { TableBody, TableCell, TableContainer, TableHead, TableRow, TableSortLabel };\n\n","export { default as Grid } from '@mui/material/Grid2';\nexport type { Grid2Props as GridProps } from '@mui/material/Grid2';\n\n","import React from 'react';\nimport MuiBreadcrumbs, { BreadcrumbsProps as MuiBreadcrumbsProps } from '@mui/material/Breadcrumbs';\nimport Link from '@mui/material/Link';\nimport Typography from '@mui/material/Typography';\nimport { styled } from '@mui/material/styles';\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps extends Omit<MuiBreadcrumbsProps, 'children'> {\n items: BreadcrumbItem[];\n}\n\nconst StyledBreadcrumbs = styled(MuiBreadcrumbs)(({ theme }) => ({\n '& .MuiBreadcrumbs-ol': {\n flexWrap: 'nowrap',\n },\n '& .MuiBreadcrumbs-separator': {\n color: theme.palette.text.secondary,\n },\n}));\n\nconst StyledLink = styled(Link)(({ theme }) => ({\n color: theme.palette.primary.main,\n textDecoration: 'none',\n '&:hover': {\n textDecoration: 'underline',\n },\n}));\n\nexport const Breadcrumbs = React.forwardRef<HTMLElement, BreadcrumbsProps>(function Breadcrumbs(\n { items, ...props },\n ref,\n) {\n return (\n <StyledBreadcrumbs ref={ref} {...props}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n if (isLast || (!item.href && !item.onClick)) {\n return (\n <Typography key={index} color=\"text.primary\">\n {item.label}\n </Typography>\n );\n }\n\n return (\n <StyledLink\n key={index}\n href={item.href}\n onClick={(e) => {\n if (item.onClick) {\n e.preventDefault();\n item.onClick();\n }\n }}\n >\n {item.label}\n </StyledLink>\n );\n })}\n </StyledBreadcrumbs>\n );\n});\n\n","import React from 'react';\nimport MuiAccordion from '@mui/material/Accordion';\nimport type { AccordionProps as MuiAccordionProps } from '@mui/material/Accordion';\nimport AccordionSummary from '@mui/material/AccordionSummary';\nimport AccordionDetails from '@mui/material/AccordionDetails';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport { styled } from '@mui/material/styles';\nexport interface AccordionProps extends Omit<MuiAccordionProps, 'children'> {\n title: string;\n children: NonNullable<React.ReactNode>;\n defaultExpanded?: boolean;\n}\n\nconst StyledAccordion = styled(MuiAccordion)(({ theme }) => ({\n borderRadius: 8,\n boxShadow: 'none',\n border: `1px solid ${theme.palette.grey[200]}`,\n '&:before': {\n display: 'none',\n },\n '&.Mui-expanded': {\n margin: 0,\n },\n}));\n\nconst StyledAccordionSummary = styled(AccordionSummary)(({ theme }) => ({\n backgroundColor: theme.palette.grey[50],\n borderRadius: '8px 8px 0 0',\n '&.Mui-expanded': {\n borderRadius: '8px 8px 0 0',\n },\n '& .MuiAccordionSummary-content': {\n margin: '12px 0',\n },\n}));\n\nconst StyledAccordionDetails = styled(AccordionDetails)({\n padding: '16px',\n});\n\nexport const Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(function Accordion(\n { title, children, defaultExpanded = false, ...props },\n ref,\n) {\n return (\n <StyledAccordion ref={ref} defaultExpanded={defaultExpanded} {...props}>\n <StyledAccordionSummary expandIcon={<ExpandMoreIcon />}>\n {title}\n </StyledAccordionSummary>\n <StyledAccordionDetails>{children}</StyledAccordionDetails>\n </StyledAccordion>\n );\n});\n\n","import React from 'react';\nimport MuiPaper, { PaperProps as MuiPaperProps } from '@mui/material/Paper';\nimport { styled } from '@mui/material/styles';\nexport interface PaperProps extends MuiPaperProps {\n variant?: 'elevation' | 'outlined';\n}\n\nconst StyledPaper = styled(MuiPaper)(({ theme }) => ({\n borderRadius: 8,\n '&.MuiPaper-elevation': {\n boxShadow: '0px 2px 8px rgba(0, 0, 0, 0.08)',\n },\n '&.MuiPaper-outlined': {\n border: `1px solid ${theme.palette.grey[200]}`,\n boxShadow: 'none',\n },\n}));\n\nexport const Paper = React.forwardRef<HTMLDivElement, PaperProps>(function Paper(\n { variant = 'elevation', ...props },\n ref,\n) {\n return (\n <StyledPaper\n ref={ref}\n variant={variant}\n elevation={variant === 'elevation' ? 1 : 0}\n {...props}\n />\n );\n});\n\n","import React from 'react';\nimport MuiDivider, { DividerProps as MuiDividerProps } from '@mui/material/Divider';\nimport { styled } from '@mui/material/styles';\nexport interface DividerProps extends MuiDividerProps {\n variant?: 'fullWidth' | 'inset' | 'middle';\n}\n\nconst StyledDivider = styled(MuiDivider)(({ theme }) => ({\n borderColor: theme.palette.grey[200],\n}));\n\nexport const Divider = React.forwardRef<HTMLHRElement, DividerProps>(function Divider(\n props,\n ref,\n) {\n return <StyledDivider ref={ref} {...props} />;\n});\n\n","export { default as Stack } from '@mui/material/Stack';\nexport type { StackProps } from '@mui/material/Stack';\n\n","export { default as Box } from '@mui/material/Box';\nexport type { BoxProps } from '@mui/material/Box';\n\n","export { default as Container } from '@mui/material/Container';\nexport type { ContainerProps } from '@mui/material/Container';\n\n","import React from 'react';\nimport MuiAppBar from '@mui/material/AppBar';\nimport type { AppBarProps as MuiAppBarProps } from '@mui/material/AppBar';\nimport Toolbar from '@mui/material/Toolbar';\nimport type { ToolbarProps } from '@mui/material/Toolbar';\nimport { styled } from '@mui/material/styles';\nexport interface AppBarProps extends MuiAppBarProps {\n height?: number;\n}\n\nconst StyledAppBar = styled(MuiAppBar, {\n shouldForwardProp: (prop) => prop !== 'appBarHeight',\n})<{ appBarHeight?: number }>(({ appBarHeight = 64, theme }) => ({\n backgroundColor: theme.palette.background.paper,\n borderBottom: `1px solid ${theme.palette.grey[200]}`,\n boxShadow: 'none',\n height: appBarHeight,\n zIndex: 1300,\n}));\n\nconst StyledToolbar = styled(Toolbar)(({ theme }) => ({\n height: '100%',\n paddingLeft: theme.spacing(2),\n paddingRight: theme.spacing(2),\n gap: theme.spacing(2),\n}));\n\nexport const AppBar: React.FC<AppBarProps> = ({ height = 64, children, ...props }) => {\n return (\n <StyledAppBar position=\"fixed\" appBarHeight={height} {...props}>\n <StyledToolbar>{children}</StyledToolbar>\n </StyledAppBar>\n );\n};\n\nexport { Toolbar };\nexport type { ToolbarProps };\n\n","import React from 'react';\nimport MuiCollapse from '@mui/material/Collapse';\nimport type { CollapseProps as MuiCollapseProps } from '@mui/material/Collapse';\n\nexport interface CollapseProps extends MuiCollapseProps {\n /**\n * If `true`, the component will transition in\n */\n in?: boolean;\n /**\n * The content to collapse\n */\n children?: React.ReactNode;\n}\n\n/**\n * Collapse component - provides a collapse animation\n * \n * @example\n * ```tsx\n * <Collapse in={open}>\n * <Box>Collapsible content</Box>\n * </Collapse>\n * ```\n */\nexport const Collapse = React.forwardRef<HTMLDivElement, CollapseProps>(function Collapse(\n props,\n ref,\n) {\n return <MuiCollapse ref={ref} {...props} />;\n});\n\nexport default Collapse;\n\n","import React from 'react';\nimport Box from '@mui/material/Box';\nimport Typography from '@mui/material/Typography';\nimport IconButton from '@mui/material/IconButton';\nimport Divider from '@mui/material/Divider';\nimport MoreHorizIcon from '@mui/icons-material/MoreHoriz';\nimport { Button } from '../../buttons/Button';\nimport { RoleBadge } from '../../feedback/RoleBadge';\nimport { IDBlock } from '../../feedback/IDBlock';\nimport { deploymentSurfaceTokens } from '../../../theme';\n\n/**\n * Primary action configuration for EntityHeader\n */\nexport interface PrimaryAction {\n /**\n * Button label text\n */\n label: string;\n /**\n * Optional count to display as \"Label (N)\"\n */\n count?: number;\n /**\n * Optional leading icon\n */\n icon?: React.ReactNode;\n /**\n * Click handler for the button\n */\n onClick?: () => void;\n}\n\n/**\n * EntityHeader component props\n */\nexport interface EntityHeaderProps {\n /**\n * Primary title text (e.g., entity name)\n * @required\n */\n title: string;\n /**\n * Secondary descriptive text below title\n */\n subtitle?: string;\n /**\n * Role or status label - displays as RoleBadge pill\n */\n role?: string;\n /**\n * Entity identifier - displays as IDBlock with copy action\n */\n id?: string;\n /**\n * Main action button configuration\n */\n primaryAction?: PrimaryAction;\n /**\n * Additional content rendered before the primary action button.\n * Accepts any ReactNode (buttons, dropdowns, etc.).\n */\n startActions?: React.ReactNode;\n /**\n * Additional content rendered after the primary action button\n * but before the more-options icon button.\n * Accepts any ReactNode (buttons, dropdowns, etc.).\n */\n endActions?: React.ReactNode;\n /**\n * Callback when ID is copied (internal copy + this callback)\n */\n onCopyId?: () => void;\n /**\n * Callback when more options button clicked (receives event for anchor positioning)\n */\n onMoreOptions?: (event: React.MouseEvent<HTMLElement>) => void;\n /**\n * HTML heading level for the title element\n * @default 'h2'\n */\n headingLevel?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\n /**\n * Show bottom divider line\n * @default true\n */\n divider?: boolean;\n}\n\n/**\n * EntityHeader - Composite UI component for entity (workspace, account, etc.) headers\n *\n * Displays an entity with title, optional subtitle, role badge, ID with copy action,\n * primary action button, and more options control. Matches Figma node 15-1258 specifications.\n *\n * @example\n * ```tsx\n * // Full example with all props\n * <EntityHeader\n * title=\"Game Co. WF 1769936170928\"\n * subtitle=\"Gaming Demo Account\"\n * role=\"Manager\"\n * id=\"W1234567890\"\n * primaryAction={{\n * label: 'Members',\n * count: 5,\n * icon: <AddCircleIcon />,\n * onClick: () => console.log('Open members')\n * }}\n * onCopyId={() => console.log('ID copied')}\n * onMoreOptions={(e) => setAnchorEl(e.currentTarget)}\n * />\n *\n * // Minimal example\n * <EntityHeader title=\"Simple Entity\" />\n * ```\n *\n * @see Figma node 15-1258 for design specifications\n */\nexport const EntityHeader = React.forwardRef<HTMLDivElement, EntityHeaderProps>(\n function EntityHeader(\n {\n title,\n subtitle,\n role,\n id,\n primaryAction,\n startActions,\n endActions,\n onCopyId,\n onMoreOptions,\n headingLevel = 'h2',\n divider = true,\n },\n ref,\n ) {\n const getPrimaryActionLabel = () => {\n if (!primaryAction) return '';\n const { label, count } = primaryAction;\n return count !== undefined ? `${label} (${count})` : label;\n };\n\n return (\n <Box ref={ref}>\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n px: 3,\n py: 2,\n gap: 1,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n flexWrap: 'wrap',\n }}\n >\n <Box\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n }}\n >\n <Typography\n component={headingLevel}\n sx={{\n fontSize: '16px',\n fontWeight: 500,\n lineHeight: '24px',\n letterSpacing: '0.15px',\n color: deploymentSurfaceTokens.textPrimary,\n }}\n >\n {title}\n </Typography>\n\n {subtitle && (\n <Typography\n variant=\"body2\"\n sx={{\n fontSize: '11px',\n fontWeight: 500,\n lineHeight: '16px',\n letterSpacing: '0.5px',\n color: deploymentSurfaceTokens.textSecondary,\n }}\n >\n {subtitle}\n </Typography>\n )}\n </Box>\n\n {role && <RoleBadge label={role} color=\"primary\" size=\"small\" />}\n\n {id && <IDBlock id={id} label=\"ID\" entityType=\"entity\" onCopy={onCopyId} />}\n </Box>\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n flexShrink: 0,\n }}\n >\n {startActions}\n\n {primaryAction && (\n <Button\n variant=\"primary\"\n startIcon={primaryAction.icon}\n onClick={primaryAction.onClick}\n sx={{\n textTransform: 'capitalize',\n }}\n >\n {getPrimaryActionLabel()}\n </Button>\n )}\n\n {endActions}\n\n {onMoreOptions && (\n <IconButton\n onClick={onMoreOptions}\n size=\"small\"\n aria-label=\"More options\"\n sx={{\n padding: '8px',\n border: `1px solid ${deploymentSurfaceTokens.strokeOutside}`,\n borderRadius: '8px',\n '&:hover': {\n backgroundColor: deploymentSurfaceTokens.hoverOverlay,\n borderColor: deploymentSurfaceTokens.borderDefault,\n },\n }}\n >\n <MoreHorizIcon\n sx={{\n fontSize: '20px',\n color: deploymentSurfaceTokens.textSecondary,\n }}\n />\n </IconButton>\n )}\n </Box>\n </Box>\n\n {divider && (\n <Divider\n sx={{\n borderColor: deploymentSurfaceTokens.strokeOutside,\n }}\n />\n )}\n </Box>\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,OAAO,WAAW;AAClB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAuB0B,cACvD,YADuD;AAZzD,IAAM,WAAqC;AAAA,EACzC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,YAAY,OAAO,KAAK,EAAE;AAAA,EAC9B,CAAC,MAAM,eAAe,IAAI,EAAE,GAAG;AAAA,IAC7B,UAAU;AAAA,EACZ;AACF,CAAC;AAEM,IAAM,OAAO,CAAC,EAAE,UAAU,OAAO,UAAU,OAAO,oBAAC,YAAS,OAAM,WAAU,EAAG,MACpF,qBAAC,aAAU,WAAU,OAAM,YAAW,UAAS,SAAS,GAAG,UAAU,SAAS,IAAI,GAC/E;AAAA;AAAA,EACA,YAAY,oBAAC,SAAO,UAAS;AAAA,GAChC;;;AC5BF,OAAO,eAAe;AAEtB,OAAO,iBAAiB;AACxB,OAAO,mBAAmB;AAC1B,OAAO,mBAAmB;AAC1B,OAAOA,aAAY;AACnB,OAAO,gBAAgB;AACvB,OAAO,SAAS;AAChB,OAAO,gBAAgB;AACvB,OAAO,aAAa;AACpB,OAAO,sBAAsB;AAC7B,OAAO,eAAe;AAoFV,SA6BE,UA7BF,OAAAC,MAKJ,QAAAC,aALI;AA5CL,IAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AAAA,EACA,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,qBAAqB,CAAC,MAAyB;AACnD,QAAI,EAAG,GAAE,gBAAgB;AACzB,YAAQ;AAAA,EACV;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS,CAAC,GAAG,WAAW;AACtB,YAAI,mBAAoB;AACxB,YAAI,WAAW,mBAAmB,WAAW,iBAAiB;AAC5D,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,MACJ,YAAY;AAAA,QACV,IAAI,EAAE,WAAW,YAAY,aAAa,SAAY,OAAO;AAAA,QAC7D,GAAG,YAAY;AAAA,MACjB;AAAA,MAEA;AAAA,wBAAAA,MAAC,eAAY,IAAI,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,UAAU,GAAG,EAAE,GAC9F;AAAA,0BAAAD,KAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,SAAS,GAC9C,iBAAO,UAAU,WAChB,gBAAAA,KAAC,cAAW,SAAQ,MAAM,iBAAM,IAEhC,OAEJ;AAAA,UACA,gBAAAC,MAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,SAAS,GAC9C;AAAA;AAAA,YACD,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAM;AAAA,gBACN,SAAS;AAAA,gBACT,cAAW;AAAA,gBAEX,0BAAAA,KAAC,aAAU;AAAA;AAAA,YACb;AAAA,aACF;AAAA,WACF;AAAA,QAEC,YAAY,gBAAAA,KAAC,WAAQ;AAAA,QAEtB,gBAAAA,KAAC,iBAAc,UACZ,UACH;AAAA,SAEE,eAAe,kBACf,gBAAAC,MAAA,YACG;AAAA,sBAAY,gBAAAD,KAAC,WAAQ;AAAA,UACtB,gBAAAA,KAAC,iBACE,2BACC,gBAAAC,MAAA,YACE;AAAA,4BAAAD;AAAA,cAACD;AAAA,cAAA;AAAA,gBACC,SAAS;AAAA,gBACT,UAAU;AAAA,gBAET;AAAA;AAAA,YACH;AAAA,YACC,YACC,gBAAAC;AAAA,cAACD;AAAA,cAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,OAAM;AAAA,gBACN,SAAS;AAAA,gBACT,UAAU,iBAAiB;AAAA,gBAC3B,WAAW,YAAY,gBAAAC,KAAC,oBAAiB,MAAM,IAAI,IAAK;AAAA,gBAEvD;AAAA;AAAA,YACH;AAAA,aAEJ,GAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACtJA,YAAY,WAAW;AACvB,OAAOE,UAAS;AAChB,OAAOC,iBAAgB;AA8Ef,SAEI,OAAAC,MAFJ,QAAAC,aAAA;AAzDR,IAAM,YAAY,CAAC,MAAe,UAAyB;AACzD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,MAAM,QAAQ,QAAQ;AAAA,IAC/B,KAAK;AACH,aAAO,MAAM,QAAQ,KAAK;AAAA,IAC5B,KAAK;AACH,aAAO,MAAM,QAAQ,QAAQ;AAAA,IAC/B,KAAK;AACH,aAAO,MAAM,QAAQ,QAAQ;AAAA,IAC/B,KAAK;AACH,aAAO,MAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ,QAAQ;AAAA,IAChE,KAAK;AAAA,IACL;AACE,aAAO,MAAM,QAAQ,KAAK,GAAG;AAAA,EACjC;AACF;AAYO,IAAM,UAAgB;AAAA,EAC3B,SAASC,SAAQ,EAAE,MAAM,OAAO,OAAO,KAAK,OAAO,WAAW,GAAG,KAAK,GAAG,KAAK;AAC5E,WACE,gBAAAD;AAAA,MAACH;AAAA,MAAA;AAAA,QACC;AAAA,QACA,aAAW;AAAA,QACV,GAAG;AAAA,QACJ,IAAI,CAAC,WAAW;AAAA,UACd,UAAU;AAAA,UACV,SAAS;AAAA,UACT,eAAe;AAAA,UACf,KAAK;AAAA,UACL,SAAS;AAAA,UACT,aAAa;AAAA,UACb,cAAc;AAAA,UACd,iBAAiB,MAAM,QAAQ,WAAW;AAAA,UAC1C,QAAQ,aAAa,MAAM,QAAQ,OAAO;AAAA,UAC1C,UAAU;AAAA,UACV,aAAa;AAAA,YACX,SAAS;AAAA,YACT,UAAU;AAAA,YACV,MAAM;AAAA,YACN,KAAK;AAAA,YACL,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,iBAAiB,UAAU,MAAM,KAAK;AAAA,UACxC;AAAA,QACF;AAAA,QAEA;AAAA,0BAAAG,MAACH,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,KAAK,GACzD;AAAA,oBACC,gBAAAE,KAACF,MAAA,EAAI,IAAI,EAAE,SAAS,eAAe,OAAO,iBAAiB,GAAI,gBAAK;AAAA,YAEtE,gBAAAE,KAACD,aAAA,EAAW,SAAQ,WAAU,WAAU,QACrC,iBACH;AAAA,aACF;AAAA,UACA,gBAAAC,KAACD,aAAA,EAAW,SAAQ,cAAa,WAAU,OACxC,iBACH;AAAA,UACC,OACC,gBAAAC,KAACD,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,iBAAiB,GACvD,eACH;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;;;ACnGA,YAAYI,YAAW;AACvB,OAAOC,UAAS;AAuFN,gBAAAC,YAAA;AA/EV,IAAM,WAAW,CAAC,SAAyB;AACzC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK,GAAG;AACvC,SAAM,KAAK,KAAK,IAAI,KAAK,WAAW,CAAC,IAAK;AAAA,EAC5C;AACA,SAAO,KAAK,IAAI,CAAC;AACnB;AAOA,IAAM,UAAU,CAAC,UAAoC;AAAA,EACnD,MAAM,QAAQ,QAAQ;AAAA,EACtB,MAAM,QAAQ,QAAQ;AAAA,EACtB,MAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ,QAAQ;AACzD;AAyBO,IAAM,cAAoB;AAAA,EAC/B,SAASC,aACP,EAAE,MAAM,MAAM,OAAO,IAAI,SAAS,OAAO,SAAS,WAAW,GAAG,KAAK,GACrE,KACA;AACA,UAAM,WAAW,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK,YAAY;AACvD,UAAM,SAAS,KAAK,MAAM,OAAO,IAAI;AAErC,WACE,gBAAAD;AAAA,MAACD;AAAA,MAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,cAAY,aAAa;AAAA,QACxB,GAAG;AAAA,QACJ,IAAI,CAAC,UAAU;AACb,gBAAM,SAAS,QAAQ,KAAK;AAC5B,gBAAM,eAAe,SAAS,IAAI,IAAI,OAAO;AAC7C,iBAAO;AAAA,YACL,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc,GAAG,MAAM;AAAA,YACvB,iBAAiB,OAAO,YAAY;AAAA,YACpC,OAAO,MAAM,QAAQ,OAAO;AAAA,YAC5B,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,YAAY;AAAA,YACZ,UAAU,KAAK,MAAM,OAAO,IAAI;AAAA,YAChC,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,WAAW,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,YACvC,YAAY;AAAA,UACd;AAAA,QACF;AAAA,QAEC,oBACC,gBAAAC;AAAA,UAACD;AAAA,UAAA;AAAA,YACC,WAAU;AAAA,YACV,KAAK;AAAA,YACL,KAAI;AAAA,YACJ,IAAI,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ;AAAA;AAAA,QAC1D,IAEA,gBAAAC,KAAC,UAAK,eAAY,QAAQ,mBAAQ;AAAA;AAAA,IAEtC;AAAA,EAEJ;AACF;;;ACpGA,YAAYE,YAAW;AACvB,OAAOC,UAAS;AAChB,OAAOC,iBAAgB;AAsFX,gBAAAC,MAkBA,QAAAC,aAlBA;AAxDZ,IAAM,aAAa,CAAC,MAAwB,UAA6C;AACvF,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,QAAQ,KAAK,OAAO,IAAI,MAAM,QAAQ,KAAK,KAAK;AAAA,IACrE,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,QAAQ,QAAQ,OAAO,IAAI,MAAM,QAAQ,QAAQ,KAAK;AAAA,IAC3E,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,QAAQ,QAAQ,OAAO,IAAI,MAAM,QAAQ,QAAQ,KAAK;AAAA,IAC3E,KAAK;AACH,aAAO;AAAA,QACL,IAAI,MAAM,QAAQ,WAAW,SAAS,MAAM,QAAQ,QAAQ;AAAA,QAC5D,IAAI,MAAM,QAAQ,WAAW,QAAQ,MAAM,QAAQ,QAAQ;AAAA,MAC7D;AAAA,IACF,KAAK;AACH,aAAO,EAAE,IAAI,MAAM,QAAQ,KAAK,GAAG,GAAG,IAAI,MAAM,QAAQ,KAAK,QAAQ;AAAA,IACvE,KAAK;AAAA,IACL;AACE,aAAO,EAAE,IAAI,MAAM,QAAQ,QAAQ,OAAO,IAAI,MAAM,QAAQ,QAAQ,KAAK;AAAA,EAC7E;AACF;AASO,IAAM,eAAqB;AAAA,EAChC,SAASC,cAAa,EAAE,OAAO,OAAO,UAAU,UAAU,GAAG,GAAG,KAAK,GAAG,KAAK;AAC3E,WACE,gBAAAF;AAAA,MAACF;AAAA,MAAA;AAAA,QACC;AAAA,QACA,WAAU;AAAA,QACV,aAAW;AAAA,QACV,GAAG;AAAA,QACJ,IAAI,CAAC,UAAU;AACb,gBAAM,EAAE,IAAI,GAAG,IAAI,WAAW,MAAM,KAAK;AACzC,iBAAO;AAAA,YACL,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,SAAS;AAAA,YACT,eAAe;AAAA,YACf,KAAK;AAAA,YACL,sBAAsB;AAAA,YACtB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,QAEC,gBAAM,IAAI,CAAC,MAAM,QAChB,gBAAAG;AAAA,UAACH;AAAA,UAAA;AAAA,YAEC,WAAU;AAAA,YACV,IAAI,EAAE,SAAS,QAAQ,YAAY,cAAc,KAAK,IAAI;AAAA,YAE1D;AAAA,8BAAAE;AAAA,gBAACF;AAAA,gBAAA;AAAA,kBACC,eAAY;AAAA,kBACZ,IAAI;AAAA,oBACF,YAAY;AAAA,oBACZ,OAAO;AAAA,oBACP,QAAQ;AAAA,oBACR,cAAc;AAAA,oBACd,SAAS;AAAA,oBACT,YAAY;AAAA,oBACZ,gBAAgB;AAAA,oBAChB,YAAY;AAAA,oBACZ,UAAU;AAAA,oBACV,iBAAiB;AAAA,oBACjB,OAAO;AAAA,kBACT;AAAA,kBAEC,oBAAU;AAAA;AAAA,cACb;AAAA,cACA,gBAAAG,MAACH,MAAA,EAAI,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,GAC9B;AAAA,gCAAAE,KAACD,aAAA,EAAW,SAAQ,aAAY,WAAU,OACvC,eAAK,OACR;AAAA,gBACC,KAAK,UACJ,gBAAAC;AAAA,kBAACD;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,WAAU;AAAA,oBACV,IAAI,EAAE,OAAO,kBAAkB,IAAI,KAAK;AAAA,oBAEvC,eAAK;AAAA;AAAA,gBACR;AAAA,iBAEJ;AAAA,cACC,KAAK,OAAO,gBAAAC,KAACF,MAAA,EAAI,IAAI,EAAE,YAAY,EAAE,GAAI,eAAK,KAAI;AAAA;AAAA;AAAA,UApC9C,GAAG,GAAG,IAAI,KAAK,KAAK;AAAA,QAqC3B,CACD;AAAA;AAAA,IACH;AAAA,EAEJ;AACF;;;AC9HA,OAAOK,YAA0B;AACjC,OAAO,eAAkD;AACzD,SAAS,UAAAC,eAAc;AACvB,OAAOC,UAAS;AAEhB,OAAOC,iBAAgB;AACvB,OAAOC,iBAAgB;AACvB,OAAOC,cAAa;AACpB,OAAO,UAAU;AACjB,OAAO,SAAS;AAChB,OAAOC,gBAAe;;;ACgBf,SAAS,mBACd,OACA,OACA,cACwD;AACxD,MAAI,UAAU,QAAW;AACvB,WAAO,EAAE,OAAO,aAAa;AAAA,EAC/B;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU;AAC1D,WAAO,EAAE,MAAM;AAAA,EACjB;AACA,QAAM,OAAO,MAAM,MAAM;AACzB,QAAM,MAA8D,EAAE,OAAO,KAAK;AAClF,EAAC,CAAC,MAAM,MAAM,MAAM,IAAI,EAAY,QAAQ,CAAC,OAAO;AAClD,UAAM,QAAQ,MAAM,EAAE;AACtB,QAAI,UAAU,QAAW;AACvB,UAAI,MAAM,YAAY,GAAG,EAAE,CAAC,IAAI,EAAE,OAAO,MAAM;AAAA,IACjD;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;AD0Jc,qBAAAC,WAGM,OAAAC,MAHN,QAAAC,aAAA;AA3Hd,IAAM,eAAeC,QAAO,WAAW;AAAA,EACrC,mBAAmB,CAAC,SAAS,SAAS,WAAW,SAAS,eAAe,SAAS,eAAe,SAAS;AAC5G,CAAC,EAAwE,CAAC,EAAE,OAAO,OAAO,YAAY,IAAI,WAAW,YAAY,EAAE,MAAM;AACvI,QAAM,WAAW,YACb,EAAE,OAAO,UAAU,IACnB,mBAAmB,OAAO,OAAO,GAAG;AACxC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,IACZ,sBAAsB;AAAA,MACpB,GAAG;AAAA,MACH,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY,MAAM,YAAY,OAAO,CAAC,SAAS,OAAO,QAAQ,GAAG;AAAA,QAC/D,QAAQ,MAAM,YAAY,OAAO;AAAA,QACjC,UAAU,MAAM,YAAY,SAAS;AAAA,MACvC,CAAC;AAAA,MACD,UAAU;AAAA;AAAA,MACV,SAAS;AAAA,MACT,eAAe;AAAA,MACf,KAAK,GAAG,SAAS;AAAA,MACjB,QAAQ,YAAY,IAAI,eAAe,SAAS,mBAAmB;AAAA,MACnE,QAAQ,GAAG,MAAM,OAAO,KAAK;AAAA;AAAA,IAC/B;AAAA,EACF;AACF,CAAC;AA4BM,IAAM,SAASC,OAAM,WAAwC,SAASC,QAC3E;AAAA,EACE;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,GAAG;AACL,GACA,KACA;AAEA,QAAM,eAAe,YAAY,eAAe,YAAY,eAAe,MAAM;AACjF,QAAM,aAAa,SAAS;AAG5B,QAAM,kBAAkB,oBAAoB,YAAY,eAAe,YAAY;AAGnF,QAAM,YAAY,SAAS,UAAU,mBAAmB;AAExD,SACE,gBAAAH;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,QACV,GAAG,MAAM;AAAA,QACT,OAAO;AAAA,UACL,QAAQ,YAAY,IAAI,SAAY;AAAA;AAAA,QACtC;AAAA,MACF;AAAA,MACA,eAAe;AAAA,QACb,GAAG,MAAM;AAAA,QACT,OAAO;AAAA,UACL,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,qBACC,gBAAAA,MAAAF,WAAA,EACE;AAAA,0BAAAC;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,GAAG;AAAA,gBACH,WAAW;AAAA,gBACX,cAAc;AAAA,gBACd,aAAa;AAAA,cACf;AAAA,cAEC,oBACC,gBAAAJ,MAAAF,WAAA,EACE;AAAA,gCAAAC,KAACK,MAAA,EAAI,IAAI,EAAE,MAAM,EAAE,GAChB,iBAAO,UAAU,WAChB,gBAAAL,KAACM,aAAA,EAAW,SAAQ,MAAM,iBAAM,IAEhC,OAEJ;AAAA,gBACC,mBAAmB,WAClB,gBAAAN;AAAA,kBAACO;AAAA,kBAAA;AAAA,oBACC,SAAS,CAAC,MAAM;AACd,wBAAE,gBAAgB;AAClB,8BAAQ,GAAG,eAAe;AAAA,oBAC5B;AAAA,oBACA,MAAK;AAAA,oBACL,IAAI,EAAE,IAAI,EAAE;AAAA,oBACZ,cAAW;AAAA,oBAEX,0BAAAP,KAACQ,YAAA,EAAU;AAAA;AAAA,gBACb;AAAA,iBAEJ;AAAA;AAAA,UAEJ;AAAA,UACC,QAAQ,KAAK,SAAS,KACrB,gBAAAR;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,cACP,UAAU,CAAC,GAAG,aAAa,cAAc,QAAQ;AAAA,cACjD,SAAS,KAAK,SAAS,IAAI,eAAe;AAAA,cAC1C,eAAe,KAAK,SAAS,IAAI,SAAS;AAAA,cAC1C,IAAI;AAAA,gBACF,cAAc;AAAA,gBACd,aAAa;AAAA,gBACb,IAAI;AAAA,gBACJ,kCAAkC;AAAA,kBAChC,UAAU;AAAA,gBACZ;AAAA,cACF;AAAA,cAEC,eAAK,IAAI,CAAC,KAAK,UACd,gBAAAA,KAAC,OAAgB,OAAO,OAAd,KAAmB,CAC9B;AAAA;AAAA,UACH;AAAA,WAEJ;AAAA,QAGF,gBAAAA;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,MAAM;AAAA,cACN,UAAU;AAAA,cACV,SAAS;AAAA,cACT,eAAe;AAAA,YACjB;AAAA,YACC,GAAG;AAAA,YAEH;AAAA;AAAA,QACH;AAAA,QAEC,UACC,gBAAAJ,MAAAF,WAAA,EACE;AAAA,0BAAAC,KAACS,UAAA,EAAQ;AAAA,UACT,gBAAAT;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,GAAG;AAAA,gBACH,WAAW;AAAA,gBACX,aAAa;AAAA,cACf;AAAA,cAEC;AAAA;AAAA,UACH;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ,CAAC;;;AEnRD,OAAOK,YAA0B;AACjC,OAAOC,UAAS;AAChB,OAAOC,iBAAgB;AAoCnB,SACE,OAAAC,MADF,QAAAC,aAAA;AANG,IAAM,YAAYJ,OAAM,WAA2C,SAASK,WACjF,EAAE,OAAO,OAAO,OAAO,OAAO,MAAM,GACpC,KACA;AACA,QAAM,gBAAgB,UAAU,OAAO,UAAU,WAAW,QAAQ;AACpE,SACE,gBAAAD,MAACH,MAAA,EAAI,KAAU,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,MAAM,UAAU,EAAE,GACpF;AAAA,oBAAAE;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,IAAI;AAAA,UACF,OAAO;AAAA,UACP,eAAe;AAAA,UACf,eAAe;AAAA,UACf,UAAU;AAAA,UACV,YAAY;AAAA,QACd;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,IACA,gBAAAC;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,SAAQ;AAAA,QACR,IAAI;AAAA,UACF,YAAY,OAAO,cAAc;AAAA,UACjC,UAAU;AAAA,UACV,UAAU;AAAA,UACV,cAAc;AAAA,UACd,YAAY;AAAA,QACd;AAAA,QACA,OAAO;AAAA,QAEN;AAAA;AAAA,IACH;AAAA,KACF;AAEJ,CAAC;;;AClED,SAAgB,WAAW,QAAQ,gBAA2B;AAC9D,OAAOI,UAAS;AAChB,OAAOC,iBAAgB;AACvB,OAAO,qBAAqB;AAC5B,OAAO,sBAAsB;AA+EzB,SACE,OAAAC,MADF,QAAAC,aAAA;AA7EJ,IAAM,oBAAoB;AA2BnB,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,WAAW;AAAA,EACX,gBAAgB;AAClB,MAAM;AACJ,QAAM,cAAc,OAAuB,IAAI;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAE9C,YAAU,MAAM;AACd,UAAM,KAAK,YAAY;AACvB,QAAI,CAAC,GAAI;AAET,UAAM,SAAS,MAAM;AACnB,iBAAW,GAAG,aAAa,iBAAiB;AAC5C,kBAAY,GAAG,aAAa,GAAG,cAAc,GAAG,cAAc,iBAAiB;AAAA,IACjF;AACA,WAAO;AAEP,OAAG,iBAAiB,UAAU,QAAQ,EAAE,SAAS,KAAK,CAAC;AACvD,UAAM,KAAK,OAAO,mBAAmB,cAAc,IAAI,eAAe,MAAM,IAAI;AAChF,QAAI,QAAQ,EAAE;AACd,eAAW,KAAK,MAAM,KAAK,GAAG,QAAQ,EAAG,KAAI,QAAQ,CAAY;AAIjE,UAAM,KAAK,OAAO,qBAAqB,cACnC,IAAI,iBAAiB,MAAM;AACzB,iBAAW,KAAK,MAAM,KAAK,GAAG,QAAQ,EAAG,KAAI,QAAQ,CAAY;AACjE,aAAO;AAAA,IACT,CAAC,IACD;AACJ,QAAI,QAAQ,IAAI,EAAE,WAAW,KAAK,CAAC;AAEnC,WAAO,MAAM;AACX,SAAG,oBAAoB,UAAU,MAAM;AACvC,UAAI,WAAW;AACf,UAAI,WAAW;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,CAAC,QAAgB;AAC7B,UAAM,KAAK,YAAY;AACvB,QAAI,CAAC,GAAI;AACT,OAAG,SAAS,EAAE,MAAM,MAAM,KAAK,IAAI,UAAU,GAAG,cAAc,aAAa,GAAG,UAAU,SAAS,CAAC;AAAA,EACpG;AAEA,SACE,gBAAAA,MAACH,MAAA,EAAI,IAAI,EAAE,UAAU,YAAY,MAAM,GAAG,UAAU,EAAE,GACpD;AAAA,oBAAAE;AAAA,MAACF;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,gCAA4B;AAAA,QAC5B,IAAI;AAAA,UACF,SAAS;AAAA,UACT,KAAK;AAAA,UACL,WAAW;AAAA,UACX,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,IAAI;AAAA,QACN;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,IAEC,WACC,gBAAAE;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,SAAS,MAAM,MAAM,EAAE;AAAA,QACvB,IAAI;AAAA,UACF,UAAU;AAAA,UACV,MAAM;AAAA,UACN,KAAK;AAAA,UACL,WAAW;AAAA,UACX,SAAS;AAAA,UACT,WAAW;AAAA,UACX,WAAW,EAAE,SAAS,mBAAmB;AAAA,QAC3C;AAAA,QAEA,0BAAAC,KAAC,mBAAgB,UAAS,SAAQ;AAAA;AAAA,IACpC;AAAA,IAGD,YACC,gBAAAA;AAAA,MAACD;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY;AAAA,QACZ,SAAS,MAAM,MAAM,CAAC;AAAA,QACtB,IAAI;AAAA,UACF,UAAU;AAAA,UACV,OAAO;AAAA,UACP,KAAK;AAAA,UACL,WAAW;AAAA,UACX,SAAS;AAAA,UACT,WAAW;AAAA,UACX,WAAW,EAAE,SAAS,mBAAmB;AAAA,QAC3C;AAAA,QAEA,0BAAAC,KAAC,oBAAiB,UAAS,SAAQ;AAAA;AAAA,IACrC;AAAA,KAEJ;AAEJ;;;AC1IA,OAAOE,YAA0B;AACjC,OAAOC,UAAS;AAChB,OAAOC,iBAAgB;AAuCf,SACE,OAAAC,MADF,QAAAC,aAAA;AAhBD,IAAM,aAAaC,OAAM,WAAyC,SAASC,YAChF,EAAE,OAAO,UAAU,QAAQ,WAAW,YAAY,SAAS,GAC3D,KACA;AACA,SACE,gBAAAF,MAACG,MAAA,EAAI,KAAU,WAAU,WAAU,IAAI,EAAE,IAAI,EAAE,GAC7C;AAAA,oBAAAH;AAAA,MAACG;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,IAAI;AAAA,UACF,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,KAAK;AAAA,UACL,IAAI;AAAA,QACN;AAAA,QAEA;AAAA,0BAAAH,MAACG,MAAA,EAAI,IAAI,EAAE,UAAU,EAAE,GACrB;AAAA,4BAAAJ,KAACK,aAAA,EAAW,WAAU,MAAK,SAAQ,MAAK,IAAI,EAAE,GAAG,EAAE,GAChD,iBACH;AAAA,YACC,YACC,gBAAAL,KAACK,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,OAAO,iBAAiB,GACzD,oBACH;AAAA,aAEJ;AAAA,UACC,UACC,gBAAAL,KAACI,MAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GAAI,kBAAO;AAAA;AAAA;AAAA,IAExE;AAAA,IACA,gBAAAJ,KAAC,iBAAc,WAAsB,YAClC,UACH;AAAA,KACF;AAEJ,CAAC;;;AC5DD,OAAOM,YAA0B;AACjC,OAAOC,UAAS;AAkEZ,gBAAAC,aAAA;AAzDG,IAAM,qBAAqB;AAAA,EAChC,IAAI,mBAAmB;AAAA;AAAA,EACvB,IAAI,mBAAmB;AAAA;AAAA,EACvB,IAAI,kBAAkB;AAAA;AAAA,EACtB,IAAI,kBAAkB;AAAA;AACxB;AAYA,IAAM,WAAW;AAAA,EACf;AAAA,IACE,MAAM,2BAA2B,mBAAmB,EAAE,QAAQ,mBAAmB,EAAE,SAAS,mBAAmB,EAAE;AAAA,IACjH,OAAO,mBAAmB;AAAA,IAC1B,OAAO,mBAAmB;AAAA,EAC5B;AAAA,EACA,EAAE,MAAM,kEAAkE,OAAO,WAAW,OAAO,UAAU;AAAA,EAC7G,EAAE,MAAM,kEAAkE,OAAO,WAAW,OAAO,UAAU;AAAA,EAC7G,EAAE,MAAM,kEAAkE,OAAO,WAAW,OAAO,UAAU;AAAA,EAC7G,EAAE,MAAM,kEAAkE,OAAO,WAAW,OAAO,UAAU;AAAA,EAC7G,EAAE,MAAM,kEAAkE,OAAO,WAAW,OAAO,UAAU;AAC/G;AAIO,IAAM,yBAAyB,SAAS;AAoBxC,IAAM,kBAAkBC,OAAM;AAAA,EACnC,SAASC,iBAAgB,EAAE,OAAO,UAAU,GAAG,GAAG,KAAK;AACvD,UAAM,WAAY,QAAQ,yBAA0B,0BAA0B;AAC9E,UAAMC,WAAU,SAAS,OAAO;AAChC,WACE,gBAAAH;AAAA,MAACI;AAAA,MAAA;AAAA,QACC;AAAA,QACA,uBAAqB;AAAA,QACrB,IAAI;AAAA,UACF;AAAA,YACE,UAAU;AAAA,YACV,UAAU;AAAA,YACV,YAAYD,SAAQ;AAAA,YACpB,OAAO;AAAA,YACP,uBAAuB;AAAA,cACrB,SAAS;AAAA,cACT,UAAU;AAAA,cACV,eAAe;AAAA,cACf,cAAc;AAAA,cACd,QAAQ;AAAA,YACV;AAAA,YACA,aAAa;AAAA,cACX,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,KAAK;AAAA,cACL,OAAO;AAAA,cACP,SAAS;AAAA,cACT,YAAY,2BAA2BA,SAAQ,KAAK;AAAA,YACtD;AAAA,YACA,YAAY;AAAA,cACV,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,SAAS;AAAA,cACT,YAAY,2BAA2BA,SAAQ,KAAK;AAAA,YACtD;AAAA,UACF;AAAA,UACA,GAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,CAAC,EAAE;AAAA,QAClC;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,EAEF;AACF;;;AC3GA,OAAOE,YAA0B;AACjC,OAAOC,WAAS;AAChB,OAAOC,iBAAgB;AA8Cf,gBAAAC,OAIF,QAAAC,aAJE;AAtBD,IAAM,gBAAgBJ,OAAM;AAAA,EACjC,SAASK,eACP,EAAE,MAAM,OAAO,UAAU,OAAO,MAAM,QAAQ,OAAO,UAAU,KAAK,GACpE,KACA;AACF,WACE,gBAAAD;AAAA,MAACH;AAAA,MAAA;AAAA,QACC;AAAA,QACA,gBAAc,QAAQ,UAAU;AAAA,QAChC,IAAI;AAAA,UACF,IAAI,QAAQ,OAAO;AAAA,UACnB,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,KAAK;AAAA,UACL,GAAI,WAAW;AAAA,YACb,cAAc;AAAA,YACd,aAAa;AAAA,YACb,gBAAgB,EAAE,cAAc,OAAO;AAAA,UACzC;AAAA,QACF;AAAA,QAEC;AAAA,kBACC,gBAAAE,MAACF,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,OAAO,iBAAiB,GACvE,gBACH;AAAA,UAEF,gBAAAG,MAACH,OAAA,EAAI,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE,GAC9B;AAAA,4BAAAE,MAACD,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,KAAK,YAAY,IAAI,GAChE,iBACH;AAAA,YACC,YACC,gBAAAC,MAACD,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,OAAO,iBAAiB,GACzD,oBACH;AAAA,aAEJ;AAAA,WACE,SAAS,SACT,gBAAAE;AAAA,YAACH;AAAA,YAAA;AAAA,cACC,IAAI;AAAA,gBACF,SAAS;AAAA,gBACT,eAAe;AAAA,gBACf,YAAY;AAAA,gBACZ,WAAW;AAAA,cACb;AAAA,cAEC;AAAA,yBACC,gBAAAE,MAACD,aAAA,EAAW,SAAQ,SAAQ,IAAI,EAAE,OAAO,iBAAiB,GACvD,iBACH;AAAA,gBAED,QACC,gBAAAC,MAACD,aAAA,EAAW,SAAQ,WAAU,IAAI,EAAE,OAAO,gBAAgB,GACxD,gBACH;AAAA;AAAA;AAAA,UAEJ;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEF;AACF;;;ACtFA,SAAoB,cAAAI,mBAAkB;AACtC,OAAOC,gBAAe;AACtB,OAAOC,iBAAgB;AACvB,OAAOC,WAAS;AAChB,OAAOC,iBAAgB;AACvB,OAAO,WAAW;AAGlB,OAAOC,gBAAe;AAiDX,gBAAAC,OAgGD,QAAAC,cAhGC;AATX,IAAM,WAA6C;AAAA,EACjD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,YAAYP;AAAA,EAChB,SAASQ,WAAU,OAAO,KAAK;AAC7B,WAAO,gBAAAF,MAAC,SAAM,WAAU,QAAO,KAAW,GAAG,OAAO;AAAA,EACtD;AACF;AAEA,IAAM,UAAUN;AAAA,EACd,SAASS,SAAQ,OAAO,KAAK;AAC3B,WAAO,gBAAAH,MAAC,SAAM,WAAU,MAAK,KAAW,GAAG,OAAO;AAAA,EACpD;AACF;AAOO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnB,QAAM,iBAAiB,cAAc,OAAO,UAAU,WAAW,QAAQ;AACzE,QAAM,UAAU,SAAS;AACzB,QAAM,qBAA4C,eAAe,UAAU,eAAe;AAE1F,QAAM,sBACJ,uBAAuB,eACnB,YACA,uBAAuB,aACrB,UACA;AAER,QAAM,cAA8B;AAAA,IAClC,OAAO,SAAS,KAAK;AAAA,IACrB,UAAU;AAAA;AAAA;AAAA,IAGV,SAAS;AAAA,IACT,eAAe;AAAA,IACf,GAAI,WAAW;AAAA,MACb,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA;AAAA;AAAA,MAGR,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,SACE,gBAAAC;AAAA,IAACN;AAAA,IAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,OAAO,sBAAsB,EAAE,YAAY,oBAAoB,IAAI;AAAA,MACnE,WAAW;AAAA,QACT,OAAO;AAAA,UACL,cAAc;AAAA,UACd,IAAI,CAAC,aAAa,GAAI,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO,CAAE;AAAA,QACrE;AAAA,QACA,GAAI,aAAa,EAAE,UAAU,EAAE,IAAI,WAAW,EAAE,IAAI,CAAC;AAAA,MACvD;AAAA,MAEC;AAAA,SAAC,cACA,gBAAAM;AAAA,UAACJ;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,cACF,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,gBAAgB;AAAA,cAChB,KAAK;AAAA,cACL,IAAI;AAAA,cACJ,IAAI;AAAA,cACJ,cAAc;AAAA,cACd,aAAa;AAAA,YACf;AAAA,YAEA;AAAA,8BAAAG,MAACH,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,UAAU,EAAE,GAC3D,iBAAO,UAAU,WAChB,gBAAAG,MAACF,aAAA,EAAW,SAAQ,MAAK,QAAM,MAC5B,iBACH,IAEA,OAEJ;AAAA,cACA,gBAAAG,OAACJ,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,EAAE,GACtD;AAAA;AAAA,gBACD,gBAAAG,MAACJ,aAAA,EAAW,cAAW,SAAQ,SAAS,SAAS,MAAK,OAAM,MAAK,SAC/D,0BAAAI,MAACD,YAAA,EAAU,UAAS,SAAQ,GAC9B;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,QAGD,cACC,gBAAAC;AAAA,UAACJ;AAAA,UAAA;AAAA,YACC,cAAW;AAAA,YACX,SAAS;AAAA,YACT,MAAK;AAAA,YACL,IAAI;AAAA,cACF,UAAU;AAAA,cACV,KAAK;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,WAAW;AAAA,cACX,WAAW,EAAE,SAAS,mBAAmB;AAAA,YAC3C;AAAA,YAEA,0BAAAI,MAACD,YAAA,EAAU,UAAS,SAAQ;AAAA;AAAA,QAC9B;AAAA,QAGF,gBAAAC,MAACH,OAAA,EAAI,IAAI,EAAE,MAAM,GAAG,UAAU,QAAQ,WAAW,EAAE,GAAI,UAAS;AAAA;AAAA;AAAA,EAClE;AAEJ;;;ACxLA,OAAOO,aAAW;AAClB,OAAOC,WAAS;AA0Bd,SAgBE,OAAAC,OAhBF,QAAAC,cAAA;AAHK,IAAM,qBAAqBH,QAAM;AAAA,EACtC,SAASI,oBAAmB,EAAE,MAAM,OAAO,aAAa,KAAK,gBAAgB,KAAK,GAAG,GAAG,KAAK;AAC7F,WACA,gBAAAD;AAAA,MAACF;AAAA,MAAA;AAAA,QACC;AAAA,QACA,IAAI;AAAA,UACF,SAAS;AAAA,UACT,qBAAqB,OAAO,UAAU;AAAA,UACtC,KAAK;AAAA;AAAA,UAEL,SAAS;AAAA,UACT,WAAW;AAAA,UACX,CAAC,sBAAsB,aAAa,KAAK,GAAG;AAAA,YAC1C,qBAAqB;AAAA,YACrB,SAAS;AAAA,UACX;AAAA,UACA,GAAG;AAAA,QACL;AAAA,QAEA;AAAA,0BAAAC,MAACD,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,QAAQ,UAAU,EAAE,GAC3E,gBACH;AAAA,UACA,gBAAAC,MAACD,OAAA,EAAI,WAAU,SAAQ,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAO,GAChF,iBACH;AAAA;AAAA;AAAA,IACF;AAAA,EAEF;AAAC;;;ACnDD,OAAOI,aAAW;AAClB,OAAO,aAAa;AAEpB,OAAO,iBAAiB;AAExB,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,OAAO,6BAA6B;AACpC,SAAS,UAAAC,eAAc;AAId,gBAAAC,OA6BL,QAAAC,cA7BK;AADF,IAAM,OAAOH,QAAM,WAAwC,SAASI,MAAK,OAAO,KAAK;AAC1F,SAAO,gBAAAF,MAAC,WAAQ,KAAW,GAAG,OAAO;AACvC,CAAC;AAUD,IAAM,iBAAiBD,QAAO,aAAa;AAAA,EACzC,mBAAmB,CAAC,SAAS,SAAS;AACxC,CAAC,EAA2B,CAAC,EAAE,YAAY,MAAM,MAAM,OAAO;AAAA,EAC5D,QAAQ,aAAa,MAAM,QAAQ,KAAK,GAAG,CAAC;AAAA,EAC5C,cAAc;AAAA,EACd,cAAc;AAAA,EACd,GAAI,aAAa;AAAA,IACf,WAAW;AAAA,MACT,iBAAiB,MAAM,QAAQ,KAAK,EAAE;AAAA,IACxC;AAAA,EACF;AACF,EAAE;AAEK,IAAM,WAAWD,QAAM,WAAyC,SAASK,UAC9E,EAAE,SAAS,WAAW,MAAM,QAAQ,YAAY,MAAM,UAAU,GAAG,MAAM,GACzE,KACA;AACA,SACE,gBAAAF,OAAC,kBAAe,KAAU,WAAuB,GAAG,OACjD;AAAA,YAAQ,gBAAAD,MAAC,gBAAc,gBAAK;AAAA,KAC3B,WAAW,cACX,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAED;AAAA,IACA,UAAW;AAAA,KACd;AAEJ,CAAC;;;ACrDD,OAAOI,aAAW;AAClB,OAAO,eAAkD;AACzD,SAAS,UAAAC,eAAc;AA2Bd,gBAAAC,aAAA;AAtBT,IAAM,UAAU;AAAA,EACd,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AACT;AAEA,IAAM,eAAeD,QAAO,WAAW;AAAA,EACrC,mBAAmB,CAAC,SAAS,SAAS;AACxC,CAAC,EAA2B,CAAC,EAAE,aAAa,IAAI,MAAM,OAAO;AAAA,EAC3D,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,iBAAiB,MAAM,QAAQ,QAAQ;AAAA,EACvC,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAC7B,YAAY;AACd,EAAE;AAEK,IAAM,SAASD,QAAM,WAAwC,SAASG,QAC3E,EAAE,OAAO,UAAU,GAAG,MAAM,GAC5B,KACA;AACA,QAAM,aAAa,OAAO,SAAS,WAAW,OAAO,QAAQ,IAAI;AAEjE,SAAO,gBAAAD,MAAC,gBAAa,KAAU,YAAyB,GAAG,OAAO;AACpE,CAAC;;;AC9BD,OAAOE,aAAW;AAClB,OAAO,cAAc;AAErB,OAAO,eAAe;AACtB,OAAO,eAAe;AACtB,OAAO,oBAAoB;AAC3B,OAAO,eAAe;AACtB,OAAO,cAAc;AACrB,OAAO,oBAAoB;AAC3B,SAAS,UAAAC,eAAc;AAyBjB,gBAAAC,aAAA;AApBN,IAAM,uBAAuBD,QAAO,cAAc,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EAClE,cAAc;AAAA,EACd,QAAQ,aAAa,MAAM,QAAQ,KAAK,GAAG,CAAC;AAC9C,EAAE;AAEF,IAAM,kBAAkBA,QAAO,SAAS,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACxD,iBAAiB,MAAM,QAAQ,KAAK,EAAE;AAAA,EACtC,wBAAwB;AAAA,IACtB,YAAY;AAAA,IACZ,OAAO,MAAM,QAAQ,KAAK;AAAA,EAC5B;AACF,EAAE;AAGK,IAAM,QAAQD,QAAM,WAAyC,SAASG,OAC3E,EAAE,eAAe,OAAO,UAAU,GAAG,MAAM,GAC3C,KACA;AACA,SACE,gBAAAD,MAAC,wBACC,0BAAAA,MAAC,YAAS,KAAU,cAA6B,GAAG,OACjD,UACH,GACF;AAEJ,CAAC;AAcM,IAAM,cAAcF,QAAM;AAAA,EAC/B,SAASI,aAAY,EAAE,SAAS,SAAS,QAAQ,OAAO,OAAO,GAAG,KAAK;AACvE,WACE,gBAAAF,MAAC,mBAAgB,KACf,0BAAAA,MAAC,YACE,kBAAQ,IAAI,CAAC,WACZ,gBAAAA,MAAC,aAA0B,OAAO,OAAO,SAAS,QAC/C,iBAAO,YAAY,SAClB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,YAAY,OAAO;AAAA,QAC3B,WAAW,YAAY,OAAO,KAAK,QAAQ;AAAA,QAC3C,SAAS,MAAM,OAAO,OAAO,EAAE;AAAA,QAE9B,iBAAO;AAAA;AAAA,IACV,IAEA,OAAO,SAVK,OAAO,EAYvB,CACD,GACH,GACF;AAAA,EAEF;AACF;;;AC7EA,SAAoB,WAAXG,gBAAuB;;;ACAhC,OAAOC,aAAW;AAClB,OAAO,oBAAiE;AACxE,OAAO,UAAU;AACjB,OAAOC,iBAAgB;AACvB,SAAS,UAAAC,eAAc;AAuCX,gBAAAC,aAAA;AA5BZ,IAAM,oBAAoBD,QAAO,cAAc,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EAC/D,wBAAwB;AAAA,IACtB,UAAU;AAAA,EACZ;AAAA,EACA,+BAA+B;AAAA,IAC7B,OAAO,MAAM,QAAQ,KAAK;AAAA,EAC5B;AACF,EAAE;AAEF,IAAM,aAAaA,QAAO,IAAI,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EAC9C,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAC7B,gBAAgB;AAAA,EAChB,WAAW;AAAA,IACT,gBAAgB;AAAA,EAClB;AACF,EAAE;AAEK,IAAM,cAAcF,QAAM,WAA0C,SAASI,aAClF,EAAE,OAAO,GAAG,MAAM,GAClB,KACA;AACA,SACE,gBAAAD,MAAC,qBAAkB,KAAW,GAAG,OAC9B,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAM,SAAS,UAAU,MAAM,SAAS;AAExC,QAAI,UAAW,CAAC,KAAK,QAAQ,CAAC,KAAK,SAAU;AAC3C,aACE,gBAAAA,MAACF,aAAA,EAAuB,OAAM,gBAC3B,eAAK,SADS,KAEjB;AAAA,IAEJ;AAEA,WACE,gBAAAE;AAAA,MAAC;AAAA;AAAA,QAEC,MAAM,KAAK;AAAA,QACX,SAAS,CAAC,MAAM;AACd,cAAI,KAAK,SAAS;AAChB,cAAE,eAAe;AACjB,iBAAK,QAAQ;AAAA,UACf;AAAA,QACF;AAAA,QAEC,eAAK;AAAA;AAAA,MATD;AAAA,IAUP;AAAA,EAEJ,CAAC,GACH;AAEJ,CAAC;;;AClED,OAAOE,aAAW;AAClB,OAAO,kBAAkB;AAEzB,OAAO,sBAAsB;AAC7B,OAAO,sBAAsB;AAC7B,OAAO,oBAAoB;AAC3B,SAAS,UAAAC,eAAc;AAuCnB,SACsC,OAAAC,OADtC,QAAAC,cAAA;AAhCJ,IAAM,kBAAkBF,QAAO,YAAY,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EAC3D,cAAc;AAAA,EACd,WAAW;AAAA,EACX,QAAQ,aAAa,MAAM,QAAQ,KAAK,GAAG,CAAC;AAAA,EAC5C,YAAY;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IAChB,QAAQ;AAAA,EACV;AACF,EAAE;AAEF,IAAM,yBAAyBA,QAAO,gBAAgB,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACtE,iBAAiB,MAAM,QAAQ,KAAK,EAAE;AAAA,EACtC,cAAc;AAAA,EACd,kBAAkB;AAAA,IAChB,cAAc;AAAA,EAChB;AAAA,EACA,kCAAkC;AAAA,IAChC,QAAQ;AAAA,EACV;AACF,EAAE;AAEF,IAAM,yBAAyBA,QAAO,gBAAgB,EAAE;AAAA,EACtD,SAAS;AACX,CAAC;AAEM,IAAM,YAAYD,QAAM,WAA2C,SAASI,WACjF,EAAE,OAAO,UAAU,kBAAkB,OAAO,GAAG,MAAM,GACrD,KACA;AACA,SACE,gBAAAD,OAAC,mBAAgB,KAAU,iBAAmC,GAAG,OAC/D;AAAA,oBAAAD,MAAC,0BAAuB,YAAY,gBAAAA,MAAC,kBAAe,GACjD,iBACH;AAAA,IACA,gBAAAA,MAAC,0BAAwB,UAAS;AAAA,KACpC;AAEJ,CAAC;;;ACpDD,OAAOG,aAAW;AAClB,OAAO,cAA+C;AACtD,SAAS,UAAAC,eAAc;AAqBnB,gBAAAC,aAAA;AAhBJ,IAAM,cAAcD,QAAO,QAAQ,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACnD,cAAc;AAAA,EACd,wBAAwB;AAAA,IACtB,WAAW;AAAA,EACb;AAAA,EACA,uBAAuB;AAAA,IACrB,QAAQ,aAAa,MAAM,QAAQ,KAAK,GAAG,CAAC;AAAA,IAC5C,WAAW;AAAA,EACb;AACF,EAAE;AAEK,IAAM,QAAQD,QAAM,WAAuC,SAASG,OACzE,EAAE,UAAU,aAAa,GAAG,MAAM,GAClC,KACA;AACA,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,YAAY,cAAc,IAAI;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ,CAAC;;;AC9BD,OAAOE,aAAW;AAClB,OAAO,gBAAqD;AAC5D,SAAS,UAAAC,eAAc;AAad,gBAAAC,aAAA;AART,IAAM,gBAAgBD,QAAO,UAAU,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACvD,aAAa,MAAM,QAAQ,KAAK,GAAG;AACrC,EAAE;AAEK,IAAME,WAAUH,QAAM,WAAwC,SAASG,SAC5E,OACA,KACA;AACA,SAAO,gBAAAD,MAAC,iBAAc,KAAW,GAAG,OAAO;AAC7C,CAAC;;;AChBD,SAAoB,WAAXE,gBAAwB;;;ACAjC,SAAoB,WAAXC,gBAAsB;;;ACA/B,SAAoB,WAAXC,gBAA4B;;;ACCrC,OAAO,eAAe;AAEtB,OAAO,aAAa;AAEpB,SAAS,UAAAC,gBAAc;AAyBjB,gBAAAC,aAAA;AApBN,IAAM,eAAeD,SAAO,WAAW;AAAA,EACrC,mBAAmB,CAAC,SAAS,SAAS;AACxC,CAAC,EAA6B,CAAC,EAAE,eAAe,IAAI,MAAM,OAAO;AAAA,EAC/D,iBAAiB,MAAM,QAAQ,WAAW;AAAA,EAC1C,cAAc,aAAa,MAAM,QAAQ,KAAK,GAAG,CAAC;AAAA,EAClD,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AACV,EAAE;AAEF,IAAM,gBAAgBA,SAAO,OAAO,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACpD,QAAQ;AAAA,EACR,aAAa,MAAM,QAAQ,CAAC;AAAA,EAC5B,cAAc,MAAM,QAAQ,CAAC;AAAA,EAC7B,KAAK,MAAM,QAAQ,CAAC;AACtB,EAAE;AAEK,IAAM,SAAgC,CAAC,EAAE,SAAS,IAAI,UAAU,GAAG,MAAM,MAAM;AACpF,SACE,gBAAAC,MAAC,gBAAa,UAAS,SAAQ,cAAc,QAAS,GAAG,OACvD,0BAAAA,MAAC,iBAAe,UAAS,GAC3B;AAEJ;;;ACjCA,OAAOC,aAAW;AAClB,OAAO,iBAAiB;AA4Bf,gBAAAC,aAAA;AAJF,IAAM,WAAWD,QAAM,WAA0C,SAASE,UAC/E,OACA,KACA;AACA,SAAO,gBAAAD,MAAC,eAAY,KAAW,GAAG,OAAO;AAC3C,CAAC;;;AC9BD,OAAOE,aAAW;AAClB,OAAOC,WAAS;AAChB,OAAOC,kBAAgB;AACvB,OAAOC,iBAAgB;AACvB,OAAOC,cAAa;AACpB,OAAO,mBAAmB;AA6JhB,SAOE,OAAAC,OAPF,QAAAC,cAAA;AA3CH,IAAM,eAAeC,QAAM;AAAA,EAChC,SAASC,cACP;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,UAAU;AAAA,EACZ,GACA,KACA;AACF,UAAM,wBAAwB,MAAM;AAClC,UAAI,CAAC,cAAe,QAAO;AAC3B,YAAM,EAAE,OAAO,MAAM,IAAI;AACzB,aAAO,UAAU,SAAY,GAAG,KAAK,KAAK,KAAK,MAAM;AAAA,IACvD;AAEA,WACE,gBAAAF,OAACG,OAAA,EAAI,KACH;AAAA,sBAAAH;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,4BAAAH;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,UAAU;AAAA,gBACZ;AAAA,gBAEA;AAAA,kCAAAH;AAAA,oBAACG;AAAA,oBAAA;AAAA,sBACC,IAAI;AAAA,wBACF,SAAS;AAAA,wBACT,eAAe;AAAA,wBACf,KAAK;AAAA,sBACP;AAAA,sBAEA;AAAA,wCAAAJ;AAAA,0BAACK;AAAA,0BAAA;AAAA,4BACC,WAAW;AAAA,4BACX,IAAI;AAAA,8BACF,UAAU;AAAA,8BACV,YAAY;AAAA,8BACZ,YAAY;AAAA,8BACZ,eAAe;AAAA,8BACf,OAAO,wBAAwB;AAAA,4BACjC;AAAA,4BAEC;AAAA;AAAA,wBACH;AAAA,wBAEC,YACC,gBAAAL;AAAA,0BAACK;AAAA,0BAAA;AAAA,4BACC,SAAQ;AAAA,4BACR,IAAI;AAAA,8BACF,UAAU;AAAA,8BACV,YAAY;AAAA,8BACZ,YAAY;AAAA,8BACZ,eAAe;AAAA,8BACf,OAAO,wBAAwB;AAAA,4BACjC;AAAA,4BAEC;AAAA;AAAA,wBACH;AAAA;AAAA;AAAA,kBAEJ;AAAA,kBAEC,QAAQ,gBAAAL,MAAC,aAAU,OAAO,MAAM,OAAM,WAAU,MAAK,SAAQ;AAAA,kBAE7D,MAAM,gBAAAA,MAAC,WAAQ,IAAQ,OAAM,MAAK,YAAW,UAAS,QAAQ,UAAU;AAAA;AAAA;AAAA,YAC3E;AAAA,YAEA,gBAAAC;AAAA,cAACG;AAAA,cAAA;AAAA,gBACC,IAAI;AAAA,kBACF,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,KAAK;AAAA,kBACL,YAAY;AAAA,gBACd;AAAA,gBAEC;AAAA;AAAA,kBAEA,iBACC,gBAAAJ;AAAA,oBAAC;AAAA;AAAA,sBACC,SAAQ;AAAA,sBACR,WAAW,cAAc;AAAA,sBACzB,SAAS,cAAc;AAAA,sBACvB,IAAI;AAAA,wBACF,eAAe;AAAA,sBACjB;AAAA,sBAEC,gCAAsB;AAAA;AAAA,kBACzB;AAAA,kBAGD;AAAA,kBAEA,iBACC,gBAAAA;AAAA,oBAACM;AAAA,oBAAA;AAAA,sBACC,SAAS;AAAA,sBACT,MAAK;AAAA,sBACL,cAAW;AAAA,sBACX,IAAI;AAAA,wBACF,SAAS;AAAA,wBACT,QAAQ,aAAa,wBAAwB,aAAa;AAAA,wBAC1D,cAAc;AAAA,wBACd,WAAW;AAAA,0BACT,iBAAiB,wBAAwB;AAAA,0BACzC,aAAa,wBAAwB;AAAA,wBACvC;AAAA,sBACF;AAAA,sBAEA,0BAAAN;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAI;AAAA,4BACF,UAAU;AAAA,4BACV,OAAO,wBAAwB;AAAA,0BACjC;AAAA;AAAA,sBACF;AAAA;AAAA,kBACF;AAAA;AAAA;AAAA,YAEJ;AAAA;AAAA;AAAA,MACF;AAAA,MAEC,WACC,gBAAAA;AAAA,QAACO;AAAA,QAAA;AAAA,UACC,IAAI;AAAA,YACF,aAAa,wBAAwB;AAAA,UACvC;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,EAEF;AACF;","names":["Button","jsx","jsxs","Box","Typography","jsx","jsxs","KpiCard","React","Box","jsx","AgentAvatar","React","Box","Typography","jsx","jsxs","NumberedList","React","styled","Box","IconButton","Typography","Divider","CloseIcon","Fragment","jsx","jsxs","styled","React","Drawer","Box","Typography","IconButton","CloseIcon","Divider","React","Box","Typography","jsx","jsxs","MetaField","Box","IconButton","jsx","jsxs","React","Box","Typography","jsx","jsxs","React","SectionRow","Box","Typography","React","Box","jsx","React","GradientSurface","palette","Box","React","Box","Typography","jsx","jsxs","DefinitionRow","forwardRef","MuiDialog","IconButton","Box","Typography","CloseIcon","jsx","jsxs","SlideLeft","SlideUp","React","Box","jsx","jsxs","SplitDialogContent","React","styled","jsx","jsxs","List","ListItem","React","styled","jsx","Avatar","React","styled","jsx","Table","TableHeader","default","React","Typography","styled","jsx","Breadcrumbs","React","styled","jsx","jsxs","Accordion","React","styled","jsx","Paper","React","styled","jsx","Divider","default","default","default","styled","jsx","React","jsx","Collapse","React","Box","Typography","IconButton","Divider","jsx","jsxs","React","EntityHeader","Box","Typography","IconButton","Divider"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
borderRadius,
|
|
3
3
|
deploymentSurfaceTokens
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-D7D25O6E.mjs";
|
|
5
5
|
import {
|
|
6
6
|
motion,
|
|
7
7
|
webSurfaceTokens
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-WC2TCWXK.mjs";
|
|
9
9
|
|
|
10
10
|
// src/components/buttons/Button.tsx
|
|
11
11
|
import React from "react";
|
|
@@ -124,14 +124,15 @@ var BUTTON_COMPONENTS = {
|
|
|
124
124
|
tertiary: StyledTertiaryButton
|
|
125
125
|
};
|
|
126
126
|
var Button = React.forwardRef(function Button2({
|
|
127
|
-
variant
|
|
127
|
+
variant,
|
|
128
128
|
tone = "default",
|
|
129
129
|
children,
|
|
130
130
|
startIcon,
|
|
131
131
|
endIcon,
|
|
132
132
|
...props
|
|
133
133
|
}, ref) {
|
|
134
|
-
const
|
|
134
|
+
const resolvedVariant = tone === "onGradient" ? "primary" : variant ?? "primary";
|
|
135
|
+
const ButtonComponent = tone === "onGradient" ? StyledOnGradientButton : BUTTON_COMPONENTS[resolvedVariant];
|
|
135
136
|
const buttonProps = {
|
|
136
137
|
...props,
|
|
137
138
|
startIcon,
|
|
@@ -143,4 +144,4 @@ var Button = React.forwardRef(function Button2({
|
|
|
143
144
|
export {
|
|
144
145
|
Button
|
|
145
146
|
};
|
|
146
|
-
//# sourceMappingURL=chunk-
|
|
147
|
+
//# sourceMappingURL=chunk-BOQPWZIB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/buttons/Button.tsx"],"sourcesContent":["import React from 'react';\nimport MuiButton, { ButtonProps as MuiButtonProps } from '@mui/material/Button';\nimport { styled } from '@mui/material/styles';\nimport { deploymentSurfaceTokens, webSurfaceTokens, motion, borderRadius } from '../../theme';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'tertiary';\n\nexport type ButtonTone = 'default' | 'onGradient';\n\n/** Shared base: props valid for both tone shapes. */\ninterface ButtonBaseProps extends Omit<MuiButtonProps, 'variant' | 'color'> {\n size?: 'small' | 'medium' | 'large';\n startIcon?: React.ReactNode;\n endIcon?: React.ReactNode;\n}\n\n/**\n * Default tone: `variant` controls the visual style.\n * @default tone 'default'\n */\nexport interface ButtonDefaultProps extends ButtonBaseProps {\n tone?: 'default';\n /**\n * The visual style variant of the button.\n * - primary: Filled button with primary color background\n * - secondary: Outlined button with transparent background and border\n * - tertiary: Text button with no background or border\n */\n variant?: ButtonVariant;\n}\n\n/**\n * onGradient tone: white pill on a dark gradient surface (banner CTA).\n * `variant` must be omitted — it is not applicable when tone is 'onGradient'.\n */\nexport interface ButtonOnGradientProps extends ButtonBaseProps {\n tone: 'onGradient';\n /**\n * Not applicable when tone='onGradient'. Omit this prop.\n * @deprecated Passing variant with tone='onGradient' is a type error.\n */\n variant?: never;\n}\n\n/** ButtonProps is a discriminated union on `tone`. */\nexport type ButtonProps = ButtonDefaultProps | ButtonOnGradientProps;\n\n// Design system constants matching Figma specs\nconst BUTTON_SPACING = {\n borderRadius: '8px',\n padding: '8px 16px',\n iconMargin: '8px',\n} as const;\n\nconst BUTTON_TYPOGRAPHY = {\n fontSize: '16px',\n fontWeight: 500,\n lineHeight: 1.5,\n letterSpacing: '0.8px',\n} as const;\n\nconst StyledPrimaryButton = styled(MuiButton)(({ theme }) => ({\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n '&:hover': {\n backgroundColor: theme.palette.primary.light,\n },\n '&:active': {\n backgroundColor: theme.palette.primary.dark,\n },\n '&:disabled': {\n backgroundColor: theme.palette.grey[300],\n color: theme.palette.grey[500],\n },\n}));\n\nconst iconStyles = {\n '& > *': {\n fontSize: BUTTON_TYPOGRAPHY.fontSize,\n },\n};\n\nconst StyledSecondaryButton = styled(MuiButton)(({ theme }) => ({\n backgroundColor: deploymentSurfaceTokens.surfaceHigh,\n color: deploymentSurfaceTokens.textPrimary,\n border: `1px solid ${deploymentSurfaceTokens.strokeOutside}`,\n borderRadius: BUTTON_SPACING.borderRadius,\n padding: BUTTON_SPACING.padding,\n textTransform: 'capitalize',\n letterSpacing: BUTTON_TYPOGRAPHY.letterSpacing,\n fontSize: BUTTON_TYPOGRAPHY.fontSize,\n fontWeight: BUTTON_TYPOGRAPHY.fontWeight,\n lineHeight: BUTTON_TYPOGRAPHY.lineHeight,\n '&:hover': {\n backgroundColor: theme.palette.background.selected,\n borderColor: deploymentSurfaceTokens.strokeOutside,\n },\n '&:active': {\n backgroundColor: theme.palette.background.selected,\n borderColor: deploymentSurfaceTokens.borderDefault,\n },\n '&:disabled': {\n borderColor: theme.palette.grey[300],\n color: theme.palette.grey[500],\n backgroundColor: theme.palette.grey[50],\n },\n '& .MuiButton-startIcon': {\n marginRight: BUTTON_SPACING.iconMargin,\n ...iconStyles,\n },\n '& .MuiButton-endIcon': {\n marginLeft: BUTTON_SPACING.iconMargin,\n ...iconStyles,\n },\n}));\n\nconst StyledTertiaryButton = styled(MuiButton)(({ theme }) => ({\n backgroundColor: 'transparent',\n color: theme.palette.warning.main,\n '&:hover': {\n backgroundColor: 'rgba(245, 158, 11, 0.1)',\n },\n '&:active': {\n backgroundColor: 'rgba(245, 158, 11, 0.2)',\n },\n '&:disabled': {\n color: theme.palette.grey[500],\n },\n}));\n\n/**\n * Tone overlay: white pill on a dark gradient surface (banner CTA).\n * Applied via a wrapper component that takes precedence over per-variant\n * background/border styles by ordering after the variant styles.\n */\nconst StyledOnGradientButton = styled(MuiButton)({\n backgroundColor: 'white',\n color: webSurfaceTokens.robNearBlack2,\n border: 'none',\n borderRadius: `${borderRadius.pill}px`,\n padding: '10px 18px',\n fontWeight: 500,\n fontSize: '14px',\n textTransform: 'none',\n letterSpacing: '0.2px',\n transition: `transform ${motion.dur.fast} ${motion.ease.standard}`,\n boxShadow: 'none',\n '&:hover': {\n backgroundColor: 'white',\n transform: 'translateX(2px)',\n boxShadow: 'none',\n },\n '&:focus-visible': {\n outline: 'none',\n boxShadow: webSurfaceTokens.shadowFocus,\n },\n '& .MuiButton-startIcon': {\n marginRight: BUTTON_SPACING.iconMargin,\n ...iconStyles,\n },\n '& .MuiButton-endIcon': {\n marginLeft: BUTTON_SPACING.iconMargin,\n ...iconStyles,\n },\n});\n\nconst BUTTON_COMPONENTS: Record<ButtonVariant, React.ComponentType<MuiButtonProps>> = {\n primary: StyledPrimaryButton,\n secondary: StyledSecondaryButton,\n tertiary: StyledTertiaryButton,\n};\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant,\n tone = 'default',\n children,\n startIcon,\n endIcon,\n ...props\n },\n ref,\n) {\n const resolvedVariant: ButtonVariant = tone === 'onGradient' ? 'primary' : (variant ?? 'primary');\n const ButtonComponent =\n tone === 'onGradient' ? StyledOnGradientButton : BUTTON_COMPONENTS[resolvedVariant];\n const buttonProps = {\n ...props,\n startIcon,\n endIcon,\n };\n\n return (\n <ButtonComponent ref={ref} {...buttonProps}>\n {children}\n </ButtonComponent>\n );\n});\n"],"mappings":"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","names":["Button"]}
|