PageSourceSearch

https://gptea.ru/_nuxt/pKt5aTsR.js

js gptea.ru collected 2026-10-08 16:30:28 UTC 30,813 bytes, 3 lines download raw bytes

1import{d as Pe,y as $e,A as o,u as oe,a2 as t,R,a5 as O,ae as W,ac as d,Q as v,a6 as r,ah as m,aj as f,at as B,ao as Ve,ad as K,r as ie,f as p,e as I,$ as i}from"./oW-lkGAh.js";import{u as Ee}from"./2Szhl2FM.js";import{w as Fe,_ as Ae}from"./hTp37XXB.js";import"./tvf1fRvD.js";import"./DgzPmcdk.js";const Re={class:"style-lab"},Oe={key:0,class:"state-panel"},Be={key:1,class:"state-panel"},ze={class:"stepper","aria-label":"Этапы"},De=["disabled"],Ne=["disabled"],He=["disabled"],_e={key:0,class:"lab-grid"},je={class:"archetype-grid"},qe=["onClick"],Ge={class:"reference-analyzer"},Je={key:0,class:"vision-reference-preview"},We=["src"],Ke={key:1,class:"notice error"},Qe={key:2,class:"notice info"},Xe=["disabled"],Ye={class:"inline-check"},Ze={class:"two-cols"},et=["value"],tt={class:"advanced-settings"},lt={class:"two-cols"},at={class:"two-cols"},st={class:"action-row"},nt=["disabled"],ot=["disabled"],it={class:"preview-panel"},rt={key:0,class:"notice error"},ut={class:"summary"},dt=["value"],pt={key:2,class:"empty"},vt={key:1,class:"lab-grid"},mt={key:0,class:"notice error"},yt={key:1,class:"notice info"},ct=["multiple"],ft={key:2,class:"test-files"},gt=["src"],wt={key:3,class:"test-fields"},bt=["onUpdate:modelValue","placeholder"],xt=["onUpdate:modelValue","placeholder"],kt=["value"],It={class:"action-row"},St=["disabled"],Tt=["disabled"],Lt={class:"preview-panel"},Ut={key:0,class:"result-preview"},Mt=["src"],Ct={key:1,class:"notice error"},ht={key:2,class:"empty"},Pt={key:2,class:"lab-grid"},$t={key:0,class:"notice error"},Vt={key:1,class:"notice error"},Et={key:2,class:"notice info"},Ft={key:3,class:"notice success"},At={class:"switches compact"},Rt={class:"inline-check"},Ot={key:4,class:"save-summary"},Bt={class:"one-col"},zt={key:5,class:"notice warn"},Dt={class:"action-row"},Nt=["disabled"],Ht=["disabled"],_t={class:"preview-panel"},jt={key:0,class:"examples-grid"},qt={key:0,class:"example-chip"},Gt=["src"],Jt={key:1,class:"example-chip"},Wt=["src"],Kt={key:3,class:"lab-grid"},Qt={class:"editor-panel"},Xt={class:"summary"},Yt={class:"action-row"},Zt=["disabled"],el=Pe({__name:"image-style-lab",setup(tl){const P=[{key:"standard",title:"Обычная модель",description:"GPT image. Дешевле: 100 чаш, подходит для большинства обычных стилей.",defaults:{model:"gpt-image-2",costTokens:100,maxImages:1,extraFieldMode:"additional",createCompilation:!1,showInMainList:!0,providerHint:"Обычная image-edit генерация. Себестоимость низкая, цена для пользователя 100 чаш."}},{key:"identity-preserve",title:"Nano Banana",description:"Дороже: 150 чаш. Лучше сохраняет исходное фото, личность и русский текст.",defaults:{model:"nano-banana-2",costTokens:150,maxImages:1,extraFieldMode:"additional",createCompilation:!1,showInMainList:!0,providerHint:"Nano Banana через Kie. Использовать, когда важно сохранить исходное фото/личность или нужен русский текст. Цена для пользователя 150 чаш."}}],{isAdmin:re,isLoading:ue,init:de}=Ee(),l=ie({archetype:"standard",name:"Фото в стиле нуар",effect:"Черно-белый кинематографичный портрет с жестким боковым светом, глубокими тенями и атмосферой старого детективного фильма.",rawPrompt:"",useSmartPrompt:!0,mood:"",preserve:"",avoid:"",audience:"",keywords:"",providerHint:P[0].defaults.providerHint,extraFieldMode:"additional",costTokens:100,model:"gpt-image-2",size:"1024x1024",maxImages:1,order:1,showInMainList:!0,mainListPriority:100,alwaysShowFirst:!1,notIncludedInUnlimited:!1,isTrending:!1,generateExamplesOnSave:!1,createCompilation:!1,compilationSlug:"",previewId:null,exampleBeforeId:null,exampleAfterId:null}),q=p(""),n=p(null),c=p(""),w=p(null),$=p(!1),z=p(!1),D=p(!1),S=p(!1),y=p("style"),V=p(""),E=p(""),N=p(null),b=p(""),x=p(""),T=p(""),pe=p([]),L=p(null),M=p([]),k=p(null),H=p(!1),C=p(""),h=p(""),U=ie({}),F=p(""),ve=I(()=>n.value?{...n.value,compilation:null}:null),me=I(()=>JSON.stringify(ve.value,null,2)),Q=I(()=>!!(n.value?.preview&&n.value?.exampleBefore&&n.value?.exampleAfter)),X=I(()=>P.find(s=>
1s.key===l.archetype)||P[0]),ye=I(()=>Y(l.model||X.value.defaults.model)),G=I(()=>fe(n.value?.promptTemplate||"",U)),ce=I(()=>w.value?.urls?.image||(n.value?.slug?`/image/${n.value.slug}`:"")),_=I(()=>{const s=N.value;return s&&(s.url||s.imageUrl||s.resultUrl||s.resultImageUrl||s.images?.[0]?.url||s.images?.[0])||""});function Y(s){return s.toLowerCase().includes("nano-banana")?150:100}function fe(s,e){return s.replace(/\{\{\s*([\w.-]+)\s*\}\}/g,(a,u)=>e[u]||"")}function ge(s){const e={а:"a",б:"b",в:"v",г:"g",д:"d",е:"e",ё:"e",ж:"zh",з:"z",и:"i",й:"y",к:"k",л:"l",м:"m",н:"n",о:"o",п:"p",р:"r",с:"s",т:"t",у:"u",ф:"f",х:"h",ц:"c",ч:"ch",ш:"sh",щ:"sch",ы:"y",э:"e",ю:"yu",я:"ya"};return s.toLowerCase().replace(/[\u0430-\u044f\u0451]/g,a=>e[a]||"").replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,80)}function we(){const s=ee(),e=ge(l.name)||`image-style-${Date.now()}`,a=l.rawPrompt.trim(),u=s.extraFieldMode==="none"?[]:s.extraFieldMode==="scene-and-details"?[{key:"scene",type:"textarea",label:"Сцена",placeholder:"Поза, место, композиция",max:500},{key:"additional",type:"textarea",label:"Детали",placeholder:"Одежда, фон, свет, настроение",max:500}]:[{key:"additional",type:"textarea",label:"Детали",placeholder:"Фон, одежда, свет, настроение",max:500}],g=u.map(ne=>`${ne.label}: {{${ne.key}}}`).join(`
2`),A=l.model.toLowerCase().includes("nano-banana")?"Максимально сохрани исходное лицо, личность, позу, пропорции и все важные детали исходного фото. Если есть русский текст, сохрани его аккуратно.":`Сохрани ${s.preserve}.`;return{name:l.name,slug:e,description:`Загрузите фото и получите результат: ${l.name}.`,promptTemplate:a||[`Преобразуй загруженное фото: ${l.name}.`,l.effect,A,`Визуальное настроение: ${s.mood}.`,`Ограничения: ${s.avoid}.`,"Результат должен выглядеть как качественная готовая фотография без лишнего текста, логотипов и водяных знаков.",g].filter(Boolean).join(`
3`),fields:u,costTokens:s.costTokens,model:s.model,size:s.size,maxImages:s.maxImages,instruction:"Загрузите фото, добавьте детали и нажмите создать.",text_your_photo:l.name,isActive:!0,order:l.order,showInMainList:l.showInMainList,mainListPriority:l.mainListPriority,alwaysShowFirst:l.alwaysShowFirst,notIncludedInUnlimited:l.notIncludedInUnlimited,isTrending:l.isTrending,preview:l.previewId,exampleBefore:l.exampleBeforeId,exampleAfter:l.exampleAfterId,images_for_prompt:[],compilation:null,archetype:l.archetype,providerHint:s.providerHint,providerBindingRequired:l.model.toLowerCase().includes("nano-banana"),exampleChecklist:[]}}function Z(){const s=Array.isArray(n.value?.fields)?n.value.fields:[];for(const e of s)e.key in U||(U[e.key]="")}function be(s){const e=s.target,a=Array.from(e.files||[]).slice(0,Number(l.maxImages||1));for(const u of M.value)URL.revokeObjectURL(u.previewUrl);M.value=a.map(u=>({file:u,previewUrl:URL.createObjectURL(u)}))}function xe(s){const a=s.target.files?.[0];k.value&&URL.revokeObjectURL(k.value.previewUrl),k.value=a?{file:a,previewUrl:URL.createObjectURL(a)}:null,C.value="",h.value=""}async function ke(){if(k.value){H.value=!0,C.value="Анализирую визуальный стиль и собираю promptTemplate...",h.value="",c.value="";try{const s=new FormData;s.append("image",k.value.file);const e=await $fetch("/api/image-style-lab/analyze-reference",{method:"POST",body:s}),a=e?.analysis;if(!a?.promptTemplate)throw new Error("Vision-модель не вернула promptTemplate");if(te(a.archetype==="identity-preserve"?"identity-preserve":"standard"),l.name=a.name||l.name,l.effect=a.effect||"",l.rawPrompt=a.promptTemplate,l.useSmartPrompt=!1,l.preserve=a.preserve||"",l.avoid=a.avoid||"",l.mood=a.mood||"",l.keywords=a.keywords||"",l.maxImages=Number(a.maxImages||1),n.value=null,F.value="",await J(),!n.value)throw new Error(c.value||"Не удалось собрать черновик стиля");C.value=`Промпт готов. Использована модель ${e.model||"vision"}.`}catch(s){h.value=s?.data?.message||s?.data?.statusMessage||s?.statusMessage||s?.message||"Не удалось разобрать изображение",C.value=""}finally{H.value=!1}}}function Ie(s){return s.toLowerCase().replace(/ё/g,"е").split(/[^\p{L}\p{N}]+/u).map(e=>e.trim()).filter(e=>e.length>=4).filter(e=>!["фото","стиле","стиль","нейросеть","нейросетью","изображение","сделать","через"].includes(e))}function Se(){const s=Ie(`${l.name} ${l.effect}`).slice(0,6);return Array.from(new Set([l.name.toLowerCase(),`${l.name.toLowerCase()} нейросеть`,...s])).join(", ")}function ee(){const s=X.value.defaults,e=`${l.name} ${l.effect}`.toLowerCase(),a=/портрет|селфи|лиц|аватар|человек|девуш|парен|мужчин|женщин/.test(e),u=/товар|предмет|маркетплейс|фон|объект|карточк/.test(e),g=/кино|cinematic|нуар|fashion|журнал|пленк|ретро|драм/.test(e);return{model:l.model||s.model,size:l.size||"1024x1024",costTokens:Y(l.model||s.model),maxImages:Number(l.maxImages||s.maxImages),extraFieldMode:l.extraFieldMode||s.extraFieldMode,createCompilation:!1,showInMainList:l.showInMainList??s.showInMainList,providerHint:l.providerHint||s.providerHint,mood:l.mood||(g?"Кинематографично, реалистично, выразительный свет, аккуратная коммерческая обработка":"Реалистично, чисто, современно, подходит для соцсетей и публичной страницы"),preserve:l.preserve||(u?"форму, цвет, фактуру, пропорции и узнаваемость основного объекта":a?"черты лица, позу, пропорции, одежду, прическу и узнаваемость человека":"ключевые объекты, композицию, пропорции и узнаваемость исходного изображения"),avoid:l.avoid||(u?"не менять товар, не искажать геометрию, не добавлять лишний текст, логотипы и водяные знаки":"не менять личность, не искажать лицо, не добавлять лишние пальцы, текст, логотипы и водяные знаки"),audience:l.audience||(u?"маркетплейсов, карточек товаров и коммерческих визуалов":"аватаров, соцсетей, сторис и персональных фотосессий"),keywords:l.ke
3ywords||Se(),compilationSlug:l.compilationSlug||""}}function te(s){const e=P.find(a=>a.key===s);e&&(l.archetype=s,l.model=e.defaults.model,l.costTokens=e.defaults.costTokens,l.maxImages=e.defaults.maxImages,l.extraFieldMode=e.defaults.extraFieldMode,l.createCompilation=e.defaults.createCompilation,l.showInMainList=e.defaults.showInMainList,l.providerHint=e.defaults.providerHint)}function le(){const s=ee();return{...l,rawPrompt:l.rawPrompt,useSmartPrompt:l.useSmartPrompt,mood:s.mood,preserve:s.preserve,avoid:s.avoid,audience:s.audience,keywords:s.keywords,providerHint:s.providerHint,model:s.model,size:s.size,costTokens:s.costTokens,maxImages:s.maxImages,extraFieldMode:s.extraFieldMode,createCompilation:!1,showInMainList:s.showInMainList,compilationSlug:s.compilationSlug,referenceImageIds:q.value.split(",").map(e=>Number(e.trim())).filter(Number.isFinite)}}function ae(s=le()){return JSON.stringify(s)}function Te(){return!!(n.value&&F.value===ae())}async function j(){Te()||await J()}async function J(){c.value="",w.value=null,$.value=!0;const s=le(),e=ae(s);try{const a=await $fetch("/api/image-style-lab/draft",{method:"POST",body:s});n.value=a.draft,F.value=e,Z()}catch(a){const u=a?.data?.message||a?.message||"Не удалось собрать черновик";if(l.useSmartPrompt&&!l.rawPrompt.trim()){n.value=null,F.value="",c.value=u;return}n.value=we(),F.value=e,Z(),c.value=""}finally{$.value=!1}}async function Le(){await j(),n.value&&(y.value="test")}async function Ue(s,e){const a=await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),u=await a.text(),g=u?JSON.parse(u):null;if(!a.ok){const A=g?.data?.message||g?.message||g?.statusMessage||a.statusText;throw new Error(A)}return g}async function se(s={}){c.value="",T.value="",x.value="";try{if(await j(),!n.value)throw new Error("Нет черновика стиля");S.value=!0,x.value="Генерирую превью и основной пример стиля. Это 2 генерации.";const e=await $fetch("/api/image-style-lab/examples",{method:"POST",body:{draft:{...n.value,compilation:null},includeCompilation:!1}});pe.value=[],L.value={preview:e.preview||null,style_example:e.style_example||null};const a=e.preview,u=e.style_example;n.value={...n.value,preview:a?.image_after||n.value.preview||null,exampleBefore:u?.image_before||n.value.exampleBefore||null,exampleAfter:u?.image_after||n.value.exampleAfter||null,compilation:null},l.previewId=n.value.preview,l.exampleBeforeId=n.value.exampleBefore,l.exampleAfterId=n.value.exampleAfter,x.value="Превью и основной пример готовы."}catch(e){if(T.value=e?.data?.message||e?.data?.statusMessage||e?.statusMessage||e?.message||"Не удалось сгенерировать финальные изображения",x.value="",s.throwOnError)throw e}finally{S.value=!1}}async function Me(){if(n.value){c.value="",T.value="",x.value="",w.value=null,z.value=!0;try{if(await j(),!n.value)throw new Error("Нет черновика стиля");l.generateExamplesOnSave&&!Q.value&&(await se({throwOnError:!0}),x.value="Превью и основной пример готовы, сохраняю стиль."),w.value=await Ue("/api/image-style-lab/save",{draft:{...n.value,compilation:null}}),y.value="done"}catch(s){c.value=s?.data?.message||s?.data?.statusMessage||s?.statusMessage||s?.message||"Не удалось сохранить стиль",T.value=c.value}finally{z.value=!1,S.value=!1}}}function Ce(){if(!(!w.value?.template||!n.value))return Fe({path:"/compilations",query:{type:"images",topic:n.value.name,keywords:l.keywords||n.value.name,styleSlug:w.value.template.slug||n.value.slug,styleTemplateId:String(w.value.template.id)}})}async function he(){c.value="",V.value="",E.value="",N.value=null,b.value="",D.value=!0;try{if(!M.value.length)throw new Error("Загрузи фото для теста");if(await j(),E.value="Отправляю фото в тестовую генерацию. Обычно это занимает 1-3 минуты, но иногда может идти до 10 минут.",!n.value?.slug)throw new Error("У черновика нет slug");const s=new FormData;s.append("prompt",G.value),s.append("model",n.value.model||l.model||"gpt-image-2"),s.append("size",n.value.size||l.size||"1024x1024");for(const A of M.value)s.append("image",A.file);const e=new AbortController,a=window.setTimeout(()=>e.abort(),600*1e3),u=await fetch(`${window.location.origin}/api/image-style-lab/test`,{method:"POST",body:s,credentials:"same-origin",cache:"no-store",signal:e.signal});window.clearTimeout(a);const g=await u.json().catch(()=>null);if(!u.ok)throw new Error(g?.message||g?.statusMessage||`HTTP ${u.status}`);N.value=g,E.value=""}catch(s){V.value=s?.data?.message||s?.data?.statusMessage||s?.statusMessage||s?.message||"Тестовая генерация не удалась"}finally{D.value=!1}}return $e(async()=>{await de()}),(s,e)=>(i(),o("main",Re,[oe(ue)?(i(),o("section",Oe,"Проверка доступа...")):oe(re)?(i(),o(R,{key:2},[e[79]||(e[79]=t("header",{class:"lab-header"},[t("div",null,[t("p",{class:"eyebrow"},"GPTea tools"),t("h1",null,"Конструктор стилей фото")])],-1)),t("nav",ze,[t("button",{type:"button",class:O
3({active:y.value==="style"}),onClick:e[0]||(e[0]=a=>y.value="style")},"1. Стиль",2),t("button",{type:"button",class:O({active:y.value==="test"}),disabled:!n.value,onClick:e[1]||(e[1]=a=>y.value="test")},"2. Тест",10,De),t("button",{type:"button",class:O({active:y.value==="publish"}),disabled:!n.value,onClick:e[2]||(e[2]=a=>y.value="publish")},"3. Финал стиля",10,Ne),t("button",{type:"button",class:O({active:y.value==="done"}),disabled:!w.value,onClick:e[3]||(e[3]=a=>y.value="done")},"4. Готово",10,He)]),y.value==="style"?(i(),o("section",_e,[t("form",{class:"editor-panel",onSubmit:K(Le,["prevent"])},[e[47]||(e[47]=t("div",{class:"section-title"},[t("h2",null,"Основа стиля")],-1)),t("div",je,[(i(),o(R,null,W(P,a=>t("button",{key:a.key,type:"button",class:O(["archetype-card",{active:l.archetype===a.key}]),onClick:u=>te(a.key)},[t("strong",null,r(a.title),1),t("span",null,r(a.description),1)],10,qe)),64))]),t("div",Ge,[e[31]||(e[31]=t("div",{class:"section-title"},[t("h3",null,"Промпт по изображению")],-1)),t("label",null,[e[30]||(e[30]=d(" Референс стиля ",-1)),t("input",{type:"file",accept:"image/jpeg,image/png,image/webp",onChange:xe},null,32)]),k.value?(i(),o("div",Je,[t("img",{src:k.value.previewUrl,alt:"Референс для анализа"},null,8,We)])):v("",!0),h.value?(i(),o("div",Ke,r(h.value),1)):v("",!0),C.value&&!h.value?(i(),o("div",Qe,r(C.value),1)):v("",!0),t("button",{type:"button",class:"secondary",disabled:!k.value||H.value,onClick:ke},r(H.value?"Анализирую...":"Собрать промпт по изображению"),9,Xe)]),t("label",null,[e[32]||(e[32]=d(" Название ",-1)),m(t("input",{"onUpdate:modelValue":e[4]||(e[4]=a=>l.name=a),type:"text",placeholder:"Фото в стиле нуар",required:""},null,512),[[f,l.name]])]),t("label",null,[e[33]||(e[33]=d(" Что стиль делает с фото ",-1)),m(t("textarea",{"onUpdate:modelValue":e[5]||(e[5]=a=>l.effect=a),rows:"5",placeholder:"Коротко опишите идею стиля. Если ниже вставлен готовый prompt, это поле можно оставить пустым."},null,512),[[f,l.effect]])]),t("label",null,[e[34]||(e[34]=d(" Готовый prompt, если он уже есть ",-1)),m(t("textarea",{"onUpdate:modelValue":e[6]||(e[6]=a=>l.rawPrompt=a),rows:"8",placeholder:"Вставьте готовый prompt. Он будет сохранен как promptTemplate без сборки из сухих полей. Можно использовать {{additional}}, {{scene}} и другие переменные формы."},null,512),[[f,l.rawPrompt]])]),t("label",Ye,[m(t("input",{"onUpdate:modelValue":e[7]||(e[7]=a=>l.useSmartPrompt=a),type:"checkbox"},null,512),[[B,l.useSmartPrompt]]),e[35]||(e[35]=d(" Умно собирать prompt через языковую модель, если готовый prompt не задан ",-1))]),t("div",Ze,[t("label",null,[e[36]||(e[36]=d(" Сколько фото можно загрузить ",-1)),m(t("input",{"onUpdate:modelValue":e[8]||(e[8]=a=>l.maxImages=a),type:"number",min:"1",max:"8"},null,512),[[f,l.maxImages,void 0,{number:!0}]])]),t("label",null,[e[37]||(e[37]=d(" Цена ",-1)),t("input",{value:ye.value,type:"number",disabled:""},null,8,et)])]),t("details",tt,[e[46]||(e[46]=t("summary",null,"Тонкие настройки промпта и шаблона",-1)),t("div",lt,[t("label",null,[e[39]||(e[39]=d(" Поля для пользователя ",-1)),m(t("select",{"onUpdate:modelValue":e[9]||(e[9]=a=>l.extraFieldMode=a)},[...e[38]||(e[38]=[t("option",{value:"additional"},"Одно поле деталей",-1),t("option",{value:"scene-and-details"},"Сцена + детали",-1),t("option",{value:"none"},"Без текстовых полей",-1)])],512),[[Ve,l.extraFieldMode]])]),t("label",null,[e[40]||(e[40]=d(" Размер ",-1)),m(t("input",{"onUpdate:modelValue":e[10]||(e[10]=a=>l.size=a),type:"text",placeholder:"1024x1024"},null,512),[[f,l.size]])])]),t("label",null,[e[41]||(e[41]=d(" Что обязательно сохранить ",-1)),m(t("textarea",{"onUpdate:modelValue":e[11]||(e[11]=a=>l.preserve=a),rows:"3",placeholder:"Автоматически, если пусто"},null,512),[[f,l.preserve]])]),t("label",null,[e[42]||(e[42]=d(" Чего избегать ",
3-1)),m(t("textarea",{"onUpdate:modelValue":e[12]||(e[12]=a=>l.avoid=a),rows:"3",placeholder:"Автоматически, если пусто"},null,512),[[f,l.avoid]])]),t("div",at,[t("label",null,[e[43]||(e[43]=d(" Настроение ",-1)),m(t("input",{"onUpdate:modelValue":e[13]||(e[13]=a=>l.mood=a),type:"text",placeholder:"Автоматически, если пусто"},null,512),[[f,l.mood]])]),t("label",null,[e[44]||(e[44]=d(" SEO-ключи стиля ",-1)),m(t("input",{"onUpdate:modelValue":e[14]||(e[14]=a=>l.keywords=a),type:"text",placeholder:"Только для карточки стиля. Wordstat будет в подборке позже."},null,512),[[f,l.keywords]])])]),t("label",null,[e[45]||(e[45]=d(" Reference image IDs ",-1)),m(t("input",{"onUpdate:modelValue":e[15]||(e[15]=a=>q.value=a),type:"text",placeholder:"12, 18, 25"},null,512),[[f,q.value]])])]),t("div",st,[t("button",{type:"button",class:"secondary",disabled:$.value,onClick:J},r($.value?"Собираю...":"Пересобрать промпт"),9,nt),t("button",{type:"submit",class:"primary",disabled:$.value}," Далее: тест ",8,ot)])],32),t("aside",it,[e[53]||(e[53]=t("div",{class:"section-title"},[t("h2",null,"Черновик промпта")],-1)),c.value?(i(),o("div",rt,r(c.value),1)):v("",!0),n.value?(i(),o(R,{key:1},[t("div",ut,[t("div",null,[e[48]||(e[48]=t("span",null,"Slug",-1)),t("strong",null,r(n.value.slug),1)]),t("div",null,[e[49]||(e[49]=t("span",null,"Модель",-1)),t("strong",null,r(n.value.model),1)]),t("div",null,[e[50]||(e[50]=t("span",null,"Цена",-1)),t("strong",null,r(n.value.costTokens)+" чаш",1)])]),t("label",null,[e[51]||(e[51]=d(" Финальный промпт для теста ",-1)),t("textarea",{value:G.value,rows:"14",readonly:""},null,8,dt)]),t("details",null,[e[52]||(e[52]=t("summary",null,"Технический prompt template",-1)),m(t("textarea",{"onUpdate:modelValue":e[16]||(e[16]=a=>n.value.promptTemplate=a),rows:"8"},null,512),[[f,n.value.promptTemplate]])])],64)):(i(),o("div",pt,"Опиши стиль, и черновик появится здесь."))])])):y.value==="test"?(i(),o("section",vt,[t("form",{class:"editor-panel",onSubmit:K(he,["prevent"])},[e[56]||(e[56]=t("div",{class:"section-title"},[t("h2",null,"Тестовая генерация")],-1)),V.value?(i(),o("div",mt,r(V.value),1)):v("",!0),E.value&&!V.value&&!N.value?(i(),o("div",yt,r(E.value),1)):v("",!0),t("label",null,[e[54]||(e[54]=d(" Фото для теста ",-1)),t("input",{type:"file",accept:"image/*",multiple:l.maxImages>1,onChange:be},null,40,ct)]),M.value.length?(i(),o("div",ft,[(i(!0),o(R,null,W(M.value,a=>(i(),o("img",{key:a.previewUrl,src:a.previewUrl,alt:""},null,8,gt))),128))])):v("",!0),n.value?.fields?.length?(i(),o("div",wt,[(i(!0),o(R,null,W(n.value.fields,a=>(i(),o("label",{key:a.key},[d(r(a.label||a.key)+" ",1),a.type==="textarea"?m((i(),o("textarea",{key:0,"onUpdate:modelValue":u=>U[a.key]=u,rows:"3",placeholder:a.placeholder||""},null,8,bt)),[[f,U[a.key]]]):m((i(),o("input",{key:1,"onUpdate:modelValue":u=>U[a.key]=u,type:"text",placeholder:a.placeholder||""},null,8,xt)),[[f,U[a.key]]])]))),128))])):v("",!0),t("label",null,[e[55]||(e[55]=d(" Промпт, который уйдет в модель ",-1)),t("textarea",{value:G.value,rows:"12",readonly:""},null,8,kt)]),t("div",It,[t("button",{type:"button",class:"secondary",onClick:e[17]||(e[17]=a=>y.value="style")},"Назад к стилю"),t("button",{type:"submit",class:"primary",disabled:D.value||!n.value},r(D.value?"Генерирую...":"Тестовая генерация"),9,St),t("button",{type:"button",class:"primary",disabled:!_.value||!!b.value,onClick:e[18]||(e[18]=a=>y.value="publish")}," Далее: сохранить ",8,Tt)])],32),t("aside",Lt,[e[57]||(e[57]=t("div",{class:"section-title"},[t("h2",null,"Результат")],-1)),_.value&&!b.value?(i(),o("div",Ut,[t("img",{src:_.value,alt:"Результат тестовой генерации",onLoad:e[19]||(e[19]=a=>b.value=""),onError:e[20]||(e[20]=a=>b.value="Результат создан, но изображение не удалось загрузить. Повторите тест или проверьте Media Library.")},null,40,Mt)])):v("",!0),b.value?(i(),o("div",Ct,r(b.value),1)):v("",!0),!_.value&&!b.value?(i(),o("div",ht,"После теста результат появится здесь.")):v("",!0)])])):y.value==="publish"?(i(),o("section",Pt,[t("form",{class:"editor-panel",onSubmit:K(Me,["prevent"])},[e[67]||(e[67]=t("div",{class:"section-title"},[t("h2",null,"Финальные изображения и сохранение стиля")],-1)),c.value?(i(),o("div",$t,r(c.value),1)):v("",!0),T.value&&!c.value?(i(),o("div",Vt,r(T.value),1)):v("",!0),x.value&&!T.value?(i(),o("div",Et,r(x.value),1)):v("",!0),w.value?(i(),o("div",Ft,"Стиль создан: "+r(w.value.urls?.image),1)):v("",!0),t("div",At,[t("label",null,[m(t("input",{"onUpdate:modelValue":e[21]||(e[21]=a=>l.showInMainList=a),type:"checkbox"},null,512),[[B,l.showInMainList]]),e[58]||(e[58]=d(" Показывать на витрине",-1))]),t("label",null,[m(t("input",{"onUpdate:modelValue":e[22]||(e[22]=a=>l.isTrending=a),type:"checkbox"},null,512),[[B,l.isTrending]]),e[59]||(e[59]=d(" Трендовый",-1))]),t("label",null,[m(t("input",{"onUpdate:modelValue":e[23]||(e[23]=a=>l.alwaysShowFirst=a),type:"checkbox"},null,512),[[B,l.alwaysShowFirst]]),e[60]||(e[60]=d(" Всегда первым",-1))])]),t("label",Rt,[m(t("input",{"onUpdate:modelValue":e[24]||(e[24]=a=>l.generateExamplesOnSave=a),type:"checkbox"},null,512),[[B,l.generateExamplesOnSave]]),e[61]||(e[61]=d(" Перед сохранением сгенерировать превью и основной пример ",-1))]),n.value?(i(),o("div",Ot,[t("div",null,[e[62]||(e[62]=t("span",null,"Модель",-1)),t("strong",null,r(n.value.model),1)]),t("div",null,[e[63]||(e[63]=t("span",null,"Цена",-1)),t("strong",null,r(n.value.costTokens)+" чаш",1)]),t("div",null,[e[64]||(e[64]=t("span",null,"Фото",-1)),t("strong",null,r(n.value.maxImages),1)]),t("div",null,[e[65]||(e[65]=t("span",null,"Финальные изображения",-1)),t("strong",null,r(Q.value?"готовы":"не готовы"),1)])])):v("",!0),t("div",Bt,[t("label",null,[e[66]||(e[66]=d("Порядок ",-1)),m(t("input",{"onUpdate:modelValue":e[25]||(e[25]=a=>l.order=a),type:"number",min:"1"},null,512),[[f,l.order,void 0,{number:!0}]])])]),n.value?.providerBindingRequired?(i(),o("div",zt," После сохранения проверь привязку ai_provider в Strapi для Nano Banana. ")):v("",!0),t("div",Dt,[t("button",{type:"button",class:"secondary",onClick:e[26]||(e[26]=a=>y.value="test")},"Назад к тесту"),t("button",{type:"button",class:"secondary",disabled:!n.value||S.value,onClick:e[27]||(e[27]=a=>se())},r(S.value?"Генерирую...":"Сгенерировать превью и пример"),9,Nt),t("button",{type:"submit",class:"primary",disabled:!n.value||z.value||S.value},r(S.value?"Генерирую превью и пример...":z.value?"Сохраняю...":"Сохранить стиль"),9,Ht)])],32),t("aside",_t,[e[70]||
3(e[70]=t("div",{class:"section-title"},[t("h2",null,"Что сохранится")],-1)),L.value?.preview?.after?.url||L.value?.style_example?.after?.url?(i(),o("div",jt,[L.value?.preview?.after?.url?(i(),o("div",qt,[e[68]||(e[68]=t("span",null,"Превью стиля",-1)),t("img",{src:L.value.preview.after.url,alt:""},null,8,Gt)])):v("",!0),L.value?.style_example?.after?.url?(i(),o("div",Jt,[e[69]||(e[69]=t("span",null,"Основной пример",-1)),t("img",{src:L.value.style_example.after.url,alt:""},null,8,Wt)])):v("",!0)])):v("",!0),t("pre",null,r(me.value),1)])])):(i(),o("section",Kt,[t("div",Qt,[e[76]||(e[76]=t("div",{class:"section-title"},[t("h2",null,"Стиль готов")],-1)),e[77]||(e[77]=t("div",{class:"notice success"}," Стиль создан. Подборка не создавалась — её можно будет сделать отдельным следующим этапом. ",-1)),t("div",Xt,[t("div",null,[e[71]||(e[71]=t("span",null,"Стиль",-1)),t("strong",null,r(n.value?.name),1)]),t("div",null,[e[72]||(e[72]=t("span",null,"Slug",-1)),t("strong",null,r(n.value?.slug),1)]),t("div",null,[e[73]||(e[73]=t("span",null,"Стиль URL",-1)),t("strong",null,r(ce.value),1)]),t("div",null,[e[74]||(e[74]=t("span",null,"Превью",-1)),t("strong",null,r(n.value?.preview||"—"),1)]),t("div",null,[e[75]||(e[75]=t("span",null,"Пример",-1)),t("strong",null,r(n.value?.exampleAfter||"—"),1)])]),t("div",Yt,[t("button",{type:"button",class:"secondary",onClick:e[28]||(e[28]=a=>y.value="publish")},"Назад"),t("button",{type:"button",class:"secondary",disabled:!w.value,onClick:Ce},"Создать подборку позже",8,Zt)])]),e[78]||(e[78]=t("aside",{class:"preview-panel"},[t("div",{class:"section-title"},[t("h2",null,"Дальше")]),t("div",{class:"empty"}," Следующий большой этап — отдельный генератор SEO-подборки для уже готового стиля. Там будут Wordstat, ключи и 4 примера. ")],-1))]))],64)):(i(),o("section",Be,[...e[29]||(e[29]=[t("h1",null,"Доступ закрыт",-1),t("p",null,"Эта страница доступна только администраторам.",-1)])]))]))}}),il=Ae(el,[["__scopeId","data-v-0cfb054d"]]);export{il as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.