PageSourceSearch

https://nordic-builder.store/assets/index-BJ6UbxY6.js

js nordic-builder.store collected 2026-10-08 07:36:20 UTC 320,077 bytes, 295 lines download raw bytes

1const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LandingPage-D26G33Go.js","assets/vendor-react-mX6VfREx.js","assets/vendor-jszip-G5TR8LEN.js","assets/vendor-router-DCNp9A5p.js","assets/templatesApi-DnwMzcbE.js","assets/SiteHeader-DvHdCkZA.js","assets/SiteFooter-Mp-gMsOB.js","assets/NbIcon-DIGIWiw3.js","assets/plus-Bqyk6sei.js","assets/vendor-zustand-oQhXwVTt.js","assets/BlogPage-tTDeY6R2.js","assets/Breadcrumbs-aHR8nCy2.js","assets/BlogPostPage-C8B-Q2c0.js","assets/vendor-tiptap-CH6BTgoX.js","assets/VideoEmbedExtension-BBDbe5hf.js","assets/EditorPage-CuILf-8l.js","assets/Header-DUOCwbLk.js","assets/adminTemplatesApi-BIpI1MEU.js","assets/templatesCategoriesRegistry-DI88VFBo.js","assets/BlockRegistry-BWFal0S2.js","assets/vendor-html2canvas-5Cw11iw4.js","assets/SectionBackgroundMediaFrame-BMygU2CE.js","assets/SectionBackgroundMediaLayer-WGfAS7DC.js","assets/blockCategories-DY8u2kio.js","assets/DesignBlock02PropertiesPanel-wrSeukcl.js","assets/useAssetUrlResolver-Dj5-QGcr.js","assets/mediaGalleryStore-B8MBeafA.js","assets/LinkFieldRenderer-T0_fK4kS.js","assets/elementOverrideStyles-BHdViA8y.js","assets/SchemaBasedSettings-WmoK6GkR.js","assets/richText-CZco19BV.js","assets/inlineImagePlaceholders-Be5j839V.js","assets/overrides-C0Dj4vJU.js","assets/sectionSkinTokensSchema-CFEjl094.js","assets/cardSurfaceStyle-gCdeEMWh.js","assets/SeoAssistantPanel-De1Kg1m8.js","assets/AccountPage-DJIZlg6l.js","assets/AdminPage-Ba5Og8dx.js","assets/renderPageStaticHtml-DNQAy78p.js","assets/EditableText-Djn4eWaG.js","assets/UsersPage-FmlTvUeT.js","assets/ProPage-CAZYuumv.js","assets/PollPage-1DWwpuUx.js","assets/OfferPage-mPc1ald0.js","assets/DocsPage-H_5z2haS.js","assets/TemplatesPage-gtqmLHCM.js","assets/TemplatesDemoPage-BJWoO9ab.js","assets/BlockPreviewsPage-DxpXKQN-.js","assets/TypographySmokePage-DEn4DljZ.js","assets/ProtoPage-DsrPfFo4.js","assets/SeoLandingPage-bbrXjyrf.js","assets/SeoLandingsIndexPage-Be_Mi-7g.js","assets/SiteMapPage-V3Z_PwCn.js","assets/SeoAuditPage-CGqZDYB8.js","assets/NotFoundPage-jZ5iamLK.js","assets/MediaGalleryModals-Cu457miS.js","assets/optimizeImage-CjbCtKMk.js","assets/HelpIndexPage-CNkdupWZ.js","assets/InfoCard-Bj4EkqPd.js","assets/clsx-B-dksMZM.js","assets/HelpQuickStartPage-Ba-BMw7C.js","assets/HelpTranslationsPage-BnPCGG5f.js","assets/HelpPhilosophyPage-0Yz5sJLL.js","assets/HelpArchitecturePage-7u0_ZOeh.js","assets/HelpExportSeoPage-MJGNKK6q.js","assets/HelpExportPage-wdos-DK4.js","assets/HelpSeoPrerenderPage-YyeWcXnb.js","assets/HelpDesignSystemPage-COrnyDj6.js","assets/HelpDesignBlockPage-BRhi2lop.js","assets/HelpServiceSiteStructurePage-Dl75F3wa.js","assets/HelpAiTextsPage-CdXGsQMD.js","assets/HelpPrePublishChecklistPage-DK79OXEg.js","assets/HelpYandexDirectPage-m2zGzT1u.js"])))=>i.map(i=>d[i]);
2import{r as x,j as g,e as Gi,a as Ji}from"./vendor-react-mX6VfREx.js";import{u as vi,B as Wi,R as Ki,a as z}from"./vendor-router-DCNp9A5p.js";import{c as le,p as Yi}from"./vendor-zustand-oQhXwVTt.js";import"./vendor-jszip-G5TR8LEN.js";(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))s(n);new MutationObserver(n=>{for(const r of n)if(r.type==="childList")for(const a of r.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&s(a)}).observe(document,{childList:!0,subtree:!0});function i(n){const r={};return n.integrity&&(r.integrity=n.integrity),n.referrerPolicy&&(r.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?r.credentials="include":n.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(n){if(n.ep)return;n.ep=!0;const r=i(n);fetch(n.href,r)}})();const Xi="modulepreload",tn=function(t){return"/"+t},ni={},j=function(e,i,s){let n=Promise.resolve();if(i&&i.length>0){let a=function(c){return Promise.all(c.map(d=>Promise.resolve(d).then(f=>({status:"fulfilled",value:f}),f=>({status:"rejected",reason:f}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));n=a(i.map(c=>{if(c=tn(c),c in ni)return;ni[c]=!0;const d=c.endsWith(".css"),f=d?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${f}`))return;const u=document.createElement("link");if(u.rel=d?"stylesheet":Xi,d||(u.as="script"),u.crossOrigin="",u.href=c,l&&u.setAttribute("nonce",l),document.head.appendChild(u),d)return new Promise((p,y)=>{u.addEventListener("load",p),u.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${c}`)))})}))}function r(a){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=a,window.dispatchEvent(o),!o.defaultPrevented)throw a}return n.then(a=>{for(const o of a||[])o.status==="rejected"&&r(o.reason);return e().catch(r)})};let en={data:""},nn=t=>{if(typeof window=="object"){let e=(t?t.querySelector("#_goober"):window._goober)||Object.assign(document.createElement("style"),{innerHTML:" ",id:"_goober"});return e.nonce=window.__nonce__,e.parentNode||(t||document.head).appendChild(e),e.firstChild}return t||en},sn=/(?:([\u0080-\uFFFF\w-%@]+) *:? *([^{;]+?);|([^;}{]*?) *{)|(}\s*)/g,rn=/\/\*[^]*?\*\/|  +/g,si=/\n+/g,wt=(t,e)=>{let i="",s="",n="";for(let r in t){let a=t[r];r[0]=="@"?r[1]=="i"?i=r+" "+a+";":s+=r[1]=="f"?wt(a,r):r+"{"+wt(a,r[1]=="k"?"":e)+"}":typeof a=="object"?s+=wt(a,e?e.replace(/([^,])+/g,o=>r.replace(/([^,]*:\S+\([^)]*\))|([^,])+/g,l=>/&/.test(l)?l.replace(/&/g,o):o?o+" "+l:l)):r):a!=null&&(r=/^--/.test(r)?r:r.replace(/[A-Z]/g,"-$&").toLowerCase(),n+=wt.p?wt.p(r,a):r+":"+a+";")}return i+(e&&n?e+"{"+n+"}":n)+s},kt={},wi=t=>{if(typeof t=="object"){let e="";for(let i in t)e+=i+wi(t[i]);return e}return t},an=(t,e,i,s,n)=>{let r=wi(t),a=kt[r]||(kt[r]=(l=>{let c=0,d=11;for(;c<l.length;)d=101*d+l.charCodeAt(c++)>>>0;return"go"+d})(r));if(!kt[a]){let l=r!==t?t:(c=>{let d,f,u=[{}];for(;d=sn.exec(c.replace(rn,""));)d[4]?u.shift():d[3]?(f=d[3].replace(si," ").trim(),u.unshift(u[0][f]=u[0][f]||{})):u[0][d[1]]=d[2].replace(si," ").trim();return u[0]})(t);kt[a]=wt(n?{["@keyframes "+a]:l}:l,i?"":"."+a)}let o=i&&kt.g?kt.g:null;return i&&(kt.g=kt[a]),((l,c,d,f)=>{f?c.data=c.data.replace(f,l):c.data.indexOf(l)===-1&&(c.data=d?l+c.data:c.data+l)})(kt[a],e,s,o),a},on=(t,e,i)=>t.reduce((s,n,r)=>
2{let a=e[r];if(a&&a.call){let o=a(i),l=o&&o.props&&o.props.className||/^go/.test(o)&&o;a=l?"."+l:o&&typeof o=="object"?o.props?"":wt(o,""):o===!1?"":o}return s+n+(a??"")},"");function ce(t){let e=this||{},i=t.call?t(e.p):t;return an(i.unshift?i.raw?on(i,[].slice.call(arguments,1),e.p):i.reduce((s,n)=>Object.assign(s,n&&n.call?n(e.p):n),{}):i,nn(e.target),e.g,e.o,e.k)}let Ai,_e,Pe;ce.bind({g:1});let xt=ce.bind({k:1});function ln(t,e,i,s){wt.p=e,Ai=t,_e=i,Pe=s}function Pt(t,e){let i=this||{};return function(){let s=arguments;function n(r,a){let o=Object.assign({},r),l=o.className||n.className;i.p=Object.assign({theme:_e&&_e()},o),i.o=/ *go\d+/.test(l),o.className=ce.apply(i,s)+(l?" "+l:"");let c=t;return t[0]&&(c=o.as||t,delete o.as),Pe&&c[0]&&Pe(o),Ai(c,o)}return n}}var cn=t=>typeof t=="function",se=(t,e)=>cn(t)?t(e):t,dn=(()=>{let t=0;return()=>(++t).toString()})(),_i=(()=>{let t;return()=>{if(t===void 0&&typeof window<"u"){let e=matchMedia("(prefers-reduced-motion: reduce)");t=!e||e.matches}return t}})(),un=20,qe="default",Pi=(t,e)=>{let{toastLimit:i}=t.settings;switch(e.type){case 0:return{...t,toasts:[e.toast,...t.toasts].slice(0,i)};case 1:return{...t,toasts:t.toasts.map(a=>a.id===e.toast.id?{...a,...e.toast}:a)};case 2:let{toast:s}=e;return Pi(t,{type:t.toasts.find(a=>a.id===s.id)?1:0,toast:s});case 3:let{toastId:n}=e;return{...t,toasts:t.toasts.map(a=>a.id===n||n===void 0?{...a,dismissed:!0,visible:!1}:a)};case 4:return e.toastId===void 0?{...t,toasts:[]}:{...t,toasts:t.toasts.filter(a=>a.id!==e.toastId)};case 5:return{...t,pausedAt:e.time};case 6:let r=e.time-(t.pausedAt||0);return{...t,pausedAt:void 0,toasts:t.toasts.map(a=>({...a,pauseDuration:a.pauseDuration+r}))}}},ee=[],Ii={toasts:[],pausedAt:void 0,settings:{toastLimit:un}},gt={},ji=(t,e=qe)=>{gt[e]=Pi(gt[e]||Ii,t),ee.forEach(([i,s])=>{i===e&&s(gt[e])})},Ti=t=>Object.keys(gt).forEach(e=>ji(t,e)),pn=t=>Object.keys(gt).find(e=>gt[e].toasts.some(i=>i.id===t)),de=(t=qe)=>e=>{ji(e,t)},fn={blank:4e3,error:4e3,success:2e3,loading:1/0,custom:4e3},mn=(t={},e=qe)=>{let[i,s]=x.useState(gt[e]||Ii),n=x.useRef(gt[e]);x.useEffect(()=>(n.current!==gt[e]&&s(gt[e]),ee.push([e,s]),()=>{let a=ee.findIndex(([o])=>o===e);a>-1&&ee.splice(a,1)}),[e]);let r=i.toasts.map(a=>{var o,l,c;return{...t,...t[a.type],...a,removeDelay:a.removeDelay||((o=t[a.type])==null?void 0:o.removeDelay)||(t==null?void 0:t.removeDelay),duration:a.duration||((l=t[a.type])==null?void 0:l.duration)||(t==null?void 0:t.duration)||fn[a.type],style:{...t.style,...(c=t[a.type])==null?void 0:c.style,...a.style}}});return{...i,toasts:r}},hn=(t,e="blank",i)=>({createdAt:Date.now(),visible:!0,dismissed:!1,type:e,ariaProps:{role:"status","aria-live":"polite"},message:t,pauseDuration:0,...i,id:(i==null?void 0:i.id)||dn()}),Vt=t=>(e,i)=>{let s=hn(e,t,i);return de(s.toasterId||pn(s.id))({type:2,toast:s}),s.id},V=(t,e)=>Vt("blank")(t,e);V.error=Vt("error");V.success=Vt("success");V.loading=Vt("loading");V.custom=Vt("custom");V.dismiss=(t,e)=>{let i={type:3,toastId:t};e?de(e)(i):Ti(i)};V.dismissAll=t=>V.dismiss(void 0,t);V.remove=(t,e)=>{let i={type:4,toastId:t};e?de(e)(i):Ti(i)};V.removeAll=t=>V.remove(void 0,t);V.promise=(t,e,i)=>{let s=V.loading(e.loading,{...i,...i==null?void 0:i.loading});return typeof t=="function"&&(t=t()),t.then(n=>{let r=e.success?se(e.success,n):void 0;return r?V.success(r,{id:s,...i,...i==null?void 0:i.success}):V.dismiss(s),n}).catch(n=>{let r=e.error?se(e.error,n):void 0;r?V.error(r,{id:s,...i,...i==null?void 0:i.error}):V.dismiss(s)}),t};var gn=1e3,yn=(t,e="default")=>{let{toasts:i,pausedAt:s}=mn(t,e),n=x.useRef(new Map).current,r=x.useCallback((f,u=gn)=>{if(n.has(f))return;let p=setTimeout(()=>{n.delete(f),a({type:4,toastId:f})},u);n.set(f,p)},[]);x.useEffect(()=>{if(s)return;let f=Date.now(),u=i.map(p=>{if(p.duration===1/0)return;let y=(p.duration||0)+p.pauseDuration-(f-p.createdAt);if(y<0){p.visible&&V.dismiss(p.id);return}return setTimeout(()=>V.dismiss(p.id,e),y)});return()=>{u.forEach(p=>p&&clearTimeout(p))}},[i,s,e]);let a=x.useCallback(de(e),[e]),o=x.useCallback(()=>{a({type:5,time:Date.now()})},[a]),l=x.useCallback((f,u)=>{a({type:1,toast:{id:f,height:u}})},[a]),c=x.useCallback(()=>{s&&a({type:6,time:Date.now()})},[s,a]),d=x.useCallback((f,u)=>{let{reverseOrder:p=!1,gutter:y=8,defaultPosition:m}=u||{},b=i.filter(v=>(v.position||m)===(f.position||m)&&v.height),h=b.findIndex(v=>v.id===f.id),P=b.filter((v,A)=>A<h&&v.visible).length;
2return b.filter(v=>v.visible).slice(...p?[P+1]:[0,P]).reduce((v,A)=>v+(A.height||0)+y,0)},[i]);return x.useEffect(()=>{i.forEach(f=>{if(f.dismissed)r(f.id,f.removeDelay);else{let u=n.get(f.id);u&&(clearTimeout(u),n.delete(f.id))}})},[i,r]),{toasts:i,handlers:{updateHeight:l,startPause:o,endPause:c,calculateOffset:d}}},bn=xt`
3from {
4  transform: scale(0) rotate(45deg);
5	opacity: 0;
6}
7to {
8 transform: scale(1) rotate(45deg);
9  opacity: 1;
10}`,Sn=xt`
11from {
12  transform: scale(0);
13  opacity: 0;
14}
15to {
16  transform: scale(1);
17  opacity: 1;
18}`,kn=xt`
19from {
20  transform: scale(0) rotate(90deg);
21	opacity: 0;
22}
23to {
24  transform: scale(1) rotate(90deg);
25	opacity: 1;
26}`,xn=Pt("div")`
27  width: 20px;
28  opacity: 0;
29  height: 20px;
30  border-radius: 10px;
31  background: ${t=>t.primary||"#ff4b4b"};
32  position: relative;
33  transform: rotate(45deg);
34
35  animation: ${bn} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)
36    forwards;
37  animation-delay: 100ms;
38
39  &:after,
40  &:before {
41    content: '';
42    animation: ${Sn} 0.15s ease-out forwards;
43    animation-delay: 150ms;
44    position: absolute;
45    border-radius: 3px;
46    opacity: 0;
47    background: ${t=>t.secondary||"#fff"};
48    bottom: 9px;
49    left: 4px;
50    height: 2px;
51    width: 12px;
52  }
53
54  &:before {
55    animation: ${kn} 0.15s ease-out forwards;
56    animation-delay: 180ms;
57    transform: rotate(90deg);
58  }
59`,vn=xt`
60  from {
61    transform: rotate(0deg);
62  }
63  to {
64    transform: rotate(360deg);
65  }
66`,wn=Pt("div")`
67  width: 12px;
68  height: 12px;
69  box-sizing: border-box;
70  border: 2px solid;
71  border-radius: 100%;
72  border-color: ${t=>t.secondary||"#e0e0e0"};
73  border-right-color: ${t=>t.primary||"#616161"};
74  animation: ${vn} 1s linear infinite;
75`,An=xt`
76from {
77  transform: scale(0) rotate(45deg);
78	opacity: 0;
79}
80to {
81  transform: scale(1) rotate(45deg);
82	opacity: 1;
83}`,_n=xt`
840% {
85	height: 0;
86	width: 0;
87	opacity: 0;
88}
8940% {
90  height: 0;
91	width: 6px;
92	opacity: 1;
93}
94100% {
95  opacity: 1;
96  height: 10px;
97}`,Pn=Pt("div")`
98  width: 20px;
99  opacity: 0;
100  height: 20px;
101  border-radius: 10px;
102  background: ${t=>t.primary||"#61d345"};
103  position: relative;
104  transform: rotate(45deg);
105
106  animation: ${An} 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275)
107    forwards;
108  animation-delay: 100ms;
109  &:after {
110    content: '';
111    box-sizing: border-box;
112    animation: ${_n} 0.2s ease-out forwards;
113    opacity: 0;
114    animation-delay: 200ms;
115    position: absolute;
116    border-right: 2px solid;
117    border-bottom: 2px solid;
118    border-color: ${t=>t.secondary||"#fff"};
119    bottom: 6px;
120    left: 6px;
121    height: 10px;
122    width: 6px;
123  }
124`,In=Pt("div")`
125  position: absolute;
126`,jn=Pt("div")`
127  position: relative;
128  display: flex;
129  justify-content: center;
130  align-items: center;
131  min-width: 20px;
132  min-height: 20px;
133`,Tn=xt`
134from {
135  transform: scale(0.6);
136  opacity: 0.4;
137}
138to {
139  transform: scale(1);
140  opacity: 1;
141}`,En=Pt("div")`
142  position: relative;
143  transform: scale(0.6);
144  opacity: 0.4;
145  min-width: 20px;
146  animation: ${Tn} 0.3s 0.12s cubic-bezier(0.175, 0.885, 0.32, 1.275)
147    forwards;
148`,zn=({toast:t})=>{let{icon:e,type:i,iconTheme:s}=t;return e!==void 0?typeof e=="string"?x.createElement(En,null,e):e:i==="blank"?null:x.createElement(jn,null,x.createElement(wn,{...s}),i!=="loading"&&x.createElement(In,null,i==="error"?x.createElement(xn,{...s}):x.createElement(Pn,{...s})))},Cn=t=>`
1490% {transform: translate3d(0,${t*-200}%,0) scale(.6); opacity:.5;}
150100% {transform: translate3d(0,0,0) scale(1); opacity:1;}
151`,On=t=>`
1520% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}
153100% {transform: translate3d(0,${t*-150}%,-1px) scale(.6); opacity:0;}
154`,qn="0%{opacity:0;} 100%{opacity:1;}",Fn="0%{opacity:1;} 100%{opacity:0;}",Bn=Pt("div")`
155  display: flex;
156  align-items: center;
157  background: #fff;
158  color: #363636;
159  line-height: 1.3;
160  will-change: transform;
161  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1), 0 3px 3px rgba(0, 0, 0, 0.05);
162  max-width: 350px;
163  pointer-events: auto;
164  padding: 8px 10px;
165  border-radius: 8px;
166`,Nn=Pt("div")`
167  display: flex;
168  justify-content: center;
169  margin: 4px 10px;
170  color: inherit;
171  flex: 1 1 auto;
172  white-space: pre-line;
173`,Dn=(t,e)=>{let i=t.includes("top")?1:-1,[s,n]=_i()?[qn,Fn]:[Cn(i),On(i)];return{animation:e?`${xt(s)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`:`${xt(n)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`}},Mn=x.memo(({toast:t,position:e,style:i,children:s})=>{let n=t.height?Dn(t.position||e||"top-center",t.visible):{opacity:0}
173,r=x.createElement(zn,{toast:t}),a=x.createElement(Nn,{...t.ariaProps},se(t.message,t));return x.createElement(Bn,{className:t.className,style:{...n,...i,...t.style}},typeof s=="function"?s({icon:r,message:a}):x.createElement(x.Fragment,null,r,a))});ln(x.createElement);var $n=({id:t,className:e,style:i,onHeightUpdate:s,children:n})=>{let r=x.useCallback(a=>{if(a){let o=()=>{let l=a.getBoundingClientRect().height;s(t,l)};o(),new MutationObserver(o).observe(a,{subtree:!0,childList:!0,characterData:!0})}},[t,s]);return x.createElement("div",{ref:r,className:e,style:i},n)},Ln=(t,e)=>{let i=t.includes("top"),s=i?{top:0}:{bottom:0},n=t.includes("center")?{justifyContent:"center"}:t.includes("right")?{justifyContent:"flex-end"}:{};return{left:0,right:0,display:"flex",position:"absolute",transition:_i()?void 0:"all 230ms cubic-bezier(.21,1.02,.73,1)",transform:`translateY(${e*(i?1:-1)}px)`,...s,...n}},Rn=ce`
174  z-index: 9999;
175  > * {
176    pointer-events: auto;
177  }
178`,Wt=16,Hn=({reverseOrder:t,position:e="top-center",toastOptions:i,gutter:s,children:n,toasterId:r,containerStyle:a,containerClassName:o})=>{let{toasts:l,handlers:c}=yn(i,r);return x.createElement("div",{"data-rht-toaster":r||"",style:{position:"fixed",zIndex:9999,top:Wt,left:Wt,right:Wt,bottom:Wt,pointerEvents:"none",...a},className:o,onMouseEnter:c.startPause,onMouseLeave:c.endPause},l.map(d=>{let f=d.position||e,u=c.calculateOffset(d,{reverseOrder:t,gutter:s,defaultPosition:e}),p=Ln(f,u);return x.createElement($n,{id:d.id,key:d.id,onHeightUpdate:c.updateHeight,className:d.visible?Rn:"",style:p},d.type==="custom"?se(d.message,d):n?n(d):x.createElement(Mn,{toast:d,position:f}))}))},q=V;async function Un(){const t=await fetch("/__admin_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"getPublic"})});if(!t.ok)throw new Error(`HTTP ${t.status}`);const e=await t.json();if(!e.ok)throw new Error(e.error);return e.state}async function Qn(){const t=await fetch("/__admin_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"get"})});if(!t.ok)throw new Error(`HTTP ${t.status}`);const e=await t.json();if(!e.ok)throw new Error(e.error);return e.state}async function Vn(t){const e=await fetch("/__admin_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"save",state:t})});if(!e.ok)throw new Error(`HTTP ${e.status}`);const i=await e.json();if(!i.ok)throw new Error(i.error);return!0}async function na(t,e){const i=await fetch("/__admin_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"uploadPreview",blockId:t,dataUrl:e})});if(!i.ok)throw new Error(`HTTP ${i.status}`);const s=await i.json();if(!s.ok)throw new Error(s.error);return s.url}async function Zn(){try{const t=await fetch(`/assets/nb-admin-state.json?ts=${Date.now()}`,{cache:"no-store"});if(!t.ok)return null;const e=await t.json();return!e||typeof e!="object"||e.version!==1?null:e}catch{}try{const t=await Un();if(t&&typeof t=="object"&&t.version===1)return t}catch{return null}return null}function sa(t){return(Array.isArray(t==null?void 0:t.devlog)?t.devlog:[]).filter(i=>i&&i.published&&!i.deletedAt).slice().sort((i,s)=>String(s.date||"").localeCompare(String(i.date||"")))}const et="nb-asset://";function Gn(t){return typeof t=="string"&&t.startsWith(et)}function ra(t){return`${et}${t}`}function Jn(t){return Gn(t)&&t.slice(et.length).trim()||null}function aa({mime:t,name:e}){const i=String(e||"").toLowerCase(),s=String(t||"").toLowerCase(),n=i.includes(".")?i.split(".").pop():"";return n&&/^[a-z0-9]{1,8}$/.test(n)?n:s==="image/jpeg"?"jpg":s==="image/png"?"png":s==="image/webp"?"webp":s==="image/gif"?"gif":s==="image/svg+xml"?"svg":s==="application/pdf"?"pdf":s==="application/zip"||s==="application/x-zip-compressed"?"zip":s==="application/vnd.openxmlformats-officedocument.wordprocessingml.document"?"docx":s==="application/msword"?"doc":s==="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"?"xlsx":s==="application/vnd.ms-excel"?"xls":s==="application/vnd.openxmlformats-officedocument.presentationml.presentation"?"pptx":s==="application/vnd.ms-powerpoint"?"ppt":"bin"}let Kt;const Wn=new Uint8Array(16);function Kn(){if(!Kt&&(Kt=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Kt))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Kt(Wn)}const K=[];for(let t=0;t<256;++t)K.push((t+256).toString(16).slice(1));function Yn(t,e=0){return K[t[e+0]]+K[t[e+1]]+K[t[e+2]]+K[t[e+3]]+"-"+K[t[e+4]]+K[t[e+5]]+"-"+K[t[e+6]]+K[t[e+7]]+"-"+K[t[e+8]]+K[t[e+9]]+"-"+K[t[e+10]]+K[t[e+11]]+K[t[e+12]]+K[t[e+13]]+K[t[e+14]]+K[t[e+15]]}const Xn=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),ri={randomUUID:Xn};function vt(t,e,i){if(ri.randomUUID&&!t)return ri.randomUUID();t=t||{};const s=t.random||(t.rng||Kn)();return s[6]=s[6]&15|64,s[8]=s[8]&63|128,Yn(s)}const ts="NordicBuilderMedia",es=2,Ot="assets";function ue(){return new Promise((t,e)=>{const i=indexedDB.open(ts,es);i.onerror=()=>e(i.error),i.onsuccess=()=>t(i.result),i.onupgradeneeded=s=>{const n=s.target.result;if(n.objectStoreNames.contains("images")||n.createObjectStore("images",{keyPath:"id",autoIncrement:!0}),!n.objectStoreNames.contains(Ot)){const r=n.createObjectStore(Ot,{keyPath:"id"});r.createIndex("kind","kind",{unique:!1}),r.createIndex("createdAt","createdAt",{unique:!1})}}})}function Fe(t,e,i){return new Promise((s,n)=>{const a=t.transaction([Ot],e).objectStore(Ot),o=i(a);o.onerror=()=>n(o.error),o.onsuccess=()=>s(o.result)})}async function oa(t,e){const i=await ue(),s=vt(),n={id:s,kind:e,name:t.name||`${e}-${s}`,mime:t.type||"application/octet-stream",size:t.size||0,createdAt:Date.now()},r={...n,blob:t};return await Fe(i,"readwrite",a=>a.put(r)),n}async function Ei(t){const e=await ue();return new Promise((i,s)=>{const r=e.transaction([Ot],"readonly").objectStore(Ot),a=t?r.index("kind").getAll(t):r.getAll();a.onerror=()=>s(a.error),a.onsuccess=()=>{const l=(a.result||[]).map(c=>
178({id:String(c.id),kind:c.kind,name:String(c.name||""),mime:String(c.mime||""),size:Number(c.size||0),createdAt:Number(c.createdAt||0)})).sort((c,d)=>d.createdAt-c.createdAt);i(l)}})}async function Be(t){const e=await ue(),i=await Fe(e,"readonly",s=>s.get(t));return i?{id:String(i.id),kind:i.kind,name:String(i.name||""),mime:String(i.mime||""),size:Number(i.size||0),createdAt:Number(i.createdAt||0),blob:i.blob}:null}async function Ie(t){const e=await ue(),i={id:String(t.id),kind:t.kind,name:String(t.name||""),mime:String(t.mime||"application/octet-stream"),size:Number(t.size||0),createdAt:Number(t.createdAt||Date.now())};return await Fe(e,"readwrite",s=>s.put({...i,blob:t.blob})),i}function is(t){return t.startsWith("nb-asset://")}function ns(t){return t.slice(11).trim()}const At=le((t,e)=>({assetUrls:{},assetMeta:{},isReady:!1,init:async()=>{const i=await Ei();for(const s of i)t(n=>({assetMeta:{...n.assetMeta,[s.id]:{...s}}}));t({isReady:!0})},registerFromDb:async i=>{if(e().assetUrls[i])return;const n=await Be(i);n&&e().registerBlob(i,n.blob,{name:n.name,mime:n.mime,size:n.size,createdAt:n.createdAt,kind:n.kind})},registerBlob:(i,s,n)=>{const r=URL.createObjectURL(s);t(a=>{var o,l,c,d,f;return{assetUrls:{...a.assetUrls,[i]:r},assetMeta:{...a.assetMeta,[i]:{id:i,kind:String((n==null?void 0:n.kind)||((o=a.assetMeta[i])==null?void 0:o.kind)||""),name:String((n==null?void 0:n.name)||((l=a.assetMeta[i])==null?void 0:l.name)||""),mime:String((n==null?void 0:n.mime)||((c=a.assetMeta[i])==null?void 0:c.mime)||""),size:Number((n==null?void 0:n.size)??((d=a.assetMeta[i])==null?void 0:d.size)??0),createdAt:Number((n==null?void 0:n.createdAt)??((f=a.assetMeta[i])==null?void 0:f.createdAt)??Date.now())}}}})},resolve:i=>{if(!i)return"";if(!is(i))return i;const s=ns(i),n=e().assetUrls[s];return n||(e().registerFromDb(s),"")}}));function ss(t){const e=String(t||"").trim();if(!e)return"";const i=e.match(/^#nb-popup:([A-Za-z0-9_-]+)$/);if(i)return String(i[1]||"").trim();const s=e.match(/^(?:nb-popup:|popup:)([A-Za-z0-9_-]+)$/);return s?String(s[1]||"").trim():""}function rs(t){return t.includes("@")&&!t.includes("/")}function Ne(t){const e=String(t||"").trim();return e?e==="/index"||e==="index"?"/":e.startsWith("/")?e:`/${e}`:""}function as(t){return t.replace(/[^\d+]/g,"")}function os(t){const e=String(t||"").trim();return!e||/^\s*(?:javascript|vbscript|file):/i.test(e)?"":e.startsWith("#")||e.startsWith("/")||e.startsWith("?")||e.startsWith(et)||/^https?:\/\//i.test(e)||/^mailto:/i.test(e)||/^tel:/i.test(e)?e:Ne(e)}function De(t){if(!t)return{kind:"none"};if(typeof t=="object"){const i=t;if(i&&typeof i.kind=="string")return{kind:i.kind||"custom",href:typeof i.href=="string"?i.href:void 0,target:i.target==="_blank"?"_blank":i.target==="_self"?"_self":void 0};if(i&&typeof i.href=="string"){const s=De(i.href);return{...s,target:i.target==="_blank"?"_blank":i.target==="_self"?"_self":s.target}}}const e=String(t).trim();if(!e)return{kind:"none"};if(/^\s*(?:javascript|vbscript|file):/i.test(e))return{kind:"none"};if(/^#nb-popup:/i.test(e))return{kind:"popup",href:e,target:"_self"};if(e.startsWith("#"))return{kind:"scroll",href:e,target:"_self"};if(e.startsWith(et))return{kind:"file",href:e,target:"_blank"};if(/^mailto:/i.test(e))return{kind:"email",href:e,target:"_self"};if(/^tel:/i.test(e))return{kind:"phone",href:e,target:"_self"};if(/^https?:\/\//i.test(e))return{kind:"external",href:e,target:"_blank"};if(rs(e))return{kind:"email",href:`mailto:${e}`,target:"_self"};if(/^[+]?\d[\d\s()-]{6,}$/.test(e)){const i=as(e);return{kind:"phone",href:i?`tel:${i}`:"tel:",target:"_self"}}return{kind:"internal",href:Ne(e),target:"_self"}}function ls(t){const e=De(t);if(!e||e.kind==="none")return{kind:"none"};if(e.kind==="popup"){const a=ss(String(e.href||""));return a?{kind:"popup",href:`#nb-popup:${a}`,target:"_self",popupId:a}:{kind:"none"}}let i=String(e.href||"").trim();if(e.kind==="external"){const a=i,o=/^[a-z][a-z0-9+.-]*:/i.test(a),l=a.startsWith("#")||a.startsWith("/")||a.startsWith("?")||a.startsWith(et);a&&!o&&!l&&(i=`https://${a}`)}const s=os(i);if(!s)return{kind:"none"};let n=e.target;n||(e.kind==="external"||e.kind==="file"?n="_blank":n="_self");const r=n==="_blank"?"noopener noreferrer":void 0;if(typeof window<"u"&&s.startsWith(et))try{const a=s.slice(et.length).trim(),o=a?At.getState().assetUrls[a]:"";if(o)return{kind:e.kind,href:o,target:n,rel:r}}catch{}return{kind:e.kind,href:s,target:n,rel:r}}function la(t,e="#"){return ls(t).href||e}function ca(t){return Ne(t)}function zi(t){return!!t&&typeof t=="object"&&!Array.isArray(t)&&(t.constructor===Object||t.constructor==null)}function cs(t){if(!zi(t)||typeof t.kind=="string"||typeof t.href!="string"||t.target!==void 0&&t.target!=="_self"&&t.target!=="_blank")return!1;const e=Object.keys(t);return e.length>0&&e.every(i=>i==="href"||i==="target")}function je(t){if(Array.isArray(t)){let e=!1;const i=t.map(s=>{const n=je(s);return n!==s&&(e=!0),n});return e?i:t}if(cs(t)){const e=De(t.href);return{kind:e.kind,href:e.href,target:t.target??e.target}}if(zi(t)){let e=!1;const i={};for(const[s,n]of Object.entries(t)){const r=je(n);i[s]=r,r!==n&&(e=!0)}return e?i:t}return t}function Yt(t){return je(t)}const ds={version:1,site:{globalSeo:{yandexWebmasterVerification:"1dc0af7f57b4aaa5"},pages:{}},blocks:{},projectDefaults:{},devlog:[]},re=le()(Yi((t,e)=>({state:ds,isLoading:!1,bootstrapFromPublic:async()=>{t({isLoading:!0,lastError:void 0});try{const i=e().state,s=await Zn();if(s){const n=Yt(s),r=c=>{const d=Date.parse(String(c||""));return Number.isFinite(d)?d:null},a=r(i==null?void 0:i.updatedAt),o=r(n==null?void 0:n.updatedAt);
178(!a||!o?!a:o>a)&&t({state:n})}}catch(i){t({lastError:String((i==null?void 0:i.message)||i)})}finally{t({isLoading:!1})}},hydrateFromServer:async()=>{t({isLoading:!0,lastError:void 0});try{const i=await Qn();i&&t({state:Yt(i)})}catch(i){throw t({lastError:String((i==null?void 0:i.message)||i)}),i}finally{t({isLoading:!1})}},saveToServer:async()=>{const i=Yt(e().state);t({isLoading:!0,lastError:void 0});try{const s={...i,updatedAt:new Date().toISOString()};t({state:s}),await Vn(s)}catch(s){throw t({lastError:String((s==null?void 0:s.message)||s)}),s}finally{t({isLoading:!1})}},patchBlock:(i,s)=>{const n=e().state,r={...n.blocks,[i]:{...n.blocks[i]||{},...s}};t({state:{...n,blocks:r}})},deleteBlock:i=>{const s=e().state,n={...s.blocks,[i]:{...s.blocks[i]||{},deleted:!0,hidden:!0}};t({state:{...s,blocks:n}})},upsertDesignBlock02Template:i=>{const s=e().state,n=String((i==null?void 0:i.id)||"").trim(),r=String((i==null?void 0:i.name)||"").trim();if(!n||!r)return;const a=new Date().toISOString(),o=s.designBlock02Templates,l=o&&typeof o=="object"?{...o}:{},c=l[n],d=String((c==null?void 0:c.createdAt)||i.createdAt||a);l[n]={...c||{},...i,id:n,name:r,createdAt:d,updatedAt:String(i.updatedAt||a)},t({state:{...s,designBlock02Templates:l}})},deleteDesignBlock02Template:i=>{const s=e().state,n=String(i||"").trim();if(!n)return;const r=s.designBlock02Templates,a=r&&typeof r=="object"?{...r}:{},o=a[n];o&&(a[n]={...o,deleted:!0,hidden:!0,updatedAt:new Date().toISOString()},t({state:{...s,designBlock02Templates:a}}))},setProjectDefaults:i=>{const s=e().state;t({state:{...s,projectDefaults:{...s.projectDefaults||{},...i}}})},setSiteGlobalSeo:i=>{const s=e().state,n=s.site||{},r={...n,globalSeo:{...n.globalSeo||{},...i||{}}};t({state:{...s,site:r}})},upsertSitePage:(i,s)=>{const n=String(i||"").trim();if(!n)return;const r=e().state,a=r.site||{},o=a.pages||{},l=o[n]||{},c=s||{},d=c&&typeof c.content=="object"&&c.content?{...l.content||{},...c.content}:l.content,f={...l,...c};d!==void 0&&(f.content=d);const u={...o,[n]:f};t({state:{...r,site:{...a,pages:u}}})},setSitePageContent:(i,s)=>{const n=String(i||"").trim();if(!n)return;const r=e().state,a=r.site||{},o=a.pages||{},c={...o[n]||{},content:s&&typeof s=="object"?s:{}},d={...o,[n]:c};t({state:{...r,site:{...a,pages:d}}})},deleteSitePage:i=>{const s=String(i||"").trim();if(!s)return;const n=e().state,r=n.site||{},o={...r.pages||{}};delete o[s],t({state:{...n,site:{...r,pages:o}}})},upsertPost:i=>{const s=e().state,n=Array.isArray(s.devlog)?s.devlog:[],r=n.findIndex(o=>o.id===i.id),a=r>=0?[...n.slice(0,r),i,...n.slice(r+1)]:[i,...n];t({state:{...s,devlog:a}})},deletePost:i=>{const s=e().state,n=Array.isArray(s.devlog)?s.devlog:[];t({state:{...s,devlog:n.filter(r=>r.id!==i)}})}}),{name:"nb-admin-store",partialize:t=>({state:t.state}),onRehydrateStorage:()=>t=>{try{const e=t,i=e==null?void 0:e.state;i&&typeof i=="object"&&(e.state=Yt(i))}catch{}}})),ai={а:"a",б:"b",в:"v",г:"g",д:"d",е:"e",ё:"e",ж:"zh",з:"z",и:"i",й:"i",к:"k",л:"l",м:"m",н:"n",о:"o",п:"p",р:"r",с:"s",т:"t",у:"u",ф:"f",х:"h",ц:"ts",ч:"ch",ш:"sh",щ:"shch",ъ:"",ы:"y",ь:"",э:"e",ю:"yu",я:"ya"};function us(t){const e=String(t||"");let i="";for(const s of e){const n=s.toLowerCase();if(ai[n]!==void 0){const r=ai[n];i+=r;continue}if(n==="і"){i+="i";continue}if(n==="ї"){i+="yi";continue}if(n==="є"){i+="ye";continue}if(n==="ґ"){i+="g";continue}i+=s}return i}function Qt(t,e={}){const i=e.allowSlashes!==!1,s=typeof e.maxLength=="number"?e.maxLength:80;let n=us(String(t||"")).trim().toLowerCase();n=n.replace(/&/g," and "),n=n.replace(/\s+/g,"-"),n=n.replace(/_+/g,"-"),i&&(n=n.replace(/\\+/g,"/")),n=n.replace(/\.\.(\/|\\)/g,"");const r=i?/[^a-z0-9/_-]+/g:/[^a-z0-9_-]+/g;return n=n.replace(r,"-"),i&&(n=n.replace(/\/+/g,"/"),n=n.replace(/-+\/+-+/g,"/"),n=n.replace(/-+\/+/g,"/"),n=n.replace(/\/+-+/g,"/"),n=n.replace(/\/+$/g,""),n=n.replace(/^\/+/,"")),n=n.replace(/-+/g,"-"),n=n.replace(/^-+|-+$/g,""),i&&(n=n.replace(/\/+/g,"/"),n=n.replace(/\/+$/g,""),n=n.replace(/^\/+/,"")),n||(n="page"),s>0&&n.length>s&&(n=n.slice(0,s).replace(/-+$/g,"")),n}function Te(t,e={}){return Qt(t,e)||"page"}function ie(t,e,i){const s=new Set([...e].map(o=>
178String(o||"").trim().toLowerCase()).filter(Boolean)),n=String(t||"").trim().toLowerCase()||"page",r=String(i||"").trim().toLowerCase();if(r&&n===r||!s.has(n))return n;let a=2;for(;a<1e4;){const o=`${n}-${a}`;if(!s.has(o))return o;a+=1}return`${n}-${Date.now()}`}const ps=50;function R(t,e,i){const s=e.slice(0,i+1);return s.push({project:t,timestamp:Date.now()}),s.length>ps?(s.shift(),{history:s,historyIndex:s.length-1}):{history:s,historyIndex:s.length-1}}const fs=["__nb","__NB_"];function ms(t){if(!t||typeof t!="object")return!1;const e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function hs(t){const e=String(t||"");return fs.some(i=>e.startsWith(i))}function Ee(t){if(Array.isArray(t))return t.map(Ee);if(!ms(t))return t;const e={};for(const[i,s]of Object.entries(t))hs(i)||(e[i]=Ee(s));return e}function Ct(t){const e=JSON.parse(JSON.stringify(t||null)),i=Ee(e),s=i==null?void 0:i.favoriteBlocks;if(Array.isArray(s))for(const n of s)n&&typeof n=="object"&&"thumbnail"in n&&delete n.thumbnail;return i}const S={colors:{primary:"#2C5F2D",secondary:"#97BC62",accent:"#F59E0B",background:"#FFFFFF",surface:"#F8FAFC",text:"#1A1A1A",textMuted:"#6B7280",border:"#E5E7EB",semantic:{}},typography:{fontBase:"Inter",fontHeading:"Inter",weightBase:400,weightHeading:700,baseSize:16,scale:1.25,mobileBaseSize:16,mobileScale:1.25,lineHeight:1.5,letterSpacing:"0",roleSizesPx:{},roleSizesMobilePx:{},semanticRoleSizesRem:{},semanticRoleSizesMobileRem:{}},spacing:{xs:4,sm:8,md:16,lg:32,xl:64,section:96},radii:{sm:6,md:12,lg:20,xl:32,full:999},components:{button:{variant:"solid",radius:"md"}}},gs=["h0","h1","h2","h3","h4","body","caption"],ys=["heading","subheading"];function bs(t){return t!=null&&String(t).trim()!==""}function Ss(t,e){const i=e.split(".");let s=t;for(const n of i){if(!s||typeof s!="object")return;s=s[n]}return s}const ks=["colors.primary","colors.secondary","colors.accent","colors.background","colors.surface","colors.text","colors.textMuted","colors.border","typography.fontBase","typography.fontHeading","typography.weightBase","typography.weightHeading","typography.baseSize","typography.scale","typography.lineHeight","typography.letterSpacing","spacing.xs","spacing.sm","spacing.md","spacing.lg","spacing.xl","spacing.section","radii.sm","radii.md","radii.lg","radii.xl","radii.full","components.button.variant","components.button.radius"];function Ci(t){const e=t==null?void 0:t.tokens;return ks.filter(i=>!bs(Ss(e,i)))}const oi=new Set;function xs(t){const e=Ci(t);if(e.length===0)return;const i=e.join("|");oi.has(i)||(oi.add(i),console.warn("[NB][tokens] В режиме “tokens” отсутствуют значения для токенов (будут использованы DEFAULT_TOKENS):",e))}function li(t,e){const i=String(t??"").trim();return i?i.includes(",")||i.startsWith("var(")||i.startsWith('"')||i.startsWith("'")?i:`'${i}', sans-serif`:e}function st(t){if(!t||typeof t!="object")return!1;const e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function lt(t,e){const i=String(t??"").trim();return i||e}function H(t,e){if(typeof t=="string"&&t.trim()==="")return e!==void 0?e:0;const i=typeof t=="number"?t:Number(t);return Number.isFinite(i)?i:e!==void 0?e:0}function ci(t){const e=st(t)?t:{},i={};for(const s of gs){const n=H(e[s],NaN);if(!Number.isFinite(n))continue;const r=Math.round(Math.max(8,Math.min(200,n)));i[s]=r}return i}function di(t){const e=st(t)?t:{},i={};for(const s of ys){const n=H(e[s],NaN);if(!Number.isFinite(n))continue;const r=Math.max(.5,Math.min(20,n));i[s]=Math.round(r*100)/100}return i}function vs(t){var y,m,b,h,P;const e=st(t)?t:{},i=st(e.colors)?e.colors:{},s=st(i.semantic)?i.semantic:{},n=st(s.brand)?s.brand:{},r=st(s.state)?s.state:{},a=st(s.text)?s.text:{},o=st(s.surface)?s.surface:{},l=st(e.typography)?e.typography:{},c=st(e.spacing)?e.spacing:{},d=st(e.radii)?e.radii:{},f=st(e.components)?e.components:{},u=st(f.button)?f.button:{};return{colors:{...S.colors,...i,primary:lt(i.primary,S.colors.primary),secondary:lt(i.secondary,S.colors.secondary),accent:lt(i.accent,S.colors.accent),background:lt(i.background,S.colors.background),surface:lt(i.surface,S.colors.surface),text:lt(i.text,S.colors.text),textMuted:lt(i.textMuted,S.colors.textMuted),border:lt(i.border,S.colors.border),semantic:{brand:{primary:String(n.primary||"").trim()||void 0,secondary:String(n.secondary||"").trim()||void 0,accent:String(n.accent||"").trim()||void 0},state:{success:String(r.success||"").trim()||void 0,warning:String(r.warning||"").trim()||void 0,error:String(r.error||"").trim()||void 0,info:String(r.info||"").trim()||void 0},text:{primary:String(a.primary||"").trim()||void 0,muted:String(a.muted||"").trim()||void 0,inverse:String(a.inverse||"").trim()||void 0},surface:{base:String(o.base||"").trim()||void 0,card:String(o.card||"").trim()||void 0,overlay:String(o.overlay||"").trim()||void 0}}},typography:{...S.typography,...l,fontBase:lt(l.fontBase,S.typography.fontBase),fontHeading:lt(l.fontHeading,S.typography.fontHeading),weightBase:H(l.weightBase,S.typography.weightBase),weightHeading:H(l.weightHeading,S.typography.weightHeading),baseSize:H(l.baseSize,S.typography.baseSize),scale:H(l.scale,S.typography.scale),mobileBaseSize:H(l.mobileBaseSize,S.typography.mobileBaseSize),mobileScale:H(l.mobileScale,S.typography.mobileScale),lineHeight:H(l.lineHeight,S.typography.lineHeight),letterSpacing:lt(l.letterSpacing,S.typography.letterSpacing),roleSizesPx:ci(l.roleSizesPx),roleSizesMobilePx:ci(l.roleSizesMobilePx),semanticRoleSizesRem:di(l.semanticRoleSizesRem),semanticRoleSizesMobileRem:di(l.semanticRoleSizesMobileRem)},spacing:{...S.spacing,...c,xs:H(c.xs,S.spacing.xs),sm:H(c.sm,S.spacing.sm),md:H(c.md,S.spacing.md),lg:H(c.lg,S.spacing.lg),xl:H(c.xl,S.spacing.xl),section:H(c.section,S.spacing.section)},radii:{...S.radii,...d,sm:H(d.sm,S.radii.sm),md:H(d.md,S.radii.md),lg:H(d.lg,S.radii.lg),xl:H(d.xl,S.radii.xl),full:H(d.full,S.radii.full)},components:{...f,button:{...(y=S.components)==null?void 0:y.button,...u,variant:lt(u.variant,((b=(m=S.components)==null?void 0:m.button)==null?void 0:b.variant)||"solid"),radius:lt(u.radiu
178s,((P=(h=S.components)==null?void 0:h.button)==null?void 0:P.radius)||"md")}}}}function ws(t){const e=t==null?void 0:t.tokens,i=vs(e);return xs(t),i}function Oi(t){const e=[],i=t.colors,s=t.typography,n=t.spacing,r=t.radii,a=Number.isFinite(Number(s.baseSize))?Math.max(10,Math.min(64,Number(s.baseSize))):16,o=Number.isFinite(Number(s.scale))?Math.max(1.05,Math.min(1.8,Number(s.scale))):1.25,l=Number.isFinite(Number(s.mobileBaseSize))?Math.max(10,Math.min(64,Number(s.mobileBaseSize))):a,c=Number.isFinite(Number(s.mobileScale))?Math.max(1.05,Math.min(1.8,Number(s.mobileScale))):o,d=(nt,ft)=>{let Q=1;for(let bt=0;bt<ft;bt++)Q*=nt;return Q},f=s.roleSizesPx,u=s.roleSizesMobilePx,p=s.semanticRoleSizesRem,y=s.semanticRoleSizesMobileRem,m=(nt,ft,Q)=>{const bt=typeof(Q==null?void 0:Q[nt])=="number"?Q[nt]:Number(Q==null?void 0:Q[nt]);return Number.isFinite(bt)?Math.max(8,Math.min(200,Math.round(bt))):ft},b=a*d(o,5),h=a*d(o,3),P=a*d(o,2),v=a*d(o,1),A=a*d(o,0),N=a,B=a/o,Z=m("h0",b,f),I=m("h1",h,f),Y=m("h2",P,f),$=m("h3",v,f),mt=m("h4",A,f),at=m("body",N,f),_=m("caption",B,f),k=l*d(c,5),E=l*d(c,3),T=l*d(c,2),O=l*d(c,1),L=l*d(c,0),it=l,dt=l/c,ut=m("h0",k,u),pt=m("h1",E,u),C=m("h2",T,u),yt=m("h3",O,u),ot=m("h4",L,u),D=m("body",it,u),X=m("caption",dt,u);e.push(["--color-primary",i.primary]),e.push(["--color-secondary",i.secondary]),e.push(["--color-accent",i.accent]),e.push(["--color-background",i.background]),e.push(["--color-surface",i.surface]),e.push(["--color-text",i.text]),e.push(["--color-text-muted",i.textMuted]),e.push(["--color-border",i.border]);const W=i.semantic||{},qt=W.brand||{},Tt=W.state||{},ht=W.text||{},Ft=W.surface||{},tt=(nt,ft)=>{const Q=String(ft??"").trim();Q&&e.push([nt,Q])};tt("--color-brand-primary",qt.primary),tt("--color-brand-secondary",qt.secondary),tt("--color-brand-accent",qt.accent),tt("--color-success",Tt.success),tt("--color-warning",Tt.warning),tt("--color-error",Tt.error),tt("--color-info",Tt.info),tt("--color-text-primary",ht.primary),tt("--color-text-muted",ht.muted),tt("--color-text-inverse",ht.inverse),tt("--color-surface-base",Ft.base),tt("--color-surface-card",Ft.card),tt("--color-surface-overlay",Ft.overlay),e.push(["--font-base",li(s.fontBase,"'Inter', sans-serif")]),e.push(["--font-heading",li(s.fontHeading,"'Inter', sans-serif")]),typeof s.weightBase=="number"&&e.push(["--subheading-weight",String(s.weightBase)]),typeof s.weightHeading=="number"&&e.push(["--heading-weight",String(s.weightHeading)]),e.push(["--font-base-size",`${s.baseSize}px`]),e.push(["--font-scale",String(s.scale)]),e.push(["--line-height",String(s.lineHeight)]),e.push(["--text-line-height",String(s.lineHeight)]),e.push(["--letter-spacing",String(s.letterSpacing)]);const Bt=nt=>{const ft=typeof nt=="number"?nt:Number(nt);if(!Number.isFinite(ft))return null;const Q=Math.max(.5,Math.min(20,ft));return`${Math.round(Q*100)/100}rem`},pe=Bt(p==null?void 0:p.heading),Gt=Bt(p==null?void 0:p.subheading);e.push(["--typo-h0-size",`${Z}px`]),e.push(["--typo-h1-size",pe||`${I}px`]),e.push(["--typo-h2-size",Gt||`${Y}px`]),e.push(["--typo-h3-size",`${$}px`]),e.push(["--typo-h4-size",`${mt}px`]),e.push(["--typo-body-size",`${at}px`]),e.push(["--typo-caption-size",`${_}px`]);const It=Bt(y==null?void 0:y.heading),Ue=Bt(y==null?void 0:y.subheading);return e.push(["--typo-h0-size-mobile",`${ut}px`]),e.push(["--typo-h1-size-mobile",It||`${pt}px`]),e.push(["--typo-h2-size-mobile",Ue||`${C}px`]),e.push(["--typo-h3-size-mobile",`${yt}px`]),e.push(["--typo-h4-size-mobile",`${ot}px`]),e.push(["--typo-body-size-mobile",`${D}px`]),e.push(["--typo-caption-size-mobile",`${X}px`]),e.push(["--space-xs",`${n.xs}px`]),e.push(["--space-sm",`${n.sm}px`]),e.push(["--space-md",`${n.md}px`]),e.push(["--space-lg",`${n.lg}px`]),e.push(["--space-xl",`${n.xl}px`]),e.push(["--space-section",`${n.section}px`]),e.push(["--radius-sm",`${r.sm}px`]),e.push(["--radius-md",`${r.md}px`]),e.push(["--radius-lg",`${r.lg}px`]),e.push(["--radius-xl",`${r.xl}px`]),e.push(["--radius-full",`${r.full}px`]),e}const Me="nordic-project",ui="nb:migration-backup",Ht=6;function rt(t){if(!t||typeof t!="object")return!1;const e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ct(t,e){const i=String(t??"").trim();return i||e}function U(t,e){if(typeof t=="string"&&t.trim()==="")return e!==void 0?e:0;const i=typeof t=="number"?t:Number(t);return Number.isFinite(i)?i:e!==void 0?e:0}function pi(t){const e=rt(t)?t:{},i={},s=["h0","h1","h2","h3","h4","body","caption"];for(const n of s){const r=U(e[n],NaN);Number.isFinite(r)&&(i[n]=Math.round(Math.max(8,Math.min(200,r))))}return i}function fi(t){const e=rt(t)?t:{},i={},s=["heading","subheading"];for(const n of s){const r=U(e[n],NaN);if(!Number.isFinite(r))continue;const a=Math.max(.5,Math.min(20,r));i[n]=Math.round(a*100)/100}return i}function As(t){var p,y,m,b,h;const e=rt(t)?t:{},i=rt(e.colors)?e.colors:{},s=rt(i.semantic)?i.semantic:{},n=rt(s.brand)?s.brand:{},r=rt(s.state)?s.state:{},a=rt(s.text)?s.text:{}
178,o=rt(s.surface)?s.surface:{},l=rt(e.typography)?e.typography:{},c=rt(e.spacing)?e.spacing:{},d=rt(e.radii)?e.radii:{},f=rt(e.components)?e.components:{},u=rt(f.button)?f.button:{};return{colors:{...S.colors,...i,primary:ct(i.primary,S.colors.primary),secondary:ct(i.secondary,S.colors.secondary),accent:ct(i.accent,S.colors.accent),background:ct(i.background,S.colors.background),surface:ct(i.surface,S.colors.surface),text:ct(i.text,S.colors.text),textMuted:ct(i.textMuted,S.colors.textMuted),border:ct(i.border,S.colors.border),semantic:{brand:{primary:String(n.primary||"").trim()||void 0,secondary:String(n.secondary||"").trim()||void 0,accent:String(n.accent||"").trim()||void 0},state:{success:String(r.success||"").trim()||void 0,warning:String(r.warning||"").trim()||void 0,error:String(r.error||"").trim()||void 0,info:String(r.info||"").trim()||void 0},text:{primary:String(a.primary||"").trim()||void 0,muted:String(a.muted||"").trim()||void 0,inverse:String(a.inverse||"").trim()||void 0},surface:{base:String(o.base||"").trim()||void 0,card:String(o.card||"").trim()||void 0,overlay:String(o.overlay||"").trim()||void 0}}},typography:{...S.typography,...l,fontBase:ct(l.fontBase,S.typography.fontBase),fontHeading:ct(l.fontHeading,S.typography.fontHeading),weightBase:U(l.weightBase,S.typography.weightBase),weightHeading:U(l.weightHeading,S.typography.weightHeading),baseSize:U(l.baseSize,S.typography.baseSize),scale:U(l.scale,S.typography.scale),mobileBaseSize:U(l.mobileBaseSize,S.typography.mobileBaseSize),mobileScale:U(l.mobileScale,S.typography.mobileScale),lineHeight:U(l.lineHeight,S.typography.lineHeight),letterSpacing:ct(l.letterSpacing,S.typography.letterSpacing),roleSizesPx:pi(l.roleSizesPx),roleSizesMobilePx:pi(l.roleSizesMobilePx),semanticRoleSizesRem:fi(l.semanticRoleSizesRem),semanticRoleSizesMobileRem:fi(l.semanticRoleSizesMobileRem)},spacing:{...S.spacing,...c,xs:U(c.xs,S.spacing.xs),sm:U(c.sm,S.spacing.sm),md:U(c.md,S.spacing.md),lg:U(c.lg,S.spacing.lg),xl:U(c.xl,S.spacing.xl),section:U(c.section,S.spacing.section)},radii:{...S.radii,...d,sm:U(d.sm,S.radii.sm),md:U(d.md,S.radii.md),lg:U(d.lg,S.radii.lg),xl:U(d.xl,S.radii.xl),full:U(d.full,S.radii.full)},components:{...f,button:{...(p=S.components)==null?void 0:p.button,...u,variant:ct(u.variant,((m=(y=S.components)==null?void 0:y.button)==null?void 0:m.variant)||"solid"),radius:ct(u.radius,((h=(b=S.components)==null?void 0:b.button)==null?void 0:h.radius)||"md")}}}}function _s(t){if(!t||typeof t!="object")return!1;const e=t.globalDesign;if(!e||typeof e!="object")return!1;const i=e.tokens,s=As(i);let n=!1;try{n=JSON.stringify(i??null)!==JSON.stringify(s)}catch{n=!0}return n&&(e.tokens=s),n}function mi(t,e){if(typeof t=="number"&&Number.isFinite(t))return t;const i=String(t??"").trim();if(!i)return e;const s=i.match(/^(-?\d+(?:\.\d+)?)(px|rem|em)?$/i);if(!s)return e;const n=Number(s[1]);if(!Number.isFinite(n))return e;const r=String(s[2]||"px").toLowerCase();return r==="rem"||r==="em"?n*16:n}function Ps(t){var d,f;const e=t&&typeof t=="object"?t:{},i=e.globalDesign&&typeof e.globalDesign=="object"?e.globalDesign:{},s={...S,...i.tokens&&typeof i.tokens=="object"?i.tokens:{}};s.colors={...S.colors,...s.colors||{}},s.typography={...S.typography,...s.typography||{}},s.spacing={...S.spacing,...s.spacing||{}},s.radii={...S.radii,...s.radii||{}},s.components={...s.components||{},button:{...(d=S.components)==null?void 0:d.button,...((f=s.components)==null?void 0:f.button)||{}}};const n=i.typography&&typeof i.typography=="object"?i.typography:null,r=i.buttons&&typeof i.buttons=="object"?i.buttons:null,a=i.components&&typeof i.components=="object"?i.components:null,o=i.spacing&&typeof i.spacing=="object"?i.spacing:null,l=i.site&&typeof i.site=="object"?i.site:null;if(n&&(n.headingFont&&(s.typography.fontHeading=String(n.headingFont)),n.subheadingFont&&(s.typography.fontBase=String(n.subheadingFont)),typeof n.headingWeight=="number"&&(s.typography.weightHeading=n.headingWeight),typeof n.subheadingWeight=="number"&&(s.typography.weightBase=n.subheadingWeight),typeof n.textLineHeight=="number"&&(s.typography.lineHeight=n.textLineHeight)),r&&(r.primaryColor&&(s.colors.primary=String(r.primaryColor)),r.primaryHoverColor&&(s.colors.accent=String(r.primaryHoverColor)),r.borderRadius)){const u={none:"sm",small:"sm",medium:"md",large:"lg",full:"full"},p=String(r.borderRadius),y=u[p]||"md";s.components=s.components||{},s.components.button=s.components.button||{},s.components.button.radius=y}if(a&&(a.cardColor&&(s.colors.surface=String(a.cardColor)),a.borderRadius)){const p={none:0,small:8,medium:12,large:16,full:999}[String(a.borderRadius)];typeof p=="number"&&(s.radii.lg=p)}if(o&&(o.sectionPadding&&(s.spacing.section=Math.round(mi(o.sectionPadding,s.spacing.section))),o.blockGap&&(s.spacing.md=Math.round(mi(o.blockGap,s.spacing.md)))),l){const u=String(l.backgroundMode||"legacy"),p=String(l.backgroundColor||"").trim();u==="custom"&&p&&(s.colors.background=p)}const c={version:typeof i.version=="number"?i.version:1,tokens:s,fonts:Array.isArray(i.fonts)?i.fonts:[],site:i.site&&typeof i.site=="object"?i.site:void 0,effects:i.effects&&typeof i.effects=="object"?i.effects:void 0};return delete c.designMode,delete c.theme,delete c.typography,delete c.buttons,delete c.components,delete c.spacing,{...e,globalDesign:c}}function $t(t=""){try{const e=globalThis,i=e==null?void 0:e.crypto;if(i!=null&&i.getRandomValues){const s=new Uint8Array(10);i.getRandomValues(s);const n=Array.from(s).map(r=>r.toString(16).padStart(2,"0")).join("");return`${t}${n}`}}catch{}return`${t}${Math.random().toString(16).slice(2)}${Date.now().toString(16)}`}function Is(t){const e=t&&typeof t=="object"?t:{};(!e.settings||typeof e.settings!="object")&&(e.settings={});const i=e.settings,s=Array.isArray(i.overlays)?i.overlays:[],n=Array.isArray(i.forms)?i.forms:[],r=new Map;for(const l of n){const c=String((l==null?void 0:l.id)||"").trim();c&&r.set(c,l)}let a=!1;const o=s.map(l=>{if(!l||String(l.type||"")!=="popup-lead-form")return l;const c=l.data&&typeof l.data=="object"?{...l.data}:{},d=String(c.formId||"").trim();if(d&&r.has(d))return{...l,data:c};const f=$t("form_"),p=String(c.formKey||"").trim()||`lf_${$t("")}`,y=String(c.title||"").trim()||"Форма заявки",m=[{id:$t("fld_"),type:"text",name:"name",label:String(c.nameLabel||"Имя"),required:!1,placeholder:""},{id:$t("fld_"),type:"phone",name:"phone",label:String(c.phoneLabel||"Телефон"),required:!1,placeholder:""}
178,{id:$t("fld_"),type:"textarea",name:"message",label:String(c.messageLabel||"Комментарий"),required:!1,placeholder:""}];return n.push({id:f,title:y,formKey:p,fields:m}),r.set(f,n[n.length-1]),c.formId=f,a=!0,{...l,data:c}});return a?(i.overlays=o,i.forms=n,{...e,settings:i}):e}function js(t){const e=t&&typeof t=="object"?{...t}:{};if(!Array.isArray(e.cards))return e;const i="#2C5F2D",s=n=>{const r=String(n||"").trim();return!r||r==="fa-solid"?"fas":r==="fa-regular"?"far":r==="fa-brands"?"fab":r};return e.cards=e.cards.map(n=>{const r=n&&typeof n=="object"?{...n}:{},a=r.icon;if(typeof a=="string"){const o=a.trim();if(!o)return{...r,icon:{icon:"",style:"fas",color:i}};const l=o.split(/\s+/).filter(Boolean),c=l.find(u=>u.startsWith("fa-"))||o,d=l.find(u=>u==="fas"||u==="far"||u==="fab"||u==="fa-solid"||u==="fa-regular"||u==="fa-brands"),f=s(d||"fas");return{...r,icon:{icon:c,style:f,color:i}}}if(a&&typeof a=="object"){const o=a,l={icon:String(o.icon||"").trim(),style:s(String(o.style||"fas")),color:String(o.color||i).trim()||i};return{...r,icon:l}}return r}),e}function F(t){try{const e=Ct(t);localStorage.setItem(Me,JSON.stringify(e))}catch(e){console.error("Failed to save to localStorage:",e)}}function Ut(t){if(!(t!=null&&t.pages)||!Array.isArray(t.pages))return t;const e=t.pages,i=e.map(n=>
178n==null?void 0:n.slug).filter(Boolean),s=e.map((n,r)=>{const a=r===0,o=String((n==null?void 0:n.name)||(a?"Главная":"Страница")).trim()||(a?"Главная":"Страница"),l=a?"index":(n==null?void 0:n.slug)||Te(o,{allowSlashes:!0}),c=a?"index":Qt(l,{allowSlashes:!0}),d=a?"index":ie(c||"page",i,n==null?void 0:n.slug);return{...n,name:o,slug:d,published:(n==null?void 0:n.published)!==!1,adaptive:(n==null?void 0:n.adaptive)!==!1,seo:{...(n==null?void 0:n.seo)||{}},html:{...(n==null?void 0:n.html)||{}},blocks:Array.isArray(n==null?void 0:n.blocks)?n.blocks:[]}});return{...t,pages:s}}function Ts(){try{const t=localStorage.getItem(Me);if(!t)return console.log("📦 localStorage пуст - будет создан новый проект"),null;const e=JSON.parse(t);console.log("📦 Загружен проект из localStorage:",e.projectName);const i=e._migrationVersion||0;if(i<Ht){console.warn(`🔄 Миграция данных v${i} → v${Ht}`);try{const s={createdAt:Date.now(),from:i,to:Ht,projectJson:t,note:"auto-backup before migration"},n=localStorage.getItem(ui);let r=[];if(n)try{const o=JSON.parse(n);Array.isArray(o)?r=o:o&&typeof o=="object"&&(r=[o])}catch{r=[]}if(!r.some(o=>o&&typeof o=="object"&&o.from===s.from&&o.to===s.to&&typeof o.projectJson=="str
178ing"&&o.projectJson===s.projectJson)){const l=[...r,s].slice(-5);localStorage.setItem(ui,JSON.stringify(l))}}catch{}if(e.pages){e.pages=e.pages.map(s=>({...s,blocks:s.blocks.map(n=>{const r=!!n.elements||!!(n.data&&n.data.elements);let a=n.layout;if(!a)a={contentWidth:1140,contentWidthUnit:"px",padding:[80,20,80,20],minHeight:void 0,background:{type:"color",color:"#ffffff"}};else{const{paddingTop:l,paddingRight:c,paddingBottom:d,paddingLeft:f,heightUnit:u,...p}=a;a={...p,contentWidth:a.contentWidth||1140,contentWidthUnit:a.contentWidthUnit||"px",padding:a.padding||[l||80,c||20,d||80,f||20],background:a.background||{type:"color",color:"#ffffff"}}}let o=r?n.data:(()=>{const l={...n.data};return delete l.backgroundColor,delete l.minHeight,delete l.designOverrides,l})();return!r&&n.type==="text-rich-02"&&(o=js(o)),{...n,data:o,layout:a,designOverrides:n.designOverrides||{}}})}));try{const s=Is(e);e.settings=s.settings}catch{}try{const s=Ps(e);e.globalDesign=s.globalDesign}catch{}e._migrationVersion=Ht,F(e),console.log("✅ Миграция завершена (element-based корректно сохранены)")}}else console.log(`✅ Проект актуален (версия ${i})`);try{_s(e)&&F(e)}catch{}return e}catch(t){return console.error("❌ Failed to load from localStorage:",t),null}}const ge=Ts(),jt=ge&&Ut(ge),Es="nordic-project-snapshots",zs=1,_t="snapshots";function Zt(){return new Promise((t,e)=>{const i=indexedDB.open(Es,zs);i.onupgradeneeded=()=>{const s=i.result;if(!s.objectStoreNames.contains(_t)){const n=s.createObjectStore(_t,{keyPath:"id"});n.createIndex("createdAt","createdAt",{unique:!1}),n.createIndex("reason","reason",{unique:!1})}},i.onsuccess=()=>t(i.result),i.onerror=()=>e(i.error)})}function $e(t,e,i){return new Promise((s,n)=>{const a=t.transaction(_t,e).objectStore(_t),o=i(a);o.onsuccess=()=>s(o.result),o.onerror=()=>n(o.error)})}async function ne(t){const e=typeof t.createdAt=="number"?t.createdAt:Date.now(),i=Ct(t.project),n={id:`ps_${e}_${Math.random().toString(16).slice(2)}`,createdAt:e,label:String(t.label||"").trim()||"Снапшот",reason:t.reason,projectName:String(i.projectName||""),projectModified:String(i.modified||""),migrationVersion:i==null?void 0:i._migrationVersion,projectJson:JSON.stringify(i)},r=await Zt();return await $e(r,"readwrite",a=>a.put(n)),{id:n.id,createdAt:n.createdAt,label:n.label,reason:n.reason,projectName:n.projectName,projectModified:n.projectModified,migrationVersion:n.migrationVersion}}async function Cs(t=50){const e=await Zt();return await new Promise((i,s)=>{const a=e.transaction(_t,"readonly").objectStore(_t).index("createdAt"),o=[],l=a.openCursor(null,"prev");l.onsuccess=()=>{const c=l.result;if(!c)return i(o);const d=c.value;if(o.push({id:d.id,createdAt:d.createdAt,label:d.label,reason:d.reason,projectName:d.projectName,projectModified:d.projectModified,migrationVersion:d.migrationVersion}),o.length>=t)return i(o);c.continue()},l.onerror=()=>s(l.error)})}async function da(t){const e=await Zt(),i=await $e(e,"readonly",s=>s.get(t));if(!(i!=null&&i.projectJson))return null;try{return JSON.parse(i.projectJson)}catch{return null}}async function ua(t){const e=await Zt();await $e(e,"readwrite",i=>i.delete(t))}async function ye(t=80){const e=await Cs(Math.max(t+20,t));if(e.length<=t)return;const i=e.slice(t),s=await Zt();await new Promise((n,r)=>{const a=s.transaction(_t,"readwrite"),o=a.objectStore(_t);for(const l of i)o.delete(l.id);a.oncomplete=()=>n(),a.onerror=()=>r(a.error),a.onabort=()=>r(a.error)})}const qi="nb:migration-backup";function Os(){try{const t=localStorage.getItem(qi);if(!t)return[];const e=JSON.parse(t),i=Array.isArray(e)?e:e&&typeof e=="object"?[e]:[],s=[];for(const n of i)!n||typeof n!="object"||typeof n.projectJson=="str
178ing"&&s.push({createdAt:typeof n.createdAt=="number"?n.createdAt:Date.now(),from:typeof n.from=="number"?n.from:0,to:typeof n.to=="number"?n.to:0,projectJson:String(n.projectJson),note:typeof n.note=="string"?n.note:void 0});return s}catch{return[]}}async function pa(){const t=Os().sort((s,n)=>s.createdAt-n.createdAt);if(!t.length)return{importedCount:0,last:null};let e=0,i=null;for(const s of t)try{const n=JSON.parse(s.projectJson);i=await ne({project:n,label:`Перед миграцией v${s.from} → v${s.to}`,reason:"auto:before-migration",createdAt:s.createdAt}),e++}catch{}if(e>0)try{localStorage.removeItem(qi)}catch{}return{importedCount:e,last:i}}const ze="tpl:design-block-02:";function fa(t){const e=String(t||"").trim();return`${ze}${e}`}function qs(t){const e=String(t||"");return e.startsWith(ze)&&e.slice(ze.length).trim()||null}function ma(t){const e=t==null?void 0:t.designBlock02Templates;return!e||typeof e!="object"?[]:Object.values(e).filter(i=>i&&typeof i=="object").filter(i=>!i.deleted&&!i.hidden).sort((i,s)=>{const n=Date.parse(String(i.updatedAt||i.createdAt||"")),r=Date.parse(String(s.updatedAt||s.createdAt||""));return Number.isFinite(n)&&Number.isFinite(r)?r-n:Number.isFinite(n)?-1:Number.isFinite(r)?1:String(i.name||"").localeCompare(String(s.name||""))})}function ha(t){const e=t==null?void 0:t.designBlock02Templates;return!e||typeof e!="object"?[]:Object.values(e).filter(i=>i&&typeof i=="object").sort((i,s)=>{const n=Date.parse(String(i.updatedAt||i.createdAt||"")),r=Date.parse(String(s.updatedAt||s.createdAt||""));return Number.isFinite(n)&&Number.isFinite(r)?r-n:Number.isFinite(n)?-1:Number.isFinite(r)?1:String(i.name||"").localeCompare(String(s.name||""))})}function Fs(t,e){const i=String(e||"").trim();if(!i)return null;const s=t==null?void 0:t.designBlock02Templates,n=s&&typeof s=="object"?s[i]:null;return!n||typeof n!="object"||n.deleted||n.hidden?null:n}function Le(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function ae(t,e){if(typeof t=="string")return e(t);if(Array.isArray(t))return t.map(i=>ae(i,e));if(Le(t)){const i={};for(const s of Object.keys(t))i[s]=ae(t[s],e);return i}return t}function Bs(t){const e=String(t||"");if(!e.includes(et))return[];const i=[],s=/nb-asset:\/\/[^\s"'<>\)\]]+/g,n=e.match(s)||[];for(const r of n){if(!r.startsWith(et))continue;const a=r.slice(et.length).trim();a&&i.push(a)}return i}function Ce(t){const e=new Set,i=s=>{if(typeof s=="string"){for(const n of Bs(s))e.add(n);return}if(Array.isArray(s)){for(const n of s)i(n);return}if(Le(s)){for(const n of Object.keys(s))i(s[n]);return}};return i(t),Array.from(e)}function Ns(t,e){return`/__auth_api.php?${new URLSearchParams({action:"templateAssetGet",slug:t,assetId:e}).toString()}`}async function Ds(t){const e=new URLSearchParams({action:"templateAssetPut",slug:t.slug,assetId:t.assetId,name:String(t.name||""),mime:String(t.mime||"")}),s=await(await fetch(`/__admin_api.php?${e.toString()}`,{method:"POST",credentials:"same-origin",headers:{"Content-Type":String(t.mime||"application/octet-stream")},body:t.blob})).json().catch(()=>null);return!s||typeof s!="object"?{ok:!1,error:"bad_response"}:s}async function ga(t){const e=Ce(t.snapshot);if(e.length===0)return{snapshot:t.snapshot,uploadedCount:0,missingCount:0,failedCount:0};const i=new Set,s=new Map;let n=0,r=0;for(const o of e){const l=await Be(o);if(!(l!=null&&l.blob)){n+=1;continue}const c=await Ds({slug:t.slug,assetId:o,blob:l.blob,name:l.name,mime:l.mime});c.ok?(i.add(o),c.url&&s.set(o,String(c.url))):r+=1}return i.size===0?{snapshot:t.snapshot,uploadedCount:0,missingCount:n,failedCount:r}:{snapshot:ae(t.snapshot,o=>o.includes(et)?o.replace(/nb-asset:\/\/[^\s"'<>\)\]]+/g,l=>{if(!l.startsWith(et))return l;const c=l.slice(et.length).trim();return!c||!i.has(c)?l:s.get(c)||Ns(t.slug,c)}):o),uploadedCount:i.size,missingCount:n,failedCount:r}}function Fi(t){const e=String(t||"").trim();if(!e||!e.includes("templateAssetGet"))return null;const i=typeof window<"u"?window.location.origin:"https://nordic-builder.ru";try{const s=new URL(e,i);if(s.pathname!=="/__auth_api.php"||s.searchParams.get("action")!=="templateAssetGet")return null;
178const n=String(s.searchParams.get("slug")||"").trim(),r=String(s.searchParams.get("assetId")||"").trim();return!n||!r?null:{slug:n,assetId:r}}catch{return null}}function Ms(t){const e=new Map,i=s=>{if(typeof s=="string"){const n=Fi(s);n&&!e.has(n.assetId)&&e.set(n.assetId,s);return}if(Array.isArray(s)){for(const n of s)i(n);return}if(Le(s)){for(const n of Object.keys(s))i(s[n]);return}};return i(t),e}async function ya(t){const e=Ms(t.snapshot);if(e.size===0)return{snapshot:t.snapshot,importedCount:0,failedCount:0};const i=new Set;let s=0,n=0;for(const[a,o]of e.entries())try{const l=await fetch(o,{method:"GET",credentials:"same-origin"});if(!l.ok){n+=1;continue}const c=await l.blob(),d=String(c.type||l.headers.get("Content-Type")||"application/octet-stream"),f=d.startsWith("image/")?"image":"file",u={id:a,kind:f,name:a,mime:d,size:c.size||0,createdAt:Date.now(),blob:c};await Ie(u),At.getState().registerBlob(a,c,{kind:f,name:a,mime:d,size:c.size||0,createdAt:u.createdAt}),i.add(a),s+=1}catch{n+=1}return{snapshot:ae(t.snapshot,a=>{const o=Fi(a);return!o||!i.has(o.assetId)?a:`${et}${o.assetId}`}),importedCount:s,failedCount:n}}const Lt="__global_header__",Rt="__global_footer__",hi=le((t,e)=>{var i,s;return{project:jt,editingTemplate:null,currentPageId:((i=jt==null?void 0:jt.pages[0])==null?void 0:i.id)||null,blockAddTargetPageId:((s=jt==null?void 0:jt.pages[0])==null?void 0:s.id)||null,blockAddInsertAfterBlockId:null,
178selectedBlockId:null,selectedElement:null,selectedOverrideElement:null,selectedBlockBackgroundPopover:null,settingsFocus:null,history:[],historyIndex:-1,isTemplatesOpen:!1,setIsTemplatesOpen:n=>t({isTemplatesOpen:!!n}),createNewProject:n=>{var l;t({editingTemplate:null});const r={id:vt(),name:"Главная",slug:"index",blocks:[]},a=((l=re.getState().state)==null?void 0:l.projectDefaults)||{},o={version:"1.0.0",projectName:n,created:new Date().toISOString(),modified:new Date().toISOString(),pages:[r],_migrationVersion:Ht,globalDesign:{version:1,tokens:S,fonts:[],site:{backgroundMode:"white",backgroundColor:"#FFFFFF"},effects:{enableShadows:!0,enableRoundedCorners:!0,animationSpeed:"normal",enableSurfaceTransitions:!0,revealOnScroll:!1,revealStyle:"fade-up",revealDistancePx:16,revealDurationMs:700,revealStaggerMs:90,revealEasing:"cubic-bezier(0.2, 0.7, 0.2, 1)",revealDesktopOnly:!0}},settings:{siteDescription:"",siteKeywords:"",ogImage:"",yandexWebmasterVerification:"",googleSiteVerification:"",yandexMetrikaId:"",googleAnalyticsId:"",noindex:!1,nofollow:!1,customHtml:{head:"",body:"",deferScripts:!1},...a,siteTitle:String(a.siteTitle||n)}};t({project:o,currentPageId:r.id,blockAddTargetPageId:r.id}),F(o),q.success("Новый проект создан",{icon:"✨"})},loadProject:n=>{var o;const r=Ut(n),a=((o=r.pages[0])==null?void 0:o.id)||null;t({project:r,currentPageId:a,blockAddTargetPageId:a,blockAddInsertAfterBlockId:null})},setEditingTemplate:n=>t({editingTemplate:n||null}),clearEditingTemplate:()=>t({editingTemplate:null}),saveProject:()=>{const{project:n}=e();if(!n)return;const r={...n,modified:new Date().toISOString()};t({project:r}),F(r);const a=Ct(r),o=new Blob([JSON.stringify(a,null,2)],{type:"application/json"}),l=URL.createObjectURL(o),c=document.createElement("a");c.href=l,c.download=`${r.projectName}.nordic`,c.click(),URL.revokeObjectURL(l)},saveProjectWithAssets:async()=>{const{project:n}=e();if(n)try{const r={...n,modified:new Date().toISOString()};t({project:r}),F(r);const a=Ct(r),{default:o}=await j(async()=>{const{default:b}=await import("./vendor-jszip-G5TR8LEN.js").then(h=>h.j);return{default:b}},[]),l=new o,c=`${r.projectName||"project"}.nordic`;l.file(c,JSON.stringify(a,null,2));const d=await Ei(),f=[],u=(b,h)=>{const P=String(b||""),v=P.lastIndexOf(".");if(v>0&&v<P.length-1){const N=P.slice(v).toLowerCase();if(/^\.[a-z0-9]{1,10}$/.test(N))return N}const A=String(h||"").toLowerCase();return A==="image/jpeg"?".jpg":A==="image/png"?".png":A==="image/webp"?".webp":A==="image/gif"?".gif":A==="image/svg+xml"?".svg":A==="application/pdf"?".pdf":A==="application/zip"?".zip":A==="text/plain"?".txt":""};for(const b of d){const h=await Be(b.id);if(!(h!=null&&h.blob))continue;const P=u(h.name,h.mime)||".bin",v=/^\.[a-z0-9]{1,10}$/.test(P)?P:".bin",A=`${h.id}${v}`;l.file(`assets/${A}`,h.blob),f.push({id:h.id,kind:h.kind,name:h.name,mime:h.mime,size:h.size,createdAt:h.createdAt,fileName:A})}l.file("assets/manifest.json",JSON.stringify({version:1,projectFileName:c,files:f},null,2));const p=await l.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:9}}),y=URL.createObjectURL(p),m=document.createElement("a");m.href=y,m.download=`${n.projectName||"project"}.nordic.zip`,m.click(),URL.revokeObjectURL(y),q.success("Проект + медиа экспортированы (ZIP)",{icon:"📦"})}catch(r){console.error(r),q.error("Не удалось экспортировать ZIP с медиа")}},importProjectFile:async n=>{var o,l,c,d;const r=String((n==null?void 0:n.name)||"").toLowerCase();if(!n)return;const a=q.loading("Импортирую проект…");try{try{const y=e().project;y&&(await ne({project:y,label:"Перед импортом (авто)",reason:"auto:import"}),await ye(80))}catch{}if(r.endsWith(".zip")){const{default:y}=await j(async()=>{const{default:_}=await import("./vendor-jszip-G5TR8LEN.js").then(k=>k.j);return{default:_}},[]),m=await y.loadAsync(n),b=_=>{const k=String(_||"").toLowerCase();return k==="jpg"||k==="jpeg"?"image/jpeg":k==="png"?"image/png":k==="webp"?"image/webp":k==="gif"?"image/gif":k==="svg"?"image/svg+xml":k==="pdf"?"application/pdf":"application/octet-stream"};let h=null;const P=m.file("assets/manifest.json");if(P)try{h=JSON.parse(await P.async("string"))}catch{h=null}const v=String((h==null?void 0:h.projectFileName)||"").trim(),A=(v?m.file(v):null)||m.file("project.nordic")||Object.values(m.files).find(_=>!_.dir&&String(_.name||"").toLowerCase().endsWith(".nordic"))||null,N=m.file("nordic-template.json")||Object.values(m.files).find(_=>!_.dir&&String(_.name||"").toLowerCase().endsWith("nordic-template.json"))||m.file("site.json")||Object.values(m.files).find(_=>!_.dir&&String(_.name||"").toLowerCase()==="site.json")||null,B=A||N,Z=A?"nordic":N?"template":"none";if(!B||Z==="none"){q.error("В ZIP не найден файл проекта (*.nordic, nordic-template.json или site.json)");return}const I=await B.async("string"),Y=Ct(JSON.parse(I)),$=Ut(Y),mt=Array.isArray(h==null?void 0:h.files)?h.files:[];let at=0;if(Z==="nordic")for(const _ of mt){const k=String((_==null?void 0:_.id)||"").trim();if(!k)continue;const E=_!=null&&_.fileName?`assets/${String(_.fileName)}`:null,T=(E?m.file(E):null)||Object.values(m.files).find(C=>!C.dir&&String(C.name||"").startsWith(`assets/${k}.`))||Object.values(m.files).find(C=>!C.dir&&String(C.name||"")===`assets/${k}`)||null;if(!T)continue;const O=await T.async("blob"),L=String((_==null?void 0:_.mime)||(O==null?void 0:O.type)||"application/octet-stream"),it=String((_==null?void 0:_.name)||k),dt=String((_==null?void 0:_.kind)||"file"),ut=Number((_==null?void 0:_.size)||(O==null?void 0:O.size)||0),pt=Number((_==null?void 0:_.createdAt)||Date.now());await Ie({id:k,kind:dt,name:it,mime:L,size:ut,createdAt:pt,blob:O});try{At.getState().registerBlob(k,O,{kind:dt,name:it,mime:L,size:ut,createdAt:pt})}catch{}at++}else if(Z==="template"){const _=Ce($);for(const k of _){const E=m.file(`assets/nb/${k}`)||Object.values(m.files).find(C=>!C.dir&&String(C.name||"").startsWith(`assets/nb/${k}.`))||null;if(!E)continue;const T=await E.async("blob"),O=String(E.name||k),L=String(O).split(".").pop()||"",it=String((T==null?void 0:T.type)||b(L)),dt=it.startsWith("image/")?"image":"file",ut=Number((T==null?void 0:T.size)||0),pt=Date.now();await Ie({id:k,kind:dt,name:k,mime:it,size:ut,createdAt:pt,blob:T});try{At.getState().registerBlob(k,T,{kind:dt,name:k,mime:it,size:ut,createdAt:pt})}catch{}at++}}$.modified=new Date().toISOString(),t({project:$,currentPageId:((o=$.pages[0])==null?void 0:o.id)||null,blockAddTargetPageId:((l=$.pages[0])==null?void 0:l.id)||null}),F($);try{await ne({project:$,label:"После импорта (авто)",reason:"auto:import"}),await ye(80)}catch{}await At.getState().init(),Z==="template"?q.success(at>0?`Импортирован шаблон + ${at} медиа (экспортный ZIP)`:"Импортирован шаблон из экспортного ZIP (nordic-template.json)",{id:a,icon:"📥"}):q.success(`Импортировано: проект + ${at} медиа`,{id:a,icon:"📥"});return}const f=await n.text(),u=Ct(JSON.parse(f)),p=Ut(u);try{const y=Ce(p);y.length>0&&q.error(`В этом файле есть медиа (${y.length}), но они не приложены. Используйте экспорт ZIP «Проект + медиа».`,{duration:9e3})}catch{}p.modified=new Date().toISOString(),t({project:p,currentPageId:((c=p.pages[0])==null?void 0:c.id)||null,blockAddTargetPageId:((d=p.pages[0])==null?void 0:d.id)||null}),F(p);try{await ne({project:p,label:"После импорта (авто)",reason:"auto:import"}),await ye(80)}catch{}q.success("Проект импортирован",{id:a,icon:"📥"})}catch(f){console.error(f),q.error("Не удалось импортировать проект",{id:a})}},addPage:n=>{const{project:r}=e();if(!r)return;const a=Te(n,{allowSlashes:!0}),o=Qt(a,{allowSlashes:!0}),l=ie(o||"page",r.pages.map(d=>d.slug)),c={id:vt(),name:n,slug:l,blocks:[],published:!0,adaptive:!0,seo:{},html:{}};t({project:{...r,pages:[...r.pages,c]}})},clonePage:(n,r)=>{var v;const{project:a,currentPageId:o}=e();if(!a)return null;const l=a.pages.find(A=>A.id===n)||null;if(!l)return null;const c=A=>{if(A!==void 0)try{return JSON.parse(JSON.stringify(A))}catch{return A}},d=a.pages.map(A=>A.slug),f=String((r==null?void 0:r.slug)??l.slug),u=Qt(f,{allowSlashes:!0})||"page",p=ie(u,d),y=String((r==null?void 0:r.name)??l.name).trim()||"Без названия",m={...c(l),id:vt(),name:y,slug:p,blocks:Array.isArray(l.blocks)?c(l.blocks):[],seo:c(l.seo||{}),html:c(l.html||{}),published:l.published!==!1,adaptive:l.adaptive!==!1},b={...a,pages:[...a.pages,m],modified:new Date().toISOString()};t({project:b,currentPageId:o||((v=b.pages[0])==null?void 0:v.id)||null}),F(b);const{history:h,historyIndex:P}=R(b,e().history,e().historyIndex);return t({history:h,historyIndex:P}),m.id},updatePage:(n,r)=>{var y;const{project:a,currentPageId:o}=e();if(!a)return;const l=a.pages,c=l.map(m=>m.slug),d=l.map((m,b)=>{if(m.id!==n)return m;
178const h=b===0,P=r.name??m.name,v=r.slug??m.slug,A=h?"index":ie(Qt(String(v||""),{allowSlashes:!0})||Te(String(P||""),{allowSlashes:!0}),c,m.slug);return{...m,...r,name:String(P||"").trim()||"Без названия",slug:A,published:r.published!==!1,adaptive:r.adaptive!==!1,seo:{...m.seo||{},...r.seo||{}},html:{...m.html,...r.html||{}}}}),f={...a,pages:d,modified:new Date().toISOString()};t({project:f,currentPageId:o||((y=d[0])==null?void 0:y.id)||null}),F(f);const{history:u,historyIndex:p}=R(f,e().history,e().historyIndex);t({history:u,historyIndex:p})},removePage:n=>{var f;const{project:r,currentPageId:a,blockAddTargetPageId:o}=e();if(!r)return;const l=r.pages.filter(u=>u.id!==n),c=a===n?((f=l[0])==null?void 0:f.id)||null:a,d=o===n?c:o;t({project:{...r,pages:l},currentPageId:c,blockAddTargetPageId:d})},setCurrentPage:n=>{t({currentPageId:n,blockAddTargetPageId:n,blockAddInsertAfterBlockId:null,selectedBlockId:null})},setBlockAddTargetPageId:n=>{t({blockAddTargetPageId:n,blockAddInsertAfterBlockId:null})},setBlockAddInsertAfterBlockId:n=>{t({blockAddInsertAfterBlockId:n})},addBlock:async n=>{var k;console.log(`
179🚀 [addBlock] Начало добавления блока: ${n}`);const r=qs(n),a=r?Fs(re.getState().state,r):null;if(r&&!a)return console.error(`❌ [addBlock] Шаблон не найден: ${n}`),q.error("Шаблон блока не найден. Возможно, он был удалён или ещё не опубликован.",{duration:3200}),!1;const o=a?"design-block-02":n,{project:l,currentPageId:c,blockAddTargetPageId:d,blockAddInsertAfterBlockId:f}=e();if(!l||!c)return console.error("❌ [addBlock] Нет проекта или currentPageId"),q.error("Не удалось добавить блок: проект не загружен",{duration:2600}),!1;const{blockRegistry:u}=await j(async()=>{const{blockRegistry:E}=await import("./BlockRegistry-BWFal0S2.js").then(T=>T.B);return{blockRegistry:E}},[]),p=d&&l.pages.some(E=>E.id===d)?d:c,y=p===c?f:null;console.log(`📥 [addBlock] Загружаем блок ${o}...`);const m=await u.loadBlock(o);if(!m)return console.error(`❌ [addBlock] Не удалось загрузить блок ${o}`),q.error("Блок не загрузился. Если вы только что обновили редактор/добавили новый блок — нажмите F5.",{duration:4200}),!1;console.log("✅ [addBlock] Блок загружен, schema:",m.schema),console.log("📋 [addBlock] Получаем defaults из schema...");const b=u.getDefaultData(o);console.log("📦 [addBlock] Полученные defaults:",b);const h=E=>{if(E!==void 0)try{return JSON.parse(JSON.stringify(E))}catch{return E}},P=a!=null&&a.data?h(a.data):b,v={id:vt(),type:o,version:"1.0.0",data:P,visible:!0,layout:a!=null&&a.layout?h(a.layout):{contentWidth:1140,contentWidthUnit:"px",paddingTop:80,paddingRight:20,paddingBottom:80,paddingLeft:20,minHeight:0,heightUnit:"auto",background:{type:"color",color:"#ffffff"}}};if(o==="hero-02-magic"&&v.layout&&(v.layout.minHeight=100,v.layout.heightUnit="vh"),(m==null?void 0:m.category)==="menu"||String(o).startsWith("menu-")){const E={...v,id:Lt,layout:{...v.layout,paddingTop:0,paddingRight:0,paddingBottom:0,paddingLeft:0,minHeight:void 0}},T={...l,settings:{...l.settings||{},globalHeaderBlock:E},modified:new Date().toISOString()};t({project:T,selectedBlockId:Lt,blockAddInsertAfterBlockId:null}),F(T);const{history:O,historyIndex:L}=R(T,e().history,e().historyIndex);return t({history:O,historyIndex:L}),q.success("Меню установлено на всех страницах",{duration:2200,icon:"🧭"}),!0}if((m==null?void 0:m.category)==="footer"||String(o).startsWith("footer-")){const E={...v,id:Rt},T={...l,settings:{...l.settings||{},globalFooterBlock:E},modified:new Date().toISOString()};t({project:T,selectedBlockId:Rt,blockAddInsertAfterBlockId:null}),F(T);const{history:O,historyIndex:L}=R(T,e().history,e().historyIndex);return t({history:O,historyIndex:L}),q.success("Подвал установлен на всех страницах",{duration:2200,icon:"🧱"}),!0}console.log("✅ [addBlock] Создан блок:",{id:v.id,type:n,hasLayout:!!v.layout,dataKeys:Object.keys(v.data),data:v.data,title:v.data.title,subtitle:v.data.subtitle,buttonText:v.data.buttonText});const A=e(),N=A.project,B=A.currentPageId;if(!N||!B)return q.error("Не удалось добавить блок: проект не загружен",{duration:2600}),!1;const Z=p&&N.pages.some(E=>E.id===p)?p:B,I=Z===B?y:null,Y=N.pages.map(E=>{if(E.id!==Z)return E;const T=Array.isArray(E.blocks)?E.blocks:[];if(!I)return{...E,blocks:[...T,v]};const O=T.findIndex(L=>(L==null?void 0:L.id)===I);return O===-1?{...E,blocks:[...T,v]}:{...E,blocks:[...T.slice(0,O+1),v,...T.slice(O+1)]}}),$={...N,pages:Y,modified:new Date().toISOString()},mt=Z===B;t({project:$,selectedBlockId:mt?v.id:e().selectedBlockId,blockAddInsertAfterBlockId:null}),F($);const{history:at,historyIndex:_}=R($,e().history,e().historyIndex);if(t({history:at,historyIndex:_}),mt)q.success("Блок добавлен",{duration:2e3,icon:"✅"});else{const E=(k=N.pages.find(T=>T.id===Z))==null?void 0:k.name;q.success(`Блок добавлен в страницу: ${E||"страница"}`,{duration:2500,icon:"📄"})}return!0},removeBlock:n=>{const{project:r,currentPageId:a,selectedBlockId:o}=e();if(!r||!a)return;if(n===Lt){const u={...r.settings||{}};delete u.globalHeaderBlock;const p={...r,settings:u,modified:new Date().toISOString()};t({project:p,selectedBlockId:o===n?null:o}),F(p);const{history:y,historyIndex:m}=R(p,e().history,e().historyIndex);t({history:y,historyIndex:m}),q.success("Меню удалено",{duration:2e3,icon:"🗑️"});return}if(n===Rt){const u={...r.settings||{}};delete u.globalFooterBlock;const p={...r,settings:u,modified:new Date().toISOString()};t({project:p,selectedBlockId:o===n?null:o}),F(p);const{history:y,historyIndex:m}=R(p,e().history,e().historyIndex);t({history:y,historyIndex:m}),q.success("Подвал удалён",{duration:2e3,icon:"🗑️"});return}const l=r.pages.map(u=>u.id===a?{...u,blocks:u.blocks.filter(p=>p.id!==n)}:u),c={...r,pages:l,modified:new Date().toISOString()};t({project:c,selectedBlockId:o===n?null:o}),F(c);const{history:d,historyIndex:f}=R(c,e().history,e().historyIndex);t({history:d,historyIndex:f}),q.success("Блок удалён",{duration:2e3,icon:"🗑️"})},updateBlock:(n,r)=>{var u,p;const{project:a,currentPageId:o}=e();if(!a||!o)return;if(n===Lt){const y=(u=a.settings)==null?void 0:u.globalHeaderBlock;if(!y)return;const{layout:m,designOverrides:b,block:h,...P}=r||{},v={...y,...h&&typeof h=="object"?h:{},...m&&{layout:m},...b!==void 0&&{designOverrides:b},...Object.keys(P).length>0?{data:{...y.data||{},...P}}:{}},A={...a,settings:{...a.settings||{},globalHeaderBlock:v},modified:new Date().toISOString()};t({project:A}),F(A);const{history:N,historyIndex:B}=R(A,e().history,e().historyIndex);t({history:N,historyIndex:B});return}if(n===Rt){const y=(p=a.settings)==null?void 0:p.globalFooterBlock;if(!y)return;const{layout:m,designOverrides:b,block:h,...P}=r||{},v={...y,...h&&typeof h=="object"?h:{},...m&&{layout:m},...b!==void 0&&{designOverrides:b},...Object.keys(P).length>0?{data:{...y.data||{},...P}}:{}},A={...a,settings:{...a.settings||{},globalFooterBlock:v},modified:new Date().toISOString()};t({project:A}),F(A);const{history:N,historyIndex:B}=R(A,e().history,e().historyIndex);t({history:N,historyIndex:B});return}const l=a.pages.map(y=>y.id===o?{...y,blocks:y.blocks.map(m=>{if(m.id===n){const{layout:b,designOverrides:h,block:P,...v}=r;return{...m,...P&&typeof P=="object"?P:{},...b&&{layout:b},...h!==void 0&&{designOverrides:h},...Object.keys(v).length>0&&{data:{...m.data,...v}}}}return m})}:y),c={...a,pages:l,modified:new Date().toISOString()};t({project:c}),F(c);const{history:d,historyIndex:f}=R(c,e().history,e().historyIndex);t({history:d,historyIndex:f})},moveBlock:(n,r)=>{const{project:a,currentPageId:o}=e();if(!a||!o)return;const l=a.pages.map(u=>{if(u.id===o){const p=[...u.blocks],y=p.findIndex(b=>b.id===n),[m]=p.splice(y,1);return p.splice(r,0,m),{...u,blocks:p}}return u}),c={...a,pages:l,modified:new Date().toISOString()};t({project:c}),F(c);const{history:d,historyIndex:f}=R(c,e().history,e().historyIndex);t({history:d,historyIndex:f})},selectBlock:n=>
179{const r=e().selectedBlockBackgroundPopover,a=!!r&&r.blockId===n;if(n===null){t({selectedBlockId:null,selectedElement:null,selectedOverrideElement:null,selectedBlockBackgroundPopover:null});return}if(n===Lt||n===Rt){t({selectedBlockId:n,selectedElement:null,selectedOverrideElement:null,selectedBlockBackgroundPopover:a?r:null});return}const{project:o,currentPageId:l}=e();if(t({selectedBlockId:n,selectedOverrideElement:null,selectedBlockBackgroundPopover:a?r:null}),o&&l){const c=o.pages.find(f=>f.id===l),d=c==null?void 0:c.blocks.find(f=>f.id===n);if(d&&d.elements){const f=d.elements,u=Object.keys(f)[0];if(u){const p=f[u];t({selectedElement:{blockId:n,elementId:u,element:p}})}}else t({selectedElement:null})}},updateGlobalDesign:n=>{var d,f;const{project:r}=e();if(!r)return;const a=(()=>{var b,h;if(n.styleSlots===void 0)return(b=r.globalDesign)==null?void 0:b.styleSlots;const u=(h=r.globalDesign)==null?void 0:h.styleSlots,p=n.styleSlots,y=u&&typeof u=="object"?u.roles:void 0,m=p&&typeof p=="object"?p.roles:void 0;return{...u&&typeof u=="object"?u:{},...p&&typeof p=="object"?p:{},roles:{...y&&typeof y=="object"?y:{},...m&&typeof m=="object"?m:{}}}})(),o={...r,globalDesign:{...r.globalDesign,...n.tokens!==void 0?{tokens:n.tokens}:{},...n.fonts!==void 0?{fonts:n.fonts}:{},...n.styleSlots!==void 0?{styleSlots:a}:{},site:{...(d=r.globalDesign)==null?void 0:d.site,...n.site},effects:{...(f=r.globalDesign)==null?void 0:f.effects,...n.effects}},modified:new Date().toISOString()};t({project:o}),F(o);const{history:l,historyIndex:c}=R(o,e().history,e().historyIndex);t({history:l,historyIndex:c})},updateProjectSettings:n=>{const{project:r}=e();if(!r)return;const a={...r,settings:{...r.settings||{},...n||{}},modified:new Date().toISOString()};t({project:a}),F(a);const{history:o,historyIndex:l}=R(a,e().history,e().historyIndex);t({history:o,historyIndex:l})},updateCurrentPageSeo:n=>{const{project:r,currentPageId:a}=e();if(!r||!a)return;const o=r.pages.map(f=>f.id!==a?f:{...f,seo:{...f.seo||{},...n||{}}}),l={...r,pages:o,modified:new Date().toISOString()};t({project:l}),F(l);const{history:c,historyIndex:d}=R(l,e().history,e().historyIndex);t({history:c,historyIndex:d})},applyProject:n=>{var u;const{project:r,currentPageId:a}=e();if(!r)return;const o=n(r),c={...Ut(o),modified:new Date().toISOString()};t({project:c,currentPageId:a||((u=c.pages[0])==null?void 0:u.id)||null}),F(c);const{history:d,historyIndex:f}=R(c,e().history,e().historyIndex);t({history:d,historyIndex:f})},autoSave:()=>{const{project:n}=e();n&&F(n)},undo:()=>{const{history:n,historyIndex:r}=e();if(r>0){const a=n[r-1];t({project:a.project,historyIndex:r-1}),q.success("Отменено",{duration:1500,icon:"↶"})}},redo:()=>{const{history:n,historyIndex:r}=e();if(r<n.length-1){const a=n[r+1];t({project:a.project,historyIndex:r+1}),q.success("Повторено",{duration:1500,icon:"↷"})}},canUndo:()=>e().historyIndex>0,canRedo:()=>e().historyIndex<e().history.length-1,setViewMode:n=>{const{project:r}=e();r&&t({project:{...r,viewMode:n}})},duplicateBlock:n=>{const{project:r,currentPageId:a}=e();if(!r||!a)return;const o=r.pages.find(m=>m.id===a),l=o==null?void 0:o.blocks.find(m=>m.id===n);if(!l)return;const c={...l,id:vt(),data:JSON.parse(JSON.stringify(l.data)),layout:l.layout?JSON.parse(JSON.stringify(l.layout)):void 0,visible:!0},d=o.blocks.findIndex(m=>m.id===n),f=r.pages.map(m=>{if(m.id===a){const b=[...m.blocks];return b.splice(d+1,0,c),{...m,blocks:b}}return m}),u={...r,pages:f,modified:new Date().toISOString()};t({project:u,selectedBlockId:c.id}),F(u);const{history:p,historyIndex:y}=R(u,e().history,e().historyIndex);t({history:p,historyIndex:y}),q.success("Блок продублирован",{duration:2e3,icon:"📋"})},toggleBlockVisibility:n=>{var m;const{project:r,currentPageId:a}=e();if(!r||!a)return;const o=(r==null?void 0:r.viewMode)==="mobile"?"mobile":"desktop",l=r.pages.map(b=>b.id===a?{...b,blocks:b.blocks.map(h=>h.id===n?(()=>{var Y,$;const P=h.visible!==!1,v=typeof((Y=h==null?void 0:h.visibility)==null?void 0:Y.desktop)=="boolean"?h.visibility.desktop:P,A=typeof(($=h==null?void 0:h.visibility)==null?void 0:$.mobile)=="boolean"?h.visibility.mobile:P,N=o==="desktop"?!v:v,B=o==="mobile"?!A:A;return{...h,visibility:{desktop:N,mobile:B},visible:N||B}})():h)}:b),c={...r,pages:l,modified:new Date().toISOString()};t({project:c}),F(c);const{history:d,historyIndex:f}=R(c,e().history,e().historyIndex);t({history:d,historyIndex:f});const u=(m=l.find(b=>b.id===a))==null?void 0:m.blocks.find(b=>b.id===n),p=(u==null?void 0:u.visible)!==!1,y=(()=>
179{if(!u)return!0;const b=u==null?void 0:u.visibility,h=typeof(b==null?void 0:b.desktop)=="boolean"?b.desktop:p,P=typeof(b==null?void 0:b.mobile)=="boolean"?b.mobile:p;return o==="mobile"?P:h})();q.success(y?"Блок показан":"Блок скрыт",{duration:2e3,icon:y?"👁️":"🙈"})},focusBlockSettingsSection:(n,r,a)=>{t({settingsFocus:{blockId:n,panelTab:r,section:a,nonce:Date.now()}})},clearSettingsFocus:()=>{t({settingsFocus:null})},addToFavorites:async(n,r)=>{const{project:a,currentPageId:o}=e();if(!a||!o)return;const l=a.pages.find(u=>u.id===o),c=l==null?void 0:l.blocks.find(u=>u.id===n);if(!c)return;const d={id:vt(),name:r,type:c.type,data:JSON.parse(JSON.stringify(c.data)),createdAt:new Date().toISOString()},f={...a,favoriteBlocks:[...a.favoriteBlocks||[],d],modified:new Date().toISOString()};t({project:f}),F(f),q.success(`Сохранено в избранное: ${r}`,{duration:2e3,icon:"⭐"})},removeFromFavorites:n=>{const{project:r}=e();if(!r)return;const a={...r,favoriteBlocks:(r.favoriteBlocks||[]).filter(o=>o.id!==n),modified:new Date().toISOString()};t({project:a}),F(a),q.success("Удалено из избранного",{duration:2e3,icon:"🗑️"})},addBlockFromFavorite:n=>{var p;const{project:r,currentPageId:a}=e();if(!r||!a)return;const o=(p=r.favoriteBlocks)==null?void 0:p.find(y=>y.id===n);if(!o)return;const l={id:vt(),type:o.type,version:"1.0.0",data:JSON.parse(JSON.stringify(o.data)),visible:!0},c=r.pages.map(y=>y.id===a?{...y,blocks:[...y.blocks,l]}:y),d={...r,pages:c,modified:new Date().toISOString()};t({project:d,selectedBlockId:l.id}),F(d);const{history:f,historyIndex:u}=R(d,e().history,e().historyIndex);t({history:f,historyIndex:u}),q.success("Блок добавлен из избранного",{duration:2e3,icon:"⭐"})},selectElement:(n,r)=>{const{project:a,currentPageId:o}=e();if(!a||!o)return;const l=a.pages.find(u=>u.id===o),c=l==null?void 0:l.blocks.find(u=>u.id===n);if(!c)return;const d=c.elements;if(!d){console.warn("⚠️ Блок не поддерживает Element-based архитектуру");return}const f=d[r];if(!f){console.warn(`⚠️ Элемент ${r} не найден в блоке ${n}`);return}t({selectedElement:{blockId:n,elementId:r,element:f},selectedBlockId:n,selectedOverrideElement:null}),console.log(`✅ Выбран элемент: ${r} в блоке ${n}`,f)},updateElement:(n,r,a)=>{const{project:o,currentPageId:l}=e();if(!o||!l)return;const c=o.pages.map(p=>p.id===l?{...p,blocks:p.blocks.map(y=>{if(y.id===n){const m=y.elements;if(!m||!m[r])return y;const b=m[r],h=a(b);return{...y,elements:{...m,[r]:{...b,...h}}}}return y})}:p),d={...o,pages:c,modified:new Date().toISOString()};t({project:d}),F(d);const{history:f,historyIndex:u}=R(d,e().history,e().historyIndex);t({history:f,historyIndex:u}),console.log(`✅ Обновлён элемент: ${r}`)},deselectElement:()=>{t({selectedElement:null}),console.log("✅ Снято выделение с элемента")},setOverrideElement:(n,r)=>{t({selectedOverrideElement:{blockId:n,elementKey:r},selectedBlockId:n,selectedElement:null,selectedBlockBackgroundPopover:null})},clearOverrideElement:()=>{t({selectedOverrideElement:null})},setBlockBackgroundPopover:n=>{t({selectedBlockBackgroundPopover:{blockId:n},selectedBlockId:n,selectedElement:null,selectedOverrideElement:null})},clearBlockBackgroundPopover:()=>{t({selectedBlockBackgroundPopover:null})},resetProject:()=>{try{localStorage.removeItem(Me)}catch(n){console.error("Ошибка очистки localStorage:",n)}
179t({project:null,currentPageId:null,selectedBlockId:null,selectedElement:null,selectedOverrideElement:null,selectedBlockBackgroundPopover:null,history:[],historyIndex:-1}),q.success("Проект сброшен",{duration:2e3,icon:"🧹"})}}}),Bi={"Advent Pro":[100,200,300,400,500,600,700,800,900],"Alumni Sans":[100,200,300,400,500,600,700,800,900],"Amatic SC":[400,700],Cormorant:[400,700],"Cormorant Infant":[300,400,500,600,700],"Cormorant Unicase":[300,400,500,600,700],Cuprum:[400,500,600,700],"Dela Gothic One":[400],"Fira Sans Condensed":[100,200,300,400,500,600,700,800,900],"Fira Sans Extra Condensed":[100,200,300,400,500,600,700,800,900],"Great Vibes":[400],Inter:[400,700],Literata:[400,700],Merriweather:[400,700],Montserrat:[100,200,300,400,500,600,700,800,900],"Montserrat Alternates":[100,200,300,400,500,600,700,800,900],"Noto Serif Display":[100,200,300,400,500,600,700,800,900],Oranienbaum:[400],Oswald:[400,700],Philosopher:[400,700],Play:[400,700],"Playfair Display":[400,700],"Playfair Display SC":[400,700,900],"Poiret One":[400],"PT Sans Narrow":[400,700],Roboto:[400,700],"Russo One":[400],"Science Gothic":[100,200,300,400,500,600,700,800,900],"Sofia Sans Condensed":[100,200,300,400,500,600,700,800,900],Unbounded:[200,300,400,500,600,700,800,900],"Yanone Kaffeesatz":[200,300,400,500,600,700]},$s={"Advent Pro":"advent-pro","Alumni Sans":"alumni-sans","Amatic SC":"amatic-sc","Cormorant Infant":"cormorant-infant","Cormorant Unicase":"cormorant-unicase",Cuprum:"cuprum","Dela Gothic One":"dela-gothic-one","Fira Sans Condensed":"fira-sans-condensed","Fira Sans Extra Condensed":"fira-sans-extra-condensed","Great Vibes":"great-vibes",Montserrat:"montserrat","Montserrat Alternates":"montserrat-alternates","Noto Serif Display":"noto-serif-display",Oranienbaum:"oranienbaum",Philosopher:"philosopher",Play:"play","Playfair Display SC":"playfair-display-sc","Poiret One":"poiret-one","PT Sans Narrow":"pt-sans-narrow","Russo One":"russo-one","Science Gothic":"science-gothic","Sofia Sans Condensed":"sofia-sans-condensed",Unbounded:"unbounded","Yanone Kaffeesatz":"yanone-kaffeesatz"};function ba(t){const e=String(t??"").trim();if(!e)return null;const i=Bi[e];return Array.isArray(i)?i:null}function Ls(t){const e=String(t??"").trim();if(!e)return null;const i=$s[e];return typeof i=="string"&&i.trim()?i:null}function Rs(){return Object.keys(Bi).sort((t,e)=>t.localeCompare(e))}const Hs=["Roboto","Open Sans","Montserrat","Oswald","PT Sans","PT Serif","Playfair Display","Merriweather","Ubuntu","Raleway","Lora","Noto Sans","Cormorant","Literata","Spectral","Inter","PT Sans Narrow","Play","Fira Sans Condensed","Fira Sans Extra Condensed","Great Vibes","Unbounded","Advent Pro","Montserrat Alternates","Amatic SC","Yanone Kaffeesatz","Russo One","Alumni Sans","Philosopher","Playfair Display SC","Sofia Sans Condensed","Poiret One","Dela Gothic One","Cuprum","Science Gothic","Noto Serif Display","Cormorant Infant","Cormorant Unicase","Oranienbaum"],Us=Oi(S).map(([t])=>t),Qs=[...Us,"--nb-site-bg","--heading-font","--subheading-font","--heading-weight","--subheading-weight","--heading-line-height","--text-line-height","--mobile-heading-scale","--mobile-subheading-scale","--button-radius","--button-color","--button-hover-color","--button-text-color","--button-text-font","--mobile-button-scale","--button-size-scale","--button-glint-color","--button-glint-duration","--mobile-card-scale","--surface-radius","--media-radius","--nb-border-width","--nb-border-color","--nb-shadow-scale","--nb-shadow-alpha","--nb-shadow-color","--card-color","--card-opacity","--card-color-rgba","--section-padding","--block-gap","--animation-speed","--nb-reveal-distance","--nb-reveal-duration","--nb-reveal-stagger","--nb-reveal-easing","--nb-reveal-desktop-only"],Vs=["--button-bg","--btn-bg","--btn-hover-bg","--nb-radius-card","--nb-radius-media"];function Zs(t){return Array.from(new Set(t))}const Gs=Zs([...Qs,...Vs]),Ni=new Set(Rs().map(t=>String(t||"").trim()).filter(Boolean)),Di=new Set(Hs.map(t=>String(t||"").trim()).filter(Boolean));function Js(t){if(typeof document>"u")return;const e=String(t||"").trim();if(!e)return;const i=`nb-self-hosted-font-${e}`,s=`/assets/fonts/${encodeURIComponent(e)}/__generated.css`;if(document.getElementById(i))return;const r=document.createElement("link");r.id=i,r.rel="stylesheet",r.href=s,document.head.appendChild(r)}function be(t){const e=String(t||"").trim();if(e&&!e.startsWith("var(")){if(Ni.has(e)){const i=Ls(e);if(!i)return;Js(i);return}Di.has(e)}}function Se(t){var n;const e=String(t??"").trim();return!e||e.startsWith("var(")?null:(((n=e.split(",")[0])==null?void 0:n.trim())??"").replace(/^['"]+|['"]+$/g,"").trim()||null}function ke(){return typeof document>"u"?[]:Array.from(document.querySelectorAll("[data-nb-canvas-root],[data-preview-frame]")).filter(
179Boolean)}function Ws(t){const e=new Set,i=[];for(const s of t)s&&(e.has(s)||(e.add(s),i.push(s)));return i}function xe(t){try{for(const e of Gs)t.style.removeProperty(e);t.removeAttribute("data-button-animation"),t.removeAttribute("data-nb-card-bg"),t.removeAttribute("data-nb-surface-motion"),t.removeAttribute("data-nb-reveal-enabled"),t.removeAttribute("data-nb-reveal-desktop-only")}catch{}}function ve(t){try{const e=String((t==null?void 0:t.buttonAnimation)??"").trim();if(e&&e!=="none"&&new Set(["hvr-grow","hvr-shrink","hvr-pulse","hvr-pulse-grow","hvr-bounce-in","hvr-float","hvr-sink","hvr-bob","hvr-wobble-horizontal","nb-glint"]).has(e))return e}catch{}return null}function we(t,e){const i=String(t??"").trim();return i?i.includes(",")||i.startsWith("var(")||i.startsWith('"')||i.startsWith("'")?i:`'${i}', sans-serif`:e}function gi(t,e){const i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);if(!i)return t;const s=parseInt(i[1],16),n=parseInt(i[2],16),r=parseInt(i[3],16);return`rgba(${s}, ${n}, ${r}, ${e/100})`}function Ks(){const t=hi(r=>r.project),e=hi(r=>r.updateGlobalDesign),i=At(r=>r.assetUrls),s=At(r=>r.assetMeta),n=At(r=>r.registerFromDb);x.useEffect(()=>{const r=typeof document<"u"?document.documentElement:null,a=ke(),o=()=>{const u=Ws([r,...a]);for(const p of u)xe(p)};if(!(t!=null&&t.globalDesign)){o();return}const l=t.globalDesign,c=u=>{var Ye,Xe,ti,ei,ii;const p=(w,M)=>{for(const G of u)G.style.setProperty(w,M)},y=w=>{for(const M of u)M.style.removeProperty(w)},m=(w,M)=>{for(const G of u)G.setAttribute(w,M)},b=w=>{for(const M of u)M.removeAttribute(w)},h=(l==null?void 0:l.effects)||{},P=(l==null?void 0:l.site)||{},v=Array.isArray((Ye=t.globalDesign)==null?void 0:Ye.fonts)?t.globalDesign.fonts:[],A=[],N=w=>String(w||"").replace(/\\/g,"\\\\").replace(/"/g,'\\"'),B=(w,M)=>{const G=String(w||"").toLowerCase(),J=String(M||"").toLowerCase();return G.endsWith(".woff2")||J==="font/woff2"?"woff2":G.endsWith(".woff")||J==="font/woff"||J==="application/font-woff"?"woff":G.endsWith(".ttf")||J==="font/ttf"||J==="application/x-font-ttf"?"truetype":G.endsWith(".otf")||J==="font/otf"||J==="application/x-font-opentype"?"opentype":""};for(const w of v){const M=String((w==null?void 0:w.assetRef)||"").trim(),G=String((w==null?void 0:w.name)||"").trim();if(!M||!G)continue;const J=Jn(M);if(!J)continue;n(J);const Nt=i[J];if(!Nt)continue;const St=s[J],Dt=B(St==null?void 0:St.name,St==null?void 0:St.mime),Jt=typeof(w==null?void 0:w.weight)=="number"?w.weight:400,me=String((w==null?void 0:w.style)||"normal")==="italic"?"italic":"normal",he=String((w==null?void 0:w.display)||"swap")||"swap";A.push(`@font-face{font-family:"${N(G)}";src:url("${Nt}")${Dt?` format("${Dt}")`:""};font-weight:${Jt};font-style:${me};font-display:${he};}`)}const Z="nb-custom-fonts";if(A.length){let w=document.getElementById(Z);w||(w=document.createElement("style"),w.id=Z,document.head.appendChild(w)),w.textContent=A.join("")}else{const w=document.getElementById(Z);w&&w.remove()}const I=ws(l);try{Ci(l).length>0&&e({tokens:I})}catch{}try{be(Se(I.typography.fontHeading)),be(Se(I.typography.fontBase));const w=String(((Xe=l==null?void 0:l.effects)==null?void 0:Xe.buttonTextFont)||"").trim();w&&be(Se(w))}catch{}for(const[w,M]of Oi(I)){const G=String(M||"").trim();G?p(w,G):y(w)}const Y=String(P.backgroundMode||"legacy"),$=String(P.backgroundColor||"").trim();Y==="white"?p("--nb-site-bg","#FFFFFF"):Y==="custom"&&$?p("--nb-site-bg",$):y("--nb-site-bg");try{j(()=>import("./onlineFontsRuntime-BzNTKY1Q.js"),[]).then(w=>{try{w.applyOnlineFontsRuntime({globalDesign:l,resolvedTokens:I,customFonts:v,bundledFontFamilies:Ni,builtinFontFamilies:Di})}catch{}})}catch{}const mt={none:0,sm:I.radii.sm,md:I.radii.md,lg:I.radii.lg,xl:I.radii.xl,full:I.radii.full},at=String(((ei=(ti=I.components)==null?void 0:ti.button)==null?void 0:ei.radius)||"md"),_=mt[at]??I.radii.md,k=(ii=I==null?void 0:I.components)==null?void 0:ii.card,E=!!k&&typeof k=="object"&&Object.keys(k).length>0,T=String((k==null?void 0:k.radius)||"large"),O={none:0,small:8,medium:12,large:16,full:9999},L=E?O[T]??16:I.radii.lg,it=String((k==null?void 0:k.mediaRadius)||""),dt=E&&it?O[it]??L:L,ut=Math.round(Math.max(0,Math.min(6,Number.isFinite(Number(k==null?void 0:k.borderWidthPx))?Number(k==null?void 0:k.borderWidthPx):1))),pt=String((k==null?void 0:k.borderColor)||"").trim(),C=Math.max(0,Math.min(2,Number.isFinite(Number(k==null?void 0:k.shadowStrength))?Number(k==null?void 0:k.shadowStrength):1)),yt=Math.max(0,Math.min(2,Number.isFinite(Number(k==null?void 0:k.shadowAlpha))?Number(k==null?void 0:k.shadowAlpha):C)),ot=String((k==null?void 0:k.backgroundMode)||"custom"),D=ot==="auto"?"auto":ot==="glass"?"glass":"custom",X=Math.round(Math.max(0,Math.min(100,Number.isFinite(Number(k==null?void 0:k.backgroundOpacityPct))?Number(k==null?void 0:k.backgroundOpacityPct):100))),W=String((k==null?void 0:k.backgroundColor)||"").trim()||I.colors.surface,qt=String((k==null?void 0:k.shadowColor)||"").trim()||"#0F172A",Tt=gi(qt,100);p("--heading-font",we(I.typography.fontHeading,"'Inter', sans-serif")),p("--subheading-font",we(I.typography.fontBase,"'Inter', sans-serif")),typeof I.typography.weightHeading=="number"&&p("--heading-weight",String(I.typography.weightHeading)),typeof I.typography.weightBase=="number"&&p("--subheading-weight",String(I.typography.weightBase)),p("--heading-line-height",String(I.typography.lineHeight)),p("--text-line-height",String(I.typography.lineHeight));const ht=I.typography.semanticRoleSizesMobileRem,Ft=Number.isFinite(Number(ht==null?void 0:ht.heading)),tt=Number.isFinite(Number(ht==null?void 0:ht.subheading));p("--mobile-heading-scale",Ft?"1":"0.8"),p("--mobile-subheading-scale",tt?"1":"0.9"),p("--button-radius",`${_}px`),p("--button-color",I.colors.primary),p("--button-hover-color",I.colors.accent),p("--button-text-color",I.colors.background);const pe=String((h==null?void 0:h.buttonTextFont)||"").trim()||I.typography.fontBase;p("--button-text-font",we(pe,"'Inter', sans-serif"));const Gt=ve(h);Gt?m("data-button-animation",Gt):b("data-button-animation");const It=String((h==null?void 0:h.buttonSize)||"medium");p("--button-size-scale",String(It==="small"?.9:It==="large"?1.1:1));const nt={small:{paddingX:16,paddingY:8},medium:{paddingX:24,paddingY:12},large:{paddingX:32,paddingY:16}},ft=h==null?void 0:h.buttonSizeTiers,Q=w=>{const M=ft&&typeof ft=="object"?ft[w]:null,G=Number(M==null?void 0:M.paddingX
179),J=Number(M==null?void 0:M.paddingY);return{paddingX:Math.round(Math.max(0,Math.min(96,Number.isFinite(G)?G:nt[w].paddingX))),paddingY:Math.round(Math.max(0,Math.min(64,Number.isFinite(J)?J:nt[w].paddingY)))}},bt=Q("small"),Qe=Q("medium"),Ve=Q("large");p("--nb-cta-padding-x-sm",`${bt.paddingX}px`),p("--nb-cta-padding-y-sm",`${bt.paddingY}px`),p("--nb-cta-padding-x-md",`${Qe.paddingX}px`),p("--nb-cta-padding-y-md",`${Qe.paddingY}px`),p("--nb-cta-padding-x-lg",`${Ve.paddingX}px`),p("--nb-cta-padding-y-lg",`${Ve.paddingY}px`),p("--nb-cta-font-size-sm","14px"),p("--nb-cta-font-size-md","16px"),p("--nb-cta-font-size-lg","18px");const Ze=It==="small"||It==="large"?It:"medium",fe=Ze==="small"?"sm":Ze==="large"?"lg":"md";p("--nb-cta-padding-x",`var(--nb-cta-padding-x-${fe})`),p("--nb-cta-padding-y",`var(--nb-cta-padding-y-${fe})`),p("--nb-cta-font-size",`var(--nb-cta-font-size-${fe})`);const Ge=h==null?void 0:h.mobileButtonScalePct,Li=Number.isFinite(Number(Ge))?Number(Ge):100,Ri=Math.max(60,Math.min(120,Math.round(Li)))/100;p("--mobile-button-scale",String(Ri));const Je=h==null?void 0:h.mobileCardScalePct,Hi=Number.isFinite(Number(Je))?Number(Je):100,Ui=Math.max(60,Math.min(120,Math.round(Hi)))/100;p("--mobile-card-scale",String(Ui));const Qi=String((h==null?void 0:h.buttonGlintColor)||"#FFFFFF").trim()||"#FFFFFF",We=h==null?void 0:h.buttonGlintDurationMs,Vi=Number.isFinite(Number(We))?Number(We):900,Zi=Math.max(200,Math.min(3e3,Math.round(Vi)));p("--button-glint-color",Qi),p("--button-glint-duration",`${Zi}ms`),p("--surface-radius",`${L}px`),p("--media-radius",`${dt}px`),p("--nb-radius-card","var(--surface-radius)"),p("--nb-radius-media","var(--media-radius)"),p("--nb-border-width",`${ut}px`),p("--nb-border-color",pt||I.colors.border),p("--nb-shadow-scale",
179String(C)),p("--nb-shadow-alpha",String(yt)),p("--nb-shadow-color",Tt);const Ke=D==="glass"?Math.min(X,70):X;if(p("--card-color",W),p("--card-opacity",String(Ke/100)),p("--card-color-rgba",gi(W,Ke)),D==="auto"?m("data-nb-card-bg","auto"):D==="glass"?m("data-nb-card-bg","glass"):b("data-nb-card-bg"),p("--button-bg","var(--button-color)"),p("--btn-bg","var(--button-color)"),p("--btn-hover-bg","var(--button-hover-color)"),p("--section-padding",`${I.spacing.section}px`),p("--block-gap",`${I.spacing.md}px`),h){const w={slow:"0.5s",normal:"0.3s",fast:"0.15s"},M=String(h.animationSpeed||"normal");p("--animation-speed",w[M]||"0.3s"),h.enableSurfaceTransitions!==!1?m("data-nb-surface-motion","1"):b("data-nb-surface-motion");const J=typeof h.revealDistancePx=="number"?h.revealDistancePx:void 0;if(J!=null){const Mt=Math.max(0,Math.min(60,Math.round(Number(J)||0)));p("--nb-reveal-distance",`${Mt}px`)}const Nt=typeof h.revealDurationMs=="number"?h.revealDurationMs:void 0;if(Nt!=null){const Mt=Math.max(200,Math.min(2e3,Math.round(Number(Nt)||700)));p("--nb-reveal-duration",`${Mt}ms`)}const St=typeof h.revealStaggerMs=="number"?h.revealStaggerMs:void 0;if(St!=null){const Mt=Math.max(0,Math.min(300,Math.round(Number(St)||0)));p("--nb-reveal-stagger",`${Mt}ms`)}const Dt=String(h.revealEasing||"").trim();Dt&&p("--nb-reveal-easing",Dt);const Jt=h.revealDesktopOnly===!0;p("--nb-reveal-desktop-only",Jt?"1":"0");const me=h.revealOnScroll===!0,he=String(h.revealStyle||"fade-up");me&&he!=="none"?m("data-nb-reveal-enabled","1"):b("data-nb-reveal-enabled"),Jt?m("data-nb-reveal-desktop-only","1"):b("data-nb-reveal-desktop-only"),h.enableShadows===!1&&(p("--nb-shadow-scale","0"),p("--nb-shadow-alpha","0"))}},d=()=>{const u=ke();if(u.length>0){if(c(u),r){xe(r);const p=ve(l==null?void 0:l.effects);p?r.setAttribute("data-button-animation",p):r.removeAttribute("data-button-animation")}return{movedToScope:!0}}return r&&c([r]),{movedToScope:!1}};let f=null;try{f=new MutationObserver(()=>{const u=ke();if(u.length>0){if(c(u),r){xe(r);const p=ve(l==null?void 0:l.effects);p?r.setAttribute("data-button-animation",p):r.removeAttribute("data-button-animation")}return}r&&c([r])}),typeof document<"u"&&document.body&&f.observe(document.body,{childList:!0,subtree:!0})}catch{}return d(),()=>{try{f&&f.disconnect()}catch{}}},[t==null?void 0:t.globalDesign,i,s,n])}function Mi(t){const e=String(t||"").trim();if(!e)return{normalized:"",isValid:!1,error:"Не задан"};const i=/^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(e)?e:`https://${e}`;try{const s=new URL(i);if(s.protocol!=="https:"&&s.protocol!=="http:")return{normalized:e,isValid:!1,error:"Только http/https"};if(!s.hostname)return{normalized:e,isValid:!1,error:"Нет домена"};const n=s.pathname&&s.pathname!=="/"?String(s.pathname).replace(/\/+$/g,""):"";return{normalized:`${s.protocol}//${s.host}${n}`.replace(/\/+$/g,""),isValid:!0}}catch{return{normalized:e,isValid:!1,error:"Некорректный URL"}}}function Ys({siteUrl:t,slug:e}){const i=String(t||"").trim().replace(/\/+$/g,"");if(!i)return"";const s=String(e||"").trim(),n=!s||s==="index"?"":s.replace(/^\/+|\/+$/g,"");return n?`${i}/${n}/`:`${i}/`}function yi(t){const e=String(t||"").trim();if(!e)return"";const i=e.match(/content\s*=\s*["']([^"']+)["']/i);if(i!=null&&i[1])return String(i[1]).trim();const s=e.match(/(?:yandex-verification|google-site-verification)\s*[:=]\s*([a-zA-Z0-9_-]+)/i);return s!=null&&s[1]?String(s[1]).trim():e}function Re(t,e,i){return Math.max(e,Math.min(i,t))}function oe(t,e,i){const s=String(t||"").trim().length;return s===0?{ok:!1,len:s}:{ok:s>=e&&s<=i,len:s}}function Xs(t,e){const i=t||{},s=[];let n=0;const r=Mi(String(i.siteUrl||""));r.isValid?(n+=25,s.push({id:"siteUrl",severity:"good",title:"URL сайта задан",detail:r.normalized,points:25})):s.push({id:"siteUrl",severity:"bad",title:"Не задан URL сайта",detail:"Настройки сайта → Основные → URL сайта (нужен для canonical и sitemap.xml)",points:25});const a=String(i.siteTitle||e||"").trim(),o=oe(a,10,60);
179o.ok?(n+=25,s.push({id:"siteTitle",severity:"good",title:"Название сайта ок",detail:`${o.len} символов`,points:25})):(s.push({id:"siteTitle",severity:o.len===0?"bad":"warn",title:"Название сайта не оптимально",detail:o.len===0?"Заполните siteTitle":`Сейчас ${o.len} символов (лучше 10–60)`,points:25}),o.len>0&&(n+=10));const l=String(i.siteDescription||"").trim(),c=oe(l,50,160);c.ok?(n+=25,s.push({id:"siteDescription",severity:"good",title:"Описание сайта ок",detail:`${c.len} символов`,points:25})):(s.push({id:"siteDescription",severity:(c.len===0,"warn"),title:"Описание сайта можно улучшить",detail:c.len===0?"Добавьте описание по умолчанию":`Сейчас ${c.len} символов (лучше 50–160)`,points:25}),c.len>0&&(n+=10)),String(i.ogImage||"").trim()?(n+=15,s.push({id:"ogImage",severity:"good",title:"OG изображение задано",points:15})):(s.push({id:"ogImage",severity:"warn",title:"Нет OG изображения",detail:"Настройки сайта → SEO → OpenGraph изображение (рекомендуется для соцсетей и сниппетов)",points:15}),n+=5);const f=String(i.language||"ru").trim()||"ru";return n+=10,s.push({id:"language",severity:"good",title:"Язык сайта задан",detail:f,points:10}),n=Re(Math.round(n),0,100),{score:n,issues:s}}function tr(t,e){const i=(t==null?void 0:t.settings)||{},s=Mi(String(i.siteUrl||"")),n=s.isValid?Ys({siteUrl:s.normalized,slug:e.slug}):"",r=[];let a=0;e.published!==!1?(a+=10,r.push({id:"published",severity:"good",title:"Страница публикуется",points:10})):r.push({id:"published",severity:"bad",title:"Страница draft",detail:"Не попадёт в экспорт и sitemap",points:10});const o=String(e.slug||"").trim();o?(a+=10,r.push({id:"slug",severity:"good",title:"URL страницы задан",detail:`/${o}`,points:10})):r.push({id:"slug",severity:"bad",title:"Нет URL (slug)",points:10}),n?(a+=10,r.push({id:"canonical",severity:"good",title:"Canonical будет корректным",detail:n,points:10})):(r.push({id:"canonical",severity:"warn",title:"Canonical не рассчитан",detail
179:"Задайте URL сайта в настройках",points:10}),a+=2);const l=e.seo||{},c=String(l.title||"").trim(),d=oe(c,10,60);d.ok?(a+=25,r.push({id:"title",severity:"good",title:"Title ок",detail:`${d.len} символов`,points:25})):(r.push({id:"title",severity:d.len===0?"bad":"warn",title:"Title не оптимален",detail:d.len===0?"Заполните title":`Сейчас ${d.len} символов (лучше 10–60)`,points:25}),d.len>0&&(a+=10));const f=String(l.description||"").trim(),u=oe(f,50,160);return u.ok?(a+=25,r.push({id:"description",severity:"good",title:"Description ок",detail:`${u.len} символов`,points:25})):(r.push({id:"description",severity:(u.len===0,"warn"),title:"Description можно улучшить",detail:u.len===0?"Добавьте описание страницы":`Сейчас ${u.len} символов (лучше 50–160)`,points:25}),u.len>0&&(a+=10)),!!(l.noindex??i.noindex)?r.push({id:"noindex",severity:"bad",title:"Noindex включён",detail:"Поисковики не будут индексировать",points:10}):(a+=10,r.push({id:"noindex",severity:"good",title:"Indexing разрешена",points:10})),(Array.isArray(e.blocks)?e.blocks:[]).some(b=>String((b==null?void 0:b.type)||"").startsWith("hero-"))?(a+=10,r.push({id:"hero",severity:"good",title:"Есть обложка/hero",points:10})):(r.push({id:"hero",severity:"warn",title:"Нет Hero блока",detail:"Обычно это H1 и главный оффер",points:10}),a+=3),a=Re(Math.round(a),0,100),{score:a,issues:r,canonical:n}}function Sa(t,e){if(!t)return{overall:0,site:0,page:0,canonical:"",issues:[]};const i=t.pages.find(l=>l.id===e)||t.pages[0],s=Xs(t.settings,t.projectName),n=i?tr(t,i):{score:0,issues:[],canonical:""},r=Re(Math.round(s.score*.4+n.score*.6),0,100),a={bad:0,warn:1,good:2},o=[...s.issues,...n.issues].sort((l,c)=>{const d=a[l.severity]-a[c.severity];return d!==0?d:c.points-l.points});return{overall:r,site:s.score,page:n.score,canonical:n.canonical,issues:o}}const bi=JSON.parse('[{"path":"/rossiyskiy-konstruktor-saitov-besplatno","title":"Российский конструктор сайтов бесплатно — НОРДИК","description":"НОРДИК — российский конструктор сайтов: соберите страницы из блоков и скачайте готовый сайт в ZIP. Подходит для прототипов, лендингов и небольших сайтов.","h1":"Российский конструктор сайтов бесплатно","lead":"Соберите сайт в редакторе, скачайте ZIP и разместите где удобно: на своём сервере, хостинге или передайте фрилансеру.","keywords":"российский конструктор сайтов бесплатно, конструктор сайтов, создать сайт бесплатно, скачать сайт zip","audiences":["новичков","малых предпринимателей","маркетологов","студентов"],"faq":[{"q":"Это правда бесплатно?","a":"Да: вы можете собрать проект и протестировать экспорт. Платные функции (если включены) относятся к расширениям и сервисам, но базовый сценарий «собрать и скачать» остаётся доступным."},{"q":"Куда потом размещать сайт?","a":"Куда угодно: обычный статический сайт можно загрузить на любой хостинг (Nginx/Apache), на CDN, на S3‑совместимые хранилища и т.п."},{"q":"Будет ли сайт принадлежать мне?","a":"Да. На выходе вы получаете набор файлов (HTML/CSS/JS/изображения). Их можно хранить, передавать и дорабатывать."}]},{"path":"/sozdat-sait-konstruktor","title":"Создать сайт в конструкторе — быстро и с экспортом файлов","description":"Создайте сайт в конструкторе НОРДИК: соберите блоки, настройте дизайн и скачайте готовые файлы сайта. Удобно для прототипа или запуска за вечер.","h1":"Создать сайт в конструкторе","lead":"Нужен сайт быстро? Соберите структуру, наполните контентом и скачайте готовый сайт как набор файлов.","keywords":"создать сайт конструктор, конструктор сайта, быстрый сайт, экспорт сайта","audiences":["новичков","инфобизнеса","блогеров","авитологов"],"faq":[{"q":"Нужно ли программирование?","a":"Нет. Сайт собирается из блоков. При желании можно отдать ZIP разработчику для дальнейшей доработки."},{"q":"Можно ли сделать лендинг?","a":"Да. Для лендингов сценарий идеален: одна страница, быстрый запуск, потом — экспорт и размещение."}]},{"path":"/onlayn-konstruktor-saitov","title":"Онлайн конструктор сайтов — соберите и скачайте сайт в ZIP","description":"Онлайн конструктор сайтов НОРДИК: редактируйте в браузере, затем экспортируйте статический сайт в ZIP. Без привязки к платформе и без лишней тяжести.","h1":"Онлайн конструктор сайтов","lead":"Редактор работает в браузере, а результат — у вас в виде файлов. Это удобно, если вы хотите контроль над хостингом и скоростью.","keywords":"онлайн конструктор сайтов, конструктор сайтов, экспорт zip, статический сайт","audie
179nces":["маркетологов","малых предпринимателей","фрилансеров"],"faq":[{"q":"Это SaaS как у других конструкторов?","a":"Нет. Мы делаем упор на экспорт: вы получаете файлы и размещаете сайт там, где вам удобно."},{"q":"Что именно скачивается?","a":"Папка проекта со статическими страницами и ассетами (HTML/CSS/JS/картинки), упакованная в ZIP."}]},{"path":"/konstruktor-saitov-s-sohraneniem-na-kompyuter","title":"Конструктор сайтов с сохранением на компьютер — скачать файлы сайта","description":"Соберите сайт и сохраните на компьютер: НОРДИК экспортирует готовый сайт в ZIP (файлы страниц и ресурсов). Удобно для резервных копий и передачи разработчику.","h1":"Конструктор сайтов с сохранением на компьютер","lead":"Если вам важно хранить сайт локально — экспорт в ZIP решает задачу: можно бэкапить, переносить и дорабатывать.","keywords":"конструктор сайтов с сохранением на компьютер, скачать сайт, экспорт сайта, zip","audiences":["студентов","малых предпринимателей","фрилансеров"],"faq":[{"q":"Можно ли хранить несколько версий?","a":"Да. Экспортируйте ZIP и храните как версии проекта/релиза. Это удобно для отката и экспериментов."},{"q":"Подойдёт для передачи фрилансеру?","a":"Да. Вы отдаёте ZIP и ТЗ — исполнитель разворачивает сайт и дорабатывает при необходимости."}]},{"path":"/sozdat-sait-besplatno","title":"Создать сайт бесплатно — конструктор с экспортом на свой хостинг","description":"Создайте сайт бесплатно в НОРДИК: соберите страницы, настройте дизайн и скачайте ZIP. Дальше размещайте на своём хостинге без привязки к платформе.","h1":"Создать сайт бесплатно","lead":"Быстрый старт для лендинга, визитки или прототипа: собрали → скачали → загрузили на сервер.","keywords":"создать сайт бесплатно, конструктор сайтов бесплатно, сделать сайт самому, скачать сайт","audiences":["новичков","блогеров","малых предпринимателей"],"faq":[{"q":"Нужен домен?","a":"Для теста — нет. Дл
179я публикации — да: подключаете домен к вашему хостингу, как для любого сайта."},{"q":"Сайт будет хорошо грузиться?","a":"Статические страницы обычно быстрые: меньше лишнего кода, проще кешировать и отдавать через CDN."}]},{"path":"/russkie-konstruktory-saitov","title":"Русские конструкторы сайтов: почему выбирают экспорт файлов","description":"Русский конструктор сайтов НОРДИК — подход «собрал и скачал». Экспорт ZIP даёт контроль над хостингом и возможность доработок без vendor lock‑in.","h1":"Русские конструкторы сайтов","lead":"Если вам важны контроль, переносимость и скорость — выбирайте конструктор, который отдаёт готовый сайт файлами.","keywords":"русские конструкторы сайтов, российский конструктор, экспорт сайта, скачать сайт","audiences":["малых предпринимателей","маркетологов","инфобизнеса"],"faq":[{"q":"Чем отличается экспорт от «сайта внутри платформы»?","a":"Экспорт = вы получаете файлы и можете разместить где угодно. «Внутри платформы» = вы зависите от сервиса и его условий."},{"q":"Можно ли потом перенести сайт на другой хостинг?","a":"Да. Поскольку это статические файлы, перенос — обычная загрузка на новый хостинг."}]},{"path":"/sobrat-sait-i-skachat","title":"Собрать сайт и скачать — конструктор с экспортом ZIP","description":"Соберите сайт и скачайте ZIP в НОРДИК. Подходит для прототипов, посадочных страниц и небольших сайтов: быстро, понятно, без лишней сложности.","h1":"Собрать сайт и скачать","lead":"Сценарий простой: выбираете блоки → наполняете → экспортируете → размещаете на сервере.","keywords":"собрать сайт и скачать, скачать сайт zip, экспорт сайта, конструктор сайтов","audiences":["новичков","фрилансеров","маркетологов"],"faq":[{"q":"Сколько времени занимает сборка?","a":"Лендинг можно собрать за вечер. Прототип многостраничника — за 1–2 дня, в зависимости от контента."},{"q":"Можно ли подключить аналитику?","a":"Да. Добавляете счётчики/скрипты, и они попадают в экспорт."}]},{"path":"/bystro-sdelat-sait-i-skachat","title":"Быстро сделать сайт и скачать — лендинг или прототип за вечер","description":"Нужно быстро сделать сайт и скачать? НОРДИК помогает собрать лендинг/прототип и экспортировать его в ZIP для размещения на своём сервере.","h1":"Быстро сделать сайт и скачать","lead":"Когда важна скорость: соберите базовую структуру, добавьте текст и CTA, экспортируйте и запускайте.","keywords":"быстро сделать сайт, сделать сайт за вечер, скачать сайт, прототип сайта","audiences":["маркетологов","малых предпринимателей","инфобизнеса"],"faq":[{"q":"Это подходит для MVP?","a":"Да. Для MVP важны скорость и простота: вы быстро проверяете гипотезу и улучшаете позже."},{"q":"Можно ли менять дизайн без дизайнера?","a":"Да. Базовые настройки и блоки позволяют собрать аккуратный вид без сложной верстки."}]},{"path":"/skachat-sait-v-konstruktore","title":"Скачать сайт в конструкторе — экспорт статического сайта в ZIP","description":"Скачайте сайт из конструктора Ð
179ÐžÐ Ð”ИК: экспорт статических файлов (HTML/CSS/JS) в ZIP. Удобно для хостинга, передачи и доработок.","h1":"Скачать сайт в конструкторе","lead":"Вы не «арендуете» сайт — вы получаете файлы. Это снижает зависимость от платформы и упрощает поддержку.","keywords":"скачать сайт в конструкторе, экспорт сайта zip, статический сайт, файлы сайта","audiences":["фрилансеров","малых предпринимателей","студентов"],"faq":[{"q":"Можно ли открыть сайт локально без сервера?","a":"Да, базово страницы откроются как файлы. Но корректнее тестировать через простой локальный сервер (например, nginx или любой static server)."},{"q":"Подходит ли для SEO?","a":"Статика обычно дружелюбна к SEO: меньше лишнего JS, проще кеширование и предсказуемые URL."}]},{"path":"/konstruktor-lendingov-s-eksportom","title":"Конструктор лендингов с экспортом — соберите и скачайте","description":"Соберите лендинг в НОРДИК и скачайте ZIP с файлами сайта. Подходит для рекламы, Avito, лид‑магнитов и быстрых запусков.","h1":"Конструктор лендингов с экспортом","lead":"Лендинг должен быть быстрым и управляемым: контент у вас, хостинг у вас, файлы у вас.","keywords":"конструктор лендингов, лендинг конструктор, скачать лендинг, экспорт сайта","audiences":["авитологов","маркетологов","малых предпринимателей","блогеров"],"faq":[{"q":"Можно ли сделать несколько лендингов под разные офферы?","a":"Да. Создавайте разные страницы/проекты, экспортируйте и публикуйте как отдельные посадочные под кампании."},{"q":"Что с формами заявок?","a":"Формы можно подключать через ваш сервис/скрипт на стороне хостинга. Для лидов важно, что вы контролируете интеграции."}]},{"path":"/konstruktor-saita-vizitki","title":"Конструктор сайта‑визитки — сделать и скачать сайт","description":"Сайт‑визитка за вечер: НОРДИК помогает собрать одну‑две страницы и скачать готовый сайт в ZIP. Размещайте на своём домене без привязки к сервису.","h1":"Конструктор сайта‑визитки","lead":"Идеально для эксперта, мастера или небольшой компании: контакты, услуги, портфолио и кнопка связи.","keywords":"конструктор сайта визитки, сайт визитка, сделать визитку сайт, скачать сайт","audiences":["малых предпринимателей","фрилансеров","студентов"],"faq":[{"q":"Можно ли добавить портфолио и отзывы?","a":"Да. Собираете секции блоками: карточки, галерея, список, цитаты/отзывы."},{"q":"Можно ли добавить кнопки мессенджеров?","a":"Да. На сайте можно показывать плавающие кнопки поддержки и ссылки на Telegram/Max/и т.п."}]},{"path":"/konstruktor-saita-dlya-malogo-biznesa","title":"Конструктор сайта для малого бизнеса — прототип и запуск","description":"Сайт для малого бизнеса без лишней сложности: соберите структуру, добавьте услуги и контакты, скачайте ZIP и разместите на сервере. Удобно как прототип.","h1":"Конструктор сайта для малого бизнеса","lead":"Когда важно быстро запуститься и не зависеть от платформы: экспорт файлов помогает передать сайт в поддержку или на доработку.","keywords":"конструктор сайта для малого бизнеса, сайт компании, быстро сделать сайт, экспорт zip","audie
179nces":["малых предпринимателей","маркетологов","студентов"],"faq":[{"q":"Подойдёт для услуг и прайс‑страниц?","a":"Да. Делайте страницы услуг, FAQ, контакты, кейсы — и связывайте их внутренними ссылками."},{"q":"Можно ли позже передать разработчику?","a":"Да. Это один из ключевых сценариев: вы делаете прототип, потом отдаёте ZIP на доработку."}]},{"path":"/konstruktor-mnogostranichnogo-saita","title":"Конструктор многостраничного сайта — страницы, меню и экспорт ZIP","description":"Соберите многостраничный сайт в НОРДИК: создайте страницы, добавьте меню и скачайте готовый сайт в ZIP. Подходит для услуг, компании, портфолио и каталога.","h1":"Конструктор многостраничного сайта","lead":"Нужен сайт не на одну страницу? Делайте несколько страниц, связывайте их ссылками и экспортируйте как обычные файлы.","keywords":"конструктор многостраничного сайта, многостраничный сайт, создать сайт с несколькими страницами, экспорт zip","audiences":["малых предпринимателей","фрилансеров","маркетологов"],"faq":[{"q":"Можно ли добавить меню?","a":"Да. Вы добавляете ссылки на страницы, и меню работает и в редакторе, и в экспорте."},{"q":"Сколько страниц можно сделать?","a":"Обычно ограничение упирается в ваш контент. Для малого бизнеса 5–20 страниц — типичный диапазон."},{"q":"Подойдёт ли для SEO?","a":"Да, если страницы про разные услуги/темы и есть внутренняя перелинковка. Статика хорошо индексируется."}]},{"path":"/konstruktor-saita-dlya-uslug","title":"Конструктор сайта услуг — быстро собрать и скачать сайт","description":"Сайт услуг в НОРДИК: главная, список услуг, цены, отзывы и контакты. Соберите блоками и скачайте сайт в ZIP для публикации на своём домене.","h1":"Конструктор сайта услуг","lead":"Для услуг важны понятная структура и кнопка заявки. Сделайте страницы услуг и добавьте CTA — дальше экспортируйте и публикуйте.","keywords":"конструктор сайта услуг, сайт услуг, сайт для мастера, создать сайт услуг, скачать сайт","audiences":["малых предпринимателей","самозанятых","фрилансеров"],"faq":[{"q":"Что обязательно добавить на сайт услуг?","a":"Обычно: список услуг/цен, примеры работ, отзывы, контакты и понятный призыв к действию (заявка/звонок)."},{"q":"Можно ли сделать отдельные страницы услуг?","a":"Да. Это удобно и для посетителей, и для SEO: каждая услуга может иметь свою страницу."}]},{"path":"/konstruktor-saita-portfolio","title":"Конструктор сайта‑портфолио — собрать и скачать сайт в ZIP","description":"Сайт‑портфолио в НОРДИК: проекты, кейсы, галерея, описание и контакты. Соберите страницу/разделы и скачайте готовые файлы сайта.","h1":"Конструктор сайта‑портфолио","lead":"Портфолио должно открываться быстро и выглядеть аккуратно. Статический экспорт помогает показывать работы без лишней тяжести.","keywords":"конструктор сайта портфолио, сайт портфолио, портфолио дизайнера, портфолио разработчика, скачать сайт","audie
179nces":["фрилансеров","дизайнеров","разработчиков","студентов"],"faq":[{"q":"Можно ли добавить кейсы и галерею?","a":"Да. Используйте блоки карточек, галереи и текстовые секции: так проще держать структуру."},{"q":"Как лучше оформить портфолио для клиентов?","a":"Короткое описание, 6–12 лучших работ, ссылки/контакты и понятная кнопка «написать» — обычно достаточно."}]},{"path":"/konstruktor-saita-bez-registracii","title":"Конструктор сайта без регистрации — быстро собрать прототип","description":"Нужно быстро проверить идею? В НОРДИК можно начать сборку сайта сразу: собрать структуру, набросать контент и подготовить к экспорту ZIP.","h1":"Конструктор сайта без регистрации","lead":"Когда задача — прототип или быстрый черновик, важнее скорость: открыли редактор, собрали, сохранили/экспортировали.","keywords":"конструктор сайта без регистрации, сделать прототип сайта, быстро собрать сайт, конструктор сайтов","audiences":["новичков","стартапов","маркетологов"],"faq":[{"q":"Зачем нужен режим без регистрации?","a":"Чтобы быстро набросать структуру и понять, подходит ли инструмент под задачу, без лишних шагов."},{"q":"Это безопасно для проекта?","a":"Для важных проектов лучше делать резервные копии: экспорт/сохранение на компьютер — простой вариант."}]},{"path":"/konstruktor-saita-s-eksportom-html","title":"Конструктор сайта с экспортом HTML — скачать файлы сайта","description":"НОРДИК экспортирует сайт как обычные HTML/CSS/JS файлы в ZIP. Это удобно, если вы хотите полный контроль над хостингом и возможностью доработок.","h1":"Конструктор сайта с экспортом HTML","lead":"Вместо «сайта внутри платформы» вы получаете набор файлов. Их можно разместить где угодно и доработать без блокировок.","keywords":"конструктор сайта экспорт html, экспорт html сайта, скачать html сайт, статический сайт zip","audiences":["фрилансеров","разработчиков","малых предпринимателей"],"faq":[{"q":"Что входит в экспорт?","a":"Страницы сайта и ресурсы: HTML, CSS, скрипты и изображения — в одной структуре, упакованной в ZIP."},{"q":"Можно ли потом доработать руками?","a":"Да. Это и есть плюс экспорта: разработчик может подключить аналитику, изменить стили или добавить страницы."}]},{"path":"/konstruktor-saita-dlya-freelancera","title":"Конструктор сайта для фрилансера — собрать, экспортировать и передать","description":"Фрилансеру важно быстро делать прототипы и отдавать результат клиенту. НОРДИК помогает собрать сайт блоками и передать проект как ZIP с файлами.","h1":"Конструктор сайта для фрилансера","lead":"Собрали прототип → согласовали → экспортировали файлы → отдали клиенту или разместили на его хостинге.","keywords":"конструктор сайта для фрилансера, прототип сайта, сделать сайт клиенту, экспорт zip","audie
179nces":["фрилансеров","маркетологов","веб‑студий"],"faq":[{"q":"Как быстро согласовывать с клиентом?","a":"Сделайте черновой прототип, покажите превью, затем точечно правьте текст/кнопки и только после этого делайте финальный экспорт."},{"q":"Можно ли отдавать результат без доступа к аккаунту?","a":"Да. Экспорт ZIP — это готовые файлы, их можно передать как результат работы."}]},{"path":"/konstruktor-saita-dlya-startapa","title":"Конструктор сайта для стартапа — MVP лендинг и экспорт","description":"Соберите MVP‑лендинг для стартапа в НОРДИК: оффер, преимущества, форма/CTA и FAQ. Затем скачайте ZIP и публикуйте на своём домене.","h1":"Конструктор сайта для стартапа","lead":"Для MVP важны скорость и ясность: один оффер, один лендинг, быстрый запуск, потом — улучшения по данным.","keywords":"конструктор сайта для стартапа, mvp лендинг, лендинг mvp, быстрый запуск сайта, экспорт zip","audiences":["стартапов","маркетологов","продакт‑менеджеров"],"faq":[{"q":"Что включить в MVP‑лендинг?","a":"Оффер, 3–6 преимуществ, один CTA, социальное доказательство (кейс/цифры/отзывы) и короткий FAQ."},{"q":"Как улучшать после запуска?","a":"Меняйте заголовок/CTA, добавляйте ответы в FAQ и уточняйте контент под реальные вопросы пользователей."}]},{"path":"/konstruktor-saita-dlya-kompanii","title":"Конструктор сайта компании — структура, контакты и экспорт ZIP","description":"Сайт компании в НОРДИК: главная, о компании, услуги, кейсы и контакты. Соберите блоками и скачайте готовый сайт в ZIP для публикации на своём хостинге.","h1":"Конструктор сайта компании","lead":"Корпоративный сайт не обязан быть сложным: сделайте базовую структуру, добавьте доверие (кейсы/цифры) и публикуйте на своём домене.","keywords":"конструктор сайта компании, корпоративный сайт, сайт компании, создать сайт организации, экспорт zip","audiences":["малых предпринимателей","маркетологов","веб‑студий"],"faq":[{"q":"Какие разделы обычно нужны сайту компании?","a":"Часто достаточно: главная, услуги, кейсы/портфолио, о компании и контакты. Остальное добавляйте по мере роста."},{"q":"Можно ли сделать отдельные страницы под разные услуги?","a":"Да. Это полезно для SEO: каждая услуга получает свою страницу и понятный URL."}]},{"path":"/ii-konstruktor-saitov","title":"ИИ конструктор сайтов: как собрать сайт с нейросетью и скачать файлы","description":"Как сделать сайт «с помощью ИИ»: нейросеть помогает с текстом и структурой, а НОРДИК — собрать страницы из блоков и скачать сайт в ZIP для публикации на своём хостинге.","h1":"ИИ конструктор сайтов: собрать сайт с нейросетью","lead":"Встроенный ИИ не обязателен: используйте нейросеть для идей и текста, а затем соберите сайт в редакторе и экспортируйте файлы.","keywords":"ии конструктор сайтов, конструктор сайтов с ии, сайт с нейросетью, сделать сайт с ии, скачать сайт zip","audie
179nces":["новичков","маркетологов","самозанятых","фрилансеров"],"faq":[{"q":"У вас есть встроенный ИИ?","a":"НОРДИК фокусируется на сборке страниц и экспорте файлов. ИИ можно использовать как помощника для текста/структуры и затем переносить результат в блоки."},{"q":"Можно ли скачать готовый сайт файлами?","a":"Да. Экспортируйте проект в ZIP и публикуйте на своём хостинге."},{"q":"Это подходит для SEO?","a":"Да, если у сайта понятные страницы, уникальный контент и внутренняя перелинковка. Статические страницы обычно хорошо индексируются."}]},{"path":"/sozdat-sait-s-pomoshchyu-ii","title":"Создать сайт с помощью ИИ — пошагово и без кода","description":"Пошаговый план: как создать сайт с помощью ИИ без знания кода. Нейросеть помогает подготовить текст, структуру и FAQ, а НОРДИК — собрать сайт и скачать файлы в ZIP.","h1":"Создать сайт с помощью ИИ","lead":"Соберите «черновик» с нейросетью, затем перенесите в блоки, добавьте CTA и экспортируйте готовый сайт.","keywords":"создать сайт с помощью ии, сделать сайт с нейросетью, создать сайт без кода, нейросеть для сайта, сайт с ии","audiences":["новичков","малых предпринимателей","маркетологов"],"faq":[{"q":"Нужно ли уметь программировать?","a":"Нет. Дл
179я базового сайта достаточно собрать страницы из блоков и вставить подготовленный текст."},{"q":"Что лучше поручить ИИ?","a":"Оффер, заголовки, структуру лендинга, варианты CTA, черновой FAQ и идеи для секций. Финальные формулировки лучше проверить человеком."}]},{"path":"/sozdat-lending-s-ii","title":"Создать лендинг с ИИ — структура, текст и экспорт на свой хостинг","description":"Как сделать лендинг с ИИ: получить структуру и тексты через нейросеть, собрать блоки в НОРДИК и скачать лендинг в ZIP для публикации на своём домене.","h1":"Создать лендинг с ИИ","lead":"ИИ ускоряет подготовку контента, а конструктор — сборку и экспорт файлов. Это быстрый путь к MVP‑лендингу.","keywords":"создать лендинг с ии, лендинг с нейросетью, landing page с ии, лендинг без кода, экспорт лендинга","audiences":["маркетологов","стартапов","инфобизнеса","самозанятых"],"faq":[{"q":"Какие блоки должны быть на лендинге?","a":"Оффер, преимущества, социальное доказательство (цифры/отзывы), кейс/пример, FAQ и один главный CTA."},{"q":"Можно ли сделать несколько вариантов лендинга под A/B?","a":"Да. Генерируйте варианты заголовка/CTA и собирайте отдельные версии страниц."}]},{"path":"/nejroset-dlya-sozdaniya-saita","title":"Нейросеть для создания сайта: что она реально делает и как собрать результат","description":"Нейросеть помогает с текстами и прототипом структуры, но сайт нужно собрать и опубликовать. НОРДИК позволяет собрать страницы из блоков и экспортировать файлы сайта.","h1":"Нейросеть для создания сайта","lead":"Считайте нейросеть редактором и копирайтером, а конструктор — инструментом сборки и экспорта.","keywords":"нейросеть для создания сайта, сайт нейросеть, сделать сайт с нейросетью, нейросеть для лендинга, ии для сайта","audiences":["новичков","маркетологов","фрилансеров"],"faq":[{"q":"Нейросеть сама сделает полностью готовый сайт?","a":"Обычно нейросеть даёт текст/структуру и варианты. Для реального запуска нужен инструмент сборки страниц и размещение на хостинге."},{"q":"Как получить быстрый результат?","a":"Сначала соберите 1 страницу (лендинг), затем добавляйте дополнительные страницы и перелинковку."}]},{"path":"/chatgpt-dlya-sozdaniya-saita","title":"ChatGPT для создания сайта: промты для структуры и текста лендинга","description":"Как использовать ChatGPT для создания сайта: промты для оффера, секций, FAQ и CTA. Затем соберите страницу в НОРДИК и экспортируйте файлы сайта.","h1":"ChatGPT для создания сайта","lead":"Сильный результат получается, когда вы даёте ИИ контекст: ниша, аудитория, оффер, ограничения и цель страницы.","keywords":"chatgpt для создания сайта, промты для лендинга, chatgpt лендинг, текст для сайта chatgpt, ии для сайта","audiences":["маркетологов","самозанятых","фрилансеров"],"faq":[{"q":"Какие данные дать ИИ, чтобы ответы были лучше?","a":"Ниша, география, сегмент аудитории, продукт/услуга, цена (если можно), преимущества, возражения и цель (лиды/заявки/покупка)."},{"q":"Можно ли сразу публиковать текст от ИИ?","a":"Лучше вычитать: убрать общие фразы, добавить факты, уточнить условия, проверить юридически значимые обещания."}]},{"path":"/prompty-dlya-lendinga","title":"Промты для лендинга: как попросить ИИ написать оффер, блоки и FAQ","description":"Готовые промты для ИИ под лендинг: заголовок, выгоды, секции, FAQ, CTA. После генерации соберите страницу в НОРДИК и скачайте сайт в ZIP.","h1":"Промты для лендинга","lead":"Чем конкретнее промт, тем лучше лендинг: попросите структуру, варианты формулировок и список возражений.","keywords":"промты для лендинга, промт для ии лендинг, промты для текста сайта, prompt для landing page, нейросеть лендинг","audie
179nces":["маркетологов","стартапов","инфобизнеса"],"faq":[{"q":"Сколько вариантов просить у ИИ?","a":"Обычно 3–5 вариантов заголовка и 2–3 варианта CTA достаточно, чтобы выбрать лучший и доработать вручную."},{"q":"Что делать, если текст получился «как у всех»?","a":"Добавьте факты: сроки, процесс, гарантия, примеры работ, ограничения и конкретные цифры — и попросите переписать с учётом этого."}]},{"path":"/tekst-dlya-saita-s-ii","title":"Текст для сайта с ИИ: как быстро написать заголовки, преимущества и CTA","description":"ИИ помогает быстро написать текст для сайта: оффер, преимущества, описания услуг и FAQ. Затем вставьте контент в блоки НОРДИК и экспортируйте сайт файлами.","h1":"Текст для сайта с ИИ","lead":"Секрет — не «просто попросить текст», а задать аудиторию, тон, уникальные факты и цель страницы.","keywords":"текст для сайта с ии, нейросеть текст для сайта, копирайтинг ии, заголовки для лендинга, cta текст","audiences":["маркетологов","самозанятых","малых предпринимателей"],"faq":[{"q":"Какие части текста важнее всего?","a":"Первый экран (заголовок+подзаголовок), блок преимуществ, возражения/FAQ и кнопки CTA."},{"q":"Как улучшить текст от ИИ?","a":"Добавьте конкретику: цены/диапазон, сроки, процесс, примеры, ограничения, географию и отличия от конкурентов."}]},{"path":"/struktura-lendinga-s-ii","title":"Структура лендинга с ИИ: какие секции нужны и в каком порядке","description":"Как получить структуру лендинга через ИИ и собрать её в конструкторе. НОРДИК позволяет быстро разложить секции по блокам и экспортировать готовую страницу.","h1":"Структура лендинга с ИИ","lead":"ИИ хорошо предлагает варианты секций, а вы выбираете лучший порядок под задачу: лиды, запись, покупка.","keywords":"структура лендинга, структура лендинга с ии, секции landing page, как сделать лендинг, нейросеть для лендинга","audiences":["маркетологов","стартапов","самозанятых"],"faq":[{"q":"Какой порядок секций самый популярный?","a":"Оффер → преимущества → кейс/доверие → как это работает → тариф/условия → FAQ → финальный CTA."},{"q":"Можно ли сделать лендинг короче?","a":"Да. Для простого оффера достаточно 6–8 секций, главное — ясный оффер и один CTA."}]},{"path":"/lending-bez-koda-s-ii","title":"Лендинг без кода с ИИ — сделать страницу за вечер и скачать файлы","description":"Как сделать лендинг без кода: используйте ИИ для текста и идей, соберите блоки в НОРДИК и скачайте лендинг в ZIP для публикации на своём домене.","h1":"Лендинг без кода с ИИ","lead":"Комбинация «ИИ + конструктор + экспорт» подходит, когда нужно быстро запуститься и не зависеть от платформы.","keywords":"лендинг без кода, лендинг без кода с ии, no code лендинг, сделать страницу без программирования, экспорт лендинга","audiences":["новичков","маркетологов","инфобизнеса"],"faq":[{"q":"Сколько времени нужно на лендинг?","a":"Базовый лендинг можно собрать за вечер: ИИ ускоряет текст, конструктор ускоряет сборку секций."},{"q":"Как не потерять качество при скорости?","a":"Сделайте 1–2 итерации: черновик → вычитка → добавление фактов/кейсов → финальная версия."}]},{"path":"/sdelat-sait-bez-znaniya-koda-s-ii","title":"Сделать сайт без знания кода с ИИ — быстро и с экспортом","description":"Понятный сценарий для новичка: нейросеть помогает с текстом и планом страниц, НОРДИК — собрать сайт из блоков и экспортировать файлы для публикации.","h1":"Сделать сайт без знания кода с ИИ","lead":"Если вы не программист — начните с одной страницы, затем добавляйте страницы услуг/кейсов/контактов.","keywords":"сделать сайт без знания кода, создать сайт без кода с ии, сайт без программиста, нейросеть сайт, конструктор сайтов","audiences":["новичков","самозанятых","малых предпринимателей"],"faq":[{"q":"Нужно ли покупать домен и хостинг?","a":"Для запуска — да, как для любого сайта. Для теста можно собирать и смотреть превью, а потом публиковать."},{"q":"Какие страницы сделать первыми?","a":"Главная/лендинг, услуги (или продукт), контакты и FAQ — обычно этого достаточно для старта."}]},{"path":"/sdelat-sait-za-5-minut-s-ii","title":"Сделать сайт за 5 минут с ИИ — реальность и честный план","description":"Запрос «сайт за 5 минут с ИИ» обычно значит быстрый черновик. Получите структуру и текст через ИИ, соберите страницу в НОРДИК и экспортируйте файлы для запуска.","h1":"Сделать сайт за 5 минут с ИИ","lead":"За 5 минут реально сделать черновик. Для хорошего результата добавьте факты, примеры и вычитку.","keywords":"сделать сайт за 5 минут, сайт за 5 минут с ии, быстро создать сайт, нейросеть сайт быстро, лендинг быстро","audiences":["новичков","маркетологов","стартапов"],"faq":[{"q":"Почему «за 5 минут» часто не работает?","a":"Потому что нужен контент: оффер, преимущества, условия, ответы на вопросы. ИИ ускоряет черновик, но факты и точность — на вас."},{"q":"Какой минимум, чтобы лендинг был рабочим?","a":"Чёткий оффер, 3–6 выгод, один CTA, контакты и короткий FAQ."}]},{"path":"/sdelat-sait-s-ii-i-skachat","title":"Сделать сайт с ИИ и скачать — как получить файлы и разместить","description":"Как сделать сайт с ИИ и скачать его файлами: ИИ помогает с контентом, НОРДИК — собрать страницы и экспортировать ZIP для публикации на хостинге.","h1":"Сделать сайт с ИИ и скачать","lead":"Важная часть — экспорт: вы получаете файлы сайта и можете разместить их где угодно.","keywords":"сделать сайт с ии и скачать, скачать сайт с ии, экспорт сайта zip, файлы сайта, статический сайт","audie
179nces":["новичков","фрилансеров","малых предпринимателей"],"faq":[{"q":"Что скачивается в ZIP?","a":"Страницы и ресурсы сайта: HTML/CSS/JS и изображения — в структуре проекта."},{"q":"Где лучше размещать статический сайт?","a":"На любом обычном хостинге (Nginx/Apache) или через CDN. Главное — чтобы можно было загрузить файлы."}]},{"path":"/kak-sdelat-lending-s-ii-poshagovo","title":"Как сделать лендинг с ИИ пошагово — от промта до публикации","description":"Пошаговая инструкция: как сделать лендинг с ИИ — собрать требования, сгенерировать тексты, собрать блоки в НОРДИК и экспортировать лендинг для публикации.","h1":"Как сделать лендинг с ИИ: пошагово","lead":"Лучший результат даёт процесс: требования → варианты от ИИ → сборка → вычитка → экспорт и публикация.","keywords":"как сделать лендинг с ии, лендинг пошагово, нейросеть лендинг инструкция, собрать лендинг, экспорт","audiences":["маркетологов","самозанятых","стартапов"],"faq":[{"q":"Какая главная ошибка при генерации лендинга?","a":"Слишком общий запрос к ИИ. Дайте контекст и попросите структуру + варианты формулировок."},{"q":"Как проверить, что лендинг «готов»?","a":"Есть один понятный CTA, нет противоречий по условиям, тексты конкретные, есть ответы на ключевые возражения."}]},{"path":"/faq-dlya-lendinga-s-ii","title":"FAQ для лендинга с ИИ: вопросы клиентов и готовые ответы","description":"Как собрать FAQ для лендинга с помощью ИИ: список возражений, вопросы про цену/сроки/гарантии и короткие ответы. Затем добавьте FAQ в страницу и экспортируйте сайт.","h1":"FAQ для лендинга с ИИ","lead":"FAQ — одна из самых «цитируемых» частей страницы: короткие прямые ответы помогают и людям, и поиску.","keywords":"faq для лендинга, faq с ии, вопросы для лендинга, возражения клиентов, нейросеть faq","audiences":["маркетологов","малых предпринимателей","самозанятых"],"faq":[{"q":"Сколько вопросов делать в FAQ?","a":"Обычно 6–10 достаточно. Главное — отвечать на реальные возражения: цена, сроки, что входит, гарантии, как начать."},{"q":"Как сделать ответы сильнее?","a":"Добавьте факты: сроки, условия, примеры, ограничения. Просите ИИ писать коротко и по делу."}]},{"path":"/ofer-dlya-saita-s-ii","title":"Оффер для сайта с ИИ: как сформулировать главное предложение","description":"ИИ помогает сформулировать оффер и УТП: варианты заголовка, подзаголовка и выгод. Затем соберите первый экран в НОРДИК и экспортируйте сайт.","h1":"Оффер для сайта с ИИ","lead":"Сильный оффер = аудитория + боль + решение + докаÐ
179·Ð°Ñ‚ельство. Дайте эти данные ИИ — и получите варианты.","keywords":"оффер для сайта, утп с ии, заголовок для лендинга, оффер нейросеть, уТП лендинг","audiences":["маркетологов","самозанятых","стартапов"],"faq":[{"q":"Как быстро проверить оффер?","a":"Попросите ИИ сделать 10 вариантов заголовка и выберите 2–3 лучших, затем проверьте на знакомых/клиентах и по статистике рекламы."},{"q":"Почему ИИ часто пишет слишком общо?","a":"Потому что ему не хватает фактов. Добавьте конкретику: сроки, география, ниша, процесс, ограничения."}]},{"path":"/kontent-plan-dlya-saita-s-ii","title":"Контент‑план для сайта с ИИ: какие страницы сделать и что писать","description":"ИИ помогает составить контент‑план: список страниц, темы, FAQ и структуру. Затем вы создаёте страницы в конструкторе и экспортируете сайт файлами.","h1":"Контент‑план для сайта с ИИ","lead":"Правильный план страниц помогает SEO и продажам: отдельные страницы услуг, кейсы, ответы на вопросы.","keywords":"контент план для сайта, контент план с ии, какие страницы нужны сайту, структура сайта, seo страницы","audiences":["малых предпринимателей","маркетологов","самозанятых"],"faq":[{"q":"С чего начать контент‑план?","a":"С услуг/продуктов и частых вопросов клиентов. Попросите ИИ собрать список страниц и тем, затем отфильтруйте под вашу реальность."},{"q":"Нужно ли делать много страниц сразу?","a":"Нет. Начните с 4–6 ключевых страниц, затем добавляйте новые по мере появления вопросов и запросов."}]},{"path":"/seo-teksty-s-ii-dlya-saita","title":"SEO‑тексты с ИИ для сайта: как писать полезно, а не «водой»","description":"Как использовать ИИ для SEO‑текстов: структура, тезисы, FAQ и вычитка. Соберите страницы в НОРДИК и экспортируйте сайт в ZIP для публикации.","h1":"SEO‑тексты с ИИ для сайта","lead":"ИИ ускоряет черновик, но для SEO важны уникальность, факты и ответы на конкретные вопросы.","keywords":"seo тексты с ии, seo текст нейросеть, тексты для сайта seo, написать seo текст, faq seo","audiences":["маркетологов","малых предпринимателей","фрилансеров"],"faq":[{"q":"Как сделать текст полезным?","a":"Добавьте конкретику: цены/диапазоны, сроки, процесс, чеклисты, примеры. Попросите ИИ избегать общих фраз и писать коротко."},{"q":"Нужно ли «набивать ключи»?","a":"Нет. Дл
179я Яндекс/Google и AI‑поиска важнее понятные ответы и структура, а не плотность ключевых слов."}]},{"path":"/sozdanie-saita-s-ii-dlya-biznesa","title":"Создание сайта с ИИ для бизнеса: как быстро запустить и не ошибиться","description":"Как бизнесу быстро запустить сайт с помощью ИИ: собрать оффер, услуги, кейсы и FAQ. НОРДИК помогает собрать страницы и экспортировать сайт в ZIP для публикации.","h1":"Создание сайта с ИИ для бизнеса","lead":"ИИ ускоряет контент, но бизнес‑сайт выигрывает от конкретики: услуги, цены/условия, доверие и контакты.","keywords":"создание сайта с ии для бизнеса, сайт компании с ии, сайт услуг с ии, бизнес сайт без кода, экспорт сайта","audiences":["малых предпринимателей","маркетологов","самозанятых"],"faq":[{"q":"Что обязательно указать на сайте бизнеса?","a":"Услуги/продукты, условия, примеры работ, контакты, ответы на вопросы и понятный способ оставить заявку."},{"q":"Как не попасть на «обманные обещания» от ИИ?","a":"Не публикуйте непроверенные гарантии/сроки. Фиксируйте факты и просите ИИ писать строго по ним."}]},{"path":"/sozdanie-saita-s-ii-dlya-uslug","title":"Создание сайта услуг с ИИ: тексты, структура и страницы услуг","description":"Как сделать сайт услуг с ИИ: сгенерировать описания услуг и FAQ, собрать страницы в НОРДИК и экспортировать сайт для публикации на своём домене.","h1":"Создание сайта услуг с ИИ","lead":"Для сайта услуг особенно полезны отдельные страницы по каждой услуге — их удобно генерировать и дополнять фактами.","keywords":"сайт услуг с ии, создание сайта услуг, описания услуг с ии, faq услуги, страницы услуг","audiences":["самозанятых","малых предпринимателей","фрилансеров"],"faq":[{"q":"Как ИИ помогает именно сайту услуг?","a":"Он ускоряет черновики описаний услуг, список вопросов клиентов и варианты заголовков/CTA."},{"q":"Что добавить для доверия?","a":"Примеры работ, отзывы, фотографии, кейсы и понятный процесс работы (этапы)."}]},{"path":"/sait-vizitka-s-ii","title":"Сайт‑визитка с ИИ: быстро подготовить текст и собрать страницу","description":"Как сделать сайт‑визитку с ИИ: подготовить текст о себе/услугах, собрать 1–2 страницы в НОРДИК и скачать готовый сайт в ZIP.","h1":"Сайт‑визитка с ИИ","lead":"Идеально для эксперта или мастера: коротко о вас, услуги, примеры, контакты и кнопка связи.","keywords":"сайт визитка с ии, визитка сайт нейросеть, сделать сайт визитку, сайт эксперта, скачать сайт","audiences":["самозанятых","новичков","фрилансеров"],"faq":[{"q":"Сколько блоков нужно для визитки?","a":"Обычно 6–10: первый экран, услуги, преимущества, портфолио/кейсы, отзывы, контакты и CTA."},{"q":"Что лучше всего генерировать через ИИ?","a":"Описание услуг, варианты оффера, ответы на частые вопросы и короткий текст «о себе»."}],"steps":[{"title":"Определите цель визитки","text":"Кому вы продаёте и какое действие нужно: написать в мессенджер, позвонить или оставить заявку."},{"title":"Соберите текст с ИИ","text":"Попросите ИИ написать варианты заголовка, «о себе», описания услуг и короткий FAQ — затем добавьте факты."},{"title":"Соберите страницу и экспортируйте","text":"Соберите блоки в редакторе, проверьте контакты и скачайте ZIP для публикации на своём домене."}],"checklist":["Есть понятный оффер на первом экране","Услуги/форматы работы описаны конкретно","Есть доверие: примеры/отзывы/фото","Контакты и CTA видны без прокрутки","FAQ отвечает на ключевые вопросы"],"important":["Не публикуйте непроверенные обещания: сроки/гарантии/цены","Укажите, как вы работаете (этапы) — это снижает вопросы","Сделайте один главный CTA и повторите его внизу"],"links":[{"href":"/struktura-saita-vizitki-s-ii","label":"Структура визитки"},{"href":"/ofer-dlya-saita-vizitki-s-ii","label":"Оффер и УТП"},{"href":"/kontakty-i-cta-dlya-saita-vizitki-s-ii","label":"Контакты и CTA"},{"href":"/cheklist-saita-vizitki-s-ii","label":"Чеклист перед публикацией"}]},{"path":"/struktura-saita-vizitki-s-ii","title":"Структура сайта‑визитки с ИИ: секции, порядок и логика страницы","description":"Как собрать структуру сайта‑визитки с помощью ИИ: какие секции добавить, в каком порядке и что писать в каждом блоке. Затем — собрать страницу в НОРДИК и экспортировать файлы.","h1":"Структура сайта‑визитки с ИИ","lead":"ИИ помогает быстро набросать каркас визитки. Важно выбрать минимум секций, которые реально отвечают на вопросы клиента.","keywords":"структура сайта визитки, структура визитки с ии, секции сайта визитки, каркас визитки, сайт эксперта","audiences":["самозанятых","фрилансеров","экспертов"],"steps":[{"title":"Соберите исходные факты","text":"Кто вы, какие услуги/ниша, география, форматы и чем отличаетесь от конкурентов."},{"title":"Попросите ИИ предложить секции","text":"Пусть ИИ выдаст 2–3 варианта структуры: короткая (6–8 секций) и расширенная (10–12)."},{"title":"Соберите блоки и проверьте логику","text":"В НОРДИК разложите секции по блокам и убедитесь, что путь пользователя ведёт к CTA."}],"checklist":["Первый экран: оффер + кому + чем полезно","Блок услуг/направлений с понятными формулировками","Доверие: примеры, отзывы или факты","Процесс: 3–5 шагов, как вы работаете","Контакты и повтор CTA внизу"],"important":["Если визитка на 1 страницу — не перегружайте текстом","Ставьте один главный CTA (например: «Записаться») и не распыляйтесь","Проверяйте, что тексты совпадают с реальными условиями"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/zagolovki-dlya-saita-vizitki-s-ii","label":"Заголовки"},{"href":"/faq-dlya-saita-vizitki-s-ii","label":"FAQ"},{"href":"/kontakty-i-cta-dlya-saita-vizitki-s-ii","label":"Контакты и CTA"}],"faq":[{"q":"Сколько секций нужно для визитки?","a":"Чаще всего 6–10. Если цель одна (заявка/запись) — достаточно короткой структуры."},{"q":"Нужно ли делать отдельные страницы?","a":"Не обязательно. Можно начать с одной страницы, а затем добавить отдельные страницы услуг/кейсов, если появится спрос."}]},{"path":"/tekst-dlya-saita-vizitki-s-ii","title":"Текст для сайта‑визитки с ИИ: коротко, конкретно и без воды","description":"Как получить текст для сайта‑визитки с помощью ИИ: что писать в первом экране, «о себе», услугах и контактах. Примеры формулировок и чеклист качества.","h1":"Текст для сайта‑визитки с ИИ","lead":"Лучший текст визитки — конкретный: что вы делаете, кому помогаете, сколько это стоит/как это работает и как с вами связаться.","keywords":"текст для сайта визитки, текст визитки с ии, нейросеть текст о себе, описания услуг, оффер","audiences":["самозанятых","экспертов","фрилансеров"],"steps":[{"title":"Опишите факты","text":"Ниша, услуги, опыт, география, формат работы, цены/диапазон, сроки и ограничения."},{"title":"Попросите ИИ сделать варианты","text":"Заголовок, подзаголовок, 5 выгод, описание услуг и 6 вопросов FAQ — по вашим фактам."},{"title":"Сократите и вычитайте","text":"Уберите общие фразы, добавьте цифры/примеры и проверьте, что нет обещаний «с потолка»."}],"checklist":["Есть конкретика (что/кому/как)","Понятно, как начать (CTA)","Нет противоречий в цене/сроках","Есть доверие (примеры/отзывы)","Текст легко сканируется (списки, короткие абзацы)"],"important":["Не вставляйте «универсальные» шаблоны — они звучат одинаково у всех","Если нет точной цены — пишите диапазон или от‑цену с условиями","Старайтесь отвечать на вопросы клиента прямо в тексте"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/tekst-o-sebe-s-ii-dlya-saita-vizitki","label":"Текст «о себе»"},{"href":"/ofer-dlya-saita-vizitki-s-ii","label":"Оффер"},{"href":"/faq-dlya-saita-vizitki-s-ii","label":"FAQ"}],"faq":[{"q":"Можно ли полностью доверить текст ИИ?","a":"Лучше использовать ИИ как черновик. Факты, условия и тон общения — на вас."},{"q":"Какие блоки текста самые важные?","a":"Первый экран, описание услуг, «как вы работаете», контакты/CTA и короткий FAQ."}]},{"path":"/shablon-saita-vizitki-s-ii","title":"Шаблон сайта‑визитки с ИИ: каркас страницы и что в него вставлять","description":"Удобный шаблон (каркас) сайта‑визитки: секции, подсказки для текста и примеры CTA. ИИ помогает быстро заполнить контент, а НОРДИК — собрать и экспортировать страницу.","h1":"Шаблон сайта‑визитки с ИИ","lead":"Шаблон — это не дизайн, а понятный порядок секций и подсказки, что писать. Так вы быстрее собираете рабочую визитку.","keywords":"шаблон сайта визитки, каркас визитки, шаблон визитки с ии, структура визитки, пример визитки","audiences":["новичков","самозанятых","фрилансеров"],"steps":[{"title":"Скопируйте каркас секций","text":"Первый экран → услуги → выгоды → процесс → доверие → FAQ → контакты."},{"title":"Заполните контент с ИИ","text":"Попросите ИИ заполнить каждый блок по вашим фактам и сделать 2–3 альтернативы формулировок."},{"title":"Соберите и экспортируйте","text":"В НОРДИК соберите секции в блоки и скачайте ZIP для публикации."}],"checklist":["Каждая секция отвечает на один вопрос клиента","Есть один главный CTA","Описания услуг не абстрактные","Процесс работы понятен","Контакты кликабельные и заметные"],"important":["Шаблон — это старт. Дальше добавляйте детали под свою Ð
179½Ð¸ÑˆÑƒ","Не добавляйте секции «для галочки»: лучше меньше, но точнее","Проверяйте тексты на ошибки и соответствие реальности"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/struktura-saita-vizitki-s-ii","label":"Структура"},{"href":"/zagolovki-dlya-saita-vizitki-s-ii","label":"Заголовки"},{"href":"/kontakty-i-cta-dlya-saita-vizitki-s-ii","label":"CTA"}],"faq":[{"q":"Шаблон = готовый дизайн?","a":"Нет. Здесь речь про содержание: секции и тексты. Дизайн вы настраиваете в редакторе."},{"q":"Можно ли сделать визитку в одну страницу?","a":"Да, это самый частый вариант. Главное — ясный оффер и удобная связь."}]},{"path":"/faq-dlya-saita-vizitki-s-ii","title":"FAQ для сайта‑визитки с ИИ: вопросы клиентов и короткие ответы","description":"Как собрать FAQ для сайта‑визитки: какие вопросы задают клиентам, как получить ответы через ИИ и как оформить их на странице так, чтобы было понятно и честно.","h1":"FAQ для сайта‑визитки с ИИ","lead":"FAQ экономит время: отвечает на возражения до переписки. ИИ помогает собрать список вопросов и сделать черновики ответов.","keywords":"faq для сайта визитки, вопросы и ответы визитка, faq с ии, возражения клиентов, нейросеть faq","audiences":["самозанятых","фрилансеров","новичков"],"steps":[{"title":"Соберите реальные вопросы","text":"Цена, сроки, что входит, как начинается работа, гарантии, что нужно от клиента."},{"title":"Попросите ИИ написать ответы","text":"Попросите коротко и по делу, без «воды» и без непроверенных обещаний."},{"title":"Добавьте факты и ограничения","text":"Уточните условия, границы работ и то, что точно не делаете."}],"checklist":["6–10 вопросов — достаточно","Ответы короткие и конкретные","Нет противоречий с оффером","Есть вопрос про процесс работы","Есть вопрос про цену/условия"],"important":["Лучше честно написать «зависит от задачи», чем обещать то, чего нет","FAQ должен совпадать с тем, что вы реально делаете","Не копируйте общие ответы — добавляйте детали"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/tekst-dlya-saita-vizitki-s-ii","label":"Текст визитки"},{"href":"/kontakty-i-cta-dlya-saita-vizitki-s-ii","label":"Контакты"},{"href":"/cheklist-saita-vizitki-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли делать FAQ, если услуг мало?","a":"Да. Даже для одной услуги полезны ответы про цену, сроки и как начать."},{"q":"Можно ли использовать FAQ для SEO?","a":"FAQ помогает структуре и ясности. Главное — отвечать на реальные вопросы без «набивки ключей»."}]},{"path":"/ofer-dlya-saita-vizitki-s-ii","title":"Оффер для сайта‑визитки с ИИ: как сформулировать УТП и первый экран","description":"Как сделать сильный оффер для визитки: формула заголовка, подзаголовок, выгоды и доÐ
179ºÐ°Ð·Ð°Ñ‚ельства. ИИ помогает с вариантами, а вы выбираете и уточняете факты.","h1":"Оффер для сайта‑визитки с ИИ","lead":"Оффер должен отвечать за 5 секунд: кто вы, чем полезны и почему вам можно доверять.","keywords":"оффер для визитки, утп визитка, заголовок визитки, первый экран, оффер с ии","audiences":["самозанятых","экспертов","фрилансеров"],"steps":[{"title":"Запишите факты","text":"Ниша, результат, сроки, диапазон цены, география, кому подходит и кому не подходит."},{"title":"Попросите ИИ сделать 10 вариантов","text":"Заголовки + подзаголовки по формуле: аудитория + результат + срок/условие."},{"title":"Добавьте доказательство","text":"Кейсы, отзывы, опыт, сертификаты, цифры — то, что реально есть."}],"checklist":["Заголовок понятен без контекста","Подзаголовок уточняет, что внутри","Есть 3–5 выгод","Есть доверие/доказательства","CTA конкретный (что будет после клика)"],"important":["Не используйте слишком общие слова («качество», «профессионально») без фактов","Если в оффере есть сроки/цены — они должны быть реальными","Оставьте один главный CTA"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/zagolovki-dlya-saita-vizitki-s-ii","label":"Заголовки"},{"href":"/tekst-dlya-saita-vizitki-s-ii","label":"Текст визитки"},{"href":"/kontakty-i-cta-dlya-saita-vizitki-s-ii","label":"CTA"}],"faq":[{"q":"Что писать, если нет кейсов?","a":"Укажите процесс, опыт, примеры задач и то, как вы снижаете риск (гарантии в рамках реальности)."},{"q":"ИИ предлагает слишком «рекламные» фразы — что делать?","a":"Попросите писать нейтрально, без преувеличений, и добавьте свои факты/условия."}]},{"path":"/zagolovki-dlya-saita-vizitki-s-ii","title":"Заголовки для сайта‑визитки с ИИ: идеи для первого экрана и секций","description":"Как получить заголовки для визитки через ИИ: формулы для H1, подзаголовков, блоков услуг и выгод. Примеры и быстрый чеклист качества.","h1":"Заголовки для сайта‑визитки с ИИ","lead":"Заголовок должен быть простым: кто вы + какой результат даёте + для кого. ИИ помогает быстро нагенерировать варианты.","keywords":"заголовки для визитки, h1 визитка, заголовок первого экрана, нейросеть заголовки, оффер","audiences":["самозанятых","маркетологов","фрилансеров"],"steps":[{"title":"Определите результат","text":"Не «услуга», а результат: «ремонт кухни за 1 день», «сайт под запись», «дизайн карточек»."},{"title":"Сгенерируйте 20 вариантов","text":"Попросите ИИ: 10 «прямых» и 10 «креативных» заголовков, затем отберите 3–5."},{"title":"Проверьте на ясность","text":"Если человек не понимает за 5 секунд — заголовок слишком абстрактный."}],"checklist":["Понятно, о чём речь","Есть аудитория или ниша","Есть результат/выгода","Нет пустых слов без фактов","Подзаголовок уточняет условия"],"important":["Не обещайте невозможное — это убивает доверие","Лучше прямой заголовок, чем «красивый»","Тестируйте 2–3 варианта на практике"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/ofer-dlya-saita-vizitki-s-ii","label":"Оффер"},{"href":"/tekst-dlya-saita-vizitki-s-ii","label":"Текст"},{"href":"/faq-dlya-saita-vizitki-s-ii","label":"FAQ"}],"faq":[{"q":"Нужно ли использовать ключи в заголовках?","a":"Не обязательно. Ð
179’ажнее ясность и соответствие содержанию. Ключи могут быть естественно в тексте."},{"q":"Сколько заголовков тестировать?","a":"Достаточно 2–3 вариантов первого экрана и 2–3 вариантов CTA."}]},{"path":"/tekst-o-sebe-s-ii-dlya-saita-vizitki","title":"Текст «о себе» для сайта‑визитки с ИИ: как написать нормально и по делу","description":"Как написать блок «о себе» для визитки: структура, факты, тон и примеры. ИИ помогает с черновиком, а вы добавляете конкретику и правду.","h1":"Текст «о себе» для визитки с ИИ","lead":"Люди читают «о себе», чтобы понять: вы реальный человек, вам можно доверять и вы решаете их задачу.","keywords":"текст о себе на сайт, о себе с ии, описание эксперта, блок о себе визитка, нейросеть текст","audiences":["самозанятых","экспертов","фрилансеров"],"steps":[{"title":"Соберите факты","text":"Опыт, специализация, как вы работаете, что важно клиенту и почему вы этим занимаетесь."},{"title":"Попросите ИИ 3 версии","text":"Официальная, дружелюбная и «короткая». Затем выберите тон под аудиторию."},{"title":"Добавьте доказательства","text":"Ссылки на кейсы/примеры, цифры, сертификаты и реальные детали."}],"checklist":["Есть специализация (не «всё подряд»)","Есть 1–2 факта про опыт","Есть подход/процесс","Есть человеческий тон","Нет лишней «воды»"],"important":["Не пишите биографию — пишите то, что важно клиенту","Старайтесь быть конкретным: примеры задач лучше общих слов","Проверьте, что текст не противоречит офферу"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/tekst-dlya-saita-vizitki-s-ii","label":"Текст визитки"},{"href":"/ofer-dlya-saita-vizitki-s-ii","label":"Оффер"},{"href":"/cheklist-saita-vizitki-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли писать про образование?","a":"Только если это добавляет доверие в вашей сфере. В остальных случаях важнее кейсы и опыт."},{"q":"Какой объём блока «о себе» оптимальный?","a":"Обычно 4–8 коротких предложений или список из 4–6 пунктов."}]},{"path":"/kontakty-i-cta-dlya-saita-vizitki-s-ii","title":"Контакты и CTA для сайта‑визитки с ИИ: что написать и как не потерять заявки","description":"Как оформить контакты и CTA на визитке: какие способы связи дать, что писать на кнопке, какие поля формы нужны и как убрать лишние шаги.","h1":"Контакты и CTA для визитки с ИИ","lead":"CTA — это не «написать». CTA — это конкретное действие: «Записаться», «Получить расчёт», «Уточнить цену».","keywords":"cta для сайта визитки, контакты на сайте, кнопка на первом экране, форма заявки, как увеличить заявки","audiences":["самозанятых","малых предпринимателей","фрилансеров"],"steps":[{"title":"Выберите один главный канал","text":"Например: мессенджер или звонок. Остальные оставьте второстепенными."},{"title":"Сформулируйте CTA","text":"Попросите ИИ дать 10 вариантов CTA под вашу нишу и выберите самый понятный."},{"title":"Уберите трение","text":"Минимум полей, понятные условия, повтор CTA внизу и кликабельные контакты."}],"checklist":["CTA есть в первом экране","Контакты кликабельные","Форма короткая (если она нужна)","Повтор CTA внизу","В FAQ есть ответы про «как начать»"],"important":["Не ставьте 5 равноправных кнопок — это снижает конверсию","Если вы обещаете «ответ за 5 минут» — это должно быть правдой","Проверьте CTA на мобильном: должно быть удобно нажимать"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/ofer-dlya-saita-vizitki-s-ii","label":"Оффер"},{"href":"/faq-dlya-saita-vizitki-s-ii","label":"FAQ"},{"href":"/cheklist-saita-vizitki-s-ii","label":"Чеклист"}],"faq":[{"q":"Какой CTA лучше: «Записаться» или «Написать»?","a":"Чаще лучше конкретный CTA («Записаться», «Получить расчёт»). Он объясняет, что будет дальше."},{"q":"Нужна ли форма, если есть мессенджер?","a":"Не всегда. Если цель — быстрая связь, одного канала и кликабельной ссылки часто достаточно."}]},{"path":"/cheklist-saita-vizitki-s-ii","title":"Чеклист сайта‑визитки с ИИ: что проверить перед публикацией","description":"Короткий чеклист качества для визитки: смысл, тексты, контакты, доверие и техническая готовность. ИИ помогает найти пробелы, а вы быстро закрываете их.","h1":"Чеклист сайта‑визитки с ИИ","lead":"Перед публикацией пройдитесь по чеклисту: так вы не потеряете заявки из‑за мелочей.","keywords":"чеклист сайта визитки, проверить сайт перед публикацией, чеклист с ии, визитка качество, готовность сайта","audiences":["новичков","самозанятых","фрилансеров"],"steps":[{"title":"Проверьте смысл","text":"Оффер понятен? Услуги ясны? Есть доверие и понятный следующий шаг?"},{"title":"Проверьте тексты","text":"Нет ли противоречий, «воды» и обещаний без фактов. Лучше короче, но конкретнее."},{"title":"Проверьте контакт","text":"CTA кликается, контакты работают, на мобильном всё читабельно."}],"checklist":["Оффер понятен за 5 секунд","Услуги описаны конкретно","Есть примеры/отзывы/фото","CTA и контакты работают","FAQ закрывает ключевые возражения"],"important":["Проверьте страницу на телефоне","Убедитесь, что условия и цены актуальны","Не забывайте повтор CTA внизу"],"links":[{"href":"/sait-vizitka-s-ii","label":"Хаб: сайт‑визитка с ИИ"},{"href":"/struktura-saita-vizitki-s-ii","label":"Структура"},{"href":"/tekst-dlya-saita-vizitki-s-ii","label":"Текст"},{"href":"/kontakty-i-cta-dlya-saita-vizitki-s-ii","label":"Контакты"}
179],"faq":[{"q":"Нужно ли проверять орфографию?","a":"Да. Ошибки снижают доверие и конверсию, особенно на визитке."},{"q":"Что сделать, если текста слишком много?","a":"Сократите. Оставьте только то, что отвечает на вопрос клиента и ведёт к CTA."}]},{"path":"/opisanie-uslugi-s-ii","title":"Описание услуги с ИИ: как написать понятно, конкретно и без «воды»","description":"Как сделать описание услуги с помощью ИИ: структура, что включить (результат, сроки, цена, процесс), как добавить конкретику и собрать страницу услуги в конструкторе.","h1":"Описание услуги с ИИ","lead":"Хорошее описание услуги отвечает на 5 вопросов: что вы делаете, кому, как, сколько стоит и как начать.","keywords":"описание услуги с ии, написать описание услуги, нейросеть текст услуги, страница услуги, оффер услуги","audiences":["самозанятых","малых предпринимателей","фрилансеров"],"steps":[{"title":"Соберите исходные данные","text":"Что входит/не входит, сроки, цена/диапазон, требования к клиенту, результат."},{"title":"Попросите ИИ написать 2 версии","text":"Короткую (для первого экрана) и расширенную (для подробного блока)."},{"title":"Добавьте детали","text":"Примеры работ, частые вопросы и объяснение процесса — это повышает доверие."}],"checklist":["Описан результат","Есть условия и ограничения","Понятно, что входит","Есть пример/доверие","Есть CTA (как заказать)"],"important":["Не обещайте то, чего нет (сроки/гарантии)","Если цена зависит — объясните от чего","Сделайте текст читабельным: списки и короткие абзацы"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/stranica-uslugi-s-ii","label":"Каркас страницы услуги"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ для услуг"},{"href":"/zagolovki-dlya-saita-uslug-s-ii","label":"Заголовки"}],"faq":[{"q":"Нужна ли длинная простыня текста?","a":"Нет. Лучше структурировать: короткое описание + списки + FAQ и примеры."},{"q":"Можно ли использовать один текст для всех услуг?","a":"Лучше нет. Страница услуги должна быть конкретной именно про эту услугу."}]},{"path":"/struktura-saita-uslug-s-ii","title":"Структура сайта услуг с ИИ: страницы и секции, которые реально нужны","description":"Как спланировать структуру сайта услуг с помощью ИИ: какие страницы сделать (главная, услуги, кейсы, контакты), как распределить информацию и что вынести на отдельные страницы услуг.","h1":"Структура сайта услуг с ИИ","lead":"Сайт услуг выигрывает от структуры: отдельные страницы по услугам + понятные контакты + доверие.","keywords":"структура сайта услуг, сайт услуг с ии, какие страницы нужны сайту услуг, страницы услуг, контент план услуг","audie
179nces":["самозанятых","малых предпринимателей","маркетологов"],"steps":[{"title":"Составьте список услуг","text":"1–10 основных услуг/направлений. Каждая может стать отдельной страницей."},{"title":"Попросите ИИ предложить карту сайта","text":"Главная/о вас/услуги/кейсы/контакты/FAQ + отдельные страницы услуг."},{"title":"Соберите структуру в редакторе","text":"Начните с главной и 1–2 услуг. Остальные страницы добавляйте итеративно."}],"checklist":["Есть главная/лендинг","Есть список услуг","Есть отдельные страницы ключевых услуг","Есть доверие (кейсы/отзывы)","Есть контакты и CTA"],"important":["Не пытайтесь сделать 30 страниц сразу — начните с 4–6","Если услуга отличается — ей нужна отдельная страница","Держите один основной CTA"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/kontent-dlya-saita-uslug-s-ii","label":"Контент‑план"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Сколько страниц услуг делать?","a":"Стартуйте с 1–3 ключевых. Затем добавляйте по мере спроса и запросов."},{"q":"Нужна ли страница «о компании»?","a":"Если вы эксперт/мастер — достаточно блока «о себе» и фактов. Для команды — отдельная страница полезна."}]},{"path":"/stranica-uslugi-s-ii","title":"Страница услуги с ИИ: каркас, блоки и что писать в каждом","description":"Как собрать страницу услуги: оффер, выгоды, процесс, примеры, цена/условия, FAQ и CTA. ИИ помогает с черновиками, а НОРДИК — собрать и экспортировать страницу.","h1":"Страница услуги с ИИ","lead":"Каркас страницы услуги помогает быстро собрать понятный контент и не забыть важные блоки.","keywords":"страница услуги, страница услуги с ии, каркас страницы услуги, блоки страницы услуги, описание услуги","audiences":["самозанятых","малых предпринимателей","фрилансеров"],"steps":[{"title":"Соберите оффер","text":"Кому вы помогаете и какой результат даёте. Попросите ИИ дать 10 вариантов заголовка."},{"title":"Добавьте доверие и процесс","text":"Кейсы/примеры + 3–5 шагов, как проходит работа."},{"title":"Закройте вопросы","text":"Цена/условия и короткий FAQ, затем повторите CTA внизу."}],"checklist":["Есть понятный H1","Есть выгоды/результат","Есть процесс","Есть примеры/доверие","Есть FAQ и CTA"],"important":["Не смешивайте разные услуги на одной странице","Если цена зависит — объясните от чего","Сделайте CTA конкретным: что будет после клика"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/opisanie-uslugi-s-ii","label":"Описание услуги"},{"href":"/ofer-dlya-saita-uslug-s-ii","label":"Оффер для услуг"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ для услуг"}],"faq":[{"q":"Нужно ли писать «про себя» на странице услуги?","a":"Коротко — да: 2–3 факта и почему вам можно доверять. Но главный фокус — на услуге."},{"q":"Как понять, что страница услуги «готова»?","a":"Когда клиент может принять решение: ему понятно, что он получит, на каких условиях и как начать."}]},{"path":"/ofer-dlya-saita-uslug-s-ii","title":"Оффер для сайта услуг с ИИ: как сформулировать предложение и не перегнуть","description":"Как сделать оффер для услуг: формула заголовка, подзаголовок, выгоды, доÐ
179ºÐ°Ð·Ð°Ñ‚ельства и честные условия. ИИ помогает с вариантами, а вы проверяете факты.","h1":"Оффер для сайта услуг с ИИ","lead":"Для услуг важно «что будет на выходе». Чем понятнее результат — тем больше доверия и заявок.","keywords":"оффер услуги, утп для услуг, оффер с ии, заголовок услуги, предложение услуги","audiences":["самозанятых","малых предпринимателей","маркетологов"],"steps":[{"title":"Опишите результат","text":"Что получает клиент: документ, ремонт, консультацию, дизайн, настройку — в конкретных терминах."},{"title":"Сгенерируйте варианты","text":"Попросите ИИ 10 вариантов заголовка и 10 вариантов выгод под разные сегменты."},{"title":"Уточните условия","text":"Сроки, стоимость, ограничения, что входит/не входит и как начинается работа."}],"checklist":["Оффер конкретный","Есть доказательства","Есть условия","CTA понятный","Нет преувеличений"],"important":["Избегайте «гарантируем всем» — это не выглядит правдой","Если срок зависит — пишите диапазон и условия","Лучше один сильный оффер, чем три слабых"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/zagolovki-dlya-saita-uslug-s-ii","label":"Заголовки"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Можно ли делать оффер «по цене»?","a":"Можно, если вы готовы подтвердить условия. Часто лучше акцентировать результат и сроки."},{"q":"Почему ИИ пишет слишком одинаково?","a":"Потому что нет фактов. Дайте детали ниши, форматы, ограничения и примеры работ."}]},{"path":"/faq-dlya-saita-uslug-s-ii","title":"FAQ для сайта услуг с ИИ: вопросы про цену, сроки и процесс","description":"Как собрать FAQ для сайта услуг: список вопросов клиентов, ответы без «воды», как оформить на странице и как не обещать лишнего. ИИ помогает с черновиком.","h1":"FAQ для сайта услуг с ИИ","lead":"FAQ снижает количество одинаковых вопросов и повышает доверие. Сначала — вопросы, затем — короткие ответы.","keywords":"faq услуги, faq для сайта услуг, вопросы клиентов услуги, faq с ии, возражения","audiences":["самозанятых","малых предпринимателей","фрилансеров"],"steps":[{"title":"Соберите возражения","text":"Цена, сроки, предоплата, гарантии, что входит, что нужно от клиента."},{"title":"Попросите ИИ написать ответы","text":"Попросите писать коротко, по фактам и без общих обещаний."},{"title":"Проверьте на правду","text":"Каждый ответ должен соответствовать реальным условиям вашей работы."}],"checklist":["Есть вопросы про цену","Есть вопросы про сроки","Есть вопросы про процесс","Есть вопрос «как начать»","Ответы конкретные"],"important":["Не публикуйте непроверенные гарантии","Если есть ограничения — пишите их прямо","FAQ лучше обновлять раз в несколько месяцев"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/opisanie-uslugi-s-ii","label":"Описание услуги"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"},{"href":"/kak-sdelat-sait-uslug-s-ii-poshagovo","label":"Пошаговый план"}],"faq":[{"q":"Сколько вопросов делать?","a":"Обычно 6–12 достаточно. Лучше меньше, но про реальные возражения."},{"q":"FAQ помогает SEO?","a":"FAQ помогает структуре и пониманию. Главное — отвечать на реальные вопросы, а не «набивать ключи»."}]},{"path":"/zagolovki-dlya-saita-uslug-s-ii","title":"Заголовки для сайта услуг с ИИ: формулы, идеи и примеры","description":"Как сделать заголовки для сайта услуг: формулы H1, заголовки выгод и блоков, варианты CTA. ИИ помогает быстро нагенерировать идеи, вы выбираете и уточняете.","h1":"Заголовки для сайта услуг с ИИ","lead":"Сильный заголовок услуги говорит о результате и условиях. ИИ удобен для генерации вариантов, но финальный выбор — за вами.","keywords":"заголовки для сайта услуг, h1 услуги, заголовок страницы услуги, нейросеть заголовки, оффер услуги","audiences":["маркетологов","самозанятых","малых предпринимателей"],"steps":[{"title":"Запишите результат","text":"В чём измеримый итог: «настрою рекламу», «сделаю ремонт», «соберу сайт», «проведу аудит»."},{"title":"Сгенерируйте варианты","text":"Попросите ИИ 20 заголовков и 10 подзаголовков, затем выберите 3–5 наиболее ясных."},{"title":"Проверьте на точность","text":"Заголовок должен соответствовать услуге и не обещать лишнего."}],"checklist":["Есть результат","Есть аудитория/ниша","Есть условие (география/срок/формат)","Нет преувеличений","CTA понятный"],"important":["Не делайте «креатив ради креатива» — ясность важнее","Если услуга комплексная — уточняйте, что входит","Тестируйте 2–3 варианта"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/ofer-dlya-saita-uslug-s-ii","label":"Оффер"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ"}],"faq":[{"q":"Нужно ли упоминать цену в заголовке?","a":"Не обязательно. Часто лучше заголовок про результат, а условия/цена — ниже по странице."},{"q":"Какой заголовок лучше: «сделаю» или «помогу»?","a":"Зависит от услуги. Для измеримого результата чаще лучше «сделаю/настрою/выполню»."}]},{"path":"/kontent-dlya-saita-uslug-s-ii","title":"Контент для сайта услуг с ИИ: план страниц и что писать","description":"Как составить контент‑план для сайта услуг через ИИ: список страниц, темы, вопросы клиентов, тексты для услуг и блоков доверия. Затем — собрать страницы и экспортировать.","h1":"Контент для сайта услуг с ИИ","lead":"Контент‑план помогает и продажам, и SEO: отдельные страницы услуг, ответы на вопросы и примеры работ.","keywords":"контент для сайта услуг, контент план услуг, тексты для услуг с ии, страницы услуг, нейросеть контент","audie
179nces":["самозанятых","малых предпринимателей","маркетологов"],"steps":[{"title":"Соберите список услуг","text":"Сначала — основные услуги, затем — подуслуги/варианты, которые часто спрашивают."},{"title":"Попросите ИИ составить план страниц","text":"Пусть ИИ предложит: страницы услуг, кейсы, FAQ, контакты и список тем для статей/разделов."},{"title":"Соберите первые страницы","text":"Начните с главной и 1–3 услуг, затем добавляйте новые страницы итеративно."}],"checklist":["Есть главная","Есть страницы ключевых услуг","Есть доверие (кейсы/отзывы)","Есть FAQ","Есть контакты/CTA"],"important":["Планируйте страницы под реальные вопросы клиентов","Каждая услуга — отдельная страница, если она отличается","Проверяйте тексты: ИИ может «придумывать»"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/struktura-saita-uslug-s-ii","label":"Структура сайта"},{"href":"/opisanie-uslugi-s-ii","label":"Описание услуги"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли писать много текста на главной?","a":"Не обязательно. Важнее ясный оффер, список услуг и понятный путь к заявке."},{"q":"Как быстро получить контент для 10 услуг?","a":"ИИ помогает с черновиками, но для качества нужно добавить факты и отличия каждой услуги."}]},{"path":"/cheklist-saita-uslug-s-ii","title":"Чеклист сайта услуг с ИИ: качество страницы услуг и заявки","description":"Чеклист качества сайта услуг: оффер, тексты, условия, доверие, FAQ и CTA. ИИ помогает найти пробелы, а вы доводите страницу до готовности.","h1":"Чеклист сайта услуг с ИИ","lead":"Пройдитесь по чеклисту перед запуском рекламы или публикацией — это снижает потери заявок.","keywords":"чеклист сайта услуг, проверить страницу услуги, чеклист с ии, сайт услуг качество, заявки","audiences":["самозанятых","малых предпринимателей","маркетологов"],"steps":[{"title":"Проверьте оффер и условия","text":"Результат, сроки, цена/диапазон и что входит должны быть понятны и реальны."},{"title":"Проверьте доверие","text":"Примеры, отзывы, кейсы, фото и факты повышают конверсию."},{"title":"Проверьте CTA","text":"Кнопка понятная, контакты работают, на мобильном удобно."}],"checklist":["Оффер конкретный","Условия прозрачные","Есть доверие","Есть FAQ","CTA и контакты работают"],"important":["Не оставляйте «пустые» обещания без фактов","Проверяйте страницу на телефоне","Убедитесь, что CTA ведёт к понятному следующему шагу"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ"},{"href":"/kak-sdelat-sait-uslug-s-ii-poshagovo","label":"Пошаговый план"}],"faq":[{"q":"Что чаще всего забывают на сайте услуг?","a":"Понятные условия, процесс работы и ответы на возражения. Часто есть «красиво», но неясно, что делать дальше."},{"q":"Можно ли проверять страницу через ИИ?","a":"Да: попросите ИИ сыграть роль клиента и наÐ
179·Ð²Ð°Ñ‚ÑŒ непонятные места. Но финальная проверка — ваша."}]},{"path":"/kak-sdelat-sait-uslug-s-ii-poshagovo","title":"Как сделать сайт услуг с ИИ пошагово: план на 1–2 дня","description":"Пошаговый план, как сделать сайт услуг с ИИ: от сбора услуг и оффера до страниц услуг, FAQ, контактов и экспорта файлов сайта для публикации.","h1":"Как сделать сайт услуг с ИИ: пошагово","lead":"Если делать по шагам, сайт услуг можно собрать быстро: сначала каркас и 1–2 услуги, затем — расширение.","keywords":"как сделать сайт услуг, сайт услуг с ии пошагово, инструкция сайт услуг, страница услуги, экспорт сайта","audiences":["самозанятых","малых предпринимателей","новичков"],"steps":[{"title":"День 1: каркас","text":"Оффер, список услуг, доверие и контакты. Соберите главную страницу."},{"title":"День 1: страницы услуг","text":"Сделайте 1–2 страницы ключевых услуг: результат, процесс, условия, FAQ, CTA."},{"title":"День 2: доведение","text":"Добавьте примеры/отзывы, проверьте чеклист и экспортируйте сайт для публикации."}],"checklist":["Есть главная","Есть 1–2 страницы услуг","Есть доверие","Есть FAQ","Есть CTA и контакты"],"important":["Не делайте всё сразу — начните с ключевых услуг","Проверяйте тексты на правду и точность","Всегда проверяйте мобильную версию"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/struktura-saita-uslug-s-ii","label":"Структура"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"},{"href":"/primery-saita-uslug-s-ii","label":"Примеры и идеи"}],"faq":[{"q":"Можно ли собрать сайт услуг за один день?","a":"Да, если начать с минимального набора страниц: главная + 1–2 услуги + контакты + FAQ."},{"q":"Что сделать, если контент не готов?","a":"Используйте ИИ для черновика, но добавьте факты и вычитайте перед публикацией."}]},{"path":"/sait-mastera-uslug-s-ii","title":"Сайт мастера услуг с ИИ: сценарий для самозанятого и запись клиентов","description":"Как собрать сайт для мастера услуг: оффер, прайс/условия, примеры, отзывы, FAQ и запись. ИИ помогает с текстами, НОРДИК — собрать страницу и экспортировать.","h1":"Сайт мастера услуг с ИИ","lead":"Для мастера важны: понятная услуга, цены/условия, примеры работ и быстрый способ записаться.","keywords":"сайт мастера услуг, сайт самозанятого, сайт услуги с ии, запись клиентов, визитка мастера","audiences":["самозанятых","мастеров","фрилансеров"],"steps":[{"title":"Опишите услуги и условия","text":"Что делаете, где, сколько стоит, сколько по времени и что нужно от клиента."},{"title":"Сделайте блок доверия","text":"Фото/примеры, отзывы и коротко про опыт — это ключ к заявкам."},{"title":"Соберите CTA на запись","text":"Один главный CTA: «Записаться»/«Уточнить время» и кликабельные контакты."}],"checklist":["Понятный оффер","Есть прайс/условия","Есть примеры работ","Есть отзывы/доверие","Есть запись/CTA"],"important":["Если цены плавающие — объясните от чего зависит","Проверьте контакты на телефоне","Не перегружайте страницу: коротко и по делу"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/opisanie-uslugi-s-ii","label":"Описание услуги"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ"},{"href":"/cheklist-saita-vizitki-s-ii","label":"Чеклист визитки"}],"faq":[{"q":"Нужен ли отдельный прайс‑лист?","a":"Если услуг много — да, можно отдельным блоком/страницей. Если 1–3 услуги — достаточно на странице."},{"q":"Что лучше: форма или мессенджер?","a":"Для мастера часто проще мессенджер/звонок. Главное — один понятный путь."}]},{"path":"/primery-saita-uslug-s-ii","title":"Примеры сайта услуг с ИИ: идеи блоков, секций и формулировок","description":"Идеи и примеры, как может выглядеть сайт услуг: варианты структуры, блоки доверия, CTA, FAQ и тексты. Используйте ИИ для черновика и соберите страницу в НОРДИК.","h1":"Примеры сайта услуг с ИИ","lead":"Примеры помогают быстрее собрать свой вариант: вы берёте структуру, заменяете факты и публикуете.","keywords":"примеры сайта услуг, пример страницы услуги, идеи сайта услуг, сайт услуг с ии, примеры блоков","audiences":["самозанятых","малых предпринимателей","маркетологов"],"steps":[{"title":"Выберите пример под нишу","text":"Например: «мастер», «консультации», «ремонт», «дизайн» — структура будет похожа, а факты разные."},{"title":"Попросите ИИ адаптировать текст","text":"Дайте ИИ ваши услуги/условия и попросите переписать пример под вашу нишу."},{"title":"Соберите страницы и экспортируйте","text":"Соберите блоки, проверьте чеклист и скачайте ZIP для публикации."}],"checklist":["Есть оффер","Есть блок услуг","Есть процесс","Есть доверие","Есть CTA"],"important":["Пример — это каркас, а не «копипаст»","Добавляйте факты: цены, сроки, ограничения","Проверяйте тексты перед публикацией"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/struktura-saita-uslug-s-ii","label":"Структура"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/kak-sdelat-sait-uslug-s-ii-poshagovo","label":"Пошаговый план"}],"faq":[{"q":"Можно ли просто скопировать пример?","a":"Лучше адаптировать под вашу реальность: услуги, условия, цены, форматы работы и тон общения."},{"q":"Какие блоки чаще всего дают заявки?","a":"Первый экран с оффером, блок доверия (примеры/отзывы), процесс и понятный CTA на запись/заявку."}]},{"path":"/sait-dlya-professii-s-ii","title":"Сайт для профессии с ИИ: подборка страниц для малого бизнеса","description":"Подборка: сайт для сантехника, маникюра, электрика и других профессий. ИИ помогает с черновиками текста и FAQ, НОРДИК — собрать страницу и экспортировать сайт для публикации.","h1":"Сайт для профессии с ИИ","lead":"Если вы мастер или специалист, лучше всего работает простая структура: оффер + услуги + цены/условия + примеры + контакты. Ниже — готовые страницы под популярные профессии.","keywords":"сайт для профессии с ии, сайт для мастера услуг, сайт для самозанятого, сайт услуг с ии, лендинг для специалиста","audiences":["самозанятых","малых предпринимателей"],"steps":[{"title":"Выберите страницу под нишу","text":"Возьмите профессию/услугу и используйте шаблон: оффер, цены/условия, доверие, контакты."},{"title":"Соберите факты и попросите ИИ сделать черновик","text":"Дайте ИИ ваши услуги, географию, диапазон цен и ограничения — и попросите текст без обещаний «с потолка»."},{"title":"Соберите страницу и экспортируйте","text":"Соберите блоки в НОРДИК, проверьте мобильную версию и скачайте ZIP для публикации."}],"checklist":["Оффер + география (город/район/выезд)","Услуги/форматы работы описаны конкретно","Есть цены/условия или понятный диапазон","Есть доверие: фото/примеры/отзывы","Есть контакты и один главный CTA"],"important":["Не публикуйте непроверенные гарантии/сроки/цены — пишите условия","Сделайте CTA кликабельным на телефоне (звонок/мессенджер)","Начните с одной страницы и 1–2 ключевых услуг"],"links":[{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг с ИИ"},{"href":"/sait-mastera-uslug-s-ii","label":"Сайт мастера услуг (сценарий)"},{"href":"/struktura-saita-uslug-s-ii","label":"Структура сайта услуг"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист сайта услуг"},{"href":"/sait-dlya-santekhnika-s-ii","label":"Сайт для сантехника"},{"href":"/sait-dlya-manikyura-s-ii","label":"Сайт для маникюра"},{"href":"/sait-dlya-elektrika-s-ii","label":"Сайт для электрика"},{"href":"/sait-dlya-klininga-s-ii","label":"Сайт для клининга"},{"href":"/sait-dlya-parikmahera-s-ii","label":"Сайт для парикмахера"},{"href":"/sait-dlya-kosmetologa-s-ii","label":"Сайт для косметолога"},{"href":"/sait-dlya-massazha-s-ii","label":"Сайт для массажиста"},{"href":"/sait-dlya-fotografa-s-ii","label":"Сайт для фотографа"},{"href":"/sait-dlya-repetitora-s-ii","label":"Сайт для репетитора"},{"href":"/sait-dlya-psihologa-s-ii","label":"Сайт для психолога"},{"href":"/sait-dlya-yurista-s-ii","label":"Сайт для юриста"},{"href":"/sait-dlya-buhgaltera-s-ii","label":"Сайт для бухгалтера"},{"href":"/sait-dlya-avtoservisa-s-ii","label":"Сайт для автосервиса"},{"href":"/sait-dlya-shinomontazha-s-ii","label":"Сайт для шиномонтажа"},{"href":"/sait-dlya-gruzoperevozok-s-ii","label":"Сайт для грузоперевозок"},{"href":"/sait-dlya-dostavki-edy-s-ii","label":"Сайт для доставки еды"},{"href":"/sait-dlya-cvetochnogo-magazina-s-ii","label":"Сайт для цветочного магазина"}],"faq":[{"q":"Зачем отдельная страница под профессию?","a":"Она точнее отвечает на запрос пользователя и проще конвертирует: вы говорите про конкретную услугу, цены/условия и географию."},{"q":"Сколько страниц делать мастеру?","a":"Старт: одна страница + 1–2 ключевые услуги. Дальше можно добавлять отдельные страницы под популярные услуги."}]},{"path":"/sait-dlya-santekhnika-s-ii","title":"Сайт для сантехника с ИИ: оффер, цены, выезд и заявки","description":"Как сделать сайт для сантехника: услуги, выезд/районы, цены/диапазоны, примеры работ и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать страницу и экспортировать сайт.","h1":"Сайт для сантехника с ИИ","lead":"Клиенту важно сразу понять: что вы делаете, где работаете (район/выезд), сколько стоит и как быстро можно вызвать мастера.","keywords":"сайт для сантехника, сантехник сайт визитка, вызов сантехника сайт, услуги сантехника, сайт с ии","audiences":["самозанятых","мастеров"],"steps":[{"title":"Соберите список услуг","text":"Например: устранение протечек, установка сантехники, замена смесителя, монтаж/ремонт."},{"title":"Дайте ИИ факты","text":"Город/районы, выезд, график, диапазон цен и что влияет на стоимость — попросите ИИ написать оффер и FAQ."},{"title":"Соберите страницу и экспортируйте","text":"Добавьте блок услуг, блок доверия (фото/примеры), контакты и скачайте ZIP для публикации."}],"checklist":["Услуги перечислены простыми словами","Указаны районы/выезд","Есть цены/диапазон и условия","Есть фото/примеры работ","Есть CTA: позвонить/написать"],"important":["Если цена зависит от ситуации — объясните от чего именно","Проверьте, что телефон/мессенджер кликабельны","Не обещайте сроки без уточнения (лучше: «в среднем / по договорённости»)"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-mastera-uslug-s-ii","label":"Сайт мастера услуг"},{"href":"/struktura-saita-uslug-s-ii","label":"Структура сайта услуг"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужен ли прайс на сайте сантехника?","a":"Можно указать «от‑цены» или диапазоны и перечислить, что влияет на стоимÐ
179¾ÑÑ‚ÑŒ. Это лучше, чем отсутствие ориентиров."},{"q":"Что поставить главным CTA?","a":"Обычно «Позвонить» или «Написать в мессенджер», плюс повтор CTA внизу страницы."}]},{"path":"/sait-dlya-manikyura-s-ii","title":"Сайт для маникюра с ИИ: услуги, прайс, запись и портфолио","description":"Как сделать сайт для мастера маникюра: услуги и прайс, фото работ, условия записи и ответы на вопросы. ИИ помогает с текстом, НОРДИК — собрать страницу и экспортировать сайт.","h1":"Сайт для маникюра с ИИ","lead":"Для маникюра решают фото работ, понятные цены/длительность процедур и простой способ записаться.","keywords":"сайт для маникюра, мастер маникюра сайт, запись на маникюр, портфолио ногтей, сайт с ии","audiences":["самозанятых","мастеров"],"steps":[{"title":"Соберите услуги и прайс","text":"Маникюр/педикюр/покрытие, длительность, диапазон цен, что входит."},{"title":"Сделайте портфолио и FAQ","text":"Загрузите 8–20 фото работ и попросите ИИ составить FAQ (стерильность, запись, перенос, дизайн)."},{"title":"Соберите страницу и экспортируйте","text":"Первый экран, прайс, портфолио, отзывы, контакты — затем экспорт ZIP для публикации."}],"checklist":["Есть портфолио (фото работ)","Есть прайс/диапазоны и длительность","Указаны адрес/район и график","Есть условия записи/переноса","Есть один главный CTA на запись"],"important":["Не перегружайте текстом — пусть страница сканируется","Факты важнее «красивых формулировок»","Проверьте мобильную версию: многие записываются с телефона"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-mastera-uslug-s-ii","label":"Сайт мастера услуг"},{"href":"/ofer-dlya-saita-uslug-s-ii","label":"Оффер для сайта услуг"},{"href":"/cheklist-saita-vizitki-s-ii","label":"Чеклист визитки"}],"faq":[{"q":"Что важнее: текст или фото работ?","a":"Обычно фото работ и понятный прайс. Текст нужен, чтобы снять сомнения: условия, запись, безопасность."},{"q":"Нужно ли делать отдельные страницы услуг?","a":"Не обязательно. Можно начать с одной страницы и добавить отдельные услуги позже, если появится спрос."}]},{"path":"/sait-dlya-elektrika-s-ii","title":"Сайт для электрика с ИИ: услуги, выезд, цены и доверие","description":"Как сделать сайт для электрика: список работ, выезд/районы, цены/условия, примеры и контакты. ИИ помогает с черновиками текста и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для электрика с ИИ","lead":"На сайте электрика важны конкретные работы, география/выезд, условия и доверие: примеры и отзывы.","keywords":"сайт для электрика, электрик вызов, услуги электрика сайт, ремонт электрики, сайт с ии","audiences":["самозанятых","мастеров"],"steps":[{"title":"Соберите перечень работ","text":"Монтаж/замена, диагностика, устранение неисправностей, щиток, освещение и т.д."},{"title":"Сделайте оффер и FAQ","text":"Попросите ИИ написать оффер и FAQ на основе ваших условий, без обещаний точных сроков без осмотра."},{"title":"Соберите страницу и экспортируйте","text":"Добавьте услуги, примеры, процесс и контакты, затем экспортируйте сайт в ZIP."}],"checklist":["Есть список работ простыми словами","Указана география/выезд","Есть цены/условия","Есть доверие: фото/отзывы","Контакты и CTA видны сразу"],"important":["Лучше «диапазон» и условия, чем пустая страница без цен","Проверьте контакты на мобильном","Добавьте процесс работы (3–5 шагов)"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг"},{"href":"/struktura-saita-uslug-s-ii","label":"Структура"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ для сайта услуг"}],"faq":[{"q":"Что писать в первом экране?","a":"Что делаете, где работаете, ориентиры по цене и как быстро можно связаться."},{"q":"Как показать доверие?","a":"Фото работ, отзывы, опыт, понятные условия и аккуратный процесс работы."}]},{"path":"/sait-dlya-remonta-kvartir-s-ii","title":"Сайт для ремонта квартир с ИИ: услуги, этапы и смета","description":"Как сделать сайт для ремонта квартир: виды работ, этапы, условия, примеры объектов и контакты. ИИ помогает с черновиками текста и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для ремонта квартир с ИИ","lead":"В ремонте решают: примеры объектов, понятные этапы и прозрачные условия — это снижает «пустые» вопросы.","keywords":"сайт ремонт квартир, сайт для ремонта, ремонт квартир услуги, этапы ремонта, сайт с ии","audiences":["малых предпринимателей","самозанятых"],"steps":[{"title":"Опишите виды работ","text":"Косметический/капитаÐ
179»ÑŒÐ½Ñ‹Ð¹, отдельные работы, материалы, что входит."},{"title":"Соберите примеры и этапы","text":"Фото «до/после», список этапов и сроки по диапазонам — затем попросите ИИ оформить это в текст."},{"title":"Соберите страницы и экспортируйте","text":"Главная + услуги + примеры + контакты/FAQ — и экспорт ZIP для публикации."}],"checklist":["Есть примеры объектов/фото","Есть этапы и как вы работаете","Есть условия/диапазон цен","Есть география","Есть CTA на замер/консультацию"],"important":["Не обещайте фиксированные сроки без замера","Пишите, что входит/не входит — это экономит время","Один главный CTA: замер/консультация"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-mastera-uslug-s-ii","label":"Сайт мастера услуг"},{"href":"/struktura-saita-uslug-s-ii","label":"Структура"},{"href":"/primery-saita-uslug-s-ii","label":"Примеры"}],"faq":[{"q":"Нужна ли смета на сайте?","a":"Можно дать примеры диапазонов и перечислить, что влияет на стоимость. Полную смету обычно делают после замера/уточнений."},{"q":"Как оформить примеры работ?","a":"Фото + короткое описание: что было, что сделали, сроки и условия (если можно)."}]},{"path":"/sait-dlya-mastera-na-chas-s-ii","title":"Сайт для мастера на час с ИИ: список работ и быстрый вызов","description":"Как сделать сайт «мастер на час»: список мелких работ, выезд/районы, цены/минимальный заказ и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать страницу и экспортировать сайт.","h1":"Сайт для мастера на час с ИИ","lead":"Главное — список типовых работ, понятные условия выезда и быстрый CTA на вызов.","keywords":"сайт мастер на час, вызов мастера сайт, мелкий ремонт, услуги мастера, сайт с ии","audiences":["самозанятых","мастеров"],"steps":[{"title":"Соберите список типовых задач","text":"Сборка мебели, повесить полку/карниз, мелкий ремонт, замена фурнитуры и т.д."},{"title":"Сформулируйте условия","text":"Минимальный заказ, выезд, район, время работы — и попросите ИИ сделать краткий оффер и FAQ."},{"title":"Соберите страницу и экспортируйте","text":"Услуги, условия, доверие, контакты — затем экспорт ZIP."}],"checklist":["Есть список типовых работ","Есть условия выезда/минимальный заказ","Есть география","Есть доверие: фото/отзывы","CTA на вызов виден сразу"],"important":["Пишите ограничения (что не делаете) — меньше лишних обращений","Укажите график и время ответа","Не распыляйтесь: 1 страница — ок для старта"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-vizitka-s-ii","label":"Хаб: визитка"},{"href":"/ofer-dlya-saita-uslug-s-ii","label":"Оффер"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужны ли цены на «мастер на час»?","a":"Да, хотя бы ориентиры: минимальный заказ, стоимость выезда или диапазоны по типовым работам."},{"q":"Что лучше в контактах?","a":"Телефон + мессенджер, чтобы клиент мог быстро отправить фото/описание задачи."}]},{"path":"/sait-dlya-klininga-s-ii","title":"Сайт для клининга с ИИ: услуги, цены и заявки","description":"Как сделать сайт для клининга: виды уборки, площади/цены, что входит, отзывы и контакты. ИИ помогает с черновиками текста и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для клининга с ИИ","lead":"Клиенту важно понять: какие виды уборки, что входит, как считается цена и как быстро оставить заявку.","keywords":"сайт для клининга, уборка квартир сайт, клининг услуги, цены уборка, сайт с ии","audiences":["малых предпринимателей","самозанятых"],"steps":[{"title":"Опишите виды уборки","text":"Поддерживающая, генеральная, после ремонта, офисы — что делаете и что входит."},{"title":"Соберите правила цены","text":"От площади, от количества комнат, доп. услуги — и попросите ИИ оформить понятные формулировки."},{"title":"Соберите страницу и экспортируйте","text":"Услуги, прайс/условия, отзывы, контакты — экспорт ZIP."}],"checklist":["Услуги и что входит описаны","Есть правила расчёта цены","Есть доверие: отзывы/фото","Есть условия (время, инвентарь)","CTA на заявку понятный"],"important":["Пишите, что входит/не входит — это снижает конфликт","Сделайте FAQ по доп. услугам и ограничениям","Проверьте мобильную версию"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Как лучше показывать цены?","a":"Либо таблица по площадям/комнатам, либо «от‑цены» + список, что входит и что влияет на стоимость."},{"q":"Что добавить для доверия?","a":"Отзывы, фото «до/после», список используемых средств (если уместно) и понятные условия."}]},{"path":"/sait-dlya-parikmahera-s-ii","title":"Сайт для парикмахера с ИИ: услуги, цены и запись","description":"Как сделать сайт для парикмахера: услуги и прайс, примеры работ, условия записи и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для парикмахера с ИИ","lead":"Покажите примеры работ, прайс и простой способ записаться — этого достаточно, чтобы получать заявки.","keywords":"сайт для парикмахера, парикмахер сайт визитка, запись, прайс, портфолио, сайт с ии","audiences":["самозанятых","мастеров"],"steps":[{"title":"Соберите прайс и услуги","text":"Стрижки, окрашивание, укладки, дополнительные услуги и диапазоны цен."},{"title":"Добавьте портфолио и FAQ","text":"Фото работ и FAQ по записи/переносу/подготовке к процедуре."},{"title":"Соберите страницу и экспортируйте","text":"Оффер → услуги → портфолио → отзывы → контакты, затем экспорт ZIP."}],"checklist":["Есть портфолио","Есть прайс/диапазоны","Есть условия записи","Есть адрес/район","Есть CTA на запись"],"important":["Фото работ — ключевой элемент","Один главный CTA, без лишних кнопок","Проверьте, что контакты кликабельны"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-mastera-uslug-s-ii","label":"Сайт мастера услуг"},{"href":"/ofer-dlya-saita-uslug-s-ii","label":"Оффер"},{"href":"/cheklist-saita-vizitki-s-ii","label":"Чеклист визитки"}],"faq":[{"q":"Нужно ли писать «о себе»?","a":"Да, коротко: опыт, стиль работы, чем отличаетесь. Но без воды — лучше фактами и примерами."},{"q":"Какой минимум для старта?","a":"Одна страница: оффер, услуги/прайс, портфолио, контакты и CTA."}]},{"path":"/sait-dlya-kosmetologa-s-ii","title":"Сайт для косметолога с ИИ: услуги, прайс и доверие","description":"Как сделать сайт для косметолога: услуги, противопоказания/условия, прайс/диапазоны, результаты и контакты. ИИ помогает с черновиками текста и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для косметолога с ИИ","lead":"На странице косметолога важны: услуги и условия, понятный прайс и аккуратные ответы на частые вопросы.","keywords":"сайт для косметолога, услуги косметолога, прайс косметология, запись, сайт с ии","audiences":["самозанятых","мастеров"],"steps":[{"title":"Соберите список процедур","text":"Что делаете и кому подходит, длительность, основные условия (без медицинских обещаний)."},{"title":"Сформируйте FAQ","text":"Подготовка, противопоказания/ограничения, уход после — попросите ИИ оформить текст по вашим правилам."},{"title":"Соберите страницу и экспортируйте","text":"Услуги, прайс, отзывы/фото, контакты — экспорт ZIP."}],"checklist":["Услуги описаны конкретно","Есть цены/диапазоны","Есть условия/ограничения","Есть доверие: отзывы/фото","Есть CTA на запись"],"important":["Не обещайте результата «гарантированно» — пишите аккуратно","Пишите условия подготовки и ухода понятным языком","Проверяйте тексты на соответствие реальности"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ для сайта услуг"},{"href":"/opisanie-uslugi-s-ii","label":"Описание услуги"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Что писать про условия и противопоказания?","a":"Только то, что вы реально используете в работе: подготовка, ограничения, что обсудить на консультации."},{"q":"Как собрать доверие?","a":"Отзывы, фото работ (если уместно), опыт и понятный процесс записи."}]},{"path":"/sait-dlya-massazha-s-ii","title":"Сайт для массажа с ИИ: услуги, цены и запись","description":"Как сделать сайт для массажиста: виды массажа, длительность, цены, условия и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать страницу и экспортировать сайт.","h1":"Сайт для массажа с ИИ","lead":"Чётко перечислите виды массажа, длительность сеанса, цены/диапазоны и удобный способ записаться.","keywords":"сайт для массажиста, массаж сайт, запись на массаж, прайс массаж, сайт с ии","audiences":["самозанятых","мастеров"],"steps":[{"title":"Опишите услуги и формат","text":"Какие виды массажа, где принимаете, длительность, кому подходит (без обещаний результата)."},{"title":"Сделайте FAQ","text":"Подготовка, перенос записи, противопоказания/ограничения — попросите ИИ оформить по вашим правилам."},{"title":"Соберите страницу и экспортируйте","text":"Оффер, услуги, прайс, отзывы, контакты — экспорт ZIP."}],"checklist":["Есть виды массажа и длительность","Есть цены/диапазоны","Есть условия и ограничения","Есть доверие: отзывы/опыт","Есть CTA на запись"],"important":["Старайтесь писать конкретно и спокойно","Проверьте, что контакты работают на телефоне","Начните с одной страницы, потом расширите"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-mastera-uslug-s-ii","label":"Сайт мастера услуг"},{"href":"/ofer-dlya-saita-uslug-s-ii","label":"Оффер"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли писать про противопоказания?","a":"Если у вас есть стандартные ограничения и рекомендации — да, но без медицинских обещаний. Можно: «обсудим на консультации»."},{"q":"Что поставить CTA?","a":"«Записаться» или «Уточнить время», плюс кликабельные контакты."}]},{"path":"/sait-dlya-fotografa-s-ii","title":"Сайт для фотографа с ИИ: портфолио, пакеты и заявки","description":"Как сделать сайт фотографа: портфолио, пакеты/цены, процесс съёмки и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать страницу и экспортировать сайт.","h1":"Сайт для фотографа с ИИ","lead":"Портфолио — главное. Добавьте пакеты/цены, процесс и условия — и клиенту прощÐ
179µ решиться.","keywords":"сайт фотографа, портфолио фотографа, цены фотограф, фотосессия запись, сайт с ии","audiences":["самозанятых","фрилансеров"],"steps":[{"title":"Соберите портфолио","text":"Выберите 12–30 сильных работ и сгруппируйте по типам съёмок."},{"title":"Опишите пакеты и условия","text":"Длительность, что входит, сроки отдачи, условия переноса — попросите ИИ оформить текст по вашим правилам."},{"title":"Соберите страницу и экспортируйте","text":"Портфолио, пакеты, отзывы, контакты — экспорт ZIP для публикации."}],"checklist":["Есть портфолио","Есть пакеты/цены и что входит","Есть процесс работы","Есть условия и сроки (без обещаний «всегда»)","Есть CTA на запись"],"important":["Условия важнее «красивого текста»","Проверьте, что фото оптимально выглядят на мобиле","Один главный CTA"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-vizitka-s-ii","label":"Хаб: визитка"},{"href":"/cheklist-saita-vizitki-s-ii","label":"Чеклист визитки"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ"}],"faq":[{"q":"Нужно ли писать «о себе»?","a":"Да, коротко: опыт, стиль, чем отличаетесь. Но портфолио всё равно важнее."},{"q":"Как показать цены?","a":"Пакеты или «от‑цена» + что входит. Главное — чтобы клиент понимал порядок."}]},{"path":"/sait-dlya-repetitora-s-ii","title":"Сайт для репетитора с ИИ: предметы, результаты и запись","description":"Как сделать сайт для репетитора: предметы и форматы, стоимость, результаты/кейсы, отзывы и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для репетитора с ИИ","lead":"На странице репетитора важны: предметы/классы, формат (онлайн/офлайн), цена, результаты и понятный CTA на пробный урок.","keywords":"сайт репетитора, репетитор сайт, подготовка к экзаменам, пробный урок, сайт с ии","audiences":["самозанятых","экспертов"],"steps":[{"title":"Опишите предметы и формат","text":"Кому помогаете, какие классы/экзамены, онлайн/офлайн, длительность занятия."},{"title":"Соберите результаты и FAQ","text":"Кейсы/результаты, условия занятий, домашка — попросите ИИ оформить чётко и без обещаний."},{"title":"Соберите страницу и экспортируйте","text":"Оффер, формат, отзывы/кейсы, контакты — экспорт ZIP."}],"checklist":["Есть предметы и кому вы помогаете","Есть формат и длительность","Есть цена/диапазон","Есть результаты/кейсы/отзывы","Есть CTA на пробный урок"],"important":["Не обещайте гарантированный балл/результат","Пишите, как проходит занятие и что нужно от ученика","Сделайте один главный CTA"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-vizitka-s-ii","label":"Хаб: визитка"},{"href":"/tekst-o-sebe-s-ii-dlya-saita-vizitki","label":"Текст «о себе»"},{"href":"/faq-dlya-saita-vizitki-s-ii","label":"FAQ"}],"faq":[{"q":"Что поставить CTA?","a":"«Записаться на пробный урок» или «Уточнить расписание» — и контакты кликабельны."},{"q":"Нужно ли писать цены?","a":"Да, хотя бы диапазон и условия (длительность, формат, абонементы)."}]},{"path":"/sait-dlya-psihologa-s-ii","title":"Сайт для психолога с ИИ: направления, формат и запись","description":"Как сделать сайт психолога: направления, формат консультаций, стоимость, подход и контакты. ИИ помогает с черновиками текста и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для психолога с ИИ","lead":"Лучше всего работает спокойная, конкретная страница: направления, формат, стоимость и простой способ записаться.","keywords":"сайт психолога, психолог сайт, консультация психолога, запись, сайт с ии","audiences":["экспертов","самозанятых"],"steps":[{"title":"Опишите направления и формат","text":"С какими запросами работаете, онлайн/офлайн, длительность, стоимость/диапазон."},{"title":"Сформулируйте «как вы работаете","text":"Процесс 3–5 шагов и FAQ — попросите ИИ оформить по вашим формулировкам, без обещаний результата."},{"title":"Соберите страницу и экспортируйте","text":"Оффер, направления, процесс, контакты — экспорт ZIP."}],"checklist":["Есть направления и для кого","Есть формат и длительность","Есть стоимость/условия","Есть описание процесса","Есть CTA на запись"],"important":["Без обещаний «гарантированного эф
179фекта»","Пишите простыми словами, без сложных терминов","Один главный CTA"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-vizitka-s-ii","label":"Хаб: визитка"},{"href":"/tekst-dlya-saita-vizitki-s-ii","label":"Текст для визитки"},{"href":"/faq-dlya-saita-vizitki-s-ii","label":"FAQ"}],"faq":[{"q":"Нужно ли писать цену консультации?","a":"Да, хотя бы стоимость/диапазон и длительность. Это снижает лишние вопросы."},{"q":"Как описать подход?","a":"Коротко и понятно: как проходит работа, что обычно обсуждаете, и как записаться."}]},{"path":"/sait-dlya-yurista-s-ii","title":"Сайт для юриста с ИИ: услуги, кейсы и заявка","description":"Как сделать сайт юриста: направления, форматы работы, стоимость/условия, кейсы и контакты. ИИ помогает с черновиками текста и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для юриста с ИИ","lead":"Для юриста важны: понятные услуги, условия, примеры кейсов (если можно) и быстрый способ оставить заявку.","keywords":"сайт юриста, юридические услуги сайт, консультация юриста, заявка, сайт с ии","audiences":["самозанятых","малых предпринимателей"],"steps":[{"title":"Опишите направления","text":"Какие дела ведёте, для кого, в каком регионе/городе работаете."},{"title":"Сформулируйте условия","text":"Формат консультации, стоимость/диапазон, что нужно от клиента — попросите ИИ оформить кратко."},{"title":"Соберите страницу и экспортируйте","text":"Услуги, доверие (опыт/кейсы), контакты — экспорт ZIP."}],"checklist":["Услуги перечислены понятным языком","Есть формат и условия","Есть стоимость/диапазон","Есть доверие: опыт/кейсы","Есть CTA на консультацию"],"important":["Не публикуйте конфиденциальное — кейсы обезличивайте","Пишите ограничения и что не берёте в работу","Один главный CTA"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли публиковать цены?","a":"Если цены зависят от ситуации — укажите диапазоны и условия. Это лучше, чем молчание."},{"q":"Что добавить для доверия?","a":"Опыт, специализация, отзывы (если есть) и понятный процесс работы."}]},{"path":"/sait-dlya-buhgaltera-s-ii","title":"Сайт для бухгалтера с ИИ: услуги, тарифы и заявка","description":"Как сделать сайт бухгалтера: услуги, тарифы/условия, кому подходит и контакты. ИИ помогает с черновиками текста и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для бухгалтера с ИИ","lead":"Клиенту важно: какие услуги вы берёте, для каких форм бизнеса, как формируется цена и как начать.","keywords":"сайт бухгалтера, бухгалтерские услуги сайт, бухгалтер на аутсорсе, тарифы, сайт с ии","audiences":["самозанятых","малых предпринимателей"],"steps":[{"title":"Соберите услуги и тарифы","text":"Разовые/абонентские услуги, что входит, диапазоны цен и условия."},{"title":"Сделайте FAQ для бизнеса","text":"Сроки, документы, как вы взаимодействуете — попросите ИИ оформить по вашим правилам."},{"title":"Соберите страницу и экспортируйте","text":"Оффер, услуги/тарифы, процесс, контакты — экспорт ZIP."}],"checklist":["Есть список услуг","Есть тарифы/диапазоны","Есть кому подходит (ИП/ООО и т.п.)","Есть процесс работы","Есть CTA на консультацию"],"important":["Пишите чётко, без сложных формулировок","Лучше указать «что входит», чем просто цену","Один главный CTA"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ"},{"href":"/struktura-saita-uslug-s-ii","label":"Структура"}],"faq":[{"q":"Как показать цены, если всё индивидуально?","a":"Пишите тарифы по сегментам или диапазоны и перечисляйте, что влияет на стоимость."},{"q":"Что добавить для доверия?","a":"Опыт, специализация, отзывы и понятный процесс работы с док
179ументами."}]},{"path":"/sait-dlya-avtoservisa-s-ii","title":"Сайт для автосервиса с ИИ: услуги, цены и запись","description":"Как сделать сайт автосервиса: виды работ, цены/диапазоны, запись и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать страницу и экспортировать сайт.","h1":"Сайт для автосервиса с ИИ","lead":"На сайте автосервиса важны: список работ, ориентиры по цене, адрес и быстрый способ записаться.","keywords":"сайт автосервиса, автосервис услуги сайт, запись в автосервис, цены, сайт с ии","audiences":["малых предпринимателей"],"steps":[{"title":"Соберите услуги","text":"Диагностика, ТО, ремонт, электрика, шиномонтаж (если есть) и т.д."},{"title":"Сделайте правила цены","text":"Диапазоны и от чего зависит — попросите ИИ оформить без «фикс‑обещаний»."},{"title":"Соберите страницу и экспортируйте","text":"Услуги, цены, отзывы, контакты — экспорт ZIP."}],"checklist":["Есть список работ","Есть ориентиры по цене","Есть адрес и график","Есть доверие: отзывы","Есть CTA на запись"],"important":["Уточняйте условия: диагностика/сроки зависят от случая","Сделайте телефон кликабельным","Проверьте мобильную версию"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-dlya-shinomontazha-s-ii","label":"Сайт шиномонтажа"},{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли писать цены?","a":"Да, хотя бы ориентиры и условия. Это снижает звонки «просто спросить» и повышает качество лидов."},{"q":"Что важнее всего на странице?","a":"Список работ, адрес/контакты и простой CTA на запись."}]},{"path":"/sait-dlya-shinomontazha-s-ii","title":"Сайт для шиномонтажа с ИИ: услуги, цены и запись","description":"Как сделать сайт шиномонтажа: услуги, сезонные предложения, цены и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для шиномонтажа с ИИ","lead":"Покажите адрес, график, цены и ключевые услуги — и добавьте CTA на запись/звонок.","keywords":"сайт шиномонтажа, шиномонтаж сайт, цены шиномонтаж, запись, сайт с ии","audiences":["малых предпринимателей"],"steps":[{"title":"Соберите услуги и цены","text":"Балансировка, ремонт, сезонная замена — и диапазоны цен/условия."},{"title":"Добавьте сезонный FAQ","text":"Очередь, запись, сроки — попросите ИИ оформить кратко."},{"title":"Соберите страницу и экспортируйте","text":"Услуги, цены, контакты — экспорт ZIP."}],"checklist":["Есть адрес и график","Есть услуги и цены","Есть условия/сезонные детали","Есть контакты","Есть CTA на запись/звонок"],"important":["В сезон пишите условия заранее (очередь/запись)","Телефон должен быть кликабельным","Один главный CTA"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-dlya-avtoservisa-s-ii","label":"Сайт автосервиса"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Как показать цены?","a":"Список услуг с диапазонами или «от‑цены» + условия (размер колёс, доп. работы)."},{"q":"Нужно ли делать запись?","a":"Можно начать с звонка/мессенджера. Главное — один понятный путь."}]},{"path":"/sait-dlya-gruzoperevozok-s-ii","title":"Сайт для грузоперевозок с ИИ: услуги, тарифы и заявка","description":"Как сделать сайт грузоперевозок: виды перевозок, тарифы/условия, география и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать и экспортировать сайт.","h1":"Сайт для грузоперевозок с ИИ","lead":"Чётко опишите: что перевозите, куда, какие машины, как считается цена и как быстро оформить заявку.","keywords":"сайт грузоперевозки, грузоперевозки сайт, перевозки тарифы, заказать перевозку, сайт с ии","audiences":["малых предпринимателей","самозанятых"],"steps":[{"title":"Опишите услуги и географию","text":"Город/область, переезды, доставка, погрузка, упаковка — что делаете."},{"title":"Соберите правила цены","text":"Почасовая/по километражу, минималка, доп. услуги — попросите ИИ оформить текст по фактам."},{"title":"Соберите страницу и экспортируйте","text":"Услуги, тарифы, условия, контакты — экспорт ZIP."}],"checklist":["Есть виды перевозок","Есть правила расчёта цены","Есть география","Есть условия (минималка/время)","Есть CTA на заявку"],"important":["Пишите, что входит/не входит","Укажите минимальный заказ/минималку","Контакты должны работать на мобиле"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sozdanie-saita-s-ii-dlya-uslug","label":"Хаб: сайт услуг"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли писать цены?","a":"Да, хотя бы правила расчёта и минималку. Это делает заявки качественнее."},{"q":"Что добавить для доверия?","a":"Опыт, отзывы и понятные условия (время подачи, оплата, доп. услуги)."}]},{"path":"/sait-dlya-dostavki-edy-s-ii","title":"Сайт для доставки еды с ИИ: меню, условия и заказ","description":"Как сделать сайт доставки еды: меню/каталог, условия доставки, зоны и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать страницу и экспортировать сайт.","h1":"Сайт для доставки еды с ИИ","lead":"Клиенту важно: меню, цены, зоны доставки, минимальный заказ и как быстро оформить заказ.","keywords":"сайт доставка еды, доставка еды сайт, меню доставка, зоны доставки, сайт с ии","audiences":["малых предпринимателей"],"steps":[{"title":"Соберите меню и условия","text":"Категории, цены, минимальный заказ, время доставки и зоны."},{"title":"Сделайте FAQ","text":"Оплата, время, самовывоз, аллерÐ
179³ÐµÐ½Ñ‹/состав (если уместно) — оформить кратко."},{"title":"Соберите страницу и экспортируйте","text":"Меню, условия, контакты — экспорт ZIP."}],"checklist":["Есть меню/каталог","Есть цены","Есть зоны и время доставки","Есть условия оплаты","Есть CTA на заказ"],"important":["Пишите условия доставки максимально ясно","Один главный CTA","Проверьте мобильную версию"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/faq-dlya-saita-uslug-s-ii","label":"FAQ"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли делать отдельные страницы блюд?","a":"Можно начать с одной страницы и меню блоком/списком. Отдельные страницы — позже, если есть смысл."},{"q":"Что писать про зоны доставки?","a":"Список районов/зон, минимальный заказ и стоимость доставки (если есть)."}]},{"path":"/sait-dlya-cvetochnogo-magazina-s-ii","title":"Сайт для цветочного магазина с ИИ: витрина, доставка и заказ","description":"Как сделать сайт цветочного магазина: витрина, условия доставки, цены и контакты. ИИ помогает с текстом и FAQ, НОРДИК — собрать страницу и экспортировать сайт.","h1":"Сайт для цветочного магазина с ИИ","lead":"На странице важны: примеры букетов/каталог, условия доставки и быстрый CTA на заказ.","keywords":"сайт цветочного магазина, цветы доставка сайт, заказать букет, витрина, сайт с ии","audiences":["малых предпринимателей"],"steps":[{"title":"Соберите витрину","text":"Категории букетов, примеры, ориентиры по цене и сезонные позиции."},{"title":"Опишите доставку и оплату","text":"Зоны, время, условия, самовывоз — попросите ИИ оформить текст кратко."},{"title":"Соберите страницу и экспортируйте","text":"Витрина, условия, контакты — экспорт ZIP."}],"checklist":["Есть витрина/примеры","Есть ориентиры по цене","Есть условия доставки/самовывоза","Есть способы оплаты (если уместно)","Есть CTA на заказ"],"important":["Не обещайте то, что не гарантируете (сроки/наличие)","Один главный CTA","Контакты кликабельны на телефоне"],"links":[{"href":"/sait-dlya-professii-s-ii","label":"Хаб: профессии"},{"href":"/sait-dlya-dostavki-edy-s-ii","label":"Сайт доставки"},{"href":"/stranica-uslugi-s-ii","label":"Страница услуги"},{"href":"/cheklist-saita-uslug-s-ii","label":"Чеклист"}],"faq":[{"q":"Нужно ли писать точные цены?","a":"Можно дать диапазоны и примеры позиций. Главное — чтобы клиент понимал порядок цены."},{"q":"Что добавить в доверие?","a":"Фото, отзывы и понятные условия доставки/оплаты."}]}]');function er(t){const e=["Nordic","Builder"].join(" "),i=new RegExp(`\\b${e}\\b`,"gi");return String(t||"").replace(i,"НОРДИК")}function Oe(t,e=0){if(e>25||t==null)return t;if(typeof t=="string")return er(t);if(typeof t!="object")return t;if(Array.isArray(t))return t.map(n=>Oe(n,e+1));const i=t,s={};for(const n of Object.keys(i))s[n]=Oe(i[n],e+1);return s}const He=Oe(Array.isArray(bi)?bi:[]),ir=He.map(t=>
179String((t==null?void 0:t.path)||"").trim()).filter(Boolean);function nr(t){const e=String(t||"/").trim().replace(/\/+$/g,""),i=e===""?"/":e;return He.find(s=>String((s==null?void 0:s.path)||"").trim().replace(/\/+$/g,"")===i)||null}function zt(t,e){const i=(e||"").trim();if(!i){const n=document.head.querySelector(`meta[name="${t}"]`);n&&n.remove();return}let s=document.head.querySelector(`meta[name="${t}"]`);s||(s=document.createElement("meta"),s.setAttribute("name",t),document.head.appendChild(s)),s.setAttribute("content",i)}function Et(t,e){const i=(e||"").trim();if(!i){const n=document.head.querySelector(`meta[property="${t}"]`);n&&n.remove();return}let s=document.head.querySelector(`meta[property="${t}"]`);s||(s=document.createElement("meta"),s.setAttribute("property",t),document.head.appendChild(s)),s.setAttribute("content",i)}function Xt(t,e){zt(t,e)}function Ae(t,e){const i=String(e||"").trim(),s=document.getElementById(t);if(!i){s&&s.remove();return}let n;s&&s.tagName.toLowerCase()==="script"?n=s:(s&&s.remove(),n=document.createElement("script"),n.id=t,document.head.appendChild(n)),n.__nb_prevText!==i&&(n.type="text/javascript",n.text=i,n.__nb_prevText=i)}function sr(t,e){const i=e?JSON.stringify(e):"",s=document.getElementById(t);if(!i){s&&s.remove();return}let n;s&&s.tagName.toLowerCase()==="script"?n=s:(s&&s.remove(),n=document.createElement("script"),n.id=t,document.head.appendChild(n)),n.type="application/ld+json",n.__nb_prevJson!==i&&(n.text=i,n.__nb_prevJson=i)}function te(t,e,i,s){var d;const n=String(s||"").trim(),r=f=>Array.from(t.childNodes).find(p=>p.nodeType===Node.COMMENT_NODE&&p.data===f);let a=r(e),o=r(i);if((!a||!o)&&(a&&a.parentNode&&a.parentNode.removeChild(a),o&&o.parentNode&&o.parentNode.removeChild(o),a=document.createComment(e),o=document.createComment(i),t.appendChild(a),t.appendChild(o)),a.__nb_lastHtml===n)return;let c=a.nextSibling;for(;c&&c!==o;){const f=c.nextSibling;(d=c.parentNode)==null||d.removeChild(c),c=f}if(n){const f=document.createElement("template");f.innerHTML=n;const u=document.createDocumentFragment();u.appendChild(f.content),t.insertBefore(u,o)}a.__nb_lastHtml=n}function rr(t,e){const i=(e||"").trim();if(!i){const n=document.head.querySelector(`link[rel="${t}"]`);n&&n.remove();return}let s=document.head.querySelector(`link[rel="${t}"]`);s||(s=document.createElement("link"),s.setAttribute("rel",t),document.head.appendChild(s)),s.setAttribute("href",i)}function $i(t){return String(t||"").trim().replace(/\/+$/g,"")}function Si(t,e){const i=$i(t);if(!i)return"";const s=String(e||"/").trim(),n=s==="/"?"/":`/${s.replace(/^\/+/,"").replace(/\/+$/,"")}/`;return`${i}${n}`}function ar(t){const e=String(t||"").trim();return!e||!/^[A-Za-z0-9._-]+$/.test(e)?"":e}function or(t){const e={},i=String(t||""),s=/([:\w-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+)))?/g;let n;for(;n=s.exec(i);){const r=String(n[1]||"").trim().toLowerCase();if(!r)continue;const a=n[2]??n[3]??n[4]??"";e[r]=String(a)}return e}function ki(t,e){const i=String(t||"");if(!i.trim())return{html:"",scripts:[]};const s=[];return{html:i.replace(/<script\b([^>]*)>([\s\S]*?)<\/script\s*>/gi,(r,a,o)=>{const l=or(String(a||""));if("data-nb-no-defer"in l)return r;const c=String(l.type||"").trim().toLowerCase();if(c&&(c==="application/ld+json"||c==="application/json"||c==="application/manifest+json"))return r;const d=String(l.src||"").trim(),f=String(o||"").trim(),u={...l};return delete u["data-nb-no-defer"],delete u.src,!d&&!f||s.push({place:e,src:d||void 0,code:f||void 0,attrs:Object.keys(u).length?u:void 0}),""}).trim(),scripts:s}}function lr(t,e){if(!Array.isArray(t)||!t.length)return"";const i=JSON.stringify(t).replace(/</g,"\\u003c");return`(function(){
180  var key=${JSON.stringify(String(e))};
181  var list=${i};
182  if(!list||!list.length) return;
183  var g=window;
184  g.__nbDeferredCustomScripts=g.__nbDeferredCustomScripts||{};
185  if(g.__nbDeferredCustomScripts[key]) return;
186  g.__nbDeferredCustomScripts[key]=true;
187
188  function applyAttrs(el, attrs){
189    if(!attrs) return;
190    for(var k in attrs){
191      if(!Object.prototype.hasOwnProperty.call(attrs,k)) continue;
192      if(k==='src') continue;
193      var v=attrs[k];
194      try{
195        if(v===null||v===undefined||v==='') el.setAttribute(k,'');
196        else el.setAttribute(k,String(v));
197      }catch(e){}
198    }
199  }
200
201  function injectOne(s, done){
202    try{
203      var el=document.createElement('script');
204      var attrs=s&&s.attrs?s.attrs:null;
205      if(attrs&&attrs.type) el.type=String(attrs.type);
206      if(s&&s.src){
207        el.src=String(s.src);
208        // Keep execution order if the original tag did not explicitly request async.
209        if(!(attrs&&('async' in attrs))) el.async=false;
210      }
211      applyAttrs(el, attrs);
212      if(s&&s.code){ el.text=String(s.code); }
213      if(s&&s.src){
214        el.onload=function(){done&&done();};
215        el.onerror=function(){done&&done();};
216      }
217      var target=(s&&s.place==='body')?document.body:document.head;
218      if(!target) target=document.head;
219      target.appendChild(el);
220      if(!s||!s.src) done&&done();
221    } catch(e){
222      done&&done();
223    }
224  }
225
226  function run(i){
227    if(i>=list.length) return;
228    injectOne(list[i], function(){run(i+1);});
229  }
230
231  function start(){ run(0); }
232  function schedule(){
233    if('requestIdleCallback' in window){
234      window.requestIdleCallback(function(){start();},{timeout:2000});
235    } else {
236      setTimeout(start,1);
237    }
238  }
239  if(document.readyState==='complete') schedule();
240  else window.addEventListener('load', schedule, { once: true });
241})();`}function cr(){const t=re(s=>s.state),{pathname:e}=vi(),i=x.useMemo(()=>{var L,it,dt,ut,pt;const s=((L=t==null?void 0:t.site)==null?void 0:L.globalSeo)||{},n=((it=t==null?void 0:t.site)==null?void 0:it.pages)||{},r=String(e||"/"),a=(n==null?void 0:n[r])||null,o=/^\/blog\/.+/.test(r),l=o?r.replace(/^\/blog\//,"").replace(/\/+$/,""):"",c=o&&(n==null?void 0:n["/blog/:slug"])||null;let d=null;o&&l&&Array.isArray(t==null?void 0:t.devlog)&&(d=t.devlog.find(C=>C&&!C.deletedAt&&!!C.published&&String(C.slug)===l)||null);const f=a||c||null,u=nr(r),p=r==="/konstruktor-saitov",y=r==="/karta-saita",m=String(s.siteTitle||"НОРДИК — Новый Российский конструктор сайтов").trim(),b=String((f==null?void 0:f.title)||(d==null?void 0:d.title)||(u==null?void 0:u.title)||(p?"Конструктор сайтов — страницы под запросы":"")||(y?"Карта сайта — НОРДИК":"")||m).trim(),h=String((f==null?void 0:f.description)||(d==null?void 0:d.excerpt)||(u==null?void 0:u.description)||(p?"Каталог страниц НОРДИК под разные задачи и запросы: бесплатно, скачать ZIP, сохранить на компьютер, лендинги и прототипы.":"")||(y?"HTML карта сайта НОРДИК: основные разделы, посадочные страницы и публикации Devlog.":"")||s.siteDescription||"").trim(),P=String((f==null?void 0:f.keywords)||(u==null?void 0:u.keywords)||s.siteKeywords||"").trim(),v=e.startsWith("/admin")||e.startsWith("/account")||e.startsWith("/users")||e.startsWith("/__block-previews"),A=!!((f==null?void 0:f.noindex)??(v?!0:s.noindex)),N=!!((f==null?void 0:f.nofollow)??(v?!0:s.nofollow)),B=String((f==null?void 0:f.canonical)||Si(s.siteUrl||"",r)).trim(),Z=String((f==null?void 0:f.ogImage)||s.ogImage||"").trim(),I=o?"article":"website",Y=d!=null&&d.date?String(d.date).trim():"",$=String(((dt=s==null?void 0:s.customHtml)==null?void 0:dt.head)||"").trim(),mt=String(((ut=s==null?void 0:s.customHtml)==null?void 0:ut.body)||"").trim(),at=!!((pt=s==null?void 0:s.customHtml)!=null&&pt.deferScripts),_=String((s==null?void 0:s.yandexMetrikaId)||"").trim(),k=ar(String((s==null?void 0:s.googleAnalyticsId)||"")),E=String(s.siteUrl||"").trim().replace(/\/+$/g,""),T=C=>{const yt=$i(String(s.siteUrl||"")),ot=X=>{const W=String(X||"").trim();return W?/^https?:\/\//i.test(W)||!yt?W:`${yt}${W.startsWith("/")?W:`/${W}`}`:""},D=C.map(X=>({href:String(X.href||"").trim(),label:String(X.label||"").trim()})).filter(X=>X.href&&X.label).map((X,W)=>({"@type":"ListItem",position:W+1,name:X.label,item:ot(X.href)||void 0}));return D.length<2?null:{"@type":"BreadcrumbList",itemListElement:D}};let O=null;if(o&&d){const C=T([{href:"/",label:"Главная"},{href:"/blog",label:"Devlog"},{href:`/blog/${l}`,label:b}]);O={"@context":"https://schema.org","@graph":[{"@type":"BlogPosting",headline:b,description:h,datePublished:Y||void 0,dateModified:Y||void 0,mainEntityOfPage:B||void 0,url:B||void 0,author:{"@type":"Organization",name:m},publisher:{"@type":"Organization",name:m}},...C?[C]:[]]}}else if(r==="/blog"){const C=T([{href:"/",label:"Главная"},{href:"/blog",label:"Devlog"}]);O={"@context":"https://schema.org","@graph":[{"@type":"Blog",name:b,description:h,url:B||void 0},...C?[C]:[]]}}else if(u){const C=T([{href:"/",label:"Главная"},{href:"/konstruktor-saitov",label:"Страницы под запросы"},{href:String(u.path||r),label:String(u.h1||b)}]),ot=(Array.isArray(u.faq)?u.faq:[]).map(D=>({q:String((D==null?void 0:D.q)||"").trim(),a:String((D==null?void 0:D.a)||"").trim()})).filter(D=>D.q&&D.a);O={"@context":"https://schema.org","@graph":[{"@type":"WebPage",name:b,description:h,url:B||void 0},...C?[C]:[],...ot.length?[{"@type":"FAQPage",mainEntity:ot.map(D=>
241({"@type":"Question",name:D.q,acceptedAnswer:{"@type":"Answer",text:D.a}}))}]:[]]}}else if(p){const C=T([{href:"/",label:"Главная"},{href:"/konstruktor-saitov",label:"Страницы под запросы"}]),yt=He.slice(0,24).map((ot,D)=>({"@type":"ListItem",position:D+1,url:Si(s.siteUrl||"",String(ot.path||""))||void 0,name:String(ot.h1||ot.title||"").trim()||void 0}));O={"@context":"https://schema.org","@graph":[{"@type":"CollectionPage",name:b,description:h,url:B||void 0},...C?[C]:[],{"@type":"ItemList",itemListElement:yt}]}}else if(y){const C=T([{href:"/",label:"Главная"},{href:"/karta-saita",label:"Карта сайта"}]);O={"@context":"https://schema.org","@graph":[{"@type":"CollectionPage",name:b,description:h,url:B||void 0},...C?[C]:[]]}}else O={"@context":"https://schema.org","@type":"WebSite",name:m,url:E||void 0,description:String(s.siteDescription||"")};return{globalSeo:s,title:b,description:h,keywords:P,noindex:A,nofollow:N,canonical:B,ogImage:Z,ogType:I,publishedTime:Y,metrikaId:_,gaId:k,customHeadHtml:$,customBodyHtml:mt,customDeferScripts:at,jsonLd:O}},[t,e]);x.useEffect(()=>{var r,a;if(e.startsWith("/editor"))return;const s=i.title;s&&(document.title=s),zt("description",i.description),zt("keywords",i.keywords);const n=`${i.noindex?"noindex":"index"},${i.nofollow?"nofollow":"follow"}`;if(zt("robots",n),zt("yandex-verification",yi(String(((r=i.globalSeo)==null?void 0:r.yandexWebmasterVerification)||"1dc0af7f57b4aaa5"))),zt("google-site-verification",yi(String(((a=i.globalSeo)==null?void 0:a.googleSiteVerification)||""))),Et("og:title",s),Et("og:description",i.description),Et("og:type",i.ogType),i.ogImage)Et("og:image",i.ogImage);else{const o=document.head.querySelector('meta[property="og:image"]');o&&o.remove()}if(rr("canonical",i.canonical),Et("og:url",i.canonical),i.ogType==="article"&&i.publishedTime)Et("article:published_time",i.publishedTime);else{const o=document.head.querySelector('meta[property="article:published_time"]');o&&o.remove()}if(Xt("twitter:card",i.ogImage?"summary_large_image":"summary"),Xt("twitter:title",s),Xt("twitter:description",i.description),i.ogImage)Xt("twitter:image",i.ogImage);else{const o=document.head.querySelector('meta[name="twitter:image"]');o&&o.remove()}sr("nb-jsonld",i.jsonLd);try{if(i.customDeferScripts){const o=ki(i.customHeadHtml,"head"),l=ki(i.customBodyHtml,"body");te(document.head,"nb-site-custom-head:start","nb-site-custom-head:end",o.html),te(document.body,"nb-site-custom-body:start","nb-site-custom-body:end",l.html);const c=lr([...o.scripts,...l.scripts],"nb-site-custom-deferred");Ae("nb-site-custom-deferred",c)}else{te(document.head,"nb-site-custom-head:start","nb-site-custom-head:end",i.customHeadHtml),te(document.body,"nb-site-custom-body:start","nb-site-custom-body:end",i.customBodyHtml);const o=document.getElementById("nb-site-custom-deferred");o&&o.remove()}}catch{}if(i.gaId){const o=i.gaId;Ae("nb-ga-gtag",`(function(){
242  var id=${JSON.stringify(o)};
243  if(!id) return;
244  window.__nbGaLoadedIds=window.__nbGaLoadedIds||{};
245  if(window.__nbGaLoadedIds[id]) return;
246  function load(){
247    if(window.__nbGaLoadedIds[id]) return;
248    window.__nbGaLoadedIds[id]=true;
249    window.dataLayer=window.dataLayer||[];
250    function gtag(){dataLayer.push(arguments);} 
251    window.gtag=window.gtag||gtag;
252    try{ gtag('js', new Date()); gtag('config', id); }catch(e){}
253    try{
254      for(var j=0;j<document.scripts.length;j++){
255        if(document.scripts[j].src && document.scripts[j].src.indexOf('googletagmanager.com/gtag/js')!==-1) return;
256      }
257    }catch(e){}
258    var s=document.createElement('script');
259    s.async=true;
260    s.src='https://www.googletagmanager.com/gtag/js?id='+encodeURIComponent(id);
261    document.head.appendChild(s);
262  }
263  function schedule(){
264    if('requestIdleCallback' in window){
265      window.requestIdleCallback(function(){load();},{timeout:2000});
266    } else {
267      setTimeout(load,1);
268    }
269  }
270  if(document.readyState==='complete') schedule();
271  else window.addEventListener('load', schedule, { once: true });
272})();`)}else{const o=document.getElementById("nb-ga-gtag");o&&o.remove()}if(i.metrikaId){const o=i.metrikaId.replace(/[^0-9]/g,"");if(o){Ae("nb-ya-metrika",`(function(){
273  var id=${o};
274  if(!id) return;
275  function load(){
276    if(window.__nbYaMetrikaLoaded) return;
277    window.__nbYaMetrikaLoaded=true;
278    (function(m,e,t,r,i,k,a){
279      m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
280      m[i].l=1*new Date();
281      for(var j=0;j<document.scripts.length;j++){if(document.scripts[j].src===r){return;}}
282      k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)
283    })(window,document,"script","https://mc.yandex.ru/metrika/tag.js","ym");
284    try{ window.ym(id,"init",{clickmap:true,trackLinks:true,accurateTrackBounce:true,webvisor:true}); }catch(e){}
285  }
286  function schedule(){
287    if("requestIdleCallback" in window){
288      window.requestIdleCallback(function(){load();},{timeout:2000});
289    } else {
290      setTimeout(load,1);
291    }
292  }
293  if(document.readyState==="complete") schedule();
294  else window.addEventListener("load", schedule, { once: true });
295})();`);let l=document.getElementById("nb-ya-metrika-noscript");l||(l=document.createElement("div"),l.id="nb-ya-metrika-noscript",l.style.position="absolute",l.style.left="-9999px",document.body.appendChild(l)),l.innerHTML=`<noscript><div><img src="https://mc.yandex.ru/watch/${o}" style="position:absolute;left:-9999px;" alt="" /></div></noscript>`}}else{const o=document.getElementById("nb-ya-metrika");o&&o.remove();const l=document.getElementById("nb-ya-metrika-noscript");l&&l.remove()}},[i,e])}function dr({maxUrl:t,telegramUrl:e,maxIconSrc:i,telegramIconSrc:s}){const{pathname:n}=vi();return n==="/editor"||n.startsWith("/editor/")?null:g.jsxs("div",{className:"fixed right-4 bottom-4 z-[60] flex flex-col gap-2",children:[g.jsxs("a",{href:t,target:"_blank",rel:"noreferrer",className:"group w-12 h-12 md:w-14 md:h-14 rounded-full bg-white border border-light-gray shadow-lg flex items-center justify-center hover:shadow-xl hover:-translate-y-[1px] transition","aria-label":"Написать в поддержку (MAX)",title:"Поддержка (MAX)",children:[g.jsx("img",{src:i,alt:"MAX",className:"w-7 h-7 md:w-8 md:h-8"}),g.jsx("span",{className:"sr-only",children:"Поддержка (MAX)"})]}),g.jsxs("a",{href:e,target:"_blank",rel:"noreferrer",className:"group w-12 h-12 md:w-14 md:h-14 rounded-full bg-white border border-light-gray shadow-lg flex items-center justify-center hover:shadow-xl hover:-translate-y-[1px] transition","aria-label":"Написать в поддержку (Telegram)",title:"Поддержка (Telegram)",children:[g.jsx("img",{src:s,alt:"Telegram",className:"w-7 h-7 md:w-8 md:h-8"}),g.jsx("span",{className:"sr-only",children:"Поддержка (Telegram)"})]})]})}function ka(){return"/__auth_api.php?action=yandexStart"}async function ur(){const t=await fetch("/__auth_api.php?action=me",{cache:"no-store",credentials:"include"});if(!t.ok)throw new Error(`authApiMe failed: ${t.status}`);return await t.json()}async function xa(){const t=await fetch("/__auth_api.php?action=logout",{cache:"no-store",credentials:"include"});return t.ok?await t.json():{ok:!1,error:`logout_failed_${t.status}`}}async function va(t,e,i){const s=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"register",email:t,password:e,name:i})}),n=await s.json();if(!s.ok)throw new Error(String((n==null?void 0:n.error)||`register_failed_${s.status}`));return n}async function wa(t,e){const i=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"loginPassword",email:t,password:e})}),s=await i.json();if(!i.ok)throw new Error(String((s==null?void 0:s.error)||`login_failed_${i.status}`));return s}async function Aa(t){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"adminSecretLogin",secret:t})}),i=await e.json();if(!e.ok)throw new Error(String((i==null?void 0:i.error)||`adminSecretLogin_failed_${e.status}`));return i}async function _a(t){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"guestLogin",name:t})}),i=await e.json();if(!e.ok)throw new Error(String((i==null?void 0:i.error)||`guestLogin_failed_${e.status}`));return i}async function Pa(t){const e=await fetch(`/__auth_api.php?action=adminUserGet&id=${encodeURIComponent(String(t))}`,{cache:"no-store",credentials:"include"}),i=await e.json();return e.ok?i:{ok:!1,error:String((i==null?void 0:i.error)||`adminUserGet_failed_${e.status}`)}}async function Ia(t){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"adminUserDelete",id:t})}),i=await e.json();return e.ok?i:{ok:!1,error:String((i==null?void 0:i.error)||`adminUserDelete_failed_${e.status}`)}}async function ja(t){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"forgotPassword",email:t})}),i=await e.json();return e.ok?i:{ok:!1,error:String((i==null?void 0:i.error)||`forgotPassword_failed_${e.status}`)}}async function Ta(t,e){const i=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"resetPassword",token:t,newPassword:e})}),s=await i.json();return i.ok?s:{ok:!1,error:String((s==null?void 0:s.error)||`resetPassword_failed_${i.status}`)}}function Ea(t){return"/__auth_api.php?action=adminMarketingExportPaidCsv"}async function za(t){const e=new URLSearchParams;typeof(t==null?void 0:t.olderThanDays)=="number"&&e.set("olderThanDays",String(t.olderThanDays)),t!=null&&t.onlyNoProvider&&e.set("onlyNoProvider","1"),(t==null?void 0:t.excludePayments)===!1&&e.set("excludePayments","0"),(t==null?void 0:t.excludeExportSuccess)===!1&&e.set("excludeExportSuccess","0");const i=await fetch(`/__auth_api.php?action=adminUsersNoEmailStats&${e.toString()}`,{cache:"no-store",credentials:"include"}),s=await i.json();return i.ok?s:{ok:!1,error:String((s==null?void 0:s.error)||`adminUsersNoEmailStats_failed_${i.status}`)}}async function Ca(t){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"adminUsersNoEmailDeleteBatch",...t||{}})}),i=await e.json();return e.ok?i:{ok:!1,error:String((i==null?void 0:i.error)||`adminUsersNoEmailDeleteBatch_failed_${e.status}`)}}async function Oa(t,e){const i=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"adminMarketingCampaignCreate",subject:t,bodyText:e})}),s=await i.json();return i.ok?s:{ok:!1,error:String((s==null?void 0:s.error)||`adminMarketingCampaignCreate_failed_${i.status}`)}}async function qa(t){const e=await fetch(`/__auth_api.php?action=adminMarketingCampaignGet&campaignId=${encodeURIComponent(String(t))}`,{cache:"no-store",credentials:"include"}),i=await e.json();return e.ok?i:{ok:!1,error:String((i==null?void 0:i.error)||`adminMarketingCampaignGet_failed_${e.status}`)}}async function Fa(t,e){const i=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"}
295,body:JSON.stringify({action:"adminMarketingCampaignSendTick",campaignId:t,limit:e})}),s=await i.json();return i.ok?s:{ok:!1,error:String((s==null?void 0:s.error)||`adminMarketingCampaignSendTick_failed_${i.status}`)}}async function Ba(t,e,i){const s=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"adminMarketingTest",subject:t,bodyText:e,toEmail:i||""})}),n=await s.json();return s.ok?n:{ok:!1,error:String((n==null?void 0:n.error)||`adminMarketingTest_failed_${s.status}`)}}async function Na(){const t=await fetch("/__auth_api.php?action=billingPublic",{cache:"no-store",credentials:"include"});if(!t.ok)throw new Error(`billingPublic failed: ${t.status}`);return await t.json()}async function Da(t,e){const i=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"yookassaPaymentCreate",plan:t,returnUrl:e})}),s=await i.json();return i.ok?s:{ok:!1,error:String((s==null?void 0:s.error)||`yookassaPaymentCreate_failed_${i.status}`),detail:s==null?void 0:s.detail}}async function Ma(){const t=await fetch("/__auth_api.php?action=billingConfigGet",{cache:"no-store",credentials:"include"});if(!t.ok)throw new Error(`billingConfigGet failed: ${t.status}`);return await t.json()}async function $a(t){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"billingConfigSet",...t})}),i=await e.json();if(!e.ok)throw new Error(String((i==null?void 0:i.error)||`billingConfigSet_failed_${e.status}`));return i}async function La(t){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"exportGateCheck",kind:t})}),i=await e.json();if(!e.ok)throw new Error(String((i==null?void 0:i.error)||`exportGateCheck_failed_${e.status}`));return i}async function Ra(t){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"exportGateCommitFree",kind:t})}),i=await e.json();if(!e.ok)throw new Error(String((i==null?void 0:i.error)||`exportGateCommitFree_failed_${e.status}`));return i}async function Ha(t=50,e=0){const i=await fetch(`/__auth_api.php?action=usersList&limit=${encodeURIComponent(String(t))}&offset=${encodeURIComponent(String(e))}`,{cache:"no-store",credentials:"include"});if(!i.ok)throw new Error(`usersList failed: ${i.status}`);return await i.json()}async function Ua(t=3){const e=await fetch("/__auth_api.php",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"seedDemoUsers",count:t})}),i=await e.json();if(!e.ok)throw new Error(String((i==null?void 0:i.error)||`seedDemoUsers_failed_${e.status}`));return i}const pr=le(t=>({me:null,entitlements:null,isLoading:!1,refresh:async()=>{t({isLoading:!0,lastError:void 0});try{const e=await ur();t({me:e.user,entitlements:e.entitlements??null})}catch(e){t({me:null,entitlements:null,lastError:String((e==null?void 0:e.message)||e)})}finally{t({isLoading:!1})}},clear:()=>t({me:null,entitlements:null,lastError:void 0})})),fr=x.lazy(()=>j(()=>import("./LandingPage-D26G33Go.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]))),mr=x.lazy(()=>j(()=>import("./BlogPage-tTDeY6R2.js"),__vite__mapDeps([10,1,2,3,5,6,11,9]))),hr=x.lazy(()=>j(()=>import("./BlogPostPage-C8B-Q2c0.js"),__vite__mapDeps([12,1,2,3,5,6,13,14,11,9]))),gr=x.lazy(()=>j(()=>import("./EditorPage-CuILf-8l.js"),__vite__mapDeps([15,1,2,16,7,8,17,18,3,19,20,21,22,23,24,9,25,26,27,28,29,30,13,31,32,33,34,35,4]))),yr=x.lazy(()=>j(()=>import("./AccountPage-DJIZlg6l.js"),__vite__mapDeps([36,1,2,3,5,6,9]))),br=x.lazy(()=>j(()=>import("./AdminPage-Ba5Og8dx.js"),__vite__mapDeps([37,1,2,19,21,22,29,30,13,26,9,25,31,7,8,27,20,14,4,17,18,38,39,34,3,23]))),Sr=x.lazy(()=>j(()=>import("./UsersPage-FmlTvUeT.js"),__vite__mapDeps([40,1,2,3,9]))),kr=x.lazy(()=>j(()=>import("./ProPage-CAZYuumv.js"),__vite__mapDeps([41,1,2,3,5,6,7,8,9]))),xi=x.lazy(()=>j(()=>import("./PollPage-1DWwpuUx.js"),__vite__mapDeps([42,1,2,3,5,6,9]))),xr=x.lazy(()=>j(()=>import("./OfferPage-mPc1ald0.js"),__vite__mapDeps([43,1,2,3,5,6,9]))),vr=x.lazy(()=>j(()=>import("./DocsPage-H_5z2haS.js"),__vite__mapDeps([44,1,2,3,5,6,9]))),wr=x.lazy(()=>j(()=>import("./TemplatesPage-gtqmLHCM.js"),__vite__mapDeps([45,1,2,5,3,7,8,4,18,9]))),Ar=x.lazy(()=>j(()=>import("./TemplatesDemoPage-BJWoO9ab.js"),__vite__mapDeps([46,1,2,3]))),_r=x.lazy(()=>j(()=>import("./BlockPreviewsPage-DxpXKQN-.js"),__vite__mapDeps([47,1,2,19,21,22,3,9]))),Pr=x.lazy(()=>j(()=>import("./TypographySmokePage-DEn4DljZ.js"),__vite__mapDeps([48,1,2,3,9]))),Ir=x.lazy(()=>j(()=>import("./ProtoPage-DsrPfFo4.js"),__vite__mapDeps([49,1,2,3,7,8,21,22,9]))),jr=x.lazy(()=>j(()=>import("./SeoLandingPage-bbrXjyrf.js"),__vite__mapDeps([50,1,2,3,5,6,11,9]))),Tr=x.lazy(()=>j(()=>import("./SeoLandingsIndexPage-Be_Mi-7g.js"),__vite__mapDeps([51,1,2,3,5,6,11,9]))),Er=x.lazy(()=>j(()=>import("./SiteMapPage-V3Z_PwCn.js"),__vite__mapDeps([52,1,2,3,5,6,11,9]))),zr=x.lazy(()=>j(()=>import("./SeoAuditPage-CGqZDYB8.js"),__vite__mapDeps([53,1,2,16,7,8,17,18,3,38,39,30,25,19,34,22,9]))),Cr=x.lazy(()=>j(()=>import("./NotFoundPage-jZ5iamLK.js"),__vite__mapDeps([54,1,2,3]))),Or=x.lazy(()=>j(()=>import("./MediaGalleryModals-Cu457miS.js"),__vite__mapDeps([55,1,2,26,9,56,7,8,31,3]))),qr=x.lazy(()=>j(()=>import("./HelpIndexPage-CNkdupWZ.js"),__vite__mapDeps([57,1,2,3,7,8,58,59,5,6,9]))),Fr=x.lazy(()=>j(()=>import("./HelpQuickStartPage-Ba-BMw7C.js"),__vite__mapDeps([60,1,2,3,58,59,5,6,7,8,9]))),Br=x.lazy(()=>j(()=>import("./HelpTranslationsPage-BnPCGG5f.js"),__vite__mapDeps([61,1,2,3,58,59,5,6,7,8,9]))),Nr=
295x.lazy(()=>j(()=>import("./HelpPhilosophyPage-0Yz5sJLL.js"),__vite__mapDeps([62,1,2,58,3,59,5,6,7,8,9]))),Dr=x.lazy(()=>j(()=>import("./HelpArchitecturePage-7u0_ZOeh.js"),__vite__mapDeps([63,1,2,58,3,59,5,6,7,8,9]))),Mr=x.lazy(()=>j(()=>import("./HelpExportSeoPage-MJGNKK6q.js"),__vite__mapDeps([64,1,2,3,58,59,5,6,7,8,9]))),$r=x.lazy(()=>j(()=>import("./HelpExportPage-wdos-DK4.js"),__vite__mapDeps([65,1,2,3,58,59,5,6,7,8,9]))),Lr=x.lazy(()=>j(()=>import("./HelpSeoPrerenderPage-YyeWcXnb.js"),__vite__mapDeps([66,1,2,3,58,59,5,6,7,8,9]))),Rr=x.lazy(()=>j(()=>import("./HelpDesignSystemPage-COrnyDj6.js"),__vite__mapDeps([67,1,2,58,3,59,5,6,7,8,9]))),Hr=x.lazy(()=>j(()=>import("./HelpDesignBlockPage-BRhi2lop.js"),__vite__mapDeps([68,1,2,3,58,59,5,6,7,8,9]))),Ur=x.lazy(()=>j(()=>import("./HelpServiceSiteStructurePage-Dl75F3wa.js"),__vite__mapDeps([69,1,2,3,58,59,5,6,7,8,9]))),Qr=x.lazy(()=>j(()=>import("./HelpAiTextsPage-CdXGsQMD.js"),__vite__mapDeps([70,1,2,3,58,59,5,6,7,8,9]))),Vr=x.lazy(()=>j(()=>import("./HelpPrePublishChecklistPage-DK79OXEg.js"),__vite__mapDeps([71,1,2,3,58,59,5,6,7,8,9]))),Zr=x.lazy(()=>j(()=>import("./HelpYandexDirectPage-m2zGzT1u.js"),__vite__mapDeps([72,1,2,58,3,59,5,6,7,8,9])));function Gr(){return g.jsx("div",{className:"min-h-[40vh] flex items-center justify-center bg-snow",children:g.jsxs("div",{className:"text-center",children:[g.jsx("div",{className:"animate-spin w-10 h-10 border-4 border-pine border-t-transparent rounded-full mx-auto mb-3"}),g.jsx("div",{className:"text-sm text-slate",children:"Загрузка…"})]})})}function Jr(){const t=re(n=>n.bootstrapFromPublic),e=pr(n=>n.refresh),i=x.useRef(!1);Ks(),x.useEffect(()=>{t()},[t]),x.useEffect(()=>{e()},[e]),x.useEffect(()=>{const n=o=>{i.current||(i.current=!0,q(l=>g.jsxs("div",{className:"flex items-center gap-3",children:[g.jsxs("div",{className:"text-sm",children:[g.jsx("div",{className:"font-medium",children:"Редактор обновился"}),g.jsx("div",{className:"opacity-80",children:"Нужно обновить страницу, чтобы продолжить работу."}),o?g.jsx("div",{className:"opacity-60 mt-1",children:o}):null]}),g.jsx("button",{className:"global-button global-button--secondary whitespace-nowrap",onClick:()=>{q.dismiss(l.id),window.location.reload()},children:"Обновить"})]}),{duration:6e4}))},r=o=>{const l=o,c=l==null?void 0:l.detail,d=typeof(c==null?void 0:c.message)=="string"?c.message:"";n(d)},a=o=>{var d;const l=String(((d=o==null?void 0:o.reason)==null?void 0:d.message)||(o==null?void 0:o.reason)||""),c=l.toLowerCase();(c.includes("failed to fetch dynamically imported module")||c.includes("chunkloaderror")||c.includes("loading chunk")||c.includes("importing a module script failed"))&&n(l)};return window.addEventListener("nb:stale-build",r),window.addEventListener("unhandledrejection",a),()=>{window.removeEventListener("nb:stale-build",r),window.removeEventListener("unhandledrejection",a)}},[]);function s(){return cr(),null}return g.jsxs(g.Fragment,{children:[g.jsxs(Wi,{children:[g.jsx(s,{}),g.jsx(dr,{maxUrl:"https://max.ru/join/EmVxaadn5GxQNTErVmbyRKcQAZDNHjEhxcPQqSTR9wA",telegramUrl:"https://t.me/nordic_builders",maxIconSrc:"/max-messenger-sign-logo.svg",telegramIconSrc:"/telegram.svg"}),g.jsx(x.Suspense,{fallback:g.jsx(Gr,{}),children:g.jsxs(Ki,{children:[g.jsx(z,{path:"/",element:g.jsx(fr,{})}),g.jsx(z,{path:"/karta-saita",element:g.jsx(Er,{})}),g.jsx(z,{path:"/konstruktor-saitov",element:g.jsx(Tr,{})}),ir.map(n=>g.jsx(z,{path:n,element:g.jsx(jr,{})},n)),g.jsx(z,{path:"/blog",element:g.jsx(mr,{})}),g.jsx(z,{path:"/blog/:slug",element:g.jsx(hr,{})}),g.jsx(z,{path:"/editor",element:g.jsx(gr,{})}),g.jsx(z,{path:"/account",element:g.jsx(yr,{})}),g.jsx(z,{path:"/admin",element:g.jsx(br,{})}),g.jsx(z,{path:"/users",element:g.jsx(Sr,{})}),g.jsx(z,{path:"/pro",element:g.jsx(kr,{})}),g.jsx(z,{path:"/poll",element:g.jsx(xi,{})}),g.jsx(z,{path:"/privacy",element:g.jsx(xi,{})}),g.jsx(z,{path:"/offer",element:g.jsx(xr,{})}),g.jsx(z,{path:"/docs",element:g.jsx(vr,{})}),g.jsx(z,{path:"/templates",element:g.jsx(wr,{})}),g.jsx(z,{path:"/templates/demo/:slug/*",element:g.jsx(Ar,{})}),g.jsx(z,{path:"/help",element:g.jsx(qr,{})}),g.jsx(z,{path:"/help/quick-start",element:g.jsx(Fr,{})}),g.jsx(z,{path:"/help/translations",element:g.jsx(Br,{})}),g.jsx(z,{path:"/help/philosophy",element:g.jsx(Nr,{})}),g.jsx(z,{path:"/help/architecture",element:g.jsx(Dr,{})}),g.jsx(z,{path:"/help/export",element:g.jsx($r,{})}),g.jsx(z,{path:"/help/seo-prerender",element:g.jsx(Lr,{})}),g.jsx(z,{path:"/help/export-seo",element:g.jsx(Mr,{})}),g.jsx(z,{path:"/help/design-system",element:g.jsx(Rr,{})}),g.jsx(z,{path:"/help/design-block",element:g.jsx(Hr,{})}),g.jsx(z,{path:"/help/service-site-structure",element:g.jsx(Ur,{})}),g.jsx(z,{path:"/help/ai-texts",element:g.jsx(Qr,{})}),g.jsx(z,{path:"/help/pre-publish-checklist",element:g.jsx(Vr,{})}),g.jsx(z,{path:"/help/yandex-direct",element:g.jsx(Zr,{})}),g.jsx(z,{path:"/__block-previews",element:g.jsx(_r,{})}),g.jsx(z,{path:"/__proto",element:g.jsx(Ir,{})}),g.jsx(z,{path:"/__typography-smoke",element:g.jsx(Pr,{})}),g.jsx(z,{path:"/__seo-audit",element:g.jsx(zr,{})}),g.jsx(z,{path:"*",element:g.jsx(Cr,{})})]})})]}),g.jsx(x.Suspense,{fallback:null,children:g.jsx(Or,{})}),g.jsx(Hn,{position:"bottom-right",toastOptions:{duration:3e3,style:{background:"#1A1A1A",color:"#F5F5F5",borderRadius:"8px",padding:"12px 16px"},success:{iconTheme:{primary:"#2C5F2D",secondary:"#F5F5F5"}}}})]})}const Wr=new URLSearchParams(window.location.search),Kr=window.location.pathname==="/"&&Wr.get("nb_static")==="1";Kr||Gi.createRoot(document.getElementById("root")).render(g.jsx(Ji.StrictMode,{children:g.jsx(Jr,{})}));export{pr as $,qa as A,Ha as B,Pa as C,ha as D,Te as E,ie as F,Ua as G,Ea as H,Ba as I,Oa as J,Fa as K,za as L,Ca as M,Ia as N,na as O,Na as P,Da as Q,ba as R,Ls as S,nr as T,He as U,Ei as V,Xs as W,tr as X,et as Y,Jn as Z,j as _,re as a,Ct as a0,ga as a1,At as a2,Gn as a3,ra as a4,oa as a5,Sa as a6,ca as a7,ws as a8,Ci as a9,S as aa,Rs as ab,Hs as ac,Oi as ad,vt as ae,Mi as af,Ys as ag,Qt as ah,Be as ai,aa as aj,La as ak,Ra as al,Cs as am,da as an,ua as ao,la as ap,ls as b,De as c,qs as d,fa as e,Zn as f,sa as g,ne as h,ya as i,pa as j,ur as k,ma as l,xa as m,yi as n,ka as o,ye as p,_a as q,Aa as r,ja as s,Ta as t,hi as u,va as v,wa as w,Ma as x,$a as y,q as z};

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.