@carto/ps-react-ui 6.3.0 → 6.5.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 (113) hide show
  1. package/dist/actions-D_PVFZaM.js +1272 -0
  2. package/dist/actions-D_PVFZaM.js.map +1 -0
  3. package/dist/{category-DULnoxvk.js → category-UIGvFN3D.js} +263 -246
  4. package/dist/category-UIGvFN3D.js.map +1 -0
  5. package/dist/chat.js +472 -470
  6. package/dist/chat.js.map +1 -1
  7. package/dist/{components-CTUpdQuj.js → components-DDJU4m0t.js} +8 -8
  8. package/dist/components-DDJU4m0t.js.map +1 -0
  9. package/dist/components.js +2 -2
  10. package/dist/{download-B4sykOFm.js → download-DIj1Iz0t.js} +2 -2
  11. package/dist/{download-B4sykOFm.js.map → download-DIj1Iz0t.js.map} +1 -1
  12. package/dist/{formula-DJS-JLpk.js → formula-CSHhAoyW.js} +4 -4
  13. package/dist/{formula-DJS-JLpk.js.map → formula-CSHhAoyW.js.map} +1 -1
  14. package/dist/{item-color-B7xkIpDZ.js → item-color-7o7pFBR2.js} +26 -18
  15. package/dist/item-color-7o7pFBR2.js.map +1 -0
  16. package/dist/markdown-B8lLR-NY.js +106 -0
  17. package/dist/markdown-B8lLR-NY.js.map +1 -0
  18. package/dist/scale-Bhx8HKEB.js +29 -0
  19. package/dist/scale-Bhx8HKEB.js.map +1 -0
  20. package/dist/{spread-CQwFIwuz.js → spread-BRfPPIep.js} +3 -3
  21. package/dist/{spread-CQwFIwuz.js.map → spread-BRfPPIep.js.map} +1 -1
  22. package/dist/style-DTLuIo84.js +87 -0
  23. package/dist/style-DTLuIo84.js.map +1 -0
  24. package/dist/{styles-BCEBm7xh.js → styles-yKcpfyNV.js} +5 -5
  25. package/dist/styles-yKcpfyNV.js.map +1 -0
  26. package/dist/{table-DEdW_fDj.js → table-Col_FRvb.js} +2 -2
  27. package/dist/{table-DEdW_fDj.js.map → table-Col_FRvb.js.map} +1 -1
  28. package/dist/theme/tailwind.css +373 -0
  29. package/dist/theme.js +123 -0
  30. package/dist/theme.js.map +1 -0
  31. package/dist/types/components/lasso-tool/styles.d.ts +4 -4
  32. package/dist/types/theme/create-carto-theme.d.ts +7 -0
  33. package/dist/types/theme/deep-merge.d.ts +6 -0
  34. package/dist/types/theme/generate-tailwind-css.d.ts +8 -0
  35. package/dist/types/theme/index.d.ts +2 -0
  36. package/dist/types/widgets/actions/index.d.ts +1 -1
  37. package/dist/types/widgets/actions/relative-data/index.d.ts +1 -0
  38. package/dist/types/widgets/actions/relative-data/labels.d.ts +3 -0
  39. package/dist/types/widgets/actions/relative-data/relative-data.d.ts +16 -2
  40. package/dist/types/widgets/actions/relative-data/scale.d.ts +26 -0
  41. package/dist/types/widgets/actions/relative-data/style.d.ts +12 -0
  42. package/dist/types/widgets/category/category.d.ts +2 -1
  43. package/dist/types/widgets/index.d.ts +1 -1
  44. package/dist/types/widgets/markdown/style.d.ts +74 -0
  45. package/dist/types/widgets/utils/spacing-px.d.ts +13 -0
  46. package/dist/{utils-C-eWwOhE.js → utils-Dw4y8tiq.js} +2 -2
  47. package/dist/{utils-C-eWwOhE.js.map → utils-Dw4y8tiq.js.map} +1 -1
  48. package/dist/widgets/actions.js +3 -3
  49. package/dist/widgets/bar.js +85 -84
  50. package/dist/widgets/bar.js.map +1 -1
  51. package/dist/widgets/category.js +1 -1
  52. package/dist/widgets/formula.js +1 -1
  53. package/dist/widgets/histogram.js +109 -108
  54. package/dist/widgets/histogram.js.map +1 -1
  55. package/dist/widgets/markdown.js +1 -1
  56. package/dist/widgets/pie.js +78 -78
  57. package/dist/widgets/pie.js.map +1 -1
  58. package/dist/widgets/scatterplot.js +121 -120
  59. package/dist/widgets/scatterplot.js.map +1 -1
  60. package/dist/widgets/spread.js +1 -1
  61. package/dist/widgets/table.js +1 -1
  62. package/dist/widgets/timeseries.js +91 -90
  63. package/dist/widgets/timeseries.js.map +1 -1
  64. package/dist/widgets/utils.js +1 -1
  65. package/dist/widgets.js +283 -279
  66. package/dist/widgets.js.map +1 -1
  67. package/dist/{zoom-toggle-MmLjMTEw.js → zoom-toggle-DqrV_0Ji.js} +2 -2
  68. package/dist/{zoom-toggle-MmLjMTEw.js.map → zoom-toggle-DqrV_0Ji.js.map} +1 -1
  69. package/package.json +8 -1
  70. package/src/chat/bubbles/styles.ts +2 -0
  71. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +4 -4
  72. package/src/components/lasso-tool/lasso-tool-inline.tsx +6 -6
  73. package/src/components/lasso-tool/styles.ts +4 -4
  74. package/src/theme/create-carto-theme.test.ts +53 -0
  75. package/src/theme/create-carto-theme.ts +21 -0
  76. package/src/theme/deep-merge.test.ts +25 -0
  77. package/src/theme/deep-merge.ts +22 -0
  78. package/src/theme/generate-tailwind-css.test.ts +87 -0
  79. package/src/theme/generate-tailwind-css.ts +178 -0
  80. package/src/theme/index.ts +2 -0
  81. package/src/theme/tailwind-compile.test.ts +71 -0
  82. package/src/theme/tailwind.css +373 -0
  83. package/src/widgets/actions/index.ts +1 -0
  84. package/src/widgets/actions/relative-data/index.ts +1 -0
  85. package/src/widgets/actions/relative-data/labels.ts +6 -0
  86. package/src/widgets/actions/relative-data/relative-data.test.tsx +78 -1
  87. package/src/widgets/actions/relative-data/relative-data.tsx +137 -20
  88. package/src/widgets/actions/relative-data/scale.ts +48 -0
  89. package/src/widgets/actions/relative-data/style.ts +10 -0
  90. package/src/widgets/bar/options.test.ts +16 -0
  91. package/src/widgets/bar/options.ts +13 -8
  92. package/src/widgets/category/category.relative-data.test.tsx +51 -63
  93. package/src/widgets/category/category.tsx +25 -11
  94. package/src/widgets/histogram/options.ts +13 -8
  95. package/src/widgets/index.ts +1 -0
  96. package/src/widgets/markdown/style.ts +40 -0
  97. package/src/widgets/note/widget-note.tsx +4 -1
  98. package/src/widgets/pie/options.ts +5 -4
  99. package/src/widgets/scatterplot/options.test.ts +12 -0
  100. package/src/widgets/scatterplot/options.ts +25 -10
  101. package/src/widgets/timeseries/options.ts +13 -8
  102. package/src/widgets/utils/css-variables-theme.test.ts +32 -0
  103. package/src/widgets/utils/option-builders.ts +4 -6
  104. package/src/widgets/utils/spacing-px.test.ts +42 -0
  105. package/src/widgets/utils/spacing-px.ts +24 -0
  106. package/dist/actions-CkxKe8-J.js +0 -1160
  107. package/dist/actions-CkxKe8-J.js.map +0 -1
  108. package/dist/category-DULnoxvk.js.map +0 -1
  109. package/dist/components-CTUpdQuj.js.map +0 -1
  110. package/dist/item-color-B7xkIpDZ.js.map +0 -1
  111. package/dist/markdown-DmvLi3vx.js +0 -159
  112. package/dist/markdown-DmvLi3vx.js.map +0 -1
  113. package/dist/styles-BCEBm7xh.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions-D_PVFZaM.js","names":["{\n id,\n data,\n isLoading,\n isFetching,\n error,\n formatter,\n labelFormatter,\n keepAlive = false,\n children,\n}: ProviderProps","keepAlive = false","() => {\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 registerWidgetStore(id, store)\n return () => {\n unregisterWidgetStore(id, { keepAlive })\n }\n }","[id, store, keepAlive]","() => {\n store.setState({ rawData: data })\n }","[store, data]","() => {\n store.setState({\n isLoading: isLoading ?? false,\n isFetching: isFetching ?? false,\n error,\n })\n }","[store, isLoading, isFetching, error]","[store, formatter, labelFormatter]","() => {\n store.setState({\n rawFormatter: formatter,\n formatter,\n labelFormatter,\n })\n }","<WidgetContext.Provider value={id}>{children}</WidgetContext.Provider>","WidgetContext.Provider","_c","styles","Icon = SearchIcon","{\n labels,\n icon: Icon = SearchIcon,\n iconProps,\n initialEnabled = false,\n}: SearcherToggleProps","initialEnabled = false","{ ...DEFAULT_SEARCHER_LABELS, ...labels }","(s) => s.labelFormatter","(data: unknown) => filterBySearchText(data, text, labelFormatter)","useCallback(\n (data: unknown) => filterBySearchText(data, text, labelFormatter),\n [text, labelFormatter],\n )","{\n initialEnabled,\n }","{ ...styles.toggle, ...(enabled && styles.toggleActive) }","enabled && styles.toggleActive","<Icon fontSize='small' {...iconProps} />","<IconButton\n size='small'\n aria-label={resolved.toggle}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>","toggle","<Tooltip title={resolved.toggle}>\n <IconButton\n size='small'\n aria-label={resolved.toggle}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>","_c","SearchIcon","_temp","styles","Tooltip","{\n labels,\n debounceMs = DEFAULT_DEBOUNCE,\n}: SearcherProps","debounceMs = DEFAULT_DEBOUNCE","{ ...DEFAULT_SEARCHER_LABELS, ...labels }","(s) => s.transformStates.searcher?.enabled ?? false","(value: unknown) => setSearcherText(id, value as string)","debounce(\n (value: unknown) => setSearcherText(id, value as string),\n debounceMs,\n )","useMemo(\n () =>\n debounce(\n (value: unknown) => setSearcherText(id, value as string),\n debounceMs,\n ),\n [id, debounceMs],\n )","(e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setLocal(value)\n debouncedWrite(value)\n }","value","useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setLocal(value)\n debouncedWrite(value)\n },\n [debouncedWrite],\n )","() => {\n setLocal('')\n setSearcherText(id, '')\n // Re-arm the debounced timer with '' so any pending stale write resolves\n // to the cleared value rather than re-applying the previous text.\n debouncedWrite('')\n inputRef.current?.focus()\n }","useCallback(() => {\n setLocal('')\n setSearcherText(id, '')\n // Re-arm the debounced timer with '' so any pending stale write resolves\n // to the cleared value rather than re-applying the previous text.\n debouncedWrite('')\n inputRef.current?.focus()\n }, [id, debouncedWrite])","() => setFocused(true)","() => setFocused(false)","<InputAdornment position='start'>\n <SearchIcon fontSize='small' />\n </InputAdornment>","local ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n edge='end'\n aria-label={resolved.clearAriaLabel}\n onClick={handleClear}\n >\n <ClearIcon fontSize='small' />\n </IconButton>\n </InputAdornment>\n ) : null","clearAriaLabel","{\n input: {\n startAdornment: (\n <InputAdornment position='start'>\n <SearchIcon fontSize='small' />\n </InputAdornment>\n ),\n endAdornment: local ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n edge='end'\n aria-label={resolved.clearAriaLabel}\n onClick={handleClear}\n >\n <ClearIcon fontSize='small' />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }","<TextField\n inputRef={inputRef}\n size='small'\n fullWidth\n variant='filled'\n placeholder={resolved.placeholder}\n value={local}\n onChange={handleSearchTextChange}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n // The Searcher only mounts when the user explicitly toggles the\n // SearcherToggle action — focusing the input on mount matches user\n // intent, so the jsx-a11y/no-autofocus warning is the false-positive\n // case (the rule targets unsolicited autofocus that disorients\n // screen readers).\n // eslint-disable-next-line\n autoFocus\n aria-label={resolved.placeholder}\n sx={styles.input}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position='start'>\n <SearchIcon fontSize='small' />\n </InputAdornment>\n ),\n endAdornment: local ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n edge='end'\n aria-label={resolved.clearAriaLabel}\n onClick={handleClear}\n >\n <ClearIcon fontSize='small' />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />","placeholder","_c","_temp","SearchIcon","ClearIcon","styles","styles","Icon = StackedBarChartIcon","{\n initialEnabled = false,\n labels,\n icon: Icon = StackedBarChartIcon,\n iconProps,\n}: StackToggleProps","initialEnabled = false","{ ...DEFAULT_STACK_TOGGLE_LABELS, ...labels }","{\n initialEnabled,\n }","{ ...styles.toggle, ...(enabled && styles.toggleActive) }","enabled && styles.toggleActive","<Icon fontSize='small' {...iconProps} />","<IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>","<Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>","_c","StackedBarChartIcon","styles","Tooltip","styles","Icon = CloseIcon","{\n labels,\n icon: Icon = CloseIcon,\n iconProps,\n}: ShowAllToggleProps","{ ...DEFAULT_SHOW_ALL_LABELS, ...labels }","() => setShowAll(id, false)","<Icon fontSize='small' {...iconProps} />","<IconButton\n size='small'\n aria-label={_labels.toggle}\n aria-pressed\n onClick={() => setShowAll(id, false)}\n sx={styles.toggle}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>","toggle","<Tooltip title={_labels.toggle}>\n <IconButton\n size='small'\n aria-label={_labels.toggle}\n aria-pressed\n onClick={() => setShowAll(id, false)}\n sx={styles.toggle}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>","_c","CloseIcon","styles","Tooltip","styles","Icon = HighlightAltIcon","{\n initialEnabled = false,\n brushType = 'lineX',\n brushMode = 'multiple',\n selection,\n labels,\n icon: Icon = HighlightAltIcon,\n iconProps,\n}: BrushToggleProps","initialEnabled = false","brushType = 'lineX'","brushMode = 'multiple'","{ ...DEFAULT_BRUSH_TOGGLE_LABELS, ...labels }","{ initialEnabled }","() => {\n if (!chart) return undefined\n if (!enabled) {\n // Disabled: exit brush cursor and wipe any drawn rectangles.\n chart.dispatchAction({ type: 'takeGlobalCursor' })\n chart.dispatchAction({ type: 'brush', areas: [] })\n return undefined\n }\n\n const enterBrush = (): void => {\n chart.dispatchAction({\n type: 'takeGlobalCursor',\n key: 'brush',\n brushOption: { brushType, brushMode },\n })\n }\n\n // Every `setOption` clears the global cursor. Re-dispatch after\n // each chart render so `brushMode: 'multiple'` stays usable across\n // selection-driven re-renders, RelativeData toggles, etc.\n const onFinished = (): void => enterBrush()\n chart.on('finished', onFinished)\n enterBrush()\n\n return () => {\n chart.off('finished', onFinished)\n }\n }","[chart, enabled, brushType, brushMode]","() => {\n if (!chart || !enabled) return\n if (selection?.length === 0) {\n chart.dispatchAction({ type: 'brush', areas: [] })\n }\n }","length","[chart, enabled, selection]","{ ...styles.toggle, ...(enabled && styles.toggleActive) }","enabled && styles.toggleActive","<Icon fontSize='small' {...iconProps} />","<IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n className={enabled ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>","enabled ? 'active' : undefined","<Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n className={enabled ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>","_c","HighlightAltIcon","styles","Tooltip","styles","initialScale = 'max'","Icon = PercentIcon","{\n initialEnabled = false,\n scale: initialScale = 'max',\n locale,\n labels,\n icon: Icon = PercentIcon,\n iconProps,\n transform,\n}: RelativeDataProps","initialEnabled = false","{ ...DEFAULT_RELATIVE_DATA_LABELS, ...labels }","(s) =>\n s.transformStates[DATA_DESCRIPTOR.id]?.scale as RelativeScale | undefined","{ descriptor: DATA_DESCRIPTOR, fn: transform ?? toRelativeData }","transform ?? toRelativeData","{\n descriptor: AXIS_DESCRIPTOR,\n fn: scale === 'total' ? toRelativeTotalAxis : identity,\n }","scale === 'total' ? toRelativeTotalAxis : identity","[\n { descriptor: DATA_DESCRIPTOR, fn: transform ?? toRelativeData },\n {\n descriptor: AXIS_DESCRIPTOR,\n fn: scale === 'total' ? toRelativeTotalAxis : identity,\n },\n ]","useMemo<readonly TransformPair[]>(\n () => [\n { descriptor: DATA_DESCRIPTOR, fn: transform ?? toRelativeData },\n {\n descriptor: AXIS_DESCRIPTOR,\n fn: scale === 'total' ? toRelativeTotalAxis : identity,\n },\n ],\n [transform, scale],\n )","{\n initialEnabled,\n }","() => {\n if (persistedScale === undefined)\n writeScale(id, initialScale, initialEnabled)\n }","[id, persistedScale, initialScale, initialEnabled]","(next: RelativeScale) => {\n writeScale(id, next, initialEnabled)\n setEnabled(true)\n setAnchorEl(null)\n }","createPercentFormatter(locale)","useMemo(\n () => createPercentFormatter(locale),\n [locale],\n )","(s) => s.rawFormatter","() => {\n getWidgetStore(id).setState({\n formatter: enabled ? percentFormatter : rawFormatter,\n })\n }","[id, enabled, percentFormatter, rawFormatter]","{ ...styles.toggle, ...(enabled && styles.toggleActive) }","enabled && styles.toggleActive","<Icon fontSize='small' {...iconProps} />","<IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>","<Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>","(e) => setAnchorEl(e.currentTarget)","<ArrowDropDownIcon />","<IconButton\n size='small'\n aria-label={_labels.scaleMenu}\n aria-haspopup='true'\n aria-expanded={anchorEl ? 'true' : undefined}\n onClick={(e) => setAnchorEl(e.currentTarget)}\n sx={styles.arrow}\n >\n <ArrowDropDownIcon />\n </IconButton>","scaleMenu","anchorEl ? 'true' : undefined","<Tooltip title={_labels.scaleMenu}>\n <IconButton\n size='small'\n aria-label={_labels.scaleMenu}\n aria-haspopup='true'\n aria-expanded={anchorEl ? 'true' : undefined}\n onClick={(e) => setAnchorEl(e.currentTarget)}\n sx={styles.arrow}\n >\n <ArrowDropDownIcon />\n </IconButton>\n </Tooltip>","() => setAnchorEl(null)","{ vertical: 'bottom', horizontal: 'right' }","{ vertical: 'top', horizontal: 'right' }","SCALES.map((option) => (\n <MenuItem\n key={option}\n selected={option === scale}\n onClick={() => selectScale(option)}\n >\n <ListItemText>\n {option === 'max' ? _labels.scaleMax : _labels.scaleTotal}\n </ListItemText>\n </MenuItem>\n ))","scaleMax","scaleTotal","<Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n {SCALES.map((option) => (\n <MenuItem\n key={option}\n selected={option === scale}\n onClick={() => selectScale(option)}\n >\n <ListItemText>\n {option === 'max' ? _labels.scaleMax : _labels.scaleTotal}\n </ListItemText>\n </MenuItem>\n ))}\n </Menu>","Boolean(anchorEl)","<Box sx={styles.group}>\n <Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n <Tooltip title={_labels.scaleMenu}>\n <IconButton\n size='small'\n aria-label={_labels.scaleMenu}\n aria-haspopup='true'\n aria-expanded={anchorEl ? 'true' : undefined}\n onClick={(e) => setAnchorEl(e.currentTarget)}\n sx={styles.arrow}\n >\n <ArrowDropDownIcon />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n {SCALES.map((option) => (\n <MenuItem\n key={option}\n selected={option === scale}\n onClick={() => selectScale(option)}\n >\n <ListItemText>\n {option === 'max' ? _labels.scaleMax : _labels.scaleTotal}\n </ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </Box>","s","_c","PercentIcon","_temp","_temp2","styles","Tooltip","ArrowDropDownIcon","styles","EnterIcon = FullscreenIcon","ExitIcon = FullscreenExitIcon","{\n labels,\n enterIcon: EnterIcon = FullscreenIcon,\n exitIcon: ExitIcon = FullscreenExitIcon,\n iconProps,\n}: FullScreenTriggerProps","{ ...DEFAULT_FULLSCREEN_LABELS, ...labels }","(s) => s.isFullScreen ?? false","() => {\n getWidgetStore(id).setState({\n isFullScreen: !open,\n } as Partial<FullScreenWidgetState>)\n }","useCallback(() => {\n getWidgetStore(id).setState({\n isFullScreen: !open,\n } as Partial<FullScreenWidgetState>)\n }, [id, open])","{ ...styles.trigger, ...(open && styles.triggerActive) }","open && styles.triggerActive","<TriggerIcon fontSize='small' {...iconProps} />","<IconButton\n size='small'\n aria-label={triggerLabel}\n aria-pressed={open}\n onClick={handleToggle}\n className={open ? 'active' : undefined}\n sx={{ ...styles.trigger, ...(open && styles.triggerActive) }}\n >\n <TriggerIcon fontSize='small' {...iconProps} />\n </IconButton>","open ? 'active' : undefined","<Tooltip title={triggerLabel}>\n <IconButton\n size='small'\n aria-label={triggerLabel}\n aria-pressed={open}\n onClick={handleToggle}\n className={open ? 'active' : undefined}\n sx={{ ...styles.trigger, ...(open && styles.triggerActive) }}\n >\n <TriggerIcon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>","CloseSvg = CloseIcon","{\n children,\n title,\n actions,\n paperSx,\n labels,\n closeIcon: CloseSvg = CloseIcon,\n iconProps,\n}: FullScreenSlotProps","theme.breakpoints.down('sm')","breakpoints","() => {\n getWidgetStore(id).setState({\n isFullScreen: false,\n } as Partial<FullScreenWidgetState>)\n }","useCallback(() => {\n getWidgetStore(id).setState({\n isFullScreen: false,\n } as Partial<FullScreenWidgetState>)\n }, [id])","() => {\n const dialogId = fullScreenStoreId(id)\n if (wasOpen.current && !open && hasWidgetStore(dialogId)) {\n getWidgetStore(id).setState(\n copiedState(getWidgetStore(dialogId).getState()),\n )\n }\n wasOpen.current = open\n }","[id, open]","(inDialog: boolean) =>\n typeof children === 'function' ? children(inDialog) : children","render(false)","<Box sx={styles.inlineSlot}>{render(false)}</Box>","fullBleed ? undefined : { paper: { sx: resolvePaperSx(paperSx) } }","<Typography\n variant='subtitle1'\n component='span'\n sx={styles.titleText}\n >\n {title}\n </Typography>","<CloseSvg fontSize='small' {...iconProps} />","<IconButton\n size='small'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>","close","<Tooltip title={_labels.close}>\n <IconButton\n size='small'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>","<Box sx={styles.dialogActions}>\n {actions}\n <Tooltip title={_labels.close}>\n <IconButton\n size='small'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n </Box>","<DialogTitle id={titleId} component='div' sx={styles.dialogTitle}>\n <Typography\n variant='subtitle1'\n component='span'\n sx={styles.titleText}\n >\n {title}\n </Typography>\n <Box sx={styles.dialogActions}>\n {actions}\n <Tooltip title={_labels.close}>\n <IconButton\n size='small'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n </Box>\n </DialogTitle>","render(true)","<DialogContent sx={styles.dialogContent}>\n {render(true)}\n </DialogContent>","<DialogStore sourceId={id}>\n <DialogTitle id={titleId} component='div' sx={styles.dialogTitle}>\n <Typography\n variant='subtitle1'\n component='span'\n sx={styles.titleText}\n >\n {title}\n </Typography>\n <Box sx={styles.dialogActions}>\n {actions}\n <Tooltip title={_labels.close}>\n <IconButton\n size='small'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n </Box>\n </DialogTitle>\n <DialogContent sx={styles.dialogContent}>\n {render(true)}\n </DialogContent>\n </DialogStore>","<Dialog\n open={open}\n onClose={handleClose}\n fullScreen={fullBleed}\n // Edge-to-edge owns the sizing; the floor and cap would fight it.\n slotProps={\n fullBleed ? undefined : { paper: { sx: resolvePaperSx(paperSx) } }\n }\n aria-labelledby={titleId}\n // Deliberately no z-index override. Raising the dialog above the\n // tooltip layer also raises it above everything its own body opens —\n // MUI portals menus and tooltips to `document.body`, so a Download\n // menu (`zIndex.modal`, 1300) or a Tooltip (1500) ends up painted\n // under a dialog at 1501 and its items can't be clicked. At the\n // default modal layer the menu portals after the dialog and wins on\n // DOM order, and the tooltip wins on z-index.\n //\n // A Toolbox popover opened from inside the dialog portals after it\n // too, so it stays above the dialog — the right layer for it.\n >\n <DialogStore sourceId={id}>\n <DialogTitle id={titleId} component='div' sx={styles.dialogTitle}>\n <Typography\n variant='subtitle1'\n component='span'\n sx={styles.titleText}\n >\n {title}\n </Typography>\n <Box sx={styles.dialogActions}>\n {actions}\n <Tooltip title={_labels.close}>\n <IconButton\n size='small'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n </Box>\n </DialogTitle>\n <DialogContent sx={styles.dialogContent}>\n {render(true)}\n </DialogContent>\n </DialogStore>\n </Dialog>","<>\n <Box sx={styles.inlineSlot}>{render(false)}</Box>\n <Dialog\n open={open}\n onClose={handleClose}\n fullScreen={fullBleed}\n // Edge-to-edge owns the sizing; the floor and cap would fight it.\n slotProps={\n fullBleed ? undefined : { paper: { sx: resolvePaperSx(paperSx) } }\n }\n aria-labelledby={titleId}\n // Deliberately no z-index override. Raising the dialog above the\n // tooltip layer also raises it above everything its own body opens —\n // MUI portals menus and tooltips to `document.body`, so a Download\n // menu (`zIndex.modal`, 1300) or a Tooltip (1500) ends up painted\n // under a dialog at 1501 and its items can't be clicked. At the\n // default modal layer the menu portals after the dialog and wins on\n // DOM order, and the tooltip wins on z-index.\n //\n // A Toolbox popover opened from inside the dialog portals after it\n // too, so it stays above the dialog — the right layer for it.\n >\n <DialogStore sourceId={id}>\n <DialogTitle id={titleId} component='div' sx={styles.dialogTitle}>\n <Typography\n variant='subtitle1'\n component='span'\n sx={styles.titleText}\n >\n {title}\n </Typography>\n <Box sx={styles.dialogActions}>\n {actions}\n <Tooltip title={_labels.close}>\n <IconButton\n size='small'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n </Box>\n </DialogTitle>\n <DialogContent sx={styles.dialogContent}>\n {render(true)}\n </DialogContent>\n </DialogStore>\n </Dialog>\n </>","{\n sourceId,\n children,\n}: {\n sourceId: string\n children: ReactNode\n}","fullScreenStoreId(sourceId)","(s) => ({\n data: s.rawData,\n isLoading: s.isLoading,\n isFetching: s.isFetching,\n error: s.error,\n formatter: s.rawFormatter,\n labelFormatter: s.labelFormatter,\n })","() => {\n const store = createWidgetStore(dialogId, live)\n store.setState(copiedState(getWidgetStore(sourceId).getState()))\n setWidgetStoreEntry(dialogId, store)\n return store\n }","() => {\n let dialogChart: ECharts | null = null\n const unsubscribe = subscribeEchartInstance(dialogId, (chart) => {\n // Published from inside the chart's init, before its first\n // setOption, so the dialog's own option merges on top of the copy.\n // The empty chart takes the card's whole option: the legend, dataZoom\n // and brush areas need the card's components (axes, brush) to land on.\n const card = liveChart(sourceId)\n if (chart && card) copyChartState(card, chart, card.getOption())\n dialogChart = chart\n })\n return () => {\n unsubscribe()\n const card = liveChart(sourceId)\n if (card && dialogChart && !dialogChart.isDisposed()) {\n copyChartState(dialogChart, card, viewState(dialogChart))\n }\n }\n }","[dialogId, sourceId]","card","<Provider id={dialogId} {...live}>\n {children}\n </Provider>","_c","FullscreenIcon","FullscreenExitIcon","_temp","styles","Tooltip","CloseIcon","_temp2","_Fragment","_temp3","styles","LockSvg = LockIcon","UnlockSvg = LockOpenIcon","{\n selection,\n lockedItems,\n onLockChange,\n labels,\n lockIcon: LockSvg = LockIcon,\n unlockIcon: UnlockSvg = LockOpenIcon,\n iconProps,\n filterFn = filterByLockedItems,\n filterKey,\n}: LockSelectionProps<K>","filterFn = filterByLockedItems","{ ...DEFAULT_LOCK_SELECTION_LABELS, ...labels }","{\n initialEnabled: isLocked,\n }","() => {\n if (enabled !== isLocked) setEnabled(isLocked)\n }","[enabled, isLocked, setEnabled]","() => {\n if (isLocked) {\n onLockChange([])\n } else {\n onLockChange([...selection])\n }\n }","useCallback(() => {\n if (isLocked) {\n onLockChange([])\n } else {\n onLockChange([...selection])\n }\n }, [isLocked, onLockChange, selection])","{ ...styles.toggle, ...(isLocked && styles.toggleActive) }","isLocked && styles.toggleActive","<Icon fontSize='small' {...iconProps} />","<span>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={isLocked}\n disabled={!canToggle}\n onClick={handleToggle}\n sx={{ ...styles.toggle, ...(isLocked && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </span>","!canToggle","<Tooltip title={tooltip}>\n <span>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={isLocked}\n disabled={!canToggle}\n onClick={handleToggle}\n sx={{ ...styles.toggle, ...(isLocked && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </span>\n </Tooltip>","() => {\n filterFnRef.current = filterFn\n }","(data: unknown) => filterFnRef.current(data, lockedItems, filterKey)","useCallback(\n (data: unknown) => filterFnRef.current(data, lockedItems, filterKey),\n [lockedItems, filterKey],\n )","[{ descriptor: LOCK_SELECTION_DESCRIPTOR, fn }]","useMemo(() => [{ descriptor: LOCK_SELECTION_DESCRIPTOR, fn }], [fn])","_c","LockIcon","LockOpenIcon","styles","Tooltip","<path\n fill='currentColor'\n fillRule='evenodd'\n d='M14.25 2.25H3.75c-.825 0-1.5.675-1.5 1.5v10.5c0 .825.675 1.5 1.5 1.5h10.5c.825 0 1.5-.675 1.5-1.5V3.75c0-.825-.675-1.5-1.5-1.5m-3.75 12h-3V3.75h3zM3.75 3.75H6v10.5H3.75zM12 14.25V3.75h2.25v10.5z'\n clipRule='evenodd'\n />","<SvgIcon viewBox='0 0 18 18' {...props}>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M14.25 2.25H3.75c-.825 0-1.5.675-1.5 1.5v10.5c0 .825.675 1.5 1.5 1.5h10.5c.825 0 1.5-.675 1.5-1.5V3.75c0-.825-.675-1.5-1.5-1.5m-3.75 12h-3V3.75h3zM3.75 3.75H6v10.5H3.75zM12 14.25V3.75h2.25v10.5z'\n clipRule='evenodd'\n />\n </SvgIcon>","_c","HandleIcon = DragIndicatorIcon","{\n id,\n label,\n dragHandleIcon: HandleIcon = DragIndicatorIcon,\n}: SortableColumnItemProps","{ id }","CSS.Transform.toString(\n transform ? { ...transform, x: 0 } : null,\n )","{\n transform: CSS.Transform.toString(\n transform ? { ...transform, x: 0 } : null,\n ),\n transition,\n }","{ ...styles.item, ...(isDragging && styles.itemDragging) }","isDragging && styles.itemDragging","{\n ...styles.dragHandle,\n ...(isDragging && styles.dragHandleVisible),\n }","isDragging && styles.dragHandleVisible","<HandleIcon\n className='change-column-drag-handle'\n sx={{\n ...styles.dragHandle,\n ...(isDragging && styles.dragHandleVisible),\n }}\n />","<ListItemText>{label}</ListItemText>","<MenuItem\n ref={setNodeRef}\n style={transformStyle}\n {...attributes}\n {...listeners}\n disableGutters\n role='menuitem'\n tabIndex={0}\n sx={{ ...styles.item, ...(isDragging && styles.itemDragging) }}\n >\n <HandleIcon\n className='change-column-drag-handle'\n sx={{\n ...styles.dragHandle,\n ...(isDragging && styles.dragHandleVisible),\n }}\n />\n <ListItemText>{label}</ListItemText>\n </MenuItem>","_c","DragIndicatorIcon","Icon = ChangeColumnIcon","{\n columns,\n labels,\n icon: Icon = ChangeColumnIcon,\n iconProps,\n dragHandleIcon,\n}: ChangeColumnProps","{ ...DEFAULT_CHANGE_COLUMN_LABELS, ...labels }","(s) => s.columnOrder","useMemo(() => {\n const masterIds = columns.map((c) => c.id)\n if (!columnOrder || columnOrder.length === 0) return masterIds\n // Set lookup so membership tests stay O(1) regardless of column count.\n const masterIdSet = new Set(masterIds)\n const seen = new Set<string>()\n const out: string[] = []\n for (const cid of columnOrder) {\n if (masterIdSet.has(cid) && !seen.has(cid)) {\n out.push(cid)\n seen.add(cid)\n }\n }\n for (const cid of masterIds) {\n if (!seen.has(cid)) out.push(cid)\n }\n return out\n }, [columnOrder, columns])","(c) => c.id","cid","new Map(columns.map((c) => [c.id, c]))","(c) => [c.id, c]","out","c","useMemo(() => {\n const byId = new Map(columns.map((c) => [c.id, c]))\n // Single pass instead of map().filter() — skips unknown ids inline.\n const out: ChangeColumnItem[] = []\n for (const cid of orderedIds) {\n const c = byId.get(cid)\n if (c != null) out.push(c)\n }\n return out\n }, [orderedIds, columns])","{\n coordinateGetter: sortableKeyboardCoordinates,\n }","(e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation()\n setAnchorEl(e.currentTarget)\n }","useCallback((e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation()\n setAnchorEl(e.currentTarget)\n }, [])","() => setAnchorEl(null)","useCallback(() => setAnchorEl(null), [])","(event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = orderedIds.indexOf(String(active.id))\n const newIndex = orderedIds.indexOf(String(over.id))\n if (oldIndex === -1 || newIndex === -1) return\n const next = arrayMove([...orderedIds], oldIndex, newIndex)\n getWidgetStore(id).setState({\n columnOrder: next,\n } as Partial<ChangeColumnWidgetState>)\n }","useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = orderedIds.indexOf(String(active.id))\n const newIndex = orderedIds.indexOf(String(over.id))\n if (oldIndex === -1 || newIndex === -1) return\n const next = arrayMove([...orderedIds], oldIndex, newIndex)\n getWidgetStore(id).setState({\n columnOrder: next,\n } as Partial<ChangeColumnWidgetState>)\n },\n [id, orderedIds],\n )","{ ...styles.toggle, ...(isOpen && styles.toggleActive) }","isOpen && styles.toggleActive","<Icon fontSize='small' {...iconProps} />","<IconButton\n size='small'\n aria-label={_labels.trigger}\n aria-pressed={isOpen}\n aria-haspopup='true'\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleOpen}\n className={isOpen ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(isOpen && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>","trigger","isOpen ? 'true' : undefined","isOpen ? 'active' : undefined","isOpen ? 'change-column-menu' : undefined","<Tooltip title={_labels.trigger}>\n <IconButton\n size='small'\n aria-label={_labels.trigger}\n aria-pressed={isOpen}\n aria-haspopup='true'\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleOpen}\n className={isOpen ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(isOpen && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>","{ vertical: 'bottom', horizontal: 'right' }","{ vertical: 'top', horizontal: 'right' }","{ paper: { sx: styles.menuPaper } }","<ListSubheader disableSticky role='presentation' sx={styles.header}>\n {_labels.title}\n </ListSubheader>","title","orderedColumns.map((column) => (\n <SortableColumnItem\n key={column.id}\n id={column.id}\n label={column.label}\n dragHandleIcon={dragHandleIcon}\n />\n ))","<SortableContext\n items={orderedIds}\n strategy={verticalListSortingStrategy}\n >\n {orderedColumns.map((column) => (\n <SortableColumnItem\n key={column.id}\n id={column.id}\n label={column.label}\n dragHandleIcon={dragHandleIcon}\n />\n ))}\n </SortableContext>","<Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: styles.menuPaper } }}\n >\n <ListSubheader disableSticky role='presentation' sx={styles.header}>\n {_labels.title}\n </ListSubheader>\n <SortableContext\n items={orderedIds}\n strategy={verticalListSortingStrategy}\n >\n {orderedColumns.map((column) => (\n <SortableColumnItem\n key={column.id}\n id={column.id}\n label={column.label}\n dragHandleIcon={dragHandleIcon}\n />\n ))}\n </SortableContext>\n </Menu>","<DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n autoScroll={false}\n >\n <Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: styles.menuPaper } }}\n >\n <ListSubheader disableSticky role='presentation' sx={styles.header}>\n {_labels.title}\n </ListSubheader>\n <SortableContext\n items={orderedIds}\n strategy={verticalListSortingStrategy}\n >\n {orderedColumns.map((column) => (\n <SortableColumnItem\n key={column.id}\n id={column.id}\n label={column.label}\n dragHandleIcon={dragHandleIcon}\n />\n ))}\n </SortableContext>\n </Menu>\n </DndContext>","<>\n <Tooltip title={_labels.trigger}>\n <IconButton\n size='small'\n aria-label={_labels.trigger}\n aria-pressed={isOpen}\n aria-haspopup='true'\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleOpen}\n className={isOpen ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(isOpen && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n autoScroll={false}\n >\n <Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: styles.menuPaper } }}\n >\n <ListSubheader disableSticky role='presentation' sx={styles.header}>\n {_labels.title}\n </ListSubheader>\n <SortableContext\n items={orderedIds}\n strategy={verticalListSortingStrategy}\n >\n {orderedColumns.map((column) => (\n <SortableColumnItem\n key={column.id}\n id={column.id}\n label={column.label}\n dragHandleIcon={dragHandleIcon}\n />\n ))}\n </SortableContext>\n </Menu>\n </DndContext>\n </>","_c","Tooltip","_Fragment","Tooltip$1","useWidgetShallow","useWidgetId","WidgetContext","useWidget","subscribeEchartInstance","getEchartInstance","registerWidgetStore","useEchartInstance","hasWidgetStore","useSingleTransform","getWidgetStore","useTransform","unregisterWidgetStore","setWidgetStoreEntry","toRelativeTotalAxis","RELATIVE_DATA_ID","Provider","$","c","t1","t0","keepAlive","t2","data","error","formatter","id","isFetching","isLoading","labelFormatter","created","createWidgetStore","store","useState","t3","t4","useLayoutEffect","t5","t6","t7","t8","t10","t9","t11","children","filterBySearchText","search","input","needle","series","item","rawName","labelOf","stringifyPrimitive","name","v","DEFAULT_SEARCHER_LABELS","styles$7","theme","SEARCHER_DESCRIPTOR","SearcherToggle","Icon","Search","initialEnabled","labels","resolved","text","selectSearchText","_temp$4","fn","enabled","iconProps","toggle","IconButton","s","setSearcherText","widgetId","value","DEFAULT_DEBOUNCE","Searcher","debounceMs","_temp$3","inputRef","useRef","stored","local","setLocal","focused","setFocused","prevStored","setPrevStored","debounce","debouncedWrite","value_0","handleSearchTextChange","handleClear","InputAdornment","Clear","t12","TextField","addStack","option","cfg","existing","DEFAULT_STACK_TOGGLE_LABELS","styles$6","STACK_DESCRIPTOR","StackToggle","StackedBarChart","_labels","tooltip","DEFAULT_SHOW_ALL_LABELS","styles$5","SHOW_ALL_ID","ShowAllToggle","Close","setShowAll","addBrush","DEFAULT_BRUSH_TOGGLE_LABELS","styles$4","BRUSH_DESCRIPTOR","BrushToggle","brushType","brushMode","HighlightAlt","chart","enterBrush","onFinished","useEffect","selection","t13","t14","t15","t16","isNamedValueArray","toRelativeData","total","acc","d","createPercentFormatter","fmt","locale","DEFAULT_RELATIVE_DATA_LABELS","styles$3","DATA_DESCRIPTOR","AXIS_DESCRIPTOR","identity","RelativeData","initialScale","Percent","persistedScale","_temp$2","scale","transform","pairs","writeScale","anchorEl","setAnchorEl","setEnabled","next","selectScale","percentFormatter","rawFormatter","_temp2$2","t17","t18","t19","t20","t21","t22","t23","t24","ArrowDropDown","t25","t26","t27","t28","t29","t30","t31","SCALES","MenuItem","ListItemText","t32","Menu","t33","Box","s_0","DEFAULT_FULLSCREEN_LABELS","styles$2","FullScreenTrigger","EnterIcon","Fullscreen","ExitIcon","FullscreenExit","open","_temp$1","handleToggle","triggerLabel","TriggerIcon","fullScreenStoreId","NOT_COPIED","copiedState","state","key","FullScreenSlot","CloseSvg","_temp2$1","useTheme","fullBleed","useMediaQuery","handleClose","wasOpen","dialogId","titleId","inDialog","render","paperSx","resolvePaperSx","title","Typography","actions","DialogTitle","DialogContent","DialogStore","Dialog","Fragment","sourceId","live","_temp3$1","dialogChart","unsubscribe","card","liveChart","copyChartState","card_0","viewState","areas","peer","ZOOM_WINDOW_KEYS","legend","l","dataZoom","zoom","k","plain","FullScreen","filterByLockedItems","lockedItems","set","DEFAULT_LOCK_SELECTION_LABELS","styles$1","LOCK_SELECTION_DESCRIPTOR","LockSelection","LockSvg","Lock","UnlockSvg","LockOpen","filterFn","isLocked","canToggle","useMemoPair","filterKey","onLockChange","filterFnRef","ChangeColumnIcon","props","SvgIcon","DEFAULT_CHANGE_COLUMN_LABELS","styles","SortableColumnItem","HandleIcon","DragIndicator","useSortable","CSS","transition","transformStyle","isDragging","label","attributes","listeners","setNodeRef","ChangeColumn","columnOrder","_temp","columns","masterIds","_temp2","masterIdSet","seen","out","cid","cid_0","orderedIds","_temp3","byId","out_0","cid_1","c_1","orderedColumns","sortableKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","handleOpen","event","over","active","oldIndex","newIndex","arrayMove","handleDragEnd","isOpen","ListSubheader","dragHandleIcon","column","SortableContext","verticalListSortingStrategy","DndContext","closestCenter","c_0"],"sources":["../src/widgets/provider/widget-provider.tsx","../src/widgets/actions/searcher/filter.ts","../src/widgets/actions/searcher/labels.ts","../src/widgets/actions/searcher/style.ts","../src/widgets/actions/searcher/searcher-toggle.tsx","../src/widgets/actions/searcher/searcher.tsx","../src/widgets/actions/stack-toggle/transforms.ts","../src/widgets/actions/stack-toggle/labels.ts","../src/widgets/actions/stack-toggle/style.ts","../src/widgets/actions/stack-toggle/stack-toggle.tsx","../src/widgets/actions/show-all/labels.ts","../src/widgets/actions/show-all/style.ts","../src/widgets/actions/show-all/show-all.tsx","../src/widgets/actions/brush-toggle/transforms.ts","../src/widgets/actions/brush-toggle/labels.ts","../src/widgets/actions/brush-toggle/style.ts","../src/widgets/actions/brush-toggle/brush-toggle.tsx","../src/widgets/actions/relative-data/transforms.ts","../src/widgets/actions/relative-data/labels.ts","../src/widgets/actions/relative-data/style.ts","../src/widgets/actions/relative-data/relative-data.tsx","../src/widgets/actions/fullscreen/labels.ts","../src/widgets/actions/fullscreen/style.ts","../src/widgets/actions/fullscreen/fullscreen.tsx","../src/widgets/actions/lock-selection/transforms.ts","../src/widgets/actions/lock-selection/labels.ts","../src/widgets/actions/lock-selection/style.ts","../src/widgets/actions/lock-selection/lock-selection.tsx","../src/widgets/actions/change-column/change-column-icon.tsx","../src/widgets/actions/change-column/labels.ts","../src/widgets/actions/change-column/style.ts","../src/widgets/actions/change-column/sortable-column-item.tsx","../src/widgets/actions/change-column/change-column.tsx"],"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","/**\n * Filters a 2D series of `{name, ...}` records by case-insensitive substring on\n * the label the user sees: `labelFormatter(name)` when a formatter is given,\n * `name` otherwise. Keeps the dataset shape (one inner array per series).\n * Used by the Searcher action's data transform.\n */\nexport function filterBySearchText(\n input: unknown,\n search: string,\n labelFormatter?: (value: string | number) => string | number,\n): unknown {\n if (!search) return input\n const needle = search.toLowerCase()\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!Array.isArray(series)) return series\n return series.filter((item: unknown) => {\n if (item == null) return false\n if (typeof item === 'object' && 'name' in item) {\n const rawName = (item as { name: unknown }).name\n return labelOf(rawName, labelFormatter).toLowerCase().includes(needle)\n }\n return stringifyPrimitive(item).toLowerCase().includes(needle)\n })\n })\n}\n\nfunction labelOf(\n name: unknown,\n labelFormatter?: (value: string | number) => string | number,\n): string {\n if (name == null) return ''\n if (\n labelFormatter &&\n (typeof name === 'string' || typeof name === 'number')\n ) {\n return stringifyPrimitive(labelFormatter(name))\n }\n return stringifyPrimitive(name)\n}\n\nfunction stringifyPrimitive(v: unknown): string {\n if (typeof v === 'string') return v\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n return ''\n}\n","export interface SearcherLabels {\n toggle: string\n placeholder: string\n clearAriaLabel: string\n noResults: string\n}\n\nexport const DEFAULT_SEARCHER_LABELS: SearcherLabels = {\n toggle: 'Search',\n placeholder: 'Search…',\n clearAriaLabel: 'Clear search',\n noResults: 'No matches.',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n input: {\n width: '100%',\n mb: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useCallback, type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport { Search as SearchIcon } from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport {\n getWidgetStore,\n useSingleTransform,\n useWidget,\n useWidgetId,\n type WidgetState,\n} from '../../stores'\nimport { filterBySearchText } from './filter'\nimport { DEFAULT_SEARCHER_LABELS, type SearcherLabels } from './labels'\nimport { styles } from './style'\n\nconst SEARCHER_DESCRIPTOR = {\n id: 'searcher',\n type: 'data' as const,\n order: 20,\n disables: ['lock-selection'],\n}\n\nexport interface SearcherToggleProps {\n labels?: Partial<SearcherLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Whether the searcher transform is enabled on first mount. Defaults\n * to `false` so the toggle renders un-pressed and the\n * `filterBySearchText` transform stays dormant until the user clicks\n * it. Set to `true` for search-first widgets where the input is the\n * primary affordance.\n */\n initialEnabled?: boolean\n}\n\nexport function SearcherToggle({\n labels,\n icon: Icon = SearchIcon,\n iconProps,\n initialEnabled = false,\n}: SearcherToggleProps) {\n const id = useWidgetId()\n const resolved = { ...DEFAULT_SEARCHER_LABELS, ...labels }\n const text = useWidget(id, selectSearchText)\n\n // Matched against the label the user sees, so a formatted name is found\n // by what's on screen rather than by its raw value.\n const labelFormatter = useWidget(id, (s) => s.labelFormatter)\n\n // The transform fn closes over `text` and `labelFormatter`. Memoize via\n // useCallback so identity only changes when either does, allowing\n // useTransform to re-register.\n const fn = useCallback(\n (data: unknown) => filterBySearchText(data, text, labelFormatter),\n [text, labelFormatter],\n )\n\n const { enabled, toggle } = useSingleTransform(id, SEARCHER_DESCRIPTOR, fn, {\n initialEnabled,\n })\n\n return (\n <Tooltip title={resolved.toggle}>\n <IconButton\n size='small'\n aria-label={resolved.toggle}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n\n/** The widget's current search text; empty until someone types. */\nexport function selectSearchText(s: WidgetState): string {\n return (s.transformStates.searcher?.searchText as string | undefined) ?? ''\n}\n\n/**\n * Imperatively writes the search text into the widget store. Used by the\n * Searcher input to update text inside transformStates without going through\n * a re-rendered React subscription.\n */\nexport function setSearcherText(widgetId: string, value: string): void {\n getWidgetStore(widgetId).setState((s) => ({\n transformStates: {\n ...s.transformStates,\n searcher: {\n enabled: s.transformStates.searcher?.enabled ?? false,\n ...s.transformStates.searcher,\n searchText: value,\n },\n },\n }))\n}\n","import { useCallback, useMemo, useRef, useState } from 'react'\nimport { IconButton, InputAdornment, TextField } from '@mui/material'\nimport { Search as SearchIcon } from '@mui/icons-material'\nimport { Clear as ClearIcon } from '@mui/icons-material'\nimport { debounce } from '@carto/ps-utils'\nimport { useWidget, useWidgetId } from '../../stores'\nimport { selectSearchText, setSearcherText } from './searcher-toggle'\nimport { DEFAULT_SEARCHER_LABELS, type SearcherLabels } from './labels'\nimport { styles } from './style'\n\nexport interface SearcherProps {\n labels?: Partial<SearcherLabels>\n /** Debounce delay before the input value is written to the widget store. */\n debounceMs?: number\n}\n\nconst DEFAULT_DEBOUNCE = 300\n\n/**\n * Renders only when the matching `<SearcherToggle />` is enabled — drives the\n * `transformStates['searcher'].searchText` field via a debounced setter.\n */\nexport function Searcher({\n labels,\n debounceMs = DEFAULT_DEBOUNCE,\n}: SearcherProps) {\n const id = useWidgetId()\n const resolved = { ...DEFAULT_SEARCHER_LABELS, ...labels }\n const enabled = useWidget(\n id,\n (s) => s.transformStates.searcher?.enabled ?? false,\n )\n\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n const stored = useWidget(id, selectSearchText)\n // Hydrate from the store so re-toggling the input preserves any prior text.\n const [local, setLocal] = useState(stored)\n\n // Follow text written by another Searcher of the same widget (the card\n // and the fullscreen copy each render one). Skipped while this input has\n // focus: its own debounced write lands late, and adopting it would drop\n // whatever was typed since.\n const [focused, setFocused] = useState(false)\n const [prevStored, setPrevStored] = useState(stored)\n if (stored !== prevStored) {\n setPrevStored(stored)\n if (!focused) setLocal(stored)\n }\n\n const debouncedWrite = useMemo(\n () =>\n debounce(\n (value: unknown) => setSearcherText(id, value as string),\n debounceMs,\n ),\n [id, debounceMs],\n )\n\n const handleSearchTextChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setLocal(value)\n debouncedWrite(value)\n },\n [debouncedWrite],\n )\n\n const handleClear = useCallback(() => {\n setLocal('')\n setSearcherText(id, '')\n // Re-arm the debounced timer with '' so any pending stale write resolves\n // to the cleared value rather than re-applying the previous text.\n debouncedWrite('')\n inputRef.current?.focus()\n }, [id, debouncedWrite])\n\n if (!enabled) return null\n\n return (\n <TextField\n inputRef={inputRef}\n size='small'\n fullWidth\n variant='filled'\n placeholder={resolved.placeholder}\n value={local}\n onChange={handleSearchTextChange}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n // The Searcher only mounts when the user explicitly toggles the\n // SearcherToggle action — focusing the input on mount matches user\n // intent, so the jsx-a11y/no-autofocus warning is the false-positive\n // case (the rule targets unsolicited autofocus that disorients\n // screen readers).\n // eslint-disable-next-line\n autoFocus\n aria-label={resolved.placeholder}\n sx={styles.input}\n slotProps={{\n input: {\n startAdornment: (\n <InputAdornment position='start'>\n <SearchIcon fontSize='small' />\n </InputAdornment>\n ),\n endAdornment: local ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n edge='end'\n aria-label={resolved.clearAriaLabel}\n onClick={handleClear}\n >\n <ClearIcon fontSize='small' />\n </IconButton>\n </InputAdornment>\n ) : null,\n },\n }}\n />\n )\n}\n","/**\n * Stack-mode config transform: marks every series with `stack: 'total'` so\n * ECharts stacks them vertically (bar) or by value (line). Module-level\n * constant so identity is stable across renders — no `useCallback` needed.\n *\n * Widgets that bake series into options at build time get marked in place.\n * Widgets that build series at data-fusion time (`bar`, `histogram`,\n * `timeseries`) have no `series` array yet at config-transform time, so we\n * also emit a single-entry **broadcast template** (`[{ stack: 'total' }]`).\n * Their option factories merge that template into every series they emit\n * at fusion time, so the `stack` mark survives end-to-end.\n */\nexport const addStack = (option: unknown): unknown => {\n if (option == null || typeof option !== 'object') return option\n const cfg = option as Record<string, unknown>\n const existing = Array.isArray(cfg.series) ? cfg.series : []\n const series =\n existing.length === 0\n ? [{ stack: 'total' }]\n : existing.map((s: unknown): unknown => {\n if (s == null || typeof s !== 'object') return s\n return { ...s, stack: 'total' }\n })\n return { ...cfg, series }\n}\n","export interface StackToggleLabels {\n on: string\n off: string\n}\n\nexport const DEFAULT_STACK_TOGGLE_LABELS: StackToggleLabels = {\n on: 'Unstack series',\n off: 'Stack series',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport { StackedBarChart as StackedBarChartIcon } from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport { useSingleTransform, useWidgetId } from '../../stores'\nimport { addStack } from './transforms'\nimport { DEFAULT_STACK_TOGGLE_LABELS, type StackToggleLabels } from './labels'\nimport { styles } from './style'\n\nconst STACK_DESCRIPTOR = {\n id: 'stack-toggle',\n type: 'config' as const,\n order: 30,\n}\n\nexport interface StackToggleProps {\n initialEnabled?: boolean\n labels?: Partial<StackToggleLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\nexport function StackToggle({\n initialEnabled = false,\n labels,\n icon: Icon = StackedBarChartIcon,\n iconProps,\n}: StackToggleProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_STACK_TOGGLE_LABELS, ...labels }\n const { enabled, toggle } = useSingleTransform(\n id,\n STACK_DESCRIPTOR,\n addStack,\n {\n initialEnabled,\n },\n )\n const tooltip = enabled ? _labels.on : _labels.off\n\n return (\n <Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n","export interface ShowAllLabels {\n /** Tooltip + aria-label for the collapse (✕) button shown while expanded. */\n toggle: string\n}\n\nexport const DEFAULT_SHOW_ALL_LABELS: ShowAllLabels = {\n toggle: 'Show less',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport { Close as CloseIcon } from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport { getWidgetStore, useWidgetId } from '../../stores'\nimport { DEFAULT_SHOW_ALL_LABELS, type ShowAllLabels } from './labels'\nimport { styles } from './style'\n\n/**\n * The `show-all` flag is a pure UI signal (no data/config transform): the\n * Category overflow row writes it `true` via {@link setShowAll}, the\n * composer reads it with `useTransformEnabled(id, SHOW_ALL_ID)` to drop the\n * row cap, and this button writes it back `false` to collapse. Stored under\n * `transformStates` so `useTransformEnabled` can observe it like any other\n * action flag — but it never registers a pipeline transform, so toggling it\n * never re-runs the data pipeline.\n */\nexport const SHOW_ALL_ID = 'show-all'\n\nexport interface ShowAllToggleProps {\n labels?: Partial<ShowAllLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\n/**\n * Collapse (✕) affordance shown while a widget is expanded into its\n * \"show all\" state. Clicking it clears the `show-all` flag, returning the\n * widget to its capped view. Mount it conditionally (only while the flag is\n * set) so it doesn't occupy a `Widget.Toolbox` visibility-budget slot when\n * the widget is collapsed.\n */\nexport function ShowAllToggle({\n labels,\n icon: Icon = CloseIcon,\n iconProps,\n}: ShowAllToggleProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_SHOW_ALL_LABELS, ...labels }\n\n return (\n <Tooltip title={_labels.toggle}>\n <IconButton\n size='small'\n aria-label={_labels.toggle}\n aria-pressed\n onClick={() => setShowAll(id, false)}\n sx={styles.toggle}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n\n/**\n * Imperatively writes the `show-all` flag into the widget store. Mirrors\n * {@link setSearcherText} — used by the Category overflow row (to expand)\n * and the {@link ShowAllToggle} button (to collapse) without routing through\n * a re-rendered subscription.\n */\nexport function setShowAll(widgetId: string, value: boolean): void {\n getWidgetStore(widgetId).setState((s) => ({\n transformStates: {\n ...s.transformStates,\n [SHOW_ALL_ID]: {\n ...s.transformStates[SHOW_ALL_ID],\n enabled: value,\n },\n },\n }))\n}\n","/**\n * Brush config transform: enables ECharts' brush component on the option\n * object. Module-level constant — identity stable across renders.\n *\n * Pairs with `replaceMergeKeys: ['brush']` so the pipeline replaces (not\n * merges) the brush config on every config-pipeline run. v1 needed a\n * mousemove re-dispatch hack to keep the brush state across data updates;\n * v2 keeps brush state continuous via `notMerge: false` + dynamic\n * replaceMerge in the EchartUI layer (D6) — no hack required.\n */\nexport const addBrush = (option: unknown): unknown => {\n if (option == null || typeof option !== 'object') return option\n const cfg = option as Record<string, unknown>\n return {\n ...cfg,\n brush: {\n toolbox: ['rect', 'clear'],\n xAxisIndex: 'all',\n brushLink: 'all',\n outOfBrush: { colorAlpha: 0.15 },\n },\n toolbox: {\n ...((cfg.toolbox as object | undefined) ?? {}),\n show: false,\n feature: {\n ...((cfg.toolbox as { feature?: object } | undefined)?.feature ?? {}),\n brush: { type: ['rect', 'clear'] },\n },\n },\n }\n}\n","export interface BrushToggleLabels {\n on: string\n off: string\n}\n\nexport const DEFAULT_BRUSH_TOGGLE_LABELS: BrushToggleLabels = {\n on: 'Disable brush selection',\n off: 'Enable brush selection',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useEffect, type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport { HighlightAlt as HighlightAltIcon } from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport {\n useEchartInstance,\n useSingleTransform,\n useWidgetId,\n} from '../../stores'\nimport { addBrush } from './transforms'\nimport { DEFAULT_BRUSH_TOGGLE_LABELS, type BrushToggleLabels } from './labels'\nimport { styles } from './style'\n\nconst BRUSH_DESCRIPTOR = {\n id: 'brush-toggle',\n type: 'config' as const,\n order: 25,\n}\n\nexport interface BrushToggleProps {\n initialEnabled?: boolean\n /**\n * ECharts brush type. `'lineX'` (default) selects a range on the\n * x-axis — appropriate for bar / histogram / timeseries. `'rect'`\n * selects a 2-D rectangle — use for scatterplot. Other ECharts\n * brush types (`'lineY'`, `'polygon'`) are also accepted.\n */\n brushType?: 'lineX' | 'lineY' | 'rect' | 'polygon'\n /**\n * `'multiple'` (default) lets the user draw additional brushes on\n * top of existing ones. `'single'` replaces the previous brush on\n * each new draw.\n */\n brushMode?: 'multiple' | 'single'\n /**\n * Optional view of the consumer-owned selection. When provided and\n * the array is empty (`[]`), any brush rectangles currently drawn on\n * the chart are wiped — keeps the UI in sync when the parent clears\n * the selection externally (e.g. via `Widget.SelectionSummary`'s\n * `onClear`). Pass the same array that drives `useChartSelection` /\n * the option factory's `selection` input.\n *\n * Leave `undefined` to opt out — the sync effect becomes a no-op.\n */\n selection?: readonly unknown[] | null\n labels?: Partial<BrushToggleLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\n/**\n * Toggle ECharts' brush selection mode. Two-part wiring:\n *\n * 1. The config transform (`addBrush`) installs the `brush`\n * component on the option so brushed items get the\n * `outOfBrush` dim treatment.\n * 2. ECharts only enters \"brush cursor\" mode when something\n * dispatches `takeGlobalCursor({ key: 'brush', ... })`. This\n * component drives that dispatch via {@link useEchartInstance},\n * reacting when the chart instance becomes available (the\n * `BrushToggle` mounts before `Widget.Echart` in tree order, so\n * on first mount the chart isn't ready yet).\n *\n * 3. ECharts clears the global cursor on every `setOption`, so we\n * re-dispatch on each `'finished'` event — required for\n * `brushMode: 'multiple'` to keep working across selection-driven\n * re-renders, RelativeData toggles, etc.\n *\n * Selection events (`brushSelected` / `brushEnd`) flow through the\n * existing `useChartSelection` wiring at the consumer level — no extra\n * plumbing here.\n */\nexport function BrushToggle({\n initialEnabled = false,\n brushType = 'lineX',\n brushMode = 'multiple',\n selection,\n labels,\n icon: Icon = HighlightAltIcon,\n iconProps,\n}: BrushToggleProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_BRUSH_TOGGLE_LABELS, ...labels }\n const { enabled, toggle } = useSingleTransform(\n id,\n BRUSH_DESCRIPTOR,\n addBrush,\n { initialEnabled },\n )\n\n // Reactive read of the live instance — the effect below re-runs when\n // the chart arrives, departs, or re-inits, instead of polling.\n const chart = useEchartInstance(id)\n\n useEffect(() => {\n if (!chart) return undefined\n if (!enabled) {\n // Disabled: exit brush cursor and wipe any drawn rectangles.\n chart.dispatchAction({ type: 'takeGlobalCursor' })\n chart.dispatchAction({ type: 'brush', areas: [] })\n return undefined\n }\n\n const enterBrush = (): void => {\n chart.dispatchAction({\n type: 'takeGlobalCursor',\n key: 'brush',\n brushOption: { brushType, brushMode },\n })\n }\n\n // Every `setOption` clears the global cursor. Re-dispatch after\n // each chart render so `brushMode: 'multiple'` stays usable across\n // selection-driven re-renders, RelativeData toggles, etc.\n const onFinished = (): void => enterBrush()\n chart.on('finished', onFinished)\n enterBrush()\n\n return () => {\n chart.off('finished', onFinished)\n }\n }, [chart, enabled, brushType, brushMode])\n\n // Sync the drawn rectangles with the external selection. When the\n // parent flips `selection` to `[]` (e.g. SelectionSummary's \"Clear\"\n // button), wipe the brush areas so the chart UI matches the data.\n // Dispatching with an empty `areas` array when nothing is drawn is a\n // safe no-op on ECharts, so no extra \"previous value\" bookkeeping is\n // needed. Kept as a separate effect so a parent selection change\n // doesn't tear down / re-attach the `'finished'` listener above.\n useEffect(() => {\n if (!chart || !enabled) return\n if (selection?.length === 0) {\n chart.dispatchAction({ type: 'brush', areas: [] })\n }\n }, [chart, enabled, selection])\n\n const tooltip = enabled ? _labels.on : _labels.off\n\n return (\n <Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n className={enabled ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n","/**\n * Default data-side transform for `RelativeData`: rewrite each\n * `{ name, value }` datum's `value` to its share of the series total\n * expressed as 0–100 (matches v1's range). The companion percent\n * formatter divides by 100 so it can call `Intl.NumberFormat` with\n * `style: 'percent'`.\n *\n * Used by widgets whose series are arrays of `{ name, value }`\n * objects — bar, pie, timeseries, category. Widgets with a different\n * data shape pass their own transform via\n * `<RelativeData transform={...} />`; see `widgets/histogram` and\n * `widgets/scatterplot` for in-tree examples.\n *\n * The denominator is the sum of |value| across the series so mixed-sign\n * series (e.g. cashflow with inflows + outflows) produce sane signed\n * shares-of-magnitude. A series whose total magnitude is zero (all-zero\n * or empty input) is returned unchanged so a stalled or empty data set\n * doesn't show misleading 0% values. Series whose shape doesn't match\n * the named-value pattern fall through untouched.\n */\n\ninterface NamedValue {\n name: unknown\n value: number\n [k: string]: unknown\n}\n\nfunction isNamedValueArray(v: unknown): v is NamedValue[] {\n if (!Array.isArray(v)) return false\n return v.every(\n (item) =>\n item != null &&\n typeof item === 'object' &&\n 'value' in item &&\n typeof (item as { value: unknown }).value === 'number',\n )\n}\n\nexport const toRelativeData = (input: unknown): unknown => {\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!isNamedValueArray(series)) return series\n const total = series.reduce((acc, d) => acc + Math.abs(d.value), 0)\n if (total <= 0) return series\n return series.map((d) => ({ ...d, value: (d.value / total) * 100 }))\n })\n}\n\n/**\n * Build a percent formatter using `Intl.NumberFormat`. The returned function\n * expects values in the 0–100 range (output of {@link toRelativeData}) and\n * divides by 100 internally before calling `style: 'percent'`.\n *\n * Locale: passed straight to `Intl.NumberFormat`. Falls back to the runtime\n * default when omitted.\n */\nexport function createPercentFormatter(\n locale?: string,\n): (value: number) => string {\n const fmt = new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n })\n return (value: number) => {\n if (typeof value !== 'number' || !Number.isFinite(value))\n return String(value)\n return fmt.format(value / 100)\n }\n}\n","export interface RelativeDataLabels {\n on: string\n off: string\n scaleMenu: string\n scaleMax: string\n scaleTotal: string\n}\n\nexport const DEFAULT_RELATIVE_DATA_LABELS: RelativeDataLabels = {\n on: 'Show absolute values',\n off: 'Show relative values',\n scaleMenu: 'Relative scale',\n scaleMax: 'Relative to max',\n scaleTotal: 'Relative to total',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n group: {\n display: 'inline-flex',\n alignItems: 'center',\n },\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n arrow: {\n p: 0,\n width: 16,\n borderRadius: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 18 },\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useEffect, useMemo, useState, type ComponentType } from 'react'\nimport {\n Box,\n IconButton,\n ListItemText,\n Menu,\n MenuItem,\n type SvgIconProps,\n} from '@mui/material'\nimport {\n ArrowDropDown as ArrowDropDownIcon,\n Percent as PercentIcon,\n} from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport {\n getWidgetStore,\n useTransform,\n useWidget,\n useWidgetId,\n type TransformPair,\n} from '../../stores'\nimport { createPercentFormatter, toRelativeData } from './transforms'\nimport {\n RELATIVE_DATA_ID,\n toRelativeTotalAxis,\n type RelativeScale,\n} from './scale'\nimport { DEFAULT_RELATIVE_DATA_LABELS, type RelativeDataLabels } from './labels'\nimport { styles } from './style'\n\nconst DATA_DESCRIPTOR = {\n id: RELATIVE_DATA_ID,\n type: 'data' as const,\n order: 15,\n}\n\nconst AXIS_DESCRIPTOR = {\n id: 'relative-data-axis',\n type: 'config' as const,\n order: 15,\n}\n\nconst identity = (option: unknown) => option\n\nexport interface RelativeDataProps {\n initialEnabled?: boolean\n /**\n * Initial bar scale: `'max'` (the largest item fills its bar) or\n * `'total'` (bars end at 100%). Values are the share of the total\n * either way. Only seeds the store — the menu, or a write to\n * `transformStates['relative-data'].scale`, changes it afterwards.\n */\n scale?: RelativeScale\n /**\n * BCP-47 locale tag forwarded to `Intl.NumberFormat`. Defaults to the\n * runtime locale.\n */\n locale?: string\n labels?: Partial<RelativeDataLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Data-side transform that rewrites the widget's series into their\n * relative (0–100) form. Defaults to {@link toRelativeData}, which\n * handles the canonical `{ name, value }[]` shape (bar / pie /\n * timeseries / category). Widgets with a different data shape pass\n * their own — `toRelativeHistogramData` for histogram's `number[]`,\n * `toRelativeScatterplotData` for scatter's `[x, y][]`.\n *\n * Should be a stable top-level reference; inline `(data) => ...`\n * literals re-register the transform every render.\n */\n transform?: (data: unknown) => unknown\n}\n\n/**\n * Toggle between absolute and relative (percentage) values, as a split\n * button: the toggle plus an arrow that opens the scale menu.\n *\n * - **Data side**: a single data transform ({@link toRelativeData}) registered\n * through `useSingleTransform`. When disabled, the pipeline skips it and the\n * derived `data` reverts to `rawData` automatically.\n * - **Formatter side**: an effect writes directly to `state.formatter`. When\n * enabled it installs the Intl-based percent formatter; when disabled it\n * reads `state.rawFormatter` (the consumer-supplied original, always live)\n * and writes it back to `formatter`. No \"original\" snapshot is captured —\n * `rawFormatter` is the original.\n * - **Scale**: lives in `transformStates['relative-data'].scale` next to\n * `enabled`, so duplicate mounts (Toolbox inline + overflow) and\n * `keepAlive` remounts agree on it. It never changes the values; under\n * `'total'` a config transform pins the ECharts value axis to 100%, and\n * Category reads it through `selectRelativeScale`.\n */\nexport function RelativeData({\n initialEnabled = false,\n scale: initialScale = 'max',\n locale,\n labels,\n icon: Icon = PercentIcon,\n iconProps,\n transform,\n}: RelativeDataProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_RELATIVE_DATA_LABELS, ...labels }\n\n const persistedScale = useWidget(\n id,\n (s) =>\n s.transformStates[DATA_DESCRIPTOR.id]?.scale as RelativeScale | undefined,\n )\n const scale = persistedScale ?? initialScale\n\n const pairs = useMemo<readonly TransformPair[]>(\n () => [\n { descriptor: DATA_DESCRIPTOR, fn: transform ?? toRelativeData },\n {\n descriptor: AXIS_DESCRIPTOR,\n fn: scale === 'total' ? toRelativeTotalAxis : identity,\n },\n ],\n [transform, scale],\n )\n\n const { enabled, setEnabled, toggle } = useTransform(id, pairs, {\n initialEnabled,\n })\n\n useEffect(() => {\n if (persistedScale === undefined)\n writeScale(id, initialScale, initialEnabled)\n }, [id, persistedScale, initialScale, initialEnabled])\n\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const selectScale = (next: RelativeScale) => {\n writeScale(id, next, initialEnabled)\n setEnabled(true)\n setAnchorEl(null)\n }\n\n const percentFormatter = useMemo(\n () => createPercentFormatter(locale),\n [locale],\n )\n\n // Subscribe to rawFormatter so the effect re-runs and re-applies after the\n // consumer's formatter prop changes (Provider syncs the new prop to both\n // rawFormatter and formatter — re-applying restores the percent override\n // when relative is on, and tracks the new rawFormatter when off).\n const rawFormatter = useWidget(id, (s) => s.rawFormatter)\n\n useEffect(() => {\n getWidgetStore(id).setState({\n formatter: enabled ? percentFormatter : rawFormatter,\n })\n }, [id, enabled, percentFormatter, rawFormatter])\n\n const tooltip = enabled ? _labels.on : _labels.off\n\n return (\n <Box sx={styles.group}>\n <Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n <Tooltip title={_labels.scaleMenu}>\n <IconButton\n size='small'\n aria-label={_labels.scaleMenu}\n aria-haspopup='true'\n aria-expanded={anchorEl ? 'true' : undefined}\n onClick={(e) => setAnchorEl(e.currentTarget)}\n sx={styles.arrow}\n >\n <ArrowDropDownIcon />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(null)}\n variant='menu'\n elevation={8}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n {SCALES.map((option) => (\n <MenuItem\n key={option}\n selected={option === scale}\n onClick={() => selectScale(option)}\n >\n <ListItemText>\n {option === 'max' ? _labels.scaleMax : _labels.scaleTotal}\n </ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </Box>\n )\n}\n\nconst SCALES: readonly RelativeScale[] = ['max', 'total']\n\nfunction writeScale(id: string, scale: RelativeScale, initialEnabled: boolean) {\n getWidgetStore(id).setState((s) => ({\n transformStates: {\n ...s.transformStates,\n [DATA_DESCRIPTOR.id]: {\n // `useSingleTransform` seeds `enabled` itself; this fallback only\n // keeps the slot well-typed if the scale lands first.\n enabled: initialEnabled,\n ...s.transformStates[DATA_DESCRIPTOR.id],\n scale,\n },\n },\n }))\n}\n","export interface FullScreenLabels {\n open: string\n close: string\n}\n\nexport const DEFAULT_FULLSCREEN_LABELS: FullScreenLabels = {\n open: 'Open in full screen',\n close: 'Exit full screen',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n // Inline shell where the portaled body lives when fullscreen is closed.\n // Real flex-column box (not `display: contents`) so that:\n // 1. when the body is moved into the modal, we can pin a `min-height`\n // to keep the widget card from collapsing — the inline shell is\n // empty for that interval, and a layout-less wrapper would make\n // the card squish a frame before the modal covers it (visible\n // blink).\n // 2. nested `flex: 1` (e.g. Widget.State's CaptureBox) still grows —\n // this shell preserves the column-flex inheritance it would have\n // had directly under `Widget.Content`.\n // `gap: 1` mirrors `Widget.Content`'s gap so the body's siblings\n // (Subheader / capture box / note) keep their spacing.\n inlineSlot: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minHeight: 0,\n gap: 1,\n },\n trigger: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n triggerActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n // Sized by its content, between a floor and the viewport. The floor is\n // what makes this safe: every widget body in the library is `width: 100%`\n // (they're built to fill their card) and an ECharts canvas has no\n // intrinsic size at all, so asking the content how big it wants to be\n // gets no answer — without a floor the modal collapses to a few hundred\n // pixels. Content bigger than the floor grows, up to the viewport cap.\n //\n // Floor and cap are both viewport units so the modal scales with the\n // device: a px floor would be wider than the screen on a phone.\n //\n // Only applies from `sm` up — below that the dialog goes edge-to-edge and\n // sizes itself (see `fullScreen` in fullscreen.tsx).\n dialogPaper: {\n width: 'auto',\n height: 'auto',\n minWidth: '70vw',\n minHeight: '70vh',\n maxWidth: '90vw',\n maxHeight: '90vh',\n },\n dialogTitle: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n py: 3,\n pr: 3,\n pb: 2,\n },\n // Header buttons + close icon. Mirrors `Widget.Actions`' row so the modal\n // header reads like the wrapper's summary row — minus the hover-fade,\n // which makes no sense once the widget owns the whole screen.\n dialogActions: {\n display: 'flex',\n alignItems: 'center',\n gap: 0.5,\n flexShrink: 0,\n },\n titleText: {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n dialogContent: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n py: 3,\n px: 2.5,\n overflow: 'auto',\n // Lets the flex children grow into the dialog's height (and shrink below\n // their content size) instead of being floored by it — without this the\n // chart can't use the space the modal gives it.\n minHeight: 0,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import type { ECharts } from 'echarts'\nimport {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react'\nimport {\n Box,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n useMediaQuery,\n useTheme,\n type SvgIconProps,\n type CSSObject,\n type SxProps,\n type Theme,\n} from '@mui/material'\nimport { Fullscreen as FullscreenIcon } from '@mui/icons-material'\nimport { FullscreenExit as FullscreenExitIcon } from '@mui/icons-material'\nimport { Close as CloseIcon } from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport { Provider } from '../../provider/widget-provider'\nimport {\n createWidgetStore,\n getEchartInstance,\n getWidgetStore,\n hasWidgetStore,\n setWidgetStoreEntry,\n subscribeEchartInstance,\n useWidget,\n useWidgetId,\n useWidgetShallow,\n type WidgetState,\n} from '../../stores'\nimport { DEFAULT_FULLSCREEN_LABELS, type FullScreenLabels } from './labels'\nimport type { FullScreenWidgetState } from './types'\nimport { styles } from './style'\n\nexport interface FullScreenTriggerProps {\n labels?: Partial<FullScreenLabels>\n enterIcon?: ComponentType<SvgIconProps>\n exitIcon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\nexport interface FullScreenSlotProps {\n /**\n * The widget body. Rendered twice, identically: in the card, and again in\n * the dialog while it's open. The components inside don't know which copy\n * they are; the dialog's just runs on a widget store of its own — a copy\n * of the card's taken on open, handed back to the card on close — so read\n * the widget id with `useWidgetId()` inside the body rather than closing\n * over the card's `id`.\n *\n * @deprecated The function form `(isFullScreen) => ReactNode` still works\n * (`false` for the card, `true` for the dialog copy) but will be removed\n * in the next major: pass the body as plain children.\n */\n children: ReactNode | ((isFullScreen: boolean) => ReactNode)\n /** Header text rendered above the body when the modal is open. */\n title?: ReactNode\n /**\n * Buttons rendered in the modal header, to the left of the close icon —\n * the fullscreen counterpart of `<Widget.Actions>`, which lives in the\n * wrapper's summary row and is covered by the dialog. Pass the same\n * elements you compose there (typically `<Widget.Download>`); the\n * fullscreen trigger is intentionally not among them, since the close\n * icon already exits.\n */\n actions?: ReactNode\n /**\n * Per-widget override merged over the default `90vw x 90vh` dialog paper.\n * Charts want the default (their canvas grows to fill it); content-sized\n * widgets (Range, Markdown) pass their own width / `height: 'auto'` so the\n * modal doesn't leave a large empty box around them.\n *\n * Shallow-merged over the default, same as `Widget.Actions`' `sx`: pass a\n * plain style object, not the array or theme-callback form.\n */\n paperSx?: SxProps<Theme>\n labels?: Partial<FullScreenLabels>\n closeIcon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\n/**\n * Toggle button placed inside `<Widget.Actions>`. Reads / writes\n * {@link FullScreenWidgetState.isFullScreen} on the per-widget store. The\n * matching modal is rendered by {@link FullScreenSlot} (typically inside\n * `<Widget.Content>`).\n */\nfunction FullScreenTrigger({\n labels,\n enterIcon: EnterIcon = FullscreenIcon,\n exitIcon: ExitIcon = FullscreenExitIcon,\n iconProps,\n}: FullScreenTriggerProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_FULLSCREEN_LABELS, ...labels }\n const open = useWidget<boolean, FullScreenWidgetState>(\n id,\n (s) => s.isFullScreen ?? false,\n )\n\n const handleToggle = useCallback(() => {\n getWidgetStore(id).setState({\n isFullScreen: !open,\n } as Partial<FullScreenWidgetState>)\n }, [id, open])\n\n const triggerLabel = open ? _labels.close : _labels.open\n const TriggerIcon = open ? ExitIcon : EnterIcon\n\n return (\n <Tooltip title={triggerLabel}>\n <IconButton\n size='small'\n aria-label={triggerLabel}\n aria-pressed={open}\n onClick={handleToggle}\n className={open ? 'active' : undefined}\n sx={{ ...styles.trigger, ...(open && styles.triggerActive) }}\n >\n <TriggerIcon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n\n/** Id of the widget store the dialog copy runs on. */\nexport function fullScreenStoreId(id: string): string {\n return `${id}::fullscreen`\n}\n\n// Fields a copy doesn't carry between the card's store and the dialog's:\n// what the consumer feeds through Provider props (kept live on both), what\n// the pipeline derives, the transforms (functions each copy's actions\n// register in their own store) and the open flag itself.\nconst NOT_COPIED = new Set<string>([\n 'rawData',\n 'data',\n 'dataTransforms',\n 'configTransforms',\n 'isLoading',\n 'isFetching',\n 'error',\n 'rawFormatter',\n 'labelFormatter',\n 'isFullScreen',\n])\n\n/** The UI state a copy carries: toggles, search text, sort, page… */\nfunction copiedState(state: WidgetState): Partial<WidgetState> {\n return Object.fromEntries(\n Object.entries(state).filter(([key]) => !NOT_COPIED.has(key)),\n ) as Partial<WidgetState>\n}\n\n/**\n * Body wrapper. The card keeps its copy of the body while the dialog is\n * open, and the dialog mounts a second one on a store of its own: a copy\n * of the card's UI state taken on open, and handed back to the card when\n * the dialog closes. While open the two don't affect each other. MUI\n * mounts the dialog copy on open and unmounts it after the close\n * transition, which drops its store.\n */\nfunction FullScreenSlot({\n children,\n title,\n actions,\n paperSx,\n labels,\n closeIcon: CloseSvg = CloseIcon,\n iconProps,\n}: FullScreenSlotProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_FULLSCREEN_LABELS, ...labels }\n const open = useWidget<boolean, FullScreenWidgetState>(\n id,\n (s) => s.isFullScreen ?? false,\n )\n // Below `sm` the dialog goes edge-to-edge (MUI's own answer for phones).\n // A paper sized as a fraction of a 390px viewport is narrower than the\n // card the widget sits in, and forcing it wider just eats the dialog's\n // margins — on a screen that small, fullscreen should mean fullscreen.\n const theme = useTheme()\n const fullBleed = useMediaQuery(theme.breakpoints.down('sm'))\n const handleClose = useCallback(() => {\n getWidgetStore(id).setState({\n isFullScreen: false,\n } as Partial<FullScreenWidgetState>)\n }, [id])\n\n // Closing hands the dialog's state back to the card. Keyed on the flag,\n // not on the close button, so every way out (Escape, backdrop, a Trigger)\n // counts. The dialog copy is still mounted here — it unmounts after the\n // transition — so its store still exists.\n const wasOpen = useRef(open)\n useLayoutEffect(() => {\n const dialogId = fullScreenStoreId(id)\n if (wasOpen.current && !open && hasWidgetStore(dialogId)) {\n getWidgetStore(id).setState(\n copiedState(getWidgetStore(dialogId).getState()),\n )\n }\n wasOpen.current = open\n }, [id, open])\n\n const titleId = `widget-fullscreen-title-${id}`\n const render = (inDialog: boolean) =>\n typeof children === 'function' ? children(inDialog) : children\n\n return (\n <>\n <Box sx={styles.inlineSlot}>{render(false)}</Box>\n <Dialog\n open={open}\n onClose={handleClose}\n fullScreen={fullBleed}\n // Edge-to-edge owns the sizing; the floor and cap would fight it.\n slotProps={\n fullBleed ? undefined : { paper: { sx: resolvePaperSx(paperSx) } }\n }\n aria-labelledby={titleId}\n // Deliberately no z-index override. Raising the dialog above the\n // tooltip layer also raises it above everything its own body opens —\n // MUI portals menus and tooltips to `document.body`, so a Download\n // menu (`zIndex.modal`, 1300) or a Tooltip (1500) ends up painted\n // under a dialog at 1501 and its items can't be clicked. At the\n // default modal layer the menu portals after the dialog and wins on\n // DOM order, and the tooltip wins on z-index.\n //\n // A Toolbox popover opened from inside the dialog portals after it\n // too, so it stays above the dialog — the right layer for it.\n >\n <DialogStore sourceId={id}>\n <DialogTitle id={titleId} component='div' sx={styles.dialogTitle}>\n <Typography\n variant='subtitle1'\n component='span'\n sx={styles.titleText}\n >\n {title}\n </Typography>\n <Box sx={styles.dialogActions}>\n {actions}\n <Tooltip title={_labels.close}>\n <IconButton\n size='small'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n </Box>\n </DialogTitle>\n <DialogContent sx={styles.dialogContent}>\n {render(true)}\n </DialogContent>\n </DialogStore>\n </Dialog>\n </>\n )\n}\n\n/**\n * Gives the dialog copy (header actions included) its own widget store,\n * seeded from the card's when the dialog mounts, and keeps the consumer's\n * props (data, loading, error, formatters) flowing into it from the card\n * while it's open. Does the same for the chart, if the widget has one: the\n * dialog's starts from the card's and hands its state back on close.\n */\nfunction DialogStore({\n sourceId,\n children,\n}: {\n sourceId: string\n children: ReactNode\n}) {\n const dialogId = fullScreenStoreId(sourceId)\n // What the consumer feeds the card through its Provider props, in the\n // same shape, so the dialog's Provider gets exactly the same.\n const live = useWidgetShallow(sourceId, (s) => ({\n data: s.rawData,\n isLoading: s.isLoading,\n isFetching: s.isFetching,\n error: s.error,\n formatter: s.rawFormatter,\n labelFormatter: s.labelFormatter,\n }))\n // Runs before the Provider below looks the id up, so it adopts this\n // store instead of creating an empty one.\n useState(() => {\n const store = createWidgetStore(dialogId, live)\n store.setState(copiedState(getWidgetStore(sourceId).getState()))\n setWidgetStoreEntry(dialogId, store)\n return store\n })\n\n // A layout effect on purpose. It subscribes before the dialog chart's\n // (passive) init effect publishes it, and its cleanup runs before that\n // chart's (passive) dispose — so the chart is still alive to copy from.\n useLayoutEffect(() => {\n let dialogChart: ECharts | null = null\n const unsubscribe = subscribeEchartInstance(dialogId, (chart) => {\n // Published from inside the chart's init, before its first\n // setOption, so the dialog's own option merges on top of the copy.\n // The empty chart takes the card's whole option: the legend, dataZoom\n // and brush areas need the card's components (axes, brush) to land on.\n const card = liveChart(sourceId)\n if (chart && card) copyChartState(card, chart, card.getOption())\n dialogChart = chart\n })\n return () => {\n unsubscribe()\n const card = liveChart(sourceId)\n if (card && dialogChart && !dialogChart.isDisposed()) {\n copyChartState(dialogChart, card, viewState(dialogChart))\n }\n }\n }, [dialogId, sourceId])\n\n return (\n <Provider id={dialogId} {...live}>\n {children}\n </Provider>\n )\n}\n\nfunction liveChart(id: string): ECharts | null {\n const chart = getEchartInstance(id)\n return chart && !chart.isDisposed() ? chart : null\n}\n\n/**\n * Put on `chart` what `peer` is showing: the legend selection, the dataZoom\n * window and any drawn brush areas, which live in the ECharts instance\n * rather than the widget store. `option` is what of `peer`'s option to merge\n * into `chart`.\n */\nfunction copyChartState(\n peer: ECharts,\n chart: ECharts,\n option: Parameters<ECharts['setOption']>[0],\n): void {\n chart.setOption(option)\n // The pointer was over `peer`, not `chart`: drop the tooltip and axis\n // pointer that came along, or they'd stay drawn until the next hover.\n chart.dispatchAction({ type: 'hideTip' })\n chart.dispatchAction({ type: 'updateAxisPointer', currTrigger: 'leave' })\n // Brush areas sit on the brush model, not in `getOption()`. `getModel` is\n // private in the typings but stable across 5.x.\n // ponytail: private API; if it goes away, track areas from the `brush` event instead.\n const areas = (\n peer as unknown as {\n getModel?: () => {\n getComponent: (type: string) => { areas?: unknown[] } | undefined\n }\n }\n )\n .getModel?.()\n .getComponent('brush')?.areas\n if (areas?.length) chart.dispatchAction({ type: 'brush', areas })\n}\n\ninterface ViewStateOption {\n // setOption takes an indexed option.\n [key: string]: unknown\n legend?: { selected?: Record<string, boolean> }[]\n dataZoom?: Record<string, unknown>[]\n}\n\nconst ZOOM_WINDOW_KEYS = ['start', 'end', 'startValue', 'endValue'] as const\n\n/**\n * The part of `peer`'s option that is user view state. Only this goes back\n * to the card on close: the dialog's full option also carries its own\n * styling (value labels, bigger axis text), and merging it into the card\n * would leave that styling behind once the dialog closes.\n */\nfunction viewState(peer: ECharts): ViewStateOption {\n const { legend, dataZoom } = peer.getOption() as ViewStateOption\n const state: ViewStateOption = {}\n if (legend?.some((l) => l.selected)) {\n state.legend = legend.map((l) =>\n l.selected ? { selected: l.selected } : {},\n )\n }\n if (dataZoom?.length) {\n state.dataZoom = dataZoom.map((zoom) =>\n Object.fromEntries(\n ZOOM_WINDOW_KEYS.filter((k) => zoom[k] !== undefined).map((k) => [\n k,\n zoom[k],\n ]),\n ),\n )\n }\n return state\n}\n\n/**\n * Merge a caller's `paperSx` over the default paper.\n *\n * An explicit `width` / `height` also clears the default's floor on that\n * axis: `minWidth: 70vw` is 1008px on a 1440px screen, so a caller asking\n * for `width: 960` would silently get 1008 and the escape hatch wouldn't\n * escape. The viewport cap stays — a size larger than the screen helps\n * nobody — and a caller who wants their own floor or cap can still set\n * `minWidth` / `maxWidth` directly, since their values are spread last.\n */\nfunction resolvePaperSx(paperSx: SxProps<Theme> | undefined): SxProps<Theme> {\n // Plain-object form only, as the prop documents — the array and\n // theme-callback forms of `SxProps` wouldn't survive a shallow merge.\n const plain = (paperSx ?? {}) as CSSObject\n return {\n ...styles.dialogPaper,\n ...(plain.width !== undefined && { minWidth: 0 }),\n ...(plain.height !== undefined && { minHeight: 0 }),\n ...plain,\n }\n}\n\n/**\n * Namespace export. Consumers compose with:\n *\n * ```tsx\n * <Widget.Actions>\n * <Widget.FullScreen.Trigger />\n * </Widget.Actions>\n * <Widget.Content>\n * <Widget.FullScreen.Slot title={title} actions={<Widget.Download items={items} />}>\n * <Body />\n * </Widget.FullScreen.Slot>\n * </Widget.Content>\n * ```\n */\nexport const FullScreen = {\n Trigger: FullScreenTrigger,\n Slot: FullScreenSlot,\n}\n","/**\n * Filters a 2D series of `{name, ...}` records, keeping only items whose\n * `name` is in the locked set. Multi-series shape is preserved (one inner\n * array per series). Used by the LockSelection action's data transform.\n */\nexport function filterByLockedItems(\n input: unknown,\n lockedItems: readonly (string | number)[],\n): unknown {\n if (lockedItems.length === 0) return input\n if (!Array.isArray(input)) return input\n const set = new Set<string | number>(lockedItems)\n return input.map((series: unknown): unknown => {\n if (!Array.isArray(series)) return series\n return series.filter((item: unknown) => {\n if (item == null) return false\n if (typeof item === 'object' && 'name' in item) {\n const name = (item as { name: unknown }).name\n if (typeof name === 'string' || typeof name === 'number') {\n return set.has(name)\n }\n return false\n }\n return false\n })\n })\n}\n","export interface LockSelectionLabels {\n lock: string\n unlock: string\n disabled: string\n}\n\nexport const DEFAULT_LOCK_SELECTION_LABELS: LockSelectionLabels = {\n lock: 'Lock selection',\n unlock: 'Unlock selection',\n disabled: 'Select rows to lock',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n type ComponentType,\n} from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport { Lock as LockIcon } from '@mui/icons-material'\nimport { LockOpen as LockOpenIcon } from '@mui/icons-material'\nimport { Tooltip } from '../../../components'\nimport { useTransform, useWidgetId } from '../../stores'\nimport type { TransformPair } from '../../stores'\nimport { filterByLockedItems } from './transforms'\nimport {\n DEFAULT_LOCK_SELECTION_LABELS,\n type LockSelectionLabels,\n} from './labels'\nimport { styles } from './style'\n\nconst LOCK_SELECTION_DESCRIPTOR = {\n id: 'lock-selection',\n type: 'data' as const,\n order: 30,\n}\n\nexport type LockSelectionKey = string | number\n\nexport interface LockSelectionProps<\n K extends LockSelectionKey = LockSelectionKey,\n> {\n /**\n * Currently-selected items (destination-owned). On lock, this set is\n * snapshotted into `lockedItems` via `onLockChange`.\n */\n selection: readonly K[]\n /**\n * Currently-locked items (destination-owned). When non-empty, the widget's\n * data is filtered to these items via the registered transform.\n */\n lockedItems: readonly K[]\n /**\n * Fires when the user toggles the lock. The destination is responsible for\n * persisting the new locked set (and re-feeding it via `lockedItems`).\n */\n onLockChange: (next: readonly K[]) => void\n labels?: Partial<LockSelectionLabels>\n /** Lock icon (default: `LockIcon`). */\n lockIcon?: ComponentType<SvgIconProps>\n /** Unlock icon (default: `LockOpenIcon`). */\n unlockIcon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Data transform applied while locked. Defaults to {@link filterByLockedItems}\n * (keeps only `{name, ...}` items whose `name` is in `lockedItems`, across a\n * `X[][]` series shape — matches Bar/Pie/Category/Timeseries data). Widgets\n * whose data shape or selection identity differs (bin index, composite\n * point key, flat rows) pass their own — e.g. Histogram's\n * `filterHistogramByLockedBins`, Scatterplot's\n * `filterScatterplotByLockedPoints`, Table's `filterTableByLockedRows`.\n */\n filterFn?: (\n data: unknown,\n lockedItems: readonly K[],\n filterKey?: string | number,\n ) => unknown\n /**\n * Configuration the filter needs beyond the locked set — Table's\n * `keyColumn`, say. Handed to `filterFn` as its third argument, so the\n * filter can go by reference:\n * `filterFn={filterTableByLockedRows} filterKey={keyColumn}`.\n *\n * Pass it rather than capturing it: `filterFn`'s identity is not a\n * pipeline dependency (see {@link useMemoPair}), so a fresh closure over a\n * new key is picked up while nothing re-runs.\n */\n filterKey?: string | number\n}\n\n/**\n * Action that pins the current selection so the widget's data filters down\n * to those items even as the user changes selections. Selection and lock\n * state are destination-owned; this component is a controlled UI + a data\n * transform registered against the widget's pipeline.\n *\n * The trigger is disabled when there is nothing to lock and nothing locked.\n */\nexport function LockSelection<K extends LockSelectionKey = LockSelectionKey>({\n selection,\n lockedItems,\n onLockChange,\n labels,\n lockIcon: LockSvg = LockIcon,\n unlockIcon: UnlockSvg = LockOpenIcon,\n iconProps,\n filterFn = filterByLockedItems,\n filterKey,\n}: LockSelectionProps<K>) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_LOCK_SELECTION_LABELS, ...labels }\n const isLocked = lockedItems.length > 0\n const canToggle = isLocked || selection.length > 0\n\n // Pair memoized on lockedItems identity — useTransform re-registers the fn\n // (which closes over the current locked set) whenever the destination feeds\n // a new array. setEnabled drives the middleware-level `enabled` flag.\n const pairs = useMemoPair(lockedItems, filterFn, filterKey)\n const { enabled, setEnabled } = useTransform(id, pairs, {\n initialEnabled: isLocked,\n })\n\n // Keep middleware `enabled` in sync with destination-owned `isLocked`. The\n // pipeline only short-circuits the transform when enabled === false, so\n // toggling here is what makes lock/unlock actually take effect.\n useEffect(() => {\n if (enabled !== isLocked) setEnabled(isLocked)\n }, [enabled, isLocked, setEnabled])\n\n const handleToggle = useCallback(() => {\n if (isLocked) {\n onLockChange([])\n } else {\n onLockChange([...selection])\n }\n }, [isLocked, onLockChange, selection])\n\n const tooltip = !canToggle\n ? _labels.disabled\n : isLocked\n ? _labels.unlock\n : _labels.lock\n const Icon = isLocked ? UnlockSvg : LockSvg\n\n return (\n <Tooltip title={tooltip}>\n <span>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={isLocked}\n disabled={!canToggle}\n onClick={handleToggle}\n sx={{ ...styles.toggle, ...(isLocked && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </span>\n </Tooltip>\n )\n}\n\n/**\n * Builds a stable `[{ descriptor, fn }]` pair where `fn` closes over the\n * latest `lockedItems` and reads `filterFn` from a ref kept fresh via\n * `useEffect` (never mutated during render — that would break the compiler's\n * memoization guarantees). `filterFn` is deliberately NOT a `useCallback`\n * dep: callers may pass an inline closure, which has a new identity every\n * render, and depending on it would rebuild the transform pair (and\n * everything downstream of it) every render instead of only when\n * `lockedItems` actually changes. `fn` itself is invoked later by the data\n * pipeline, not during this component's render, so reading a ref there is\n * safe.\n *\n * The cost of that ref is that captured config is invisible to the pipeline,\n * which is what {@link LockSelectionProps.filterKey} is for.\n */\nfunction useMemoPair<K extends LockSelectionKey>(\n lockedItems: readonly K[],\n filterFn: (\n data: unknown,\n lockedItems: readonly K[],\n filterKey?: string | number,\n ) => unknown,\n filterKey: string | number | undefined,\n): readonly TransformPair[] {\n const filterFnRef = useRef(filterFn)\n useEffect(() => {\n filterFnRef.current = filterFn\n })\n // Forwarded, not just declared as a dependency: the React Compiler infers\n // deps from the body and drops any it never uses (even `void filterKey`,\n // eliminated first), so declaring it alone would change nothing.\n const fn = useCallback(\n (data: unknown) => filterFnRef.current(data, lockedItems, filterKey),\n [lockedItems, filterKey],\n )\n return useMemo(() => [{ descriptor: LOCK_SELECTION_DESCRIPTOR, fn }], [fn])\n}\n","import { SvgIcon, type SvgIconProps } from '@mui/material'\n\nexport function ChangeColumnIcon(props: SvgIconProps) {\n return (\n <SvgIcon viewBox='0 0 18 18' {...props}>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M14.25 2.25H3.75c-.825 0-1.5.675-1.5 1.5v10.5c0 .825.675 1.5 1.5 1.5h10.5c.825 0 1.5-.675 1.5-1.5V3.75c0-.825-.675-1.5-1.5-1.5m-3.75 12h-3V3.75h3zM3.75 3.75H6v10.5H3.75zM12 14.25V3.75h2.25v10.5z'\n clipRule='evenodd'\n />\n </SvgIcon>\n )\n}\n","export interface ChangeColumnLabels {\n trigger: string\n title?: string\n reset: string\n}\n\nexport const DEFAULT_CHANGE_COLUMN_LABELS: ChangeColumnLabels = {\n trigger: 'Change column order',\n title: 'Column reorder',\n reset: 'Reset to default',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n menuPaper: {\n overflow: 'hidden',\n },\n header: {\n color: 'text.secondary',\n backgroundColor: 'transparent',\n typography: 'caption',\n px: 2,\n py: 0.75,\n },\n item: {\n position: 'relative',\n cursor: 'grab',\n px: 2,\n touchAction: 'none',\n '&:hover .change-column-drag-handle': {\n opacity: 1,\n },\n '&:focus-visible': {\n outline: '2px solid',\n outlineColor: 'primary.main',\n outlineOffset: -2,\n },\n '&:focus-visible .change-column-drag-handle': {\n opacity: 1,\n },\n },\n itemDragging: {\n opacity: 0.5,\n cursor: 'grabbing',\n },\n dragHandle: {\n position: 'absolute',\n left: 0,\n top: '50%',\n transform: 'translateY(-50%)',\n color: 'text.secondary',\n fontSize: 18,\n opacity: 0,\n transition: 'opacity 0.1s',\n '@media (hover: none)': {\n opacity: 1,\n },\n },\n dragHandleVisible: {\n opacity: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ListItemText, MenuItem } from '@mui/material'\nimport { DragIndicator as DragIndicatorIcon } from '@mui/icons-material'\nimport type { ComponentType, ReactNode } from 'react'\nimport type { SvgIconProps } from '@mui/material'\nimport { styles } from './style'\n\nexport interface SortableColumnItemProps {\n id: string\n label: ReactNode\n dragHandleIcon?: ComponentType<SvgIconProps>\n}\n\n/**\n * Draggable menu item used inside ChangeColumn's `<DndContext>`. Wraps a\n * MUI `<MenuItem>` so it inherits keyboard / theming behavior, and exposes\n * the dnd-kit listeners on the whole row so the user can grab anywhere on\n * the row to reorder.\n */\nexport function SortableColumnItem({\n id,\n label,\n dragHandleIcon: HandleIcon = DragIndicatorIcon,\n}: SortableColumnItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const transformStyle = {\n transform: CSS.Transform.toString(\n transform ? { ...transform, x: 0 } : null,\n ),\n transition,\n }\n\n return (\n <MenuItem\n ref={setNodeRef}\n style={transformStyle}\n {...attributes}\n {...listeners}\n disableGutters\n role='menuitem'\n tabIndex={0}\n sx={{ ...styles.item, ...(isDragging && styles.itemDragging) }}\n >\n <HandleIcon\n className='change-column-drag-handle'\n sx={{\n ...styles.dragHandle,\n ...(isDragging && styles.dragHandleVisible),\n }}\n />\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n}\n","import { useCallback, useMemo, useState, type ComponentType } from 'react'\nimport {\n DndContext,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport {\n IconButton,\n ListSubheader,\n Menu,\n type SvgIconProps,\n} from '@mui/material'\nimport { Tooltip } from '../../../components'\nimport { getWidgetStore, useWidget, useWidgetId } from '../../stores'\nimport { ChangeColumnIcon } from './change-column-icon'\nimport { DEFAULT_CHANGE_COLUMN_LABELS, type ChangeColumnLabels } from './labels'\nimport { SortableColumnItem } from './sortable-column-item'\nimport { styles } from './style'\nimport type { ChangeColumnWidgetState } from './types'\nimport type { ReactNode } from 'react'\n\nexport interface ChangeColumnItem {\n id: string\n label: ReactNode\n}\n\nexport interface ChangeColumnProps {\n /**\n * Master list of columns (id + label) in their default order. The current\n * effective order is derived by combining this list with the widget's\n * `columnOrder` extension state.\n */\n columns: readonly ChangeColumnItem[]\n labels?: Partial<ChangeColumnLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n dragHandleIcon?: ComponentType<SvgIconProps>\n}\n\n/**\n * Action that lets users reorder columns via drag-and-drop. The new order is\n * persisted on the widget store as `columnOrder` (an array of ids) on the\n * {@link ChangeColumnWidgetState} extension. `<Table>` (and other column-aware\n * bridges) merge that order with their own `columns` prop via\n * `resolveColumns()` from the table primitives.\n *\n * Returns `null` when there are fewer than two columns to reorder.\n */\nexport function ChangeColumn({\n columns,\n labels,\n icon: Icon = ChangeColumnIcon,\n iconProps,\n dragHandleIcon,\n}: ChangeColumnProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_CHANGE_COLUMN_LABELS, ...labels }\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n\n const columnOrder = useWidget<\n readonly string[] | undefined,\n ChangeColumnWidgetState\n >(id, (s) => s.columnOrder)\n\n const orderedIds = useMemo(() => {\n const masterIds = columns.map((c) => c.id)\n if (!columnOrder || columnOrder.length === 0) return masterIds\n // Set lookup so membership tests stay O(1) regardless of column count.\n const masterIdSet = new Set(masterIds)\n const seen = new Set<string>()\n const out: string[] = []\n for (const cid of columnOrder) {\n if (masterIdSet.has(cid) && !seen.has(cid)) {\n out.push(cid)\n seen.add(cid)\n }\n }\n for (const cid of masterIds) {\n if (!seen.has(cid)) out.push(cid)\n }\n return out\n }, [columnOrder, columns])\n\n const orderedColumns = useMemo(() => {\n const byId = new Map(columns.map((c) => [c.id, c]))\n // Single pass instead of map().filter() — skips unknown ids inline.\n const out: ChangeColumnItem[] = []\n for (const cid of orderedIds) {\n const c = byId.get(cid)\n if (c != null) out.push(c)\n }\n return out\n }, [orderedIds, columns])\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const handleOpen = useCallback((e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation()\n setAnchorEl(e.currentTarget)\n }, [])\n const handleClose = useCallback(() => setAnchorEl(null), [])\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = orderedIds.indexOf(String(active.id))\n const newIndex = orderedIds.indexOf(String(over.id))\n if (oldIndex === -1 || newIndex === -1) return\n const next = arrayMove([...orderedIds], oldIndex, newIndex)\n getWidgetStore(id).setState({\n columnOrder: next,\n } as Partial<ChangeColumnWidgetState>)\n },\n [id, orderedIds],\n )\n\n if (columns.length < 2) return null\n\n const isOpen = Boolean(anchorEl)\n\n return (\n <>\n <Tooltip title={_labels.trigger}>\n <IconButton\n size='small'\n aria-label={_labels.trigger}\n aria-pressed={isOpen}\n aria-haspopup='true'\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleOpen}\n className={isOpen ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(isOpen && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n autoScroll={false}\n >\n <Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: styles.menuPaper } }}\n >\n <ListSubheader disableSticky role='presentation' sx={styles.header}>\n {_labels.title}\n </ListSubheader>\n <SortableContext\n items={orderedIds}\n strategy={verticalListSortingStrategy}\n >\n {orderedColumns.map((column) => (\n <SortableColumnItem\n key={column.id}\n id={column.id}\n label={column.label}\n dragHandleIcon={dragHandleIcon}\n />\n ))}\n </SortableContext>\n </Menu>\n </DndContext>\n </>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA2CA,SAAgB8T,EAAA,GAUE;gBAVO,EACvB,OACA,SACA,cACA,eACA,UACA,cACA,mBACA,WAAAG,GACA,gBATuBjU,GAQvBmU,IAAAF,MAAA,KAAA,KAAAhU,GAOyCC;CAGrC,AAAA6T,EAAA,OAAAM,KAAAN,EAAA,OAGAO,KAAAP,EAAA,OACAQ,KAAAR,EAAA,OANiBS,KAAAT,EAAA,OAIjBU,KAAAV,EAAA,OADAW,KAAAX,EAAA,OAIAY,KARqC,UAAM;EAC7C,IAAIrB,EAAekB,CAAE,GAAG,OAAOhB,EAAegB,CAAE;EAChD,IAAMI,IAAUC,EAAkBL,GAAI;GACpC;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EAED,OADAb,EAAoBa,GAAII,CAAO,GACxBA;CACT,GATI,EAAA,KAAAP,GAGA,EAAA,KAAAC,GACA,EAAA,KAAAC,GANiB,EAAA,KAAAC,GAIjB,EAAA,KAAAC,GADA,EAAA,KAAAC,GAIA,EAAA,KAAAC;CARJ,IAAM,CAACG,KAASC,EAAyB7U,CAYxC,GAIeC,GAKbC;CALH,AACsB2T,EAAA,OAAAS,KAAAT,EAAA,OAEUI,KAAAJ,EAAA,QAFNe,KADV,WACd1B,EAAoBoB,GAAIM,CAAK,SAChB;EACX,EAAsBN,GAAI,EAAE,aAAU,CAAC;CACzC,IACC,IAAA;EAACA;EAAIM;EAAOX;CAAS,GAJF,EAAA,KAAAK,GAEU,EAAA,KAAAL,GAFN,EAAA,MAAAW,mDAD1BI,EAAgB/U,GAKbC,CAAsB;CAMTC,IAAAA,GAEbC;CAFH,AAC4ByT,EAAA,QAAAM,KAAAN,EAAA,QAA1Be,KADc,UAAM;EACpB,EAAM,SAAS,EAAE,SAAST,EAAK,CAAC;CAClC,GAAG,IAAA,CAACS,GAAOT,CAAI,GADa,EAAA,MAAAA,GAA1B,EAAA,MAAAS,mDADFI,EAAgB7U,GAEbC,CAAa;CAEAC,IAAAA,GAMbC;CANH,AAIIuT,EAAA,QAAAO,KAAAP,EAAA,QADYU,KAAAV,EAAA,QADDW,KAAAX,EAAA,QADbe,KADc,UAAM;EACpB,EAAM,SAAS;GACb,WAAWJ,KAAa;GACxB,YAAYD,KAAc;GAC1B;EACF,CAAC;CACH,GAAG,IAAA;EAACK;EAAOJ;EAAWD;EAAYH;CAAK,GAFnC,EAAA,MAAAA,GADY,EAAA,MAAAG,GADD,EAAA,MAAAC,GADb,EAAA,MAAAI,mDADFI,EAAgB3U,GAMbC,CAAqC;CAYrCC,IAAAA,GANaC;CAAhB,AAEkBqT,EAAA,QAAAQ,KAAAR,EAAA,QAEdY,KAAAZ,EAAA,QAHFe,KADc,UAAM;EACpB,EAAM,SAAS;GACb,cAAcP;GACd;GACA;EACF,CAAC;CACH,GAAG,IAAA;EAACO;EAAOP;EAAWI;CAAc,GAJlB,EAAA,MAAAJ,GAEd,EAAA,MAAAI,GAHF,EAAA,MAAAG,mDADFI,EAAgBxU,GAMbD,CAAkC;CAE9BE,IAAAA;CAAP,OAA2CoT,EAAA,QAAA2B,KAAA3B,EAAA,QAALS,KAA/B,IAAA,kBAAC5T,EAAAA,UAAD;EAAwB,OAAO4T;EAAK;CAAiC,CAAA,GAAjC,EAAA,MAAAkB,GAAL,EAAA,MAAAlB,2BAA/B7T;AACT;;;ACxGA,SAAgBgV,GACd,GACA,GACA,GACS;CACT,IAAI,CAACC,GAAQ,OAAOC;CACpB,IAAMC,IAASF,EAAO,YAAY;CAElC,OADK,MAAM,QAAQC,CAAK,IACjBA,EAAM,KAAK,MACX,MAAM,QAAQE,CAAM,IAClBA,EAAO,QAAQ,MAAkB;EACtC,IAAIC,KAAQ,MAAM,OAAO;EACzB,IAAI,OAAOA,KAAS,YAAY,UAAUA,GAAM;GAC9C,IAAMC,IAAWD,EAA2B;GAC5C,OAAOE,GAAQD,GAAStB,CAAc,CAAC,CAAC,YAAY,CAAC,CAAC,SAASmB,CAAM;EACvE;EACA,OAAOK,GAAmBH,CAAI,CAAC,CAAC,YAAY,CAAC,CAAC,SAASF,CAAM;CAC/D,CAAC,IARkCC,CASpC,IAXiCF;AAYpC;AAEA,SAASK,GACP,GACA,GACQ;CAQR,OAPIE,KAAQ,OAAa,KAKhBD,GAHPxB,MACC,OAAOyB,KAAS,YAAY,OAAOA,KAAS,YAEnBzB,EAAeyB,CAAI,IAErBA,CAFsB;AAGlD;AAEA,SAASD,GAAmB,GAAoB;CAG9C,OAFI,OAAOE,KAAM,WAAiBA,IAC9B,OAAOA,KAAM,YAAY,OAAOA,KAAM,YAAkB,OAAOA,CAAC,IAC7D;AACT;;;ACtCA,IAAaC,KAA0C;CACrD,QAAQ;CACR,aAAa;CACb,gBAAgB;CAChB,WAAW;AACb,GCVaxV,KAAS;CACpB,QAAQ;EACN,GAAG;EACH,sBAAsB,EAAE,UAAU,GAAG;CACvC;CACA,cAAc,EACZ,aAAa,MAAiB0V,EAAM,QAAQ,QAAQ,aACtD;CACA,OAAO;EACL,OAAO;EACP,IAAI;CACN;AACF,GCCMC,KAAsB;CAC1B,IAAI;CACJ,MAAM;CACN,OAAO;CACP,UAAU,CAAC,gBAAgB;AAC7B;AAgBA,SAAgBC,GAAA,GAKQ;gBALO,EAC7B,WACA,MAAM3V,GACN,cACA,gBAAAqT,MAJ6BpT,GAEvB2V,IAAA1C,MAAA,KAAA,IAAOnS,IAAPf,GAEN8V,IAAAzC,MAAA,KAAA,KAAAnT,GAEMuT,IAAKzB,EAAY,GACN7R;CAAiC,AAAA6S,EAAA,OAAA+C,gBAAjC,IAAA;EAAE,GAAGR;EAAyB,GAAGQ;CAAO,GAAP,EAAA,KAAAA;CAAlD,IAAMC,IAAW7V,GACX8V,IAAO/D,EAAUuB,GAAIyC,EAAgB,GAIrCtC,IAAiB1B,EAAUuB,GAAIrT,EAAuB,GAM1DC;CAAkD,AAAA2S,EAAA,OAAAY,KAAAZ,EAAA,OAANiD,KAA5C,KAAC,MAAkBrB,GAAmBtB,GAAM2C,GAAMrC,CAAc,GAAd,EAAA,KAAAA,GAAN,EAAA,KAAAqC;CAD9C,IAAMG,IAAK9V,GAKiEC;CAC1E,AAAAyS,EAAA,OAAA8C,gBAD0E,IAAA,EAC1E,kBACF,GADE,EAAA,KAAAA;CADF,IAAM,EAAE,YAAS,cAAWtD,EAAmBiB,GAAIiC,IAAqBU,GAAI7V,CAE3E,GASiC8T,IAAAgC,KAAWpV,GAAO,cAA1CT;CAAwBC,AAAAA,EAAAA,OAAAA,gBAAxB,IAAA;EAAE,GAAGQ,GAAO;EAAQ,GAAIR;CAAgC,GAAhCA,EAAAA,KAAAA;CAE5BC,IAAAA;CAAC,AAAAsS,EAAA,OAAA4C,KAAA5C,EAAA,QAA0BsD,KAA3B,IAAA,kBAACV,GAAD;EAAM,UAAS;EAAQ,GAAIU;CAAY,CAAA,GAAtC,EAAA,KAAAV,GAA0B,EAAA,MAAAU;CAP7B3V,IAAAA;CAGgB,AAAAqS,EAAA,QAAAqD,KAAArD,EAAA,QADOpS,EAAAA,UAAAA,EAAAA,QAGjBJ,KAAAA,EAAAA,QAEJE,KAAAA,EAAAA,QAHS6V,KAJX,IAAA,kBAACC,GAAD;EACE,MAAK;EACL,cAAYR,EAAS;EACrB,gBAAcK;EACd,SAASE;EACT,IAAI/V;EAEJE,UAAAA;CACU,CAAA,GALI,EAAA,MAAA2V,GADOzV,EAAAA,MAAAA,EAAAA,QAGjBJ,EAAAA,MAAAA,GAEJE,EAAAA,MAAAA,GAHS,EAAA,MAAA6V;CALb1V,IAAAA;CADF,OAC2BD,EAAAA,QAAAA,EAAAA,UAAAA,EAAAA,QACvBD,KADF,IAAA,kBAACO,GAAD;EAAS,OAAO8U,EAAS;EACvBrV,UAAAA;CASO,CAAA,GAVgBC,EAAAA,MAAAA,EAAAA,QACvBD,EAAAA,MAAAA,2BADFE;AAYJ;AA3BuC,SAAAG,GAAC,GAAA;CAAM,OAAAyV,EAAE;;AA8BhD,SAAgBP,GAAiB,GAAwB;CACvD,OAAQO,EAAE,gBAAgB,UAAU,cAAqC;AAC3E;AAOA,SAAgBC,GAAgB,GAAkB,GAAqB;CACrE,EAAeC,CAAQ,CAAC,CAAC,UAAU,OAAO,EACxC,iBAAiB;EACf,GAAGF,EAAE;EACL,UAAU;GACR,SAASA,EAAE,gBAAgB,UAAU,WAAW;GAChD,GAAGA,EAAE,gBAAgB;GACrB,YAAYG;EACd;CACF,EACF,EAAE;AACJ;;;AClFA,IAAMC,KAAmB;AAMzB,SAAgBC,GAAA,GAGE;gBAHO,EACvB,WACA,YAAA5D,MAFuB/R,GAEvB4V,IAAA7D,MAAA,KAAA,IAAa2D,KAAbzV,GAEMqS,IAAKzB,EAAY,GACN3Q;CAAiC,AAAA2R,EAAA,OAAA+C,gBAAjC,IAAA;EAAE,GAAGR;EAAyB,GAAGQ;CAAO,GAAP,EAAA,KAAAA;CAAlD,IAAMC,IAAW3U,GACXgV,IAAUnE,EACduB,GACAnS,EACF,GAEM2V,IAAWC,EAAgC,IAAI,GAE/CC,IAASjF,EAAUuB,GAAIyC,EAAgB,GAEvC,CAACkB,GAAOC,KAAYrD,EAASmD,CAAM,GAMnC,CAACG,GAASC,KAAcvD,EAAS,EAAK,GACtC,CAACwD,GAAYC,KAAiBzD,EAASmD,CAAM;CACnD,AAAIA,MAAWK,MACbC,EAAcN,CAAM,GACfG,KAASD,EAASF,CAAM;CAMzB5V,IAAAA;CAAoC,AAAAyR,EAAA,OAAAS,gBAApC,KAAC,MAAmBiD,GAAgBjD,GAAImD,CAAe,GAAnB,EAAA,KAAAnD;CADtCjS,IAAAA;CAEE,AAAAwR,EAAA,OAAA+D,KAAA/D,EAAA,OADAzR,KADF,IAAAmW,EACEnW,GACAwV,CACF,GADE,EAAA,KAAAA,GADAxV,EAAAA,KAAAA;CAHN,IAAMoW,IAAiBlW,GAUrBC;CAGE,AAAAsR,EAAA,OAAA2E,gBAHF,KAAC,MAA2C;EAC1C,IAAMhW,IAAQ,EAAE,OAAO;EAEvB,AADA0V,EAAS1V,CAAK,GACdgW,EAAehW,CAAK;CACtB,GADE,EAAA,KAAAgW;CAJJ,IAAME,IAAyBjW,GASCC;CAK9B,AAAAmR,EAAA,OAAA2E,KAAA3E,EAAA,QAHgBS,KAFc,UAAM;EAMpC,AALA4D,EAAS,EAAE,GACXX,GAAgBjD,GAAI,EAAE,GAGtBkE,EAAe,EAAE,GACjBV,EAAS,SAAS,MAAM;CAC1B,GAFE,EAAA,KAAAU,GAHgB,EAAA,MAAAlE;CAFlB,IAAMqE,IAAchW;CASpB,IAAI,CAACuU,GAAS,OAAO;CAWRtU,IAAAA,GACDC;sDADC,UAAMuV,EAAW,EAAI,GACtB,UAAMA,EAAW,EAAK;CAaxBtV,IAAAA;sDAAC,IAAA,kBAAA8V,GAAD;EAAgB,UAAS;EACvB,UAAA,kBAACtV,GAAD,EAAY,UAAS,QAAS,CAAA;CAChB,CAAA;CAEJP,IAAAA;CAMC,AAAA8Q,EAAA,QAAA8E,KAAA9E,EAAA,QANDoE,KAAApE,EAAA,QAKa7Q,EAAAA,kBALb,IAAAiV,IACZ,kBAACW,GAAD;EAAgB,UAAS;EACvB,UAAA,kBAACvB,GAAD;GACE,MAAK;GACL,MAAK;GACL,cAAYR,EAAS;GACrB,SAAS8B;GAET,UAAA,kBAACpV,IAAD,EAAW,UAAS,QAAS,CAAA;EACnB,CAAA;CACE,CAAA,IACd,MALW,EAAA,MAAAoV,GAND,EAAA,MAAAV,GAKajV,EAAAA,MAAAA,EAAAA;CAZpBC,IAAAA;CAOOF,AAAAA,EAAAA,QAAAA,iBAPP,IAAA,EACT,OAAO;EACL,gBACED;EAIF,cAAcC;CAYhB,EACF,GAbkBA,EAAAA,MAAAA;CA1BpBG,IAAAA;CADF,OAQc2Q,EAAA,QAAA6E,KAAA7E,EAAA,QADHoE,KAAApE,EAAA,QADe1Q,EAAAA,eAAAA,EAAAA,QAcXF,KAnBb,IAAA,kBAAC8V,GAAD;EACY;EACV,MAAK;EACL,WAAA;EACA,SAAQ;EACR,aAAalC,EAAS;EACtB,OAAOoB;EACP,UAAUS;EACV,SAAS9V;EACT,QAAQC;EAOR,WAAA;EACA,cAAYgU,EAAS;EACrB,IAAIrT,GAAO;EACX,WAAWP;CAqBZ,CAAA,GAjCW,EAAA,MAAAyV,GADH,EAAA,MAAAT,GADe9U,EAAAA,MAAAA,EAAAA,aAcXF,EAAAA,MAAAA,2BAnBbC;AA0CJ;AA5FI,SAAAG,GAAC,GAAA;CAAM,OAAAiU,EAAE,gBAAgB,UAAU,WAAW;;;;AClBlD,IAAa0B,MAAY,MAA6B;CACpD,IAAsB,OAAOC,KAAW,aAApCA,GAA8C,OAAOA;CACzD,IAAMC,IAAMD,GACNE,IAAW,MAAM,QAAQD,EAAI,MAAM,IAAIA,EAAI,SAAS,CAAC,GACrDrD,IACJsD,EAAS,WAAW,IAChB,CAAC,EAAE,OAAO,QAAQ,CAAC,IACnBA,EAAS,KAAK,MACK,OAAO7B,KAAM,aAA1BA,IAA2CA,IACxC;EAAE,GAAGA;EAAG,OAAO;CAAQ,CAC/B;CACP,OAAO;EAAE,GAAG4B;EAAK;CAAO;AAC1B,GCnBaE,KAAiD;CAC5D,IAAI;CACJ,KAAK;AACP,GCNa3V,KAAS;CACpB,QAAQ;EACN,GAAG;EACH,sBAAsB,EAAE,UAAU,GAAG;CACvC;CACA,cAAc,EACZ,aAAa,MAAiB6S,EAAM,QAAQ,QAAQ,aACtD;AACF,GCDMgD,KAAmB;CACvB,IAAI;CACJ,MAAM;CACN,OAAO;AACT;AASA,SAAgBC,GAAA,GAKK;gBALO,EAC1B,gBAAAxF,GACA,WACA,MAAMrQ,GACN,iBAJ0BC,GAC1BgT,IAAA5C,MAAA,KAAA,KAAAnQ,GAEM6S,IAAAvC,MAAA,KAAA,IAAO7P,IAAPX,GAGA4Q,IAAKzB,EAAY,GACPhP;CAAqC,AAAAgQ,EAAA,OAAA+C,gBAArC,IAAA;EAAE,GAAGwC;EAA6B,GAAGxC;CAAO,GAAP,EAAA,KAAAA;CAArD,IAAM6C,IAAU5V,GAKdC;CACE,AAAA+P,EAAA,OAAA8C,gBADF,IAAA,EACE,kBACF,GADE,EAAA,KAAAA;CALJ,IAAM,EAAE,YAAS,cAAWtD,EAC1BiB,GACAgF,IACAN,IACAlV,CAGF,GACM4V,IAAUxC,IAAUuC,EAAQ,KAAKA,EAAQ,KASbxE,IAAAiC,KAAW5S,GAAO,cAA1CP;CAAwBC,AAAAA,EAAAA,OAAAA,gBAAxB,IAAA;EAAE,GAAGM,GAAO;EAAQ,GAAIN;CAAgC,GAAhCA,EAAAA,KAAAA;CAE5BC,IAAAA;CAAC,AAAA4P,EAAA,OAAA4C,KAAA5C,EAAA,OAA0BsD,KAA3B,IAAA,kBAACV,GAAD;EAAM,UAAS;EAAQ,GAAIU;CAAY,CAAA,GAAtC,EAAA,KAAAV,GAA0B,EAAA,KAAAU;CAP7BjT,IAAAA;CAGgB,AAAA2P,EAAA,OAAAqD,KAAArD,EAAA,QAEV9P,KAAAA,EAAAA,QAEJE,KAAAA,EAAAA,QAHSmT,KAAAvD,EAAA,QAFG6F,KAFd,IAAA,kBAACrC,GAAD;EACE,MAAK;EACL,cAAYqC;EACZ,gBAAcxC;EACd,SAASE;EACT,IAAIrT;EAEJE,UAAAA;CACU,CAAA,GALI,EAAA,KAAAiT,GAEVnT,EAAAA,MAAAA,GAEJE,EAAAA,MAAAA,GAHS,EAAA,MAAAmT,GAFG,EAAA,MAAAsC;CAHhBvV,IAAAA;CADF,OAEID,EAAAA,QAAAA,KAAAA,EAAAA,QADcwV,KAAhB,IAAA,kBAACnV,GAAD;EAAS,OAAOmV;EACdxV,UAAAA;CASO,CAAA,GATPA,EAAAA,MAAAA,GADc,EAAA,MAAAwV,2BAAhBvV;AAYJ;;;AChDA,IAAawV,KAAyC,EACpD,QAAQ,YACV,GCLanV,KAAS,EACpB,QAAQ;CACN,GAAG;CACH,sBAAsB,EAAE,UAAU,GAAG;AACvC,EACF,GCUaqV,KAAc;AAe3B,SAAgBC,GAAA,GAIO;gBAJO,EAC5B,WACA,MAAMrV,GACN,iBAH4BC,GAEtB+R,IAAA1C,MAAA,KAAA,IAAO7O,KAAPT,GAGA6P,IAAKzB,EAAY,GACPlO;CAAiC,AAAAkP,EAAA,OAAA+C,gBAAjC,IAAA;EAAE,GAAG+C;EAAyB,GAAG/C;CAAO,GAAP,EAAA,KAAAA;CAAjD,IAAM6C,IAAU9U,GAQDC;CAAiB,AAAAiP,EAAA,OAAAS,gBAAjB,UAAM0F,GAAW1F,GAAI,EAAK,GAAT,EAAA,KAAAA;CAG1BzP,IAAAA;CAAC,AAAAgP,EAAA,OAAA4C,KAAA5C,EAAA,OAA0BsD,KAA3B,IAAA,kBAACV,GAAD;EAAM,UAAS;EAAQ,GAAIU;CAAY,CAAA,GAAtC,EAAA,KAAAV,GAA0B,EAAA,KAAAU;CAP7BrS,IAAAA;CAEsBC,AAAAA,EAAAA,OAAAA,EAAAA,UAAAA,EAAAA,OAEXH,KAAAA,EAAAA,OAGTC,KAPF,IAAA,kBAACwS,GAAD;EACE,MAAK;EACL,cAAYoC,EAAQ;EACpB,gBAAA;EACA,SAAS7U;EACT,IAAIO,GAAO;EAEXN,UAAAA;CACU,CAAA,GANUE,EAAAA,KAAAA,EAAAA,QAEXH,EAAAA,KAAAA,GAGTC,EAAAA,KAAAA;CARJG,IAAAA;CADF,OAC0BD,EAAAA,QAAAA,EAAAA,UAAAA,EAAAA,QACtBD,KADF,IAAA,kBAACM,GAAD;EAAS,OAAOqU,EAAQ;EACtB3U,UAAAA;CASO,CAAA,GAVeC,EAAAA,MAAAA,EAAAA,QACtBD,EAAAA,MAAAA,2BADFE;AAYJ;AAQA,SAAgBgV,GAAW,GAAkB,GAAsB;CACjE,EAAexC,CAAQ,CAAC,CAAC,UAAU,OAAO,EACxC,iBAAiB;EACf,GAAGF,EAAE;GACJuC,KAAc;GACb,GAAGvC,EAAE,gBAAgBuC;GACrB,SAASpC;EACX;CACF,EACF,EAAE;AACJ;;;AC7DA,IAAawC,MAAY,MAA6B;CACpD,IAAsB,OAAOhB,KAAW,aAApCA,GAA8C,OAAOA;CACzD,IAAMC,IAAMD;CACZ,OAAO;EACL,GAAGC;EACH,OAAO;GACL,SAAS,CAAC,QAAQ,OAAO;GACzB,YAAY;GACZ,WAAW;GACX,YAAY,EAAE,YAAY,IAAK;EACjC;EACA,SAAS;GACP,GAAKA,EAAI,WAAkC,CAAC;GAC5C,MAAM;GACN,SAAS;IACP,GAAKA,EAAI,SAA8C,WAAW,CAAC;IACnE,OAAO,EAAE,MAAM,CAAC,QAAQ,OAAO,EAAE;GACnC;EACF;CACF;AACF,GCzBagB,KAAiD;CAC5D,IAAI;CACJ,KAAK;AACP,GCNa7U,KAAS;CACpB,QAAQ;EACN,GAAG;EACH,sBAAsB,EAAE,UAAU,GAAG;CACvC;CACA,cAAc,EACZ,aAAa,MAAiBiR,EAAM,QAAQ,QAAQ,aACtD;AACF,GCGM8D,KAAmB;CACvB,IAAI;CACJ,MAAM;CACN,OAAO;AACT;AAuDA,SAAgBC,GAAA,GAQK;gBARO,EAC1B,gBAAAtG,GACA,WAAAG,GACA,WAAAY,GACA,cACA,WACA,MAAMxP,GACN,iBAP0BC,GAC1BoR,IAAA5C,MAAA,KAAA,KAAAvO,GACA8U,IAAApG,MAAA,KAAA,IAAY,UAAZzO,GACA8U,IAAAzF,MAAA,KAAA,IAAY,aAAZpP,GAGM+Q,IAAA1B,MAAA,KAAA,IAAOtO,IAAPnB,GAGAgP,IAAKzB,EAAY,GACPlN;CAAqC,AAAAkO,EAAA,OAAA+C,gBAArC,IAAA;EAAE,GAAGsD;EAA6B,GAAGtD;CAAO,GAAP,EAAA,KAAAA;CAArD,IAAM6C,IAAU9T,GAKdC;CAAE,AAAAiO,EAAA,OAAA8C,gBAAF,IAAA,EAAE,kBAAe,GAAf,EAAA,KAAAA;CAJJ,IAAM,EAAE,YAAS,cAAWtD,EAC1BiB,GACA8F,IACAH,IACArU,CACF,GAIM6U,IAAQtH,EAAkBmB,CAAE,GAExBzO,GA2BPC;CA3BH,AAagC+N,EAAA,OAAA0G,KAAA1G,EAAA,OAAXyG,KAAAzG,EAAA,OAZd4G,KAAA5G,EAAA,OACAqD,KAFG,UAAM;EACd,IAAI,CAACuD,GAAO;EACZ,IAAI,CAACvD,GAAS;GAGZ,AADAuD,EAAM,eAAe,EAAE,MAAM,mBAAmB,CAAC,GACjDA,EAAM,eAAe;IAAE,MAAM;IAAS,OAAO,CAAC;GAAE,CAAC;GACjD;EACF;EAEA,IAAMC,UAAyB;GAC7B,EAAM,eAAe;IACnB,MAAM;IACN,KAAK;IACL,aAAa;KAAE;KAAW;IAAU;GACtC,CAAC;EACH,GAKMC,UAAyBD,EAAW;EAI1C,OAHAD,EAAM,GAAG,YAAYE,CAAU,GAC/BD,EAAW,SAEE;GACX,EAAM,IAAI,YAAYC,CAAU;EAClC;CACF,GAAG,IAAA;EAACF;EAAOvD;EAASoD;EAAWC;CAAS,GAdR,EAAA,KAAAA,GAAX,EAAA,KAAAD,GAZd,EAAA,KAAAG,GACA,EAAA,KAAAvD,+CAFP0D,EAAU/U,GA2BPC,CAAsC;CAS/BC,IAAAA;CACH,AAAA8N,EAAA,QAAA4G,KAAA5G,EAAA,QAAUqD,KAAArD,EAAA,QACA7N,GAAAA,UAFP,UAAM;EACd,AAAKyU,KAAUvD,KACX2D,GAAW,WAAW,KACxBJ,EAAM,eAAe;GAAE,MAAM;GAAS,OAAO,CAAC;EAAE,CAAC;CAErD,GAJO,EAAA,MAAAA,GAAU,EAAA,MAAAvD,GACAlR,EAAAA,MAAAA,GAAAA;CAGdC,IAAAA;CALH,AAKI4N,EAAA,QAAA4G,KAAA5G,EAAA,QAAOqD,KAAArD,EAAA,QAASgH,KAAjB,IAAA;EAACJ;EAAOvD;EAAS2D;CAAS,GAAzB,EAAA,MAAAJ,GAAO,EAAA,MAAAvD,GAAS,EAAA,MAAA2D,2BALpBD,EAAU7U,GAKPE,CAA2B;CAE9B,IAAMyT,IAAUxC,IAAUuC,EAAQ,KAAKA,EAAQ,KAS9BlE,IAAA2B,IAAU,WAAW,KAAA,GACJ4B,IAAA5B,KAAWxQ,GAAO,cAA1CR;CAAwBC,AAAAA,EAAAA,QAAAA,iBAAxB,IAAA;EAAE,GAAGO,GAAO;EAAQ,GAAIP;CAAgC,GAAhCA,EAAAA,MAAAA;CAE5BC,IAAAA;CAAC,AAAAyN,EAAA,QAAA4C,KAAA5C,EAAA,QAA0BsD,KAA3B,IAAA,kBAACV,GAAD;EAAM,UAAS;EAAQ,GAAIU;CAAY,CAAA,GAAtC,EAAA,MAAAV,GAA0B,EAAA,MAAAU;CAR7B9Q,IAAAA;CAGgB,AAAAwN,EAAA,QAAAqD,KAAArD,EAAA,QAEHvN,KAAAA,EAAAA,QACPJ,KAAAA,EAAAA,QAEJE,KAAAA,EAAAA,QAJSgR,KAAAvD,EAAA,QAFG6F,KAFd,IAAA,kBAACrC,GAAD;EACE,MAAK;EACL,cAAYqC;EACZ,gBAAcxC;EACd,SAASE;EACT,WAAW9Q;EACX,IAAIJ;EAEJE,UAAAA;CACU,CAAA,GANI,EAAA,MAAA8Q,GAEH5Q,EAAAA,MAAAA,GACPJ,EAAAA,MAAAA,GAEJE,EAAAA,MAAAA,GAJS,EAAA,MAAAgR,GAFG,EAAA,MAAAsC;CAHhBnT,IAAAA;CADF,OAEIF,EAAAA,QAAAA,KAAAA,EAAAA,QADcqT,KAAhB,IAAA,kBAAC/S,GAAD;EAAS,OAAO+S;EACdrT,UAAAA;CAUO,CAAA,GAVPA,EAAAA,MAAAA,GADc,EAAA,MAAAqT,2BAAhBnT;AAaJ;;;AC9HA,SAAS2U,GAAkB,GAA+B;CAExD,OADK,MAAM,QAAQ/E,CAAC,IACbA,EAAE,OACN,MAEC,OAAOL,KAAS,cADhBA,KAEA,WAAWA,KACX,OAAQA,EAA4B,SAAU,QAClD,IAP8B;AAQhC;AAEA,IAAaqF,MAAkB,MACxB,MAAM,QAAQxF,CAAK,IACjBA,EAAM,KAAK,MAA6B;CAC7C,IAAI,CAACuF,GAAkBrF,CAAM,GAAG,OAAOA;CACvC,IAAMuF,IAAQvF,EAAO,QAAQ,GAAK,MAAMwF,IAAM,KAAK,IAAIC,EAAE,KAAK,GAAG,CAAC;CAElE,OADIF,KAAS,IAAUvF,IAChBA,EAAO,KAAK,OAAO;EAAE,GAAGyF;EAAG,OAAQA,EAAE,QAAQF,IAAS;CAAI,EAAE;AACrE,CAAC,IANiCzF;AAiBpC,SAAgB4F,GACd,GAC2B;CAC3B,IAAMC,IAAM,IAAI,KAAK,aAAaC,GAAQ;EACxC,OAAO;EACP,uBAAuB;EACvB,uBAAuB;CACzB,CAAC;CACD,QAAQ,MACF,OAAOhE,KAAU,YAAY,CAAC,OAAO,SAASA,CAAK,IAC9C,OAAOA,CAAK,IACd+D,EAAI,OAAO/D,IAAQ,GAAG;AAEjC;;;AC7DA,IAAaiE,KAAmD;CAC9D,IAAI;CACJ,KAAK;CACL,WAAW;CACX,UAAU;CACV,YAAY;AACd,GCZa9U,KAAS;CACpB,OAAO;EACL,SAAS;EACT,YAAY;CACd;CACA,QAAQ;EACN,GAAG;EACH,sBAAsB,EAAE,UAAU,GAAG;CACvC;CACA,cAAc,EACZ,aAAa,MAAiB0P,EAAM,QAAQ,QAAQ,aACtD;CACA,OAAO;EACL,GAAG;EACH,OAAO;EACP,cAAc;EACd,sBAAsB,EAAE,UAAU,GAAG;CACvC;AACF,GCUMsF,KAAkB;CACtB,IAAIjI;CACJ,MAAM;CACN,OAAO;AACT,GAEMkI,KAAkB;CACtB,IAAI;CACJ,MAAM;CACN,OAAO;AACT,GAEMC,MAAY,MAAoB7C;AAmDtC,SAAgB8C,GAAA,GAQM;gBARO,EAC3B,gBAAAhI,GACA,OAAOlN,GACP,WACA,WACA,MAAMC,GACN,cACA,iBAP2BC,GAC3B4P,IAAA5C,MAAA,KAAA,KAAA/M,GACOgV,IAAA9H,MAAA,KAAA,IAAe,QAAfrN,GAGD4P,IAAA3B,MAAA,KAAA,IAAOtL,KAAP1C,GAIAwN,IAAKzB,EAAY,GACP5L;CAAsC,AAAA4M,EAAA,OAAA+C,gBAAtC,IAAA;EAAE,GAAG8E;EAA8B,GAAG9E;CAAO,GAAP,EAAA,KAAAA;CAAtD,IAAM6C,IAAUxS,GAEViV,IAAiBnJ,EACrBuB,GACApN,EAEF,GACMkV,IAAQF,KAAkBF,GAIO/G,IAAAoH,KAAalB,IAAhDhU;CAAmCC,AAAAA,EAAAA,OAAAA,gBAAnC,IAAA;EAAE,YAAYwU;EAAiB,IAAIxU;CAA4B,GAA5BA,EAAAA,KAAAA;CAG7B,IAAA+N,IAAAiH,MAAU,UAAU1I,IAAsBoI,IAFhDzU;CAEMC,AAAAA,EAAAA,OAAAA,gBAFN,IAAA;EACE,YAAYuU;EACZ,IAAIvU;CACN,GADMA,EAAAA,KAAAA;CAJFC,IAAAA;CACJJ,AAAAA,EAAAA,OAAAA,KAAAA,EAAAA,OACAE,KAFI,IAAA,CACJF,GACAE,CAIF,GALEF,EAAAA,KAAAA,GACAE,EAAAA,KAAAA;CAHJ,IAAMiV,IAAQ9U,GAWkDC;CAC9D,AAAAoM,EAAA,OAAA8C,iBAD8D,IAAA,EAC9D,kBACF,GADE,EAAA,KAAAA;CADF,IAAM,EAAE,YAAS,gBAAY,eAAWpD,EAAae,GAAIgI,GAAO7U,CAE/D,GAESC,GAGPC;CAHH,AAEekM,EAAA,QAAAS,KAAAT,EAAA,QAAkB8C,KAAA9C,EAAA,QAAdmI,KAAAnI,EAAA,QADbqI,KADI,UAAM;EACd,AAAIA,MAAmB,KAAA,KACrBK,GAAWjI,GAAI0H,GAAcrF,CAAc;CAC/C,GAAG,IAAA;EAACrC;EAAI4H;EAAgBF;EAAcrF;CAAc,GADrC,EAAA,MAAArC,GAAkB,EAAA,MAAAqC,GAAd,EAAA,MAAAqF,GADb,EAAA,MAAAE,mDADNtB,EAAUlT,GAGPC,CAAkD;CAErD,IAAM,CAAC6U,GAAUC,KAAe5H,EAA6B,IAAI,GAC7CjN;CACP,AAAAiM,EAAA,QAAAS,KAAAT,EAAA,QAAU8C,KAAA9C,EAAA,QACrB6I,MAFkB,KAAC,MAAwB;EAG3C,AAFAH,GAAWjI,GAAIqI,GAAMhG,CAAc,GACnC+F,GAAW,EAAI,GACfD,EAAY,IAAI;CAClB,GAHa,EAAA,MAAAnI,GAAU,EAAA,MAAAqC,GACrB,EAAA,MAAA+F;CAFF,IAAME,IAAchV,GAOZC;CAAuB,AAAAgM,EAAA,QAAA4H,iBAAvB,IAAAF,GAAuBE,CAAM,GAAN,EAAA,MAAAA;CAD/B,IAAMoB,IAAmB/U,GASnBgV,IAAe/J,EAAUuB,GAAIvM,EAAqB,GAE9CC,IAIPC;CAJH,AAEe4L,EAAA,QAAAqD,KAAArD,EAAA,QADES,KAAAT,EAAA,QACQgJ,KAAAhJ,EAAA,QAAmBiJ,KAFlC,WAAM;EACd,EAAexI,CAAE,CAAC,CAAC,SAAS,EAC1B,WAAW4C,IAAU2F,IAAmBC,EAC1C,CAAC;CACH,GAAG,KAAA;EAACxI;EAAI4C;EAAS2F;EAAkBC;CAAY,GAFhC,EAAA,MAAA5F,GADE,EAAA,MAAA5C,GACQ,EAAA,MAAAuI,GAAmB,EAAA,MAAAC,uDAF5ClC,EAAU5S,IAIPC,EAA6C;CAEhD,IAAMyR,IAAUxC,IAAUuC,EAAQ,KAAKA,EAAQ,KAUXuD,IAAA9F,KAAWvN,GAAO,cAA1CzB;CAAwBC,AAAAA,EAAAA,QAAAA,kBAAxB,KAAA;EAAE,GAAGwB,GAAO;EAAQ,GAAIxB;CAAgC,GAAhCA,EAAAA,MAAAA;CAE5BC,IAAAA;CAAC,AAAAyL,EAAA,QAAA4C,KAAA5C,EAAA,QAA0BsD,KAA3B,KAAA,kBAACV,GAAD;EAAM,UAAS;EAAQ,GAAIU;CAAY,CAAA,GAAtC,EAAA,MAAAV,GAA0B,EAAA,MAAAU;CAP7B9O,IAAAA;CAGgB,AAAAwL,EAAA,QAAAqD,KAAArD,EAAA,QAEV3L,MAAAA,EAAAA,QAEJE,MAAAA,EAAAA,QAHSgP,MAAAvD,EAAA,QAFG6F,KAFd,KAAA,kBAACrC,GAAD;EACE,MAAK;EACL,cAAYqC;EACZ,gBAAcxC;EACd,SAASE;EACT,IAAIlP;EAEJE,UAAAA;CACU,CAAA,GALI,EAAA,MAAA8O,GAEVhP,EAAAA,MAAAA,IAEJE,EAAAA,MAAAA,IAHS,EAAA,MAAAgP,IAFG,EAAA,MAAAsC;CAHhBpR,IAAAA;CACED,AAAAA,EAAAA,QAAAA,MAAAA,EAAAA,QADcqR,KAAhB,KAAA,kBAAC9P,GAAD;EAAS,OAAO8P;EACdrR,UAAAA;CASO,CAAA,GATPA,EAAAA,MAAAA,IADc,EAAA,MAAAqR;CAgBG,IAAA2D,KAAAb,IAAW,SAAS,KAAA,GAC1BjU;sDAAC,MAAA,MAAMkU,EAAY,EAAE,aAAa;CAG3CjU,IAAAA;sDAAC,KAAA,kBAAAqB,GAAD,CAAoB,CAAA;CARtBpB,IAAAA;CAEsBC,AAAAA,EAAAA,QAAAA,EAAAA,aAAAA,EAAAA,QAELC,MAJjB,KAAA,kBAAC0O,GAAD;EACE,MAAK;EACL,cAAYoC,EAAQ;EACpB,iBAAc;EACd,iBAAe9Q;EACf,SAASJ;EACT,IAAIoB,GAAO;EAEXnB,UAAAA;CACU,CAAA,GAPUE,EAAAA,MAAAA,EAAAA,WAELC,EAAAA,MAAAA;CALnBC,IAAAA;CAAwBF,AAAAA,EAAAA,QAAAA,EAAAA,aAAAA,EAAAA,QACtBD,MADF,IAAA,kBAACmB,GAAD;EAAS,OAAO6P,EAAQ;EACtBhR,UAAAA;CAUO,CAAA,GAXeC,EAAAA,MAAAA,EAAAA,WACtBD,EAAAA,MAAAA;CAaM,IAAAkV,KAAA,EAAQnB,GACL3T;sDAAM,WAAA4T,EAAY,IAAI;CAGjB3T,IAAAA,IACGC;sDADH,KAAA;EAAE,UAAU;EAAU,YAAY;CAAQ,GACvC,KAAA;EAAE,UAAU;EAAO,YAAY;CAAQ;CAEvDC,IAAAA;CAOiCC,AAAAA,EAAAA,QAAAA,EAAAA,YAAAA,EAAAA,QAAmBC,EAAAA,cAAAA,EAAAA,QAJ5BkT,KAAAvI,EAAA,QACN+I,KAJlB,KAAAoB,GAAO,KAAK,MACX,kBAACC,GAAD;EAEE,UAAUhF,MAAWmD;EACrB,eAAeQ,EAAY3D,CAAM;EAEjC,UAAA,kBAACiF,GAAD,EAAA,UACGjF,MAAW,QAAQQ,EAAQ,WAAWA,EAAQ,WACnC,CAAA;CACN,GAPHR,CAOG,CACX,GAHiChQ,EAAAA,MAAAA,EAAAA,UAAmBC,EAAAA,MAAAA,EAAAA,YAJ5B,EAAA,MAAAkT,GACN,EAAA,MAAAQ;CAbrBzT,IAAAA;CACY,AAAA0K,EAAA,QAAA2I,KAAA3I,EAAA,QACJzK,MAAAA,EAAAA,QAOLJ,MATH,KAAA,kBAACoV,GAAD;EACY;EACV,MAAMhV;EACN,SAASP;EACT,SAAQ;EACR,WAAW;EACX,cAAcC;EACd,iBAAiBC;EAEhBC,UAAAA;CAWG,CAAA,GAnBM,EAAA,MAAAwT,GACJpT,EAAAA,MAAAA,IAOLJ,EAAAA,MAAAA;CAjCLK,IAAAA;CADF,OAEIf,EAAAA,QAAAA,MAAAA,EAAAA,QAWAM,KAAAA,EAAAA,QAYAO,MAxBF,KAAA,kBAACmV,GAAD;EAAK,IAAI3U,GAAO;EAAhB,UAAA;GACErB;GAWAM;GAYAO;EAqBG;KA5CHb,EAAAA,MAAAA,IAWAM,EAAAA,MAAAA,GAYAO,EAAAA,MAAAA,8BAxBFE;AA+CJ;AA1DqC,SAAAK,GAAC,GAAA;CAAMJ,OAAAA,EAAE;;AAzC1C,SAAAG,GAAC,GAAA;CACC,OAAA6N,EAAE,gBAAgBsE,GAAgB,GAAG,EAAE;;AAoG7C,IAAMoC,KAAmC,CAAC,OAAO,OAAO;AAExD,SAASzB,GAAW,GAAY,GAAsB,GAAyB;CAC7E,EAAejI,CAAE,CAAC,CAAC,UAAU,OAAO,EAClC,iBAAiB;EACf,GAAGgD,EAAE;GACJsE,GAAgB,KAAK;GAGpB,SAASjF;GACT,GAAGW,EAAE,gBAAgBsE,GAAgB;GACrC;EACF;CACF,EACF,EAAE;AACJ;;;AC1NA,IAAa4C,KAA8C;CACzD,MAAM;CACN,OAAO;AACT,GCNa1U,KAAS;CAapB,YAAY;EACV,SAAS;EACT,eAAe;EACf,MAAM;EACN,WAAW;EACX,KAAK;CACP;CACA,SAAS;EACP,GAAG;EACH,sBAAsB,EAAE,UAAU,GAAG;CACvC;CACA,eAAe,EACb,aAAa,MAAiBwM,EAAM,QAAQ,QAAQ,aACtD;CAaA,aAAa;EACX,OAAO;EACP,QAAQ;EACR,UAAU;EACV,WAAW;EACX,UAAU;EACV,WAAW;CACb;CACA,aAAa;EACX,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,KAAK;EACL,IAAI;EACJ,IAAI;EACJ,IAAI;CACN;CAIA,eAAe;EACb,SAAS;EACT,YAAY;EACZ,KAAK;EACL,YAAY;CACd;CACA,WAAW;EACT,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;CACd;CACA,eAAe;EACb,SAAS;EACT,eAAe;EACf,KAAK;EACL,IAAI;EACJ,IAAI;EACJ,UAAU;EAIV,WAAW;CACb;AACF;;;ACYA,SAASoI,GAAA,GAKkB;gBALA,EACzB,WACA,WAAW3U,GACX,UAAUC,GACV,iBAJyBC,GAEd0U,IAAA5K,MAAA,KAAA,IAAYlH,IAAZ9C,GACD8U,IAAA3K,MAAA,KAAA,IAAWpH,IAAX9C,GAGJsK,IAAKzB,EAAY,GACP3I;CAAmC,AAAA2J,EAAA,OAAA+C,gBAAnC,IAAA;EAAE,GAAG4H;EAA2B,GAAG5H;CAAO,GAAP,EAAA,KAAAA;CAAnD,IAAM6C,IAAUvP,GACV6U,IAAOhM,EACXuB,GACAnK,EACF,GAEiCC;CAChB,AAAAyJ,EAAA,OAAAS,KAAAT,EAAA,OACEkL,KAFc,UAAM;EACrC,EAAezK,CAAE,CAAC,CAAC,SAAS,EAC1B,cAAc,CAACyK,EACjB,CAAmC;CACrC,GAHiB,EAAA,KAAAzK,GACE,EAAA,KAAAyK;CAFnB,IAAME,IAAe5U,GAMf6U,IAAeH,IAAOtF,EAAQ,QAAQA,EAAQ,MAC9C0F,IAAcJ,IAAOF,IAAWF,GASrB1J,IAAA8J,IAAO,WAAW,KAAA,GACA7J,IAAA6J,KAAQ/R,GAAO,eAAxC1C;CAAyBC,AAAAA,EAAAA,OAAAA,gBAAzB,IAAA;EAAE,GAAGyC,GAAO;EAAS,GAAIzC;CAA8B,GAA9BA,EAAAA,KAAAA;CAE7BC,IAAAA;CAAC,AAAAqJ,EAAA,OAAAsL,KAAAtL,EAAA,OAAiCsD,KAAlC,IAAA,kBAACgI,GAAD;EAAa,UAAS;EAAQ,GAAIhI;CAAY,CAAA,GAA7C,EAAA,KAAAgI,GAAiC,EAAA,KAAAhI;CARpC1M,IAAAA;CAIW,AAAAoJ,EAAA,QAAAoL,KAAApL,EAAA,QADKkL,KAAAlL,EAAA,QAEHnJ,KAAAA,EAAAA,QACPJ,KAAAA,EAAAA,QAEJE,KAAAA,EAAAA,QANY0U,KAFd,IAAA,kBAAC7H,GAAD;EACE,MAAK;EACL,cAAY6H;EACZ,gBAAcH;EACd,SAASE;EACT,WAAWvU;EACX,IAAIJ;EAEJE,UAAAA;CACU,CAAA,GALD,EAAA,MAAAyU,GADK,EAAA,MAAAF,GAEHrU,EAAAA,MAAAA,GACPJ,EAAAA,MAAAA,GAEJE,EAAAA,MAAAA,GANY,EAAA,MAAA0U;CAHhBvU,IAAAA;CADF,OAEIF,EAAAA,QAAAA,KAAAA,EAAAA,QADcyU,KAAhB,IAAA,kBAACjS,GAAD;EAAS,OAAOiS;EACdzU,UAAAA;CAUO,CAAA,GAVPA,EAAAA,MAAAA,GADc,EAAA,MAAAyU,2BAAhBvU;AAaJ;AA1BI,SAAAoC,GAAC,GAAA;CAAM,OAAAuK,EAAE,gBAAgB;;AA6B7B,SAAgB8H,GAAkB,GAAoB;CACpD,OAAO,GAAG9K,EAAG;AACf;AAMA,IAAM+K,qBAAa,IAAI,IAAY;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAGD,SAASC,GAAY,GAA0C;CAC7D,OAAO,OAAO,YACZ,OAAO,QAAQC,CAAK,CAAC,CAAC,QAAQ,CAACC,OAAS,CAACH,GAAW,IAAIG,CAAG,CAAC,CAC9D;AACF;AAUA,SAASC,GAAA,GAQe;gBARA,EACtB,aACA,UACA,YACA,YACA,WACA,WAAW7U,GACX,iBAPsBC,GAMX6U,IAAA3L,MAAA,KAAA,IAAW7G,KAAXtC,GAGL0J,IAAKzB,EAAY,GACP3I;CAAmC,AAAA2J,EAAA,OAAA+C,gBAAnC,IAAA;EAAE,GAAG4H;EAA2B,GAAG5H;CAAO,GAAP,EAAA,KAAAA;CAAnD,IAAM6C,IAAUvP,GACV6U,IAAOhM,EACXuB,GACAnK,EACF,GAKMmM,IAAQsJ,EAAS,GACS9U;CAAMC,AAAAA,EAAAA,OAAAA,EAAAA,0BAAN,IAAAuL,EAAM,YAAY,KAAK,IAAI,GAArBvL,EAAAA,KAAAA,EAAAA;CAAtC,IAAM8U,IAAYC,EAAchV,CAA4B,GAC5BE;CACf,AAAA6I,EAAA,OAAAS,gBADe,UAAM;EACpC,EAAeA,CAAE,CAAC,CAAC,SAAS,EAC1B,cAAc,GAChB,CAAmC;CACrC,GAHiB,EAAA,KAAAA;CADjB,IAAMyL,IAAc9U,GAUd+U,IAAUjI,EAAOgH,CAAI,GACX7T,GAQbC;CARH,AACqC0I,EAAA,OAAAS,KAAAT,EAAA,OACXkL,KAFV,UAAM;EACpB,IAAMkB,IAAWb,GAAkB9K,CAAE;EAMrC,AALI0L,EAAQ,WAAW,CAACjB,KAAQ3L,EAAe6M,CAAQ,KACrD3M,EAAegB,CAAE,CAAC,CAAC,SACjBgL,GAAYhM,EAAe2M,CAAQ,CAAC,CAAC,SAAS,CAAC,CACjD,GAEF,EAAQ,UAAUlB;CACpB,GAAG,IAAA,CAACzK,GAAIyK,CAAI,GAPyB,EAAA,KAAAzK,GACX,EAAA,KAAAyK,+CAF1B/J,EAAgB9J,GAQbC,CAAU;CAEb,IAAM+U,IAAU,2BAA2B5L,KAC5BlJ;CACN,AAAAyI,EAAA,QAAA2B,kBADM,MAAC,MACd,OAAOA,KAAa,aAAaA,EAAS2K,CAAQ,IAAI3K,GAA/C,EAAA,MAAAA;CADT,IAAM4K,IAAShV,IAKkBC;4BAAO,IAAA+U,EAAA,EAAK,GAAZ,EAAA,MAAAA;CAA7B9U,IAAAA;CAA6BD,AAAAA,EAAAA,QAAAA,iBAA7B,IAAA,kBAACiT,GAAD;EAAK,IAAItR,GAAO;EAAa3B,UAAAA;CAAmB,CAAA,GAAnBA,EAAAA,MAAAA;CAOzBE,IAAAA;CAAsD,AAAAsI,EAAA,QAAAgM,KAAAhM,EAAA,QAAAwM,KAAtD,IAAAR,IAAY,KAAA,IAAY,EAAE,OAAO,EAAE,IAAIS,GAAeD,CAAO,EAAE,EAAE,GAAjE,EAAA,MAAAR,GAAsD,EAAA,MAAAQ;CAgBpD7U,IAAAA;CAKG,AAAAqI,EAAA,QAAA0M,iBALH,IAAA,kBAACC,GAAD;EACE,SAAQ;EACR,WAAU;EACV,IAAIxT,GAAO;EAEV,UAAAuT;CACS,CAAA,GADT,EAAA,MAAAA;CAUG9U,IAAAA;CAAC,AAAAoI,EAAA,QAAA6L,KAAA7L,EAAA,QAA8BsD,KAA/B,IAAA,kBAACuI,GAAD;EAAU,UAAS;EAAQ,GAAIvI;CAAY,CAAA,GAA1C,EAAA,MAAAuI,GAA8B,EAAA,MAAAvI;CALjCzL,IAAAA;CAEsBC,AAAAA,EAAAA,QAAAA,EAAAA,SAAAA,EAAAA,QACXoU,KAAAlM,EAAA,QAETpI,KALF,KAAA,kBAAC4L,GAAD;EACE,MAAK;EACL,cAAYoC,EAAQ;EACpB,SAASsG;EAETtU,UAAAA;CACU,CAAA,GAJUE,EAAAA,MAAAA,EAAAA,OACX,EAAA,MAAAoU,GAETtU,EAAAA,MAAAA;CANJG,IAAAA;CAAwBD,AAAAA,EAAAA,QAAAA,EAAAA,SAAAA,EAAAA,QACtBD,MADF,IAAA,kBAACuB,GAAD;EAAS,OAAOwM,EAAQ;EACtB/N,UAAAA;CAOO,CAAA,GAReC,EAAAA,MAAAA,EAAAA,OACtBD,EAAAA,MAAAA;CAHJG,IAAAA;CACG,AAAAgI,EAAA,QAAA4M,KAAA5M,EAAA,QACDjI,KAFF,IAAA,kBAAC0S,GAAD;EAAK,IAAItR,GAAO;EAAhB,UAAA,CACGyT,GACD7U,CASG;KAVF,EAAA,MAAA6U,GACD7U,EAAAA,MAAAA;CAVJE,IAAAA;CACEN,AAAAA,EAAAA,QAAAA,KAAAA,EAAAA,QAOAK,KAAAA,EAAAA,QAReqU,KAAjB,IAAA,kBAACQ,GAAD;EAAa,IAAIR;EAAS,WAAU;EAAM,IAAIlT,GAAO;EAArD,UAAA,CACExB,GAOAK,CAYW;KAnBXL,EAAAA,MAAAA,GAOAK,EAAAA,MAAAA,GARe,EAAA,MAAAqU;CAsBdnU,IAAAA;6BAAO,KAAAqU,EAAA,EAAI,GAAX,EAAA,MAAAA;CADHpU,IAAAA;CACGD,AAAAA,EAAAA,QAAAA,mBADH,KAAA,kBAAC4U,GAAD;EAAe,IAAI3T,GAAO;EACvBjB,UAAAA;CACY,CAAA,GADZA,EAAAA,MAAAA;CAvBLE,IAAAA;CAAuB,AAAA4H,EAAA,QAAAS,KAAAT,EAAA,QACrB/H,KAAAA,EAAAA,QAqBAE,MAtBF,IAAA,kBAAC4U,IAAD;EAAa,UAAUtM;EAAvB,UAAA,CACExI,GAqBAE,EAGW;KAzBU,EAAA,MAAAsI,GACrBxI,EAAAA,MAAAA,GAqBAE,EAAAA,MAAAA;CA1CJE,IAAAA;CAGc,AAAA2H,EAAA,QAAAgM,KAAAhM,EAAA,QADHkM,KAAAlM,EAAA,QADHkL,KAAAlL,EAAA,QAKJtI,KAAAA,EAAAA,QAcFU,KAAAA,EAAAA,QAZiBiU,KARnB,IAAA,kBAACW,GAAD;EACQ;EACN,SAASd;EACT,YAAYF;EAEZ,WACEtU;EAEF,mBAAiB2U;EAYjBjU,UAAAA;CA0BM,CAAA,GA3CM,EAAA,MAAA4T,GADH,EAAA,MAAAE,GADH,EAAA,MAAAhB,GAKJxT,EAAAA,MAAAA,GAcFU,EAAAA,MAAAA,GAZiB,EAAA,MAAAiU;CAVrB/T,IAAAA;CADF,OAGID,EAAAA,QAAAA,KAAAA,EAAAA,QADAZ,KADF,KAAA,kBAAA8B,GAAA,EAAA,UAAA,CACE9B,GACAY,CA+CA,EAAA,CAAA,GA/CAA,EAAAA,MAAAA,GADAZ,EAAAA,MAAAA,6BADFa;AAmDJ;AArFI,SAAAgB,GAAC,GAAA;CAAM,OAAAmK,EAAE,gBAAgB;;AA8F7B,SAASsJ,GAAA,GAMN;gBANkB,EACnB,aACA,gBAFmBxU,GAOFC;CAAkB,AAAAwH,EAAA,OAAAkN,gBAAlB,IAAA3B,GAAkB2B,CAAQ,GAAR,EAAA,KAAAA;CAAnC,IAAMd,IAAW5T,GAGX2U,IAAOpO,EAAiBmO,GAAUzU,EAOtC,GAGOC;CAAT,AACkCsH,EAAA,OAAAoM,KAAApM,EAAA,OAAUmN,KAAAnN,EAAA,OACAkN,KAFnC,UAAM;EACb,IAAMnM,IAAQD,EAAkBsL,GAAUe,CAAI;EAG9C,OAFApM,EAAM,SAAS0K,GAAYhM,EAAeyN,CAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,GAC/DtN,EAAoBwM,GAAUrL,CAAK,GAC5BA;CACT,GAJkC,EAAA,KAAAqL,GAAU,EAAA,KAAAe,GACA,EAAA,KAAAD,yBAF5ClM,EAAStI,CAKR;CAKeC,IAAAA,GAkBbC;CAlBH,AAE8CoH,EAAA,OAAAoM,KAAApM,EAAA,OAKnBkN,KAPX,UAAM;EACpB,IAAIG,IAA8B,MAC5BC,IAAcnO,EAAwBiN,IAAW,MAAU;GAK/D,IAAMmB,IAAOC,GAAUN,CAAQ;GAE/B,AADItG,KAAS2G,KAAME,GAAeF,GAAM3G,GAAO2G,EAAK,UAAU,CAAC,GAC/D,IAAc3G;EAChB,CAAC;EACD,aAAa;GACX,EAAY;GACZ,IAAM/N,IAAO2U,GAAUN,CAAQ;GAC/B,AAAIrU,KAAQwU,KAAe,CAACA,EAAY,WAAW,KACjDI,GAAeJ,GAAaxU,GAAM8U,GAAUN,CAAW,CAAC;EAE5D;CACF,GAAG,IAAA,CAACjB,GAAUc,CAAQ,GAhBwB,EAAA,KAAAd,GAKnB,EAAA,KAAAc,+CAP3B/L,EAAgBxI,GAkBbC,CAAoB;CAGrBE,IAAAA;CADF,OAEKkH,EAAA,QAAA2B,KAAA3B,EAAA,QADWoM,KAAApM,EAAA,QAAcmN,KAA5B,IAAA,kBAACpN,GAAD;EAAU,IAAIqM;EAAU,GAAIe;EACzB;CACO,CAAA,GADP,EAAA,MAAAxL,GADW,EAAA,MAAAyK,GAAc,EAAA,MAAAe,2BAA5BrU;AAIJ;AA7C0C,SAAAU,GAAC,GAAA;CAAO,OAAA;EAC9C,MAAMiK,EAAE;EACR,WAAWA,EAAE;EACb,YAAYA,EAAE;EACd,OAAOA,EAAE;EACT,WAAWA,EAAE;EACb,gBAAgBA,EAAE;CACpB;;AAwCF,SAAS+J,GAAU,GAA4B;CAC7C,IAAM5G,IAAQxH,EAAkBqB,CAAE;CAClC,OAAOmG,KAAS,CAACA,EAAM,WAAW,IAAIA,IAAQ;AAChD;AAQA,SAAS6G,GACP,GACA,GACA,GACM;CAKN,AAJA7G,EAAM,UAAUxB,CAAM,GAGtBwB,EAAM,eAAe,EAAE,MAAM,UAAU,CAAC,GACxCA,EAAM,eAAe;EAAE,MAAM;EAAqB,aAAa;CAAQ,CAAC;CAIxE,IAAMgH,IACJC,EAMC,WAAW,CAAC,CACZ,aAAa,OAAO,CAAC,EAAE;CAC1B,AAAID,GAAO,UAAQhH,EAAM,eAAe;EAAE,MAAM;EAAS;CAAM,CAAC;AAClE;AASA,IAAMkH,KAAmB;CAAC;CAAS;CAAO;CAAc;AAAU;AAQlE,SAASH,GAAU,GAAgC;CACjD,IAAM,EAAE,WAAQ,gBAAaE,EAAK,UAAU,GACtCnC,IAAyB,CAAC;CAgBhC,OAfIqC,GAAQ,MAAM,MAAMC,EAAE,QAAQ,MAChC,EAAM,SAASD,EAAO,KAAK,MACzBC,EAAE,WAAW,EAAE,UAAUA,EAAE,SAAS,IAAI,CAAC,CAC3C,IAEEC,GAAU,WACZ,EAAM,WAAWA,EAAS,KAAK,MAC7B,OAAO,YACLH,GAAiB,QAAQ,MAAMI,EAAKC,OAAO,KAAA,CAAS,CAAC,CAAC,KAAK,MAAM,CAC/DA,GACAD,EAAKC,EACP,CAAC,CACH,CACF,IAEKzC;AACT;AAYA,SAASe,GAAe,GAAqD;CAG3E,IAAM2B,IAAS5B,KAAW,CAAC;CAC3B,OAAO;EACL,GAAGrT,GAAO;EACV,GAAIiV,EAAM,UAAU,KAAA,KAAa,EAAE,UAAU,EAAE;EAC/C,GAAIA,EAAM,WAAW,KAAA,KAAa,EAAE,WAAW,EAAE;EACjD,GAAGA;CACL;AACF;AAgBA,IAAaC,KAAa;CACxB,SAASxD;CACT,MAAMe;AACR;;;AC1bA,SAAgB0C,GACd,GACA,GACS;CAET,IADIC,EAAY,WAAW,KACvB,CAAC,MAAM,QAAQzM,CAAK,GAAG,OAAOA;CAClC,IAAM0M,IAAM,IAAI,IAAqBD,CAAW;CAChD,OAAOzM,EAAM,KAAK,MACX,MAAM,QAAQE,CAAM,IAClBA,EAAO,QAAQ,MAAkB;EACtC,IAAIC,KAAQ,MAAM,OAAO;EACzB,IAAI,OAAOA,KAAS,YAAY,UAAUA,GAAM;GAC9C,IAAMI,IAAQJ,EAA2B;GAIzC,OAHI,OAAOI,KAAS,YAAY,OAAOA,KAAS,WACvCmM,EAAI,IAAInM,CAAI,IAEd;EACT;EACA,OAAO;CACT,CAAC,IAXkCL,CAYpC;AACH;;;ACpBA,IAAayM,KAAqD;CAChE,MAAM;CACN,QAAQ;CACR,UAAU;AACZ,GCRahV,KAAS;CACpB,QAAQ;EACN,GAAG;EACH,sBAAsB,EAAE,UAAU,GAAG;CACvC;CACA,cAAc,EACZ,aAAa,MAAiBgJ,EAAM,QAAQ,QAAQ,aACtD;AACF,GCUMkM,KAA4B;CAChC,IAAI;CACJ,MAAM;CACN,OAAO;AACT;AA+DA,SAAgBC,GAAA,GAUU;gBAVmD,EAC3E,cACA,gBACA,iBACA,WACA,UAAUlV,GACV,YAAYC,GACZ,cACA,UAAAsH,GACA,iBAT2ErH,GAKjEiV,IAAA3O,MAAA,KAAA,IAAUlF,IAAVtB,GACEqV,IAAA1O,MAAA,KAAA,IAAYpF,IAAZtB,GAEZsV,IAAAhO,MAAA,KAAA,IAAWqN,KAAXzU,GAGM4G,IAAKzB,EAAY,GACPlF;CAAuC,AAAAkG,EAAA,OAAA+C,gBAAvC,IAAA;EAAE,GAAG0L;EAA+B,GAAG1L;CAAO,GAAP,EAAA,KAAAA;CAAvD,IAAM6C,IAAU9L,GACVoV,IAAWX,EAAY,SAAS,GAChCY,IAAYD,KAAYlI,EAAU,SAAS,GAK3CyB,IAAQ2G,GAAYb,GAAaU,GAAUI,CAAS,GACFtV;CACtC,AAAAiG,EAAA,OAAAkP,gBADsC,IAAA,EACtD,gBAAgBA,EAClB,GADkB,EAAA,KAAAA;CADlB,IAAM,EAAE,YAAS,kBAAexP,EAAae,GAAIgI,GAAO1O,CAEvD,GAKSC,GAEPC;CAFH,AACM+F,EAAA,OAAAqD,KAAArD,EAAA,OAAYkP,KAAAlP,EAAA,OAAU6I,KADlB,UAAM;EACd,AAAIxF,MAAY6L,KAAUrG,EAAWqG,CAAQ;CAC/C,GAAG,IAAA;EAAC7L;EAAS6L;EAAUrG;CAAU,GAD3B,EAAA,KAAAxF,GAAY,EAAA,KAAA6L,GAAU,EAAA,KAAArG,+CAD5B9B,EAAU/M,GAEPC,CAA+B;CAEDC,IAAAA;CAC3B,AAAA8F,EAAA,OAAAkP,KAAAlP,EAAA,QACFsP,KAAAtP,EAAA,QAEiBgH,KAJY,UAAM;EACrC,AACEsI,EADEJ,IACW,CAAC,IAED,CAAC,GAAGlI,CAAS,CAAC;CAE/B,GALM,EAAA,KAAAkI,GACF,EAAA,MAAAI,GAEiB,EAAA,MAAAtI;CAJrB,IAAMoE,IAAejR,GAQf0L,IAAWsJ,IAEbD,IACEtJ,EAAQ,SACRA,EAAQ,OAHVA,EAAQ,UAINhD,IAAOsM,IAAWH,IAAYF,GASlBpN,IAAA,CAAC0N,GAEiB3N,IAAA0N,KAAYhU,GAAO,cAA3Cd;CAAwBC,AAAAA,EAAAA,QAAAA,iBAAxB,IAAA;EAAE,GAAGa,GAAO;EAAQ,GAAIb;CAAiC,GAAjCA,EAAAA,MAAAA;CAE5BC,IAAAA;CAAC,AAAA0F,EAAA,QAAA4C,KAAA5C,EAAA,QAA0BsD,KAA3B,IAAA,kBAACV,GAAD;EAAM,UAAS;EAAQ,GAAIU;CAAY,CAAA,GAAtC,EAAA,MAAAV,GAA0B,EAAA,MAAAU;CAT/B/I,IAAAA;CAMa,AAAAyF,EAAA,QAAAoL,KAAApL,EAAA,QAFKkP,KAAAlP,EAAA,QAGV5F,KAAAA,EAAAA,QAEJE,KAAAA,EAAAA,QAJUE,KAAAA,EAAAA,QAFEqL,KAHhB,IAAA,kBAAC,QAAD,EAAA,UACE,kBAACrC,GAAD;EACE,MAAK;EACL,cAAYqC;EACZ,gBAAcqJ;EACd,UAAU1U;EACV,SAAS4Q;EACT,IAAIhR;EAEJE,UAAAA;CACU,CAAA,EACR,CAAA,GALO,EAAA,MAAA8Q,GAFK,EAAA,MAAA8D,GAGV9U,EAAAA,MAAAA,GAEJE,EAAAA,MAAAA,GAJUE,EAAAA,MAAAA,GAFE,EAAA,MAAAqL;CAJlBpL,IAAAA;CADF,OAEIF,EAAAA,QAAAA,KAAAA,EAAAA,QADcsL,KAAhB,IAAA,kBAAC1K,GAAD;EAAS,OAAO0K;EACdtL,UAAAA;CAYO,CAAA,GAZPA,EAAAA,MAAAA,GADc,EAAA,MAAAsL,2BAAhBpL;AAeJ;AAiBA,SAAS2U,GACP,GACA,GAKA,GAC0B;eACpBG,IAAcrL,EAAO+K,CAAQ,GACzBvU;CAAV,AACwBsF,EAAA,OAAAiP,gBADd,UAAM;EACd,EAAY,UAAUA;CACxB,GADwB,EAAA,KAAAA,cADxBlI,EAAUrM,CAET;CAKCC,IAAAA;CAA0D,AAAAqF,EAAA,OAAAqP,KAAArP,EAAA,OAAbuO,KAA7C,KAAC,MAAkBgB,EAAY,QAAQjP,GAAMiO,GAAac,CAAS,GAAT,EAAA,KAAAA,GAAb,EAAA,KAAAd;CAD/C,IAAMnL,IAAKxI,GAIUC;CAArB,OAA+DmF,EAAA,OAAAoD,gBAA1C,IAAA,CAAC;EAAE,YAAYuL;EAA2B;CAAG,CAAC,GAAJ,EAAA,KAAAvL,cAAxDtI;AACT;;;ACzLA,SAAgB0U,GAAiB,GAAqB;eAGhDpU;qDAAC,IAAA,kBAAA,QAAD;EACE,MAAK;EACL,UAAS;EACT,GAAE;EACF,UAAS;CACV,CAAA;CANHC,IAAAA;CADF,OACmC2E,EAAA,OAAAyP,gBAAjC,IAAA,kBAACC,GAAD;EAAS,SAAQ;EAAY,GAAID;EAC/BrU,UAAAA;CAMO,CAAA,GAPwB,EAAA,KAAAqU,cAAjCpU;AASJ;;;ACPA,IAAasU,KAAmD;CAC9D,SAAS;CACT,OAAO;CACP,OAAO;AACT,GCRaC,KAAS;CACpB,QAAQ;EACN,GAAG;EACH,sBAAsB,EAAE,UAAU,GAAG;CACvC;CACA,cAAc,EACZ,aAAa,MAAiBnN,EAAM,QAAQ,QAAQ,aACtD;CACA,WAAW,EACT,UAAU,SACZ;CACA,QAAQ;EACN,OAAO;EACP,iBAAiB;EACjB,YAAY;EACZ,IAAI;EACJ,IAAI;CACN;CACA,MAAM;EACJ,UAAU;EACV,QAAQ;EACR,IAAI;EACJ,aAAa;EACb,sCAAsC,EACpC,SAAS,EACX;EACA,mBAAmB;GACjB,SAAS;GACT,cAAc;GACd,eAAe;EACjB;EACA,8CAA8C,EAC5C,SAAS,EACX;CACF;CACA,cAAc;EACZ,SAAS;EACT,QAAQ;CACV;CACA,YAAY;EACV,UAAU;EACV,MAAM;EACN,KAAK;EACL,WAAW;EACX,OAAO;EACP,UAAU;EACV,SAAS;EACT,YAAY;EACZ,wBAAwB,EACtB,SAAS,EACX;CACF;CACA,mBAAmB,EACjB,SAAS,EACX;AACF;;;ACrCA,SAAgBoN,GAAA,GAIY;gBAJO,EACjC,OACA,UACA,gBAAgBtU,MAHiBC,GAGjBsU,IAAA5P,MAAA,KAAA,IAAa9D,IAAbb,GASAE;CAAE,AAAAuE,EAAA,OAAAS,gBAAF,IAAA,EAAE,MAAG,GAAH,EAAA,KAAAA;CAPlB,IAAM,EACJ,eACA,cACA,eACA,cACA,eACA,kBACEuP,EAAYvU,CAAM,GAGTC;CACT,AAAAsE,EAAA,OAAAwI,gBADS,IAAAyH,GAAI,UAAU,SACvBzH,IAAY;EAAE,GAAGA;EAAW,GAAG;CAAE,IAAI,IACvC,GADE,EAAA,KAAAA;CAFmB7M,IAAAA;CACVD,AAAAA,EAAAA,OAAAA,KAAAA,EAAAA,OAGXwU,KAJqB,IAAA;EACrB,WAAWxU;EAGX;CACF,GAJaA,EAAAA,KAAAA,GAGX,EAAA,KAAAwU;CAJF,IAAMC,IAAiBxU,GAgBOyF,IAAAgP,KAAcR,GAAO,cAA3ChU;CAAsBC,AAAAA,EAAAA,OAAAA,gBAAtB,IAAA;EAAE,GAAG+T,GAAO;EAAM,GAAI/T;CAAmC,GAAnCA,EAAAA,KAAAA;CAMlB,IAAAyF,IAAA8O,KAAcR,GAAO,mBAFvB9T;CAEEC,AAAAA,EAAAA,OAAAA,iBAFF,IAAA;EACF,GAAG6T,GAAO;EACV,GAAI7T;CACN,GADMA,EAAAA,KAAAA;CAJRC,IAAAA;CAAC,AAAAgE,EAAA,QAAA8P,KAAA9P,EAAA,QAEKlE,KAFN,IAAA,kBAACgU,GAAD;EACE,WAAU;EACV,IAAIhU;CAIL,CAAA,GANA,EAAA,MAAAgU,GAEKhU,EAAAA,MAAAA;CAKNG,IAAAA;CAAe,AAAA+D,EAAA,QAAAqQ,iBAAf,IAAA,kBAAChG,GAAD,EAAA,UAAegG,EAAoB,CAAA,GAApB,EAAA,MAAAA;CAjBjBnU,IAAAA;CADF,OAIQ8D,EAAA,QAAAsQ,KAAAtQ,EAAA,QACAuQ,KAAAvQ,EAAA,QAHCwQ,KAAAxQ,EAAA,QAgBL/D,KAAAA,EAAAA,QATIL,KAAAA,EAAAA,QAEJI,KAAAA,EAAAA,QAROmU,KAFT,IAAA,kBAAC/F,GAAD;EACE,KAAKoG;EACL,OAAOL;EACP,GAAIG;EACJ,GAAIC;EACJ,gBAAA;EACA,MAAK;EACL,UAAU;EACV,IAAI3U;EARN,UAAA,CAUEI,GAOAC,CACQ;KAfJ,EAAA,MAAAqU,GACA,EAAA,MAAAC,GAHC,EAAA,MAAAC,GAgBLvU,EAAAA,MAAAA,GATIL,EAAAA,MAAAA,GAEJI,EAAAA,MAAAA,GARO,EAAA,MAAAmU,2BAFTjU;AAoBJ;;;ACJA,SAAgBuU,GAAA,GAMM;gBANO,EAC3B,YACA,WACA,MAAMpU,GACN,cACA,sBAL2BC,GAGrBsG,IAAA1C,MAAA,KAAA,IAAOsP,KAAPnT,GAIAoE,IAAKzB,EAAY,GACPzC;CAAsC,AAAAyD,EAAA,OAAA+C,gBAAtC,IAAA;EAAE,GAAG4M;EAA8B,GAAG5M;CAAO,GAAP,EAAA,KAAAA;CAAtD,IAAM6C,IAAUrJ,GACV,CAACoM,GAAUC,KAAe5H,EAA6B,IAAI,GAE3D0P,IAAcxR,EAGlBuB,GAAIjE,EAAoB,GAEPC;CAEZ,IAAAuD,EAAA,OAAA0Q,KAAA1Q,EAAA,OADa4Q,GAAA;;GAAlB,IAAMC,IAAYD,EAAQ,IAAIlU,EAAW;GACzC,IAAI,CAACgU,KAAeA,EAAY,WAAW,GAAA;IAAG,IAAOG;IAAP,MAAA;;GAE9C,IAAME,IAAc,IAAI,IAAIF,CAAS,GAC/BG,oBAAO,IAAI,IAAY,GACvBC,IAAgB,CAAC;GACvB,KAAK,IAAMC,KAAOR,GAChB,AAAIK,EAAY,IAAIG,CAAG,KAAK,CAACF,EAAK,IAAIE,CAAG,MACvCD,EAAI,KAAKC,CAAG,GACZF,EAAK,IAAIE,CAAG;GAGhB,KAAK,IAAMvU,KAAOkU,GAChB,AAAKG,EAAK,IAAIrU,CAAG,KAAGsU,EAAI,KAAKtU,CAAG;GAElC,IAAOsU;;EAdF,EAAA,KAAAP,GADa,EAAA,KAAAE;;CADpB,IAAMQ,IAAa3U,GAoBJG;CAAQ,AAAAoD,EAAA,OAAA4Q,gBAAR,IAAA,IAAI,IAAIA,EAAQ,IAAI/T,EAAgB,CAAC,GAA7B,EAAA,KAAA+T;CAArB,IAAMU,IAAO1U,GAEPE;CAEM,IAAAkD,EAAA,OAAAsR,KAAAtR,EAAA,OADMoR,GAAA;EADlB,IAAgC,CAAC;EACjC,KAAK,IAAMzU,KAAOyU,GAAY;GAC5B,IAAMrU,IAAIuU,EAAK,IAAI3U,CAAG;GACtB,AAAII,KAAK,QAAMwU,EAAI,KAAKxU,CAAC;EAC3B;EAFY,EAAA,KAAAuU,GADM,EAAA,KAAAF;;CAJpB,IAAMM,IAAiB1U,GAaKC;sDACxB,IAAA,EAAA,kBAAkB0U,EACpB;CAJF,IAAMC,IAAUC,GACdC,GAAUC,EAAa,GACvBD,GAAUE,IAAgB/U,CAEzB,CACH,GAE+BC;sDAAC,KAAA,MAAqC;EAEnE,AADA,EAAE,gBAAgB,GAClB0L,EAAY,EAAE,aAAa;CAC7B;CAHA,IAAMqJ,IAAa9U,GAIaC;sDAAM,UAAAwL,EAAY,IAAI;CAAtD,IAAMsD,IAAc7O,GAGlBC;CAOiB,AAAA0C,EAAA,QAAAS,KAAAT,EAAA,QAJEoR,KAHnB,KAAC,MAAwB;EACvB,IAAM,EAAE,WAAQ,YAASc;EACzB,IAAI,CAACC,KAAQC,EAAO,OAAOD,EAAK,IAAI;EACpC,IAAME,IAAWjB,EAAW,QAAQ,OAAOgB,EAAO,EAAE,CAAC,GAC/CE,IAAWlB,EAAW,QAAQ,OAAOe,EAAK,EAAE,CAAC;EACnD,IAAIE,MAAa,MAAMC,MAAa,IAAI;EACxC,IAAMxJ,IAAOyJ,GAAU,CAAC,GAAGnB,CAAU,GAAGiB,GAAUC,CAAQ;EAC1D,EAAe7R,CAAE,CAAC,CAAC,SAAS,EAC1B,aAAaqI,EACf,CAAqC;CACvC,GAHiB,EAAA,MAAArI,GAJE,EAAA,MAAA2Q;CAJrB,IAAMoB,IAAgBjV;CAetB,IAAIqT,EAAQ,SAAS,GAAG,OAAO;CAE/B,IAAM6B,IAAS,EAAQ9J,GAUAlH,IAAAgR,IAAS,uBAAuB,KAAA,GAChCjR,KAAAiR,IAAS,SAAS,KAAA,GAEtB/Q,KAAA+Q,IAAS,WAAW,KAAA,GACHxN,IAAAwN,KAAU7C,GAAO,cAAzCpS;CAAwBC,AAAAA,EAAAA,QAAAA,iBAAxB,IAAA;EAAE,GAAGmS,GAAO;EAAQ,GAAInS;CAA+B,GAA/BA,EAAAA,MAAAA;CAE5BC,IAAAA;CAAC,AAAAsC,EAAA,QAAA4C,KAAA5C,EAAA,QAA0BsD,KAA3B,IAAA,kBAACV,GAAD;EAAM,UAAS;EAAQ,GAAIU;CAAY,CAAA,GAAtC,EAAA,MAAAV,GAA0B,EAAA,MAAAU;CAX7B3F,IAAAA;CAEsBC,AAAAA,EAAAA,QAAAA,EAAAA,WAAAA,EAAAA,QACN6U,KAAAzS,EAAA,QAGCnC,MAAAA,EAAAA,QAEJC,MAAAA,EAAAA,QACPN,KAAAA,EAAAA,QAEJE,KAAAA,EAAAA,QANeK,KALjB,IAAA,kBAACyF,GAAD;EACE,MAAK;EACL,cAAYoC,EAAQ;EACpB,gBAAc6M;EACd,iBAAc;EACd,iBAAe1U;EACf,iBAAeF;EACf,SAASoU;EACT,WAAWnU;EACX,IAAIN;EAEJE,UAAAA;CACU,CAAA,GAVUE,EAAAA,MAAAA,EAAAA,SACN,EAAA,MAAA6U,GAGC5U,EAAAA,MAAAA,IAEJC,EAAAA,MAAAA,IACPN,EAAAA,MAAAA,GAEJE,EAAAA,MAAAA,GANeK,EAAAA,MAAAA;CANnBC,IAAAA;CAAwBJ,AAAAA,EAAAA,QAAAA,EAAAA,WAAAA,EAAAA,QACtBD,KADF,IAAA,kBAACiB,GAAD;EAAS,OAAOgH,EAAQ;EACtBjI,UAAAA;CAaO,CAAA,GAdeC,EAAAA,MAAAA,EAAAA,SACtBD,EAAAA,MAAAA;CAyBgBM,IAAAA,GACGC,IACNC;sDAFG,IAAA;EAAE,UAAU;EAAU,YAAY;CAAQ,GACvC,KAAA;EAAE,UAAU;EAAO,YAAY;CAAQ,GAC7C,IAAA,EAAE,OAAO,EAAE,IAAIyR,GAAO,UAAU,EAAE;CAE7CxR,IAAAA;CACWC,AAAAA,EAAAA,QAAAA,EAAAA,qBADX,IAAA,kBAACqU,GAAD;EAAe,eAAA;EAAc,MAAK;EAAe,IAAI9C,GAAO;EACzD,UAAAhK,EAAQ;CACI,CAAA,GADJvH,EAAAA,MAAAA,EAAAA;CAMRC,IAAAA;CAKmB,AAAA0B,EAAA,QAAA2S,KAAA3S,EAAA,QALnB0R,KAAe,IAAAA,EAAA,KAAK,MACnB,kBAAC7B,IAAD;EAEE,IAAI+C,EAAO;EACX,OAAOA,EAAO;EACE;CACjB,GAJMA,EAAO,EAIb,CACF,GAFmB,EAAA,MAAAD,GALnB,EAAA,MAAAjB;CAJHnT,IAAAA;CACS,AAAAyB,EAAA,QAAAoR,KAAApR,EAAA,QAGN1B,KAJH,IAAA,kBAACuU,IAAD;EACE,OAAOzB;EACP,UAAU0B;EAETxU,UAAAA;CAQc,CAAA,GAXR,EAAA,MAAA8S,GAGN9S,EAAAA,MAAAA;CAhBLE,IAAAA;CAEY,AAAAwB,EAAA,QAAA2I,KAAA3I,EAAA,QACJyS,KAAAzS,EAAA,QAMN5B,KAAAA,EAAAA,QAGAG,KAZF,KAAA,kBAACgM,GAAD;EACE,IAAG;EACO;EACV,MAAMkI;EACN,SAASvG;EACT,cAAcjO;EACd,iBAAiBC;EACjB,WAAWC;EAPb,UAAA,CASEC,GAGAG,CAaI;KAvBM,EAAA,MAAAoK,GACJ,EAAA,MAAA8J,GAMNrU,EAAAA,MAAAA,GAGAG,EAAAA,MAAAA;CAlBJE,IAAAA;CAGa,AAAAuB,EAAA,QAAAwS,KAAAxS,EAAA,QAFF4R,KAAA5R,EAAA,QAKTxB,MANF,IAAA,kBAACuU,IAAD;EACW;EACT,oBAAoBC;EACpB,WAAWR;EACX,YAAY;EAEZhU,UAAAA;CA0BU,CAAA,GA7BC,EAAA,MAAAgU,GAFF,EAAA,MAAAZ,GAKTpT,EAAAA,MAAAA;CAtBJE,IAAAA;CADF,OAEIV,EAAAA,QAAAA,KAAAA,EAAAA,QAeAS,KAhBF,KAAA,kBAAAI,GAAA,EAAA,UAAA,CACEb,GAeAS,CAiCA,EAAA,CAAA,GAhDAT,EAAAA,MAAAA,GAeAS,EAAAA,MAAAA,6BAhBFC;AAmDJ;AA9FqC,SAAA2S,GAAC,GAAA;CAAM,OAAA,CAACtU,EAAE,IAAIA,CAAC;;AAnBlB,SAAA+T,GAAC,GAAA;CAAM,OAAA7Q,EAAE;;AAHnC,SAAA0Q,GAAC,GAAA;CAAM,OAAAlN,EAAE"}