Base site: localized NODE.DC landing page

This commit is contained in:
dcconstructions 2026-06-25 20:36:49 +03:00
commit 24fa4aaeff
67 changed files with 3141 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
.DS_Store
audits/
node_modules/
.env
.env.local

29
README.md Normal file
View File

@ -0,0 +1,29 @@
# NODE.DC Local Working Copy
This repository contains the current NODE.DC base site: a structured local copy of the recovered Webflow page, localized to Russian and prepared for the block/CMS refactor.
The rebuild source is `/Users/dcconstructions/site-rescue/ssscript.app`.
## Run
```bash
cd /Users/dcconstructions/Downloads/mnt/NODEDC/NODEDC_SITE
python3 -m http.server 8081 --bind 127.0.0.1
```
Open http://127.0.0.1:8081/
## Structure
- `index.html`, `beta-apply.html`, `founders.html`, `enterprise.html` - editable local pages.
- `assets/webflow` - Webflow CSS, JS, and image assets.
- `assets/custom` - custom NODE.DC CSS/JS published on Vercel.
- `assets/media` - downloaded videos from ssscript.dev.
- `assets/vendor` - third-party browser scripts.
- `docs/` - refactor notes, block model draft, and admin plan.
- `originals` - untouched files copied from the original wget download.
- `asset-manifest.json` - source URL to local file mapping.
- `tools/build-local-copy.mjs` - rebuild script. It uses `NODEDC_SOURCE_DIR` when provided, otherwise the original local rescue folder.
- `tools/localize-ru.mjs` - Russian localization and NODE.DC brand patch script.
External product/API/documentation links are intentionally left as external URLs.

246
asset-manifest.json Normal file
View File

@ -0,0 +1,246 @@
{
"generatedAt": "2026-06-25T17:31:52.625Z",
"sourceDir": "/Users/dcconstructions/site-rescue/ssscript.app",
"targetDir": "/Users/dcconstructions/Downloads/mnt/NODEDC/NODEDC_SITE",
"pages": [
"index.html",
"beta-apply.html",
"founders.html",
"enterprise.html"
],
"assets": [
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69b6acdde3123ef078e2b7f3_og-img.jpg",
"localPath": "assets/webflow/images/69b6acdde3123ef078e2b7f3_og-img.jpg"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/css/ssscript.shared.8838f69df.min.css",
"localPath": "assets/webflow/css/ssscript.shared.8838f69df.min.css"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69b83bc24411350dcdb86781_favicon.png",
"localPath": "assets/webflow/images/69b83bc24411350dcdb86781_favicon.png"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69b83bc6ad9e108637556ec5_webclip.png",
"localPath": "assets/webflow/images/69b83bc6ad9e108637556ec5_webclip.png"
},
{
"url": "https://ssscript-website.vercel.app/out.css",
"localPath": "assets/custom/css/out.css"
},
{
"url": "https://cloud.umami.is/script.js",
"localPath": "assets/vendor/umami-script.js"
},
{
"url": "https://ssscript-website.vercel.app/app.js",
"localPath": "assets/custom/js/app.js"
},
{
"url": "https://ssscript-website.vercel.app/app.css",
"localPath": "assets/custom/css/app.css"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad964d951f9d17cc5a919e_logo-app.svg",
"localPath": "assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad96a28b06b7552a339137_logtype.svg",
"localPath": "assets/webflow/images/69ad96a28b06b7552a339137_logtype.svg"
},
{
"url": "https://ssscript.dev/ssscript-website/publish-flow.mp4",
"localPath": "assets/media/publish-flow.mp4"
},
{
"url": "https://ssscript.dev/ssscript-website/various-modes.mp4",
"localPath": "assets/media/various-modes.mp4"
},
{
"url": "https://ssscript.dev/ssscript-website/project-flow.mp4",
"localPath": "assets/media/project-flow.mp4"
},
{
"url": "https://ssscript.dev/ssscript-website/ai-dock-mode.mp4",
"localPath": "assets/media/ai-dock-mode.mp4"
},
{
"url": "https://ssscript.dev/ssscript-website/account.mp4",
"localPath": "assets/media/account.mp4"
},
{
"url": "https://ssscript.dev/ssscript-website/code-edits.mp4",
"localPath": "assets/media/code-edits.mp4"
},
{
"url": "https://ssscript.dev/ssscript-website/dev-server.mp4",
"localPath": "assets/media/dev-server.mp4"
},
{
"url": "https://ssscript.dev/ssscript-website/webflow-mcp.mp4",
"localPath": "assets/media/webflow-mcp.mp4"
},
{
"url": "https://cdn.prod.website-files.com/69b4294bd9af8bc5d029f550/69d3dc9256192179afb4cfdc_Frame%201.avif",
"localPath": "assets/webflow/images/69d3dc9256192179afb4cfdc_Frame 1.avif"
},
{
"url": "https://cdn.prod.website-files.com/69b4294bd9af8bc5d029f550/69d3dc9256192179afb4cfdc_Frame%201-p-500.avif",
"localPath": "assets/webflow/images/69d3dc9256192179afb4cfdc_Frame 1-p-500.avif"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69aab66f030013f2c7177d78_mov-file.avif",
"localPath": "assets/webflow/images/69aab66f030013f2c7177d78_mov-file.avif"
},
{
"url": "https://cdn.prod.website-files.com/69b4294bd9af8bc5d029f550/69d3fba72116e87a8d145059_Frame%203174.avif",
"localPath": "assets/webflow/images/69d3fba72116e87a8d145059_Frame 3174.avif"
},
{
"url": "https://cdn.prod.website-files.com/69b4294bd9af8bc5d029f550/69d3fba72116e87a8d145059_Frame%203174-p-500.avif",
"localPath": "assets/webflow/images/69d3fba72116e87a8d145059_Frame 3174-p-500.avif"
},
{
"url": "https://cdn.prod.website-files.com/69b4294bd9af8bc5d029f550/69d3fac0d22182f930e32ec6_Frame%203175.avif",
"localPath": "assets/webflow/images/69d3fac0d22182f930e32ec6_Frame 3175.avif"
},
{
"url": "https://cdn.prod.website-files.com/69b4294bd9af8bc5d029f550/69d3fac0d22182f930e32ec6_Frame%203175-p-500.avif",
"localPath": "assets/webflow/images/69d3fac0d22182f930e32ec6_Frame 3175-p-500.avif"
},
{
"url": "https://cdn.prod.website-files.com/69b4294bd9af8bc5d029f550/69d3dc83a417451438caec72_Frame%203173.avif",
"localPath": "assets/webflow/images/69d3dc83a417451438caec72_Frame 3173.avif"
},
{
"url": "https://cdn.prod.website-files.com/69b4294bd9af8bc5d029f550/69d3dc83a417451438caec72_Frame%203173-p-500.avif",
"localPath": "assets/webflow/images/69d3dc83a417451438caec72_Frame 3173-p-500.avif"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69a9fb87bc56142371745926_txt-file.avif",
"localPath": "assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69a9fb87bc56142371745926_txt-file-p-500.avif",
"localPath": "assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69a9ae818a76c773dc3cf7bc_trash.avif",
"localPath": "assets/webflow/images/69a9ae818a76c773dc3cf7bc_trash.avif"
},
{
"url": "https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=69a96c45de5009e6ba9d7123",
"localPath": "assets/vendor/jquery-3.5.1.min.dc5e7f18c8.js"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/js/ssscript.schunk.7321a5097fb66f41.js",
"localPath": "assets/webflow/js/ssscript.schunk.7321a5097fb66f41.js"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/js/ssscript.a0aa6ca1.38bff8ac21973156.js",
"localPath": "assets/webflow/js/ssscript.a0aa6ca1.38bff8ac21973156.js"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/js/ssscript.751e0867.148dc658e77a3916.js",
"localPath": "assets/webflow/js/ssscript.751e0867.148dc658e77a3916.js"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad9c60665a3d2b6fc590a7_InstrumentSans-SemiBoldItalic.woff2",
"localPath": "assets/webflow/images/69ad9c60665a3d2b6fc590a7_InstrumentSans-SemiBoldItalic.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad9c60fbcd5a800591e421_InstrumentSans-SemiBold.woff2",
"localPath": "assets/webflow/images/69ad9c60fbcd5a800591e421_InstrumentSans-SemiBold.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad9c602a855fbb013d5c50_InstrumentSans-Regular.woff2",
"localPath": "assets/webflow/images/69ad9c602a855fbb013d5c50_InstrumentSans-Regular.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad9c603cc9de956857dcdc_InstrumentSans-BoldItalic.woff2",
"localPath": "assets/webflow/images/69ad9c603cc9de956857dcdc_InstrumentSans-BoldItalic.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad9c605d5b0cb77878327b_InstrumentSans-Bold.woff2",
"localPath": "assets/webflow/images/69ad9c605d5b0cb77878327b_InstrumentSans-Bold.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad9c604d256969a81247d8_InstrumentSans-MediumItalic.woff2",
"localPath": "assets/webflow/images/69ad9c604d256969a81247d8_InstrumentSans-MediumItalic.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad9c60452994fbb27f3183_InstrumentSans-Italic.woff2",
"localPath": "assets/webflow/images/69ad9c60452994fbb27f3183_InstrumentSans-Italic.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69ad9c60f0f31535d2eaa0bd_InstrumentSans-Medium.woff2",
"localPath": "assets/webflow/images/69ad9c60f0f31535d2eaa0bd_InstrumentSans-Medium.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/69d2db06ed4081cf9bdacdc4_federic0.avif",
"localPath": "assets/webflow/images/69d2db06ed4081cf9bdacdc4_federic0.avif"
},
{
"url": "https://ssscript-website.vercel.app/public/icon.glb",
"localPath": "assets/custom/icon.glb"
},
{
"url": "https://ssscript-website.vercel.app/public/logo.png",
"localPath": "assets/custom/logo.png"
},
{
"url": "https://d3e54v103j8qbb.cloudfront.net/img/webflow-badge-icon-d2.89e12c322e.svg",
"localPath": "assets/vendor/webflow-badge-icon-d2.89e12c322e.svg"
},
{
"url": "https://d3e54v103j8qbb.cloudfront.net/img/webflow-badge-text-d2.c82cec3b78.svg",
"localPath": "assets/vendor/webflow-badge-text-d2.c82cec3b78.svg"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69ad9c60665a3d2b6fc590a7_InstrumentSans-SemiBoldItalic.woff2",
"localPath": "assets/webflow/images/69ad9c60665a3d2b6fc590a7_InstrumentSans-SemiBoldItalic.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69ad9c60fbcd5a800591e421_InstrumentSans-SemiBold.woff2",
"localPath": "assets/webflow/images/69ad9c60fbcd5a800591e421_InstrumentSans-SemiBold.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69ad9c602a855fbb013d5c50_InstrumentSans-Regular.woff2",
"localPath": "assets/webflow/images/69ad9c602a855fbb013d5c50_InstrumentSans-Regular.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69ad9c603cc9de956857dcdc_InstrumentSans-BoldItalic.woff2",
"localPath": "assets/webflow/images/69ad9c603cc9de956857dcdc_InstrumentSans-BoldItalic.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69ad9c605d5b0cb77878327b_InstrumentSans-Bold.woff2",
"localPath": "assets/webflow/images/69ad9c605d5b0cb77878327b_InstrumentSans-Bold.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69ad9c604d256969a81247d8_InstrumentSans-MediumItalic.woff2",
"localPath": "assets/webflow/images/69ad9c604d256969a81247d8_InstrumentSans-MediumItalic.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69ad9c60452994fbb27f3183_InstrumentSans-Italic.woff2",
"localPath": "assets/webflow/images/69ad9c60452994fbb27f3183_InstrumentSans-Italic.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69ad9c60f0f31535d2eaa0bd_InstrumentSans-Medium.woff2",
"localPath": "assets/webflow/images/69ad9c60f0f31535d2eaa0bd_InstrumentSans-Medium.woff2"
},
{
"url": "https://cdn.prod.website-files.com/69a96c45de5009e6ba9d7123/images/69d2db06ed4081cf9bdacdc4_federic0.avif",
"localPath": "assets/webflow/images/69d2db06ed4081cf9bdacdc4_federic0.avif"
},
{
"url": "https://ssscript-website.vercel.app/assets/custom/icon.glb",
"localPath": "assets/custom/icon.glb"
},
{
"url": "https://ssscript-website.vercel.app/assets/custom/logo.png",
"localPath": "assets/custom/logo.png"
}
],
"failures": []
}

View File

@ -0,0 +1 @@
*{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img{pointer-events:none}.text-scrollable{scrollbar-width:none;-ms-overflow-style:none}.text-scrollable::-webkit-scrollbar{display:none}.circle .x-icon{opacity:0}.circle:hover .x-icon{opacity:1}[data-css=fade-tb]{mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);-webkit-mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);mask-size:100% 100%;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;-webkit-mask-repeat:no-repeat}.current .mail-item{background-color:#3d3d3dc9}[data-module=""]{outline:10px solid red}[data-module=btn]>div>div>div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=btn]:hover>div>div>div>div{transform:translateY(-1.3em)}[data-module=link]{transition:opacity .1s ease-in-out}[data-module=link] div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=link]:hover{opacity:.6!important}[data-module=link]:hover div>div{transform:translateY(-.65em)}[data-module=apple-icon]:focus [data-txt]{position:relative}[data-module=apple-icon]:focus [data-txt]:before{content:"";position:absolute;z-index:-1;background-color:#0059d0;border-radius:.3em;width:120%;height:120%;top:-10%;left:-10%}[data-module=notification-w]{--notification-height:98%}[data-module=notification-w]>div:nth-child(2){transform:translateY(calc(-1*var(--notification-height)));z-index:2}[data-module=notification-w]>div:nth-child(3){transform:translateY(calc(-2*var(--notification-height)));z-index:3}[data-module=notification-w]:hover{--notification-height:98%}[data-module=notification-w]:hover>div:nth-child(2){z-index:2;transform:translateY(0)}[data-module=notification-w]:hover>div:nth-child(3){z-index:3;transform:translateY(0)}[data-module=notification]{transition:transform .3s cubic-bezier(.22,1,.36,1)}

View File

@ -0,0 +1 @@
*{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img{pointer-events:none}.text-scrollable{scrollbar-width:none;-ms-overflow-style:none}.text-scrollable::-webkit-scrollbar{display:none}.circle .x-icon{opacity:0}.circle:hover .x-icon{opacity:1}[data-css=fade-tb]{mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);-webkit-mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);mask-size:100% 100%;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;-webkit-mask-repeat:no-repeat}.current .mail-item{background-color:#3d3d3dc9}[data-module=""]{outline:10px solid red}[data-module=btn]>div>div>div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=btn]:hover>div>div>div>div{transform:translateY(-1.3em)}[data-module=link]{transition:opacity .1s ease-in-out}[data-module=link] div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=link]:hover{opacity:.6!important}[data-module=link]:hover div>div{transform:translateY(-.65em)}[data-module=apple-icon]:focus [data-txt]{position:relative}[data-module=apple-icon]:focus [data-txt]:before{content:"";position:absolute;z-index:-1;background-color:#0059d0;border-radius:.3em;width:120%;height:120%;top:-10%;left:-10%}[data-module=notification-w]{--notification-height:98%}[data-module=notification-w]>div:nth-child(2){transform:translateY(calc(-1*var(--notification-height)));z-index:2}[data-module=notification-w]>div:nth-child(3){transform:translateY(calc(-2*var(--notification-height)));z-index:3}[data-module=notification-w]:hover{--notification-height:98%}[data-module=notification-w]:hover>div:nth-child(2){z-index:2;transform:translateY(0)}[data-module=notification-w]:hover>div:nth-child(3){z-index:3;transform:translateY(0)}[data-module=notification]{transition:transform .3s cubic-bezier(.22,1,.36,1)}[data-start=closed]{pointer-events:none;visibility:hidden}[data-module=app]:not([data-start=closed]){transform:scale(0)translateY(200%)}[data-module=folder-wrap]>*{transform:scale(0)}[data-module=list] a{opacity:0}[data-success],[data-failure]{display:none}[data-module=alpha]{opacity:0}

BIN
assets/custom/icon.glb Normal file

Binary file not shown.

692
assets/custom/js/app.js Normal file

File diff suppressed because one or more lines are too long

BIN
assets/custom/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
assets/custom/logo_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
assets/media/account.mp4 Normal file

Binary file not shown.

Binary file not shown.

BIN
assets/media/code-edits.mp4 Normal file

Binary file not shown.

BIN
assets/media/dev-server.mp4 Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

1
assets/vendor/umami-script.js vendored Normal file
View File

@ -0,0 +1 @@
!function(){"use strict";(t=>{const{screen:{width:e,height:a},navigator:{language:n,doNotTrack:r,msDoNotTrack:i},location:o,document:c,history:s,top:f,doNotTrack:u}=t,{currentScript:l,referrer:d}=c;if(!l)return;const{hostname:h,href:m,origin:p}=o;let y;try{y=m.startsWith("data:")?void 0:t.localStorage}catch{}const g="data-",v="false",b="true",T=l.getAttribute.bind(l),w=t=>T(`${g}${t}`),S=w("website-id"),x=w("host-url"),k=w("before-send"),E=w("tag")||void 0,M=w("auto-track")!==v,$=w("do-not-track")===b,j=w("exclude-search")===b,N=w("exclude-hash")===b,O=w("domains")||"",A=w("fetch-credentials")||"omit",I=w("performance")===b,L=w("auto-pageview")!==v,P=O.split(",").map(t=>t.trim()),K=`${(x||"https://gateway.umami.is").replace(/\/$/,"")}/api/send`,R=`${e}x${a}`,_=/data-umami-event-([\w-_]+)/,D=`${g}umami-event`,W=300,B=t=>{if(!t)return t;try{const e=new URL(t,o.href);return j&&(e.search=""),N&&(e.hash=""),e.toString()}catch{return t}},C=()=>({website:S,screen:R,language:n,title:c.title,hostname:h,url:Y,referrer:Z,tag:E,id:V||void 0}),J=(t,e,a)=>{a&&("function"==typeof X&&X(),Z=Y,Y=B(a),Y!==Z&&L&&setTimeout(F,W))},U=()=>et||!S||y?.getItem("umami.disabled")||O&&!P.includes(h)||$&&(()=>{const t=u||r||i;return 1===t||"1"===t||"yes"===t})(),q=async(e,a="event")=>{if(U())return;const n=t[k];if("function"==typeof n&&(e=await Promise.resolve(n(a,e))),e)try{const t=await fetch(K,{keepalive:!0,method:"POST",body:JSON.stringify({type:a,payload:e}),headers:{"Content-Type":"application/json","x-umami-website-id":S,"x-umami-hostname":h,...void 0!==Q&&{"x-umami-cache":Q}},credentials:A}),n=await t.json();n&&(et=!!n.disabled,Q=n.cache)}catch(t){}},z=()=>{tt||(tt=!0,L&&F(),(()=>{const t=(t,e,a)=>{const n=t[e];return(...e)=>{const r=n.apply(t,e);return a.apply(null,e),r}};s.pushState=t(s,"pushState",J),s.replaceState=t(s,"replaceState",J)})(),(()=>{const t=async t=>{const e=t.getAttribute(D);if(e){const a={};return t.getAttributeNames().forEach(e=>{const n=e.match(_);n&&(a[n[1]]=t.getAttribute(e))}),F(e,a)}};c.addEventListener("click",e=>{const a=e.target.closest(`[${D}]`);if(a){if("A"===a.tagName&&a.href){const{href:n,target:r}=a,i="_blank"===r||e.ctrlKey||e.shiftKey||e.metaKey||e.button&&1===e.button;return i||e.preventDefault(),t(a).finally(()=>{i||(("_top"===r?f.location:o).href=n)})}return t(a)}},!0)})(),I&&H())},F=(t,e)=>q("string"==typeof t?{...C(),name:t,data:e}:"object"==typeof t?{...t}:"function"==typeof t?t(C()):C()),G=(t,e)=>("string"==typeof t&&(V=t),Q="",q({...C(),data:"object"==typeof t?t:e},"identify")),H=()=>{const e={};let a,n=!1,r=!0,i=0,o=0;const s=(t,e)=>{try{new PerformanceObserver(t=>{t.getEntries().forEach(e)}).observe({type:t,buffered:!0})}catch{}};s("navigation",t=>{i=t.activationStart||0,e.ttfb=Math.max(t.responseStart-i,0)}),s("paint",t=>{"first-contentful-paint"===t.name&&(e.fcp=Math.max(t.startTime-i,0))}),s("largest-contentful-paint",t=>{e.lcp=Math.max(t.startTime-i,0)});let f=0,u=[];s("layout-shift",t=>{if(!t.hadRecentInput){const a=u[u.length-1],n=u[0];a&&t.startTime-a.startTime-a.duration<1e3&&t.startTime-n.startTime<5e3?(f+=t.value,u.push(t)):(f=t.value,u=[t]),f>(e.cls||0)&&(e.cls=f)}});let l,d={};const h=t=>{t.forEach(t=>{if(t.interactionId){const e=d[t.interactionId];(!e||t.duration>e)&&(d[t.interactionId]=t.duration)}})};try{l=new PerformanceObserver(t=>h(t.getEntries())),l.observe({type:"event",buffered:!0,durationThreshold:40})}catch{}const m=e=>{try{return t.performance?.getEntriesByType?.(e)||[]}catch{return[]}},p=()=>{n||((()=>{if(r){if(void 0===e.ttfb){const t=m("navigation")?.[0];t&&(e.ttfb=Math.max(t.responseStart-(t.activationStart||0),0))}if(void 0===e.fcp){const t=m("paint")?.find(t=>"first-contentful-paint"===t.name);t&&(e.fcp=Math.max(t.startTime-i,0))}if(void 0===e.lcp){const t=m("largest-contentful-paint"),a=t?.[t.length-1];a&&(e.lcp=Math.max(a.startTime-i,0))}}})(),(()=>{l&&h(l.takeRecords());const t=Object.values(d).sort((t,e)=>e-t);if(t.length){const a=Math.floor(.02*Math.max(t.length,10));e.inp=t[Math.min(a,t.length-1)]}})(),e.duration=Math.round(performance.now()-o),n=!0,a&&clearTimeout(a),q({...C(),...e},"performance"))};X=()=>{p(),r=!1,Object.keys(e).forEach(t=>{delete e[t]}),i=0,o=performance.now(),f=0,u=[],d={},n=!1,a&&clearTimeout(a),a=setTimeout(p,1e4)},a=setTimeout(p,1e4),c.addEventListener("visibilitychange",()=>{"hidden"===c.visibilityState&&p()}),t.addEventListener("pagehide",p)};t.umami||(t.umami={track:F,identify:G,getSession:()=>({cache:Q,website:S})});let Q,V,X,Y=B(m),Z=B(d.startsWith(p)?"":d),tt=!1,et=!1;M&&!U()&&("complete"===c.readyState?z():c.addEventListener("readystatechange",z,!0))})(window)}();

View File

@ -0,0 +1,3 @@
<svg width="26" height="16" viewBox="0 0 26 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M25.65 0L17.4654 16H9.77778L13.203 9.36892H13.0493C10.2235 13.0372 6.00738 15.452 0 16V9.46068C0 9.46068 3.84306 9.23369 6.10229 6.85844H0V0.000126383H6.85832V5.64099L7.01225 5.64036L9.8148 0.000126383H15.0016V5.60523L15.1555 5.60497L18.0632 0H25.65Z" fill="#146EF5"/>
</svg>

After

Width:  |  Height:  |  Size: 421 B

View File

@ -0,0 +1,15 @@
<svg width="118" height="12" viewBox="0 0 118 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.525024 0.896484H3.05432L6.00776 8.26622L8.89905 0.896484H11.3531V11H9.47327V3.79949L6.6637 11H5.18713L2.3844 3.92077V11H0.525024V0.896484Z" fill="#080808"/>
<path d="M16.152 11.1367C15.4912 11.1367 14.901 10.9704 14.3815 10.6377C13.8665 10.305 13.4609 9.84017 13.1647 9.24316C12.8684 8.6416 12.7226 7.94889 12.7272 7.16504C12.7272 6.38118 12.8776 5.69076 13.1783 5.09375C13.4791 4.49674 13.8893 4.03646 14.4088 3.71289C14.9329 3.38477 15.5276 3.22298 16.193 3.22754C16.6305 3.22754 17.0361 3.30957 17.4098 3.47363C17.7835 3.63314 18.0934 3.85417 18.3395 4.13672C18.5901 4.41471 18.7542 4.71777 18.8317 5.0459L18.4967 5.03223V3.37109H20.3698V11H18.5172L18.524 9.52344L18.8522 9.33203C18.7428 9.66927 18.5559 9.97461 18.2916 10.248C18.0273 10.5215 17.7083 10.738 17.3346 10.8975C16.9609 11.057 16.5667 11.1367 16.152 11.1367ZM16.5621 9.55078C16.9495 9.55078 17.2936 9.45052 17.5944 9.25C17.8951 9.04948 18.1298 8.76921 18.2985 8.40918C18.4671 8.04915 18.5537 7.63444 18.5582 7.16504C18.5582 6.7002 18.4739 6.28776 18.3053 5.92773C18.1367 5.56771 17.8997 5.28971 17.5944 5.09375C17.2936 4.89779 16.9495 4.7998 16.5621 4.7998C16.1793 4.7998 15.8444 4.90007 15.5573 5.10059C15.2701 5.29655 15.0491 5.57454 14.8942 5.93457C14.7392 6.2946 14.6617 6.70703 14.6617 7.17188C14.6617 7.63672 14.7392 8.04915 14.8942 8.40918C15.0537 8.76465 15.277 9.04492 15.5641 9.25C15.8512 9.45052 16.1839 9.55078 16.5621 9.55078Z" fill="#080808"/>
<path d="M26.3033 10.9043C25.9251 11.0592 25.5332 11.1367 25.1276 11.1367C24.4668 11.1367 23.8766 10.9727 23.3571 10.6445C22.8375 10.3118 22.4319 9.84701 22.1403 9.25C21.8531 8.64844 21.7096 7.95573 21.7096 7.17188C21.7096 6.38346 21.8577 5.69076 22.1539 5.09375C22.4502 4.49219 22.858 4.02962 23.3776 3.70605C23.9017 3.38249 24.4964 3.22298 25.1617 3.22754C25.5765 3.22754 25.9729 3.30729 26.3512 3.4668C26.7295 3.62174 27.0485 3.84049 27.3082 4.12305C27.5726 4.4056 27.7434 4.72233 27.8209 5.07324L27.4928 5.06641V0.46582H29.3658V11H27.5133L27.5201 9.30469L27.8483 9.28418C27.7526 9.63965 27.5657 9.95866 27.2877 10.2412C27.0143 10.5238 26.6862 10.7448 26.3033 10.9043ZM24.5465 9.24316C24.8382 9.44368 25.1754 9.54395 25.5582 9.54395C25.9319 9.54395 26.2669 9.44368 26.5631 9.24316C26.8639 9.03809 27.1009 8.75553 27.274 8.39551C27.4472 8.03548 27.5361 7.6276 27.5406 7.17188C27.5406 6.70703 27.4563 6.2946 27.2877 5.93457C27.1191 5.56999 26.8844 5.29199 26.5836 5.10059C26.2828 4.90462 25.941 4.80664 25.5582 4.80664C25.1709 4.80664 24.8313 4.90462 24.5397 5.10059C24.248 5.29655 24.0247 5.57454 23.8698 5.93457C23.7148 6.2946 23.6373 6.70703 23.6373 7.17188C23.6373 7.63672 23.7148 8.04915 23.8698 8.40918C24.0293 8.76465 24.2548 9.04264 24.5465 9.24316Z" fill="#080808"/>
<path d="M34.5612 11.1709C33.8046 11.1709 33.1347 11.0068 32.5514 10.6787C31.9726 10.3506 31.5214 9.88574 31.1979 9.28418C30.8743 8.68262 30.7125 7.98763 30.7125 7.19922C30.7125 6.43815 30.8766 5.75684 31.2047 5.15527C31.5328 4.54915 31.9863 4.07747 32.5651 3.74023C33.1438 3.40299 33.7978 3.23438 34.527 3.23438C35.3017 3.23438 35.9853 3.40527 36.5778 3.74707C37.1748 4.08887 37.6282 4.59473 37.9381 5.26465C38.248 5.93001 38.3688 6.72526 38.3004 7.65039H32.6207H31.4987L32.6431 6.42385L36.8785 6.41309L36.3864 6.61816C36.3772 6.24447 36.2952 5.91178 36.1403 5.62012C35.9899 5.32845 35.778 5.10286 35.5045 4.94336C35.2311 4.7793 34.9166 4.69727 34.5612 4.69727C34.1875 4.69727 33.8525 4.78613 33.5563 4.96387C33.2646 5.1416 33.0345 5.38997 32.8658 5.70898C32.7523 5.9298 32.678 6.16809 32.6431 6.42385C32.6275 6.53758 32.6198 6.65476 32.6198 6.77539V7.53418C32.6193 7.57334 32.6196 7.61207 32.6207 7.65039C32.6309 8.03129 32.7126 8.37081 32.8658 8.66895C33.0345 8.99251 33.2669 9.24316 33.5631 9.4209C33.8639 9.59863 34.2057 9.6875 34.5885 9.6875C34.8665 9.6875 35.1217 9.63965 35.3541 9.54395C35.5911 9.44368 35.7893 9.30924 35.9489 9.14062C36.1129 8.96745 36.2291 8.76693 36.2975 8.53906H38.2184C38.1181 9.06315 37.9017 9.52344 37.569 9.91992C37.2408 10.3164 36.817 10.624 36.2975 10.8428C35.7825 11.0615 35.2037 11.1709 34.5612 11.1709Z" fill="#080808"/>
<path d="M42.9283 3.37109H44.8014V11H42.9283V3.37109ZM42.8942 0.370117H44.8698V2.28418H42.8942V0.370117Z" fill="#080808"/>
<path d="M48.3356 11H46.4694V3.37109H48.2946V4.93652L47.9938 5.05957C48.0804 4.69499 48.2467 4.3737 48.4928 4.0957C48.7389 3.81315 49.042 3.59668 49.402 3.44629C49.762 3.29134 50.1448 3.21615 50.5504 3.2207C51.0882 3.2207 51.5599 3.33691 51.9655 3.56934C52.3711 3.7972 52.6832 4.1276 52.902 4.56055C53.1253 4.99349 53.2369 5.50163 53.2369 6.08496V11H51.3639V6.46777C51.3639 6.13053 51.3069 5.84115 51.193 5.59961C51.0836 5.35352 50.9218 5.16895 50.7076 5.0459C50.498 4.91829 50.2474 4.85449 49.9557 4.85449C49.6503 4.85449 49.3746 4.92969 49.1285 5.08008C48.887 5.22591 48.6933 5.43555 48.5475 5.70898C48.4062 5.97786 48.3356 6.28548 48.3356 6.63184V11Z" fill="#080808"/>
<path d="M57.5162 0.896484H59.5875L61.509 8.05083L63.5319 0.896484H65.3502L67.4935 7.94671L69.3356 0.896484H71.2838L68.399 11H66.526L63.5797 1.63477H65.0973L62.274 11H60.442L57.5162 0.896484Z" fill="#080808"/>
<path d="M75.153 11.1709C74.3964 11.1709 73.7265 11.0068 73.1432 10.6787C72.5644 10.3506 72.1132 9.88574 71.7897 9.28418C71.4661 8.68262 71.3043 7.98763 71.3043 7.19922C71.3043 6.43815 71.4684 5.75684 71.7965 5.15527C72.1246 4.54915 72.5781 4.07747 73.1569 3.74023C73.7356 3.40299 74.3896 3.23438 75.1188 3.23438C75.8935 3.23438 76.5771 3.40527 77.1696 3.74707C77.7666 4.08887 78.22 4.59473 78.5299 5.26465C78.8398 5.93001 78.9606 6.72526 78.8922 7.65039H72.0905V6.42676L77.4703 6.41309L76.9781 6.61816C76.969 6.24447 76.887 5.91178 76.7321 5.62012C76.5817 5.32845 76.3698 5.10286 76.0963 4.94336C75.8229 4.7793 75.5084 4.69727 75.153 4.69727C74.7793 4.69727 74.4443 4.78613 74.1481 4.96387C73.8564 5.1416 73.6263 5.38997 73.4576 5.70898C73.2936 6.02799 73.2115 6.38346 73.2115 6.77539V7.53418C73.207 7.96257 73.289 8.34082 73.4576 8.66895C73.6263 8.99251 73.8587 9.24316 74.1549 9.4209C74.4557 9.59863 74.7975 9.6875 75.1803 9.6875C75.4583 9.6875 75.7135 9.63965 75.9459 9.54395C76.1829 9.44368 76.3811 9.30924 76.5406 9.14062C76.7047 8.96745 76.8209 8.76693 76.8893 8.53906H78.8102C78.7099 9.06315 78.4934 9.52344 78.1608 9.91992C77.8326 10.3164 77.4088 10.624 76.8893 10.8428C76.3743 11.0615 75.7955 11.1709 75.153 11.1709Z" fill="#080808"/>
<path d="M84.4293 11.1367C84.0237 11.1367 83.6295 11.0592 83.2467 10.9043C82.8684 10.7448 82.5403 10.5238 82.2623 10.2412C81.9889 9.95866 81.8043 9.63965 81.7086 9.28418L82.0367 9.30469L82.0436 11H80.191V0.46582H82.0641V5.06641L81.736 5.07324C81.8134 4.72233 81.9821 4.4056 82.2418 4.12305C82.5061 3.84049 82.8274 3.62174 83.2057 3.4668C83.5839 3.30729 83.9804 3.22754 84.3951 3.22754C85.0605 3.22298 85.653 3.38249 86.1725 3.70605C86.6966 4.02962 87.1067 4.49219 87.403 5.09375C87.6992 5.69076 87.8473 6.38346 87.8473 7.17188C87.8473 7.95573 87.7015 8.64844 87.4098 9.25C87.1227 9.84701 86.7194 10.3118 86.1998 10.6445C85.6803 10.9727 85.0901 11.1367 84.4293 11.1367ZM83.9987 9.54395C84.3815 9.54395 84.7187 9.44368 85.0104 9.24316C85.302 9.04264 85.5253 8.76465 85.6803 8.40918C85.8398 8.04915 85.9196 7.63672 85.9196 7.17188C85.9196 6.70703 85.8421 6.2946 85.6871 5.93457C85.5322 5.57454 85.3089 5.29655 85.0172 5.10059C84.7255 4.90462 84.386 4.80664 83.9987 4.80664C83.6158 4.80664 83.274 4.90462 82.9733 5.10059C82.6725 5.29199 82.4378 5.56999 82.2692 5.93457C82.1005 6.2946 82.0162 6.70703 82.0162 7.17188C82.0208 7.6276 82.1097 8.03548 82.2828 8.39551C82.456 8.75553 82.6907 9.03809 82.9869 9.24316C83.2877 9.44368 83.625 9.54395 83.9987 9.54395Z" fill="#080808"/>
<path d="M89.7408 2.85156C89.7408 2.34115 89.8571 1.89225 90.0895 1.50488C90.3265 1.11296 90.6569 0.812174 91.0807 0.602539C91.5045 0.388346 91.999 0.278971 92.5641 0.274414C92.6962 0.274414 92.8193 0.28125 92.9332 0.294922C93.0517 0.308594 93.1497 0.326823 93.2272 0.349609V1.92188L93.193 1.9082C93.1337 1.88997 93.0631 1.8763 92.9811 1.86719C92.9036 1.85352 92.8284 1.8444 92.7555 1.83984C92.5048 1.8444 92.2929 1.89225 92.1198 1.9834C91.9511 2.06999 91.8235 2.19987 91.7369 2.37305C91.6503 2.54622 91.6071 2.75358 91.6071 2.99512V11H89.7408V2.85156ZM88.5035 3.37109H93.1246V4.88867H88.5035V3.37109Z" fill="#080808"/>
<path d="M96.2076 11H94.3414V0.452148H96.2076V11ZM94.3414 0.452148H96.2076V1.93555H94.3414V0.452148ZM94.3414 9.5166H96.2076V11H94.3414V9.5166Z" fill="#080808"/>
<path d="M101.403 11.1641C100.642 11.1641 99.9697 10.9977 99.3864 10.665C98.8076 10.3324 98.3564 9.86523 98.0328 9.26367C97.7093 8.66211 97.5475 7.97396 97.5475 7.19922C97.5475 6.41536 97.7093 5.72266 98.0328 5.12109C98.3564 4.51497 98.8076 4.04557 99.3864 3.71289C99.9697 3.38021 100.642 3.21387 101.403 3.21387C102.164 3.21387 102.836 3.38021 103.42 3.71289C104.007 4.04557 104.463 4.51497 104.787 5.12109C105.11 5.72266 105.274 6.41536 105.279 7.19922C105.274 7.97852 105.11 8.66895 104.787 9.27051C104.463 9.86751 104.007 10.3324 103.42 10.665C102.836 10.9977 102.164 11.1641 101.403 11.1641ZM101.403 9.57812C101.795 9.57812 102.139 9.47786 102.435 9.27734C102.731 9.07682 102.957 8.79655 103.112 8.43652C103.267 8.0765 103.344 7.66406 103.344 7.19922C103.344 6.72982 103.267 6.3151 103.112 5.95508C102.957 5.59049 102.731 5.30794 102.435 5.10742C102.139 4.9069 101.795 4.80664 101.403 4.80664C101.011 4.80664 100.669 4.9069 100.378 5.10742C100.086 5.30794 99.8603 5.59049 99.7008 5.95508C99.5459 6.3151 99.4684 6.72982 99.4684 7.19922C99.4684 7.66862 99.5481 8.08333 99.7076 8.44336C99.8671 8.79883 100.09 9.07682 100.378 9.27734C100.669 9.47786 101.011 9.57812 101.403 9.57812Z" fill="#080808"/>
<path d="M105.737 3.37109H107.767L109.715 10.5215H108.574L110.611 3.37109H112.45L114.576 10.5762L113.332 10.583L115.294 3.37109H117.173L114.883 11H113.038L110.802 4.11621H111.964L109.88 11H108.02L105.737 3.37109Z" fill="#080808"/>
</svg>

After

Width:  |  Height:  |  Size: 9.7 KiB

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -0,0 +1,15 @@
<svg width="82" height="82" viewBox="0 0 82 82" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="81.216" height="81.2168" rx="19.1291" fill="url(#paint0_linear_137_814)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M69.54 25.5803C69.54 27.0895 68.3166 28.313 66.8073 28.313H57.473C55.9637 28.313 54.7402 29.5365 54.7402 31.0457V33.7775C54.7402 35.2868 55.9637 36.5103 57.473 36.5103H66.8054C68.3146 36.5103 69.5381 37.7337 69.5381 39.243V46.7305L69.5332 46.7354V50.175C69.5332 51.6842 68.3097 52.9077 66.8005 52.9077H43.3343C41.825 52.9077 40.6016 54.1312 40.6016 55.6404V58.3722C40.6016 59.8815 41.825 61.105 43.3343 61.105H66.8073C68.3166 61.105 69.54 62.3285 69.54 63.8377V66.5705C69.54 68.0797 68.3166 69.3032 66.8073 69.3032H28.8636C27.3543 69.3032 26.1309 68.0797 26.1309 66.5705V63.8387C26.1309 62.3294 24.9074 61.106 23.3981 61.106H14.3929C12.8836 61.106 11.6602 59.8825 11.6602 58.3732V55.6404C11.6602 54.1312 12.8836 52.9077 14.3929 52.9077H16.1462C17.6554 52.9077 18.8789 51.6842 18.8789 50.175V49.827C18.8789 48.3177 17.6554 47.0942 16.1462 47.0942H14.3929C12.8836 47.0942 11.6602 45.8708 11.6602 44.3615V28.8387C11.6602 27.3294 12.8836 26.106 14.3929 26.106H29.5925C31.1017 26.106 32.3252 24.8825 32.3252 23.3732V22.8475C32.3252 21.3382 31.1017 20.1147 29.5925 20.1147H14.3929C12.8836 20.1147 11.6602 18.8913 11.6602 17.382V14.6492C11.6602 13.14 12.8836 11.9165 14.3929 11.9165H40.9059C42.4152 11.9165 43.6387 13.14 43.6387 14.6492V17.382C43.6387 18.8913 44.8622 20.1147 46.3714 20.1147H66.8073C68.3166 20.1147 69.54 21.3382 69.54 22.8475V25.5803ZM33.5186 41.9767C33.5186 43.486 34.742 44.7095 36.2513 44.7095H44.947C46.4562 44.7095 47.6797 43.486 47.6797 41.9767V39.244C47.6797 37.7347 46.4562 36.5112 44.947 36.5112H36.2513C34.742 36.5112 33.5186 37.7347 33.5186 39.244V41.9767Z" fill="#FDFDFD"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M69.54 25.5803C69.54 27.0895 68.3166 28.313 66.8073 28.313H57.473C55.9637 28.313 54.7402 29.5365 54.7402 31.0457V33.7775C54.7402 35.2868 55.9637 36.5103 57.473 36.5103H66.8054C68.3146 36.5103 69.5381 37.7337 69.5381 39.243V46.7305L69.5332 46.7354V50.175C69.5332 51.6842 68.3097 52.9077 66.8005 52.9077H43.3343C41.825 52.9077 40.6016 54.1312 40.6016 55.6404V58.3722C40.6016 59.8815 41.825 61.105 43.3343 61.105H66.8073C68.3166 61.105 69.54 62.3285 69.54 63.8377V66.5705C69.54 68.0797 68.3166 69.3032 66.8073 69.3032H28.8636C27.3543 69.3032 26.1309 68.0797 26.1309 66.5705V63.8387C26.1309 62.3294 24.9074 61.106 23.3981 61.106H14.3929C12.8836 61.106 11.6602 59.8825 11.6602 58.3732V55.6404C11.6602 54.1312 12.8836 52.9077 14.3929 52.9077H16.1462C17.6554 52.9077 18.8789 51.6842 18.8789 50.175V49.827C18.8789 48.3177 17.6554 47.0942 16.1462 47.0942H14.3929C12.8836 47.0942 11.6602 45.8708 11.6602 44.3615V28.8387C11.6602 27.3294 12.8836 26.106 14.3929 26.106H29.5925C31.1017 26.106 32.3252 24.8825 32.3252 23.3732V22.8475C32.3252 21.3382 31.1017 20.1147 29.5925 20.1147H14.3929C12.8836 20.1147 11.6602 18.8913 11.6602 17.382V14.6492C11.6602 13.14 12.8836 11.9165 14.3929 11.9165H40.9059C42.4152 11.9165 43.6387 13.14 43.6387 14.6492V17.382C43.6387 18.8913 44.8622 20.1147 46.3714 20.1147H66.8073C68.3166 20.1147 69.54 21.3382 69.54 22.8475V25.5803ZM33.5186 41.9767C33.5186 43.486 34.742 44.7095 36.2513 44.7095H44.947C46.4562 44.7095 47.6797 43.486 47.6797 41.9767V39.244C47.6797 37.7347 46.4562 36.5112 44.947 36.5112H36.2513C34.742 36.5112 33.5186 37.7347 33.5186 39.244V41.9767Z" fill="url(#paint1_linear_137_814)" fill-opacity="0.2"/>
<defs>
<linearGradient id="paint0_linear_137_814" x1="40.608" y1="0" x2="40.608" y2="81.2168" gradientUnits="userSpaceOnUse">
<stop stop-color="#1B1B1B"/>
<stop offset="1"/>
</linearGradient>
<linearGradient id="paint1_linear_137_814" x1="40.6001" y1="11.9165" x2="40.6001" y2="69.3032" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="#666666"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,3 @@
<svg width="102" height="26" viewBox="0 0 102 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<text x="0" y="20" fill="white" font-family="-apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', sans-serif" font-size="23" font-weight="800" letter-spacing="0" textLength="98" lengthAdjust="spacingAndGlyphs">NODE.DC</text>
</svg>

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1 @@
(()=>{var r={919:function(r,e,n){n(461),n(624),n(286),n(334),n(338),n(695),n(322)}},e={};function n(o){var t=e[o];if(void 0!==t)return t.exports;var a=e[o]={exports:{}};return r[o](a,a.exports,n),a.exports}n.m=r,n.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),(()=>{var r=[];n.O=(e,o,t,a)=>{if(o){a=a||0;for(var i=r.length;i>0&&r[i-1][2]>a;i--)r[i]=r[i-1];r[i]=[o,t,a];return}for(var v=1/0,i=0;i<r.length;i++){for(var[o,t,a]=r[i],u=!0,f=0;f<o.length;f++)(!1&a||v>=a)&&Object.keys(n.O).every(r=>n.O[r](o[f]))?o.splice(f--,1):(u=!1,a<v&&(v=a));if(u){r.splice(i--,1);var l=t();void 0!==l&&(e=l)}}return e}})(),n.rv=()=>"1.3.9",(()=>{var r={611:0};n.O.j=e=>0===r[e];var e=(e,o)=>{var t,a,[i,v,u]=o,f=0;if(i.some(e=>0!==r[e])){for(t in v)n.o(v,t)&&(n.m[t]=v[t]);if(u)var l=u(n)}for(e&&e(o);f<i.length;f++)a=i[f],n.o(r,a)&&r[a]&&r[a][0](),r[a]=0;return n.O(l)},o=self.webpackChunk=self.webpackChunk||[];o.forEach(e.bind(null,0)),o.push=e.bind(null,o.push.bind(o))})(),n.ruid="bundler=rspack@1.3.9";var o=n.O(void 0,["985"],function(){return n(919)});o=n.O(o)})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

70
beta-apply.html Normal file

File diff suppressed because one or more lines are too long

174
docs/home-block-schema.md Normal file
View File

@ -0,0 +1,174 @@
# Home Page Block Schema Draft
This is the first content model draft for the NODE.DC landing page. It is intentionally content-only. Class names, animation hooks, WebGL targets, and responsive layout remain in renderer code.
## Page
```json
{
"slug": "home",
"title": "NODE.DC",
"seo": {
"title": "NODE.DC — ИИ-платформа для Webflow",
"description": "..."
},
"globals": {
"notification": {},
"navigation": {},
"dock": {}
},
"blocks": []
}
```
## Common Block Fields
Every block should include:
```json
{
"id": "stable-block-id",
"type": "heroWaitlist",
"enabled": true,
"anchor": "hero",
"adminLabel": "Первый экран"
}
```
## Block Field Drafts
### `heroWaitlist`
```json
{
"type": "heroWaitlist",
"leftFeatures": [
{
"titleLines": ["Ваш Webflow", "ИИ-инструменты"],
"text": "Несколько агентов для проекта Webflow..."
}
],
"appCard": {
"release": "Бета-релиз: июль 2026",
"heading": "Ранний доступ",
"description": "Кастомный код, MCP и ИИ-агенты...",
"form": {
"messagePlaceholder": "Сообщение (необязательно)",
"namePlaceholder": "Ваше имя*",
"emailPlaceholder": "Email для регистрации*",
"submitLabel": "Встать в лист ожидания"
}
}
}
```
### `featureVideo`
```json
{
"type": "featureVideo",
"headingLines": ["Всё в одном", "приложение."],
"intro": "Универсальный инструмент для ИИ-агентов...",
"features": [
{
"eyebrow": "Контекст проекта",
"text": "Подключитесь к MCP..."
}
],
"window": {
"title": "демо-видео.mp4",
"video": "./assets/media/publish-flow.mp4"
}
}
```
### `sliderGallery`
Use for component library and AI modes when they share the same render structure.
```json
{
"type": "sliderGallery",
"variant": "componentLibrary",
"headingLines": ["Агентная", "Компонентная", "библиотека."],
"intro": "Готовая к работе с агентами...",
"items": [
{
"title": "Публикация",
"video": "./assets/media/publish-flow.mp4",
"poster": null
}
]
}
```
### `faq`
```json
{
"type": "faq",
"headingLines": ["Частые", "вопросы", "и ответы"],
"intro": "Подробный обзор возможностей...",
"cta": {
"label": "Полная документация",
"href": "https://docs.ssscript.app/"
},
"items": [
{
"question": "Где размещаются мои файлы?",
"answer": "После сборки файлы загружаются..."
}
]
}
```
### `pricingTable`
```json
{
"type": "pricingTable",
"windowTitle": "тарифы.app",
"plans": [
{
"key": "beta",
"name": "Бета",
"price": "Бесплатно",
"period": "1 месяц",
"cta": {
"label": "Подать заявку в бету",
"href": "beta-apply.html",
"disabled": false
}
}
],
"rows": [
{
"label": "Старт",
"values": {
"beta": "Июнь 2026",
"founder": "Июнь 2026",
"basic": "Июнь 2026",
"advanced": "Июнь 2026"
}
}
],
"notes": []
}
```
### `fileGallery`
```json
{
"type": "fileGallery",
"items": [
{
"title": "публикация-в-один-клик.png",
"kind": "imageWindow",
"image": "./assets/webflow/images/example.avif",
"icon": "mov"
}
]
}
```

193
docs/refactor-admin-plan.md Normal file
View File

@ -0,0 +1,193 @@
# NODE.DC Block Refactor And Admin Plan
## Goal
Turn the current Webflow-exported page into a managed block-based source without changing the visual result.
The first version of the admin should edit only the content layer: text, links, media references, repeated items, and block order. Motion, WebGL, dock behavior, notification behavior, and responsive layout stay in code.
## Non-Negotiables
- Visual parity with the current page on desktop, tablet, and mobile.
- Existing responsive behavior must survive the refactor.
- Existing interactive shell must survive: top bar, dock, floating app windows, WebGL canvas, notifications, sliders, forms.
- Content blocks must be reorderable, duplicatable, and toggleable.
- No direct HTML editing in the admin.
- Optimization must be measured before and after each major step.
## Current Baseline
Measured on June 25, 2026 with Lighthouse against local servers:
| Target | Performance | Accessibility | Best Practices | SEO | FCP | LCP | TBT | Total byte weight |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| `127.0.0.1:8081` working copy | 43 | 91 | 100 | 92 | 2.6s | 14.4s | 1330ms | 24,423 KiB |
| `127.0.0.1:8080` original copy | 60 | 91 | 100 | 92 | 4.3s | 10.1s | 180ms | 17,273 KiB |
Main risk areas:
- `assets/media` is 53 MB.
- Main page has 17 `<video>` tags.
- Largest transferred assets in the working copy are videos.
- `assets/custom/js/app.js` is about 295 KB transferred locally.
- Current local copy loads heavier than the original because CDN compression/range/caching behavior is not equivalent to the local Python server.
Video file compression is outside this refactor scope. The media files can be compressed separately. The refactor is responsible for loading strategy only: offscreen videos should not be eagerly initialized or downloaded when the user does not need them yet.
## Performance Budget
Minimum target after block refactor:
- No regression against the current visual page at desktop/tablet/mobile.
- Lighthouse performance should not drop below the current working baseline during intermediate steps.
- Target after optimization pass: performance 75+ locally, then re-check in production-like hosting.
- LCP target: under 4s in production-like conditions.
- TBT target: under 300ms.
- Initial page must not eagerly initialize every video/module when offscreen.
## Recommended Architecture
Use a two-step migration.
### Phase 1: Static Block Engine
Before connecting a CMS, build a local block renderer:
- `content/pages/home.json` stores page blocks.
- `src/blocks/*` or `templates/blocks/*` render each block type.
- Renderer outputs static HTML or a local app route.
- Current CSS/assets/runtime are reused until visual parity is proven.
Reason: this isolates the risky part. We prove the content model and responsive rendering before adding admin complexity.
### Phase 2: Admin/CMS
Use Payload CMS for the first real admin because its block field maps directly to this requirement:
- one page has an ordered `blocks` array;
- each block has its own fields;
- admin can edit fields without touching markup;
- custom admin controls can later add duplicate/copy/paste affordances.
Admin UX target:
- left sidebar: ordered block list;
- right panel: selected block editor;
- controls: enable/disable, duplicate, copy, paste, move up/down, drag reorder;
- preview link opens the rendered page;
- fields are scoped to content only.
## Block Types
Initial home page block types:
1. `heroWaitlist`
- headings
- intro copy
- side feature cards
- form labels/placeholders/buttons
- app card logo/title/release note
2. `featureVideo`
- heading
- intro copy
- feature list
- video source
- window title
3. `componentLibrary`
- heading
- intro copy
- slider items
- media list
4. `featureCluster`
- heading groups
- rich text groups
- optional center 3D/visual target config
5. `modesGallery`
- heading
- intro copy
- slider/gallery items
6. `faq`
- heading
- intro copy
- CTA link
- questions array
7. `pricingIntro`
- eyebrow
- heading lines
- intro text blocks
8. `pricingTable`
- plans
- rows
- CTA labels/links
- notes
9. `fileGallery`
- media cards
- window titles
- icon labels
10. `waitlistMessages`
- message files
- names
- text contents
11. `footer`
- brand
- copyright
- navigation links
- contact links
- policy links
Global non-block content:
- navigation
- dock
- notification timeline
- WebGL canvas shell
- shared app/window chrome
- forms runtime/API behavior
## Refactor Order
1. Create content model and block schema.
2. Extract current page content into JSON.
3. Render one block at a time from JSON while keeping CSS/classes intact.
4. After each block extraction, compare screenshots at:
- desktop: 1440x900 or current browser size;
- tablet: 1024x768;
- mobile: 390x844.
5. Add Payload CMS only after static JSON rendering is visually stable.
6. Optimize media and runtime after block rendering is stable.
## Optimization Passes
Do after structural parity, not before:
- Make offscreen videos lazy: no eager load for hidden sliders/windows.
- Add posters for videos.
- Keep video source fields editable so compressed replacements can be dropped in without markup changes.
- Prefer CDN/prod-like compression for performance testing.
- Split heavy runtime modules if possible.
- Delay WebGL/model initialization until it is needed.
- Avoid duplicate hidden DOM copies where possible.
- Keep forms and API code out of the first render path when not visible.
## Verification Checklist
For each completed block:
- Desktop screenshot matches current design.
- Tablet screenshot matches current design.
- Mobile screenshot matches current design.
- No text overlap in Russian.
- Block can be disabled without breaking the rest of the page.
- Block can be duplicated and rendered twice.
- Block can move order in the JSON model.
- Lighthouse metrics are recorded after the milestone.

70
enterprise.html Normal file

File diff suppressed because one or more lines are too long

70
founders.html Normal file

File diff suppressed because one or more lines are too long

123
index.html Normal file

File diff suppressed because one or more lines are too long

69
originals/beta-apply.html Normal file

File diff suppressed because one or more lines are too long

69
originals/beta-apply.orig Normal file

File diff suppressed because one or more lines are too long

69
originals/enterprise.html Normal file

File diff suppressed because one or more lines are too long

69
originals/enterprise.orig Normal file

File diff suppressed because one or more lines are too long

69
originals/founders.html Normal file

File diff suppressed because one or more lines are too long

69
originals/founders.orig Normal file

File diff suppressed because one or more lines are too long

122
originals/index.html Normal file

File diff suppressed because one or more lines are too long

334
tools/build-local-copy.mjs Normal file
View File

@ -0,0 +1,334 @@
import { mkdir, readFile, writeFile, copyFile } from "node:fs/promises";
import { existsSync } from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";
const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const sourceDir = process.env.NODEDC_SOURCE_DIR || "/Users/dcconstructions/site-rescue/ssscript.app";
const targetDir = repoRoot;
const pages = ["index.html", "beta-apply.html", "founders.html", "enterprise.html"];
const assetHosts = new Set([
"cdn.prod.website-files.com",
"d3e54v103j8qbb.cloudfront.net",
"ssscript-website.vercel.app",
"ssscript.dev",
"cloud.umami.is",
]);
const assetExtensions = new Set([
".avif",
".css",
".glb",
".gif",
".jpg",
".jpeg",
".js",
".mp4",
".otf",
".png",
".svg",
".ttf",
".webm",
".webp",
".woff",
".woff2",
]);
const assetMap = new Map();
const queue = [];
const failures = [];
function cleanUrl(raw) {
let value = raw.trim();
value = value.replace(/&amp;/g, "&");
value = value.replace(/[),.;]+$/g, "");
if (value.startsWith("//")) value = `https:${value}`;
return value;
}
function extensionFor(url) {
return path.extname(decodeURIComponent(url.pathname)).toLowerCase();
}
function isAssetUrl(url) {
if (!assetHosts.has(url.hostname)) return false;
if (url.href.includes("%7B") || url.href.includes("%7D") || url.href.includes("${")) return false;
if (url.hostname === "cdn.prod.website-files.com" && url.pathname.includes("/vendor/webflow-badge-")) return false;
if (url.hostname === "cloud.umami.is") return url.pathname === "/script.js";
return assetExtensions.has(extensionFor(url));
}
function localAssetPath(url) {
const decodedPath = decodeURIComponent(url.pathname);
const basename = path.basename(decodedPath);
const ext = path.extname(basename).toLowerCase();
if (url.hostname === "cdn.prod.website-files.com") {
if (decodedPath.includes("/css/")) return path.join("assets", "webflow", "css", basename);
if (decodedPath.includes("/js/")) return path.join("assets", "webflow", "js", basename);
return path.join("assets", "webflow", "images", basename);
}
if (url.hostname === "d3e54v103j8qbb.cloudfront.net") {
return path.join("assets", "vendor", basename);
}
if (url.hostname === "ssscript-website.vercel.app") {
if (ext === ".css") return path.join("assets", "custom", "css", basename);
if (ext === ".js") return path.join("assets", "custom", "js", basename);
return path.join("assets", "custom", basename);
}
if (url.hostname === "ssscript.dev") {
return path.join("assets", "media", basename);
}
if (url.hostname === "cloud.umami.is") {
return path.join("assets", "vendor", "umami-script.js");
}
return path.join("assets", url.hostname, basename);
}
function addAsset(rawUrl, baseUrl = undefined) {
let url;
try {
url = new URL(cleanUrl(rawUrl), baseUrl);
} catch {
return null;
}
if (!isAssetUrl(url)) return null;
const canonical = url.href;
if (!assetMap.has(canonical)) {
const localPath = localAssetPath(url);
assetMap.set(canonical, localPath);
queue.push({ url, localPath });
}
return assetMap.get(canonical);
}
function extractUrls(text) {
const urls = [];
const absoluteUrlPattern = /(?:https?:)?\/\/[^\s"'<>\\]+/g;
const cssUrlPattern = /url\((['"]?)([^'")]+)\1\)/g;
const relativeAssetPattern =
/(["'`])((?:\.{1,2}\/|\/)[^"'`?#)]+\.(?:avif|css|gif|glb|jpe?g|js|mp4|otf|png|svg|ttf|webm|webp|woff2?)(?:[?#][^"'`]*)?)\1/g;
for (const match of text.matchAll(absoluteUrlPattern)) {
urls.push(match[0]);
}
for (const match of text.matchAll(cssUrlPattern)) {
urls.push(match[2]);
}
for (const match of text.matchAll(relativeAssetPattern)) {
urls.push(match[2]);
}
return urls;
}
function rel(fromFile, toFile) {
const relative = path.relative(path.dirname(fromFile), toFile).replaceAll(path.sep, "/");
const webPath = relative.split("/").map(encodeURIComponent).join("/");
return webPath.startsWith(".") ? webPath : `./${webPath}`;
}
function pageRel(localPath) {
return `./${localPath.split(path.sep).join("/").split("/").map(encodeURIComponent).join("/")}`;
}
function rewriteUrls(text, fromLocalPath, baseUrl = undefined) {
let output = text;
const isJs = fromLocalPath.endsWith(".js");
const replacements = [...assetMap.entries()].map(([remote, local]) => {
const remoteUrl = new URL(remote);
return {
remote,
local,
relative: isJs ? pageRel(local) : rel(path.join(targetDir, fromLocalPath), path.join(targetDir, local)),
noQuery: `${remoteUrl.origin}${remoteUrl.pathname}`,
};
});
for (const item of replacements) {
output = output.split(item.remote).join(item.relative);
output = output.split(item.remote.replaceAll("&", "&amp;")).join(item.relative);
output = output.split(item.noQuery).join(item.relative);
output = output.split(item.noQuery.replaceAll("&", "&amp;")).join(item.relative);
}
if (baseUrl) {
output = output.replace(/url\((['"]?)([^'")]+)\1\)/g, (full, quote, value) => {
const local = addAsset(value, baseUrl);
if (!local) return full;
const localRef = isJs ? pageRel(local) : rel(path.join(targetDir, fromLocalPath), path.join(targetDir, local));
return `url(${quote}${localRef}${quote})`;
});
output = output.replace(
/(["'`])((?:\.{1,2}\/|\/)[^"'`?#)]+\.(?:avif|css|gif|glb|jpe?g|js|mp4|otf|png|svg|ttf|webm|webp|woff2?)(?:[?#][^"'`]*)?)\1/g,
(full, quote, value) => {
const local = addAsset(value, baseUrl);
if (!local) return full;
const localRef = isJs ? pageRel(local) : rel(path.join(targetDir, fromLocalPath), path.join(targetDir, local));
return `${quote}${localRef}${quote}`;
}
);
}
if (fromLocalPath.endsWith(".html")) {
output = output
.replace(/<link href="https:\/\/cdn\.prod\.website-files\.com" rel="preconnect"[^>]*>/g, "")
.replace(/<link rel="preconnect" href="https:\/\/ssscript\.app\/cdn\.prod\.website-files\.com"[^>]*>/g, "")
.replaceAll("https://localhost:6545/app.js", "./assets/custom/js/app.js");
if (!output.includes("window.__API_ORIGIN__")) {
output = output.replace(
"<script>\n(function(d,h,host){",
'<script>\nwindow.__API_ORIGIN__="https://ssscript-website.vercel.app";\n(function(d,h,host){'
);
}
}
output = output
.replace(/\s+integrity="[^"]*"/g, "")
.replace(/\s+crossorigin="anonymous"/g, "")
.replace(/\s+crossOrigin="anonymous"/g, "");
return output;
}
async function downloadAsset(item) {
const outPath = path.join(targetDir, item.localPath);
await mkdir(path.dirname(outPath), { recursive: true });
const ext = extensionFor(item.url);
if (existsSync(outPath) && ext !== ".css" && ext !== ".js") return;
const response = await fetch(item.url.href, {
redirect: "follow",
headers: {
"User-Agent": "Mozilla/5.0 NodeDcLocalizer",
},
});
if (!response.ok) {
failures.push(`${response.status} ${item.url.href}`);
return;
}
const buffer = Buffer.from(await response.arrayBuffer());
await writeFile(outPath, buffer);
}
async function main() {
await mkdir(targetDir, { recursive: true });
await mkdir(path.join(targetDir, "originals"), { recursive: true });
const pageSources = new Map();
for (const page of pages) {
const sourcePath = path.join(sourceDir, page);
const source = await readFile(sourcePath, "utf8");
pageSources.set(page, source);
await copyFile(sourcePath, path.join(targetDir, "originals", page));
const origPath = path.join(sourceDir, page.replace(/\.html$/, ".orig"));
if (existsSync(origPath)) {
await copyFile(origPath, path.join(targetDir, "originals", path.basename(origPath)));
}
for (const rawUrl of extractUrls(source)) addAsset(rawUrl);
}
for (let index = 0; index < queue.length; index += 1) {
const item = queue[index];
await downloadAsset(item);
const ext = extensionFor(item.url);
if (ext === ".css" || ext === ".js") {
const localPath = path.join(targetDir, item.localPath);
if (!existsSync(localPath)) continue;
const source = await readFile(localPath, "utf8");
for (const rawUrl of extractUrls(source)) addAsset(rawUrl, item.url.href);
}
}
for (const [remote, local] of assetMap.entries()) {
const url = new URL(remote);
const ext = extensionFor(url);
if (ext !== ".css" && ext !== ".js") continue;
const localPath = path.join(targetDir, local);
if (!existsSync(localPath)) continue;
const source = await readFile(localPath, "utf8");
const rewritten = rewriteUrls(source, local, remote);
await writeFile(localPath, rewritten);
}
for (const [page, source] of pageSources.entries()) {
const rewritten = rewriteUrls(source, page);
await writeFile(path.join(targetDir, page), rewritten);
}
const manifest = {
generatedAt: new Date().toISOString(),
sourceDir,
targetDir,
pages,
assets: [...assetMap.entries()].map(([url, localPath]) => ({ url, localPath })),
failures,
};
await writeFile(path.join(targetDir, "asset-manifest.json"), `${JSON.stringify(manifest, null, 2)}\n`);
await writeFile(
path.join(targetDir, "README.md"),
`# NODE.DC Local Working Copy
This repository contains the current NODE.DC base site: a structured local copy of the recovered Webflow page, localized to Russian and prepared for the block/CMS refactor.
The rebuild source is \`${sourceDir}\`.
## Run
\`\`\`bash
cd ${targetDir}
python3 -m http.server 8081 --bind 127.0.0.1
\`\`\`
Open http://127.0.0.1:8081/
## Structure
- \`index.html\`, \`beta-apply.html\`, \`founders.html\`, \`enterprise.html\` - editable local pages.
- \`assets/webflow\` - Webflow CSS, JS, and image assets.
- \`assets/custom\` - custom NODE.DC CSS/JS published on Vercel.
- \`assets/media\` - downloaded videos from ssscript.dev.
- \`assets/vendor\` - third-party browser scripts.
- \`docs/\` - refactor notes, block model draft, and admin plan.
- \`originals\` - untouched files copied from the original wget download.
- \`asset-manifest.json\` - source URL to local file mapping.
- \`tools/build-local-copy.mjs\` - rebuild script. It uses \`NODEDC_SOURCE_DIR\` when provided, otherwise the original local rescue folder.
- \`tools/localize-ru.mjs\` - Russian localization and NODE.DC brand patch script.
External product/API/documentation links are intentionally left as external URLs.
`
);
console.log(`Pages: ${pages.length}`);
console.log(`Assets mapped: ${assetMap.size}`);
console.log(`Failures: ${failures.length}`);
for (const failure of failures) console.log(`FAILED ${failure}`);
}
main().catch((error) => {
console.error(error);
process.exit(1);
});

554
tools/localize-ru.mjs Normal file
View File

@ -0,0 +1,554 @@
import { readFile, writeFile } from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
const pages = ["index.html", "beta-apply.html", "founders.html", "enterprise.html"];
const wordmarkPath = path.join(rootDir, "assets/webflow/images/69ad96a28b06b7552a339137_logtype.svg");
const nodeDcWordmarkSvg = `<svg width="102" height="26" viewBox="0 0 102 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<text x="0" y="20" fill="white" font-family="-apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', sans-serif" font-size="23" font-weight="800" letter-spacing="0" textLength="98" lengthAdjust="spacingAndGlyphs">NODE.DC</text>
</svg>
`;
const translations = new Map([
["Ssscript™ — Your Webflow AI Launchpad", "NODE.DC — ИИ-платформа для Webflow"],
[
"All-in-one custom code, MCP, and AI launchpad for Webflow. Get early access to agentic control, embedded knowledge, and deployment pipeline. Beta May 2026.",
"Единая платформа для кастомного кода, MCP и ИИ-агентов в Webflow: контекст проекта, автоматизация, деплой и управляемая разработка.",
],
["All-in-one custom code, MCP, and AI launchpad for Webflow", "Единая платформа для кастомного кода, MCP и ИИ-агентов в Webflow"],
["Ssscript App&#x27;s Icon", "Иконка NODE.DC"],
["Ssscript App logo", "Логотип NODE.DC"],
["Ssscript App", "NODE.DC"],
["Ssscript™", "NODE.DC"],
["Ssscript", "NODE.DC"],
["ssscript", "NODE.DC"],
["Your Webflow", "Ваш Webflow"],
["AI Toolkit", "ИИ-инструменты"],
["Multiple agents on your Webflow project, from the", "Несколько агентов для проекта Webflow: от"],
["Designer", "Designer"],
["to", "до"],
["Custom Code.", "кастомного кода."],
["Custom Code", "Кастомный код"],
["Custom code", "Кастомный код"],
["custom code", "кастомный код"],
["Complete", "Полный"],
["Agentic Control", "агентный контроль"],
["Integrated with", "Интеграция с"],
["Webflow MCP,", "Webflow MCP,"],
["multi agent mode allows you to work on", "мультиагентный режим позволяет работать с"],
["multiple instances", "несколькими экземплярами"],
["in parallel.", "параллельно."],
["Component", "Компонентная"],
["Library", "библиотека"],
["Library.", "библиотека."],
["Build with", "Собирайте с учетом"],
["AI Agents", "ИИ-агентов"],
["in mind, diverse component setups that provide the backbone, while design the style and prompt advanced functionality.", "разные компонентные заготовки дают основу, а стиль и сложную функциональность можно дорабатывать промптами."],
["Deployment", "Деплой"],
["Pipeline", "пайплайн"],
["One click deploy,", "Деплой в один клик,"],
["continuous pipeline, instant rollback, and fast", "непрерывный пайплайн, мгновенный откат и быстрая"],
["CDN delivery.", "доставка через CDN."],
["Beta release July 2026", "Бета-релиз: июль 2026"],
["Beta release May 2026", "Бета-релиз: май 2026"],
["Release September 2026", "Релиз: сентябрь 2026"],
["Get early access", "Ранний доступ"],
["All in one Custom Code, MCP, AI launchpad for Webflow.", "Кастомный код, MCP и ИИ-агенты для Webflow в одном рабочем контуре."],
["All in one Custom Code, MCP, Ai launchpad for Webflow.", "Кастомный код, MCP и ИИ-агенты для Webflow в одном рабочем контуре."],
["Всё в одном Custom Code, MCP, AI launchpad for Webflow.", "Кастомный код, MCP и ИИ-агенты для Webflow в одном рабочем контуре."],
["Join Waitlist", "Встать в лист ожидания"],
["You&#x27;re In, thanks.", "Заявка принята. Спасибо."],
["We&#x27;ll be in touch soon.", "Мы скоро свяжемся."],
["Apply for Beta?", "Подать заявку в бету?"],
["Or get Early founder&#x27;s access", "Или оформить ранний Founder-доступ"],
["Get Founder Now", "Оформить Founder-доступ"],
["Get Founder Now <span class=\"darker-70\">350€</span>", "Оформить Founder-доступ <span class=\"darker-70\">350€</span>"],
["Get Founder Now <span class=\"darker-70\">310€</span>", "Оформить Founder-доступ <span class=\"darker-70\">310€</span>"],
["200 Spots Max", "До 200 мест"],
["Nope :(", "Не получилось"],
["Something went wrong.", "Что-то пошло не так."],
["Try again (later maybe)?", "Попробуйте ещё раз чуть позже."],
["Privacy Policy", "Политика конфиденциальности"],
["Cookie Policy", "Политика cookie"],
["Terms of Usage", "Условия использования"],
["© — All Right Reserved", "© — Все права защищены"],
["© 2026", "© 2026"],
["Leave a Message (optional)", "Сообщение (необязательно)"],
["Your Name*", "Ваше имя*"],
["Name", "Имя"],
["close window", "закрыть окно"],
["close", "закрыть"],
["homepage", "главная"],
["Sign-up Email*", "Email для регистрации*"],
["Why you? *", "Почему именно вы? *"],
["Twitter Profile", "Профиль в Twitter"],
["Instagram Profile", "Профиль в Instagram"],
["Portfolio URL", "Ссылка на портфолио"],
["video-demo.mp4", "демо-видео.mp4"],
["One click publish.png", "публикация-в-один-клик.png"],
["Complete code editor.webp", "полноценный-редактор-кода.webp"],
["AI Dock Mode.jpg", "ИИ-док-режим.jpg"],
["Deep Webflow connection.webp", "глубокая-интеграция-webflow.webp"],
["Install, setup and run.jpg", "установка-настройка-запуск.jpg"],
["Pricing.app", "Тарифы.app"],
[".txt", ".txt"],
["video-demo.txt", "демо-видео.txt"],
["All in one", "Всё в одном"],
["App.", "приложение."],
["The swiss-army knife for", "Универсальный инструмент для"],
["AI Agent", "ИИ-агентов"],
["in your Webflow project.", "в вашем Webflow-проекте."],
["Contextual Awareness", "Контекст проекта"],
["Connect to the", "Подключитесь к"],
["MCP", "MCP"],
["to give the Agents the full context on your build.", "чтобы агенты получили полный контекст вашей сборки."],
["Agent Swarms", "Группы агентов"],
["Use", "Используйте"],
["multiple agents in parallel", "несколько агентов параллельно"],
["to add custom code, animations, and functionality.", "чтобы добавлять кастомный код, анимации и функциональность."],
["Development Setup", "Среда разработки"],
["Leverage fast", "Используйте быстрые"],
["Bun", "Bun"],
["based builds, and live reload of your", "сборки и автообновление для вашего"],
["custom code.", "кастомного кода."],
["One-click Deploy", "Деплой в один клик"],
["Click and deploy", "Нажмите и публикуйте"],
["your AI written custom code to make it available to all users visiting your website.", "кастомный код, написанный ИИ, чтобы он стал доступен всем посетителям сайта."],
["Agentic", "Агентная"],
["Agent ready", "Готовая к работе с агентами"],
["component", "компонентная"],
["library. One click add (via the Ssscript Webflow app) ready to customise.", "библиотека: добавление в один клик через приложение NODE.DC для Webflow и дальнейшая настройка под проект."],
["AI Mode Switch", "Переключение режимов ИИ"],
["New Project Flow", "Создание нового проекта"],
["AI Dock Mode", "ИИ-док"],
["Account", "Аккаунт"],
["AI Code Editing", "Редактирование кода с ИИ"],
["AI Dev Server", "Dev-сервер с ИИ"],
["Webflow MCP", "Webflow MCP"],
["Publishing", "Публикация"],
["One", "Один"],
["click", "клик"],
["Add.", "добавления."],
["With the", "С помощью"],
["Ssscript Webflow Extension.", "расширения NODE.DC для Webflow."],
["Component Awareness", "Понимание компонентов"],
["Faster Starters", "Быстрый старт"],
["Get a", "Получите"],
["better", "более сильный"],
["MCP.", "MCP."],
["Fully re-engineered faster MCP server.", "Полностью переработанный и более быстрый MCP-сервер."],
["Webflow Awareness", "Понимание Webflow"],
["Flexible", "Гибкие"],
["AI Modes.", "режимы ИИ."],
["Different", "Разные"],
["modes", "режимы"],
["and", "и"],
["models", "модели"],
["for different tasks.", "для разных задач."],
["Frequently", "Частые"],
["Asked", "вопросы"],
["Questions", "и ответы"],
["Detailed overview", "Подробный обзор"],
["of features, functionality and inner workings.", "возможностей, логики работы и внутреннего устройства."],
["Complete Docs", "Полная документация"],
["FAQs", "FAQ"],
["Reply-To", "Ответить"],
["Does it impact performance?", "Это влияет на производительность?"],
["Where are my files hosted?", "Где размещаются мои файлы?"],
["Help! I pushed the wrong files!", "Что делать, если я опубликовал не те файлы?"],
["What&#x27;s the Webflow AI Agent?", "Что такое Webflow AI Agent?"],
["What is the custom knowledge base?", "Что такое собственная база знаний?"],
["How do I use it with Webflow?", "Как использовать это с Webflow?"],
["What AIs are available?", "Какие ИИ-модели доступны?"],
["How does it work?", "Как это работает?"],
["How does publishing work?", "Как работает публикация?"],
["Does it work with the MCP?", "Это работает с MCP?"],
["As every custom code addition does: the overhead is just the one added by the code itself.", "Как и любой кастомный код, это добавляет только ту нагрузку, которую несёт сам код."],
["Everything is also bundled, minified and compressed, to have the least impact on the project, avoiding loading external libraries and increase the number of CDN based scripts.", "Все файлы собираются, минифицируются и сжимаются, чтобы минимально влиять на проект и не плодить внешние библиотеки и CDN-скрипты."],
["Sent from my iPhone", "Отправлено с iPhone"],
["After the build step, all bundled files are uploaded to Cloudflare R2 and served through a CDN link on ssscript.dev domain, a dedicated CDN for this project, for the fastest, Webflow compatible result.", "После сборки файлы загружаются в Cloudflare R2 и отдаются через CDN-ссылку на выделенном домене проекта, чтобы получить быстрый и совместимый с Webflow результат."],
["In the deploy panel there&#x27;s the option for an instant rollback.", "В панели деплоя есть мгновенный откат."],
["Hit that, and you&#x27;ll get the previous deployment working right away, fix locally, and push again.", "Нажмите откат, верните предыдущую рабочую версию, исправьте локально и опубликуйте заново."],
["Other than", "Помимо"],
["default Agent modes, we&#x27;re working on a", "стандартных режимов агентов мы готовим"],
["mode, made specifically of webflow knowlege, how to interact with the project and how to be effective in it.", "режим, специально заточенный под Webflow: структуру проекта, взаимодействие с ним и эффективную разработку."],
["Built on top of years writing custom code in webflow for animation.", "Основано на многолетнем опыте написания кастомного кода для Webflow-анимаций."],
["WebGl, Threejs, GSAP and custom functionality, we collected best practices, build pipelines, and a module based systems to ensure everything works in unison.", "WebGL, Three.js, GSAP и кастомная функциональность собраны в набор практик, пайплайнов и модульную систему, чтобы всё работало согласованно."],
["A custom component library is also available for you to pick from, add to your project, and ask the AI to modify to fit your needs.", "Также доступна библиотека компонентов: выберите компонент, добавьте в проект и попросите ИИ адаптировать его под задачу."],
["When running the", "При запуске"],
[", there&#x27;s a custom Embed tab.", " доступна отдельная вкладка для встраивания."],
["Depending on your needs, you can get page based scripts, or a unique app.js for the entirety of the project.", "В зависимости от задачи можно получить скрипты для конкретной страницы или единый app.js для всего проекта."],
["The generated link already contains both a deployed version, that&#x27;ll follow your deploy url, and a local version, allowing you to work on you to preview your code without disturbing other people visiting your website.", "Сгенерированная ссылка содержит и продакшен-версию, следующую за URL деплоя, и локальную версию для предпросмотра без влияния на посетителей сайта."],
["We&#x27;re using all major models available, from", "Мы используем основные доступные модели:"],
["The model orchestrates automatically based on the request and needs, and you can switch to specific models by selecting them in a toggle.", "Оркестратор выбирает модель под задачу автоматически, но вы можете вручную переключиться на нужную модель."],
["When running, Ssscript is doing 2 things in parallel.", "Во время работы NODE.DC выполняет две задачи параллельно."],
["When running, Ssscript™ is doing 2 things in parallel.", "Во время работы NODE.DC выполняет две задачи параллельно."],
["When running, NODE.DC is doing 2 things in parallel.", "Во время работы NODE.DC выполняет две задачи параллельно."],
["Running a local Development environment, based on Bun, that keeps javascript and typescript files in sync, provides Hot Module Reload (HMR), and keeps a webhook active to automatically refresh your website when changes are made.", "Поднимает локальную среду разработки на Bun, синхронизирует JavaScript и TypeScript, включает HMR и держит webhook для автоматического обновления сайта при изменениях."],
["At the same time, an ai agent orchestrator is running, accessing agents and processing your requests, changing code, checking the build health, and modifying the Webflow project when needed.", "Одновременно работает оркестратор ИИ-агентов: обрабатывает запросы, меняет код, проверяет состояние сборки и при необходимости обновляет проект Webflow."],
["It&#x27;s a multi step project. First, we use Bun to build, compress, minify and set up the project and libraries used.", "Процесс многоэтапный: сначала Bun собирает, сжимает, минифицирует и подготавливает проект вместе с библиотеками."],
["Then we add to our CDN:", "Затем файлы отправляются в CDN:"],
["ssscript.dev/{USERNAME}/{PROJECT-NAME}", "cdn.node.dc/{USERNAME}/{PROJECT-NAME}"],
[". The link already contains the correct structure, so while you keep seeing the local version of the files, everyone else get the right script served instead.", ". Ссылка уже содержит нужную структуру: вы видите локальную версию, а пользователи получают опубликованный скрипт."],
["It&#x27;s built to work with the Webflow MCP natively.", "Система изначально рассчитана на работу с Webflow MCP."],
["Connect project, set authorization, and the AI Agents have now access to the Webflow build. Connect the App in the webflow Designer to also allow for Designer access, so the agents can update content, create elements, change styles and CSS, and to give the custom code full awareness of the Webflow project.", "Подключите проект и авторизацию, чтобы ИИ-агенты получили доступ к Webflow-сборке. Подключение приложения в Webflow Designer даёт агентам доступ к контенту, элементам, стилям и CSS, а кастомный код получает полный контекст проекта."],
["Connect.", "Подключить."],
["Prompt.", "Поставить задачу."],
["Ship.", "Опубликовать."],
["All in one development to production pipeline.", "Единый путь от разработки до продакшена."],
["12-click total setup,", "Настройка примерно в 12 кликов:"],
["from app download to have it running in your project.", "от скачивания приложения до запуска в проекте."],
["Pricing", "Тарифы"],
["Get Code", "Код"],
["to No-Code,", "для No-Code,"],
["with AI.", "усиленный ИИ."],
["App subscriptions with", "Подписки на приложение с"],
["inlcuded usage in every plan.", "включённым объёмом в каждом тарифе."],
["Token based", "Токенная"],
["pricing for overages.", "оплата сверх лимитов."],
["200 Founder", "200 Founder"],
["spots with locked price for the first year.", "мест с фиксированной ценой на первый год."],
["Beta", "Бета"],
["Free", "Бесплатно"],
["1 Month", "1 месяц"],
["Founder", "Founder"],
["/ Yearly, forever", "/ год, навсегда"],
["50% Discount", "Скидка 50%"],
["Basic", "Basic"],
["/ Month", "/ месяц"],
["Advanced", "Advanced"],
["Dropping", "Старт"],
["Total Availability", "Всего доступно"],
["Expansion (20M)", "Расширение (20M)"],
["Expansion (10M)", "Расширение (10M)"],
["Reasoning Depth", "Глубина рассуждения"],
["Core Intelligence", "Базовый интеллект"],
["Project Workspace", "Рабочее пространство"],
["Token Capacity", "Объём токенов"],
["June 2026", "Июнь 2026"],
["April 2026", "Апрель 2026"],
["May 2026", "Май 2026"],
["Plan Credits", "Кредиты тарифа"],
["Unlimited", "Без ограничений"],
["40,000 Included", "40 000 включено"],
["12,000 Included", "12 000 включено"],
["10 Projects", "10 проектов"],
["All Models", "Все модели"],
["All fast", "Все быстрые"],
["Full", "Полный"],
["Limited", "Ограниченный"],
["Expansion SM 10€", "Расширение SM 10€"],
["Unlimited Refresh", "Обновления без лимита"],
["+ 10,000 Credits", "+ 10 000 кредитов"],
["+ 8,000 Credits", "+ 8 000 кредитов"],
["Expansion MD 20€", "Расширение MD 20€"],
["+ 26,000 Credits", "+ 26 000 кредитов"],
["+ 20,000 Credits", "+ 20 000 кредитов"],
["40 testers", "40 тестировщиков"],
["200 Spots", "200 мест"],
["Apply for Beta", "Подать заявку в бету"],
["Get Basic", "Выбрать Basic"],
["Get Advanced", "Выбрать Advanced"],
["(*) Stuffs might change as testing progresses, though I&#x27;ll do my best to honour what&#x27;s here now.", "(*) Условия могут меняться по ходу тестирования, но мы постараемся сохранить заявленные обещания."],
["Enterprise", "Enterprise"],
["BYOK plans available from September 2026.", "BYOK-тарифы будут доступны с сентября 2026."],
["Get in the Beta", "Попасть в бету"],
["Apply only if you think you can follow up with this.", "Подавайте заявку, если готовы действительно тестировать и давать обратную связь."],
["Thanks!", "Спасибо!"],
["We&#x27;ll reach out if you&#x27;re a fit.", "Мы свяжемся, если ваш профиль подойдёт для тестирования."],
["Want to", "Хотите"],
["get in early", "получить ранний доступ"],
["and contribute to the development, locking a", "и повлиять на разработку, зафиксировав"],
["yearly discounted 50% advanced access forever?", "годовой Advanced-доступ со скидкой 50% навсегда?"],
["Influence", "Влияйте на"],
["Early Choices", "ранние решения"],
["And", "И"],
["actively participating", "активное участие"],
["actively participate", "активно участвуйте"],
["product roadmap", "дорожная карта продукта"],
["to the product roadmap.", "в формировании дорожной карты продукта."],
["Direct access", "Прямой доступ"],
["To the App.", "к приложению."],
["As an early tester.", "В статусе раннего тестировщика."],
["Infinite credits", "Безлимитные кредиты"],
["and tokens,", "и токены,"],
["unlimiterd projects.", "проекты без ограничений."],
["Discounted", "Льготная"],
["Sign up.", "регистрация."],
["When launching.", "на старте запуска."],
["What&#x27;s in", "Что входит в"],
["The Beta.", "бету."],
["You&#x27;ll be", "Вы будете"],
["in the early development stages of the app,", "на ранних этапах разработки приложения,"],
["influencing the development and future direction.", "влияя на развитие и дальнейшее направление продукта."],
["What am I expecting?", "Что мы ожидаем?"],
["Active participation.", "Активное участие."],
["Either through testing scenarios, or even better, to roll it in production.", "Тестовые сценарии, а ещё лучше — применение в реальном продакшене."],
["What you&#x27;ll get?", "Что вы получите?"],
["I&#x27;ll be there for you.", "Мы будем рядом на всём пути."],
["Constant communication,", "Постоянная коммуникация,"],
["bug fixing and 1 to 1 involvement.", "исправление ошибок и персональное сопровождение."],
["Where?", "Где?"],
["We&#x27;ll have a shared, private", "Будет общий закрытый"],
["Discord channel,", "Discord-канал,"],
["with other Beta Testers (~40 ppl).", "с другими бета-тестировщиками (~40 человек)."],
["What you get,", "Что вы получаете:"],
["Preference,", "приоритет,"],
["early and discounted access", "ранний доступ со скидкой"],
["to Founders plan.", "к тарифу Founders."],
["Founders", "Founders"],
["Founders Access", "Founder-доступ"],
["Get in Early.", "Войти раньше остальных."],
["Access the early beta before official release, with benefits.", "Ранний доступ к бете до официального релиза и дополнительные преимущества."],
["/ Yearly, Forever", "/ год, навсегда"],
["Token Capacity Beta", "Токены в бете"],
["Token Capacity After", "Токены после беты"],
["20M / Month", "20M / месяц"],
["€10/€16", "€10/€16"],
["Help fund the", "Поддержите"],
["training", "обучение"],
["fine-tuning", "дообучение"],
["fine tuning", "дообучение"],
["of the", "для"],
["Webflow code model", "кодовой модели Webflow"],
[", and the early development of the App.", " и раннюю разработку приложения."],
["Early access", "Ранний доступ"],
["To the Beta", "к бете"],
["You&#x27;ll get in for the second phase of the beta,", "Вы попадёте во вторую фазу беты,"],
["help test, provide feedback and", "поможете тестировать, давать обратную связь и"],
["shape the future of the app.", "формировать будущее продукта."],
["50% discount", "Скидка 50%"],
["On the advanced plan.", "на тариф Advanced."],
["Yearly, forever.", "Годовой доступ, навсегда."],
["What", "Что означает"],
["Founder", "Founder"],
["Means.", "доступ."],
["Early Beta Access, 50% discount.", "Ранний доступ к бете и скидка 50%."],
["Forever.", "Навсегда."],
["Early Access", "Ранний доступ"],
["Access the app in beta with the testers, you&#x27;ll get access on the first beta open wave", "Доступ к приложению вместе с тестировщиками: вы попадёте в первую открытую волну беты"],
["in approximately a week.", "примерно через неделю."],
["Lifetime Advanced Perks", "Преимущества Advanced навсегда"],
["at half the price.", "за половину стоимости."],
["At more than", "Более чем"],
["50% discounts.", "50% скидки."],
["All the good stuffs,", "Все ключевые возможности,"],
["less than half the price.", "меньше чем за половину цены."],
["Support the development", "Поддержите разработку"],
["Your money will go towards", "Средства пойдут на"],
["the custom model we&#x27;re working on.", "кастомной модели, над которой мы работаем."],
["Compare", "Сравните"],
["your", "свои"],
["Options", "варианты"],
["Founders get you access to the second Beta phase, with everything unlimited while testing, for 1 month.", "Founders получают доступ ко второй фазе беты и безлимит на время тестирования в течение 1 месяца."],
["Priced Yearly", "Годовая оплата"],
["supports the custom model fine tuning costs, while giving you Advanced pricing perks, forever.", "помогает покрыть расходы на дообучение модели и навсегда фиксирует преимущества тарифа Advanced."],
["spots total available.", "мест всего доступно."],
["Get in!", "Присоединиться!"],
["Enterprise Plan", "Enterprise-тариф"],
["Bring Your Own Keys.", "Используйте собственные ключи."],
["Extra security and privacy. Use any model.", "Больше безопасности и приватности. Любые модели на ваших условиях."],
["/ Monthly (5 users)", "/ месяц (5 пользователей)"],
["Members Included", "Пользователей включено"],
["5 Seats", "5 мест"],
["6+ Members", "6+ пользователей"],
["+ 40€ / Month / User", "+ 40€ / месяц / пользователь"],
["Get in Touch", "Связаться"],
["Direct", "Прямая"],
["Assistance", "поддержка"],
["Privileged access to", "Приоритетный доступ к"],
["support channels.", "каналам поддержки."],
["Included", "включено"],
["(40€/month) included.", "(40€/месяц) включено."],
["Pay what you use, get unlimited projects.", "Платите за использование и работайте с неограниченным числом проектов."],
["Bring", "Используйте"],
["Your Own", "собственные"],
["Keys.", "ключи."],
["Complete privacy and isolation.", "Полная приватность и изоляция."],
["Pay on your terms.", "Оплата на ваших условиях."],
["Enterprise Pricing", "Enterprise-цены"],
["Use any model.", "Используйте любую модель."],
["Additional Seats", "Дополнительные места"],
["Available at", "Доступны по"],
["discounted price", "льготной цене"],
["(30€/month per user).", "(30€/месяц за пользователя)."],
["Premium Support", "Премиальная поддержка"],
["Available", "Доступна"],
["24h.", "24/7."],
["Navigate", "Навигация"],
["Docs", "Документация"],
["Waitlist", "Лист ожидания"],
["Features", "Возможности"],
["Demo", "Демо"],
["Connect", "Контакты"],
["Twitter", "Twitter"],
["Instagram", "Instagram"],
["Github", "GitHub"],
["Portfolio", "Портфолио"],
["About", "О продукте"],
["Sat Jun 10", "Сб, 10 июня"],
["9:41 AM", "09:41"],
["UPCOMING", "ДАЛЕЕ"],
["— JULY 2026", "— ИЮЛЬ 2026"],
["Open Beta Release", "Открытая бета"],
["Everyone in. Let&#x27;s build (and debug) together.", "Открываем доступ всем. Будем собирать и отлаживать вместе."],
["JULY 2026", "ИЮЛЬ 2026"],
["Founders Alpha Release", "Альфа для Founder-доступа"],
["Founders Alpha", "Альфа для Founder-доступа"],
["For the second phase of testing, Beta is open to all subscribers with a founders plan.", "На второй фазе тестирования бета открыта для всех подписчиков Founder-тарифа."],
["CURRENTLY", "СЕЙЧАС"],
["Invites are out for the Closed Beta.", "Инвайты в закрытую бету уже отправлены."],
["We&#x27;re testing basic functionality and AI Integration atm.", "Сейчас тестируем базовую функциональность и ИИ-интеграцию."],
["Webflow AI Agent", "ИИ-агент Webflow"],
["Icon of a MOV video file featuring the QuickTime logo on a white document with a folded corner.", "Иконка MOV-файла."],
["Typed text on a white page, laid out in short lines like a text document preview.", "Иконка текстового файла."],
["Typed text on a white page with a folded top-right corner, featuring an inspirational passage about &#x27;the crazy ones&#x27; who challenge norms, create, inspire, and push humanity forward.", "Иконка текстового файла."],
["Txt Apple Icon", "Иконка TXT-файла"],
["Plain white cylindrical trash can with a slightly tapered top.", "Белая иконка корзины."],
["Made in Webflow", ""],
["Federico Valla", "NODE.DC"],
["Federico", "NODE.DC"],
["just found your website, looks great !", "только что нашёл ваш сайт — выглядит отлично!"],
["i d know but yeah", "пока не уверен, но да, интересно"],
["Please let me check this out!", "Дайте, пожалуйста, посмотреть продукт!"],
["GIMME", "ХОЧУ ДОСТУП"],
["Hello!!", "Привет!"],
["We&#x27;ve worked in Webflow since 2016 and use it exclusively. We&#x27;re also implementing AI into our workflows and I&#x27;m very interested in your offering here. Good luck with the launch!", "Мы работаем с Webflow с 2016 года и используем его постоянно. Сейчас внедряем ИИ в процессы, поэтому ваш продукт нам очень интересен. Удачи с запуском!"],
["Just a PSA for all you other devs.. haha I found out about this very early on. One of the favorites ykyk.", "Для всех разработчиков: я нашёл это очень рано. Уже один из фаворитов."],
["Hi can i get early access please i wanna test the ai i need it so much i will really appreciate it", "Здравствуйте, можно получить ранний доступ? Очень хочу протестировать ИИ, это сейчас действительно нужно."],
["interesting. Would love to know more", "Интересно. Хотелось бы узнать больше."],
["Wooooooaaahhh!!", "Вау!"],
["Please let me into the beta!", "Пожалуйста, пустите меня в бету!"],
["I would love to try out this product. Seems very interesting", "С удовольствием протестировал бы продукт. Выглядит очень интересно."],
["Am I the first founder member now? Take my money Fed, make this happen &lt;3", "Я теперь первый Founder? Берите деньги и запускайте это."],
["I&#x27;m your biggest fan", "Я ваш главный фанат"],
["hello", "привет"],
["testingggg", "тестирую"],
["Interested", "Интересно"],
["I know Fed!", "Я знаю Fed!"],
["Let me join!", "Пустите меня!"],
["waiting", "жду"],
["I would love early access to this product!", "Очень хочу ранний доступ к продукту!"],
["Whatup homie, the site is 🔥", "Привет, сайт огонь."],
["Hey, we really like your design , cheers!", "Нам очень нравится ваш дизайн. Спасибо!"],
["&quot;Goat&quot; refers to the horned, domesticated mammal (Capra aegagrus hircus) known for agility. As a popular acronym, G.O.A.T. means &quot;Greatest of All Time", "G.O.A.T. часто используют как сокращение от Greatest of All Time — «лучший за всё время»."],
]);
const translatableAttributes = new Set([
"alt",
"aria-label",
"arial-label",
"content",
"data-name",
"placeholder",
"title",
]);
function escapeRegex(value) {
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function applyTranslationsToText(text) {
let output = text;
const ordered = [...translations.entries()].sort((a, b) => b[0].length - a[0].length);
for (const [source, target] of ordered) {
if (/^[A-Za-z]+$/.test(source) && source.length <= 5) {
output = output.replace(new RegExp(`\\b${escapeRegex(source)}\\b`, "g"), target);
} else {
output = output.split(source).join(target);
}
}
return output;
}
function patchTag(tag) {
return tag.replace(/([\w:-]+)="([^"]*)"/g, (full, name, value) => {
if (!translatableAttributes.has(name)) return full;
if (/^(https?:|\.\/|\/|summary_large_image|website|width=device-width)/i.test(value)) return full;
return `${name}="${applyTranslationsToText(value)}"`;
});
}
function patchHtmlTextAndTags(html) {
const blockPattern = /(<script\b[^>]*>[\s\S]*?<\/script>|<style\b[^>]*>[\s\S]*?<\/style>|<[^>]+>)/gi;
return html
.split(blockPattern)
.map((part) => {
if (!part) return part;
if (/^<style\b/i.test(part)) return part;
if (/^<script\b/i.test(part)) {
if (!/type="application\/ld\+json"/i.test(part)) return part;
return applyTranslationsToText(part);
}
if (part.startsWith("<")) return patchTag(part);
return applyTranslationsToText(part);
})
.join("");
}
function injectLocalizationStyle(html) {
if (html.includes("node-dc-localization")) return html;
const style = `<style id="node-dc-localization">.w-webflow-badge{display:none!important}</style>`;
return html.replace("</head>", `${style}</head>`);
}
function patchPage(html) {
let output = html.replace('lang="en"', 'lang="ru"');
output = patchHtmlTextAndTags(output);
output = output
.replace(/<title>[^<]*<\/title>/, "<title>NODE.DC — ИИ-платформа для Webflow</title>")
.replace(/property="og:locale" content="[^"]*"/, 'property="og:locale" content="ru_RU"')
.replace(
/69ad96a28b06b7552a339137_logtype\.svg(?:\?v=node-dc)?/g,
"69ad96a28b06b7552a339137_logtype.svg?v=node-dc"
);
return injectLocalizationStyle(output);
}
function patchCustomRuntime(js) {
return js
.replace(
'new Intl.DateTimeFormat("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})',
'new Intl.DateTimeFormat("ru-RU",{hour:"2-digit",minute:"2-digit",hour12:!1})'
)
.replace(
'let J=$.locale||void 0,H=new Intl.DateTimeFormat(J,{weekday:"long"});',
'let J=$.locale||"ru-RU",H=new Intl.DateTimeFormat(J,{weekday:"short",day:"numeric",month:"short"});'
);
}
async function main() {
for (const page of pages) {
const file = path.join(rootDir, page);
const html = await readFile(file, "utf8");
await writeFile(file, patchPage(html));
}
const appJsPath = path.join(rootDir, "assets/custom/js/app.js");
const appJs = await readFile(appJsPath, "utf8");
await writeFile(appJsPath, patchCustomRuntime(appJs));
await writeFile(wordmarkPath, nodeDcWordmarkSvg);
console.log(`Localized ${pages.length} pages to Russian and patched custom runtime.`);
}
main().catch((error) => {
console.error(error);
process.exit(1);
});