@cere/cere-design-system 0.0.45 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/WorkflowNode-BnxXO6t_.d.mts +46 -0
- package/dist/WorkflowNode-BnxXO6t_.d.ts +46 -0
- package/dist/buttons.d.mts +114 -0
- package/dist/buttons.d.ts +114 -0
- package/dist/buttons.js +19 -0
- package/dist/buttons.js.map +1 -0
- package/dist/buttons.mjs +19 -0
- package/dist/buttons.mjs.map +1 -0
- package/dist/carousel.d.mts +51 -0
- package/dist/carousel.d.ts +51 -0
- package/dist/carousel.js +185 -0
- package/dist/carousel.js.map +1 -0
- package/dist/carousel.mjs +185 -0
- package/dist/carousel.mjs.map +1 -0
- package/dist/charts.d.mts +209 -0
- package/dist/charts.d.ts +209 -0
- package/dist/charts.js +20 -0
- package/dist/charts.js.map +1 -0
- package/dist/charts.mjs +20 -0
- package/dist/charts.mjs.map +1 -0
- package/dist/chunk-27JEWSWA.mjs +233 -0
- package/dist/chunk-27JEWSWA.mjs.map +1 -0
- package/dist/chunk-2EBCST6X.js +25 -0
- package/dist/chunk-2EBCST6X.js.map +1 -0
- package/dist/chunk-3WCMINE5.mjs +490 -0
- package/dist/chunk-3WCMINE5.mjs.map +1 -0
- package/dist/chunk-463SRKKD.js +111 -0
- package/dist/chunk-463SRKKD.js.map +1 -0
- package/dist/chunk-5ASG6G6U.mjs +40 -0
- package/dist/chunk-5ASG6G6U.mjs.map +1 -0
- package/dist/chunk-6EUAU67C.mjs +374 -0
- package/dist/chunk-6EUAU67C.mjs.map +1 -0
- package/dist/chunk-AIY6222Q.js +11 -0
- package/dist/chunk-AIY6222Q.js.map +1 -0
- package/dist/chunk-AJBM7IE6.mjs +2366 -0
- package/dist/chunk-AJBM7IE6.mjs.map +1 -0
- package/dist/chunk-ATIFLPH6.mjs +278 -0
- package/dist/chunk-ATIFLPH6.mjs.map +1 -0
- package/dist/chunk-BIZK6FUD.js +37 -0
- package/dist/chunk-BIZK6FUD.js.map +1 -0
- package/dist/chunk-CCN6M4LI.js +103 -0
- package/dist/chunk-CCN6M4LI.js.map +1 -0
- package/dist/chunk-CUCKULYC.mjs +2658 -0
- package/dist/chunk-CUCKULYC.mjs.map +1 -0
- package/dist/chunk-CWJ4OU6W.mjs +45 -0
- package/dist/chunk-CWJ4OU6W.mjs.map +1 -0
- package/dist/chunk-EOF3QNPF.js +2366 -0
- package/dist/chunk-EOF3QNPF.js.map +1 -0
- package/dist/chunk-FFZ5S7PQ.mjs +146 -0
- package/dist/chunk-FFZ5S7PQ.mjs.map +1 -0
- package/dist/chunk-FN5YL4BK.js +278 -0
- package/dist/chunk-FN5YL4BK.js.map +1 -0
- package/dist/chunk-HLH2VWXL.js +2658 -0
- package/dist/chunk-HLH2VWXL.js.map +1 -0
- package/dist/chunk-IE6GCHDI.mjs +530 -0
- package/dist/chunk-IE6GCHDI.mjs.map +1 -0
- package/dist/chunk-JBHRAAN3.js +31 -0
- package/dist/chunk-JBHRAAN3.js.map +1 -0
- package/dist/chunk-JS4IB5IU.mjs +162 -0
- package/dist/chunk-JS4IB5IU.mjs.map +1 -0
- package/dist/chunk-KF2Y7HO3.js +595 -0
- package/dist/chunk-KF2Y7HO3.js.map +1 -0
- package/dist/chunk-KPDYKK3V.js +162 -0
- package/dist/chunk-KPDYKK3V.js.map +1 -0
- package/dist/chunk-KVBMZNWT.mjs +103 -0
- package/dist/chunk-KVBMZNWT.mjs.map +1 -0
- package/dist/chunk-L2TIGA7I.js +530 -0
- package/dist/chunk-L2TIGA7I.js.map +1 -0
- package/dist/chunk-MNM6HE72.js +146 -0
- package/dist/chunk-MNM6HE72.js.map +1 -0
- package/dist/chunk-NXTVJ6PY.js +374 -0
- package/dist/chunk-NXTVJ6PY.js.map +1 -0
- package/dist/chunk-OWWDNDF4.js +40 -0
- package/dist/chunk-OWWDNDF4.js.map +1 -0
- package/dist/chunk-PHMNZK2R.mjs +18 -0
- package/dist/chunk-PHMNZK2R.mjs.map +1 -0
- package/dist/chunk-PWF2NJDB.mjs +377 -0
- package/dist/chunk-PWF2NJDB.mjs.map +1 -0
- package/dist/chunk-QBCRH7YF.mjs +37 -0
- package/dist/chunk-QBCRH7YF.mjs.map +1 -0
- package/dist/chunk-QD6RLAO2.mjs +11 -0
- package/dist/chunk-QD6RLAO2.mjs.map +1 -0
- package/dist/chunk-QY65OUAC.mjs +111 -0
- package/dist/chunk-QY65OUAC.mjs.map +1 -0
- package/dist/chunk-QYYQYZHV.js +45 -0
- package/dist/chunk-QYYQYZHV.js.map +1 -0
- package/dist/chunk-T7LPABOL.mjs +595 -0
- package/dist/chunk-T7LPABOL.mjs.map +1 -0
- package/dist/chunk-THQKYTQE.js +490 -0
- package/dist/chunk-THQKYTQE.js.map +1 -0
- package/dist/chunk-U2QHFISG.js +18 -0
- package/dist/chunk-U2QHFISG.js.map +1 -0
- package/dist/chunk-UPGFBPFX.mjs +25 -0
- package/dist/chunk-UPGFBPFX.mjs.map +1 -0
- package/dist/chunk-X7E6GMFL.js +233 -0
- package/dist/chunk-X7E6GMFL.js.map +1 -0
- package/dist/chunk-XF66WQZE.mjs +1535 -0
- package/dist/chunk-XF66WQZE.mjs.map +1 -0
- package/dist/chunk-YQOZPLTY.js +1535 -0
- package/dist/chunk-YQOZPLTY.js.map +1 -0
- package/dist/chunk-ZGCN5WCG.js +377 -0
- package/dist/chunk-ZGCN5WCG.js.map +1 -0
- package/dist/chunk-ZP26PGMS.mjs +31 -0
- package/dist/chunk-ZP26PGMS.mjs.map +1 -0
- package/dist/feedback.d.mts +356 -0
- package/dist/feedback.d.ts +356 -0
- package/dist/feedback.js +43 -0
- package/dist/feedback.js.map +1 -0
- package/dist/feedback.mjs +43 -0
- package/dist/feedback.mjs.map +1 -0
- package/dist/icons.d.mts +22 -0
- package/dist/icons.d.ts +22 -0
- package/dist/icons.js +23 -0
- package/dist/icons.js.map +1 -0
- package/dist/icons.mjs +23 -0
- package/dist/icons.mjs.map +1 -0
- package/dist/index.d.mts +165 -3080
- package/dist/index.d.ts +165 -3080
- package/dist/index.js +320 -10082
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +262 -9983
- package/dist/index.mjs.map +1 -1
- package/dist/inputs.d.mts +109 -0
- package/dist/inputs.d.ts +109 -0
- package/dist/inputs.js +43 -0
- package/dist/inputs.js.map +1 -0
- package/dist/inputs.mjs +43 -0
- package/dist/inputs.mjs.map +1 -0
- package/dist/layout.d.mts +927 -0
- package/dist/layout.d.ts +927 -0
- package/dist/layout.js +122 -0
- package/dist/layout.js.map +1 -0
- package/dist/layout.mjs +122 -0
- package/dist/layout.mjs.map +1 -0
- package/dist/navigation.d.mts +716 -0
- package/dist/navigation.d.ts +716 -0
- package/dist/navigation.js +58 -0
- package/dist/navigation.js.map +1 -0
- package/dist/navigation.mjs +58 -0
- package/dist/navigation.mjs.map +1 -0
- package/dist/third-party.d.mts +637 -0
- package/dist/third-party.d.ts +637 -0
- package/dist/third-party.js +45 -0
- package/dist/third-party.js.map +1 -0
- package/dist/third-party.mjs +45 -0
- package/dist/third-party.mjs.map +1 -0
- package/dist/utilities.d.mts +39 -0
- package/dist/utilities.d.ts +39 -0
- package/dist/utilities.js +19 -0
- package/dist/utilities.js.map +1 -0
- package/dist/utilities.mjs +19 -0
- package/dist/utilities.mjs.map +1 -0
- package/package.json +55 -1
|
@@ -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","../src/components/layout/DeploymentDashboardCard/DeploymentDashboardCard.tsx","../src/hooks/useControlledExpand.ts","../src/components/layout/DeploymentEntityContextMenu/DeploymentEntityContextMenu.tsx","../src/components/layout/DeploymentEntityContextMenu/contextMenuItems.tsx","../src/components/layout/DeploymentDashboardTree/DeploymentDashboardTree.tsx","../src/components/layout/DeploymentDashboardPanel/DeploymentDashboardPanel.tsx","../src/components/layout/WorkflowTopBar/WorkflowTopBar.tsx","../src/components/layout/WorkflowSideInspector/WorkflowSideInspector.tsx","../src/components/layout/WorkflowTimeBar/WorkflowTimeBar.tsx"],"sourcesContent":["import { Stack, styled, svgIconClasses } from '@mui/material';\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 {\n Dialog as MuiDialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Button,\n IconButton,\n Box,\n Typography,\n Divider,\n DialogProps as MuiDialogProps,\n CircularProgress,\n} from '@mui/material';\nimport CloseIcon from '@mui/icons-material/Close';\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, IconButton, Typography, Divider, Tabs, Tab, BoxProps } from '@mui/material';\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';\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 * Hex literals are inlined here intentionally: these are brand-canonical\n * gradient stops that do not correspond to a single theme token. Move them\n * to `src/theme/primitives.ts` if a second consumer ever needs them.\n */\n/* eslint-disable no-restricted-syntax */\nconst PALETTES = [\n { base: 'linear-gradient(115deg, #0d0627 0%, #23194b 55%, #8B00EC 130%)', blobA: '#BD32A7', blobB: '#8B00EC' },\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 {\n List as MuiList,\n ListItem as MuiListItem,\n ListItemText,\n ListItemIcon,\n ListItemSecondaryAction,\n ListProps as MuiListProps,\n ListItemProps as MuiListItemProps,\n} from '@mui/material';\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 {\n Table as MuiTable,\n TableBody,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n TableProps as MuiTableProps,\n TableSortLabel,\n} from '@mui/material';\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 { Grid2 as Grid } from '@mui/material';\nexport type { Grid2Props as GridProps } from '@mui/material';\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 {\n Accordion as MuiAccordion,\n AccordionSummary,\n AccordionDetails,\n AccordionProps as MuiAccordionProps,\n} from '@mui/material';\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 { Stack } from '@mui/material';\nexport type { StackProps } from '@mui/material';\n\n","export { Box } from '@mui/material';\nexport type { BoxProps } from '@mui/material';\n\n","export { Container } from '@mui/material';\nexport type { ContainerProps } from '@mui/material';\n\n","import React from 'react';\nimport {\n AppBar as MuiAppBar,\n Toolbar,\n AppBarProps as MuiAppBarProps,\n ToolbarProps,\n} from '@mui/material';\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 {\n Collapse as MuiCollapse,\n CollapseProps as MuiCollapseProps,\n} from '@mui/material';\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","import React from 'react';\nimport {\n Paper,\n Box,\n Typography,\n IconButton,\n useTheme,\n LinearProgress,\n} from '@mui/material';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport WorkOutlineIcon from '@mui/icons-material/WorkOutline';\nimport WavesIcon from '@mui/icons-material/Waves';\nimport RocketLaunchOutlinedIcon from '@mui/icons-material/RocketLaunchOutlined';\nimport InsertLinkIcon from '@mui/icons-material/InsertLink';\nimport SmartToyOutlinedIcon from '@mui/icons-material/SmartToyOutlined';\nimport { styled } from '@mui/material/styles';\nimport {\n deploymentEntityColors,\n deploymentStatusColors,\n deploymentSurfaceTokens as tokens,\n} from '../../../theme';\nimport { useControlledExpand } from '@/hooks/useControlledExpand';\nimport { IDBlock } from '../../feedback/IDBlock';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type DeploymentEntityType =\n | 'workspace'\n | 'stream'\n | 'deployment'\n | 'engagement'\n | 'agent';\n\nexport type DeploymentStatusIndicator =\n | 'normal'\n | 'warning'\n | 'error'\n | 'disabled'\n | null;\n\nexport interface DeploymentCardAction {\n id: string;\n label: string;\n icon?: React.ReactNode;\n onClick?: () => void;\n highlight?: boolean;\n outlined?: boolean;\n}\n\nexport interface DeploymentDashboardCardProps {\n /** Entity type: drives chip color and icon (Figma 15-1725, 15-1276) */\n entityType: DeploymentEntityType;\n /** Primary title */\n title: string;\n /** Display id; when present shows \"ID: {id}\" with copy action */\n id?: string;\n /** Shown as \"Created: …\" */\n createdAt?: string;\n /** Shown as \"Last Updated: …\" */\n updatedAt?: string;\n /** Only for entityType === 'deployment'; shows Capacity label, progress bar, \"X%\" */\n capacity?: number;\n /** Action buttons/chips rendered inline on the right */\n actions?: DeploymentCardAction[];\n /** Status dot: green (normal), amber (warning), red (error), white/dim (disabled) */\n statusIndicator?: DeploymentStatusIndicator;\n /** Whether to show expand/collapse chevron on the left */\n expandable?: boolean;\n /** Controlled expanded state */\n expanded?: boolean;\n /** Called when chevron is clicked */\n onExpandToggle?: () => void;\n /** When copy ID is clicked */\n onCopyId?: () => void;\n /** Optional className */\n className?: string;\n /** Child content rendered inside the card border (used by tree to nest children) */\n children?: React.ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Entity constants\n// ---------------------------------------------------------------------------\n\nconst ENTITY_LABELS: Record<DeploymentEntityType, string> = {\n workspace: 'Workspace',\n stream: 'Stream',\n deployment: 'Deployment',\n engagement: 'Engagement',\n agent: 'Agent',\n};\n\nconst ENTITY_ICON_SIZE = 16;\n\nconst ENTITY_ICONS: Record<DeploymentEntityType, React.ReactNode> = {\n workspace: <WorkOutlineIcon sx={{ fontSize: ENTITY_ICON_SIZE }} />,\n stream: <WavesIcon sx={{ fontSize: ENTITY_ICON_SIZE }} />,\n deployment: <RocketLaunchOutlinedIcon sx={{ fontSize: ENTITY_ICON_SIZE }} />,\n engagement: <InsertLinkIcon sx={{ fontSize: ENTITY_ICON_SIZE }} />,\n agent: <SmartToyOutlinedIcon sx={{ fontSize: ENTITY_ICON_SIZE }} />,\n};\n\nconst STATUS_DOT_COLORS: Record<string, string> = {\n normal: deploymentStatusColors.normal,\n warning: deploymentStatusColors.warning,\n error: deploymentStatusColors.error,\n disabled: deploymentStatusColors.disabledDim,\n};\n\nconst CHEVRON_SIZE = 16;\n\n// Entity chip styling constants matching Figma specs\nconst ENTITY_CHIP_STYLES = {\n borderRadius: '12px',\n borderWidth: '1.5px',\n padding: { left: 0.75, right: 1, vertical: 0.25 },\n gap: 0.5,\n} as const;\n\nconst ENTITY_CHIP_TYPOGRAPHY = {\n fontSize: '12px',\n fontWeight: 500,\n lineHeight: 1.33,\n letterSpacing: '0.07px',\n} as const;\n\n// ---------------------------------------------------------------------------\n// Sub-components\n// ---------------------------------------------------------------------------\n\n/** Status dot colored by severity (Figma 15-1725) */\nconst StatusDot = styled(Box, {\n shouldForwardProp: (p) => p !== 'status',\n})<{ status: DeploymentStatusIndicator }>(({ status }) => ({\n width: 8,\n height: 8,\n borderRadius: '50%',\n backgroundColor: status ? STATUS_DOT_COLORS[status] ?? 'transparent' : 'transparent',\n flexShrink: 0,\n}));\n\n/** Colored entity type pill (Figma 15-1725: outlined chip with icon) */\nconst EntityChip: React.FC<{\n entityType: DeploymentEntityType;\n color: string;\n}> = ({ entityType, color }) => (\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: ENTITY_CHIP_STYLES.gap,\n pl: ENTITY_CHIP_STYLES.padding.left,\n pr: ENTITY_CHIP_STYLES.padding.right,\n py: ENTITY_CHIP_STYLES.padding.vertical,\n borderRadius: ENTITY_CHIP_STYLES.borderRadius,\n backgroundColor: tokens.surfaceHigh,\n border: `${ENTITY_CHIP_STYLES.borderWidth} solid ${color}`,\n flexShrink: 0,\n }}\n >\n <Box sx={{ color, display: 'flex', alignItems: 'center' }}>\n {ENTITY_ICONS[entityType]}\n </Box>\n <Typography\n variant=\"body2\"\n fontWeight={ENTITY_CHIP_TYPOGRAPHY.fontWeight}\n sx={{\n color: 'common.black',\n lineHeight: ENTITY_CHIP_TYPOGRAPHY.lineHeight,\n fontSize: ENTITY_CHIP_TYPOGRAPHY.fontSize,\n letterSpacing: ENTITY_CHIP_TYPOGRAPHY.letterSpacing,\n }}\n >\n {ENTITY_LABELS[entityType]}\n </Typography>\n </Box>\n);\n\n/** Capacity progress bar — deployment only (Figma 15-1725) */\nconst CapacityBar: React.FC<{\n value: number;\n indented?: boolean;\n}> = ({ value, indented = false }) => (\n <Box sx={{ pl: indented ? '40px' : 0, pr: '20px', py: 1 }}>\n <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 1 }}>\n <Typography variant=\"body2\" sx={{ color: tokens.textPrimary }}>\n Capacity\n </Typography>\n <Typography variant=\"body2\" sx={{ color: tokens.accentBlue }}>\n {value}%\n </Typography>\n </Box>\n <LinearProgress\n variant=\"determinate\"\n value={value}\n sx={{\n height: 4,\n borderRadius: '20px',\n backgroundColor: tokens.strokeOutside,\n '& .MuiLinearProgress-bar': {\n borderRadius: '20px',\n backgroundColor: tokens.accentBlue,\n },\n }}\n />\n </Box>\n);\n\n/** Helper to get action button styles based on variant */\nconst getActionButtonStyles = (action: DeploymentCardAction) => {\n const baseStyles = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 0.5,\n cursor: action.onClick ? 'pointer' : 'default',\n background: 'none',\n font: 'inherit',\n color: tokens.textPrimary,\n whiteSpace: 'nowrap',\n '&:hover': action.onClick ? { opacity: 0.7 } : undefined,\n } as const;\n\n const variantStyles = action.outlined\n ? {\n border: `1px solid ${tokens.strokeOutside}`,\n borderRadius: '8px',\n p: 1,\n bgcolor: 'white',\n }\n : {\n border: 'none',\n p: 0,\n };\n\n return { ...baseStyles, ...variantStyles };\n};\n\n/** Single action button/chip */\nconst CardAction: React.FC<{ action: DeploymentCardAction }> = ({ action }) => (\n <Box\n component={action.onClick ? 'button' : 'span'}\n onClick={action.onClick}\n sx={getActionButtonStyles(action)}\n >\n {action.icon && (\n <Box component=\"span\" sx={{ display: 'flex', alignItems: 'center' }}>\n {action.icon}\n </Box>\n )}\n {action.label && (\n <Typography variant=\"body2\" fontWeight={500} component=\"span\" sx={{ fontSize: '14px' }}>\n {action.label}\n </Typography>\n )}\n </Box>\n);\n\n/** Inline action items rendered in the right column */\nconst CardActionList: React.FC<{\n actions: DeploymentCardAction[];\n}> = ({ actions }) => (\n <>\n {actions.map((action) => (\n <CardAction key={action.id} action={action} />\n ))}\n </>\n);\n\n// ---------------------------------------------------------------------------\n// Main component\n// ---------------------------------------------------------------------------\n\nexport const DeploymentDashboardCard: React.FC<DeploymentDashboardCardProps> = ({\n entityType,\n title,\n id: idDisplay,\n createdAt,\n updatedAt,\n capacity,\n actions = [],\n statusIndicator = null,\n expandable = false,\n expanded: controlledExpanded,\n onExpandToggle,\n onCopyId,\n className,\n children,\n}) => {\n const theme = useTheme();\n const entityColor =\n theme.palette.deployment?.entity?.[entityType] ?? deploymentEntityColors[entityType];\n\n const isControlled = expandable && onExpandToggle != null;\n const { expanded, toggle } = useControlledExpand(\n isControlled ? controlledExpanded : undefined,\n isControlled ? onExpandToggle : undefined,\n );\n\n const isWorkspace = entityType === 'workspace';\n const isDeployment = entityType === 'deployment';\n\n const getClampedCapacity = (capacity: number | undefined): number | undefined => {\n if (!isDeployment || capacity == null) {\n return undefined;\n }\n return Math.min(100, Math.max(0, capacity));\n };\n\n const capacityClamped = getClampedCapacity(capacity);\n\n return (\n <Paper\n className={className}\n elevation={0}\n sx={{\n border: `1px solid ${isWorkspace ? tokens.accentBlue : tokens.borderDefault}`,\n borderRadius: isWorkspace ? '4px' : '12px',\n boxShadow: isWorkspace ? tokens.workspaceShadow : 'none',\n px: 1,\n py: isDeployment ? 2 : 1,\n pl: 1,\n display: 'flex',\n flexDirection: 'column',\n gap: 0,\n }}\n >\n {/* Main row: left column + right column */}\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: isDeployment ? 'flex-start' : 'center',\n width: '100%',\n }}\n >\n {/* Left column */}\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 0.5, minWidth: 0 }}>\n {/* Title row: [chevron/spacer] [entity chip] [title] [ID badge] */}\n <Box sx={{ display: 'flex', gap: 1, alignItems: 'center' }}>\n {expandable ? (\n <IconButton\n size=\"small\"\n onClick={toggle}\n aria-label={expanded ? 'Collapse' : 'Expand'}\n sx={{ p: '5px' }}\n >\n {expanded ? (\n <ExpandMoreIcon sx={{ fontSize: CHEVRON_SIZE, color: tokens.accentBlue }} />\n ) : (\n <ChevronRightIcon sx={{ fontSize: CHEVRON_SIZE, color: tokens.accentBlue }} />\n )}\n </IconButton>\n ) : (\n <Box sx={{ width: 26, flexShrink: 0 }} />\n )}\n\n <EntityChip entityType={entityType} color={entityColor} />\n\n <Typography\n variant=\"subtitle1\"\n fontWeight={500}\n noWrap\n sx={{ color: tokens.textPrimary, fontSize: '16px', letterSpacing: '0.08px' }}\n >\n {title}\n </Typography>\n\n {idDisplay != null && <IDBlock id={idDisplay} label=\"ID\" entityType={entityType} onCopy={onCopyId} />}\n </Box>\n\n {/* Timestamps */}\n {(createdAt != null || updatedAt != null) && (\n <Box\n sx={{\n display: 'flex',\n gap: 2,\n px: '34px',\n color: tokens.textSecondary,\n }}\n >\n {createdAt != null && (\n <Typography variant=\"body2\" sx={{ color: 'inherit', fontSize: '14px' }}>\n Created: {createdAt}\n </Typography>\n )}\n {updatedAt != null && (\n <Typography variant=\"body2\" sx={{ color: 'inherit', fontSize: '14px' }}>\n Last Updated: {updatedAt}\n </Typography>\n )}\n </Box>\n )}\n\n {/* Capacity bar — deployment only */}\n {capacityClamped !== undefined && (\n <CapacityBar value={capacityClamped} indented={expandable} />\n )}\n </Box>\n\n {/* Right column: status dot, actions, context menu */}\n <Box sx={{ display: 'flex', gap: 1, alignItems: 'center', flexShrink: 0 }}>\n {statusIndicator != null && <StatusDot status={statusIndicator} aria-hidden />}\n\n <CardActionList actions={actions} />\n </Box>\n </Box>\n\n {/* Children rendered inside the card border (tree nests children here) */}\n {children && (\n <Box sx={{ mt: 1.5, display: 'flex', flexDirection: 'column', gap: 1 }}>\n {children}\n </Box>\n )}\n </Paper>\n );\n};\n","import { useState } from 'react';\n\n/**\n * Shared hook for controlled/uncontrolled expand state.\n *\n * - **Controlled**: when `controlledExpanded` is defined and `onToggle` is provided,\n * the consumer owns the state.\n * - **Uncontrolled**: otherwise, the hook manages its own internal state starting\n * from `defaultExpanded`.\n */\nexport function useControlledExpand(\n controlledExpanded: boolean | undefined,\n onToggle: (() => void) | undefined,\n defaultExpanded = false,\n) {\n const [internal, setInternal] = useState(defaultExpanded);\n const isControlled = controlledExpanded !== undefined && onToggle != null;\n const expanded = isControlled ? controlledExpanded! : internal;\n const toggle = isControlled\n ? () => onToggle!()\n : () => setInternal((prev) => !prev);\n return { expanded, toggle };\n}\n","import React from 'react';\nimport { Menu, MenuItem, Switch, Divider, ListItemIcon, ListItemText } from '@mui/material';\nimport { styled } from '@mui/material/styles';\nimport { deploymentSurfaceTokens as tokens } from '../../../theme';\nimport type { ContextMenuItem } from './contextMenuItems';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type { ContextMenuItem } from './contextMenuItems';\n\nexport interface DeploymentEntityContextMenuProps {\n /** Controlled open state */\n open: boolean;\n /** Anchor element for menu position */\n anchorEl: HTMLElement | null;\n /** Callback when the menu closes */\n onClose: () => void;\n /** Menu items to render (use contextMenuItems helpers to build) */\n items: ContextMenuItem[];\n /** Whether to show an \"Enable\" row with toggle at the bottom (legacy — prefer inline toggle item) */\n enableToggle?: boolean;\n /** Toggle checked state */\n enableChecked?: boolean;\n /** Toggle callback */\n onEnableChange?: (checked: boolean) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Styled wrappers – matching Figma 11-1102\n// ---------------------------------------------------------------------------\n\n/** Menu paper: 4px radius, Figma shadow, 8px inner padding */\nconst StyledMenu = styled(Menu)({\n '& .MuiPaper-root': {\n borderRadius: 4,\n boxShadow: tokens.workspaceShadow,\n minWidth: 220,\n border: `1px solid ${tokens.strokeOutside}`,\n padding: 8,\n },\n '& .MuiList-root': {\n padding: 0,\n },\n});\n\n/** Standard menu item: 24px icon, 16px/500 label, 8px vertical padding */\nconst StyledMenuItem = styled(MenuItem)({\n gap: 8,\n padding: '8px 0',\n borderRadius: 4,\n minHeight: 'auto',\n '&:hover': {\n backgroundColor: tokens.hoverLight,\n },\n '& .MuiListItemIcon-root': {\n minWidth: 'auto',\n color: tokens.textPrimary,\n '& .MuiSvgIcon-root': {\n fontSize: 24,\n },\n },\n '& .MuiListItemText-root .MuiTypography-root': {\n fontSize: 16,\n fontWeight: 500,\n lineHeight: 1.5,\n letterSpacing: '0.08px',\n color: tokens.textPrimary,\n },\n});\n\n/** Highlighted menu item for active/special rows (e.g. Agent Flow Visualization) */\nconst HighlightedMenuItem = styled(StyledMenuItem)({\n backgroundColor: tokens.highlightBg,\n border: `1px solid ${tokens.highlightBorder}`,\n padding: 8,\n '&:hover': {\n backgroundColor: tokens.highlightBgHover,\n },\n});\n\n/** Toggle row: switch on left + label (uses MenuItem for MUI compliance) */\nconst ToggleMenuItem = styled(MenuItem)({\n gap: 8,\n padding: '8px 0',\n cursor: 'default',\n minHeight: 'auto',\n '&:hover': {\n backgroundColor: 'transparent',\n },\n '& .MuiListItemText-root .MuiTypography-root': {\n fontSize: 16,\n fontWeight: 500,\n lineHeight: 1.5,\n letterSpacing: '0.08px',\n color: tokens.textPrimary,\n },\n});\n\n/** Green toggle switch matching Figma design */\nconst EnableSwitch = styled(Switch)(({ theme }) => ({\n width: 32,\n height: 20,\n padding: 0,\n '& .MuiSwitch-switchBase': {\n padding: 2,\n '&.Mui-checked': {\n transform: 'translateX(12px)',\n color: theme.palette.common.white,\n '& + .MuiSwitch-track': {\n backgroundColor: tokens.switchGreen,\n opacity: 1,\n },\n },\n },\n '& .MuiSwitch-thumb': {\n width: 16,\n height: 16,\n },\n '& .MuiSwitch-track': {\n borderRadius: 100,\n backgroundColor: tokens.switchTrackOff,\n opacity: 1,\n },\n}));\n\n/** Divider matching Figma stroke/outside token */\nconst StyledDivider = styled(Divider)({\n margin: '0 !important',\n borderColor: tokens.strokeOutside,\n});\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Floating context menu for deployment entities.\n *\n * Use the `contextMenuItems` factory to compose your menu. Supports action items,\n * dividers, toggle rows, and highlighted (active-state) items.\n *\n * @see {@link https://www.figma.com/design/xky11VbkkFcgZLwZE8BdCN/ROB?node-id=11-1102 Figma 11-1102}\n */\nexport const DeploymentEntityContextMenu: React.FC<DeploymentEntityContextMenuProps> = ({\n open,\n anchorEl,\n onClose,\n items,\n enableToggle = false,\n enableChecked = false,\n onEnableChange,\n}) => {\n return (\n <StyledMenu\n anchorEl={anchorEl}\n open={open}\n onClose={onClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { 'aria-label': 'Entity context menu' } }}\n >\n {items.map((item) => {\n if (item.type === 'divider') {\n return <StyledDivider key={item.id} />;\n }\n\n if (item.type === 'toggle') {\n return (\n <ToggleMenuItem key={item.id} disableRipple>\n {onEnableChange && (\n <EnableSwitch\n size=\"small\"\n checked={enableChecked}\n onChange={(_, checked) => onEnableChange(checked)}\n inputProps={{ 'aria-label': item.label }}\n />\n )}\n <ListItemText primary={item.label} />\n </ToggleMenuItem>\n );\n }\n\n const Row = item.highlighted ? HighlightedMenuItem : StyledMenuItem;\n return (\n <Row\n key={item.id}\n onClick={() => {\n item.onClick?.();\n onClose();\n }}\n >\n {item.icon && <ListItemIcon>{item.icon}</ListItemIcon>}\n <ListItemText primary={item.label} />\n </Row>\n );\n })}\n {enableToggle && (\n <>\n <StyledDivider />\n <ToggleMenuItem disableRipple>\n {onEnableChange && (\n <EnableSwitch\n size=\"small\"\n checked={enableChecked}\n onChange={(_, checked) => onEnableChange(checked)}\n inputProps={{ 'aria-label': 'Enable' }}\n />\n )}\n <ListItemText primary=\"Enable\" />\n </ToggleMenuItem>\n </>\n )}\n </StyledMenu>\n );\n};\n","import React from 'react';\nimport AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline';\nimport EditIcon from '@mui/icons-material/Edit';\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport SmartToyOutlinedIcon from '@mui/icons-material/SmartToyOutlined';\nimport DescriptionIcon from '@mui/icons-material/Description';\nimport SettingsIcon from '@mui/icons-material/Settings';\n\n/**\n * Describes a single item inside {@link DeploymentEntityContextMenu}.\n *\n * Items can be action rows (icon + label), toggle rows (switch + label),\n * or visual dividers. Use the pre-built `contextMenuItems` factories\n * for standard deployment-entity actions.\n *\n * @see Figma 11-1102\n */\nexport interface ContextMenuItem {\n /** Unique key used for React reconciliation */\n id: string;\n /** Display label shown next to the icon */\n label: string;\n /** Optional leading icon (24 × 24) */\n icon?: React.ReactNode;\n /** Click handler — called when an action item is selected */\n onClick?: () => void;\n /**\n * Item variant:\n * - `'action'` (default) — clickable row with icon + label\n * - `'toggle'` — switch on left + label, controlled by `enableChecked` / `onEnableChange`\n * - `'divider'` — horizontal separator (label is ignored)\n */\n type?: 'action' | 'toggle' | 'divider';\n /**\n * When `true` the item renders with a blue highlight background\n * (Figma blue-50 / blue-100 tokens). Used for the \"Agent Flow Visualization\" row.\n * @default false\n */\n highlighted?: boolean;\n}\n\n/** Pre-built item factories for common deployment entity actions (Figma 11-1102) */\nexport const contextMenuItems = {\n /** Add Engagement action (Add Circle icon) */\n addEngagement: (onClick: () => void): ContextMenuItem => ({\n id: 'add-engagement',\n label: 'Add Engagement',\n icon: <AddCircleOutlineIcon />,\n onClick,\n }),\n /** Add Agent action (Add Circle icon) */\n addAgent: (onClick: () => void): ContextMenuItem => ({\n id: 'add-agent',\n label: 'Add Agent',\n icon: <AddCircleOutlineIcon />,\n onClick,\n }),\n /** Add Stream action (Add Circle icon) */\n addStream: (onClick: () => void): ContextMenuItem => ({\n id: 'add-stream',\n label: 'Add Stream',\n icon: <AddCircleOutlineIcon />,\n onClick,\n }),\n /** Edit action (Pen / Edit icon) */\n edit: (onClick: () => void): ContextMenuItem => ({\n id: 'edit',\n label: 'Edit',\n icon: <EditIcon />,\n onClick,\n }),\n /** Copy ID action (Copy icon) */\n copyId: (onClick: () => void): ContextMenuItem => ({\n id: 'copy-id',\n label: 'Copy ID',\n icon: <ContentCopyIcon />,\n onClick,\n }),\n /** Agent Flow Visualization — highlighted action (SmartToy icon) */\n agentFlowVisualization: (onClick: () => void): ContextMenuItem => ({\n id: 'agent-flow',\n label: 'Agent Flow Visualization',\n icon: <SmartToyOutlinedIcon />,\n onClick,\n highlighted: true,\n }),\n /** View Logs action (Document / Description icon) */\n viewLogs: (onClick: () => void): ContextMenuItem => ({\n id: 'view-logs',\n label: 'View Logs',\n icon: <DescriptionIcon />,\n onClick,\n }),\n /** Horizontal divider between sections */\n divider: (): ContextMenuItem => ({\n id: 'divider',\n label: '',\n type: 'divider',\n }),\n /** Enable toggle row (switch on left + label) */\n enable: (): ContextMenuItem => ({\n id: 'enable',\n label: 'Enable',\n type: 'toggle',\n }),\n /** Settings action (Settings / Gear icon) */\n settings: (onClick: () => void): ContextMenuItem => ({\n id: 'settings',\n label: 'Settings',\n icon: <SettingsIcon />,\n onClick,\n }),\n} as const;\n","import React from 'react';\nimport { Box } from '@mui/material';\nimport { styled, alpha } from '@mui/material/styles';\nimport { deploymentEntityColors } from '../../../theme';\nimport { useControlledExpand } from '@/hooks/useControlledExpand';\nimport { DeploymentDashboardCard } from '../DeploymentDashboardCard/DeploymentDashboardCard';\nimport type {\n DeploymentEntityType,\n DeploymentCardAction,\n DeploymentStatusIndicator,\n} from '../DeploymentDashboardCard/DeploymentDashboardCard';\n\nexport interface DeploymentTreeNode {\n id: string;\n entityType: DeploymentEntityType;\n title: string;\n idDisplay?: string;\n createdAt?: string;\n updatedAt?: string;\n capacity?: number;\n actions?: DeploymentCardAction[];\n statusIndicator?: DeploymentStatusIndicator;\n children?: DeploymentTreeNode[];\n expanded?: boolean;\n}\n\nexport interface DeploymentDashboardTreeProps {\n /** Tree of entities */\n nodes: DeploymentTreeNode[];\n /** When a row's expand is toggled */\n onExpandToggle?: (nodeId: string) => void;\n /** When a card's copy-ID button is clicked */\n onCopyId?: (nodeId: string) => void;\n /** Override row content; default: render DeploymentDashboardCard from node data */\n renderCard?: (node: DeploymentTreeNode) => React.ReactNode;\n}\n\n/**\n * Figma 15-1276 spacing (fixed, not dynamic). From variable defs:\n * Units/sp-4 = 4px, Units/sp-8 = 8px (S), Units/sp-12 = 12px, Units/sp-16 = 16px (M).\n * Use these so tree indent and row gaps match the design exactly.\n */\nconst TREE_SP = {\n /** Vertical gap between sibling rows (Figma S / sp-8) */\n rowGap: 8,\n /** Gap between rail and children column (Figma sp-12) */\n railGap: 12,\n /** Rail width (Figma) */\n railWidth: 4,\n /** Total horizontal indent per level = railWidth + railGap (Figma M = 16) */\n indentPerLevel: 4 + 12,\n} as const;\n\n/**\n * Rail opacity per entity type — matching Figma 15-1276 absolute-positioned bars:\n * workspace rgba(182,95,244,0.5) → 0.5\n * stream rgba(83,185,106,0.5) → 0.5\n * deployment rgba(238,181,16,0.4) → 0.4\n * engagement rgba(217,72,201,0.4) → 0.4\n * agent (follows pattern) → 0.4\n */\nconst RAIL_OPACITY: Record<DeploymentEntityType, number> = {\n workspace: 0.5,\n stream: 0.5,\n deployment: 0.4,\n engagement: 0.4,\n agent: 0.4,\n};\n\nconst Rail = styled(Box, {\n shouldForwardProp: (p) => p !== 'railColor',\n})<{ railColor: string }>(({ railColor }) => ({\n width: TREE_SP.railWidth,\n borderRadius: TREE_SP.railWidth / 2,\n backgroundColor: railColor,\n flexShrink: 0,\n alignSelf: 'stretch',\n}));\n\nconst TreeRow: React.FC<{\n node: DeploymentTreeNode;\n depth: number;\n onExpandToggle?: (nodeId: string) => void;\n onCopyId?: (nodeId: string) => void;\n renderCard?: (node: DeploymentTreeNode) => React.ReactNode;\n}> = ({ node, depth, onExpandToggle, onCopyId, renderCard }) => {\n const hasChildren = Boolean(node.children && node.children.length > 0);\n\n const { expanded, toggle } = useControlledExpand(\n onExpandToggle != null ? node.expanded : undefined,\n onExpandToggle ? () => onExpandToggle(node.id) : undefined,\n node.expanded ?? false,\n );\n\n const entityColor =\n deploymentEntityColors[node.entityType] ?? deploymentEntityColors.workspace;\n const railOpacity = RAIL_OPACITY[node.entityType] ?? 0.5;\n const railColor = alpha(entityColor, railOpacity);\n\n /*\n * Rendered children — wrapped with the PARENT's rail so the rail sits\n * inside the card border, alongside the children (Figma 15-1276).\n * Agents are leaf nodes so they never contribute a rail.\n * Spacing: TREE_SP (fixed Figma Units/sp-8, sp-12, M=16).\n */\n const renderedChildren =\n hasChildren && expanded ? (\n <Box sx={{ display: 'flex', gap: `${TREE_SP.railGap}px` }}>\n {/* Parent's rail — inside the card border, next to children */}\n <Rail railColor={railColor} aria-hidden data-rail />\n\n <Box\n role=\"group\"\n sx={{\n flex: 1,\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: `${TREE_SP.rowGap}px`,\n }}\n >\n {node.children!.map((child) => (\n <TreeRow\n key={child.id}\n node={child}\n depth={depth + 1}\n onExpandToggle={onExpandToggle}\n onCopyId={onCopyId}\n renderCard={renderCard}\n />\n ))}\n </Box>\n </Box>\n ) : null;\n\n const cardContent =\n renderCard?.(node) ?? (\n <DeploymentDashboardCard\n entityType={node.entityType}\n title={node.title}\n id={node.idDisplay}\n createdAt={node.createdAt}\n updatedAt={node.updatedAt}\n capacity={node.capacity}\n actions={node.actions}\n statusIndicator={node.statusIndicator}\n expandable={hasChildren}\n expanded={expanded}\n onExpandToggle={hasChildren ? toggle : undefined}\n onCopyId={\n onCopyId && node.idDisplay\n ? () => onCopyId(node.id)\n : undefined\n }\n >\n {renderedChildren}\n </DeploymentDashboardCard>\n );\n\n return (\n <Box role=\"treeitem\">\n {cardContent}\n </Box>\n );\n};\n\nexport const DeploymentDashboardTree: React.FC<DeploymentDashboardTreeProps> = ({\n nodes,\n onExpandToggle,\n onCopyId,\n renderCard,\n}) => {\n return (\n <Box\n role=\"tree\"\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: `${TREE_SP.rowGap}px`,\n p: `${TREE_SP.rowGap}px`,\n }}\n >\n {nodes.map((node) => (\n <TreeRow\n key={node.id}\n node={node}\n depth={0}\n onExpandToggle={onExpandToggle}\n onCopyId={onCopyId}\n renderCard={renderCard}\n />\n ))}\n </Box>\n );\n};\n","import React from 'react';\nimport { Box } from '@mui/material';\nimport { styled } from '@mui/material/styles';\nimport { deploymentSurfaceTokens as tokens } from '../../../theme';\n\n/**\n * Backdrop/background panel for the deployment list (Figma 15-1325).\n * Wraps the deployment tree or list in a rounded, light surface with a subtle border\n * so the list has a clear visual container.\n */\nexport interface DeploymentDashboardPanelProps {\n /** Content (e.g. DeploymentDashboardTree or a list of DeploymentDashboardCards) */\n children: React.ReactNode;\n /** Optional className */\n className?: string;\n /** Optional padding override; default uses theme spacing */\n padding?: number | string;\n}\n\nconst PANEL_RADIUS = 12;\nconst PANEL_SHADOW = '0px 1px 3px rgba(0, 0, 0, 0.08)';\n\nconst StyledPanel = styled(Box)({\n backgroundColor: tokens.surfaceHigh,\n border: `1px solid ${tokens.strokeOutside}`,\n borderRadius: PANEL_RADIUS,\n boxShadow: PANEL_SHADOW,\n overflow: 'hidden',\n});\n\nexport const DeploymentDashboardPanel: React.FC<DeploymentDashboardPanelProps> = ({\n children,\n className,\n padding = 2,\n}) => {\n return (\n <StyledPanel className={className} sx={{ p: padding }}>\n {children}\n </StyledPanel>\n );\n};\n","import React from 'react';\nimport {\n Box,\n Divider,\n IconButton,\n InputBase,\n Typography,\n alpha,\n} from '@mui/material';\nimport type { BoxProps } from '@mui/material/Box';\nimport CloseIcon from '@mui/icons-material/Close';\nimport CancelIcon from '@mui/icons-material/Cancel';\nimport type { Theme } from '@mui/material/styles';\nimport { useTheme } from '@mui/material/styles';\nimport { Button } from '../../buttons/Button';\nimport { deploymentSurfaceTokens } from '../../../theme';\n\nexport interface WorkflowTopBarProps extends Omit<BoxProps, 'title'> {\n /** Heading shown at the left side of the bar. */\n title?: string;\n /** Job identifier displayed in the Job ID field. */\n executionId: string;\n /** Label shown above the job ID input. Defaults to \"Job ID\". */\n executionIdLabel?: string;\n /** Called when the job ID value changes. */\n onExecutionIdChange?: (value: string) => void;\n /** Called when the job ID clear action is pressed. */\n onClearExecutionId?: () => void;\n /** Submit button label. */\n submitLabel?: string;\n /** Called when submit is pressed. */\n onSubmit?: () => void;\n /** Inspector toggle button label. */\n inspectorLabel?: string;\n /** Called when inspector toggle is pressed. */\n onInspectorToggle?: () => void;\n /** Called when close is pressed. */\n onClose?: () => void;\n /** Hides/shows the inspector toggle button. */\n showInspectorToggle?: boolean;\n /** Hides/shows the close icon action. */\n showCloseButton?: boolean;\n}\n\n/**\n * WorkflowTopBar\n *\n * Top chrome bar for workflow canvas screens based on Figma 277:8006.\n */\nexport const WorkflowTopBar: React.FC<WorkflowTopBarProps> = ({\n title = 'Agent visualization flow chart',\n executionId,\n executionIdLabel = 'Job ID',\n onExecutionIdChange,\n onClearExecutionId,\n submitLabel = 'Submit',\n onSubmit,\n inspectorLabel = 'Inspector',\n onInspectorToggle,\n onClose,\n showInspectorToggle = true,\n showCloseButton = true,\n sx,\n ...boxProps\n}) => {\n const chrome = (useTheme() as Theme).palette.workflow.chrome;\n\n return (\n <Box\n sx={[\n {\n backgroundColor: 'common.white',\n display: 'flex',\n flexDirection: 'column',\n width: '100%',\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...boxProps}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 2,\n px: 2,\n py: 2,\n minHeight: 72,\n }}\n >\n <Typography\n variant=\"subtitle1\"\n sx={{\n color: deploymentSurfaceTokens.textPrimary,\n fontWeight: 500,\n minWidth: 220,\n }}\n >\n {title}\n </Typography>\n\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n justifyContent: 'flex-end',\n flex: 1,\n minWidth: 0,\n }}\n >\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n backgroundColor: chrome.inputBg,\n borderRadius: '4px 4px 0 0',\n borderBottom: `2px solid ${chrome.inputBorder}`,\n px: 2,\n minWidth: 320,\n maxWidth: 440,\n flex: '1 1 auto',\n minHeight: 56,\n }}\n >\n <Box sx={{ flex: 1, minWidth: 0 }}>\n <Typography\n variant=\"caption\"\n sx={{\n color: chrome.labelText,\n fontSize: 12,\n display: 'block',\n }}\n >\n {executionIdLabel}\n </Typography>\n <InputBase\n value={executionId}\n onChange={(event) => onExecutionIdChange?.(event.target.value)}\n inputProps={{ 'aria-label': executionIdLabel }}\n sx={{\n width: '100%',\n mt: 0.25,\n '& .MuiInputBase-input': {\n p: 0,\n color: deploymentSurfaceTokens.textPrimary,\n fontSize: 16,\n lineHeight: 1.5,\n },\n }}\n />\n </Box>\n <IconButton\n size=\"small\"\n aria-label={`Clear ${executionIdLabel.toLowerCase()}`}\n onClick={onClearExecutionId}\n sx={{ color: chrome.iconColor, ml: 1 }}\n >\n <CancelIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n\n <Button\n variant=\"primary\"\n onClick={onSubmit}\n sx={{\n backgroundColor: chrome.buttonPrimary,\n '&:hover': {\n backgroundColor: chrome.buttonHover,\n },\n '&:active': {\n backgroundColor: chrome.buttonActive,\n },\n }}\n >\n {submitLabel}\n </Button>\n\n {showInspectorToggle && (\n <Button variant=\"secondary\" onClick={onInspectorToggle}>\n {inspectorLabel}\n </Button>\n )}\n\n {showCloseButton && (\n <IconButton\n aria-label=\"Close workflow chrome\"\n onClick={onClose}\n sx={{\n width: 30,\n height: 30,\n backgroundColor: alpha(chrome.closeBtnBg, 0.28),\n color: chrome.iconColor,\n }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n </Box>\n <Divider sx={{ borderColor: deploymentSurfaceTokens.strokeOutside }} />\n </Box>\n );\n};\n\n","import React from 'react';\nimport {\n Box,\n Divider,\n IconButton,\n Paper,\n Typography,\n alpha,\n useTheme,\n} from '@mui/material';\nimport type { PaperProps as MuiPaperProps } from '@mui/material/Paper';\nimport CloseIcon from '@mui/icons-material/Close';\nimport ContentCopyOutlinedIcon from '@mui/icons-material/ContentCopyOutlined';\nimport { Button } from '../../buttons/Button';\nimport { WORKFLOW_NODE_LABELS, type WorkflowNodeType } from '../WorkflowNode/WorkflowNode';\nimport type { Theme } from '@mui/material/styles';\nimport { deploymentSurfaceTokens } from '../../../theme';\n\nconst INSPECTOR_WIDTH = 320;\n\nexport interface WorkflowSideInspectorProps extends MuiPaperProps {\n /** Controls panel visibility for simple layouts. */\n open?: boolean;\n /** Header title. */\n title?: string;\n /** Selected node headline. */\n nodeTitle?: string;\n /** Selected node description. */\n nodeDescription?: string;\n /** Selected node type for the colored tag. */\n nodeType?: WorkflowNodeType;\n /** Input field value shown in details section. */\n inputValue?: string;\n /** Output field value shown in details section. */\n outputValue?: string;\n /** Cubby ID value shown in copy button. */\n cubbyId?: string;\n /** Timestamp value shown in metadata section. */\n timestamp?: string;\n /** Duration value shown in metadata section. */\n duration?: string;\n /** Whether to show the Input field in the details section. Defaults to true. */\n showInput?: boolean;\n /** Whether to show the Output field in the details section. Defaults to true. */\n showOutput?: boolean;\n /** Whether to show the Timestamp field in the metadata section. Defaults to true. */\n showTimestamp?: boolean;\n /** Whether to show the Duration field in the metadata section. Defaults to true. */\n showDuration?: boolean;\n /** Bottom CTA label. Set to `undefined` or `null` to hide the button. */\n actionLabel?: string | null;\n /** Called when close button is pressed. */\n onClose?: () => void;\n /** Called when cubby copy button is pressed. */\n onCopyCubbyId?: () => void;\n /** Called when bottom CTA is pressed. */\n onAction?: () => void;\n}\n\nconst InfoBlock: React.FC<{ label: string; value: string; mutedColor: string }> = ({ label, value, mutedColor }) => (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography variant=\"body2\" sx={{ color: mutedColor }}>\n {label}\n </Typography>\n <Typography\n variant=\"body2\"\n sx={{ color: deploymentSurfaceTokens.textPrimary, whiteSpace: 'pre-wrap' }}\n >\n {value}\n </Typography>\n </Box>\n);\n\n/**\n * WorkflowSideInspector\n *\n * Right-side inspector panel based on Figma 277:8100.\n */\nexport const WorkflowSideInspector: React.FC<WorkflowSideInspectorProps> = ({\n open = true,\n title = 'Inspector',\n nodeTitle = 'Player location cubby',\n nodeDescription = 'Retrieving everything we know about this player so far.',\n nodeType = 'cubbies',\n inputValue = 'Get player topic tree',\n outputValue = 'Topic tree with emotional trends and behavior patterns',\n cubbyId = 'ID:S8787',\n timestamp = '2026-02-11 14:32:10',\n duration = '120ms',\n showInput = true,\n showOutput = true,\n showTimestamp = true,\n showDuration = true,\n actionLabel,\n onClose,\n onCopyCubbyId,\n onAction,\n sx,\n ...paperProps\n}) => {\n const theme = useTheme() as Theme;\n const chrome = theme.palette.workflow.chrome;\n\n if (!open) {\n return null;\n }\n\n const accent = theme.palette.workflow.node[nodeType].accent;\n\n return (\n <Paper\n elevation={0}\n sx={{\n width: INSPECTOR_WIDTH,\n minWidth: INSPECTOR_WIDTH,\n maxWidth: INSPECTOR_WIDTH,\n p: 3,\n backgroundColor: theme.palette.common.white,\n borderRadius: 0,\n boxShadow: '0px 5px 8px rgba(0, 3, 11, 0.12), 0px 0px 1px rgba(0, 3, 11, 0.24)',\n display: 'flex',\n flexDirection: 'column',\n gap: 3,\n ...sx,\n }}\n {...paperProps}\n >\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.25 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n <Typography variant=\"subtitle1\" sx={{ color: deploymentSurfaceTokens.textPrimary }}>\n {title}\n </Typography>\n <IconButton\n aria-label=\"Close inspector\"\n onClick={onClose}\n sx={{\n border: `1px solid ${deploymentSurfaceTokens.strokeOutside}`,\n borderRadius: 2,\n }}\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n <Divider sx={{ borderColor: chrome.divider }} />\n </Box>\n\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, flex: 1 }}>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography\n variant=\"subtitle1\"\n sx={{ color: deploymentSurfaceTokens.textPrimary, fontWeight: 500 }}\n >\n {nodeTitle}\n </Typography>\n <Typography variant=\"body2\" sx={{ color: chrome.mutedText }}>\n {nodeDescription}\n </Typography>\n <Box\n sx={{\n display: 'inline-flex',\n alignItems: 'center',\n alignSelf: 'flex-start',\n gap: 1,\n px: 1.25,\n py: 0.5,\n borderRadius: '999px',\n border: `1px solid ${accent}`,\n backgroundColor: alpha(accent, 0.12),\n }}\n >\n <Box\n sx={{\n width: 10,\n height: 10,\n borderRadius: '50%',\n backgroundColor: accent,\n }}\n />\n <Typography variant=\"caption\" sx={{ color: accent, fontWeight: 500 }}>\n {WORKFLOW_NODE_LABELS[nodeType]}\n </Typography>\n </Box>\n </Box>\n\n <Divider sx={{ borderColor: chrome.divider }} />\n\n {(showInput || showOutput) && (\n <>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {showInput && <InfoBlock label=\"Input\" value={inputValue} mutedColor={chrome.mutedText} />}\n {showOutput && <InfoBlock label=\"Output\" value={outputValue} mutedColor={chrome.mutedText} />}\n </Box>\n <Divider sx={{ borderColor: chrome.divider }} />\n </>\n )}\n\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography variant=\"body2\" sx={{ color: chrome.mutedText }}>\n Cubby ID\n </Typography>\n <Button\n variant=\"secondary\"\n size=\"small\"\n startIcon={<ContentCopyOutlinedIcon fontSize=\"small\" />}\n onClick={onCopyCubbyId}\n sx={{ alignSelf: 'flex-start' }}\n >\n {cubbyId}\n </Button>\n </Box>\n\n <Divider sx={{ borderColor: chrome.divider }} />\n\n {(showTimestamp || showDuration) && (\n <>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>\n {showTimestamp && <InfoBlock label=\"Timestamp\" value={timestamp} mutedColor={chrome.mutedText} />}\n {showDuration && <InfoBlock label=\"Duration\" value={duration} mutedColor={chrome.mutedText} />}\n </Box>\n <Divider sx={{ borderColor: chrome.divider }} />\n </>\n )}\n </Box>\n\n {actionLabel && (\n <Button variant=\"primary\" fullWidth onClick={onAction}>\n {actionLabel}\n </Button>\n )}\n </Paper>\n );\n};\n\n","import React from 'react';\nimport {\n Box,\n Divider,\n IconButton,\n LinearProgress,\n Typography,\n} from '@mui/material';\nimport type { BoxProps } from '@mui/material/Box';\nimport StopIcon from '@mui/icons-material/Stop';\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\nimport ReplayIcon from '@mui/icons-material/Replay';\nimport type { Theme } from '@mui/material/styles';\nimport { useTheme } from '@mui/material/styles';\nimport { Button } from '../../buttons/Button';\nimport { deploymentSurfaceTokens } from '../../../theme';\n\nexport interface WorkflowTimeBarProps extends BoxProps {\n /** Elapsed time label shown above the progress line. */\n elapsedTime?: string;\n /** Progress from 0 to 100. */\n progress?: number;\n /** Current step index for the step indicator. */\n currentStep?: number;\n /** Total number of steps for the step indicator. */\n totalSteps?: number;\n /** Available speed options (e.g. 0.5x, 1x, 2x). */\n speedOptions?: number[];\n /** Currently selected speed value. */\n selectedSpeed?: number;\n /** Called when stop is pressed. */\n onStop?: () => void;\n /** Called when previous step is pressed. */\n onPreviousStep?: () => void;\n /** Called when next step is pressed. */\n onNextStep?: () => void;\n /** Called when a speed option is selected. */\n onSpeedChange?: (speed: number) => void;\n /** Called when refresh is pressed. */\n onReset?: () => void;\n}\n\nconst SpeedButton: React.FC<{\n value: number;\n selected: boolean;\n onClick?: () => void;\n}> = ({ value, selected, onClick }) => (\n <Button\n variant={selected ? 'primary' : 'secondary'}\n size=\"small\"\n onClick={onClick}\n sx={{\n minWidth: 48,\n px: 1.5,\n py: 0.25,\n borderRadius: 1,\n fontSize: 14,\n lineHeight: 1.4,\n }}\n >\n {`${value}x`}\n </Button>\n);\n\n/**\n * WorkflowTimeBar\n *\n * Bottom chrome bar for workflow playback controls based on Figma 277:8087.\n */\nexport const WorkflowTimeBar: React.FC<WorkflowTimeBarProps> = ({\n elapsedTime = '01m : 12s',\n progress = 26,\n currentStep = 1,\n totalSteps = 16,\n speedOptions = [0.5, 1, 2, 4],\n selectedSpeed = 0.5,\n onStop,\n onPreviousStep,\n onNextStep,\n onSpeedChange,\n onReset,\n sx,\n ...boxProps\n}) => {\n const chrome = (useTheme() as Theme).palette.workflow.chrome;\n const boundedProgress = Math.max(0, Math.min(100, progress));\n const atFirstStep = currentStep <= 1;\n const atLastStep = currentStep >= totalSteps;\n\n return (\n <Box\n sx={[\n {\n width: '100%',\n backgroundColor: 'common.white',\n px: 2,\n pb: 2,\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...boxProps}\n >\n <Divider sx={{ borderColor: deploymentSurfaceTokens.strokeOutside }} />\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <IconButton\n onClick={onStop}\n aria-label=\"Stop playback\"\n sx={{\n width: 40,\n height: 40,\n border: `1px solid ${deploymentSurfaceTokens.strokeOutside}`,\n borderRadius: 1,\n color: deploymentSurfaceTokens.textPrimary,\n backgroundColor: deploymentSurfaceTokens.surfaceHigh,\n }}\n >\n <StopIcon sx={{ fontSize: 16 }} />\n </IconButton>\n\n <Box sx={{ flex: 1, minWidth: 220, px: 1 }}>\n <Typography\n variant=\"body2\"\n sx={{ color: deploymentSurfaceTokens.textPrimary, mb: 0.5 }}\n >\n {elapsedTime}\n </Typography>\n <LinearProgress\n variant=\"determinate\"\n value={boundedProgress}\n sx={{\n height: 3,\n borderRadius: 999,\n backgroundColor: chrome.progressBg,\n '& .MuiLinearProgress-bar': {\n backgroundColor: deploymentSurfaceTokens.accentBlue,\n },\n }}\n />\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 3 }}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 500 }}>\n Steps\n </Typography>\n <IconButton\n size=\"small\"\n aria-label=\"Previous step\"\n onClick={onPreviousStep}\n disabled={atFirstStep}\n sx={{ backgroundColor: chrome.stepBtnBg }}\n >\n <ChevronLeftIcon fontSize=\"small\" />\n </IconButton>\n <Typography variant=\"subtitle1\" sx={{ minWidth: 52, textAlign: 'center' }}>\n {`${currentStep} / ${totalSteps}`}\n </Typography>\n <IconButton\n size=\"small\"\n aria-label=\"Next step\"\n onClick={onNextStep}\n disabled={atLastStep}\n sx={{ backgroundColor: chrome.stepBtnBgHover }}\n >\n <ChevronRightIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <Typography variant=\"subtitle1\" sx={{ fontWeight: 500 }}>\n Speed\n </Typography>\n {speedOptions.map((option) => (\n <SpeedButton\n key={option}\n value={option}\n selected={option === selectedSpeed}\n onClick={() => onSpeedChange?.(option)}\n />\n ))}\n <IconButton aria-label=\"Reset playback\" onClick={onReset} size=\"small\">\n <ReplayIcon fontSize=\"small\" />\n </IconButton>\n </Box>\n </Box>\n </Box>\n </Box>\n );\n};\n\n"],"mappings":"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","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","GradientSurface","palette","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","React","Typography","styled","jsx","Breadcrumbs","React","styled","jsx","jsxs","Accordion","React","styled","jsx","Paper","React","styled","jsx","Divider","Stack","Box","Container","styled","jsx","React","jsx","Collapse","React","Box","Typography","IconButton","Divider","jsx","jsxs","React","EntityHeader","Box","Typography","IconButton","Divider","Paper","Box","Typography","IconButton","ExpandMoreIcon","ChevronRightIcon","styled","useState","Fragment","jsx","jsxs","styled","Box","Typography","capacity","Paper","IconButton","ExpandMoreIcon","ChevronRightIcon","Divider","ListItemIcon","ListItemText","styled","Fragment","jsx","jsxs","styled","StyledDivider","Divider","ListItemText","ListItemIcon","SmartToyOutlinedIcon","jsx","Box","styled","jsx","jsxs","styled","Box","Box","styled","jsx","styled","Box","Box","Divider","IconButton","Typography","alpha","CloseIcon","useTheme","jsx","jsxs","useTheme","Box","Typography","IconButton","alpha","CloseIcon","Divider","Box","Divider","IconButton","Paper","Typography","alpha","useTheme","CloseIcon","Fragment","jsx","jsxs","Box","Typography","useTheme","Paper","IconButton","CloseIcon","Divider","alpha","Box","Divider","IconButton","LinearProgress","Typography","ChevronLeftIcon","ChevronRightIcon","useTheme","jsx","jsxs","useTheme","Box","Divider","IconButton","Typography","LinearProgress","ChevronLeftIcon","ChevronRightIcon"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// src/components/buttons/LoadingButton.tsx
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { LoadingButton as MuiLoadingButton } from "@mui/lab";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
var LoadingButton = React.forwardRef(
|
|
6
|
+
function LoadingButton2({ loading = false, loadingPosition = "center", ...props }, ref) {
|
|
7
|
+
return /* @__PURE__ */ jsx(
|
|
8
|
+
MuiLoadingButton,
|
|
9
|
+
{
|
|
10
|
+
ref,
|
|
11
|
+
loading,
|
|
12
|
+
loadingPosition,
|
|
13
|
+
...props
|
|
14
|
+
}
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
// src/components/buttons/ButtonGroup.tsx
|
|
20
|
+
import {
|
|
21
|
+
ButtonGroup as MuiButtonGroup
|
|
22
|
+
} from "@mui/material";
|
|
23
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
24
|
+
var ButtonGroup = ({
|
|
25
|
+
orientation = "horizontal",
|
|
26
|
+
size = "medium",
|
|
27
|
+
variant = "outlined",
|
|
28
|
+
...props
|
|
29
|
+
}) => {
|
|
30
|
+
return /* @__PURE__ */ jsx2(
|
|
31
|
+
MuiButtonGroup,
|
|
32
|
+
{
|
|
33
|
+
orientation,
|
|
34
|
+
size,
|
|
35
|
+
variant,
|
|
36
|
+
...props
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
LoadingButton,
|
|
43
|
+
ButtonGroup
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=chunk-CWJ4OU6W.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/buttons/LoadingButton.tsx","../src/components/buttons/ButtonGroup.tsx"],"sourcesContent":["import React from 'react';\nimport { LoadingButton as MuiLoadingButton, LoadingButtonProps as MuiLoadingButtonProps } from '@mui/lab';\n\nexport interface LoadingButtonProps extends MuiLoadingButtonProps {\n /**\n * If `true`, the button will show a loading indicator\n */\n loading?: boolean;\n /**\n * The loading indicator can be positioned inside the button or in the center\n */\n loadingPosition?: 'start' | 'end' | 'center';\n}\n\n/**\n * LoadingButton component - Button with loading state from MUI Lab\n * \n * @example\n * ```tsx\n * <LoadingButton\n * variant=\"contained\"\n * loading={isLoading}\n * onClick={handleSubmit}\n * >\n * Submit\n * </LoadingButton>\n * ```\n */\nexport const LoadingButton = React.forwardRef<HTMLButtonElement, LoadingButtonProps>(\n function LoadingButton({ loading = false, loadingPosition = 'center', ...props }, ref) {\n return (\n <MuiLoadingButton\n ref={ref}\n loading={loading}\n loadingPosition={loadingPosition}\n {...props}\n />\n );\n },\n);\n\nexport default LoadingButton;\n\n","import React from 'react';\nimport {\n ButtonGroup as MuiButtonGroup,\n ButtonGroupProps as MuiButtonGroupProps,\n} from '@mui/material';\n\nexport interface ButtonGroupProps extends MuiButtonGroupProps {\n /**\n * The content of the button group\n */\n children?: React.ReactNode;\n /**\n * If `true`, the buttons will be disabled\n */\n disabled?: boolean;\n /**\n * If `true`, the button group will take full width\n */\n fullWidth?: boolean;\n /**\n * The orientation of the button group\n * @default 'horizontal'\n */\n orientation?: 'horizontal' | 'vertical';\n /**\n * The size of the buttons\n * @default 'medium'\n */\n size?: 'small' | 'medium' | 'large';\n /**\n * The variant to use\n * @default 'outlined'\n */\n variant?: 'text' | 'outlined' | 'contained';\n}\n\n/**\n * ButtonGroup component - groups related buttons together\n * \n * @example\n * ```tsx\n * <ButtonGroup variant=\"contained\">\n * <Button>One</Button>\n * <Button>Two</Button>\n * <Button>Three</Button>\n * </ButtonGroup>\n * ```\n */\nexport const ButtonGroup: React.FC<ButtonGroupProps> = ({\n orientation = 'horizontal',\n size = 'medium',\n variant = 'outlined',\n ...props\n}) => {\n return (\n <MuiButtonGroup\n orientation={orientation}\n size={size}\n variant={variant}\n {...props}\n />\n );\n};\n\nexport default ButtonGroup;\n\n"],"mappings":";AAAA,OAAO,WAAW;AAClB,SAAS,iBAAiB,wBAAqE;AA8BzF;AAHC,IAAM,gBAAgB,MAAM;AAAA,EACjC,SAASA,eAAc,EAAE,UAAU,OAAO,kBAAkB,UAAU,GAAG,MAAM,GAAG,KAAK;AACrF,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACN;AAAA,EAEJ;AACF;;;ACtCA;AAAA,EACE,eAAe;AAAA,OAEV;AAmDH,gBAAAC,YAAA;AAPG,IAAM,cAA0C,CAAC;AAAA,EACtD,cAAc;AAAA,EACd,OAAO;AAAA,EACP,UAAU;AAAA,EACV,GAAG;AACL,MAAM;AACJ,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":["LoadingButton","jsx"]}
|