@evergis/react 4.0.101 → 4.0.103

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.esm.js CHANGED
@@ -100,7 +100,30 @@ const ChartWrapperContainer = styled.div.withConfig({ displayName: "ChartWrapper
100
100
  position: relative;
101
101
  width: 100%;
102
102
  `;
103
- const Tooltip = styled.div.withConfig({ displayName: "Tooltip", componentId: "sc-2prpr" }) `
103
+ /*
104
+ * fill-режим: обёртка забирает всю доступную ячейку (её высоту задаёт флекс-цепочка, а не контент графика),
105
+ * на неё вешается ref для ResizeObserver — меряем обе оси без цикла. Плоский div (не Flex uilib), как соседний
106
+ * ChartWrapperContainer, чтобы ref гарантированно дошёл до DOM-узла. Тело графика центрируется внутри.
107
+ */
108
+ const ChartFillMeasure = styled.div.withConfig({ displayName: "ChartFillMeasure", componentId: "sc-1r4oerb" }) `
109
+ position: relative;
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ width: 100%;
114
+ height: 100%;
115
+ min-width: 0;
116
+ min-height: 0;
117
+ overflow: hidden;
118
+
119
+ /* SVG по умолчанию inline, поэтому под ним остаётся зазор базовой линии (~4px при line-height
120
+ 18.4px): вне fill его скрывал запас высоты, а тело, точно заполнившее ячейку, из-за него
121
+ вылезает за нижнюю границу. Блочный SVG зазора не даёт. */
122
+ svg {
123
+ display: block;
124
+ }
125
+ `;
126
+ const Tooltip = styled.div.withConfig({ displayName: "Tooltip", componentId: "sc-1va8cy3" }) `
104
127
  position: relative;
105
128
  border-radius: 0.25rem;
106
129
  background-color: rgba(28, 33, 48);
@@ -193,7 +216,7 @@ const LineChartStyles = createGlobalStyle `
193
216
  fill: ${({ theme: { palette } }) => palette.textDisabled};
194
217
  }
195
218
  `;
196
- const StyledBarChart = styled(BarChart$1).withConfig({ displayName: "StyledBarChart", componentId: "sc-1i0hrvl" }) `
219
+ const StyledBarChart = styled(BarChart$1).withConfig({ displayName: "StyledBarChart", componentId: "sc-1l1kx80" }) `
197
220
  .domain {
198
221
  display: none;
199
222
  }
@@ -3381,6 +3404,8 @@ const ALIGNMENTS = ["left", "center", "right"];
3381
3404
  const ALIGN_ITEMS = ["flex-start", "center", "flex-end", "stretch", "baseline"];
3382
3405
  /** Масштабирование изображения внутри своего бокса (CSS `object-fit`). */
3383
3406
  const OBJECT_FITS = ["cover", "contain", "fill", "none", "scale-down"];
3407
+ /** Поведение контента, выходящего за бокс контейнера (CSS `overflow`). */
3408
+ const OVERFLOWS = ["visible", "hidden", "scroll", "auto"];
3384
3409
  /** Режим отображения коллекций. */
3385
3410
  const VIEW_MODES = ["grid", "list"];
3386
3411
  var ContainerTemplate;
@@ -3495,6 +3520,13 @@ const BASE_CONTAINER_STYLE = {
3495
3520
  const StackBarContainer = styled(Flex).withConfig({ displayName: "StackBarContainer", componentId: "sc-stc97k" }) `
3496
3521
  flex-wrap: nowrap;
3497
3522
  width: 100%;
3523
+
3524
+ ${({ $fill }) => $fill &&
3525
+ css `
3526
+ /* fill: полоса забирает остаток высоты обёртки (вся ячейка минус шапка с итогом). */
3527
+ flex: 1 1 auto;
3528
+ min-height: 0;
3529
+ `}
3498
3530
  `;
3499
3531
  const StackBarHeader = styled(Flex).withConfig({ displayName: "StackBarHeader", componentId: "sc-8mc354" }) `
3500
3532
  justify-content: space-between;
@@ -3504,7 +3536,8 @@ const StackBarHeader = styled(Flex).withConfig({ displayName: "StackBarHeader",
3504
3536
  const StackBarSection = styled.div.withConfig({ displayName: "StackBarSection", componentId: "sc-i3gdu" }) `
3505
3537
  cursor: ${({ onClick }) => (onClick ? "pointer" : "default")};
3506
3538
  width: ${({ $width }) => $width}%;
3507
- height: ${({ $height }) => ($height ? `${$height}px` : "0.5rem")};
3539
+ /* В fill толщину полосы задаёт растянутый контейнер, а не options.height элемента chart. */
3540
+ height: ${({ $fill, $height }) => ($fill ? "100%" : $height ? `${$height}px` : "0.5rem")};
3508
3541
  margin: 0 0.5px;
3509
3542
  background-color: ${({ $color }) => $color};
3510
3543
  opacity: ${({ hasAnyFilter, isFiltered }) => (isFiltered ? 1 : hasAnyFilter ? FILTERED_VALUE_OPACITY / 100 : 1)};
@@ -7630,30 +7663,33 @@ const useRenderElement = (type = WidgetType.Dashboard, elementConfig) => {
7630
7663
  ]);
7631
7664
  };
7632
7665
 
7666
+ /** Пустой бокс на отключённом пути — стабильная ссылка, чтобы не плодить ре-рендеры. */
7667
+ const EMPTY_BOX = {};
7633
7668
  /**
7634
- * Измеряет фактическую ширину DOM-элемента и обновляет её на любой ресайз (ResizeObserver).
7669
+ * Измеряет фактические ширину и высоту DOM-элемента и обновляет их на любой ресайз (ResizeObserver).
7635
7670
  *
7636
- * Возвращает `[ref, width]`, где `width` — число пикселей либо `undefined`, пока элемент ещё
7637
- * не измерен. Используется для «резинового» графика: d3-графикам нужна конкретная пиксельная
7638
- * ширина, а не CSS `100%`.
7671
+ * Возвращает `[ref, box]`, где `box` — `{ width, height }` в пикселях (content-box) либо пустой объект,
7672
+ * пока элемент ещё не измерен. Используется для «резинового» графика: d3-графикам нужны конкретные
7673
+ * пиксельные размеры, а не CSS `100%`, а для вписывания (fit) нужны обе оси.
7639
7674
  *
7640
7675
  * `enabled: false` полностью отключает наблюдение — обычные (не fill) графики не измеряются
7641
7676
  * и не вызывают лишних ре-рендеров.
7642
7677
  */
7643
- const useResizeWidth = (enabled) => {
7678
+ const useResizeBox = (enabled) => {
7644
7679
  const ref = useRef(null);
7645
- const [width, setWidth] = useState();
7680
+ const [box, setBox] = useState(EMPTY_BOX);
7646
7681
  useEffect(() => {
7647
7682
  const node = ref.current;
7648
7683
  if (!enabled || !node)
7649
7684
  return;
7650
7685
  const observer = new ResizeObserver(([entry]) => {
7651
- setWidth(entry.contentRect.width);
7686
+ const { width, height } = entry.contentRect;
7687
+ setBox({ width, height });
7652
7688
  });
7653
7689
  observer.observe(node);
7654
7690
  return () => observer.disconnect();
7655
7691
  }, [enabled]);
7656
- return [ref, enabled ? width : undefined];
7692
+ return [ref, enabled ? box : EMPTY_BOX];
7657
7693
  };
7658
7694
 
7659
7695
  const useShownOtherItems = (options) => {
@@ -7699,13 +7735,13 @@ const useUpdateDataSource = ({ dataSource, config, filters, attributes, layerPar
7699
7735
  */
7700
7736
  const useWrapperSize = ({ elementConfig, defaults }) => {
7701
7737
  const { id, style, templateName, options } = elementConfig || {};
7702
- const { width, height } = options || {};
7738
+ const { width, height, overflow } = options || {};
7703
7739
  return useMemo(() => ({
7704
7740
  id,
7705
7741
  "data-templatename": templateName,
7706
7742
  style,
7707
- $sizeCss: getWrapperSizeStyle({ style, width, height, defaults, defaultWidth: FILL_SIZE }),
7708
- }), [id, templateName, style, width, height, defaults]);
7743
+ $sizeCss: getWrapperSizeStyle({ style, width, height, overflow, defaults, defaultWidth: FILL_SIZE }),
7744
+ }), [id, templateName, style, width, height, overflow, defaults]);
7709
7745
  };
7710
7746
 
7711
7747
  const ContainersGroupContainer = memo(({ elementConfig, type, renderElement }) => {
@@ -7775,6 +7811,19 @@ const ContainerChart = styled(Flex).withConfig({ displayName: "ContainerChart",
7775
7811
  justify-content: center;
7776
7812
  width: 100%;
7777
7813
  }
7814
+
7815
+ /* fill: слот забирает остаток высоты ячейки (под слотами title/alias/legend) и центрирует тело графика. */
7816
+ ${({ $fill }) => $fill &&
7817
+ css `
7818
+ flex: 1 1 auto;
7819
+ min-height: 0;
7820
+ align-items: center;
7821
+ justify-content: center;
7822
+
7823
+ > * {
7824
+ height: 100%;
7825
+ }
7826
+ `}
7778
7827
  `;
7779
7828
  const ContainerLegend = styled(Flex).withConfig({ displayName: "ContainerLegend", componentId: "sc-z1n1s8" }) ``;
7780
7829
  const ContainerUnits = styled.div.withConfig({ displayName: "ContainerUnits", componentId: "sc-1vurgy9" }) `
@@ -7790,6 +7839,13 @@ const ContainerValue = styled(Flex).withConfig({ displayName: "ContainerValue",
7790
7839
  font-size: ${({ big }) => (big ? 1.5 : 1)}rem;
7791
7840
  color: ${({ fontColor, theme: { palette } }) => fontColor || palette.textPrimary};
7792
7841
 
7842
+ /* fill: строка со слотом chart+legend забирает остаток высоты Container'а (гейт — только у Chart-контейнера). */
7843
+ ${({ $fill }) => $fill &&
7844
+ css `
7845
+ flex: 1 1 auto;
7846
+ min-height: 0;
7847
+ `}
7848
+
7793
7849
  > * {
7794
7850
  width: ${({ column }) => (column ? "100%" : "auto")};
7795
7851
  }
@@ -7896,15 +7952,16 @@ const useRenderContainer = ({ elementConfig, type, renderElement, renderBody, })
7896
7952
  };
7897
7953
 
7898
7954
  const OneColumnContainer = memo(({ type, elementConfig, renderElement }) => {
7899
- const { width, height } = elementConfig?.options || {};
7955
+ const { width, height, overflow } = elementConfig?.options || {};
7900
7956
  const templateName = elementConfig?.templateName;
7901
7957
  const renderBody = useCallback(({ id, value, style, hasUnits, render }) => (jsxs(Container, { id: id, isColumn: true, "data-templatename": templateName, style: style, "$sizeCss": getWrapperSizeStyle({
7902
7958
  style,
7903
7959
  width,
7904
7960
  height,
7961
+ overflow,
7905
7962
  defaults: BASE_CONTAINER_STYLE,
7906
7963
  defaultWidth: FILL_SIZE,
7907
- }), children: [jsxs(ContainerAlias, { hasBottomMargin: true, children: [render({ id: "alias" }), render({ id: "tooltip" }), render({ id: "modal" })] }), jsxs(ContainerValue, { children: [value, hasUnits && (jsx(ContainerUnits, { children: render({ id: "units" }) }))] })] })), [width, height, templateName]);
7964
+ }), children: [jsxs(ContainerAlias, { hasBottomMargin: true, children: [render({ id: "alias" }), render({ id: "tooltip" }), render({ id: "modal" })] }), jsxs(ContainerValue, { children: [value, hasUnits && (jsx(ContainerUnits, { children: render({ id: "units" }) }))] })] })), [width, height, overflow, templateName]);
7908
7965
  const { renderContainer, attributesToRender } = useRenderContainer({
7909
7966
  type,
7910
7967
  elementConfig,
@@ -7915,9 +7972,9 @@ const OneColumnContainer = memo(({ type, elementConfig, renderElement }) => {
7915
7972
  });
7916
7973
 
7917
7974
  const TwoColumnContainer = memo(({ elementConfig, type, renderElement }) => {
7918
- const { width, height } = elementConfig?.options || {};
7975
+ const { width, height, overflow } = elementConfig?.options || {};
7919
7976
  const templateName = elementConfig?.templateName;
7920
- const renderBody = useCallback(({ id, value, style, hasIcon, hasUnits, render }) => (jsxs(TwoColumnContainerWrapper, { id: id, "data-templatename": templateName, style: style, "$sizeCss": getWrapperSizeStyle({ style, width, height, defaultWidth: FILL_SIZE }), children: [jsxs(ContainerAlias, { children: [hasIcon && (jsx(ContainerAliasIcon, { children: render({ id: "icon" }) })), render({ id: "alias" }), render({ id: "tooltip" }), render({ id: "modal" })] }), jsxs(ContainerValue, { big: true, children: [value, hasUnits && (jsx(ContainerUnits, { children: render({ id: "units" }) }))] })] })), [width, height, templateName]);
7977
+ const renderBody = useCallback(({ id, value, style, hasIcon, hasUnits, render }) => (jsxs(TwoColumnContainerWrapper, { id: id, "data-templatename": templateName, style: style, "$sizeCss": getWrapperSizeStyle({ style, width, height, overflow, defaultWidth: FILL_SIZE }), children: [jsxs(ContainerAlias, { children: [hasIcon && (jsx(ContainerAliasIcon, { children: render({ id: "icon" }) })), render({ id: "alias" }), render({ id: "tooltip" }), render({ id: "modal" })] }), jsxs(ContainerValue, { big: true, children: [value, hasUnits && (jsx(ContainerUnits, { children: render({ id: "units" }) }))] })] })), [width, height, overflow, templateName]);
7921
7978
  const { renderContainer, attributesToRender } = useRenderContainer({
7922
7979
  type,
7923
7980
  elementConfig,
@@ -8299,6 +8356,15 @@ const BarChartContainer = styled.div.withConfig({ displayName: "BarChartContaine
8299
8356
  const AnyChartWrapper = styled.div.withConfig({ displayName: "AnyChartWrapper", componentId: "sc-1txgly0" }) `
8300
8357
  width: 100%;
8301
8358
  height: ${({ height }) => height}px;
8359
+
8360
+ ${({ $fill }) => $fill &&
8361
+ css `
8362
+ /* fill: обёртке задана ВСЯ доступная высота ячейки, поэтому тело внутри забирает её остаток
8363
+ флексом (полоса stack тянется под строкой итога), а не вычисляется арифметикой. */
8364
+ display: flex;
8365
+ flex-direction: column;
8366
+ min-height: 0;
8367
+ `}
8302
8368
  `;
8303
8369
  const BarChartWrapper = styled(AnyChartWrapper).withConfig({ displayName: "BarChartWrapper", componentId: "sc-98mm1q" }) `
8304
8370
  width: 100%;
@@ -8421,6 +8487,10 @@ const ChartContainerWrapper = styled(FlexSpan).withConfig({ displayName: "ChartC
8421
8487
  /* Заданная высота контейнера достаётся телу графика — за вычетом заголовка. */
8422
8488
  ${({ $sizeCss }) => !!$sizeCss?.height &&
8423
8489
  css `
8490
+ /* Раздача высоты требует, чтобы обёртка была flex-колонкой (FlexSpan сам по себе не flex),
8491
+ иначе Container с flex:1 1 auto не растянется на заданную высоту, а fill-график не впишется по высоте. */
8492
+ display: flex;
8493
+
8424
8494
  > ${Container} {
8425
8495
  flex: 1 1 auto;
8426
8496
  min-height: 0;
@@ -8431,17 +8501,19 @@ const ChartContainerWrapper = styled(FlexSpan).withConfig({ displayName: "ChartC
8431
8501
  `;
8432
8502
 
8433
8503
  /**
8434
- * Флаг «растянуть график на всю ширину контейнера» (`options.chartFill` контейнера Chart).
8504
+ * Контекст вписывания графика (`options.fill` контейнера Chart).
8435
8505
  *
8436
8506
  * Компонент `Chart` рендерится через `renderElement({ id: "chart" })` и получает только дочерний
8437
8507
  * узел `{ id: "chart" }` — опции контейнера до него не доходят. `ChartContainer` оборачивает
8438
- * график в провайдер этого контекста, а `Chart` читает флаг через `useContext`.
8508
+ * график в провайдер этого контекста, а `Chart` читает значение через `useContext`.
8439
8509
  */
8440
- const ChartFillContext = createContext(false);
8510
+ const FillContext = createContext({ fill: false, fitHeight: false });
8441
8511
 
8442
8512
  const ChartContainer = memo(({ elementConfig, isVisible, type, renderElement }) => {
8443
8513
  const { options, children } = elementConfig || {};
8444
- const { twoColumns, hideEmpty, chartFill } = options || {};
8514
+ const { twoColumns, hideEmpty, height } = options || {};
8515
+ const fill = options?.fill;
8516
+ const fillContextValue = useMemo(() => ({ fill: !!fill, fitHeight: !!fill && height != null }), [fill, height]);
8445
8517
  const aliasElement = children.find(child => child.id === "alias");
8446
8518
  const chartElement = children.find(child => child.id === "chart");
8447
8519
  const legendElement = children.find(child => child.id === "legend");
@@ -8456,7 +8528,7 @@ const ChartContainer = memo(({ elementConfig, isVisible, type, renderElement })
8456
8528
  const hasItems = !!data[0]?.items?.length;
8457
8529
  if (!loading && !hasItems && hideEmpty)
8458
8530
  return null;
8459
- return (jsxs(ChartContainerWrapper, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(Container, { isColumn: true, children: [aliasElement && jsx(ContainerAlias, { hasBottomMargin: true, children: renderElement({ id: "alias" }) }), jsx(ContainerValue, { column: !twoColumns, alignItems: "center", children: hasItems ? (jsxs(Fragment$1, { children: [jsx(ContainerChart, { children: jsx(ChartFillContext.Provider, { value: !!chartFill, children: renderElement({ id: "chart" }) }) }), jsx(ContainerLegend, { justifyContent: legendElement?.options?.center ? "center" : "flex-start", children: renderElement({ id: "legend" }) })] })) : (jsx(Fragment$1, { children: "\u2014" })) })] }))] }));
8531
+ return (jsxs(ChartContainerWrapper, { ...root, children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), isVisible && (jsxs(Container, { isColumn: true, children: [aliasElement && jsx(ContainerAlias, { hasBottomMargin: true, children: renderElement({ id: "alias" }) }), jsx(ContainerValue, { column: !twoColumns, alignItems: twoColumns && fill ? "stretch" : "center", "$fill": !!fill, children: hasItems ? (jsxs(Fragment$1, { children: [jsx(ContainerChart, { "$fill": !!fill, children: jsx(FillContext.Provider, { value: fillContextValue, children: renderElement({ id: "chart" }) }) }), jsx(ContainerLegend, { justifyContent: legendElement?.options?.center ? "center" : "flex-start", children: renderElement({ id: "legend" }) })] })) : (jsx(Fragment$1, { children: "\u2014" })) })] }))] }));
8460
8532
  });
8461
8533
 
8462
8534
  const PagesContainer = memo(({ type = WidgetType.Dashboard, noBorders }) => {
@@ -11463,6 +11535,8 @@ const tagTypography = (tag) => ({ $typography }) => {
11463
11535
  ${style.fontSize && `font-size: ${style.fontSize};`}
11464
11536
  ${style.lineHeight && `line-height: ${style.lineHeight};`}
11465
11537
  ${style.fontWeight != null && `font-weight: ${style.fontWeight};`}
11538
+ ${style.marginTop && `margin-top: ${style.marginTop};`}
11539
+ ${style.marginBottom && `margin-bottom: ${style.marginBottom};`}
11466
11540
  `;
11467
11541
  };
11468
11542
  const MarkdownWrapper = styled.div.withConfig({ displayName: "MarkdownWrapper", componentId: "sc-1iv8z8a" }) `
@@ -12695,7 +12769,8 @@ const ChartLoading = ({ column }) => (jsx(Flex, { position: "absolute", width: "
12695
12769
 
12696
12770
  const ContainerLoading = () => (jsx(Flex, { alignContent: "center", justifyContent: "center", width: "100%", children: jsx(CircularProgress, { diameter: 1.5, mono: true }) }));
12697
12771
 
12698
- // forwardRef чтобы Chart мог измерить фактическую ширину обёртки (fill-режим, useResizeWidth).
12772
+ // forwardRef сохранён для совместимости; в fill-режиме ResizeObserver меряет внешнюю обёртку
12773
+ // ChartFillMeasure (см. Chart/index.tsx), а не сам ChartWrapper.
12699
12774
  const ChartWrapper = memo(forwardRef(({ width, height, column, loading, children }, ref) => {
12700
12775
  return (jsxs(ChartWrapperContainer, { ref: ref, column: column, style: { width, height }, children: [loading && jsx(ChartLoading, { column: column }), jsx(Flex, { opacity: loading ? FILTERED_VALUE_OPACITY / 100 : 1, children: children })] }));
12701
12776
  }));
@@ -13851,13 +13926,17 @@ const omitKeys = (source, keys = []) => {
13851
13926
  * конфликтующие внутренние дефолты обёртки, а контент лишается возможности её распирать
13852
13927
  * (`min-width`/`min-height: 0`). Для fill-высоты добавляется `flex: 1 1 auto` — в колонке
13853
13928
  * контейнер забирает остаток ячейки под заголовком, а не переполняет её на его высоту.
13929
+ *
13930
+ * `overflow` уходит в CSS как есть и ничем не подменяется: не задан — работает браузерный
13931
+ * `visible`, то есть контент крупнее бокса вытекает на соседние слоты.
13854
13932
  */
13855
- const getWrapperSizeStyle = ({ style, width: widthOption, height, defaults, defaultWidth, }) => {
13933
+ const getWrapperSizeStyle = ({ style, width: widthOption, height, overflow, defaults, defaultWidth, }) => {
13856
13934
  // Ширина по умолчанию (контейнеры передают FILL_SIZE): явный `options.width` её перекрывает.
13857
13935
  const width = widthOption ?? defaultWidth;
13858
13936
  const hasWidth = width != null;
13859
13937
  const hasHeight = height != null;
13860
- if (!hasWidth && !hasHeight) {
13938
+ const hasOverflow = overflow != null;
13939
+ if (!hasWidth && !hasHeight && !hasOverflow) {
13861
13940
  return defaults;
13862
13941
  }
13863
13942
  const fillWidth = isFillSize(width);
@@ -13866,13 +13945,18 @@ const getWrapperSizeStyle = ({ style, width: widthOption, height, defaults, defa
13866
13945
  ...(fillWidth ? FILL_WIDTH_CONFLICTS : []),
13867
13946
  ...(fillHeight ? FILL_HEIGHT_CONFLICTS : []),
13868
13947
  ];
13869
- const sizeKeys = [...(hasWidth ? ["width"] : []), ...(hasHeight ? ["height"] : [])];
13948
+ const sizeKeys = [
13949
+ ...(hasWidth ? ["width"] : []),
13950
+ ...(hasHeight ? ["height"] : []),
13951
+ ...(hasOverflow ? ["overflow"] : []),
13952
+ ];
13870
13953
  return {
13871
13954
  ...omitKeys(defaults, conflicts),
13872
13955
  // `options` перекрывают одноимённые поля `style` — приоритет тот же, что был у inline-варианта.
13873
13956
  ...omitKeys(style, sizeKeys),
13874
13957
  ...(hasWidth && { width, ...(fillWidth && { minWidth: 0 }) }),
13875
13958
  ...(hasHeight && { height, ...(fillHeight && { minHeight: 0, flex: "1 1 auto" }) }),
13959
+ ...(hasOverflow && { overflow }),
13876
13960
  };
13877
13961
  };
13878
13962
 
@@ -14005,7 +14089,7 @@ const tooltipValueFromRelatedFeatures = (t, value, relatedAttributes, layerInfo)
14005
14089
  return formatChartRelatedValue(t, value, layerInfo, relatedAttributes);
14006
14090
  };
14007
14091
 
14008
- const StackBar = ({ data, filterName, type, alias, options, renderElement, renderTooltip }) => {
14092
+ const StackBar = ({ data, filterName, type, alias, options, fill, renderElement, renderTooltip }) => {
14009
14093
  const { height, showTotal, cornerRadius, groupTooltip } = options || {};
14010
14094
  const { t } = useGlobalContext();
14011
14095
  const { hasAnyFilter, isFiltered, onFilter } = useWidgetFilters(type, filterName, data?.[0]?.items);
@@ -14019,11 +14103,11 @@ const StackBar = ({ data, filterName, type, alias, options, renderElement, rende
14019
14103
  const visibleItems = useMemo(() => items?.filter(({ value }) => Number(value) > 0), [items]);
14020
14104
  const getWidth = useCallback(value => ((Number(value) / total) * 100).toFixed(2), [total]);
14021
14105
  const renderGroupTooltip = useMemo(() => (jsx(ThemeProvider, { children: jsx(ChartTooltipTable, { cellPadding: 0, cellSpacing: 0, children: visibleItems?.map(({ name, value, color }, index) => (jsxs("tr", { children: [jsx("td", { children: jsxs(ChartTooltip, { alignItems: "center", children: [jsx(ChartTooltipColor, { "$color": color }), jsx(ChartTooltipName, { children: name })] }) }), jsx("td", { children: formatValue(value) })] }, index))) }) })), [visibleItems, formatValue]);
14022
- const renderItem = useCallback(({ name, value, color }, ref) => (jsx(StackBarSection, { ref: ref, "$width": getWidth(value), "$height": height, "$color": color, cornerRadius: cornerRadius, hasAnyFilter: hasAnyFilter, isFiltered: isFiltered(name), onClick: filterName ? () => onFilter(name) : undefined })), [cornerRadius, filterName, getWidth, hasAnyFilter, height, isFiltered, onFilter]);
14106
+ const renderItem = useCallback(({ name, value, color }, ref) => (jsx(StackBarSection, { ref: ref, "$width": getWidth(value), "$height": height, "$fill": fill, "$color": color, cornerRadius: cornerRadius, hasAnyFilter: hasAnyFilter, isFiltered: isFiltered(name), onClick: filterName ? () => onFilter(name) : undefined })), [cornerRadius, fill, filterName, getWidth, hasAnyFilter, height, isFiltered, onFilter]);
14023
14107
  const renderItems = useMemo(() => (jsx(Fragment$1, { children: visibleItems?.map((item, index) => (jsx(Fragment, { children: groupTooltip ? (renderItem(item)) : (jsx(ThemeProvider, { children: jsx(Tooltip$1, { placement: "top", arrow: true, content: renderTooltip([item]), children: ref => renderItem(item, ref) }) })) }, index))) })), [groupTooltip, visibleItems, renderItem, renderTooltip]);
14024
14108
  if (!total)
14025
14109
  return null;
14026
- return (jsxs(Fragment$1, { children: [(alias || showTotal) && (jsxs(StackBarHeader, { children: [jsx(StackBarAlias, { children: renderElement({ id: "alias" }) }), showTotal && (jsxs(StackBarTotal, { children: [jsx(StackBarValue, { children: formatValue(total) }), !!units && jsx(StackBarUnits, { children: units })] }))] })), groupTooltip ? (jsx(Tooltip$1, { placement: "top", arrow: true, content: renderGroupTooltip, children: ref => jsx(StackBarContainer, { ref: ref, children: renderItems }) })) : (jsx(StackBarContainer, { children: renderItems }))] }));
14110
+ return (jsxs(Fragment$1, { children: [(alias || showTotal) && (jsxs(StackBarHeader, { children: [jsx(StackBarAlias, { children: renderElement({ id: "alias" }) }), showTotal && (jsxs(StackBarTotal, { children: [jsx(StackBarValue, { children: formatValue(total) }), !!units && jsx(StackBarUnits, { children: units })] }))] })), groupTooltip ? (jsx(Tooltip$1, { placement: "top", arrow: true, content: renderGroupTooltip, children: ref => (jsx(StackBarContainer, { ref: ref, "$fill": fill, children: renderItems })) })) : (jsx(StackBarContainer, { "$fill": fill, children: renderItems }))] }));
14027
14111
  };
14028
14112
 
14029
14113
  const Chart = memo(({ config, element, elementConfig, type, renderElement }) => {
@@ -14032,10 +14116,10 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
14032
14116
  const primaryColor = palette.primary;
14033
14117
  const { t } = useGlobalContext();
14034
14118
  const { expandedContainers, attributes, dataSources } = useWidgetContext(type);
14035
- // chartFill контейнера: график тянется на всю ширину. Ширину измеряем реально (ResizeObserver),
14036
- // т.к. d3-графики (и useChartChange для line) требуют пиксельное число, а не CSS "100%".
14037
- const fill = useContext(ChartFillContext);
14038
- const [chartRef, measuredWidth] = useResizeWidth(fill);
14119
+ // fill контейнера: вписываем тело графика в контейнер. Размеры ячейки измеряем реально (ResizeObserver),
14120
+ // т.к. d3-графики (и useChartChange для line) требуют пиксельные числа, а не CSS "100%".
14121
+ const { fill, fitHeight } = useContext(FillContext);
14122
+ const [chartRef, { width: measuredWidth, height: measuredHeight }] = useResizeBox(fill);
14039
14123
  const { id, options, children } = element || {};
14040
14124
  const { column, markers: configMarkers, showLabels, showMarkers, showTotal, totalWord: configTotalWord, totalAttribute, expandable, expanded, chartType, relatedDataSources, defaultColor, dotSnapping, } = options || {};
14041
14125
  const isLineChart = chartType === "line";
@@ -14071,11 +14155,19 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
14071
14155
  const chartWidth = fill
14072
14156
  ? measuredWidth ?? DEFAULT_CHART_WIDTH
14073
14157
  : toPxNumber(width) ?? DEFAULT_CHART_WIDTH;
14158
+ // Фит по высоте включается только при заданной высоте контейнера (fitHeight) и уже измеренной
14159
+ // ячейке; иначе — прежняя фикс. высота options.height. Флаг важен и ниже: он различает два
14160
+ // смысла chartHeight — «высота тела» (вне fill) и «вся доступная высота» (в fill).
14161
+ const fitsHeight = useMemo(() => !!(fill && fitHeight && measuredHeight), [fill, fitHeight, measuredHeight]);
14162
+ // fill по высоте: тянем тело графика на измеренную доступную высоту ячейки (content-box минус слоты).
14163
+ const chartHeight = useMemo(() => (fitsHeight && measuredHeight ? measuredHeight : height), [fitsHeight, measuredHeight, height]);
14164
+ // Круглый график вписываем по короткой стороне (object-fit: contain), центрируя в ячейке.
14165
+ const pieSide = useMemo(() => (fitsHeight && measuredHeight ? Math.min(chartWidth, measuredHeight) : chartWidth), [fitsHeight, measuredHeight, chartWidth]);
14074
14166
  const [customize] = useChartChange({
14075
14167
  dataSources: config.dataSources,
14076
14168
  chartId: elementConfig?.id,
14077
14169
  width: chartWidth,
14078
- height,
14170
+ height: chartHeight,
14079
14171
  fontColor,
14080
14172
  relatedAttributes,
14081
14173
  defaultColor: primaryColor,
@@ -14175,26 +14267,37 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
14175
14267
  .flat()
14176
14268
  .map(({ values }) => values)
14177
14269
  .flat();
14178
- return (jsxs(AnyChartWrapper, { height: height, children: [jsx(LineChartStyles, {}), jsx(LineChart, { data: lineChartData, labels: labels, markers: markers, width: chartWidth, height: height, xAxisPadding: 15, yAxisPadding: 0, min: Math.min(...chartValues), customYAxisSelection: yAxis => {
14270
+ return (jsxs(AnyChartWrapper, { height: chartHeight, children: [jsx(LineChartStyles, {}), jsx(LineChart, { data: lineChartData, labels: labels, markers: markers, width: chartWidth, height: chartHeight, xAxisPadding: 15, yAxisPadding: 0, min: Math.min(...chartValues), customYAxisSelection: yAxis => {
14179
14271
  if (isHidedY) {
14180
14272
  yAxis.remove();
14181
14273
  }
14182
14274
  }, customYAxis: yAxis => yAxis.ticks(4), renderTooltip: renderLineChartTooltip, customize: customize, dotSnapping: dotSnapping, dynamicTooltipEnable: true, stackedTooltip: true, tooltipClassName: "dashboardLineChartTooltip", drawGridX: !isHidedY, margin: margin })] }));
14183
14275
  }
14184
14276
  if (isStackBar) {
14185
- const stackBarHeight = showTotal ? height + STACK_BAR_TOTAL_HEIGHT : height;
14186
- return (jsx(AnyChartWrapper, { height: stackBarHeight, children: jsx(StackBar, { data: data, filterName: filterName, type: type, alias: elementConfig?.children?.find(child => child.id === "alias"), options: options, renderTooltip: renderPieChartTooltip, renderElement: renderElement }) }));
14277
+ // Вне fill chartHeight высота самой полосы, и обёртка честно становится выше на строку
14278
+ // итога. В fill chartHeight уже ВСЯ доступная высота ячейки: обёртка занимает её целиком,
14279
+ // а полоса забирает остаток под шапкой флексом ($fill), поэтому прибавлять/вычитать
14280
+ // STACK_BAR_TOTAL_HEIGHT не нужно — иначе тело вылезло бы за нижнюю границу.
14281
+ const stackBarHeight = showTotal && !fitsHeight ? chartHeight + STACK_BAR_TOTAL_HEIGHT : chartHeight;
14282
+ return (jsx(AnyChartWrapper, { height: stackBarHeight, "$fill": fitsHeight, children: jsx(StackBar, { data: data, filterName: filterName, type: type, alias: elementConfig?.children?.find(child => child.id === "alias"), options: options, fill: fitsHeight, renderTooltip: renderPieChartTooltip, renderElement: renderElement }) }));
14187
14283
  }
14188
14284
  if (isPieChart) {
14189
- return (jsx(AnyChartWrapper, { height: height, children: jsx(PieChart, { data: (data[0]?.items
14285
+ return (jsx(AnyChartWrapper, { height: fill ? pieSide : height, children: jsx(PieChart, { data: (data[0]?.items
14190
14286
  ?.filter(({ value }) => !isEmptyValue(value))
14191
14287
  ?.map(item => ({
14192
14288
  ...item,
14193
14289
  color: formatFilterColor(item.name, item.color, defaultColor),
14194
- })) || []), width: chartWidth, height: chartWidth, padAngle: angle, outerRadius: radius, cornerRadius: cornerRadius, renderTooltip: renderPieChartTooltip, withTooltip: true, onClick: filterName ? item => onFilter(item.name) : undefined, children: showTotal && (jsx(PieChartCenter, { children: totalWord || roundTotalSum(+totalSum) })) }) }));
14290
+ })) || []), width: pieSide, height: pieSide, padAngle: angle, outerRadius: radius, cornerRadius: cornerRadius, renderTooltip: renderPieChartTooltip, withTooltip: true, onClick: filterName ? item => onFilter(item.name) : undefined, children: showTotal && (jsx(PieChartCenter, { children: totalWord || roundTotalSum(+totalSum) })) }) }));
14195
14291
  }
14196
14292
  const barChartData = getDataFromFilterItems(data[0]?.items);
14197
- return (jsx(BarChartWrapper, { height: height + margin.bottom, children: jsx(BarChartContainer, { children: jsx(StyledBarChart, { data: barChartData, colors: getColorsFromFilterItems(data[0]?.items, defaultColor, formatFilterColor), minValue: getMinValueFromFilterItems(data[0]?.items), markers: markers, width: chartWidth, height: height, barWidth: barWidth, barPadding: padding, customYAxisLeft: customYAxisLeft, customXAxisBottom: xAxisBottom => customXAxisBottom(xAxisBottom, barChartData), customYAxis: axis => !showLabels && axis.remove(), customBars: ({ bars }) => {
14293
+ // Тот же случай, что у stack: обёртка выше тела на подписи оси X (margin.bottom). В fill
14294
+ // chartHeight — вся доступная высота, поэтому подписи вычитаем из неё, а не прибавляем.
14295
+ // BAR_CHART_FOOTER_MARGIN — это внешний margin-bottom самой BarChartWrapper: в её height он
14296
+ // не входит, но место в ячейке занимает, поэтому его тоже вычитаем.
14297
+ const barBodyHeight = fitsHeight
14298
+ ? chartHeight - margin.bottom - BAR_CHART_FOOTER_MARGIN
14299
+ : chartHeight;
14300
+ return (jsx(BarChartWrapper, { height: barBodyHeight + margin.bottom, children: jsx(BarChartContainer, { children: jsx(StyledBarChart, { data: barChartData, colors: getColorsFromFilterItems(data[0]?.items, defaultColor, formatFilterColor), minValue: getMinValueFromFilterItems(data[0]?.items), markers: markers, width: chartWidth, height: barBodyHeight, barWidth: barWidth, barPadding: padding, customYAxisLeft: customYAxisLeft, customXAxisBottom: xAxisBottom => customXAxisBottom(xAxisBottom, barChartData), customYAxis: axis => !showLabels && axis.remove(), customBars: ({ bars }) => {
14198
14301
  bars.attr("rx", radius);
14199
14302
  bars.attr("ry", radius);
14200
14303
  }, margin: margin, xAxisPadding: 0, yAxisPadding: 0, formatTooltipValue: formatTooltipValue, formatTooltipName: formatTooltipName, hideTooltipGroupName: true, dynamicTooltipEnable: true, isBarTooltip: true, onBarClick: filterName ? item => onFilter(item.name) : undefined }) }) }));
@@ -14212,6 +14315,10 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
14212
14315
  defaultColor,
14213
14316
  formatFilterColor,
14214
14317
  chartWidth,
14318
+ chartHeight,
14319
+ fitsHeight,
14320
+ pieSide,
14321
+ fill,
14215
14322
  barWidth,
14216
14323
  showLabels,
14217
14324
  padding,
@@ -14239,7 +14346,11 @@ const Chart = memo(({ config, element, elementConfig, type, renderElement }) =>
14239
14346
  ]);
14240
14347
  if (!isVisibleContainer(id, expandable, expanded, expandedContainers))
14241
14348
  return null;
14242
- return (jsx(ChartWrapper, { ref: chartRef, width: width, height: isStackBar ? "auto" : isPieChart ? (fill ? chartWidth : width) : height, column: column, loading: loading, children: renderChart }));
14349
+ const chartBody = (jsx(ChartWrapper, { width: isPieChart && fill ? pieSide : width, height: isStackBar ? "auto" : isPieChart ? (fill ? pieSide : width) : chartHeight, column: column, loading: loading, children: renderChart }));
14350
+ if (!fill)
14351
+ return chartBody;
14352
+ // fill: тело центрируется в измеряемой обёртке, ref которой питает ResizeObserver обеими осями.
14353
+ return jsx(ChartFillMeasure, { ref: chartRef, children: chartBody });
14243
14354
  });
14244
14355
 
14245
14356
  const ChartLegend = ({ data, chartElement, fontSize, type, twoColumns, loading }) => {
@@ -14967,5 +15078,5 @@ const Map$1 = ({ zIndex, lowerSiblings, upperSiblings, onError, children, ...res
14967
15078
  }, children: children }), upperSiblings] }));
14968
15079
  };
14969
15080
 
14970
- export { ALIGNMENTS, ALIGN_ITEMS, AddFeatureButton, AddFeatureContainer, AlertIconContainer, AttachmentContainer, AttributeGalleryContainer, AttributeLabel, BASE_CONTAINER_STYLE, BaseMapTheme, CHART_TYPES, CONFIG_PAGES_ID, CONFIG_PAGE_ID, CameraContainer, Chart, ChartContainer, ChartLegend, ChartLoading, Container, ContainerChildren, ContainerLoading, ContainerTemplate, ContainerWrapper, ContainersGroupContainer, DEFAULT_ATTRIBUTE_NAME, DEFAULT_BARCHART_RADIUS, DEFAULT_BASE_MAP, DEFAULT_CHART_ANGLE, DEFAULT_CHART_HEIGHT, DEFAULT_CHART_WIDTH, DEFAULT_CIRCLE_PAINT, DEFAULT_DASHBOARD_CONFIG, DEFAULT_DATA_SOURCE_LIMIT, DEFAULT_DROPDOWN_WIDTH, DEFAULT_FILL_EXTRUSION_PAINT, DEFAULT_FILL_PAINT, DEFAULT_FILTER_PADDING, DEFAULT_ID_ATTRIBUTE_NAME, DEFAULT_LAT, DEFAULT_LINE_PAINT, DEFAULT_LNG, DEFAULT_PAGES_CONFIG, DEFAULT_PIECHART_RADIUS, DEFAULT_ZOOM, Dashboard, DashboardCheckbox, DashboardChip, DashboardContent, DashboardContext, DashboardDefaultHeader, DashboardHeader, DashboardLoading, DashboardPlaceholder, DashboardPlaceholderWrap, DashboardProvider, DashboardWrapper, DataSourceContainer, DataSourceError, DataSourceErrorContainer, DataSourceInnerContainer, DataSourceProgressContainer, DateFormat, DefaultAttributesContainer, DefaultHeaderContainer, DefaultHeaderWrapper, DividerContainer, EMPTY_DATA_SOURCE_LAYER_INFO, EditGeometryType, ElementButton, ElementCamera, ElementChart, ElementChips, ElementControl, ElementIcon, ElementImage, ElementLegend, ElementLink, ElementMarkdown, ElementSlideshow, ElementSvg, ElementTooltip, ElementValueWrapper, ExpandableTitle, FEATURE_CARD_DEFAULT_COLORS, FEATURE_CARD_OTHER_COLOR, FILL_SIZE, FILTERED_VALUE_OPACITY, FILTER_PREFIX, FeatureCardBackgroundHeader, FeatureCardButtons, FeatureCardContext, FeatureCardDefaultHeader, FeatureCardHeader, FeatureCardProvider, FeatureCardSlideshowHeader, FeatureCardTitle, FeatureControls, FeatureTitleContainer, FiltersContainer, GEOMETRY_ATTRIBUTE, GlobalContext, GlobalProvider, Header, HeaderContainer, HeaderFontColorMixin, HeaderFrontView, HeaderTemplate, HeaderTitleContainer, HiddenTitleItems, IconContainer, ImageContainer, LEFT_PANEL_HEADER_HEIGHT, Layer, LayerDescription, LayerGroup, LayerGroupList, LayerIcon, LayerIconContainer, LayerListContainer, LayerTree, LayersContainer, LayersListWrapper, LinearProgressContainer, LogTerminal, LogoContainer, MAX_CHART_WIDTH, Map$1 as Map, MapContext, MapProvider, NO_CONTENT_VALUE, NUMERIC_ATTRIBUTE_TYPES, NoLiveSnapshotContainer, OBJECT_FITS, OneColumnContainer, POLL_SUBTASK_INTERVAL_MS, POLL_SUBTASK_TIMEOUT_MS, PROVIDER_PREFIX, PageNavigator, PageTitle, PageTitleContainer, PagesContainer, Pagination, PresentationHeader, PresentationHeaderButtons, PresentationHeaderTools, PresentationPanelContainer, PresentationPanelWrapper, PresentationWrapper, ProgressContainer, ProviderPrefix, RoundedBackgroundContainer, SAVE_HOOK_RESULT_DURATION, SERVER_NOTIFICATION_EVENT, STACK_BAR_TOTAL_HEIGHT, ScalingFactor, ServerNotificationsContext, ServerNotificationsProvider, SlideshowContainer, SmallPreviewContainer$1 as SmallPreviewContainer, SmallPreviewControl, SmallPreviewCounter, SmallPreviewImages, SmallPreviewLeft, SmallPreviewRight, StackBar, StyligClassificationTypes, SvgImage, TIME_ZONE_FORMAT, TabsContainer, TextTrim, ThemeName, TitleContainer, TopContainer, TopContainerButtons, TwoColumnContainer, UploadContainer, VIEW_MODES, WidgetType, addDataSource, addDataSources, adjustColor, applyFiltersToCondition, applyQueryFilters, applyTreeFilterToCondition, applyVarsToCondition, asAttributeName, asChartId, asContainerId, asDataSourceName, asFilterName, asLayerName, asModalId, asResourceId, asTabId, checkEqualOrIncludes, checkIsLoading, createConfigLayer, createConfigPage, createNewPageId, createSaveNotificationId, createTreeNode, dateOptions, debounce, decimalOpacityToHex, eqlParametersToPayload, findAttributeInExpression, formatArea, formatAttributeValue, formatChartRelatedValue, formatConditionValue, formatDataSourceCondition, formatDate$1 as formatDate, formatElementValue, formatLength, formatNumber, formatPolygonMeasure, geometryToEwkt, getActualExtrusionHeight, getAttributeByName, getAttributeConfigurationByName, getAttributeValue, getAttributesConfiguration, getChartAxes, getChartFilterName, getChartMarkers, getConfigFilter, getContainerComponent, getDashboardHeader, getDataFromAttributes, getDataFromRelatedFeatures, getDataSource, getDataSourceFilterValue, getDataSourceLayerInfo, getDate, getDefaultConfig, getDisplayTemplateNameFromAttribute, getElementValue, getFeatureAttributes, getFeatureCardHeader, getFilterComponent, getFilterSelectedItems, getFilterValue, getFormattedAttributes, getGradientColors, getLayerInfo, getLayerInfoAttribute, getLayerInfoFromDataSources, getPagesFromConfig, getPagesFromProjectInfo, getProxyService, getRelatedAttribute, getRenderElement, getResourceUrl, getRootElementId, getSelectedFilterValue, getSlideshowImages, getStyleAttributes, getSvgUrl, getTemplateNameFromAttribute, getThemeByName, getTotalFromAttributes, getTotalFromRelatedFeatures, getWrapperSizeStyle, hexToRgba, isEmptyElementValue, isEmptyValue, isFillSize, isHiddenEmptyValue, isHookActive, isLayerService, isNotValidSelectedTab, isNumeric, isObject, isProxyService, isTreeFilterValue, isVisibleContainer, mergeAttributeConfigurations, metersPerPixel, numberOptions, parseIconNames, parseIconNamesFromClientStyle, pieChartTooltipFromAttributes, pieChartTooltipFromRelatedFeatures, pointOptions, removeDataSource, rgbToHex, roundTotalSum, sizeCssMixin, sliceShownOtherItems, stretchPalette, timeOptions, toCssSize, toPxNumber, toRenderableValue, tooltipNameFromAttributes, tooltipValueFromAttributes, tooltipValueFromRelatedFeatures, transparentizeColor, treeNodesToProjectItems, updateDataSource, useAfterSave, useAppHeight, useAttachmentItems, useAttachmentPreviewImages, useAutoCompleteControl, useBeforeSave, useChartChange, useChartData, useContainerAttributes, useCurrentPageLayers, useCustomFeatureSelect, useDashboardHeader, useDataSources, useDebouncedCallback, useDiffPage, useEditGroupAttributes, useExpandableContainers, useExportPdf, useFeatureSaveHooks, useFetchImageWithAuth, useFetchWithAuth, useGetConfigLayer, useGlobalContext, useHeaderRender, useHideIfEmptyDataSource, useIconsFromLayers, useLayerHiddenAttributes, useLayerParams, useMapContext, useMapDraw, useMapImages, useMaxZoomTo, useProjectDashboardInit, usePythonSandbox, usePythonTask, useRedrawLayer, useRelatedDataSourceAttributes, useRemoteTask, useRenderElement, useResizeWidth, useSavePrototypeBuilder, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useVisibleProjectItems, useWidgetConfig, useWidgetContext, useWidgetFilters, useWidgetPage, useWindowResize, useWrapperSize, useZoomToFeatures, useZoomToPoint };
15081
+ export { ALIGNMENTS, ALIGN_ITEMS, AddFeatureButton, AddFeatureContainer, AlertIconContainer, AttachmentContainer, AttributeGalleryContainer, AttributeLabel, BASE_CONTAINER_STYLE, BaseMapTheme, CHART_TYPES, CONFIG_PAGES_ID, CONFIG_PAGE_ID, CameraContainer, Chart, ChartContainer, ChartLegend, ChartLoading, Container, ContainerChildren, ContainerLoading, ContainerTemplate, ContainerWrapper, ContainersGroupContainer, DEFAULT_ATTRIBUTE_NAME, DEFAULT_BARCHART_RADIUS, DEFAULT_BASE_MAP, DEFAULT_CHART_ANGLE, DEFAULT_CHART_HEIGHT, DEFAULT_CHART_WIDTH, DEFAULT_CIRCLE_PAINT, DEFAULT_DASHBOARD_CONFIG, DEFAULT_DATA_SOURCE_LIMIT, DEFAULT_DROPDOWN_WIDTH, DEFAULT_FILL_EXTRUSION_PAINT, DEFAULT_FILL_PAINT, DEFAULT_FILTER_PADDING, DEFAULT_ID_ATTRIBUTE_NAME, DEFAULT_LAT, DEFAULT_LINE_PAINT, DEFAULT_LNG, DEFAULT_PAGES_CONFIG, DEFAULT_PIECHART_RADIUS, DEFAULT_ZOOM, Dashboard, DashboardCheckbox, DashboardChip, DashboardContent, DashboardContext, DashboardDefaultHeader, DashboardHeader, DashboardLoading, DashboardPlaceholder, DashboardPlaceholderWrap, DashboardProvider, DashboardWrapper, DataSourceContainer, DataSourceError, DataSourceErrorContainer, DataSourceInnerContainer, DataSourceProgressContainer, DateFormat, DefaultAttributesContainer, DefaultHeaderContainer, DefaultHeaderWrapper, DividerContainer, EMPTY_DATA_SOURCE_LAYER_INFO, EditGeometryType, ElementButton, ElementCamera, ElementChart, ElementChips, ElementControl, ElementIcon, ElementImage, ElementLegend, ElementLink, ElementMarkdown, ElementSlideshow, ElementSvg, ElementTooltip, ElementValueWrapper, ExpandableTitle, FEATURE_CARD_DEFAULT_COLORS, FEATURE_CARD_OTHER_COLOR, FILL_SIZE, FILTERED_VALUE_OPACITY, FILTER_PREFIX, FeatureCardBackgroundHeader, FeatureCardButtons, FeatureCardContext, FeatureCardDefaultHeader, FeatureCardHeader, FeatureCardProvider, FeatureCardSlideshowHeader, FeatureCardTitle, FeatureControls, FeatureTitleContainer, FiltersContainer, GEOMETRY_ATTRIBUTE, GlobalContext, GlobalProvider, Header, HeaderContainer, HeaderFontColorMixin, HeaderFrontView, HeaderTemplate, HeaderTitleContainer, HiddenTitleItems, IconContainer, ImageContainer, LEFT_PANEL_HEADER_HEIGHT, Layer, LayerDescription, LayerGroup, LayerGroupList, LayerIcon, LayerIconContainer, LayerListContainer, LayerTree, LayersContainer, LayersListWrapper, LinearProgressContainer, LogTerminal, LogoContainer, MAX_CHART_WIDTH, Map$1 as Map, MapContext, MapProvider, NO_CONTENT_VALUE, NUMERIC_ATTRIBUTE_TYPES, NoLiveSnapshotContainer, OBJECT_FITS, OVERFLOWS, OneColumnContainer, POLL_SUBTASK_INTERVAL_MS, POLL_SUBTASK_TIMEOUT_MS, PROVIDER_PREFIX, PageNavigator, PageTitle, PageTitleContainer, PagesContainer, Pagination, PresentationHeader, PresentationHeaderButtons, PresentationHeaderTools, PresentationPanelContainer, PresentationPanelWrapper, PresentationWrapper, ProgressContainer, ProviderPrefix, RoundedBackgroundContainer, SAVE_HOOK_RESULT_DURATION, SERVER_NOTIFICATION_EVENT, STACK_BAR_TOTAL_HEIGHT, ScalingFactor, ServerNotificationsContext, ServerNotificationsProvider, SlideshowContainer, SmallPreviewContainer$1 as SmallPreviewContainer, SmallPreviewControl, SmallPreviewCounter, SmallPreviewImages, SmallPreviewLeft, SmallPreviewRight, StackBar, StyligClassificationTypes, SvgImage, TIME_ZONE_FORMAT, TabsContainer, TextTrim, ThemeName, TitleContainer, TopContainer, TopContainerButtons, TwoColumnContainer, UploadContainer, VIEW_MODES, WidgetType, addDataSource, addDataSources, adjustColor, applyFiltersToCondition, applyQueryFilters, applyTreeFilterToCondition, applyVarsToCondition, asAttributeName, asChartId, asContainerId, asDataSourceName, asFilterName, asLayerName, asModalId, asResourceId, asTabId, checkEqualOrIncludes, checkIsLoading, createConfigLayer, createConfigPage, createNewPageId, createSaveNotificationId, createTreeNode, dateOptions, debounce, decimalOpacityToHex, eqlParametersToPayload, findAttributeInExpression, formatArea, formatAttributeValue, formatChartRelatedValue, formatConditionValue, formatDataSourceCondition, formatDate$1 as formatDate, formatElementValue, formatLength, formatNumber, formatPolygonMeasure, geometryToEwkt, getActualExtrusionHeight, getAttributeByName, getAttributeConfigurationByName, getAttributeValue, getAttributesConfiguration, getChartAxes, getChartFilterName, getChartMarkers, getConfigFilter, getContainerComponent, getDashboardHeader, getDataFromAttributes, getDataFromRelatedFeatures, getDataSource, getDataSourceFilterValue, getDataSourceLayerInfo, getDate, getDefaultConfig, getDisplayTemplateNameFromAttribute, getElementValue, getFeatureAttributes, getFeatureCardHeader, getFilterComponent, getFilterSelectedItems, getFilterValue, getFormattedAttributes, getGradientColors, getLayerInfo, getLayerInfoAttribute, getLayerInfoFromDataSources, getPagesFromConfig, getPagesFromProjectInfo, getProxyService, getRelatedAttribute, getRenderElement, getResourceUrl, getRootElementId, getSelectedFilterValue, getSlideshowImages, getStyleAttributes, getSvgUrl, getTemplateNameFromAttribute, getThemeByName, getTotalFromAttributes, getTotalFromRelatedFeatures, getWrapperSizeStyle, hexToRgba, isEmptyElementValue, isEmptyValue, isFillSize, isHiddenEmptyValue, isHookActive, isLayerService, isNotValidSelectedTab, isNumeric, isObject, isProxyService, isTreeFilterValue, isVisibleContainer, mergeAttributeConfigurations, metersPerPixel, numberOptions, parseIconNames, parseIconNamesFromClientStyle, pieChartTooltipFromAttributes, pieChartTooltipFromRelatedFeatures, pointOptions, removeDataSource, rgbToHex, roundTotalSum, sizeCssMixin, sliceShownOtherItems, stretchPalette, timeOptions, toCssSize, toPxNumber, toRenderableValue, tooltipNameFromAttributes, tooltipValueFromAttributes, tooltipValueFromRelatedFeatures, transparentizeColor, treeNodesToProjectItems, updateDataSource, useAfterSave, useAppHeight, useAttachmentItems, useAttachmentPreviewImages, useAutoCompleteControl, useBeforeSave, useChartChange, useChartData, useContainerAttributes, useCurrentPageLayers, useCustomFeatureSelect, useDashboardHeader, useDataSources, useDebouncedCallback, useDiffPage, useEditGroupAttributes, useExpandableContainers, useExportPdf, useFeatureSaveHooks, useFetchImageWithAuth, useFetchWithAuth, useGetConfigLayer, useGlobalContext, useHeaderRender, useHideIfEmptyDataSource, useIconsFromLayers, useLayerHiddenAttributes, useLayerParams, useMapContext, useMapDraw, useMapImages, useMaxZoomTo, useProjectDashboardInit, usePythonSandbox, usePythonTask, useRedrawLayer, useRelatedDataSourceAttributes, useRemoteTask, useRenderElement, useResizeBox, useSavePrototypeBuilder, useServerNotificationsContext, useShownOtherItems, useToggle, useUpdateDataSource, useVisibleProjectItems, useWidgetConfig, useWidgetContext, useWidgetFilters, useWidgetPage, useWindowResize, useWrapperSize, useZoomToFeatures, useZoomToPoint };
14971
15082
  //# sourceMappingURL=react.esm.js.map