docs-combiner 0.1.12 → 0.1.13

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
@@ -2757,6 +2757,29 @@ __webpack_require__.r(__webpack_exports__);
2757
2757
 
2758
2758
  /***/ }),
2759
2759
 
2760
+ /***/ "./node_modules/@mui/icons-material/esm/AttachMoney.js":
2761
+ /*!*************************************************************!*\
2762
+ !*** ./node_modules/@mui/icons-material/esm/AttachMoney.js ***!
2763
+ \*************************************************************/
2764
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2765
+
2766
+ "use strict";
2767
+ __webpack_require__.r(__webpack_exports__);
2768
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2769
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
2770
+ /* harmony export */ });
2771
+ /* harmony import */ var _utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/createSvgIcon.js */ "./node_modules/@mui/material/esm/utils/createSvgIcon.js");
2772
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
2773
+ "use client";
2774
+
2775
+
2776
+
2777
+ /* 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", {
2778
+ d: "M11.8 10.9c-2.27-.59-3-1.2-3-2.15 0-1.09 1.01-1.85 2.7-1.85 1.78 0 2.44.85 2.5 2.1h2.21c-.07-1.72-1.12-3.3-3.21-3.81V3h-3v2.16c-1.94.42-3.5 1.68-3.5 3.61 0 2.31 1.91 3.46 4.7 4.13 2.5.6 3 1.48 3 2.41 0 .69-.49 1.79-2.7 1.79-2.06 0-2.87-.92-2.98-2.1h-2.2c.12 2.19 1.76 3.42 3.68 3.83V21h3v-2.15c1.95-.37 3.5-1.5 3.5-3.55 0-2.84-2.43-3.81-4.7-4.4"
2779
+ }), 'AttachMoney'));
2780
+
2781
+ /***/ }),
2782
+
2760
2783
  /***/ "./node_modules/@mui/icons-material/esm/AutoAwesome.js":
2761
2784
  /*!*************************************************************!*\
2762
2785
  !*** ./node_modules/@mui/icons-material/esm/AutoAwesome.js ***!
@@ -2964,6 +2987,29 @@ __webpack_require__.r(__webpack_exports__);
2964
2987
 
2965
2988
  /***/ }),
2966
2989
 
2990
+ /***/ "./node_modules/@mui/icons-material/esm/DeleteOutline.js":
2991
+ /*!***************************************************************!*\
2992
+ !*** ./node_modules/@mui/icons-material/esm/DeleteOutline.js ***!
2993
+ \***************************************************************/
2994
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
2995
+
2996
+ "use strict";
2997
+ __webpack_require__.r(__webpack_exports__);
2998
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
2999
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
3000
+ /* harmony export */ });
3001
+ /* harmony import */ var _utils_createSvgIcon_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils/createSvgIcon.js */ "./node_modules/@mui/material/esm/utils/createSvgIcon.js");
3002
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
3003
+ "use client";
3004
+
3005
+
3006
+
3007
+ /* 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", {
3008
+ d: "M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6zM8 9h8v10H8zm7.5-5-1-1h-5l-1 1H5v2h14V4z"
3009
+ }), 'DeleteOutline'));
3010
+
3011
+ /***/ }),
3012
+
2967
3013
  /***/ "./node_modules/@mui/icons-material/esm/Edit.js":
2968
3014
  /*!******************************************************!*\
2969
3015
  !*** ./node_modules/@mui/icons-material/esm/Edit.js ***!
@@ -8295,6 +8341,206 @@ function getCircularProgressUtilityClass(slot) {
8295
8341
  const circularProgressClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__["default"])('MuiCircularProgress', ['root', 'determinate', 'indeterminate', 'colorPrimary', 'colorSecondary', 'svg', 'track', 'circle', 'circleDeterminate', 'circleIndeterminate', 'circleDisableShrink']);
8296
8342
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (circularProgressClasses);
8297
8343
 
8344
+ /***/ }),
8345
+
8346
+ /***/ "./node_modules/@mui/material/esm/ClickAwayListener/ClickAwayListener.js":
8347
+ /*!*******************************************************************************!*\
8348
+ !*** ./node_modules/@mui/material/esm/ClickAwayListener/ClickAwayListener.js ***!
8349
+ \*******************************************************************************/
8350
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
8351
+
8352
+ "use strict";
8353
+ __webpack_require__.r(__webpack_exports__);
8354
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8355
+ /* harmony export */ ClickAwayListener: () => (/* binding */ ClickAwayListener)
8356
+ /* harmony export */ });
8357
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
8358
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
8359
+ /* harmony import */ var _mui_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/utils/ownerDocument */ "./node_modules/@mui/utils/esm/ownerDocument/ownerDocument.js");
8360
+ /* harmony import */ var _mui_utils_useForkRef__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/utils/useForkRef */ "./node_modules/@mui/utils/esm/useForkRef/useForkRef.js");
8361
+ /* harmony import */ var _mui_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/utils/useEventCallback */ "./node_modules/@mui/utils/esm/useEventCallback/useEventCallback.js");
8362
+ /* harmony import */ var _mui_utils_elementAcceptingRef__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/utils/elementAcceptingRef */ "./node_modules/@mui/utils/esm/elementAcceptingRef/elementAcceptingRef.js");
8363
+ /* harmony import */ var _mui_utils_exactProp__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/utils/exactProp */ "./node_modules/@mui/utils/esm/exactProp/exactProp.js");
8364
+ /* harmony import */ var _mui_utils_getReactElementRef__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @mui/utils/getReactElementRef */ "./node_modules/@mui/utils/esm/getReactElementRef/getReactElementRef.js");
8365
+ 'use client';
8366
+
8367
+
8368
+
8369
+
8370
+
8371
+
8372
+
8373
+
8374
+
8375
+
8376
+ // TODO: return `EventHandlerName extends `on${infer EventName}` ? Lowercase<EventName> : never` once generatePropTypes runs with TS 4.1
8377
+ function mapEventPropToEvent(eventProp) {
8378
+ return eventProp.substring(2).toLowerCase();
8379
+ }
8380
+ function clickedRootScrollbar(event, doc) {
8381
+ return doc.documentElement.clientWidth < event.clientX || doc.documentElement.clientHeight < event.clientY;
8382
+ }
8383
+ /**
8384
+ * Listen for click events that occur somewhere in the document, outside of the element itself.
8385
+ * For instance, if you need to hide a menu when people click anywhere else on your page.
8386
+ *
8387
+ * Demos:
8388
+ *
8389
+ * - [Click-Away Listener](https://mui.com/material-ui/react-click-away-listener/)
8390
+ * - [Menu](https://mui.com/material-ui/react-menu/)
8391
+ *
8392
+ * API:
8393
+ *
8394
+ * - [ClickAwayListener API](https://mui.com/material-ui/api/click-away-listener/)
8395
+ */
8396
+ function ClickAwayListener(props) {
8397
+ const {
8398
+ children,
8399
+ disableReactTree = false,
8400
+ mouseEvent = 'onClick',
8401
+ onClickAway,
8402
+ touchEvent = 'onTouchEnd'
8403
+ } = props;
8404
+ const movedRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);
8405
+ const nodeRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);
8406
+ const activatedRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);
8407
+ const syntheticEventRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);
8408
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
8409
+ // Ensure that this component is not "activated" synchronously.
8410
+ // https://github.com/facebook/react/issues/20074
8411
+ setTimeout(() => {
8412
+ activatedRef.current = true;
8413
+ }, 0);
8414
+ return () => {
8415
+ activatedRef.current = false;
8416
+ };
8417
+ }, []);
8418
+ const handleRef = (0,_mui_utils_useForkRef__WEBPACK_IMPORTED_MODULE_3__["default"])((0,_mui_utils_getReactElementRef__WEBPACK_IMPORTED_MODULE_7__["default"])(children), nodeRef);
8419
+
8420
+ // The handler doesn't take event.defaultPrevented into account:
8421
+ //
8422
+ // event.preventDefault() is meant to stop default behaviors like
8423
+ // clicking a checkbox to check it, hitting a button to submit a form,
8424
+ // and hitting left arrow to move the cursor in a text input etc.
8425
+ // Only special HTML elements have these default behaviors.
8426
+ const handleClickAway = (0,_mui_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_4__["default"])(event => {
8427
+ // Given developers can stop the propagation of the synthetic event,
8428
+ // we can only be confident with a positive value.
8429
+ const insideReactTree = syntheticEventRef.current;
8430
+ syntheticEventRef.current = false;
8431
+ const doc = (0,_mui_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_2__["default"])(nodeRef.current);
8432
+
8433
+ // 1. IE11 support, which trigger the handleClickAway even after the unbind
8434
+ // 2. The child might render null.
8435
+ // 3. Behave like a blur listener.
8436
+ if (!activatedRef.current || !nodeRef.current || 'clientX' in event && clickedRootScrollbar(event, doc)) {
8437
+ return;
8438
+ }
8439
+
8440
+ // Do not act if user performed touchmove
8441
+ if (movedRef.current) {
8442
+ movedRef.current = false;
8443
+ return;
8444
+ }
8445
+ let insideDOM;
8446
+
8447
+ // If not enough, can use https://github.com/DieterHolvoet/event-propagation-path/blob/master/propagationPath.js
8448
+ if (event.composedPath) {
8449
+ insideDOM = event.composedPath().includes(nodeRef.current);
8450
+ } else {
8451
+ insideDOM = !doc.documentElement.contains(
8452
+ // @ts-expect-error returns `false` as intended when not dispatched from a Node
8453
+ event.target) || nodeRef.current.contains(
8454
+ // @ts-expect-error returns `false` as intended when not dispatched from a Node
8455
+ event.target);
8456
+ }
8457
+ if (!insideDOM && (disableReactTree || !insideReactTree)) {
8458
+ onClickAway(event);
8459
+ }
8460
+ });
8461
+
8462
+ // Keep track of mouse/touch events that bubbled up through the portal.
8463
+ const createHandleSynthetic = handlerName => event => {
8464
+ syntheticEventRef.current = true;
8465
+ const childrenPropsHandler = children.props[handlerName];
8466
+ if (childrenPropsHandler) {
8467
+ childrenPropsHandler(event);
8468
+ }
8469
+ };
8470
+ const childrenProps = {
8471
+ ref: handleRef
8472
+ };
8473
+ if (touchEvent !== false) {
8474
+ childrenProps[touchEvent] = createHandleSynthetic(touchEvent);
8475
+ }
8476
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
8477
+ if (touchEvent !== false) {
8478
+ const mappedTouchEvent = mapEventPropToEvent(touchEvent);
8479
+ const doc = (0,_mui_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_2__["default"])(nodeRef.current);
8480
+ const handleTouchMove = () => {
8481
+ movedRef.current = true;
8482
+ };
8483
+ doc.addEventListener(mappedTouchEvent, handleClickAway);
8484
+ doc.addEventListener('touchmove', handleTouchMove);
8485
+ return () => {
8486
+ doc.removeEventListener(mappedTouchEvent, handleClickAway);
8487
+ doc.removeEventListener('touchmove', handleTouchMove);
8488
+ };
8489
+ }
8490
+ return undefined;
8491
+ }, [handleClickAway, touchEvent]);
8492
+ if (mouseEvent !== false) {
8493
+ childrenProps[mouseEvent] = createHandleSynthetic(mouseEvent);
8494
+ }
8495
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
8496
+ if (mouseEvent !== false) {
8497
+ const mappedMouseEvent = mapEventPropToEvent(mouseEvent);
8498
+ const doc = (0,_mui_utils_ownerDocument__WEBPACK_IMPORTED_MODULE_2__["default"])(nodeRef.current);
8499
+ doc.addEventListener(mappedMouseEvent, handleClickAway);
8500
+ return () => {
8501
+ doc.removeEventListener(mappedMouseEvent, handleClickAway);
8502
+ };
8503
+ }
8504
+ return undefined;
8505
+ }, [handleClickAway, mouseEvent]);
8506
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.cloneElement(children, childrenProps);
8507
+ }
8508
+ true ? ClickAwayListener.propTypes /* remove-proptypes */ = {
8509
+ // ┌────────────────────────────── Warning ──────────────────────────────┐
8510
+ // │ These PropTypes are generated from the TypeScript type definitions. │
8511
+ // │ To update them, edit the TypeScript types and run `pnpm proptypes`. │
8512
+ // └─────────────────────────────────────────────────────────────────────┘
8513
+ /**
8514
+ * The wrapped element.
8515
+ */
8516
+ children: _mui_utils_elementAcceptingRef__WEBPACK_IMPORTED_MODULE_5__["default"].isRequired,
8517
+ /**
8518
+ * If `true`, the React tree is ignored and only the DOM tree is considered.
8519
+ * This prop changes how portaled elements are handled.
8520
+ * @default false
8521
+ */
8522
+ disableReactTree: prop_types__WEBPACK_IMPORTED_MODULE_1__.bool,
8523
+ /**
8524
+ * The mouse event to listen to. You can disable the listener by providing `false`.
8525
+ * @default 'onClick'
8526
+ */
8527
+ mouseEvent: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOf(['onClick', 'onMouseDown', 'onMouseUp', 'onPointerDown', 'onPointerUp', false]),
8528
+ /**
8529
+ * Callback fired when a "click away" event is detected.
8530
+ */
8531
+ onClickAway: prop_types__WEBPACK_IMPORTED_MODULE_1__.func.isRequired,
8532
+ /**
8533
+ * The touch event to listen to. You can disable the listener by providing `false`.
8534
+ * @default 'onTouchEnd'
8535
+ */
8536
+ touchEvent: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOf(['onTouchEnd', 'onTouchStart', false])
8537
+ } : 0;
8538
+ if (true) {
8539
+ // eslint-disable-next-line
8540
+ ClickAwayListener['propTypes' + ''] = (0,_mui_utils_exactProp__WEBPACK_IMPORTED_MODULE_6__["default"])(ClickAwayListener.propTypes);
8541
+ }
8542
+
8543
+
8298
8544
  /***/ }),
8299
8545
 
8300
8546
  /***/ "./node_modules/@mui/material/esm/Collapse/Collapse.js":
@@ -13768,6 +14014,243 @@ const inputClasses = {
13768
14014
 
13769
14015
  /***/ }),
13770
14016
 
14017
+ /***/ "./node_modules/@mui/material/esm/InputAdornment/InputAdornment.js":
14018
+ /*!*************************************************************************!*\
14019
+ !*** ./node_modules/@mui/material/esm/InputAdornment/InputAdornment.js ***!
14020
+ \*************************************************************************/
14021
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
14022
+
14023
+ "use strict";
14024
+ __webpack_require__.r(__webpack_exports__);
14025
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14026
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
14027
+ /* harmony export */ });
14028
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
14029
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
14030
+ /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.mjs");
14031
+ /* harmony import */ var _mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/utils/composeClasses */ "./node_modules/@mui/utils/esm/composeClasses/composeClasses.js");
14032
+ /* harmony import */ var _utils_capitalize_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/capitalize.js */ "./node_modules/@mui/material/esm/utils/capitalize.js");
14033
+ /* harmony import */ var _Typography_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Typography/index.js */ "./node_modules/@mui/material/esm/Typography/Typography.js");
14034
+ /* harmony import */ var _FormControl_FormControlContext_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../FormControl/FormControlContext.js */ "./node_modules/@mui/material/esm/FormControl/FormControlContext.js");
14035
+ /* harmony import */ var _FormControl_useFormControl_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../FormControl/useFormControl.js */ "./node_modules/@mui/material/esm/FormControl/useFormControl.js");
14036
+ /* harmony import */ var _zero_styled_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../zero-styled/index.js */ "./node_modules/@mui/material/esm/styles/styled.js");
14037
+ /* harmony import */ var _utils_memoTheme_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/memoTheme.js */ "./node_modules/@mui/material/esm/utils/memoTheme.js");
14038
+ /* harmony import */ var _DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../DefaultPropsProvider/index.js */ "./node_modules/@mui/material/esm/DefaultPropsProvider/DefaultPropsProvider.js");
14039
+ /* harmony import */ var _inputAdornmentClasses_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./inputAdornmentClasses.js */ "./node_modules/@mui/material/esm/InputAdornment/inputAdornmentClasses.js");
14040
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
14041
+ 'use client';
14042
+
14043
+ var _span;
14044
+
14045
+
14046
+
14047
+
14048
+
14049
+
14050
+
14051
+
14052
+
14053
+
14054
+
14055
+
14056
+
14057
+ const overridesResolver = (props, styles) => {
14058
+ const {
14059
+ ownerState
14060
+ } = props;
14061
+ return [styles.root, styles[`position${(0,_utils_capitalize_js__WEBPACK_IMPORTED_MODULE_4__["default"])(ownerState.position)}`], ownerState.disablePointerEvents === true && styles.disablePointerEvents, styles[ownerState.variant]];
14062
+ };
14063
+ const useUtilityClasses = ownerState => {
14064
+ const {
14065
+ classes,
14066
+ disablePointerEvents,
14067
+ hiddenLabel,
14068
+ position,
14069
+ size,
14070
+ variant
14071
+ } = ownerState;
14072
+ const slots = {
14073
+ root: ['root', disablePointerEvents && 'disablePointerEvents', position && `position${(0,_utils_capitalize_js__WEBPACK_IMPORTED_MODULE_4__["default"])(position)}`, variant, hiddenLabel && 'hiddenLabel', size && `size${(0,_utils_capitalize_js__WEBPACK_IMPORTED_MODULE_4__["default"])(size)}`]
14074
+ };
14075
+ return (0,_mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_3__["default"])(slots, _inputAdornmentClasses_js__WEBPACK_IMPORTED_MODULE_11__.getInputAdornmentUtilityClass, classes);
14076
+ };
14077
+ const InputAdornmentRoot = (0,_zero_styled_index_js__WEBPACK_IMPORTED_MODULE_8__["default"])('div', {
14078
+ name: 'MuiInputAdornment',
14079
+ slot: 'Root',
14080
+ overridesResolver
14081
+ })((0,_utils_memoTheme_js__WEBPACK_IMPORTED_MODULE_9__["default"])(({
14082
+ theme
14083
+ }) => ({
14084
+ display: 'flex',
14085
+ maxHeight: '2em',
14086
+ alignItems: 'center',
14087
+ whiteSpace: 'nowrap',
14088
+ color: (theme.vars || theme).palette.action.active,
14089
+ variants: [{
14090
+ props: {
14091
+ variant: 'filled'
14092
+ },
14093
+ style: {
14094
+ [`&.${_inputAdornmentClasses_js__WEBPACK_IMPORTED_MODULE_11__["default"].positionStart}&:not(.${_inputAdornmentClasses_js__WEBPACK_IMPORTED_MODULE_11__["default"].hiddenLabel})`]: {
14095
+ marginTop: 16
14096
+ }
14097
+ }
14098
+ }, {
14099
+ props: {
14100
+ position: 'start'
14101
+ },
14102
+ style: {
14103
+ marginRight: 8
14104
+ }
14105
+ }, {
14106
+ props: {
14107
+ position: 'end'
14108
+ },
14109
+ style: {
14110
+ marginLeft: 8
14111
+ }
14112
+ }, {
14113
+ props: {
14114
+ disablePointerEvents: true
14115
+ },
14116
+ style: {
14117
+ pointerEvents: 'none'
14118
+ }
14119
+ }]
14120
+ })));
14121
+ const InputAdornment = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function InputAdornment(inProps, ref) {
14122
+ const props = (0,_DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_10__.useDefaultProps)({
14123
+ props: inProps,
14124
+ name: 'MuiInputAdornment'
14125
+ });
14126
+ const {
14127
+ children,
14128
+ className,
14129
+ component = 'div',
14130
+ disablePointerEvents = false,
14131
+ disableTypography = false,
14132
+ position,
14133
+ variant: variantProp,
14134
+ ...other
14135
+ } = props;
14136
+ const muiFormControl = (0,_FormControl_useFormControl_js__WEBPACK_IMPORTED_MODULE_7__["default"])() || {};
14137
+ let variant = variantProp;
14138
+ if (variantProp && muiFormControl.variant) {
14139
+ if (true) {
14140
+ if (variantProp === muiFormControl.variant) {
14141
+ console.error('MUI: The `InputAdornment` variant infers the variant prop ' + 'you do not have to provide one.');
14142
+ }
14143
+ }
14144
+ }
14145
+ if (muiFormControl && !variant) {
14146
+ variant = muiFormControl.variant;
14147
+ }
14148
+ const ownerState = {
14149
+ ...props,
14150
+ hiddenLabel: muiFormControl.hiddenLabel,
14151
+ size: muiFormControl.size,
14152
+ disablePointerEvents,
14153
+ position,
14154
+ variant
14155
+ };
14156
+ const classes = useUtilityClasses(ownerState);
14157
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_FormControl_FormControlContext_js__WEBPACK_IMPORTED_MODULE_6__["default"].Provider, {
14158
+ value: null,
14159
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(InputAdornmentRoot, {
14160
+ as: component,
14161
+ ownerState: ownerState,
14162
+ className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(classes.root, className),
14163
+ ref: ref,
14164
+ ...other,
14165
+ children: typeof children === 'string' && !disableTypography ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)(_Typography_index_js__WEBPACK_IMPORTED_MODULE_5__["default"], {
14166
+ color: "textSecondary",
14167
+ children: children
14168
+ }) : /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsxs)(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, {
14169
+ children: [position === 'start' ? (/* notranslate needed while Google Translate will not fix zero-width space issue */_span || (_span = /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_12__.jsx)("span", {
14170
+ className: "notranslate",
14171
+ "aria-hidden": true,
14172
+ children: "\u200B"
14173
+ }))) : null, children]
14174
+ })
14175
+ })
14176
+ });
14177
+ });
14178
+ true ? InputAdornment.propTypes /* remove-proptypes */ = {
14179
+ // ┌────────────────────────────── Warning ──────────────────────────────┐
14180
+ // │ These PropTypes are generated from the TypeScript type definitions. │
14181
+ // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
14182
+ // └─────────────────────────────────────────────────────────────────────┘
14183
+ /**
14184
+ * The content of the component, normally an `IconButton` or string.
14185
+ */
14186
+ children: prop_types__WEBPACK_IMPORTED_MODULE_1__.node,
14187
+ /**
14188
+ * Override or extend the styles applied to the component.
14189
+ */
14190
+ classes: prop_types__WEBPACK_IMPORTED_MODULE_1__.object,
14191
+ /**
14192
+ * @ignore
14193
+ */
14194
+ className: prop_types__WEBPACK_IMPORTED_MODULE_1__.string,
14195
+ /**
14196
+ * The component used for the root node.
14197
+ * Either a string to use a HTML element or a component.
14198
+ */
14199
+ component: prop_types__WEBPACK_IMPORTED_MODULE_1__.elementType,
14200
+ /**
14201
+ * Disable pointer events on the root.
14202
+ * This allows for the content of the adornment to focus the `input` on click.
14203
+ * @default false
14204
+ */
14205
+ disablePointerEvents: prop_types__WEBPACK_IMPORTED_MODULE_1__.bool,
14206
+ /**
14207
+ * If children is a string then disable wrapping in a Typography component.
14208
+ * @default false
14209
+ */
14210
+ disableTypography: prop_types__WEBPACK_IMPORTED_MODULE_1__.bool,
14211
+ /**
14212
+ * The position this adornment should appear relative to the `Input`.
14213
+ */
14214
+ position: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOf(['end', 'start']).isRequired,
14215
+ /**
14216
+ * The system prop that allows defining system overrides as well as additional CSS styles.
14217
+ */
14218
+ 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]),
14219
+ /**
14220
+ * The variant to use.
14221
+ * Note: If you are using the `TextField` component or the `FormControl` component
14222
+ * you do not have to set this manually.
14223
+ */
14224
+ variant: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOf(['filled', 'outlined', 'standard'])
14225
+ } : 0;
14226
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (InputAdornment);
14227
+
14228
+ /***/ }),
14229
+
14230
+ /***/ "./node_modules/@mui/material/esm/InputAdornment/inputAdornmentClasses.js":
14231
+ /*!********************************************************************************!*\
14232
+ !*** ./node_modules/@mui/material/esm/InputAdornment/inputAdornmentClasses.js ***!
14233
+ \********************************************************************************/
14234
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
14235
+
14236
+ "use strict";
14237
+ __webpack_require__.r(__webpack_exports__);
14238
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
14239
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
14240
+ /* harmony export */ getInputAdornmentUtilityClass: () => (/* binding */ getInputAdornmentUtilityClass)
14241
+ /* harmony export */ });
14242
+ /* harmony import */ var _mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mui/utils/generateUtilityClasses */ "./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js");
14243
+ /* harmony import */ var _mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils/generateUtilityClass */ "./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js");
14244
+
14245
+
14246
+ function getInputAdornmentUtilityClass(slot) {
14247
+ return (0,_mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__["default"])('MuiInputAdornment', slot);
14248
+ }
14249
+ const inputAdornmentClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__["default"])('MuiInputAdornment', ['root', 'filled', 'standard', 'outlined', 'positionStart', 'positionEnd', 'disablePointerEvents', 'hiddenLabel', 'sizeSmall']);
14250
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (inputAdornmentClasses);
14251
+
14252
+ /***/ }),
14253
+
13771
14254
  /***/ "./node_modules/@mui/material/esm/InputBase/InputBase.js":
13772
14255
  /*!***************************************************************!*\
13773
14256
  !*** ./node_modules/@mui/material/esm/InputBase/InputBase.js ***!
@@ -20813,6 +21296,799 @@ const selectClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MOD
20813
21296
 
20814
21297
  /***/ }),
20815
21298
 
21299
+ /***/ "./node_modules/@mui/material/esm/Snackbar/Snackbar.js":
21300
+ /*!*************************************************************!*\
21301
+ !*** ./node_modules/@mui/material/esm/Snackbar/Snackbar.js ***!
21302
+ \*************************************************************/
21303
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
21304
+
21305
+ "use strict";
21306
+ __webpack_require__.r(__webpack_exports__);
21307
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
21308
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
21309
+ /* harmony export */ });
21310
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
21311
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
21312
+ /* harmony import */ var _mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/utils/composeClasses */ "./node_modules/@mui/utils/esm/composeClasses/composeClasses.js");
21313
+ /* harmony import */ var _useSnackbar_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./useSnackbar.js */ "./node_modules/@mui/material/esm/Snackbar/useSnackbar.js");
21314
+ /* harmony import */ var _ClickAwayListener_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ClickAwayListener/index.js */ "./node_modules/@mui/material/esm/ClickAwayListener/ClickAwayListener.js");
21315
+ /* harmony import */ var _zero_styled_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../zero-styled/index.js */ "./node_modules/@mui/material/esm/styles/useTheme.js");
21316
+ /* harmony import */ var _zero_styled_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../zero-styled/index.js */ "./node_modules/@mui/material/esm/styles/styled.js");
21317
+ /* harmony import */ var _utils_memoTheme_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils/memoTheme.js */ "./node_modules/@mui/material/esm/utils/memoTheme.js");
21318
+ /* harmony import */ var _DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../DefaultPropsProvider/index.js */ "./node_modules/@mui/material/esm/DefaultPropsProvider/DefaultPropsProvider.js");
21319
+ /* harmony import */ var _utils_capitalize_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../utils/capitalize.js */ "./node_modules/@mui/material/esm/utils/capitalize.js");
21320
+ /* harmony import */ var _Grow_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../Grow/index.js */ "./node_modules/@mui/material/esm/Grow/Grow.js");
21321
+ /* harmony import */ var _SnackbarContent_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../SnackbarContent/index.js */ "./node_modules/@mui/material/esm/SnackbarContent/SnackbarContent.js");
21322
+ /* harmony import */ var _snackbarClasses_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./snackbarClasses.js */ "./node_modules/@mui/material/esm/Snackbar/snackbarClasses.js");
21323
+ /* harmony import */ var _utils_useSlot_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../utils/useSlot.js */ "./node_modules/@mui/material/esm/utils/useSlot.js");
21324
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
21325
+ 'use client';
21326
+
21327
+
21328
+
21329
+
21330
+
21331
+
21332
+
21333
+
21334
+
21335
+
21336
+
21337
+
21338
+
21339
+
21340
+
21341
+ const useUtilityClasses = ownerState => {
21342
+ const {
21343
+ classes,
21344
+ anchorOrigin
21345
+ } = ownerState;
21346
+ const slots = {
21347
+ root: ['root', `anchorOrigin${(0,_utils_capitalize_js__WEBPACK_IMPORTED_MODULE_9__["default"])(anchorOrigin.vertical)}${(0,_utils_capitalize_js__WEBPACK_IMPORTED_MODULE_9__["default"])(anchorOrigin.horizontal)}`]
21348
+ };
21349
+ return (0,_mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_2__["default"])(slots, _snackbarClasses_js__WEBPACK_IMPORTED_MODULE_12__.getSnackbarUtilityClass, classes);
21350
+ };
21351
+ const SnackbarRoot = (0,_zero_styled_index_js__WEBPACK_IMPORTED_MODULE_6__["default"])('div', {
21352
+ name: 'MuiSnackbar',
21353
+ slot: 'Root',
21354
+ overridesResolver: (props, styles) => {
21355
+ const {
21356
+ ownerState
21357
+ } = props;
21358
+ return [styles.root, styles[`anchorOrigin${(0,_utils_capitalize_js__WEBPACK_IMPORTED_MODULE_9__["default"])(ownerState.anchorOrigin.vertical)}${(0,_utils_capitalize_js__WEBPACK_IMPORTED_MODULE_9__["default"])(ownerState.anchorOrigin.horizontal)}`]];
21359
+ }
21360
+ })((0,_utils_memoTheme_js__WEBPACK_IMPORTED_MODULE_7__["default"])(({
21361
+ theme
21362
+ }) => ({
21363
+ zIndex: (theme.vars || theme).zIndex.snackbar,
21364
+ position: 'fixed',
21365
+ display: 'flex',
21366
+ left: 8,
21367
+ right: 8,
21368
+ justifyContent: 'center',
21369
+ alignItems: 'center',
21370
+ variants: [{
21371
+ props: ({
21372
+ ownerState
21373
+ }) => ownerState.anchorOrigin.vertical === 'top',
21374
+ style: {
21375
+ top: 8,
21376
+ [theme.breakpoints.up('sm')]: {
21377
+ top: 24
21378
+ }
21379
+ }
21380
+ }, {
21381
+ props: ({
21382
+ ownerState
21383
+ }) => ownerState.anchorOrigin.vertical !== 'top',
21384
+ style: {
21385
+ bottom: 8,
21386
+ [theme.breakpoints.up('sm')]: {
21387
+ bottom: 24
21388
+ }
21389
+ }
21390
+ }, {
21391
+ props: ({
21392
+ ownerState
21393
+ }) => ownerState.anchorOrigin.horizontal === 'left',
21394
+ style: {
21395
+ justifyContent: 'flex-start',
21396
+ [theme.breakpoints.up('sm')]: {
21397
+ left: 24,
21398
+ right: 'auto'
21399
+ }
21400
+ }
21401
+ }, {
21402
+ props: ({
21403
+ ownerState
21404
+ }) => ownerState.anchorOrigin.horizontal === 'right',
21405
+ style: {
21406
+ justifyContent: 'flex-end',
21407
+ [theme.breakpoints.up('sm')]: {
21408
+ right: 24,
21409
+ left: 'auto'
21410
+ }
21411
+ }
21412
+ }, {
21413
+ props: ({
21414
+ ownerState
21415
+ }) => ownerState.anchorOrigin.horizontal === 'center',
21416
+ style: {
21417
+ [theme.breakpoints.up('sm')]: {
21418
+ left: '50%',
21419
+ right: 'auto',
21420
+ transform: 'translateX(-50%)'
21421
+ }
21422
+ }
21423
+ }]
21424
+ })));
21425
+ const Snackbar = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function Snackbar(inProps, ref) {
21426
+ const props = (0,_DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_8__.useDefaultProps)({
21427
+ props: inProps,
21428
+ name: 'MuiSnackbar'
21429
+ });
21430
+ const theme = (0,_zero_styled_index_js__WEBPACK_IMPORTED_MODULE_5__["default"])();
21431
+ const defaultTransitionDuration = {
21432
+ enter: theme.transitions.duration.enteringScreen,
21433
+ exit: theme.transitions.duration.leavingScreen
21434
+ };
21435
+ const {
21436
+ action,
21437
+ anchorOrigin: {
21438
+ vertical,
21439
+ horizontal
21440
+ } = {
21441
+ vertical: 'bottom',
21442
+ horizontal: 'left'
21443
+ },
21444
+ autoHideDuration = null,
21445
+ children,
21446
+ className,
21447
+ ClickAwayListenerProps: ClickAwayListenerPropsProp,
21448
+ ContentProps: ContentPropsProp,
21449
+ disableWindowBlurListener = false,
21450
+ message,
21451
+ onBlur,
21452
+ onClose,
21453
+ onFocus,
21454
+ onMouseEnter,
21455
+ onMouseLeave,
21456
+ open,
21457
+ resumeHideDuration,
21458
+ slots = {},
21459
+ slotProps = {},
21460
+ TransitionComponent: TransitionComponentProp,
21461
+ transitionDuration = defaultTransitionDuration,
21462
+ TransitionProps: {
21463
+ onEnter,
21464
+ onExited,
21465
+ ...TransitionPropsProp
21466
+ } = {},
21467
+ ...other
21468
+ } = props;
21469
+ const ownerState = {
21470
+ ...props,
21471
+ anchorOrigin: {
21472
+ vertical,
21473
+ horizontal
21474
+ },
21475
+ autoHideDuration,
21476
+ disableWindowBlurListener,
21477
+ TransitionComponent: TransitionComponentProp,
21478
+ transitionDuration
21479
+ };
21480
+ const classes = useUtilityClasses(ownerState);
21481
+ const {
21482
+ getRootProps,
21483
+ onClickAway
21484
+ } = (0,_useSnackbar_js__WEBPACK_IMPORTED_MODULE_3__["default"])({
21485
+ ...ownerState
21486
+ });
21487
+ const [exited, setExited] = react__WEBPACK_IMPORTED_MODULE_0__.useState(true);
21488
+ const handleExited = node => {
21489
+ setExited(true);
21490
+ if (onExited) {
21491
+ onExited(node);
21492
+ }
21493
+ };
21494
+ const handleEnter = (node, isAppearing) => {
21495
+ setExited(false);
21496
+ if (onEnter) {
21497
+ onEnter(node, isAppearing);
21498
+ }
21499
+ };
21500
+ const externalForwardedProps = {
21501
+ slots: {
21502
+ transition: TransitionComponentProp,
21503
+ ...slots
21504
+ },
21505
+ slotProps: {
21506
+ content: ContentPropsProp,
21507
+ clickAwayListener: ClickAwayListenerPropsProp,
21508
+ transition: TransitionPropsProp,
21509
+ ...slotProps
21510
+ }
21511
+ };
21512
+ const [Root, rootProps] = (0,_utils_useSlot_js__WEBPACK_IMPORTED_MODULE_13__["default"])('root', {
21513
+ ref,
21514
+ className: [classes.root, className],
21515
+ elementType: SnackbarRoot,
21516
+ getSlotProps: getRootProps,
21517
+ externalForwardedProps: {
21518
+ ...externalForwardedProps,
21519
+ ...other
21520
+ },
21521
+ ownerState
21522
+ });
21523
+ const [ClickAwaySlot, {
21524
+ ownerState: clickAwayOwnerStateProp,
21525
+ ...clickAwayListenerProps
21526
+ }] = (0,_utils_useSlot_js__WEBPACK_IMPORTED_MODULE_13__["default"])('clickAwayListener', {
21527
+ elementType: _ClickAwayListener_index_js__WEBPACK_IMPORTED_MODULE_4__.ClickAwayListener,
21528
+ externalForwardedProps,
21529
+ getSlotProps: handlers => ({
21530
+ onClickAway: (...params) => {
21531
+ const event = params[0];
21532
+ handlers.onClickAway?.(...params);
21533
+ if (event?.defaultMuiPrevented) {
21534
+ return;
21535
+ }
21536
+ onClickAway(...params);
21537
+ }
21538
+ }),
21539
+ ownerState
21540
+ });
21541
+ const [ContentSlot, contentSlotProps] = (0,_utils_useSlot_js__WEBPACK_IMPORTED_MODULE_13__["default"])('content', {
21542
+ elementType: _SnackbarContent_index_js__WEBPACK_IMPORTED_MODULE_11__["default"],
21543
+ shouldForwardComponentProp: true,
21544
+ externalForwardedProps,
21545
+ additionalProps: {
21546
+ message,
21547
+ action
21548
+ },
21549
+ ownerState
21550
+ });
21551
+ const [TransitionSlot, transitionProps] = (0,_utils_useSlot_js__WEBPACK_IMPORTED_MODULE_13__["default"])('transition', {
21552
+ elementType: _Grow_index_js__WEBPACK_IMPORTED_MODULE_10__["default"],
21553
+ externalForwardedProps,
21554
+ getSlotProps: handlers => ({
21555
+ onEnter: (...params) => {
21556
+ handlers.onEnter?.(...params);
21557
+ handleEnter(...params);
21558
+ },
21559
+ onExited: (...params) => {
21560
+ handlers.onExited?.(...params);
21561
+ handleExited(...params);
21562
+ }
21563
+ }),
21564
+ additionalProps: {
21565
+ appear: true,
21566
+ in: open,
21567
+ timeout: transitionDuration,
21568
+ direction: vertical === 'top' ? 'down' : 'up'
21569
+ },
21570
+ ownerState
21571
+ });
21572
+
21573
+ // So we only render active snackbars.
21574
+ if (!open && exited) {
21575
+ return null;
21576
+ }
21577
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_14__.jsx)(ClickAwaySlot, {
21578
+ ...clickAwayListenerProps,
21579
+ ...(slots.clickAwayListener && {
21580
+ ownerState: clickAwayOwnerStateProp
21581
+ }),
21582
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_14__.jsx)(Root, {
21583
+ ...rootProps,
21584
+ children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_14__.jsx)(TransitionSlot, {
21585
+ ...transitionProps,
21586
+ children: children || /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_14__.jsx)(ContentSlot, {
21587
+ ...contentSlotProps
21588
+ })
21589
+ })
21590
+ })
21591
+ });
21592
+ });
21593
+ true ? Snackbar.propTypes /* remove-proptypes */ = {
21594
+ // ┌────────────────────────────── Warning ──────────────────────────────┐
21595
+ // │ These PropTypes are generated from the TypeScript type definitions. │
21596
+ // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
21597
+ // └─────────────────────────────────────────────────────────────────────┘
21598
+ /**
21599
+ * The action to display. It renders after the message, at the end of the snackbar.
21600
+ */
21601
+ action: prop_types__WEBPACK_IMPORTED_MODULE_1__.node,
21602
+ /**
21603
+ * The anchor of the `Snackbar`.
21604
+ * On smaller screens, the component grows to occupy all the available width,
21605
+ * the horizontal alignment is ignored.
21606
+ * @default { vertical: 'bottom', horizontal: 'left' }
21607
+ */
21608
+ anchorOrigin: prop_types__WEBPACK_IMPORTED_MODULE_1__.shape({
21609
+ horizontal: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOf(['center', 'left', 'right']).isRequired,
21610
+ vertical: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOf(['bottom', 'top']).isRequired
21611
+ }),
21612
+ /**
21613
+ * The number of milliseconds to wait before automatically calling the
21614
+ * `onClose` function. `onClose` should then set the state of the `open`
21615
+ * prop to hide the Snackbar. This behavior is disabled by default with
21616
+ * the `null` value.
21617
+ * @default null
21618
+ */
21619
+ autoHideDuration: prop_types__WEBPACK_IMPORTED_MODULE_1__.number,
21620
+ /**
21621
+ * Replace the `SnackbarContent` component.
21622
+ */
21623
+ children: prop_types__WEBPACK_IMPORTED_MODULE_1__.element,
21624
+ /**
21625
+ * Override or extend the styles applied to the component.
21626
+ */
21627
+ classes: prop_types__WEBPACK_IMPORTED_MODULE_1__.object,
21628
+ /**
21629
+ * @ignore
21630
+ */
21631
+ className: prop_types__WEBPACK_IMPORTED_MODULE_1__.string,
21632
+ /**
21633
+ * Props applied to the `ClickAwayListener` element.
21634
+ * @deprecated Use `slotProps.clickAwayListener` instead. This prop will be removed in a future major release. See [Migrating from deprecated APIs](/material-ui/migration/migrating-from-deprecated-apis/) for more details.
21635
+ */
21636
+ ClickAwayListenerProps: prop_types__WEBPACK_IMPORTED_MODULE_1__.object,
21637
+ /**
21638
+ * Props applied to the [`SnackbarContent`](https://mui.com/material-ui/api/snackbar-content/) element.
21639
+ * @deprecated Use `slotProps.content` instead. This prop will be removed in a future major release. See [Migrating from deprecated APIs](/material-ui/migration/migrating-from-deprecated-apis/) for more details.
21640
+ */
21641
+ ContentProps: prop_types__WEBPACK_IMPORTED_MODULE_1__.object,
21642
+ /**
21643
+ * If `true`, the `autoHideDuration` timer will expire even if the window is not focused.
21644
+ * @default false
21645
+ */
21646
+ disableWindowBlurListener: prop_types__WEBPACK_IMPORTED_MODULE_1__.bool,
21647
+ /**
21648
+ * When displaying multiple consecutive snackbars using a single parent-rendered
21649
+ * `<Snackbar/>`, add the `key` prop to ensure independent treatment of each message.
21650
+ * For instance, use `<Snackbar key={message} />`. Otherwise, messages might update
21651
+ * in place, and features like `autoHideDuration` could be affected.
21652
+ */
21653
+ key: () => null,
21654
+ /**
21655
+ * The message to display.
21656
+ */
21657
+ message: prop_types__WEBPACK_IMPORTED_MODULE_1__.node,
21658
+ /**
21659
+ * @ignore
21660
+ */
21661
+ onBlur: prop_types__WEBPACK_IMPORTED_MODULE_1__.func,
21662
+ /**
21663
+ * Callback fired when the component requests to be closed.
21664
+ * Typically `onClose` is used to set state in the parent component,
21665
+ * which is used to control the `Snackbar` `open` prop.
21666
+ * The `reason` parameter can optionally be used to control the response to `onClose`,
21667
+ * for example ignoring `clickaway`.
21668
+ *
21669
+ * @param {React.SyntheticEvent<any> | Event} event The event source of the callback.
21670
+ * @param {string} reason Can be: `"timeout"` (`autoHideDuration` expired), `"clickaway"`, or `"escapeKeyDown"`.
21671
+ */
21672
+ onClose: prop_types__WEBPACK_IMPORTED_MODULE_1__.func,
21673
+ /**
21674
+ * @ignore
21675
+ */
21676
+ onFocus: prop_types__WEBPACK_IMPORTED_MODULE_1__.func,
21677
+ /**
21678
+ * @ignore
21679
+ */
21680
+ onMouseEnter: prop_types__WEBPACK_IMPORTED_MODULE_1__.func,
21681
+ /**
21682
+ * @ignore
21683
+ */
21684
+ onMouseLeave: prop_types__WEBPACK_IMPORTED_MODULE_1__.func,
21685
+ /**
21686
+ * If `true`, the component is shown.
21687
+ */
21688
+ open: prop_types__WEBPACK_IMPORTED_MODULE_1__.bool,
21689
+ /**
21690
+ * The number of milliseconds to wait before dismissing after user interaction.
21691
+ * If `autoHideDuration` prop isn't specified, it does nothing.
21692
+ * If `autoHideDuration` prop is specified but `resumeHideDuration` isn't,
21693
+ * we default to `autoHideDuration / 2` ms.
21694
+ */
21695
+ resumeHideDuration: prop_types__WEBPACK_IMPORTED_MODULE_1__.number,
21696
+ /**
21697
+ * The props used for each slot inside.
21698
+ * @default {}
21699
+ */
21700
+ slotProps: prop_types__WEBPACK_IMPORTED_MODULE_1__.shape({
21701
+ clickAwayListener: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.func, prop_types__WEBPACK_IMPORTED_MODULE_1__.object]),
21702
+ content: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.func, prop_types__WEBPACK_IMPORTED_MODULE_1__.object]),
21703
+ root: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.func, prop_types__WEBPACK_IMPORTED_MODULE_1__.object]),
21704
+ transition: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.func, prop_types__WEBPACK_IMPORTED_MODULE_1__.object])
21705
+ }),
21706
+ /**
21707
+ * The components used for each slot inside.
21708
+ * @default {}
21709
+ */
21710
+ slots: prop_types__WEBPACK_IMPORTED_MODULE_1__.shape({
21711
+ clickAwayListener: prop_types__WEBPACK_IMPORTED_MODULE_1__.elementType,
21712
+ content: prop_types__WEBPACK_IMPORTED_MODULE_1__.elementType,
21713
+ root: prop_types__WEBPACK_IMPORTED_MODULE_1__.elementType,
21714
+ transition: prop_types__WEBPACK_IMPORTED_MODULE_1__.elementType
21715
+ }),
21716
+ /**
21717
+ * The system prop that allows defining system overrides as well as additional CSS styles.
21718
+ */
21719
+ 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]),
21720
+ /**
21721
+ * The component used for the transition.
21722
+ * [Follow this guide](https://mui.com/material-ui/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.
21723
+ * @deprecated Use `slots.transition` instead. This prop will be removed in a future major release. See [Migrating from deprecated APIs](/material-ui/migration/migrating-from-deprecated-apis/) for more details.
21724
+ * @default Grow
21725
+ */
21726
+ TransitionComponent: prop_types__WEBPACK_IMPORTED_MODULE_1__.elementType,
21727
+ /**
21728
+ * The duration for the transition, in milliseconds.
21729
+ * You may specify a single timeout for all transitions, or individually with an object.
21730
+ * @default {
21731
+ * enter: theme.transitions.duration.enteringScreen,
21732
+ * exit: theme.transitions.duration.leavingScreen,
21733
+ * }
21734
+ */
21735
+ transitionDuration: prop_types__WEBPACK_IMPORTED_MODULE_1__.oneOfType([prop_types__WEBPACK_IMPORTED_MODULE_1__.number, prop_types__WEBPACK_IMPORTED_MODULE_1__.shape({
21736
+ appear: prop_types__WEBPACK_IMPORTED_MODULE_1__.number,
21737
+ enter: prop_types__WEBPACK_IMPORTED_MODULE_1__.number,
21738
+ exit: prop_types__WEBPACK_IMPORTED_MODULE_1__.number
21739
+ })]),
21740
+ /**
21741
+ * Props applied to the transition element.
21742
+ * By default, the element is based on this [`Transition`](https://reactcommunity.org/react-transition-group/transition/) component.
21743
+ * @deprecated Use `slotProps.transition` instead. This prop will be removed in a future major release. See [Migrating from deprecated APIs](/material-ui/migration/migrating-from-deprecated-apis/) for more details.
21744
+ * @default {}
21745
+ */
21746
+ TransitionProps: prop_types__WEBPACK_IMPORTED_MODULE_1__.object
21747
+ } : 0;
21748
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Snackbar);
21749
+
21750
+ /***/ }),
21751
+
21752
+ /***/ "./node_modules/@mui/material/esm/Snackbar/snackbarClasses.js":
21753
+ /*!********************************************************************!*\
21754
+ !*** ./node_modules/@mui/material/esm/Snackbar/snackbarClasses.js ***!
21755
+ \********************************************************************/
21756
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
21757
+
21758
+ "use strict";
21759
+ __webpack_require__.r(__webpack_exports__);
21760
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
21761
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
21762
+ /* harmony export */ getSnackbarUtilityClass: () => (/* binding */ getSnackbarUtilityClass)
21763
+ /* harmony export */ });
21764
+ /* harmony import */ var _mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mui/utils/generateUtilityClasses */ "./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js");
21765
+ /* harmony import */ var _mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils/generateUtilityClass */ "./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js");
21766
+
21767
+
21768
+ function getSnackbarUtilityClass(slot) {
21769
+ return (0,_mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__["default"])('MuiSnackbar', slot);
21770
+ }
21771
+ const snackbarClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__["default"])('MuiSnackbar', ['root', 'anchorOriginTopCenter', 'anchorOriginBottomCenter', 'anchorOriginTopRight', 'anchorOriginBottomRight', 'anchorOriginTopLeft', 'anchorOriginBottomLeft']);
21772
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (snackbarClasses);
21773
+
21774
+ /***/ }),
21775
+
21776
+ /***/ "./node_modules/@mui/material/esm/Snackbar/useSnackbar.js":
21777
+ /*!****************************************************************!*\
21778
+ !*** ./node_modules/@mui/material/esm/Snackbar/useSnackbar.js ***!
21779
+ \****************************************************************/
21780
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
21781
+
21782
+ "use strict";
21783
+ __webpack_require__.r(__webpack_exports__);
21784
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
21785
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
21786
+ /* harmony export */ });
21787
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
21788
+ /* harmony import */ var _mui_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils/useEventCallback */ "./node_modules/@mui/utils/esm/useEventCallback/useEventCallback.js");
21789
+ /* harmony import */ var _mui_utils_useTimeout__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/utils/useTimeout */ "./node_modules/@mui/utils/esm/useTimeout/useTimeout.js");
21790
+ /* harmony import */ var _mui_utils_extractEventHandlers__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/utils/extractEventHandlers */ "./node_modules/@mui/utils/esm/extractEventHandlers/extractEventHandlers.js");
21791
+ 'use client';
21792
+
21793
+
21794
+
21795
+
21796
+
21797
+ function useSnackbar(parameters = {}) {
21798
+ const {
21799
+ autoHideDuration = null,
21800
+ disableWindowBlurListener = false,
21801
+ onClose,
21802
+ open,
21803
+ resumeHideDuration
21804
+ } = parameters;
21805
+ const timerAutoHide = (0,_mui_utils_useTimeout__WEBPACK_IMPORTED_MODULE_2__["default"])();
21806
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
21807
+ if (!open) {
21808
+ return undefined;
21809
+ }
21810
+
21811
+ /**
21812
+ * @param {KeyboardEvent} nativeEvent
21813
+ */
21814
+ function handleKeyDown(nativeEvent) {
21815
+ if (!nativeEvent.defaultPrevented) {
21816
+ if (nativeEvent.key === 'Escape') {
21817
+ // not calling `preventDefault` since we don't know if people may ignore this event e.g. a permanently open snackbar
21818
+ onClose?.(nativeEvent, 'escapeKeyDown');
21819
+ }
21820
+ }
21821
+ }
21822
+ document.addEventListener('keydown', handleKeyDown);
21823
+ return () => {
21824
+ document.removeEventListener('keydown', handleKeyDown);
21825
+ };
21826
+ }, [open, onClose]);
21827
+ const handleClose = (0,_mui_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_1__["default"])((event, reason) => {
21828
+ onClose?.(event, reason);
21829
+ });
21830
+ const setAutoHideTimer = (0,_mui_utils_useEventCallback__WEBPACK_IMPORTED_MODULE_1__["default"])(autoHideDurationParam => {
21831
+ if (!onClose || autoHideDurationParam == null) {
21832
+ return;
21833
+ }
21834
+ timerAutoHide.start(autoHideDurationParam, () => {
21835
+ handleClose(null, 'timeout');
21836
+ });
21837
+ });
21838
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
21839
+ if (open) {
21840
+ setAutoHideTimer(autoHideDuration);
21841
+ }
21842
+ return timerAutoHide.clear;
21843
+ }, [open, autoHideDuration, setAutoHideTimer, timerAutoHide]);
21844
+ const handleClickAway = event => {
21845
+ onClose?.(event, 'clickaway');
21846
+ };
21847
+
21848
+ // Pause the timer when the user is interacting with the Snackbar
21849
+ // or when the user hide the window.
21850
+ const handlePause = timerAutoHide.clear;
21851
+
21852
+ // Restart the timer when the user is no longer interacting with the Snackbar
21853
+ // or when the window is shown back.
21854
+ const handleResume = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(() => {
21855
+ if (autoHideDuration != null) {
21856
+ setAutoHideTimer(resumeHideDuration != null ? resumeHideDuration : autoHideDuration * 0.5);
21857
+ }
21858
+ }, [autoHideDuration, resumeHideDuration, setAutoHideTimer]);
21859
+ const createHandleBlur = otherHandlers => event => {
21860
+ const onBlurCallback = otherHandlers.onBlur;
21861
+ onBlurCallback?.(event);
21862
+ handleResume();
21863
+ };
21864
+ const createHandleFocus = otherHandlers => event => {
21865
+ const onFocusCallback = otherHandlers.onFocus;
21866
+ onFocusCallback?.(event);
21867
+ handlePause();
21868
+ };
21869
+ const createMouseEnter = otherHandlers => event => {
21870
+ const onMouseEnterCallback = otherHandlers.onMouseEnter;
21871
+ onMouseEnterCallback?.(event);
21872
+ handlePause();
21873
+ };
21874
+ const createMouseLeave = otherHandlers => event => {
21875
+ const onMouseLeaveCallback = otherHandlers.onMouseLeave;
21876
+ onMouseLeaveCallback?.(event);
21877
+ handleResume();
21878
+ };
21879
+ react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => {
21880
+ // TODO: window global should be refactored here
21881
+ if (!disableWindowBlurListener && open) {
21882
+ window.addEventListener('focus', handleResume);
21883
+ window.addEventListener('blur', handlePause);
21884
+ return () => {
21885
+ window.removeEventListener('focus', handleResume);
21886
+ window.removeEventListener('blur', handlePause);
21887
+ };
21888
+ }
21889
+ return undefined;
21890
+ }, [disableWindowBlurListener, open, handleResume, handlePause]);
21891
+ const getRootProps = (externalProps = {}) => {
21892
+ const externalEventHandlers = {
21893
+ ...(0,_mui_utils_extractEventHandlers__WEBPACK_IMPORTED_MODULE_3__["default"])(parameters),
21894
+ ...(0,_mui_utils_extractEventHandlers__WEBPACK_IMPORTED_MODULE_3__["default"])(externalProps)
21895
+ };
21896
+ return {
21897
+ // ClickAwayListener adds an `onClick` prop which results in the alert not being announced.
21898
+ // See https://github.com/mui/material-ui/issues/29080
21899
+ role: 'presentation',
21900
+ ...externalProps,
21901
+ ...externalEventHandlers,
21902
+ onBlur: createHandleBlur(externalEventHandlers),
21903
+ onFocus: createHandleFocus(externalEventHandlers),
21904
+ onMouseEnter: createMouseEnter(externalEventHandlers),
21905
+ onMouseLeave: createMouseLeave(externalEventHandlers)
21906
+ };
21907
+ };
21908
+ return {
21909
+ getRootProps,
21910
+ onClickAway: handleClickAway
21911
+ };
21912
+ }
21913
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (useSnackbar);
21914
+
21915
+ /***/ }),
21916
+
21917
+ /***/ "./node_modules/@mui/material/esm/SnackbarContent/SnackbarContent.js":
21918
+ /*!***************************************************************************!*\
21919
+ !*** ./node_modules/@mui/material/esm/SnackbarContent/SnackbarContent.js ***!
21920
+ \***************************************************************************/
21921
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
21922
+
21923
+ "use strict";
21924
+ __webpack_require__.r(__webpack_exports__);
21925
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
21926
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
21927
+ /* harmony export */ });
21928
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
21929
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "./node_modules/prop-types/index.js");
21930
+ /* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! clsx */ "./node_modules/clsx/dist/clsx.mjs");
21931
+ /* harmony import */ var _mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/utils/composeClasses */ "./node_modules/@mui/utils/esm/composeClasses/composeClasses.js");
21932
+ /* harmony import */ var _mui_system_colorManipulator__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/system/colorManipulator */ "./node_modules/@mui/system/esm/colorManipulator/colorManipulator.js");
21933
+ /* harmony import */ var _zero_styled_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../zero-styled/index.js */ "./node_modules/@mui/material/esm/styles/styled.js");
21934
+ /* harmony import */ var _utils_memoTheme_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/memoTheme.js */ "./node_modules/@mui/material/esm/utils/memoTheme.js");
21935
+ /* harmony import */ var _DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../DefaultPropsProvider/index.js */ "./node_modules/@mui/material/esm/DefaultPropsProvider/DefaultPropsProvider.js");
21936
+ /* harmony import */ var _Paper_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../Paper/index.js */ "./node_modules/@mui/material/esm/Paper/Paper.js");
21937
+ /* harmony import */ var _snackbarContentClasses_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./snackbarContentClasses.js */ "./node_modules/@mui/material/esm/SnackbarContent/snackbarContentClasses.js");
21938
+ /* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/jsx-runtime.js");
21939
+ 'use client';
21940
+
21941
+
21942
+
21943
+
21944
+
21945
+
21946
+
21947
+
21948
+
21949
+
21950
+
21951
+
21952
+ const useUtilityClasses = ownerState => {
21953
+ const {
21954
+ classes
21955
+ } = ownerState;
21956
+ const slots = {
21957
+ root: ['root'],
21958
+ action: ['action'],
21959
+ message: ['message']
21960
+ };
21961
+ return (0,_mui_utils_composeClasses__WEBPACK_IMPORTED_MODULE_3__["default"])(slots, _snackbarContentClasses_js__WEBPACK_IMPORTED_MODULE_9__.getSnackbarContentUtilityClass, classes);
21962
+ };
21963
+ const SnackbarContentRoot = (0,_zero_styled_index_js__WEBPACK_IMPORTED_MODULE_5__["default"])(_Paper_index_js__WEBPACK_IMPORTED_MODULE_8__["default"], {
21964
+ name: 'MuiSnackbarContent',
21965
+ slot: 'Root'
21966
+ })((0,_utils_memoTheme_js__WEBPACK_IMPORTED_MODULE_6__["default"])(({
21967
+ theme
21968
+ }) => {
21969
+ const emphasis = theme.palette.mode === 'light' ? 0.8 : 0.98;
21970
+ return {
21971
+ ...theme.typography.body2,
21972
+ color: theme.vars ? theme.vars.palette.SnackbarContent.color : theme.palette.getContrastText((0,_mui_system_colorManipulator__WEBPACK_IMPORTED_MODULE_4__.emphasize)(theme.palette.background.default, emphasis)),
21973
+ backgroundColor: theme.vars ? theme.vars.palette.SnackbarContent.bg : (0,_mui_system_colorManipulator__WEBPACK_IMPORTED_MODULE_4__.emphasize)(theme.palette.background.default, emphasis),
21974
+ display: 'flex',
21975
+ alignItems: 'center',
21976
+ flexWrap: 'wrap',
21977
+ padding: '6px 16px',
21978
+ flexGrow: 1,
21979
+ [theme.breakpoints.up('sm')]: {
21980
+ flexGrow: 'initial',
21981
+ minWidth: 288
21982
+ }
21983
+ };
21984
+ }));
21985
+ const SnackbarContentMessage = (0,_zero_styled_index_js__WEBPACK_IMPORTED_MODULE_5__["default"])('div', {
21986
+ name: 'MuiSnackbarContent',
21987
+ slot: 'Message'
21988
+ })({
21989
+ padding: '8px 0'
21990
+ });
21991
+ const SnackbarContentAction = (0,_zero_styled_index_js__WEBPACK_IMPORTED_MODULE_5__["default"])('div', {
21992
+ name: 'MuiSnackbarContent',
21993
+ slot: 'Action'
21994
+ })({
21995
+ display: 'flex',
21996
+ alignItems: 'center',
21997
+ marginLeft: 'auto',
21998
+ paddingLeft: 16,
21999
+ marginRight: -8
22000
+ });
22001
+ const SnackbarContent = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function SnackbarContent(inProps, ref) {
22002
+ const props = (0,_DefaultPropsProvider_index_js__WEBPACK_IMPORTED_MODULE_7__.useDefaultProps)({
22003
+ props: inProps,
22004
+ name: 'MuiSnackbarContent'
22005
+ });
22006
+ const {
22007
+ action,
22008
+ className,
22009
+ message,
22010
+ role = 'alert',
22011
+ ...other
22012
+ } = props;
22013
+ const ownerState = props;
22014
+ const classes = useUtilityClasses(ownerState);
22015
+ return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsxs)(SnackbarContentRoot, {
22016
+ role: role,
22017
+ elevation: 6,
22018
+ className: (0,clsx__WEBPACK_IMPORTED_MODULE_2__["default"])(classes.root, className),
22019
+ ownerState: ownerState,
22020
+ ref: ref,
22021
+ ...other,
22022
+ children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(SnackbarContentMessage, {
22023
+ className: classes.message,
22024
+ ownerState: ownerState,
22025
+ children: message
22026
+ }), action ? /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(SnackbarContentAction, {
22027
+ className: classes.action,
22028
+ ownerState: ownerState,
22029
+ children: action
22030
+ }) : null]
22031
+ });
22032
+ });
22033
+ true ? SnackbarContent.propTypes /* remove-proptypes */ = {
22034
+ // ┌────────────────────────────── Warning ──────────────────────────────┐
22035
+ // │ These PropTypes are generated from the TypeScript type definitions. │
22036
+ // │ To update them, edit the d.ts file and run `pnpm proptypes`. │
22037
+ // └─────────────────────────────────────────────────────────────────────┘
22038
+ /**
22039
+ * The action to display. It renders after the message, at the end of the snackbar.
22040
+ */
22041
+ action: prop_types__WEBPACK_IMPORTED_MODULE_1__.node,
22042
+ /**
22043
+ * Override or extend the styles applied to the component.
22044
+ */
22045
+ classes: prop_types__WEBPACK_IMPORTED_MODULE_1__.object,
22046
+ /**
22047
+ * @ignore
22048
+ */
22049
+ className: prop_types__WEBPACK_IMPORTED_MODULE_1__.string,
22050
+ /**
22051
+ * The message to display.
22052
+ */
22053
+ message: prop_types__WEBPACK_IMPORTED_MODULE_1__.node,
22054
+ /**
22055
+ * The ARIA role attribute of the element.
22056
+ * @default 'alert'
22057
+ */
22058
+ role: prop_types__WEBPACK_IMPORTED_MODULE_1__.string,
22059
+ /**
22060
+ * The system prop that allows defining system overrides as well as additional CSS styles.
22061
+ */
22062
+ 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])
22063
+ } : 0;
22064
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (SnackbarContent);
22065
+
22066
+ /***/ }),
22067
+
22068
+ /***/ "./node_modules/@mui/material/esm/SnackbarContent/snackbarContentClasses.js":
22069
+ /*!**********************************************************************************!*\
22070
+ !*** ./node_modules/@mui/material/esm/SnackbarContent/snackbarContentClasses.js ***!
22071
+ \**********************************************************************************/
22072
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
22073
+
22074
+ "use strict";
22075
+ __webpack_require__.r(__webpack_exports__);
22076
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
22077
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
22078
+ /* harmony export */ getSnackbarContentUtilityClass: () => (/* binding */ getSnackbarContentUtilityClass)
22079
+ /* harmony export */ });
22080
+ /* harmony import */ var _mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mui/utils/generateUtilityClasses */ "./node_modules/@mui/utils/esm/generateUtilityClasses/generateUtilityClasses.js");
22081
+ /* harmony import */ var _mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/utils/generateUtilityClass */ "./node_modules/@mui/utils/esm/generateUtilityClass/generateUtilityClass.js");
22082
+
22083
+
22084
+ function getSnackbarContentUtilityClass(slot) {
22085
+ return (0,_mui_utils_generateUtilityClass__WEBPACK_IMPORTED_MODULE_1__["default"])('MuiSnackbarContent', slot);
22086
+ }
22087
+ const snackbarContentClasses = (0,_mui_utils_generateUtilityClasses__WEBPACK_IMPORTED_MODULE_0__["default"])('MuiSnackbarContent', ['root', 'message', 'action']);
22088
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (snackbarContentClasses);
22089
+
22090
+ /***/ }),
22091
+
20816
22092
  /***/ "./node_modules/@mui/material/esm/Stack/Stack.js":
20817
22093
  /*!*******************************************************!*\
20818
22094
  !*** ./node_modules/@mui/material/esm/Stack/Stack.js ***!
@@ -99612,38 +100888,41 @@ __webpack_require__.r(__webpack_exports__);
99612
100888
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/CircularProgress/CircularProgress.js");
99613
100889
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormHelperText/FormHelperText.js");
99614
100890
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Alert/Alert.js");
99615
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControl/FormControl.js");
99616
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/InputLabel/InputLabel.js");
99617
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Select/Select.js");
99618
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/MenuItem/MenuItem.js");
99619
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControlLabel/FormControlLabel.js");
99620
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Checkbox/Checkbox.js");
99621
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tooltip/Tooltip.js");
99622
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/ToggleButtonGroup/ToggleButtonGroup.js");
99623
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/ToggleButton/ToggleButton.js");
99624
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Paper/Paper.js");
99625
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/createTheme.js");
99626
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/ThemeProvider.js");
99627
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AccountBalance.js");
99628
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AutoAwesome.js");
99629
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness4.js");
99630
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness7.js");
99631
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CheckCircle.js");
99632
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CloudDownload.js");
99633
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ContentCopy.js");
99634
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
99635
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/InfoOutlined.js");
99636
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Login.js");
99637
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Logout.js");
99638
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/NoteAdd.js");
99639
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Replay.js");
99640
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
99641
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Visibility.js");
99642
- /* harmony import */ var _PromptManagerDialog__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! ./PromptManagerDialog */ "./src/PromptManagerDialog.tsx");
99643
- /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
99644
- /* harmony import */ var xlsx__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! xlsx */ "./node_modules/xlsx/xlsx.mjs");
99645
- /* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! jszip */ "./node_modules/jszip/dist/jszip.min.js");
99646
- /* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_51___default = /*#__PURE__*/__webpack_require__.n(jszip__WEBPACK_IMPORTED_MODULE_51__);
100891
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/InputAdornment/InputAdornment.js");
100892
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tooltip/Tooltip.js");
100893
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControl/FormControl.js");
100894
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/InputLabel/InputLabel.js");
100895
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Select/Select.js");
100896
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/MenuItem/MenuItem.js");
100897
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/FormControlLabel/FormControlLabel.js");
100898
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Checkbox/Checkbox.js");
100899
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/ToggleButtonGroup/ToggleButtonGroup.js");
100900
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/ToggleButton/ToggleButton.js");
100901
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Paper/Paper.js");
100902
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/createTheme.js");
100903
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/styles/ThemeProvider.js");
100904
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AccountBalance.js");
100905
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AttachMoney.js");
100906
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/AutoAwesome.js");
100907
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness4.js");
100908
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Brightness7.js");
100909
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CheckCircle.js");
100910
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CloudDownload.js");
100911
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ContentCopy.js");
100912
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/DeleteOutline.js");
100913
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
100914
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/InfoOutlined.js");
100915
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Login.js");
100916
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Logout.js");
100917
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/NoteAdd.js");
100918
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Replay.js");
100919
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
100920
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Visibility.js");
100921
+ /* harmony import */ var _PromptManagerDialog__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(/*! ./PromptManagerDialog */ "./src/PromptManagerDialog.tsx");
100922
+ /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
100923
+ /* harmony import */ var xlsx__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(/*! xlsx */ "./node_modules/xlsx/xlsx.mjs");
100924
+ /* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(/*! jszip */ "./node_modules/jszip/dist/jszip.min.js");
100925
+ /* harmony import */ var jszip__WEBPACK_IMPORTED_MODULE_54___default = /*#__PURE__*/__webpack_require__.n(jszip__WEBPACK_IMPORTED_MODULE_54__);
99647
100926
 
99648
100927
 
99649
100928
 
@@ -99704,6 +100983,29 @@ const INSTRUCTION_ROW = [
99704
100983
  "# Обязательно | The URL for the main image of your item. Images must be in a supported format (JPG/GIF/PNG) and at least 500 x 500 pixels.",
99705
100984
  "# Обязательно | Фирменное название товара. Не более 100 символов."
99706
100985
  ];
100986
+ /** Хвост ссылки для каталога: sub/utm и макросы Meta (не URL-encode — подстановка на стороне FB). */
100987
+ const CATALOG_LINK_TRACKING_SUFFIX = 'sub1={{ad.id}}&sub2={{adset.id}}&sub3={{campaign.id}}&sub4={{ad.name}}&sub5={{adset.name}}&sub6={{campaign.name}}&sub7={{placement}}&sub8={{site_source_name}}&utm_source=facebook&utm_medium=paid';
100988
+ /** Добавляет к URL лендинга creative_id и трекинговые параметры для строки каталога. */
100989
+ function appendCreativeIdToCatalogLink(baseUrl, creativeId) {
100990
+ const u = baseUrl.trim();
100991
+ if (!u)
100992
+ return u;
100993
+ const sep = u.includes('?') ? '&' : '?';
100994
+ return `${u}${sep}creative_id=${encodeURIComponent(creativeId)}&${CATALOG_LINK_TRACKING_SUFFIX}`;
100995
+ }
100996
+ /**
100997
+ * Разбор строк «ЗАГОЛОВОК n:» / «ТЕКСТ n:» из ответа модели.
100998
+ * Иногда модель пишет ZAGОЛОВОК (латиница ZAG + кириллица ОЛОВОК) или ZAGOLOVOK — без этого парсер не видит заголовки.
100999
+ */
101000
+ const PAIRS_TITLE_LINE_RE = /^[\s\uFEFF]*(?:\*{1,2})?\s*(?:ЗАГОЛОВОК|ZAG[ОOо][ЛLl][ОOо][ВBb][ОOо][КKk]|ZAGOLOVOK)\s+(\d+)\s*:\s*(.+)$/iu;
101001
+ const PAIRS_TEXT_LINE_RE = /^[\s\uFEFF]*(?:\*{1,2})?\s*(?:ТЕКСТ|TEKST)\s+(\d+)\s*:\s*(.*)$/iu;
101002
+ /** Число из поля цены для быстрого переключения валюты; если нет — 99 */
101003
+ function extractLeadingPriceNumber(value) {
101004
+ const m = value.trim().match(/(\d+(?:[.,]\d+)?)/);
101005
+ if (m)
101006
+ return m[1].replace(',', '.');
101007
+ return '99';
101008
+ }
99707
101009
  function App() {
99708
101010
  const [clientId, setClientId] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
99709
101011
  const [clientSecret, setClientSecret] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
@@ -99946,9 +101248,11 @@ function App() {
99946
101248
  const [uploadedLink, setUploadedLink] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
99947
101249
  const [testLoading, setTestLoading] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
99948
101250
  const [linkCopied, setLinkCopied] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
101251
+ const [pairsJsonCopied, setPairsJsonCopied] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
99949
101252
  const [openRouterKeyCopied, setOpenRouterKeyCopied] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
99950
101253
  const [loadingContentFromDrive, setLoadingContentFromDrive] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
99951
101254
  const [driveFilesFound, setDriveFilesFound] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({ content: false });
101255
+ const syncDriveAfterPromptSaveRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(() => { });
99952
101256
  // Theme state
99953
101257
  const [darkMode, setDarkMode] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {
99954
101258
  const saved = localStorage.getItem('themeMode');
@@ -99995,7 +101299,7 @@ function App() {
99995
101299
  }
99996
101300
  };
99997
101301
  // Create theme based on mode
99998
- const theme = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => (0,_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"])({
101302
+ const theme = react__WEBPACK_IMPORTED_MODULE_0___default().useMemo(() => (0,_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"])({
99999
101303
  palette: {
100000
101304
  mode: darkMode ? 'dark' : 'light',
100001
101305
  ...(darkMode
@@ -100087,7 +101391,7 @@ function App() {
100087
101391
  };
100088
101392
  loadKey();
100089
101393
  // Load prompt overrides from Electron config
100090
- (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_49__.loadOverridesFromElectron)();
101394
+ (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_52__.loadOverridesFromElectron)();
100091
101395
  }, []);
100092
101396
  // Save form fields to localStorage whenever they change
100093
101397
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
@@ -100143,6 +101447,7 @@ function App() {
100143
101447
  setTitles('');
100144
101448
  setTexts(['']);
100145
101449
  setLink('');
101450
+ setUploadedLink('');
100146
101451
  return;
100147
101452
  }
100148
101453
  const folderId = extractFolderId(driveFolderUrl);
@@ -100157,6 +101462,7 @@ function App() {
100157
101462
  setTitles('');
100158
101463
  setTexts(['']);
100159
101464
  setLink('');
101465
+ setUploadedLink('');
100160
101466
  return;
100161
101467
  }
100162
101468
  logToTerminal('log', '[Load] driveFolderUrl changed, clearing old data and loading from folderId:', folderId);
@@ -100167,6 +101473,7 @@ function App() {
100167
101473
  setTitles('');
100168
101474
  setTexts(['']);
100169
101475
  setLink('');
101476
+ setUploadedLink('');
100170
101477
  setLoadingContentFromDrive(true);
100171
101478
  setDriveFilesFound({ content: false });
100172
101479
  // Load content from Google Drive
@@ -100437,11 +101744,11 @@ function App() {
100437
101744
  const data = await response.json();
100438
101745
  const hasProduct = data.files.some((f) => {
100439
101746
  const name = f.name?.toLowerCase() || '';
100440
- return name === 'product.png' || name === 'product.jpg';
101747
+ return name === 'product.png' || name === 'product.jpg' || name === 'product.webp';
100441
101748
  });
100442
101749
  const hasCreativeImages = data.files.some((f) => {
100443
101750
  const name = f.name?.toLowerCase() || '';
100444
- return name !== 'product.png' && name !== 'product.jpg';
101751
+ return name !== 'product.png' && name !== 'product.jpg' && name !== 'product.webp';
100445
101752
  });
100446
101753
  if (!cancelled) {
100447
101754
  setFolderFilesInfo({ hasProduct, hasCreativeImages });
@@ -101416,7 +102723,7 @@ function App() {
101416
102723
  for (let li = 0; li < lines.length; li++) {
101417
102724
  // Trim for matching (handles leading spaces, tabs, zero-width chars from model)
101418
102725
  const trimmed = lines[li].trim();
101419
- const titleMatch = trimmed.match(/^ЗАГОЛОВОК\s+(\d+)\s*:\s*(.+)/i);
102726
+ const titleMatch = trimmed.match(PAIRS_TITLE_LINE_RE);
101420
102727
  if (titleMatch) {
101421
102728
  // flush pending text
101422
102729
  if (currentTextNum > 0) {
@@ -101427,7 +102734,7 @@ function App() {
101427
102734
  titleMap[parseInt(titleMatch[1])] = titleMatch[2].trim();
101428
102735
  continue;
101429
102736
  }
101430
- const textMatch = trimmed.match(/^ТЕКСТ\s+(\d+)\s*:\s*(.*)/i);
102737
+ const textMatch = trimmed.match(PAIRS_TEXT_LINE_RE);
101431
102738
  if (textMatch) {
101432
102739
  // flush previous text if any
101433
102740
  if (currentTextNum > 0) {
@@ -101516,6 +102823,41 @@ function App() {
101516
102823
  setTranslatingPairs(false);
101517
102824
  }
101518
102825
  };
102826
+ /** Удалить одну сгенерированную пару (заголовок + текст) и сдвинуть индексы. */
102827
+ const handleDeleteGeneratedPair = (pairIndex) => {
102828
+ if (!window.confirm(`Удалить пару ${pairIndex + 1}?`))
102829
+ return;
102830
+ setGeneratedTitlesData(prev => {
102831
+ const next = prev.filter((_, idx) => idx !== pairIndex).map((t, idx) => ({ ...t, index: idx + 1 }));
102832
+ setTitles(next.map(t => t.title).filter(Boolean).join('\n'));
102833
+ return next;
102834
+ });
102835
+ setGeneratedTextsData(prev => {
102836
+ const next = prev.filter((_, idx) => idx !== pairIndex).map((t, idx) => ({ ...t, index: idx + 1 }));
102837
+ setTexts(next.length ? next.map(t => t.text) : ['']);
102838
+ return next;
102839
+ });
102840
+ setLastUsedApproachIndices(prev => prev.filter((_, idx) => idx !== pairIndex));
102841
+ setPairTranslations(prev => {
102842
+ const next = {};
102843
+ Object.entries(prev).forEach(([k, v]) => {
102844
+ const n = Number(k);
102845
+ if (Number.isNaN(n))
102846
+ return;
102847
+ if (n < pairIndex)
102848
+ next[n] = v;
102849
+ else if (n > pairIndex)
102850
+ next[n - 1] = v;
102851
+ });
102852
+ return next;
102853
+ });
102854
+ };
102855
+ /** Удалить один сгенерированный креатив и перенумеровать слоты. */
102856
+ const handleDeleteGeneratedImage = (imageIndex) => {
102857
+ if (!window.confirm(`Удалить креатив ${imageIndex}?`))
102858
+ return;
102859
+ setGeneratedImagesData(prev => prev.filter(img => img.index !== imageIndex).map((img, idx) => ({ ...img, index: idx + 1 })));
102860
+ };
101519
102861
  const handleGenerateContent = async () => {
101520
102862
  if (!generateProduct.trim() || !generateGeo.trim()) {
101521
102863
  alert('Please fill in Product and Geo fields');
@@ -101531,7 +102873,7 @@ function App() {
101531
102873
  setTexts(['']);
101532
102874
  setPairTranslations({});
101533
102875
  // Read pairs count from settings (3–10, default 3)
101534
- const pairsCountInit = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_49__.getPairsCount)();
102876
+ const pairsCountInit = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_52__.getPairsCount)();
101535
102877
  // Initialize placeholders
101536
102878
  const initialTitles = Array.from({ length: pairsCountInit }, (_, index) => ({
101537
102879
  index: index + 1,
@@ -101560,7 +102902,7 @@ function App() {
101560
102902
  }
101561
102903
  // Generate all pairs (title + text) in a single request
101562
102904
  addLog(formatLogMessage('log', '📋 Generating title+text pairs in a single request...'));
101563
- const selectedIndices = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_49__.getSelectedPairApproaches)();
102905
+ const selectedIndices = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_52__.getSelectedPairApproaches)();
101564
102906
  setLastUsedApproachIndices(selectedIndices);
101565
102907
  const pairsCount = selectedIndices.length;
101566
102908
  addLog(formatLogMessage('log', `⚙️ Generating ${pairsCount} pairs (approaches: ${selectedIndices.join(', ')})`));
@@ -102194,8 +103536,8 @@ function App() {
102194
103536
  return;
102195
103537
  e.target.value = '';
102196
103538
  const ext = file.name.toLowerCase().split('.').pop();
102197
- if (ext !== 'png' && ext !== 'jpg' && ext !== 'jpeg') {
102198
- alert('Выберите изображение PNG или JPG');
103539
+ if (ext !== 'png' && ext !== 'jpg' && ext !== 'jpeg' && ext !== 'webp') {
103540
+ alert('Выберите изображение PNG, JPG или WebP');
102199
103541
  return;
102200
103542
  }
102201
103543
  setUploadingProduct(true);
@@ -102219,12 +103561,12 @@ function App() {
102219
103561
  reader.onerror = reject;
102220
103562
  reader.readAsDataURL(file);
102221
103563
  });
102222
- const filename = ext === 'png' ? 'product.png' : 'product.jpg';
102223
- logToTerminal('log', '📤 Загрузка product.png/jpg...');
103564
+ const filename = ext === 'png' ? 'product.png' : ext === 'webp' ? 'product.webp' : 'product.jpg';
103565
+ logToTerminal('log', `📤 Загрузка ${filename}...`);
102224
103566
  await uploadImageToDrive(dataUrl, filename, folderId, addLog);
102225
- logToTerminal('log', '✅ product.png/jpg загружен');
103567
+ logToTerminal('log', `✅ ${filename} загружен`);
102226
103568
  setFolderFilesInfo(prev => prev ? { ...prev, hasProduct: true } : { hasProduct: true });
102227
- alert('product.png/jpg успешно загружен в папку!');
103569
+ alert(`${filename} успешно загружен в папку!`);
102228
103570
  }
102229
103571
  catch (err) {
102230
103572
  const errorMsg = 'Ошибка загрузки: ' + err.message;
@@ -102465,17 +103807,19 @@ function App() {
102465
103807
  fetchOpenRouterBalance();
102466
103808
  return html;
102467
103809
  };
102468
- const createZipArchive = async (htmlContent, productImageBlob, addLog) => {
103810
+ const createZipArchive = async (htmlContent, productImageBlob, productImageName, addLog) => {
102469
103811
  const logMsg = (level, ...args) => {
102470
103812
  logToTerminal(level, ...args);
102471
103813
  if (addLog)
102472
103814
  addLog(formatLogMessage(level, ...args));
102473
103815
  };
102474
103816
  logMsg('log', '📦 Creating ZIP archive with HTML and product image...');
102475
- const zip = new (jszip__WEBPACK_IMPORTED_MODULE_51___default())();
102476
- zip.file('index.html', htmlContent);
102477
- zip.file('product.png', productImageBlob);
102478
- logMsg('log', '✅ Files added to archive: index.html, product.png');
103817
+ const zip = new (jszip__WEBPACK_IMPORTED_MODULE_54___default())();
103818
+ // Replace product image path in HTML to match actual filename (png/jpg/webp)
103819
+ const htmlWithProductPath = htmlContent.replace(/src=["']product\.(png|jpe?g|webp)["']/gi, `src="${productImageName}"`);
103820
+ zip.file('index.html', htmlWithProductPath);
103821
+ zip.file(productImageName, productImageBlob);
103822
+ logMsg('log', `✅ Files added to archive: index.html, ${productImageName}`);
102479
103823
  return await zip.generateAsync({ type: 'blob' });
102480
103824
  };
102481
103825
  const uploadZipToDrive = async (zipBlob, filename, folderId, addLog) => {
@@ -102612,7 +103956,7 @@ function App() {
102612
103956
  };
102613
103957
  const handleCreateLanding = async () => {
102614
103958
  if (!folderFilesInfo?.hasProduct || !driveFolderUrl.trim()) {
102615
- alert('product.png/jpg не найден в папке. Сначала сгенерируйте его с помощью кнопки "Generate Product from Banka"');
103959
+ alert('product.png/jpg/webp не найден в папке. Сначала сгенерируйте его с помощью кнопки "Generate Product from Banka"');
102616
103960
  return;
102617
103961
  }
102618
103962
  if (!openaiApiKey) {
@@ -102642,11 +103986,11 @@ function App() {
102642
103986
  logToTerminal('log', '🔍 Получение изображения продукта...');
102643
103987
  const productImage = await fetchProductImage(folderId);
102644
103988
  if (!productImage) {
102645
- throw new Error('product.png/jpg not found in the folder');
103989
+ throw new Error('product.png/jpg/webp not found in the folder');
102646
103990
  }
102647
103991
  // Download product image as blob
102648
- addLog(formatLogMessage('log', '📥 Скачивание product.png...'));
102649
- logToTerminal('log', '📥 Скачивание product.png...');
103992
+ addLog(formatLogMessage('log', '📥 Скачивание изображения продукта...'));
103993
+ logToTerminal('log', '📥 Скачивание изображения продукта...');
102650
103994
  let token = await getValidAccessToken();
102651
103995
  if (!token) {
102652
103996
  throw new Error('Not logged in to Google Drive');
@@ -102702,7 +104046,7 @@ function App() {
102702
104046
  reader.readAsDataURL(productImageBlob);
102703
104047
  });
102704
104048
  // Replace relative image path with base64 data URL in HTML
102705
- const htmlWithImage = htmlContent.replace(/src=["']product\.(png|jpe?g)["']/gi, `src="${imageBase64}"`);
104049
+ const htmlWithImage = htmlContent.replace(/src=["']product\.(png|jpe?g|webp)["']/gi, `src="${imageBase64}"`);
102706
104050
  // Create blob URL and open in new window
102707
104051
  const blob = new Blob([htmlWithImage], { type: 'text/html' });
102708
104052
  const url = URL.createObjectURL(blob);
@@ -102721,7 +104065,7 @@ function App() {
102721
104065
  // Create ZIP archive with HTML and product image
102722
104066
  addLog(formatLogMessage('log', '📦 Создание ZIP архива с HTML и изображением...'));
102723
104067
  logToTerminal('log', '📦 Создание ZIP архива...');
102724
- const zipBlob = await createZipArchive(htmlContent, productImageBlob, addLog);
104068
+ const zipBlob = await createZipArchive(htmlContent, productImageBlob, productImage.name, addLog);
102725
104069
  addLog(formatLogMessage('log', '✅ ZIP архив создан'));
102726
104070
  // Upload ZIP to Google Drive
102727
104071
  const zipFilename = `landing_${Date.now()}.zip`;
@@ -102792,15 +104136,15 @@ function App() {
102792
104136
  throw new Error(errorMsg);
102793
104137
  }
102794
104138
  addLog(formatLogMessage('log', '✅ Folder ID extracted:', folderId));
102795
- // Check for product.png
102796
- addLog(formatLogMessage('log', '🔍 Checking for product.png...'));
104139
+ // Check for product image (png/jpg/webp)
104140
+ addLog(formatLogMessage('log', '🔍 Checking for product image...'));
102797
104141
  const productImage = await fetchProductImage(folderId);
102798
104142
  if (!productImage) {
102799
- const errorMsg = 'product.png/jpg not found in the folder. Please generate it first using "Generate Product from Banka" button.';
104143
+ const errorMsg = 'product.png/jpg/webp not found in the folder. Please generate it first using "Generate Product from Banka" button.';
102800
104144
  addLog(formatLogMessage('error', errorMsg));
102801
104145
  throw new Error(errorMsg);
102802
104146
  }
102803
- addLog(formatLogMessage('log', '✅ product.png found'));
104147
+ addLog(formatLogMessage('log', '✅ Product image found'));
102804
104148
  // Generate images with different approaches (количество по каждому подходу)
102805
104149
  const approaches = (0,_prompts__WEBPACK_IMPORTED_MODULE_1__.getCreoApproaches)();
102806
104150
  if (approaches.length === 0) {
@@ -103112,8 +104456,7 @@ function App() {
103112
104456
  ...img,
103113
104457
  regenerating: true,
103114
104458
  regenerateStartTime: Date.now(),
103115
- checkStatus: 'pending',
103116
- imageUrl: undefined // Clear old image URL to force re-render with new one
104459
+ checkStatus: 'pending'
103117
104460
  }
103118
104461
  : img));
103119
104462
  addLog(formatLogMessage('log', `🔄 Переделка изображения ${imageData.index} (${imageData.approach})...`));
@@ -103339,8 +104682,7 @@ ${imageData.originalPrompt}
103339
104682
  checkResult: undefined,
103340
104683
  checkErrors: undefined,
103341
104684
  // Explicitly ignore any previous comments
103342
- customRegeneratePrompt: '',
103343
- imageUrl: undefined // Clear old image URL to force re-render with new one
104685
+ customRegeneratePrompt: ''
103344
104686
  }
103345
104687
  : img));
103346
104688
  addLog(formatLogMessage('log', `🔁 Переделка заново (с нуля) изображения ${imageData.index} (${imageData.approach})...`));
@@ -103657,10 +104999,10 @@ ${imageData.originalPrompt}
103657
104999
  throw new Error(err.error?.message || 'Failed to fetch Drive files');
103658
105000
  }
103659
105001
  const data = await response.json();
103660
- // Filter out product.png/jpg (used for product reference, not creative images)
105002
+ // Filter out product.png/jpg/webp (used for product reference, not creative images)
103661
105003
  const filteredFiles = data.files.filter((f) => {
103662
105004
  const name = f.name?.toLowerCase() || '';
103663
- return name !== 'product.png' && name !== 'product.jpg';
105005
+ return name !== 'product.png' && name !== 'product.jpg' && name !== 'product.webp';
103664
105006
  });
103665
105007
  return filteredFiles.map((f) => f.id ? `https://drive.google.com/file/d/${f.id}/view?usp=sharing` : '');
103666
105008
  };
@@ -103668,7 +105010,7 @@ ${imageData.originalPrompt}
103668
105010
  const validToken = await getValidAccessToken();
103669
105011
  if (!validToken)
103670
105012
  throw new Error('Not logged in');
103671
- const q = `'${folderId}' in parents and trashed = false and (name = 'product.png' or name = 'product.jpg')`;
105013
+ const q = `'${folderId}' in parents and trashed = false and (name = 'product.png' or name = 'product.jpg' or name = 'product.webp')`;
103672
105014
  const fields = 'files(id, name)';
103673
105015
  const url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(q)}&fields=${encodeURIComponent(fields)}`;
103674
105016
  const response = await fetch(url, {
@@ -103682,9 +105024,10 @@ ${imageData.originalPrompt}
103682
105024
  }
103683
105025
  const data = await response.json();
103684
105026
  if (data.files && data.files.length > 0) {
103685
- // Prefer product.png over product.jpg if both exist
105027
+ // Prefer product.png > product.webp > product.jpg if multiple exist
103686
105028
  const pngFile = data.files.find((f) => f.name?.toLowerCase() === 'product.png');
103687
- const file = pngFile || data.files[0];
105029
+ const webpFile = data.files.find((f) => f.name?.toLowerCase() === 'product.webp');
105030
+ const file = pngFile || webpFile || data.files[0];
103688
105031
  return {
103689
105032
  id: file.id,
103690
105033
  name: file.name,
@@ -103693,104 +105036,61 @@ ${imageData.originalPrompt}
103693
105036
  }
103694
105037
  return null;
103695
105038
  };
103696
- // Track ongoing folder creation promises to prevent race conditions
103697
- const envFolderCreationPromises = new Map();
103698
- // Get or create 'env' folder inside the main folder
103699
- const getOrCreateEnvFolder = async (parentFolderId) => {
103700
- // If there's already a creation in progress for this folder, wait for it
103701
- const existingPromise = envFolderCreationPromises.get(parentFolderId);
103702
- if (existingPromise) {
103703
- logToTerminal('log', '[Env Folder] Waiting for ongoing creation for parent folder:', parentFolderId);
103704
- return existingPromise;
103705
- }
103706
- // Create a new promise for this folder creation
103707
- const creationPromise = (async () => {
103708
- try {
103709
- return await getOrCreateEnvFolderImpl(parentFolderId);
103710
- }
103711
- finally {
103712
- // Remove from map when done (success or failure)
103713
- envFolderCreationPromises.delete(parentFolderId);
103714
- }
103715
- })();
103716
- envFolderCreationPromises.set(parentFolderId, creationPromise);
103717
- return creationPromise;
103718
- };
103719
- // Implementation of getOrCreateEnvFolder
103720
- const getOrCreateEnvFolderImpl = async (parentFolderId) => {
105039
+ const PROJECT_SETTINGS_FILENAME = 'project-settings.json';
105040
+ /** Старое имя файла — всё ещё ищем при загрузке; при сохранении переименуем в project-settings.json. */
105041
+ const LEGACY_PROJECT_SETTINGS_FILENAME = 'temp-generated-content.json';
105042
+ /** Папки `env` внутри проекта (только поиск, без создания) для обратной совместимости и удаления после миграции. */
105043
+ const findEnvFolderIds = async (parentFolderId) => {
103721
105044
  const validToken = await getValidAccessToken();
103722
- if (!validToken) {
103723
- throw new Error('Not logged in to Google Drive');
103724
- }
103725
- // Check if 'env' folder exists
105045
+ if (!validToken)
105046
+ return [];
103726
105047
  const q = `'${parentFolderId}' in parents and trashed = false and name = 'env' and mimeType = 'application/vnd.google-apps.folder'`;
103727
105048
  const fields = 'files(id, name)';
103728
105049
  const searchUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(q)}&fields=${encodeURIComponent(fields)}`;
103729
105050
  const searchResponse = await fetch(searchUrl, {
103730
- headers: {
103731
- 'Authorization': `Bearer ${validToken}`
103732
- }
105051
+ headers: { 'Authorization': `Bearer ${validToken}` }
103733
105052
  });
103734
- if (searchResponse.ok) {
105053
+ if (!searchResponse.ok)
105054
+ return [];
105055
+ const searchData = await searchResponse.json();
105056
+ return (searchData.files || []).map((f) => f.id).filter(Boolean);
105057
+ };
105058
+ /** Ищет JSON настроек в папке: сначала project-settings.json, иначе legacy temp-generated-content.json. */
105059
+ const findSettingsFileInFolder = async (parentFolderId) => {
105060
+ const validToken = await getValidAccessToken();
105061
+ if (!validToken)
105062
+ return null;
105063
+ const fields = 'files(id, name)';
105064
+ for (const fileName of [PROJECT_SETTINGS_FILENAME, LEGACY_PROJECT_SETTINGS_FILENAME]) {
105065
+ const q = `'${parentFolderId}' in parents and trashed = false and name = '${fileName}' and mimeType != 'application/vnd.google-apps.folder'`;
105066
+ const searchUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(q)}&fields=${encodeURIComponent(fields)}`;
105067
+ const searchResponse = await fetch(searchUrl, {
105068
+ headers: { 'Authorization': `Bearer ${validToken}` }
105069
+ });
105070
+ if (!searchResponse.ok)
105071
+ continue;
103735
105072
  const searchData = await searchResponse.json();
103736
105073
  if (searchData.files && searchData.files.length > 0) {
103737
- // If multiple folders found, use the first one (shouldn't happen, but handle it)
103738
- const envFolderId = searchData.files[0].id;
103739
- logToTerminal('log', '[Env Folder] Found existing env folder, id:', envFolderId);
103740
105074
  if (searchData.files.length > 1) {
103741
- logToTerminal('warn', '[Env Folder] Multiple env folders found, using first one. Total:', searchData.files.length);
105075
+ logToTerminal('warn', '[Drive Settings] Multiple JSON with same name, using first:', fileName);
103742
105076
  }
103743
- return envFolderId;
105077
+ return searchData.files[0].id;
103744
105078
  }
103745
105079
  }
103746
- else {
103747
- // If search failed, log error but continue to try creating
103748
- const errorText = await searchResponse.text();
103749
- logToTerminal('warn', '[Env Folder] Search failed, will try to create. Status:', searchResponse.status, 'Error:', errorText);
103750
- }
103751
- // Create 'env' folder if it doesn't exist
103752
- logToTerminal('log', '[Env Folder] Creating env folder in parent folder:', parentFolderId);
103753
- const createMetadata = {
103754
- name: 'env',
103755
- mimeType: 'application/vnd.google-apps.folder',
103756
- parents: [parentFolderId]
103757
- };
103758
- const createResponse = await fetch('https://www.googleapis.com/drive/v3/files', {
103759
- method: 'POST',
103760
- headers: {
103761
- 'Authorization': `Bearer ${validToken}`,
103762
- 'Content-Type': 'application/json'
103763
- },
103764
- body: JSON.stringify(createMetadata)
105080
+ return null;
105081
+ };
105082
+ const trashDriveFile = async (fileId) => {
105083
+ const validToken = await getValidAccessToken();
105084
+ if (!validToken)
105085
+ return;
105086
+ const res = await fetch(`https://www.googleapis.com/drive/v3/files/${fileId}`, {
105087
+ method: 'DELETE',
105088
+ headers: { 'Authorization': `Bearer ${validToken}` }
103765
105089
  });
103766
- if (!createResponse.ok) {
103767
- const err = await createResponse.json();
103768
- const errorMessage = err.error?.message || '';
103769
- // If folder already exists (race condition), try to find it again
103770
- if (errorMessage.includes('already exists') || errorMessage.includes('duplicate') || createResponse.status === 409) {
103771
- logToTerminal('log', '[Env Folder] Folder creation failed (likely already exists), searching again...');
103772
- // Retry search after a short delay to allow for eventual consistency
103773
- await new Promise(resolve => setTimeout(resolve, 500));
103774
- const retrySearchResponse = await fetch(searchUrl, {
103775
- headers: {
103776
- 'Authorization': `Bearer ${validToken}`
103777
- }
103778
- });
103779
- if (retrySearchResponse.ok) {
103780
- const retrySearchData = await retrySearchResponse.json();
103781
- if (retrySearchData.files && retrySearchData.files.length > 0) {
103782
- const envFolderId = retrySearchData.files[0].id;
103783
- logToTerminal('log', '[Env Folder] Found existing env folder after retry, id:', envFolderId);
103784
- return envFolderId;
103785
- }
103786
- }
103787
- }
103788
- logToTerminal('error', '[Env Folder] Failed to create env folder:', JSON.stringify(err));
103789
- throw new Error(errorMessage || 'Failed to create env folder in Google Drive');
105090
+ if (!res.ok) {
105091
+ const t = await res.text();
105092
+ logToTerminal('warn', '[Drive Settings] Failed to trash/delete file:', fileId, res.status, t);
103790
105093
  }
103791
- const result = await createResponse.json();
103792
- logToTerminal('log', '[Env Folder] Successfully created env folder, id:', result.id);
103793
- return result.id;
103794
105094
  };
103795
105095
  const sanitizeGeneratedTitlesData = (titlesData) => {
103796
105096
  if (!Array.isArray(titlesData))
@@ -103828,8 +105128,6 @@ ${imageData.originalPrompt}
103828
105128
  logToTerminal('error', '[Save Content] No valid token');
103829
105129
  throw new Error('Not logged in to Google Drive');
103830
105130
  }
103831
- // Get or create 'env' folder
103832
- const envFolderId = await getOrCreateEnvFolder(folderId);
103833
105131
  const dataToSave = {
103834
105132
  aiGenerationSettings: aiSettings || {
103835
105133
  generateProduct: generateProduct || '',
@@ -103839,35 +105137,20 @@ ${imageData.originalPrompt}
103839
105137
  },
103840
105138
  brand: brandValue !== undefined ? brandValue : brand || '',
103841
105139
  link: linkValue !== undefined ? linkValue : link || '',
105140
+ selectedPairApproaches: (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_52__.getSelectedPairApproaches)(),
105141
+ imageApproachCounts: (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_52__.getImageApproachCounts)(),
103842
105142
  savedAt: new Date().toISOString()
103843
105143
  };
103844
105144
  const jsonContent = JSON.stringify(dataToSave, null, 2);
103845
- const filename = 'temp-generated-content.json';
103846
- logToTerminal('log', '[Save Content] Filename:', filename, 'content length:', jsonContent.length);
103847
- // Check if file already exists in 'env' folder
103848
- const q = `'${envFolderId}' in parents and trashed = false and name = '${filename}'`;
103849
- const fields = 'files(id, name)';
103850
- const searchUrl = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(q)}&fields=${encodeURIComponent(fields)}`;
103851
- const searchResponse = await fetch(searchUrl, {
103852
- headers: {
103853
- 'Authorization': `Bearer ${validToken}`
103854
- }
103855
- });
103856
- let fileId = null;
103857
- if (searchResponse.ok) {
103858
- const searchData = await searchResponse.json();
103859
- logToTerminal('log', '[Save Content] Search response, files found:', searchData.files?.length || 0);
103860
- if (searchData.files && searchData.files.length > 0) {
103861
- fileId = searchData.files[0].id;
103862
- logToTerminal('log', '[Save Content] File exists, will update, fileId:', fileId);
103863
- }
103864
- else {
103865
- logToTerminal('log', '[Save Content] File does not exist, will create new');
103866
- }
105145
+ const filename = PROJECT_SETTINGS_FILENAME;
105146
+ logToTerminal('log', '[Save Content] Filename (project root):', filename, 'content length:', jsonContent.length);
105147
+ // Файл в корне папки проекта (не в env)
105148
+ let fileId = await findSettingsFileInFolder(folderId);
105149
+ if (fileId) {
105150
+ logToTerminal('log', '[Save Content] File exists in folder root, will update, fileId:', fileId);
103867
105151
  }
103868
105152
  else {
103869
- const errorText = await searchResponse.text();
103870
- logToTerminal('warn', '[Save Content] Search failed, status:', searchResponse.status);
105153
+ logToTerminal('log', '[Save Content] No file in root yet, will create new at project root');
103871
105154
  }
103872
105155
  if (fileId) {
103873
105156
  // Update existing file - don't include parents in metadata for updates
@@ -103895,12 +105178,11 @@ ${imageData.originalPrompt}
103895
105178
  logToTerminal('log', '[Save Content] Successfully updated file');
103896
105179
  }
103897
105180
  else {
103898
- // Create new file - include parents for new files (in 'env' folder)
103899
- logToTerminal('log', '[Save Content] Creating new file in env folder');
105181
+ logToTerminal('log', '[Save Content] Creating new file in project folder root');
103900
105182
  const createMetadata = {
103901
105183
  name: filename,
103902
105184
  mimeType: 'application/json',
103903
- parents: [envFolderId]
105185
+ parents: [folderId]
103904
105186
  };
103905
105187
  const createForm = new FormData();
103906
105188
  createForm.append('metadata', new Blob([JSON.stringify(createMetadata)], { type: 'application/json' }));
@@ -103921,6 +105203,12 @@ ${imageData.originalPrompt}
103921
105203
  const result = await createResponse.json();
103922
105204
  logToTerminal('log', '[Save Content] Successfully created file, id:', result.id);
103923
105205
  }
105206
+ // После успешного сохранения в корень — убираем устаревшую папку env (и дубликаты, если были)
105207
+ const envIds = await findEnvFolderIds(folderId);
105208
+ for (const envId of envIds) {
105209
+ logToTerminal('log', '[Save Content] Removing legacy env folder:', envId);
105210
+ await trashDriveFile(envId);
105211
+ }
103924
105212
  };
103925
105213
  // Load generated content from Google Drive
103926
105214
  const loadGeneratedContentFromDrive = async (folderId) => {
@@ -103931,40 +105219,28 @@ ${imageData.originalPrompt}
103931
105219
  setDriveFilesFound(prev => ({ ...prev, content: false }));
103932
105220
  return { found: false };
103933
105221
  }
103934
- // Get 'env' folder
103935
- let envFolderId;
103936
- try {
103937
- envFolderId = await getOrCreateEnvFolder(folderId);
103938
- }
103939
- catch (err) {
103940
- logToTerminal('warn', '[Load Content] Failed to get env folder:', err.message || 'Unknown error');
103941
- return { found: false };
105222
+ // 1) Корень папки проекта; 2) иначе legacy: папка env (без создания env)
105223
+ let fileId = await findSettingsFileInFolder(folderId);
105224
+ if (fileId) {
105225
+ logToTerminal('log', '[Load Content] Found settings in project root');
103942
105226
  }
103943
- const filename = 'temp-generated-content.json';
103944
- const q = `'${envFolderId}' in parents and trashed = false and name = '${filename}'`;
103945
- const fields = 'files(id, name)';
103946
- const url = `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(q)}&fields=${encodeURIComponent(fields)}`;
103947
- logToTerminal('log', '[Load Content] Searching for file:', filename);
103948
- const response = await fetch(url, {
103949
- headers: {
103950
- 'Authorization': `Bearer ${validToken}`
105227
+ else {
105228
+ const envIds = await findEnvFolderIds(folderId);
105229
+ for (const envFolderId of envIds) {
105230
+ const id = await findSettingsFileInFolder(envFolderId);
105231
+ if (id) {
105232
+ fileId = id;
105233
+ logToTerminal('log', '[Load Content] Found settings in legacy env folder:', envFolderId);
105234
+ break;
105235
+ }
103951
105236
  }
103952
- });
103953
- if (!response.ok) {
103954
- const errorText = await response.text();
103955
- logToTerminal('warn', '[Load Content] Search failed, status:', response.status, 'error:', errorText);
103956
- setDriveFilesFound(prev => ({ ...prev, content: false }));
103957
- return { found: false };
103958
105237
  }
103959
- const data = await response.json();
103960
- logToTerminal('log', '[Load Content] Search response:', JSON.stringify(data));
103961
- if (!data.files || data.files.length === 0) {
103962
- logToTerminal('log', '[Load Content] File not found - no temp-generated-content.json in folder');
105238
+ if (!fileId) {
105239
+ logToTerminal('log', `[Load Content] No settings file (${PROJECT_SETTINGS_FILENAME} or ${LEGACY_PROJECT_SETTINGS_FILENAME}) in root or env`);
103963
105240
  setDriveFilesFound(prev => ({ ...prev, content: false }));
103964
105241
  return { found: false };
103965
105242
  }
103966
105243
  setDriveFilesFound(prev => ({ ...prev, content: true }));
103967
- const fileId = data.files[0].id;
103968
105244
  logToTerminal('log', '[Load Content] File found, id:', fileId);
103969
105245
  // Download file content
103970
105246
  const downloadUrl = `https://www.googleapis.com/drive/v3/files/${fileId}?alt=media`;
@@ -104011,6 +105287,10 @@ ${imageData.originalPrompt}
104011
105287
  setLink(loadedData.link || '');
104012
105288
  logToTerminal('log', '[Load Content] Loaded link:', loadedData.link || '(empty)');
104013
105289
  }
105290
+ const mergedApproaches = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_52__.mergePromptApproachesFromDriveFile)(loadedData);
105291
+ if (mergedApproaches) {
105292
+ logToTerminal('log', '[Load Content] Applied text + image approach settings from Drive JSON');
105293
+ }
104014
105294
  logToTerminal('log', '[Load Content] Successfully loaded content');
104015
105295
  setDriveFilesFound(prev => ({ ...prev, content: false }));
104016
105296
  return { found: true };
@@ -104021,6 +105301,27 @@ ${imageData.originalPrompt}
104021
105301
  return { found: false };
104022
105302
  }
104023
105303
  };
105304
+ syncDriveAfterPromptSaveRef.current = () => {
105305
+ if (!driveFolderUrl || loadingContentFromDrive)
105306
+ return;
105307
+ const folderId = extractFolderId(driveFolderUrl);
105308
+ if (!folderId)
105309
+ return;
105310
+ logToTerminal('log', '[Drive Sync] Prompt overrides saved locally — updating JSON on Drive');
105311
+ void saveGeneratedContentToDrive(folderId, {
105312
+ generateProduct,
105313
+ generateGeo,
105314
+ generateAdditionalInfo,
105315
+ generatePriceWithCurrency
105316
+ }, brand, link).catch((err) => {
105317
+ logToTerminal('warn', '[Drive Sync] Failed to update Drive after prompt save:', err?.message || err);
105318
+ });
105319
+ };
105320
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
105321
+ const listener = () => syncDriveAfterPromptSaveRef.current();
105322
+ window.addEventListener(_promptOverrides__WEBPACK_IMPORTED_MODULE_52__.PROMPT_OVERRIDES_SAVED_EVENT, listener);
105323
+ return () => window.removeEventListener(_promptOverrides__WEBPACK_IMPORTED_MODULE_52__.PROMPT_OVERRIDES_SAVED_EVENT, listener);
105324
+ }, []);
104024
105325
  const handleGenerate = async () => {
104025
105326
  if (!driveFolderUrl || !brand || !link) {
104026
105327
  alert('Please fill all required fields');
@@ -104076,6 +105377,7 @@ ${imageData.originalPrompt}
104076
105377
  const text = textList[i];
104077
105378
  for (const image of images) {
104078
105379
  const id = `${brand}${idCounter++}`;
105380
+ const rowLink = appendCreativeIdToCatalogLink(link, id);
104079
105381
  rows.push([
104080
105382
  id,
104081
105383
  title,
@@ -104083,7 +105385,7 @@ ${imageData.originalPrompt}
104083
105385
  'in stock',
104084
105386
  'new',
104085
105387
  '10,00 USD',
104086
- link,
105388
+ rowLink,
104087
105389
  image,
104088
105390
  brand
104089
105391
  ]);
@@ -104091,8 +105393,8 @@ ${imageData.originalPrompt}
104091
105393
  }
104092
105394
  setGeneratedData(rows);
104093
105395
  // Create workbook
104094
- const wb = xlsx__WEBPACK_IMPORTED_MODULE_50__.utils.book_new();
104095
- const ws = xlsx__WEBPACK_IMPORTED_MODULE_50__.utils.aoa_to_sheet(rows);
105396
+ const wb = xlsx__WEBPACK_IMPORTED_MODULE_53__.utils.book_new();
105397
+ const ws = xlsx__WEBPACK_IMPORTED_MODULE_53__.utils.aoa_to_sheet(rows);
104096
105398
  // Set column widths (approximate pixel width / 7)
104097
105399
  ws['!cols'] = [
104098
105400
  { wch: 20 }, // id
@@ -104105,9 +105407,9 @@ ${imageData.originalPrompt}
104105
105407
  { wch: 40 }, // image_link
104106
105408
  { wch: 20 } // brand
104107
105409
  ];
104108
- xlsx__WEBPACK_IMPORTED_MODULE_50__.utils.book_append_sheet(wb, ws, "Products");
105410
+ xlsx__WEBPACK_IMPORTED_MODULE_53__.utils.book_append_sheet(wb, ws, "Products");
104109
105411
  // Generate buffer
104110
- const wbout = xlsx__WEBPACK_IMPORTED_MODULE_50__.write(wb, { bookType: 'xlsx', type: 'array' });
105412
+ const wbout = xlsx__WEBPACK_IMPORTED_MODULE_53__.write(wb, { bookType: 'xlsx', type: 'array' });
104111
105413
  // Upload to Drive (имя файла по бренду)
104112
105414
  const dateStr = new Date().toISOString().split('T')[0];
104113
105415
  const fileName = `${brand}-${dateStr}.xlsx`;
@@ -104229,13 +105531,13 @@ ${imageData.originalPrompt}
104229
105531
  setTestLoading(true);
104230
105532
  try {
104231
105533
  // Create simple test workbook with structure
104232
- const wb = xlsx__WEBPACK_IMPORTED_MODULE_50__.utils.book_new();
105534
+ const wb = xlsx__WEBPACK_IMPORTED_MODULE_53__.utils.book_new();
104233
105535
  const rows = [
104234
105536
  INSTRUCTION_ROW,
104235
105537
  ['id', 'title', 'description', 'availability', 'condition', 'price', 'link', 'image_link', 'brand'],
104236
105538
  ['test1', 'Test Title', 'Test Description', 'in stock', 'new', '10.00 USD', 'http://test.com', 'http://test.com/img.jpg', 'TestBrand']
104237
105539
  ];
104238
- const ws = xlsx__WEBPACK_IMPORTED_MODULE_50__.utils.aoa_to_sheet(rows);
105540
+ const ws = xlsx__WEBPACK_IMPORTED_MODULE_53__.utils.aoa_to_sheet(rows);
104239
105541
  // Set column widths
104240
105542
  ws['!cols'] = [
104241
105543
  { wch: 20 }, // id
@@ -104248,8 +105550,8 @@ ${imageData.originalPrompt}
104248
105550
  { wch: 40 }, // image_link
104249
105551
  { wch: 20 } // brand
104250
105552
  ];
104251
- xlsx__WEBPACK_IMPORTED_MODULE_50__.utils.book_append_sheet(wb, ws, "Test");
104252
- const wbout = xlsx__WEBPACK_IMPORTED_MODULE_50__.write(wb, { bookType: 'xlsx', type: 'array' });
105553
+ xlsx__WEBPACK_IMPORTED_MODULE_53__.utils.book_append_sheet(wb, ws, "Test");
105554
+ const wbout = xlsx__WEBPACK_IMPORTED_MODULE_53__.write(wb, { bookType: 'xlsx', type: 'array' });
104253
105555
  // Try to extract folder ID if available, otherwise upload to root
104254
105556
  const folderId = driveFolderUrl ? extractFolderId(driveFolderUrl) : undefined;
104255
105557
  const result = await uploadFileToDrive(wbout, 'test_table.xlsx', folderId || undefined);
@@ -104281,9 +105583,27 @@ ${imageData.originalPrompt}
104281
105583
  alert('Failed to copy link');
104282
105584
  }
104283
105585
  };
105586
+ const copyGeneratedPairsAsJson = async () => {
105587
+ const n = Math.max(generatedTitlesData.length, generatedTextsData.length);
105588
+ if (n === 0)
105589
+ return;
105590
+ const pairs = Array.from({ length: n }, (_, i) => ({
105591
+ title: generatedTitlesData[i]?.title ?? '',
105592
+ text: generatedTextsData[i]?.text ?? '',
105593
+ }));
105594
+ const json = JSON.stringify(pairs, null, 2);
105595
+ try {
105596
+ await navigator.clipboard.writeText(json);
105597
+ setPairsJsonCopied(true);
105598
+ setTimeout(() => setPairsJsonCopied(false), 2000);
105599
+ }
105600
+ catch {
105601
+ alert('Не удалось скопировать в буфер обмена');
105602
+ }
105603
+ };
104284
105604
  // Show lock screen if not unlocked
104285
105605
  if (!unlocked) {
104286
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { theme: theme },
105606
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { theme: theme },
104287
105607
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], null),
104288
105608
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { onClick: handleSecretClick, sx: {
104289
105609
  width: '100vw',
@@ -104323,24 +105643,24 @@ ${imageData.originalPrompt}
104323
105643
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("br", null),
104324
105644
  "Please contact system administrator"))));
104325
105645
  }
104326
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_32__["default"], { theme: theme },
105646
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_33__["default"], { theme: theme },
104327
105647
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], null),
104328
105648
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { maxWidth: "lg", sx: { py: 4 } },
104329
105649
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', mb: 2 } },
104330
105650
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "h4", component: "h1", sx: { fontWeight: 'bold', color: 'primary.main' } }, "Docs Combiner"),
104331
105651
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null,
104332
105652
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { onClick: () => setPromptManagerOpen(true), color: "inherit", "aria-label": "manage prompts", sx: { mr: 1 } },
104333
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null)),
104334
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { onClick: toggleTheme, color: "inherit", "aria-label": "toggle theme" }, darkMode ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_36__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_35__["default"], null)))),
105653
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_49__["default"], null)),
105654
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { onClick: toggleTheme, color: "inherit", "aria-label": "toggle theme" }, darkMode ? react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_38__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], null)))),
104335
105655
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_9__["default"], { variant: "outlined", sx: { mb: 4 } },
104336
105656
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_10__["default"], null,
104337
105657
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { spacing: 3 },
104338
105658
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null,
104339
105659
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "h6", gutterBottom: true }, "Google Drive Authentication"),
104340
105660
  accessToken ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_12__["default"], null,
104341
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_40__["default"], null) },
105661
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null) },
104342
105662
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { sx: { display: 'flex', alignItems: 'center', color: 'success.main' } },
104343
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_37__["default"], { sx: { mr: 1 } }),
105663
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_39__["default"], { sx: { mr: 1 } }),
104344
105664
  " Logged In (Credentials Hidden)")),
104345
105665
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__["default"], null,
104346
105666
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { spacing: 2 },
@@ -104351,7 +105671,7 @@ ${imageData.originalPrompt}
104351
105671
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["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)" }),
104352
105672
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], { label: "Client Secret", variant: "outlined", fullWidth: true, value: clientSecret, onChange: (e) => handleClientSecretChange(e.target.value) }))),
104353
105673
  openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 2, mt: 2 } },
104354
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_33__["default"], { color: openRouterAccountBalance !== null ? 'primary' : 'disabled' }),
105674
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { color: openRouterAccountBalance !== null ? 'primary' : 'disabled' }),
104355
105675
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "body2", color: openRouterAccountBalance !== null ? 'text.primary' : 'text.secondary' },
104356
105676
  "\u0411\u0430\u043B\u0430\u043D\u0441: ",
104357
105677
  openRouterBalanceLoading ? 'Loading...' : (openRouterAccountBalance !== null ? `$${openRouterAccountBalance.toFixed(2)}` : 'N/A')),
@@ -104360,8 +105680,8 @@ ${imageData.originalPrompt}
104360
105680
  "\u041B\u0438\u043C\u0438\u0442 \u043A\u043B\u044E\u0447\u0430: ",
104361
105681
  openRouterBalanceLoading ? 'Loading...' : (openRouterBalance === -1 ? 'Без лимита' : (openRouterBalance !== null ? `${openRouterBalance.toFixed(4)}` : 'N/A'))))),
104362
105682
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mt: 2 } },
104363
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_37__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_42__["default"], null)), sx: { flexGrow: 1 } }, authLoading ? 'Logging in...' : (accessToken ? 'Logged In' : 'Login with Google')),
104364
- accessToken && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { variant: "outlined", color: "error", onClick: handleLogout, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_43__["default"], null) }, "Logout")))),
105683
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_39__["default"], null) : react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_45__["default"], null)), sx: { flexGrow: 1 } }, authLoading ? 'Logging in...' : (accessToken ? 'Logged In' : 'Login with Google')),
105684
+ accessToken && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { variant: "outlined", color: "error", onClick: handleLogout, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_46__["default"], null) }, "Logout")))),
104365
105685
  !accessToken && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
104366
105686
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], null),
104367
105687
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null,
@@ -104377,7 +105697,7 @@ ${imageData.originalPrompt}
104377
105697
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 14 }),
104378
105698
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null, "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0444\u0430\u0439\u043B\u043E\u0432...")))),
104379
105699
  !checkingFolderFiles && folderFilesInfo && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], null,
104380
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { component: "span", sx: { display: 'block' } }, folderFilesInfo.hasProduct ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { component: "span", sx: { color: 'success.main' } }, "\u2713 product.png/jpg \u043D\u0430\u0439\u0434\u0435\u043D")) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { component: "span", sx: { color: 'info.main' } }, "\u2139 product.png/jpg \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"))))),
105700
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { component: "span", sx: { display: 'block' } }, folderFilesInfo.hasProduct ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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_6__["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"))))),
104381
105701
  !checkingFolderFiles && !folderFilesInfo && driveFolderUrl.trim() && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], null, "\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 Google Drive"))))),
104382
105702
  !driveFolderUrl.trim() ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { severity: "info", sx: { mt: 2 } },
104383
105703
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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"),
@@ -104409,39 +105729,58 @@ ${imageData.originalPrompt}
104409
105729
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["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 } })),
104410
105730
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
104411
105731
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["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" }),
104412
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["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" })),
105732
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["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: {
105733
+ endAdornment: (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { position: "end" },
105734
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 0.25, mr: -0.5 } },
105735
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["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)" },
105736
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0434\u043E\u043B\u043B\u0430\u0440", onClick: () => {
105737
+ const n = extractLeadingPriceNumber(generatePriceWithCurrency);
105738
+ setGeneratePriceWithCurrency(`$${n}`);
105739
+ }, edge: "end" },
105740
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_35__["default"], { sx: { fontSize: 20 } }))),
105741
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["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)" },
105742
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0435\u0432\u0440\u043E", onClick: () => {
105743
+ const n = extractLeadingPriceNumber(generatePriceWithCurrency);
105744
+ setGeneratePriceWithCurrency(`€${n}`);
105745
+ }, edge: "end", sx: { minWidth: 34, fontSize: '1rem', fontWeight: 700 } }, "\u20AC")),
105746
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["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)" },
105747
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { size: "small", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u043E \u0437\u043B\u043E\u0442\u044B\u0435", onClick: () => {
105748
+ const n = extractLeadingPriceNumber(generatePriceWithCurrency);
105749
+ setGeneratePriceWithCurrency(`${n} zł`);
105750
+ }, edge: "end", sx: { minWidth: 36, fontSize: '0.8rem', fontWeight: 700, letterSpacing: -0.3 } }, "z\u0142"))))),
105751
+ } })),
104413
105752
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null,
104414
105753
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["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 } })),
104415
105754
  openaiApiKey && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
104416
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { fullWidth: true, variant: "outlined" },
104417
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439"),
104418
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { value: selectedImageModel, onChange: (e) => handleImageModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], { disabled: true },
105755
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { fullWidth: true, variant: "outlined" },
105756
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["default"], null, "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439"),
105757
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { value: selectedImageModel, onChange: (e) => handleImageModelChange(e.target.value), label: "\u041C\u043E\u0434\u0435\u043B\u044C \u0434\u043B\u044F \u0433\u0435\u043D\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439", disabled: loadingImageModels || imageModels.length === 0 }, loadingImageModels ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["default"], { disabled: true },
104419
105758
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
104420
105759
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
104421
- 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_24__["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_24__["default"], { key: model.id, value: model.id }, model.name))))),
105760
+ 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_26__["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_26__["default"], { key: model.id, value: model.id }, model.name))))),
104422
105761
  !loadingImageModels && imageModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], null, selectedImageModel === _models__WEBPACK_IMPORTED_MODULE_2__.MODELS.imageGeneration
104423
105762
  ? 'Используется модель по умолчанию'
104424
105763
  : 'Выбрана модель: ' + (imageModels.find(m => m.id === selectedImageModel)?.name || selectedImageModel)))),
104425
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], { fullWidth: true, variant: "outlined" },
104426
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["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"),
104427
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["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_24__["default"], { disabled: true },
105764
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], { fullWidth: true, variant: "outlined" },
105765
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_24__["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"),
105766
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["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_26__["default"], { disabled: true },
104428
105767
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
104429
105768
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
104430
- 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_24__["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_24__["default"], { key: model.id, value: model.id }, model.name))))),
105769
+ 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_26__["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_26__["default"], { key: model.id, value: model.id }, model.name))))),
104431
105770
  !loadingValidationModels && validationModels.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], null, selectedValidationModel === _models__WEBPACK_IMPORTED_MODULE_2__.MODELS.creativeValidation
104432
105771
  ? 'Используется модель по умолчанию'
104433
105772
  : 'Выбрана модель: ' + (validationModels.find(m => m.id === selectedValidationModel)?.name || selectedValidationModel))),
104434
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_25__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_26__["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 } })))),
105773
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], { control: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["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 } })))),
104435
105774
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
104436
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { variant: "contained", color: "primary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], null), onClick: handleGenerateContent, disabled: generating || loadingContentFromDrive || !openaiApiKey || !generateProduct.trim() || !generateGeo.trim(), sx: { flexGrow: 1 }, size: "large" }, generating ? 'Generating...' : 'Generate Titles & Descriptions'),
105775
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { variant: "contained", color: "primary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_36__["default"], null), onClick: handleGenerateContent, disabled: generating || loadingContentFromDrive || !openaiApiKey || !generateProduct.trim() || !generateGeo.trim(), sx: { flexGrow: 1 }, size: "large" }, generating ? 'Generating...' : 'Generate Titles & Descriptions'),
104437
105776
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { flexGrow: 1 } },
104438
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], { title: imageAspectRatio === '1:1'
105777
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { title: imageAspectRatio === '1:1'
104439
105778
  ? '1:1 — квадрат (1024×1024 px)'
104440
105779
  : imageAspectRatio === '2:3'
104441
105780
  ? '2:3 — портрет (1024×1536 px)'
104442
105781
  : 'Оба — квадрат и портрет на каждый подход', placement: "top" },
104443
105782
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
104444
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_28__["default"], { value: imageAspectRatio, exclusive: true, onChange: (_e, val) => {
105783
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: imageAspectRatio, exclusive: true, onChange: (_e, val) => {
104445
105784
  if (val && val !== imageAspectRatio) {
104446
105785
  if (generatedImagesData.length > 0) {
104447
105786
  const label = val === 'both' ? 'оба (1:1 + 2:3)' : val;
@@ -104457,10 +105796,10 @@ ${imageData.originalPrompt}
104457
105796
  }
104458
105797
  }
104459
105798
  }, size: "small", disabled: generatingImages, sx: { height: 42 } },
104460
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "1:1", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "1:1"),
104461
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "2:3", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "2:3"),
104462
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_29__["default"], { value: "both", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "\u041E\u0431\u0430")))),
104463
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { variant: "contained", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], null), onClick: handleGenerateImages, disabled: generatingImages ||
105799
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__["default"], { value: "1:1", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "1:1"),
105800
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__["default"], { value: "2:3", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "2:3"),
105801
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__["default"], { value: "both", sx: { px: 1.5, fontWeight: 600, fontSize: '0.8rem' } }, "\u041E\u0431\u0430")))),
105802
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { variant: "contained", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_36__["default"], null), onClick: handleGenerateImages, disabled: generatingImages ||
104464
105803
  !openaiApiKey ||
104465
105804
  (!accessToken && !refreshToken) ||
104466
105805
  !generateProduct.trim() ||
@@ -104478,9 +105817,9 @@ ${imageData.originalPrompt}
104478
105817
  : !driveFolderUrl.trim()
104479
105818
  ? 'Заполните URL папки Google Drive'
104480
105819
  : undefined }, generatingImages ? 'Generating Images...' : 'Generate Images')),
104481
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_38__["default"], null), sx: { py: 1.5, fontSize: '1.1rem', flexGrow: 1 } }, loading ? 'Generating...' : 'Generate Catalog'),
105820
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_40__["default"], null), sx: { py: 1.5, fontSize: '1.1rem', flexGrow: 1 } }, loading ? 'Generating...' : 'Generate Catalog'),
104482
105821
  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_8__["default"], { "aria-label": "copy link", color: "inherit", size: "small", onClick: handleCopyLink, sx: { ml: 1 } },
104483
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_39__["default"], { fontSize: "small" })) },
105822
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_41__["default"], { fontSize: "small" })) },
104484
105823
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, flexWrap: 'wrap' } },
104485
105824
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
104486
105825
  "\u041A\u0430\u0442\u0430\u043B\u043E\u0433 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D!",
@@ -104490,22 +105829,22 @@ ${imageData.originalPrompt}
104490
105829
  getElectronAPI().openExternal(uploadedLink);
104491
105830
  }, style: { cursor: 'pointer', textDecoration: 'underline', color: 'inherit' } }, "\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 Google Drive")),
104492
105831
  linkCopied && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: { color: 'success.dark', fontWeight: 'bold' } }, "\u0421\u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u043E!"))))),
104493
- 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. \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\".")),
105832
+ 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\".")),
104494
105833
  !generatingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
104495
105834
  !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")),
104496
105835
  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")),
104497
105836
  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")),
104498
105837
  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")),
104499
105838
  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"))))),
104500
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", { type: "file", ref: productFileInputRef, accept: "image/png,image/jpeg,image/jpg", style: { display: 'none' }, onChange: handleProductFileSelected }),
105839
+ 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 }),
104501
105840
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { direction: "row", spacing: 2, sx: { mb: 2 } },
104502
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_38__["default"], null), onClick: handleUploadProductFile, disabled: uploadingProduct || !accessToken || !driveFolderUrl.trim(), sx: { flexGrow: 1 }, size: "large" }, uploadingProduct ? 'Загрузка...' : 'Загрузить product.png/jpg'),
104503
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_44__["default"], null), onClick: handleCreateLanding, disabled: generatingLanding ||
105841
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_40__["default"], null), onClick: handleUploadProductFile, disabled: uploadingProduct || !accessToken || !driveFolderUrl.trim(), sx: { flexGrow: 1 }, size: "large" }, uploadingProduct ? 'Загрузка...' : 'Загрузить product.png/jpg/webp'),
105842
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_47__["default"], null), onClick: handleCreateLanding, disabled: generatingLanding ||
104504
105843
  !openaiApiKey ||
104505
105844
  !accessToken ||
104506
105845
  !driveFolderUrl.trim() ||
104507
105846
  (folderFilesInfo !== null && !folderFilesInfo.hasProduct), sx: { flexGrow: 1 }, size: "large", title: folderFilesInfo !== null && !folderFilesInfo.hasProduct
104508
- ? 'product.png/jpg не найден в папке. Загрузите его с помощью кнопки «Загрузить product.png/jpg»'
105847
+ ? 'product.png/jpg/webp не найден в папке. Загрузите его с помощью кнопки «Загрузить product»'
104509
105848
  : undefined }, generatingLanding ? 'Creating Landing...' : 'Создать лендинг')),
104510
105849
  generatedImagesData.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { mb: 2, mt: 3 } },
104511
105850
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "h6", gutterBottom: true, sx: { fontWeight: 'bold' } },
@@ -104517,6 +105856,8 @@ ${imageData.originalPrompt}
104517
105856
  checkingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 2 } },
104518
105857
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16 }),
104519
105858
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: { color: 'text.secondary' } }, "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0430..."))),
105859
+ generatedImagesData.length > 0 && generatedImagesData.some(img => !img.uploaded && img.imageUrl) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { mb: 2 } },
105860
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_40__["default"], null), fullWidth: true }, uploadingImages ? 'Загрузка...' : `Загрузить все (${generatedImagesData.filter(img => !img.uploaded && img.imageUrl).length})`))),
104520
105861
  generatedImagesData.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: {
104521
105862
  display: 'grid',
104522
105863
  gridTemplateColumns: { xs: '1fr', sm: 'repeat(2, 1fr)', md: 'repeat(3, 1fr)' },
@@ -104526,6 +105867,34 @@ ${imageData.originalPrompt}
104526
105867
  const imgRatio = imageData.aspectRatio ?? (imageAspectRatio === 'both' ? '1:1' : imageAspectRatio);
104527
105868
  const aspectRatioCss = imgRatio === '2:3' ? '2 / 3' : '1 / 1';
104528
105869
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { key: imageData.index, sx: { position: 'relative' } },
105870
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u0440\u0435\u0430\u0442\u0438\u0432" },
105871
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
105872
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { size: "small", "aria-label": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043A\u0440\u0435\u0430\u0442\u0438\u0432", sx: {
105873
+ position: 'absolute',
105874
+ top: 6,
105875
+ right: 6,
105876
+ zIndex: 3,
105877
+ bgcolor: 'rgba(32, 32, 32, 0.92)',
105878
+ color: '#fff',
105879
+ border: '2px solid rgba(255, 255, 255, 0.95)',
105880
+ boxShadow: '0 2px 12px rgba(0, 0, 0, 0.45)',
105881
+ width: 36,
105882
+ height: 36,
105883
+ '&:hover': {
105884
+ bgcolor: 'error.main',
105885
+ borderColor: 'rgba(255, 255, 255, 1)',
105886
+ color: '#fff',
105887
+ },
105888
+ '&.Mui-disabled': {
105889
+ bgcolor: 'rgba(32, 32, 32, 0.45)',
105890
+ borderColor: 'rgba(255, 255, 255, 0.4)',
105891
+ color: 'rgba(255, 255, 255, 0.5)',
105892
+ },
105893
+ }, onClick: () => handleDeleteGeneratedImage(imageData.index), disabled: generatingImages ||
105894
+ imageData.generating ||
105895
+ !!imageData.regenerating ||
105896
+ !!imageData.uploading },
105897
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_42__["default"], { fontSize: "small" })))),
104529
105898
  imageData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: {
104530
105899
  width: '100%',
104531
105900
  aspectRatio: aspectRatioCss,
@@ -104546,7 +105915,24 @@ ${imageData.originalPrompt}
104546
105915
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: { color: 'text.secondary', textAlign: 'center' } }, imageData.approach),
104547
105916
  generatingImages && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: { color: 'text.secondary', textAlign: 'center' } },
104548
105917
  "\u23F1\uFE0F \u041F\u0440\u043E\u0448\u043B\u043E: ",
104549
- formatElapsedTime(elapsedTime.images))))) : imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
105918
+ formatElapsedTime(elapsedTime.images))))) : imageData.regenerating && !imageData.imageUrl ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: {
105919
+ width: '100%',
105920
+ aspectRatio: aspectRatioCss,
105921
+ border: (theme) => `2px dashed ${theme.palette.primary.main}`,
105922
+ borderRadius: 1,
105923
+ backgroundColor: (theme) => theme.palette.mode === 'dark'
105924
+ ? 'rgba(25, 118, 210, 0.1)'
105925
+ : 'rgba(25, 118, 210, 0.05)',
105926
+ display: 'flex',
105927
+ flexDirection: 'column',
105928
+ alignItems: 'center',
105929
+ justifyContent: 'center',
105930
+ gap: 2,
105931
+ p: 3
105932
+ } },
105933
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 40, sx: { color: 'primary.main' } }),
105934
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "body2", sx: { color: 'text.secondary', textAlign: 'center', fontWeight: 'bold' } }, "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u043A\u0430..."),
105935
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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,
104550
105936
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { component: "img", src: imageData.imageUrl, alt: `Generated Image ${imageData.index}`, sx: {
104551
105937
  width: '100%',
104552
105938
  height: 'auto',
@@ -104641,7 +106027,7 @@ ${imageData.originalPrompt}
104641
106027
  "+",
104642
106028
  imageData.checkErrors.length - 2,
104643
106029
  " \u0435\u0449\u0451")))),
104644
- imageData.checkFailed && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { size: "small", variant: "outlined", color: "warning", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_45__["default"], null), onClick: () => handleRetryCheck(imageData), disabled: imageData.checking, sx: { mt: 0.5, fontSize: '0.7rem', py: 0.25, px: 1 } }, "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443")))),
106030
+ imageData.checkFailed && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { size: "small", variant: "outlined", color: "warning", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null), onClick: () => handleRetryCheck(imageData), disabled: imageData.checking, sx: { mt: 0.5, fontSize: '0.7rem', py: 0.25, px: 1 } }, "\u041F\u043E\u0432\u0442\u043E\u0440\u0438\u0442\u044C \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443")))),
104645
106031
  imageData.checkStatus === 'checking' && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: { color: 'warning.main', display: 'block' } }, "\uD83D\uDD0D \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442\u0441\u044F...")),
104646
106032
  imageData.checkStatus === 'pending' && !imageData.failed && !imageData.generating && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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")),
104647
106033
  imageData.failed && !imageData.generating && !imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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")),
@@ -104664,7 +106050,7 @@ ${imageData.originalPrompt}
104664
106050
  : 'transparent'
104665
106051
  }
104666
106052
  } }),
104667
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_34__["default"], null), onClick: () => handleRegenerateImage(imageData), disabled: imageData.regenerating ||
106053
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_36__["default"], null), onClick: () => handleRegenerateImage(imageData), disabled: imageData.regenerating ||
104668
106054
  imageData.uploading ||
104669
106055
  imageData.checkStatus === 'checking' ||
104670
106056
  !imageData.originalPrompt ||
@@ -104674,12 +106060,12 @@ ${imageData.originalPrompt}
104674
106060
  : ((generatingImages && !imageData.imageUrl && !imageData.failed && !imageData.generating)
104675
106061
  ? 'В очереди'
104676
106062
  : (!imageData.imageUrl ? 'Сгенерировать' : 'Переделать'))),
104677
- imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { size: "small", variant: "outlined", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_45__["default"], null), onClick: () => handleRegenerateImageFresh(imageData), disabled: imageData.regenerating ||
106063
+ imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { size: "small", variant: "outlined", color: "secondary", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_48__["default"], null), onClick: () => handleRegenerateImageFresh(imageData), disabled: imageData.regenerating ||
104678
106064
  imageData.uploading ||
104679
106065
  imageData.checkStatus === 'checking' ||
104680
106066
  !imageData.originalPrompt ||
104681
106067
  !imageData.productImageUrl, fullWidth: true }, "\u041F\u0435\u0440\u0435\u0434\u0435\u043B\u0430\u0442\u044C \u0437\u0430\u043D\u043E\u0432\u043E")),
104682
- !imageData.uploaded && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { size: "small", variant: "outlined", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_38__["default"], null), onClick: () => {
106068
+ !imageData.uploaded && imageData.imageUrl && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { size: "small", variant: "outlined", startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_40__["default"], null), onClick: () => {
104683
106069
  const folderId = extractFolderId(driveFolderUrl);
104684
106070
  if (folderId) {
104685
106071
  handleUploadImage(imageData, folderId);
@@ -104687,15 +106073,24 @@ ${imageData.originalPrompt}
104687
106073
  }, disabled: imageData.uploading || imageData.regenerating || !driveFolderUrl.trim(), fullWidth: true }, imageData.uploading ? 'Загрузка...' : 'Загрузить'))))));
104688
106074
  }))),
104689
106075
  generatedImagesData.length > 0 && generatedImagesData.some(img => !img.uploaded && img.imageUrl) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { mt: 2 } },
104690
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_38__["default"], null), fullWidth: true }, uploadingImages ? 'Загрузка...' : `Загрузить все (${generatedImagesData.filter(img => !img.uploaded && img.imageUrl).length})`))))),
106076
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["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_40__["default"], null), fullWidth: true }, uploadingImages ? 'Загрузка...' : `Загрузить все (${generatedImagesData.filter(img => !img.uploaded && img.imageUrl).length})`))))),
104691
106077
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { sx: { my: 2 } }),
104692
106078
  (generatedTitlesData.length > 0 || generatedTextsData.length > 0 || loadingContentFromDrive) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { mb: 2 } },
104693
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "h6", gutterBottom: true, sx: { fontWeight: 'bold' } },
104694
- "\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043F\u0430\u0440\u044B (",
104695
- Math.min(generatedTitlesData.filter(t => t.title).length, generatedTextsData.filter(t => t.text).length),
104696
- "/",
104697
- Math.max(generatedTitlesData.length, generatedTextsData.length),
104698
- ")"),
106079
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 1, mb: 1 } },
106080
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "h6", sx: { fontWeight: 'bold' }, component: "div" },
106081
+ "\u0421\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 \u043F\u0430\u0440\u044B (",
106082
+ Math.min(generatedTitlesData.filter(t => t.title).length, generatedTextsData.filter(t => t.text).length),
106083
+ "/",
106084
+ Math.max(generatedTitlesData.length, generatedTextsData.length),
106085
+ ")"),
106086
+ (generatedTitlesData.length > 0 || generatedTextsData.length > 0) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { title: pairsJsonCopied ? 'Скопировано' : 'Скопировать все пары как JSON-массив' },
106087
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["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: {
106088
+ opacity: 0.28,
106089
+ p: 0.35,
106090
+ color: 'text.secondary',
106091
+ '&:hover': { opacity: 0.75, color: 'text.primary' },
106092
+ } },
106093
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_41__["default"], { sx: { fontSize: 16 } }))))),
104699
106094
  loadingContentFromDrive && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: {
104700
106095
  display: 'flex',
104701
106096
  flexDirection: 'column',
@@ -104722,7 +106117,7 @@ ${imageData.originalPrompt}
104722
106117
  const pairLabel = pairApproach ? pairApproach.name : `пара ${i + 1}`;
104723
106118
  const pairGenerating = (titleData?.generating || textData?.generating);
104724
106119
  const pairFailed = (!pairGenerating && titleData?.failed && textData?.failed);
104725
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__["default"], { key: i, variant: "outlined", sx: {
106120
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"], { key: i, variant: "outlined", sx: {
104726
106121
  p: 2,
104727
106122
  borderColor: pairFailed
104728
106123
  ? 'error.main'
@@ -104734,7 +106129,7 @@ ${imageData.originalPrompt}
104734
106129
  ? (theme.palette.mode === 'dark' ? 'rgba(25,118,210,0.05)' : 'rgba(25,118,210,0.02)')
104735
106130
  : 'transparent',
104736
106131
  } },
104737
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { mb: 1.5 } },
106132
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { direction: "row", spacing: 1, alignItems: "center", sx: { mb: 1.5, flexWrap: 'wrap' } },
104738
106133
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: {
104739
106134
  fontWeight: 700,
104740
106135
  px: 1,
@@ -104750,7 +106145,12 @@ ${imageData.originalPrompt}
104750
106145
  "\u041F\u0430\u0440\u0430 ",
104751
106146
  i + 1),
104752
106147
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", color: "text.secondary" }, pairLabel),
104753
- 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 } })) : pairTranslations[i] ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_27__["default"], { title: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null,
106148
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { flexGrow: 1, minWidth: 8 } }),
106149
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { title: "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0430\u0440\u0443" },
106150
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null,
106151
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { size: "small", color: "error", "aria-label": "\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043F\u0430\u0440\u0443", onClick: () => handleDeleteGeneratedPair(i), disabled: pairGenerating || generating },
106152
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_42__["default"], { fontSize: "small" })))),
106153
+ 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 } })) : pairTranslations[i] ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], { title: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], null,
104754
106154
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: { fontWeight: 700, display: 'block', mb: 0.5 } }, "\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A:"),
104755
106155
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: { display: 'block', mb: 1 } }, pairTranslations[i].titleRu),
104756
106156
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "caption", sx: { fontWeight: 700, display: 'block', mb: 0.5 } }, "\u0422\u0435\u043A\u0441\u0442:"),
@@ -104758,13 +106158,26 @@ ${imageData.originalPrompt}
104758
106158
  tooltip: { sx: { maxWidth: 360, fontSize: 12, lineHeight: 1.6, p: '10px 14px' } },
104759
106159
  } },
104760
106160
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_8__["default"], { size: "small", sx: { p: 0.25, color: 'text.disabled', '&:hover': { color: 'primary.main' } } },
104761
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_41__["default"], { sx: { fontSize: 14 } })))) : null),
106161
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_44__["default"], { sx: { fontSize: 14 } })))) : null),
104762
106162
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { spacing: 1.5 },
104763
106163
  titleData && (titleData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
104764
106164
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16, sx: { color: 'primary.main' } }),
104765
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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_6__["default"], { variant: "body2", sx: { color: 'error.main' } },
104766
- "\u274C \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u043D\u0435 \u0441\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D",
104767
- titleData.errorMessage ? `: ${titleData.errorMessage}` : '')) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], { label: `Заголовок ${i + 1}`, variant: "outlined", fullWidth: true, size: "small", value: titleData.title, onChange: (e) => {
106165
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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_15__["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) => {
106166
+ const newValue = e.target.value;
106167
+ setGeneratedTitlesData(prev => {
106168
+ const updated = prev.map(t => t.index === titleData.index
106169
+ ? { ...t, title: newValue, failed: false, errorMessage: undefined }
106170
+ : t);
106171
+ setTitles(updated.map(t => t.title).filter(Boolean).join('\n'));
106172
+ return updated;
106173
+ });
106174
+ }, sx: {
106175
+ '& .MuiInputBase-root': {
106176
+ backgroundColor: (theme) => theme.palette.mode === 'dark'
106177
+ ? 'rgba(244,67,54,0.08)'
106178
+ : 'rgba(244,67,54,0.04)'
106179
+ }
106180
+ } })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], { label: `Заголовок ${i + 1}`, variant: "outlined", fullWidth: true, size: "small", value: titleData.title, onChange: (e) => {
104768
106181
  const newValue = e.target.value;
104769
106182
  setGeneratedTitlesData(prev => {
104770
106183
  const updated = prev.map(t => t.index === titleData.index ? { ...t, title: newValue } : t);
@@ -104780,9 +106193,22 @@ ${imageData.originalPrompt}
104780
106193
  } }))),
104781
106194
  textData && (textData.generating ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1 } },
104782
106195
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 16, sx: { color: 'primary.main' } }),
104783
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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_6__["default"], { variant: "body2", sx: { color: 'error.main' } },
104784
- "\u274C \u0422\u0435\u043A\u0441\u0442 \u043D\u0435 \u0441\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D",
104785
- textData.errorMessage ? `: ${textData.errorMessage}` : '')) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], { label: `Текст ${i + 1}`, variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: textData.text, onChange: (e) => {
106196
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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_15__["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) => {
106197
+ const newValue = e.target.value;
106198
+ setGeneratedTextsData(prev => {
106199
+ const updated = prev.map(t => t.index === textData.index
106200
+ ? { ...t, text: newValue, failed: false, errorMessage: undefined }
106201
+ : t);
106202
+ setTexts(updated.map(t => t.text));
106203
+ return updated;
106204
+ });
106205
+ }, sx: {
106206
+ '& .MuiInputBase-root': {
106207
+ backgroundColor: (theme) => theme.palette.mode === 'dark'
106208
+ ? 'rgba(244,67,54,0.08)'
106209
+ : 'rgba(244,67,54,0.04)'
106210
+ }
106211
+ } })) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], { label: `Текст ${i + 1}`, variant: "outlined", fullWidth: true, multiline: true, minRows: 3, value: textData.text, onChange: (e) => {
104786
106212
  const newValue = e.target.value;
104787
106213
  setGeneratedTextsData(prev => {
104788
106214
  const updated = prev.map(t => t.index === textData.index ? { ...t, text: newValue } : t);
@@ -104799,7 +106225,7 @@ ${imageData.originalPrompt}
104799
106225
  }))))),
104800
106226
  (landingGenerationLogs.length > 0 || generatingLanding) && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { mb: 2 } },
104801
106227
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["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"),
104802
- landingGenerationLogs.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: {
106228
+ landingGenerationLogs.length > 0 && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: {
104803
106229
  p: 2,
104804
106230
  backgroundColor: (theme) => theme.palette.mode === 'dark'
104805
106231
  ? 'rgba(25, 118, 210, 0.1)'
@@ -104825,8 +106251,8 @@ ${imageData.originalPrompt}
104825
106251
  generatingLanding && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { sx: { display: 'flex', alignItems: 'center', gap: 1, mb: 2 } },
104826
106252
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { size: 20 }),
104827
106253
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { variant: "body2", sx: { color: 'text.secondary' } }, formatElapsedTime(elapsedTime.landing)))),
104828
- !generatingLanding && generatedLandingHTML && generatedLandingImageBlob && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { variant: "outlined", color: "primary", onClick: handlePreviewLanding, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_47__["default"], null), fullWidth: true }, "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"))))))))),
104829
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PromptManagerDialog__WEBPACK_IMPORTED_MODULE_48__["default"], { open: promptManagerOpen, onClose: () => setPromptManagerOpen(false) }))));
106254
+ !generatingLanding && generatedLandingHTML && generatedLandingImageBlob && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_17__["default"], { variant: "outlined", color: "primary", onClick: handlePreviewLanding, startIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_50__["default"], null), fullWidth: true }, "\u041F\u0440\u0435\u0434\u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440 \u043B\u0435\u043D\u0434\u0438\u043D\u0433\u0430"))))))))),
106255
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_PromptManagerDialog__WEBPACK_IMPORTED_MODULE_51__["default"], { open: promptManagerOpen, onClose: () => setPromptManagerOpen(false) }))));
104830
106256
  }
104831
106257
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);
104832
106258
 
@@ -104847,8 +106273,8 @@ __webpack_require__.r(__webpack_exports__);
104847
106273
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/index.js");
104848
106274
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
104849
106275
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Box/Box.js");
104850
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Paper/Paper.js");
104851
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Typography/Typography.js");
106276
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Typography/Typography.js");
106277
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Paper/Paper.js");
104852
106278
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/IconButton/IconButton.js");
104853
106279
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/TextField/TextField.js");
104854
106280
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Stack/Stack.js");
@@ -104863,25 +106289,27 @@ __webpack_require__.r(__webpack_exports__);
104863
106289
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogContent/DialogContent.js");
104864
106290
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tabs/Tabs.js");
104865
106291
  /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tab/Tab.js");
104866
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Checkbox/Checkbox.js");
104867
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Accordion/Accordion.js");
104868
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionSummary/AccordionSummary.js");
104869
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionDetails/AccordionDetails.js");
104870
- /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogActions/DialogActions.js");
104871
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Cancel.js");
104872
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Close.js");
104873
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CompareArrows.js");
104874
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Edit.js");
104875
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
104876
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowDown.js");
104877
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowUp.js");
104878
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/RestartAlt.js");
104879
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Save.js");
104880
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Search.js");
104881
- /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
104882
- /* harmony import */ var _prompts__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./prompts */ "./src/prompts.ts");
104883
- /* harmony import */ var _landingPrompts__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./landingPrompts */ "./src/landingPrompts.ts");
104884
- /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
106292
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Tooltip/Tooltip.js");
106293
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Checkbox/Checkbox.js");
106294
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Accordion/Accordion.js");
106295
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionSummary/AccordionSummary.js");
106296
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/AccordionDetails/AccordionDetails.js");
106297
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/DialogActions/DialogActions.js");
106298
+ /* harmony import */ var _mui_material__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! @mui/material */ "./node_modules/@mui/material/esm/Snackbar/Snackbar.js");
106299
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Cancel.js");
106300
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Close.js");
106301
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/CompareArrows.js");
106302
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Edit.js");
106303
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/ExpandMore.js");
106304
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowDown.js");
106305
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/KeyboardArrowUp.js");
106306
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/RestartAlt.js");
106307
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Save.js");
106308
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Search.js");
106309
+ /* harmony import */ var _mui_icons_material__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! @mui/icons-material */ "./node_modules/@mui/icons-material/esm/Settings.js");
106310
+ /* harmony import */ var _prompts__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./prompts */ "./src/prompts.ts");
106311
+ /* harmony import */ var _landingPrompts__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./landingPrompts */ "./src/landingPrompts.ts");
106312
+ /* harmony import */ var _promptOverrides__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./promptOverrides */ "./src/promptOverrides.ts");
104885
106313
 
104886
106314
 
104887
106315
 
@@ -104892,6 +106320,36 @@ function TabPanel(props) {
104892
106320
  const { children, value, index, ...other } = props;
104893
106321
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { role: "tabpanel", hidden: value !== index, id: `prompt-tabpanel-${index}`, "aria-labelledby": `prompt-tab-${index}`, ...other }, value === index && react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { p: 3 } }, children)));
104894
106322
  }
106323
+ /** Подсказка для кнопки типа товара: списки подходов для текстов и картинок (номера как в таблицах). */
106324
+ function productTypePresetTooltip(label) {
106325
+ const textNums = _promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PRODUCT_TYPE_TEXT_PAIR_PRESETS[label];
106326
+ if (!textNums)
106327
+ return label;
106328
+ const sortedText = [...textNums].sort((a, b) => a - b);
106329
+ const imgPreset = _promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PRODUCT_TYPE_IMAGE_PRESETS[label];
106330
+ const sortedImg = imgPreset ? [...imgPreset].sort((a, b) => a - b) : null;
106331
+ 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' } },
106332
+ 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' } },
106333
+ "\u0422\u0435\u043A\u0441\u0442\u044B \u2014 ",
106334
+ sortedText.length,
106335
+ " \u043F\u0430\u0440:"),
106336
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { component: "ul", sx: { m: 0, pl: 2.25, mb: 1.25, listStyleType: 'disc', color: 'inherit' } }, sortedText.map((n) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { key: `t-${n}`, variant: "caption", component: "li", sx: { display: 'list-item', lineHeight: 1.5, mb: 0.25, color: 'inherit' } },
106337
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("strong", null,
106338
+ n,
106339
+ "."),
106340
+ " ",
106341
+ _prompts__WEBPACK_IMPORTED_MODULE_36__.PAIR_APPROACH_POOL[n - 1]?.name ?? '—')))),
106342
+ 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' } },
106343
+ "\u0418\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F",
106344
+ sortedImg ? ` — ${sortedImg.length} подходов` : '',
106345
+ ":"),
106346
+ sortedImg ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { component: "ul", sx: { m: 0, pl: 2.25, listStyleType: 'disc', color: 'inherit' } }, sortedImg.map((n) => (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { key: `i-${n}`, variant: "caption", component: "li", sx: { display: 'list-item', lineHeight: 1.5, mb: 0.25, color: 'inherit' } },
106347
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("strong", null,
106348
+ n,
106349
+ "."),
106350
+ " ",
106351
+ _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)"))));
106352
+ }
104895
106353
  function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder, helperText, fullWidth = true, multiline = true }) {
104896
106354
  const [searchOpen, setSearchOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
104897
106355
  const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
@@ -104961,7 +106419,7 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
104961
106419
  }
104962
106420
  };
104963
106421
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { position: 'relative' } },
104964
- searchOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { elevation: 3, sx: {
106422
+ searchOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { elevation: 3, sx: {
104965
106423
  position: 'absolute',
104966
106424
  top: 4,
104967
106425
  right: 4,
@@ -104975,7 +106433,7 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
104975
106433
  border: '1px solid',
104976
106434
  borderColor: 'divider',
104977
106435
  } },
104978
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_32__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
106436
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
104979
106437
  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: {
104980
106438
  border: 'none',
104981
106439
  outline: 'none',
@@ -104986,13 +106444,13 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
104986
106444
  color: 'inherit',
104987
106445
  fontFamily: 'inherit',
104988
106446
  }, autoFocus: true }),
104989
- searchQuery && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "caption", sx: { color: 'text.secondary', whiteSpace: 'nowrap', minWidth: 50, textAlign: 'center' } }, matches.length > 0 ? `${currentMatch + 1} / ${matches.length}` : 'нет')),
106447
+ 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}` : 'нет')),
104990
106448
  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 } },
104991
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_29__["default"], { sx: { fontSize: 18 } })),
106449
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: { fontSize: 18 } })),
104992
106450
  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 } },
104993
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_28__["default"], { sx: { fontSize: 18 } })),
106451
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: { fontSize: 18 } })),
104994
106452
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(false); setSearchQuery(''); }, sx: { p: 0.3 } },
104995
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_24__["default"], { sx: { fontSize: 18 } })))),
106453
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_26__["default"], { sx: { fontSize: 18 } })))),
104996
106454
  !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: {
104997
106455
  position: 'absolute',
104998
106456
  top: 8,
@@ -105003,7 +106461,7 @@ function SearchableTextField({ value, onChange, disabled, rows = 15, placeholder
105003
106461
  bgcolor: 'background.paper',
105004
106462
  boxShadow: 1,
105005
106463
  } },
105006
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_32__["default"], { sx: { fontSize: 16 } }))),
106464
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 16 } }))),
105007
106465
  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: {
105008
106466
  '& .MuiInputBase-input': {
105009
106467
  fontFamily: '"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace',
@@ -105151,7 +106609,7 @@ function DiffViewer({ oldText, newText }) {
105151
106609
  }
105152
106610
  };
105153
106611
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { position: 'relative' } },
105154
- searchOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { elevation: 3, sx: {
106612
+ searchOpen && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { elevation: 3, sx: {
105155
106613
  position: 'absolute',
105156
106614
  top: 4,
105157
106615
  right: 4,
@@ -105165,7 +106623,7 @@ function DiffViewer({ oldText, newText }) {
105165
106623
  border: '1px solid',
105166
106624
  borderColor: 'divider',
105167
106625
  } },
105168
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_32__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
106626
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 18, color: 'text.secondary' } }),
105169
106627
  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: {
105170
106628
  border: 'none',
105171
106629
  outline: 'none',
@@ -105176,13 +106634,13 @@ function DiffViewer({ oldText, newText }) {
105176
106634
  color: 'inherit',
105177
106635
  fontFamily: 'inherit',
105178
106636
  }, autoFocus: true }),
105179
- searchQuery && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "caption", sx: { color: 'text.secondary', whiteSpace: 'nowrap', minWidth: 50, textAlign: 'center' } }, totalMatches > 0 ? `${currentMatch + 1} / ${totalMatches}` : 'нет')),
106637
+ 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}` : 'нет')),
105180
106638
  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 } },
105181
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_29__["default"], { sx: { fontSize: 18 } })),
106639
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_31__["default"], { sx: { fontSize: 18 } })),
105182
106640
  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 } },
105183
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_28__["default"], { sx: { fontSize: 18 } })),
106641
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_30__["default"], { sx: { fontSize: 18 } })),
105184
106642
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_4__["default"], { size: "small", onClick: () => { setSearchOpen(false); setSearchQuery(''); }, sx: { p: 0.3 } },
105185
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_24__["default"], { sx: { fontSize: 18 } })))),
106643
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_26__["default"], { sx: { fontSize: 18 } })))),
105186
106644
  !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: {
105187
106645
  position: 'absolute',
105188
106646
  top: 28,
@@ -105193,11 +106651,11 @@ function DiffViewer({ oldText, newText }) {
105193
106651
  bgcolor: 'background.paper',
105194
106652
  boxShadow: 1,
105195
106653
  } },
105196
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_32__["default"], { sx: { fontSize: 16 } }))),
106654
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_34__["default"], { sx: { fontSize: 16 } }))),
105197
106655
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 1, sx: { mb: 1 }, alignItems: "center" },
105198
106656
  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' } }),
105199
106657
  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' } })),
105200
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { ref: tableRef, variant: "outlined", sx: {
106658
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { ref: tableRef, variant: "outlined", sx: {
105201
106659
  overflow: 'auto',
105202
106660
  maxHeight: 500,
105203
106661
  fontFamily: '"SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace',
@@ -105262,20 +106720,33 @@ function PromptManagerDialog({ open, onClose }) {
105262
106720
  // selectedApproaches: array of indices from PAIR_APPROACH_POOL, ordered
105263
106721
  const [selectedApproaches, setSelectedApproaches] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([0, 1, 2]);
105264
106722
  // imageApproachCounts: по одному на каждый подход (CREO_APPROACHES), каждый 0–4
105265
- const [imageApproachCounts, setImageApproachCounts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => Array(_prompts__WEBPACK_IMPORTED_MODULE_34__.CREO_APPROACHES.length).fill(1));
106723
+ const [imageApproachCounts, setImageApproachCounts] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => Array(_prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.length).fill(1));
106724
+ const [creoToastOpen, setCreoToastOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
106725
+ const [creoToastMessage, setCreoToastMessage] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)('');
106726
+ const creoToastDebounceRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
105266
106727
  // Загрузить оверрайды при открытии
105267
106728
  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
105268
106729
  if (open) {
105269
- const loaded = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_36__.loadPromptOverrides)();
106730
+ const loaded = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.loadPromptOverrides)();
105270
106731
  setOverrides(loaded);
105271
- setSelectedApproaches((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_36__.getSelectedPairApproaches)());
105272
- setImageApproachCounts((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_36__.getImageApproachCounts)());
106732
+ setSelectedApproaches((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.getSelectedPairApproaches)());
106733
+ setImageApproachCounts((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.getImageApproachCounts)());
105273
106734
  setHasChanges(false);
105274
106735
  }
105275
106736
  }, [open]);
105276
106737
  const handleTabChange = (_event, newValue) => {
105277
106738
  setTabValue(newValue);
105278
106739
  };
106740
+ const showCreoTotalToast = (pairsCount, imageCount) => {
106741
+ const imageAspectRatio = localStorage.getItem('imageAspectRatio') || '1:1';
106742
+ const bothMultiplier = imageAspectRatio === 'both' ? 2 : 1;
106743
+ const total = pairsCount * imageCount * bothMultiplier;
106744
+ const formula = bothMultiplier === 2
106745
+ ? `${pairsCount} × ${imageCount} × 2 = ${total}`
106746
+ : `${pairsCount} × ${imageCount} = ${total}`;
106747
+ setCreoToastMessage(`Всего креативов: ${formula}`);
106748
+ setCreoToastOpen(true);
106749
+ };
105279
106750
  const handlePairApproachToggle = (idx) => {
105280
106751
  setSelectedApproaches(prev => {
105281
106752
  let next;
@@ -105286,11 +106757,13 @@ function PromptManagerDialog({ open, onClose }) {
105286
106757
  next = prev.filter(i => i !== idx);
105287
106758
  }
105288
106759
  else {
105289
- // Select — keep sorted by index
106760
+ // Select — сортировка по индексу подхода (порядок пар задаёт промпт по номерам 1…N)
105290
106761
  next = [...prev, idx].sort((a, b) => a - b);
105291
106762
  }
105292
106763
  setOverrides(o => ({ ...o, selectedPairApproaches: next }));
105293
106764
  setHasChanges(true);
106765
+ const imageCount = imageApproachCounts.reduce((a, b) => a + b, 0);
106766
+ setTimeout(() => showCreoTotalToast(next.length, imageCount), 0);
105294
106767
  return next;
105295
106768
  });
105296
106769
  };
@@ -105302,9 +106775,27 @@ function PromptManagerDialog({ open, onClose }) {
105302
106775
  next[idx] = clamped;
105303
106776
  setOverrides(o => ({ ...o, imageApproachCounts: next }));
105304
106777
  setHasChanges(true);
106778
+ // Debounced toast — показываем через 500ms после последнего изменения (стрелки/ввод)
106779
+ if (creoToastDebounceRef.current)
106780
+ clearTimeout(creoToastDebounceRef.current);
106781
+ creoToastDebounceRef.current = setTimeout(() => {
106782
+ creoToastDebounceRef.current = null;
106783
+ const pairsCount = selectedApproaches.length;
106784
+ const imageCount = next.reduce((a, b) => a + b, 0);
106785
+ showCreoTotalToast(pairsCount, imageCount);
106786
+ }, 500);
105305
106787
  return next;
105306
106788
  });
105307
106789
  };
106790
+ const handleImageCountBlur = () => {
106791
+ if (creoToastDebounceRef.current) {
106792
+ clearTimeout(creoToastDebounceRef.current);
106793
+ creoToastDebounceRef.current = null;
106794
+ }
106795
+ const pairsCount = selectedApproaches.length;
106796
+ const imageCount = imageApproachCounts.reduce((a, b) => a + b, 0);
106797
+ showCreoTotalToast(pairsCount, imageCount);
106798
+ };
105308
106799
  const handleToggleOverride = (promptName, enabled) => {
105309
106800
  setOverrides(prev => {
105310
106801
  const prevOverride = prev[promptName];
@@ -105355,14 +106846,15 @@ function PromptManagerDialog({ open, onClose }) {
105355
106846
  else {
105356
106847
  console.log(debugMsg, overrides);
105357
106848
  }
105358
- (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_36__.savePromptOverrides)(overrides);
106849
+ (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.savePromptOverrides)(overrides);
106850
+ window.dispatchEvent(new Event(_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PROMPT_OVERRIDES_SAVED_EVENT));
105359
106851
  setHasChanges(false);
105360
106852
  onClose();
105361
106853
  };
105362
106854
  const handleCancel = () => {
105363
106855
  if (hasChanges) {
105364
106856
  if (window.confirm('Есть несохраненные изменения. Закрыть без сохранения?')) {
105365
- setOverrides((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_36__.loadPromptOverrides)());
106857
+ setOverrides((0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.loadPromptOverrides)());
105366
106858
  setHasChanges(false);
105367
106859
  onClose();
105368
106860
  }
@@ -105376,25 +106868,25 @@ function PromptManagerDialog({ open, onClose }) {
105376
106868
  const getOriginalPrompt = (promptName) => {
105377
106869
  switch (promptName) {
105378
106870
  case 'getPairsSystemPrompt':
105379
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_34__.getPairsSystemPrompt)('${geo}', true, selectedApproaches.length, selectedApproaches);
106871
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getPairsSystemPrompt)('${geo}', true, selectedApproaches.length, selectedApproaches);
105380
106872
  case 'getPairsUserPrompt':
105381
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_34__.getPairsUserPrompt)('${product}', '${geo}', '${additionalInfo}', true, selectedApproaches.length, selectedApproaches);
106873
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getPairsUserPrompt)('${product}', '${geo}', '${additionalInfo}', true, selectedApproaches.length, selectedApproaches);
105382
106874
  case 'getTitlesSystemPrompt':
105383
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_34__.getTitlesSystemPrompt)('${geo}', true, selectedApproaches.length);
106875
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getTitlesSystemPrompt)('${geo}', true, selectedApproaches.length);
105384
106876
  case 'getTextsSystemPrompt':
105385
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_34__.getTextsSystemPrompt)('${geo}', true, selectedApproaches.length);
106877
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getTextsSystemPrompt)('${geo}', true, selectedApproaches.length);
105386
106878
  case 'getUserPrompt':
105387
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_34__.getUserPrompt)('${product}', '${geo}', '${additionalInfo}', 'titles', true, selectedApproaches.length);
106879
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getUserPrompt)('${product}', '${geo}', '${additionalInfo}', 'titles', true, selectedApproaches.length);
105388
106880
  case 'getImageCheckPrompt':
105389
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_34__.getImageCheckPrompt)('${product}', '${geo}', true);
106881
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getImageCheckPrompt)('${product}', '${geo}', true);
105390
106882
  case 'getValidationPrompt':
105391
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_34__.getValidationPrompt)('${product}', '${geo}', ['keyword1', 'keyword2'], '${approachName}', true);
106883
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getValidationPrompt)('${product}', '${geo}', ['keyword1', 'keyword2'], '${approachName}', true);
105392
106884
  case 'getImageGenerationBasePrompt':
105393
- return (0,_prompts__WEBPACK_IMPORTED_MODULE_34__.getImageGenerationBasePrompt)('${generateGeo}', '${generatePrice}', '${generateCurrency}', true);
106885
+ return (0,_prompts__WEBPACK_IMPORTED_MODULE_36__.getImageGenerationBasePrompt)('${generateGeo}', '${generatePrice}', '${generateCurrency}', true);
105394
106886
  case 'getLandingPageSystemPrompt':
105395
- return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_35__.getLandingPageSystemPrompt)(true);
106887
+ return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_37__.getLandingPageSystemPrompt)(true);
105396
106888
  case 'getLandingPageUserPrompt':
105397
- return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_35__.getLandingPageUserPrompt)('${product}', '${geo}', true);
106889
+ return (0,_landingPrompts__WEBPACK_IMPORTED_MODULE_37__.getLandingPageUserPrompt)('${product}', '${geo}', true);
105398
106890
  default:
105399
106891
  return '';
105400
106892
  }
@@ -105416,18 +106908,18 @@ function PromptManagerDialog({ open, onClose }) {
105416
106908
  enabled && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
105417
106909
  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 })) },
105418
106910
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "edit" },
105419
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_26__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
106911
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_28__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
105420
106912
  " \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440"),
105421
106913
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "diff" },
105422
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_25__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
106914
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_27__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
105423
106915
  " Diff")),
105424
- 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_30__["default"], null), onClick: () => handleResetPrompt(promptName) }, "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C")))),
105425
- description && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, description)),
106916
+ 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")))),
106917
+ description && (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "body2", color: "text.secondary", sx: { mb: 1 } }, description)),
105426
106918
  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 }))));
105427
106919
  };
105428
106920
  // Управление подходами для изображений
105429
106921
  const handleApproachToggle = (approachName, enabled) => {
105430
- const originalApproach = _prompts__WEBPACK_IMPORTED_MODULE_34__.CREO_APPROACHES.find(a => a.name === approachName);
106922
+ const originalApproach = _prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.find(a => a.name === approachName);
105431
106923
  if (!originalApproach)
105432
106924
  return;
105433
106925
  setOverrides(prev => {
@@ -105477,8 +106969,8 @@ function PromptManagerDialog({ open, onClose }) {
105477
106969
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_13__["default"], { open: open, onClose: handleCancel, maxWidth: "lg", fullWidth: true },
105478
106970
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_14__["default"], null,
105479
106971
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center" },
105480
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_33__["default"], null),
105481
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "h6" }, "\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0440\u043E\u043C\u043F\u0442\u0430\u043C\u0438"),
106972
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_35__["default"], null),
106973
+ 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"),
105482
106974
  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" })))),
105483
106975
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_15__["default"], null,
105484
106976
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_16__["default"], { value: tabValue, onChange: handleTabChange, sx: { borderBottom: 1, borderColor: 'divider' } },
@@ -105489,9 +106981,41 @@ function PromptManagerDialog({ open, onClose }) {
105489
106981
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabPanel, { value: tabValue, index: 0 },
105490
106982
  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 } },
105491
106983
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 1.5 } },
105492
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "subtitle1", sx: { fontWeight: 600 } }, "\u041F\u043E\u0434\u0445\u043E\u0434\u044B \u0434\u043B\u044F \u0442\u0435\u043A\u0441\u0442\u043E\u0432 (\u043F\u0430\u0440\u044B \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A + \u0442\u0435\u043A\u0441\u0442)"),
106984
+ 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 \u0442\u0435\u043A\u0441\u0442\u043E\u0432 (\u043F\u0430\u0440\u044B \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A + \u0442\u0435\u043A\u0441\u0442)"),
105493
106985
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: `Выбрано: ${selectedApproaches.length}`, color: "primary", size: "small" }),
105494
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "caption", color: "text.secondary" }, "(\u043C\u0438\u043D\u0438\u043C\u0443\u043C 2, \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C 10)")),
106986
+ 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)")),
106987
+ 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):"),
106988
+ 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: {
106989
+ tooltip: {
106990
+ sx: {
106991
+ maxWidth: 420,
106992
+ bgcolor: 'grey.900',
106993
+ color: 'common.white',
106994
+ border: '1px solid',
106995
+ borderColor: 'grey.700',
106996
+ '& .MuiTooltip-arrow': { color: 'grey.900' },
106997
+ },
106998
+ },
106999
+ } },
107000
+ 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: () => {
107001
+ const next = (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.productPresetNumbersToIndices)(nums);
107002
+ if (next.length < 2)
107003
+ return;
107004
+ const imgNums = _promptOverrides__WEBPACK_IMPORTED_MODULE_38__.PRODUCT_TYPE_IMAGE_PRESETS[label];
107005
+ const nextImageCounts = imgNums
107006
+ ? (0,_promptOverrides__WEBPACK_IMPORTED_MODULE_38__.productPresetNumbersToImageCounts)(imgNums)
107007
+ : Array(_prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.length).fill(1);
107008
+ setSelectedApproaches(next);
107009
+ setImageApproachCounts(nextImageCounts);
107010
+ setOverrides(o => ({
107011
+ ...o,
107012
+ selectedPairApproaches: next,
107013
+ imageApproachCounts: nextImageCounts,
107014
+ }));
107015
+ setHasChanges(true);
107016
+ const imageCount = nextImageCounts.reduce((a, b) => a + b, 0);
107017
+ setTimeout(() => showCreoTotalToast(next.length, imageCount), 0);
107018
+ } }, label))))),
105495
107019
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { overflowX: 'auto' } },
105496
107020
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("table", { style: { width: '100%', borderCollapse: 'collapse', fontSize: 12 } },
105497
107021
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("thead", null,
@@ -105500,7 +107024,7 @@ function PromptManagerDialog({ open, onClose }) {
105500
107024
  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"),
105501
107025
  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"),
105502
107026
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("th", { style: { textAlign: 'left', padding: '4px 8px', borderBottom: '1px solid #ccc' } }, "\u0422\u0435\u043A\u0441\u0442"))),
105503
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_34__.PAIR_APPROACH_POOL.map((p, i) => {
107027
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_36__.PAIR_APPROACH_POOL.map((p, i) => {
105504
107028
  const checked = selectedApproaches.includes(i);
105505
107029
  const isLast = checked && selectedApproaches.length <= 2;
105506
107030
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", { key: i, onClick: () => handlePairApproachToggle(i), style: {
@@ -105512,16 +107036,16 @@ function PromptManagerDialog({ open, onClose }) {
105512
107036
  transition: 'opacity 0.15s, background-color 0.15s',
105513
107037
  } },
105514
107038
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { textAlign: 'center', padding: '2px 8px' } },
105515
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_18__["default"], { checked: checked, disabled: isLast, size: "small", onClick: e => e.stopPropagation(), onChange: () => handlePairApproachToggle(i), sx: { p: 0.5 } })),
107039
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { checked: checked, disabled: isLast, size: "small", onClick: e => e.stopPropagation(), onChange: () => handlePairApproachToggle(i), sx: { p: 0.5 } })),
105516
107040
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', fontWeight: 500, whiteSpace: 'nowrap' } }, p.name),
105517
107041
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', color: '#777' } }, p.titleApproach),
105518
107042
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', color: '#777' } }, p.textApproach.split('\n')[0])));
105519
107043
  }))))),
105520
107044
  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 } },
105521
107045
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 1.5 } },
105522
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["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"),
107046
+ 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"),
105523
107047
  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" }),
105524
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "caption", color: "text.secondary" }, "(0\u20134 \u043D\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 \u043F\u043E\u0434\u0445\u043E\u0434)")),
107048
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "caption", color: "text.secondary" }, "(0\u20134 \u043D\u0430 \u043A\u0430\u0436\u0434\u044B\u0439 \u043F\u043E\u0434\u0445\u043E\u0434)")),
105525
107049
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { overflowX: 'auto' } },
105526
107050
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("table", { style: { width: '100%', borderCollapse: 'collapse', fontSize: 12 } },
105527
107051
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("thead", null,
@@ -105529,14 +107053,14 @@ function PromptManagerDialog({ open, onClose }) {
105529
107053
  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"),
105530
107054
  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"),
105531
107055
  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"))),
105532
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_34__.CREO_APPROACHES.map((approach, i) => {
107056
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tbody", null, _prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.map((approach, i) => {
105533
107057
  const count = imageApproachCounts[i] ?? 0;
105534
107058
  return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement("tr", { key: i, style: { opacity: count > 0 ? 1 : 0.6 } },
105535
107059
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { textAlign: 'center', padding: '2px 8px', verticalAlign: 'middle' } },
105536
107060
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_5__["default"], { type: "number", size: "small", value: count, onChange: (e) => {
105537
107061
  const v = parseInt(e.target.value, 10);
105538
107062
  handleImageApproachCountChange(i, isNaN(v) ? 0 : v);
105539
- }, inputProps: { min: 0, max: 4, step: 1 }, sx: { width: 56, '& .MuiInputBase-input': { textAlign: 'center', py: 0.5 } } })),
107063
+ }, onBlur: handleImageCountBlur, inputProps: { min: 0, max: 4, step: 1 }, sx: { width: 56, '& .MuiInputBase-input': { textAlign: 'center', py: 0.5 } } })),
105540
107064
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', fontWeight: 500, whiteSpace: 'nowrap' } }, approach.name),
105541
107065
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement("td", { style: { padding: '4px 8px', color: '#777' } }, approach.prompt.split('\n')[0])));
105542
107066
  }))))),
@@ -105544,46 +107068,46 @@ function PromptManagerDialog({ open, onClose }) {
105544
107068
  renderPromptEditor('getPairsUserPrompt', 'Пользовательский промпт (пары)', 'Пользовательский промпт для генерации пар. Переменные: ${product}, ${geo}, ${additionalInfo}, ${count}, ${n}')),
105545
107069
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabPanel, { value: tabValue, index: 1 },
105546
107070
  renderPromptEditor('getImageGenerationBasePrompt', 'Базовый промпт для изображений', 'Базовый промпт, используемый для всех подходов'),
105547
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["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"),
105548
- _prompts__WEBPACK_IMPORTED_MODULE_34__.CREO_APPROACHES.map((approach) => {
107071
+ 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"),
107072
+ _prompts__WEBPACK_IMPORTED_MODULE_36__.CREO_APPROACHES.map((approach) => {
105549
107073
  const override = overrides.creoApproaches?.[approach.name];
105550
107074
  const enabled = override?.enabled || false;
105551
107075
  const approachViewKey = `approach_${approach.name}`;
105552
107076
  const approachViewMode = viewModes[approachViewKey] || 'edit';
105553
- return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_19__["default"], { key: approach.name, sx: { mb: 2 } },
105554
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { expandIcon: react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_27__["default"], null) },
107077
+ return (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_20__["default"], { key: approach.name, sx: { mb: 2 } },
107078
+ 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) },
105555
107079
  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 } },
105556
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "subtitle1" }, approach.name),
107080
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle1" }, approach.name),
105557
107081
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_7__["default"], { label: enabled ? 'Кастомный' : 'Оригинал', color: enabled ? 'primary' : 'default', size: "small" }),
105558
- 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_30__["default"], null), onClick: (e) => {
107082
+ 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) => {
105559
107083
  e.stopPropagation();
105560
107084
  handleResetApproach(approach.name);
105561
107085
  } }, "\u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C")))),
105562
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_21__["default"], null,
107086
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], null,
105563
107087
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_6__["default"], { direction: "row", spacing: 2, alignItems: "center", sx: { mb: 2 } },
105564
107088
  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" }),
105565
107089
  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 })) },
105566
107090
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "edit" },
105567
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_26__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
107091
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_28__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
105568
107092
  " \u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440"),
105569
107093
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_11__["default"], { value: "diff" },
105570
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_25__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
107094
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_icons_material__WEBPACK_IMPORTED_MODULE_27__["default"], { sx: { fontSize: 16, mr: 0.5 } }),
105571
107095
  " Diff")))),
105572
107096
  enabled && approachViewMode === 'diff' ? (react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], null,
105573
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "subtitle2", sx: { mb: 1 } }, "\u041F\u0440\u043E\u043C\u043F\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u0430"),
107097
+ 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"),
105574
107098
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DiffViewer, { oldText: approach.prompt, newText: override?.customPrompt || approach.prompt }),
105575
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "subtitle2", sx: { mt: 2, mb: 1 } }, "\u0423\u0433\u043E\u043B \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430"),
107099
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle2", sx: { mt: 2, mb: 1 } }, "\u0423\u0433\u043E\u043B \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430"),
105576
107100
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DiffViewer, { oldText: approach.headlineAngle, newText: override?.customHeadlineAngle || approach.headlineAngle }),
105577
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "subtitle2", sx: { mt: 2, mb: 1 } }, "\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u0431\u0443\u043B\u043B\u0435\u0442\u0430\u0445"),
107101
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle2", sx: { mt: 2, mb: 1 } }, "\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u0431\u0443\u043B\u043B\u0435\u0442\u0430\u0445"),
105578
107102
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(DiffViewer, { oldText: approach.bulletsFocus, newText: override?.customBulletsFocus || approach.bulletsFocus }))) : (react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null,
105579
107103
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { mb: 2 } },
105580
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "subtitle2", gutterBottom: true }, "\u041F\u0440\u043E\u043C\u043F\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u0430"),
107104
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle2", gutterBottom: true }, "\u041F\u0440\u043E\u043C\u043F\u0442 \u043F\u043E\u0434\u0445\u043E\u0434\u0430"),
105581
107105
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SearchableTextField, { rows: 4, value: override?.customPrompt || approach.prompt, onChange: (e) => handleApproachFieldChange(approach.name, 'customPrompt', e.target.value), disabled: !enabled })),
105582
107106
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], { sx: { mb: 2 } },
105583
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "subtitle2", gutterBottom: true }, "\u0423\u0433\u043E\u043B \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430"),
107107
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle2", gutterBottom: true }, "\u0423\u0433\u043E\u043B \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430"),
105584
107108
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SearchableTextField, { rows: 2, value: override?.customHeadlineAngle || approach.headlineAngle, onChange: (e) => handleApproachFieldChange(approach.name, 'customHeadlineAngle', e.target.value), disabled: !enabled })),
105585
107109
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_1__["default"], null,
105586
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_3__["default"], { variant: "subtitle2", gutterBottom: true }, "\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u0431\u0443\u043B\u043B\u0435\u0442\u0430\u0445"),
107110
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_2__["default"], { variant: "subtitle2", gutterBottom: true }, "\u0424\u043E\u043A\u0443\u0441 \u043D\u0430 \u0431\u0443\u043B\u043B\u0435\u0442\u0430\u0445"),
105587
107111
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SearchableTextField, { rows: 2, value: override?.customBulletsFocus || approach.bulletsFocus, onChange: (e) => handleApproachFieldChange(approach.name, 'customBulletsFocus', e.target.value), disabled: !enabled })))))));
105588
107112
  })),
105589
107113
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabPanel, { value: tabValue, index: 2 },
@@ -105592,9 +107116,10 @@ function PromptManagerDialog({ open, onClose }) {
105592
107116
  react__WEBPACK_IMPORTED_MODULE_0___default().createElement(TabPanel, { value: tabValue, index: 3 },
105593
107117
  renderPromptEditor('getLandingPageSystemPrompt', 'Промпт лендинга (System)', 'Системный промпт для генерации лендинг-страниц'),
105594
107118
  renderPromptEditor('getLandingPageUserPrompt', 'Промпт лендинга (User)', 'Пользовательский промпт для генерации лендинг-страниц'))),
105595
- react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_22__["default"], null,
105596
- 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_23__["default"], null) }, "\u041E\u0442\u043C\u0435\u043D\u0430"),
105597
- 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_31__["default"], null), disabled: !hasChanges }, "\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C"))));
107119
+ react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_mui_material__WEBPACK_IMPORTED_MODULE_23__["default"], null,
107120
+ 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"),
107121
+ 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")),
107122
+ 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' } })));
105598
107123
  }
105599
107124
 
105600
107125
 
@@ -105813,6 +107338,9 @@ const MODELS = {
105813
107338
  "use strict";
105814
107339
  __webpack_require__.r(__webpack_exports__);
105815
107340
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
107341
+ /* harmony export */ PRODUCT_TYPE_IMAGE_PRESETS: () => (/* binding */ PRODUCT_TYPE_IMAGE_PRESETS),
107342
+ /* harmony export */ PRODUCT_TYPE_TEXT_PAIR_PRESETS: () => (/* binding */ PRODUCT_TYPE_TEXT_PAIR_PRESETS),
107343
+ /* harmony export */ PROMPT_OVERRIDES_SAVED_EVENT: () => (/* binding */ PROMPT_OVERRIDES_SAVED_EVENT),
105816
107344
  /* harmony export */ getCreoApproachOverride: () => (/* binding */ getCreoApproachOverride),
105817
107345
  /* harmony export */ getImageApproachCounts: () => (/* binding */ getImageApproachCounts),
105818
107346
  /* harmony export */ getPairsCount: () => (/* binding */ getPairsCount),
@@ -105820,6 +107348,11 @@ __webpack_require__.r(__webpack_exports__);
105820
107348
  /* harmony export */ getSelectedPairApproaches: () => (/* binding */ getSelectedPairApproaches),
105821
107349
  /* harmony export */ loadOverridesFromElectron: () => (/* binding */ loadOverridesFromElectron),
105822
107350
  /* harmony export */ loadPromptOverrides: () => (/* binding */ loadPromptOverrides),
107351
+ /* harmony export */ mergePromptApproachesFromDriveFile: () => (/* binding */ mergePromptApproachesFromDriveFile),
107352
+ /* harmony export */ normalizeImageApproachCountsFromDrive: () => (/* binding */ normalizeImageApproachCountsFromDrive),
107353
+ /* harmony export */ normalizeSelectedPairApproachesFromDrive: () => (/* binding */ normalizeSelectedPairApproachesFromDrive),
107354
+ /* harmony export */ productPresetNumbersToImageCounts: () => (/* binding */ productPresetNumbersToImageCounts),
107355
+ /* harmony export */ productPresetNumbersToIndices: () => (/* binding */ productPresetNumbersToIndices),
105823
107356
  /* harmony export */ resetAllOverrides: () => (/* binding */ resetAllOverrides),
105824
107357
  /* harmony export */ resetCreoApproachOverride: () => (/* binding */ resetCreoApproachOverride),
105825
107358
  /* harmony export */ resetPromptOverride: () => (/* binding */ resetPromptOverride),
@@ -105831,6 +107364,50 @@ __webpack_require__.r(__webpack_exports__);
105831
107364
  * Утилиты для работы с оверрайдами промптов
105832
107365
  */
105833
107366
  const STORAGE_KEY = 'promptOverrides';
107367
+ /** Номера 1–10 = строка в таблице подходов (PAIR_APPROACH_POOL[i] → номер i + 1). Порядок в массиве не важен — при применении сортируется по номеру строки. */
107368
+ const PRODUCT_TYPE_TEXT_PAIR_PRESETS = {
107369
+ похудалки: [1, 2, 3, 6, 10],
107370
+ простатит: [1, 6, 8, 10, 7],
107371
+ потенция: [6, 10, 8, 7, 1],
107372
+ диабет: [8, 1, 7, 6, 10],
107373
+ паразиты: [6, 1, 8, 5, 7],
107374
+ суставы: [1, 3, 8, 2, 7],
107375
+ };
107376
+ /** Номера 1–10 = строка в таблице подходов к изображениям (CREO_APPROACHES[i] → номер i + 1). Порядок в массиве не важен. */
107377
+ const PRODUCT_TYPE_IMAGE_PRESETS = {
107378
+ похудалки: [2, 3, 6, 8, 10],
107379
+ простатит: [1, 4, 5, 6, 7, 8, 9],
107380
+ потенция: [1, 4, 5, 6, 7, 8, 9],
107381
+ диабет: [1, 4, 6, 9],
107382
+ паразиты: [4, 5, 7, 8],
107383
+ суставы: [3, 4, 5, 6, 9],
107384
+ };
107385
+ /** Индексы PAIR_APPROACH_POOL (0-based), по возрастанию. */
107386
+ function productPresetNumbersToIndices(oneBased) {
107387
+ const poolLen = 10;
107388
+ const seen = new Set();
107389
+ for (const n of oneBased) {
107390
+ const i = n - 1;
107391
+ if (i >= 0 && i < poolLen)
107392
+ seen.add(i);
107393
+ }
107394
+ return [...seen].sort((a, b) => a - b);
107395
+ }
107396
+ /**
107397
+ * Пресет типа товара → массив длиной IMAGE_APPROACH_COUNT: у выбранных подходов кол-во 1, у остальных 0.
107398
+ */
107399
+ function productPresetNumbersToImageCounts(oneBased) {
107400
+ const counts = Array(IMAGE_APPROACH_COUNT).fill(0);
107401
+ const seen = new Set();
107402
+ for (const n of oneBased) {
107403
+ const i = n - 1;
107404
+ if (i >= 0 && i < IMAGE_APPROACH_COUNT && !seen.has(i)) {
107405
+ seen.add(i);
107406
+ counts[i] = 1;
107407
+ }
107408
+ }
107409
+ return counts;
107410
+ }
105834
107411
  // Debug logging — пишет в терминал Electron (или в console как fallback)
105835
107412
  function _debugLog(...args) {
105836
107413
  const api = typeof window !== 'undefined' ? window.electronAPI : null;
@@ -105864,6 +107441,34 @@ function getPairsCount() {
105864
107441
  }
105865
107442
  /** Количество подходов для изображений. Должно совпадать с CREO_APPROACHES.length в prompts.ts */
105866
107443
  const IMAGE_APPROACH_COUNT = 10;
107444
+ const PAIR_APPROACH_POOL_LEN = 10;
107445
+ /** Нормализация индексов пар из JSON с диска (0-based, уникальные, отсортированные, минимум 2). */
107446
+ function normalizeSelectedPairApproachesFromDrive(raw) {
107447
+ if (!Array.isArray(raw))
107448
+ return null;
107449
+ const seen = new Set();
107450
+ for (const x of raw) {
107451
+ const n = typeof x === 'number' && Number.isInteger(x) ? x : parseInt(String(x), 10);
107452
+ if (Number.isInteger(n) && n >= 0 && n < PAIR_APPROACH_POOL_LEN)
107453
+ seen.add(n);
107454
+ }
107455
+ const out = [...seen].sort((a, b) => a - b);
107456
+ return out.length >= 2 ? out : null;
107457
+ }
107458
+ /** Нормализация количеств крео из JSON с диска (длина 10, 0–4; хотя бы один подход > 0). */
107459
+ function normalizeImageApproachCountsFromDrive(raw) {
107460
+ if (!Array.isArray(raw))
107461
+ return null;
107462
+ const out = [];
107463
+ for (let i = 0; i < IMAGE_APPROACH_COUNT; i++) {
107464
+ const v = raw[i];
107465
+ const n = typeof v === 'number' && Number.isFinite(v) ? v : parseInt(String(v), 10);
107466
+ out.push(Number.isFinite(n) ? Math.max(0, Math.min(4, Math.round(n))) : 0);
107467
+ }
107468
+ if (out.every(c => c === 0))
107469
+ return null;
107470
+ return out;
107471
+ }
105867
107472
  /**
105868
107473
  * Получить количество изображений по каждому подходу (N элементов, 0–4).
105869
107474
  * По умолчанию — по 1 на каждый подход.
@@ -105929,6 +107534,32 @@ function savePromptOverrides(overrides) {
105929
107534
  console.error('Failed to save prompt overrides:', err);
105930
107535
  }
105931
107536
  }
107537
+ /** Имя события после сохранения подходов в менеджере промптов — чтобы синхронизировать JSON на Drive. */
107538
+ const PROMPT_OVERRIDES_SAVED_EVENT = 'docs-combiner-prompt-overrides-saved';
107539
+ /**
107540
+ * Подмешать в localStorage выбранные подходы из project-settings.json на Drive (если поля валидны).
107541
+ */
107542
+ function mergePromptApproachesFromDriveFile(loadedData) {
107543
+ const pairs = normalizeSelectedPairApproachesFromDrive(loadedData.selectedPairApproaches);
107544
+ const counts = normalizeImageApproachCountsFromDrive(loadedData.imageApproachCounts);
107545
+ if (!pairs && !counts)
107546
+ return false;
107547
+ const overrides = loadPromptOverrides();
107548
+ let dirty = false;
107549
+ if (pairs) {
107550
+ overrides.selectedPairApproaches = pairs;
107551
+ dirty = true;
107552
+ }
107553
+ if (counts) {
107554
+ overrides.imageApproachCounts = counts;
107555
+ dirty = true;
107556
+ }
107557
+ if (dirty) {
107558
+ savePromptOverrides(overrides);
107559
+ return true;
107560
+ }
107561
+ return false;
107562
+ }
105932
107563
  /**
105933
107564
  * Получить оверрайд для простого промпта
105934
107565
  */
@@ -106123,58 +107754,57 @@ function _debugLog(...args) {
106123
107754
  const PAIR_APPROACH_POOL = [
106124
107755
  {
106125
107756
  name: 'болевая точка',
106126
- titleApproach: 'прямой удар по симптому — только боль/дискомфорт, без решения в заголовке',
106127
- textApproach: 'Начни с прямого называния симптома или дискомфорта без вопроса, просто факт боли (например: «Боль не даёт нормально двигаться», «Дискомфорт с утра до вечера» адаптируй под категорию продукта). Покажи, как продукт точечно устраняет именно этот симптом. Конкретика, без общих обещаний.',
107757
+ titleApproach: 'одна ясная боль (не две проблемы в одном заголовке). Усиливай через несправедливость / ощущение «так несправедливо» (устал бороться, снова срыв, тело не слушается) не только сухое перечисление симптомов. ЗАГОЛОВОК = КОНСТАТАЦИЯ, не вопрос: ЗАПРЕЩЕНО заканчивать на «почему?», «perché?», «why?» и подобное — боль называешь фактом, не спрашиваешь',
107758
+ textApproach: 'Одна центральная проблема за текстне распыляйся на несколько болей. ЗАПРЕЩЕНО перечислять ингредиенты, состав, matcha/MCT/«формулу» это территория «авторитет/экспертиза», не болевой точки. Опиши дискомфорт и как продукт снимает именно эту боль; без каталога компонентов.',
106128
107759
  },
106129
107760
  {
106130
107761
  name: 'трансформация до/после',
106131
- titleApproach: 'контраст жизни до и послеизменение состояния, результат трансформации',
106132
- textApproach: 'Начни с описания «жизни до» («Раньше я…», «Antes sentía…»). Покажи контраст — как изменилось состояние после применения. Конкретный результат с таймингом.',
107762
+ titleApproach: 'контраст СОСТОЯНИЙ и ощущений до/после (вздутие/усталость → лёгкость, тяжесть → контроль, «не узнаю себя в зеркале» → спокойствие) с якорем во времени во фразе, но БЕЗ цифр на весах. ЗАПРЕЩЕНО в заголовке: −X kg, «persi N kg», весы, любой явный минус килограммов это только у testimonial',
107763
+ textApproach: 'СТРОГО от первого лица («Я / Io / Yo…»). Это не отзыв с именем это МОЙ контраст «как было плохо / как стало лучше» по телу и эмоциям. ЗАПРЕЩЕНО копировать формат отзыва: не начинай как реклама «я попробовала продукт и минус X кг» подряд; сначала ощущения и жизнь до/после, продукт — связка, а не пересказ цифр с весов (цифры веса допустимы в тексте лишь второстепенно, если уместно; акцент — на смене состояния). ЗАПРЕЩЕНО соцдоказательство («многие отмечают», «molte persone»).',
106133
107764
  },
106134
107765
  {
106135
107766
  name: 'testimonial',
106136
107767
  isTestimonial: true,
106137
- titleApproach: 'намекает на личный результат или трансформацию (например «Наконец-то без боли 😌», «-4 кг за 2 недели ✅» примеры формата, адаптируй под категорию). НЕ использует «Имя, возраст:» — это только для текста',
106138
- textApproach: `СТРОГО от первого лица и начинается с «Имя, возраст:» («Kasia, 41 lat:», «Maria, 52 años:»).
106139
- * Начинается с «Имя, возраст:» обязательно
106140
- * Возраст должен соответствовать аудитории основном 45+, для похудения допустим ниже)
106141
- * История от первого лица (я/мне/у меня)
106142
- * Конкретный результат с таймингом (7–14 дней; примеры: «Po 7 dniach...», «Después de 2 semanas...»)
107768
+ titleApproach: 'короткая «живая» фраза с конкретикой результата на весах/сроке («−2,8 kg in 10 giorni… incredibile 😅») здесь УМЕСТНЫ −кг и срок; это отличает testimonial от «трансформации». НЕ используй «Имя, возраст:» в заголовке — только в тексте',
107769
+ textApproach: `Это единственный подход-ОТЗЫВ: читатель должен поверить в реального человека.
107770
+ * Обязательно начало текста с «Имя, возраст:» («Giulia, 49 anni:», «Kasia, 41 lat:»)
107771
+ * История только от первого лица после имени
107772
+ * Конкретный результат с таймингом (7–14 дней), можно килограммы и детали быта
106143
107773
  * Заканчивается приглашением попробовать + CTA`,
106144
107774
  },
106145
107775
  {
106146
107776
  name: 'срочность/дефицит',
106147
- titleApproach: 'дедлайн по офферу или запасам«только сегодня», «последний шанс», ограниченное количество',
107777
+ titleApproach: 'ТОЛЬКО дефицит оффера: время до конкретного дедлайна, остаток штук, «до полуночи», «осталось N упаковок» ЗАПРЕЩЕНО в заголовке проблема, тело, продукт, «лишние кг», категория товара. Не баннер магазина — конкретная граница (день, час, число мест)',
106148
107778
  textApproach: 'Начни с конкретного сигнала ограниченности — времени или количества («Tylko dziś», «Últimas unidades», «Осталось 12 упаковок», «Акция до конца дня»). Весь текст строится ИСКЛЮЧИТЕЛЬНО вокруг дефицита или дедлайна: осталось мало, время заканчивается, потом будет дороже или не будет вообще. ЗАПРЕЩЕНО упоминать состав, ингредиенты, свойства или пользу продукта — только ограниченность оффера. CTA максимально срочный.',
106149
107779
  },
106150
107780
  {
106151
107781
  name: 'социальное доказательство',
106152
- titleApproach: 'цифры людей, которые уже решили проблему — «X из Y», популярность, массовый результат',
107782
+ titleApproach: 'одна ЧИТАЕМАЯ фраза с крупной цифрой (например «50.000 italiane hanno già scelto … 🔥») грамматика и смысл на языке GEO должны сходиться; читатель понимает фразу с первого раза. ЗАПРЕЩЕНО несвязные склейки («9 su 10 scelgono controllo 🔥 fame») и обрывки, где цифра + существительные не составляют нормального высказывания',
106153
107783
  textApproach: 'Начни с цифры или массового факта («Уже 50 000 клиентов», «9 din 10 femei observă diferența»). Акцент на том, что проблему уже решили тысячи — и ты тоже можешь.',
106154
107784
  },
106155
107785
  {
106156
107786
  name: 'любопытство/интрига',
106157
- titleApproach: 'секрет, «почему не работают другие методы», неожиданный факт, открытие',
107787
+ titleApproach: 'провокационный вопрос или утверждение, которое ломает сразу ДВА привычных решения (диета И спорт / dieta e palestra…), — но ОДНОЙ ЦЕЛЬНОЙ фразой: связный синтаксис, без рубки на обрывки через запятую и эмодзи посередине. Пример уровня: «Dieta e palestra ma la pancia resta? 🤔» — а не три оторванных куска',
106158
107788
  textApproach: 'Начни с провокационного вопроса или неожиданного инсайта («Знаете, почему обычные средства не помогают?», «¿Sabías que…?»). Раскрой неочевидный факт о проблеме или механизме решения и выведи к продукту.',
106159
107789
  },
106160
107790
  {
106161
107791
  name: 'авторитет/экспертиза',
106162
- titleApproach: 'состав, происхождение, механизм действия, научный подход, проверенная формула',
107792
+ titleApproach: 'information gap: в заголовке ЗАПРЕЩЕНО называть ингредиенты и раскрывать метод/механизм напрямую — никаких matcha, MCT, tè verde, «formula con…», «metodo naturale per…», «accelerare il metabolismo», «supporta il metabolismo» и т.п.; иначе ответ уже в заголовке и клик не нужен. Подай состав или подход как тайну / открытие / «что скрывают» / «почему это не то же самое, что обычные средства» — без конкретики, ответ только в основном тексте. ЗАПРЕЩЕНЫ эмодзи-подсказки по составу (например 🍵, если по смыслу выдаёт чай), если они заменяют то, что должен открыть текст. Не закрывай интригу формулировками уровня «Perché X e Y supportano…»',
106163
107793
  textApproach: 'Начни с ФАКТА/утверждения об экспертизе («Włoska receptura», «Hecho en Italia», «3 składniki naturalne», «Разработано фармацевтами»). Акцент на составе, происхождении или механизме действия. Почему это работает — объясни просто и убедительно.',
106164
107794
  },
106165
107795
  {
106166
107796
  name: 'страх бездействия',
106167
- titleApproach: 'последствия промедления — что будет, если не решить проблему сейчас (дедлайн по здоровью, не по скидке)',
106168
- textApproach: 'Начни с описания негативного сценария бездействия («С каждым днём становится хуже…», «Если не взять под контроль сейчас…»). Покажи, что проблема прогрессирует. CTA — не про скидку, а про заботу о себе прямо сейчас.',
107797
+ titleApproach: 'узнаваемый паттерн промедления — ОДНА СВЯЗНАЯ фраза (допустимы многоточие, союз «но», тире), а не перечень обрывков через запятую. Пример уровня: «Rimandi a lunedì… ma la fame non aspetta 😣» — смысл течёт от начала к концу',
107798
+ textApproach: 'Начни с описания негативного сценария бездействия («С каждым днём становится хуже…», «Если не взять под контроль сейчас…»). Покажи, что проблема прогрессирует. Финальный CTA — ТОЛЬКО про заботу о себе / начать сейчас / не откладывать (на языке GEO). ЗАПРЕЩЕНЫ прямые призывы к заказу в финале: «ordina ora», «закажи», «купи сейчас», «clicca e acquista» — вместо них: взять под контроль, сделать первый шаг, начать сегодня и т.п.',
106169
107799
  },
106170
107800
  {
106171
107801
  name: 'прямой оффер/выгода',
106172
- titleApproach: 'конкретная числовая выгода в заголовке — сколько экономишь или что получаешь (например «-50%», «Вторая упаковка бесплатно», «Цена как раньше»). НЕ просто «скидка есть» — а ЧТО именно и сколько',
107802
+ titleApproach: 'конкретная числовая выгода в заголовке — сколько экономишь или что получаешь (например «-50%», «Вторая упаковка бесплатно», «Цена как раньше»). НЕ просто «скидка есть» — а ЧТО именно и сколько. ОБЯЗАТЕЛЬНО минимум один эмодзи в заголовке (💸 🔥 ✨ 🎁 ⏳ 📦 и т.п.) — как у остальных подходов в наборе, без эмодзи заголовок считается ошибкой',
106173
107803
  textApproach: 'Аудитория уже думает о покупке — текст снимает последнее сомнение, а не убеждает в проблеме. Начни с оффера числом: скидка -50%, конкретная цена, что получаешь за эти деньги. Ответь на вопрос «почему взять сейчас, а не завтра» — цена вырастет, акция закончится, запас ограничен. ЗАПРЕЩЕНО объяснять пользу продукта или описывать проблему — читатель уже всё знает. Только сделка, только экономика, только CTA с акцентом на выгоде прямо сейчас.',
106174
107804
  },
106175
107805
  {
106176
107806
  name: 'ситуационный/узнаваемый момент',
106177
- titleApproach: 'конкретный момент из жизни, узнаваемая сцена, ситуативный крючок',
107807
+ titleApproach: 'одна яркая узнаваемая сцена в 1–2 коротких связных сегментах (лучше одна картинка), без перечня симптомов через запятую. Пример уровня: «Dopo pranzo i pantaloni tirano 😩» — сразу видно момент и боль; ЗАПРЕЩЕНО нагромождать «после обеда 😩 джинсы, живот, тесно» отдельными ярлыками',
106178
107808
  textApproach: 'Начни с конкретной жизненной сцены, где проблема ощущается («[ключевой симптом категории продукта]…», «Вечером перед сном не можешь уснуть из-за дискомфорта…» — адаптируй под категорию). Создай узнаваемую ситуацию — читатель должен сказать «это про меня» — и предложи решение.',
106179
107809
  },
106180
107810
  ];
@@ -106379,6 +108009,12 @@ function getPairsSystemPrompt(geo, noOverride, count = 3, selectedIndices) {
106379
108009
  const distributionLines = pairs
106380
108010
  .map((p, i) => `Пара ${i + 1} → [${p.name}]:\n Заголовок: ${p.titleApproach}\n Текст: ${p.textApproach}`)
106381
108011
  .join('\n');
108012
+ const hasUrgencyScarcity = pairs.some(p => p.name === 'срочность/дефицит');
108013
+ const hasFearInaction = pairs.some(p => p.name === 'страх бездействия');
108014
+ const hasSocialProof = pairs.some(p => p.name === 'социальное доказательство');
108015
+ const hasAuthorityExpertise = pairs.some(p => p.name === 'авторитет/экспертиза');
108016
+ const hasDirectOffer = pairs.some(p => p.name === 'прямой оффер/выгода');
108017
+ const hasTransformAndTestimonial = pairs.some(p => p.name === 'трансформация до/после') && pairs.some(p => p.isTestimonial);
106382
108018
  const deadlineNote = n >= 2
106383
108019
  ? `- В Тексте 1 ИЛИ Тексте 2 ОБЯЗАТЕЛЬНО укажи ожидаемый срок результата 7–14 дней (на языке ${geo}).`
106384
108020
  : `- В Тексте 1 ОБЯЗАТЕЛЬНО укажи ожидаемый срок результата 7–14 дней (на языке ${geo}).`;
@@ -106393,6 +108029,11 @@ function getPairsSystemPrompt(geo, noOverride, count = 3, selectedIndices) {
106393
108029
 
106394
108030
  ... и так для всех ${n} пар. Каждая пара отделена пустой строкой.
106395
108031
 
108032
+ КРИТИЧНО ДЛЯ РАЗБОРА:
108033
+ - Служебные метки в начале строки пиши РОВНО как в примере: слово «ЗАГОЛОВОК» целиком кириллицей (не ZAG, не смесь латиницы и кириллицы), слово «ТЕКСТ» целиком кириллицей.
108034
+ - Не вставляй строки «ЗАГОЛОВОК N:» внутрь текста объявления; каждый заголовок — отдельная строка перед своим «ТЕКСТ N:».
108035
+ - Контент объявления (заголовок и текст) — на языке ${geo}; только метки ЗАГОЛОВОК/ТЕКСТ остаются кириллицей как шаблон.
108036
+
106396
108037
  РАСПРЕДЕЛЕНИЕ ПОДХОДОВ ПО ПАРАМ:
106397
108038
  ${distributionLines}
106398
108039
 
@@ -106400,20 +108041,24 @@ ${distributionLines}
106400
108041
  - Заголовок — короткий крючок (боль или триггер)
106401
108042
  - Текст — раскрывает тот же угол глубже, добавляет детали, заканчивается CTA
106402
108043
  - Текст НЕ повторяет заголовок дословно, но развивает его смысл
108044
+ - Не подмешивай чужие углы: например в «трансформация до/после» не используй формулировки соцдоказательства («многие отмечают», «клиенты говорят»)
108045
+ ${hasTransformAndTestimonial ? '\n- РАЗВЕДЕНИЕ «трансформация до/после» и «testimonial» в одном ответе: у трансформации заголовок = контраст ощущений/состояния (без −кг и без «минус X kg за N дней»); у testimonial заголовок может содержать −кг, весы, срок — как убедительный отзыв. Не делай два заголовка в одном формате «цифра + срок на весах».' : ''}
106403
108046
 
106404
108047
  ТРЕБОВАНИЯ К ЗАГОЛОВКУ:
106405
108048
  - До 55–60 символов, максимум 6–7 слов
108049
+ - Цельность: заголовок читается как одно высказывание (или один связный вопрос целиком). ЗАПРЕЩЕНО склеивать несвязные ярлыки запятыми ради ключевых слов; эмодзи не должно разрывать грамматику так, что фраза перестаёт быть человеческой
106406
108050
  - ЗАПРЕЩЕНО двоеточие (:) — используй тире (—) или переформулируй
106407
- - 1–2 эмодзи естественно внутри (не только в конце); избегай ⚠️ и 🚨
106408
- - Хотя бы одно ключевое слово проблемы, релевантное продукту
106409
- - НЕ упоминай название продукта — заголовок = боль + триггер
108051
+ - 1–2 эмодзи естественно (часто в конце фразы или после целого смыслового блока); избегай ⚠️ и 🚨${hasDirectOffer ? '\n- Для пары «прямой оффер/выгода» эмодзи в заголовке ОБЯЗАТЕЛЕН (минимум один) — визуально вровень с остальными парами набора' : ''}
108052
+ - Хотя бы одно ключевое слово проблемы, релевантное продукту${hasUrgencyScarcity ? '\n- ИСКЛЮЧЕНИЕ: для пары с подходом «срочность/дефицит» в заголовке ЗАПРЕЩЕНЫ симптомы, проблема, тело, продукт — только лимит оффера (время, количество, дедлайн)' : ''}${hasAuthorityExpertise ? '\n- Пара «авторитет/экспертиза»: заголовок держит information gap — без ингредиентов и без прямого названия механизма; состав и «как это работает» — только в тексте пары' : ''}
108053
+ - НЕ упоминай название продукта — заголовок = боль + триггер${hasUrgencyScarcity ? ' (кроме пары «срочность/дефицит»: там заголовок = только дефицит/дедлайн, без продукта и без боли)' : ''}${hasSocialProof ? '\n- Исключение: в паре «социальное доказательство» название продукта в заголовке допустимо, если оно входит в цельную фразу про массовый выбор (например «N persone hanno già scelto [продукт]»)' : ''}
106410
108054
  - Звучит как живая рекламная фраза, а не строка ключевых слов
106411
108055
 
106412
108056
  ТРЕБОВАНИЯ К ТЕКСТУ:
106413
108057
  - 150–280 символов (testimonial — до 300)
106414
- - Хотя бы одно ключевое слово проблемы
106415
- - Сильный явный CTA в конце («кликни», «попробуй сейчас», «закажи», «не жди»)
108058
+ - Хотя бы одно ключевое слово проблемы (для «срочность/дефицит» в тексте допустимо слабее, если весь фокус — на лимите оффера)
108059
+ - Сильный явный CTA в конце («кликни», «попробуй сейчас», «закажи», «не жди»)${hasFearInaction ? '\n- ИСКЛЮЧЕНИЕ: для пары «страх бездействия» финальная фраза — не заказ, а забота о себе / начать сейчас; без «ordina ora», «закажи», «купи», «clicca e acquista» в конце' : ''}
106416
108060
  - Короткие рубленые фразы, императивы, FOMO допустим${hasTestimonial ? '\n- Testimonial: строго от первого лица, начинается с «Имя, возраст:», конкретный результат с таймингом' : ''}
108061
+ - Ингредиенты и состав из доп. информации — только в углах «авторитет/экспертиза» (и сходных); в «болевой точке» и чисто эмоциональных углах состав не перечислять
106417
108062
  ${deadlineNote}
106418
108063
 
106419
108064
  ОБЩИЕ ТРЕБОВАНИЯ: