PageSourceSearch

https://shagoved-quest.ru/_nuxt/DRUsOtKj.js

js shagoved-quest.ru collected 2026-10-04 19:35:52 UTC 20,017 bytes, 1 lines download raw bytes

1import{d as bt,s as yt,M as kt,r as b,c as g,D as wt,E as xt,j as u,o as d,a as nt,x as $,e as s,u as n,y as $t,F as H,q as I,B as m,A as a,f as v,N as D,O as L,Q as Dt,h as St}from"./7e7mg9J_.js";import{_ as Et}from"./D4Vr-p_r.js";import{u as Tt}from"./f7Tfqva6.js";import{R as O}from"./DMSc_yjk.js";import{r as Ct}from"./-sQIRI-c.js";import{u as Lt}from"./PynjT65R.js";import"./2kDxHsAx.js";import"./DsqdWQfm.js";import"./Dsn2rR9z.js";import"./Zfqpu24C.js";import"./CIJ7A4bt.js";import"./BSBkQZ3L.js";import"./JHwcUxjm.js";import"./CXPxXuHd.js";import"./B-5pc-m1.js";const Nt={class:"admin-screen settings-page"},Ut={class:"settings-layout"},Vt={class:"settings-nav","aria-label":"Разделы настроек"},Ht=["onClick"],It={class:"settings-nav__text"},Ot={class:"settings-nav__label"},Kt={class:"settings-nav__sub"},Mt={key:0,class:"settings-dirty-dot",title:"Есть несохранённые изменения"},Bt={class:"settings-sections"},Rt={class:"settings-section__head"},jt={key:0,class:"settings-changed"},At={class:"settings-section__body"},Pt=["aria-checked"],Jt={class:"settings-switch-card__text"},Ft={class:"settings-switch-card__hint"},Gt={class:"settings-section__head"},qt={class:"settings-section__heading"},Wt={class:"settings-section__eyebrow"},zt={class:"settings-section__title"},Yt={class:"settings-section__meta"},Qt={key:0,class:"settings-changed"},Xt=["href"],Zt={class:"settings-section__body settings-section__body--wide"},ts={class:"settings-seo"},ss={class:"settings-seo__fields"},es={class:"settings-field"},is=["onUpdate:modelValue","placeholder"],ns={class:"settings-field"},os=["onUpdate:modelValue","placeholder"],ls={class:"settings-field"},as=["onUpdate:modelValue","placeholder"],cs={class:"settings-seo__preview"},rs={class:"settings-snippet"},_s={class:"settings-snippet__url"},ds={class:"settings-snippet__title"},us={class:"settings-snippet__desc"},ps={class:"settings-field"},gs={class:"settings-field__label"},ms={class:"settings-section__head"},vs={key:0,class:"settings-changed"},hs={class:"settings-section__body"},fs={class:"settings-field settings-gift"},bs=["value"],ys={class:"settings-section__head"},ks={key:0,class:"settings-changed"},ws={class:"settings-section__body settings-section__body--voice"},xs={class:"settings-group"},$s={class:"settings-grid settings-grid--260"},Ds={class:"settings-field"},Ss={class:"settings-affix"},Es=["type"],Ts={class:"settings-field"},Cs={class:"settings-group"},Ls={class:"settings-grid settings-grid--220"},Ns=["aria-checked","onClick"],Us={class:"settings-model__head"},Vs={class:"settings-model__label"},Hs={class:"settings-model__hint"},Is={class:"settings-group"},Os={class:"settings-grid settings-grid--280"},Ks={class:"settings-slider__head"},Ms={class:"settings-slider__label"},Bs={class:"settings-slider__value"},Rs=["onUpdate:modelValue","min","max","step"],js={class:"settings-slider__scale"},As=["aria-checked"],Ps={key:1,class:"settings-muted"},Js={class:"settings-savebar__status"},Fs={class:"settings-savebar__actions"},Gs=["disabled"],qs=["disabled"],Ws=bt({__name:"settings",setup(zs){const h=[{key:"menu",label:"Меню сайта",sub:"Пункты в шапке"},{key:"home",label:"Главная",sub:"SEO и текст"},{key:"catalog",label:"Каталог",sub:"SEO и текст"},{key:"gift",label:"Сертификат",sub:"Цена подарка"},{key:"voice",label:"Озвучка",sub:"Голос ElevenLabs"}],ot=[{key:"home",n:"02",title:"Главная страница",path:"",textWhere:"внизу главной, над подвалом",phTitle:"Квесты в Москве — городские квест-прогулки | Шаговед",phDesc:"Короткое описание страницы для поиска и соцсетей",phH1:"Городские квесты без гида",phHtml:"Пара абзацев о проекте для поисковиков…"},{key:"catalog",n:"03",title:"Каталог квестов",path:"/q",textWhere:"под списком квестов",phTitle:"Каталог квестов | Шаговед",phDesc:"Короткое описание страницы для поиска и соцсетей",phH1:"Каталог квестов",phHtml:"Расскажите, какие квесты есть и чем они отличаются…"}],J=[{value:"eleven_multilingual_v2",label:"Multilingual v2",hint:"Стабильная, предсказуемая. Хороша для длинных текстов квестов."},{value:"eleven_v3",label:"Eleven v3",hint:"Живее и эмоциональнее, но иногда «переигрывает». Проверяйте на слух."}],F=[{key:"stability",label:"Стабильность",min:0,max:1,step:.
105,lo:"живее, эмоциональнее",hi:"ровнее, монотоннее"},{key:"similarity_boost",label:"Похожесть",min:0,max:1,step:.05,lo:"свободнее",hi:"точно как образец"},{key:"style",label:"Выразительность",min:0,max:1,step:.05,lo:"нейтрально",hi:"ярко, с актёрством"},{key:"speed",label:"Скорость",min:.7,max:1.2,step:.05,lo:"медленнее",hi:"быстрее"}],{$toast:S}=yt(),lt=kt(),{getSetting:at,updateSetting:p}=Tt(),G=String(lt.public.webUrl||"").replace(/\/$/,""),K=G.replace(/^https?:\/\//,"")||"shagoved.ru",q=()=>({metaTitle:"",metaDescription:"",h1:"",html:""}),E=e=>JSON.parse(JSON.stringify(e)),N=e=>e==="<p><br></p>"?"":e,W=(e,t)=>{const l=e[t];return JSON.stringify("html"in l?{...l,html:N(l.html)}:l)},o=b({menu:{routes:!1},home:q(),catalog:q(),gift:{price:"1000"},voice:{apiKey:"",voiceId:"",model:"eleven_multilingual_v2",stability:.5,similarity_boost:.75,style:0,speed:1,use_speaker_boost:!0}}),f=b(E(o.value)),M=b(!0),y=b(!1),B=b("menu"),U=b(!1),R=b(0),j={};let A=0;const T=g(()=>h.map(e=>e.key).filter(e=>W(o.value,e)!==W(f.value,e))),k=g(()=>Object.fromEntries(h.map(e=>[e.key,T.value.includes(e.key)]))),w=g(()=>T.value.length>0),z=g(()=>o.value.voice.model==="eleven_v3"),ct=g(()=>z.value?F.filter(e=>e.key==="stability"):F),rt=(e,t,l,r)=>{const i=e%10,c=e%100;return i===1&&c!==11?t:i>=2&&i<=4&&(c<12||c>14)?l:r},Y=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e,Q=(e,t)=>{const l=e.length,r=l>t?" · обрежется в выдаче":l?"":" · не заполнено";return`${l} / ${t}${r}`},X=(e,t)=>e.length>t?"settings-count--over":e.length?"settings-count--ok":"",_t=e=>{const t=Number(o.value.voice[e]);return e==="speed"?`${t.toFixed(2)}×`:t.toFixed(2)},C=g(()=>{const e=o.value.gift.price;if(!e)return"Укажите цену";const t=Number(e);return!Number.isFinite(t)||t<=0?"Цена должна быть больше нуля":""}),dt=g(()=>C.value?C.value:k.value.gift?`Было ${Number(f.value.gift.price).toLocaleString("ru-RU")} ₽ · новые покупки по новой цене`:"Уже купленные сертификаты не меняются"),ut=e=>{o.value.gift.price=e.target.value.replace(/[^\d]/g,"")},pt=(e,t)=>{Date.now()-A<400&&N(o.value[e].html)===N(f.value[e].html)&&(f.value[e].html=t),o.value[e].html=t},gt=async()=>{try{M.value=!0;const e=[O,"home_meta_title","home_meta_description","home_h1","home_seo_html","catalog_meta_title","catalog_meta_description","catalog_h1","catalog_seo_html","gift_price","tts_api_key","tts_voice_id","tts_model","tts_voice_settings"],t=await Promise.all(e.map(_=>at(_))),l=_=>{var x;return((x=t[e.indexOf(_)])==null?void 0:x.value)??""},r=E(o.value);r.menu.routes=l(O)==="1";for(const _ of["home","catalog"])r[_]={metaTitle:l(`${_}_meta_title`),metaDescription:l(`${_}_meta_description`),h1:l(`${_}_h1`),html:l(`${_}_seo_html`)};r.gift.price=String(Number(l("gift_price"))||1e3),r.voice.apiKey=l("tts_api_key"),r.voice.voiceId=l("tts_voice_id");const i=l("tts_model");J.some(_=>_.value===i)&&(r.voice.model=i);const c=l("tts_voice_settings");if(c)try{const _=JSON.parse(c);for(const x of["stability","similarity_boost","style","speed"])typeof _[x]=="number"&&(r.voice[x]=_[x]);typeof _.use_speaker_boost=="boolean"&&(r.voice.use_speaker_boost=_.use_speaker_boost)}catch(_){console.error("Не удалось разобрать tts_voice_settings",_)}o.value=r,f.value=E(r),A=Date.now(),R.value+=1}catch(e){console.error(e),S.error("Ошибка загрузки настроек")}finally{M.value=!1}},mt=async e=>{const t=o.value;e==="menu"?(await p(O,t.menu.routes?"1":"0"),await Ct(O)):e==="home"||e==="catalog"?(t[e].metaTitle=t[e].metaTitle.trim(),t[e].metaDescription=t[e].metaDescription.trim(),t[e].h1=t[e].h1.trim(),await Promise.all([p(`${e}_meta_title`,t[e].metaTitle),p(`${e}_meta_description`,t[e].metaDescription),p(`${e}_h1`,t[e].h1),p(`${e}_seo_html`,N(t[e].html))])):e==="gift"?(t.gift.price=String(Math.round(Number(t.gift.price))),await p("gift_price",t.gift.price)):await Promise.all([p("tts_api_key",t.voice.apiKey),p("tts_voice_id",t.voice.voiceId),p("tts_model",t.voice.model),p("tts_voice_settings",JSON.stringify({stability:t.voice.stability,similarity_boost:t.voice.similarity_boost,style:t.voice.style,speed:t.voice.speed,use_speaker_boost:t.voice.use_speaker_boost}))]),f.value[e]=E(t[e])},P=e=>h.find(t=>t.key===e).label,Z=async()=>{const e=[...T.value];if(!e.length||y.value)return;if(e.includes("gift")&&C.value){S.error("Проверьте цену сертификата"),tt("gift");return}y.value=!0;const t=await Promise.allSettled(e.map(mt));y.value=!1;const l=e.filter((i,c)=>t[c].status==="rejected"),r=e.filter(i=>!l.includes(i));t.forEach(i=>
1i.status==="rejected"&&console.error(i.reason)),r.length&&S.success(`Сохранено: ${r.map(i=>P(i).toLowerCase()).join(", ")}`),l.length&&S.error(`Не сохранено: ${l.map(P).join(", ")}`)},vt=()=>{w.value&&(o.value=E(f.value),A=Date.now(),R.value+=1,S.info("Изменения отменены"))},ht=g(()=>w.value?`Не сохранено: ${T.value.map(P).join(", ")}`:"Все изменения сохранены"),ft=g(()=>{if(y.value)return"Сохраняем…";const e=T.value.length;return e>1?`Сохранить ${e} ${rt(e,"раздел","раздела","разделов")}`:"Сохранить"}),V=(e,t)=>{t instanceof HTMLElement&&(j[e]=t)},tt=e=>{const t=j[e];t&&window.scrollTo({top:t.getBoundingClientRect().top+window.scrollY-20,behavior:"smooth"}),B.value=e},st=()=>{let e=h[0].key;for(const t of h){const l=j[t.key];l&&l.getBoundingClientRect().top<140&&(e=t.key)}window.innerHeight+window.scrollY>=document.documentElement.scrollHeight-4&&(e=h[h.length-1].key),B.value=e},et=e=>{(e.ctrlKey||e.metaKey)&&e.key.toLowerCase()==="s"&&(e.preventDefault(),Z())},it=e=>{w.value&&e.preventDefault()};return wt(()=>{window.addEventListener("keydown",et),window.addEventListener("scroll",st,{passive:!0}),window.addEventListener("beforeunload",it)}),xt(()=>{window.removeEventListener("keydown",et),window.removeEventListener("scroll",st),window.removeEventListener("beforeunload",it)}),gt(),Lt("Настройки","Настройки","admin-settings"),(e,t)=>{const l=$t,r=Et;return d(),u("div",Nt,[n(M)?(d(),nt(l,{key:0})):$("",!0),t[29]||(t[29]=s("header",{class:"admin-screen__heading"},[s("span",{class:"admin-screen__eyebrow"},"Сайт · страницы · продажи · озвучка"),s("h1",{class:"admin-screen__title"},"Настройки")],-1)),s("div",Ut,[s("nav",Vt,[(d(),u(H,null,I(h,i=>s("button",{key:i.key,class:m(["settings-nav__item",{"settings-nav__item--active":n(B)===i.key}]),type:"button",onClick:c=>tt(i.key)},[s("span",It,[s("span",Ot,a(i.label),1),s("span",Kt,a(i.sub),1)]),n(k)[i.key]?(d(),u("span",Mt)):$("",!0)],10,Ht)),64))]),s("div",Bt,[s("section",{ref:i=>V("menu",i),class:"settings-section"},[s("div",Rt,[t[5]||(t[5]=s("div",{class:"settings-section__heading"},[s("span",{class:"settings-section__eyebrow"},"01 · Сайт"),s("strong",{class:"settings-section__title"},"Меню сайта")],-1)),n(k).menu?(d(),u("span",jt,"Изменено")):$("",!0)]),s("div",At,[s("button",{class:"settings-switch-card",type:"button",role:"switch","aria-checked":n(o).menu.routes,onClick:t[0]||(t[0]=i=>n(o).menu.routes=!n(o).menu.routes)},[s("span",{class:m(["settings-switch",{"settings-switch--on":n(o).menu.routes}])},[...t[6]||(t[6]=[s("span",{class:"settings-switch__knob"},null,-1)])],2),s("span",Jt,[t[7]||(t[7]=s("span",{class:"settings-switch-card__title"},"Пункт «Маршруты»",-1)),s("span",Ft,a(n(o).menu.routes?"Показывается в шапке, подвале и мобильном меню":"Скрыт везде — страницы маршрутов открываются только по прямой ссылке"),1)])],8,Pt)])],512),(d(),u(H,null,I(ot,i=>s("section",{key:i.key,ref_for:!0,ref:c=>V(i.key,c),class:"settings-section"},[s("div",Gt,[s("div",qt,[s("span",Wt,a(i.n)+" · Страницы",1),s("strong",zt,a(i.title),1)]),s("div",Yt,[n(k)[i.key]?(d(),u("span",Qt,"Изменено")):$("",!0),s("a",{class:"settings-link",href:`${n(G)}${i.path}`,target:"_blank",rel:"noopener"},[v(a(n(K))+a(i.path)+" ",1),t[8]||(t[8]=s("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2.2","stroke-linecap":"round","stroke-linejoin":"round","aria-hidden":"true"},[s("path",{d:"M7 17L17 7M9 7h8v8"})],-1))],8,Xt)])]),s("div",Zt,[s("div",ts,[s("div",ss,[s("label",es,[t[9]||(t[9]=s("span",{class:"settings-field__label"},[v("Title "),s("em",null,"заголовок во вкладке и в поиске")],-1)),D(s("input",{"onUpdate:modelValue":c=>n(o)[i.key].metaTitle=c,class:"settings-input",type:"text",placeholder:i.phTitle},null,8,is),[[L,n(o)[i.key].metaTitle]]),s("span",{class:m(["settings-count",X(n(o)[i.key].metaTitle,60)])},a(Q(n(o)[i.key].metaTitle,60)),3)]),s("label",ns,[t[10]||(t[10]=s("span",{class:"settings-field__label"},[v("Description "),s("em",null,"текст под заголовком в поиске")],-1)),D(s("textarea",{"onUpdate:modelValue":c=>n(o)[i.key].metaDescription=c,class:"settings-input settings-input--area",rows:"3",placeholder:i.phDesc},null,8,os),[[L,n(o)[i.key].metaDescription]]),s("span",{class:m(["settings-count",X(n(o)[i.key].metaDescription,160)])},a(Q(n(o)[i.key].metaDescription,160)),3)]),s("label",ls,[t[11]||(t[11]=s("span",{class:"settings-field__label"},[v("H1 "),s("em",null,"крупный заголовок на странице")],-1)),D(s("input",{"onUpdate:modelValue":c=>n(o)[i.key].h1=c,class:"settings-input",type:"text",placeholder:i.phH1},null,8,as),[[L,n(o)[i.key].h1]])])]),s("div",cs,[t[12]||(t[12]=s("span",{class:"settings-muted"},"Так увидят в Яндексе и Google",-1)),s("div",rs,[s("span",_s,a(i.path?`${n(K)} › ${i.path.replace(/^\//,"")}`:n(K)),1),s("span",ds,a(Y(n(o)[i.key].metaTitle.trim()||i.phTitle,60)),1),s("span",us,a(Y(n(o)[i.key].metaDescription.trim()||i.phDesc,160)),1)]),t[13]||(t[13]=s("span",{class:"settings-muted"},"Пустое поле — на сайте будет серый текст-подсказка из поля.",-1))])]),s("div",ps,[s("span",gs,[t[14]||(t[14]=v("Текстовый блок ",-1)),s("em",null,a(i.textWhere),1)]),(d(),nt(r,{key:`${i.key}-${n(R)}`,class:"settings-rich",content:n(o)[i.key].html,placeholder:i.phHtml,"onUpdate:content":c=>pt(i.key,c)},null,8,["content","placeholder","onUpdate:content"]))])])])),64)),s("section",{ref:i=>V("gift",i),class:"settings-section"},[s("div",ms,[t[15]||(t[15]=s("div",{class:"settings-section__heading"},[s("span",{class:"settings-section__eyebrow"},"04 · Продажи"),s("strong",{class:"settings-section__title"},"Подарочный сертификат")],-1)),n(k).gift?(d(),u("span",vs,"Изменено")):$("",!0)]),s("div",hs,[s("label",fs,[t[17]||(t[17]=s("span",{class:"settings-field__label"},"Цена",-1)),s("span",{class:m(["settings-affix",{"settings-affix--error":n(C)}])},[s("input",{value:n(o).gift.price,class:"settings-affix__input settings-affix__input--price",type:"text",inputmode:"numeric",placeholder:"1000",onInput:ut},null,40,bs),t[16]||(t[16]=s("span",{class:"settings-affix__suffix"},"₽",-1))],2),s("span",{class:m(["settings-hint",{"settings-hint--error":n(C)}])}
1,a(n(dt)),3)])])],512),s("section",{ref:i=>V("voice",i),class:"settings-section"},[s("div",ys,[t[18]||(t[18]=s("div",{class:"settings-section__heading"},[s("span",{class:"settings-section__eyebrow"},"05 · Озвучка"),s("strong",{class:"settings-section__title"},"Голос ElevenLabs")],-1)),n(k).voice?(d(),u("span",ks,"Изменено")):$("",!0)]),s("div",ws,[s("div",xs,[t[21]||(t[21]=s("span",{class:"settings-group__title"},"Подключение",-1)),s("div",$s,[s("label",Ds,[t[19]||(t[19]=s("span",{class:"settings-field__label"},"API-ключ",-1)),s("span",Ss,[D(s("input",{"onUpdate:modelValue":t[1]||(t[1]=i=>n(o).voice.apiKey=i),class:"settings-affix__input settings-affix__input--mono",type:n(U)?"text":"password",placeholder:"xi-api-key",autocomplete:"off"},null,8,Es),[[Dt,n(o).voice.apiKey,void 0,{trim:!0}]]),s("button",{class:"settings-affix__button",type:"button",onClick:t[2]||(t[2]=i=>U.value=!n(U))},a(n(U)?"Скрыть":"Показать"),1)])]),s("label",Ts,[t[20]||(t[20]=s("span",{class:"settings-field__label"},[v("Voice ID "),s("em",null,"из библиотеки голосов")],-1)),D(s("input",{"onUpdate:modelValue":t[3]||(t[3]=i=>n(o).voice.voiceId=i),class:"settings-input settings-input--mono",type:"text",placeholder:"ID голоса"},null,512),[[L,n(o).voice.voiceId,void 0,{trim:!0}]])])])]),s("div",Cs,[t[23]||(t[23]=s("span",{class:"settings-group__title"},"Модель",-1)),s("div",Ls,[(d(),u(H,null,I(J,i=>s("button",{key:i.value,class:m(["settings-model",{"settings-model--active":n(o).voice.model===i.value}]),type:"button",role:"radio","aria-checked":n(o).voice.model===i.value,onClick:c=>n(o).voice.model=i.value},[s("span",Us,[s("span",Vs,a(i.label),1),t[22]||(t[22]=s("span",{class:"settings-model__radio"},null,-1))]),s("span",Hs,a(i.hint),1)],10,Ns)),64))])]),s("div",Is,[t[26]||(t[26]=s("span",{class:"settings-group__title"},"Характер голоса",-1)),s("div",Os,[(d(!0),u(H,null,I(n(ct),i=>(d(),u("label",{key:i.key,class:"settings-slider"},[s("span",Ks,[s("span",Ms,[v(a(i.label)+" ",1),s("em",null,a(i.key),1)]),s("span",Bs,a(_t(i.key)),1)]),D(s("input",{"onUpdate:modelValue":c=>n(o).voice[i.key]=c,type:"range",min:i.min,max:i.max,step:i.step},null,8,Rs),[[L,n(o).voice[i.key],void 0,{number:!0}]]),s("span",js,[s("span",null,a(i.lo),1),s("span",null,a(i.hi),1)])]))),128))]),n(z)?(d(),u("span",Ps,"В Eleven v3 настраивается только стабильность.")):(d(),u("button",{key:0,class:"settings-switch-card settings-switch-card--soft",type:"button",role:"switch","aria-checked":n(o).voice.use_speaker_boost,onClick:t[4]||(t[4]=i=>n(o).voice.use_speaker_boost=!n(o).voice.use_speaker_boost)},[s("span",{class:m(["settings-switch",{"settings-switch--on":n(o).voice.use_speaker_boost}])},[...t[24]||(t[24]=[s("span",{class:"settings-switch__knob"},null,-1)])],2),t[25]||(t[25]=s("span",{class:"settings-switch-card__text"},[s("span",{class:"settings-switch-card__title settings-switch-card__title--sm"},[v("Усиление сходства "),s("em",null,"speaker boost")]),s("span",{class:"settings-switch-card__hint"},"Голос точнее, но генерация чуть медленнее")],-1))],8,As))])])],512)])]),s("div",{class:m(["settings-savebar",{"settings-savebar--dirty":n(w)}])},[s("span",Js,[t[27]||(t[27]=s("span",{class:"settings-savebar__dot"},null,-1)),v(a(n(ht)),1)]),s("div",Fs,[t[28]||(t[28]=s("span",{class:"settings-savebar__kbd"},"Ctrl + S",-1)),s("button",{class:"settings-outline-button settings-outline-button--soft",type:"button",disabled:!n(w)||n(y),onClick:vt}," Отменить ",8,Gs),s("button",{class:"settings-save",type:"button",disabled:!n(w)||n(y),onClick:Z},a(n(ft)),9,qs)])],2)])}}}),de=St(Ws,[["__scopeId","data-v-70672f4d"]]);export{de 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.