fui-material 2.8.13 → 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,12 +713,12 @@ const FPaper = ({
713
713
  );
714
714
  };
715
715
  const TableControlsContext = createContext({ query: "", sort: null });
716
- const left$1 = "_left_nsv5n_81";
716
+ const left$2 = "_left_nsv5n_81";
717
717
  const center = "_center_nsv5n_84";
718
- const right = "_right_nsv5n_87";
718
+ const right$1 = "_right_nsv5n_87";
719
719
  const justify = "_justify_nsv5n_90";
720
720
  const more = "_more_nsv5n_198";
721
- const styles$u = {
721
+ const styles$w = {
722
722
  "f-table-component": "_f-table-component_nsv5n_1",
723
723
  "f-table-component__table": "_f-table-component__table_nsv5n_14",
724
724
  "f-table-component__table_header": "_f-table-component__table_header_nsv5n_22",
@@ -729,9 +729,9 @@ const styles$u = {
729
729
  "f-table-component__table_row": "_f-table-component__table_row_nsv5n_64",
730
730
  "f-table-component__table_row_no-hover": "_f-table-component__table_row_no-hover_nsv5n_64",
731
731
  "f-table-component__table_footer": "_f-table-component__table_footer_nsv5n_71",
732
- left: left$1,
732
+ left: left$2,
733
733
  center,
734
- right,
734
+ right: right$1,
735
735
  justify,
736
736
  "cell-text": "_cell-text_nsv5n_94",
737
737
  "cell-preview-text": "_cell-preview-text_nsv5n_115",
@@ -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,14 +1087,14 @@ 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",
@@ -1142,13 +1142,13 @@ const FTableHeaderCell = ({
1142
1142
  colSpan: col && col > 1 ? col : void 0,
1143
1143
  ...props,
1144
1144
  "aria-sort": sortable ? direction ?? "none" : props["aria-sort"],
1145
- className: `${styles$u["f-table-component__table_header-cell"]} ${props.className || ""}`,
1145
+ className: `${styles$w["f-table-component__table_header-cell"]} ${props.className || ""}`,
1146
1146
  style,
1147
1147
  children: sortable ? /* @__PURE__ */ jsxs(
1148
1148
  "button",
1149
1149
  {
1150
1150
  type: "button",
1151
- className: styles$u["table-sort"],
1151
+ className: styles$w["table-sort"],
1152
1152
  onClick: () => toggleSort == null ? void 0 : toggleSort(sortKey),
1153
1153
  title: direction === "ascending" ? "По убыванию" : direction === "descending" ? "Исходный порядок" : "По возрастанию",
1154
1154
  children: [
@@ -1212,7 +1212,7 @@ function FTableTextTooltip({ text, enabled, children }) {
1212
1212
  "span",
1213
1213
  {
1214
1214
  ref: anchor,
1215
- className: styles$u["cell-tooltip-anchor"],
1215
+ className: styles$w["cell-tooltip-anchor"],
1216
1216
  onMouseEnter: show,
1217
1217
  onMouseLeave: hide2,
1218
1218
  onFocus: show,
@@ -1225,7 +1225,7 @@ function FTableTextTooltip({ text, enabled, children }) {
1225
1225
  ref: panel2,
1226
1226
  id,
1227
1227
  role: "tooltip",
1228
- className: styles$u["cell-tooltip"],
1228
+ className: styles$w["cell-tooltip"],
1229
1229
  style: position,
1230
1230
  onMouseEnter: show,
1231
1231
  onMouseLeave: hide2,
@@ -1273,20 +1273,20 @@ const FTableDataCell = ({
1273
1273
  rowSpan: row && row > 1 ? row : void 0,
1274
1274
  colSpan: col && col > 1 ? col : void 0,
1275
1275
  ...props,
1276
- 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(),
1277
1277
  style,
1278
1278
  children: collapsible ? /* @__PURE__ */ jsx(FTableTextTooltip, { text, enabled: !expanded, children: /* @__PURE__ */ jsxs(
1279
1279
  "button",
1280
1280
  {
1281
1281
  type: "button",
1282
- className: styles$u["cell-text"],
1282
+ className: styles$w["cell-text"],
1283
1283
  "aria-expanded": expanded,
1284
1284
  "aria-controls": textId,
1285
1285
  "data-expanded": expanded,
1286
1286
  onClick: () => setExpanded((value) => !value),
1287
1287
  children: [
1288
- /* @__PURE__ */ jsx("span", { className: styles$u["cell-preview"], "aria-hidden": "true", children: /* @__PURE__ */ jsx("span", { className: styles$u["cell-preview-text"], children: text }) }),
1289
- /* @__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 }) })
1290
1290
  ]
1291
1291
  }
1292
1292
  ) }) : children
@@ -1303,19 +1303,19 @@ const FTableFooter = ({
1303
1303
  {
1304
1304
  style: st,
1305
1305
  ...props,
1306
- className: `${styles$u["f-table-component__table_footer"]} ${props.className || ""}`,
1306
+ className: `${styles$w["f-table-component__table_footer"]} ${props.className || ""}`,
1307
1307
  children
1308
1308
  }
1309
1309
  );
1310
1310
  };
1311
- const entering = "_entering_g7izy_19";
1312
- const exiting = "_exiting_g7izy_25";
1311
+ const entering$2 = "_entering_g7izy_19";
1312
+ const exiting$2 = "_exiting_g7izy_25";
1313
1313
  const hide = "_hide_g7izy_50";
1314
- const styles$t = {
1314
+ const styles$v = {
1315
1315
  "f-dialog": "_f-dialog_g7izy_1",
1316
- entering,
1316
+ entering: entering$2,
1317
1317
  "f-dialog__content": "_f-dialog__content_g7izy_22",
1318
- exiting,
1318
+ exiting: exiting$2,
1319
1319
  hide,
1320
1320
  "f-dialog__header": "_f-dialog__header_g7izy_61",
1321
1321
  "f-dialog__header_title": "_f-dialog__header_title_g7izy_73",
@@ -1391,14 +1391,14 @@ const FDialog = ({
1391
1391
  adaptive: "fit-content"
1392
1392
  };
1393
1393
  const contentWidth = widthStyles[width];
1394
- const animationClass = isClosing ? styles$t["exiting"] : styles$t["entering"];
1394
+ const animationClass = isClosing ? styles$v["exiting"] : styles$v["entering"];
1395
1395
  return ReactDOM.createPortal(
1396
1396
  /* @__PURE__ */ jsx(
1397
1397
  "div",
1398
1398
  {
1399
1399
  id,
1400
1400
  style: st,
1401
- className: `${styles$t["f-dialog"]} ${animationClass} ${className || ""}`,
1401
+ className: `${styles$v["f-dialog"]} ${animationClass} ${className || ""}`,
1402
1402
  onMouseDown: (e) => {
1403
1403
  if (e.target === e.currentTarget) {
1404
1404
  closeButtonBackPage == null ? void 0 : closeButtonBackPage(false);
@@ -1408,7 +1408,7 @@ const FDialog = ({
1408
1408
  children: /* @__PURE__ */ jsx(
1409
1409
  "div",
1410
1410
  {
1411
- className: `${styles$t["f-dialog__content"]} ${hide2 ? styles$t["hide"] : ""}`,
1411
+ className: `${styles$v["f-dialog__content"]} ${hide2 ? styles$v["hide"] : ""}`,
1412
1412
  style: {
1413
1413
  width: contentWidth
1414
1414
  },
@@ -1449,13 +1449,13 @@ const FCloseIcon = React.forwardRef(({
1449
1449
  });
1450
1450
  FCloseIcon.displayName = "FCloseIcon";
1451
1451
  const FDialogHeader = ({ title: title2, handleClose }) => {
1452
- return /* @__PURE__ */ jsxs("div", { className: styles$t["f-dialog__header"], children: [
1453
- /* @__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 }),
1454
1454
  handleClose && /* @__PURE__ */ jsx(
1455
1455
  "button",
1456
1456
  {
1457
1457
  type: "button",
1458
- className: styles$t["f-dialog__header_close"],
1458
+ className: styles$v["f-dialog__header_close"],
1459
1459
  onClick: handleClose,
1460
1460
  "aria-label": "Закрыть диалог",
1461
1461
  children: /* @__PURE__ */ jsx(
@@ -1474,7 +1474,7 @@ const FDialogBody = ({ st, children, scroll = true }) => {
1474
1474
  ...scroll ? { overflowY: "auto" } : {},
1475
1475
  ...st
1476
1476
  };
1477
- 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 });
1478
1478
  };
1479
1479
  const FDialogFooter = ({ children, className, st, id }) => {
1480
1480
  return /* @__PURE__ */ jsx(
@@ -1482,7 +1482,7 @@ const FDialogFooter = ({ children, className, st, id }) => {
1482
1482
  {
1483
1483
  id,
1484
1484
  style: st,
1485
- className: `${styles$t["f-dialog__footer"]} ${className || ""}`,
1485
+ className: `${styles$v["f-dialog__footer"]} ${className || ""}`,
1486
1486
  children
1487
1487
  }
1488
1488
  );
@@ -1497,7 +1497,7 @@ const info$4 = "_info_1glrn_62";
1497
1497
  const light$2 = "_light_1glrn_66";
1498
1498
  const dark$2 = "_dark_1glrn_70";
1499
1499
  const link$1 = "_link_1glrn_74";
1500
- const styles$s = {
1500
+ const styles$u = {
1501
1501
  "authorization-spinner": "_authorization-spinner_1glrn_1",
1502
1502
  "spinner-item": "_spinner-item_1glrn_7",
1503
1503
  loader,
@@ -1515,14 +1515,14 @@ const FProgress = ({ st, color = "primary", id, className }) => {
1515
1515
  return /* @__PURE__ */ jsx(
1516
1516
  "div",
1517
1517
  {
1518
- className: `${styles$s["authorization-spinner"]} ${styles$s.visible} ${className || ""}`,
1518
+ className: `${styles$u["authorization-spinner"]} ${styles$u.visible} ${className || ""}`,
1519
1519
  id,
1520
1520
  style: st,
1521
- 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]}` })
1522
1522
  }
1523
1523
  );
1524
1524
  };
1525
- const styles$r = {
1525
+ const styles$t = {
1526
1526
  "f-preloader": "_f-preloader_17f9x_1",
1527
1527
  "active-preloader": "_active-preloader_17f9x_10"
1528
1528
  };
@@ -1549,13 +1549,13 @@ const FPreloader = ({
1549
1549
  return /* @__PURE__ */ jsx(
1550
1550
  "div",
1551
1551
  {
1552
- className: `${styles$r["f-preloader"]} ${open ? styles$r["active-preloader"] : ""}`,
1552
+ className: `${styles$t["f-preloader"]} ${open ? styles$t["active-preloader"] : ""}`,
1553
1553
  style: mergedStyle,
1554
1554
  children
1555
1555
  }
1556
1556
  );
1557
1557
  };
1558
- const styles$q = {
1558
+ const styles$s = {
1559
1559
  "f-checkbox": "_f-checkbox_1hxs0_1"
1560
1560
  };
1561
1561
  const FCheckbox = forwardRef(
@@ -1568,7 +1568,7 @@ const FCheckbox = forwardRef(
1568
1568
  return /* @__PURE__ */ jsx(
1569
1569
  "div",
1570
1570
  {
1571
- className: `${styles$q["f-checkbox"]} ${className || ""}`,
1571
+ className: `${styles$s["f-checkbox"]} ${className || ""}`,
1572
1572
  style: st,
1573
1573
  children: /* @__PURE__ */ jsxs("label", { children: [
1574
1574
  /* @__PURE__ */ jsx("input", { ref, type: "checkbox", ...props }),
@@ -1578,7 +1578,7 @@ const FCheckbox = forwardRef(
1578
1578
  );
1579
1579
  }
1580
1580
  );
1581
- const styles$p = {
1581
+ const styles$r = {
1582
1582
  "f-radio": "_f-radio_1oidm_1"
1583
1583
  };
1584
1584
  const FRadioButton = forwardRef(
@@ -1591,7 +1591,7 @@ const FRadioButton = forwardRef(
1591
1591
  return /* @__PURE__ */ jsx(
1592
1592
  "div",
1593
1593
  {
1594
- className: `${styles$p["f-radio"]} ${className || ""}`,
1594
+ className: `${styles$r["f-radio"]} ${className || ""}`,
1595
1595
  style: st,
1596
1596
  children: /* @__PURE__ */ jsxs("label", { children: [
1597
1597
  /* @__PURE__ */ jsx("input", { ref, type: "radio", ...props }),
@@ -1651,16 +1651,16 @@ const usePagination = ({
1651
1651
  const dots = "_dots_uiqea_29";
1652
1652
  const selected$1 = "_selected_uiqea_33";
1653
1653
  const disabled$3 = "_disabled_uiqea_37";
1654
- const arrow = "_arrow_uiqea_43";
1655
- const left = "_left_uiqea_56";
1656
- const styles$o = {
1654
+ const arrow$1 = "_arrow_uiqea_43";
1655
+ const left$1 = "_left_uiqea_56";
1656
+ const styles$q = {
1657
1657
  "pagination-container": "_pagination-container_uiqea_1",
1658
1658
  "pagination-item": "_pagination-item_uiqea_9",
1659
1659
  dots,
1660
1660
  selected: selected$1,
1661
1661
  disabled: disabled$3,
1662
- arrow,
1663
- left
1662
+ arrow: arrow$1,
1663
+ left: left$1
1664
1664
  };
1665
1665
  const FPagination = ({
1666
1666
  currentPage,
@@ -1687,26 +1687,26 @@ const FPagination = ({
1687
1687
  return /* @__PURE__ */ jsxs(
1688
1688
  "ul",
1689
1689
  {
1690
- className: `${styles$o["pagination-container"]} ${className || ""}`,
1690
+ className: `${styles$q["pagination-container"]} ${className || ""}`,
1691
1691
  style: st,
1692
1692
  id,
1693
1693
  children: [
1694
1694
  /* @__PURE__ */ jsx(
1695
1695
  "li",
1696
1696
  {
1697
- className: `${styles$o["pagination-item"]} ${currentPage === 1 ? styles$o.disabled : ""}`,
1697
+ className: `${styles$q["pagination-item"]} ${currentPage === 1 ? styles$q.disabled : ""}`,
1698
1698
  onClick: onPrevious,
1699
- children: /* @__PURE__ */ jsx("div", { className: `${styles$o.arrow} ${styles$o.left}` })
1699
+ children: /* @__PURE__ */ jsx("div", { className: `${styles$q.arrow} ${styles$q.left}` })
1700
1700
  }
1701
1701
  ),
1702
1702
  paginationRange.map((pageNumber, index) => {
1703
1703
  if (pageNumber === DOTS) {
1704
- 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);
1705
1705
  }
1706
1706
  return /* @__PURE__ */ jsx(
1707
1707
  "li",
1708
1708
  {
1709
- className: `${styles$o["pagination-item"]} ${pageNumber === currentPage ? styles$o.selected : ""}`,
1709
+ className: `${styles$q["pagination-item"]} ${pageNumber === currentPage ? styles$q.selected : ""}`,
1710
1710
  onClick: () => onPageChange(pageNumber),
1711
1711
  children: pageNumber
1712
1712
  },
@@ -1716,16 +1716,16 @@ const FPagination = ({
1716
1716
  /* @__PURE__ */ jsx(
1717
1717
  "li",
1718
1718
  {
1719
- className: `${styles$o["pagination-item"]} ${currentPage === lastPage ? styles$o.disabled : ""}`,
1719
+ className: `${styles$q["pagination-item"]} ${currentPage === lastPage ? styles$q.disabled : ""}`,
1720
1720
  onClick: onNext,
1721
- children: /* @__PURE__ */ jsx("div", { className: `${styles$o.arrow} ${styles$o.right}` })
1721
+ children: /* @__PURE__ */ jsx("div", { className: `${styles$q.arrow} ${styles$q.right}` })
1722
1722
  }
1723
1723
  )
1724
1724
  ]
1725
1725
  }
1726
1726
  );
1727
1727
  };
1728
- const styles$n = {
1728
+ const styles$p = {
1729
1729
  "f-time-line": "_f-time-line_1ybe7_1",
1730
1730
  "f-time-line__block": "_f-time-line__block_1ybe7_10",
1731
1731
  "f-time-line__block-circle": "_f-time-line__block-circle_1ybe7_29",
@@ -1739,7 +1739,7 @@ const FTimeline = ({
1739
1739
  id,
1740
1740
  className
1741
1741
  }) => {
1742
- 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 });
1743
1743
  };
1744
1744
  const FTimelineCard = ({
1745
1745
  children,
@@ -1748,32 +1748,14 @@ const FTimelineCard = ({
1748
1748
  id,
1749
1749
  className
1750
1750
  }) => {
1751
- return /* @__PURE__ */ jsxs("div", { className: `${styles$n["f-time-line__block"]} ${className || ""}`, id, children: [
1752
- /* @__PURE__ */ jsx("div", { className: styles$n["f-time-line__block-circle"] }),
1753
- /* @__PURE__ */ jsxs("div", { className: styles$n["f-time-line__block-inner"], style: st, children: [
1754
- title2 && /* @__PURE__ */ jsx("div", { className: styles$n["f-time-line__block-title"], children: title2 }),
1755
- /* @__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 })
1756
1756
  ] })
1757
1757
  ] });
1758
1758
  };
1759
- const spinner = "_spinner_f7bma_133";
1760
- const active$4 = "_active_f7bma_183";
1761
- const styles$m = {
1762
- "fv-opn-img-full": "_fv-opn-img-full_f7bma_1",
1763
- "fv-opn-img-full-body": "_fv-opn-img-full-body_f7bma_19",
1764
- "close-button": "_close-button_f7bma_33",
1765
- "image-container": "_image-container_f7bma_58",
1766
- "image-wrapper": "_image-wrapper_f7bma_68",
1767
- "full-image": "_full-image_f7bma_80",
1768
- "arrow-left": "_arrow-left_f7bma_89",
1769
- "arrow-right": "_arrow-right_f7bma_90",
1770
- "loading-spinner": "_loading-spinner_f7bma_125",
1771
- spinner,
1772
- "error-message": "_error-message_f7bma_147",
1773
- "progress-indicator": "_progress-indicator_f7bma_158",
1774
- "progress-dot": "_progress-dot_f7bma_172",
1775
- active: active$4
1776
- };
1777
1759
  const FArrowIcon = React.forwardRef(({
1778
1760
  color = "primary",
1779
1761
  size = 30,
@@ -1813,6 +1795,39 @@ const FArrowIcon = React.forwardRef(({
1813
1795
  );
1814
1796
  });
1815
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;
1816
1831
  const FOpenImgFull = ({
1817
1832
  id,
1818
1833
  className,
@@ -1823,151 +1838,297 @@ const FOpenImgFull = ({
1823
1838
  handleClose,
1824
1839
  openAndClose
1825
1840
  }) => {
1841
+ const [isMounted, setIsMounted] = useState(openAndClose);
1842
+ const [isClosing, setIsClosing] = useState(false);
1826
1843
  const [isLoading, setIsLoading] = useState(true);
1827
- const [error2, setError] = useState(false);
1828
- const [touchStart, setTouchStart] = useState(null);
1829
- const [touchEnd, setTouchEnd] = useState(null);
1830
- 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];
1831
1850
  useEffect(() => {
1832
- setIsLoading(true);
1833
- setError(false);
1834
- setIsZoomed(false);
1835
- const nextImage = new Image();
1836
- nextImage.src = imagesUrl[selectedImg];
1837
- nextImage.onload = () => {
1838
- setIsLoading(false);
1839
- };
1840
- nextImage.onerror = () => {
1841
- setError(true);
1842
- setIsLoading(false);
1843
- };
1844
- }, [selectedImg, imagesUrl]);
1845
- const handleKeyDown = useCallback((e) => {
1846
- if (!openAndClose) return;
1847
- switch (e.key) {
1848
- case "ArrowLeft":
1849
- if (selectedImg > 0) {
1850
- setSelectedImg(selectedImg - 1);
1851
- }
1852
- break;
1853
- case "ArrowRight":
1854
- if (selectedImg < imagesUrl.length - 1) {
1855
- setSelectedImg(selectedImg + 1);
1856
- }
1857
- break;
1858
- case "Escape":
1859
- handleClose == null ? void 0 : handleClose();
1860
- break;
1861
- case "z":
1862
- setIsZoomed((prev) => !prev);
1863
- break;
1851
+ if (openAndClose) {
1852
+ setIsMounted(true);
1853
+ setIsClosing(false);
1854
+ } else if (isMounted) {
1855
+ setIsClosing(true);
1864
1856
  }
1865
- }, [selectedImg, openAndClose, handleClose, setSelectedImg]);
1857
+ }, [openAndClose]);
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]);
1866
1886
  useEffect(() => {
1887
+ if (!isMounted || isClosing) return;
1867
1888
  window.addEventListener("keydown", handleKeyDown);
1868
1889
  return () => window.removeEventListener("keydown", handleKeyDown);
1869
- }, [handleKeyDown]);
1870
- const handleTouchStart = (e) => {
1871
- setTouchStart(e.touches[0].clientX);
1872
- };
1873
- const handleTouchMove = (e) => {
1874
- setTouchEnd(e.touches[0].clientX);
1875
- };
1876
- const handleTouchEnd = () => {
1877
- if (!touchStart || !touchEnd) return;
1878
- const distance = touchStart - touchEnd;
1879
- const isLeftSwipe = distance > 50;
1880
- const isRightSwipe = distance < -50;
1881
- if (isLeftSwipe && selectedImg < imagesUrl.length - 1) {
1882
- setSelectedImg(selectedImg + 1);
1883
- } else if (isRightSwipe && selectedImg > 0) {
1884
- setSelectedImg(selectedImg - 1);
1885
- }
1886
- setTouchStart(null);
1887
- setTouchEnd(null);
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);
1888
1895
  };
1889
- const handleImageClick = () => {
1890
- setIsZoomed((prev) => !prev);
1891
- };
1892
- if (!imagesUrl.length || selectedImg < 0 || selectedImg >= imagesUrl.length) {
1893
- return null;
1894
- }
1895
- return /* @__PURE__ */ jsx(
1896
- FDialog,
1897
- {
1898
- openAndClose,
1899
- st,
1900
- className: `${styles$m["fv-opn-img-full"]} ${className || ""}`,
1901
- id,
1902
- children: /* @__PURE__ */ jsxs("div", { className: styles$m["fv-opn-img-full-body"], children: [
1903
- /* @__PURE__ */ jsx("div", { className: styles$m["close-button"], children: handleClose && /* @__PURE__ */ jsx(
1904
- FCloseIcon,
1905
- {
1906
- handleClose: () => {
1907
- handleClose();
1908
- document.body.style.overflow = "auto";
1909
- }
1910
- }
1911
- ) }),
1912
- /* @__PURE__ */ jsxs(
1913
- "div",
1914
- {
1915
- className: styles$m["image-container"],
1916
- onTouchStart: handleTouchStart,
1917
- onTouchMove: handleTouchMove,
1918
- onTouchEnd: handleTouchEnd,
1919
- children: [
1920
- selectedImg > 0 && /* @__PURE__ */ jsx("div", { className: styles$m["arrow-left"], children: /* @__PURE__ */ jsx(
1921
- FArrowIcon,
1922
- {
1923
- direction: "left",
1924
- handleClick: () => setSelectedImg(selectedImg - 1)
1925
- }
1926
- ) }),
1927
- /* @__PURE__ */ jsxs("div", { className: styles$m["image-wrapper"], children: [
1928
- isLoading && /* @__PURE__ */ jsx("div", { className: styles$m["loading-spinner"], children: /* @__PURE__ */ jsx("div", { className: styles$m["spinner"] }) }),
1929
- error2 ? /* @__PURE__ */ jsx("div", { className: styles$m["error-message"], children: "Ошибка загрузки изображения" }) : /* @__PURE__ */ jsx(
1930
- "img",
1931
- {
1932
- src: imagesUrl[selectedImg],
1933
- alt: "Полноэкранное изображение",
1934
- onLoad: () => setIsLoading(false),
1935
- onError: () => {
1936
- setError(true);
1937
- setIsLoading(false);
1938
- },
1939
- className: styles$m["full-image"],
1940
- onClick: handleImageClick,
1941
- style: {
1942
- cursor: "zoom-in",
1943
- transform: isZoomed ? "scale(1.5)" : "scale(1)",
1944
- 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);
1945
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);
1946
1963
  }
1947
- )
1948
- ] }),
1949
- selectedImg < imagesUrl.length - 1 && /* @__PURE__ */ jsx("div", { className: styles$m["arrow-right"], children: /* @__PURE__ */ jsx(
1950
- FArrowIcon,
1951
- {
1952
- direction: "right",
1953
- handleClick: () => setSelectedImg(selectedImg + 1)
1954
- }
1955
- ) })
1956
- ]
1957
- }
1958
- ),
1959
- imagesUrl.length > 1 && /* @__PURE__ */ jsx("div", { className: styles$m["progress-indicator"], children: imagesUrl.map((_, index) => /* @__PURE__ */ jsx(
1960
- "div",
1961
- {
1962
- className: `${styles$m["progress-dot"]} ${index === selectedImg ? styles$m["active"] : ""}`,
1963
- onClick: () => setSelectedImg(index)
1964
- },
1965
- index
1966
- )) })
1967
- ] })
1968
- }
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
1969
1986
  );
1970
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
+ };
1971
2132
  const card$2 = "_card_1ytel_1";
1972
2133
  const primary$1 = "_primary_1ytel_69";
1973
2134
  const secondary$1 = "_secondary_1ytel_81";
@@ -2760,7 +2921,7 @@ const FAlert = ({
2760
2921
  }) => {
2761
2922
  const visible2 = useRef();
2762
2923
  const hidden2 = useRef();
2763
- const close = useRef();
2924
+ const close2 = useRef();
2764
2925
  const [randomId] = useState(fGenerateUniqueId());
2765
2926
  let newTime = displayTime;
2766
2927
  useEffect(() => {
@@ -2768,7 +2929,7 @@ const FAlert = ({
2768
2929
  if (!open) {
2769
2930
  const el = document.querySelector(`#f-block-alert-${randomId}`);
2770
2931
  if (el !== null) {
2771
- close.current = setTimeout(() => {
2932
+ close2.current = setTimeout(() => {
2772
2933
  if (onClose) {
2773
2934
  onClose(false);
2774
2935
  }
@@ -2796,7 +2957,7 @@ const FAlert = ({
2796
2957
  el.classList.remove("f-alert-visible");
2797
2958
  el.classList.add("f-alert-hidden");
2798
2959
  }, (newTime - 1) * 1e3);
2799
- close.current = setTimeout(() => {
2960
+ close2.current = setTimeout(() => {
2800
2961
  onClose(false);
2801
2962
  el.classList.remove("f-alert-hidden");
2802
2963
  el.classList.remove("f-alert-visible");
@@ -2949,7 +3110,7 @@ const FAlert = ({
2949
3110
  el.classList.remove("f-alert-hidden");
2950
3111
  clearTimeout(visible2.current);
2951
3112
  clearTimeout(hidden2.current);
2952
- clearTimeout(close.current);
3113
+ clearTimeout(close2.current);
2953
3114
  }
2954
3115
  }
2955
3116
  )
@@ -4347,7 +4508,7 @@ function FTableActions({ children, className, onClick, ...props }) {
4347
4508
  type: "button",
4348
4509
  "aria-label": "Действия",
4349
4510
  ...props,
4350
- className: `${styles$u.more} ${className || ""}`,
4511
+ className: `${styles$w.more} ${className || ""}`,
4351
4512
  "aria-expanded": open,
4352
4513
  "aria-controls": id,
4353
4514
  onClick: (event) => {
@@ -4380,7 +4541,7 @@ function FTableActions({ children, className, onClick, ...props }) {
4380
4541
  ref: menu,
4381
4542
  id,
4382
4543
  ...{ popover: "auto" },
4383
- className: styles$u["row-menu"],
4544
+ className: styles$w["row-menu"],
4384
4545
  onKeyDown: (event) => {
4385
4546
  var _a, _b;
4386
4547
  if (event.key === "Escape") {
@@ -9548,6 +9709,7 @@ export {
9548
9709
  FFullDateField,
9549
9710
  FGrid,
9550
9711
  FGridRow,
9712
+ FImagePreview,
9551
9713
  FInfoCircleIcon,
9552
9714
  FInputFileForm,
9553
9715
  FLibraryProvider,
@@ -9596,6 +9758,7 @@ export {
9596
9758
  FTrashIcon,
9597
9759
  FUnlinkIcon,
9598
9760
  FUploadIcon,
9761
+ FVideoPlayer,
9599
9762
  FWaterErrorBoundaryPage,
9600
9763
  LibraryContext,
9601
9764
  calcDurationMs,