@carto/ps-react-ui 4.11.2 → 4.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/chat.js +962 -733
  2. package/dist/chat.js.map +1 -1
  3. package/dist/csv-item-hH_Gt7ur.js +32 -0
  4. package/dist/csv-item-hH_Gt7ur.js.map +1 -0
  5. package/dist/png-item-9dNbB37T.js +57 -0
  6. package/dist/png-item-9dNbB37T.js.map +1 -0
  7. package/dist/table-B3ZWWhJt.js +383 -0
  8. package/dist/table-B3ZWWhJt.js.map +1 -0
  9. package/dist/types/chat/containers/chat-footer.d.ts +1 -1
  10. package/dist/types/chat/containers/styles.d.ts +79 -12
  11. package/dist/types/chat/index.d.ts +1 -1
  12. package/dist/types/chat/types.d.ts +21 -0
  13. package/dist/types/chat/use-typewriter.d.ts +5 -3
  14. package/dist/types/widgets-v2/actions/download/constants.d.ts +12 -0
  15. package/dist/types/widgets-v2/actions/download/csv-item.d.ts +38 -0
  16. package/dist/types/widgets-v2/actions/download/icons.d.ts +6 -0
  17. package/dist/types/widgets-v2/actions/download/index.d.ts +3 -1
  18. package/dist/types/widgets-v2/actions/index.d.ts +1 -1
  19. package/dist/types/widgets-v2/wrapper/style.d.ts +5 -12
  20. package/dist/widgets-v2/actions.js +40 -36
  21. package/dist/widgets-v2/actions.js.map +1 -1
  22. package/dist/widgets-v2/bar.js +77 -84
  23. package/dist/widgets-v2/bar.js.map +1 -1
  24. package/dist/widgets-v2/category.js +50 -55
  25. package/dist/widgets-v2/category.js.map +1 -1
  26. package/dist/widgets-v2/formula.js +37 -43
  27. package/dist/widgets-v2/formula.js.map +1 -1
  28. package/dist/widgets-v2/histogram.js +138 -144
  29. package/dist/widgets-v2/histogram.js.map +1 -1
  30. package/dist/widgets-v2/markdown.js +18 -17
  31. package/dist/widgets-v2/markdown.js.map +1 -1
  32. package/dist/widgets-v2/pie.js +67 -73
  33. package/dist/widgets-v2/pie.js.map +1 -1
  34. package/dist/widgets-v2/scatterplot.js +75 -81
  35. package/dist/widgets-v2/scatterplot.js.map +1 -1
  36. package/dist/widgets-v2/spread.js +36 -41
  37. package/dist/widgets-v2/spread.js.map +1 -1
  38. package/dist/widgets-v2/table.js +46 -55
  39. package/dist/widgets-v2/table.js.map +1 -1
  40. package/dist/widgets-v2/timeseries.js +81 -87
  41. package/dist/widgets-v2/timeseries.js.map +1 -1
  42. package/dist/widgets-v2.js +247 -243
  43. package/dist/widgets-v2.js.map +1 -1
  44. package/package.json +3 -3
  45. package/src/chat/bubbles/styles.ts +5 -1
  46. package/src/chat/containers/chat-content.tsx +4 -1
  47. package/src/chat/containers/chat-footer.test.tsx +59 -0
  48. package/src/chat/containers/chat-footer.tsx +124 -36
  49. package/src/chat/containers/styles.ts +107 -16
  50. package/src/chat/feedback/styles.ts +11 -4
  51. package/src/chat/index.ts +1 -0
  52. package/src/chat/types.ts +22 -0
  53. package/src/chat/use-typewriter.ts +32 -24
  54. package/src/widgets-v2/actions/download/constants.ts +14 -0
  55. package/src/widgets-v2/actions/download/csv-item.test.tsx +77 -0
  56. package/src/widgets-v2/actions/download/csv-item.tsx +71 -0
  57. package/src/widgets-v2/actions/download/icons.tsx +10 -1
  58. package/src/widgets-v2/actions/download/index.ts +3 -1
  59. package/src/widgets-v2/actions/download/png-item.tsx +2 -1
  60. package/src/widgets-v2/actions/index.ts +5 -0
  61. package/src/widgets-v2/bar/download.tsx +16 -22
  62. package/src/widgets-v2/category/download.test.ts +9 -0
  63. package/src/widgets-v2/category/download.ts +16 -20
  64. package/src/widgets-v2/formula/download.tsx +23 -29
  65. package/src/widgets-v2/histogram/download.ts +22 -26
  66. package/src/widgets-v2/markdown/{download.ts → download.tsx} +5 -2
  67. package/src/widgets-v2/pie/download.ts +16 -20
  68. package/src/widgets-v2/scatterplot/download.ts +16 -20
  69. package/src/widgets-v2/spread/download.ts +23 -27
  70. package/src/widgets-v2/table/download.test.ts +10 -0
  71. package/src/widgets-v2/table/download.ts +11 -15
  72. package/src/widgets-v2/table/helpers.test.ts +19 -0
  73. package/src/widgets-v2/table/helpers.ts +7 -12
  74. package/src/widgets-v2/timeseries/download.ts +36 -40
  75. package/src/widgets-v2/wrapper/style.ts +13 -18
  76. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +66 -0
  77. package/src/widgets-v2/wrapper/widget-wrapper.tsx +7 -4
  78. package/dist/png-item-BE9uEqlD.js +0 -45
  79. package/dist/png-item-BE9uEqlD.js.map +0 -1
  80. package/dist/table-C9IMbTr0.js +0 -385
  81. package/dist/table-C9IMbTr0.js.map +0 -1
  82. package/dist/types/chat/feedback/styles.d.ts +0 -211
@@ -1 +1 @@
1
- {"version":3,"file":"widgets-v2.js","sources":["../src/widgets-v2/provider/widget-provider.tsx","../src/widgets-v2/wrapper/style.ts","../src/widgets-v2/wrapper/widget-actions.tsx","../src/widgets-v2/wrapper/labels.ts","../src/widgets-v2/wrapper/widget-wrapper.tsx","../src/widgets-v2/wrapper/widget-content.tsx","../src/widgets-v2/subheader/style.ts","../src/widgets-v2/subheader/subheader.tsx","../src/widgets-v2/state/style.ts","../src/widgets-v2/state/labels.ts","../src/widgets-v2/state/widget-state.tsx","../src/widgets-v2/selection-summary/labels.ts","../src/widgets-v2/selection-summary/style.ts","../src/widgets-v2/selection-summary/selection-summary.tsx","../src/widgets-v2/toolbox/labels.ts","../src/widgets-v2/toolbox/style.ts","../src/widgets-v2/toolbox/toolbox.tsx","../src/widgets-v2/note/labels.ts","../src/widgets-v2/note/style.ts","../src/widgets-v2/note/widget-note.tsx","../src/widgets-v2/index.ts"],"sourcesContent":["import { useLayoutEffect, useState, type ReactNode } from 'react'\nimport {\n WidgetContext,\n createWidgetStore,\n hasWidgetStore,\n getWidgetStore,\n registerWidgetStore,\n setWidgetStoreEntry,\n unregisterWidgetStore,\n} from '../stores'\nimport type { WidgetStoreApi } from '../stores'\n\nexport interface ProviderProps {\n id: string\n data: unknown\n isLoading?: boolean\n isFetching?: boolean\n error?: unknown\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n /**\n * When `true`, the per-widget store survives unmount so transformStates,\n * search text, fullscreen state, etc. are preserved across remounts.\n * Consumers using keepAlive must call `deleteWidgetStore(id)` themselves\n * when the widget is permanently removed — there is no automatic GC.\n */\n keepAlive?: boolean\n children: ReactNode\n}\n\n/**\n * Renderer-agnostic widget shell. Creates a per-widget Zustand store\n * keyed by `id`, syncs the consumer props (`data`, `isLoading`, `error`,\n * `formatter`, …) onto it, and exposes the `id` via `WidgetContext` so\n * descendants can resolve their store with `useWidgetId()`.\n *\n * The Provider deliberately doesn't know about ECharts — there's no\n * `optionFactory` prop here. ECharts-backed widgets pass their factory\n * to `<Widget.Echart optionFactory={…}>`, which owns the structural\n * seed + the data-fusion render step entirely. Non-Echart widgets\n * (Formula, Spread, Range, Table, Category, Markdown) just don't pass\n * anything ECharts-shaped.\n */\nexport function Provider({\n id,\n data,\n isLoading,\n isFetching,\n error,\n formatter,\n labelFormatter,\n keepAlive = false,\n children,\n}: ProviderProps) {\n // Lazy init — reuse an existing keepAlive store, otherwise create one and\n // synchronously place it in the registry so descendants can call\n // useWidget(id, ...) on first render. Refcounting + dup-id detection happen\n // in the mount layout-effect below.\n const [store] = useState<WidgetStoreApi>(() => {\n if (hasWidgetStore(id)) return getWidgetStore(id)\n const created = createWidgetStore(id, {\n data,\n isLoading,\n isFetching,\n error,\n formatter,\n labelFormatter,\n })\n setWidgetStoreEntry(id, created)\n return created\n })\n\n // Registration: refcount the mount for dup-id detection; unregister on\n // unmount or when the id/store/keepAlive triple changes.\n useLayoutEffect(() => {\n registerWidgetStore(id, store)\n return () => {\n unregisterWidgetStore(id, { keepAlive })\n }\n }, [id, store, keepAlive])\n\n // Per-prop sync. `useLayoutEffect` so kept-alive remounts apply incoming\n // props before paint (no flash of stale data when reusing a store).\n // The pipeline middleware bypasses unchanged fields, so unchanged props\n // are a no-op even though setState is called every effect run.\n useLayoutEffect(() => {\n store.setState({ rawData: data })\n }, [store, data])\n\n useLayoutEffect(() => {\n store.setState({\n isLoading: isLoading ?? false,\n isFetching: isFetching ?? false,\n error,\n })\n }, [store, isLoading, isFetching, error])\n\n // Sync the consumer's formatter prop to BOTH `rawFormatter` (kept canonical\n // for actions that need to restore the absolute view) and `formatter` (the\n // active value). Actions like RelativeData re-apply their override after\n // `rawFormatter` changes.\n useLayoutEffect(() => {\n store.setState({\n rawFormatter: formatter,\n formatter,\n labelFormatter,\n })\n }, [store, formatter, labelFormatter])\n\n return <WidgetContext.Provider value={id}>{children}</WidgetContext.Provider>\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n position: 'relative',\n width: '100%',\n minWidth: 0,\n bgcolor: 'background.paper',\n borderRadius: 1,\n overflow: 'hidden',\n boxShadow: 'none',\n // MUI Accordion ships its own collapsed-state divider rules; clear them\n // so they don't fight our card border.\n '&::before': { display: 'none' },\n\n // Hover-fade actions (v1 parity). Direct children of\n // `.widget-wrapper-actions` are dimmed by default on fine-pointer devices\n // and fade in on hover; an action carrying the `.active` class stays\n // full-opacity even outside hover. Coarse-pointer devices show actions\n // always.\n //\n // The class must sit on the action element itself\n // (`<IconButton className='active'>`). v2 does NOT wrap each action in\n // an extra container the way v1 does, so the `> *` selector lands on the\n // action button directly — `&:has(.active)` would only match if the\n // class were on a descendant, which is never the case here.\n '& .widget-wrapper-actions > *': {\n opacity: 1,\n transition: ({ transitions }: Theme) =>\n transitions.create('opacity', {\n duration: transitions.duration.standard,\n easing: transitions.easing.easeInOut,\n }),\n '@media (hover: hover)': {\n opacity: 0,\n },\n '&.active': {\n opacity: 1,\n },\n },\n '&:hover .widget-wrapper-actions > *': {\n opacity: 1,\n },\n '&[data-collapsed=\"true\"] .widget-wrapper-actions > *': {\n opacity: 0,\n pointerEvents: 'none',\n '&.active': {\n opacity: 1,\n },\n },\n\n // Disabled state — only block interaction; keep visuals unchanged.\n // MUI's default `.Mui-disabled` rules dim the AccordionSummary's color\n // and add a faded background; we override them so the wrapper looks\n // identical to its enabled form. The single behavioral change is\n // `pointer-events: none`, which propagates to every descendant.\n '&.Mui-disabled': {\n pointerEvents: 'none',\n bgcolor: 'background.paper',\n '& .MuiAccordionSummary-root.Mui-disabled': {\n opacity: 1,\n color: 'inherit',\n backgroundColor: 'transparent',\n },\n '& .MuiAccordionSummary-expandIconWrapper': {\n display: 'none',\n },\n },\n },\n loading: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: ({ spacing }: Theme) => spacing(0.35),\n zIndex: 1,\n },\n summary: {\n minHeight: ({ spacing }: Theme) => spacing(7),\n '& .MuiAccordionSummary-content': {\n gap: ({ spacing }: Theme) => spacing(0.5),\n paddingInlineEnd: ({ spacing }: Theme) => spacing(0.75),\n alignItems: 'center',\n },\n },\n titleCell: {\n flexGrow: 1,\n flexShrink: 1,\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n minHeight: ({ spacing }: Theme) => spacing(3),\n },\n titleText: {\n minWidth: 0,\n wordBreak: 'break-word',\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n },\n actions: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n justifyContent: 'flex-end',\n flexShrink: 0,\n '& > *': {\n pointerEvents: 'auto',\n },\n },\n options: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n flexShrink: 0,\n },\n detail: {\n display: 'flex',\n flexDirection: 'column',\n gap: ({ spacing }: Theme) => spacing(1),\n paddingTop: ({ spacing }: Theme) => spacing(0.5),\n },\n content: {\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n },\n footer: {\n pt: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, type SxProps, type Theme } from '@mui/material'\nimport type { ReactNode } from 'react'\nimport { styles } from './style'\n\nexport interface ActionsProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\n/**\n * Slot for the wrapper header's right-side action buttons. The\n * `widget-wrapper-actions` className activates the hover-fade CSS rule on\n * `<Wrapper>`: action children fade in on hover (always visible on coarse-\n * pointer devices), and stay full-opacity when a descendant is marked with\n * `.active` — typically applied by toggled actions.\n *\n * The container also stops click propagation so interacting with an action\n * doesn't toggle the wrapper's collapse.\n */\nexport function Actions({ sx, children }: ActionsProps) {\n return (\n <Box\n className='widget-wrapper-actions'\n onClick={(e) => e.stopPropagation()}\n sx={{ ...styles.actions, ...sx }}\n >\n {children}\n </Box>\n )\n}\n\nexport interface OptionsProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\nexport function Options({ sx, children }: OptionsProps) {\n return (\n <Box onClick={(e) => e.stopPropagation()} sx={{ ...styles.options, ...sx }}>\n {children}\n </Box>\n )\n}\n","export interface WrapperLabels {\n collapse: string\n expand: string\n errorFallbackTitle: string\n}\n\nexport const DEFAULT_WRAPPER_LABELS: WrapperLabels = {\n collapse: 'Collapse',\n expand: 'Expand',\n errorFallbackTitle: 'Widget failed to render',\n}\n","import {\n Children,\n isValidElement,\n useCallback,\n useState,\n type ComponentType,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Box,\n LinearProgress,\n Typography,\n type SvgIconProps,\n type SxProps,\n type Theme,\n} from '@mui/material'\nimport { ExpandMore as ExpandMoreIcon } from '@mui/icons-material'\nimport { SmartTooltip } from '../../components/smart-tooltip/smart-tooltip'\nimport { useWidget, useWidgetId } from '../stores'\nimport { Actions, Options } from './widget-actions'\nimport { styles } from './style'\nimport { DEFAULT_WRAPPER_LABELS, type WrapperLabels } from './labels'\n\nexport interface WrapperProps {\n title: string\n /**\n * Controlled collapsed state. When supplied, the wrapper is fully\n * controlled — the consumer is responsible for updating it via\n * `onCollapseChange`. Leave undefined to use the uncontrolled mode,\n * which seeds internal state from `defaultCollapsed`.\n */\n collapsed?: boolean\n /**\n * Fires whenever the user interacts to toggle the wrapper, with the\n * NEXT collapsed value. Called for both controlled and uncontrolled\n * usage — consumers can subscribe to user-driven toggles even when\n * letting the wrapper manage its own state.\n */\n onCollapseChange?: (collapsed: boolean) => void\n /**\n * Initial collapsed state when the wrapper is uncontrolled (i.e.\n * `collapsed` is undefined). Ignored when `collapsed` is supplied.\n */\n defaultCollapsed?: boolean\n disabled?: boolean\n /**\n * Visual variant. `'elevation'` (default) renders a borderless shell;\n * `'outlined'` adds a 1px divider border around the card.\n */\n variant?: 'outlined' | 'elevation'\n labels?: Partial<WrapperLabels>\n /**\n * Icon shown at the right edge of the summary row. Accordion rotates it\n * 180° automatically when the wrapper expands. Default: `ExpandMoreIcon`.\n */\n expandIcon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\n/**\n * Widget shell — title + collapsible body, built on MUI `<Accordion>` for\n * native click-to-toggle on the summary header and a smooth open/close\n * transition. UX matches v1 `<WrapperUI>`:\n *\n * • hover-fade action buttons (always visible on coarse-pointer devices)\n * • multi-line title clamp (`WebkitLineClamp: 2`, word-break) + SmartTooltip\n * when the text overflows\n * • top-edge `<LinearProgress>` driven by the widget store's `isFetching`\n * • chevron at the right end (rotated by Accordion based on expanded state)\n *\n * Children are partitioned by component identity: `<Actions>` and `<Options>`\n * render inside the summary row; everything else (`<Content>`, `<Footer>`,\n * loose nodes) renders inside the details panel.\n */\nexport function Wrapper({\n title,\n collapsed,\n onCollapseChange,\n defaultCollapsed = false,\n disabled = false,\n variant = 'elevation',\n labels,\n expandIcon: ExpandIcon = ExpandMoreIcon,\n iconProps,\n sx,\n children,\n}: WrapperProps) {\n const id = useWidgetId()\n const isFetching = useWidget(id, (s) => s.isFetching)\n // Controlled vs uncontrolled: when the consumer passes `collapsed`, they\n // own the state; otherwise we keep an internal copy seeded from\n // `defaultCollapsed`. `internalCollapsed` is still tracked in controlled\n // mode so a consumer can drop the controlled prop later without losing\n // the last-known position.\n const isControlled = collapsed !== undefined\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed)\n const effectiveCollapsed = isControlled ? collapsed : internalCollapsed\n const handleAccordionToggle = useCallback(\n (_: unknown, expanded: boolean) => {\n const next = !expanded\n onCollapseChange?.(next)\n setInternalCollapsed(next)\n },\n [onCollapseChange],\n )\n const _labels = { ...DEFAULT_WRAPPER_LABELS, ...labels }\n\n const { summary: summarySlots, details: detailsSlots } =\n partitionChildren(children)\n\n const ariaLabel = effectiveCollapsed ? _labels.expand : _labels.collapse\n\n return (\n <Accordion\n data-collapsed={effectiveCollapsed ? 'true' : undefined}\n expanded={!effectiveCollapsed}\n onChange={handleAccordionToggle}\n disabled={disabled}\n disableGutters\n elevation={0}\n variant={variant}\n square\n sx={{\n ...styles.root,\n ...sx,\n }}\n >\n {isFetching ? (\n <LinearProgress sx={styles.loading} color='primary' />\n ) : null}\n\n <AccordionSummary\n expandIcon={<ExpandIcon fontSize='small' {...iconProps} />}\n aria-label={ariaLabel}\n sx={styles.summary}\n >\n <SmartTooltip title={title}>\n {({ ref }) => (\n <Box sx={styles.titleCell}>\n <Typography\n ref={ref}\n variant='subtitle1'\n sx={styles.titleText}\n textTransform='none'\n >\n {title}\n </Typography>\n </Box>\n )}\n </SmartTooltip>\n {summarySlots}\n </AccordionSummary>\n <AccordionDetails sx={styles.detail}>{detailsSlots}</AccordionDetails>\n </Accordion>\n )\n}\n\n/**\n * Splits children by component identity: `<Actions>` and `<Options>` belong\n * in the summary row, everything else in the details panel. Identity\n * comparison works because both slot components are imported from the same\n * module that consumers use.\n */\nfunction partitionChildren(children: ReactNode): {\n summary: ReactNode[]\n details: ReactNode[]\n} {\n const summary: ReactNode[] = []\n const details: ReactNode[] = []\n for (const child of Children.toArray(children)) {\n if (isSlot(child, Actions) || isSlot(child, Options)) {\n summary.push(child)\n } else {\n details.push(child)\n }\n }\n return { summary, details }\n}\n\nfunction isSlot(node: ReactNode, type: unknown): node is ReactElement {\n return isValidElement(node) && node.type === type\n}\n","import { Box, type SxProps, type Theme } from '@mui/material'\nimport type { ReactNode } from 'react'\nimport { styles } from './style'\n\nexport interface ContentProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\nexport function Content({ sx, children }: ContentProps) {\n return (\n <Box data-slot='content' sx={{ ...styles.content, ...sx }}>\n {children}\n </Box>\n )\n}\n\nexport interface FooterProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\nexport function Footer({ sx, children }: FooterProps) {\n return (\n <Box data-slot='footer' sx={{ ...styles.footer, ...sx }}>\n {children}\n </Box>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n alignItems: 'center',\n gap: 1,\n minHeight: 32,\n pb: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, type SxProps, type Theme } from '@mui/material'\nimport type { ReactNode } from 'react'\nimport { styles } from './style'\n\nexport interface SubheaderProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\n/**\n * Stateless layout: CSS grid `1fr auto`. Children self-place — typically\n * `<Widget.SelectionSummary />` (left) and `<Widget.Toolbox>` (right).\n */\nexport function Subheader({ sx, children }: SubheaderProps) {\n return <Box sx={{ ...styles.root, ...sx }}>{children}</Box>\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n emptyRoot: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n paddingTop: 1,\n paddingBottom: 2,\n paddingX: 2,\n width: '100%',\n minHeight: '100%',\n },\n // Stable wrapper around the success-path children. Real layout (flex\n // column) so html2canvas has a non-zero bounding rect to rasterise.\n // `flex: 1; min-height: 0` lets nested scroll regions / fixed-height\n // chart canvases size correctly inside Widget.Content's flex column.\n captureBox: {\n width: '100%',\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","export interface StateLabels {\n errorTitle: string\n errorMessage: (error: unknown) => string\n emptyTitle: string\n emptyDescription: string\n}\n\nexport const DEFAULT_STATE_LABELS: StateLabels = {\n errorTitle: 'Something went wrong',\n errorMessage: (error: unknown): string => {\n if (error instanceof Error) return error.message\n if (typeof error === 'string') return error\n if (error && typeof error === 'object' && 'message' in error) {\n return String((error as { message: unknown }).message)\n }\n return 'Unknown error'\n },\n emptyTitle: 'No data',\n emptyDescription: 'Try adjusting filters or wait for data to load.',\n}\n","import { Component, useCallback, type ReactNode } from 'react'\nimport { Alert, AlertTitle, Box, Typography } from '@mui/material'\nimport { setCaptureEl, useWidgetId, useWidgetShallow } from '../stores'\nimport { styles } from './style'\nimport { DEFAULT_STATE_LABELS, type StateLabels } from './labels'\n\nexport interface StateProps {\n skeleton: ReactNode\n children: ReactNode\n /** Override the empty-state predicate. Receives `rawData` (pre-pipeline). */\n isEmpty?: (rawData: unknown) => boolean\n /** Render an alternative error UI. When omitted, the default ErrorView is used. */\n fallback?: (error: Error) => ReactNode\n labels?: Partial<StateLabels>\n}\n\ninterface StateSlice {\n isLoading: boolean\n isFetching: boolean\n error: unknown\n rawData: unknown\n}\n\nconst sliceSelector = (s: {\n isLoading: boolean\n isFetching: boolean\n error: unknown\n rawData: unknown\n}): StateSlice => ({\n isLoading: s.isLoading,\n isFetching: s.isFetching,\n error: s.error,\n rawData: s.rawData,\n})\n\n/**\n * Priority chain: loading → error → empty → content. Both consumer-supplied\n * errors (set via Provider's `error` prop) and transform-throw errors (set by\n * the pipeline middleware) flow through the same `error` field. Render-time\n * errors thrown by `children` are caught by the inlined error boundary and\n * routed through the same path.\n */\nexport function State({\n skeleton,\n children,\n isEmpty = defaultIsEmpty,\n fallback,\n labels,\n}: StateProps) {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, sliceSelector)\n const _labels = { ...DEFAULT_STATE_LABELS, ...labels }\n\n // Loading wins over everything else (matches v1 — hides errors during fetch).\n if (slice.isLoading) return <>{skeleton}</>\n\n // Store-side error (consumer-supplied or transform-throw via middleware).\n if (slice.error !== undefined && slice.error !== null) {\n const err = toError(slice.error)\n return fallback ? (\n <>{fallback(err)}</>\n ) : (\n <ErrorView error={err} labels={_labels} />\n )\n }\n\n // Empty (uses pre-pipeline rawData so a transform that filters everything\n // doesn't get misclassified as \"no data from upstream\").\n if (isEmpty(slice.rawData)) {\n return <EmptyView labels={_labels} />\n }\n\n return (\n <RenderErrorBoundary fallback={fallback} labels={_labels}>\n <CaptureBox id={id}>{children}</CaptureBox>\n </RenderErrorBoundary>\n )\n}\n\n/**\n * Wraps the success-path children in a stable flex column whose DOM ref is\n * registered with the per-widget capture map. Per-widget download configs\n * feed the wrapper element to `html2canvas` for PNG export. The callback\n * ref auto-clears (React calls it with `null`) when Widget.State leaves\n * the success branch or unmounts, so loading / error / empty states\n * correctly report \"no capture target\" via `getCaptureEl`.\n *\n * Composition convention: render interactive controls that should *not*\n * appear in the PNG (e.g. `<Widget.Searcher />`) as siblings of\n * `<Widget.State>` rather than children, so they sit outside this box.\n */\nfunction CaptureBox({ id, children }: { id: string; children: ReactNode }) {\n const setRef = useCallback(\n (el: HTMLDivElement | null) => setCaptureEl(id, el),\n [id],\n )\n return (\n <Box ref={setRef} sx={styles.captureBox}>\n {children}\n </Box>\n )\n}\n\nfunction ErrorView({ error, labels }: { error: Error; labels: StateLabels }) {\n return (\n <Alert severity='error'>\n <AlertTitle>{labels.errorTitle}</AlertTitle>\n {labels.errorMessage(error)}\n </Alert>\n )\n}\n\nfunction EmptyView({ labels }: { labels: StateLabels }) {\n return (\n <Box sx={styles.emptyRoot}>\n <Typography variant='body2' color='text.primary'>\n {labels.emptyTitle}\n </Typography>\n <Typography variant='caption' color='text.secondary'>\n {labels.emptyDescription}\n </Typography>\n </Box>\n )\n}\n\ninterface BoundaryProps {\n fallback?: (error: Error) => ReactNode\n labels: StateLabels\n children: ReactNode\n}\n\ninterface BoundaryState {\n error: Error | null\n}\n\nclass RenderErrorBoundary extends Component<BoundaryProps, BoundaryState> {\n override state: BoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): BoundaryState {\n return { error }\n }\n\n override componentDidCatch(error: Error): void {\n // eslint-disable-next-line no-console\n console.error('[widgets-v2] Render error in <Widget.State> child:', error)\n }\n\n override render(): ReactNode {\n const { error } = this.state\n if (error !== null) {\n const { fallback, labels } = this.props\n return fallback ? (\n fallback(error)\n ) : (\n <ErrorView error={error} labels={labels} />\n )\n }\n return this.props.children\n }\n}\n\nfunction defaultIsEmpty(rawData: unknown): boolean {\n if (rawData == null) return true\n if (Array.isArray(rawData)) {\n if (rawData.length === 0) return true\n if (rawData.every((item) => Array.isArray(item) && item.length === 0)) {\n return true\n }\n return false\n }\n if (typeof rawData === 'object' && Object.keys(rawData).length === 0) {\n return true\n }\n return false\n}\n\nfunction toError(value: unknown): Error {\n if (value instanceof Error) return value\n if (typeof value === 'string') return new Error(value)\n if (value && typeof value === 'object' && 'message' in value) {\n return new Error(String((value as { message: unknown }).message))\n }\n return new Error('Unknown error')\n}\n","import type { ReactNode } from 'react'\n\nexport interface SelectionSummaryLabels {\n /**\n * Optional custom renderer for the count. Defaults to the built-in two-tone\n * `selected / total` rendering. Receives the already-resolved displayed\n * number (which equals `total` when nothing is selected).\n */\n summary?: (selected: number, total: number) => ReactNode\n clear: string\n}\n\nexport const DEFAULT_SELECTION_SUMMARY_LABELS: SelectionSummaryLabels = {\n clear: 'Clear',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n minHeight: 24,\n },\n label: {\n color: 'text.secondary',\n },\n count: {\n display: 'inline-flex',\n alignItems: 'baseline',\n gap: 0.5,\n },\n selected: {\n color: 'text.primary',\n fontWeight: 600,\n },\n separator: {\n color: 'text.secondary',\n },\n total: {\n color: 'text.secondary',\n },\n clear: {\n color: 'primary.main',\n cursor: 'pointer',\n fontWeight: 500,\n '&:hover': { textDecoration: 'underline' },\n },\n icon: {\n fontSize: 16,\n color: 'text.secondary',\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, Button, Typography, type SvgIconProps } from '@mui/material'\nimport type { ComponentType } from 'react'\nimport {\n DEFAULT_SELECTION_SUMMARY_LABELS,\n type SelectionSummaryLabels,\n} from './labels'\nimport { styles } from './style'\n\nexport interface SelectionSummaryProps {\n /** Number of currently selected items. */\n count: number\n /** Optional total — when `undefined` or `0` the component renders nothing (no data). */\n total?: number\n /** Clear callback. The Clear control is shown only when `count > 0` and `onClear` is provided. */\n onClear?: () => void\n labels?: Partial<SelectionSummaryLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\n/**\n * Renders a `selected / total` count.\n *\n * Render rules:\n * - `!total` (undefined or 0) → render nothing (no data to summarize).\n * - `count === 0` → display `total / total` (everything is implicitly in\n * scope); no Clear button.\n * - `count > 0` → display `count / total` + Clear (when `onClear` is given).\n *\n * The count is two-tone by default (selected number bold/`text.primary`,\n * ` / total` in `text.secondary`). Pass `labels.summary` to render a custom\n * node instead — it receives the already-resolved displayed number (which\n * equals `total` when nothing is selected).\n */\nexport function SelectionSummary({\n count,\n total,\n onClear,\n labels,\n icon: Icon,\n iconProps,\n}: SelectionSummaryProps) {\n if (!total) return null\n const _labels = { ...DEFAULT_SELECTION_SUMMARY_LABELS, ...labels }\n const shown = count === 0 ? total : count\n\n return (\n <Box sx={styles.root}>\n {Icon ? <Icon fontSize='small' {...iconProps} /> : null}\n <Box\n component='span'\n sx={styles.count}\n aria-label={`${shown} / ${total}`}\n >\n {_labels.summary ? (\n _labels.summary(shown, total)\n ) : (\n <>\n <Typography component='span' variant='caption' sx={styles.selected}>\n {shown}\n </Typography>\n <Typography\n component='span'\n variant='caption'\n sx={styles.separator}\n >\n /\n </Typography>\n <Typography component='span' variant='caption' sx={styles.total}>\n {total}\n </Typography>\n </>\n )}\n </Box>\n {count > 0 && onClear && (\n <Button size='small' variant='text' onClick={onClear}>\n {_labels.clear}\n </Button>\n )}\n </Box>\n )\n}\n","export interface ToolboxLabels {\n trigger: string\n close: string\n}\n\nexport const DEFAULT_TOOLBOX_LABELS: ToolboxLabels = {\n trigger: 'More actions',\n close: 'Close',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.25,\n width: 'fit-content',\n borderRadius: 0.5,\n gridColumn: 2,\n height: 'fit-content',\n },\n preview: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.25,\n },\n triggerActive: {\n bgcolor: 'primary.relatedLight',\n },\n paper: {\n // Positioning is handled by Popper; only visual styles here.\n display: 'flex',\n alignItems: 'center',\n gap: 0.25,\n px: 0.25,\n py: 0.25,\n mx: 0.25,\n mt: `0 !important`, // Popper's placement adds a margin-top to offset from the trigger; we want to override that.\n bgcolor: 'background.paper',\n borderRadius: 0.5,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n Children,\n isValidElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n type ComponentType,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n Box,\n Divider,\n Grow,\n IconButton,\n Paper,\n Popper,\n type SvgIconProps,\n type SxProps,\n type Theme,\n} from '@mui/material'\nimport { Close as CloseIcon } from '@mui/icons-material'\nimport { WidgetOptions } from '@carto/meridian-ds/custom-icons'\nimport { Tooltip } from '../../components'\nimport { DEFAULT_TOOLBOX_LABELS, type ToolboxLabels } from './labels'\nimport { styles } from './style'\n\nexport interface ToolboxProps {\n /**\n * Maximum number of (non-`data-toolbar-hidden`) children rendered inline\n * when collapsed. Excess children are revealed via the overflow trigger\n * inside a floating Paper. When omitted, all children render inline.\n */\n visibleCount?: number\n labels?: Partial<ToolboxLabels>\n /**\n * Glyph used for the closed-state trigger. Defaults to the meridian-ds\n * `WidgetOptions` icon (matches v1's `ToolbarActions`).\n */\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Side the overflow Paper opens toward. `'right'` (default) places the\n * trigger on the left and the Paper covers the row to the right;\n * `'left'` is the mirror.\n */\n direction?: 'left' | 'right'\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\n/**\n * Smart overflow toolbar with **single-mount** items. Children mount once\n * into a stable, hidden host element and are *physically reparented* via\n * `appendChild` between the inline preview area and the overflow `<Paper>`\n * as the popper opens / closes — same pattern as `Widget.FullScreen.Slot`.\n * Items with no inline space when closed are kept mounted but visually\n * hidden via `display: none`.\n *\n * Why this matters: every toggle's `useTransform` registers a config /\n * data transform on mount and removes it on unmount. If items remounted\n * on each open / close, the brief setup → cleanup window would re-emit\n * the pipeline (transform missing → transform present), causing a visible\n * flicker on state-bearing transforms (Stack, Zoom, RelativeData). With\n * stable mounts the transform stays registered across the whole popover\n * lifecycle.\n *\n * Children flagged with `data-toolbar-hidden` (e.g. dividers) skip the\n * visibility budget but still render in their natural position. Trailing\n * hidden items past the budget are excluded from the inline preview so\n * they don't appear as orphan separators in the inline row; they're still\n * there in the popover.\n */\nexport function Toolbox({\n visibleCount,\n labels,\n icon: Icon = WidgetOptions,\n iconProps,\n direction = 'right',\n sx,\n children,\n}: ToolboxProps) {\n const _labels = { ...DEFAULT_TOOLBOX_LABELS, ...labels }\n // Each useState below is independent UI state — not \"related state\" that\n // `useReducer` would clean up. Justifications:\n // - `open`: toggles the overflow popover, drives JSX rendering.\n // - `anchorEl`: feeds `<Popper anchorEl>`; the Popper must re-render\n // when the trigger element first attaches.\n // - `inlineEl` / `paperEl`: read by the layout-effect dep array below\n // to reparent the stable host between shells; useRef wouldn't fire\n // the effect when the elements attach.\n // - `host` (further down): see its own comment — kept in state to make\n // the React Compiler happy reading it during render.\n const [open, setOpen] = useState(false)\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null)\n const [inlineEl, setInlineEl] = useState<HTMLElement | null>(null)\n const [paperEl, setPaperEl] = useState<HTMLElement | null>(null)\n\n const handleToggle = useCallback(() => setOpen((v) => !v), [])\n const handleTriggerRef = useCallback((node: HTMLButtonElement | null) => {\n setAnchorEl(node)\n }, [])\n\n // Esc closes the overflow paper. Outside-click is intentionally NOT wired:\n // an action inside the Paper (e.g. RelativeData toggling, a Brush menu)\n // can update widget state which momentarily reflows the page; if that's\n // treated as a click-outside, the Paper would dismiss itself mid-action.\n // Users explicitly close via the trigger or Escape.\n useEffect(() => {\n if (!open) return undefined\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open])\n\n // Stable host element shared by every toolbox cycle. `display: contents`\n // keeps it transparent in flow so items inherit layout (flex row + gap)\n // from whichever shell currently parents the host (the inline preview\n // Box or the popover Paper). Held in state — not a ref — so the React\n // Compiler is happy reading it during render.\n const [host] = useState<HTMLDivElement | null>(() => {\n if (typeof document === 'undefined') return null\n const div = document.createElement('div')\n div.style.display = 'contents'\n return div\n })\n\n const items = Children.toArray(children).filter((c): c is ReactElement =>\n isValidElement(c),\n )\n\n const visibleCountActual = items.reduce(\n (n, c) => n + (isToolbarHidden(c) ? 0 : 1),\n 0,\n )\n const showOverflow =\n visibleCount !== undefined && visibleCountActual > visibleCount\n\n // Indices that are visible inline when the popper is closed. When the\n // popper is open, every item is visible (in the popover). `null` means\n // \"no overflow — all items visible inline\".\n const inlineVisibleIndices = useMemo<Set<number> | null>(() => {\n if (!showOverflow || visibleCount === undefined) return null\n return computeInlineVisibleIndices(items, visibleCount)\n }, [items, visibleCount, showOverflow])\n\n // Auto-close the popper when overflow disappears (e.g. `visibleCount`\n // flips from a number to `undefined` because the consumer entered\n // fullscreen and wants every action visible inline). Without this the\n // popper component unmounts under us, `paperEl` goes null, and the host\n // would be stranded in a detached node — the toolbox visibly disappears.\n //\n // Uses React's documented \"store information from previous renders\"\n // pattern: a guarded inline `setOpen(false)` during render. The guard\n // fires at most once per transition (`open` flips false the same render\n // and the next render's predicate is false). React rebases the in-flight\n // render before commit, so the layout effect below sees `open=false`\n // immediately. See\n // https://react.dev/reference/react/useState#storing-information-from-previous-renders\n if (!showOverflow && open) {\n setOpen(false)\n }\n\n // Reparent the host into the active shell whenever `open` (or either\n // shell) changes. `useLayoutEffect` runs synchronously after commit\n // (after refs have been written), so the popover Paper ref is already\n // live when we read it. Falling back to `inlineEl` whenever `paperEl`\n // is missing handles cases where the popper has unmounted (showOverflow\n // flipped false) — the host always has a valid destination.\n useLayoutEffect(() => {\n const target = open && paperEl ? paperEl : inlineEl\n if (host && target && host.parentNode !== target) {\n target.appendChild(host)\n }\n }, [open, inlineEl, paperEl, host])\n\n if (items.length === 0) return null\n\n const tooltipLabel = open ? _labels.close : _labels.trigger\n const flexDirection = direction === 'left' ? 'row-reverse' : 'row'\n\n return (\n <Box sx={{ ...styles.root, flexDirection, ...sx }}>\n {showOverflow && (\n <>\n <Tooltip title={tooltipLabel}>\n <IconButton\n ref={handleTriggerRef}\n size='small'\n aria-label={tooltipLabel}\n aria-pressed={open}\n onClick={handleToggle}\n className={open ? 'active' : undefined}\n sx={{ ...(open && styles.triggerActive) }}\n >\n {open ? (\n <CloseIcon fontSize='small' />\n ) : (\n <Icon fontSize='small' {...iconProps} />\n )}\n </IconButton>\n </Tooltip>\n <Divider orientation='vertical' flexItem sx={{ mx: 0.5 }} />\n </>\n )}\n\n {/* Inline shell: when closed (or when there's no overflow) the host\n lives here so first-N items appear inline beside the trigger. */}\n <Box ref={setInlineEl} sx={styles.preview} />\n\n {showOverflow && (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement={direction === 'left' ? 'left' : 'right'}\n transition\n // Disable flipping so the Paper stays on the configured side\n // even when the trigger sits near a viewport edge — wrapper\n // consumers expect a stable layout.\n modifiers={[{ name: 'flip', enabled: false }]}\n // Slot the popper *above* most modal stacking, but below MUI's\n // own modal layer.\n sx={{ zIndex: 'tooltip', mt: 0 }}\n >\n {({ TransitionProps }) => (\n <Grow\n {...TransitionProps}\n style={{\n transformOrigin:\n direction === 'left' ? 'right center' : 'left center',\n }}\n >\n <Paper ref={setPaperEl} sx={styles.paper} />\n </Grow>\n )}\n </Popper>\n )}\n\n {/* Items render once into the stable host. The host's parent is\n whichever shell is currently active (inline or popper). When\n closed-with-overflow, items beyond the budget get `display: none`\n so they're mounted but invisible. The wrapper uses an inline\n `style` (not `sx`) so the visibility decision lands on the\n element itself — tests can inspect it without traversing\n generated MUI class names. */}\n {host\n ? createPortal(\n items.map((item, i) => {\n const visible =\n open || !inlineVisibleIndices || inlineVisibleIndices.has(i)\n const key = item.key ?? i\n return (\n <div\n key={key}\n data-toolbox-item-visible={visible ? 'true' : 'false'}\n style={{ display: visible ? 'contents' : 'none' }}\n >\n {item}\n </div>\n )\n }),\n host,\n )\n : null}\n </Box>\n )\n}\n\nfunction isToolbarHidden(child: ReactElement): boolean {\n // Opt-in flag callers set on slot children (e.g. dividers between groups)\n // so they don't count toward the inline visibility budget.\n const props = (\n child as unknown as { props: { 'data-toolbar-hidden'?: unknown } }\n ).props\n return props['data-toolbar-hidden'] === true\n}\n\n/**\n * Compute the set of item indices visible inline when the popper is closed.\n * Walk the items in order, accept each one until the visible budget is\n * exhausted; hidden items (dividers, etc.) accept without bumping the\n * counter. Strip trailing hidden items from the visible set so the inline\n * row doesn't end with an orphan separator.\n */\nfunction computeInlineVisibleIndices(\n items: readonly ReactElement[],\n visibleCount: number,\n): Set<number> {\n const indices: number[] = []\n let count = 0\n for (let i = 0; i < items.length; i++) {\n if (count >= visibleCount) break\n indices.push(i)\n if (!isToolbarHidden(items[i]!)) count++\n }\n // Strip trailing hidden items.\n while (\n indices.length > 0 &&\n isToolbarHidden(items[indices[indices.length - 1]!]!)\n ) {\n indices.pop()\n }\n return new Set(indices)\n}\n","export interface NoteLabels {\n showMore: string\n showLess: string\n}\n\nexport const DEFAULT_NOTE_LABELS: NoteLabels = {\n showMore: 'Show more',\n showLess: 'Show less',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n },\n text: {\n color: 'text.secondary',\n overflow: 'hidden',\n overflowWrap: 'anywhere',\n },\n clamped: {\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 3,\n },\n toggle: {\n alignSelf: 'flex-start',\n color: 'primary.main',\n fontWeight: 500,\n cursor: 'pointer',\n '&:hover': { textDecoration: 'underline' },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { Box, Link, Typography } from '@mui/material'\nimport type { Components } from 'react-markdown'\nimport { MarkdownContent } from '../markdown/markdown-content'\nimport { observeResize } from '../echart/shared-resize-observer'\nimport { DEFAULT_NOTE_LABELS, type NoteLabels } from './labels'\nimport { styles } from './style'\n\nexport interface NoteProps {\n /**\n * Maximum visible lines before clamping. Defaults to 3. Set to `0` to\n * disable clamping entirely — full content renders and the Show More/Less\n * toggle is never shown.\n */\n lineClamp?: number\n labels?: Partial<NoteLabels>\n /**\n * Renders verbatim inside the caption shell. For markdown source (a\n * string with `**bold**`, lists, links, etc.) reach for the\n * `<Note.Markdown>` subcomponent instead — it pipes the string through\n * the shared {@link MarkdownContent} engine with caption-safe element\n * mapping.\n */\n children: ReactNode\n}\n\nexport interface NoteMarkdownProps {\n /** Markdown source. Rendered with caption typography via {@link MarkdownContent}. */\n content: string\n /** Maximum visible lines before clamping. Defaults to 3. */\n lineClamp?: number\n labels?: Partial<NoteLabels>\n}\n\n/** Block element used for every Markdown paragraph and demoted heading so\n * Notes share a single caption look and never inject heading levels into\n * the document outline. */\nfunction CaptionBlock({ children }: { children?: ReactNode }) {\n return (\n <Typography variant='caption' component='p' color='inherit' sx={{ m: 0 }}>\n {children}\n </Typography>\n )\n}\n\nconst NOTE_COMPONENTS: Components = {\n // Headings demoted to caption typography — a Note can't introduce a\n // heading into the page outline.\n h1: CaptionBlock,\n h2: CaptionBlock,\n h3: CaptionBlock,\n h4: CaptionBlock,\n h5: CaptionBlock,\n h6: CaptionBlock,\n p: CaptionBlock,\n // External-safe link defaults; inherit colour from the muted caption.\n a: ({ children, href }) => (\n <Link\n href={href}\n target='_blank'\n rel='noopener noreferrer'\n color='inherit'\n underline='always'\n >\n {children}\n </Link>\n ),\n}\n\n/**\n * Auxiliary slot for an optional explanatory note below a widget. Clamps to\n * `lineClamp` lines (default 3) and reveals a Show More/Less toggle when the\n * content overflows. Overflow detection re-runs on container resize via the\n * shared singleton ResizeObserver.\n *\n * Renders `children` verbatim through caption typography. For markdown\n * source, use the {@link NoteMarkdown} (`Note.Markdown`) subcomponent.\n */\nfunction NoteBase({ lineClamp = 3, labels, children }: NoteProps) {\n return (\n <NoteShell lineClamp={lineClamp} labels={labels} dependency={children}>\n <Typography variant='caption' component='div' color='inherit'>\n {children}\n </Typography>\n </NoteShell>\n )\n}\n\n/**\n * Markdown variant of {@link Note}. Pipes the `content` string through the\n * shared {@link MarkdownContent} engine with caption-safe element mapping\n * (headings demoted, links open in new tabs, images/HTML stripped).\n */\nfunction NoteMarkdown({ content, lineClamp = 3, labels }: NoteMarkdownProps) {\n return (\n <NoteShell lineClamp={lineClamp} labels={labels} dependency={content}>\n <MarkdownContent content={content} components={NOTE_COMPONENTS} />\n </NoteShell>\n )\n}\n\n// Public namespace export. Consumers reach the markdown variant via\n// `<Widget.Note.Markdown>{content}</Widget.Note.Markdown>`.\nexport const Note = Object.assign(NoteBase, { Markdown: NoteMarkdown })\n\ninterface NoteShellProps {\n lineClamp: number\n labels: Partial<NoteLabels> | undefined\n /** Used to re-measure overflow when the underlying content changes. */\n dependency: unknown\n children: ReactNode\n}\n\n/**\n * Shared shell: caption box + clamping + Show More/Less toggle. Both the\n * verbatim `Note` and the markdown `Note.Markdown` reach for this so the\n * overflow + measurement behaviour stays identical across variants.\n */\nfunction NoteShell({\n lineClamp,\n labels,\n dependency,\n children,\n}: NoteShellProps) {\n const _labels = { ...DEFAULT_NOTE_LABELS, ...labels }\n const textRef = useRef<HTMLDivElement | null>(null)\n const [isOverflowing, setIsOverflowing] = useState(false)\n const [expanded, setExpanded] = useState(false)\n const clampingDisabled = lineClamp <= 0\n\n const measure = useCallback(() => {\n const node = textRef.current\n if (!node) return\n setIsOverflowing(node.scrollHeight > node.clientHeight + 1)\n }, [])\n\n useEffect(() => {\n if (clampingDisabled) return undefined\n const node = textRef.current\n if (!node) return undefined\n measure()\n return observeResize(node, measure)\n }, [measure, dependency, clampingDisabled])\n\n const toggle = useCallback(() => setExpanded((v) => !v), [])\n const clamped = !expanded && !clampingDisabled\n const lineClampSx = clamped\n ? { ...styles.clamped, WebkitLineClamp: lineClamp }\n : null\n\n return (\n <Box sx={styles.root}>\n <Box ref={textRef} sx={{ ...styles.text, ...(lineClampSx ?? {}) }}>\n {children}\n </Box>\n {/* Stay visible while the user is in the expanded state so they always\n have a way back. Without `|| expanded` the toggle would vanish the\n moment content unclamps (scrollHeight === clientHeight). Matches v1. */}\n {!clampingDisabled && (isOverflowing || expanded) && (\n <Link\n component='button'\n variant='caption'\n underline='none'\n onClick={toggle}\n sx={styles.toggle}\n >\n {expanded ? _labels.showLess : _labels.showMore}\n </Link>\n )}\n </Box>\n )\n}\n","// ─── Internal imports (used to assemble the curated `Widget` const) ─────────\nimport { Provider } from './provider/widget-provider'\nimport {\n Wrapper,\n Actions,\n Options,\n Content,\n Footer,\n DEFAULT_WRAPPER_LABELS,\n} from './wrapper'\nimport { Subheader } from './subheader/subheader'\nimport { State } from './state/widget-state'\nimport { DEFAULT_STATE_LABELS } from './state/labels'\nimport { SelectionSummary } from './selection-summary/selection-summary'\nimport { DEFAULT_SELECTION_SUMMARY_LABELS } from './selection-summary/labels'\nimport { Toolbox } from './toolbox/toolbox'\nimport { DEFAULT_TOOLBOX_LABELS } from './toolbox/labels'\nimport { Echart, EchartUI, DEFAULT_INIT_OPTS } from './echart'\nimport { Note } from './note/widget-note'\nimport { DEFAULT_NOTE_LABELS } from './note/labels'\nimport {\n Searcher,\n SearcherToggle,\n StackToggle,\n ShowAllToggle,\n ZoomToggle,\n BrushToggle,\n RelativeData,\n Download,\n FullScreen,\n LockSelection,\n ChangeColumn,\n} from './actions'\nimport { Formula, FormulaUI } from './formula'\nimport { Markdown, MarkdownUI } from './markdown'\nimport { Spread, SpreadUI } from './spread'\nimport { Range, RangeUI } from './range'\nimport { Category, CategoryUI } from './category'\nimport { Table, TableUI } from './table'\n\n/**\n * Curated namespace export — the only way to reach v2 widget components.\n * Consumers import the const and access components via property access:\n *\n * ```tsx\n * import { Widget } from '@carto/ps-react-ui/widgets-v2'\n *\n * <Widget.Provider id={id} data={data}>\n * <Widget.Wrapper title='Sales'>\n * <Widget.Content>\n * <Widget.State skeleton={<BarSkeleton />}>\n * <Widget.Echart optionFactory={optionFactory} />\n * </Widget.State>\n * </Widget.Content>\n * </Widget.Wrapper>\n * </Widget.Provider>\n * ```\n *\n * Component identifiers are not surfaced as separate named exports — Types\n * (props, data shapes, label types, default-label consts) and per-widget\n * subpath entries (`@carto/ps-react-ui/widgets-v2/bar`, `…/category`,\n * `…/table`, `…/actions`, `…/stores`, `…/utils`, etc.) remain available for\n * direct import where needed.\n */\nexport const Widget = {\n // Composition shell\n Provider,\n Wrapper,\n Actions,\n Options,\n Content,\n Footer,\n Subheader,\n State,\n SelectionSummary,\n Toolbox,\n Note,\n\n // ECharts bridge\n Echart,\n EchartUI,\n\n // Actions\n Searcher,\n SearcherToggle,\n StackToggle,\n ShowAllToggle,\n ZoomToggle,\n BrushToggle,\n RelativeData,\n Download,\n FullScreen,\n LockSelection,\n ChangeColumn,\n\n // Widget primitives (renderer bridges + pure UI). Pre-composed widget\n // modules (Bar, FormulaWidget, TableWidget, etc.) are application-level\n // compositions of these primitives and live outside the library —\n // see `apps/storybook/stories/modules/widgets/` for canonical examples.\n Formula,\n FormulaUI,\n Markdown,\n MarkdownUI,\n Spread,\n SpreadUI,\n Range,\n RangeUI,\n Category,\n CategoryUI,\n Table,\n TableUI,\n} as const\n\n// ─── Default-label consts ──────────────────────────────────────────────────\n// Exported separately so consumers can build customized label sets via spread.\nexport {\n DEFAULT_WRAPPER_LABELS,\n DEFAULT_STATE_LABELS,\n DEFAULT_SELECTION_SUMMARY_LABELS,\n DEFAULT_TOOLBOX_LABELS,\n DEFAULT_NOTE_LABELS,\n DEFAULT_INIT_OPTS,\n}\n\n// ─── Types ─────────────────────────────────────────────────────────────────\n// Types are erased at runtime so they can't live on the `Widget` const.\n// They are re-exported here for direct import by consumers.\n\nexport type { ProviderProps } from './provider/widget-provider'\nexport type {\n WrapperProps,\n ActionsProps,\n OptionsProps,\n ContentProps,\n FooterProps,\n WrapperLabels,\n} from './wrapper'\nexport type { SubheaderProps } from './subheader/subheader'\nexport type { StateProps } from './state/widget-state'\nexport type { StateLabels } from './state/labels'\nexport type { SelectionSummaryProps } from './selection-summary/selection-summary'\nexport type { SelectionSummaryLabels } from './selection-summary/labels'\nexport type { ToolboxProps } from './toolbox/toolbox'\nexport type { ToolboxLabels } from './toolbox/labels'\nexport type { EchartProps, EchartUIProps, EchartsEventHandler } from './echart'\nexport type { NoteProps, NoteMarkdownProps } from './note/widget-note'\nexport type { NoteLabels } from './note/labels'\n\n// Action types\nexport type {\n SearcherProps,\n SearcherToggleProps,\n StackToggleProps,\n ShowAllToggleProps,\n ZoomToggleProps,\n BrushToggleProps,\n RelativeDataProps,\n DownloadProps,\n DownloadItem,\n FullScreenTriggerProps,\n FullScreenSlotProps,\n LockSelectionProps,\n LockSelectionKey,\n ChangeColumnProps,\n ChangeColumnItem,\n} from './actions'\n\n// Widget primitive types\nexport type {\n FormulaUIProps,\n FormulaDataItem,\n FormulaWidgetData,\n} from './formula'\nexport type { MarkdownUIProps, MarkdownWidgetData } from './markdown'\nexport type { PieDatum, PieWidgetData } from './pie'\nexport type { TimeseriesDatum, TimeseriesWidgetData } from './timeseries'\nexport type { ScatterplotDatum, ScatterplotWidgetData } from './scatterplot'\nexport type { SpreadUIProps, SpreadDataItem, SpreadWidgetData } from './spread'\nexport type {\n RangeProps,\n RangeUIProps,\n RangeDataItem,\n RangeWidgetData,\n RangeItemValue,\n} from './range'\nexport type {\n CategoryProps,\n CategoryUIProps,\n CategoryDataItem,\n CategoryWidgetData,\n CategoryKey,\n CategorySeriesConfig,\n CategoryLabels,\n} from './category'\nexport type {\n TableProps,\n TableUIProps,\n TableColumn,\n TableRow,\n TableWidgetData,\n TableWidgetState,\n TableSortDirection,\n TableSortState,\n} from './table'\n\n// Canonical cross-widget series shape — see `widgets-v2/types.ts`.\nexport type { WidgetSeries } from './types'\n"],"names":["Provider","t0","$","_c","id","data","isLoading","isFetching","error","formatter","labelFormatter","keepAlive","t1","children","undefined","t2","hasWidgetStore","getWidgetStore","created","createWidgetStore","setWidgetStoreEntry","store","useState","t3","t4","registerWidgetStore","unregisterWidgetStore","useLayoutEffect","t5","t6","setState","rawData","t7","t8","t10","t9","rawFormatter","t11","WidgetContext","styles","root","position","width","minWidth","bgcolor","borderRadius","overflow","boxShadow","display","opacity","transition","transitions","create","duration","standard","easing","easeInOut","pointerEvents","color","backgroundColor","loading","top","left","height","spacing","zIndex","summary","minHeight","gap","paddingInlineEnd","alignItems","titleCell","flexGrow","flexShrink","titleText","wordBreak","WebkitLineClamp","WebkitBoxOrient","actions","justifyContent","options","detail","flexDirection","paddingTop","content","footer","pt","Actions","sx","jsx","Box","_temp","e","stopPropagation","Options","_temp2","DEFAULT_WRAPPER_LABELS","collapse","expand","errorFallbackTitle","Wrapper","title","collapsed","onCollapseChange","defaultCollapsed","disabled","variant","labels","expandIcon","iconProps","ExpandIcon","ExpandMoreIcon","useWidgetId","useWidget","isControlled","internalCollapsed","setInternalCollapsed","effectiveCollapsed","_","expanded","next","handleAccordionToggle","_labels","partitionChildren","summarySlots","details","detailsSlots","ariaLabel","LinearProgress","t12","t13","t14","ref","Typography","SmartTooltip","t15","jsxs","AccordionSummary","t16","AccordionDetails","t17","Accordion","s","child","Children","toArray","isSlot","push","node","type","isValidElement","Content","Footer","gridTemplateColumns","pb","Subheader","emptyRoot","paddingBottom","paddingX","captureBox","flex","DEFAULT_STATE_LABELS","errorTitle","errorMessage","Error","message","String","emptyTitle","emptyDescription","sliceSelector","State","skeleton","isEmpty","fallback","defaultIsEmpty","slice","useWidgetShallow","err","toError","Fragment","ErrorView","EmptyView","CaptureBox","RenderErrorBoundary","el","setCaptureEl","setRef","AlertTitle","Alert","Component","state","getDerivedStateFromError","componentDidCatch","console","render","props","Array","isArray","length","every","item","Object","keys","value","DEFAULT_SELECTION_SUMMARY_LABELS","clear","count","selected","fontWeight","separator","total","SelectionSummary","onClear","icon","Icon","T0","T1","shown","Button","DEFAULT_TOOLBOX_LABELS","trigger","close","gridColumn","preview","triggerActive","paper","px","py","mx","mt","Toolbox","visibleCount","direction","WidgetOptions","open","setOpen","anchorEl","setAnchorEl","inlineEl","setInlineEl","paperEl","setPaperEl","Symbol","for","handleToggle","handleTriggerRef","onKey","key","document","addEventListener","removeEventListener","useEffect","host","items","filter","_temp3","reduce","_temp4","showOverflow","bb0","computeInlineVisibleIndices","inlineVisibleIndices","target","parentNode","appendChild","tooltipLabel","Tooltip","IconButton","CloseIcon","Divider","Popper","name","enabled","TransitionProps","Grow","transformOrigin","Paper","createPortal","map","i","visible","has","n","c_0","isToolbarHidden","c","div","createElement","style","v","indices","pop","Set","DEFAULT_NOTE_LABELS","showMore","showLess","text","overflowWrap","clamped","toggle","alignSelf","cursor","textDecoration","CaptionBlock","m","NOTE_COMPONENTS","h1","h2","h3","h4","h5","h6","p","a","href","Link","NoteBase","lineClamp","NoteShell","NoteMarkdown","MarkdownContent","Note","assign","Markdown","dependency","textRef","useRef","isOverflowing","setIsOverflowing","setExpanded","clampingDisabled","current","scrollHeight","clientHeight","measure","node_0","observeResize","lineClampSx","Widget","Echart","EchartUI","Searcher","SearcherToggle","StackToggle","ShowAllToggle","ZoomToggle","BrushToggle","RelativeData","Download","FullScreen","LockSelection","ChangeColumn","Formula","FormulaUI","MarkdownUI","Spread","SpreadUI","Range","RangeUI","Category","CategoryUI","Table","TableUI"],"mappings":"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"}
1
+ {"version":3,"file":"widgets-v2.js","sources":["../src/widgets-v2/provider/widget-provider.tsx","../src/widgets-v2/wrapper/style.ts","../src/widgets-v2/wrapper/widget-actions.tsx","../src/widgets-v2/wrapper/labels.ts","../src/widgets-v2/wrapper/widget-wrapper.tsx","../src/widgets-v2/wrapper/widget-content.tsx","../src/widgets-v2/subheader/style.ts","../src/widgets-v2/subheader/subheader.tsx","../src/widgets-v2/state/style.ts","../src/widgets-v2/state/labels.ts","../src/widgets-v2/state/widget-state.tsx","../src/widgets-v2/selection-summary/labels.ts","../src/widgets-v2/selection-summary/style.ts","../src/widgets-v2/selection-summary/selection-summary.tsx","../src/widgets-v2/toolbox/labels.ts","../src/widgets-v2/toolbox/style.ts","../src/widgets-v2/toolbox/toolbox.tsx","../src/widgets-v2/note/labels.ts","../src/widgets-v2/note/style.ts","../src/widgets-v2/note/widget-note.tsx","../src/widgets-v2/index.ts"],"sourcesContent":["import { useLayoutEffect, useState, type ReactNode } from 'react'\nimport {\n WidgetContext,\n createWidgetStore,\n hasWidgetStore,\n getWidgetStore,\n registerWidgetStore,\n setWidgetStoreEntry,\n unregisterWidgetStore,\n} from '../stores'\nimport type { WidgetStoreApi } from '../stores'\n\nexport interface ProviderProps {\n id: string\n data: unknown\n isLoading?: boolean\n isFetching?: boolean\n error?: unknown\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n /**\n * When `true`, the per-widget store survives unmount so transformStates,\n * search text, fullscreen state, etc. are preserved across remounts.\n * Consumers using keepAlive must call `deleteWidgetStore(id)` themselves\n * when the widget is permanently removed — there is no automatic GC.\n */\n keepAlive?: boolean\n children: ReactNode\n}\n\n/**\n * Renderer-agnostic widget shell. Creates a per-widget Zustand store\n * keyed by `id`, syncs the consumer props (`data`, `isLoading`, `error`,\n * `formatter`, …) onto it, and exposes the `id` via `WidgetContext` so\n * descendants can resolve their store with `useWidgetId()`.\n *\n * The Provider deliberately doesn't know about ECharts — there's no\n * `optionFactory` prop here. ECharts-backed widgets pass their factory\n * to `<Widget.Echart optionFactory={…}>`, which owns the structural\n * seed + the data-fusion render step entirely. Non-Echart widgets\n * (Formula, Spread, Range, Table, Category, Markdown) just don't pass\n * anything ECharts-shaped.\n */\nexport function Provider({\n id,\n data,\n isLoading,\n isFetching,\n error,\n formatter,\n labelFormatter,\n keepAlive = false,\n children,\n}: ProviderProps) {\n // Lazy init — reuse an existing keepAlive store, otherwise create one and\n // synchronously place it in the registry so descendants can call\n // useWidget(id, ...) on first render. Refcounting + dup-id detection happen\n // in the mount layout-effect below.\n const [store] = useState<WidgetStoreApi>(() => {\n if (hasWidgetStore(id)) return getWidgetStore(id)\n const created = createWidgetStore(id, {\n data,\n isLoading,\n isFetching,\n error,\n formatter,\n labelFormatter,\n })\n setWidgetStoreEntry(id, created)\n return created\n })\n\n // Registration: refcount the mount for dup-id detection; unregister on\n // unmount or when the id/store/keepAlive triple changes.\n useLayoutEffect(() => {\n registerWidgetStore(id, store)\n return () => {\n unregisterWidgetStore(id, { keepAlive })\n }\n }, [id, store, keepAlive])\n\n // Per-prop sync. `useLayoutEffect` so kept-alive remounts apply incoming\n // props before paint (no flash of stale data when reusing a store).\n // The pipeline middleware bypasses unchanged fields, so unchanged props\n // are a no-op even though setState is called every effect run.\n useLayoutEffect(() => {\n store.setState({ rawData: data })\n }, [store, data])\n\n useLayoutEffect(() => {\n store.setState({\n isLoading: isLoading ?? false,\n isFetching: isFetching ?? false,\n error,\n })\n }, [store, isLoading, isFetching, error])\n\n // Sync the consumer's formatter prop to BOTH `rawFormatter` (kept canonical\n // for actions that need to restore the absolute view) and `formatter` (the\n // active value). Actions like RelativeData re-apply their override after\n // `rawFormatter` changes.\n useLayoutEffect(() => {\n store.setState({\n rawFormatter: formatter,\n formatter,\n labelFormatter,\n })\n }, [store, formatter, labelFormatter])\n\n return <WidgetContext.Provider value={id}>{children}</WidgetContext.Provider>\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n position: 'relative',\n width: '100%',\n minWidth: 0,\n bgcolor: 'background.paper',\n borderRadius: 1,\n overflow: 'hidden',\n boxShadow: 'none',\n // MUI Accordion ships its own collapsed-state divider rules; clear them\n // so they don't fight our card border.\n '&::before': { display: 'none' },\n\n // Hover-fade actions (v1 parity). Direct children of\n // `.widget-wrapper-actions` are dimmed by default on fine-pointer devices\n // and fade in on hover; an action carrying the `.active` class stays\n // full-opacity even outside hover. Coarse-pointer devices show actions\n // always.\n //\n // The class must sit on the action element itself\n // (`<IconButton className='active'>`). v2 does NOT wrap each action in\n // an extra container the way v1 does, so the `> *` selector lands on the\n // action button directly — `&:has(.active)` would only match if the\n // class were on a descendant, which is never the case here.\n '& .widget-wrapper-actions > *': {\n opacity: 1,\n transition: ({ transitions }: Theme) =>\n transitions.create('opacity', {\n duration: transitions.duration.standard,\n easing: transitions.easing.easeInOut,\n }),\n '@media (hover: hover)': {\n opacity: 0,\n },\n '&.active': {\n opacity: 1,\n },\n },\n '&:hover .widget-wrapper-actions > *': {\n opacity: 1,\n },\n '&[data-collapsed=\"true\"] .widget-wrapper-actions > *': {\n opacity: 0,\n pointerEvents: 'none',\n '&.active': {\n opacity: 1,\n },\n },\n },\n loading: {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: ({ spacing }: Theme) => spacing(0.35),\n zIndex: 1,\n },\n summary: {\n minHeight: ({ spacing }: Theme) => spacing(7),\n '& .MuiAccordionSummary-content': {\n gap: ({ spacing }: Theme) => spacing(0.5),\n paddingInlineEnd: ({ spacing }: Theme) => spacing(0.75),\n alignItems: 'center',\n },\n },\n // Disabled state — only the collapse toggle is inert (enforced by the\n // guarded `onChange` handler, not `pointer-events`). Actions and Options in\n // the summary row, and the details panel, all keep their events. We just\n // drop the toggle affordance: hide the chevron (handled in the component)\n // and clear the pointer cursor. MUI's AccordionSummary sets\n // `cursor: pointer` via `&:hover:not(.Mui-disabled)` — a two-class selector\n // that outranks a plain `cursor` rule — so we override at matching\n // specificity. Action/Option buttons restore their own pointer cursor.\n summaryDisabled: {\n '&, &:hover:not(.Mui-disabled)': {\n cursor: 'default',\n },\n },\n titleCell: {\n flexGrow: 1,\n flexShrink: 1,\n minWidth: 0,\n display: 'flex',\n alignItems: 'center',\n minHeight: ({ spacing }: Theme) => spacing(3),\n },\n titleText: {\n minWidth: 0,\n wordBreak: 'break-word',\n overflow: 'hidden',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n },\n actions: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n justifyContent: 'flex-end',\n flexShrink: 0,\n '& > *': {\n pointerEvents: 'auto',\n },\n },\n options: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n flexShrink: 0,\n },\n detail: {\n display: 'flex',\n flexDirection: 'column',\n gap: ({ spacing }: Theme) => spacing(1),\n paddingTop: ({ spacing }: Theme) => spacing(0.5),\n },\n content: {\n minWidth: 0,\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n },\n footer: {\n pt: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, type SxProps, type Theme } from '@mui/material'\nimport type { ReactNode } from 'react'\nimport { styles } from './style'\n\nexport interface ActionsProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\n/**\n * Slot for the wrapper header's right-side action buttons. The\n * `widget-wrapper-actions` className activates the hover-fade CSS rule on\n * `<Wrapper>`: action children fade in on hover (always visible on coarse-\n * pointer devices), and stay full-opacity when a descendant is marked with\n * `.active` — typically applied by toggled actions.\n *\n * The container also stops click propagation so interacting with an action\n * doesn't toggle the wrapper's collapse.\n */\nexport function Actions({ sx, children }: ActionsProps) {\n return (\n <Box\n className='widget-wrapper-actions'\n onClick={(e) => e.stopPropagation()}\n sx={{ ...styles.actions, ...sx }}\n >\n {children}\n </Box>\n )\n}\n\nexport interface OptionsProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\nexport function Options({ sx, children }: OptionsProps) {\n return (\n <Box onClick={(e) => e.stopPropagation()} sx={{ ...styles.options, ...sx }}>\n {children}\n </Box>\n )\n}\n","export interface WrapperLabels {\n collapse: string\n expand: string\n errorFallbackTitle: string\n}\n\nexport const DEFAULT_WRAPPER_LABELS: WrapperLabels = {\n collapse: 'Collapse',\n expand: 'Expand',\n errorFallbackTitle: 'Widget failed to render',\n}\n","import {\n Children,\n isValidElement,\n useCallback,\n useState,\n type ComponentType,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport {\n Accordion,\n AccordionDetails,\n AccordionSummary,\n Box,\n LinearProgress,\n Typography,\n type SvgIconProps,\n type SxProps,\n type Theme,\n} from '@mui/material'\nimport { ExpandMore as ExpandMoreIcon } from '@mui/icons-material'\nimport { SmartTooltip } from '../../components/smart-tooltip/smart-tooltip'\nimport { useWidget, useWidgetId } from '../stores'\nimport { Actions, Options } from './widget-actions'\nimport { styles } from './style'\nimport { DEFAULT_WRAPPER_LABELS, type WrapperLabels } from './labels'\n\nexport interface WrapperProps {\n title: string\n /**\n * Controlled collapsed state. When supplied, the wrapper is fully\n * controlled — the consumer is responsible for updating it via\n * `onCollapseChange`. Leave undefined to use the uncontrolled mode,\n * which seeds internal state from `defaultCollapsed`.\n */\n collapsed?: boolean\n /**\n * Fires whenever the user interacts to toggle the wrapper, with the\n * NEXT collapsed value. Called for both controlled and uncontrolled\n * usage — consumers can subscribe to user-driven toggles even when\n * letting the wrapper manage its own state.\n */\n onCollapseChange?: (collapsed: boolean) => void\n /**\n * Initial collapsed state when the wrapper is uncontrolled (i.e.\n * `collapsed` is undefined). Ignored when `collapsed` is supplied.\n */\n defaultCollapsed?: boolean\n disabled?: boolean\n /**\n * Visual variant. `'elevation'` (default) renders a borderless shell;\n * `'outlined'` adds a 1px divider border around the card.\n */\n variant?: 'outlined' | 'elevation'\n labels?: Partial<WrapperLabels>\n /**\n * Icon shown at the right edge of the summary row. Accordion rotates it\n * 180° automatically when the wrapper expands. Default: `ExpandMoreIcon`.\n */\n expandIcon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\n/**\n * Widget shell — title + collapsible body, built on MUI `<Accordion>` for\n * native click-to-toggle on the summary header and a smooth open/close\n * transition. UX matches v1 `<WrapperUI>`:\n *\n * • hover-fade action buttons (always visible on coarse-pointer devices)\n * • multi-line title clamp (`WebkitLineClamp: 2`, word-break) + SmartTooltip\n * when the text overflows\n * • top-edge `<LinearProgress>` driven by the widget store's `isFetching`\n * • chevron at the right end (rotated by Accordion based on expanded state)\n *\n * Children are partitioned by component identity: `<Actions>` and `<Options>`\n * render inside the summary row; everything else (`<Content>`, `<Footer>`,\n * loose nodes) renders inside the details panel.\n */\nexport function Wrapper({\n title,\n collapsed,\n onCollapseChange,\n defaultCollapsed = false,\n disabled = false,\n variant = 'elevation',\n labels,\n expandIcon: ExpandIcon = ExpandMoreIcon,\n iconProps,\n sx,\n children,\n}: WrapperProps) {\n const id = useWidgetId()\n const isFetching = useWidget(id, (s) => s.isFetching)\n // Controlled vs uncontrolled: when the consumer passes `collapsed`, they\n // own the state; otherwise we keep an internal copy seeded from\n // `defaultCollapsed`. `internalCollapsed` is still tracked in controlled\n // mode so a consumer can drop the controlled prop later without losing\n // the last-known position.\n const isControlled = collapsed !== undefined\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed)\n const effectiveCollapsed = isControlled ? collapsed : internalCollapsed\n const handleAccordionToggle = useCallback(\n (_: unknown, expanded: boolean) => {\n if (disabled) return\n const next = !expanded\n onCollapseChange?.(next)\n setInternalCollapsed(next)\n },\n [disabled, onCollapseChange],\n )\n const _labels = { ...DEFAULT_WRAPPER_LABELS, ...labels }\n\n const { summary: summarySlots, details: detailsSlots } =\n partitionChildren(children)\n\n const ariaLabel = effectiveCollapsed ? _labels.expand : _labels.collapse\n\n return (\n <Accordion\n data-collapsed={effectiveCollapsed ? 'true' : undefined}\n expanded={!effectiveCollapsed}\n onChange={handleAccordionToggle}\n disableGutters\n elevation={0}\n variant={variant}\n square\n sx={{\n ...styles.root,\n ...sx,\n }}\n >\n {isFetching ? (\n <LinearProgress sx={styles.loading} color='primary' />\n ) : null}\n\n <AccordionSummary\n expandIcon={\n disabled ? null : <ExpandIcon fontSize='small' {...iconProps} />\n }\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n sx={{ ...styles.summary, ...(disabled ? styles.summaryDisabled : null) }}\n >\n <SmartTooltip title={title}>\n {({ ref }) => (\n <Box sx={styles.titleCell}>\n <Typography\n ref={ref}\n variant='subtitle1'\n sx={styles.titleText}\n textTransform='none'\n >\n {title}\n </Typography>\n </Box>\n )}\n </SmartTooltip>\n {summarySlots}\n </AccordionSummary>\n <AccordionDetails sx={styles.detail}>{detailsSlots}</AccordionDetails>\n </Accordion>\n )\n}\n\n/**\n * Splits children by component identity: `<Actions>` and `<Options>` belong\n * in the summary row, everything else in the details panel. Identity\n * comparison works because both slot components are imported from the same\n * module that consumers use.\n */\nfunction partitionChildren(children: ReactNode): {\n summary: ReactNode[]\n details: ReactNode[]\n} {\n const summary: ReactNode[] = []\n const details: ReactNode[] = []\n for (const child of Children.toArray(children)) {\n if (isSlot(child, Actions) || isSlot(child, Options)) {\n summary.push(child)\n } else {\n details.push(child)\n }\n }\n return { summary, details }\n}\n\nfunction isSlot(node: ReactNode, type: unknown): node is ReactElement {\n return isValidElement(node) && node.type === type\n}\n","import { Box, type SxProps, type Theme } from '@mui/material'\nimport type { ReactNode } from 'react'\nimport { styles } from './style'\n\nexport interface ContentProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\nexport function Content({ sx, children }: ContentProps) {\n return (\n <Box data-slot='content' sx={{ ...styles.content, ...sx }}>\n {children}\n </Box>\n )\n}\n\nexport interface FooterProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\nexport function Footer({ sx, children }: FooterProps) {\n return (\n <Box data-slot='footer' sx={{ ...styles.footer, ...sx }}>\n {children}\n </Box>\n )\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'grid',\n gridTemplateColumns: '1fr auto',\n alignItems: 'center',\n gap: 1,\n minHeight: 32,\n pb: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, type SxProps, type Theme } from '@mui/material'\nimport type { ReactNode } from 'react'\nimport { styles } from './style'\n\nexport interface SubheaderProps {\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\n/**\n * Stateless layout: CSS grid `1fr auto`. Children self-place — typically\n * `<Widget.SelectionSummary />` (left) and `<Widget.Toolbox>` (right).\n */\nexport function Subheader({ sx, children }: SubheaderProps) {\n return <Box sx={{ ...styles.root, ...sx }}>{children}</Box>\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n emptyRoot: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n paddingTop: 1,\n paddingBottom: 2,\n paddingX: 2,\n width: '100%',\n minHeight: '100%',\n },\n // Stable wrapper around the success-path children. Real layout (flex\n // column) so html2canvas has a non-zero bounding rect to rasterise.\n // `flex: 1; min-height: 0` lets nested scroll regions / fixed-height\n // chart canvases size correctly inside Widget.Content's flex column.\n captureBox: {\n width: '100%',\n minHeight: 0,\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","export interface StateLabels {\n errorTitle: string\n errorMessage: (error: unknown) => string\n emptyTitle: string\n emptyDescription: string\n}\n\nexport const DEFAULT_STATE_LABELS: StateLabels = {\n errorTitle: 'Something went wrong',\n errorMessage: (error: unknown): string => {\n if (error instanceof Error) return error.message\n if (typeof error === 'string') return error\n if (error && typeof error === 'object' && 'message' in error) {\n return String((error as { message: unknown }).message)\n }\n return 'Unknown error'\n },\n emptyTitle: 'No data',\n emptyDescription: 'Try adjusting filters or wait for data to load.',\n}\n","import { Component, useCallback, type ReactNode } from 'react'\nimport { Alert, AlertTitle, Box, Typography } from '@mui/material'\nimport { setCaptureEl, useWidgetId, useWidgetShallow } from '../stores'\nimport { styles } from './style'\nimport { DEFAULT_STATE_LABELS, type StateLabels } from './labels'\n\nexport interface StateProps {\n skeleton: ReactNode\n children: ReactNode\n /** Override the empty-state predicate. Receives `rawData` (pre-pipeline). */\n isEmpty?: (rawData: unknown) => boolean\n /** Render an alternative error UI. When omitted, the default ErrorView is used. */\n fallback?: (error: Error) => ReactNode\n labels?: Partial<StateLabels>\n}\n\ninterface StateSlice {\n isLoading: boolean\n isFetching: boolean\n error: unknown\n rawData: unknown\n}\n\nconst sliceSelector = (s: {\n isLoading: boolean\n isFetching: boolean\n error: unknown\n rawData: unknown\n}): StateSlice => ({\n isLoading: s.isLoading,\n isFetching: s.isFetching,\n error: s.error,\n rawData: s.rawData,\n})\n\n/**\n * Priority chain: loading → error → empty → content. Both consumer-supplied\n * errors (set via Provider's `error` prop) and transform-throw errors (set by\n * the pipeline middleware) flow through the same `error` field. Render-time\n * errors thrown by `children` are caught by the inlined error boundary and\n * routed through the same path.\n */\nexport function State({\n skeleton,\n children,\n isEmpty = defaultIsEmpty,\n fallback,\n labels,\n}: StateProps) {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, sliceSelector)\n const _labels = { ...DEFAULT_STATE_LABELS, ...labels }\n\n // Loading wins over everything else (matches v1 — hides errors during fetch).\n if (slice.isLoading) return <>{skeleton}</>\n\n // Store-side error (consumer-supplied or transform-throw via middleware).\n if (slice.error !== undefined && slice.error !== null) {\n const err = toError(slice.error)\n return fallback ? (\n <>{fallback(err)}</>\n ) : (\n <ErrorView error={err} labels={_labels} />\n )\n }\n\n // Empty (uses pre-pipeline rawData so a transform that filters everything\n // doesn't get misclassified as \"no data from upstream\").\n if (isEmpty(slice.rawData)) {\n return <EmptyView labels={_labels} />\n }\n\n return (\n <RenderErrorBoundary fallback={fallback} labels={_labels}>\n <CaptureBox id={id}>{children}</CaptureBox>\n </RenderErrorBoundary>\n )\n}\n\n/**\n * Wraps the success-path children in a stable flex column whose DOM ref is\n * registered with the per-widget capture map. Per-widget download configs\n * feed the wrapper element to `html2canvas` for PNG export. The callback\n * ref auto-clears (React calls it with `null`) when Widget.State leaves\n * the success branch or unmounts, so loading / error / empty states\n * correctly report \"no capture target\" via `getCaptureEl`.\n *\n * Composition convention: render interactive controls that should *not*\n * appear in the PNG (e.g. `<Widget.Searcher />`) as siblings of\n * `<Widget.State>` rather than children, so they sit outside this box.\n */\nfunction CaptureBox({ id, children }: { id: string; children: ReactNode }) {\n const setRef = useCallback(\n (el: HTMLDivElement | null) => setCaptureEl(id, el),\n [id],\n )\n return (\n <Box ref={setRef} sx={styles.captureBox}>\n {children}\n </Box>\n )\n}\n\nfunction ErrorView({ error, labels }: { error: Error; labels: StateLabels }) {\n return (\n <Alert severity='error'>\n <AlertTitle>{labels.errorTitle}</AlertTitle>\n {labels.errorMessage(error)}\n </Alert>\n )\n}\n\nfunction EmptyView({ labels }: { labels: StateLabels }) {\n return (\n <Box sx={styles.emptyRoot}>\n <Typography variant='body2' color='text.primary'>\n {labels.emptyTitle}\n </Typography>\n <Typography variant='caption' color='text.secondary'>\n {labels.emptyDescription}\n </Typography>\n </Box>\n )\n}\n\ninterface BoundaryProps {\n fallback?: (error: Error) => ReactNode\n labels: StateLabels\n children: ReactNode\n}\n\ninterface BoundaryState {\n error: Error | null\n}\n\nclass RenderErrorBoundary extends Component<BoundaryProps, BoundaryState> {\n override state: BoundaryState = { error: null }\n\n static getDerivedStateFromError(error: Error): BoundaryState {\n return { error }\n }\n\n override componentDidCatch(error: Error): void {\n // eslint-disable-next-line no-console\n console.error('[widgets-v2] Render error in <Widget.State> child:', error)\n }\n\n override render(): ReactNode {\n const { error } = this.state\n if (error !== null) {\n const { fallback, labels } = this.props\n return fallback ? (\n fallback(error)\n ) : (\n <ErrorView error={error} labels={labels} />\n )\n }\n return this.props.children\n }\n}\n\nfunction defaultIsEmpty(rawData: unknown): boolean {\n if (rawData == null) return true\n if (Array.isArray(rawData)) {\n if (rawData.length === 0) return true\n if (rawData.every((item) => Array.isArray(item) && item.length === 0)) {\n return true\n }\n return false\n }\n if (typeof rawData === 'object' && Object.keys(rawData).length === 0) {\n return true\n }\n return false\n}\n\nfunction toError(value: unknown): Error {\n if (value instanceof Error) return value\n if (typeof value === 'string') return new Error(value)\n if (value && typeof value === 'object' && 'message' in value) {\n return new Error(String((value as { message: unknown }).message))\n }\n return new Error('Unknown error')\n}\n","import type { ReactNode } from 'react'\n\nexport interface SelectionSummaryLabels {\n /**\n * Optional custom renderer for the count. Defaults to the built-in two-tone\n * `selected / total` rendering. Receives the already-resolved displayed\n * number (which equals `total` when nothing is selected).\n */\n summary?: (selected: number, total: number) => ReactNode\n clear: string\n}\n\nexport const DEFAULT_SELECTION_SUMMARY_LABELS: SelectionSummaryLabels = {\n clear: 'Clear',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n minHeight: 24,\n },\n label: {\n color: 'text.secondary',\n },\n count: {\n display: 'inline-flex',\n alignItems: 'baseline',\n gap: 0.5,\n },\n selected: {\n color: 'text.primary',\n fontWeight: 600,\n },\n separator: {\n color: 'text.secondary',\n },\n total: {\n color: 'text.secondary',\n },\n clear: {\n color: 'primary.main',\n cursor: 'pointer',\n fontWeight: 500,\n '&:hover': { textDecoration: 'underline' },\n },\n icon: {\n fontSize: 16,\n color: 'text.secondary',\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { Box, Button, Typography, type SvgIconProps } from '@mui/material'\nimport type { ComponentType } from 'react'\nimport {\n DEFAULT_SELECTION_SUMMARY_LABELS,\n type SelectionSummaryLabels,\n} from './labels'\nimport { styles } from './style'\n\nexport interface SelectionSummaryProps {\n /** Number of currently selected items. */\n count: number\n /** Optional total — when `undefined` or `0` the component renders nothing (no data). */\n total?: number\n /** Clear callback. The Clear control is shown only when `count > 0` and `onClear` is provided. */\n onClear?: () => void\n labels?: Partial<SelectionSummaryLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\n/**\n * Renders a `selected / total` count.\n *\n * Render rules:\n * - `!total` (undefined or 0) → render nothing (no data to summarize).\n * - `count === 0` → display `total / total` (everything is implicitly in\n * scope); no Clear button.\n * - `count > 0` → display `count / total` + Clear (when `onClear` is given).\n *\n * The count is two-tone by default (selected number bold/`text.primary`,\n * ` / total` in `text.secondary`). Pass `labels.summary` to render a custom\n * node instead — it receives the already-resolved displayed number (which\n * equals `total` when nothing is selected).\n */\nexport function SelectionSummary({\n count,\n total,\n onClear,\n labels,\n icon: Icon,\n iconProps,\n}: SelectionSummaryProps) {\n if (!total) return null\n const _labels = { ...DEFAULT_SELECTION_SUMMARY_LABELS, ...labels }\n const shown = count === 0 ? total : count\n\n return (\n <Box sx={styles.root}>\n {Icon ? <Icon fontSize='small' {...iconProps} /> : null}\n <Box\n component='span'\n sx={styles.count}\n aria-label={`${shown} / ${total}`}\n >\n {_labels.summary ? (\n _labels.summary(shown, total)\n ) : (\n <>\n <Typography component='span' variant='caption' sx={styles.selected}>\n {shown}\n </Typography>\n <Typography\n component='span'\n variant='caption'\n sx={styles.separator}\n >\n /\n </Typography>\n <Typography component='span' variant='caption' sx={styles.total}>\n {total}\n </Typography>\n </>\n )}\n </Box>\n {count > 0 && onClear && (\n <Button size='small' variant='text' onClick={onClear}>\n {_labels.clear}\n </Button>\n )}\n </Box>\n )\n}\n","export interface ToolboxLabels {\n trigger: string\n close: string\n}\n\nexport const DEFAULT_TOOLBOX_LABELS: ToolboxLabels = {\n trigger: 'More actions',\n close: 'Close',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.25,\n width: 'fit-content',\n borderRadius: 0.5,\n gridColumn: 2,\n height: 'fit-content',\n },\n preview: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.25,\n },\n triggerActive: {\n bgcolor: 'primary.relatedLight',\n },\n paper: {\n // Positioning is handled by Popper; only visual styles here.\n display: 'flex',\n alignItems: 'center',\n gap: 0.25,\n px: 0.25,\n py: 0.25,\n mx: 0.25,\n mt: `0 !important`, // Popper's placement adds a margin-top to offset from the trigger; we want to override that.\n bgcolor: 'background.paper',\n borderRadius: 0.5,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n Children,\n isValidElement,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n type ComponentType,\n type ReactElement,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n Box,\n Divider,\n Grow,\n IconButton,\n Paper,\n Popper,\n type SvgIconProps,\n type SxProps,\n type Theme,\n} from '@mui/material'\nimport { Close as CloseIcon } from '@mui/icons-material'\nimport { WidgetOptions } from '@carto/meridian-ds/custom-icons'\nimport { Tooltip } from '../../components'\nimport { DEFAULT_TOOLBOX_LABELS, type ToolboxLabels } from './labels'\nimport { styles } from './style'\n\nexport interface ToolboxProps {\n /**\n * Maximum number of (non-`data-toolbar-hidden`) children rendered inline\n * when collapsed. Excess children are revealed via the overflow trigger\n * inside a floating Paper. When omitted, all children render inline.\n */\n visibleCount?: number\n labels?: Partial<ToolboxLabels>\n /**\n * Glyph used for the closed-state trigger. Defaults to the meridian-ds\n * `WidgetOptions` icon (matches v1's `ToolbarActions`).\n */\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Side the overflow Paper opens toward. `'right'` (default) places the\n * trigger on the left and the Paper covers the row to the right;\n * `'left'` is the mirror.\n */\n direction?: 'left' | 'right'\n sx?: SxProps<Theme>\n children: ReactNode\n}\n\n/**\n * Smart overflow toolbar with **single-mount** items. Children mount once\n * into a stable, hidden host element and are *physically reparented* via\n * `appendChild` between the inline preview area and the overflow `<Paper>`\n * as the popper opens / closes — same pattern as `Widget.FullScreen.Slot`.\n * Items with no inline space when closed are kept mounted but visually\n * hidden via `display: none`.\n *\n * Why this matters: every toggle's `useTransform` registers a config /\n * data transform on mount and removes it on unmount. If items remounted\n * on each open / close, the brief setup → cleanup window would re-emit\n * the pipeline (transform missing → transform present), causing a visible\n * flicker on state-bearing transforms (Stack, Zoom, RelativeData). With\n * stable mounts the transform stays registered across the whole popover\n * lifecycle.\n *\n * Children flagged with `data-toolbar-hidden` (e.g. dividers) skip the\n * visibility budget but still render in their natural position. Trailing\n * hidden items past the budget are excluded from the inline preview so\n * they don't appear as orphan separators in the inline row; they're still\n * there in the popover.\n */\nexport function Toolbox({\n visibleCount,\n labels,\n icon: Icon = WidgetOptions,\n iconProps,\n direction = 'right',\n sx,\n children,\n}: ToolboxProps) {\n const _labels = { ...DEFAULT_TOOLBOX_LABELS, ...labels }\n // Each useState below is independent UI state — not \"related state\" that\n // `useReducer` would clean up. Justifications:\n // - `open`: toggles the overflow popover, drives JSX rendering.\n // - `anchorEl`: feeds `<Popper anchorEl>`; the Popper must re-render\n // when the trigger element first attaches.\n // - `inlineEl` / `paperEl`: read by the layout-effect dep array below\n // to reparent the stable host between shells; useRef wouldn't fire\n // the effect when the elements attach.\n // - `host` (further down): see its own comment — kept in state to make\n // the React Compiler happy reading it during render.\n const [open, setOpen] = useState(false)\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null)\n const [inlineEl, setInlineEl] = useState<HTMLElement | null>(null)\n const [paperEl, setPaperEl] = useState<HTMLElement | null>(null)\n\n const handleToggle = useCallback(() => setOpen((v) => !v), [])\n const handleTriggerRef = useCallback((node: HTMLButtonElement | null) => {\n setAnchorEl(node)\n }, [])\n\n // Esc closes the overflow paper. Outside-click is intentionally NOT wired:\n // an action inside the Paper (e.g. RelativeData toggling, a Brush menu)\n // can update widget state which momentarily reflows the page; if that's\n // treated as a click-outside, the Paper would dismiss itself mid-action.\n // Users explicitly close via the trigger or Escape.\n useEffect(() => {\n if (!open) return undefined\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setOpen(false)\n }\n document.addEventListener('keydown', onKey)\n return () => document.removeEventListener('keydown', onKey)\n }, [open])\n\n // Stable host element shared by every toolbox cycle. `display: contents`\n // keeps it transparent in flow so items inherit layout (flex row + gap)\n // from whichever shell currently parents the host (the inline preview\n // Box or the popover Paper). Held in state — not a ref — so the React\n // Compiler is happy reading it during render.\n const [host] = useState<HTMLDivElement | null>(() => {\n if (typeof document === 'undefined') return null\n const div = document.createElement('div')\n div.style.display = 'contents'\n return div\n })\n\n const items = Children.toArray(children).filter((c): c is ReactElement =>\n isValidElement(c),\n )\n\n const visibleCountActual = items.reduce(\n (n, c) => n + (isToolbarHidden(c) ? 0 : 1),\n 0,\n )\n const showOverflow =\n visibleCount !== undefined && visibleCountActual > visibleCount\n\n // Indices that are visible inline when the popper is closed. When the\n // popper is open, every item is visible (in the popover). `null` means\n // \"no overflow — all items visible inline\".\n const inlineVisibleIndices = useMemo<Set<number> | null>(() => {\n if (!showOverflow || visibleCount === undefined) return null\n return computeInlineVisibleIndices(items, visibleCount)\n }, [items, visibleCount, showOverflow])\n\n // Auto-close the popper when overflow disappears (e.g. `visibleCount`\n // flips from a number to `undefined` because the consumer entered\n // fullscreen and wants every action visible inline). Without this the\n // popper component unmounts under us, `paperEl` goes null, and the host\n // would be stranded in a detached node — the toolbox visibly disappears.\n //\n // Uses React's documented \"store information from previous renders\"\n // pattern: a guarded inline `setOpen(false)` during render. The guard\n // fires at most once per transition (`open` flips false the same render\n // and the next render's predicate is false). React rebases the in-flight\n // render before commit, so the layout effect below sees `open=false`\n // immediately. See\n // https://react.dev/reference/react/useState#storing-information-from-previous-renders\n if (!showOverflow && open) {\n setOpen(false)\n }\n\n // Reparent the host into the active shell whenever `open` (or either\n // shell) changes. `useLayoutEffect` runs synchronously after commit\n // (after refs have been written), so the popover Paper ref is already\n // live when we read it. Falling back to `inlineEl` whenever `paperEl`\n // is missing handles cases where the popper has unmounted (showOverflow\n // flipped false) — the host always has a valid destination.\n useLayoutEffect(() => {\n const target = open && paperEl ? paperEl : inlineEl\n if (host && target && host.parentNode !== target) {\n target.appendChild(host)\n }\n }, [open, inlineEl, paperEl, host])\n\n if (items.length === 0) return null\n\n const tooltipLabel = open ? _labels.close : _labels.trigger\n const flexDirection = direction === 'left' ? 'row-reverse' : 'row'\n\n return (\n <Box sx={{ ...styles.root, flexDirection, ...sx }}>\n {showOverflow && (\n <>\n <Tooltip title={tooltipLabel}>\n <IconButton\n ref={handleTriggerRef}\n size='small'\n aria-label={tooltipLabel}\n aria-pressed={open}\n onClick={handleToggle}\n className={open ? 'active' : undefined}\n sx={{ ...(open && styles.triggerActive) }}\n >\n {open ? (\n <CloseIcon fontSize='small' />\n ) : (\n <Icon fontSize='small' {...iconProps} />\n )}\n </IconButton>\n </Tooltip>\n <Divider orientation='vertical' flexItem sx={{ mx: 0.5 }} />\n </>\n )}\n\n {/* Inline shell: when closed (or when there's no overflow) the host\n lives here so first-N items appear inline beside the trigger. */}\n <Box ref={setInlineEl} sx={styles.preview} />\n\n {showOverflow && (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement={direction === 'left' ? 'left' : 'right'}\n transition\n // Disable flipping so the Paper stays on the configured side\n // even when the trigger sits near a viewport edge — wrapper\n // consumers expect a stable layout.\n modifiers={[{ name: 'flip', enabled: false }]}\n // Slot the popper *above* most modal stacking, but below MUI's\n // own modal layer.\n sx={{ zIndex: 'tooltip', mt: 0 }}\n >\n {({ TransitionProps }) => (\n <Grow\n {...TransitionProps}\n style={{\n transformOrigin:\n direction === 'left' ? 'right center' : 'left center',\n }}\n >\n <Paper ref={setPaperEl} sx={styles.paper} />\n </Grow>\n )}\n </Popper>\n )}\n\n {/* Items render once into the stable host. The host's parent is\n whichever shell is currently active (inline or popper). When\n closed-with-overflow, items beyond the budget get `display: none`\n so they're mounted but invisible. The wrapper uses an inline\n `style` (not `sx`) so the visibility decision lands on the\n element itself — tests can inspect it without traversing\n generated MUI class names. */}\n {host\n ? createPortal(\n items.map((item, i) => {\n const visible =\n open || !inlineVisibleIndices || inlineVisibleIndices.has(i)\n const key = item.key ?? i\n return (\n <div\n key={key}\n data-toolbox-item-visible={visible ? 'true' : 'false'}\n style={{ display: visible ? 'contents' : 'none' }}\n >\n {item}\n </div>\n )\n }),\n host,\n )\n : null}\n </Box>\n )\n}\n\nfunction isToolbarHidden(child: ReactElement): boolean {\n // Opt-in flag callers set on slot children (e.g. dividers between groups)\n // so they don't count toward the inline visibility budget.\n const props = (\n child as unknown as { props: { 'data-toolbar-hidden'?: unknown } }\n ).props\n return props['data-toolbar-hidden'] === true\n}\n\n/**\n * Compute the set of item indices visible inline when the popper is closed.\n * Walk the items in order, accept each one until the visible budget is\n * exhausted; hidden items (dividers, etc.) accept without bumping the\n * counter. Strip trailing hidden items from the visible set so the inline\n * row doesn't end with an orphan separator.\n */\nfunction computeInlineVisibleIndices(\n items: readonly ReactElement[],\n visibleCount: number,\n): Set<number> {\n const indices: number[] = []\n let count = 0\n for (let i = 0; i < items.length; i++) {\n if (count >= visibleCount) break\n indices.push(i)\n if (!isToolbarHidden(items[i]!)) count++\n }\n // Strip trailing hidden items.\n while (\n indices.length > 0 &&\n isToolbarHidden(items[indices[indices.length - 1]!]!)\n ) {\n indices.pop()\n }\n return new Set(indices)\n}\n","export interface NoteLabels {\n showMore: string\n showLess: string\n}\n\nexport const DEFAULT_NOTE_LABELS: NoteLabels = {\n showMore: 'Show more',\n showLess: 'Show less',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n display: 'flex',\n flexDirection: 'column',\n gap: 0.5,\n },\n text: {\n color: 'text.secondary',\n overflow: 'hidden',\n overflowWrap: 'anywhere',\n },\n clamped: {\n display: '-webkit-box',\n WebkitBoxOrient: 'vertical',\n WebkitLineClamp: 3,\n },\n toggle: {\n alignSelf: 'flex-start',\n color: 'primary.main',\n fontWeight: 500,\n cursor: 'pointer',\n '&:hover': { textDecoration: 'underline' },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { Box, Link, Typography } from '@mui/material'\nimport type { Components } from 'react-markdown'\nimport { MarkdownContent } from '../markdown/markdown-content'\nimport { observeResize } from '../echart/shared-resize-observer'\nimport { DEFAULT_NOTE_LABELS, type NoteLabels } from './labels'\nimport { styles } from './style'\n\nexport interface NoteProps {\n /**\n * Maximum visible lines before clamping. Defaults to 3. Set to `0` to\n * disable clamping entirely — full content renders and the Show More/Less\n * toggle is never shown.\n */\n lineClamp?: number\n labels?: Partial<NoteLabels>\n /**\n * Renders verbatim inside the caption shell. For markdown source (a\n * string with `**bold**`, lists, links, etc.) reach for the\n * `<Note.Markdown>` subcomponent instead — it pipes the string through\n * the shared {@link MarkdownContent} engine with caption-safe element\n * mapping.\n */\n children: ReactNode\n}\n\nexport interface NoteMarkdownProps {\n /** Markdown source. Rendered with caption typography via {@link MarkdownContent}. */\n content: string\n /** Maximum visible lines before clamping. Defaults to 3. */\n lineClamp?: number\n labels?: Partial<NoteLabels>\n}\n\n/** Block element used for every Markdown paragraph and demoted heading so\n * Notes share a single caption look and never inject heading levels into\n * the document outline. */\nfunction CaptionBlock({ children }: { children?: ReactNode }) {\n return (\n <Typography variant='caption' component='p' color='inherit' sx={{ m: 0 }}>\n {children}\n </Typography>\n )\n}\n\nconst NOTE_COMPONENTS: Components = {\n // Headings demoted to caption typography — a Note can't introduce a\n // heading into the page outline.\n h1: CaptionBlock,\n h2: CaptionBlock,\n h3: CaptionBlock,\n h4: CaptionBlock,\n h5: CaptionBlock,\n h6: CaptionBlock,\n p: CaptionBlock,\n // External-safe link defaults; inherit colour from the muted caption.\n a: ({ children, href }) => (\n <Link\n href={href}\n target='_blank'\n rel='noopener noreferrer'\n color='inherit'\n underline='always'\n >\n {children}\n </Link>\n ),\n}\n\n/**\n * Auxiliary slot for an optional explanatory note below a widget. Clamps to\n * `lineClamp` lines (default 3) and reveals a Show More/Less toggle when the\n * content overflows. Overflow detection re-runs on container resize via the\n * shared singleton ResizeObserver.\n *\n * Renders `children` verbatim through caption typography. For markdown\n * source, use the {@link NoteMarkdown} (`Note.Markdown`) subcomponent.\n */\nfunction NoteBase({ lineClamp = 3, labels, children }: NoteProps) {\n return (\n <NoteShell lineClamp={lineClamp} labels={labels} dependency={children}>\n <Typography variant='caption' component='div' color='inherit'>\n {children}\n </Typography>\n </NoteShell>\n )\n}\n\n/**\n * Markdown variant of {@link Note}. Pipes the `content` string through the\n * shared {@link MarkdownContent} engine with caption-safe element mapping\n * (headings demoted, links open in new tabs, images/HTML stripped).\n */\nfunction NoteMarkdown({ content, lineClamp = 3, labels }: NoteMarkdownProps) {\n return (\n <NoteShell lineClamp={lineClamp} labels={labels} dependency={content}>\n <MarkdownContent content={content} components={NOTE_COMPONENTS} />\n </NoteShell>\n )\n}\n\n// Public namespace export. Consumers reach the markdown variant via\n// `<Widget.Note.Markdown>{content}</Widget.Note.Markdown>`.\nexport const Note = Object.assign(NoteBase, { Markdown: NoteMarkdown })\n\ninterface NoteShellProps {\n lineClamp: number\n labels: Partial<NoteLabels> | undefined\n /** Used to re-measure overflow when the underlying content changes. */\n dependency: unknown\n children: ReactNode\n}\n\n/**\n * Shared shell: caption box + clamping + Show More/Less toggle. Both the\n * verbatim `Note` and the markdown `Note.Markdown` reach for this so the\n * overflow + measurement behaviour stays identical across variants.\n */\nfunction NoteShell({\n lineClamp,\n labels,\n dependency,\n children,\n}: NoteShellProps) {\n const _labels = { ...DEFAULT_NOTE_LABELS, ...labels }\n const textRef = useRef<HTMLDivElement | null>(null)\n const [isOverflowing, setIsOverflowing] = useState(false)\n const [expanded, setExpanded] = useState(false)\n const clampingDisabled = lineClamp <= 0\n\n const measure = useCallback(() => {\n const node = textRef.current\n if (!node) return\n setIsOverflowing(node.scrollHeight > node.clientHeight + 1)\n }, [])\n\n useEffect(() => {\n if (clampingDisabled) return undefined\n const node = textRef.current\n if (!node) return undefined\n measure()\n return observeResize(node, measure)\n }, [measure, dependency, clampingDisabled])\n\n const toggle = useCallback(() => setExpanded((v) => !v), [])\n const clamped = !expanded && !clampingDisabled\n const lineClampSx = clamped\n ? { ...styles.clamped, WebkitLineClamp: lineClamp }\n : null\n\n return (\n <Box sx={styles.root}>\n <Box ref={textRef} sx={{ ...styles.text, ...(lineClampSx ?? {}) }}>\n {children}\n </Box>\n {/* Stay visible while the user is in the expanded state so they always\n have a way back. Without `|| expanded` the toggle would vanish the\n moment content unclamps (scrollHeight === clientHeight). Matches v1. */}\n {!clampingDisabled && (isOverflowing || expanded) && (\n <Link\n component='button'\n variant='caption'\n underline='none'\n onClick={toggle}\n sx={styles.toggle}\n >\n {expanded ? _labels.showLess : _labels.showMore}\n </Link>\n )}\n </Box>\n )\n}\n","// ─── Internal imports (used to assemble the curated `Widget` const) ─────────\nimport { Provider } from './provider/widget-provider'\nimport {\n Wrapper,\n Actions,\n Options,\n Content,\n Footer,\n DEFAULT_WRAPPER_LABELS,\n} from './wrapper'\nimport { Subheader } from './subheader/subheader'\nimport { State } from './state/widget-state'\nimport { DEFAULT_STATE_LABELS } from './state/labels'\nimport { SelectionSummary } from './selection-summary/selection-summary'\nimport { DEFAULT_SELECTION_SUMMARY_LABELS } from './selection-summary/labels'\nimport { Toolbox } from './toolbox/toolbox'\nimport { DEFAULT_TOOLBOX_LABELS } from './toolbox/labels'\nimport { Echart, EchartUI, DEFAULT_INIT_OPTS } from './echart'\nimport { Note } from './note/widget-note'\nimport { DEFAULT_NOTE_LABELS } from './note/labels'\nimport {\n Searcher,\n SearcherToggle,\n StackToggle,\n ShowAllToggle,\n ZoomToggle,\n BrushToggle,\n RelativeData,\n Download,\n FullScreen,\n LockSelection,\n ChangeColumn,\n} from './actions'\nimport { Formula, FormulaUI } from './formula'\nimport { Markdown, MarkdownUI } from './markdown'\nimport { Spread, SpreadUI } from './spread'\nimport { Range, RangeUI } from './range'\nimport { Category, CategoryUI } from './category'\nimport { Table, TableUI } from './table'\n\n/**\n * Curated namespace export — the only way to reach v2 widget components.\n * Consumers import the const and access components via property access:\n *\n * ```tsx\n * import { Widget } from '@carto/ps-react-ui/widgets-v2'\n *\n * <Widget.Provider id={id} data={data}>\n * <Widget.Wrapper title='Sales'>\n * <Widget.Content>\n * <Widget.State skeleton={<BarSkeleton />}>\n * <Widget.Echart optionFactory={optionFactory} />\n * </Widget.State>\n * </Widget.Content>\n * </Widget.Wrapper>\n * </Widget.Provider>\n * ```\n *\n * Component identifiers are not surfaced as separate named exports — Types\n * (props, data shapes, label types, default-label consts) and per-widget\n * subpath entries (`@carto/ps-react-ui/widgets-v2/bar`, `…/category`,\n * `…/table`, `…/actions`, `…/stores`, `…/utils`, etc.) remain available for\n * direct import where needed.\n */\nexport const Widget = {\n // Composition shell\n Provider,\n Wrapper,\n Actions,\n Options,\n Content,\n Footer,\n Subheader,\n State,\n SelectionSummary,\n Toolbox,\n Note,\n\n // ECharts bridge\n Echart,\n EchartUI,\n\n // Actions\n Searcher,\n SearcherToggle,\n StackToggle,\n ShowAllToggle,\n ZoomToggle,\n BrushToggle,\n RelativeData,\n Download,\n FullScreen,\n LockSelection,\n ChangeColumn,\n\n // Widget primitives (renderer bridges + pure UI). Pre-composed widget\n // modules (Bar, FormulaWidget, TableWidget, etc.) are application-level\n // compositions of these primitives and live outside the library —\n // see `apps/storybook/stories/modules/widgets/` for canonical examples.\n Formula,\n FormulaUI,\n Markdown,\n MarkdownUI,\n Spread,\n SpreadUI,\n Range,\n RangeUI,\n Category,\n CategoryUI,\n Table,\n TableUI,\n} as const\n\n// ─── Default-label consts ──────────────────────────────────────────────────\n// Exported separately so consumers can build customized label sets via spread.\nexport {\n DEFAULT_WRAPPER_LABELS,\n DEFAULT_STATE_LABELS,\n DEFAULT_SELECTION_SUMMARY_LABELS,\n DEFAULT_TOOLBOX_LABELS,\n DEFAULT_NOTE_LABELS,\n DEFAULT_INIT_OPTS,\n}\n\n// ─── Types ─────────────────────────────────────────────────────────────────\n// Types are erased at runtime so they can't live on the `Widget` const.\n// They are re-exported here for direct import by consumers.\n\nexport type { ProviderProps } from './provider/widget-provider'\nexport type {\n WrapperProps,\n ActionsProps,\n OptionsProps,\n ContentProps,\n FooterProps,\n WrapperLabels,\n} from './wrapper'\nexport type { SubheaderProps } from './subheader/subheader'\nexport type { StateProps } from './state/widget-state'\nexport type { StateLabels } from './state/labels'\nexport type { SelectionSummaryProps } from './selection-summary/selection-summary'\nexport type { SelectionSummaryLabels } from './selection-summary/labels'\nexport type { ToolboxProps } from './toolbox/toolbox'\nexport type { ToolboxLabels } from './toolbox/labels'\nexport type { EchartProps, EchartUIProps, EchartsEventHandler } from './echart'\nexport type { NoteProps, NoteMarkdownProps } from './note/widget-note'\nexport type { NoteLabels } from './note/labels'\n\n// Action types\nexport type {\n SearcherProps,\n SearcherToggleProps,\n StackToggleProps,\n ShowAllToggleProps,\n ZoomToggleProps,\n BrushToggleProps,\n RelativeDataProps,\n DownloadProps,\n DownloadItem,\n FullScreenTriggerProps,\n FullScreenSlotProps,\n LockSelectionProps,\n LockSelectionKey,\n ChangeColumnProps,\n ChangeColumnItem,\n} from './actions'\n\n// Widget primitive types\nexport type {\n FormulaUIProps,\n FormulaDataItem,\n FormulaWidgetData,\n} from './formula'\nexport type { MarkdownUIProps, MarkdownWidgetData } from './markdown'\nexport type { PieDatum, PieWidgetData } from './pie'\nexport type { TimeseriesDatum, TimeseriesWidgetData } from './timeseries'\nexport type { ScatterplotDatum, ScatterplotWidgetData } from './scatterplot'\nexport type { SpreadUIProps, SpreadDataItem, SpreadWidgetData } from './spread'\nexport type {\n RangeProps,\n RangeUIProps,\n RangeDataItem,\n RangeWidgetData,\n RangeItemValue,\n} from './range'\nexport type {\n CategoryProps,\n CategoryUIProps,\n CategoryDataItem,\n CategoryWidgetData,\n CategoryKey,\n CategorySeriesConfig,\n CategoryLabels,\n} from './category'\nexport type {\n TableProps,\n TableUIProps,\n TableColumn,\n TableRow,\n TableWidgetData,\n TableWidgetState,\n TableSortDirection,\n TableSortState,\n} from './table'\n\n// Canonical cross-widget series shape — see `widgets-v2/types.ts`.\nexport type { WidgetSeries } from './types'\n"],"names":["Provider","t0","$","_c","id","data","isLoading","isFetching","error","formatter","labelFormatter","keepAlive","t1","children","undefined","t2","hasWidgetStore","getWidgetStore","created","createWidgetStore","setWidgetStoreEntry","store","useState","t3","t4","registerWidgetStore","unregisterWidgetStore","useLayoutEffect","t5","t6","setState","rawData","t7","t8","t10","t9","rawFormatter","t11","WidgetContext","styles","root","position","width","minWidth","bgcolor","borderRadius","overflow","boxShadow","display","opacity","transition","transitions","create","duration","standard","easing","easeInOut","pointerEvents","loading","top","left","height","spacing","zIndex","summary","minHeight","gap","paddingInlineEnd","alignItems","summaryDisabled","cursor","titleCell","flexGrow","flexShrink","titleText","wordBreak","WebkitLineClamp","WebkitBoxOrient","actions","justifyContent","options","detail","flexDirection","paddingTop","content","footer","pt","Actions","sx","jsx","Box","_temp","e","stopPropagation","Options","_temp2","DEFAULT_WRAPPER_LABELS","collapse","expand","errorFallbackTitle","Wrapper","title","collapsed","onCollapseChange","defaultCollapsed","disabled","variant","labels","expandIcon","iconProps","ExpandIcon","ExpandMoreIcon","useWidgetId","useWidget","isControlled","internalCollapsed","setInternalCollapsed","effectiveCollapsed","_","expanded","next","handleAccordionToggle","_labels","partitionChildren","summarySlots","details","detailsSlots","ariaLabel","LinearProgress","t12","t13","t14","t15","t16","t17","ref","Typography","SmartTooltip","t18","jsxs","AccordionSummary","t19","AccordionDetails","t20","Accordion","s","child","Children","toArray","isSlot","push","node","type","isValidElement","Content","Footer","gridTemplateColumns","pb","Subheader","emptyRoot","paddingBottom","paddingX","captureBox","flex","DEFAULT_STATE_LABELS","errorTitle","errorMessage","Error","message","String","emptyTitle","emptyDescription","sliceSelector","State","skeleton","isEmpty","fallback","defaultIsEmpty","slice","useWidgetShallow","err","toError","Fragment","ErrorView","EmptyView","CaptureBox","RenderErrorBoundary","el","setCaptureEl","setRef","AlertTitle","Alert","Component","state","getDerivedStateFromError","componentDidCatch","console","render","props","Array","isArray","length","every","item","Object","keys","value","DEFAULT_SELECTION_SUMMARY_LABELS","clear","count","selected","color","fontWeight","separator","total","SelectionSummary","onClear","icon","Icon","T0","T1","shown","Button","DEFAULT_TOOLBOX_LABELS","trigger","close","gridColumn","preview","triggerActive","paper","px","py","mx","mt","Toolbox","visibleCount","direction","WidgetOptions","open","setOpen","anchorEl","setAnchorEl","inlineEl","setInlineEl","paperEl","setPaperEl","Symbol","for","handleToggle","handleTriggerRef","onKey","key","document","addEventListener","removeEventListener","useEffect","host","items","filter","_temp3","reduce","_temp4","showOverflow","bb0","computeInlineVisibleIndices","inlineVisibleIndices","target","parentNode","appendChild","tooltipLabel","Tooltip","IconButton","CloseIcon","Divider","Popper","name","enabled","TransitionProps","Grow","transformOrigin","Paper","createPortal","map","i","visible","has","n","c_0","isToolbarHidden","c","div","createElement","style","v","indices","pop","Set","DEFAULT_NOTE_LABELS","showMore","showLess","text","overflowWrap","clamped","toggle","alignSelf","textDecoration","CaptionBlock","m","NOTE_COMPONENTS","h1","h2","h3","h4","h5","h6","p","a","href","Link","NoteBase","lineClamp","NoteShell","NoteMarkdown","MarkdownContent","Note","assign","Markdown","dependency","textRef","useRef","isOverflowing","setIsOverflowing","setExpanded","clampingDisabled","current","scrollHeight","clientHeight","measure","node_0","observeResize","lineClampSx","Widget","Echart","EchartUI","Searcher","SearcherToggle","StackToggle","ShowAllToggle","ZoomToggle","BrushToggle","RelativeData","Download","FullScreen","LockSelection","ChangeColumn","Formula","FormulaUI","MarkdownUI","Spread","SpreadUI","Range","RangeUI","Category","CategoryUI","Table","TableUI"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2CO,SAAAA,GAAAC,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAkB;AAAA,IAAAC,IAAAA;AAAAA,IAAAC,MAAAA;AAAAA,IAAAC,WAAAA;AAAAA,IAAAC,YAAAA;AAAAA,IAAAC,OAAAA;AAAAA,IAAAC,WAAAA;AAAAA,IAAAC,gBAAAA;AAAAA,IAAAC,WAAAC;AAAAA,IAAAC,UAAAA;AAAAA,EAAAA,IAAAZ,GAQvBU,IAAAC,MAAAE,SAAA,KAAAF;AAAiB,MAAAG;AAAA,EAAAb,EAAA,CAAA,MAAAG,KAAAH,EAAA,CAAA,MAAAM,KAAAN,EAAA,CAAA,MAAAO,KAAAP,SAAAE,KAAAF,EAAA,CAAA,MAAAK,KAAAL,EAAA,CAAA,MAAAI,KAAAJ,EAAA,CAAA,MAAAQ,KAOwBK,IAAAA,MAAA;AACvC,QAAIC,GAAeZ,CAAE;AAAC,aAASa,GAAeb,CAAE;AAChD,UAAAc,IAAgBC,GAAkBf,GAAI;AAAA,MAAAC,MAAAA;AAAAA,MAAAC,WAAAA;AAAAA,MAAAC,YAAAA;AAAAA,MAAAC,OAAAA;AAAAA,MAAAC,WAAAA;AAAAA,MAAAC,gBAAAA;AAAAA,IAAAA,CAOrC;AACDU,WAAAA,GAAoBhB,GAAIc,CAAO,GACxBA;AAAAA,EAAO,GACfhB,OAAAG,GAAAH,OAAAM,GAAAN,OAAAO,GAAAP,OAAAE,GAAAF,OAAAK,GAAAL,OAAAI,GAAAJ,OAAAQ,GAAAR,OAAAa,KAAAA,IAAAb,EAAA,CAAA;AAZD,QAAA,CAAAmB,CAAA,IAAgBC,EAAyBP,CAYxC;AAAC,MAAAQ,GAAAC;AAAA,EAAAtB,EAAA,CAAA,MAAAE,KAAAF,SAAAS,KAAAT,EAAA,EAAA,MAAAmB,KAIcE,IAAAA,OACdE,GAAoBrB,GAAIiB,CAAK,GACtB,MAAA;AACLK,IAAAA,GAAsBtB,GAAI;AAAA,MAAAO,WAAAA;AAAAA,IAAAA,CAAa;AAAA,EAAC,IAEzCa,KAACpB,GAAIiB,GAAOV,CAAS,GAACT,OAAAE,GAAAF,OAAAS,GAAAT,QAAAmB,GAAAnB,QAAAqB,GAAArB,QAAAsB,MAAAD,IAAArB,EAAA,EAAA,GAAAsB,IAAAtB,EAAA,EAAA,IALzByB,GAAgBJ,GAKbC,CAAsB;AAAC,MAAAI,GAAAC;AAAA,EAAA3B,EAAA,EAAA,MAAAG,KAAAH,UAAAmB,KAMVO,IAAAA,MAAA;AACdP,IAAAA,EAAKS,SAAU;AAAA,MAAAC,SAAW1B;AAAAA,IAAAA,CAAM;AAAA,EAAC,GAChCwB,IAAA,CAACR,GAAOhB,CAAI,GAACH,QAAAG,GAAAH,QAAAmB,GAAAnB,QAAA0B,GAAA1B,QAAA2B,MAAAD,IAAA1B,EAAA,EAAA,GAAA2B,IAAA3B,EAAA,EAAA,IAFhByB,GAAgBC,GAEbC,CAAa;AAAC,MAAAG,GAAAC;AAAA,EAAA/B,EAAA,EAAA,MAAAM,KAAAN,EAAA,EAAA,MAAAK,KAAAL,EAAA,EAAA,MAAAI,KAAAJ,UAAAmB,KAEDW,IAAAA,MAAA;AACdX,IAAAA,EAAKS,SAAU;AAAA,MAAAxB,WACFA,KAAA;AAAA,MAAkBC,YACjBA,KAAA;AAAA,MAAmBC,OAAAA;AAAAA,IAAAA,CAEhC;AAAA,EAAC,GACDyB,IAAA,CAACZ,GAAOf,GAAWC,GAAYC,CAAK,GAACN,QAAAM,GAAAN,QAAAK,GAAAL,QAAAI,GAAAJ,QAAAmB,GAAAnB,QAAA8B,GAAA9B,QAAA+B,MAAAD,IAAA9B,EAAA,EAAA,GAAA+B,IAAA/B,EAAA,EAAA,IANxCyB,GAAgBK,GAMbC,CAAqC;AAAC,MAAAC,GAAAC;AAAA,EAAAjC,EAAA,EAAA,MAAAO,KAAAP,UAAAQ,KAAAR,EAAA,EAAA,MAAAmB,KAMzBc,IAAAA,MAAA;AACdd,IAAAA,EAAKS,SAAU;AAAA,MAAAM,cACC3B;AAAAA,MAASA,WAAAA;AAAAA,MAAAC,gBAAAA;AAAAA,IAAAA,CAGxB;AAAA,EAAC,GACDwB,KAACb,GAAOZ,GAAWC,CAAc,GAACR,QAAAO,GAAAP,QAAAQ,GAAAR,QAAAmB,GAAAnB,QAAAgC,GAAAhC,QAAAiC,MAAAD,IAAAhC,EAAA,EAAA,GAAAiC,IAAAjC,EAAA,EAAA,IANrCyB,GAAgBQ,GAMbD,CAAkC;AAAC,MAAAG;AAAA,SAAAnC,EAAA,EAAA,MAAAW,KAAAX,UAAAE,KAE/BiC,sBAAAC,GAAA,UAAA,EAA+BlC,OAAAA,GAAKS,UAAAA,GAAS,GAAyBX,QAAAW,GAAAX,QAAAE,GAAAF,QAAAmC,KAAAA,IAAAnC,EAAA,EAAA,GAAtEmC;AAAsE;AC3GxE,MAAME,IAAS;AAAA,EACpBC,MAAM;AAAA,IACJC,UAAU;AAAA,IACVC,OAAO;AAAA,IACPC,UAAU;AAAA,IACVC,SAAS;AAAA,IACTC,cAAc;AAAA,IACdC,UAAU;AAAA,IACVC,WAAW;AAAA;AAAA;AAAA,IAGX,aAAa;AAAA,MAAEC,SAAS;AAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaxB,iCAAiC;AAAA,MAC/BC,SAAS;AAAA,MACTC,YAAYA,CAAC;AAAA,QAAEC,aAAAA;AAAAA,MAAAA,MACbA,EAAYC,OAAO,WAAW;AAAA,QAC5BC,UAAUF,EAAYE,SAASC;AAAAA,QAC/BC,QAAQJ,EAAYI,OAAOC;AAAAA,MAAAA,CAC5B;AAAA,MACH,yBAAyB;AAAA,QACvBP,SAAS;AAAA,MAAA;AAAA,MAEX,YAAY;AAAA,QACVA,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,IAEF,uCAAuC;AAAA,MACrCA,SAAS;AAAA,IAAA;AAAA,IAEX,wDAAwD;AAAA,MACtDA,SAAS;AAAA,MACTQ,eAAe;AAAA,MACf,YAAY;AAAA,QACVR,SAAS;AAAA,MAAA;AAAA,IACX;AAAA,EACF;AAAA,EAEFS,SAAS;AAAA,IACPjB,UAAU;AAAA,IACVkB,KAAK;AAAA,IACLC,MAAM;AAAA,IACNlB,OAAO;AAAA,IACPmB,QAAQA,CAAC;AAAA,MAAEC,SAAAA;AAAAA,IAAAA,MAAqBA,EAAQ,IAAI;AAAA,IAC5CC,QAAQ;AAAA,EAAA;AAAA,EAEVC,SAAS;AAAA,IACPC,WAAWA,CAAC;AAAA,MAAEH,SAAAA;AAAAA,IAAAA,MAAqBA,EAAQ,CAAC;AAAA,IAC5C,kCAAkC;AAAA,MAChCI,KAAKA,CAAC;AAAA,QAAEJ,SAAAA;AAAAA,MAAAA,MAAqBA,EAAQ,GAAG;AAAA,MACxCK,kBAAkBA,CAAC;AAAA,QAAEL,SAAAA;AAAAA,MAAAA,MAAqBA,EAAQ,IAAI;AAAA,MACtDM,YAAY;AAAA,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUFC,iBAAiB;AAAA,IACf,iCAAiC;AAAA,MAC/BC,QAAQ;AAAA,IAAA;AAAA,EACV;AAAA,EAEFC,WAAW;AAAA,IACTC,UAAU;AAAA,IACVC,YAAY;AAAA,IACZ9B,UAAU;AAAA,IACVK,SAAS;AAAA,IACToB,YAAY;AAAA,IACZH,WAAWA,CAAC;AAAA,MAAEH,SAAAA;AAAAA,IAAAA,MAAqBA,EAAQ,CAAC;AAAA,EAAA;AAAA,EAE9CY,WAAW;AAAA,IACT/B,UAAU;AAAA,IACVgC,WAAW;AAAA,IACX7B,UAAU;AAAA,IACVE,SAAS;AAAA,IACT4B,iBAAiB;AAAA,IACjBC,iBAAiB;AAAA,EAAA;AAAA,EAEnBC,SAAS;AAAA,IACP9B,SAAS;AAAA,IACToB,YAAY;AAAA,IACZF,KAAK;AAAA,IACLa,gBAAgB;AAAA,IAChBN,YAAY;AAAA,IACZ,SAAS;AAAA,MACPhB,eAAe;AAAA,IAAA;AAAA,EACjB;AAAA,EAEFuB,SAAS;AAAA,IACPhC,SAAS;AAAA,IACToB,YAAY;AAAA,IACZF,KAAK;AAAA,IACLO,YAAY;AAAA,EAAA;AAAA,EAEdQ,QAAQ;AAAA,IACNjC,SAAS;AAAA,IACTkC,eAAe;AAAA,IACfhB,KAAKA,CAAC;AAAA,MAAEJ,SAAAA;AAAAA,IAAAA,MAAqBA,EAAQ,CAAC;AAAA,IACtCqB,YAAYA,CAAC;AAAA,MAAErB,SAAAA;AAAAA,IAAAA,MAAqBA,EAAQ,GAAG;AAAA,EAAA;AAAA,EAEjDsB,SAAS;AAAA,IACPzC,UAAU;AAAA,IACVK,SAAS;AAAA,IACTkC,eAAe;AAAA,IACfhB,KAAK;AAAA,EAAA;AAAA,EAEPmB,QAAQ;AAAA,IACNC,IAAI;AAAA,EAAA;AAER;AC5GO,SAAAC,GAAAtF,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAiB;AAAA,IAAAqF,IAAAA;AAAAA,IAAA3E,UAAAA;AAAAA,EAAAA,IAAAZ;AAA8B,MAAAW;AAAA,EAAAV,SAAAsF,KAK5C5E,IAAA;AAAA,IAAA,GAAK2B,EAAMuC;AAAAA,IAAQ,GAAKU;AAAAA,EAAAA,GAAItF,OAAAsF,GAAAtF,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAa;AAAA,SAAAb,EAAA,CAAA,MAAAW,KAAAX,SAAAU,KAHlCG,IAAA,gBAAA0E,EAACC,KACW,WAAA,0BACD,SAAAC,IACL,IAAA/E,GAEHC,UAAAA,EAAAA,CACH,GAAMX,OAAAW,GAAAX,OAAAU,GAAAV,OAAAa,KAAAA,IAAAb,EAAA,CAAA,GANNa;AAMM;AARH,SAAA4E,GAAAC,GAAA;AAAA,SAIeA,EAACC,gBAAAA;AAAkB;AAalC,SAAAC,GAAA7F,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAiB;AAAA,IAAAqF,IAAAA;AAAAA,IAAA3E,UAAAA;AAAAA,EAAAA,IAAAZ;AAA8B,MAAAW;AAAA,EAAAV,SAAAsF,KAEJ5E,IAAA;AAAA,IAAA,GAAK2B,EAAMyC;AAAAA,IAAQ,GAAKQ;AAAAA,EAAAA,GAAItF,OAAAsF,GAAAtF,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAa;AAAA,SAAAb,EAAA,CAAA,MAAAW,KAAAX,SAAAU,KAA1EG,sBAAC2E,GAAA,EAAa,SAAAK,IAAgC,IAAAnF,gBAE9C,GAAMV,OAAAW,GAAAX,OAAAU,GAAAV,OAAAa,KAAAA,IAAAb,EAAA,CAAA,GAFNa;AAEM;AAJH,SAAAgF,GAAAH,GAAA;AAAA,SAEkBA,EAACC,gBAAAA;AAAkB;AChCrC,MAAMG,KAAwC;AAAA,EACnDC,UAAU;AAAA,EACVC,QAAQ;AAAA,EACRC,oBAAoB;AACtB;ACsEO,SAAAC,GAAAnG,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAiB;AAAA,IAAAkG,OAAAA;AAAAA,IAAAC,WAAAA;AAAAA,IAAAC,kBAAAA;AAAAA,IAAAC,kBAAA5F;AAAAA,IAAA6F,UAAA1F;AAAAA,IAAA2F,SAAAnF;AAAAA,IAAAoF,QAAAA;AAAAA,IAAAC,YAAApF;AAAAA,IAAAqF,WAAAA;AAAAA,IAAArB,IAAAA;AAAAA,IAAA3E,UAAAA;AAAAA,EAAAA,IAAAZ,GAItBuG,IAAA5F,MAAAE,SAAA,KAAAF,GACA6F,IAAA1F,MAAAD,SAAA,KAAAC,GACA2F,IAAAnF,MAAAT,SAAA,cAAAS,GAEYuF,IAAAtF,MAAAV,SAAAiG,KAAAvF,GAKZpB,IAAW4G,GAAAA,GACXzG,IAAmB0G,GAAU7G,GAAIuF,EAAmB,GAMpDuB,IAAqBZ,MAAcxF,QACnC,CAAAqG,GAAAC,CAAA,IAAkD9F,EAASkF,CAAgB,GAC3Ea,IAA2BH,IAAAZ,IAAAa;AAA4C,MAAAvF;AAAA,EAAA1B,EAAA,CAAA,MAAAuG,KAAAvG,SAAAqG,KAErE3E,IAAAA,CAAA0F,GAAAC,MAAA;AACE,QAAId;AAAQ;AACZ,UAAAe,IAAa,CAACD;AACdhB,IAAAA,IAAmBiB,CAAI,GACvBJ,EAAqBI,CAAI;AAAA,EAAC,GAC3BtH,OAAAuG,GAAAvG,OAAAqG,GAAArG,OAAA0B,KAAAA,IAAA1B,EAAA,CAAA;AANH,QAAAuH,IAA8B7F;AAQ7B,MAAAC;AAAA,EAAA3B,SAAAyG,KACe9E,IAAA;AAAA,IAAA,GAAKmE;AAAAA,IAAsB,GAAKW;AAAAA,EAAAA,GAAQzG,OAAAyG,GAAAzG,OAAA2B,KAAAA,IAAA3B,EAAA,CAAA;AAAxD,QAAAwH,IAAgB7F;AAAwC,MAAAG;AAAA,EAAA9B,SAAAW,KAGtDmB,IAAA2F,GAAkB9G,CAAQ,GAACX,OAAAW,GAAAX,OAAA8B,KAAAA,IAAA9B,EAAA,CAAA;AAD7B,QAAA;AAAA,IAAA8D,SAAA4D;AAAAA,IAAAC,SAAAC;AAAAA,EAAAA,IACE9F,GAEF+F,KAAkBV,IAAqBK,EAAOxB,SAAUwB,EAAOzB,UAI3ChE,IAAAoF,IAAA,SAAAvG,QACNqB,KAACkF;AAAkB,MAAAnF;AAAA,EAAAhC,SAAAsF,KAMzBtD,IAAA;AAAA,IAAA,GACCK,EAAMC;AAAAA,IAAK,GACXgD;AAAAA,EAAAA,GACJtF,OAAAsF,GAAAtF,OAAAgC,KAAAA,IAAAhC,EAAA,CAAA;AAAA,MAAAmC;AAAA,EAAAnC,SAAAK,KAEA8B,IAAA9B,sBACEyH,IAAA,EAAmB,IAAAzF,EAAMmB,SAAgB,OAAA,WAAS,IADpD,MAEOxD,OAAAK,GAAAL,QAAAmC,KAAAA,IAAAnC,EAAA,EAAA;AAAA,MAAA+H;AAAA,EAAA/H,EAAA,EAAA,MAAA4G,KAAA5G,UAAAuG,KAAAvG,EAAA,EAAA,MAAA2G,KAIJoB,IAAAxB,IAAA,OAAkB,gBAAAhB,EAACqB,KAAoB,UAAA,SAAO,GAAKD,GAAS,GAAI3G,QAAA4G,GAAA5G,QAAAuG,GAAAvG,QAAA2G,GAAA3G,QAAA+H,KAAAA,IAAA/H,EAAA,EAAA;AAGnD,QAAAgI,IAAAzB,KAAA3F,QACcqH,IAAA1B,IAAWlE,EAAM8B,kBAAjB;AAAwC,MAAA+D;AAAA,EAAAlI,UAAAiI,KAAjEC,IAAA;AAAA,IAAA,GAAK7F,EAAMyB;AAAAA,IAAQ,GAAMmE;AAAAA,EAAAA,GAA2CjI,QAAAiI,GAAAjI,QAAAkI,KAAAA,IAAAlI,EAAA,EAAA;AAAA,MAAAmI;AAAA,EAAAnI,UAAAmG,KAGrEgC,IAAAC,CAAAA,MAAA;AAAC,UAAA;AAAA,MAAAC,KAAAA;AAAAA,IAAAA,IAAAD;AAAO,6BACN5C,GAAA,EAAQ,IAAAnD,EAAMgC,WACb,4BAACiE,GAAA,EACMD,KAAAA,GACG,SAAA,aACJ,IAAAhG,EAAMmC,WACI,eAAA,qBAGhB,GACF;AAAA,EAAM,GACPxE,QAAAmG,GAAAnG,QAAAmI,KAAAA,IAAAnI,EAAA,EAAA;AAAA,MAAAoI;AAAA,EAAApI,EAAA,EAAA,MAAAmI,KAAAnI,UAAAmG,KAZHiC,IAAA,gBAAA7C,EAACgD,IAAA,EAAoBpC,OAAAA,GAClBgC,UAAAA,GAYH,GAAenI,QAAAmI,GAAAnI,QAAAmG,GAAAnG,QAAAoI,KAAAA,IAAApI,EAAA,EAAA;AAAA,MAAAwI;AAAA,EAAAxI,UAAA6H,MAAA7H,EAAA,EAAA,MAAA0H,KAAA1H,EAAA,EAAA,MAAA+H,KAAA/H,EAAA,EAAA,MAAAgI,KAAAhI,UAAAkI,KAAAlI,EAAA,EAAA,MAAAoI,KArBjBI,IAAA,gBAAAC,EAACC,MAEG,YAAAX,GAEUF,cAAAA,IACG,iBAAAG,GACX,IAAAE,GAEJE,UAAAA;AAAAA,IAAAA;AAAAA,IAcCV;AAAAA,EAAAA,GACH,GAAmB1H,QAAA6H,IAAA7H,QAAA0H,GAAA1H,QAAA+H,GAAA/H,QAAAgI,GAAAhI,QAAAkI,GAAAlI,QAAAoI,GAAApI,QAAAwI,KAAAA,IAAAxI,EAAA,EAAA;AAAA,MAAA2I;AAAA,EAAA3I,UAAA4H,KACnBe,IAAA,gBAAApD,EAACqD,IAAA,EAAqB,IAAAvG,EAAM0C,QAAU6C,UAAAA,GAAa,GAAmB5H,QAAA4H,GAAA5H,QAAA2I,KAAAA,IAAA3I,EAAA,EAAA;AAAA,MAAA6I;AAAA,SAAA7I,EAAA,EAAA,MAAAuH,KAAAvH,EAAA,EAAA,MAAAgC,KAAAhC,EAAA,EAAA,MAAAmC,KAAAnC,EAAA,EAAA,MAAAwI,KAAAxI,EAAA,EAAA,MAAA2I,KAAA3I,EAAA,EAAA,MAAA+B,KAAA/B,EAAA,EAAA,MAAAiC,KAAAjC,UAAAwG,KAzCxEqC,sBAACC,IAAA,EACiB,kBAAA/G,GACN,UAAAE,GACAsF,UAAAA,GACV,gBAAA,IACW,WAAA,GACFf,SAAAA,GACT,QAAA,IACI,IAAAxE,GAKHG,UAAAA;AAAAA,IAAAA;AAAAA,IAIDqG;AAAAA,IAwBAG;AAAAA,EAAAA,GACF,GAAY3I,QAAAuH,GAAAvH,QAAAgC,GAAAhC,QAAAmC,GAAAnC,QAAAwI,GAAAxI,QAAA2I,GAAA3I,QAAA+B,GAAA/B,QAAAiC,GAAAjC,QAAAwG,GAAAxG,QAAA6I,KAAAA,IAAA7I,EAAA,EAAA,GA1CZ6I;AA0CY;AAlFT,SAAApD,GAAAsD,GAAA;AAAA,SAcmCA,EAAC1I;AAAW;AA8EtD,SAASoH,GAAkB9G,GAGzB;AACA,QAAMmD,IAAuB,CAAA,GACvB6D,IAAuB,CAAA;AAC7B,aAAWqB,KAASC,GAASC,QAAQvI,CAAQ;AAC3C,IAAIwI,GAAOH,GAAO3D,EAAO,KAAK8D,GAAOH,GAAOpD,EAAO,IACjD9B,EAAQsF,KAAKJ,CAAK,IAElBrB,EAAQyB,KAAKJ,CAAK;AAGtB,SAAO;AAAA,IAAElF,SAAAA;AAAAA,IAAS6D,SAAAA;AAAAA,EAAAA;AACpB;AAEA,SAASwB,GAAOE,GAAiBC,GAAqC;AACpE,SAAOC,GAAeF,CAAI,KAAKA,EAAKC,SAASA;AAC/C;ACrLO,SAAAE,GAAAzJ,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAiB;AAAA,IAAAqF,IAAAA;AAAAA,IAAA3E,UAAAA;AAAAA,EAAAA,IAAAZ;AAA8B,MAAAW;AAAA,EAAAV,SAAAsF,KAErB5E,IAAA;AAAA,IAAA,GAAK2B,EAAM6C;AAAAA,IAAQ,GAAKI;AAAAA,EAAAA,GAAItF,OAAAsF,GAAAtF,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAa;AAAA,SAAAb,EAAA,CAAA,MAAAW,KAAAX,SAAAU,KAAzDG,sBAAC2E,GAAA,EAAc,aAAA,WAAc,IAAA9E,gBAE7B,GAAMV,OAAAW,GAAAX,OAAAU,GAAAV,OAAAa,KAAAA,IAAAb,EAAA,CAAA,GAFNa;AAEM;AASH,SAAA4I,GAAA1J,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAgB;AAAA,IAAAqF,IAAAA;AAAAA,IAAA3E,UAAAA;AAAAA,EAAAA,IAAAZ;AAA6B,MAAAW;AAAA,EAAAV,SAAAsF,KAEpB5E,IAAA;AAAA,IAAA,GAAK2B,EAAM8C;AAAAA,IAAO,GAAKG;AAAAA,EAAAA,GAAItF,OAAAsF,GAAAtF,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAa;AAAA,SAAAb,EAAA,CAAA,MAAAW,KAAAX,SAAAU,KAAvDG,sBAAC2E,GAAA,EAAc,aAAA,UAAa,IAAA9E,gBAE5B,GAAMV,OAAAW,GAAAX,OAAAU,GAAAV,OAAAa,KAAAA,IAAAb,EAAA,CAAA,GAFNa;AAEM;ACxBH,MAAMwB,KAAS;AAAA,EACpBC,MAAM;AAAA,IACJQ,SAAS;AAAA,IACT4G,qBAAqB;AAAA,IACrBxF,YAAY;AAAA,IACZF,KAAK;AAAA,IACLD,WAAW;AAAA,IACX4F,IAAI;AAAA,EAAA;AAER;ACEO,SAAAC,GAAA7J,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAmB;AAAA,IAAAqF,IAAAA;AAAAA,IAAA3E,UAAAA;AAAAA,EAAAA,IAAAZ;AAAgC,MAAAW;AAAA,EAAAV,SAAAsF,KACxC5E,IAAA;AAAA,IAAA,GAAK2B,GAAMC;AAAAA,IAAK,GAAKgD;AAAAA,EAAAA,GAAItF,OAAAsF,GAAAtF,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAa;AAAA,SAAAb,EAAA,CAAA,MAAAW,KAAAX,SAAAU,KAAlCG,IAAA,gBAAA0E,EAACC,GAAA,EAAQ,IAAA9E,GAA4BC,UAAAA,GAAS,GAAMX,OAAAW,GAAAX,OAAAU,GAAAV,OAAAa,KAAAA,IAAAb,EAAA,CAAA,GAApDa;AAAoD;ACZtD,MAAMwB,KAAS;AAAA,EACpBwH,WAAW;AAAA,IACT/G,SAAS;AAAA,IACTkC,eAAe;AAAA,IACfhB,KAAK;AAAA,IACLiB,YAAY;AAAA,IACZ6E,eAAe;AAAA,IACfC,UAAU;AAAA,IACVvH,OAAO;AAAA,IACPuB,WAAW;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMbiG,YAAY;AAAA,IACVxH,OAAO;AAAA,IACPuB,WAAW;AAAA,IACXjB,SAAS;AAAA,IACTkC,eAAe;AAAA,IACfiF,MAAM;AAAA,EAAA;AAEV,GCjBaC,KAAoC;AAAA,EAC/CC,YAAY;AAAA,EACZC,cAAcA,CAAC9J,MACTA,aAAiB+J,QAAc/J,EAAMgK,UACrC,OAAOhK,KAAU,WAAiBA,IAClCA,KAAS,OAAOA,KAAU,YAAY,aAAaA,IAC9CiK,OAAQjK,EAA+BgK,OAAO,IAEhD;AAAA,EAETE,YAAY;AAAA,EACZC,kBAAkB;AACpB,GCIMC,KAAgBA,CAAC3B,OAKJ;AAAA,EACjB3I,WAAW2I,EAAE3I;AAAAA,EACbC,YAAY0I,EAAE1I;AAAAA,EACdC,OAAOyI,EAAEzI;AAAAA,EACTuB,SAASkH,EAAElH;AACb;AASO,SAAA8I,GAAA5K,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAe;AAAA,IAAA2K,UAAAA;AAAAA,IAAAjK,UAAAA;AAAAA,IAAAkK,SAAAnK;AAAAA,IAAAoK,UAAAA;AAAAA,IAAArE,QAAAA;AAAAA,EAAAA,IAAA1G,GAGpB8K,IAAAnK,MAAAE,SAAAmK,KAAArK,GAIAR,IAAW4G,GAAAA,GACXkE,IAAcC,GAAiB/K,GAAIwK,EAAa;AAAC,MAAA7J;AAAA,EAAAb,SAAAyG,KACjC5F,IAAA;AAAA,IAAA,GAAKqJ;AAAAA,IAAoB,GAAKzD;AAAAA,EAAAA,GAAQzG,OAAAyG,GAAAzG,OAAAa,KAAAA,IAAAb,EAAA,CAAA;AAAtD,QAAAwH,IAAgB3G;AAGhB,MAAImK,EAAK5K,WAAU;AAAA,QAAAiB;AAAA,WAAArB,SAAA4K,KAASvJ,4BAAGuJ,UAAAA,EAAAA,CAAQ,GAAI5K,OAAA4K,GAAA5K,OAAAqB,KAAAA,IAAArB,EAAA,CAAA,GAAfqB;AAAAA,EAAe;AAG3C,MAAI2J,EAAK1K,UAAWM,UAAaoK,EAAK1K,UAAW,MAAI;AAAA,QAAAe;AAAA,QAAArB,EAAA,CAAA,MAAAwH,KAAAxH,EAAA,CAAA,MAAA8K,KAAA9K,EAAA,CAAA,MAAAgL,EAAA1K,OAAA;AACnD,YAAA4K,IAAYC,GAAQH,EAAK1K,KAAM;AACxBe,MAAAA,IAAAyJ,IAAA,gBAAAvF,EAAA6F,IAAA,EACFN,UAAAA,EAASI,CAAG,EAAA,CAAC,IAEhB,gBAAA3F,EAAC8F,IAAA,EAAiBH,OAAAA,GAAa1D,QAAAA,GAAO,GACvCxH,OAAAwH,GAAAxH,OAAA8K,GAAA9K,EAAA,CAAA,IAAAgL,EAAA1K,OAAAN,OAAAqB;AAAAA,IAAA;AAAAA,MAAAA,IAAArB,EAAA,CAAA;AAAA,WAJMqB;AAAAA,EAIN;AAKH,MAAIwJ,EAAQG,EAAKnJ,OAAQ,GAAC;AAAA,QAAAR;AAAA,WAAArB,SAAAwH,KACjBnG,sBAACiK,IAAA,EAAkB9D,QAAAA,EAAAA,CAAO,GAAIxH,OAAAwH,GAAAxH,OAAAqB,KAAAA,IAAArB,EAAA,CAAA,GAA9BqB;AAAAA,EAA8B;AACtC,MAAAA;AAAA,EAAArB,EAAA,EAAA,MAAAW,KAAAX,UAAAE,KAIGmB,IAAA,gBAAAkE,EAACgG,IAAA,EAAerL,IAAAA,GAAKS,UAAAA,EAAAA,CAAS,GAAaX,QAAAW,GAAAX,QAAAE,GAAAF,QAAAqB,KAAAA,IAAArB,EAAA,EAAA;AAAA,MAAAsB;AAAA,SAAAtB,EAAA,EAAA,MAAAwH,KAAAxH,UAAA8K,KAAA9K,EAAA,EAAA,MAAAqB,KAD7CC,sBAACkK,IAAA,EAA8BV,UAAAA,GAAkBtD,QAAAA,GAC/CnG,UAAAA,GACF,GAAsBrB,QAAAwH,GAAAxH,QAAA8K,GAAA9K,QAAAqB,GAAArB,QAAAsB,KAAAA,IAAAtB,EAAA,EAAA,GAFtBsB;AAEsB;AAgB1B,SAAAiK,GAAAxL,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAoB;AAAA,IAAAC,IAAAA;AAAAA,IAAAS,UAAAA;AAAAA,EAAAA,IAAAZ;AAAqD,MAAAW;AAAA,EAAAV,SAAAE,KAErEQ,IAAA+K,CAAAA,MAA+BC,GAAaxL,GAAIuL,CAAE,GAACzL,OAAAE,GAAAF,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AADrD,QAAA2L,IAAejL;AAGd,MAAAG;AAAA,SAAAb,EAAA,CAAA,MAAAW,KAAAX,SAAA2L,KAEC9K,sBAAC2E,GAAA,EAASmG,KAAAA,GAAY,IAAAtJ,GAAM2H,yBAE5B,GAAMhK,OAAAW,GAAAX,OAAA2L,GAAA3L,OAAAa,KAAAA,IAAAb,EAAA,CAAA,GAFNa;AAEM;AAIV,SAAAwK,GAAAtL,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAmB;AAAA,IAAAK,OAAAA;AAAAA,IAAAmG,QAAAA;AAAAA,EAAAA,IAAA1G;AAAwD,MAAAW;AAAA,EAAAV,EAAA,CAAA,MAAAyG,EAAA0D,cAGrEzJ,IAAA,gBAAA6E,EAACqG,IAAA,EAAYnF,UAAAA,EAAM0D,YAAY,GAAanK,EAAA,CAAA,IAAAyG,EAAA0D,YAAAnK,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAa;AAAA,EAAAb,EAAA,CAAA,MAAAM,KAAAN,SAAAyG,KAC3C5F,IAAA4F,EAAM2D,aAAc9J,CAAK,GAACN,OAAAM,GAAAN,OAAAyG,GAAAzG,OAAAa,KAAAA,IAAAb,EAAA,CAAA;AAAA,MAAAqB;AAAA,SAAArB,EAAA,CAAA,MAAAU,KAAAV,SAAAa,KAF7BQ,IAAA,gBAAAoH,EAACoD,IAAA,EAAe,UAAA,SACdnL,UAAAA;AAAAA,IAAAA;AAAAA,IACCG;AAAAA,EAAAA,GACH,GAAQb,OAAAU,GAAAV,OAAAa,GAAAb,OAAAqB,KAAAA,IAAArB,EAAA,CAAA,GAHRqB;AAGQ;AAIZ,SAAAiK,GAAAvL,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAmB;AAAA,IAAAwG,QAAAA;AAAAA,EAAAA,IAAA1G;AAAmC,MAAAW;AAAA,EAAAV,EAAA,CAAA,MAAAyG,EAAA+D,cAGhD9J,sBAAC4H,GAAA,EAAmB,SAAA,SAAc,OAAA,gBAC/B7B,YAAM+D,WAAAA,CACT,GAAaxK,EAAA,CAAA,IAAAyG,EAAA+D,YAAAxK,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAa;AAAA,EAAAb,EAAA,CAAA,MAAAyG,EAAAgE,oBACb5J,sBAACyH,GAAA,EAAmB,SAAA,WAAgB,OAAA,kBACjC7B,YAAMgE,iBAAAA,CACT,GAAazK,EAAA,CAAA,IAAAyG,EAAAgE,kBAAAzK,OAAAa,KAAAA,IAAAb,EAAA,CAAA;AAAA,MAAAqB;AAAA,SAAArB,EAAA,CAAA,MAAAU,KAAAV,SAAAa,KANfQ,sBAACmE,GAAA,EAAQ,IAAAnD,GAAMwH,WACbnJ,UAAAA;AAAAA,IAAAA;AAAAA,IAGAG;AAAAA,EAAAA,GAGF,GAAMb,OAAAU,GAAAV,OAAAa,GAAAb,OAAAqB,KAAAA,IAAArB,EAAA,CAAA,GAPNqB;AAOM;AAcV,MAAMmK,WAA4BM,GAAwC;AAAA,EAC/DC,QAAuB;AAAA,IAAEzL,OAAO;AAAA,EAAA;AAAA,EAEzC,OAAO0L,yBAAyB1L,GAA6B;AAC3D,WAAO;AAAA,MAAEA,OAAAA;AAAAA,IAAAA;AAAAA,EACX;AAAA,EAES2L,kBAAkB3L,GAAoB;AAE7C4L,YAAQ5L,MAAM,sDAAsDA,CAAK;AAAA,EAC3E;AAAA,EAES6L,SAAoB;AAC3B,UAAM;AAAA,MAAE7L,OAAAA;AAAAA,IAAAA,IAAU,KAAKyL;AACvB,QAAIzL,MAAU,MAAM;AAClB,YAAM;AAAA,QAAEwK,UAAAA;AAAAA,QAAUrE,QAAAA;AAAAA,MAAAA,IAAW,KAAK2F;AAClC,aAAOtB,IACLA,EAASxK,CAAK,IAEd,gBAAAiF,EAAC8F,IAAA,EAAU,OAAA/K,GAAc,QAAAmG,GAAe;AAAA,IAE5C;AACA,WAAO,KAAK2F,MAAMzL;AAAAA,EACpB;AACF;AAEA,SAASoK,GAAelJ,GAA2B;AACjD,SAAIA,KAAW,OAAa,KACxBwK,MAAMC,QAAQzK,CAAO,IACnBA,GAAAA,EAAQ0K,WAAW,KACnB1K,EAAQ2K,MAAOC,CAAAA,MAASJ,MAAMC,QAAQG,CAAI,KAAKA,EAAKF,WAAW,CAAC,KAKlE,OAAO1K,KAAY,YAAY6K,OAAOC,KAAK9K,CAAO,EAAE0K,WAAW;AAIrE;AAEA,SAASpB,GAAQyB,GAAuB;AACtC,SAAIA,aAAiBvC,QAAcuC,IAC/B,OAAOA,KAAU,WAAiB,IAAIvC,MAAMuC,CAAK,IACjDA,KAAS,OAAOA,KAAU,YAAY,aAAaA,IAC9C,IAAIvC,MAAME,OAAQqC,EAA+BtC,OAAO,CAAC,IAE3D,IAAID,MAAM,eAAe;AAClC;AC3KO,MAAMwC,KAA2D;AAAA,EACtEC,OAAO;AACT,GCZazK,KAAS;AAAA,EACpBC,MAAM;AAAA,IACJQ,SAAS;AAAA,IACToB,YAAY;AAAA,IACZF,KAAK;AAAA,IACLD,WAAW;AAAA,EAAA;AAAA,EAKbgJ,OAAO;AAAA,IACLjK,SAAS;AAAA,IACToB,YAAY;AAAA,IACZF,KAAK;AAAA,EAAA;AAAA,EAEPgJ,UAAU;AAAA,IACRC,OAAO;AAAA,IACPC,YAAY;AAAA,EAAA;AAAA,EAEdC,WAAW;AAAA,IACTF,OAAO;AAAA,EAAA;AAAA,EAETG,OAAO;AAAA,IACLH,OAAO;AAAA,EAAA;AAYX;ACHO,SAAAI,GAAAtN,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAA0B;AAAA,IAAA8M,OAAAA;AAAAA,IAAAK,OAAAA;AAAAA,IAAAE,SAAAA;AAAAA,IAAA7G,QAAAA;AAAAA,IAAA8G,MAAAC;AAAAA,IAAA7G,WAAAA;AAAAA,EAAAA,IAAA5G;AAQ/B,MAAI,CAACqN;AAAK,WAAS;AAAI,MAAAK,GAAAC,GAAAlG,GAAA9G,GAAAG,GAAAQ,GAAAC,GAAAI,GAAAC;AAAA,MAAA3B,EAAA,CAAA,MAAAwN,KAAAxN,EAAA,CAAA,MAAA+M,KAAA/M,EAAA,CAAA,MAAA2G,KAAA3G,EAAA,CAAA,MAAAyG,KAAAzG,SAAAoN,GAAA;AACvB5F,IAAAA,IAAgB;AAAA,MAAA,GAAKqF;AAAAA,MAAgC,GAAKpG;AAAAA,IAAAA;AAC1D,UAAAkH,IAAcZ,MAAU,IAAVK,IAAAL;AAGXW,IAAAA,IAAAlI,GAAQ9D,IAAAW,GAAMC,MAAKtC,EAAA,EAAA,MAAAwN,KAAAxN,UAAA2G,KACjBhF,IAAA6L,IAAO,gBAAAjI,EAACiI,GAAA,EAAc,UAAA,SAAO,GAAK7G,GAAS,IAA3C,MAAsD3G,QAAAwN,GAAAxN,QAAA2G,GAAA3G,QAAA2B,KAAAA,IAAA3B,EAAA,EAAA,GACtDyN,IAAAjI,GACW9E,IAAA,QACNG,IAAAwB,GAAM0K,OACE1L,IAAA,GAAGsM,CAAK,MAAMP,CAAK,IAE9B9L,IAAAkG,EAAO1D,UACN0D,EAAO1D,QAAS6J,GAAOP,CAiBzB,IAlBC,gBAAA3E,EAAA2C,IAAA,EAIG,UAAA;AAAA,MAAA,gBAAA7F,EAAC+C,GAAA,EAAqB,WAAA,QAAe,SAAA,WAAc,IAAAjG,GAAM2K,uBAEzD;AAAA,MACA,gBAAAzH,EAAC+C,KACW,WAAA,QACF,SAAA,WACJ,IAAAjG,GAAM8K,WACX,UAAA,IAAA,CAED;AAAA,MACA,gBAAA5H,EAAC+C,KAAqB,WAAA,QAAe,SAAA,WAAc,IAAAjG,GAAM+K,OACtDA,UAAAA,EAAAA,CACH;AAAA,IAAA,GAAa,GAEhBpN,OAAAwN,GAAAxN,OAAA+M,GAAA/M,OAAA2G,GAAA3G,OAAAyG,GAAAzG,OAAAoN,GAAApN,OAAAyN,GAAAzN,OAAA0N,GAAA1N,OAAAwH,GAAAxH,OAAAU,GAAAV,OAAAa,GAAAb,QAAAqB,GAAArB,QAAAsB,GAAAtB,QAAA0B,GAAA1B,QAAA2B;AAAAA,EAAA;AAAA8L,IAAAA,IAAAzN,EAAA,CAAA,GAAA0N,IAAA1N,EAAA,CAAA,GAAAwH,IAAAxH,EAAA,CAAA,GAAAU,IAAAV,EAAA,CAAA,GAAAa,IAAAb,EAAA,CAAA,GAAAqB,IAAArB,EAAA,EAAA,GAAAsB,IAAAtB,EAAA,EAAA,GAAA0B,IAAA1B,EAAA,EAAA,GAAA2B,IAAA3B,EAAA,EAAA;AAAA,MAAA8B;AAAA,EAAA9B,EAAA,EAAA,MAAAyN,KAAAzN,EAAA,EAAA,MAAAU,KAAAV,EAAA,EAAA,MAAAa,KAAAb,EAAA,EAAA,MAAAqB,KAAArB,UAAAsB,KAvBHQ,IAAA,gBAAAyD,EAACkI,KACW,WAAA/M,GACN,IAAAG,GACQ,cAAAQ,GAEXC,UAAAA,EAAAA,CAmBH,GAAMtB,QAAAyN,GAAAzN,QAAAU,GAAAV,QAAAa,GAAAb,QAAAqB,GAAArB,QAAAsB,GAAAtB,QAAA8B,KAAAA,IAAA9B,EAAA,EAAA;AAAA,MAAA+B;AAAA,EAAA/B,EAAA,EAAA,MAAAwH,KAAAxH,UAAA+M,KAAA/M,EAAA,EAAA,MAAAsN,KACLvL,IAAAgL,IAAQ,KAARO,KACC,gBAAA/H,EAACqI,IAAA,EAAY,MAAA,SAAgB,SAAA,QAAgBN,SAAAA,GAC1C9F,UAAAA,EAAOsF,OACV,GACD9M,QAAAwH,GAAAxH,QAAA+M,GAAA/M,QAAAsN,GAAAtN,QAAA+B,KAAAA,IAAA/B,EAAA,EAAA;AAAA,MAAAiC;AAAA,SAAAjC,EAAA,EAAA,MAAA0N,KAAA1N,EAAA,EAAA,MAAA0B,KAAA1B,EAAA,EAAA,MAAA2B,KAAA3B,EAAA,EAAA,MAAA8B,KAAA9B,UAAA+B,KA/BHE,IAAA,gBAAAwG,EAACiF,GAAA,EAAQ,IAAAhM,GACNC,UAAAA;AAAAA,IAAAA;AAAAA,IACDG;AAAAA,IAyBCC;AAAAA,EAAAA,GAKH,GAAM/B,QAAA0N,GAAA1N,QAAA0B,GAAA1B,QAAA2B,GAAA3B,QAAA8B,GAAA9B,QAAA+B,GAAA/B,QAAAiC,KAAAA,IAAAjC,EAAA,EAAA,GAhCNiC;AAgCM;AC1EH,MAAM4L,KAAwC;AAAA,EACnDC,SAAS;AAAA,EACTC,OAAO;AACT,GCNa1L,KAAS;AAAA,EACpBC,MAAM;AAAA,IACJQ,SAAS;AAAA,IACToB,YAAY;AAAA,IACZF,KAAK;AAAA,IACLxB,OAAO;AAAA,IACPG,cAAc;AAAA,IACdqL,YAAY;AAAA,IACZrK,QAAQ;AAAA,EAAA;AAAA,EAEVsK,SAAS;AAAA,IACPnL,SAAS;AAAA,IACToB,YAAY;AAAA,IACZF,KAAK;AAAA,EAAA;AAAA,EAEPkK,eAAe;AAAA,IACbxL,SAAS;AAAA,EAAA;AAAA,EAEXyL,OAAO;AAAA;AAAA,IAELrL,SAAS;AAAA,IACToB,YAAY;AAAA,IACZF,KAAK;AAAA,IACLoK,IAAI;AAAA,IACJC,IAAI;AAAA,IACJC,IAAI;AAAA,IACJC,IAAI;AAAA;AAAA,IACJ7L,SAAS;AAAA,IACTC,cAAc;AAAA,EAAA;AAElB;AC4CO,SAAA6L,GAAAzO,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAiB;AAAA,IAAAwO,cAAAA;AAAAA,IAAAhI,QAAAA;AAAAA,IAAA8G,MAAA7M;AAAAA,IAAAiG,WAAAA;AAAAA,IAAA+H,WAAA7N;AAAAA,IAAAyE,IAAAA;AAAAA,IAAA3E,UAAAA;AAAAA,EAAAA,IAAAZ,GAGhByN,IAAA9M,MAAAE,SAAA+N,KAAAjO,GAENgO,IAAA7N,MAAAD,SAAA,UAAAC;AAAmB,MAAAQ;AAAA,EAAArB,SAAAyG,KAIHpF,IAAA;AAAA,IAAA,GAAKwM;AAAAA,IAAsB,GAAKpH;AAAAA,EAAAA,GAAQzG,OAAAyG,GAAAzG,OAAAqB,KAAAA,IAAArB,EAAA,CAAA;AAAxD,QAAAwH,IAAgBnG,GAWhB,CAAAuN,GAAAC,CAAA,IAAwBzN,EAAS,EAAK,GACtC,CAAA0N,GAAAC,CAAA,IAAgC3N,EAAmC,IAAI,GACvE,CAAA4N,GAAAC,CAAA,IAAgC7N,EAA6B,IAAI,GACjE,CAAA8N,GAAAC,CAAA,IAA8B/N,EAA6B,IAAI;AAAC,MAAAE;AAAA,EAAAtB,EAAA,CAAA,MAAAoP,uBAAAC,IAAA,2BAAA,KAE/B/N,IAAAA,MAAMuN,EAAQpJ,EAAS,GAACzF,OAAAsB,KAAAA,IAAAtB,EAAA,CAAA;AAAzD,QAAAsP,IAAqBhO;AAAyC,MAAAI;AAAA,EAAA1B,EAAA,CAAA,MAAAoP,uBAAAC,IAAA,2BAAA,KACzB3N,IAAA2H,CAAAA,MAAA;AACnC0F,IAAAA,EAAY1F,CAAI;AAAA,EAAC,GAClBrJ,OAAA0B,KAAAA,IAAA1B,EAAA,CAAA;AAFD,QAAAuP,IAAyB7N;AAEnB,MAAAC,GAAAG;AAAA,EAAA9B,SAAA4O,KAOIjN,IAAAA,MAAA;AACR,QAAI,CAACiN;AAAI;AACT,UAAAY,IAAc9J,CAAAA,MAAA;AACZ,MAAIA,EAAC+J,QAAS,YAAUZ,EAAQ,EAAK;AAAA,IAAC;AAExCa,oBAAQC,iBAAkB,WAAWH,CAAK,GACnC,MAAME,SAAQE,oBAAqB,WAAWJ,CAAK;AAAA,EAAC,GAC1D1N,IAAA,CAAC8M,CAAI,GAAC5O,OAAA4O,GAAA5O,OAAA2B,GAAA3B,OAAA8B,MAAAH,IAAA3B,EAAA,CAAA,GAAA8B,IAAA9B,EAAA,CAAA,IAPT6P,GAAUlO,GAOPG,CAAM;AAOT,QAAA,CAAAgO,CAAA,IAAe1O,EAAgCyE,EAK9C;AAAC,MAAAkK,GAAAhO;AAAA,EAAA/B,SAAAW,KAEFoP,IAAc9G,GAAQC,QAASvI,CAAQ,EAACqP,OAAQC,EAEhD,GAE2BlO,IAAAgO,EAAKG,OAC9BC,IACA,CACF,GAACnQ,OAAAW,GAAAX,OAAA+P,GAAA/P,OAAA+B,MAAAgO,IAAA/P,EAAA,CAAA,GAAA+B,IAAA/B,EAAA,CAAA;AACD,QAAAoQ,IACE3B,MAAiB7N,UALQmB,IAK0B0M;AAAY,MAAAxM;AAAAoO,EAAAA,GAAA;AAM/D,QAAI,CAACD,KAAgB3B,MAAiB7N,QAAS;AAAEqB,MAAAA,IAAO;AAAP,YAAAoO;AAAAA,IAAW;AAAA,QAAArO;AAAA,IAAAhC,EAAA,EAAA,MAAA+P,KAAA/P,UAAAyO,KACrDzM,IAAAsO,GAA4BP,GAAOtB,CAAY,GAACzO,QAAA+P,GAAA/P,QAAAyO,GAAAzO,QAAAgC,KAAAA,IAAAhC,EAAA,EAAA,GAAvDiC,IAAOD;AAAAA,EAAgD;AAFzD,QAAAuO,IAA6BtO;AAkB7B,EAAI,CAACmO,KAADxB,KACFC,EAAQ,EAAK;AACd,MAAA7M,GAAAG;AAeD,MAfCnC,EAAA,EAAA,MAAA8P,KAAA9P,EAAA,EAAA,MAAAgP,KAAAhP,EAAA,EAAA,MAAA4O,KAAA5O,UAAAkP,KAQelN,IAAAA,MAAA;AACd,UAAAwO,IAAe5B,KAAAM,IAAAA,IAAAF;AACf,IAAIc,KAAAU,KAAkBV,EAAIW,eAAgBD,KACxCA,EAAME,YAAaZ,CAAI;AAAA,EACxB,GACA3N,IAAA,CAACyM,GAAMI,GAAUE,GAASY,CAAI,GAAC9P,QAAA8P,GAAA9P,QAAAgP,GAAAhP,QAAA4O,GAAA5O,QAAAkP,GAAAlP,QAAAgC,GAAAhC,QAAAmC,MAAAH,IAAAhC,EAAA,EAAA,GAAAmC,IAAAnC,EAAA,EAAA,IALlCyB,GAAgBO,GAKbG,CAA+B,GAE9B4N,EAAKxD,WAAY;AAAC,WAAS;AAE/B,QAAAoE,IAAqB/B,IAAOpH,EAAOuG,QAASvG,EAAOsG,SACnD9I,IAAsB0J,MAAc,SAAd,gBAAA;AAA4C,MAAA3G;AAAA,EAAA/H,EAAA,EAAA,MAAAgF,KAAAhF,UAAAsF,KAGvDyC,IAAA;AAAA,IAAA,GAAK1F,GAAMC;AAAAA,IAAK0C,eAAAA;AAAAA,IAAA,GAAoBM;AAAAA,EAAAA,GAAItF,QAAAgF,GAAAhF,QAAAsF,GAAAtF,QAAA+H,KAAAA,IAAA/H,EAAA,EAAA;AAAA,MAAAgI;AAAA,EAAAhI,EAAA,EAAA,MAAAwN,KAAAxN,EAAA,EAAA,MAAA2G,KAAA3G,EAAA,EAAA,MAAA4O,KAAA5O,EAAA,EAAA,MAAAoQ,KAAApQ,UAAA2Q,KAC9C3I,IAAAoI,KAAA,gBAAA3H,EAAA2C,IAAA,EAEG,UAAA;AAAA,IAAA,gBAAA7F,EAACqL,MAAeD,OAAAA,GACd,4BAACE,IAAA,EACMtB,KAAAA,GACA,MAAA,SACOoB,cAAAA,GACE/B,mBACLU,SAAAA,GACE,WAAAV,IAAA,WAAAhO,QACP,IAAA;AAAA,MAAA,GAAMgO,KAAQvM,GAAM6L;AAAAA,IAAAA,GAEvBU,UAAAA,IACC,gBAAArJ,EAACuL,IAAA,EAAmB,UAAA,SAAO,IAE3B,gBAAAvL,EAACiI,GAAA,EAAc,UAAA,SAAO,GAAK7G,EAAAA,CAAS,GAExC,GACF;AAAA,sBACCoK,IAAA,EAAoB,aAAA,YAAW,cAAa,IAAA;AAAA,MAAAzC,IAAM;AAAA,IAAA,EAAI;KAAK,GAE/DtO,QAAAwN,GAAAxN,QAAA2G,GAAA3G,QAAA4O,GAAA5O,QAAAoQ,GAAApQ,QAAA2Q,GAAA3Q,QAAAgI,KAAAA,IAAAhI,EAAA,EAAA;AAAA,MAAAiI;AAAA,EAAAjI,EAAA,EAAA,MAAAoP,uBAAAC,IAAA,2BAAA,KAIDpH,sBAACzC,GAAA,EAASyJ,KAAAA,GAAiB,IAAA5M,GAAM4L,SAAQ,GAAIjO,QAAAiI,KAAAA,IAAAjI,EAAA,EAAA;AAAA,MAAAkI;AAAA,EAAAlI,EAAA,EAAA,MAAA8O,KAAA9O,EAAA,EAAA,MAAA0O,KAAA1O,EAAA,EAAA,MAAA4O,KAAA5O,UAAAoQ,KAE5ClI,IAAAkI,KACC,gBAAA7K,EAACyL,IAAA,EACOpC,MAAAA,GACIE,UAAAA,GACC,WAAAJ,MAAc,SAAd,SAAA,SACX,YAAA,IAIW,WAAA,CAAC;AAAA,IAAAuC,MAAQ;AAAA,IAAMC,SAAW;AAAA,EAAA,CAAO,GAGxC,IAAA;AAAA,IAAArN,QAAU;AAAA,IAAS0K,IAAM;AAAA,EAAA,GAE5BpG,WAAAA,MAAA;AAAC,UAAA;AAAA,MAAAgJ,iBAAAA;AAAAA,IAAAA,IAAAhJ;AAAmB,WACnB,gBAAA5C,EAAC6L,IAAA,EAAI,GACCD,GACG,OAAA;AAAA,MAAAE,iBAEH3C,MAAc,SAAd,iBAAA;AAAA,IAAA,GAGJ,4BAAC4C,IAAA,EAAWnC,QAAgB,IAAA9M,GAAM8L,OAAM,GAC1C;AAAA,EAAO,GAEX,GACDnO,QAAA8O,GAAA9O,QAAA0O,GAAA1O,QAAA4O,GAAA5O,QAAAoQ,GAAApQ,QAAAkI,KAAAA,IAAAlI,EAAA,EAAA;AAAA,MAAAmI;AAAA,EAAAnI,EAAA,EAAA,MAAA8P,KAAA9P,EAAA,EAAA,MAAAuQ,KAAAvQ,EAAA,EAAA,MAAA+P,KAAA/P,UAAA4O,KASAzG,IAAA2H,IACGyB,GACExB,EAAKyB,IAAK,CAAA/E,GAAAgF,MAAA;AACR,UAAAC,IACE9C,KAAA,CAAS2B,KAAwBA,EAAoBoB,IAAKF,CAAC,GAC7DhC,KAAYhD,EAAIgD,OAAJgC;AAAa,sCAIM,6BAAAC,IAAA,SAAA,SACpB,OAAA;AAAA,MAAA5O,SAAW4O,IAAA,aAAA;AAAA,IAAA,GAEjBjF,eAJIgD,EAKP;AAAA,EAAM,CAET,GACDK,CAEC,IAlBN,MAkBO9P,QAAA8P,GAAA9P,QAAAuQ,GAAAvQ,QAAA+P,GAAA/P,QAAA4O,GAAA5O,QAAAmI,KAAAA,IAAAnI,EAAA,EAAA;AAAA,MAAAoI;AAAA,SAAApI,EAAA,EAAA,MAAA+H,KAAA/H,EAAA,EAAA,MAAAgI,KAAAhI,EAAA,EAAA,MAAAkI,KAAAlI,UAAAmI,KAjFVC,IAAA,gBAAAK,EAACjD,GAAA,EAAQ,IAAAuC,GACNC,UAAAA;AAAAA,IAAAA;AAAAA,IAyBDC;AAAAA,IAECC;AAAAA,IAmCAC;AAAAA,EAAAA,GAmBH,GAAMnI,QAAA+H,GAAA/H,QAAAgI,GAAAhI,QAAAkI,GAAAlI,QAAAmI,GAAAnI,QAAAoI,KAAAA,IAAApI,EAAA,EAAA,GAlFNoI;AAkFM;AAjMH,SAAA+H,GAAAyB,GAAAC,GAAA;AAAA,SA6DOD,KAAKE,GAAgBC,CAAS,IAAzB,IAAA;AAA2B;AA7DvC,SAAA9B,GAAA8B,GAAA;AAAA,SAyDHxI,GAAewI,CAAC;AAAC;AAzDd,SAAAlM,KAAA;AAkDH,MAAI,OAAO6J,WAAa;AAAW,WAAS;AAC5C,QAAAsC,IAAYtC,SAAQuC,cAAe,KAAK;AACxCD,SAAAA,EAAGE,MAAMpP,UAAW,YACbkP;AAAG;AArDP,SAAAvM,GAAA0M,GAAA;AAAA,SAyBiD,CAACA;AAAC;AA4K1D,SAASL,GAAgB9I,GAA8B;AAMrD,SAFEA,EACAoD,MACW,qBAAqB,MAAM;AAC1C;AASA,SAASkE,GACPP,GACAtB,GACa;AACb,QAAM2D,IAAoB,CAAA;AAC1B,MAAIrF,IAAQ;AACZ,WAAS0E,IAAI,GAAGA,IAAI1B,EAAMxD,UACpBQ,EAAAA,KAAS0B,IADmBgD;AAEhCW,IAAAA,EAAQhJ,KAAKqI,CAAC,GACTK,GAAgB/B,EAAM0B,CAAC,CAAE,KAAG1E;AAGnC,SACEqF,EAAQ7F,SAAS,KACjBuF,GAAgB/B,EAAMqC,EAAQA,EAAQ7F,SAAS,CAAC,CAAE,CAAE;AAEpD6F,IAAAA,EAAQC,IAAAA;AAEV,SAAO,IAAIC,IAAIF,CAAO;AACxB;AC/SO,MAAMG,KAAkC;AAAA,EAC7CC,UAAU;AAAA,EACVC,UAAU;AACZ,GCNapQ,KAAS;AAAA,EACpBC,MAAM;AAAA,IACJQ,SAAS;AAAA,IACTkC,eAAe;AAAA,IACfhB,KAAK;AAAA,EAAA;AAAA,EAEP0O,MAAM;AAAA,IACJzF,OAAO;AAAA,IACPrK,UAAU;AAAA,IACV+P,cAAc;AAAA,EAAA;AAAA,EAEhBC,SAAS;AAAA,IACP9P,SAAS;AAAA,IACT6B,iBAAiB;AAAA,IACjBD,iBAAiB;AAAA,EAAA;AAAA,EAEnBmO,QAAQ;AAAA,IACNC,WAAW;AAAA,IACX7F,OAAO;AAAA,IACPC,YAAY;AAAA,IACZ9I,QAAQ;AAAA,IACR,WAAW;AAAA,MAAE2O,gBAAgB;AAAA,IAAA;AAAA,EAAY;AAE7C;ACYA,SAAAC,EAAAjT,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAsB;AAAA,IAAAU,UAAAA;AAAAA,EAAAA,IAAAZ;AAAsC,MAAAW;AAAA,EAAAV,EAAA,CAAA,MAAAoP,uBAAAC,IAAA,2BAAA,KAEQ3O,IAAA;AAAA,IAAAuS,GAAK;AAAA,EAAA,GAAGjT,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAAA,MAAAa;AAAA,SAAAb,SAAAW,KAAxEE,IAAA,gBAAA0E,EAAC+C,GAAA,EAAmB,SAAA,WAAoB,WAAA,KAAU,OAAA,WAAc,IAAA5H,GAC7DC,UAAAA,EAAAA,CACH,GAAaX,OAAAW,GAAAX,OAAAa,KAAAA,IAAAb,EAAA,CAAA,GAFba;AAEa;AAIjB,MAAMqS,KAA8B;AAAA;AAAA;AAAA,EAGlCC,IAAIH;AAAAA,EACJI,IAAIJ;AAAAA,EACJK,IAAIL;AAAAA,EACJM,IAAIN;AAAAA,EACJO,IAAIP;AAAAA,EACJQ,IAAIR;AAAAA,EACJS,GAAGT;AAAAA;AAAAA,EAEHU,GAAGA,CAAC;AAAA,IAAE/S,UAAAA;AAAAA,IAAUgT,MAAAA;AAAAA,EAAAA,MACd,gBAAApO,EAACqO,IAAA,EACC,MAAAD,GACA,QAAO,UACP,KAAI,uBACJ,OAAM,WACN,WAAU,UAEThT,UAAAA,EAAAA,CACH;AAEJ;AAWA,SAAAkT,GAAA9T,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAkB;AAAA,IAAA6T,WAAApT;AAAAA,IAAA+F,QAAAA;AAAAA,IAAA9F,UAAAA;AAAAA,EAAAA,IAAAZ,GAAE+T,IAAApT,MAAAE,SAAA,IAAAF;AAAa,MAAAG;AAAA,EAAAb,SAAAW,KAG3BE,sBAACyH,KAAmB,SAAA,WAAoB,WAAA,OAAY,OAAA,wBAEpD,GAAatI,OAAAW,GAAAX,OAAAa,KAAAA,IAAAb,EAAA,CAAA;AAAA,MAAAqB;AAAA,SAAArB,EAAA,CAAA,MAAAW,KAAAX,EAAA,CAAA,MAAAyG,KAAAzG,EAAA,CAAA,MAAA8T,KAAA9T,SAAAa,KAHfQ,sBAAC0S,IAAA,EAAqBD,WAAAA,GAAmBrN,QAAAA,GAAoB9F,YAAAA,GAC3DE,UAAAA,GAGF,GAAYb,OAAAW,GAAAX,OAAAyG,GAAAzG,OAAA8T,GAAA9T,OAAAa,GAAAb,OAAAqB,KAAAA,IAAArB,EAAA,CAAA,GAJZqB;AAIY;AAShB,SAAA2S,GAAAjU,GAAA;AAAA,QAAAC,IAAAC,EAAA,CAAA,GAAsB;AAAA,IAAAiF,SAAAA;AAAAA,IAAA4O,WAAApT;AAAAA,IAAA+F,QAAAA;AAAAA,EAAAA,IAAA1G,GAAW+T,IAAApT,MAAAE,SAAA,IAAAF;AAAa,MAAAG;AAAA,EAAAb,SAAAkF,KAGxCrE,IAAA,gBAAA0E,EAAC0O,IAAA,EAAyB/O,SAAAA,GAAqBgO,YAAAA,IAAe,GAAIlT,OAAAkF,GAAAlF,OAAAa,KAAAA,IAAAb,EAAA,CAAA;AAAA,MAAAqB;AAAA,SAAArB,EAAA,CAAA,MAAAkF,KAAAlF,EAAA,CAAA,MAAAyG,KAAAzG,EAAA,CAAA,MAAA8T,KAAA9T,SAAAa,KADpEQ,sBAAC0S,IAAA,EAAqBD,WAAAA,GAAmBrN,QAAAA,GAAoBvB,YAAAA,GAC3DrE,UAAAA,GACF,GAAYb,OAAAkF,GAAAlF,OAAAyG,GAAAzG,OAAA8T,GAAA9T,OAAAa,GAAAb,OAAAqB,KAAAA,IAAArB,EAAA,CAAA,GAFZqB;AAEY;AAMT,MAAM6S,KAAOxH,OAAOyH,OAAON,IAAU;AAAA,EAAEO,UAAUJ;AAAa,CAAC;AAetE,SAAAD,GAAAhU,GAAA;AAAA,QAAAC,IAAAC,EAAA,EAAA,GAAmB;AAAA,IAAA6T,WAAAA;AAAAA,IAAArN,QAAAA;AAAAA,IAAA4N,YAAAA;AAAAA,IAAA1T,UAAAA;AAAAA,EAAAA,IAAAZ;AAKF,MAAAW;AAAA,EAAAV,SAAAyG,KACC/F,IAAA;AAAA,IAAA,GAAK6R;AAAAA,IAAmB,GAAK9L;AAAAA,EAAAA,GAAQzG,OAAAyG,GAAAzG,OAAAU,KAAAA,IAAAV,EAAA,CAAA;AAArD,QAAAwH,IAAgB9G,GAChB4T,IAAgBC,GAA8B,IAAI,GAClD,CAAAC,GAAAC,CAAA,IAA0CrT,EAAS,EAAK,GACxD,CAAAiG,GAAAqN,CAAA,IAAgCtT,EAAS,EAAK,GAC9CuT,IAAyBb,KAAa;AAAC,MAAAjT;AAAA,EAAAb,EAAA,CAAA,MAAAoP,uBAAAC,IAAA,2BAAA,KAEXxO,IAAAA,MAAA;AAC1B,UAAAwI,IAAaiL,EAAOM;AACpB,IAAKvL,KACLoL,EAAiBpL,EAAIwL,eAAgBxL,EAAIyL,eAAgB,CAAC;AAAA,EAAC,GAC5D9U,OAAAa,KAAAA,IAAAb,EAAA,CAAA;AAJD,QAAA+U,IAAgBlU;AAIV,MAAAQ;AAAA,EAAArB,SAAA2U,KAEItT,IAAAA,MAAA;AACR,QAAIsT;AAAgB;AACpB,UAAAK,IAAaV,EAAOM;AACpB,QAAKvL;AACL0L,aAAAA,EAAAA,GACOE,GAAc5L,GAAM0L,CAAO;AAAA,EAAC,GACpC/U,OAAA2U,GAAA3U,OAAAqB,KAAAA,IAAArB,EAAA,CAAA;AAAA,MAAAsB;AAAA,EAAAtB,EAAA,CAAA,MAAA2U,KAAA3U,SAAAqU,KAAE/S,KAACyT,GAASV,GAAYM,CAAgB,GAAC3U,OAAA2U,GAAA3U,OAAAqU,GAAArU,OAAAsB,KAAAA,IAAAtB,EAAA,CAAA,GAN1C6P,GAAUxO,GAMPC,CAAuC;AAAC,MAAAI;AAAA,EAAA1B,EAAA,CAAA,MAAAoP,uBAAAC,IAAA,2BAAA,KAEhB3N,IAAAA,MAAMgT,EAAYjP,EAAS,GAACzF,OAAA0B,KAAAA,IAAA1B,EAAA,CAAA;AAAvD,QAAA6S,IAAenR,GACfkR,IAAgB,CAACvL,KAAD,CAAcsN;AAAgB,MAAAhT;AAAA,EAAA3B,EAAA,CAAA,MAAA4S,KAAA5S,UAAA8T,KAC1BnS,IAAAiR,IAAA;AAAA,IAAA,GACXvQ,GAAMuQ;AAAAA,IAAQlO,iBAAmBoP;AAAAA,EAAAA,IADtB,MAEZ9T,OAAA4S,GAAA5S,QAAA8T,GAAA9T,QAAA2B,KAAAA,IAAA3B,EAAA,EAAA;AAFR,QAAAkV,IAAoBvT;AAEZ,MAAAG;AAAA,EAAA9B,UAAAkV,KAIyCpT,IAAAoT,KAAA,CAAA,GAAiBlV,QAAAkV,GAAAlV,QAAA8B,KAAAA,IAAA9B,EAAA,EAAA;AAAA,MAAA+B;AAAA,EAAA/B,UAAA8B,KAAvCC,IAAA;AAAA,IAAA,GAAKM,GAAMqQ;AAAAA,IAAK,GAAM5Q;AAAAA,EAAAA,GAAoB9B,QAAA8B,GAAA9B,QAAA+B,KAAAA,IAAA/B,EAAA,EAAA;AAAA,MAAAiC;AAAA,EAAAjC,EAAA,EAAA,MAAAW,KAAAX,UAAA+B,KAAjEE,sBAACuD,GAAA,EAAS8O,KAAAA,GAAa,IAAAvS,gBAEvB,GAAM/B,QAAAW,GAAAX,QAAA+B,GAAA/B,QAAAiC,KAAAA,IAAAjC,EAAA,EAAA;AAAA,MAAAgC;AAAA,EAAAhC,EAAA,EAAA,MAAAwH,KAAAxH,EAAA,EAAA,MAAA2U,KAAA3U,EAAA,EAAA,MAAAqH,KAAArH,UAAAwU,KAILxS,IAAA,CAAC2S,MAAqBH,KAAAnN,wBACpBuM,IAAA,EACW,WAAA,UACF,SAAA,WACE,WAAA,QACDf,SAAAA,GACL,IAAAxQ,GAAMwQ,QAETxL,UAAAA,IAAWG,EAAOiL,WAAYjL,EAAOgL,SAAAA,CACxC,GACDxS,QAAAwH,GAAAxH,QAAA2U,GAAA3U,QAAAqH,GAAArH,QAAAwU,GAAAxU,QAAAgC,KAAAA,IAAAhC,EAAA,EAAA;AAAA,MAAAmC;AAAA,SAAAnC,EAAA,EAAA,MAAAgC,KAAAhC,UAAAiC,KAjBHE,sBAACqD,GAAA,EAAQ,IAAAnD,GAAMC,MACbL,UAAAA;AAAAA,IAAAA;AAAAA,IAMCD;AAAAA,EAAAA,GAWH,GAAMhC,QAAAgC,GAAAhC,QAAAiC,GAAAjC,QAAAmC,KAAAA,IAAAnC,EAAA,EAAA,GAlBNmC;AAkBM;AAnDV,SAAAsD,GAAA0M,GAAA;AAAA,SA0BsD,CAACA;AAAC;AChFjD,MAAMgD,KAAS;AAAA;AAAA,EAEpBrV,UAAAA;AAAAA,EACAoG,SAAAA;AAAAA,EACAb,SAAAA;AAAAA,EACAO,SAAAA;AAAAA,EACA4D,SAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAG,WAAAA;AAAAA,EACAe,OAAAA;AAAAA,EACA0C,kBAAAA;AAAAA,EACAmB,SAAAA;AAAAA,EACA0F,MAAAA;AAAAA;AAAAA,EAGAkB,QAAAA;AAAAA,EACAC,UAAAA;AAAAA;AAAAA,EAGAC,UAAAA;AAAAA,EACAC,gBAAAA;AAAAA,EACAC,aAAAA;AAAAA,EACAC,eAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,aAAAA;AAAAA,EACAC,cAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,eAAAA;AAAAA,EACAC,cAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,EAMAC,SAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACA9B,UAAAA;AAAAA,EACA+B,YAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,OAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,YAAAA;AAAAA,EACAC,OAAAA;AAAAA,EACAC,SAAAA;AACF;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carto/ps-react-ui",
3
- "version": "4.11.2",
3
+ "version": "4.12.0",
4
4
  "description": "CARTO's Professional Service React Material library",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -17,8 +17,8 @@
17
17
  "react-dom": "19.2.4",
18
18
  "react-markdown": "10.1.0",
19
19
  "zustand": "5.0.12",
20
- "@carto/ps-utils": "2.0.1",
21
- "@carto/ps-common-types": "1.0.0"
20
+ "@carto/ps-common-types": "1.0.0",
21
+ "@carto/ps-utils": "2.0.1"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "@carto/meridian-ds": "^2.0.0",
@@ -10,10 +10,14 @@ ChatMessageOverflow.displayName = 'ChatMessageOverflow'
10
10
 
11
11
  export const styles = {
12
12
  agentMessageContainer: (theme: Theme) => ({
13
+ ...theme.typography.body2,
13
14
  width: '100%',
14
15
  display: 'flex',
15
16
  flexDirection: 'column',
16
17
  alignItems: 'flex-start',
18
+ // Separate the stacked turn blocks (tools → answer text → actions) per the
19
+ // Figma "Chat Turn" spec (gap-8).
20
+ gap: theme.spacing(1),
17
21
  paddingRight: theme.spacing(4),
18
22
  '& + .PsChat--agent-message': {
19
23
  marginTop: theme.spacing(1),
@@ -84,7 +88,7 @@ export const styles = {
84
88
  padding: ({ spacing }) => spacing(0.75, 1.5),
85
89
  borderRadius: ({ spacing }) => spacing(2, 2, 0.25, 2),
86
90
  border: ({ palette }) => `1px solid ${palette.divider}`,
87
- backgroundColor: ({ palette }) => palette.background.default,
91
+ backgroundColor: ({ palette }) => palette.background.paper,
88
92
  color: ({ palette }) => palette.text.primary,
89
93
  width: 'fit-content',
90
94
  },
@@ -93,7 +93,10 @@ export const ChatContent = forwardRef<ChatContentRef, ChatContentProps>(
93
93
  }
94
94
 
95
95
  const mo = new MutationObserver(() => {
96
- rafId ??= requestAnimationFrame(check)
96
+ // Plain `?? =` rather than `??=`: the React Compiler can't yet lower
97
+ // logical-assignment operators, and bailing out would drop memoization
98
+ // for this scroll container (which re-renders on every message).
99
+ rafId = rafId ?? requestAnimationFrame(check)
97
100
  })
98
101
  mo.observe(root, {
99
102
  childList: true,
@@ -31,4 +31,63 @@ describe('ChatFooter', () => {
31
31
  fireEvent.change(input, { target: { value: 'hello' } })
32
32
  expect(onChange).toHaveBeenCalledWith('hello')
33
33
  })
34
+
35
+ const MODELS = [
36
+ { value: 'gpt-4o', label: 'gpt-4o' },
37
+ { value: 'gemini-2.5-pro', label: 'gemini-2.5-pro' },
38
+ ]
39
+
40
+ test('no model selector when models is empty/undefined', () => {
41
+ render(<ChatFooter {...defaultProps} />)
42
+ expect(screen.queryByLabelText('Select model')).toBeNull()
43
+ })
44
+
45
+ test('no model selector when only one model is available', () => {
46
+ render(
47
+ <ChatFooter
48
+ {...defaultProps}
49
+ models={[{ value: 'gpt-4o', label: 'gpt-4o' }]}
50
+ selectedModel='gpt-4o'
51
+ />,
52
+ )
53
+ expect(screen.queryByLabelText('Select model')).toBeNull()
54
+ })
55
+
56
+ test('renders the selected model label', () => {
57
+ render(
58
+ <ChatFooter {...defaultProps} models={MODELS} selectedModel='gpt-4o' />,
59
+ )
60
+ const trigger = screen.getByLabelText('Select model')
61
+ expect(trigger.textContent).toContain('gpt-4o')
62
+ })
63
+
64
+ test('opens the menu and fires onModelChange', () => {
65
+ const onModelChange = vi.fn()
66
+ render(
67
+ <ChatFooter
68
+ {...defaultProps}
69
+ models={MODELS}
70
+ selectedModel='gpt-4o'
71
+ onModelChange={onModelChange}
72
+ />,
73
+ )
74
+ fireEvent.click(screen.getByLabelText('Select model'))
75
+ fireEvent.click(screen.getByRole('menuitem', { name: 'gemini-2.5-pro' }))
76
+ expect(onModelChange).toHaveBeenCalledWith('gemini-2.5-pro')
77
+ })
78
+
79
+ test('model selector is disabled while generating', () => {
80
+ render(
81
+ <ChatFooter
82
+ {...defaultProps}
83
+ models={MODELS}
84
+ selectedModel='gpt-4o'
85
+ isGenerating
86
+ onStop={vi.fn()}
87
+ />,
88
+ )
89
+ expect(
90
+ screen.getByLabelText('Select model').hasAttribute('disabled'),
91
+ ).toBeTruthy()
92
+ })
34
93
  })