@evergis/react 4.0.104 → 4.0.105

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
@@ -3400,6 +3400,11 @@ const asResourceId = (value) => value;
3400
3400
  const CHART_TYPES = ["bar", "line", "pie", "stack"];
3401
3401
  /** Выравнивание текста/блоков. */
3402
3402
  const ALIGNMENTS = ["left", "center", "right"];
3403
+ /**
3404
+ * Выравнивание плиток контейнера DataSource+RoundedBackground: к базовым `left/center/right`
3405
+ * добавлен режим `stretch` — плитки строки растягиваются на всю ширину (ТЗ 9.4/9.5).
3406
+ */
3407
+ const TILE_ALIGNMENTS = ["left", "center", "right", "stretch"];
3403
3408
  /** Выравнивание детей контейнера по поперечной оси (CSS `align-items`). */
3404
3409
  const ALIGN_ITEMS = ["flex-start", "center", "flex-end", "stretch", "baseline"];
3405
3410
  /** Масштабирование изображения внутри своего бокса (CSS `object-fit`). */
@@ -7217,6 +7222,56 @@ const useDiffPage = (type) => {
7217
7222
  return useMemo(() => isDiffPage, [isDiffPage]);
7218
7223
  };
7219
7224
 
7225
+ /**
7226
+ * Уравнивает ширину всех плиток контейнера по самой широкой.
7227
+ *
7228
+ * Натуральная ширина каждой плитки измеряется через временное inline `width: max-content`
7229
+ * (снимает применённое ограничение `--tile-width`, поэтому замер устойчив к динамике данных и не
7230
+ * зацикливает ResizeObserver — итоговый максимум совпадает с уже применённым). Возвращаемое число
7231
+ * контейнер прокидывает в CSS-переменную `--tile-width`, которую читает каждая плитка.
7232
+ *
7233
+ * `enabled: false` (режим «Растянуть», «В столбец» или старые конфиги без `columns`) полностью
7234
+ * отключает измерение — ширина берётся из grid-ячейки.
7235
+ */
7236
+ const useEqualTileWidth = (enabled, itemsCount) => {
7237
+ const ref = useRef(null);
7238
+ const [width, setWidth] = useState();
7239
+ const measure = useCallback(() => {
7240
+ const node = ref.current;
7241
+ if (!node)
7242
+ return;
7243
+ const tiles = Array.from(node.querySelectorAll("[data-tile]"));
7244
+ if (!tiles.length)
7245
+ return;
7246
+ tiles.forEach(tile => {
7247
+ tile.style.width = "max-content";
7248
+ });
7249
+ let max = 0;
7250
+ tiles.forEach(tile => {
7251
+ max = Math.max(max, tile.getBoundingClientRect().width);
7252
+ });
7253
+ tiles.forEach(tile => {
7254
+ tile.style.width = "";
7255
+ });
7256
+ const next = Math.ceil(max);
7257
+ setWidth(previous => (max && previous !== next ? next : previous));
7258
+ }, []);
7259
+ useEffect(() => {
7260
+ if (!enabled) {
7261
+ setWidth(undefined);
7262
+ return;
7263
+ }
7264
+ const node = ref.current;
7265
+ if (!node)
7266
+ return;
7267
+ measure();
7268
+ const observer = new ResizeObserver(() => measure());
7269
+ observer.observe(node);
7270
+ return () => observer.disconnect();
7271
+ }, [enabled, itemsCount, measure]);
7272
+ return [ref, enabled ? width : undefined];
7273
+ };
7274
+
7220
7275
  const SAVE_HOOK_RESULT_DURATION = 4000;
7221
7276
  const NOTIFICATION_ID_RADIX = 36;
7222
7277
  const NOTIFICATION_ID_LENGTH = 8;
@@ -8684,33 +8739,70 @@ const IconContainer = memo(({ elementConfig, renderElement }) => {
8684
8739
  return (jsxs(IconContainerWrapper, { id: id, style: style, children: [jsxs(IconContainerHeaderWrapper, { children: [jsxs(IconContainerHeader, { children: [renderElement({ id: "icon" }), jsx(IconContainerTitle, { children: renderElement({ id: "alias" }) })] }), renderElement({ id: "link" })] }), jsx(IconContainerText, { children: renderElement({ id: "text" }) })] }));
8685
8740
  });
8686
8741
 
8687
- /**
8688
- * Обёртка записей источника.
8689
- *
8690
- * В ряду (`column: false`) записи переносятся на новую строку. Без переноса они дрались бы за
8691
- * одну строку: обёртка каждой записи — flex-элемент и ужимается, а внутренний шаблон (плашка
8692
- * RoundedBackground имеет жёсткие 9rem) — нет, поэтому записи наезжали бы друг на друга.
8693
- *
8694
- * `flex-wrap` намеренно не вынесен в row-ветку самого `Container`: там дети — карточки
8695
- * контейнеров шириной 100%, и перенос уложил бы их по одной на строку, сломав ряд у
8696
- * ContainersGroup.
8697
- */
8742
+ /** Дефолтный внутренний отступ между плитками, px (ТЗ §11). */
8743
+ const DEFAULT_TILE_GAP = 8;
8744
+ /** Раскладка ряда плиток (grid `justify-content`) для не-`stretch` выравнивания. */
8745
+ const ROW_JUSTIFY = {
8746
+ left: "start",
8747
+ center: "center",
8748
+ right: "end",
8749
+ stretch: "stretch",
8750
+ };
8751
+ /** Горизонтальное положение плитки в режиме «В столбец» (CSS `align-items`). */
8752
+ const COLUMN_ALIGN_ITEMS = {
8753
+ left: "flex-start",
8754
+ center: "center",
8755
+ right: "flex-end",
8756
+ stretch: "stretch",
8757
+ };
8758
+
8698
8759
  const DataSourceContainerWrapper = styled(Container).withConfig({ displayName: "DataSourceContainerWrapper", componentId: "sc-1xnd27m" }) `
8699
- ${({ $isRow }) => $isRow &&
8700
- css `
8701
- flex-wrap: wrap;
8702
- justify-content: flex-start;
8703
- column-gap: 0.5rem;
8704
- `};
8760
+ ${({ $tileWidth }) => $tileWidth != null && `--tile-width: ${$tileWidth}px;`}
8761
+
8762
+ ${({ $isRow, $columns, $gap, $align, $stretch }) => {
8763
+ if ($isRow) {
8764
+ if ($columns) {
8765
+ return css `
8766
+ display: grid;
8767
+ grid-template-columns: repeat(${$columns}, ${$stretch ? "minmax(0, 1fr)" : "auto"});
8768
+ justify-content: ${$stretch ? "stretch" : ROW_JUSTIFY[$align ?? "left"]};
8769
+ align-items: stretch;
8770
+ gap: ${$gap ?? DEFAULT_TILE_GAP}px;
8771
+ `;
8772
+ }
8773
+ return css `
8774
+ flex-wrap: wrap;
8775
+ justify-content: flex-start;
8776
+ gap: ${$gap != null ? `${$gap}px` : "0.5rem"};
8777
+ `;
8778
+ }
8779
+ return css `
8780
+ align-items: ${$stretch ? "stretch" : COLUMN_ALIGN_ITEMS[$align ?? "left"]};
8781
+
8782
+ > * {
8783
+ width: ${$stretch ? "100%" : "auto"};
8784
+ }
8785
+
8786
+ /* Вертикальный отступ между плитками в столбце — настраиваемый gap (ТЗ §7): переопределяем
8787
+ фикс. margin-bottom 0.5rem, который навешивает детям база Container(isColumn). */
8788
+ && > *:not(:last-child) {
8789
+ margin-bottom: ${$gap != null ? `${$gap}px` : `${DEFAULT_TILE_GAP}px`};
8790
+ }
8791
+ `;
8792
+ }};
8705
8793
  `;
8706
8794
 
8707
8795
  const DataSourceContainer = memo(({ config, elementConfig, type, innerComponent, renderElement }) => {
8796
+ const { t } = useGlobalContext();
8708
8797
  const { dataSources, expandedContainers } = useWidgetContext(type);
8709
8798
  const { id, options } = elementConfig || {};
8710
- const { column = true, relatedDataSource, expandable, expanded } = options || {};
8799
+ const { column = true, relatedDataSource, expandable, expanded, columns, gap, align } = options || {};
8711
8800
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
8801
+ const { sliceItems, checkIsSliced, showMore, onShowMore } = useShownOtherItems(options);
8712
8802
  const dataSource = useMemo(() => dataSources?.find(({ name }) => name === relatedDataSource), [dataSources, relatedDataSource]);
8713
8803
  const isLoading = !dataSource?.features;
8804
+ const stretch = align === "stretch";
8805
+ const [tilesRef, tileWidth] = useEqualTileWidth(!column && !!columns && !stretch, dataSource?.features?.length ?? 0);
8714
8806
  const defaults = useMemo(() => ({ height: isLoading ? "3rem" : "auto" }), [isLoading]);
8715
8807
  const root = useWrapperSize({ elementConfig, defaults });
8716
8808
  if (!relatedDataSource)
@@ -8718,7 +8810,9 @@ const DataSourceContainer = memo(({ config, elementConfig, type, innerComponent,
8718
8810
  if (dataSource && !dataSource.features) {
8719
8811
  return jsx(DataSourceError, { name: elementConfig.templateName });
8720
8812
  }
8721
- return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), !isVisible ? null : dataSource ? (jsx(DataSourceContainerWrapper, { ...root, isColumn: column, "$isRow": !column, children: dataSource.features?.map((feature, index) => (jsx(DataSourceInnerContainer, { index: index, type: type, config: config, feature: feature, elementConfig: elementConfig, innerComponent: innerComponent }, index))) })) : (jsx(ContainerLoading, {}))] }));
8813
+ return (jsxs(Fragment$1, { children: [jsx(ExpandableTitle, { elementConfig: elementConfig, type: type, renderElement: renderElement }), !isVisible ? null : dataSource ? (jsxs(Fragment$1, { children: [jsx(DataSourceContainerWrapper, { ...root, ref: tilesRef, isColumn: column, "$isRow": !column, "$columns": columns, "$gap": gap, "$align": align, "$stretch": stretch, "$tileWidth": tileWidth, children: sliceItems(dataSource.features)?.map((feature, index) => (jsx(DataSourceInnerContainer, { index: index, type: type, config: config, feature: feature, elementConfig: elementConfig, innerComponent: innerComponent }, index))) }), checkIsSliced(dataSource.features) && (jsx(ContainerToggler, { toggled: showMore, onClick: onShowMore, children: showMore
8814
+ ? t("hide", { ns: "dashboard", defaultValue: "Свернуть" })
8815
+ : t("showAll", { ns: "dashboard", defaultValue: "Показать все" }) }))] })) : (jsx(ContainerLoading, {}))] }));
8722
8816
  });
8723
8817
 
8724
8818
  const SvgContainerColorMixin = css `
@@ -8741,11 +8835,11 @@ const SvgContainer = styled.div.withConfig({ displayName: "SvgContainer", compon
8741
8835
  }
8742
8836
  `;
8743
8837
 
8744
- /** Выравнивание заголовка по горизонтали — в терминах flex-раскладки. */
8745
8838
  const ALIGN_TO_JUSTIFY = {
8746
8839
  left: "flex-start",
8747
8840
  center: "center",
8748
8841
  right: "flex-end",
8842
+ stretch: "flex-start",
8749
8843
  };
8750
8844
  const ContainerIconTitle = styled(Flex).withConfig({ displayName: "ContainerIconTitle", componentId: "sc-1jfnkqo" }) `
8751
8845
  /* inline-flex, а не блочный flex во всю ширину: иначе text-align родителя игнорируется. */
@@ -9023,16 +9117,14 @@ const ContainerIconValue = styled(Flex).withConfig({ displayName: "ContainerIcon
9023
9117
  const RoundedBackgroundContainerWrapper = styled(Flex).withConfig({ displayName: "RoundedBackgroundContainerWrapper", componentId: "sc-a1l8h3" }) `
9024
9118
  position: relative;
9025
9119
  flex-direction: ${({ $bigIcon }) => ($bigIcon ? "row" : "column")};
9026
- width: 9rem;
9120
+ width: ${({ $fillWidth }) => ($fillWidth ? "var(--tile-width, 100%)" : "9rem")};
9121
+ height: 100%;
9122
+ box-sizing: border-box;
9027
9123
  padding: 0.75rem 0.75rem 0.5rem;
9028
9124
  background-color: ${({ theme: { palette } }) => palette.element};
9029
9125
  border-radius: ${({ theme: { borderRadius } }) => borderRadius.large};
9030
9126
  flex-wrap: nowrap;
9031
9127
 
9032
- && {
9033
- margin-bottom: 0.5rem;
9034
- }
9035
-
9036
9128
  ${({ $center }) => $center &&
9037
9129
  css `
9038
9130
  align-items: center;
@@ -9049,7 +9141,7 @@ const RoundedBackgroundContainerWrapper = styled(Flex).withConfig({ displayName:
9049
9141
  css `
9050
9142
  background-color: ${transparentizeColor($color, 6)};
9051
9143
 
9052
- * {
9144
+ ${ContainerValue}, ${ContainerUnits}, ${ContainerAlias} {
9053
9145
  color: ${$color};
9054
9146
  fill: ${$color};
9055
9147
  }
@@ -9109,11 +9201,13 @@ const RoundedBackgroundContainerWrapper = styled(Flex).withConfig({ displayName:
9109
9201
  }
9110
9202
 
9111
9203
  ${ContainerAlias} {
9112
- margin-top: 0.25rem;
9204
+ margin-top: auto;
9205
+ padding-top: 0.25rem;
9113
9206
  }
9114
9207
  `;
9115
9208
 
9116
9209
  const ALIAS_DEFAULT_MAX_LENGTH = 28;
9210
+ const DESCRIPTION_DEFAULT_MAX_LINES = 2;
9117
9211
  const RoundedBackgroundContainer = memo(({ type, elementConfig, feature, renderElement, }) => {
9118
9212
  const { t } = useGlobalContext();
9119
9213
  const { dataSources, attributes: ctxAttributes } = useWidgetContext(type);
@@ -9125,7 +9219,7 @@ const RoundedBackgroundContainer = memo(({ type, elementConfig, feature, renderE
9125
9219
  });
9126
9220
  const attributes = isEmpty(dsAttributes) ? ctxAttributes : dsAttributes;
9127
9221
  const { id, options, style, children } = elementConfig || {};
9128
- const { maxLength, wordBreak, center, fontColor, innerTemplateStyle, inlineUnits, big, bigIcon, hideEmpty, colorAttribute } = options || {};
9222
+ const { maxLength, maxLines, wordBreak, center, fontColor, innerTemplateStyle, inlineUnits, big, bigIcon, hideEmpty, colorAttribute, columns } = options || {};
9129
9223
  const iconElement = children?.find(item => item.id === "icon");
9130
9224
  const aliasElement = children?.find(item => item.id === "alias");
9131
9225
  const unitsElement = children?.find(item => item.id === "units");
@@ -9144,11 +9238,35 @@ const RoundedBackgroundContainer = memo(({ type, elementConfig, feature, renderE
9144
9238
  return null;
9145
9239
  return (jsx(FlexSpan, { width: iconElement.options?.width || "1rem", alignItems: "center", mr: "0.5rem", children: renderElement({ id: "icon", wrap: false }) }));
9146
9240
  }, [iconElement, renderElement]);
9147
- const renderAlias = useMemo(() => (jsx(ContainerAlias, { style: aliasElement?.style, children: jsx(TextTrim, { maxLength: maxLength || ALIAS_DEFAULT_MAX_LENGTH, wordBreak: wordBreak, children: renderElement({ id: "alias", wrap: false }) }) })), [aliasElement?.style, maxLength, renderElement, wordBreak]);
9148
- const renderValue = useMemo(() => isNil(value) ? null : (jsxs(ContainerValue, { style: valueElement?.style, big: true, children: [value, !!unitsElement && (jsx(ContainerUnits, { style: unitsElement?.style, children: renderElement({ id: "units" }) }))] })), [valueElement?.style, value, unitsElement, renderElement]);
9241
+ const aliasAttribute = useMemo(() => aliasElement && !aliasElement.type && aliasElement.attributeName
9242
+ ? attributes.find(({ attributeName }) => attributeName === aliasElement.attributeName)
9243
+ : undefined, [attributes, aliasElement]);
9244
+ const aliasContent = useMemo(() => aliasAttribute
9245
+ ? formatAttributeValue({
9246
+ t,
9247
+ type: aliasAttribute.type,
9248
+ value: aliasAttribute.value,
9249
+ stringFormat: aliasAttribute.stringFormat,
9250
+ noUnits: true,
9251
+ })
9252
+ : renderElement({ id: "alias", wrap: false }), [aliasAttribute, t, renderElement]);
9253
+ const renderAlias = useMemo(() => (jsx(ContainerAlias, { style: aliasElement?.style, children: jsx(TextTrim, { maxLength: maxLength || ALIAS_DEFAULT_MAX_LENGTH, maxLines: maxLines ?? (columns ? DESCRIPTION_DEFAULT_MAX_LINES : undefined), wordBreak: wordBreak, children: aliasContent }) })), [aliasElement?.style, maxLength, maxLines, columns, aliasContent, wordBreak]);
9254
+ const unitsAttribute = useMemo(() => unitsElement && !unitsElement.type && unitsElement.attributeName
9255
+ ? attributes.find(({ attributeName }) => attributeName === unitsElement.attributeName)
9256
+ : undefined, [attributes, unitsElement]);
9257
+ const unitsContent = useMemo(() => unitsAttribute
9258
+ ? formatAttributeValue({
9259
+ t,
9260
+ type: unitsAttribute.type,
9261
+ value: unitsAttribute.value,
9262
+ stringFormat: unitsAttribute.stringFormat,
9263
+ noUnits: true,
9264
+ })
9265
+ : renderElement({ id: "units" }), [unitsAttribute, t, renderElement]);
9266
+ const renderValue = useMemo(() => isNil(value) ? null : (jsxs(ContainerValue, { style: valueElement?.style, big: true, children: [value, !!unitsElement && (jsx(ContainerUnits, { style: unitsElement?.style, children: unitsContent }))] })), [valueElement?.style, value, unitsElement, unitsContent]);
9149
9267
  if (isNil(value) && hideEmpty)
9150
9268
  return null;
9151
- return (jsxs(RoundedBackgroundContainerWrapper, { id: id, style: innerTemplateStyle || style, "$center": center, "$color": color, "$inlineUnits": inlineUnits, "$big": big, "$bigIcon": bigIcon, children: [jsxs(ContainerIconValue, { children: [renderIcon, big ? renderAlias : renderValue] }), big ? renderValue : renderAlias] }));
9269
+ return (jsxs(RoundedBackgroundContainerWrapper, { id: id, "data-tile": true, style: innerTemplateStyle || style, "$center": center !== false, "$color": color, "$inlineUnits": inlineUnits, "$big": big, "$bigIcon": bigIcon, "$fillWidth": !!columns, children: [jsxs(ContainerIconValue, { children: [renderIcon, big ? renderAlias : renderValue] }), big ? renderValue : renderAlias] }));
9152
9270
  });
9153
9271
 
9154
9272
  const AddFeatureContainer = memo(({ elementConfig }) => {
@@ -9423,23 +9541,16 @@ var EditGeometryType;
9423
9541
 
9424
9542
  var StyligClassificationTypes;
9425
9543
  (function (StyligClassificationTypes) {
9426
- StyligClassificationTypes["FillColor"] = "fill";
9427
- StyligClassificationTypes["CircleColor"] = "circle";
9428
- StyligClassificationTypes["LineColor"] = "line";
9429
- StyligClassificationTypes["CircleStroke"] = "circle-stroke";
9430
- StyligClassificationTypes["PolygonStroke"] = "polygon-stroke";
9544
+ StyligClassificationTypes["FillColor"] = "fill-color";
9545
+ StyligClassificationTypes["FillExtrusionColor"] = "fill-extrusion-color";
9546
+ StyligClassificationTypes["CircleColor"] = "circle-color";
9547
+ StyligClassificationTypes["LineColor"] = "line-color";
9548
+ StyligClassificationTypes["CircleStrokeColor"] = "circle-stroke-color";
9431
9549
  StyligClassificationTypes["CircleRadius"] = "circle-radius";
9432
9550
  StyligClassificationTypes["CircleStrokeWidth"] = "circle-stroke-width";
9433
9551
  StyligClassificationTypes["LineWidth"] = "line-width";
9434
- StyligClassificationTypes["PolygonStrokeWidth"] = "polygon-stroke-width";
9435
9552
  StyligClassificationTypes["CircleBlur"] = "circle-blur";
9436
9553
  StyligClassificationTypes["LineBlur"] = "line-blur";
9437
- StyligClassificationTypes["PolygonStrokeBlur"] = "polygon-stroke-blur";
9438
- StyligClassificationTypes["FillOpacity"] = "fill-opacity";
9439
- StyligClassificationTypes["CircleOpacity"] = "circle-opacity";
9440
- StyligClassificationTypes["LineOpacity"] = "line-opacity";
9441
- StyligClassificationTypes["PolygonStrokeOpacity"] = "polygon-stroke-opacity";
9442
- StyligClassificationTypes["CircleTranslate"] = "circle-translate";
9443
9554
  })(StyligClassificationTypes || (StyligClassificationTypes = {}));
9444
9555
 
9445
9556
  const StyledButton = styled(FlatButton).withConfig({ displayName: "StyledButton", componentId: "sc-13r9ztd" }) `
@@ -9495,7 +9606,7 @@ const buildFiltersFromResponse = (responseFilters, result) => {
9495
9606
  return Object.keys(filters).length ? filters : null;
9496
9607
  };
9497
9608
 
9498
- const ClampedText = styled.div.withConfig({ displayName: "ClampedText", componentId: "sc-138git7" }) `
9609
+ const ClampedText$1 = styled.div.withConfig({ displayName: "ClampedText", componentId: "sc-138git7" }) `
9499
9610
  display: -webkit-box;
9500
9611
  -webkit-line-clamp: 2;
9501
9612
  -webkit-box-orient: vertical;
@@ -9503,7 +9614,7 @@ const ClampedText = styled.div.withConfig({ displayName: "ClampedText", componen
9503
9614
  text-overflow: ellipsis;
9504
9615
  word-break: break-word;
9505
9616
  `;
9506
- const clampDescription = (text) => createElement(ClampedText, null, text);
9617
+ const clampDescription = (text) => createElement(ClampedText$1, null, text);
9507
9618
 
9508
9619
  const RUN_ID_RADIX = 36;
9509
9620
  const RUN_ID_LENGTH = 8;
@@ -14418,6 +14529,13 @@ const ExpandableTitle = memo(({ elementConfig, type, renderElement }) => {
14418
14529
  const titleElement = children?.find(item => item.id === "title");
14419
14530
  if (!titleElement)
14420
14531
  return null;
14532
+ const titleIconElement = children?.find(item => item.id === "titleIcon");
14533
+ const isLayers = templateName === ContainerTemplate.Layers;
14534
+ const hasTitleText = !!titleElement.value?.toString().trim() || !!titleElement.attributeName;
14535
+ const hasTitleIcon = !!titleIconElement?.value;
14536
+ const hasControls = !!expandable || !!titleElement.options?.downloadById || isLayers;
14537
+ if (!hasTitleText && !hasTitleIcon && !hasControls)
14538
+ return null;
14421
14539
  const isVisible = isVisibleContainer(id, expandable, expanded, expandedContainers);
14422
14540
  return (jsx(TitleContainer, { containerId: id, elementConfig: titleElement, templateName: templateName, layerNames: layerNames, fontColor: fontColor, expandable: expandable, expanded: expanded, type: type, isVisible: isVisible, renderElement: renderElement }));
14423
14541
  });
@@ -14743,8 +14861,40 @@ const TextTrimValue = styled.div.withConfig({ displayName: "TextTrimValue", comp
14743
14861
  word-break: ${({ wordBreak }) => wordBreak ?? "break-word"};
14744
14862
  overflow: hidden;
14745
14863
  `;
14864
+ const ClampedText = styled.div.withConfig({ displayName: "ClampedText", componentId: "sc-asq1h5" }) `
14865
+ display: -webkit-box;
14866
+ -webkit-line-clamp: ${({ $maxLines }) => $maxLines};
14867
+ -webkit-box-orient: vertical;
14868
+ overflow: hidden;
14869
+ width: 100%;
14870
+ max-width: 100%;
14871
+ word-break: ${({ wordBreak }) => wordBreak ?? "break-word"};
14872
+ `;
14746
14873
 
14747
- const TextTrim = memo(({ maxLength, expandable, lineBreak, wordBreak, children }) => {
14874
+ /**
14875
+ * Обрезка описания по числу строк (line-clamp). Тултип с полным текстом показывается ТОЛЬКО при
14876
+ * реальном переполнении (`scrollHeight > clientHeight`), отслеживаемом через ResizeObserver, —
14877
+ * у необрезанного текста тултипа нет (ТЗ 9.7).
14878
+ */
14879
+ const TextTrimLineClamp = memo(({ maxLines, wordBreak, children }) => {
14880
+ const ref = useRef(null);
14881
+ const [isOverflow, setIsOverflow] = useState(false);
14882
+ useEffect(() => {
14883
+ const node = ref.current;
14884
+ if (!node)
14885
+ return;
14886
+ const check = () => setIsOverflow(node.scrollHeight > node.clientHeight);
14887
+ check();
14888
+ const observer = new ResizeObserver(check);
14889
+ observer.observe(node);
14890
+ return () => observer.disconnect();
14891
+ }, [children, maxLines]);
14892
+ const clamped = (jsx(ClampedText, { ref: ref, "$maxLines": maxLines, wordBreak: wordBreak, children: children }));
14893
+ if (!isOverflow)
14894
+ return clamped;
14895
+ return (jsx(Tooltip$1, { placement: "top", arrow: true, content: children, children: tooltipRef => jsx("div", { ref: tooltipRef, children: clamped }) }));
14896
+ });
14897
+ const TextTrim = memo(({ maxLength, maxLines, expandable, lineBreak, wordBreak, children }) => {
14748
14898
  const { t } = useGlobalContext();
14749
14899
  const [expanded, toggleExpanded] = useToggle();
14750
14900
  const text = children?.toString();
@@ -14753,6 +14903,9 @@ const TextTrim = memo(({ maxLength, expandable, lineBreak, wordBreak, children }
14753
14903
  return jsx(TextTrimValue, { wordBreak: wordBreak, children: value });
14754
14904
  return jsx(TextTrimValue, { wordBreak: wordBreak, dangerouslySetInnerHTML: { __html: unescape(value).split(lineBreak).join("<br />") } });
14755
14905
  }, [lineBreak, wordBreak]);
14906
+ if (maxLines && text?.length) {
14907
+ return jsx(TextTrimLineClamp, { maxLines: maxLines, wordBreak: wordBreak, children: text });
14908
+ }
14756
14909
  if (!text?.length || !maxLength || text.length <= maxLength)
14757
14910
  return jsx(Fragment$1, { children: formatValue(text) });
14758
14911
  const substring = `${text.substring(0, maxLength)}...`;
@@ -14799,41 +14952,6 @@ const RasterLayer = ({ layer, tileUrl, visible, beforeId, }) => {
14799
14952
  return (jsx(Source, { id: layer.name, type: "raster", tiles: tiles, children: jsx(Layer$1, { id: layer.name, type: "raster", "source-layer": "default", beforeId: beforeId, layout: { visibility: visible ? "visible" : "none" } }) }, `${layer.name}-${tileUrl}`));
14800
14953
  };
14801
14954
 
14802
- const getClientStyleItemPrefixSuffix = (geometryType, itemType) => {
14803
- switch (geometryType) {
14804
- case OgcGeometryType.Point:
14805
- case OgcGeometryType.MultiPoint:
14806
- switch (itemType) {
14807
- case "symbol":
14808
- return ["point-label-layer-", "-label"];
14809
- default:
14810
- return ["point-layer-", ""];
14811
- }
14812
- case OgcGeometryType.LineString:
14813
- case OgcGeometryType.MultiLineString:
14814
- switch (itemType) {
14815
- case "symbol":
14816
- return ["polyline-label-layer-", "-label"];
14817
- default:
14818
- return ["polyline-layer-", ""];
14819
- }
14820
- case OgcGeometryType.Polygon:
14821
- case OgcGeometryType.MultiPolygon:
14822
- switch (itemType) {
14823
- case "line":
14824
- return ["polygon-stroke-layer-", "-stroke"];
14825
- case "fill-extrusion":
14826
- return ["polygon-extrusion-layer-", "-extrusion"];
14827
- case "symbol":
14828
- return ["polygon-label-layer-", "-label"];
14829
- default:
14830
- return ["polygon-layer-", ""];
14831
- }
14832
- default:
14833
- return ["", ""];
14834
- }
14835
- };
14836
-
14837
14955
  const findAttributeInExpression = (expression) => {
14838
14956
  if (Array.isArray(expression) && expression.length === 2 && expression[0] === "get") {
14839
14957
  return [expression[1]];
@@ -14855,6 +14973,14 @@ const getActualExtrusionHeight = (paint) => {
14855
14973
  : paint?.["fill-extrusion-height"];
14856
14974
  };
14857
14975
 
14976
+ const getLayerClientStyle = (layer) => {
14977
+ const clientStyle = layer?.configuration?.clientStyle;
14978
+ return {
14979
+ ...clientStyle,
14980
+ items: clientStyle?.items ?? [],
14981
+ };
14982
+ };
14983
+
14858
14984
  const extractAttributesFromObject = (obj) => {
14859
14985
  if (!obj || isEmpty(obj)) {
14860
14986
  return [];
@@ -14884,7 +15010,6 @@ const VectorLayer = ({ layer, tileUrl, visible, beforeId, getLayerTempStyle, })
14884
15010
  const layerConfiguration = layer?.configuration;
14885
15011
  const clientStyle = layerConfiguration?.clientStyle;
14886
15012
  const idAttribute = layerConfiguration?.attributesConfiguration?.idAttribute;
14887
- const geometryType = layerConfiguration?.geometryType;
14888
15013
  const tiles = useMemo(() => [tileUrl], [tileUrl]);
14889
15014
  // Собираем конфигурации иконок для загрузки из clientStyle
14890
15015
  const iconConfigs = useMemo(() => {
@@ -14911,121 +15036,28 @@ const VectorLayer = ({ layer, tileUrl, visible, beforeId, getLayerTempStyle, })
14911
15036
  }).filter((config) => config !== null);
14912
15037
  }, [clientStyle]);
14913
15038
  useMapImages({ images: iconConfigs });
14914
- const renderLayerByGeometryType = useCallback(() => {
14915
- const visibility = visible ? "visible" : "none";
14916
- switch (geometryType) {
14917
- case OgcGeometryType.Point:
14918
- case OgcGeometryType.MultiPoint:
14919
- return (jsx(Layer$1, { id: layer.name, type: "circle", "source-layer": "default", beforeId: beforeId, layout: {
14920
- ...getLayerTempStyle?.(layer.name, "circle")?.layout,
14921
- visibility,
14922
- }, paint: {
14923
- ...DEFAULT_CIRCLE_PAINT,
14924
- ...getLayerTempStyle?.(layer.name, "circle")?.paint,
14925
- } }));
14926
- case OgcGeometryType.Polygon:
14927
- case OgcGeometryType.MultiPolygon:
14928
- return [
14929
- jsx(Layer$1, { id: layer.name, type: "fill", "source-layer": "default", beforeId: beforeId, layout: {
14930
- ...getLayerTempStyle?.(layer.name, "fill")?.layout,
14931
- visibility: visible &&
14932
- getLayerTempStyle?.(layer.name, "fill-extrusion")?.settings?.fill?.showBottomSurface !== false &&
14933
- Boolean(getActualExtrusionHeight({
14934
- ...DEFAULT_FILL_EXTRUSION_PAINT,
14935
- ...getLayerTempStyle?.(layer.name, "fill-extrusion")?.paint,
14936
- }))
14937
- ? "visible"
14938
- : "none",
14939
- }, paint: {
14940
- ...DEFAULT_FILL_PAINT,
14941
- ...getLayerTempStyle?.(layer.name, "fill")?.paint,
14942
- } }, `polygon-layer-${layer.name}`),
14943
- jsx(Layer$1, { id: `${layer.name}-stroke`, type: "line", "source-layer": "default", beforeId: beforeId, layout: {
14944
- ...getLayerTempStyle?.(layer.name, "line")?.layout,
14945
- visibility: visible &&
14946
- getLayerTempStyle?.(layer.name, "fill-extrusion")?.settings?.fill?.showBottomSurface !== false &&
14947
- Boolean(getActualExtrusionHeight({
14948
- ...DEFAULT_FILL_EXTRUSION_PAINT,
14949
- ...getLayerTempStyle?.(layer.name, "fill-extrusion")?.paint,
14950
- }))
14951
- ? "visible"
14952
- : "none",
14953
- }, paint: {
14954
- ...DEFAULT_LINE_PAINT,
14955
- ...getLayerTempStyle?.(layer.name, "line")?.paint,
14956
- } }, `polygon-stroke-layer-${layer.name}`),
14957
- jsx(Layer$1, { id: `${layer.name}-extrusion`, type: "fill-extrusion", "source-layer": "default", beforeId: beforeId, minzoom: 0, maxzoom: 23, layout: {
14958
- ...getLayerTempStyle?.(layer.name, "fill-extrusion")?.layout,
14959
- visibility,
14960
- }, paint: {
14961
- ...DEFAULT_FILL_EXTRUSION_PAINT,
14962
- ...getLayerTempStyle?.(layer.name, "fill-extrusion")?.paint,
14963
- } }, `polygon-extrusion-layer-${layer.name}`),
14964
- ];
14965
- case OgcGeometryType.LineString:
14966
- case OgcGeometryType.MultiLineString:
14967
- return (jsx(Layer$1, { id: layer.name, type: "line", "source-layer": "default", beforeId: beforeId, layout: {
14968
- ...getLayerTempStyle?.(layer.name, "line")?.layout,
14969
- visibility,
14970
- }, paint: {
14971
- ...DEFAULT_LINE_PAINT,
14972
- ...getLayerTempStyle?.(layer.name, "line")?.paint,
14973
- } }));
14974
- default:
14975
- return null;
14976
- }
14977
- }, [
14978
- geometryType,
14979
- layer,
14980
- beforeId,
14981
- visible,
14982
- getLayerTempStyle,
14983
- ]);
14984
15039
  const renderClientStyle = useCallback(() => {
14985
- return clientStyle.items.map((mockItem, index) => {
14986
- const [prefix, suffix] = getClientStyleItemPrefixSuffix(geometryType, mockItem.type);
14987
- const isExtrusionItem = mockItem.type === "fill-extrusion";
14988
- const isPolygonPart = clientStyle.items.some(item => item.type === "fill-extrusion") &&
14989
- (mockItem.type === "fill" || mockItem.type === "line");
14990
- const fillExtrusionPaint = isPolygonPart || isExtrusionItem
14991
- ? {
14992
- ...clientStyle.items?.find(item => item.type === "fill-extrusion")?.paint,
14993
- ...getLayerTempStyle?.(layer.name, "fill-extrusion")?.paint,
14994
- }
14995
- : undefined;
14996
- const currentSettings = {
14997
- ...clientStyle?.settings,
14998
- ...getLayerTempStyle?.(layer.name, mockItem.type)?.settings,
14999
- };
15000
- const processedExtrusionHeight = getActualExtrusionHeight(fillExtrusionPaint);
15001
- const hasExtrusion = Boolean(processedExtrusionHeight);
15002
- const visibility = visible &&
15003
- ((isExtrusionItem && hasExtrusion) ||
15004
- (!isPolygonPart && !isExtrusionItem) ||
15005
- (isPolygonPart && (!hasExtrusion || (currentSettings?.fill?.showBottomSurface ?? true))))
15006
- ? "visible"
15007
- : "none";
15008
- return (jsx(Layer$1, { id: `${layer.name}${suffix}`, type: mockItem.type, "source-layer": "default", beforeId: beforeId, ...(mockItem.filter && { filter: mockItem.filter }), minzoom: mockItem.minzoom ?? clientStyle?.minzoom ?? 0, maxzoom: mockItem.maxzoom ?? clientStyle?.maxzoom ?? 23, layout: {
15040
+ const items = [...(getLayerTempStyle(layer.name)?.items ?? clientStyle?.items ?? [])];
15041
+ let currentBeforeId = beforeId;
15042
+ return items.map((mockItem, mockItemIndex) => {
15043
+ const visibility = visible ? "visible" : "none";
15044
+ if (mockItemIndex > 0) {
15045
+ currentBeforeId = `${layer.name}-${items[mockItemIndex - 1].id}`;
15046
+ }
15047
+ return (jsx(Layer$1, { id: `${layer.name}-${mockItem.id}`, type: mockItem.type, "source-layer": "default", beforeId: currentBeforeId, ...(mockItem.filter && { filter: mockItem.filter }), minzoom: mockItem.minzoom ?? clientStyle?.minzoom ?? 0, maxzoom: mockItem.maxzoom ?? clientStyle?.maxzoom ?? 23, layout: {
15009
15048
  ...mockItem.layout,
15010
- ...getLayerTempStyle?.(layer.name, mockItem.type)?.layout,
15049
+ ...getLayerTempStyle(layer.name)?.items?.find(item => item.id === mockItem.id)?.layout,
15011
15050
  visibility,
15012
15051
  }, paint: {
15013
15052
  ...mockItem.paint,
15014
- ...getLayerTempStyle?.(layer.name, mockItem.type)?.paint,
15015
- } }, `${prefix}${layer.name}-${index}`));
15053
+ ...getLayerTempStyle(layer.name)?.items?.find(item => item.id === mockItem.id)?.paint,
15054
+ } }, `${layer.name}-${mockItem.id}`));
15016
15055
  });
15017
- }, [
15018
- beforeId,
15019
- clientStyle,
15020
- geometryType,
15021
- layer.name,
15022
- visible,
15023
- getLayerTempStyle,
15024
- ]);
15056
+ }, [beforeId, clientStyle, layer.name, visible, getLayerTempStyle]);
15025
15057
  if (!layer) {
15026
15058
  return null;
15027
15059
  }
15028
- return (jsx(Source, { promoteId: idAttribute, id: layer.name, type: "vector", tiles: tiles, children: clientStyle?.items ? renderClientStyle() : renderLayerByGeometryType() }, `${layer.name}-${tileUrl}`));
15060
+ return (jsx(Source, { promoteId: idAttribute, id: layer.name, type: "vector", tiles: tiles, children: renderClientStyle() }, `${layer.name}-${tileUrl}`));
15029
15061
  };
15030
15062
 
15031
15063
  const Layer = ({ layer, layerType, visible, beforeId, tileUrl, getLayerTempStyle, onMount = () => { }, }) => {
@@ -15072,5 +15104,5 @@ const Map$1 = ({ zIndex, lowerSiblings, upperSiblings, onError, children, ...res
15072
15104
  }, children: children }), upperSiblings] }));
15073
15105
  };
15074
15106
 
15075
- 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 };
15107
+ 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, TILE_ALIGNMENTS, 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, getLayerClientStyle, 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, useEqualTileWidth, 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 };
15076
15108
  //# sourceMappingURL=react.esm.js.map