docs-combiner 0.1.17 → 0.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/renderer.js CHANGED
@@ -2803,6 +2803,29 @@ __webpack_require__.r(__webpack_exports__);
2803
2803
 
2804
2804
  /***/ }),
2805
2805
 
2806
+ /***/ "./node_modules/@mui/icons-material/esm/Backup.js":
2807
+ /*!********************************************************!*\
2808
+ !*** ./node_modules/@mui/icons-material/esm/Backup.js ***!
2809
+ \********************************************************/
2810
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2811
+
2812
+ "use strict";
2813
+ __webpack_require__.r(__webpack_exports__);
2814
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2815
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2816
+ /* harmony export */ });
2817
+ /* harmony import */ var _utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/createSvgIcon.js */ "./node_modules/@mui/material/esm/utils/createSvgIcon.js");
2818
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
2819
+ "use client";
2820
+
2821
+
2822
+
2823
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ((0,_utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_0__["default"])(/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__.jsx)("path", {
2824
+ d: "M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96M14 13v4h-4v-4H7l5-5 5 5z"
2825
+ }), 'Backup'));
2826
+
2827
+ /***/ }),
2828
+
2806
2829
  /***/ "./node_modules/@mui/icons-material/esm/Brightness4.js":
2807
2830
  /*!*************************************************************!*\
2808
2831
  !*** ./node_modules/@mui/icons-material/esm/Brightness4.js ***!
@@ -12363,6 +12386,162 @@ const formControlLabelClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IM
12363
12386
 
12364
12387
  /***/ }),
12365
12388
 
12389
+ /***/ "./node_modules/@mui/material/esm/FormGroup/FormGroup.js":
12390
+ /*!***************************************************************!*\
12391
+ !*** ./node_modules/@mui/material/esm/FormGroup/FormGroup.js ***!
12392
+ \***************************************************************/
12393
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
12394
+
12395
+ "use strict";
12396
+ __webpack_require__.r(__webpack_exports__);
12397
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12398
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
12399
+ /* harmony export */ });
12400
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
12401
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
12402
+ /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.mjs");
12403
+ /* harmony import */ var _mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/utils/composeClasses */ "./node_modules/@mui/utils/esm/composeClasses/composeClasses.js");
12404
+ /* harmony import */ var _zero_styled_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../zero-styled/index.js */ "./node_modules/@mui/material/esm/styles/styled.js");
12405
+ /* harmony import */ var _DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../DefaultPropsProvider/index.js */ "./node_modules/@mui/material/esm/DefaultPropsProvider/DefaultPropsProvider.js");
12406
+ /* harmony import */ var _formGroupClasses_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./formGroupClasses.js */ "./node_modules/@mui/material/esm/FormGroup/formGroupClasses.js");
12407
+ /* harmony import */ var _FormControl_useFormControl_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl.js */ "./node_modules/@mui/material/esm/FormControl/useFormControl.js");
12408
+ /* harmony import */ var _FormControl_formControlState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../FormControl/formControlState.js */ "./node_modules/@mui/material/esm/FormControl/formControlState.js");
12409
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
12410
+ 'use client';
12411
+
12412
+
12413
+
12414
+
12415
+
12416
+
12417
+
12418
+
12419
+
12420
+
12421
+
12422
+ const useUtilityClasses = ownerState => {
12423
+ const {
12424
+ classes,
12425
+ row,
12426
+ error
12427
+ } = ownerState;
12428
+ const slots = {
12429
+ root: ['root', row && 'row', error && 'error']
12430
+ };
12431
+ return (0,_mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_3__["default"])(slots, _formGroupClasses_js__WEBPACK_IMPORTED_MODULE_6__.getFormGroupUtilityClass, classes);
12432
+ };
12433
+ const FormGroupRoot = (0,_zero_styled_index_js__WEBPACK_IMPORTED_MODULE_4__["default"])('div', {
12434
+ name: 'MuiFormGroup',
12435
+ slot: 'Root',
12436
+ overridesResolver: (props, styles) => {
12437
+ const {
12438
+ ownerState
12439
+ } = props;
12440
+ return [styles.root, ownerState.row && styles.row];
12441
+ }
12442
+ })({
12443
+ display: 'flex',
12444
+ flexDirection: 'column',
12445
+ flexWrap: 'wrap',
12446
+ variants: [{
12447
+ props: {
12448
+ row: true
12449
+ },
12450
+ style: {
12451
+ flexDirection: 'row'
12452
+ }
12453
+ }]
12454
+ });
12455
+
12456
+ /**
12457
+ * `FormGroup` wraps controls such as `Checkbox` and `Switch`.
12458
+ * It provides compact row layout.
12459
+ * For the `Radio`, you should be using the `RadioGroup` component instead of this one.
12460
+ */
12461
+ const FormGroup = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function FormGroup(inProps, ref) {
12462
+ const props = (0,_DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_5__.useDefaultProps)({
12463
+ props: inProps,
12464
+ name: 'MuiFormGroup'
12465
+ });
12466
+ const {
12467
+ className,
12468
+ row = false,
12469
+ ...other
12470
+ } = props;
12471
+ const muiFormControl = (0,_FormControl_useFormControl_js__WEBPACK_IMPORTED_MODULE_7__["default"])();
12472
+ const fcs = (0,_FormControl_formControlState_js__WEBPACK_IMPORTED_MODULE_8__["default"])({
12473
+ props,
12474
+ muiFormControl,
12475
+ states: ['error']
12476
+ });
12477
+ const ownerState = {
12478
+ ...props,
12479
+ row,
12480
+ error: fcs.error
12481
+ };
12482
+ const classes = useUtilityClasses(ownerState);
12483
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_9__.jsx)(FormGroupRoot, {
12484
+ className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(classes.root, className),
12485
+ ownerState: ownerState,
12486
+ ref: ref,
12487
+ ...other
12488
+ });
12489
+ });
12490
+ true ? FormGroup.propTypes /* remove-proptypes */ = {
12491
+ // ┌────────────────────────────── Warning ──────────────────────────────┐
12492
+ // │ These PropTypes are generated from the TypeScript type definitions. │
12493
+ // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
12494
+ // └─────────────────────────────────────────────────────────────────────┘
12495
+ /**
12496
+ * The content of the component.
12497
+ */
12498
+ children: prop_types__WEBPACK_IMPORTED_MODULE_1__.node,
12499
+ /**
12500
+ * Override or extend the styles applied to the component.
12501
+ */
12502
+ classes: prop_types__WEBPACK_IMPORTED_MODULE_1__.object,
12503
+ /**
12504
+ * @ignore
12505
+ */
12506
+ className: prop_types__WEBPACK_IMPORTED_MODULE_1__.string,
12507
+ /**
12508
+ * Display group of elements in a compact row.
12509
+ * @default false
12510
+ */
12511
+ row: prop_types__WEBPACK_IMPORTED_MODULE_1__.bool,
12512
+ /**
12513
+ * The system prop that allows defining system overrides as well as additional CSS styles.
12514
+ */
12515
+ sx: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.func, prop_types__WEBPACK_IMPORTED_MODULE_1__.object, prop_types__WEBPACK_IMPORTED_MODULE_1__.bool])), prop_types__WEBPACK_IMPORTED_MODULE_1__.func, prop_types__WEBPACK_IMPORTED_MODULE_1__.object])
12516
+ } : 0;
12517
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (FormGroup);
12518
+
12519
+ /***/ }),
12520
+
12521
+ /***/ "./node_modules/@mui/material/esm/FormGroup/formGroupClasses.js":
12522
+ /*!**********************************************************************!*\
12523
+ !*** ./node_modules/@mui/material/esm/FormGroup/formGroupClasses.js ***!
12524
+ \**********************************************************************/
12525
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
12526
+
12527
+ "use strict";
12528
+ __webpack_require__.r(__webpack_exports__);
12529
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
12530
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
12531
+ /* harmony export */ getFormGroupUtilityClass: () => (/* binding */ getFormGroupUtilityClass)
12532
+ /* harmony export */ });
12533
+ /* harmony import */ var _mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mui/utils/generateUtilityClasses */ "./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js");
12534
+ /* harmony import */ var _mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils/generateUtilityClass */ "./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js");
12535
+
12536
+
12537
+ function getFormGroupUtilityClass(slot) {
12538
+ return (0,_mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__["default"])('MuiFormGroup', slot);
12539
+ }
12540
+ const formGroupClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__["default"])('MuiFormGroup', ['root', 'row', 'error']);
12541
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (formGroupClasses);
12542
+
12543
+ /***/ }),
12544
+
12366
12545
  /***/ "./node_modules/@mui/material/esm/FormHelperText/FormHelperText.js":
12367
12546
  /*!*************************************************************************!*\
12368
12547
  !*** ./node_modules/@mui/material/esm/FormHelperText/FormHelperText.js ***!
@@ -100922,21 +101101,21 @@ __webpack_require__.r(__webpack_exports__);
100922
101101
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Box/Box.js");
100923
101102
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Typography/Typography.js");
100924
101103
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Container/Container.js");
100925
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/IconButton/IconButton.js");
100926
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Card/Card.js");
100927
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/CardContent/CardContent.js");
100928
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Stack/Stack.js");
100929
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Accordion/Accordion.js");
100930
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionSummary/AccordionSummary.js");
100931
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionDetails/AccordionDetails.js");
100932
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/TextField/TextField.js");
100933
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormHelperText/FormHelperText.js");
100934
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/CircularProgress/CircularProgress.js");
100935
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Alert/Alert.js");
100936
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Divider/Divider.js");
100937
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Button/Button.js");
101104
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tooltip/Tooltip.js");
101105
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/IconButton/IconButton.js");
101106
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Card/Card.js");
101107
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/CardContent/CardContent.js");
101108
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Stack/Stack.js");
101109
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Accordion/Accordion.js");
101110
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionSummary/AccordionSummary.js");
101111
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionDetails/AccordionDetails.js");
101112
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/TextField/TextField.js");
101113
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormHelperText/FormHelperText.js");
101114
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/CircularProgress/CircularProgress.js");
101115
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Alert/Alert.js");
101116
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Divider/Divider.js");
100938
101117
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/InputAdornment/InputAdornment.js");
100939
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tooltip/Tooltip.js");
101118
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Button/Button.js");
100940
101119
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControlLabel/FormControlLabel.js");
100941
101120
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Checkbox/Checkbox.js");
100942
101121
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControl/FormControl.js");
@@ -100946,37 +101125,43 @@ __webpack_require__.r(__webpack_exports__);
100946
101125
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/ToggleButtonGroup/ToggleButtonGroup.js");
100947
101126
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/ToggleButton/ToggleButton.js");
100948
101127
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Dialog/Dialog.js");
100949
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Paper/Paper.js");
100950
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogTitle/DialogTitle.js");
100951
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogContent/DialogContent.js");
100952
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogActions/DialogActions.js");
100953
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/createTheme.js");
100954
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/ThemeProvider.js");
100955
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AccountBalance.js");
100956
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AttachMoney.js");
100957
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AutoAwesome.js");
100958
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness4.js");
100959
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness7.js");
100960
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CheckCircle.js");
100961
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Close.js");
100962
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CloudDownload.js");
100963
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ContentCopy.js");
100964
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ContentPaste.js");
100965
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/DeleteOutline.js");
100966
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
100967
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Fullscreen.js");
100968
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Login.js");
100969
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Logout.js");
100970
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/NoteAdd.js");
100971
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/OpenInNew.js");
100972
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Replay.js");
100973
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
100974
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Visibility.js");
100975
- /* harmony import */ var _PromptManagerDialog__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! ./PromptManagerDialog */ "./src/PromptManagerDialog.tsx");
100976
- /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
100977
- /* harmony import */ var xlsx__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! xlsx */ "./node_modules/xlsx/xlsx.mjs");
100978
- /* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! jszip */ "./node_modules/jszip/dist/jszip.min.js");
100979
- /* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_62___default = /*#__PURE__*/__webpack_require__.n(jszip__WEBPACK_IMPORTED_MODULE_62__);
101128
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogTitle/DialogTitle.js");
101129
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogContent/DialogContent.js");
101130
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogActions/DialogActions.js");
101131
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Paper/Paper.js");
101132
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormGroup/FormGroup.js");
101133
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Snackbar/Snackbar.js");
101134
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/createTheme.js");
101135
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/ThemeProvider.js");
101136
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AccountBalance.js");
101137
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AttachMoney.js");
101138
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AutoAwesome.js");
101139
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Backup.js");
101140
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness4.js");
101141
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness7.js");
101142
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CheckCircle.js");
101143
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Close.js");
101144
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CloudDownload.js");
101145
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ContentCopy.js");
101146
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ContentPaste.js");
101147
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/DeleteOutline.js");
101148
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
101149
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Fullscreen.js");
101150
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Login.js");
101151
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Logout.js");
101152
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/NoteAdd.js");
101153
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/OpenInNew.js");
101154
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Replay.js");
101155
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
101156
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Visibility.js");
101157
+ /* harmony import */ var _PromptManagerDialog__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(/*! ./PromptManagerDialog */ "./src/PromptManagerDialog.tsx");
101158
+ /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
101159
+ /* harmony import */ var _appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(/*! ./appSettingsBundle */ "./src/appSettingsBundle.ts");
101160
+ /* harmony import */ var _flexcardBalance__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(/*! ./flexcardBalance */ "./src/flexcardBalance.ts");
101161
+ /* harmony import */ var xlsx__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(/*! xlsx */ "./node_modules/xlsx/xlsx.mjs");
101162
+ /* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(/*! jszip */ "./node_modules/jszip/dist/jszip.min.js");
101163
+ /* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_67___default = /*#__PURE__*/__webpack_require__.n(jszip__WEBPACK_IMPORTED_MODULE_67__);
101164
+
100980
101165
 
100981
101166
 
100982
101167
 
@@ -101130,19 +101315,51 @@ function extractChatCompletionText(choice) {
101130
101315
  if (!msg)
101131
101316
  return '';
101132
101317
  const c = msg.content;
101133
- if (typeof c === 'string')
101134
- return c;
101135
- if (Array.isArray(c)) {
101136
- return c
101318
+ let fromContent = '';
101319
+ if (typeof c === 'string') {
101320
+ fromContent = c;
101321
+ }
101322
+ else if (Array.isArray(c)) {
101323
+ fromContent = c
101137
101324
  .map((part) => (typeof part === 'string' ? part : part?.text ?? part?.content ?? ''))
101138
101325
  .filter(Boolean)
101139
101326
  .join('');
101140
101327
  }
101141
- if (c != null && typeof c === 'object' && typeof c.text === 'string') {
101142
- return c.text;
101328
+ else if (c != null && typeof c === 'object' && typeof c.text === 'string') {
101329
+ fromContent = c.text;
101330
+ }
101331
+ if (fromContent.trim())
101332
+ return fromContent;
101333
+ // Часть моделей (reasoning) кладёт текст в reasoning/refusal — иначе «Полный ответ» пустой.
101334
+ const reasoning = msg.reasoning;
101335
+ if (typeof reasoning === 'string' && reasoning.trim())
101336
+ return reasoning;
101337
+ if (Array.isArray(reasoning)) {
101338
+ const r = reasoning
101339
+ .map((p) => (typeof p === 'string' ? p : p?.text ?? ''))
101340
+ .filter(Boolean)
101341
+ .join('\n');
101342
+ if (r.trim())
101343
+ return r;
101143
101344
  }
101345
+ const refusal = msg.refusal;
101346
+ if (typeof refusal === 'string' && refusal.trim())
101347
+ return refusal;
101144
101348
  return '';
101145
101349
  }
101350
+ /** Сырой JSON, если в message не извлекли ни одной буквы — иначе «Полный ответ» = пусто и UI показывает лишь подсказку из checkErrors. */
101351
+ const VALIDATOR_RESULT_RAW_JSON_MAX = 48_000;
101352
+ function buildValidatorStoredResultText(content, data) {
101353
+ if (content.trim().length > 0) {
101354
+ return content;
101355
+ }
101356
+ const raw = JSON.stringify(data ?? {}, null, 2);
101357
+ const pre = 'Текст ответа модели не извлечён из message.content (проверьте reasoning/формат в JSON ниже). Ответ API:\n\n';
101358
+ if (raw.length <= VALIDATOR_RESULT_RAW_JSON_MAX) {
101359
+ return pre + raw;
101360
+ }
101361
+ return `${pre}${raw.slice(0, VALIDATOR_RESULT_RAW_JSON_MAX)}…\n[обрезано по ${VALIDATOR_RESULT_RAW_JSON_MAX} симв.]`;
101362
+ }
101146
101363
  /** Обрыв ответа по лимиту токенов (OpenRouter / OpenAI-совместимый completion). */
101147
101364
  function isCompletionTruncatedByTokenLimit(choice) {
101148
101365
  if (!choice)
@@ -101243,7 +101460,8 @@ function isValidationNegationLine(s) {
101243
101460
  const t = normalizeValidationErrorText(s).toLowerCase();
101244
101461
  if (!t)
101245
101462
  return true;
101246
- if (t === 'нет')
101463
+ const tBare = t.replace(/\.+$/g, '').trim();
101464
+ if (tBare === 'нет')
101247
101465
  return true;
101248
101466
  if (t.includes('нет ошибок') || t.includes('ошибок нет'))
101249
101467
  return true;
@@ -101330,6 +101548,17 @@ function extractLeadingPriceNumber(value) {
101330
101548
  return m[1].replace(',', '.');
101331
101549
  return '99';
101332
101550
  }
101551
+ /** Крео подходит под «Загрузить правильные» — как зелёная подпись «Проверка пройдена»: статус ok и реальная проверка (не «отключена»). Список checkErrors при ok не используем: парсер иногда оставляет ложные строки вроде «нет.». */
101552
+ function isCreoPassedValidatorForDriveUpload(img) {
101553
+ return img.checkStatus === 'ok' && img.checkResult !== 'Проверка отключена';
101554
+ }
101555
+ /** Автозагрузка на Drive только после реального OK валидатора (не при отключённой проверке). */
101556
+ function shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult) {
101557
+ return (uploadAfterValidatorOk &&
101558
+ !validationDisabled &&
101559
+ validationResult.status === 'ok' &&
101560
+ validationResult.result !== 'Проверка отключена');
101561
+ }
101333
101562
  /** Фон карточки крео: после 1-й переделки — светло-жёлтый, далее темнеет с каждой следующей. */
101334
101563
  function getRemakeHighlightBackground(remakeCount, dark) {
101335
101564
  if (remakeCount <= 0)
@@ -101433,6 +101662,13 @@ function App() {
101433
101662
  const [openRouterAccountBalance, setOpenRouterAccountBalance] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
101434
101663
  const [openRouterBalanceLoading, setOpenRouterBalanceLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101435
101664
  const fetchBalanceRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
101665
+ const [flexcardApiKey, setFlexcardApiKey] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
101666
+ /** Сумма USD по всем строкам `GET /api/v1/finance/accounts/`; null — ошибка / нет данных */
101667
+ const [flexCardUsdTotal, setFlexCardUsdTotal] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
101668
+ const [flexCardBalanceLoading, setFlexCardBalanceLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101669
+ const [telegramBotToken, setTelegramBotToken] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
101670
+ const [telegramChatId, setTelegramChatId] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
101671
+ const [telegramTestSending, setTelegramTestSending] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101436
101672
  const [generateProduct, setGenerateProduct] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
101437
101673
  const [generateGeo, setGenerateGeo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
101438
101674
  const [generateAdditionalInfo, setGenerateAdditionalInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
@@ -101495,6 +101731,14 @@ function App() {
101495
101731
  return false;
101496
101732
  }
101497
101733
  });
101734
+ const [uploadAfterValidatorOk, setUploadAfterValidatorOk] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {
101735
+ try {
101736
+ return localStorage.getItem('uploadAfterValidatorOk') === 'true';
101737
+ }
101738
+ catch {
101739
+ return false;
101740
+ }
101741
+ });
101498
101742
  const [imageAspectRatio, setImageAspectRatio] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {
101499
101743
  const saved = localStorage.getItem('imageAspectRatio');
101500
101744
  // Migrate legacy values (4:5, 9:16) to 2:3
@@ -101554,6 +101798,7 @@ function App() {
101554
101798
  'rub': 'RUB',
101555
101799
  'forint': 'HUF',
101556
101800
  'forints': 'HUF',
101801
+ 'ft': 'HUF', // Hungarian forint (e.g. "11 400 Ft")
101557
101802
  'huf': 'HUF',
101558
101803
  'zloty': 'PLN',
101559
101804
  'zlotys': 'PLN',
@@ -101568,6 +101813,7 @@ function App() {
101568
101813
  'krone': 'DKK',
101569
101814
  'kroner': 'DKK',
101570
101815
  'dkk': 'DKK',
101816
+ 'kč': 'CZK',
101571
101817
  'koruna': 'CZK',
101572
101818
  'koruny': 'CZK',
101573
101819
  'czk': 'CZK',
@@ -101693,12 +101939,22 @@ function App() {
101693
101939
  const [generatingImages, setGeneratingImages] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101694
101940
  const [imagesGenerationLogs, setImagesGenerationLogs] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
101695
101941
  const [generatedImagesData, setGeneratedImagesData] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]);
101942
+ const { pendingDriveUploadCreos, pendingValidatorOkDriveUploadCreos } = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => {
101943
+ const pending = generatedImagesData.filter(img => !img.uploaded && img.imageUrl);
101944
+ return {
101945
+ pendingDriveUploadCreos: pending,
101946
+ pendingValidatorOkDriveUploadCreos: pending.filter(isCreoPassedValidatorForDriveUpload)
101947
+ };
101948
+ }, [generatedImagesData]);
101949
+ const creoAutoUploadAfterValidatorOkRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(async () => { });
101696
101950
  const [checkingImages, setCheckingImages] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101697
101951
  const [uploadingImages, setUploadingImages] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101698
101952
  /** Индекс крео, для которого идёт удаление файла с Drive (кнопка «Удалить с Диска»). */
101699
101953
  const [deletingDriveImageIndex, setDeletingDriveImageIndex] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
101700
101954
  /** Полноэкранный просмотр сгенерированного крео (url + подпись). */
101701
101955
  const [creoFullscreen, setCreoFullscreen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
101956
+ /** Полный текст ответа валидатора (или сообщение при сбое канала) — для отладки из карточки крео */
101957
+ const [validatorDebugDialog, setValidatorDebugDialog] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
101702
101958
  const [uploadingProduct, setUploadingProduct] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101703
101959
  const [folderFilesInfo, setFolderFilesInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
101704
101960
  const [rootFolderInfo, setRootFolderInfo] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
@@ -101749,6 +102005,9 @@ function App() {
101749
102005
  const [openRouterKeyCopied, setOpenRouterKeyCopied] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101750
102006
  const [loadingContentFromDrive, setLoadingContentFromDrive] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101751
102007
  const [driveFilesFound, setDriveFilesFound] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ content: false });
102008
+ /** Креатив/новая папка без project-settings: пользователь нажал «это нормально» — больше не спрашивать для этой папки в сессии. */
102009
+ const dismissedSettingsMissingForFolderRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(new Set());
102010
+ const [settingsFileMissingDialog, setSettingsFileMissingDialog] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ open: false, folderId: null, retrying: false });
101752
102011
  const syncDriveAfterPromptSaveRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(() => { });
101753
102012
  // Theme state
101754
102013
  const [darkMode, setDarkMode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {
@@ -101824,7 +102083,7 @@ function App() {
101824
102083
  }
101825
102084
  };
101826
102085
  // Create theme based on mode
101827
- const theme = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => (0,_mui_material__WEBPACK_IMPORTED_MODULE_37__["default"])({
102086
+ const theme = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => (0,_mui_material__WEBPACK_IMPORTED_MODULE_39__["default"])({
101828
102087
  palette: {
101829
102088
  mode: darkMode ? 'dark' : 'light',
101830
102089
  ...(darkMode
@@ -101879,6 +102138,15 @@ function App() {
101879
102138
  applyThemeStyles(darkMode);
101880
102139
  }, [darkMode]);
101881
102140
  const [promptManagerOpen, setPromptManagerOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
102141
+ /** Резервная копия локальных настроек: что включить в экспорт */
102142
+ const [settingsExportFlags, setSettingsExportFlags] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ ..._appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.DEFAULT_EXPORT_FLAGS });
102143
+ /** Загруженный из файла бандл до подтверждения импорта */
102144
+ const [settingsImportBundle, setSettingsImportBundle] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
102145
+ /** Какие блоки из `settingsImportBundle` применить (чекбоксы) */
102146
+ const [settingsImportFlags, setSettingsImportFlags] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
102147
+ const [settingsBackupSnackbar, setSettingsBackupSnackbar] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ open: false, message: '', severity: 'success' });
102148
+ const [settingsBackupDialogOpen, setSettingsBackupDialogOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
102149
+ const settingsImportFileInputRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
101882
102150
  /** После загрузки project-settings.json: спросить, подставить подходы из файла или оставить локальные. */
101883
102151
  const [approachLoadChoice, setApproachLoadChoice] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
101884
102152
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
@@ -101901,6 +102169,13 @@ function App() {
101901
102169
  setOpenaiApiKey(config.openaiApiKey);
101902
102170
  // Balance will be fetched automatically by useEffect when openaiApiKey changes
101903
102171
  }
102172
+ if (config.flexcardApiKey) {
102173
+ setFlexcardApiKey(String(config.flexcardApiKey));
102174
+ }
102175
+ if (config.telegramBotToken)
102176
+ setTelegramBotToken(String(config.telegramBotToken));
102177
+ if (config.telegramChatId)
102178
+ setTelegramChatId(String(config.telegramChatId));
101904
102179
  if (config.secretUnlockPassed === true) {
101905
102180
  setUnlocked(true);
101906
102181
  try {
@@ -101930,7 +102205,7 @@ function App() {
101930
102205
  };
101931
102206
  loadKey();
101932
102207
  // Load prompt overrides from Electron config
101933
- (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.loadOverridesFromElectron)();
102208
+ (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.loadOverridesFromElectron)();
101934
102209
  }, []);
101935
102210
  // Save form fields to localStorage whenever they change
101936
102211
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
@@ -101966,6 +102241,9 @@ function App() {
101966
102241
  // Don't save while loading from Drive to avoid loops
101967
102242
  if (loadingContentFromDrive)
101968
102243
  return;
102244
+ // Пока открыт диалог «настройки не найдены» — не создаём/не перезаписываем project-settings (иначе гонка с «перепроверить»)
102245
+ if (settingsFileMissingDialog.open)
102246
+ return;
101969
102247
  const folderId = extractFolderId(driveFolderUrl);
101970
102248
  if (!folderId)
101971
102249
  return;
@@ -102003,12 +102281,14 @@ function App() {
102003
102281
  catalogUrlImageAspectParam,
102004
102282
  catalogLinkExtraMacros,
102005
102283
  driveFolderUrl,
102006
- loadingContentFromDrive
102284
+ loadingContentFromDrive,
102285
+ settingsFileMissingDialog.open
102007
102286
  ]);
102008
102287
  // Load generated content from Google Drive when driveFolderUrl changes
102009
102288
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
102010
102289
  if (!driveFolderUrl) {
102011
102290
  logToTerminal('log', '[Load] No driveFolderUrl, skipping load');
102291
+ setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
102012
102292
  setLoadingContentFromDrive(false);
102013
102293
  setDriveFilesFound({ content: false });
102014
102294
  // Clear all data when driveFolderUrl is cleared
@@ -102028,6 +102308,7 @@ function App() {
102028
102308
  const folderId = extractFolderId(driveFolderUrl);
102029
102309
  if (!folderId) {
102030
102310
  logToTerminal('warn', '[Load] Invalid driveFolderUrl, cannot extract folderId:', driveFolderUrl);
102311
+ setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
102031
102312
  setLoadingContentFromDrive(false);
102032
102313
  setDriveFilesFound({ content: false });
102033
102314
  // Clear all data when folderId cannot be extracted
@@ -102057,13 +102338,20 @@ function App() {
102057
102338
  setPairTranslations({});
102058
102339
  setPairTranslationFailed(false);
102059
102340
  setApproachLoadChoice(null);
102341
+ setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
102060
102342
  setLoadingContentFromDrive(true);
102061
102343
  setDriveFilesFound({ content: false });
102062
102344
  // Load content from Google Drive
102063
- loadGeneratedContentFromDrive(folderId).then((result) => {
102064
- logToTerminal('log', '[Load] Content loading completed, found:', result.found);
102345
+ loadGeneratedContentFromDrive(folderId)
102346
+ .then((result) => {
102347
+ logToTerminal('log', '[Load] Content loading completed, found:', result.found, 'noSettingsFile:', Boolean(result.noSettingsFile));
102065
102348
  setLoadingContentFromDrive(false);
102066
- }).catch((err) => {
102349
+ if (result.noSettingsFile &&
102350
+ !dismissedSettingsMissingForFolderRef.current.has(folderId)) {
102351
+ setSettingsFileMissingDialog({ open: true, folderId, retrying: false });
102352
+ }
102353
+ })
102354
+ .catch((err) => {
102067
102355
  logToTerminal('error', '[Load] Error loading content from Google Drive:', err);
102068
102356
  setLoadingContentFromDrive(false);
102069
102357
  });
@@ -102203,6 +102491,25 @@ function App() {
102203
102491
  return () => clearInterval(intervalId);
102204
102492
  // eslint-disable-next-line react-hooks/exhaustive-deps
102205
102493
  }, [openaiApiKey]);
102494
+ // FlexCard: баланс при ключе, каждые 10 минут и при открытии диалога резервной копии
102495
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
102496
+ if (!flexcardApiKey.trim()) {
102497
+ setFlexCardUsdTotal(null);
102498
+ return;
102499
+ }
102500
+ void fetchFlexCardBalance();
102501
+ const intervalId = setInterval(() => {
102502
+ void fetchFlexCardBalance();
102503
+ }, 600000);
102504
+ return () => clearInterval(intervalId);
102505
+ // eslint-disable-next-line react-hooks/exhaustive-deps
102506
+ }, [flexcardApiKey]);
102507
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
102508
+ if (!settingsBackupDialogOpen || !flexcardApiKey.trim())
102509
+ return;
102510
+ void fetchFlexCardBalance();
102511
+ // eslint-disable-next-line react-hooks/exhaustive-deps
102512
+ }, [settingsBackupDialogOpen]);
102206
102513
  // Fetch image models when API key changes
102207
102514
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
102208
102515
  if (!openaiApiKey) {
@@ -102492,7 +102799,7 @@ function App() {
102492
102799
  clearTimeout(pollTimeoutId);
102493
102800
  };
102494
102801
  }, [driveFolderUrl, accessToken, refreshToken]);
102495
- const saveConfig = async (newClientId, newClientSecret, newAccessToken, newRefreshToken, newOpenaiApiKey) => {
102802
+ const saveConfig = async (newClientId, newClientSecret, newAccessToken, newRefreshToken, newOpenaiApiKey, newFlexcardApiKey, newTelegramBotToken, newTelegramChatId) => {
102496
102803
  try {
102497
102804
  const api = getElectronAPI();
102498
102805
  if (api) {
@@ -102503,7 +102810,10 @@ function App() {
102503
102810
  clientSecret: newClientSecret ?? clientSecret,
102504
102811
  accessToken: newAccessToken ?? accessToken,
102505
102812
  refreshToken: newRefreshToken ?? refreshToken,
102506
- openaiApiKey: newOpenaiApiKey ?? openaiApiKey
102813
+ openaiApiKey: newOpenaiApiKey ?? openaiApiKey,
102814
+ flexcardApiKey: newFlexcardApiKey ?? flexcardApiKey,
102815
+ telegramBotToken: newTelegramBotToken ?? telegramBotToken,
102816
+ telegramChatId: newTelegramChatId ?? telegramChatId,
102507
102817
  });
102508
102818
  }
102509
102819
  }
@@ -102736,6 +103046,15 @@ function App() {
102736
103046
  /* ignore */
102737
103047
  }
102738
103048
  };
103049
+ const handleUploadAfterValidatorOkChange = (checked) => {
103050
+ setUploadAfterValidatorOk(checked);
103051
+ try {
103052
+ localStorage.setItem('uploadAfterValidatorOk', String(checked));
103053
+ }
103054
+ catch {
103055
+ /* ignore */
103056
+ }
103057
+ };
102739
103058
  // Fetch OpenRouter account balance and key limit
102740
103059
  const fetchOpenRouterBalance = async (apiKey) => {
102741
103060
  const keyToUse = apiKey ?? openaiApiKey;
@@ -102921,6 +103240,73 @@ function App() {
102921
103240
  fetchBalanceRef.current = fetchPromise;
102922
103241
  await fetchPromise;
102923
103242
  };
103243
+ const fetchFlexCardBalance = async (apiKey) => {
103244
+ const keyToUse = (apiKey ?? flexcardApiKey).trim();
103245
+ if (!keyToUse) {
103246
+ setFlexCardUsdTotal(null);
103247
+ return;
103248
+ }
103249
+ setFlexCardBalanceLoading(true);
103250
+ try {
103251
+ const total = await (0,_flexcardBalance__WEBPACK_IMPORTED_MODULE_65__.fetchFlexCardFinanceAccountsUsdTotal)(keyToUse);
103252
+ setFlexCardUsdTotal(total);
103253
+ if (total === null) {
103254
+ logToTerminal('warn', '⚠️ FlexCard: не удалось загрузить finance/accounts (ключ или права API).');
103255
+ }
103256
+ }
103257
+ catch (e) {
103258
+ setFlexCardUsdTotal(null);
103259
+ logToTerminal('error', '❌ FlexCard:', e instanceof Error ? e.message : String(e));
103260
+ }
103261
+ finally {
103262
+ setFlexCardBalanceLoading(false);
103263
+ }
103264
+ };
103265
+ const handleFlexcardApiKeyChange = (val) => {
103266
+ setFlexcardApiKey(val);
103267
+ saveConfig(undefined, undefined, undefined, undefined, undefined, val);
103268
+ if (val.trim()) {
103269
+ void fetchFlexCardBalance(val);
103270
+ }
103271
+ else {
103272
+ setFlexCardUsdTotal(null);
103273
+ }
103274
+ };
103275
+ const handleTelegramBotTokenChange = (val) => {
103276
+ setTelegramBotToken(val);
103277
+ saveConfig(undefined, undefined, undefined, undefined, undefined, undefined, val, undefined);
103278
+ };
103279
+ const handleTelegramChatIdChange = (val) => {
103280
+ setTelegramChatId(val);
103281
+ saveConfig(undefined, undefined, undefined, undefined, undefined, undefined, undefined, val);
103282
+ };
103283
+ const handleTelegramTestSend = async () => {
103284
+ const api = getElectronAPI();
103285
+ if (!api?.telegramSendTest) {
103286
+ alert('Отправка теста доступна в приложении Electron.');
103287
+ return;
103288
+ }
103289
+ const token = telegramBotToken.trim();
103290
+ const chat = telegramChatId.trim();
103291
+ if (!token || !chat) {
103292
+ alert('Укажите токен бота и ID чата.');
103293
+ return;
103294
+ }
103295
+ setTelegramTestSending(true);
103296
+ try {
103297
+ const r = await api.telegramSendTest(token, chat);
103298
+ if (r.ok)
103299
+ alert('Сообщение отправлено.');
103300
+ else
103301
+ alert(r.error || 'Ошибка отправки.');
103302
+ }
103303
+ catch (e) {
103304
+ alert(e instanceof Error ? e.message : String(e));
103305
+ }
103306
+ finally {
103307
+ setTelegramTestSending(false);
103308
+ }
103309
+ };
102924
103310
  // Fetch available image generation models from OpenRouter
102925
103311
  const fetchImageModels = async (apiKey) => {
102926
103312
  const keyToUse = apiKey ?? openaiApiKey;
@@ -102979,14 +103365,6 @@ function App() {
102979
103365
  name: model.name || model.id
102980
103366
  }))
102981
103367
  .sort((a, b) => a.name.localeCompare(b.name));
102982
- // Debug: log raw structure of a few representative models
102983
- const debugModels = (data.data || []).filter((m) => m.id?.includes('flux') || m.id?.includes('riverflow') || m.id?.includes('gemini')).slice(0, 6);
102984
- if (debugModels.length > 0) {
102985
- logToTerminal('log', '🔬 Image model raw structures (flux/riverflow/gemini sample):');
102986
- debugModels.forEach((m) => {
102987
- logToTerminal('log', ` ${m.id} → architecture=${JSON.stringify(m.architecture)}, modalities=${JSON.stringify(m.modalities)}`);
102988
- });
102989
- }
102990
103368
  logToTerminal('log', `✅ Found ${imageGenModels.length} image generation models`);
102991
103369
  setImageModels(imageGenModels);
102992
103370
  // Если выбранной модели нет в списке API — сброс на дефолт (отдельно для 1:1 и 2:3)
@@ -103556,6 +103934,20 @@ function App() {
103556
103934
  });
103557
103935
  return result;
103558
103936
  };
103937
+ /** Уведомление в Telegram, если в настройках заданы токен и chat id (только Electron). */
103938
+ const sendTelegramNotification = async (text) => {
103939
+ const api = getElectronAPI();
103940
+ const token = telegramBotToken.trim();
103941
+ const chat = telegramChatId.trim();
103942
+ if (!api?.telegramSendMessage || !token || !chat)
103943
+ return;
103944
+ try {
103945
+ await api.telegramSendMessage(token, chat, text);
103946
+ }
103947
+ catch {
103948
+ /* ignore */
103949
+ }
103950
+ };
103559
103951
  /**
103560
103952
  * Переводит массив сгенерированных пар на русский одним запросом.
103561
103953
  * При ошибке выставляется pairTranslationFailed (кнопка «Запросить перевод»).
@@ -103620,6 +104012,7 @@ function App() {
103620
104012
  setPairTranslations(translations);
103621
104013
  setPairTranslationFailed(false);
103622
104014
  logToTerminal('log', '[Translate RU] OK, пар переведено:', parsed.length);
104015
+ void sendTelegramNotification('Docs Combiner: тексты сгенерированы, перевод на русский выполнен.');
103623
104016
  }
103624
104017
  catch {
103625
104018
  logToTerminal('warn', '[Translate RU] Ошибка запроса или разбора — см. консоль / лог');
@@ -103694,7 +104087,7 @@ function App() {
103694
104087
  setPairTranslations({});
103695
104088
  setPairTranslationFailed(false);
103696
104089
  // Read pairs count from settings (3–10, default 3)
103697
- const pairsCountInit = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.getPairsCount)();
104090
+ const pairsCountInit = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getPairsCount)();
103698
104091
  // Initialize placeholders
103699
104092
  const initialTitles = Array.from({ length: pairsCountInit }, (_, index) => ({
103700
104093
  index: index + 1,
@@ -103744,7 +104137,7 @@ function App() {
103744
104137
  })));
103745
104138
  await new Promise(r => setTimeout(r, CONTENT_GEN_RETRY_DELAY_MS));
103746
104139
  }
103747
- const selectedIndices = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.getSelectedPairApproaches)();
104140
+ const selectedIndices = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getSelectedPairApproaches)();
103748
104141
  setLastUsedApproachIndices(selectedIndices);
103749
104142
  const pairsCount = selectedIndices.length;
103750
104143
  if (attempt === 1) {
@@ -103828,7 +104221,7 @@ function App() {
103828
104221
  }
103829
104222
  addLog(formatLogMessage('log', `✅ Successfully generated ${parsedTitles} title(s) and ${parsedTexts} text(s)`));
103830
104223
  // Save generated content to Google Drive
103831
- if (driveFolderUrl) {
104224
+ if (driveFolderUrl && !settingsFileMissingDialog.open) {
103832
104225
  try {
103833
104226
  const folderId = extractFolderId(driveFolderUrl);
103834
104227
  if (folderId) {
@@ -103846,6 +104239,9 @@ function App() {
103846
104239
  addLog(formatLogMessage('warn', `⚠️ Failed to save content to Google Drive: ${err.message || 'Unknown error'}`));
103847
104240
  }
103848
104241
  }
104242
+ else if (driveFolderUrl && settingsFileMissingDialog.open) {
104243
+ addLog(formatLogMessage('log', '⏸ Пропуск сохранения в Drive: ответьте в диалоге «настройки не найдены»'));
104244
+ }
103849
104245
  const totalTime = Math.floor((Date.now() - startTime) / 1000);
103850
104246
  addLog(formatLogMessage('log', `🎉 === Content generation completed ===`));
103851
104247
  addLog(formatLogMessage('log', `⏱️ Total time: ${totalTime}s`));
@@ -104184,14 +104580,21 @@ function App() {
104184
104580
  const oldStr = Number.isFinite(oldNum)
104185
104581
  ? (Number.isInteger(oldNum) ? String(oldNum) : (Math.round(oldNum * 100) / 100).toString().replace(/\.?0+$/, ''))
104186
104582
  : '';
104187
- priceBriefForValidation = `Новая цена по брифу (после скидки -50%): ${briefPrice} ${briefCurrency}${currencySymbol ? `, символ валюты: ${currencySymbol}` : ''}. ${Number.isFinite(oldNum) ? `Ожидаемая старая цена до скидки: ${oldStr} ${briefCurrency} (2× новой).` : 'Старая цена на макете должна быть в 2 раза больше новой.'} Любые другие суммы — ошибка «не совпадает с брифом».`;
104583
+ priceBriefForValidation = `Новая цена по брифу (после скидки -50%): ${briefPrice} ${briefCurrency}${currencySymbol ? `, символ валюты: ${currencySymbol}` : ''}. ${Number.isFinite(oldNum) ? `Ожидаемая старая цена до скидки: ${oldStr} ${briefCurrency} (2× новой).` : 'Старая цена на макете должна быть в 2 раза больше новой.'} Любые другие суммы — ошибка «не совпадает с брифом». На макете в зоне цен должна быть **именно эта валюта** (${briefCurrency}${currencySymbol ? ` или эквивалентный символ ${currencySymbol}` : ''}); иная валюта или её сокращения (например лв/BGN при EUR) — ошибка валидатора, нужна пересборка.`;
104188
104584
  logMsg('log', `💶 Эталон цен для валидации: новая ${briefPrice} ${briefCurrency}${oldStr ? `, старая ${oldStr}` : ''}`);
104189
104585
  }
104190
104586
  else {
104191
104587
  logMsg('log', '💶 Поле цены в приложении пустое — валидатор сверяет только визуал двух цен');
104192
104588
  }
104589
+ const baseName = (0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getCreoApproachBaseNameFromImageLabel)(approachName?.trim() || '');
104590
+ const approachForBullets = _prompts__WEBPACK_IMPORTED_MODULE_2__.CREO_APPROACHES.find(a => a.name === baseName);
104591
+ const expectNoBullets = approachForBullets
104592
+ ? (0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getEffectiveCreoNoBullets)(approachForBullets)
104593
+ : true;
104193
104594
  const validationPrompt = (withProductReference ? `${(0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getValidationProductReferencePreamble)()}\n` : '') +
104194
- (0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getValidationPrompt)(product, geo, keywords, approachName, undefined, priceBriefForValidation);
104595
+ (0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getValidationPrompt)(product, geo, keywords, approachName, undefined, priceBriefForValidation, {
104596
+ expectNoBullets
104597
+ });
104195
104598
  const visionContent = [
104196
104599
  { type: 'text', text: validationPrompt },
104197
104600
  { type: 'image_url', image_url: { url: imageUrl } }
@@ -104381,7 +104784,7 @@ function App() {
104381
104784
  : status === 'needs_rebuild'
104382
104785
  ? (snippet
104383
104786
  ? [`Валидатор не выписал строки «ОШИБКА:». Фрагмент ответа: ${snippet}`]
104384
- : ['Валидатор указал пересборку, но не перечислил причины (нет строк «ОШИБКА:»). Откройте полный текст ответа модели в логе или повторите проверку.'])
104787
+ : ['Валидатор требует пересборки, а строки «ОШИБКА:» не разобрали. Сырой ответ/JSON в «Полном ответе валидатора» под карточкой; при пустом контенте модели смотрите и лог.'])
104385
104788
  : [];
104386
104789
  if (truncatedByLimit) {
104387
104790
  const truncationMsg = 'ОШИБКА: ответ валидатора обрезан по лимиту токенов (OpenRouter/провайдер вернули неполный текст — обычно finish_reason=length). Повторите проверку или выберите модель без тяжёлого reasoning.';
@@ -104398,7 +104801,7 @@ function App() {
104398
104801
  }
104399
104802
  return {
104400
104803
  status,
104401
- result: content,
104804
+ result: buildValidatorStoredResultText(content, data),
104402
104805
  errors: finalErrors
104403
104806
  };
104404
104807
  };
@@ -104693,7 +105096,7 @@ function App() {
104693
105096
  addLog(formatLogMessage(level, ...args));
104694
105097
  };
104695
105098
  logMsg('log', '📦 Creating ZIP archive with HTML and product image...');
104696
- const zip = new (jszip__WEBPACK_IMPORTED_MODULE_62___default())();
105099
+ const zip = new (jszip__WEBPACK_IMPORTED_MODULE_67___default())();
104697
105100
  // Replace product image path in HTML to match actual filename (png/jpg/webp)
104698
105101
  const htmlWithProductPath = htmlContent.replace(/src=["']product\.(png|jpe?g|webp)["']/gi, `src="${productImageName}"`);
104699
105102
  zip.file('index.html', htmlWithProductPath);
@@ -105037,7 +105440,7 @@ function App() {
105037
105440
  const expandedTasks = (0,_prompts__WEBPACK_IMPORTED_MODULE_2__.getCreoApproachExpandedTasks)();
105038
105441
  if (expandedTasks.length === 0) {
105039
105442
  addLog(formatLogMessage('error', '❌ Укажите количество изображений (хотя бы 1) в настройках подходов'));
105040
- alert(`Укажите количество изображений (1–${_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.MAX_IMAGES_PER_CREO_APPROACH}) хотя бы для одного подхода в настройках`);
105443
+ alert(`Укажите количество изображений (1–${_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.MAX_IMAGES_PER_CREO_APPROACH}) хотя бы для одного подхода в настройках`);
105041
105444
  setGeneratingImages(false);
105042
105445
  return;
105043
105446
  }
@@ -105089,16 +105492,104 @@ function App() {
105089
105492
  }));
105090
105493
  setGeneratedImagesData(initialPlaceholders);
105091
105494
  addLog(formatLogMessage('log', `📝 Generated prompts for ${tasks.length} images${useBoth ? ' (1:1 + 2:3 на каждый подход)' : ''}`));
105092
- const maxParallel = 100; // like infinity
105495
+ const maxParallel = 12;
105093
105496
  addLog(formatLogMessage('log', `🚀 Generating ${tasks.length} images in parallel (up to ${maxParallel} at a time)...`));
105094
105497
  const generationStartTime = Date.now();
105095
105498
  const resultsMap = new Map();
105499
+ const validationTasks = [];
105096
105500
  // Ensure each slot has prompt+product reference from the start (needed for regeneration even on failures)
105097
105501
  setGeneratedImagesData(prev => prev.map((img, i) => ({
105098
105502
  ...img,
105099
105503
  originalPrompt: img.originalPrompt || imagePrompts[i],
105100
105504
  productImageUrl: img.productImageUrl || productImage.url
105101
105505
  })));
105506
+ const runValidationForGeneratedImage = async (imageIndex, imageUrl, prompt, approachName, approachLabel, ratio) => {
105507
+ const validationResult = validationDisabled
105508
+ ? { status: 'ok', result: 'Проверка отключена', errors: [], checkFailed: false }
105509
+ : await (async () => {
105510
+ try {
105511
+ const res = await validateCreativeImage(imageUrl, generateProduct, generateGeo, addLog, approachName, productImage.url);
105512
+ if (!res)
105513
+ throw new Error('No validation result');
105514
+ return { ...res, checkFailed: false };
105515
+ }
105516
+ catch (validationErr) {
105517
+ const msg = validationErr?.message || String(validationErr);
105518
+ addLog(formatLogMessage('error', `❌ Ошибка проверки изображения ${imageIndex}: ${msg}`));
105519
+ return {
105520
+ status: 'needs_rebuild',
105521
+ result: `Ошибка проверки: ${msg}`,
105522
+ errors: [msg],
105523
+ checkFailed: true
105524
+ };
105525
+ }
105526
+ })();
105527
+ let scheduleValidatorAutoRemake = false;
105528
+ const formattedValidationErrors = formatValidationErrorsForRegeneratePrompt(validationResult.errors);
105529
+ const validatorTransportRemake = validationResult.checkFailed === true;
105530
+ (0,react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync)(() => {
105531
+ setGeneratedImagesData(prev => {
105532
+ const cur = prev.find(i => i.index === imageIndex);
105533
+ const useAuto = shouldAutoRemakeAfterValidation(autoRemakeOnValidatorError, validationDisabled, validationResult, imageUrl, cur?.validatorTransportAutoRemakeDone);
105534
+ scheduleValidatorAutoRemake = useAuto;
105535
+ return prev.map(img => img.index === imageIndex
105536
+ ? {
105537
+ ...img,
105538
+ checking: false,
105539
+ checkFailed: validationResult.checkFailed ?? false,
105540
+ checkStatus: validationResult.status,
105541
+ checkResult: validationResult.result,
105542
+ checkErrors: validationResult.errors,
105543
+ customRegeneratePrompt: useAuto && validatorTransportRemake
105544
+ ? ''
105545
+ : formattedValidationErrors,
105546
+ originalPrompt: img.originalPrompt || prompt,
105547
+ productImageUrl: img.productImageUrl || productImage.url,
105548
+ validatorTransportAutoRemakeDone: useAuto
105549
+ ? true
105550
+ : (img.validatorTransportAutoRemakeDone ?? false)
105551
+ }
105552
+ : img);
105553
+ });
105554
+ });
105555
+ let verified;
105556
+ if (scheduleValidatorAutoRemake) {
105557
+ addLog(formatLogMessage('log', `🔄 Автопеределка с нуля изображения ${imageIndex} после ошибки валидатора (один раз)...`));
105558
+ const fr = await handleRegenerateImageFresh({
105559
+ index: imageIndex,
105560
+ approach: approachLabel,
105561
+ aspectRatio: ratio,
105562
+ originalPrompt: prompt,
105563
+ productImageUrl: productImage.url,
105564
+ creoApproachUiNumber: tasks[imageIndex - 1].poolIndex + 1,
105565
+ }, { fromAutoValidatorRemake: true });
105566
+ verified = fr?.verified === true;
105567
+ }
105568
+ else {
105569
+ verified = validationDisabled || validationResult.status === 'ok';
105570
+ if (shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult)) {
105571
+ const taskMeta = tasks[imageIndex - 1];
105572
+ if (taskMeta && folderId) {
105573
+ await creoAutoUploadAfterValidatorOkRef.current({
105574
+ imageData: {
105575
+ index: imageIndex,
105576
+ imageUrl,
105577
+ approach: approachLabel,
105578
+ creoApproachUiNumber: taskMeta.poolIndex + 1,
105579
+ aspectRatio: ratio,
105580
+ },
105581
+ folderId,
105582
+ validationResult,
105583
+ });
105584
+ }
105585
+ }
105586
+ }
105587
+ const existingResult = resultsMap.get(imageIndex);
105588
+ if (existingResult) {
105589
+ resultsMap.set(imageIndex, { ...existingResult, verified });
105590
+ }
105591
+ return { index: imageIndex, verified };
105592
+ };
105102
105593
  const runOne = async (i, isRetry) => {
105103
105594
  const imageIndex = i + 1;
105104
105595
  const task = tasks[i];
@@ -105142,70 +105633,14 @@ function App() {
105142
105633
  }
105143
105634
  : img));
105144
105635
  addLog(formatLogMessage('log', `✅ Изображение ${imageIndex}/${tasks.length} сгенерировано`));
105145
- // Validate right after generation (skip if validation disabled)
105146
- const validationResult = validationDisabled
105147
- ? { status: 'ok', result: 'Проверка отключена', errors: [], checkFailed: false }
105148
- : await (async () => {
105149
- try {
105150
- const res = await validateCreativeImage(imageUrl, generateProduct, generateGeo, addLog, approachName, productImage.url);
105151
- if (!res)
105152
- throw new Error('No validation result');
105153
- return { ...res, checkFailed: false };
105154
- }
105155
- catch (validationErr) {
105156
- const msg = validationErr?.message || String(validationErr);
105157
- addLog(formatLogMessage('error', `❌ Ошибка проверки изображения ${imageIndex}: ${msg}`));
105158
- return {
105159
- status: 'needs_rebuild',
105160
- result: `Ошибка проверки: ${msg}`,
105161
- errors: [msg],
105162
- checkFailed: true
105163
- };
105164
- }
105165
- })();
105166
105636
  const approachLabel = approachName + (useBoth ? ` (${ratio})` : '');
105167
- let scheduleValidatorAutoRemake = false;
105168
- const formattedValidationErrors = formatValidationErrorsForRegeneratePrompt(validationResult.errors);
105169
- const validatorTransportRemake = validationResult.checkFailed === true;
105170
- (0,react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync)(() => {
105171
- setGeneratedImagesData(prev => {
105172
- const cur = prev.find(i => i.index === imageIndex);
105173
- const useAuto = shouldAutoRemakeAfterValidation(autoRemakeOnValidatorError, validationDisabled, validationResult, imageUrl, cur?.validatorTransportAutoRemakeDone);
105174
- scheduleValidatorAutoRemake = useAuto;
105175
- return prev.map(img => img.index === imageIndex
105176
- ? {
105177
- ...img,
105178
- checking: false,
105179
- checkFailed: validationResult.checkFailed ?? false,
105180
- checkStatus: validationResult.status,
105181
- checkResult: validationResult.result,
105182
- checkErrors: validationResult.errors,
105183
- customRegeneratePrompt: useAuto && validatorTransportRemake
105184
- ? ''
105185
- : formattedValidationErrors,
105186
- originalPrompt: img.originalPrompt || prompt,
105187
- productImageUrl: img.productImageUrl || productImage.url,
105188
- validatorTransportAutoRemakeDone: useAuto
105189
- ? true
105190
- : (img.validatorTransportAutoRemakeDone ?? false)
105191
- }
105192
- : img);
105193
- });
105194
- });
105195
- if (scheduleValidatorAutoRemake) {
105196
- addLog(formatLogMessage('log', `🔄 Автопеределка с нуля изображения ${imageIndex} после ошибки валидатора (один раз)...`));
105197
- await handleRegenerateImageFresh({
105198
- index: imageIndex,
105199
- approach: approachLabel,
105200
- aspectRatio: ratio,
105201
- originalPrompt: prompt,
105202
- productImageUrl: productImage.url,
105203
- }, { fromAutoValidatorRemake: true });
105204
- }
105637
+ setCheckingImages(!validationDisabled);
105638
+ validationTasks.push(runValidationForGeneratedImage(imageIndex, imageUrl, prompt, approachName, approachLabel, ratio));
105205
105639
  return {
105206
105640
  index: imageIndex,
105207
105641
  imageUrl,
105208
105642
  success: true,
105643
+ verified: validationDisabled,
105209
105644
  approach: approachName,
105210
105645
  originalPrompt: prompt,
105211
105646
  productImageUrl: productImage.url
@@ -105229,6 +105664,7 @@ function App() {
105229
105664
  index: imageIndex,
105230
105665
  imageUrl: null,
105231
105666
  success: false,
105667
+ verified: false,
105232
105668
  error: err,
105233
105669
  approach: approachName,
105234
105670
  originalPrompt: prompt,
@@ -105263,6 +105699,7 @@ function App() {
105263
105699
  index: idx,
105264
105700
  imageUrl: null,
105265
105701
  success: false,
105702
+ verified: false,
105266
105703
  error: new Error('Generation did not complete'),
105267
105704
  approach: tasks[i]?.approach.name || 'Unknown',
105268
105705
  originalPrompt: imagePrompts[i],
@@ -105318,6 +105755,24 @@ function App() {
105318
105755
  await Promise.all(retryWorkers);
105319
105756
  generationResults = Array.from(resultsMap.values()).sort((a, b) => a.index - b.index);
105320
105757
  }
105758
+ if (validationTasks.length > 0) {
105759
+ addLog(formatLogMessage('log', `🔍 Ожидание проверок: ${validationTasks.length} задач(и)...`));
105760
+ const validationResults = await Promise.all(validationTasks.map(task => task.catch((err) => {
105761
+ const msg = err?.message || String(err);
105762
+ addLog(formatLogMessage('error', `❌ Ошибка задачи проверки: ${msg}`));
105763
+ return { index: -1, verified: false };
105764
+ })));
105765
+ validationResults.forEach(result => {
105766
+ if (result.index < 0)
105767
+ return;
105768
+ const existingResult = resultsMap.get(result.index);
105769
+ if (existingResult) {
105770
+ resultsMap.set(result.index, { ...existingResult, verified: result.verified });
105771
+ }
105772
+ });
105773
+ generationResults = Array.from(resultsMap.values()).sort((a, b) => a.index - b.index);
105774
+ setCheckingImages(false);
105775
+ }
105321
105776
  const generationDuration = Date.now() - generationStartTime;
105322
105777
  const successfulImages = generationResults.filter(r => r.success);
105323
105778
  const finalFailedImages = generationResults.filter(r => !r.success);
@@ -105332,6 +105787,10 @@ function App() {
105332
105787
  addLog(formatLogMessage('log', `🎉 === Image generation process completed ===`));
105333
105788
  addLog(formatLogMessage('log', `⏱️ Total time: ${overallDuration}ms (${(overallDuration / 1000).toFixed(2)}s)`));
105334
105789
  addLog(formatLogMessage('log', `✅ Successfully generated ${successfulImages.length}/${imagePrompts.length} images`));
105790
+ if (imagePrompts.length > 0 &&
105791
+ generationResults.every(r => r.success && r.verified)) {
105792
+ void sendTelegramNotification('Docs Combiner: все изображения сгенерированы и проверены.');
105793
+ }
105335
105794
  // Stop generating state to hide backdrop and show images
105336
105795
  setGeneratingImages(false);
105337
105796
  setCheckingImages(false);
@@ -105345,10 +105804,12 @@ function App() {
105345
105804
  }
105346
105805
  finally {
105347
105806
  setGeneratingImages(false);
105807
+ setCheckingImages(false);
105348
105808
  }
105349
105809
  }
105350
105810
  catch (err) {
105351
105811
  setGeneratingImages(false);
105812
+ setCheckingImages(false);
105352
105813
  logToTerminal('error', '❌ Error:', err?.message || err);
105353
105814
  }
105354
105815
  };
@@ -105543,16 +106004,30 @@ ${imageData.originalPrompt}
105543
106004
  // Run validation on the new image (skip if disabled)
105544
106005
  let validationResult;
105545
106006
  if (validationDisabled) {
105546
- validationResult = { status: 'ok', result: 'Проверка отключена', errors: [] };
106007
+ validationResult = { status: 'ok', result: 'Проверка отключена', errors: [], checkFailed: false };
105547
106008
  }
105548
106009
  else {
105549
106010
  addLog(formatLogMessage('log', `🔍 Проверка переделанного изображения ${imageData.index}...`));
105550
- validationResult = await validateCreativeImage(newImageUrl, generateProduct, generateGeo, addLog, imageData.approach, imageData.productImageUrl);
106011
+ try {
106012
+ const res = await validateCreativeImage(newImageUrl, generateProduct, generateGeo, addLog, imageData.approach, imageData.productImageUrl);
106013
+ validationResult = { ...res, checkFailed: false };
106014
+ }
106015
+ catch (validationErr) {
106016
+ const msg = validationErr?.message || String(validationErr);
106017
+ addLog(formatLogMessage('error', `❌ Ошибка проверки переделанного изображения ${imageData.index}: ${msg}`));
106018
+ validationResult = {
106019
+ status: 'needs_rebuild',
106020
+ result: `Ошибка проверки: ${msg}`,
106021
+ errors: [msg],
106022
+ checkFailed: true,
106023
+ };
106024
+ }
105551
106025
  }
105552
106026
  // Update with validation result (+ одна автопеределка при needs_rebuild с замечаниями, если включено)
105553
106027
  const outcomeForAuto = {
105554
106028
  status: validationResult.status,
105555
106029
  errors: validationResult.errors,
106030
+ checkFailed: validationResult.checkFailed,
105556
106031
  };
105557
106032
  const formattedRegenErrors = formatValidationErrorsForRegeneratePrompt(validationResult.errors);
105558
106033
  const regenTransportRemake = outcomeForAuto.checkFailed === true;
@@ -105566,6 +106041,7 @@ ${imageData.originalPrompt}
105566
106041
  ? {
105567
106042
  ...img,
105568
106043
  checking: false,
106044
+ checkFailed: validationResult.checkFailed ?? false,
105569
106045
  checkStatus: validationResult.status,
105570
106046
  checkResult: validationResult.result,
105571
106047
  checkErrors: validationResult.errors,
@@ -105587,8 +106063,26 @@ ${imageData.originalPrompt}
105587
106063
  aspectRatio: imageData.aspectRatio,
105588
106064
  originalPrompt: imageData.originalPrompt,
105589
106065
  productImageUrl: imageData.productImageUrl,
106066
+ creoApproachUiNumber: currentImageData?.creoApproachUiNumber,
105590
106067
  }, { fromAutoValidatorRemake: true });
105591
106068
  }
106069
+ if (!scheduleAfterRegenValidation &&
106070
+ shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult)) {
106071
+ const creoNum = currentImageData?.creoApproachUiNumber ??
106072
+ generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber ??
106073
+ 1;
106074
+ await creoAutoUploadAfterValidatorOkRef.current({
106075
+ imageData: {
106076
+ index: imageData.index,
106077
+ imageUrl: updatedImageUrl,
106078
+ approach: imageData.approach,
106079
+ creoApproachUiNumber: creoNum,
106080
+ aspectRatio: imageData.aspectRatio,
106081
+ },
106082
+ folderId: regenFolderId,
106083
+ validationResult,
106084
+ });
106085
+ }
105592
106086
  const statusEmoji = validationResult.status === 'ok' ? '✅' : '❌';
105593
106087
  addLog(formatLogMessage('log', `${statusEmoji} Переделанное изображение ${imageData.index}: ${validationResult.status === 'ok' ? 'OK' : 'НУЖНА ПЕРЕСБОРКА'}`));
105594
106088
  if (validationResult.errors.length > 0) {
@@ -105621,12 +106115,12 @@ ${imageData.originalPrompt}
105621
106115
  const handleRegenerateImageFresh = async (imageData, opts) => {
105622
106116
  if (!imageData.originalPrompt || !imageData.productImageUrl) {
105623
106117
  alert('Не удалось найти оригинальный промпт или изображение продукта для переделки');
105624
- return;
106118
+ return { verified: false };
105625
106119
  }
105626
106120
  const freshFolderId = extractFolderId(driveFolderUrl);
105627
106121
  if (!freshFolderId) {
105628
106122
  alert('Укажите корректный URL папки оффера на Google Drive');
105629
- return;
106123
+ return { verified: false };
105630
106124
  }
105631
106125
  const addLog = (msg) => {
105632
106126
  setImagesGenerationLogs(prev => [...prev, msg]);
@@ -105636,12 +106130,12 @@ ${imageData.originalPrompt}
105636
106130
  const freshTok = await getValidAccessToken();
105637
106131
  if (!freshTok) {
105638
106132
  alert('Please log in with Google first');
105639
- return;
106133
+ return { verified: false };
105640
106134
  }
105641
106135
  const freshPub = await verifyOfferFolderHasAnyoneLinkForImageGen(freshTok, freshFolderId);
105642
106136
  if (!freshPub.ok) {
105643
106137
  alert(freshPub.message);
105644
- return;
106138
+ return { verified: false };
105645
106139
  }
105646
106140
  // Mark as regenerating (show overlay timer) - clear old image URL immediately to force re-render
105647
106141
  setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
@@ -105699,15 +106193,29 @@ ${imageData.originalPrompt}
105699
106193
  // Validate new image (skip if disabled)
105700
106194
  let validationResult;
105701
106195
  if (validationDisabled) {
105702
- validationResult = { status: 'ok', result: 'Проверка отключена', errors: [] };
106196
+ validationResult = { status: 'ok', result: 'Проверка отключена', errors: [], checkFailed: false };
105703
106197
  }
105704
106198
  else {
105705
106199
  addLog(formatLogMessage('log', `🔍 Проверка изображения ${imageData.index} (с нуля)...`));
105706
- validationResult = await validateCreativeImage(newImageUrl, generateProduct, generateGeo, addLog, imageData.approach, imageData.productImageUrl);
106200
+ try {
106201
+ const res = await validateCreativeImage(newImageUrl, generateProduct, generateGeo, addLog, imageData.approach, imageData.productImageUrl);
106202
+ validationResult = { ...res, checkFailed: false };
106203
+ }
106204
+ catch (validationErr) {
106205
+ const msg = validationErr?.message || String(validationErr);
106206
+ addLog(formatLogMessage('error', `❌ Ошибка проверки изображения ${imageData.index} (с нуля): ${msg}`));
106207
+ validationResult = {
106208
+ status: 'needs_rebuild',
106209
+ result: `Ошибка проверки: ${msg}`,
106210
+ errors: [msg],
106211
+ checkFailed: true,
106212
+ };
106213
+ }
105707
106214
  }
105708
106215
  const outcomeFresh = {
105709
106216
  status: validationResult.status,
105710
106217
  errors: validationResult.errors,
106218
+ checkFailed: validationResult.checkFailed,
105711
106219
  };
105712
106220
  const formattedFreshErrors = formatValidationErrorsForRegeneratePrompt(validationResult.errors);
105713
106221
  const freshTransportRemake = outcomeFresh.checkFailed === true;
@@ -105721,6 +106229,7 @@ ${imageData.originalPrompt}
105721
106229
  ? {
105722
106230
  ...img,
105723
106231
  checking: false,
106232
+ checkFailed: validationResult.checkFailed ?? false,
105724
106233
  checkStatus: validationResult.status,
105725
106234
  checkResult: validationResult.result,
105726
106235
  checkErrors: validationResult.errors,
@@ -105736,14 +106245,34 @@ ${imageData.originalPrompt}
105736
106245
  });
105737
106246
  if (scheduleAfterFreshValidation && imageData.originalPrompt && imageData.productImageUrl) {
105738
106247
  addLog(formatLogMessage('log', `🔄 Автопеределка с нуля изображения ${imageData.index} после ошибки валидатора (один раз)...`));
105739
- await handleRegenerateImageFresh({
106248
+ return await handleRegenerateImageFresh({
105740
106249
  index: imageData.index,
105741
106250
  approach: imageData.approach,
105742
106251
  aspectRatio: imageData.aspectRatio,
105743
106252
  originalPrompt: imageData.originalPrompt,
105744
106253
  productImageUrl: imageData.productImageUrl,
106254
+ creoApproachUiNumber: imageData.creoApproachUiNumber,
105745
106255
  }, { fromAutoValidatorRemake: true });
105746
106256
  }
106257
+ const creoApproachUiNumberFresh = imageData.creoApproachUiNumber ??
106258
+ generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber ??
106259
+ 1;
106260
+ if (shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult)) {
106261
+ await creoAutoUploadAfterValidatorOkRef.current({
106262
+ imageData: {
106263
+ index: imageData.index,
106264
+ imageUrl: updatedImageUrl,
106265
+ approach: imageData.approach,
106266
+ creoApproachUiNumber: creoApproachUiNumberFresh,
106267
+ aspectRatio: imageData.aspectRatio,
106268
+ },
106269
+ folderId: freshFolderId,
106270
+ validationResult,
106271
+ });
106272
+ }
106273
+ return {
106274
+ verified: validationDisabled || validationResult.status === 'ok',
106275
+ };
105747
106276
  }
105748
106277
  catch (err) {
105749
106278
  addLog(formatLogMessage('error', `❌ Ошибка при переделке заново изображения ${imageData.index}: ${err.message}`));
@@ -105760,6 +106289,7 @@ ${imageData.originalPrompt}
105760
106289
  }
105761
106290
  : img));
105762
106291
  alert('Ошибка при переделке заново: ' + err.message);
106292
+ return { verified: false };
105763
106293
  }
105764
106294
  };
105765
106295
  const handleRetryCheck = async (imageData) => {
@@ -105829,6 +106359,8 @@ ${imageData.originalPrompt}
105829
106359
  aspectRatio: imageData.aspectRatio,
105830
106360
  originalPrompt: imageData.originalPrompt,
105831
106361
  productImageUrl: imageData.productImageUrl,
106362
+ creoApproachUiNumber: imageData.creoApproachUiNumber ??
106363
+ generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber,
105832
106364
  }, { fromAutoValidatorRemake: true });
105833
106365
  }
105834
106366
  return;
@@ -105869,8 +106401,30 @@ ${imageData.originalPrompt}
105869
106401
  aspectRatio: imageData.aspectRatio,
105870
106402
  originalPrompt: imageData.originalPrompt,
105871
106403
  productImageUrl: imageData.productImageUrl,
106404
+ creoApproachUiNumber: imageData.creoApproachUiNumber ??
106405
+ generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber,
105872
106406
  }, { fromAutoValidatorRemake: true });
105873
106407
  }
106408
+ if (!scheduleValidatorAutoRemakeRetry &&
106409
+ shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, validationResult)) {
106410
+ const retryFid = extractFolderId(driveFolderUrl);
106411
+ if (retryFid && imageData.imageUrl) {
106412
+ const creoNum = imageData.creoApproachUiNumber ??
106413
+ generatedImagesData.find(img => img.index === imageData.index)?.creoApproachUiNumber ??
106414
+ 1;
106415
+ await creoAutoUploadAfterValidatorOkRef.current({
106416
+ imageData: {
106417
+ index: imageData.index,
106418
+ imageUrl: imageData.imageUrl,
106419
+ approach: imageData.approach,
106420
+ creoApproachUiNumber: creoNum,
106421
+ aspectRatio: imageData.aspectRatio,
106422
+ },
106423
+ folderId: retryFid,
106424
+ validationResult,
106425
+ });
106426
+ }
106427
+ }
105874
106428
  const statusEmoji = validationResult.status === 'ok' ? '✅' : '❌';
105875
106429
  addLog(formatLogMessage('log', `${statusEmoji} Повторная проверка изображения ${imageData.index}: ${validationResult.status === 'ok' ? 'OK' : 'НУЖНА ПЕРЕСБОРКА'}`));
105876
106430
  };
@@ -105913,7 +106467,15 @@ ${imageData.originalPrompt}
105913
106467
  : img));
105914
106468
  }
105915
106469
  };
105916
- const handleUploadAllImages = async () => {
106470
+ creoAutoUploadAfterValidatorOkRef.current = async (args) => {
106471
+ if (!shouldUploadCreoAfterValidatorOk(uploadAfterValidatorOk, validationDisabled, args.validationResult)) {
106472
+ return;
106473
+ }
106474
+ if (!args.folderId?.trim() || !args.imageData.imageUrl?.trim())
106475
+ return;
106476
+ await handleUploadImage(args.imageData, args.folderId);
106477
+ };
106478
+ const handleUploadAllImages = async (opts) => {
105917
106479
  if (!driveFolderUrl.trim()) {
105918
106480
  alert('Please fill in Google Drive Folder URL');
105919
106481
  return;
@@ -105923,9 +106485,11 @@ ${imageData.originalPrompt}
105923
106485
  alert('Invalid Google Drive Folder URL');
105924
106486
  return;
105925
106487
  }
105926
- const notUploaded = generatedImagesData.filter(img => !img.uploaded && img.imageUrl);
106488
+ const notUploaded = opts?.correctOnly ? pendingValidatorOkDriveUploadCreos : pendingDriveUploadCreos;
105927
106489
  if (notUploaded.length === 0) {
105928
- alert('All images are already uploaded');
106490
+ alert(opts?.correctOnly
106491
+ ? 'Нет незагруженных крео с успешной проверкой валидатором (зелёная рамка, «Проверка пройдена»).'
106492
+ : 'All images are already uploaded');
105929
106493
  return;
105930
106494
  }
105931
106495
  setUploadingImages(true);
@@ -105938,7 +106502,9 @@ ${imageData.originalPrompt}
105938
106502
  ? { ...img, uploading: true, uploadStartTime: Date.now() }
105939
106503
  : img));
105940
106504
  try {
105941
- addLog(formatLogMessage('log', `📤 Uploading ${notUploaded.length} image(s) to Drive (parallel)...`));
106505
+ addLog(formatLogMessage('log', opts?.correctOnly
106506
+ ? `📤 Uploading ${notUploaded.length} image(s) with validator OK to Drive (parallel)...`
106507
+ : `📤 Uploading ${notUploaded.length} image(s) to Drive (parallel)...`));
105942
106508
  const results = await Promise.allSettled(notUploaded.map((imageData) => {
105943
106509
  const uploadAspect = imageData.aspectRatio ?? (imageAspectRatio === '2:3' ? '2:3' : '1:1');
105944
106510
  const filename = creativeImageUploadFilename(imageData.creoApproachUiNumber, uploadAspect);
@@ -106106,6 +106672,19 @@ ${imageData.originalPrompt}
106106
106672
  alert('Не удалось прочитать буфер обмена. Разрешите доступ к буферу в браузере или вставьте ссылку вручную (Ctrl+V / Cmd+V).');
106107
106673
  }
106108
106674
  };
106675
+ const handlePasteFlexcardApiKey = async () => {
106676
+ try {
106677
+ const text = (await navigator.clipboard.readText()).trim();
106678
+ if (!text) {
106679
+ alert('Буфер обмена пуст.');
106680
+ return;
106681
+ }
106682
+ handleFlexcardApiKeyChange(text);
106683
+ }
106684
+ catch {
106685
+ alert('Не удалось прочитать буфер обмена. Разрешите доступ к буферу в браузере или вставьте ключ вручную (Ctrl+V / Cmd+V).');
106686
+ }
106687
+ };
106109
106688
  const handleLinkPaste = (e) => {
106110
106689
  e.preventDefault();
106111
106690
  const pasted = e.clipboardData.getData('text/plain');
@@ -106325,8 +106904,8 @@ ${imageData.originalPrompt}
106325
106904
  catalogUrlCreoApproachParam,
106326
106905
  catalogUrlImageAspectParam,
106327
106906
  catalogLinkExtraMacros,
106328
- selectedPairApproaches: (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.getSelectedPairApproaches)(),
106329
- imageApproachCounts: (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.getImageApproachCounts)(),
106907
+ selectedPairApproaches: (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getSelectedPairApproaches)(),
106908
+ imageApproachCounts: (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getImageApproachCounts)(),
106330
106909
  savedAt: new Date().toISOString()
106331
106910
  };
106332
106911
  const jsonContent = JSON.stringify(dataToSave, null, 2);
@@ -106400,137 +106979,182 @@ ${imageData.originalPrompt}
106400
106979
  };
106401
106980
  // Load generated content from Google Drive
106402
106981
  const loadGeneratedContentFromDrive = async (folderId) => {
106403
- logToTerminal('log', '[Load Content] Starting load from Google Drive, folderId:', folderId);
106404
- const validToken = await getValidAccessToken();
106405
- if (!validToken) {
106406
- logToTerminal('warn', '[Load Content] No valid token, skipping load');
106407
- setDriveFilesFound(prev => ({ ...prev, content: false }));
106408
- return { found: false };
106409
- }
106410
- // 1) Корень папки проекта; 2) иначе legacy: папка env (без создания env)
106411
- let fileId = await findSettingsFileInFolder(folderId);
106412
- if (fileId) {
106413
- logToTerminal('log', '[Load Content] Found settings in project root');
106414
- }
106415
- else {
106416
- const envIds = await findEnvFolderIds(folderId);
106417
- for (const envFolderId of envIds) {
106418
- const id = await findSettingsFileInFolder(envFolderId);
106419
- if (id) {
106420
- fileId = id;
106421
- logToTerminal('log', '[Load Content] Found settings in legacy env folder:', envFolderId);
106422
- break;
106982
+ try {
106983
+ logToTerminal('log', '[Load Content] Starting load from Google Drive, folderId:', folderId);
106984
+ const validToken = await getValidAccessToken();
106985
+ if (!validToken) {
106986
+ logToTerminal('warn', '[Load Content] No valid token, skipping load');
106987
+ setDriveFilesFound(prev => ({ ...prev, content: false }));
106988
+ return { found: false };
106989
+ }
106990
+ // 1) Корень папки проекта; 2) иначе legacy: папка env (без создания env)
106991
+ let fileId = await findSettingsFileInFolder(folderId);
106992
+ if (fileId) {
106993
+ logToTerminal('log', '[Load Content] Found settings in project root');
106994
+ }
106995
+ else {
106996
+ const envIds = await findEnvFolderIds(folderId);
106997
+ for (const envFolderId of envIds) {
106998
+ const id = await findSettingsFileInFolder(envFolderId);
106999
+ if (id) {
107000
+ fileId = id;
107001
+ logToTerminal('log', '[Load Content] Found settings in legacy env folder:', envFolderId);
107002
+ break;
107003
+ }
106423
107004
  }
106424
107005
  }
106425
- }
106426
- if (!fileId) {
106427
- logToTerminal('log', `[Load Content] No settings file (${PROJECT_SETTINGS_FILENAME} or ${LEGACY_PROJECT_SETTINGS_FILENAME}) in root or env`);
106428
- setDriveFilesFound(prev => ({ ...prev, content: false }));
106429
- return { found: false };
106430
- }
106431
- setDriveFilesFound(prev => ({ ...prev, content: true }));
106432
- logToTerminal('log', '[Load Content] File found, id:', fileId);
106433
- // Download file content
106434
- const downloadUrl = `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media`;
106435
- const downloadResponse = await fetch(downloadUrl, {
106436
- headers: {
106437
- 'Authorization': `Bearer ${validToken}`
107006
+ if (!fileId) {
107007
+ logToTerminal('log', `[Load Content] No settings file (${PROJECT_SETTINGS_FILENAME} or ${LEGACY_PROJECT_SETTINGS_FILENAME}) in root or env`);
107008
+ setDriveFilesFound(prev => ({ ...prev, content: false }));
107009
+ return { found: false, noSettingsFile: true };
106438
107010
  }
106439
- });
106440
- if (!downloadResponse.ok) {
106441
- const errorText = await downloadResponse.text();
106442
- logToTerminal('warn', '[Load Content] Download failed, status:', downloadResponse.status, 'error:', errorText);
106443
- setDriveFilesFound(prev => ({ ...prev, content: false }));
106444
- return { found: false };
106445
- }
106446
- const jsonContent = await downloadResponse.text();
106447
- logToTerminal('log', '[Load Content] File downloaded, length:', jsonContent.length);
106448
- try {
106449
- const loadedData = JSON.parse(jsonContent);
106450
- logToTerminal('log', '[Load Content] Parsed settings');
106451
- // Titles and texts are not loaded from Drive (no longer saved there)
106452
- // Load AI Generation Settings
106453
- if (loadedData.aiGenerationSettings) {
106454
- logToTerminal('log', '[Load Content] Loading AI Generation Settings');
106455
- const settings = loadedData.aiGenerationSettings;
106456
- if (settings.generateProduct) {
106457
- setGenerateProduct(settings.generateProduct);
106458
- logToTerminal('log', '[Load Content] Loaded generateProduct:', settings.generateProduct);
107011
+ setDriveFilesFound(prev => ({ ...prev, content: true }));
107012
+ logToTerminal('log', '[Load Content] File found, id:', fileId);
107013
+ // Download file content
107014
+ const downloadUrl = `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media`;
107015
+ const downloadResponse = await fetch(downloadUrl, {
107016
+ headers: {
107017
+ 'Authorization': `Bearer ${validToken}`
107018
+ }
107019
+ });
107020
+ if (!downloadResponse.ok) {
107021
+ const errorText = await downloadResponse.text();
107022
+ logToTerminal('warn', '[Load Content] Download failed, status:', downloadResponse.status, 'error:', errorText);
107023
+ setDriveFilesFound(prev => ({ ...prev, content: false }));
107024
+ return { found: false };
107025
+ }
107026
+ const jsonContent = await downloadResponse.text();
107027
+ logToTerminal('log', '[Load Content] File downloaded, length:', jsonContent.length);
107028
+ try {
107029
+ const loadedData = JSON.parse(jsonContent);
107030
+ logToTerminal('log', '[Load Content] Parsed settings');
107031
+ // Titles and texts are not loaded from Drive (no longer saved there)
107032
+ // Load AI Generation Settings
107033
+ if (loadedData.aiGenerationSettings) {
107034
+ logToTerminal('log', '[Load Content] Loading AI Generation Settings');
107035
+ const settings = loadedData.aiGenerationSettings;
107036
+ if (settings.generateProduct) {
107037
+ setGenerateProduct(settings.generateProduct);
107038
+ logToTerminal('log', '[Load Content] Loaded generateProduct:', settings.generateProduct);
107039
+ }
107040
+ if (settings.generateGeo) {
107041
+ setGenerateGeo(settings.generateGeo);
107042
+ logToTerminal('log', '[Load Content] Loaded generateGeo:', settings.generateGeo);
107043
+ }
107044
+ if (settings.generateAdditionalInfo !== undefined) {
107045
+ setGenerateAdditionalInfo(settings.generateAdditionalInfo);
107046
+ logToTerminal('log', '[Load Content] Loaded generateAdditionalInfo');
107047
+ }
107048
+ if (settings.generatePriceWithCurrency) {
107049
+ setGeneratePriceWithCurrency(settings.generatePriceWithCurrency);
107050
+ logToTerminal('log', '[Load Content] Loaded generatePriceWithCurrency:', settings.generatePriceWithCurrency);
107051
+ }
106459
107052
  }
106460
- if (settings.generateGeo) {
106461
- setGenerateGeo(settings.generateGeo);
106462
- logToTerminal('log', '[Load Content] Loaded generateGeo:', settings.generateGeo);
107053
+ // Load link (brand is auto-generated from product, geo, price)
107054
+ if (loadedData.link !== undefined) {
107055
+ setLink(loadedData.link || '');
107056
+ logToTerminal('log', '[Load Content] Loaded link:', loadedData.link || '(empty)');
106463
107057
  }
106464
- if (settings.generateAdditionalInfo !== undefined) {
106465
- setGenerateAdditionalInfo(settings.generateAdditionalInfo);
106466
- logToTerminal('log', '[Load Content] Loaded generateAdditionalInfo');
107058
+ if (typeof loadedData.catalogUrlIncludeTextApproach === 'boolean') {
107059
+ setCatalogUrlIncludeTextApproach(loadedData.catalogUrlIncludeTextApproach);
106467
107060
  }
106468
- if (settings.generatePriceWithCurrency) {
106469
- setGeneratePriceWithCurrency(settings.generatePriceWithCurrency);
106470
- logToTerminal('log', '[Load Content] Loaded generatePriceWithCurrency:', settings.generatePriceWithCurrency);
107061
+ if (typeof loadedData.catalogUrlIncludeCreoApproach === 'boolean') {
107062
+ setCatalogUrlIncludeCreoApproach(loadedData.catalogUrlIncludeCreoApproach);
106471
107063
  }
107064
+ if (typeof loadedData.catalogUrlTextApproachParam === 'string' && loadedData.catalogUrlTextApproachParam.trim()) {
107065
+ setCatalogUrlTextApproachParam(loadedData.catalogUrlTextApproachParam.trim());
107066
+ }
107067
+ if (typeof loadedData.catalogUrlCreoApproachParam === 'string' && loadedData.catalogUrlCreoApproachParam.trim()) {
107068
+ setCatalogUrlCreoApproachParam(loadedData.catalogUrlCreoApproachParam.trim());
107069
+ }
107070
+ if (typeof loadedData.catalogUrlIncludeImageAspect === 'boolean') {
107071
+ setCatalogUrlIncludeImageAspect(loadedData.catalogUrlIncludeImageAspect);
107072
+ }
107073
+ if (typeof loadedData.catalogUrlImageAspectParam === 'string' && loadedData.catalogUrlImageAspectParam.trim()) {
107074
+ setCatalogUrlImageAspectParam(loadedData.catalogUrlImageAspectParam.trim());
107075
+ }
107076
+ if (typeof loadedData.catalogLinkExtraMacros === 'string') {
107077
+ setCatalogLinkExtraMacros(loadedData.catalogLinkExtraMacros);
107078
+ }
107079
+ else {
107080
+ setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_EXTRA_MACROS);
107081
+ }
107082
+ const parsedApproaches = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.parseApproachesFromDriveData)(loadedData);
107083
+ const currentPairs = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getSelectedPairApproaches)();
107084
+ const currentCounts = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.getImageApproachCounts)();
107085
+ const hasDrivePairs = parsedApproaches.pairs !== null;
107086
+ const hasDriveCounts = parsedApproaches.counts !== null;
107087
+ if (hasDrivePairs || hasDriveCounts) {
107088
+ const pairsDiffer = hasDrivePairs && !sortedPairIndicesEqual(parsedApproaches.pairs, currentPairs);
107089
+ const countsDiffer = hasDriveCounts && !imageApproachCountsEqual(parsedApproaches.counts, currentCounts);
107090
+ if (pairsDiffer || countsDiffer) {
107091
+ setApproachLoadChoice({
107092
+ savedPairs: parsedApproaches.pairs,
107093
+ savedCounts: parsedApproaches.counts,
107094
+ currentPairs,
107095
+ currentCounts,
107096
+ });
107097
+ logToTerminal('log', '[Load Content] Offer file contains approach settings — asking user to apply or keep current');
107098
+ }
107099
+ }
107100
+ logToTerminal('log', '[Load Content] Successfully loaded content');
107101
+ setDriveFilesFound(prev => ({ ...prev, content: false }));
107102
+ return { found: true };
106472
107103
  }
106473
- // Load link (brand is auto-generated from product, geo, price)
106474
- if (loadedData.link !== undefined) {
106475
- setLink(loadedData.link || '');
106476
- logToTerminal('log', '[Load Content] Loaded link:', loadedData.link || '(empty)');
106477
- }
106478
- if (typeof loadedData.catalogUrlIncludeTextApproach === 'boolean') {
106479
- setCatalogUrlIncludeTextApproach(loadedData.catalogUrlIncludeTextApproach);
106480
- }
106481
- if (typeof loadedData.catalogUrlIncludeCreoApproach === 'boolean') {
106482
- setCatalogUrlIncludeCreoApproach(loadedData.catalogUrlIncludeCreoApproach);
106483
- }
106484
- if (typeof loadedData.catalogUrlTextApproachParam === 'string' && loadedData.catalogUrlTextApproachParam.trim()) {
106485
- setCatalogUrlTextApproachParam(loadedData.catalogUrlTextApproachParam.trim());
106486
- }
106487
- if (typeof loadedData.catalogUrlCreoApproachParam === 'string' && loadedData.catalogUrlCreoApproachParam.trim()) {
106488
- setCatalogUrlCreoApproachParam(loadedData.catalogUrlCreoApproachParam.trim());
106489
- }
106490
- if (typeof loadedData.catalogUrlIncludeImageAspect === 'boolean') {
106491
- setCatalogUrlIncludeImageAspect(loadedData.catalogUrlIncludeImageAspect);
106492
- }
106493
- if (typeof loadedData.catalogUrlImageAspectParam === 'string' && loadedData.catalogUrlImageAspectParam.trim()) {
106494
- setCatalogUrlImageAspectParam(loadedData.catalogUrlImageAspectParam.trim());
107104
+ catch (err) {
107105
+ logToTerminal('error', '[Load Content] Failed to parse loaded content:', err);
107106
+ setDriveFilesFound(prev => ({ ...prev, content: false }));
107107
+ return { found: false };
106495
107108
  }
106496
- if (typeof loadedData.catalogLinkExtraMacros === 'string') {
106497
- setCatalogLinkExtraMacros(loadedData.catalogLinkExtraMacros);
107109
+ }
107110
+ catch (err) {
107111
+ logToTerminal('error', '[Load Content] Error loading settings from Drive:', err);
107112
+ setDriveFilesFound(prev => ({ ...prev, content: false }));
107113
+ return { found: false };
107114
+ }
107115
+ };
107116
+ const handleSettingsFileMissingDismissOk = () => {
107117
+ const id = settingsFileMissingDialog.folderId;
107118
+ if (id) {
107119
+ dismissedSettingsMissingForFolderRef.current.add(id);
107120
+ }
107121
+ setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
107122
+ };
107123
+ const handleSettingsFileMissingRetry = async () => {
107124
+ const folderId = settingsFileMissingDialog.folderId;
107125
+ if (!folderId)
107126
+ return;
107127
+ setSettingsFileMissingDialog(s => ({ ...s, retrying: true }));
107128
+ setLoadingContentFromDrive(true);
107129
+ try {
107130
+ await new Promise(r => {
107131
+ setTimeout(r, 500);
107132
+ });
107133
+ const result = await loadGeneratedContentFromDrive(folderId);
107134
+ if (result.found) {
107135
+ setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
106498
107136
  }
106499
107137
  else {
106500
- setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_EXTRA_MACROS);
106501
- }
106502
- const parsedApproaches = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.parseApproachesFromDriveData)(loadedData);
106503
- const currentPairs = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.getSelectedPairApproaches)();
106504
- const currentCounts = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.getImageApproachCounts)();
106505
- const hasDrivePairs = parsedApproaches.pairs !== null;
106506
- const hasDriveCounts = parsedApproaches.counts !== null;
106507
- if (hasDrivePairs || hasDriveCounts) {
106508
- const pairsDiffer = hasDrivePairs && !sortedPairIndicesEqual(parsedApproaches.pairs, currentPairs);
106509
- const countsDiffer = hasDriveCounts && !imageApproachCountsEqual(parsedApproaches.counts, currentCounts);
106510
- if (pairsDiffer || countsDiffer) {
106511
- setApproachLoadChoice({
106512
- savedPairs: parsedApproaches.pairs,
106513
- savedCounts: parsedApproaches.counts,
106514
- currentPairs,
106515
- currentCounts,
106516
- });
106517
- logToTerminal('log', '[Load Content] Offer file contains approach settings — asking user to apply or keep current');
107138
+ if (result.noSettingsFile) {
107139
+ setSettingsFileMissingDialog(s => ({ ...s, retrying: false }));
107140
+ }
107141
+ else {
107142
+ setSettingsFileMissingDialog({ open: false, folderId: null, retrying: false });
106518
107143
  }
106519
107144
  }
106520
- logToTerminal('log', '[Load Content] Successfully loaded content');
106521
- setDriveFilesFound(prev => ({ ...prev, content: false }));
106522
- return { found: true };
106523
107145
  }
106524
- catch (err) {
106525
- logToTerminal('error', '[Load Content] Failed to parse loaded content:', err);
106526
- setDriveFilesFound(prev => ({ ...prev, content: false }));
106527
- return { found: false };
107146
+ catch (e) {
107147
+ logToTerminal('error', '[Load Content] Retry after missing settings failed:', e);
107148
+ setSettingsFileMissingDialog(s => ({ ...s, retrying: false }));
107149
+ }
107150
+ finally {
107151
+ setLoadingContentFromDrive(false);
106528
107152
  }
106529
107153
  };
106530
107154
  const handleApproachLoadApplyFromFile = () => {
106531
107155
  if (!approachLoadChoice)
106532
107156
  return;
106533
- const applied = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.applyParsedApproachesFromDrive)(approachLoadChoice.savedPairs, approachLoadChoice.savedCounts);
107157
+ const applied = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.applyParsedApproachesFromDrive)(approachLoadChoice.savedPairs, approachLoadChoice.savedCounts);
106534
107158
  if (applied) {
106535
107159
  logToTerminal('log', '[Load Content] Applied approach settings from offer file (user choice)');
106536
107160
  }
@@ -106543,6 +107167,8 @@ ${imageData.originalPrompt}
106543
107167
  syncDriveAfterPromptSaveRef.current = () => {
106544
107168
  if (!driveFolderUrl || loadingContentFromDrive)
106545
107169
  return;
107170
+ if (settingsFileMissingDialog.open)
107171
+ return;
106546
107172
  const folderId = extractFolderId(driveFolderUrl);
106547
107173
  if (!folderId)
106548
107174
  return;
@@ -106558,8 +107184,8 @@ ${imageData.originalPrompt}
106558
107184
  };
106559
107185
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
106560
107186
  const listener = () => syncDriveAfterPromptSaveRef.current();
106561
- window.addEventListener(_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.PROMPT_OVERRIDES_SAVED_EVENT, listener);
106562
- return () => window.removeEventListener(_promptOverrides__WEBPACK_IMPORTED_MODULE_60__.PROMPT_OVERRIDES_SAVED_EVENT, listener);
107187
+ window.addEventListener(_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.PROMPT_OVERRIDES_SAVED_EVENT, listener);
107188
+ return () => window.removeEventListener(_promptOverrides__WEBPACK_IMPORTED_MODULE_63__.PROMPT_OVERRIDES_SAVED_EVENT, listener);
106563
107189
  }, []);
106564
107190
  const handleGenerate = async () => {
106565
107191
  if (!driveFolderUrl || !brand || !link) {
@@ -106660,8 +107286,8 @@ ${imageData.originalPrompt}
106660
107286
  }
106661
107287
  setGeneratedData(rows);
106662
107288
  // Create workbook
106663
- const wb = xlsx__WEBPACK_IMPORTED_MODULE_61__.utils.book_new();
106664
- const ws = xlsx__WEBPACK_IMPORTED_MODULE_61__.utils.aoa_to_sheet(rows);
107289
+ const wb = xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.book_new();
107290
+ const ws = xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.aoa_to_sheet(rows);
106665
107291
  // Set column widths (approximate pixel width / 7)
106666
107292
  ws['!cols'] = [
106667
107293
  { wch: 20 }, // id
@@ -106674,9 +107300,9 @@ ${imageData.originalPrompt}
106674
107300
  { wch: 40 }, // image_link
106675
107301
  { wch: 20 } // brand
106676
107302
  ];
106677
- xlsx__WEBPACK_IMPORTED_MODULE_61__.utils.book_append_sheet(wb, ws, "Products");
107303
+ xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.book_append_sheet(wb, ws, "Products");
106678
107304
  // Generate buffer
106679
- const wbout = xlsx__WEBPACK_IMPORTED_MODULE_61__.write(wb, { bookType: 'xlsx', type: 'array' });
107305
+ const wbout = xlsx__WEBPACK_IMPORTED_MODULE_66__.write(wb, { bookType: 'xlsx', type: 'array' });
106680
107306
  // Upload to Drive (имя файла по бренду)
106681
107307
  const dateStr = new Date().toISOString().split('T')[0];
106682
107308
  const fileName = `${brand}-${dateStr}.xlsx`;
@@ -106806,13 +107432,13 @@ ${imageData.originalPrompt}
106806
107432
  setTestLoading(true);
106807
107433
  try {
106808
107434
  // Create simple test workbook with structure
106809
- const wb = xlsx__WEBPACK_IMPORTED_MODULE_61__.utils.book_new();
107435
+ const wb = xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.book_new();
106810
107436
  const rows = [
106811
107437
  INSTRUCTION_ROW,
106812
107438
  ['id', 'title', 'description', 'availability', 'condition', 'price', 'link', 'image_link', 'brand'],
106813
107439
  ['test1', 'Test Title', 'Test Description', 'in stock', 'new', testPrice, 'http://test.com', 'http://test.com/img.jpg', 'TestBrand']
106814
107440
  ];
106815
- const ws = xlsx__WEBPACK_IMPORTED_MODULE_61__.utils.aoa_to_sheet(rows);
107441
+ const ws = xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.aoa_to_sheet(rows);
106816
107442
  // Set column widths
106817
107443
  ws['!cols'] = [
106818
107444
  { wch: 20 }, // id
@@ -106825,8 +107451,8 @@ ${imageData.originalPrompt}
106825
107451
  { wch: 40 }, // image_link
106826
107452
  { wch: 20 } // brand
106827
107453
  ];
106828
- xlsx__WEBPACK_IMPORTED_MODULE_61__.utils.book_append_sheet(wb, ws, "Test");
106829
- const wbout = xlsx__WEBPACK_IMPORTED_MODULE_61__.write(wb, { bookType: 'xlsx', type: 'array' });
107454
+ xlsx__WEBPACK_IMPORTED_MODULE_66__.utils.book_append_sheet(wb, ws, "Test");
107455
+ const wbout = xlsx__WEBPACK_IMPORTED_MODULE_66__.write(wb, { bookType: 'xlsx', type: 'array' });
106830
107456
  // Try to extract folder ID if available, otherwise upload to root
106831
107457
  const folderId = driveFolderUrl ? extractFolderId(driveFolderUrl) : undefined;
106832
107458
  const result = await uploadFileToDrive(wbout, 'test_table.xlsx', folderId || undefined);
@@ -106876,9 +107502,179 @@ ${imageData.originalPrompt}
106876
107502
  alert('Не удалось скопировать в буфер обмена');
106877
107503
  }
106878
107504
  };
107505
+ const syncUIFromImportedLocalStorage = (m) => {
107506
+ const g = (k) => m[k];
107507
+ const t = g('themeMode');
107508
+ if (t === 'dark' || t === 'light') {
107509
+ const isDark = t === 'dark';
107510
+ setDarkMode(isDark);
107511
+ applyThemeStyles(isDark);
107512
+ }
107513
+ if (g('selectedImageModelSquare'))
107514
+ setSelectedImageModelSquare(g('selectedImageModelSquare'));
107515
+ if (g('selectedImageModelRect'))
107516
+ setSelectedImageModelRect(g('selectedImageModelRect'));
107517
+ if (g('selectedValidationModel'))
107518
+ setSelectedValidationModel(g('selectedValidationModel'));
107519
+ if (g('selectedContentModel'))
107520
+ setSelectedContentModel(g('selectedContentModel'));
107521
+ if (g('selectedLandingModel'))
107522
+ setSelectedLandingModel(g('selectedLandingModel'));
107523
+ if (g('validationDisabled') !== undefined)
107524
+ setValidationDisabled(g('validationDisabled') === 'true');
107525
+ if (g('autoRemakeOnValidatorError') !== undefined) {
107526
+ setAutoRemakeOnValidatorError(g('autoRemakeOnValidatorError') === 'true');
107527
+ }
107528
+ if (g('uploadAfterValidatorOk') !== undefined) {
107529
+ setUploadAfterValidatorOk(g('uploadAfterValidatorOk') === 'true');
107530
+ }
107531
+ const ar = g('imageAspectRatio');
107532
+ if (ar === '1:1' || ar === '2:3' || ar === 'both')
107533
+ setImageAspectRatio(ar);
107534
+ else if (ar === '4:5' || ar === '9:16')
107535
+ setImageAspectRatio('2:3');
107536
+ if (g('cached_driveFolderUrl') !== undefined)
107537
+ setDriveFolderUrl(g('cached_driveFolderUrl'));
107538
+ if (g('cached_rootDriveFolderUrl') !== undefined)
107539
+ setRootDriveFolderUrl(g('cached_rootDriveFolderUrl'));
107540
+ };
107541
+ const handleSettingsExport = async () => {
107542
+ try {
107543
+ const api = getElectronAPI();
107544
+ let el = null;
107545
+ if (api?.loadConfig) {
107546
+ try {
107547
+ el = (await api.loadConfig());
107548
+ }
107549
+ catch {
107550
+ el = null;
107551
+ }
107552
+ }
107553
+ const bundle = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.buildSettingsBundle)(settingsExportFlags, el);
107554
+ const json = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.serializeBundle)(bundle);
107555
+ if (api?.saveFile) {
107556
+ const ok = await api.saveFile(json, 'docs-combiner-settings.json');
107557
+ if (!ok) {
107558
+ setSettingsBackupSnackbar({ open: true, message: 'Сохранение отменено', severity: 'error' });
107559
+ return;
107560
+ }
107561
+ }
107562
+ else {
107563
+ const blob = new Blob([json], { type: 'application/json' });
107564
+ const a = document.createElement('a');
107565
+ const url = URL.createObjectURL(blob);
107566
+ a.href = url;
107567
+ a.download = 'docs-combiner-settings.json';
107568
+ a.click();
107569
+ URL.revokeObjectURL(url);
107570
+ }
107571
+ setSettingsBackupSnackbar({ open: true, message: 'Настройки экспортированы в JSON', severity: 'success' });
107572
+ }
107573
+ catch (e) {
107574
+ setSettingsBackupSnackbar({
107575
+ open: true,
107576
+ message: e?.message || String(e),
107577
+ severity: 'error',
107578
+ });
107579
+ }
107580
+ };
107581
+ const handleSettingsImportFileChange = (e) => {
107582
+ const file = e.target.files?.[0];
107583
+ e.target.value = '';
107584
+ if (!file)
107585
+ return;
107586
+ const reader = new FileReader();
107587
+ reader.onload = () => {
107588
+ try {
107589
+ const text = String(reader.result || '');
107590
+ const bundle = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.parseSettingsBundleJson)(text);
107591
+ setSettingsImportBundle(bundle);
107592
+ const present = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.getPresentSections)(bundle);
107593
+ setSettingsImportFlags({
107594
+ promptOverrides: present.promptOverrides,
107595
+ localStorage: present.localStorage,
107596
+ electronConfig: present.electronConfig,
107597
+ });
107598
+ }
107599
+ catch (err) {
107600
+ setSettingsBackupSnackbar({
107601
+ open: true,
107602
+ message: err?.message || String(err),
107603
+ severity: 'error',
107604
+ });
107605
+ setSettingsImportBundle(null);
107606
+ setSettingsImportFlags(null);
107607
+ }
107608
+ };
107609
+ reader.onerror = () => {
107610
+ setSettingsBackupSnackbar({ open: true, message: 'Не удалось прочитать файл', severity: 'error' });
107611
+ };
107612
+ reader.readAsText(file);
107613
+ };
107614
+ const handleSettingsImportApply = async () => {
107615
+ if (!settingsImportBundle || !settingsImportFlags)
107616
+ return;
107617
+ const b = settingsImportBundle;
107618
+ const f = settingsImportFlags;
107619
+ let electronConfigSkipped = false;
107620
+ try {
107621
+ if (f.localStorage && b.localStorage && Object.keys(b.localStorage).length) {
107622
+ (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.applyLocalStorageFromBundle)(b, true);
107623
+ syncUIFromImportedLocalStorage(b.localStorage);
107624
+ }
107625
+ if (f.promptOverrides) {
107626
+ (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.applyPromptOverridesFromBundle)(b, true);
107627
+ }
107628
+ if (f.electronConfig && b.electronConfig && Object.keys(b.electronConfig).length) {
107629
+ const api = getElectronAPI();
107630
+ if (api?.loadConfig && api?.saveConfig) {
107631
+ const cur = (await api.loadConfig());
107632
+ const next = (0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.mergeElectronImport)(cur, b, true);
107633
+ await api.saveConfig(next);
107634
+ const ec = b.electronConfig;
107635
+ if (ec.clientId !== undefined)
107636
+ setClientId(String(ec.clientId));
107637
+ if (ec.clientSecret !== undefined)
107638
+ setClientSecret(String(ec.clientSecret));
107639
+ if (ec.openaiApiKey !== undefined)
107640
+ setOpenaiApiKey(String(ec.openaiApiKey));
107641
+ if (ec.flexcardApiKey !== undefined)
107642
+ setFlexcardApiKey(String(ec.flexcardApiKey));
107643
+ if (ec.telegramBotToken !== undefined)
107644
+ setTelegramBotToken(String(ec.telegramBotToken));
107645
+ if (ec.telegramChatId !== undefined)
107646
+ setTelegramChatId(String(ec.telegramChatId));
107647
+ if (ec.accessToken !== undefined)
107648
+ setAccessToken(String(ec.accessToken));
107649
+ if (ec.refreshToken !== undefined)
107650
+ setRefreshToken(String(ec.refreshToken));
107651
+ }
107652
+ else {
107653
+ electronConfigSkipped = true;
107654
+ }
107655
+ }
107656
+ setSettingsImportBundle(null);
107657
+ setSettingsImportFlags(null);
107658
+ setSettingsBackupDialogOpen(false);
107659
+ setSettingsBackupSnackbar({
107660
+ open: true,
107661
+ message: electronConfigSkipped
107662
+ ? 'Импорт применён. Блок OAuth / ключ OpenRouter / токены Google: только в десктопе (Electron).'
107663
+ : 'Импорт настроек применён',
107664
+ severity: 'success',
107665
+ });
107666
+ }
107667
+ catch (e) {
107668
+ setSettingsBackupSnackbar({
107669
+ open: true,
107670
+ message: e?.message || String(e),
107671
+ severity: 'error',
107672
+ });
107673
+ }
107674
+ };
106879
107675
  // Show lock screen if not unlocked
106880
107676
  if (!unlocked) {
106881
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_38__["default"], { theme: theme },
107677
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_40__["default"], { theme: theme },
106882
107678
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null),
106883
107679
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { onClick: handleSecretClick, sx: {
106884
107680
  width: '100vw',
@@ -106918,81 +107714,108 @@ ${imageData.originalPrompt}
106918
107714
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("br", null),
106919
107715
  "Please contact system administrator"))));
106920
107716
  }
106921
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_38__["default"], { theme: theme },
107717
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_40__["default"], { theme: theme },
106922
107718
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null),
106923
107719
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { maxWidth: "lg", sx: { py: 4 } },
106924
107720
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 2 } },
106925
107721
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h4", component: "h1", sx: { fontWeight: 'bold', color: 'primary.main' } }, "Docs Combiner"),
106926
107722
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
106927
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { onClick: () => setPromptManagerOpen(true), color: "inherit", "aria-label": "manage prompts", sx: { mr: 1 } },
106928
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_57__["default"], null)),
106929
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { onClick: toggleTheme, color: "inherit", "aria-label": "toggle theme" }, darkMode ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_42__["default"], null)))),
106930
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { variant: "outlined", sx: { mb: 4 } },
106931
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], null,
106932
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { spacing: 3 },
107723
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0420\u0435\u0437\u0435\u0440\u0432\u043D\u0430\u044F \u043A\u043E\u043F\u0438\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A (\u044D\u043A\u0441\u043F\u043E\u0440\u0442 / \u0438\u043C\u043F\u043E\u0440\u0442)" },
107724
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { onClick: () => setSettingsBackupDialogOpen(true), color: "inherit", "aria-label": "\u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0430\u044F \u043A\u043E\u043F\u0438\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A", sx: { mr: 1 } },
107725
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_44__["default"], null))),
107726
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { onClick: () => setPromptManagerOpen(true), color: "inherit", "aria-label": "manage prompts", sx: { mr: 1 } },
107727
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_60__["default"], null)),
107728
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { onClick: toggleTheme, color: "inherit", "aria-label": "toggle theme" }, darkMode ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_45__["default"], null)))),
107729
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "file", ref: settingsImportFileInputRef, style: { display: 'none' }, accept: "application/json,.json", onChange: handleSettingsImportFileChange }),
107730
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { variant: "outlined", sx: { mb: 4 } },
107731
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], null,
107732
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 3 },
106933
107733
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
106934
107734
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", gutterBottom: true }, "Google Drive Authentication"),
106935
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { defaultExpanded: false },
106936
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_50__["default"], null) }, accessToken ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { sx: { display: 'flex', alignItems: 'center', color: 'success.main' } },
106937
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_44__["default"], { sx: { mr: 1 } }),
107735
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__["default"], { defaultExpanded: false },
107736
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_53__["default"], null) }, accessToken ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { sx: { display: 'flex', alignItems: 'center', color: 'success.main' } },
107737
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], { sx: { mr: 1 } }),
106938
107738
  " Logged In (Credentials Hidden)")) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { color: "text.secondary" }, "Credentials"))),
106939
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], null,
106940
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { spacing: 2 },
107739
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], null,
107740
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 2 },
106941
107741
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
106942
107742
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2", color: "text.secondary", gutterBottom: true }, "\u041A\u043E\u0440\u043D\u0435\u0432\u0430\u044F \u043F\u0430\u043F\u043A\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0430"),
106943
107743
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", sx: { mb: 1 } }, "\u0421\u0441\u044B\u043B\u043A\u0430 \u043D\u0430 \u043A\u043E\u0440\u043D\u0435\u0432\u0443\u044E \u043F\u0430\u043F\u043A\u0443 \u043D\u0430 Google \u0414\u0438\u0441\u043A\u0435 (\u0432\u043D\u0443\u0442\u0440\u0438 \u043D\u0435\u0451 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u043F\u0430\u043F\u043A\u0430 OFFERS)."),
106944
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "URL \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u043F\u0430\u043F\u043A\u0438 Google Drive", variant: "outlined", fullWidth: true, value: rootDriveFolderUrl, onChange: (e) => setRootDriveFolderUrl(e.target.value), placeholder: "https://drive.google.com/drive/folders/...", sx: { mb: 1 } }),
106945
- checkingRootFolder && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null,
107744
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "URL \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u043F\u0430\u043F\u043A\u0438 Google Drive", variant: "outlined", fullWidth: true, value: rootDriveFolderUrl, onChange: (e) => setRootDriveFolderUrl(e.target.value), placeholder: "https://drive.google.com/drive/folders/...", sx: { mb: 1 } }),
107745
+ checkingRootFolder && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null,
106946
107746
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { component: "span", sx: { display: 'inline-flex', alignItems: 'center', gap: 1 } },
106947
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 14 }),
107747
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 14 }),
106948
107748
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u043F\u0430\u043F\u043A\u0438 (OFFERS, \u0434\u043E\u0441\u0442\u0443\u043F)...")))),
106949
- drivePublicAccessWarning && extractFolderId(rootDriveFolderUrl) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "warning", sx: { mt: 1 } }, "\u041E\u0431\u0449\u0438\u0439 \u0434\u043E\u0441\u0442\u0443\u043F \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0432\u043A\u043B\u044E\u0447\u0451\u043D. \u0417\u0430\u043A\u0440\u043E\u0439\u0442\u0435 \u0435\u0433\u043E \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 Google \u0414\u0438\u0441\u043A\u0430 \u0438\u043B\u0438 \u0441\u043C\u0435\u043D\u0438\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u0438 \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0442\u0435\u0441\u044C \u0443\u0431\u0440\u0430\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.")),
106950
- !checkingRootFolder && rootFolderInfo && !rootFolderInfo.hasOffersFolder && extractFolderId(rootDriveFolderUrl) && (accessToken || refreshToken) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "error", sx: { mt: 1 } }, "\u0412 \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u043F\u0430\u043F\u043A\u0435 \u043D\u0435\u0442 \u043F\u043E\u0434\u043F\u0430\u043F\u043A\u0438 OFFERS. \u0421\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u0441 \u0438\u043C\u0435\u043D\u0435\u043C OFFERS (\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043D\u0435 \u0432\u0430\u0436\u0435\u043D) \u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443.")),
106951
- !checkingRootFolder && !rootFolderInfo && rootDriveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null, (accessToken || refreshToken)
107749
+ drivePublicAccessWarning && extractFolderId(rootDriveFolderUrl) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "warning", sx: { mt: 1 } }, "\u041E\u0431\u0449\u0438\u0439 \u0434\u043E\u0441\u0442\u0443\u043F \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0432\u043A\u043B\u044E\u0447\u0451\u043D. \u0417\u0430\u043A\u0440\u043E\u0439\u0442\u0435 \u0435\u0433\u043E \u0432\u0440\u0443\u0447\u043D\u0443\u044E \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u0434\u043E\u0441\u0442\u0443\u043F\u0430 Google \u0414\u0438\u0441\u043A\u0430 \u0438\u043B\u0438 \u0441\u043C\u0435\u043D\u0438\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u0438 \u0441\u043E\u0433\u043B\u0430\u0441\u0438\u0442\u0435\u0441\u044C \u0443\u0431\u0440\u0430\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438.")),
107750
+ !checkingRootFolder && rootFolderInfo && !rootFolderInfo.hasOffersFolder && extractFolderId(rootDriveFolderUrl) && (accessToken || refreshToken) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0412 \u043A\u043E\u0440\u043D\u0435\u0432\u043E\u0439 \u043F\u0430\u043F\u043A\u0435 \u043D\u0435\u0442 \u043F\u043E\u0434\u043F\u0430\u043F\u043A\u0438 OFFERS. \u0421\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 \u0441 \u0438\u043C\u0435\u043D\u0435\u043C OFFERS (\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043D\u0435 \u0432\u0430\u0436\u0435\u043D) \u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443.")),
107751
+ !checkingRootFolder && !rootFolderInfo && rootDriveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, (accessToken || refreshToken)
106952
107752
  ? 'Введите корректную ссылку на корневую папку Google Drive'
106953
107753
  : 'Войдите в Google, чтобы проверить корневую папку и подпапку OFFERS'))),
106954
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "Client ID", variant: "outlined", fullWidth: true, value: clientId, onChange: (e) => handleClientIdChange(e.target.value), helperText: "From Google Cloud Console (OAuth 2.0 Client ID)" }),
106955
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "Client Secret", variant: "outlined", fullWidth: true, value: clientSecret, onChange: (e) => handleClientSecretChange(e.target.value) }),
106956
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], null),
106957
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "OpenRouter API Key", variant: "outlined", fullWidth: true, value: openaiApiKey, onChange: (e) => handleOpenaiApiKeyChange(e.target.value), helperText: "Required for AI generation (images and text). Your key is stored locally. Get your key at openrouter.ai" })))),
106958
- openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 2, mt: 2 } },
106959
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_39__["default"], { color: openRouterAccountBalance !== null ? 'primary' : 'disabled' }),
106960
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: openRouterAccountBalance !== null ? 'text.primary' : 'text.secondary' },
106961
- "\u0411\u0430\u043B\u0430\u043D\u0441: ",
106962
- openRouterBalanceLoading ? 'Loading...' : (openRouterAccountBalance !== null ? `$${openRouterAccountBalance.toFixed(2)}` : 'N/A')),
106963
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u2022"),
106964
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: openRouterBalance !== null ? 'text.primary' : 'text.secondary' },
106965
- "\u041B\u0438\u043C\u0438\u0442 \u043A\u043B\u044E\u0447\u0430: ",
106966
- openRouterBalanceLoading ? 'Loading...' : (openRouterBalance === -1 ? 'Без лимита' : (openRouterBalance !== null ? `${openRouterBalance.toFixed(4)}` : 'N/A'))))),
106967
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mt: 2 }, flexWrap: "wrap", useFlexGap: true },
106968
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", color: accessToken ? "success" : "primary", onClick: handleLogin, disabled: authLoading || !clientId || !clientSecret, startIcon: authLoading ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 20, color: "inherit" }) : (accessToken ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_44__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_52__["default"], null)), sx: { flexGrow: 1, minWidth: 200 } }, authLoading ? 'Logging in...' : (accessToken ? 'Logged In' : 'Login with Google')),
107754
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Client ID", variant: "outlined", fullWidth: true, value: clientId, onChange: (e) => handleClientIdChange(e.target.value), helperText: "From Google Cloud Console (OAuth 2.0 Client ID)" }),
107755
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Client Secret", variant: "outlined", fullWidth: true, value: clientSecret, onChange: (e) => handleClientSecretChange(e.target.value) }),
107756
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], null),
107757
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "OpenRouter API Key", variant: "outlined", fullWidth: true, value: openaiApiKey, onChange: (e) => handleOpenaiApiKeyChange(e.target.value), helperText: "Required for AI generation (images and text). Your key is stored locally. Get your key at openrouter.ai" }),
107758
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "FlexCard API Key", variant: "outlined", fullWidth: true, value: flexcardApiKey, onChange: (e) => handleFlexcardApiKeyChange(e.target.value), helperText: "\u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E: \u0431\u0430\u043B\u0430\u043D\u0441 \u043A\u043E\u0448\u0435\u043B\u044C\u043A\u043E\u0432 \u043D\u0430 flexcard.cards (\u0440\u0430\u0437\u0434\u0435\u043B Team \u2192 API). \u041A\u043B\u044E\u0447 \u0445\u0440\u0430\u043D\u0438\u0442\u0441\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u0432 config.", InputProps: {
107759
+ endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { position: "end" },
107760
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430" },
107761
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { edge: "end", "aria-label": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u043B\u044E\u0447 FlexCard \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430", onClick: () => void handlePasteFlexcardApiKey() },
107762
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_51__["default"], null))))),
107763
+ } }),
107764
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { flexWrap: 'nowrap', gap: 1 } },
107765
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Telegram bot token", size: "small", fullWidth: true, sx: { flex: 2, minWidth: 0 }, value: telegramBotToken, onChange: (e) => handleTelegramBotTokenChange(e.target.value), placeholder: "123456789:ABC...", autoComplete: "off" }),
107766
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Chat ID", size: "small", sx: { flex: 1, minWidth: 72, maxWidth: 200 }, value: telegramChatId, onChange: (e) => handleTelegramChatIdChange(e.target.value), placeholder: "-100\u2026", autoComplete: "off" }),
107767
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", size: "small", disabled: telegramTestSending || !telegramBotToken.trim() || !telegramChatId.trim(), onClick: () => void handleTelegramTestSend(), sx: { flexShrink: 0, whiteSpace: 'nowrap', minWidth: 'auto' } }, telegramTestSending ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 18, color: "inherit" })) : ('Тест'))),
107768
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { sx: { mt: 0 } }, "Telegram \u2014 \u0434\u043B\u044F \u0431\u0443\u0434\u0443\u0449\u0438\u0445 \u043E\u043F\u043E\u0432\u0435\u0449\u0435\u043D\u0438\u0439; \u0442\u0435\u0441\u0442 \u0448\u043B\u0451\u0442 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u0438\u0437 Electron (\u043E\u0431\u0445\u043E\u0434 CORS).")))),
107769
+ (openaiApiKey || flexcardApiKey.trim()) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 2, mt: 2, flexWrap: 'wrap' } },
107770
+ openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
107771
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_41__["default"], { color: openRouterAccountBalance !== null ? 'primary' : 'disabled' }),
107772
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: openRouterAccountBalance !== null ? 'text.primary' : 'text.secondary' },
107773
+ "OpenRouter \u2014 \u0431\u0430\u043B\u0430\u043D\u0441: ",
107774
+ openRouterBalanceLoading ? '…' : (openRouterAccountBalance !== null ? `$${openRouterAccountBalance.toFixed(2)}` : 'N/A')),
107775
+ (openRouterBalanceLoading || openRouterBalance !== -1) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
107776
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u2022"),
107777
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: openRouterBalance !== null ? 'text.primary' : 'text.secondary' },
107778
+ "\u043B\u0438\u043C\u0438\u0442 \u043A\u043B\u044E\u0447\u0430:",
107779
+ ' ',
107780
+ openRouterBalanceLoading ? '…' : openRouterBalance === null ? 'N/A' : `${openRouterBalance.toFixed(4)}`))))),
107781
+ openaiApiKey && flexcardApiKey.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u2022")),
107782
+ flexcardApiKey.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "span", variant: "body2", color: flexCardUsdTotal !== null ? 'text.primary' : 'text.secondary' },
107783
+ "flexcard",
107784
+ ' ',
107785
+ flexCardBalanceLoading
107786
+ ? '…'
107787
+ : flexCardUsdTotal === null
107788
+ ? 'N/A'
107789
+ : `$${flexCardUsdTotal.toFixed(2)}`)))),
107790
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mt: 2 }, flexWrap: "wrap", useFlexGap: true },
107791
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: accessToken ? "success" : "primary", onClick: handleLogin, disabled: authLoading || !clientId || !clientSecret, startIcon: authLoading ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20, color: "inherit" }) : (accessToken ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_55__["default"], null)), sx: { flexGrow: 1, minWidth: 200 } }, authLoading ? 'Logging in...' : (accessToken ? 'Logged In' : 'Login with Google')),
106969
107792
  authLoading && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
106970
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "outlined", color: "primary", onClick: () => void handleReopenAuthBrowser(), startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_55__["default"], null) }, "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0432\u0445\u043E\u0434\u0430 \u0441\u043D\u043E\u0432\u0430"),
106971
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "outlined", color: "inherit", onClick: () => void handleCancelPendingAuth(), startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_45__["default"], null) }, "\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0445\u043E\u0434"))),
106972
- accessToken && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "outlined", color: "error", onClick: handleLogout, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_53__["default"], null) }, "Logout")))),
106973
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { sx: { my: 2 } }),
107793
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", color: "primary", onClick: () => void handleReopenAuthBrowser(), startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_58__["default"], null) }, "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0432\u0445\u043E\u0434\u0430 \u0441\u043D\u043E\u0432\u0430"),
107794
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", color: "inherit", onClick: () => void handleCancelPendingAuth(), startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null) }, "\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0445\u043E\u0434"))),
107795
+ accessToken && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", color: "error", onClick: handleLogout, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_56__["default"], null) }, "Logout")))),
107796
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { sx: { my: 2 } }),
106974
107797
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
106975
107798
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", gutterBottom: true }, "Google Drive Folder"),
106976
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
107799
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
106977
107800
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flexGrow: 1 } },
106978
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "Google Drive Folder URL", variant: "outlined", fullWidth: true, value: driveFolderUrl, onChange: (e) => setDriveFolderUrl(e.target.value), placeholder: "https://drive.google.com/drive/folders/...", InputProps: {
107801
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Google Drive Folder URL", variant: "outlined", fullWidth: true, value: driveFolderUrl, onChange: (e) => setDriveFolderUrl(e.target.value), placeholder: "https://drive.google.com/drive/folders/...", InputProps: {
106979
107802
  endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { position: "end" },
106980
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430" },
106981
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { edge: "end", "aria-label": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u043F\u0430\u043F\u043A\u0443 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430", onClick: () => void handlePasteDriveFolderUrl() },
106982
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null)))))
107803
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430" },
107804
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { edge: "end", "aria-label": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u043F\u0430\u043F\u043A\u0443 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430", onClick: () => void handlePasteDriveFolderUrl() },
107805
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_51__["default"], null)))))
106983
107806
  } }),
106984
- checkingFolderFiles && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null,
107807
+ checkingFolderFiles && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null,
106985
107808
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { component: "span", sx: { display: 'inline-flex', alignItems: 'center', gap: 1 } },
106986
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 14 }),
107809
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 14 }),
106987
107810
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0444\u0430\u0439\u043B\u043E\u0432 \u0432 \u043F\u0430\u043F\u043A\u0435...")))),
106988
- !checkingFolderFiles && folderFilesInfo && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null,
107811
+ !checkingFolderFiles && folderFilesInfo && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null,
106989
107812
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { component: "span", sx: { display: 'block' } }, folderFilesInfo.hasProduct ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "span", sx: { color: 'success.main' } }, "\u2713 product.png/jpg/webp \u043D\u0430\u0439\u0434\u0435\u043D")) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "span", sx: { color: 'info.main' } }, "\u2139 product.png/jpg/webp \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u2014 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 \u043A\u043D\u043E\u043F\u043A\u0443 \u043D\u0438\u0436\u0435"))))),
106990
- !checkingFolderFiles && !folderFilesInfo && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null, (accessToken || refreshToken)
107813
+ !checkingFolderFiles && !folderFilesInfo && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, (accessToken || refreshToken)
106991
107814
  ? 'Введите корректную ссылку на папку Google Drive'
106992
107815
  : 'Войдите в Google, чтобы проверить файлы в папке'))))),
106993
- !driveFolderUrl.trim() ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "info", sx: { mt: 2 } },
107816
+ !driveFolderUrl.trim() ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "info", sx: { mt: 2 } },
106994
107817
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body1", sx: { fontWeight: 'bold', mb: 1 } }, "\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0430\u043F\u043A\u0443 Google Drive \u0434\u043B\u044F \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0435\u043D\u0438\u044F"),
106995
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u0414\u043B\u044F \u0440\u0430\u0431\u043E\u0442\u044B \u0441 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 \u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0443 Google Drive."))) : !extractFolderId(driveFolderUrl) ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "warning", sx: { mt: 2 } },
107818
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u0414\u043B\u044F \u0440\u0430\u0431\u043E\u0442\u044B \u0441 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 \u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0443\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0430\u043F\u043A\u0443 Google Drive."))) : !extractFolderId(driveFolderUrl) ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "warning", sx: { mt: 2 } },
106996
107819
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body1", sx: { fontWeight: 'bold', mb: 1 } }, "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u0443\u044E \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u043F\u0430\u043F\u043A\u0443"),
106997
107820
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u0421\u0441\u044B\u043B\u043A\u0430 \u0434\u043E\u043B\u0436\u043D\u0430 \u0431\u044B\u0442\u044C \u0432 \u0444\u043E\u0440\u043C\u0430\u0442\u0435: https://drive.google.com/drive/folders/..."))) : loadingContentFromDrive ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
106998
107821
  display: 'flex',
@@ -107008,132 +107831,136 @@ ${imageData.originalPrompt}
107008
107831
  ? 'rgba(25, 118, 210, 0.1)'
107009
107832
  : 'rgba(25, 118, 210, 0.05)'
107010
107833
  } },
107011
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 40, sx: { color: 'primary.main' } }),
107834
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
107012
107835
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body1", sx: { color: 'text.secondary', fontWeight: 'bold' } }, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u0434\u0430\u043D\u043D\u044B\u0445 \u0438\u0437 \u043F\u0430\u043F\u043A\u0438..."))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
107013
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
107014
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "Brand (Short ID)", variant: "outlined", sx: { flex: '0 0 320px', minWidth: 280 }, value: brand, InputProps: { readOnly: true }, placeholder: "\u0410\u0432\u0442\u043E: \u0442\u043E\u0432\u0430\u0440-\u0433\u0435\u043E-\u0446\u0435\u043D\u0430", helperText: "\u0410\u0432\u0442\u043E\u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0438\u0437 \u0442\u043E\u0432\u0430\u0440\u0430, \u0433\u0435\u043E \u0438 \u0446\u0435\u043D\u044B" }),
107836
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
107837
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Brand (Short ID)", variant: "outlined", sx: { flex: '0 0 320px', minWidth: 280 }, value: brand, InputProps: { readOnly: true }, placeholder: "\u0410\u0432\u0442\u043E: \u0442\u043E\u0432\u0430\u0440-\u0433\u0435\u043E-\u0446\u0435\u043D\u0430", helperText: "\u0410\u0432\u0442\u043E\u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0438\u0437 \u0442\u043E\u0432\u0430\u0440\u0430, \u0433\u0435\u043E \u0438 \u0446\u0435\u043D\u044B" }),
107015
107838
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flex: 1, minWidth: 0 } },
107016
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "Link", variant: "outlined", fullWidth: true, value: link, onChange: (e) => handleLinkChange(e.target.value), onBlur: handleLinkBlur, error: !!linkError, helperText: linkError, placeholder: "https://example.com/product/", inputRef: linkInputRef, InputProps: {
107839
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "Link", variant: "outlined", fullWidth: true, value: link, onChange: (e) => handleLinkChange(e.target.value), onBlur: handleLinkBlur, error: !!linkError, helperText: linkError, placeholder: "https://example.com/product/", inputRef: linkInputRef, InputProps: {
107017
107840
  onPaste: handleLinkPaste,
107018
107841
  endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { position: "end" },
107019
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430" },
107020
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { edge: "end", "aria-label": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430", onClick: () => void handlePasteProductLink() },
107021
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null)))))
107842
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043E\u0431\u043C\u0435\u043D\u0430" },
107843
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { edge: "end", "aria-label": "\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430", onClick: () => void handlePasteProductLink() },
107844
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_51__["default"], null)))))
107022
107845
  } }))),
107023
107846
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', gap: 1, alignItems: 'flex-start', mt: 1.5 } },
107024
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "\u0414\u043E\u043F. \u043C\u0430\u043A\u0440\u043E\u0441\u044B (\u043A\u0430\u0442\u0430\u043B\u043E\u0433)", variant: "outlined", size: "small", fullWidth: true, multiline: true, minRows: 2, value: catalogLinkExtraMacros, onChange: (e) => setCatalogLinkExtraMacros(e.target.value), placeholder: DEFAULT_CATALOG_LINK_EXTRA_MACROS, helperText: "\u0414\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 creative_id \u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 (sub18, sub19, sub20 \u043F\u0440\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438). \u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u0432 JSON \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043F\u0430\u043F\u043A\u0438.", sx: { '& .MuiInputBase-input': { fontFamily: 'monospace', fontSize: 12 } } }),
107025
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { spacing: 0.5, sx: { flexShrink: 0, mt: 0.5 } },
107026
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "outlined", onClick: () => setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_EXTRA_MACROS), sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "redtrack"),
107027
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "outlined", onClick: () => setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_KEITARO_MACROS), sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "keitaro"))),
107028
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { spacing: 1.5, sx: { mt: 1 } },
107029
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
107847
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0414\u043E\u043F. \u043C\u0430\u043A\u0440\u043E\u0441\u044B (\u043A\u0430\u0442\u0430\u043B\u043E\u0433)", variant: "outlined", size: "small", fullWidth: true, multiline: true, minRows: 2, value: catalogLinkExtraMacros, onChange: (e) => setCatalogLinkExtraMacros(e.target.value), placeholder: DEFAULT_CATALOG_LINK_EXTRA_MACROS, helperText: "\u0414\u043E\u0431\u0430\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 creative_id \u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u043E\u0432 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 (sub18, sub19, sub20 \u043F\u0440\u0438 \u0432\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438). \u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u0432 JSON \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043F\u0430\u043F\u043A\u0438.", sx: { '& .MuiInputBase-input': { fontFamily: 'monospace', fontSize: 12 } } }),
107848
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 0.5, sx: { flexShrink: 0, mt: 0.5 } },
107849
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", onClick: () => setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_EXTRA_MACROS), sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "redtrack"),
107850
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", onClick: () => setCatalogLinkExtraMacros(DEFAULT_CATALOG_LINK_KEITARO_MACROS), sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "keitaro"))),
107851
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 1.5, sx: { mt: 1 } },
107852
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
107030
107853
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: catalogUrlIncludeTextApproach, onChange: e => setCatalogUrlIncludeTextApproach(e.target.checked), size: "small" }), label: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
107031
107854
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u041F\u043E\u0434\u0445\u043E\u0434 \u043A \u0442\u0435\u043A\u0441\u0442\u0443 \u0432 URL \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430"),
107032
107855
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary" }, "\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 \u043D\u043E\u043C\u0435\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 \u043F\u043E\u0434\u0445\u043E\u0434\u0430 \u0434\u043B\u044F \u043F\u0430\u0440 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A (1\u201310)")), sx: { alignItems: 'flex-start', mr: 0, flex: { sm: '1 1 200px' }, minWidth: 0 } }),
107033
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430", size: "small", value: catalogUrlTextApproachParam, onChange: e => setCatalogUrlTextApproachParam(e.target.value), placeholder: DEFAULT_CATALOG_TEXT_APPROACH_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_TEXT_APPROACH_PARAM}` })),
107034
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
107856
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u0430", size: "small", value: catalogUrlTextApproachParam, onChange: e => setCatalogUrlTextApproachParam(e.target.value), placeholder: DEFAULT_CATALOG_TEXT_APPROACH_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_TEXT_APPROACH_PARAM}` })),
107857
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
107035
107858
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: catalogUrlIncludeCreoApproach, onChange: e => setCatalogUrlIncludeCreoApproach(e.target.checked), size: "small" }), label: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
107036
107859
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u041F\u043E\u0434\u0445\u043E\u0434 \u043A \u043A\u0440\u0435\u043E \u0432 URL \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430"),
107037
107860
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary" }, "\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 \u043D\u043E\u043C\u0435\u0440 N \u0438\u0437 \u0438\u043C\u0435\u043D\u0438 N_xxxxxxxx_11|23.png \u043D\u0430 Drive (N = \u0441\u0442\u0440\u043E\u043A\u0430 \u043F\u043E\u0434\u0445\u043E\u0434\u0430 \u043A \u043A\u0440\u0435\u043E, 1\u201310); \u00AB (1)\u00BB \u043E\u0442 \u0434\u0443\u0431\u043B\u0438\u043A\u0430\u0442\u0430 Google \u0441\u043D\u0438\u043C\u0430\u0435\u0442\u0441\u044F")), sx: { alignItems: 'flex-start', mr: 0, flex: { sm: '1 1 200px' }, minWidth: 0 } }),
107038
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u043A\u0440\u0435\u043E", size: "small", value: catalogUrlCreoApproachParam, onChange: e => setCatalogUrlCreoApproachParam(e.target.value), placeholder: DEFAULT_CATALOG_CREO_APPROACH_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_CREO_APPROACH_PARAM}` })),
107039
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
107861
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u043A\u0440\u0435\u043E", size: "small", value: catalogUrlCreoApproachParam, onChange: e => setCatalogUrlCreoApproachParam(e.target.value), placeholder: DEFAULT_CATALOG_CREO_APPROACH_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_CREO_APPROACH_PARAM}` })),
107862
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2, alignItems: { xs: 'stretch', sm: 'flex-start' } },
107040
107863
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: catalogUrlIncludeImageAspect, onChange: e => setCatalogUrlIncludeImageAspect(e.target.checked), size: "small" }), label: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
107041
107864
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2" }, "\u0422\u0438\u043F \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F \u0432 URL \u043A\u0430\u0442\u0430\u043B\u043E\u0433\u0430"),
107042
107865
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary" }, "\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u044F 1_1 (1:1) \u0438 2_3 (2:3) \u2014 \u0438\u0437 \u0441\u0443\u0444\u0444\u0438\u043A\u0441\u0430 _11 / _23 \u0432 \u0438\u043C\u0435\u043D\u0438 \u0444\u0430\u0439\u043B\u0430 \u043D\u0430 Drive \u0438\u043B\u0438 \u0438\u0437 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0441\u043E\u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u044F, \u0435\u0441\u043B\u0438 \u0441\u0443\u0444\u0444\u0438\u043A\u0441\u0430 \u043D\u0435\u0442")), sx: { alignItems: 'flex-start', mr: 0, flex: { sm: '1 1 200px' }, minWidth: 0 } }),
107043
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u0442\u0438\u043F\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", size: "small", value: catalogUrlImageAspectParam, onChange: e => setCatalogUrlImageAspectParam(e.target.value), placeholder: DEFAULT_CATALOG_IMAGE_ASPECT_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_IMAGE_ASPECT_PARAM}` }))),
107044
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { sx: { my: 2 } }),
107866
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440 \u0434\u043B\u044F \u0442\u0438\u043F\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", size: "small", value: catalogUrlImageAspectParam, onChange: e => setCatalogUrlImageAspectParam(e.target.value), placeholder: DEFAULT_CATALOG_IMAGE_ASPECT_PARAM, sx: { width: { xs: '100%', sm: 200 }, flexShrink: 0 }, helperText: `По умолчанию: ${DEFAULT_CATALOG_IMAGE_ASPECT_PARAM}` }))),
107867
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { sx: { my: 2 } }),
107045
107868
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", gutterBottom: true }, "AI Generation Settings"),
107046
107869
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
107047
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "\u0422\u043E\u0432\u0430\u0440", variant: "outlined", fullWidth: true, value: generateProduct, onChange: (e) => setGenerateProduct(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: \u043A\u0430\u043F\u043B\u0438 \u043E\u0442 \u043F\u0430\u0440\u0430\u0437\u0438\u0442\u043E\u0432 Detoxil Water", sx: { mb: 2 } })),
107048
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
107049
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "\u0413\u0435\u043E", variant: "outlined", fullWidth: true, value: generateGeo, onChange: (e) => setGenerateGeo(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: \u0420\u0443\u043C\u044B\u043D\u0438\u044F" }),
107050
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "\u0426\u0435\u043D\u0430 \u0438 \u0432\u0430\u043B\u044E\u0442\u0430", variant: "outlined", fullWidth: true, value: generatePriceWithCurrency, onChange: (e) => setGeneratePriceWithCurrency(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: 29 euro, 11400 HUF, 149 RON \u0438\u043B\u0438 \u043B\u044E\u0431\u043E\u0439 \u0434\u0440\u0443\u0433\u043E\u0439 \u0444\u043E\u0440\u043C\u0430\u0442", helperText: "\u041B\u044E\u0431\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u043F\u0440\u043E\u043C\u043F\u0442\u0435 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439. \u041A\u043D\u043E\u043F\u043A\u0438 \u0441\u043F\u0440\u0430\u0432\u0430 \u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0442 \u0441\u0438\u043C\u0432\u043E\u043B \u0432\u0430\u043B\u044E\u0442\u044B, \u0446\u0438\u0444\u0440\u0443 \u0431\u0435\u0440\u0443\u0442 \u0438\u0437 \u043F\u043E\u043B\u044F (\u0438\u043B\u0438 99).", InputProps: {
107870
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0422\u043E\u0432\u0430\u0440", variant: "outlined", fullWidth: true, value: generateProduct, onChange: (e) => setGenerateProduct(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: \u043A\u0430\u043F\u043B\u0438 \u043E\u0442 \u043F\u0430\u0440\u0430\u0437\u0438\u0442\u043E\u0432 Detoxil Water", sx: { mb: 2 } })),
107871
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
107872
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0413\u0435\u043E", variant: "outlined", fullWidth: true, value: generateGeo, onChange: (e) => setGenerateGeo(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: \u0420\u0443\u043C\u044B\u043D\u0438\u044F" }),
107873
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0426\u0435\u043D\u0430 \u0438 \u0432\u0430\u043B\u044E\u0442\u0430", variant: "outlined", fullWidth: true, value: generatePriceWithCurrency, onChange: (e) => setGeneratePriceWithCurrency(e.target.value), placeholder: "\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: 29 euro, 11400 HUF, 149 RON \u0438\u043B\u0438 \u043B\u044E\u0431\u043E\u0439 \u0434\u0440\u0443\u0433\u043E\u0439 \u0444\u043E\u0440\u043C\u0430\u0442", helperText: "\u041B\u044E\u0431\u043E\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u0434\u043B\u044F \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u043F\u0440\u043E\u043C\u043F\u0442\u0435 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439. \u041A\u043D\u043E\u043F\u043A\u0438 \u0441\u043F\u0440\u0430\u0432\u0430 \u043F\u043E\u0434\u0441\u0442\u0430\u0432\u043B\u044F\u044E\u0442 \u0441\u0438\u043C\u0432\u043E\u043B \u0432\u0430\u043B\u044E\u0442\u044B, \u0446\u0438\u0444\u0440\u0443 \u0431\u0435\u0440\u0443\u0442 \u0438\u0437 \u043F\u043E\u043B\u044F (\u0438\u043B\u0438 99).", InputProps: {
107051
107874
  endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { position: "end" },
107052
107875
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 0.25, mr: -0.5 } },
107053
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C $ (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
107054
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0434\u043E\u043B\u043B\u0430\u0440", onClick: () => {
107876
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C $ (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
107877
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0434\u043E\u043B\u043B\u0430\u0440", onClick: () => {
107055
107878
  const n = extractLeadingPriceNumber(generatePriceWithCurrency);
107056
107879
  setGeneratePriceWithCurrency(`$${n}`);
107057
107880
  }, edge: "end" },
107058
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_40__["default"], { sx: { fontSize: 20 } }))),
107059
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u20AC (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
107060
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0435\u0432\u0440\u043E", onClick: () => {
107881
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_42__["default"], { sx: { fontSize: 20 } }))),
107882
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u20AC (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
107883
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0435\u0432\u0440\u043E", onClick: () => {
107061
107884
  const n = extractLeadingPriceNumber(generatePriceWithCurrency);
107062
107885
  setGeneratePriceWithCurrency(`€${n}`);
107063
107886
  }, edge: "end", sx: { minWidth: 34, fontSize: '1rem', fontWeight: 700 } }, "\u20AC")),
107064
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C z\u0142 (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
107065
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0437\u043B\u043E\u0442\u044B\u0435", onClick: () => {
107887
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u041F\u043E\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044C z\u0142 (\u0446\u0438\u0444\u0440\u0430 \u0438\u0437 \u043F\u043E\u043B\u044F \u0438\u043B\u0438 99)" },
107888
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0437\u043B\u043E\u0442\u044B\u0435", onClick: () => {
107066
107889
  const n = extractLeadingPriceNumber(generatePriceWithCurrency);
107067
107890
  setGeneratePriceWithCurrency(`${n} zł`);
107068
107891
  }, edge: "end", sx: { minWidth: 36, fontSize: '0.8rem', fontWeight: 700, letterSpacing: -0.3 } }, "z\u0142"))))),
107069
107892
  } })),
107070
107893
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
107071
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F (\u043D\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)", variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: generateAdditionalInfo, onChange: (e) => setGenerateAdditionalInfo(e.target.value), placeholder: "\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B, \u0443\u0442\u043E\u0447\u043D\u0435\u043D\u0438\u044F \u043A \u043F\u0440\u043E\u043C\u043F\u0442\u0443 \u0438 \u0442.\u0434.", sx: { mb: 2 } })),
107894
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: "\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F (\u043D\u0435 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u043E)", variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: generateAdditionalInfo, onChange: (e) => setGenerateAdditionalInfo(e.target.value), placeholder: "\u0418\u043D\u0433\u0440\u0435\u0434\u0438\u0435\u043D\u0442\u044B, \u0443\u0442\u043E\u0447\u043D\u0435\u043D\u0438\u044F \u043A \u043F\u0440\u043E\u043C\u043F\u0442\u0443 \u0438 \u0442.\u0434.", sx: { mb: 2 } })),
107072
107895
  openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
107073
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', md: 'row' }, spacing: 2, sx: { mb: 2, alignItems: 'stretch' } },
107896
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', md: 'row' }, spacing: 2, sx: { mb: 2, alignItems: 'stretch' } },
107074
107897
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
107075
107898
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043E\u0432 (1:1)"),
107076
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedImageModelSquare, onChange: (e) => handleImageModelSquareChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043E\u0432 (1:1)", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
107899
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: imageModels.some(m => m.id === selectedImageModelSquare) ? selectedImageModelSquare : '', onChange: (e) => handleImageModelSquareChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043A\u0432\u0430\u0434\u0440\u0430\u0442\u043E\u0432 (1:1)", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
107077
107900
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
107078
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
107079
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : imageModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (imageModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107080
- !loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null, selectedImageModelSquare === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.imageGeneration
107901
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
107902
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : imageModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (imageModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107903
+ !loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedImageModelSquare === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.imageGeneration
107081
107904
  ? 'По умолчанию для квадрата'
107082
107905
  : '1:1: ' +
107083
107906
  (imageModels.find(m => m.id === selectedImageModelSquare)?.name ||
107084
107907
  selectedImageModelSquare)))),
107085
107908
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
107086
107909
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 (2:3)"),
107087
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedImageModelRect, onChange: (e) => handleImageModelRectChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 (2:3)", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
107910
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: imageModels.some(m => m.id === selectedImageModelRect) ? selectedImageModelRect : '', onChange: (e) => handleImageModelRectChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u044F\u043C\u043E\u0443\u0433\u043E\u043B\u044C\u043D\u0438\u043A\u043E\u0432 (2:3)", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
107088
107911
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
107089
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
107090
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : imageModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (imageModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107091
- !loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null, selectedImageModelRect === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.imageGeneration
107912
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
107913
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : imageModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (imageModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107914
+ !loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedImageModelRect === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.imageGeneration
107092
107915
  ? 'По умолчанию для 2:3'
107093
107916
  : '2:3: ' +
107094
107917
  (imageModels.find(m => m.id === selectedImageModelRect)?.name ||
107095
107918
  selectedImageModelRect)))),
107096
107919
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
107097
107920
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043A\u0440\u0435\u0430\u0442\u0438\u0432\u043E\u0432"),
107098
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedValidationModel, onChange: (e) => handleValidationModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043A\u0440\u0435\u0430\u0442\u0438\u0432\u043E\u0432", disabled: loadingValidationModels || validationModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
107921
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: validationModels.some(m => m.id === selectedValidationModel) ? selectedValidationModel : '', onChange: (e) => handleValidationModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u043A\u0440\u0435\u0430\u0442\u0438\u0432\u043E\u0432", disabled: loadingValidationModels || validationModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
107099
107922
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
107100
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
107101
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : validationModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (validationModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107102
- !loadingValidationModels && validationModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null, selectedValidationModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.creativeValidation
107923
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
107924
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : validationModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (validationModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107925
+ !loadingValidationModels && validationModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedValidationModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.creativeValidation
107103
107926
  ? 'Используется модель по умолчанию'
107104
107927
  : 'Выбрана модель: ' + (validationModels.find(m => m.id === selectedValidationModel)?.name || selectedValidationModel))),
107105
107928
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: validationDisabled, onChange: (e) => handleValidationDisabledChange(e.target.checked), color: "primary" }), label: "\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443", sx: { mt: 1 } }),
107106
107929
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: autoRemakeOnValidatorError, onChange: (e) => handleAutoRemakeOnValidatorErrorChange(e.target.checked), color: "primary", disabled: validationDisabled }), label: "\u0430\u0432\u0442\u043E\u043F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0430", sx: { mt: 0.5, display: 'block' } }),
107107
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { sx: { mt: 0, mx: 0 } }, validationDisabled
107930
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: uploadAfterValidatorOk, onChange: (e) => handleUploadAfterValidatorOkChange(e.target.checked), color: "primary", disabled: validationDisabled }), label: "\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044C \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438", sx: { mt: 0.5, display: 'block' } }),
107931
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { sx: { mt: 0, mx: 0 } }, validationDisabled
107108
107932
  ? 'Недоступно, пока проверка отключена.'
107109
- : 'Один раз на слот креатива: при сбое проверки (сеть, таймаут, ошибка API) или когда валидатор вернул «нужна пересборка» с замечаниями — автоматически одна полная переделка с нуля (исходный промпт + product, без правок по списку ошибок).'))),
107110
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', md: 'row' }, spacing: 2, sx: { mb: 2, alignItems: 'stretch' } },
107933
+ : 'Один раз на слот креатива: при сбое проверки (сеть, таймаут, ошибка API) или когда валидатор вернул «нужна пересборка» с замечаниями — автоматически одна полная переделка с нуля (исходный промпт + product, без правок по списку ошибок).'),
107934
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { sx: { mt: 0.5, mx: 0 } }, validationDisabled
107935
+ ? ''
107936
+ : '«Загружать после проверки»: при ответе валидатора OK файл сразу загружается в папку оффера на Google Drive (нужны URL папки и вход в Google).'))),
107937
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', md: 'row' }, spacing: 2, sx: { mb: 2, alignItems: 'stretch' } },
107111
107938
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
107112
107939
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u0432"),
107113
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedContentModel, onChange: (e) => handleContentModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u0432", disabled: loadingValidationModels || chatModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
107940
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: chatModels.some(m => m.id === selectedContentModel) ? selectedContentModel : '', onChange: (e) => handleContentModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0438 \u0442\u0435\u043A\u0441\u0442\u043E\u0432", disabled: loadingValidationModels || chatModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
107114
107941
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
107115
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
107116
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : chatModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (chatModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107117
- !loadingValidationModels && chatModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null, selectedContentModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.contentGeneration
107942
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
107943
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : chatModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (chatModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107944
+ !loadingValidationModels && chatModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedContentModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.contentGeneration
107118
107945
  ? 'Заголовки, описания, пары и перевод — модель по умолчанию из кода'
107119
107946
  : 'Заголовки и тексты: ' +
107120
107947
  (chatModels.find(m => m.id === selectedContentModel)?.name ||
107121
107948
  selectedContentModel)))),
107122
107949
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { fullWidth: true, variant: "outlined", sx: { flex: { md: '1 1 0' }, minWidth: { md: 0 } } },
107123
107950
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"),
107124
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: selectedLandingModel, onChange: (e) => handleLandingModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430", disabled: loadingValidationModels || chatModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true },
107951
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: chatModels.some(m => m.id === selectedLandingModel) ? selectedLandingModel : '', onChange: (e) => handleLandingModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430", disabled: loadingValidationModels || chatModels.length === 0 }, loadingValidationModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true },
107125
107952
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
107126
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
107127
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : chatModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (chatModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107128
- !loadingValidationModels && chatModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], null, selectedLandingModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.landingGeneration
107953
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
107954
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043C\u043E\u0434\u0435\u043B\u0435\u0439...")))) : chatModels.length === 0 ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "", disabled: true }, "\u041D\u0435\u0442 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u043C\u043E\u0434\u0435\u043B\u0435\u0439")) : (chatModels.map((model) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { key: model.id, value: model.id }, model.name))))),
107955
+ !loadingValidationModels && chatModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], null, selectedLandingModel === _models__WEBPACK_IMPORTED_MODULE_3__.MODELS.landingGeneration
107129
107956
  ? 'HTML лендинга — модель по умолчанию из кода'
107130
107957
  : 'Лендинг: ' +
107131
107958
  (chatModels.find(m => m.id === selectedLandingModel)?.name ||
107132
107959
  selectedLandingModel))))))),
107133
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
107134
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", color: "primary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_41__["default"], null), onClick: handleGenerateContent, disabled: generating || loadingContentFromDrive || !openaiApiKey || !generateProduct.trim() || !generateGeo.trim(), sx: { flexGrow: 1 }, size: "large" }, generating ? 'Generating...' : 'Generate Titles & Descriptions'),
107135
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { flexGrow: 1 } },
107136
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: imageAspectRatio === '1:1'
107960
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
107961
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "primary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null), onClick: handleGenerateContent, disabled: generating || loadingContentFromDrive || !openaiApiKey || !generateProduct.trim() || !generateGeo.trim(), sx: { flexGrow: 1 }, size: "large" }, generating ? 'Generating...' : 'Generate Titles & Descriptions'),
107962
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { flexGrow: 1 } },
107963
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: imageAspectRatio === '1:1'
107137
107964
  ? '1:1 — квадрат (1024×1024 px)'
107138
107965
  : imageAspectRatio === '2:3'
107139
107966
  ? '2:3 — портрет (1024×1536 px)'
@@ -107158,7 +107985,7 @@ ${imageData.originalPrompt}
107158
107985
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"], { value: "1:1", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "1:1"),
107159
107986
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"], { value: "2:3", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "2:3"),
107160
107987
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"], { value: "both", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "\u041E\u0431\u0430")))),
107161
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_41__["default"], null), onClick: handleGenerateImages, disabled: generatingImages ||
107988
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null), onClick: handleGenerateImages, disabled: generatingImages ||
107162
107989
  !openaiApiKey ||
107163
107990
  (!accessToken && !refreshToken) ||
107164
107991
  !generateProduct.trim() ||
@@ -107176,9 +108003,9 @@ ${imageData.originalPrompt}
107176
108003
  : !driveFolderUrl.trim()
107177
108004
  ? 'Заполните URL папки Google Drive'
107178
108005
  : undefined }, generatingImages ? 'Generating Images...' : 'Generate Images')),
107179
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", color: "success", size: "large", onClick: handleGenerate, disabled: loading, startIcon: loading ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null), sx: { py: 1.5, fontSize: '1.1rem', flexGrow: 1 } }, loading ? 'Generating...' : 'Generate Catalog'),
107180
- uploadedLink && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "success", sx: { flexGrow: 1, minWidth: 0 }, action: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { "aria-label": "copy link", color: "inherit", size: "small", onClick: handleCopyLink, sx: { ml: 1 } },
107181
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], { fontSize: "small" })) },
108006
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "success", size: "large", onClick: handleGenerate, disabled: loading, startIcon: loading ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), sx: { py: 1.5, fontSize: '1.1rem', flexGrow: 1 } }, loading ? 'Generating...' : 'Generate Catalog'),
108007
+ uploadedLink && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "success", sx: { flexGrow: 1, minWidth: 0 }, action: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { "aria-label": "copy link", color: "inherit", size: "small", onClick: handleCopyLink, sx: { ml: 1 } },
108008
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_50__["default"], { fontSize: "small" })) },
107182
108009
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' } },
107183
108010
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
107184
108011
  "\u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D!",
@@ -107188,17 +108015,17 @@ ${imageData.originalPrompt}
107188
108015
  getElectronAPI().openExternal(uploadedLink);
107189
108016
  }, style: { cursor: 'pointer', textDecoration: 'underline', color: 'inherit' } }, "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 Google Drive")),
107190
108017
  linkCopied && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'success.dark', fontWeight: 'bold' } }, "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E!"))))),
107191
- folderFilesInfo !== null && !folderFilesInfo.hasProduct && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "warning", sx: { mt: 1 } }, "\u0414\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F product.png/jpg/webp. \u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043E \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043D\u043E\u043F\u043A\u0438 \"Generate Product from Banka\".")),
108018
+ folderFilesInfo !== null && !folderFilesInfo.hasProduct && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "warning", sx: { mt: 1 } }, "\u0414\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F product.png/jpg/webp. \u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0435\u0433\u043E \u0441 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043D\u043E\u043F\u043A\u0438 \"Generate Product from Banka\".")),
107192
108019
  !generatingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
107193
- !openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 OpenRouter API Key")),
107194
- openaiApiKey && (!accessToken && !refreshToken) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "error", sx: { mt: 1 } }, "\u0412\u043E\u0439\u0434\u0438\u0442\u0435 \u0432 Google Drive")),
107195
- openaiApiKey && (accessToken || refreshToken) && !generateProduct.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043F\u043E\u043B\u0435 \u0422\u043E\u0432\u0430\u0440")),
107196
- openaiApiKey && (accessToken || refreshToken) && generateProduct.trim() && !generateGeo.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043F\u043E\u043B\u0435 \u0413\u0435\u043E")),
107197
- openaiApiKey && (accessToken || refreshToken) && generateProduct.trim() && generateGeo.trim() && !driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 URL \u043F\u0430\u043F\u043A\u0438 Google Drive"))))),
108020
+ !openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 OpenRouter API Key")),
108021
+ openaiApiKey && (!accessToken && !refreshToken) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0412\u043E\u0439\u0434\u0438\u0442\u0435 \u0432 Google Drive")),
108022
+ openaiApiKey && (accessToken || refreshToken) && !generateProduct.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043F\u043E\u043B\u0435 \u0422\u043E\u0432\u0430\u0440")),
108023
+ openaiApiKey && (accessToken || refreshToken) && generateProduct.trim() && !generateGeo.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043F\u043E\u043B\u0435 \u0413\u0435\u043E")),
108024
+ openaiApiKey && (accessToken || refreshToken) && generateProduct.trim() && generateGeo.trim() && !driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "error", sx: { mt: 1 } }, "\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 URL \u043F\u0430\u043F\u043A\u0438 Google Drive"))))),
107198
108025
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "file", ref: productFileInputRef, accept: "image/png,image/jpeg,image/jpg,image/webp", style: { display: 'none' }, onChange: handleProductFileSelected }),
107199
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
107200
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", color: "success", startIcon: uploadingProduct ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null), onClick: handleUploadProductFile, disabled: uploadingProduct || !accessToken || !driveFolderUrl.trim(), sx: { flexGrow: 1 }, size: "large" }, uploadingProduct ? 'Загрузка...' : 'Загрузить product.png/jpg/webp'),
107201
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", color: "info", startIcon: generatingLanding ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_54__["default"], null), onClick: handleCreateLanding, disabled: generatingLanding ||
108026
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
108027
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "success", startIcon: uploadingProduct ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), onClick: handleUploadProductFile, disabled: uploadingProduct || !accessToken || !driveFolderUrl.trim(), sx: { flexGrow: 1 }, size: "large" }, uploadingProduct ? 'Загрузка...' : 'Загрузить product.png/jpg/webp'),
108028
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "info", startIcon: generatingLanding ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_57__["default"], null), onClick: handleCreateLanding, disabled: generatingLanding ||
107202
108029
  !openaiApiKey ||
107203
108030
  !accessToken ||
107204
108031
  !driveFolderUrl.trim() ||
@@ -107213,10 +108040,22 @@ ${imageData.originalPrompt}
107213
108040
  generatedImagesData.length,
107214
108041
  ")"),
107215
108042
  checkingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 2 } },
107216
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
108043
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }),
107217
108044
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary' } }, "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430..."))),
107218
- generatedImagesData.length > 0 && generatedImagesData.some(img => !img.uploaded && img.imageUrl) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mb: 2 } },
107219
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", color: "primary", onClick: handleUploadAllImages, disabled: uploadingImages || generatingImages || !driveFolderUrl.trim(), startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null), fullWidth: true }, uploadingImages ? 'Загрузка...' : `Загрузить все (${generatedImagesData.filter(img => !img.uploaded && img.imageUrl).length})`))),
108045
+ pendingDriveUploadCreos.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 1, sx: { mb: 2 }, useFlexGap: true },
108046
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "primary", onClick: () => void handleUploadAllImages(), disabled: uploadingImages || generatingImages || !driveFolderUrl.trim(), startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), fullWidth: true, sx: { flex: 1 } }, uploadingImages
108047
+ ? 'Загрузка...'
108048
+ : `Загрузить все (${pendingDriveUploadCreos.length})`),
108049
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: pendingValidatorOkDriveUploadCreos.length === 0
108050
+ ? 'Нет незагруженных крео с успешной проверкой валидатором (ожидайте проверки или исправьте ошибки).'
108051
+ : 'Только крео со статусом «Проверка пройдена», как в карточке (валидатор вернул OK).' },
108052
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { style: { flex: 1, display: 'flex' } },
108053
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "success", onClick: () => void handleUploadAllImages({ correctOnly: true }), disabled: uploadingImages ||
108054
+ generatingImages ||
108055
+ !driveFolderUrl.trim() ||
108056
+ pendingValidatorOkDriveUploadCreos.length === 0, startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], null), fullWidth: true, sx: { flex: 1 } }, uploadingImages
108057
+ ? 'Загрузка...'
108058
+ : `Загрузить правильные (${pendingValidatorOkDriveUploadCreos.length})`))))),
107220
108059
  generatedImagesData.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
107221
108060
  display: 'grid',
107222
108061
  gridTemplateColumns: { xs: '1fr', sm: 'repeat(2, 1fr)', md: 'repeat(3, 1fr)' },
@@ -107253,9 +108092,9 @@ ${imageData.originalPrompt}
107253
108092
  }
107254
108093
  : {})
107255
108094
  } },
107256
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u0440\u0435\u0430\u0442\u0438\u0432" },
108095
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u0440\u0435\u0430\u0442\u0438\u0432" },
107257
108096
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
107258
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", "aria-label": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u0440\u0435\u0430\u0442\u0438\u0432", sx: {
108097
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u0440\u0435\u0430\u0442\u0438\u0432", sx: {
107259
108098
  position: 'absolute',
107260
108099
  top: 6,
107261
108100
  right: 6,
@@ -107281,8 +108120,8 @@ ${imageData.originalPrompt}
107281
108120
  !!imageData.regenerating ||
107282
108121
  !!imageData.uploading ||
107283
108122
  deletingDriveImageIndex === imageData.index },
107284
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], { fontSize: "small" })))),
107285
- imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", "aria-label": "\u041D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D", sx: {
108123
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_52__["default"], { fontSize: "small" })))),
108124
+ imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u041D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D", sx: {
107286
108125
  position: 'absolute',
107287
108126
  top: 6,
107288
108127
  left: 6,
@@ -107309,7 +108148,7 @@ ${imageData.originalPrompt}
107309
108148
  }), disabled: imageData.generating ||
107310
108149
  !!imageData.uploading ||
107311
108150
  deletingDriveImageIndex === imageData.index },
107312
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_51__["default"], { fontSize: "small" }))) : null,
108151
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_54__["default"], { fontSize: "small" }))) : null,
107313
108152
  imageData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
107314
108153
  width: '100%',
107315
108154
  aspectRatio: aspectRatioCss,
@@ -107325,7 +108164,7 @@ ${imageData.originalPrompt}
107325
108164
  gap: 2,
107326
108165
  p: 3
107327
108166
  } },
107328
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 40, sx: { color: 'primary.main' } }),
108167
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
107329
108168
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", sx: { color: 'text.secondary', textAlign: 'center', fontWeight: 'bold' } }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F..."),
107330
108169
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', textAlign: 'center' } }, imageData.approach),
107331
108170
  generatingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', textAlign: 'center' } },
@@ -107345,7 +108184,7 @@ ${imageData.originalPrompt}
107345
108184
  gap: 2,
107346
108185
  p: 3
107347
108186
  } },
107348
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 40, sx: { color: 'primary.main' } }),
108187
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
107349
108188
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", sx: { color: 'text.secondary', textAlign: 'center', fontWeight: 'bold' } }, "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0430..."),
107350
108189
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', textAlign: 'center' } }, imageData.approach))) : imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, hideUploadedPreview ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
107351
108190
  width: '100%',
@@ -107364,14 +108203,14 @@ ${imageData.originalPrompt}
107364
108203
  boxSizing: 'border-box'
107365
108204
  } },
107366
108205
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", align: "center", sx: { px: 1 } }, "\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043E \u043D\u0430 Google \u0414\u0438\u0441\u043A \u2014 \u043F\u0440\u0435\u0432\u044C\u044E \u0441\u043A\u0440\u044B\u0442\u043E"),
107367
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: "row", spacing: 1, flexWrap: "wrap", justifyContent: "center" },
107368
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "contained", onClick: () => setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
108206
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, flexWrap: "wrap", justifyContent: "center" },
108207
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "contained", onClick: () => setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
107369
108208
  ? { ...img, uploadedPreviewHidden: false }
107370
108209
  : img)) }, "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u043F\u0440\u0435\u0432\u044C\u044E"),
107371
- imageData.driveUploadedFileId ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "outlined", color: "error", disabled: deletingDriveImageIndex === imageData.index, onClick: () => void handleDeleteCreativeFromDrive(imageData) }, deletingDriveImageIndex === imageData.index
108210
+ imageData.driveUploadedFileId ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", color: "error", disabled: deletingDriveImageIndex === imageData.index, onClick: () => void handleDeleteCreativeFromDrive(imageData) }, deletingDriveImageIndex === imageData.index
107372
108211
  ? 'Удаление…'
107373
108212
  : 'Удалить с Диска')) : null,
107374
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "outlined", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_51__["default"], null), onClick: () => setCreoFullscreen({
108213
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_54__["default"], null), onClick: () => setCreoFullscreen({
107375
108214
  url: imageData.imageUrl,
107376
108215
  title: `${imageData.index}. ${imageData.approach}`
107377
108216
  }), disabled: !!imageData.uploading || deletingDriveImageIndex === imageData.index }, "\u041D\u0430 \u0432\u0435\u0441\u044C \u044D\u043A\u0440\u0430\u043D")))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
@@ -107394,13 +108233,13 @@ ${imageData.originalPrompt}
107394
108233
  alignItems: 'center',
107395
108234
  gap: 1
107396
108235
  } },
107397
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 40, sx: { color: 'primary.main' } }),
108236
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
107398
108237
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'white', fontWeight: 'bold', textShadow: '1px 1px 2px rgba(0,0,0,0.8)' } }, "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0430..."))),
107399
108238
  imageData.uploaded && !imageData.regenerating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', justifyContent: 'center', mt: 0.5 } },
107400
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "text", onClick: () => setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
108239
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "text", onClick: () => setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
107401
108240
  ? { ...img, uploadedPreviewHidden: true }
107402
108241
  : img)) }, "\u0421\u043A\u0440\u044B\u0442\u044C \u043F\u0440\u0435\u0432\u044C\u044E"),
107403
- imageData.driveUploadedFileId ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "outlined", color: "error", sx: { ml: 1 }, disabled: deletingDriveImageIndex === imageData.index, onClick: () => void handleDeleteCreativeFromDrive(imageData) }, deletingDriveImageIndex === imageData.index
108242
+ imageData.driveUploadedFileId ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", color: "error", sx: { ml: 1 }, disabled: deletingDriveImageIndex === imageData.index, onClick: () => void handleDeleteCreativeFromDrive(imageData) }, deletingDriveImageIndex === imageData.index
107404
108243
  ? 'Удаление…'
107405
108244
  : 'Удалить с Диска')) : null)) : null)))) : imageData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
107406
108245
  width: '100%',
@@ -107450,25 +108289,46 @@ ${imageData.originalPrompt}
107450
108289
  !hideUploadedPreview && imageData.checkStatus === 'ok' && imageData.checkResult !== 'Проверка отключена' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'success.main', display: 'block', fontWeight: 'bold' } }, "\u2705 \u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430")),
107451
108290
  !hideUploadedPreview && imageData.checkStatus === 'needs_rebuild' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], null,
107452
108291
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'error.main', display: 'block', fontWeight: 'bold' } }, imageData.checkFailed ? '⚠️ Ошибка проверки' : '❌ Требует пересборки'),
107453
- imageData.checkErrors && imageData.checkErrors.length > 0 && !imageData.checkFailed && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mt: 0.5 } },
108292
+ imageData.checkErrors && imageData.checkErrors.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mt: 0.5 } },
107454
108293
  imageData.checkErrors.slice(0, 2).map((error, idx) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { key: idx, variant: "caption", sx: {
107455
108294
  color: 'error.main',
107456
108295
  display: 'block',
107457
108296
  fontSize: '0.7rem',
107458
- lineHeight: 1.2
108297
+ lineHeight: 1.35,
108298
+ wordBreak: 'break-word'
107459
108299
  } },
107460
108300
  "\u2022 ",
107461
- error.length > 50 ? error.substring(0, 50) + '...' : error))),
108301
+ error.length > 220 ? error.substring(0, 220) + '' : error))),
107462
108302
  imageData.checkErrors.length > 2 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', fontSize: '0.7rem' } },
107463
108303
  "+",
107464
108304
  imageData.checkErrors.length - 2,
107465
108305
  " \u0435\u0449\u0451")))))),
108306
+ (() => {
108307
+ const checkedOk = imageData.checkStatus === 'ok' &&
108308
+ imageData.checkResult &&
108309
+ imageData.checkResult.trim() !== '' &&
108310
+ imageData.checkResult !== 'Проверка отключена';
108311
+ const checkedRebuild = imageData.checkStatus === 'needs_rebuild';
108312
+ if (!checkedOk && !checkedRebuild)
108313
+ return null;
108314
+ const body = (imageData.checkResult && imageData.checkResult.trim()) ||
108315
+ (imageData.checkErrors?.length
108316
+ ? imageData.checkErrors.join('\n\n')
108317
+ : '');
108318
+ if (!body)
108319
+ return null;
108320
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "text", sx: { mt: 0.5, p: 0, minHeight: 'auto', fontSize: '0.7rem', textTransform: 'none', alignSelf: 'flex-start', display: 'block' }, onClick: () => setValidatorDebugDialog({
108321
+ kind: imageData.checkFailed ? 'transport' : 'validator',
108322
+ subtitle: `${imageData.index}. ${imageData.approach}`,
108323
+ text: body
108324
+ }) }, imageData.checkFailed ? 'Детали ошибки проверки' : 'Полный ответ валидатора'));
108325
+ })(),
107466
108326
  !hideUploadedPreview && imageData.checkStatus === 'checking' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'warning.main', display: 'block' } }, "\uD83D\uDD0D \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442\u0441\u044F...")),
107467
108327
  !hideUploadedPreview && imageData.checkStatus === 'pending' && !imageData.failed && !imageData.generating && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'text.secondary', display: 'block' } }, "\u23F3 \u041E\u0436\u0438\u0434\u0430\u0435\u0442 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438")),
107468
108328
  !hideUploadedPreview && imageData.failed && !imageData.generating && !imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'error.main', display: 'block', fontWeight: 'bold' } }, "\u274C \u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C")),
107469
108329
  !hideUploadedPreview && imageData.uploaded && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: { color: 'success.main', display: 'block', mt: 0.5 } }, "\u2713 \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043E"))),
107470
108330
  !imageData.generating && !hideUploadedPreview && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', gap: 1, flexDirection: 'column', mt: 1 } },
107471
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { size: "small", multiline: true, minRows: 2, maxRows: 4, fullWidth: true, placeholder: "\u0423\u0442\u043E\u0447\u043D\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0438 (\u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u043F\u0440\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u0445)", value: imageData.customRegeneratePrompt || '', onChange: (e) => {
108331
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { size: "small", multiline: true, minRows: 2, maxRows: 4, fullWidth: true, placeholder: "\u0423\u0442\u043E\u0447\u043D\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0438 (\u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0437\u0430\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u043F\u0440\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u0445)", value: imageData.customRegeneratePrompt || '', onChange: (e) => {
107472
108332
  setGeneratedImagesData(prev => prev.map(img => img.index === imageData.index
107473
108333
  ? { ...img, customRegeneratePrompt: e.target.value }
107474
108334
  : img));
@@ -107485,8 +108345,8 @@ ${imageData.originalPrompt}
107485
108345
  : 'transparent'
107486
108346
  }
107487
108347
  } }),
107488
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: "row", spacing: 1, sx: { width: '100%', alignItems: 'stretch' } },
107489
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "contained", color: imageData.failed ? 'error' : imageData.checkStatus === 'needs_rebuild' ? 'warning' : 'primary', startIcon: imageData.regenerating ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_41__["default"], null), onClick: () => handleRegenerateImage(imageData), disabled: imageData.regenerating ||
108348
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, sx: { width: '100%', alignItems: 'stretch' } },
108349
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "contained", color: imageData.failed ? 'error' : imageData.checkStatus === 'needs_rebuild' ? 'warning' : 'primary', startIcon: imageData.regenerating ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null), onClick: () => handleRegenerateImage(imageData), disabled: imageData.regenerating ||
107490
108350
  imageData.uploading ||
107491
108351
  imageData.checkStatus === 'checking' ||
107492
108352
  !imageData.originalPrompt ||
@@ -107496,24 +108356,36 @@ ${imageData.originalPrompt}
107496
108356
  : ((generatingImages && !imageData.imageUrl && !imageData.failed && !imageData.generating)
107497
108357
  ? 'В очереди'
107498
108358
  : (!imageData.imageUrl ? 'Сгенерировать' : 'Переделать'))),
107499
- imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "outlined", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_56__["default"], null), onClick: () => handleRegenerateImageFresh(imageData), disabled: imageData.regenerating ||
108359
+ imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_59__["default"], null), onClick: () => handleRegenerateImageFresh(imageData), disabled: imageData.regenerating ||
107500
108360
  imageData.uploading ||
107501
108361
  imageData.checkStatus === 'checking' ||
107502
108362
  !imageData.originalPrompt ||
107503
108363
  !imageData.productImageUrl, sx: { flex: 1, minWidth: 0, py: 1, lineHeight: 1.2, whiteSpace: 'normal' } }, "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u0430\u0442\u044C \u0437\u0430\u043D\u043E\u0432\u043E")) : null),
107504
- imageData.imageUrl && !validationDisabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "outlined", color: "warning", startIcon: imageData.checkStatus === 'checking' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16, color: "inherit" })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_56__["default"], null)), onClick: () => handleRetryCheck(imageData), disabled: imageData.regenerating ||
108364
+ imageData.imageUrl && !validationDisabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", color: "warning", startIcon: imageData.checkStatus === 'checking' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16, color: "inherit" })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_59__["default"], null)), onClick: () => handleRetryCheck(imageData), disabled: imageData.regenerating ||
107505
108365
  imageData.uploading ||
107506
108366
  imageData.generating ||
107507
108367
  imageData.checkStatus === 'checking', fullWidth: true }, imageData.checkStatus === 'checking' ? 'Проверка…' : 'Перепроверить')),
107508
- !imageData.uploaded && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { size: "small", variant: "outlined", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null), onClick: () => {
108368
+ !imageData.uploaded && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { size: "small", variant: "outlined", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), onClick: () => {
107509
108369
  const folderId = extractFolderId(driveFolderUrl);
107510
108370
  if (folderId) {
107511
108371
  handleUploadImage(imageData, folderId);
107512
108372
  }
107513
108373
  }, disabled: imageData.uploading || imageData.regenerating || !driveFolderUrl.trim(), fullWidth: true }, imageData.uploading ? 'Загрузка...' : 'Загрузить'))))));
107514
108374
  }))),
107515
- generatedImagesData.length > 0 && generatedImagesData.some(img => !img.uploaded && img.imageUrl) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mt: 2 } },
107516
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", color: "primary", onClick: handleUploadAllImages, disabled: uploadingImages || generatingImages || !driveFolderUrl.trim(), startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null), fullWidth: true }, uploadingImages ? 'Загрузка...' : `Загрузить все (${generatedImagesData.filter(img => !img.uploaded && img.imageUrl).length})`))),
108375
+ pendingDriveUploadCreos.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 1, sx: { mt: 2 }, useFlexGap: true },
108376
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "primary", onClick: () => void handleUploadAllImages(), disabled: uploadingImages || generatingImages || !driveFolderUrl.trim(), startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null), fullWidth: true, sx: { flex: 1 } }, uploadingImages
108377
+ ? 'Загрузка...'
108378
+ : `Загрузить все (${pendingDriveUploadCreos.length})`),
108379
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: pendingValidatorOkDriveUploadCreos.length === 0
108380
+ ? 'Нет незагруженных крео с успешной проверкой валидатором (ожидайте проверки или исправьте ошибки).'
108381
+ : 'Только крео со статусом «Проверка пройдена», как в карточке (валидатор вернул OK).' },
108382
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", { style: { flex: 1, display: 'flex' } },
108383
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", color: "success", onClick: () => void handleUploadAllImages({ correctOnly: true }), disabled: uploadingImages ||
108384
+ generatingImages ||
108385
+ !driveFolderUrl.trim() ||
108386
+ pendingValidatorOkDriveUploadCreos.length === 0, startIcon: uploadingImages ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], null), fullWidth: true, sx: { flex: 1 } }, uploadingImages
108387
+ ? 'Загрузка...'
108388
+ : `Загрузить правильные (${pendingValidatorOkDriveUploadCreos.length})`))))),
107517
108389
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { fullScreen: true, open: Boolean(creoFullscreen), onClose: () => setCreoFullscreen(null), PaperProps: {
107518
108390
  sx: {
107519
108391
  m: 0,
@@ -107534,9 +108406,9 @@ ${imageData.originalPrompt}
107534
108406
  flexShrink: 0
107535
108407
  } },
107536
108408
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle1", sx: { color: '#fff', flex: 1, pr: 1 }, noWrap: true }, creoFullscreen?.title),
107537
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C (Esc)" },
107538
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { "aria-label": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043F\u043E\u043B\u043D\u043E\u044D\u043A\u0440\u0430\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440", onClick: () => setCreoFullscreen(null), sx: { color: '#fff' } },
107539
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_45__["default"], null)))),
108409
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0417\u0430\u043A\u0440\u044B\u0442\u044C (Esc)" },
108410
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { "aria-label": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C \u043F\u043E\u043B\u043D\u043E\u044D\u043A\u0440\u0430\u043D\u043D\u044B\u0439 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440", onClick: () => setCreoFullscreen(null), sx: { color: '#fff' } },
108411
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null)))),
107540
108412
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
107541
108413
  flex: 1,
107542
108414
  minHeight: 0,
@@ -107552,8 +108424,29 @@ ${imageData.originalPrompt}
107552
108424
  height: 'auto',
107553
108425
  objectFit: 'contain',
107554
108426
  borderRadius: 1
107555
- } })) : null)))),
107556
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { sx: { my: 2 } }),
108427
+ } })) : null)),
108428
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { open: Boolean(validatorDebugDialog), onClose: () => setValidatorDebugDialog(null), maxWidth: "md", fullWidth: true, scroll: "paper" },
108429
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: { pr: 5 } },
108430
+ validatorDebugDialog?.kind === 'transport'
108431
+ ? 'Детали ошибки проверки'
108432
+ : 'Полный ответ модели-валидатора',
108433
+ validatorDebugDialog?.subtitle ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "div", variant: "caption", color: "text.secondary", sx: { display: 'block', mt: 0.5, fontWeight: 400 } }, validatorDebugDialog.subtitle)) : null),
108434
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], { dividers: true },
108435
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { value: validatorDebugDialog?.text ?? '', multiline: true, fullWidth: true, minRows: 14, maxRows: 32, InputProps: { readOnly: true }, variant: "outlined", size: "small", sx: {
108436
+ '& .MuiInputBase-input': {
108437
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
108438
+ fontSize: '0.8rem',
108439
+ lineHeight: 1.45
108440
+ }
108441
+ } })),
108442
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], { sx: { px: 2, py: 1.5 } },
108443
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_50__["default"], null), onClick: () => {
108444
+ const t = validatorDebugDialog?.text;
108445
+ if (t)
108446
+ void navigator.clipboard.writeText(t);
108447
+ }, disabled: !validatorDebugDialog?.text }, "\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C"),
108448
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", onClick: () => setValidatorDebugDialog(null) }, "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"))))),
108449
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { sx: { my: 2 } }),
107557
108450
  (generatedTitlesData.length > 0 || generatedTextsData.length > 0 || loadingContentFromDrive) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mb: 2 } },
107558
108451
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 1, mb: 1 } },
107559
108452
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", sx: { fontWeight: 'bold' }, component: "div" },
@@ -107562,14 +108455,14 @@ ${imageData.originalPrompt}
107562
108455
  "/",
107563
108456
  Math.max(generatedTitlesData.length, generatedTextsData.length),
107564
108457
  ")"),
107565
- (generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: pairsJsonCopied ? 'Скопировано' : 'Скопировать все пары как JSON-массив' },
107566
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", "aria-label": "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u0440\u044B \u043A\u0430\u043A JSON", onClick: () => void copyGeneratedPairsAsJson(), disabled: generating, sx: {
108458
+ (generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: pairsJsonCopied ? 'Скопировано' : 'Скопировать все пары как JSON-массив' },
108459
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", "aria-label": "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u043F\u0430\u0440\u044B \u043A\u0430\u043A JSON", onClick: () => void copyGeneratedPairsAsJson(), disabled: generating, sx: {
107567
108460
  opacity: 0.28,
107568
108461
  p: 0.35,
107569
108462
  color: 'text.secondary',
107570
108463
  '&:hover': { opacity: 0.75, color: 'text.primary' },
107571
108464
  } },
107572
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], { sx: { fontSize: 16 } }))))),
108465
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_50__["default"], { sx: { fontSize: 16 } }))))),
107573
108466
  loadingContentFromDrive && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: {
107574
108467
  display: 'flex',
107575
108468
  flexDirection: 'column',
@@ -107584,10 +108477,10 @@ ${imageData.originalPrompt}
107584
108477
  : 'rgba(25, 118, 210, 0.05)',
107585
108478
  mb: 2
107586
108479
  } },
107587
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 40, sx: { color: 'primary.main' } }),
108480
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 40, sx: { color: 'primary.main' } }),
107588
108481
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body1", sx: { color: 'text.secondary', fontWeight: 'bold' } }, "\u0417\u0430\u0433\u0440\u0443\u0437\u043A\u0430 \u043A\u043E\u043D\u0442\u0435\u043D\u0442\u0430 \u0438\u0437 Google Drive..."))),
107589
- (generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { spacing: 2 },
107590
- pairTranslationFailed && !translatingPairs && !generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { severity: "warning", action: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { color: "inherit", size: "small", onClick: handleRetryPairTranslation, sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "\u0417\u0430\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u043E\u0434") }, "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u043E\u0434 \u043F\u0430\u0440 \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u0438\u0439 (\u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043A \u043C\u043E\u0434\u0435\u043B\u0438).")) : null,
108482
+ (generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 2 },
108483
+ pairTranslationFailed && !translatingPairs && !generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "warning", action: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { color: "inherit", size: "small", onClick: handleRetryPairTranslation, sx: { textTransform: 'none', whiteSpace: 'nowrap' } }, "\u0417\u0430\u043F\u0440\u043E\u0441\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u043E\u0434") }, "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u043E\u0434 \u043F\u0430\u0440 \u043D\u0430 \u0440\u0443\u0441\u0441\u043A\u0438\u0439 (\u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u043A \u043C\u043E\u0434\u0435\u043B\u0438).")) : null,
107591
108484
  Array.from({
107592
108485
  length: Math.max(generatedTitlesData.length, generatedTextsData.length)
107593
108486
  }, (_, i) => i).map((i) => {
@@ -107598,7 +108491,7 @@ ${imageData.originalPrompt}
107598
108491
  const pairLabel = pairApproach ? pairApproach.name : `пара ${i + 1}`;
107599
108492
  const pairGenerating = (titleData?.generating || textData?.generating);
107600
108493
  const pairFailed = (!pairGenerating && titleData?.failed && textData?.failed);
107601
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { key: i, variant: "outlined", sx: {
108494
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { key: i, variant: "outlined", sx: {
107602
108495
  p: 2,
107603
108496
  borderColor: pairFailed
107604
108497
  ? 'error.main'
@@ -107610,7 +108503,7 @@ ${imageData.originalPrompt}
107610
108503
  ? (theme.palette.mode === 'dark' ? 'rgba(25,118,210,0.05)' : 'rgba(25,118,210,0.02)')
107611
108504
  : 'transparent',
107612
108505
  } },
107613
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { mb: 1.5, flexWrap: 'wrap' } },
108506
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { mb: 1.5, flexWrap: 'wrap' } },
107614
108507
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", sx: {
107615
108508
  fontWeight: 700,
107616
108509
  px: 1,
@@ -107627,16 +108520,16 @@ ${imageData.originalPrompt}
107627
108520
  i + 1),
107628
108521
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary" }, pairLabel),
107629
108522
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flexGrow: 1, minWidth: 8 } }),
107630
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0430\u0440\u0443" },
108523
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0430\u0440\u0443" },
107631
108524
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
107632
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", color: "error", "aria-label": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0430\u0440\u0443", onClick: () => handleDeleteGeneratedPair(i), disabled: pairGenerating || generating },
107633
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], { fontSize: "small" })))),
107634
- translatingPairs && !pairTranslations[i] ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 13, sx: { color: 'text.disabled', ml: 0.5 } })) : null),
107635
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { spacing: 1.5 },
108525
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", color: "error", "aria-label": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0430\u0440\u0443", onClick: () => handleDeleteGeneratedPair(i), disabled: pairGenerating || generating },
108526
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_52__["default"], { fontSize: "small" })))),
108527
+ translatingPairs && !pairTranslations[i] ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 13, sx: { color: 'text.disabled', ml: 0.5 } })) : null),
108528
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 1.5 },
107636
108529
  titleData && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
107637
108530
  titleData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
107638
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16, sx: { color: 'primary.main' } }),
107639
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u2026"))) : titleData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: `Заголовок ${i + 1}`, variant: "outlined", fullWidth: true, size: "small", value: titleData.title, placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0432\u0440\u0443\u0447\u043D\u0443\u044E", helperText: titleData.errorMessage ? `Не сгенерирован: ${titleData.errorMessage}` : 'Можно ввести или исправить заголовок вручную', error: !!titleData.errorMessage, onChange: (e) => {
108531
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16, sx: { color: 'primary.main' } }),
108532
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u2026"))) : titleData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: `Заголовок ${i + 1}`, variant: "outlined", fullWidth: true, size: "small", value: titleData.title, placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0432\u0440\u0443\u0447\u043D\u0443\u044E", helperText: titleData.errorMessage ? `Не сгенерирован: ${titleData.errorMessage}` : 'Можно ввести или исправить заголовок вручную', error: !!titleData.errorMessage, onChange: (e) => {
107640
108533
  const newValue = e.target.value;
107641
108534
  setGeneratedTitlesData(prev => {
107642
108535
  const updated = prev.map(t => t.index === titleData.index
@@ -107651,7 +108544,7 @@ ${imageData.originalPrompt}
107651
108544
  ? 'rgba(244,67,54,0.08)'
107652
108545
  : 'rgba(244,67,54,0.04)'
107653
108546
  }
107654
- } })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: `Заголовок ${i + 1}`, variant: "outlined", fullWidth: true, size: "small", value: titleData.title, onChange: (e) => {
108547
+ } })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: `Заголовок ${i + 1}`, variant: "outlined", fullWidth: true, size: "small", value: titleData.title, onChange: (e) => {
107655
108548
  const newValue = e.target.value;
107656
108549
  setGeneratedTitlesData(prev => {
107657
108550
  const updated = prev.map(t => t.index === titleData.index ? { ...t, title: newValue } : t);
@@ -107676,8 +108569,8 @@ ${imageData.originalPrompt}
107676
108569
  } }, pairTranslations[i].titleRu)) : null)),
107677
108570
  textData && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
107678
108571
  textData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
107679
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16, sx: { color: 'primary.main' } }),
107680
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u0430\u2026"))) : textData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: `Текст ${i + 1}`, variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: textData.text, placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442 \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E", helperText: textData.errorMessage ? `Не сгенерирован: ${textData.errorMessage}` : 'Можно ввести или исправить текст вручную', error: !!textData.errorMessage, onChange: (e) => {
108572
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16, sx: { color: 'primary.main' } }),
108573
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u0413\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044F \u0442\u0435\u043A\u0441\u0442\u0430\u2026"))) : textData.failed ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: `Текст ${i + 1}`, variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: textData.text, placeholder: "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442 \u043E\u0431\u044A\u044F\u0432\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0443\u0447\u043D\u0443\u044E", helperText: textData.errorMessage ? `Не сгенерирован: ${textData.errorMessage}` : 'Можно ввести или исправить текст вручную', error: !!textData.errorMessage, onChange: (e) => {
107681
108574
  const newValue = e.target.value;
107682
108575
  setGeneratedTextsData(prev => {
107683
108576
  const updated = prev.map(t => t.index === textData.index
@@ -107692,7 +108585,7 @@ ${imageData.originalPrompt}
107692
108585
  ? 'rgba(244,67,54,0.08)'
107693
108586
  : 'rgba(244,67,54,0.04)'
107694
108587
  }
107695
- } })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { label: `Текст ${i + 1}`, variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: textData.text, onChange: (e) => {
108588
+ } })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { label: `Текст ${i + 1}`, variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: textData.text, onChange: (e) => {
107696
108589
  const newValue = e.target.value;
107697
108590
  setGeneratedTextsData(prev => {
107698
108591
  const updated = prev.map(t => t.index === textData.index ? { ...t, text: newValue } : t);
@@ -107720,7 +108613,7 @@ ${imageData.originalPrompt}
107720
108613
  }))))),
107721
108614
  (landingGenerationLogs.length > 0 || generatingLanding) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mb: 2 } },
107722
108615
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "h6", gutterBottom: true, sx: { fontWeight: 'bold' } }, "\u041F\u0440\u043E\u0446\u0435\u0441\u0441 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"),
107723
- landingGenerationLogs.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: {
108616
+ landingGenerationLogs.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { sx: {
107724
108617
  p: 2,
107725
108618
  backgroundColor: (theme) => theme.palette.mode === 'dark'
107726
108619
  ? 'rgba(25, 118, 210, 0.1)'
@@ -107744,38 +108637,121 @@ ${imageData.originalPrompt}
107744
108637
  'text.primary'
107745
108638
  } }, log)))))),
107746
108639
  generatingLanding && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 2 } },
107747
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 20 }),
108640
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 20 }),
107748
108641
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", sx: { color: 'text.secondary' } }, formatElapsedTime(elapsedTime.landing)))),
107749
- !generatingLanding && generatedLandingHTML && generatedLandingImageBlob && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "outlined", color: "primary", onClick: handlePreviewLanding, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_58__["default"], null), fullWidth: true }, "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"))))))))),
108642
+ !generatingLanding && generatedLandingHTML && generatedLandingImageBlob && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", color: "primary", onClick: handlePreviewLanding, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_61__["default"], null), fullWidth: true }, "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"))))))))),
107750
108643
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { open: approachLoadChoice !== null, onClose: handleApproachLoadKeepCurrent, maxWidth: "md", fullWidth: true }, approachLoadChoice ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
107751
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], null, "\u041F\u043E\u0434\u0445\u043E\u0434\u044B \u0438\u0437 \u0444\u0430\u0439\u043B\u0430 \u043E\u0444\u0444\u0435\u0440\u0430"),
107752
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], null,
108644
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], null, "\u041F\u043E\u0434\u0445\u043E\u0434\u044B \u0438\u0437 \u0444\u0430\u0439\u043B\u0430 \u043E\u0444\u0444\u0435\u0440\u0430"),
108645
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], null,
107753
108646
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 2 } }, "\u0412 project-settings.json \u0435\u0441\u0442\u044C \u0441\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u044B \u0434\u043B\u044F \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432/\u0442\u0435\u043A\u0441\u0442\u043E\u0432 \u0438 \u0434\u043B\u044F \u043A\u0440\u0435\u043E. \u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0445 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438 \u0438\u043B\u0438 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0442\u0435, \u0447\u0442\u043E \u0443\u0436\u0435 \u0432\u044B\u0431\u0440\u0430\u043D\u044B \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E?"),
107754
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { spacing: 2 },
108647
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { spacing: 2 },
107755
108648
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2" }, "\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 \u0438 \u0442\u0435\u043A\u0441\u0442\u044B (\u043F\u0430\u0440\u044B \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432)"),
107756
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
107757
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
108649
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
108650
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
107758
108651
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", gutterBottom: true }, "\u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438"),
107759
108652
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", component: "div", sx: { whiteSpace: 'pre-wrap', fontFamily: 'inherit' } }, formatPairApproachesForDisplay(approachLoadChoice.currentPairs))),
107760
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
108653
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
107761
108654
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", gutterBottom: true }, "\u0412 \u0444\u0430\u0439\u043B\u0435 \u043E\u0444\u0444\u0435\u0440\u0430"),
107762
108655
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", component: "div", sx: { whiteSpace: 'pre-wrap', fontFamily: 'inherit' } }, approachLoadChoice.savedPairs
107763
108656
  ? formatPairApproachesForDisplay(approachLoadChoice.savedPairs)
107764
108657
  : '— не указано (список для текстов не изменится)'))),
107765
108658
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2" }, "\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F (\u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0443)"),
107766
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
107767
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
108659
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', sm: 'row' }, spacing: 2 },
108660
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
107768
108661
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", gutterBottom: true }, "\u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u0438"),
107769
108662
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", component: "div", sx: { whiteSpace: 'pre-wrap', fontFamily: 'inherit' } }, formatImageCountsForDisplay(approachLoadChoice.currentCounts))),
107770
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
108663
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], { variant: "outlined", sx: { p: 1.5, flex: 1 } },
107771
108664
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", gutterBottom: true }, "\u0412 \u0444\u0430\u0439\u043B\u0435 \u043E\u0444\u0444\u0435\u0440\u0430"),
107772
108665
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", component: "div", sx: { whiteSpace: 'pre-wrap', fontFamily: 'inherit' } }, approachLoadChoice.savedCounts
107773
108666
  ? formatImageCountsForDisplay(approachLoadChoice.savedCounts)
107774
108667
  : '— не указано (количества крео не изменятся)'))))),
107775
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_36__["default"], null,
107776
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { onClick: handleApproachLoadKeepCurrent }, "\u041E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u0441\u0435\u0439\u0447\u0430\u0441"),
107777
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { variant: "contained", onClick: handleApproachLoadApplyFromFile }, "\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437 \u0444\u0430\u0439\u043B\u0430")))) : null),
107778
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PromptManagerDialog__WEBPACK_IMPORTED_MODULE_59__["default"], { open: promptManagerOpen, onClose: () => setPromptManagerOpen(false) }))));
108668
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], null,
108669
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: handleApproachLoadKeepCurrent }, "\u041E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u0441\u0435\u0439\u0447\u0430\u0441"),
108670
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", onClick: handleApproachLoadApplyFromFile }, "\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437 \u0444\u0430\u0439\u043B\u0430")))) : null),
108671
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { open: settingsFileMissingDialog.open, onClose: (_, reason) => {
108672
+ if (settingsFileMissingDialog.retrying)
108673
+ return;
108674
+ if (reason === 'backdropClick' || reason === 'escapeKeyDown') {
108675
+ handleSettingsFileMissingDismissOk();
108676
+ }
108677
+ }, maxWidth: "sm", fullWidth: true },
108678
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], null, "\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u044B"),
108679
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], null,
108680
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 1 } },
108681
+ "\u0412 \u043F\u0430\u043F\u043A\u0435 \u043D\u0435\u0442 \u0444\u0430\u0439\u043B\u0430 ",
108682
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("code", null, "project-settings.json"),
108683
+ " (\u0438\u043B\u0438 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0435\u0433\u043E",
108684
+ ' ',
108685
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("code", null, "temp-generated-content.json"),
108686
+ ") \u2014 \u0432 \u043A\u043E\u0440\u043D\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 \u0438\u043B\u0438 \u0432 \u043F\u0430\u043F\u043A\u0435 ",
108687
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("code", null, "env"),
108688
+ "."),
108689
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, "\u041C\u043E\u0436\u043D\u043E \u043F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 (\u0438\u043D\u043E\u0433\u0434\u0430 Google \u0414\u0438\u0441\u043A \u0435\u0449\u0451 \u043D\u0435 \u043E\u0442\u0434\u0430\u043B \u0441\u043F\u0438\u0441\u043E\u043A \u0444\u0430\u0439\u043B\u043E\u0432) \u0438\u043B\u0438 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u043A\u0430\u043A \u0435\u0441\u0442\u044C, \u0435\u0441\u043B\u0438 \u0434\u043B\u044F \u044D\u0442\u043E\u0439 \u043F\u0430\u043F\u043A\u0438 \u0444\u0430\u0439\u043B\u0430 \u0438 \u043D\u0435 \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C."),
108690
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary" }, "\u041F\u043E\u043A\u0430 \u043E\u043A\u043D\u043E \u043E\u0442\u043A\u0440\u044B\u0442\u043E, \u0430\u0432\u0442\u043E\u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435 \u0438 \u0437\u0430\u043F\u0438\u0441\u044C \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u0432 \u044D\u0442\u0443 \u043F\u0430\u043F\u043A\u0443 \u043D\u0430 \u0414\u0438\u0441\u043A\u0435 \u043D\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u2014 \u0447\u0442\u043E\u0431\u044B \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u0444\u0430\u0439\u043B, \u043F\u043E\u043A\u0430 \u0432\u044B \u043D\u0435 \u0440\u0435\u0448\u0438\u0442\u0435, \u0435\u0441\u0442\u044C \u043B\u0438 \u0443\u0436\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438.")),
108691
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], { sx: { px: 3, pb: 2, gap: 1 } },
108692
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: handleSettingsFileMissingRetry, variant: "outlined", disabled: settingsFileMissingDialog.retrying, startIcon: settingsFileMissingDialog.retrying ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { size: 16, color: "inherit" }) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_59__["default"], null) }, "\u041F\u0435\u0440\u0435\u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C"),
108693
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: handleSettingsFileMissingDismissOk, variant: "contained", disabled: settingsFileMissingDialog.retrying }, "\u044D\u0442\u043E \u043D\u043E\u0440\u043C\u0430\u043B\u044C\u043D\u043E"))),
108694
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PromptManagerDialog__WEBPACK_IMPORTED_MODULE_62__["default"], { open: promptManagerOpen, onClose: () => setPromptManagerOpen(false) }),
108695
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { open: settingsBackupDialogOpen, onClose: () => {
108696
+ setSettingsBackupDialogOpen(false);
108697
+ setSettingsImportBundle(null);
108698
+ setSettingsImportFlags(null);
108699
+ }, maxWidth: "md", fullWidth: true, scroll: "paper" },
108700
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: {
108701
+ display: 'flex',
108702
+ alignItems: 'center',
108703
+ justifyContent: 'space-between',
108704
+ gap: 1,
108705
+ pr: 1
108706
+ } },
108707
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { component: "span", variant: "h6", sx: { fontSize: '1.1rem' } }, "\u0420\u0435\u0437\u0435\u0440\u0432\u043D\u0430\u044F \u043A\u043E\u043F\u0438\u044F \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A (\u044D\u0442\u043E \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E)"),
108708
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { "aria-label": "\u0437\u0430\u043A\u0440\u044B\u0442\u044C", onClick: () => {
108709
+ setSettingsBackupDialogOpen(false);
108710
+ setSettingsImportBundle(null);
108711
+ setSettingsImportFlags(null);
108712
+ }, size: "small" },
108713
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null))),
108714
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_34__["default"], { dividers: true, sx: { maxHeight: { xs: '70vh', sm: '75vh' } } },
108715
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 2 } },
108716
+ "\u041F\u0440\u043E\u043C\u043F\u0442\u044B, \u043E\u0432\u0435\u0440\u0440\u0430\u0439\u0434\u044B, \u043F\u043E\u0434\u0445\u043E\u0434\u044B (\u0432\u043A\u043B\u044E\u0447\u0430\u044F \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0439 \u0438 \u043F\u043E-\u0441\u0442\u0440\u043E\u0447\u043D\u044B\u0435 \u0440\u0435\u0436\u0438\u043C\u044B \u0431\u0443\u043B\u043B\u0435\u0442\u043E\u0432 \u0432\u043D\u0443\u0442\u0440\u0438 promptOverrides), \u043C\u043E\u0434\u0435\u043B\u0438; \u043F\u0440\u0438 \u043E\u0442\u043C\u0435\u0447\u0435\u043D\u043D\u044B\u0445 \u043E\u043F\u0446\u0438\u044F\u0445 \u2014 Google OAuth, \u043A\u043B\u044E\u0447 OpenRouter, \u0442\u043E\u043A\u0435\u043D\u044B. \u041A\u044D\u0448 URL \u043F\u0430\u043F\u043E\u043A Drive \u0432 \u0431\u0430\u043D\u0434\u043B \u043D\u0435 \u0432\u0445\u043E\u0434\u0438\u0442. \u041D\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043F\u0430\u043F\u043A\u0438 \u043E\u0444\u0444\u0435\u0440\u043E\u0432 \u0438 project-settings \u043D\u0430 Google Drive. \u0424\u0430\u0439\u043B JSON: format = ",
108717
+ _appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.SETTINGS_BUNDLE_FORMAT,
108718
+ ", \u0432\u0435\u0440\u0441\u0438\u044F 1."),
108719
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: { xs: 'column', md: 'row' }, spacing: 3, alignItems: "flex-start" },
108720
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flex: 1, minWidth: 260 } },
108721
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2", sx: { mb: 1, fontWeight: 600 } }, "\u042D\u043A\u0441\u043F\u043E\u0440\u0442"),
108722
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_37__["default"], null,
108723
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.promptOverrides, onChange: e => setSettingsExportFlags(f => ({ ...f, promptOverrides: e.target.checked })) }), label: "\u041F\u0440\u043E\u043C\u043F\u0442\u044B \u0438 \u043F\u043E\u0434\u0445\u043E\u0434\u044B (\u043A\u0440\u0435\u043E, \u043F\u0430\u0440\u044B, \u0441\u0447\u0451\u0442\u0447\u0438\u043A\u0438, \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0435 \u0442\u0435\u043A\u0441\u0442\u044B, \u0442\u0443\u043C\u0431\u043B\u0435\u0440\u044B \u0431\u0443\u043B\u043B\u0435\u0442\u043E\u0432: \u0432\u0435\u0437\u0434\u0435 / \u043F\u043E \u043F\u043E\u0434\u0445\u043E\u0434\u0430\u043C \u2014 \u0432\u0441\u0451 \u0432 promptOverrides)" }),
108724
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.localStorageUi, onChange: e => setSettingsExportFlags(f => ({ ...f, localStorageUi: e.target.checked })) }), label: "\u041C\u043E\u0434\u0435\u043B\u0438, \u0432\u0430\u043B\u0438\u0434\u0430\u0442\u043E\u0440, \u0442\u0435\u043C\u0430, \u0441\u043E\u043E\u0442\u043D\u043E\u0448\u0435\u043D\u0438\u0435 \u0441\u0442\u043E\u0440\u043E\u043D" }),
108725
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.googleOAuth, onChange: e => setSettingsExportFlags(f => ({ ...f, googleOAuth: e.target.checked })) }), label: "Google Client ID / Secret (\u0438\u0437 config)" }),
108726
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.openRouterKey, onChange: e => setSettingsExportFlags(f => ({ ...f, openRouterKey: e.target.checked })) }), label: "\u041A\u043B\u044E\u0447 OpenRouter (\u0438\u0437 config; \u0445\u0440\u0430\u043D\u0438\u0442\u0435 \u0444\u0430\u0439\u043B \u0432 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438)" }),
108727
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.flexCardKey, onChange: e => setSettingsExportFlags(f => ({ ...f, flexCardKey: e.target.checked })) }), label: "\u041A\u043B\u044E\u0447 FlexCard API (\u0438\u0437 config)" }),
108728
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsExportFlags.googleTokens, onChange: e => setSettingsExportFlags(f => ({ ...f, googleTokens: e.target.checked })) }), label: "\u0422\u043E\u043A\u0435\u043D\u044B Google (\u0434\u043E\u0441\u0442\u0443\u043F/\u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435) \u2014 \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0432\u044B\u043A\u043B., \u0440\u0438\u0441\u043A \u0443\u0442\u0435\u0447\u043A\u0438" })),
108729
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", sx: { mt: 2 }, onClick: handleSettingsExport }, "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C JSON\u2026")),
108730
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { flex: 1, minWidth: 260 } },
108731
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "subtitle2", sx: { mb: 1, fontWeight: 600 } }, "\u0418\u043C\u043F\u043E\u0440\u0442"),
108732
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "outlined", onClick: () => settingsImportFileInputRef.current?.click() }, "\u0412\u044B\u0431\u0440\u0430\u0442\u044C JSON\u2026"),
108733
+ settingsImportBundle && settingsImportFlags && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { mt: 2, p: 1.5, border: 1, borderColor: 'divider', borderRadius: 1 } },
108734
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { variant: "caption", color: "text.secondary", display: "block", sx: { mb: 1 } },
108735
+ "\u0424\u0430\u0439\u043B: ",
108736
+ settingsImportBundle.exportedAt ? new Date(settingsImportBundle.exportedAt).toLocaleString() : '—'),
108737
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_37__["default"], null,
108738
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsImportFlags.promptOverrides, disabled: !(0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.getPresentSections)(settingsImportBundle).promptOverrides, onChange: e => setSettingsImportFlags(f => f ? { ...f, promptOverrides: e.target.checked } : f) }), label: "\u041F\u0440\u043E\u043C\u043F\u0442\u044B \u0438 \u043F\u043E\u0434\u0445\u043E\u0434\u044B" }),
108739
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsImportFlags.localStorage, disabled: !(0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.getPresentSections)(settingsImportBundle).localStorage, onChange: e => setSettingsImportFlags(f => f ? { ...f, localStorage: e.target.checked } : f) }), label: "LocalStorage (\u043C\u043E\u0434\u0435\u043B\u0438, \u0442\u0435\u043C\u0430, \u043A\u044D\u0448 \u043F\u0430\u043F\u043E\u043A, \u2026)" }),
108740
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { checked: settingsImportFlags.electronConfig, disabled: !(0,_appSettingsBundle__WEBPACK_IMPORTED_MODULE_64__.getPresentSections)(settingsImportBundle).electronConfig, onChange: e => setSettingsImportFlags(f => f ? { ...f, electronConfig: e.target.checked } : f) }), label: "Config: OAuth, \u043A\u043B\u044E\u0447, \u0442\u043E\u043A\u0435\u043D\u044B (\u0435\u0441\u043B\u0438 \u0435\u0441\u0442\u044C \u0432 \u0444\u0430\u0439\u043B\u0435)" })),
108741
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { direction: "row", spacing: 1, sx: { mt: 2 } },
108742
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { variant: "contained", onClick: handleSettingsImportApply }, "\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C"),
108743
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: () => {
108744
+ setSettingsImportBundle(null);
108745
+ setSettingsImportFlags(null);
108746
+ } }, "\u041E\u0442\u043C\u0435\u043D\u0430"))))))),
108747
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_35__["default"], null,
108748
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { onClick: () => {
108749
+ setSettingsBackupDialogOpen(false);
108750
+ setSettingsImportBundle(null);
108751
+ setSettingsImportFlags(null);
108752
+ } }, "\u0417\u0430\u043A\u0440\u044B\u0442\u044C"))),
108753
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_38__["default"], { open: settingsBackupSnackbar.open, autoHideDuration: 7000, onClose: () => setSettingsBackupSnackbar(s => ({ ...s, open: false })), anchorOrigin: { vertical: 'bottom', horizontal: 'center' } },
108754
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { onClose: () => setSettingsBackupSnackbar(s => ({ ...s, open: false })), severity: settingsBackupSnackbar.severity, variant: "filled", sx: { width: '100%' } }, settingsBackupSnackbar.message)))));
107779
108755
  }
107780
108756
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);
107781
108757
 
@@ -107814,25 +108790,28 @@ __webpack_require__.r(__webpack_exports__);
107814
108790
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tab/Tab.js");
107815
108791
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tooltip/Tooltip.js");
107816
108792
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Checkbox/Checkbox.js");
107817
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Accordion/Accordion.js");
107818
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionSummary/AccordionSummary.js");
107819
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionDetails/AccordionDetails.js");
107820
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogActions/DialogActions.js");
107821
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Snackbar/Snackbar.js");
107822
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Cancel.js");
107823
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Close.js");
107824
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CompareArrows.js");
107825
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Edit.js");
107826
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
107827
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowDown.js");
107828
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowUp.js");
107829
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/RestartAlt.js");
107830
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Save.js");
107831
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Search.js");
107832
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
107833
- /* harmony import */ var _prompts__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./prompts */ "./src/prompts.ts");
107834
- /* harmony import */ var _landingPrompts__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./landingPrompts */ "./src/landingPrompts.ts");
107835
- /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
108793
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControl/FormControl.js");
108794
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Select/Select.js");
108795
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/MenuItem/MenuItem.js");
108796
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Accordion/Accordion.js");
108797
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionSummary/AccordionSummary.js");
108798
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionDetails/AccordionDetails.js");
108799
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogActions/DialogActions.js");
108800
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Snackbar/Snackbar.js");
108801
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Cancel.js");
108802
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Close.js");
108803
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CompareArrows.js");
108804
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Edit.js");
108805
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
108806
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowDown.js");
108807
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowUp.js");
108808
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/RestartAlt.js");
108809
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Save.js");
108810
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Search.js");
108811
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
108812
+ /* harmony import */ var _prompts__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./prompts */ "./src/prompts.ts");
108813
+ /* harmony import */ var _landingPrompts__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./landingPrompts */ "./src/landingPrompts.ts");
108814
+ /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
107836
108815
 
107837
108816
 
107838
108817
 
@@ -107845,11 +108824,11 @@ function TabPanel(props) {
107845
108824
  }
107846
108825
  /** Подсказка для кнопки типа товара: списки подходов для текстов и картинок (номера как в таблицах). */
107847
108826
  function productTypePresetTooltip(label) {
107848
- const textNums = _promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PRODUCT_TYPE_TEXT_PAIR_PRESETS[label];
108827
+ const textNums = _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PRODUCT_TYPE_TEXT_PAIR_PRESETS[label];
107849
108828
  if (!textNums)
107850
108829
  return label;
107851
108830
  const sortedText = [...textNums].sort((a, b) => a - b);
107852
- const imgPreset = _promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PRODUCT_TYPE_IMAGE_PRESETS[label];
108831
+ const imgPreset = _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PRODUCT_TYPE_IMAGE_PRESETS[label];
107853
108832
  const sortedImg = imgPreset ? [...imgPreset].sort((a, b) => a - b) : null;
107854
108833
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { py: 0.25, maxWidth: 380, color: 'common.white', fontSize: '0.75rem' } },
107855
108834
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", component: "div", sx: { fontWeight: 700, mb: 0.75, display: 'block', color: 'inherit' } },
@@ -107861,7 +108840,7 @@ function productTypePresetTooltip(label) {
107861
108840
  n,
107862
108841
  "."),
107863
108842
  " ",
107864
- _prompts__WEBPACK_IMPORTED_MODULE_36__.PAIR_APPROACH_POOL[n - 1]?.name ?? '—')))),
108843
+ _prompts__WEBPACK_IMPORTED_MODULE_39__.PAIR_APPROACH_POOL[n - 1]?.name ?? '—')))),
107865
108844
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", component: "div", sx: { fontWeight: 700, mb: 0.75, display: 'block', color: 'inherit' } },
107866
108845
  "\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",
107867
108846
  sortedImg ? ` — ${sortedImg.length} подходов` : '',
@@ -107871,7 +108850,7 @@ function productTypePresetTooltip(label) {
107871
108850
  n,
107872
108851
  "."),
107873
108852
  " ",
107874
- _prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES[n - 1]?.name ?? '—'))))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", sx: { display: 'block', lineHeight: 1.5, opacity: 0.85, color: 'inherit' } }, "\u0412\u0441\u0435 10 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 \u043F\u043E 1 \u043A\u0440\u0435\u043E (\u043D\u0435\u0442 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0435\u0441\u0435\u0442\u0430)"))));
108853
+ _prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES[n - 1]?.name ?? '—'))))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", sx: { display: 'block', lineHeight: 1.5, opacity: 0.85, color: 'inherit' } }, "\u0412\u0441\u0435 10 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 \u043F\u043E 1 \u043A\u0440\u0435\u043E (\u043D\u0435\u0442 \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0440\u0435\u0441\u0435\u0442\u0430)"))));
107875
108854
  }
107876
108855
  function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder, helperText, fullWidth = true, multiline = true }) {
107877
108856
  const [searchOpen, setSearchOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
@@ -107956,7 +108935,7 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
107956
108935
  border: '1px solid',
107957
108936
  borderColor: 'divider',
107958
108937
  } },
107959
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
108938
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
107960
108939
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { ref: searchInputRef, value: searchQuery, onChange: (e) => { setSearchQuery(e.target.value); setCurrentMatch(0); }, onKeyDown: handleKeyDown, placeholder: "\u041F\u043E\u0438\u0441\u043A...", style: {
107961
108940
  border: 'none',
107962
108941
  outline: 'none',
@@ -107969,11 +108948,11 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
107969
108948
  }, autoFocus: true }),
107970
108949
  searchQuery && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", sx: { color: 'text.secondary', whiteSpace: 'nowrap', minWidth: 50, textAlign: 'center' } }, matches.length > 0 ? `${currentMatch + 1} / ${matches.length}` : 'нет')),
107971
108950
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => navigateToMatch(currentMatch - 1), disabled: matches.length === 0, sx: { p: 0.3 } },
107972
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: { fontSize: 18 } })),
108951
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 18 } })),
107973
108952
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => navigateToMatch(currentMatch + 1), disabled: matches.length === 0, sx: { p: 0.3 } },
107974
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: { fontSize: 18 } })),
108953
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: { fontSize: 18 } })),
107975
108954
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(false); setSearchQuery(''); }, sx: { p: 0.3 } },
107976
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_26__["default"], { sx: { fontSize: 18 } })))),
108955
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_29__["default"], { sx: { fontSize: 18 } })))),
107977
108956
  !searchOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(true); setTimeout(() => searchInputRef.current?.focus(), 50); }, sx: {
107978
108957
  position: 'absolute',
107979
108958
  top: 8,
@@ -107984,7 +108963,7 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
107984
108963
  bgcolor: 'background.paper',
107985
108964
  boxShadow: 1,
107986
108965
  } },
107987
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 16 } }))),
108966
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { fontSize: 16 } }))),
107988
108967
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { inputRef: textareaRef, fullWidth: fullWidth, multiline: multiline, rows: rows, value: value, onChange: onChange, disabled: disabled, placeholder: placeholder, helperText: helperText, onKeyDown: handleTextareaKeyDown, sx: {
107989
108968
  '& .MuiInputBase-input': {
107990
108969
  fontFamily: '"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace',
@@ -108146,7 +109125,7 @@ function DiffViewer({ oldText, newText }) {
108146
109125
  border: '1px solid',
108147
109126
  borderColor: 'divider',
108148
109127
  } },
108149
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
109128
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
108150
109129
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { ref: searchInputRef, value: searchQuery, onChange: (e) => { setSearchQuery(e.target.value); setCurrentMatch(0); }, onKeyDown: handleSearchKeyDown, placeholder: "\u041F\u043E\u0438\u0441\u043A...", style: {
108151
109130
  border: 'none',
108152
109131
  outline: 'none',
@@ -108159,11 +109138,11 @@ function DiffViewer({ oldText, newText }) {
108159
109138
  }, autoFocus: true }),
108160
109139
  searchQuery && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", sx: { color: 'text.secondary', whiteSpace: 'nowrap', minWidth: 50, textAlign: 'center' } }, totalMatches > 0 ? `${currentMatch + 1} / ${totalMatches}` : 'нет')),
108161
109140
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => navigateMatch(-1), disabled: totalMatches === 0, sx: { p: 0.3 } },
108162
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: { fontSize: 18 } })),
109141
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 18 } })),
108163
109142
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => navigateMatch(1), disabled: totalMatches === 0, sx: { p: 0.3 } },
108164
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: { fontSize: 18 } })),
109143
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_33__["default"], { sx: { fontSize: 18 } })),
108165
109144
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(false); setSearchQuery(''); }, sx: { p: 0.3 } },
108166
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_26__["default"], { sx: { fontSize: 18 } })))),
109145
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_29__["default"], { sx: { fontSize: 18 } })))),
108167
109146
  !searchOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(true); setTimeout(() => searchInputRef.current?.focus(), 50); }, sx: {
108168
109147
  position: 'absolute',
108169
109148
  top: 28,
@@ -108174,7 +109153,7 @@ function DiffViewer({ oldText, newText }) {
108174
109153
  bgcolor: 'background.paper',
108175
109154
  boxShadow: 1,
108176
109155
  } },
108177
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 16 } }))),
109156
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { fontSize: 16 } }))),
108178
109157
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 1, sx: { mb: 1 }, alignItems: "center" },
108179
109158
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `+${stats.added}`, size: "small", sx: { bgcolor: '#e6ffec', color: '#1a7f37', fontWeight: 'bold', fontFamily: 'monospace' } }),
108180
109159
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `−${stats.removed}`, size: "small", sx: { bgcolor: '#ffebe9', color: '#cf222e', fontWeight: 'bold', fontFamily: 'monospace' } })),
@@ -108243,17 +109222,17 @@ function PromptManagerDialog({ open, onClose }) {
108243
109222
  // selectedApproaches: array of indices from PAIR_APPROACH_POOL, ordered
108244
109223
  const [selectedApproaches, setSelectedApproaches] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([0, 1, 2]);
108245
109224
  // imageApproachCounts: по одному на каждый подход (CREO_APPROACHES), каждый 0–MAX_IMAGES_PER_CREO_APPROACH
108246
- const [imageApproachCounts, setImageApproachCounts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => Array(_prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.length).fill(1));
109225
+ const [imageApproachCounts, setImageApproachCounts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => Array(_prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.length).fill(1));
108247
109226
  const [creoToastOpen, setCreoToastOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
108248
109227
  const [creoToastMessage, setCreoToastMessage] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
108249
109228
  const creoToastDebounceRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
108250
109229
  // Загрузить оверрайды при открытии
108251
109230
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
108252
109231
  if (open) {
108253
- const loaded = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.loadPromptOverrides)();
109232
+ const loaded = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.loadPromptOverrides)();
108254
109233
  setOverrides(loaded);
108255
- setSelectedApproaches((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.getSelectedPairApproaches)());
108256
- setImageApproachCounts((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.getImageApproachCounts)());
109234
+ setSelectedApproaches((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.getSelectedPairApproaches)());
109235
+ setImageApproachCounts((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.getImageApproachCounts)());
108257
109236
  setHasChanges(false);
108258
109237
  }
108259
109238
  }, [open]);
@@ -108291,7 +109270,7 @@ function PromptManagerDialog({ open, onClose }) {
108291
109270
  });
108292
109271
  };
108293
109272
  const handleImageApproachCountChange = (idx, count) => {
108294
- const clamped = Math.max(0, Math.min(_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.MAX_IMAGES_PER_CREO_APPROACH, count));
109273
+ const clamped = Math.max(0, Math.min(_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.MAX_IMAGES_PER_CREO_APPROACH, count));
108295
109274
  setImageApproachCounts(prev => {
108296
109275
  const next = [...prev];
108297
109276
  if (idx >= 0 && idx < next.length)
@@ -108369,15 +109348,15 @@ function PromptManagerDialog({ open, onClose }) {
108369
109348
  else {
108370
109349
  console.log(debugMsg, overrides);
108371
109350
  }
108372
- (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.savePromptOverrides)(overrides);
108373
- window.dispatchEvent(new Event(_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PROMPT_OVERRIDES_SAVED_EVENT));
109351
+ (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.savePromptOverrides)(overrides);
109352
+ window.dispatchEvent(new Event(_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PROMPT_OVERRIDES_SAVED_EVENT));
108374
109353
  setHasChanges(false);
108375
109354
  onClose();
108376
109355
  };
108377
109356
  const handleCancel = () => {
108378
109357
  if (hasChanges) {
108379
109358
  if (window.confirm('Есть несохраненные изменения. Закрыть без сохранения?')) {
108380
- setOverrides((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.loadPromptOverrides)());
109359
+ setOverrides((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.loadPromptOverrides)());
108381
109360
  setHasChanges(false);
108382
109361
  onClose();
108383
109362
  }
@@ -108391,23 +109370,23 @@ function PromptManagerDialog({ open, onClose }) {
108391
109370
  const getOriginalPrompt = (promptName) => {
108392
109371
  switch (promptName) {
108393
109372
  case 'getPairsSystemPrompt':
108394
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getPairsSystemPrompt)('${geo}', true, selectedApproaches.length, selectedApproaches);
109373
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getPairsSystemPrompt)('${geo}', true, selectedApproaches.length, selectedApproaches);
108395
109374
  case 'getPairsUserPrompt':
108396
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getPairsUserPrompt)('${product}', '${geo}', '${additionalInfo}', true, selectedApproaches.length, selectedApproaches);
109375
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getPairsUserPrompt)('${product}', '${geo}', '${additionalInfo}', true, selectedApproaches.length, selectedApproaches);
108397
109376
  case 'getTitlesSystemPrompt':
108398
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getTitlesSystemPrompt)('${geo}', true, selectedApproaches.length);
109377
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getTitlesSystemPrompt)('${geo}', true, selectedApproaches.length);
108399
109378
  case 'getTextsSystemPrompt':
108400
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getTextsSystemPrompt)('${geo}', true, selectedApproaches.length);
109379
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getTextsSystemPrompt)('${geo}', true, selectedApproaches.length);
108401
109380
  case 'getUserPrompt':
108402
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getUserPrompt)('${product}', '${geo}', '${additionalInfo}', 'titles', true, selectedApproaches.length);
109381
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getUserPrompt)('${product}', '${geo}', '${additionalInfo}', 'titles', true, selectedApproaches.length);
108403
109382
  case 'getValidationPrompt':
108404
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getValidationPrompt)('${product}', '${geo}', ['keyword1', 'keyword2'], '${approachName}', true, 'Новая по брифу: 29 EUR; старая (2×): 58 EUR — в рантайме подставляется из поля цены; в кастомном промпте плейсхолдер ${priceBrief}');
109383
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getValidationPrompt)('${product}', '${geo}', ['keyword1', 'keyword2'], '${approachName}', true, 'Новая по брифу: 29 EUR; старая (2×): 58 EUR — в рантайме подставляется из поля цены; в кастомном промпте плейсхолдер ${priceBrief}', { expectNoBullets: true });
108405
109384
  case 'getImageGenerationBasePrompt':
108406
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getImageGenerationBasePrompt)('${generateGeo}', '${generatePrice}', '${generateCurrency}', true);
109385
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_39__.getImageGenerationBasePrompt)('${generateGeo}', '${generatePrice}', '${generateCurrency}', true);
108407
109386
  case 'getLandingPageSystemPrompt':
108408
- return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_37__.getLandingPageSystemPrompt)(true);
109387
+ return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_40__.getLandingPageSystemPrompt)(true);
108409
109388
  case 'getLandingPageUserPrompt':
108410
- return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_37__.getLandingPageUserPrompt)('${product}', '${geo}', true);
109389
+ return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_40__.getLandingPageUserPrompt)('${product}', '${geo}', true);
108411
109390
  default:
108412
109391
  return '';
108413
109392
  }
@@ -108429,18 +109408,18 @@ function PromptManagerDialog({ open, onClose }) {
108429
109408
  enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
108430
109409
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", value: viewMode, exclusive: true, onChange: (_, val) => val && setViewModes(prev => ({ ...prev, [viewModeKey]: val })) },
108431
109410
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "edit" },
108432
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_28__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
109411
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
108433
109412
  " \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440"),
108434
109413
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "diff" },
108435
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_27__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
109414
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
108436
109415
  " Diff")),
108437
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_32__["default"], null), onClick: () => handleResetPrompt(promptName) }, "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C")))),
109416
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_35__["default"], null), onClick: () => handleResetPrompt(promptName) }, "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C")))),
108438
109417
  description && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, description)),
108439
109418
  enabled && viewMode === 'diff' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DiffViewer, { oldText: originalPrompt, newText: customPrompt })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SearchableTextField, { rows: 15, value: displayPrompt, onChange: (e) => handlePromptChange(promptName, e.target.value), disabled: !enabled, placeholder: enabled ? 'Введите кастомный промпт' : 'Включите переключатель для редактирования', helperText: !enabled ? 'Это оригинальный промпт. Включите переключатель выше для редактирования.' : undefined }))));
108440
109419
  };
108441
109420
  // Управление подходами для изображений
108442
109421
  const handleApproachToggle = (approachName, enabled) => {
108443
- const originalApproach = _prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.find(a => a.name === approachName);
109422
+ const originalApproach = _prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.find(a => a.name === approachName);
108444
109423
  if (!originalApproach)
108445
109424
  return;
108446
109425
  setOverrides(prev => {
@@ -108490,7 +109469,7 @@ function PromptManagerDialog({ open, onClose }) {
108490
109469
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { open: open, onClose: handleCancel, maxWidth: "lg", fullWidth: true },
108491
109470
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__["default"], null,
108492
109471
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center" },
108493
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_35__["default"], null),
109472
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_38__["default"], null),
108494
109473
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "h6" }, "\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u043C\u043F\u0442\u0430\u043C\u0438"),
108495
109474
  hasChanges && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: "\u0415\u0441\u0442\u044C \u043D\u0435\u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u043D\u044B\u0435 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u044F", color: "warning", size: "small" })))),
108496
109475
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], null,
@@ -108506,7 +109485,7 @@ function PromptManagerDialog({ open, onClose }) {
108506
109485
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `Выбрано: ${selectedApproaches.length}`, color: "primary", size: "small" }),
108507
109486
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary" }, "(\u043C\u0438\u043D\u0438\u043C\u0443\u043C 2, \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C 10)")),
108508
109487
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary", sx: { display: 'block', mb: 0.75 } }, "\u0422\u0438\u043F \u0442\u043E\u0432\u0430\u0440\u0430 \u2014 \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u043D\u0430\u0431\u043E\u0440 \u043F\u0430\u0440 \u0442\u0435\u043A\u0441\u0442\u043E\u0432 \u0438 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 \u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\u043C (1\u201310 = \u2116 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u043A\u0430\u0436\u0434\u043E\u0439 \u0442\u0430\u0431\u043B\u0438\u0446\u0435):"),
108509
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", flexWrap: "wrap", gap: 0.75, sx: { mb: 1.5 } }, Object.entries(_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PRODUCT_TYPE_TEXT_PAIR_PRESETS).map(([label, nums]) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { key: label, title: productTypePresetTooltip(label), placement: "top", arrow: true, enterDelay: 200, componentsProps: {
109488
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", flexWrap: "wrap", gap: 0.75, sx: { mb: 1.5 } }, Object.entries(_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PRODUCT_TYPE_TEXT_PAIR_PRESETS).map(([label, nums]) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { key: label, title: productTypePresetTooltip(label), placement: "top", arrow: true, enterDelay: 200, componentsProps: {
108510
109489
  tooltip: {
108511
109490
  sx: {
108512
109491
  maxWidth: 420,
@@ -108519,13 +109498,13 @@ function PromptManagerDialog({ open, onClose }) {
108519
109498
  },
108520
109499
  } },
108521
109500
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", variant: "outlined", color: "inherit", sx: { textTransform: 'none', fontSize: '0.8rem' }, onClick: () => {
108522
- const next = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.productPresetNumbersToIndices)(nums);
109501
+ const next = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.productPresetNumbersToIndices)(nums);
108523
109502
  if (next.length < 2)
108524
109503
  return;
108525
- const imgNums = _promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PRODUCT_TYPE_IMAGE_PRESETS[label];
109504
+ const imgNums = _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.PRODUCT_TYPE_IMAGE_PRESETS[label];
108526
109505
  const nextImageCounts = imgNums
108527
- ? (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.productPresetNumbersToImageCounts)(imgNums)
108528
- : Array(_prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.length).fill(1);
109506
+ ? (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_41__.productPresetNumbersToImageCounts)(imgNums)
109507
+ : Array(_prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.length).fill(1);
108529
109508
  setSelectedApproaches(next);
108530
109509
  setImageApproachCounts(nextImageCounts);
108531
109510
  setOverrides(o => ({
@@ -108545,7 +109524,7 @@ function PromptManagerDialog({ open, onClose }) {
108545
109524
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc', whiteSpace: 'nowrap', width: 140 } }, "\u0423\u0433\u043E\u043B"),
108546
109525
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc' } }, "\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A"),
108547
109526
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc' } }, "\u0422\u0435\u043A\u0441\u0442"))),
108548
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_36__.PAIR_APPROACH_POOL.map((p, i) => {
109527
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_39__.PAIR_APPROACH_POOL.map((p, i) => {
108549
109528
  const checked = selectedApproaches.includes(i);
108550
109529
  const isLast = checked && selectedApproaches.length <= 2;
108551
109530
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", { key: i, onClick: () => handlePairApproachToggle(i), style: {
@@ -108563,22 +109542,39 @@ function PromptManagerDialog({ open, onClose }) {
108563
109542
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', color: '#777' } }, p.textApproach.split('\n')[0])));
108564
109543
  }))))),
108565
109544
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { mb: 3, p: 2, border: '1px solid', borderColor: 'divider', borderRadius: 1 } },
108566
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 1.5 } },
109545
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 1.5, flexWrap: 'wrap' } },
108567
109546
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle1", sx: { fontWeight: 600 } }, "\u041F\u043E\u0434\u0445\u043E\u0434\u044B \u0434\u043B\u044F \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439"),
108568
109547
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `Всего: ${imageApproachCounts.reduce((a, b) => a + b, 0)}`, color: "primary", size: "small" }),
108569
109548
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary" },
108570
109549
  "(0\u2013",
108571
- _promptOverrides__WEBPACK_IMPORTED_MODULE_38__.MAX_IMAGES_PER_CREO_APPROACH,
109550
+ _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.MAX_IMAGES_PER_CREO_APPROACH,
108572
109551
  " \u043D\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 \u043F\u043E\u0434\u0445\u043E\u0434)")),
109552
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { sx: { mb: 1.5, display: 'flex' }, control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { size: "small", checked: Boolean(overrides.imageBulletsGlobalOff), onChange: (_, c) => {
109553
+ setOverrides(o => {
109554
+ const n = { ...o };
109555
+ if (c)
109556
+ n.imageBulletsGlobalOff = true;
109557
+ else
109558
+ delete n.imageBulletsGlobalOff;
109559
+ return n;
109560
+ });
109561
+ setHasChanges(true);
109562
+ } }), label: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], null,
109563
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "body2" }, "\u0412\u0435\u0437\u0434\u0435 \u0431\u0435\u0437 \u043E\u0431\u044F\u0437\u0430\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u0431\u0443\u043B\u043B\u0435\u0442\u043E\u0432"),
109564
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary", display: "block" }, "\u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u044E \u0438 \u0432\u0430\u043B\u0438\u0434\u0430\u0442\u043E\u0440. \u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442\u0441\u044F \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F, \u043D\u0435 \u0432 \u043F\u0430\u043F\u043A\u0443 \u043E\u0444\u0444\u0435\u0440\u0430. \u041F\u0435\u0440\u0435\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u00AB\u0432\u043A\u043B.\u00BB \u0432 \u0441\u0442\u0440\u043E\u043A\u0435.")) }),
108573
109565
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { overflowX: 'auto' } },
108574
109566
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("table", { style: { width: '100%', borderCollapse: 'collapse', fontSize: 12 } },
108575
109567
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("thead", null,
108576
109568
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", null,
108577
109569
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'center', padding: '4px 8px', borderBottom: '1px solid #ccc', width: 70 } }, "\u041A\u043E\u043B-\u0432\u043E"),
108578
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc', whiteSpace: 'nowrap', width: 180 } }, "\u041F\u043E\u0434\u0445\u043E\u0434"),
109570
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc', whiteSpace: 'nowrap', maxWidth: 200 } }, "\u041F\u043E\u0434\u0445\u043E\u0434"),
109571
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc', minWidth: 200 } },
109572
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { title: "\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E = \u043A\u0430\u043A \u0432 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043F\u0440\u0438\u043B\u043E\u0436\u0435\u043D\u0438\u044F. \u00AB\u0412\u043A\u043B.\u00BB \u0441 \u0431\u0443\u043B\u043B\u0435\u0442\u0430\u043C\u0438 \u0442\u043E\u043B\u044C\u043A\u043E \u0435\u0441\u043B\u0438 \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0439 \u0442\u0443\u043C\u0431\u043B\u0435\u0440 \u0432\u044B\u0448\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D.", arrow: true, placement: "top" },
109573
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u0411\u0443\u043B\u043B\u0435\u0442\u044B"))),
108579
109574
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc' } }, "\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435"))),
108580
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.map((approach, i) => {
109575
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.map((approach, i) => {
108581
109576
  const count = imageApproachCounts[i] ?? 0;
109577
+ const mode = overrides.imageApproachNoBulletsMode?.[approach.name] ?? 'default';
108582
109578
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", { key: i, style: { opacity: count > 0 ? 1 : 0.6 } },
108583
109579
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { textAlign: 'center', padding: '2px 8px', verticalAlign: 'middle' } },
108584
109580
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { type: "number", size: "small", value: count, onChange: (e) => {
@@ -108586,13 +109582,35 @@ function PromptManagerDialog({ open, onClose }) {
108586
109582
  handleImageApproachCountChange(i, isNaN(v) ? 0 : v);
108587
109583
  }, onBlur: handleImageCountBlur, inputProps: {
108588
109584
  min: 0,
108589
- max: _promptOverrides__WEBPACK_IMPORTED_MODULE_38__.MAX_IMAGES_PER_CREO_APPROACH,
109585
+ max: _promptOverrides__WEBPACK_IMPORTED_MODULE_41__.MAX_IMAGES_PER_CREO_APPROACH,
108590
109586
  step: 1,
108591
109587
  onWheel: (e) => {
108592
109588
  e.preventDefault();
108593
109589
  },
108594
109590
  }, sx: { width: 56, '& .MuiInputBase-input': { textAlign: 'center', py: 0.5 } } })),
108595
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', fontWeight: 500, whiteSpace: 'nowrap' } }, approach.name),
109591
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', fontWeight: 500, whiteSpace: 'normal' } }, approach.name),
109592
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', verticalAlign: 'middle' } },
109593
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { size: "small", sx: { minWidth: 168 } },
109594
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { value: mode, onChange: e => {
109595
+ const v = e.target.value;
109596
+ setOverrides(o => {
109597
+ const m = { ...(o.imageApproachNoBulletsMode || {}) };
109598
+ if (v === 'default') {
109599
+ delete m[approach.name];
109600
+ }
109601
+ else {
109602
+ m[approach.name] = v;
109603
+ }
109604
+ return {
109605
+ ...o,
109606
+ imageApproachNoBulletsMode: Object.keys(m).length > 0 ? m : undefined,
109607
+ };
109608
+ });
109609
+ setHasChanges(true);
109610
+ } },
109611
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { value: "default" }, "\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E"),
109612
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { value: "off" }, "\u0412\u044B\u043A\u043B. (0 \u0431\u0443\u043B\u043B\u0435\u0442\u043E\u0432)"),
109613
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { value: "on" }, "\u0412\u043A\u043B. (3 \u0432\u044B\u0433\u043E\u0434\u044B)")))),
108596
109614
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', color: '#777' } }, approach.prompt.split('\n')[0])));
108597
109615
  }))))),
108598
109616
  renderPromptEditor('getPairsSystemPrompt', 'Системный промпт (пары заголовок + текст)', 'Единый системный промпт, генерирующий все пары одним запросом. Переменные: ${geo}, ${count}, ${n}'),
@@ -108600,29 +109618,29 @@ function PromptManagerDialog({ open, onClose }) {
108600
109618
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabPanel, { value: tabValue, index: 1 },
108601
109619
  renderPromptEditor('getImageGenerationBasePrompt', 'Базовый промпт для изображений', 'Базовый промпт, используемый для всех подходов'),
108602
109620
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "h6", sx: { mt: 3, mb: 2 } }, "\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u043F\u043E\u0434\u0445\u043E\u0434\u043E\u0432 \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u043A\u0440\u0435\u0430\u0442\u0438\u0432\u043E\u0432"),
108603
- _prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.map((approach) => {
109621
+ _prompts__WEBPACK_IMPORTED_MODULE_39__.CREO_APPROACHES.map((approach) => {
108604
109622
  const override = overrides.creoApproaches?.[approach.name];
108605
109623
  const enabled = override?.enabled || false;
108606
109624
  const approachViewKey = `approach_${approach.name}`;
108607
109625
  const approachViewMode = viewModes[approachViewKey] || 'edit';
108608
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { key: approach.name, sx: { mb: 2 } },
108609
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_29__["default"], null) },
109626
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { key: approach.name, sx: { mb: 2 } },
109627
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_32__["default"], null) },
108610
109628
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { width: '100%', mr: 2 } },
108611
109629
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle1" }, approach.name),
108612
109630
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: enabled ? 'Кастомный' : 'Оригинал', color: enabled ? 'primary' : 'default', size: "small" }),
108613
- enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_32__["default"], null), onClick: (e) => {
109631
+ enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { size: "small", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_35__["default"], null), onClick: (e) => {
108614
109632
  e.stopPropagation();
108615
109633
  handleResetApproach(approach.name);
108616
109634
  } }, "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C")))),
108617
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], null,
109635
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], null,
108618
109636
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 2 } },
108619
109637
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { checked: enabled, onChange: (e) => handleApproachToggle(approach.name, e.target.checked) }), label: "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u043A\u0430\u0441\u0442\u043E\u043C\u043D\u044B\u0439 \u043F\u043E\u0434\u0445\u043E\u0434" }),
108620
109638
  enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], { size: "small", value: approachViewMode, exclusive: true, onChange: (_, val) => val && setViewModes(prev => ({ ...prev, [approachViewKey]: val })) },
108621
109639
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "edit" },
108622
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_28__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
109640
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
108623
109641
  " \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440"),
108624
109642
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "diff" },
108625
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_27__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
109643
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
108626
109644
  " Diff")))),
108627
109645
  enabled && approachViewMode === 'diff' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], null,
108628
109646
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle2", sx: { mb: 1 } }, "\u041F\u0440\u043E\u043C\u043F\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u0430"),
@@ -108645,10 +109663,300 @@ function PromptManagerDialog({ open, onClose }) {
108645
109663
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabPanel, { value: tabValue, index: 3 },
108646
109664
  renderPromptEditor('getLandingPageSystemPrompt', 'Промпт лендинга (System)', 'Системный промпт для генерации лендинг-страниц'),
108647
109665
  renderPromptEditor('getLandingPageUserPrompt', 'Промпт лендинга (User)', 'Пользовательский промпт для генерации лендинг-страниц'))),
108648
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], null,
108649
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { onClick: handleCancel, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_25__["default"], null) }, "\u041E\u0442\u043C\u0435\u043D\u0430"),
108650
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { onClick: handleSave, variant: "contained", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_33__["default"], null), disabled: !hasChanges }, "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C")),
108651
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { open: creoToastOpen, autoHideDuration: 3000, onClose: () => setCreoToastOpen(false), message: creoToastMessage, anchorOrigin: { vertical: 'bottom', horizontal: 'center' } })));
109666
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], null,
109667
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { onClick: handleCancel, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_28__["default"], null) }, "\u041E\u0442\u043C\u0435\u043D\u0430"),
109668
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], { onClick: handleSave, variant: "contained", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_36__["default"], null), disabled: !hasChanges }, "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C")),
109669
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], { open: creoToastOpen, autoHideDuration: 3000, onClose: () => setCreoToastOpen(false), message: creoToastMessage, anchorOrigin: { vertical: 'bottom', horizontal: 'center' } })));
109670
+ }
109671
+
109672
+
109673
+ /***/ }),
109674
+
109675
+ /***/ "./src/appSettingsBundle.ts":
109676
+ /*!**********************************!*\
109677
+ !*** ./src/appSettingsBundle.ts ***!
109678
+ \**********************************/
109679
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
109680
+
109681
+ "use strict";
109682
+ __webpack_require__.r(__webpack_exports__);
109683
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
109684
+ /* harmony export */ CURRENT_SETTINGS_BUNDLE_VERSION: () => (/* binding */ CURRENT_SETTINGS_BUNDLE_VERSION),
109685
+ /* harmony export */ DEFAULT_EXPORT_FLAGS: () => (/* binding */ DEFAULT_EXPORT_FLAGS),
109686
+ /* harmony export */ LOCAL_STORAGE_UI_KEYS: () => (/* binding */ LOCAL_STORAGE_UI_KEYS),
109687
+ /* harmony export */ SETTINGS_BUNDLE_FORMAT: () => (/* binding */ SETTINGS_BUNDLE_FORMAT),
109688
+ /* harmony export */ applyLocalStorageFromBundle: () => (/* binding */ applyLocalStorageFromBundle),
109689
+ /* harmony export */ applyPromptOverridesFromBundle: () => (/* binding */ applyPromptOverridesFromBundle),
109690
+ /* harmony export */ buildSettingsBundle: () => (/* binding */ buildSettingsBundle),
109691
+ /* harmony export */ getPresentSections: () => (/* binding */ getPresentSections),
109692
+ /* harmony export */ mergeElectronImport: () => (/* binding */ mergeElectronImport),
109693
+ /* harmony export */ parseSettingsBundleJson: () => (/* binding */ parseSettingsBundleJson),
109694
+ /* harmony export */ serializeBundle: () => (/* binding */ serializeBundle)
109695
+ /* harmony export */ });
109696
+ /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
109697
+ /**
109698
+ * Экспорт / импорт локальных настроек (localStorage, promptOverrides, фрагменты config.json Electron).
109699
+ * Не включает данные офферов на Google Drive.
109700
+ */
109701
+
109702
+ const SETTINGS_BUNDLE_FORMAT = 'docs-combiner-settings';
109703
+ const CURRENT_SETTINGS_BUNDLE_VERSION = 1;
109704
+ /** Ключи localStorage: UI + модели + валидатор (без кэша Drive) */
109705
+ const LOCAL_STORAGE_UI_KEYS = [
109706
+ 'themeMode',
109707
+ 'selectedImageModelSquare',
109708
+ 'selectedImageModelRect',
109709
+ 'selectedImageModel',
109710
+ 'selectedValidationModel',
109711
+ 'selectedContentModel',
109712
+ 'selectedLandingModel',
109713
+ 'validationDisabled',
109714
+ 'autoRemakeOnValidatorError',
109715
+ 'uploadAfterValidatorOk',
109716
+ 'imageAspectRatio',
109717
+ ];
109718
+ const DEFAULT_EXPORT_FLAGS = {
109719
+ promptOverrides: true,
109720
+ localStorageUi: true,
109721
+ googleOAuth: false,
109722
+ openRouterKey: false,
109723
+ flexCardKey: false,
109724
+ googleTokens: false,
109725
+ };
109726
+ function collectLocalStorageKeys(keys) {
109727
+ const out = {};
109728
+ for (const k of keys) {
109729
+ try {
109730
+ const v = localStorage.getItem(k);
109731
+ if (v !== null)
109732
+ out[k] = v;
109733
+ }
109734
+ catch {
109735
+ // ignore
109736
+ }
109737
+ }
109738
+ return out;
109739
+ }
109740
+ /**
109741
+ * Собрать бандл для сохранения в JSON.
109742
+ * `fullElectronConfig` — результат `loadConfig()` в Electron, иначе null (секции из config не попадут).
109743
+ */
109744
+ function buildSettingsBundle(flags, fullElectronConfig) {
109745
+ const bundle = {
109746
+ format: SETTINGS_BUNDLE_FORMAT,
109747
+ version: 1,
109748
+ exportedAt: new Date().toISOString(),
109749
+ };
109750
+ if (flags.promptOverrides) {
109751
+ try {
109752
+ bundle.promptOverrides = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.loadPromptOverrides)();
109753
+ }
109754
+ catch {
109755
+ // ignore
109756
+ }
109757
+ }
109758
+ const ls = {};
109759
+ if (flags.localStorageUi) {
109760
+ Object.assign(ls, collectLocalStorageKeys(LOCAL_STORAGE_UI_KEYS));
109761
+ }
109762
+ if (Object.keys(ls).length)
109763
+ bundle.localStorage = ls;
109764
+ if (fullElectronConfig && typeof fullElectronConfig === 'object') {
109765
+ const ec = {};
109766
+ if (flags.googleOAuth) {
109767
+ if (typeof fullElectronConfig.clientId === 'string')
109768
+ ec.clientId = fullElectronConfig.clientId;
109769
+ if (typeof fullElectronConfig.clientSecret === 'string')
109770
+ ec.clientSecret = fullElectronConfig.clientSecret;
109771
+ }
109772
+ if (flags.openRouterKey && typeof fullElectronConfig.openaiApiKey === 'string') {
109773
+ ec.openaiApiKey = fullElectronConfig.openaiApiKey;
109774
+ }
109775
+ if (flags.flexCardKey && typeof fullElectronConfig.flexcardApiKey === 'string') {
109776
+ ec.flexcardApiKey = fullElectronConfig.flexcardApiKey;
109777
+ }
109778
+ if (flags.googleTokens) {
109779
+ if (typeof fullElectronConfig.accessToken === 'string')
109780
+ ec.accessToken = fullElectronConfig.accessToken;
109781
+ if (typeof fullElectronConfig.refreshToken === 'string')
109782
+ ec.refreshToken = fullElectronConfig.refreshToken;
109783
+ }
109784
+ if (Object.keys(ec).length)
109785
+ bundle.electronConfig = ec;
109786
+ }
109787
+ return bundle;
109788
+ }
109789
+ function serializeBundle(bundle) {
109790
+ return JSON.stringify(bundle, null, 2);
109791
+ }
109792
+ function parseSettingsBundleJson(text) {
109793
+ let data;
109794
+ try {
109795
+ data = JSON.parse(text);
109796
+ }
109797
+ catch (e) {
109798
+ throw new Error('Файл не является корректным JSON');
109799
+ }
109800
+ if (!data || typeof data !== 'object')
109801
+ throw new Error('Некорректная структура файла');
109802
+ const o = data;
109803
+ if (o.format !== SETTINGS_BUNDLE_FORMAT) {
109804
+ throw new Error('Не файл настроек Docs Combiner (неверный format)');
109805
+ }
109806
+ if (o.version !== 1) {
109807
+ throw new Error(`Версия бандла ${String(o.version)} не поддерживается (ожидается 1)`);
109808
+ }
109809
+ return o;
109810
+ }
109811
+ /** Какие блоки реально есть в бандле — для чекбоксов импорта */
109812
+ function getPresentSections(bundle) {
109813
+ return {
109814
+ promptOverrides: bundle.promptOverrides != null && Object.keys(bundle.promptOverrides).length > 0,
109815
+ localStorage: bundle.localStorage != null && Object.keys(bundle.localStorage).length > 0,
109816
+ electronConfig: bundle.electronConfig != null && Object.keys(bundle.electronConfig).length > 0,
109817
+ };
109818
+ }
109819
+ /**
109820
+ * Импортирует настройки. Возвращает, что сделать с React (вызвать из App).
109821
+ */
109822
+ function applyLocalStorageFromBundle(bundle, importLocal) {
109823
+ if (!importLocal || !bundle.localStorage)
109824
+ return { keysWritten: [] };
109825
+ const keysWritten = [];
109826
+ let themeMode;
109827
+ for (const [k, v] of Object.entries(bundle.localStorage)) {
109828
+ try {
109829
+ localStorage.setItem(k, v);
109830
+ keysWritten.push(k);
109831
+ if (k === 'themeMode' && (v === 'dark' || v === 'light'))
109832
+ themeMode = v;
109833
+ }
109834
+ catch {
109835
+ // ignore
109836
+ }
109837
+ }
109838
+ return { keysWritten, themeMode };
109839
+ }
109840
+ /**
109841
+ * `savePromptOverrides` + событие синхронизации. Имеет смысл вызывать после `applyLocalStorageFromBundle`, чтобы перезаписать сырой ключ `promptOverrides` в localStorage, если он был в файле.
109842
+ */
109843
+ function applyPromptOverridesFromBundle(bundle, on) {
109844
+ if (!on || !bundle.promptOverrides)
109845
+ return;
109846
+ (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.savePromptOverrides)(bundle.promptOverrides);
109847
+ try {
109848
+ window.dispatchEvent(new Event(_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.PROMPT_OVERRIDES_SAVED_EVENT));
109849
+ }
109850
+ catch {
109851
+ // ignore
109852
+ }
109853
+ }
109854
+ /**
109855
+ * Слияние electron-конфига. Только перечисленные поля из `bundle.electronConfig`, остальное в `current` не трогаем.
109856
+ */
109857
+ function mergeElectronImport(current, bundle, on) {
109858
+ if (!on || !bundle.electronConfig)
109859
+ return current;
109860
+ const next = { ...current };
109861
+ const ec = bundle.electronConfig;
109862
+ [
109863
+ 'clientId',
109864
+ 'clientSecret',
109865
+ 'openaiApiKey',
109866
+ 'flexcardApiKey',
109867
+ 'telegramBotToken',
109868
+ 'telegramChatId',
109869
+ 'accessToken',
109870
+ 'refreshToken',
109871
+ ].forEach(f => {
109872
+ if (ec[f] !== undefined)
109873
+ next[f] = ec[f];
109874
+ });
109875
+ return next;
109876
+ }
109877
+
109878
+
109879
+ /***/ }),
109880
+
109881
+ /***/ "./src/flexcardBalance.ts":
109882
+ /*!********************************!*\
109883
+ !*** ./src/flexcardBalance.ts ***!
109884
+ \********************************/
109885
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
109886
+
109887
+ "use strict";
109888
+ __webpack_require__.r(__webpack_exports__);
109889
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
109890
+ /* harmony export */ FLEXCARD_FINANCE_ACCOUNTS_URL: () => (/* binding */ FLEXCARD_FINANCE_ACCOUNTS_URL),
109891
+ /* harmony export */ fetchFlexCardFinanceAccountsUsdTotal: () => (/* binding */ fetchFlexCardFinanceAccountsUsdTotal)
109892
+ /* harmony export */ });
109893
+ /**
109894
+ * FlexCard — `GET /api/v1/finance/accounts/` с `X-API-Key`.
109895
+ * Суммируем только поле `balance` (строка или число) по строкам с `currency` === USD.
109896
+ */
109897
+ const FLEXCARD_FINANCE_ACCOUNTS_URL = 'https://flexcard.cards/api/v1/finance/accounts/';
109898
+ function num(v) {
109899
+ if (typeof v === 'number' && !Number.isNaN(v))
109900
+ return v;
109901
+ const n = parseFloat(String(v));
109902
+ return Number.isFinite(n) ? n : 0;
109903
+ }
109904
+ async function fetchPaginatedResults(apiKey, initialUrl) {
109905
+ const trimmed = apiKey.trim();
109906
+ const out = [];
109907
+ let url = initialUrl;
109908
+ for (let page = 0; page < 50 && url; page++) {
109909
+ const res = await fetch(url, {
109910
+ method: 'GET',
109911
+ headers: {
109912
+ 'X-API-Key': trimmed,
109913
+ Accept: 'application/json',
109914
+ },
109915
+ });
109916
+ if (!res.ok)
109917
+ return null;
109918
+ const data = (await res.json());
109919
+ let batch;
109920
+ let next;
109921
+ if (Array.isArray(data)) {
109922
+ batch = data;
109923
+ next = null;
109924
+ }
109925
+ else if (data && typeof data === 'object') {
109926
+ const o = data;
109927
+ const r = o.results;
109928
+ batch = Array.isArray(r) ? r : [];
109929
+ next = o.next ?? null;
109930
+ if (!Array.isArray(r))
109931
+ return null;
109932
+ }
109933
+ else {
109934
+ return null;
109935
+ }
109936
+ out.push(...batch);
109937
+ url = next ?? null;
109938
+ }
109939
+ return out;
109940
+ }
109941
+ /** Сумма `balance` по всем счетам с валютой USD. */
109942
+ async function fetchFlexCardFinanceAccountsUsdTotal(apiKey) {
109943
+ const trimmed = apiKey.trim();
109944
+ if (!trimmed)
109945
+ return null;
109946
+ const rows = await fetchPaginatedResults(trimmed, FLEXCARD_FINANCE_ACCOUNTS_URL);
109947
+ if (rows === null)
109948
+ return null;
109949
+ let sum = 0;
109950
+ for (const raw of rows) {
109951
+ if (!raw || typeof raw !== 'object')
109952
+ continue;
109953
+ const r = raw;
109954
+ const cur = String(r.currency ?? '').toUpperCase();
109955
+ if (cur !== 'USD' && cur !== 'US')
109956
+ continue;
109957
+ sum += num(r.balance);
109958
+ }
109959
+ return sum;
108652
109960
  }
108653
109961
 
108654
109962
 
@@ -108871,6 +110179,8 @@ __webpack_require__.r(__webpack_exports__);
108871
110179
  /* harmony export */ applyParsedApproachesFromDrive: () => (/* binding */ applyParsedApproachesFromDrive),
108872
110180
  /* harmony export */ getCreoApproachOverride: () => (/* binding */ getCreoApproachOverride),
108873
110181
  /* harmony export */ getImageApproachCounts: () => (/* binding */ getImageApproachCounts),
110182
+ /* harmony export */ getImageApproachNoBulletsMode: () => (/* binding */ getImageApproachNoBulletsMode),
110183
+ /* harmony export */ getImageBulletsGlobalOff: () => (/* binding */ getImageBulletsGlobalOff),
108874
110184
  /* harmony export */ getPairsCount: () => (/* binding */ getPairsCount),
108875
110185
  /* harmony export */ getPromptOverride: () => (/* binding */ getPromptOverride),
108876
110186
  /* harmony export */ getSelectedPairApproaches: () => (/* binding */ getSelectedPairApproaches),
@@ -109000,6 +110310,19 @@ function normalizeImageApproachCountsFromDrive(raw) {
109000
110310
  return null;
109001
110311
  return out;
109002
110312
  }
110313
+ /**
110314
+ * «Везде без обязательных буллетов» (генерация + валидатор). Через `promptOverrides` (localStorage).
110315
+ */
110316
+ function getImageBulletsGlobalOff() {
110317
+ return Boolean(loadPromptOverrides().imageBulletsGlobalOff);
110318
+ }
110319
+ /** Режим буллетов для крео-подхода; без записи = default. */
110320
+ function getImageApproachNoBulletsMode(approachName) {
110321
+ const raw = loadPromptOverrides().imageApproachNoBulletsMode?.[approachName];
110322
+ if (raw === 'off' || raw === 'on' || raw === 'default')
110323
+ return raw;
110324
+ return 'default';
110325
+ }
109003
110326
  /**
109004
110327
  * Получить количество изображений по каждому подходу (N элементов, 0–MAX_IMAGES_PER_CREO_APPROACH).
109005
110328
  * По умолчанию — по 1 на каждый подход.
@@ -109217,8 +110540,10 @@ __webpack_require__.r(__webpack_exports__);
109217
110540
  /* harmony export */ PAIR_APPROACH_POOL: () => (/* binding */ PAIR_APPROACH_POOL),
109218
110541
  /* harmony export */ TEXTS_APPROACH_POOL: () => (/* binding */ TEXTS_APPROACH_POOL),
109219
110542
  /* harmony export */ TITLES_APPROACH_POOL: () => (/* binding */ TITLES_APPROACH_POOL),
110543
+ /* harmony export */ getCreoApproachBaseNameFromImageLabel: () => (/* binding */ getCreoApproachBaseNameFromImageLabel),
109220
110544
  /* harmony export */ getCreoApproachExpandedTasks: () => (/* binding */ getCreoApproachExpandedTasks),
109221
110545
  /* harmony export */ getCreoApproaches: () => (/* binding */ getCreoApproaches),
110546
+ /* harmony export */ getEffectiveCreoNoBullets: () => (/* binding */ getEffectiveCreoNoBullets),
109222
110547
  /* harmony export */ getImageGenerationBasePrompt: () => (/* binding */ getImageGenerationBasePrompt),
109223
110548
  /* harmony export */ getPairsSystemPrompt: () => (/* binding */ getPairsSystemPrompt),
109224
110549
  /* harmony export */ getPairsUserPrompt: () => (/* binding */ getPairsUserPrompt),
@@ -109276,6 +110601,24 @@ function pickOne(arr) {
109276
110601
  function shuffle(arr) {
109277
110602
  return [...arr].sort(() => Math.random() - 0.5);
109278
110603
  }
110604
+ /** Суффикс ` (1:1)` / ` (2:3)` в подписи слота — убрать, чтобы сопоставить с CREO_APPROACHES. */
110605
+ function getCreoApproachBaseNameFromImageLabel(approachLabel) {
110606
+ return approachLabel.replace(/\s+\((1:1|2:3)\)\s*$/, '').trim() || approachLabel;
110607
+ }
110608
+ /**
110609
+ * Итог: буллет-блок **не** использовать (0 буллетов), с учётом глобального и per-approach в promptOverrides
110610
+ * и умолчания `noBullets` в `CREO_APPROACHES`.
110611
+ */
110612
+ function getEffectiveCreoNoBullets(approach) {
110613
+ if ((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getImageBulletsGlobalOff)())
110614
+ return true;
110615
+ const mode = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getImageApproachNoBulletsMode)(approach.name);
110616
+ if (mode === 'off')
110617
+ return true;
110618
+ if (mode === 'on')
110619
+ return false;
110620
+ return Boolean(approach.noBullets);
110621
+ }
109279
110622
  /** Выбрать 3 случайных буллета по правилам подхода (1 из каждой категории, порядок случайный) */
109280
110623
  function pickRandomBullets(approachName) {
109281
110624
  const categories = APPROACH_BULLET_CATEGORIES[approachName];
@@ -109658,32 +111001,58 @@ function getValidationProductReferencePreamble() {
109658
111001
  ---
109659
111002
  `;
109660
111003
  }
111004
+ function getValidationPromptBulletAddendum(expectNoBullets) {
111005
+ if (expectNoBullets === undefined)
111006
+ return '';
111007
+ if (expectNoBullets) {
111008
+ return `
111009
+
111010
+ ---
111011
+ АВТО — БУЛЛЕТЫ ДЛЯ ЭТОГО КРЕО (подмешано приложением):
111012
+ - Отдельный вертикальный список из трёх выгод с «галочками»/иконками **не** требуется. Не пиши ОШИБКИ «нет 3 буллетов», «нужен список выгод», «недостаточно буллетов».
111013
+ - Не добавляй в список ОШИБОК пункты по вертикальности, «ровно 3», иконкам у буллетов, читаемости буллетов.`;
111014
+ }
111015
+ return `
111016
+
111017
+ ---
111018
+ АВТО — БУЛЛЕТЫ ДЛЯ ЭТОГО КРЕО (подмешано приложением):
111019
+ - Должны быть **три** отдельные короткие выгоды (вертикальный список), с визуальными галочками/иконками, **вне** банки/упаковки. **ОШИБКА**, если визуально **нет** такого блока или **меньше трёх** отдельных читаемых строк (не путай с ценой/скидкой).`;
111020
+ }
109661
111021
  /**
109662
111022
  * Промпт для валидации рекламных креативов.
109663
111023
  * `keywords` — только для подстановки в кастомный override (${keywords}); в дефолтном тексте не используется.
111024
+ * `options.expectNoBullets` — true: не требовать 3 буллета; false: требовать три выгоды-строки. undefined: как «true» (как раньше).
109664
111025
  */
109665
111026
  function getValidationPrompt(product, geo, keywords, approachName, noOverride,
109666
111027
  /** Краткий эталон цен из приложения (новая + ожидаемая старая при -50%); пусто — без сверки чисел */
109667
- priceBrief) {
111028
+ priceBrief, options) {
111029
+ const expectNoBullets = options?.expectNoBullets !== false;
109668
111030
  if (!noOverride) {
109669
111031
  const override = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getPromptOverride)('getValidationPrompt');
109670
111032
  if (override?.enabled && override.customPrompt) {
109671
111033
  const approachLine = approachName?.trim() ? `\nПОДХОД: ${approachName.trim()}\n` : '\n';
109672
- return override.customPrompt
111034
+ const base = override.customPrompt
109673
111035
  .replace(/\$\{product\}/g, product)
109674
111036
  .replace(/\$\{geo\}/g, geo)
109675
111037
  .replace(/\$\{keywords\}/g, keywords.join(', '))
109676
111038
  .replace(/\$\{approachLine\}/g, approachLine)
109677
111039
  .replace(/\$\{priceBrief\}/g, priceBrief?.trim() || 'В приложении бриф цены не задан — сверяй только визуально две цены и -50%.');
111040
+ return base + getValidationPromptBulletAddendum(options?.expectNoBullets);
109678
111041
  }
109679
111042
  }
109680
111043
  const approachLine = approachName?.trim() ? `\nПОДХОД: ${approachName.trim()}\n` : '\n';
109681
111044
  const isScreenshotReviews = (approachName?.trim() ?? '') === 'Скрин отзывов';
109682
- // Буллеты валидатором не проверяются (ни количество, ни наличие)
109683
- const step0BulletsHint = 'BULLETS: кратко опиши, что видишь на макете (для справки). Количество и наличие буллетов НЕ валидируются.';
109684
- const step2Bullets = `ШАГ 2БУЛЛЕТЫ:
111045
+ const step0BulletsHint = expectNoBullets
111046
+ ? 'BULLETS: кратко опиши, что видишь (для справки). Для **этого** крео отдельные три benefit-строки с «галочками» **не** обязательны; не используй для вердикта требований «ровно 3».'
111047
+ : 'BULLETS: укажи, видишь ли **три** отдельные короткие выгоды (вертикальный список, иконки/✓) вне банки. Если **нет** трёх различимых строк явно напиши «< 3» или «нет списка».';
111048
+ const step2Bullets = expectNoBullets
111049
+ ? `ШАГ 2 — БУЛЛЕТЫ:
109685
111050
  - Не проверяй и не оценивай количество, отсутствие или наличие буллетов. 0, 1, 2, 3 и больше — всё допустимо.
109686
- - НЕ добавляй в финальный список ошибок ни одного пункта, связанного с буллетами (вертикальность, «ровно 3», иконки, читаемость буллетов и т.п.).`;
111051
+ - НЕ добавляй в финальный список ошибок ни одного пункта, связанного с буллетами (вертикальность, «ровно 3», иконки, читаемость буллетов и т.п.).`
111052
+ : `ШАГ 2 — БУЛЛЕТЫ (жёстко для этого крео):
111053
+ - Должны присутствовать **три** отдельные короткие выгоды, визуально как вертикальный список, с иконками/галочками, **вне** упаковки/банки.
111054
+ - **ОШИБКА**, если визуально **нет** такого блока, **меньше трёх** читаемых отдельных строк, или неразличимы 3 смысла. Не путай с ценой, скидкой и CTA.
111055
+ - **ОШИБКА**, если выгоды печатны **на** банке/этикетке (должны быть в рекламном слое, не на продукте).`;
109687
111056
  const priceBriefTrim = priceBrief?.trim() || '';
109688
111057
  const stepPriceBrief = priceBriefTrim
109689
111058
  ? `ШАГ P — ЦЕНЫ (сначала макет, потом бриф):
@@ -109693,12 +111062,16 @@ ${priceBriefTrim}
109693
111062
  1) ВНУТРЕННЯЯ ЛОГИКА НА МАКЕТЕ (главное):
109694
111063
  - Должны быть видны две суммы: новая (акционная) и старая (зачёркнутая). Числовое отношение: старая ≈ вдвое новой при скидке -50% (допуск до ~2% из‑за округления; «1 180» и «1180» — одно и то же). На макете **не должно** быть текста «2×»/«2x» перед суммой как множитель — только две суммы (см. ШАГ 4).
109695
111064
  - Если отношение старая/новая ≈ 2 (в пределах допуска) — это уже доказательство корректной пары -50% на макете. В этом случае ЗАПРЕЩЕНО выводить ОШИБКУ формулировками вроде «выдуманные цены», «неверные суммы», «не соответствуют брифу» — даже если цифры в брифе другие или бриф кажется не тем.
109696
- - Если пара математически согласована с -50% и процент «-50%» где‑либо читаем в зоне оффера (см. ШАГ 4) — не придумывай расхождение с брифом из‑за символа валюты (€ / EUR / MXN и т.д.) или пробелов.
111065
+ - Если пара математически согласована с -50% и процент «-50%» где‑либо читаем в зоне оффера (см. ШАГ 4) — не придумывай расхождение с брифом из‑за **эквивалентного написания той же валюты**, что в брифе: символ ↔ код ↔ локальное слово для **одной** валюты (например € / EUR / «евро» для евро; $ / USD; MXN и т.п.) и из‑за пробелов/типографики. Это **не** отменяет пункт 1a ниже: другая денежная единица — всегда ошибка.
111066
+
111067
+ 1a) ВАЛЮТА ОБЯЗАТЕЛЬНО КАК В БРИФЕ (критично):
111068
+ - В брифе указана конкретная валюта (например EUR). На макете в блоке цен должна быть **именно она** (символ €, код EUR, или привычное для GEO написание «евро» **как валюта цены**, если это явно евро). **ОШИБКА, НУЖНА ПЕРЕСБОРКА**, если читается **иная** национальная валюта или её сокращение: при брифе EUR — **лв**, **лв.**, BGN, **лев**, руб/₽, zł, lei, kn, Kč и любые другие явные обозначения **не евро** рядом с суммами. Пример из практики: «50 лв» / «25 лв» при брифе в EUR — **недопустимо**, даже если 50/25 математически дают -50%.
111069
+ - Если валюту на макете нельзя прочитать уверенно — не гадай в пользу OK: при явном брифе с кодом валюты лучше отметь риск; при двусмысленности между двумя валютами — **ОШИБКА** или явное требование пересборки с читаемой валютой из брифа.
109697
111070
 
109698
111071
  2) СВЕРКА С БРИФОМ (только когда сопоставимо):
109699
111072
  - Сравнивай число НОВОЙ цены с брифом ТОЛЬКО если валюта на макете явно та же, что в брифе (EUR↔EUR, MXN↔MXN и т.д.; символ € и код EUR — одна валюта). Допускается разное оформление числа (пробелы тысяч, запятая/точка).
109700
- - Если валюта на креативе другая, чем в брифе, или не уверен в коде валютыне требуй совпадения цифр с брифом: достаточно пункта (1).
109701
- - Ошибку по ценам ставь только если: (а) на макете нет двух цен / нет согласованности -50%, ИЛИ (б) валюта однозначно совпадает с брифом, а число новой цены явно другое (не в пределах округления).
111073
+ - Если валюта на креативе **однозначно другая**, чем в брифе это уже **ОШИБКА** по п. 1a; совпадение цифр не спасает. Если валюта нечитаемасм. п. 1a. Если валюта совпадает с брифом сравнивай числа как раньше.
111074
+ - Ошибку по ценам ставь если: (а) на макете нет двух цен / нет согласованности -50%, ИЛИ (а') **неверная валюта относительно брифа** (п. 1a), ИЛИ (б) валюта однозначно совпадает с брифом, а число новой цены явно другое (не в пределах округления).
109702
111075
 
109703
111076
  3) Цена не должна быть оформлена как строка буллета с галочкой — отдельный блок.`
109704
111077
  : `ШАГ P — ЦЕНЫ (бриф числом не задан):
@@ -109759,10 +111132,11 @@ ${step3OtherText}
109759
111132
  - Если скидка указана и она не равна -50% — ошибка.
109760
111133
 
109761
111134
  ШАГ 5 — ЯЗЫК (критично):
109762
- - В рекламном тексте (HOOK/HEADLINE, текст на буллетах если есть, CTA/PRICE/DISCOUNT/OTHER_TEXT) НЕТ английских слов. Если есть — ошибка.
109763
- - ИСКЛЮЧЕНИЕ: внутри **графики интерфейса телефона** (шапка окна приложения, подпись вкладки вроде «Reviews», «App Store»-стиль бейджа в углу рамки) английские слова **не** считать ошибкой это имитация ОС/магазина, не рекламный текст баннера. Ошибкой остаётся английский в HOOK над макетом, в CTA, в буллетах, на плашках цены/скидки, в теле отзыва как пользовательском тексте (не в подписи UI).
111135
+ - В рекламном тексте (HOOK/HEADLINE, текст на буллетах если есть, CTA, PRICE, OTHER_TEXT) НЕТ произвольных английских слов и фраз. Если есть — ошибка.
111136
+ - **ИСКЛЮЧЕНИЕ бейдж скидки (DISCOUNT):** на малой плашке с процентом допустимы привычные глобальные маркеры **OFF**, **SALE** рядом с «-50%» / числом процента (например «-50% OFF», «SALE −50%») **не** считать смешением языков и **не** ставить ОШИБКУ только из‑за этих слов **в этом блоке скидки**. HOOK, CTA, буллеты и прочий рекламный текст по-прежнему строго на языке GEO.
111137
+ - ИСКЛЮЧЕНИЕ: внутри **графики интерфейса телефона** (шапка окна приложения, подпись вкладки вроде «Reviews», «App Store»-стиль бейджа в углу рамки) английские слова **не** считать ошибкой — это имитация ОС/магазина, не рекламный текст баннера. Ошибкой остаётся английский в HOOK над макетом, в CTA, в буллетах, на строках **сумм** (кроме кода валюты ISO и символа €/$ и т.п.), в теле отзыва как пользовательском тексте (не в подписи UI). Бейдж скидки — см. исключение OFF/SALE выше.
109764
111138
  - ЗАПРЕЩЁННЫЕ служебные подписи на макете (частая ошибка модели): слова HOOK, CTA, CAPS, BULLET, HEADLINE, PRICE, DISCOUNT как видимый текст на плашках или кнопке — ОШИБКА (это метки из брифа, не для читателя).
109765
- - Все слова соответствуют GEO/языку ${geo}. Если смешение языков — ошибка.
111139
+ - Все слова соответствуют GEO/языку ${geo}. Смешение языков — ошибка, **кроме** исключений выше (OFF/SALE на бейдже скидки; UI телефона).
109766
111140
  - ПСЕВДОСЛОВА И ОПЕЧАТКИ: если на плашке скидки или в буллетах видно **несуществующее** или явно ошибочное слово для языка GEO (не словарное), либо «калька» под английский без нормы (пример для испанского: «DISCONTA» вместо «DESCUENTO»; на буллете англ. «COMFORT» вместо исп. «CONFORT»/«COMODIDAD») — ОШИБКА языка (приземлённая формулировка в строке ОШИБКА).
109767
111141
 
109768
111142
  ШАГ 6 — КОМПОЗИЦИЯ:
@@ -109796,10 +111170,10 @@ function getImageGenerationBasePrompt(generateGeo, generatePrice, generateCurren
109796
111170
  }
109797
111171
  _debugLog('⚠️ Using DEFAULT getImageGenerationBasePrompt');
109798
111172
  }
109799
- // Подходы без буллитов — из подходов с count > 0
111173
+ // Подходы без буллитов — из подходов с count > 0 (умолчание + per-approach + глобал)
109800
111174
  const counts = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getImageApproachCounts)();
109801
111175
  const selectedApproaches = CREO_APPROACHES.filter((_, i) => counts[i] > 0);
109802
- const noBulletsNames = selectedApproaches.filter(a => a.noBullets).map(a => a.name);
111176
+ const noBulletsNames = selectedApproaches.filter(a => getEffectiveCreoNoBullets(a)).map(a => a.name);
109803
111177
  const noBulletsCond = noBulletsNames.map(n => `"${n}"`).join(' или ');
109804
111178
  const totalApproaches = counts.reduce((a, b) => a + b, 0);
109805
111179
  const ratio = aspectRatio || '1:1';
@@ -109969,14 +111343,16 @@ function getCreoApproachExpandedTasks() {
109969
111343
  if (!approach)
109970
111344
  continue;
109971
111345
  const override = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_0__.getCreoApproachOverride)(approach.name);
111346
+ const effNoBullets = getEffectiveCreoNoBullets(approach);
109972
111347
  const resolved = override?.enabled
109973
111348
  ? {
109974
111349
  ...approach,
111350
+ noBullets: effNoBullets,
109975
111351
  prompt: override.customPrompt || approach.prompt,
109976
111352
  headlineAngle: override.customHeadlineAngle || approach.headlineAngle,
109977
111353
  bulletsFocus: override.customBulletsFocus || approach.bulletsFocus
109978
111354
  }
109979
- : approach;
111355
+ : { ...approach, noBullets: effNoBullets };
109980
111356
  if (override?.enabled) {
109981
111357
  _debugLog(`✅ Using CUSTOM approach: ${approach.name}`, `hasPrompt=${!!override.customPrompt}`, `hasHeadline=${!!override.customHeadlineAngle}`, `hasBullets=${!!override.customBulletsFocus}`);
109982
111358
  }