fui-material 2.8.12 → 2.8.14

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.
@@ -9,7 +9,7 @@ import { initializeModule as initializeModule$1, installFormatCode } from "allor
9
9
  import { useQueryClient, useMutation, useQuery } from "@tanstack/react-query";
10
10
  import './index.css';const btn = "_btn_gdyy6_1";
11
11
  const disabled$4 = "_disabled_gdyy6_31";
12
- const styles$B = {
12
+ const styles$D = {
13
13
  btn,
14
14
  disabled: disabled$4,
15
15
  "btn-xs": "_btn-xs_gdyy6_40",
@@ -55,9 +55,9 @@ const FButton = forwardRef(({
55
55
  };
56
56
  const variantClass = variant === "contained" ? `btn-${color}` : `btn-outline-${color}`;
57
57
  const buttonClasses = [
58
- styles$B["btn"],
59
- styles$B[size],
60
- styles$B[variantClass],
58
+ styles$D["btn"],
59
+ styles$D[size],
60
+ styles$D[variantClass],
61
61
  className
62
62
  ].filter(Boolean).join(" ");
63
63
  return /* @__PURE__ */ jsx(
@@ -123,7 +123,7 @@ FTrashIcon.displayName = "FTrashIcon";
123
123
  const progressBar = "_progressBar_1iwax_48";
124
124
  const completed = "_completed_1iwax_60";
125
125
  const progress = "_progress_1iwax_48";
126
- const styles$A = {
126
+ const styles$C = {
127
127
  "file-preview-card": "_file-preview-card_1iwax_1",
128
128
  "file-preview-info": "_file-preview-info_1iwax_22",
129
129
  "file-preview-name": "_file-preview-name_1iwax_28",
@@ -145,18 +145,18 @@ const FFile = ({
145
145
  return /* @__PURE__ */ jsxs(
146
146
  "div",
147
147
  {
148
- className: `${styles$A["file-preview-card"]} ${className || ""}`,
148
+ className: `${styles$C["file-preview-card"]} ${className || ""}`,
149
149
  id,
150
150
  style: st,
151
151
  children: [
152
- /* @__PURE__ */ jsxs("div", { className: styles$A["file-preview-info"], children: [
153
- /* @__PURE__ */ jsx("span", { className: styles$A["file-preview-name"], title: name, children: name }),
154
- typeof size === "number" && /* @__PURE__ */ jsxs("span", { className: styles$A["file-preview-size"], children: [
152
+ /* @__PURE__ */ jsxs("div", { className: styles$C["file-preview-info"], children: [
153
+ /* @__PURE__ */ jsx("span", { className: styles$C["file-preview-name"], title: name, children: name }),
154
+ typeof size === "number" && /* @__PURE__ */ jsxs("span", { className: styles$C["file-preview-size"], children: [
155
155
  Math.round(size / 1024),
156
156
  " КБ"
157
157
  ] })
158
158
  ] }),
159
- handleDelete && /* @__PURE__ */ jsx("div", { className: styles$A["trash-icon"], children: /* @__PURE__ */ jsx(
159
+ handleDelete && /* @__PURE__ */ jsx("div", { className: styles$C["trash-icon"], children: /* @__PURE__ */ jsx(
160
160
  FTrashIcon,
161
161
  {
162
162
  size: 20,
@@ -164,10 +164,10 @@ const FFile = ({
164
164
  handleClick: handleDelete
165
165
  }
166
166
  ) }),
167
- typeof progress2 === "number" && /* @__PURE__ */ jsx("div", { className: `${styles$A.progressBar} ${progress2 === 100 ? styles$A.completed : ""}`, children: /* @__PURE__ */ jsx(
167
+ typeof progress2 === "number" && /* @__PURE__ */ jsx("div", { className: `${styles$C.progressBar} ${progress2 === 100 ? styles$C.completed : ""}`, children: /* @__PURE__ */ jsx(
168
168
  "div",
169
169
  {
170
- className: styles$A.progress,
170
+ className: styles$C.progress,
171
171
  style: { width: `${progress2}%` }
172
172
  }
173
173
  ) })
@@ -270,7 +270,7 @@ const FButtonFile = ({
270
270
  )) }) })
271
271
  ] });
272
272
  };
273
- const styles$z = {
273
+ const styles$B = {
274
274
  "f-text-field": "_f-text-field_200bb_1"
275
275
  };
276
276
  const FLoadIcon = React.forwardRef(({
@@ -349,7 +349,7 @@ const FTextField = forwardRef(
349
349
  return /* @__PURE__ */ jsxs(
350
350
  "div",
351
351
  {
352
- className: `f-form-element ${styles$z["f-text-field"]} ${className || ""}`,
352
+ className: `f-form-element ${styles$B["f-text-field"]} ${className || ""}`,
353
353
  style: mergedStyle,
354
354
  role: "group",
355
355
  id: inputId + "-text-field-block",
@@ -455,7 +455,7 @@ const FStack = ({
455
455
  }
456
456
  );
457
457
  };
458
- const styles$y = {
458
+ const styles$A = {
459
459
  "f-grid": "_f-grid_3g4xh_1",
460
460
  "f-grid__col": "_f-grid__col_3g4xh_10",
461
461
  "f-grid__col--auto": "_f-grid__col--auto_3g4xh_16",
@@ -558,21 +558,21 @@ const FGrid = ({
558
558
  xxl: xxl ?? xl ?? lg ?? md ?? sm ?? xs
559
559
  };
560
560
  const getColumnClasses = () => {
561
- if (colAuto) return styles$y["f-grid__col--auto"];
562
- const classes = [styles$y["f-grid__col"]];
563
- if (resolvedSizes.xs !== void 0) classes.push(styles$y[`f-grid__col--xs-${resolvedSizes.xs}`]);
564
- if (resolvedSizes.sm !== void 0) classes.push(styles$y[`f-grid__col--sm-${resolvedSizes.sm}`]);
565
- if (resolvedSizes.md !== void 0) classes.push(styles$y[`f-grid__col--md-${resolvedSizes.md}`]);
566
- if (resolvedSizes.lg !== void 0) classes.push(styles$y[`f-grid__col--lg-${resolvedSizes.lg}`]);
567
- if (resolvedSizes.xl !== void 0) classes.push(styles$y[`f-grid__col--xl-${resolvedSizes.xl}`]);
568
- if (resolvedSizes.xxl !== void 0) classes.push(styles$y[`f-grid__col--xxl-${resolvedSizes.xxl}`]);
561
+ if (colAuto) return styles$A["f-grid__col--auto"];
562
+ const classes = [styles$A["f-grid__col"]];
563
+ if (resolvedSizes.xs !== void 0) classes.push(styles$A[`f-grid__col--xs-${resolvedSizes.xs}`]);
564
+ if (resolvedSizes.sm !== void 0) classes.push(styles$A[`f-grid__col--sm-${resolvedSizes.sm}`]);
565
+ if (resolvedSizes.md !== void 0) classes.push(styles$A[`f-grid__col--md-${resolvedSizes.md}`]);
566
+ if (resolvedSizes.lg !== void 0) classes.push(styles$A[`f-grid__col--lg-${resolvedSizes.lg}`]);
567
+ if (resolvedSizes.xl !== void 0) classes.push(styles$A[`f-grid__col--xl-${resolvedSizes.xl}`]);
568
+ if (resolvedSizes.xxl !== void 0) classes.push(styles$A[`f-grid__col--xxl-${resolvedSizes.xxl}`]);
569
569
  return classes.join(" ");
570
570
  };
571
571
  return /* @__PURE__ */ jsxs(Fragment, { children: [
572
572
  obj === "container" && /* @__PURE__ */ jsx(
573
573
  "div",
574
574
  {
575
- className: `${styles$y["f-grid"]} ${className || ""}`,
575
+ className: `${styles$A["f-grid"]} ${className || ""}`,
576
576
  style,
577
577
  id,
578
578
  children
@@ -590,7 +590,7 @@ const FGrid = ({
590
590
  obj === void 0 && /* @__PURE__ */ jsx("div", { className, style, id, children })
591
591
  ] });
592
592
  };
593
- const styles$x = {
593
+ const styles$z = {
594
594
  "f-grid-row": "_f-grid-row_1crbx_1",
595
595
  "f-grid-row--justify-start": "_f-grid-row--justify-start_1crbx_7",
596
596
  "f-grid-row--justify-center": "_f-grid-row--justify-center_1crbx_10",
@@ -612,21 +612,21 @@ const FGridRow = ({
612
612
  }) => {
613
613
  const getJustifyContentClass = () => {
614
614
  if (!justifyContent) return "";
615
- return styles$x[`f-grid-row--justify-${justifyContent}`];
615
+ return styles$z[`f-grid-row--justify-${justifyContent}`];
616
616
  };
617
617
  const getAlignItemsClass = () => {
618
618
  if (!alignItems) return "";
619
- return styles$x[`f-grid-row--align-${alignItems}`];
619
+ return styles$z[`f-grid-row--align-${alignItems}`];
620
620
  };
621
621
  const rowClasses = [
622
- styles$x["f-grid-row"],
622
+ styles$z["f-grid-row"],
623
623
  getJustifyContentClass(),
624
624
  getAlignItemsClass(),
625
625
  className
626
626
  ].filter(Boolean).join(" ");
627
627
  return /* @__PURE__ */ jsx("div", { className: rowClasses, style: st, id, children });
628
628
  };
629
- const styles$w = {
629
+ const styles$y = {
630
630
  "f-container": "_f-container_g9ck3_1",
631
631
  "container-fluid": "_container-fluid_g9ck3_1",
632
632
  "container-xxl": "_container-xxl_g9ck3_1",
@@ -646,7 +646,7 @@ const FContainer = ({
646
646
  return /* @__PURE__ */ jsx(
647
647
  "div",
648
648
  {
649
- className: `${styles$w["f-container"]} ${styles$w[maxWidth]} ${className || ""}`,
649
+ className: `${styles$y["f-container"]} ${styles$y[maxWidth]} ${className || ""}`,
650
650
  style: st,
651
651
  id,
652
652
  children
@@ -654,7 +654,7 @@ const FContainer = ({
654
654
  );
655
655
  };
656
656
  const panel = "_panel_q7in0_1";
657
- const styles$v = {
657
+ const styles$x = {
658
658
  panel,
659
659
  "panel-default": "_panel-default_q7in0_6",
660
660
  "panel-heading": "_panel-heading_q7in0_12",
@@ -687,15 +687,15 @@ const FPaper = ({
687
687
  return /* @__PURE__ */ jsxs(
688
688
  "div",
689
689
  {
690
- className: `${styles$v["panel"]} ${styles$v["panel-default"]} ${className || ""} ${animated ? `${styles$v[`animated-${animated.name}`]} ${animated.name}` : ""}`,
690
+ className: `${styles$x["panel"]} ${styles$x["panel-default"]} ${className || ""} ${animated ? `${styles$x[`animated-${animated.name}`]} ${animated.name}` : ""}`,
691
691
  style: st,
692
692
  id,
693
693
  onAnimationEnd,
694
694
  children: [
695
- label && /* @__PURE__ */ jsx("div", { className: styles$v["panel-heading"], children: /* @__PURE__ */ jsx(
695
+ label && /* @__PURE__ */ jsx("div", { className: styles$x["panel-heading"], children: /* @__PURE__ */ jsx(
696
696
  "h3",
697
697
  {
698
- className: styles$v["panel-title"],
698
+ className: styles$x["panel-title"],
699
699
  style: { fontSize: fontSizeLabel },
700
700
  children: label
701
701
  }
@@ -703,7 +703,7 @@ const FPaper = ({
703
703
  /* @__PURE__ */ jsx(
704
704
  "div",
705
705
  {
706
- className: styles$v["panel-body"],
706
+ className: styles$x["panel-body"],
707
707
  style: { fontSize: fontSizeBody },
708
708
  children
709
709
  }
@@ -713,39 +713,39 @@ const FPaper = ({
713
713
  );
714
714
  };
715
715
  const TableControlsContext = createContext({ query: "", sort: null });
716
- const left$1 = "_left_18u6h_77";
717
- const center = "_center_18u6h_80";
718
- const right = "_right_18u6h_83";
719
- const justify = "_justify_18u6h_86";
720
- const more = "_more_18u6h_194";
721
- const styles$u = {
722
- "f-table-component": "_f-table-component_18u6h_1",
723
- "f-table-component__table": "_f-table-component__table_18u6h_14",
724
- "f-table-component__table_header": "_f-table-component__table_header_18u6h_22",
725
- "is-sticky": "_is-sticky_18u6h_26",
726
- "f-table-component__table_header-cell": "_f-table-component__table_header-cell_18u6h_32",
727
- "f-table-component__table_body-cell": "_f-table-component__table_body-cell_18u6h_32",
728
- "f-table-component__table_body": "_f-table-component__table_body_18u6h_32",
729
- "f-table-component__table_row": "_f-table-component__table_row_18u6h_60",
730
- "f-table-component__table_row_no-hover": "_f-table-component__table_row_no-hover_18u6h_60",
731
- "f-table-component__table_footer": "_f-table-component__table_footer_18u6h_66",
732
- left: left$1,
716
+ const left$2 = "_left_nsv5n_81";
717
+ const center = "_center_nsv5n_84";
718
+ const right$1 = "_right_nsv5n_87";
719
+ const justify = "_justify_nsv5n_90";
720
+ const more = "_more_nsv5n_198";
721
+ const styles$w = {
722
+ "f-table-component": "_f-table-component_nsv5n_1",
723
+ "f-table-component__table": "_f-table-component__table_nsv5n_14",
724
+ "f-table-component__table_header": "_f-table-component__table_header_nsv5n_22",
725
+ "is-sticky": "_is-sticky_nsv5n_26",
726
+ "f-table-component__table_body": "_f-table-component__table_body_nsv5n_32",
727
+ "f-table-component__table_header-cell": "_f-table-component__table_header-cell_nsv5n_35",
728
+ "f-table-component__table_body-cell": "_f-table-component__table_body-cell_nsv5n_35",
729
+ "f-table-component__table_row": "_f-table-component__table_row_nsv5n_64",
730
+ "f-table-component__table_row_no-hover": "_f-table-component__table_row_no-hover_nsv5n_64",
731
+ "f-table-component__table_footer": "_f-table-component__table_footer_nsv5n_71",
732
+ left: left$2,
733
733
  center,
734
- right,
734
+ right: right$1,
735
735
  justify,
736
- "cell-text": "_cell-text_18u6h_90",
737
- "cell-preview-text": "_cell-preview-text_18u6h_111",
738
- "cell-preview": "_cell-preview_18u6h_111",
739
- "cell-reveal": "_cell-reveal_18u6h_168",
736
+ "cell-text": "_cell-text_nsv5n_94",
737
+ "cell-preview-text": "_cell-preview-text_nsv5n_115",
738
+ "cell-preview": "_cell-preview_nsv5n_115",
739
+ "cell-reveal": "_cell-reveal_nsv5n_172",
740
740
  more,
741
- "row-menu": "_row-menu_18u6h_225",
742
- "table-tools": "_table-tools_18u6h_317",
743
- "table-search": "_table-search_18u6h_323",
744
- "table-sort": "_table-sort_18u6h_358",
745
- "table-empty": "_table-empty_18u6h_386",
746
- "cell-tooltip-anchor": "_cell-tooltip-anchor_18u6h_393",
747
- "cell-tooltip": "_cell-tooltip_18u6h_393",
748
- "cell-tooltip-in": "_cell-tooltip-in_18u6h_1"
741
+ "row-menu": "_row-menu_nsv5n_229",
742
+ "table-tools": "_table-tools_nsv5n_322",
743
+ "table-search": "_table-search_nsv5n_328",
744
+ "table-sort": "_table-sort_nsv5n_363",
745
+ "table-empty": "_table-empty_nsv5n_391",
746
+ "cell-tooltip-anchor": "_cell-tooltip-anchor_nsv5n_398",
747
+ "cell-tooltip": "_cell-tooltip_nsv5n_398",
748
+ "cell-tooltip-in": "_cell-tooltip-in_nsv5n_1"
749
749
  };
750
750
  const FTableHead = ({
751
751
  st,
@@ -761,7 +761,7 @@ const FTableHead = ({
761
761
  {
762
762
  style: st,
763
763
  ...props,
764
- className: `${styles$u["f-table-component__table_header"]} ${isSticky ? styles$u["is-sticky"] : ""} ${props.className || ""} ${styles$u[textAlignment]}`,
764
+ className: `${styles$w["f-table-component__table_header"]} ${isSticky ? styles$w["is-sticky"] : ""} ${props.className || ""} ${styles$w[textAlignment]}`,
765
765
  children
766
766
  }
767
767
  );
@@ -871,7 +871,7 @@ const FTableBody = ({
871
871
  const { query, sort } = useContext(TableControlsContext);
872
872
  const index = useMemo(() => indexTableRows(children), [children]);
873
873
  const rows = useMemo(() => selectTableRows(index, query, sort), [index, query, sort]);
874
- const [viewport, setViewport] = useState({ top: 0, height: 0 });
874
+ const [viewport2, setViewport] = useState({ top: 0, height: 0 });
875
875
  const [heights, setHeights] = useState(() => /* @__PURE__ */ new Map());
876
876
  const virtual = Boolean(tableWrapperRef) && visibleRowCount !== void 0 && Number.isFinite(visibleRowCount) && visibleRowCount >= 1 && !index.hasRowSpans;
877
877
  const keyOf = (row, index2) => React.isValidElement(row) ? String(row.key ?? index2) : String(index2);
@@ -880,7 +880,7 @@ const FTableBody = ({
880
880
  if (virtual) rows.forEach((row, index2) => result.push(result[index2] + (heights.get(keyOf(row, index2)) ?? 32)));
881
881
  return result;
882
882
  }, [rows, heights, virtual]);
883
- const { start, end } = virtual ? virtualRowRange(offsets, viewport.top, viewport.height, visibleRowCount) : { start: 0, end: rows.length };
883
+ const { start, end } = virtual ? virtualRowRange(offsets, viewport2.top, viewport2.height, visibleRowCount) : { start: 0, end: rows.length };
884
884
  const visibleRows = useMemo(() => rows.slice(start, end), [rows, start, end]);
885
885
  useLayoutEffect(() => {
886
886
  setViewport((previous) => ({ ...previous, top: 0 }));
@@ -956,14 +956,14 @@ const FTableBody = ({
956
956
  ref: tableBodyRef,
957
957
  style: st,
958
958
  ...props,
959
- className: `${styles$u["f-table-component__table_body"]} ${props.className || ""} ${styles$u[textAlignment]}`,
959
+ className: `${styles$w["f-table-component__table_body"]} ${props.className || ""} ${styles$w[textAlignment]}`,
960
960
  children: [
961
961
  virtual && start > 0 && /* @__PURE__ */ jsx("tr", { "aria-hidden": "true", children: /* @__PURE__ */ jsx("td", { colSpan: index.columnCount, style: { height: offsets[start], padding: 0, border: 0 } }) }),
962
962
  visibleRows.map((child, index2) => React.isValidElement(child) ? React.cloneElement(child, {
963
963
  "data-row-index": start + index2,
964
964
  "data-table-row-key": keyOf(child, start + index2)
965
965
  }) : child),
966
- query.trim() && rows.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: index.columnCount, className: styles$u["table-empty"], children: /* @__PURE__ */ jsx("span", { role: "status", children: "Ничего не найдено" }) }) }),
966
+ query.trim() && rows.length === 0 && /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: index.columnCount, className: styles$w["table-empty"], children: /* @__PURE__ */ jsx("span", { role: "status", children: "Ничего не найдено" }) }) }),
967
967
  virtual && end < rows.length && /* @__PURE__ */ jsx("tr", { "aria-hidden": "true", children: /* @__PURE__ */ jsx("td", { colSpan: index.columnCount, style: { height: offsets[rows.length] - offsets[end], padding: 0, border: 0 } }) })
968
968
  ]
969
969
  }
@@ -1013,7 +1013,7 @@ const FTable = ({
1013
1013
  };
1014
1014
  }, []);
1015
1015
  return /* @__PURE__ */ jsxs(TableControlsContext.Provider, { value: controls, children: [
1016
- searchable && /* @__PURE__ */ jsx("div", { className: styles$u["table-tools"], children: /* @__PURE__ */ jsxs("label", { className: styles$u["table-search"], children: [
1016
+ searchable && /* @__PURE__ */ jsx("div", { className: styles$w["table-tools"], children: /* @__PURE__ */ jsxs("label", { className: styles$w["table-search"], children: [
1017
1017
  /* @__PURE__ */ jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", "aria-hidden": "true", children: [
1018
1018
  /* @__PURE__ */ jsx("circle", { cx: "11", cy: "11", r: "7" }),
1019
1019
  /* @__PURE__ */ jsx("path", { d: "m20 20-3.5-3.5" })
@@ -1036,7 +1036,7 @@ const FTable = ({
1036
1036
  "div",
1037
1037
  {
1038
1038
  ref: tableWrapperRef,
1039
- className: styles$u["f-table-component"],
1039
+ className: styles$w["f-table-component"],
1040
1040
  style: { overflowX, overflowY },
1041
1041
  children: /* @__PURE__ */ jsx(
1042
1042
  "table",
@@ -1048,7 +1048,7 @@ const FTable = ({
1048
1048
  ...st
1049
1049
  },
1050
1050
  ...props,
1051
- className: `table ${styles$u["f-table-component__table"]} ${props.className || ""}`,
1051
+ className: `table ${styles$w["f-table-component__table"]} ${props.className || ""}`,
1052
1052
  children: React.Children.map(children, (child) => {
1053
1053
  if (React.isValidElement(child) && child.type === FTableHead) {
1054
1054
  const headProps = child.props;
@@ -1087,20 +1087,23 @@ const FTableRow = ({
1087
1087
  ...props
1088
1088
  }) => {
1089
1089
  const rowClasses = [
1090
- styles$u["f-table-component__table_row"],
1090
+ styles$w["f-table-component__table_row"],
1091
1091
  props.className || ""
1092
1092
  ];
1093
1093
  if (disableHover) {
1094
- rowClasses.push(styles$u["f-table-component__table_row_no-hover"]);
1094
+ rowClasses.push(styles$w["f-table-component__table_row_no-hover"]);
1095
1095
  }
1096
1096
  if (textAlignment !== void 0) {
1097
- rowClasses.push(styles$u[textAlignment]);
1097
+ rowClasses.push(styles$w[textAlignment]);
1098
1098
  }
1099
1099
  return /* @__PURE__ */ jsx(
1100
1100
  "tr",
1101
1101
  {
1102
- style: st,
1103
1102
  ...props,
1103
+ style: {
1104
+ ...props.style,
1105
+ ...st
1106
+ },
1104
1107
  className: rowClasses.join(" ").trim(),
1105
1108
  children
1106
1109
  }
@@ -1139,13 +1142,13 @@ const FTableHeaderCell = ({
1139
1142
  colSpan: col && col > 1 ? col : void 0,
1140
1143
  ...props,
1141
1144
  "aria-sort": sortable ? direction ?? "none" : props["aria-sort"],
1142
- className: `${styles$u["f-table-component__table_header-cell"]} ${props.className || ""}`,
1145
+ className: `${styles$w["f-table-component__table_header-cell"]} ${props.className || ""}`,
1143
1146
  style,
1144
1147
  children: sortable ? /* @__PURE__ */ jsxs(
1145
1148
  "button",
1146
1149
  {
1147
1150
  type: "button",
1148
- className: styles$u["table-sort"],
1151
+ className: styles$w["table-sort"],
1149
1152
  onClick: () => toggleSort == null ? void 0 : toggleSort(sortKey),
1150
1153
  title: direction === "ascending" ? "По убыванию" : direction === "descending" ? "Исходный порядок" : "По возрастанию",
1151
1154
  children: [
@@ -1209,7 +1212,7 @@ function FTableTextTooltip({ text, enabled, children }) {
1209
1212
  "span",
1210
1213
  {
1211
1214
  ref: anchor,
1212
- className: styles$u["cell-tooltip-anchor"],
1215
+ className: styles$w["cell-tooltip-anchor"],
1213
1216
  onMouseEnter: show,
1214
1217
  onMouseLeave: hide2,
1215
1218
  onFocus: show,
@@ -1222,7 +1225,7 @@ function FTableTextTooltip({ text, enabled, children }) {
1222
1225
  ref: panel2,
1223
1226
  id,
1224
1227
  role: "tooltip",
1225
- className: styles$u["cell-tooltip"],
1228
+ className: styles$w["cell-tooltip"],
1226
1229
  style: position,
1227
1230
  onMouseEnter: show,
1228
1231
  onMouseLeave: hide2,
@@ -1270,20 +1273,20 @@ const FTableDataCell = ({
1270
1273
  rowSpan: row && row > 1 ? row : void 0,
1271
1274
  colSpan: col && col > 1 ? col : void 0,
1272
1275
  ...props,
1273
- className: `${styles$u["f-table-component__table_body-cell"]} ${props.className || ""}`.trim(),
1276
+ className: `${styles$w["f-table-component__table_body-cell"]} ${props.className || ""}`.trim(),
1274
1277
  style,
1275
1278
  children: collapsible ? /* @__PURE__ */ jsx(FTableTextTooltip, { text, enabled: !expanded, children: /* @__PURE__ */ jsxs(
1276
1279
  "button",
1277
1280
  {
1278
1281
  type: "button",
1279
- className: styles$u["cell-text"],
1282
+ className: styles$w["cell-text"],
1280
1283
  "aria-expanded": expanded,
1281
1284
  "aria-controls": textId,
1282
1285
  "data-expanded": expanded,
1283
1286
  onClick: () => setExpanded((value) => !value),
1284
1287
  children: [
1285
- /* @__PURE__ */ jsx("span", { className: styles$u["cell-preview"], "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: styles$u["cell-preview-text"], children: text }) }),
1286
- /* @__PURE__ */ jsx("span", { className: styles$u["cell-reveal"], children: /* @__PURE__ */ jsx("span", { id: textId, children: text }) })
1288
+ /* @__PURE__ */ jsx("span", { className: styles$w["cell-preview"], "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: styles$w["cell-preview-text"], children: text }) }),
1289
+ /* @__PURE__ */ jsx("span", { className: styles$w["cell-reveal"], children: /* @__PURE__ */ jsx("span", { id: textId, children: text }) })
1287
1290
  ]
1288
1291
  }
1289
1292
  ) }) : children
@@ -1300,19 +1303,19 @@ const FTableFooter = ({
1300
1303
  {
1301
1304
  style: st,
1302
1305
  ...props,
1303
- className: `${styles$u["f-table-component__table_footer"]} ${props.className || ""}`,
1306
+ className: `${styles$w["f-table-component__table_footer"]} ${props.className || ""}`,
1304
1307
  children
1305
1308
  }
1306
1309
  );
1307
1310
  };
1308
- const entering = "_entering_g7izy_19";
1309
- const exiting = "_exiting_g7izy_25";
1311
+ const entering$2 = "_entering_g7izy_19";
1312
+ const exiting$2 = "_exiting_g7izy_25";
1310
1313
  const hide = "_hide_g7izy_50";
1311
- const styles$t = {
1314
+ const styles$v = {
1312
1315
  "f-dialog": "_f-dialog_g7izy_1",
1313
- entering,
1316
+ entering: entering$2,
1314
1317
  "f-dialog__content": "_f-dialog__content_g7izy_22",
1315
- exiting,
1318
+ exiting: exiting$2,
1316
1319
  hide,
1317
1320
  "f-dialog__header": "_f-dialog__header_g7izy_61",
1318
1321
  "f-dialog__header_title": "_f-dialog__header_title_g7izy_73",
@@ -1388,14 +1391,14 @@ const FDialog = ({
1388
1391
  adaptive: "fit-content"
1389
1392
  };
1390
1393
  const contentWidth = widthStyles[width];
1391
- const animationClass = isClosing ? styles$t["exiting"] : styles$t["entering"];
1394
+ const animationClass = isClosing ? styles$v["exiting"] : styles$v["entering"];
1392
1395
  return ReactDOM.createPortal(
1393
1396
  /* @__PURE__ */ jsx(
1394
1397
  "div",
1395
1398
  {
1396
1399
  id,
1397
1400
  style: st,
1398
- className: `${styles$t["f-dialog"]} ${animationClass} ${className || ""}`,
1401
+ className: `${styles$v["f-dialog"]} ${animationClass} ${className || ""}`,
1399
1402
  onMouseDown: (e) => {
1400
1403
  if (e.target === e.currentTarget) {
1401
1404
  closeButtonBackPage == null ? void 0 : closeButtonBackPage(false);
@@ -1405,7 +1408,7 @@ const FDialog = ({
1405
1408
  children: /* @__PURE__ */ jsx(
1406
1409
  "div",
1407
1410
  {
1408
- className: `${styles$t["f-dialog__content"]} ${hide2 ? styles$t["hide"] : ""}`,
1411
+ className: `${styles$v["f-dialog__content"]} ${hide2 ? styles$v["hide"] : ""}`,
1409
1412
  style: {
1410
1413
  width: contentWidth
1411
1414
  },
@@ -1446,13 +1449,13 @@ const FCloseIcon = React.forwardRef(({
1446
1449
  });
1447
1450
  FCloseIcon.displayName = "FCloseIcon";
1448
1451
  const FDialogHeader = ({ title: title2, handleClose }) => {
1449
- return /* @__PURE__ */ jsxs("div", { className: styles$t["f-dialog__header"], children: [
1450
- /* @__PURE__ */ jsx("h3", { className: styles$t["f-dialog__header_title"], children: title2 }),
1452
+ return /* @__PURE__ */ jsxs("div", { className: styles$v["f-dialog__header"], children: [
1453
+ /* @__PURE__ */ jsx("h3", { className: styles$v["f-dialog__header_title"], children: title2 }),
1451
1454
  handleClose && /* @__PURE__ */ jsx(
1452
1455
  "button",
1453
1456
  {
1454
1457
  type: "button",
1455
- className: styles$t["f-dialog__header_close"],
1458
+ className: styles$v["f-dialog__header_close"],
1456
1459
  onClick: handleClose,
1457
1460
  "aria-label": "Закрыть диалог",
1458
1461
  children: /* @__PURE__ */ jsx(
@@ -1471,7 +1474,7 @@ const FDialogBody = ({ st, children, scroll = true }) => {
1471
1474
  ...scroll ? { overflowY: "auto" } : {},
1472
1475
  ...st
1473
1476
  };
1474
- return /* @__PURE__ */ jsx("div", { className: styles$t["f-dialog__body"], style, children });
1477
+ return /* @__PURE__ */ jsx("div", { className: styles$v["f-dialog__body"], style, children });
1475
1478
  };
1476
1479
  const FDialogFooter = ({ children, className, st, id }) => {
1477
1480
  return /* @__PURE__ */ jsx(
@@ -1479,7 +1482,7 @@ const FDialogFooter = ({ children, className, st, id }) => {
1479
1482
  {
1480
1483
  id,
1481
1484
  style: st,
1482
- className: `${styles$t["f-dialog__footer"]} ${className || ""}`,
1485
+ className: `${styles$v["f-dialog__footer"]} ${className || ""}`,
1483
1486
  children
1484
1487
  }
1485
1488
  );
@@ -1494,7 +1497,7 @@ const info$4 = "_info_1glrn_62";
1494
1497
  const light$2 = "_light_1glrn_66";
1495
1498
  const dark$2 = "_dark_1glrn_70";
1496
1499
  const link$1 = "_link_1glrn_74";
1497
- const styles$s = {
1500
+ const styles$u = {
1498
1501
  "authorization-spinner": "_authorization-spinner_1glrn_1",
1499
1502
  "spinner-item": "_spinner-item_1glrn_7",
1500
1503
  loader,
@@ -1512,14 +1515,14 @@ const FProgress = ({ st, color = "primary", id, className }) => {
1512
1515
  return /* @__PURE__ */ jsx(
1513
1516
  "div",
1514
1517
  {
1515
- className: `${styles$s["authorization-spinner"]} ${styles$s.visible} ${className || ""}`,
1518
+ className: `${styles$u["authorization-spinner"]} ${styles$u.visible} ${className || ""}`,
1516
1519
  id,
1517
1520
  style: st,
1518
- children: /* @__PURE__ */ jsx("div", { className: `${styles$s["spinner-item"]} ${styles$s[color]}` })
1521
+ children: /* @__PURE__ */ jsx("div", { className: `${styles$u["spinner-item"]} ${styles$u[color]}` })
1519
1522
  }
1520
1523
  );
1521
1524
  };
1522
- const styles$r = {
1525
+ const styles$t = {
1523
1526
  "f-preloader": "_f-preloader_17f9x_1",
1524
1527
  "active-preloader": "_active-preloader_17f9x_10"
1525
1528
  };
@@ -1546,13 +1549,13 @@ const FPreloader = ({
1546
1549
  return /* @__PURE__ */ jsx(
1547
1550
  "div",
1548
1551
  {
1549
- className: `${styles$r["f-preloader"]} ${open ? styles$r["active-preloader"] : ""}`,
1552
+ className: `${styles$t["f-preloader"]} ${open ? styles$t["active-preloader"] : ""}`,
1550
1553
  style: mergedStyle,
1551
1554
  children
1552
1555
  }
1553
1556
  );
1554
1557
  };
1555
- const styles$q = {
1558
+ const styles$s = {
1556
1559
  "f-checkbox": "_f-checkbox_1hxs0_1"
1557
1560
  };
1558
1561
  const FCheckbox = forwardRef(
@@ -1565,7 +1568,7 @@ const FCheckbox = forwardRef(
1565
1568
  return /* @__PURE__ */ jsx(
1566
1569
  "div",
1567
1570
  {
1568
- className: `${styles$q["f-checkbox"]} ${className || ""}`,
1571
+ className: `${styles$s["f-checkbox"]} ${className || ""}`,
1569
1572
  style: st,
1570
1573
  children: /* @__PURE__ */ jsxs("label", { children: [
1571
1574
  /* @__PURE__ */ jsx("input", { ref, type: "checkbox", ...props }),
@@ -1575,7 +1578,7 @@ const FCheckbox = forwardRef(
1575
1578
  );
1576
1579
  }
1577
1580
  );
1578
- const styles$p = {
1581
+ const styles$r = {
1579
1582
  "f-radio": "_f-radio_1oidm_1"
1580
1583
  };
1581
1584
  const FRadioButton = forwardRef(
@@ -1588,7 +1591,7 @@ const FRadioButton = forwardRef(
1588
1591
  return /* @__PURE__ */ jsx(
1589
1592
  "div",
1590
1593
  {
1591
- className: `${styles$p["f-radio"]} ${className || ""}`,
1594
+ className: `${styles$r["f-radio"]} ${className || ""}`,
1592
1595
  style: st,
1593
1596
  children: /* @__PURE__ */ jsxs("label", { children: [
1594
1597
  /* @__PURE__ */ jsx("input", { ref, type: "radio", ...props }),
@@ -1648,16 +1651,16 @@ const usePagination = ({
1648
1651
  const dots = "_dots_uiqea_29";
1649
1652
  const selected$1 = "_selected_uiqea_33";
1650
1653
  const disabled$3 = "_disabled_uiqea_37";
1651
- const arrow = "_arrow_uiqea_43";
1652
- const left = "_left_uiqea_56";
1653
- const styles$o = {
1654
+ const arrow$1 = "_arrow_uiqea_43";
1655
+ const left$1 = "_left_uiqea_56";
1656
+ const styles$q = {
1654
1657
  "pagination-container": "_pagination-container_uiqea_1",
1655
1658
  "pagination-item": "_pagination-item_uiqea_9",
1656
1659
  dots,
1657
1660
  selected: selected$1,
1658
1661
  disabled: disabled$3,
1659
- arrow,
1660
- left
1662
+ arrow: arrow$1,
1663
+ left: left$1
1661
1664
  };
1662
1665
  const FPagination = ({
1663
1666
  currentPage,
@@ -1684,26 +1687,26 @@ const FPagination = ({
1684
1687
  return /* @__PURE__ */ jsxs(
1685
1688
  "ul",
1686
1689
  {
1687
- className: `${styles$o["pagination-container"]} ${className || ""}`,
1690
+ className: `${styles$q["pagination-container"]} ${className || ""}`,
1688
1691
  style: st,
1689
1692
  id,
1690
1693
  children: [
1691
1694
  /* @__PURE__ */ jsx(
1692
1695
  "li",
1693
1696
  {
1694
- className: `${styles$o["pagination-item"]} ${currentPage === 1 ? styles$o.disabled : ""}`,
1697
+ className: `${styles$q["pagination-item"]} ${currentPage === 1 ? styles$q.disabled : ""}`,
1695
1698
  onClick: onPrevious,
1696
- children: /* @__PURE__ */ jsx("div", { className: `${styles$o.arrow} ${styles$o.left}` })
1699
+ children: /* @__PURE__ */ jsx("div", { className: `${styles$q.arrow} ${styles$q.left}` })
1697
1700
  }
1698
1701
  ),
1699
1702
  paginationRange.map((pageNumber, index) => {
1700
1703
  if (pageNumber === DOTS) {
1701
- return /* @__PURE__ */ jsx("li", { className: `${styles$o["pagination-item"]} ${styles$o.dots}`, children: "…" }, index);
1704
+ return /* @__PURE__ */ jsx("li", { className: `${styles$q["pagination-item"]} ${styles$q.dots}`, children: "…" }, index);
1702
1705
  }
1703
1706
  return /* @__PURE__ */ jsx(
1704
1707
  "li",
1705
1708
  {
1706
- className: `${styles$o["pagination-item"]} ${pageNumber === currentPage ? styles$o.selected : ""}`,
1709
+ className: `${styles$q["pagination-item"]} ${pageNumber === currentPage ? styles$q.selected : ""}`,
1707
1710
  onClick: () => onPageChange(pageNumber),
1708
1711
  children: pageNumber
1709
1712
  },
@@ -1713,16 +1716,16 @@ const FPagination = ({
1713
1716
  /* @__PURE__ */ jsx(
1714
1717
  "li",
1715
1718
  {
1716
- className: `${styles$o["pagination-item"]} ${currentPage === lastPage ? styles$o.disabled : ""}`,
1719
+ className: `${styles$q["pagination-item"]} ${currentPage === lastPage ? styles$q.disabled : ""}`,
1717
1720
  onClick: onNext,
1718
- children: /* @__PURE__ */ jsx("div", { className: `${styles$o.arrow} ${styles$o.right}` })
1721
+ children: /* @__PURE__ */ jsx("div", { className: `${styles$q.arrow} ${styles$q.right}` })
1719
1722
  }
1720
1723
  )
1721
1724
  ]
1722
1725
  }
1723
1726
  );
1724
1727
  };
1725
- const styles$n = {
1728
+ const styles$p = {
1726
1729
  "f-time-line": "_f-time-line_1ybe7_1",
1727
1730
  "f-time-line__block": "_f-time-line__block_1ybe7_10",
1728
1731
  "f-time-line__block-circle": "_f-time-line__block-circle_1ybe7_29",
@@ -1736,7 +1739,7 @@ const FTimeline = ({
1736
1739
  id,
1737
1740
  className
1738
1741
  }) => {
1739
- return /* @__PURE__ */ jsx("div", { className: `${styles$n["f-time-line"]} ${className || ""}`, style: st, id, children });
1742
+ return /* @__PURE__ */ jsx("div", { className: `${styles$p["f-time-line"]} ${className || ""}`, style: st, id, children });
1740
1743
  };
1741
1744
  const FTimelineCard = ({
1742
1745
  children,
@@ -1745,32 +1748,14 @@ const FTimelineCard = ({
1745
1748
  id,
1746
1749
  className
1747
1750
  }) => {
1748
- return /* @__PURE__ */ jsxs("div", { className: `${styles$n["f-time-line__block"]} ${className || ""}`, id, children: [
1749
- /* @__PURE__ */ jsx("div", { className: styles$n["f-time-line__block-circle"] }),
1750
- /* @__PURE__ */ jsxs("div", { className: styles$n["f-time-line__block-inner"], style: st, children: [
1751
- title2 && /* @__PURE__ */ jsx("div", { className: styles$n["f-time-line__block-title"], children: title2 }),
1752
- /* @__PURE__ */ jsx("div", { className: styles$n["f-time-line__block-content"], children })
1751
+ return /* @__PURE__ */ jsxs("div", { className: `${styles$p["f-time-line__block"]} ${className || ""}`, id, children: [
1752
+ /* @__PURE__ */ jsx("div", { className: styles$p["f-time-line__block-circle"] }),
1753
+ /* @__PURE__ */ jsxs("div", { className: styles$p["f-time-line__block-inner"], style: st, children: [
1754
+ title2 && /* @__PURE__ */ jsx("div", { className: styles$p["f-time-line__block-title"], children: title2 }),
1755
+ /* @__PURE__ */ jsx("div", { className: styles$p["f-time-line__block-content"], children })
1753
1756
  ] })
1754
1757
  ] });
1755
1758
  };
1756
- const spinner = "_spinner_f7bma_133";
1757
- const active$4 = "_active_f7bma_183";
1758
- const styles$m = {
1759
- "fv-opn-img-full": "_fv-opn-img-full_f7bma_1",
1760
- "fv-opn-img-full-body": "_fv-opn-img-full-body_f7bma_19",
1761
- "close-button": "_close-button_f7bma_33",
1762
- "image-container": "_image-container_f7bma_58",
1763
- "image-wrapper": "_image-wrapper_f7bma_68",
1764
- "full-image": "_full-image_f7bma_80",
1765
- "arrow-left": "_arrow-left_f7bma_89",
1766
- "arrow-right": "_arrow-right_f7bma_90",
1767
- "loading-spinner": "_loading-spinner_f7bma_125",
1768
- spinner,
1769
- "error-message": "_error-message_f7bma_147",
1770
- "progress-indicator": "_progress-indicator_f7bma_158",
1771
- "progress-dot": "_progress-dot_f7bma_172",
1772
- active: active$4
1773
- };
1774
1759
  const FArrowIcon = React.forwardRef(({
1775
1760
  color = "primary",
1776
1761
  size = 30,
@@ -1810,6 +1795,39 @@ const FArrowIcon = React.forwardRef(({
1810
1795
  );
1811
1796
  });
1812
1797
  FArrowIcon.displayName = "FArrowIcon";
1798
+ const overlay$1 = "_overlay_avyqh_1";
1799
+ const entering$1 = "_entering_avyqh_15";
1800
+ const exiting$1 = "_exiting_avyqh_19";
1801
+ const viewport = "_viewport_avyqh_24";
1802
+ const image = "_image_avyqh_33";
1803
+ const zoomed = "_zoomed_avyqh_44";
1804
+ const close$1 = "_close_avyqh_52";
1805
+ const arrow = "_arrow_avyqh_53";
1806
+ const left = "_left_avyqh_95";
1807
+ const right = "_right_avyqh_99";
1808
+ const indicators = "_indicators_avyqh_103";
1809
+ const dot = "_dot_avyqh_112";
1810
+ const active$4 = "_active_avyqh_121";
1811
+ const spinner = "_spinner_avyqh_126";
1812
+ const error$2 = "_error_avyqh_136";
1813
+ const styles$o = {
1814
+ overlay: overlay$1,
1815
+ entering: entering$1,
1816
+ exiting: exiting$1,
1817
+ viewport,
1818
+ image,
1819
+ zoomed,
1820
+ close: close$1,
1821
+ arrow,
1822
+ left,
1823
+ right,
1824
+ indicators,
1825
+ dot,
1826
+ active: active$4,
1827
+ spinner,
1828
+ error: error$2
1829
+ };
1830
+ let openImageViewersCount = 0;
1813
1831
  const FOpenImgFull = ({
1814
1832
  id,
1815
1833
  className,
@@ -1820,151 +1838,297 @@ const FOpenImgFull = ({
1820
1838
  handleClose,
1821
1839
  openAndClose
1822
1840
  }) => {
1841
+ const [isMounted, setIsMounted] = useState(openAndClose);
1842
+ const [isClosing, setIsClosing] = useState(false);
1823
1843
  const [isLoading, setIsLoading] = useState(true);
1824
- const [error2, setError] = useState(false);
1825
- const [touchStart, setTouchStart] = useState(null);
1826
- const [touchEnd, setTouchEnd] = useState(null);
1827
- const [isZoomed, setIsZoomed] = useState(false);
1844
+ const [hasError, setHasError] = useState(false);
1845
+ const [zoom, setZoom] = useState(null);
1846
+ const [pan, setPan] = useState({ x: 0, y: 0 });
1847
+ const pointerStart = useRef(null);
1848
+ const suppressClick = useRef(false);
1849
+ const imageUrl = imagesUrl[selectedImg];
1828
1850
  useEffect(() => {
1829
- setIsLoading(true);
1830
- setError(false);
1831
- setIsZoomed(false);
1832
- const nextImage = new Image();
1833
- nextImage.src = imagesUrl[selectedImg];
1834
- nextImage.onload = () => {
1835
- setIsLoading(false);
1836
- };
1837
- nextImage.onerror = () => {
1838
- setError(true);
1839
- setIsLoading(false);
1840
- };
1841
- }, [selectedImg, imagesUrl]);
1842
- const handleKeyDown = useCallback((e) => {
1843
- if (!openAndClose) return;
1844
- switch (e.key) {
1845
- case "ArrowLeft":
1846
- if (selectedImg > 0) {
1847
- setSelectedImg(selectedImg - 1);
1848
- }
1849
- break;
1850
- case "ArrowRight":
1851
- if (selectedImg < imagesUrl.length - 1) {
1852
- setSelectedImg(selectedImg + 1);
1853
- }
1854
- break;
1855
- case "Escape":
1856
- handleClose == null ? void 0 : handleClose();
1857
- break;
1858
- case "z":
1859
- setIsZoomed((prev) => !prev);
1860
- break;
1851
+ if (openAndClose) {
1852
+ setIsMounted(true);
1853
+ setIsClosing(false);
1854
+ } else if (isMounted) {
1855
+ setIsClosing(true);
1861
1856
  }
1862
- }, [selectedImg, openAndClose, handleClose, setSelectedImg]);
1857
+ }, [openAndClose]);
1863
1858
  useEffect(() => {
1859
+ if (!isClosing) return;
1860
+ const timer = window.setTimeout(() => {
1861
+ setIsMounted(false);
1862
+ setIsClosing(false);
1863
+ }, 300);
1864
+ return () => window.clearTimeout(timer);
1865
+ }, [isClosing]);
1866
+ useEffect(() => {
1867
+ if (!isMounted || isClosing) return;
1868
+ openImageViewersCount += 1;
1869
+ document.body.classList.add("open-img-full");
1870
+ return () => {
1871
+ openImageViewersCount = Math.max(0, openImageViewersCount - 1);
1872
+ if (openImageViewersCount === 0) document.body.classList.remove("open-img-full");
1873
+ };
1874
+ }, [isMounted, isClosing]);
1875
+ useEffect(() => {
1876
+ setIsLoading(true);
1877
+ setHasError(false);
1878
+ setZoom(null);
1879
+ setPan({ x: 0, y: 0 });
1880
+ }, [imageUrl]);
1881
+ const handleKeyDown = useCallback((event) => {
1882
+ if (event.key === "Escape") handleClose == null ? void 0 : handleClose();
1883
+ else if (event.key === "ArrowLeft" && selectedImg > 0) setSelectedImg(selectedImg - 1);
1884
+ else if (event.key === "ArrowRight" && selectedImg < imagesUrl.length - 1) setSelectedImg(selectedImg + 1);
1885
+ }, [handleClose, imagesUrl.length, selectedImg, setSelectedImg]);
1886
+ useEffect(() => {
1887
+ if (!isMounted || isClosing) return;
1864
1888
  window.addEventListener("keydown", handleKeyDown);
1865
1889
  return () => window.removeEventListener("keydown", handleKeyDown);
1866
- }, [handleKeyDown]);
1867
- const handleTouchStart = (e) => {
1868
- setTouchStart(e.touches[0].clientX);
1890
+ }, [handleKeyDown, isClosing, isMounted]);
1891
+ if (!isMounted || !imagesUrl.length || selectedImg < 0 || selectedImg >= imagesUrl.length) return null;
1892
+ const changeImage = (offset) => {
1893
+ const nextIndex = selectedImg + offset;
1894
+ if (nextIndex >= 0 && nextIndex < imagesUrl.length) setSelectedImg(nextIndex);
1869
1895
  };
1870
- const handleTouchMove = (e) => {
1871
- setTouchEnd(e.touches[0].clientX);
1872
- };
1873
- const handleTouchEnd = () => {
1874
- if (!touchStart || !touchEnd) return;
1875
- const distance = touchStart - touchEnd;
1876
- const isLeftSwipe = distance > 50;
1877
- const isRightSwipe = distance < -50;
1878
- if (isLeftSwipe && selectedImg < imagesUrl.length - 1) {
1879
- setSelectedImg(selectedImg + 1);
1880
- } else if (isRightSwipe && selectedImg > 0) {
1881
- setSelectedImg(selectedImg - 1);
1882
- }
1883
- setTouchStart(null);
1884
- setTouchEnd(null);
1885
- };
1886
- const handleImageClick = () => {
1887
- setIsZoomed((prev) => !prev);
1888
- };
1889
- if (!imagesUrl.length || selectedImg < 0 || selectedImg >= imagesUrl.length) {
1890
- return null;
1891
- }
1892
- return /* @__PURE__ */ jsx(
1893
- FDialog,
1894
- {
1895
- openAndClose,
1896
- st,
1897
- className: `${styles$m["fv-opn-img-full"]} ${className || ""}`,
1898
- id,
1899
- children: /* @__PURE__ */ jsxs("div", { className: styles$m["fv-opn-img-full-body"], children: [
1900
- /* @__PURE__ */ jsx("div", { className: styles$m["close-button"], children: handleClose && /* @__PURE__ */ jsx(
1901
- FCloseIcon,
1902
- {
1903
- handleClose: () => {
1904
- handleClose();
1905
- document.body.style.overflow = "auto";
1906
- }
1907
- }
1908
- ) }),
1909
- /* @__PURE__ */ jsxs(
1910
- "div",
1911
- {
1912
- className: styles$m["image-container"],
1913
- onTouchStart: handleTouchStart,
1914
- onTouchMove: handleTouchMove,
1915
- onTouchEnd: handleTouchEnd,
1916
- children: [
1917
- selectedImg > 0 && /* @__PURE__ */ jsx("div", { className: styles$m["arrow-left"], children: /* @__PURE__ */ jsx(
1918
- FArrowIcon,
1919
- {
1920
- direction: "left",
1921
- handleClick: () => setSelectedImg(selectedImg - 1)
1922
- }
1923
- ) }),
1924
- /* @__PURE__ */ jsxs("div", { className: styles$m["image-wrapper"], children: [
1925
- isLoading && /* @__PURE__ */ jsx("div", { className: styles$m["loading-spinner"], children: /* @__PURE__ */ jsx("div", { className: styles$m["spinner"] }) }),
1926
- error2 ? /* @__PURE__ */ jsx("div", { className: styles$m["error-message"], children: "Ошибка загрузки изображения" }) : /* @__PURE__ */ jsx(
1927
- "img",
1928
- {
1929
- src: imagesUrl[selectedImg],
1930
- alt: "Полноэкранное изображение",
1931
- onLoad: () => setIsLoading(false),
1932
- onError: () => {
1933
- setError(true);
1934
- setIsLoading(false);
1935
- },
1936
- className: styles$m["full-image"],
1937
- onClick: handleImageClick,
1938
- style: {
1939
- cursor: "zoom-in",
1940
- transform: isZoomed ? "scale(1.5)" : "scale(1)",
1941
- transition: "transform 0.3s ease"
1896
+ return createPortal(
1897
+ /* @__PURE__ */ jsxs(
1898
+ "div",
1899
+ {
1900
+ id,
1901
+ style: st,
1902
+ className: `${styles$o.overlay} ${isClosing ? styles$o.exiting : styles$o.entering} ${className || ""}`,
1903
+ onMouseDown: (event) => {
1904
+ if (event.target === event.currentTarget) handleClose == null ? void 0 : handleClose();
1905
+ },
1906
+ children: [
1907
+ handleClose && /* @__PURE__ */ jsx("button", { type: "button", className: styles$o.close, onClick: handleClose, "aria-label": "Закрыть просмотр изображений", children: /* @__PURE__ */ jsx(FCloseIcon, { color: "light", size: 24 }) }),
1908
+ selectedImg > 0 && /* @__PURE__ */ jsx("button", { type: "button", className: `${styles$o.arrow} ${styles$o.left}`, onClick: () => changeImage(-1), "aria-label": "Предыдущее изображение", children: /* @__PURE__ */ jsx(FArrowIcon, { direction: "left", color: "light", size: 28 }) }),
1909
+ /* @__PURE__ */ jsxs("div", { className: styles$o.viewport, children: [
1910
+ isLoading && !hasError && /* @__PURE__ */ jsx("span", { className: styles$o.spinner, "aria-label": "Загрузка изображения" }),
1911
+ hasError ? /* @__PURE__ */ jsx("p", { className: styles$o.error, children: "Ошибка загрузки изображения" }) : /* @__PURE__ */ jsx(
1912
+ "img",
1913
+ {
1914
+ src: imageUrl,
1915
+ alt: "Полноэкранное изображение",
1916
+ className: `${styles$o.image} ${zoom ? styles$o.zoomed : ""}`,
1917
+ style: {
1918
+ transform: `translate(${pan.x}px, ${pan.y}px) scale(${(zoom == null ? void 0 : zoom.scale) ?? 1})`,
1919
+ transformOrigin: zoom ? `${zoom.x}% ${zoom.y}%` : "center"
1920
+ },
1921
+ onLoad: () => setIsLoading(false),
1922
+ onError: () => {
1923
+ setHasError(true);
1924
+ setIsLoading(false);
1925
+ },
1926
+ onClick: (event) => {
1927
+ if (suppressClick.current) {
1928
+ suppressClick.current = false;
1929
+ return;
1930
+ }
1931
+ const bounds = event.currentTarget.getBoundingClientRect();
1932
+ setZoom(zoom ? null : {
1933
+ x: (event.clientX - bounds.left) / bounds.width * 100,
1934
+ y: (event.clientY - bounds.top) / bounds.height * 100,
1935
+ scale: 2.5
1936
+ });
1937
+ if (zoom) setPan({ x: 0, y: 0 });
1938
+ },
1939
+ onPointerDown: (event) => {
1940
+ pointerStart.current = { x: event.clientX, y: event.clientY };
1941
+ if (zoom) event.currentTarget.setPointerCapture(event.pointerId);
1942
+ },
1943
+ onPointerUp: (event) => {
1944
+ const start = pointerStart.current;
1945
+ if (!start) return;
1946
+ const dx = event.clientX - start.x;
1947
+ const dy = event.clientY - start.y;
1948
+ pointerStart.current = null;
1949
+ if (zoom) {
1950
+ if (Math.abs(dx) + Math.abs(dy) > 4) {
1951
+ setPan((position) => ({ x: position.x + dx, y: position.y + dy }));
1952
+ suppressClick.current = true;
1953
+ window.setTimeout(() => {
1954
+ suppressClick.current = false;
1955
+ }, 0);
1942
1956
  }
1957
+ } else if (Math.abs(dx) > 50) {
1958
+ suppressClick.current = true;
1959
+ window.setTimeout(() => {
1960
+ suppressClick.current = false;
1961
+ }, 0);
1962
+ changeImage(dx < 0 ? 1 : -1);
1943
1963
  }
1944
- )
1945
- ] }),
1946
- selectedImg < imagesUrl.length - 1 && /* @__PURE__ */ jsx("div", { className: styles$m["arrow-right"], children: /* @__PURE__ */ jsx(
1947
- FArrowIcon,
1948
- {
1949
- direction: "right",
1950
- handleClick: () => setSelectedImg(selectedImg + 1)
1951
- }
1952
- ) })
1953
- ]
1954
- }
1955
- ),
1956
- imagesUrl.length > 1 && /* @__PURE__ */ jsx("div", { className: styles$m["progress-indicator"], children: imagesUrl.map((_, index) => /* @__PURE__ */ jsx(
1957
- "div",
1958
- {
1959
- className: `${styles$m["progress-dot"]} ${index === selectedImg ? styles$m["active"] : ""}`,
1960
- onClick: () => setSelectedImg(index)
1961
- },
1962
- index
1963
- )) })
1964
- ] })
1965
- }
1964
+ },
1965
+ draggable: false
1966
+ },
1967
+ imageUrl
1968
+ )
1969
+ ] }),
1970
+ selectedImg < imagesUrl.length - 1 && /* @__PURE__ */ jsx("button", { type: "button", className: `${styles$o.arrow} ${styles$o.right}`, onClick: () => changeImage(1), "aria-label": "Следующее изображение", children: /* @__PURE__ */ jsx(FArrowIcon, { direction: "right", color: "light", size: 28 }) }),
1971
+ imagesUrl.length > 1 && /* @__PURE__ */ jsx("div", { className: styles$o.indicators, children: imagesUrl.map((_, index) => /* @__PURE__ */ jsx(
1972
+ "button",
1973
+ {
1974
+ type: "button",
1975
+ className: `${styles$o.dot} ${index === selectedImg ? styles$o.active : ""}`,
1976
+ onClick: () => setSelectedImg(index),
1977
+ "aria-label": `Изображение ${index + 1}`,
1978
+ "aria-current": index === selectedImg ? "true" : void 0
1979
+ },
1980
+ index
1981
+ )) })
1982
+ ]
1983
+ }
1984
+ ),
1985
+ document.body
1966
1986
  );
1967
1987
  };
1988
+ const preview$1 = "_preview_1mpqt_1";
1989
+ const styles$n = {
1990
+ preview: preview$1
1991
+ };
1992
+ const FImagePreview = ({ src, alt = "", id, className, st }) => {
1993
+ const [isOpen, setIsOpen] = useState(false);
1994
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
1995
+ /* @__PURE__ */ jsx(
1996
+ "button",
1997
+ {
1998
+ id,
1999
+ type: "button",
2000
+ className: `${styles$n.preview} ${className || ""}`,
2001
+ style: st,
2002
+ onClick: () => setIsOpen(true),
2003
+ "aria-label": alt ? `Открыть изображение: ${alt}` : "Открыть изображение в полном размере",
2004
+ children: /* @__PURE__ */ jsx("img", { src, alt })
2005
+ }
2006
+ ),
2007
+ /* @__PURE__ */ jsx(
2008
+ FOpenImgFull,
2009
+ {
2010
+ imagesUrl: [src],
2011
+ selectedImg: 0,
2012
+ setSelectedImg: () => void 0,
2013
+ openAndClose: isOpen,
2014
+ handleClose: () => setIsOpen(false)
2015
+ }
2016
+ )
2017
+ ] });
2018
+ };
2019
+ const preview = "_preview_1y6bd_1";
2020
+ const play = "_play_1y6bd_24";
2021
+ const overlay = "_overlay_1y6bd_53";
2022
+ const entering = "_entering_1y6bd_66";
2023
+ const exiting = "_exiting_1y6bd_70";
2024
+ const video = "_video_1y6bd_75";
2025
+ const close = "_close_1y6bd_83";
2026
+ const fullscreen = "_fullscreen_1y6bd_84";
2027
+ const styles$m = {
2028
+ preview,
2029
+ play,
2030
+ overlay,
2031
+ entering,
2032
+ exiting,
2033
+ video,
2034
+ close,
2035
+ fullscreen
2036
+ };
2037
+ let openVideoPlayersCount = 0;
2038
+ const FVideoPlayer = ({ src, poster, className, st }) => {
2039
+ const [isOpen, setIsOpen] = useState(false);
2040
+ const [isMounted, setIsMounted] = useState(false);
2041
+ const [isClosing, setIsClosing] = useState(false);
2042
+ const videoRef = useRef(null);
2043
+ useEffect(() => {
2044
+ if (isOpen) {
2045
+ setIsMounted(true);
2046
+ setIsClosing(false);
2047
+ } else if (isMounted) {
2048
+ setIsClosing(true);
2049
+ }
2050
+ }, [isMounted, isOpen]);
2051
+ useEffect(() => {
2052
+ if (!isClosing) return;
2053
+ const timer = window.setTimeout(() => {
2054
+ setIsMounted(false);
2055
+ setIsClosing(false);
2056
+ }, 300);
2057
+ return () => window.clearTimeout(timer);
2058
+ }, [isClosing]);
2059
+ useEffect(() => {
2060
+ if (!isMounted || isClosing) return;
2061
+ openVideoPlayersCount += 1;
2062
+ document.body.classList.add("open-video-player");
2063
+ return () => {
2064
+ openVideoPlayersCount = Math.max(0, openVideoPlayersCount - 1);
2065
+ if (openVideoPlayersCount === 0) document.body.classList.remove("open-video-player");
2066
+ };
2067
+ }, [isMounted, isClosing]);
2068
+ useEffect(() => {
2069
+ if (!isMounted || isClosing) return;
2070
+ const video2 = videoRef.current;
2071
+ if (video2) void video2.play().catch(() => {
2072
+ });
2073
+ }, [isClosing, isMounted, src]);
2074
+ useEffect(() => {
2075
+ if (!isMounted || isClosing) return;
2076
+ const closeOnEscape = (event) => {
2077
+ if (event.key === "Escape" && !document.fullscreenElement) setIsOpen(false);
2078
+ };
2079
+ window.addEventListener("keydown", closeOnEscape);
2080
+ return () => window.removeEventListener("keydown", closeOnEscape);
2081
+ }, [isClosing, isMounted]);
2082
+ const enterFullscreen = () => {
2083
+ const video2 = videoRef.current;
2084
+ if (video2 == null ? void 0 : video2.requestFullscreen) void video2.requestFullscreen().catch(() => {
2085
+ });
2086
+ };
2087
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
2088
+ /* @__PURE__ */ jsxs(
2089
+ "button",
2090
+ {
2091
+ type: "button",
2092
+ className: `${styles$m.preview} ${className || ""}`,
2093
+ style: st,
2094
+ onClick: () => setIsOpen(true),
2095
+ "aria-label": "Открыть видео",
2096
+ children: [
2097
+ /* @__PURE__ */ jsx("video", { src, poster, preload: "metadata", muted: true, playsInline: true }),
2098
+ /* @__PURE__ */ jsx("span", { className: styles$m.play, "aria-hidden": "true" })
2099
+ ]
2100
+ }
2101
+ ),
2102
+ isMounted && createPortal(
2103
+ /* @__PURE__ */ jsxs(
2104
+ "div",
2105
+ {
2106
+ className: `${styles$m.overlay} ${isClosing ? styles$m.exiting : styles$m.entering}`,
2107
+ onMouseDown: (event) => {
2108
+ if (event.target === event.currentTarget) setIsOpen(false);
2109
+ },
2110
+ children: [
2111
+ /* @__PURE__ */ jsx("button", { type: "button", className: styles$m.close, onClick: () => setIsOpen(false), "aria-label": "Закрыть видео", children: /* @__PURE__ */ jsx(FCloseIcon, { color: "light", size: 24 }) }),
2112
+ /* @__PURE__ */ jsx(
2113
+ "video",
2114
+ {
2115
+ ref: videoRef,
2116
+ className: styles$m.video,
2117
+ src,
2118
+ poster,
2119
+ controls: true,
2120
+ autoPlay: true,
2121
+ playsInline: true
2122
+ }
2123
+ ),
2124
+ /* @__PURE__ */ jsx("button", { type: "button", className: styles$m.fullscreen, onClick: enterFullscreen, children: "На весь экран" })
2125
+ ]
2126
+ }
2127
+ ),
2128
+ document.body
2129
+ )
2130
+ ] });
2131
+ };
1968
2132
  const card$2 = "_card_1ytel_1";
1969
2133
  const primary$1 = "_primary_1ytel_69";
1970
2134
  const secondary$1 = "_secondary_1ytel_81";
@@ -2757,7 +2921,7 @@ const FAlert = ({
2757
2921
  }) => {
2758
2922
  const visible2 = useRef();
2759
2923
  const hidden2 = useRef();
2760
- const close = useRef();
2924
+ const close2 = useRef();
2761
2925
  const [randomId] = useState(fGenerateUniqueId());
2762
2926
  let newTime = displayTime;
2763
2927
  useEffect(() => {
@@ -2765,7 +2929,7 @@ const FAlert = ({
2765
2929
  if (!open) {
2766
2930
  const el = document.querySelector(`#f-block-alert-${randomId}`);
2767
2931
  if (el !== null) {
2768
- close.current = setTimeout(() => {
2932
+ close2.current = setTimeout(() => {
2769
2933
  if (onClose) {
2770
2934
  onClose(false);
2771
2935
  }
@@ -2793,7 +2957,7 @@ const FAlert = ({
2793
2957
  el.classList.remove("f-alert-visible");
2794
2958
  el.classList.add("f-alert-hidden");
2795
2959
  }, (newTime - 1) * 1e3);
2796
- close.current = setTimeout(() => {
2960
+ close2.current = setTimeout(() => {
2797
2961
  onClose(false);
2798
2962
  el.classList.remove("f-alert-hidden");
2799
2963
  el.classList.remove("f-alert-visible");
@@ -2946,7 +3110,7 @@ const FAlert = ({
2946
3110
  el.classList.remove("f-alert-hidden");
2947
3111
  clearTimeout(visible2.current);
2948
3112
  clearTimeout(hidden2.current);
2949
- clearTimeout(close.current);
3113
+ clearTimeout(close2.current);
2950
3114
  }
2951
3115
  }
2952
3116
  )
@@ -4344,7 +4508,7 @@ function FTableActions({ children, className, onClick, ...props }) {
4344
4508
  type: "button",
4345
4509
  "aria-label": "Действия",
4346
4510
  ...props,
4347
- className: `${styles$u.more} ${className || ""}`,
4511
+ className: `${styles$w.more} ${className || ""}`,
4348
4512
  "aria-expanded": open,
4349
4513
  "aria-controls": id,
4350
4514
  onClick: (event) => {
@@ -4377,7 +4541,7 @@ function FTableActions({ children, className, onClick, ...props }) {
4377
4541
  ref: menu,
4378
4542
  id,
4379
4543
  ...{ popover: "auto" },
4380
- className: styles$u["row-menu"],
4544
+ className: styles$w["row-menu"],
4381
4545
  onKeyDown: (event) => {
4382
4546
  var _a, _b;
4383
4547
  if (event.key === "Escape") {
@@ -9545,6 +9709,7 @@ export {
9545
9709
  FFullDateField,
9546
9710
  FGrid,
9547
9711
  FGridRow,
9712
+ FImagePreview,
9548
9713
  FInfoCircleIcon,
9549
9714
  FInputFileForm,
9550
9715
  FLibraryProvider,
@@ -9593,6 +9758,7 @@ export {
9593
9758
  FTrashIcon,
9594
9759
  FUnlinkIcon,
9595
9760
  FUploadIcon,
9761
+ FVideoPlayer,
9596
9762
  FWaterErrorBoundaryPage,
9597
9763
  LibraryContext,
9598
9764
  calcDurationMs,