diff --git a/README.md b/README.md index 6623897..3d0afce 100644 --- a/README.md +++ b/README.md @@ -1,63 +1,27 @@ -# NODE.DC Local Working Copy +# NODE.DC PromoSite -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/ - -## Admin And Render - -The first refactor step keeps the Webflow markup intact, but moves the home page into a block-rendered structure: - -- `content/pages/home.json` - ordered page regions and block instances. -- `templates/pages/home/shell.html` - original page shell with block slots. -- `templates/pages/home/blocks/` - exact HTML chunks extracted from the current page. -- `tools/render-home.mjs` - renders `index.html` from the content model and templates. -- `admin/` - local admin UI for block order, enable/disable, duplicate, copy/paste, and JSON edits. - -`heroWaitlist` and `featureVideo` already expose typed content fields in the admin. Other blocks are still managed as HTML-template blocks until their content fields are extracted. - -Run the local admin: - -```bash -cd /Users/dcconstructions/Downloads/mnt/NODEDC/NODEDC_SITE -npm run admin -``` - -Open http://127.0.0.1:8090/admin/ - -Render the public page after JSON changes: - -```bash -npm run render:home -``` - -If the current `index.html` must be re-extracted into fresh templates: - -```bash -npm run extract:home -``` +Static promo site for NODE.DC: an enterprise platform for processes, data, AI agents, workflow automation, Hub, Engine, Ops, and applied business modules. ## 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. -- `backbase/ssscript.app` - original downloaded app bundle backup. -- `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. +- `content/pages/home.json` - structured content model for the homepage. +- `templates/pages/home/shell.html` - homepage shell and shared head/runtime includes. +- `templates/pages/home/blocks` - block templates used by the renderer and admin. +- `content/block-templates/home.json` - sanitized admin block presets. +- `assets/site` - local runtime CSS, JS, fonts, and base UI images. +- `assets/custom` - NODE.DC custom runtime and overrides. +- `assets/uploads` - product media managed by the site/admin flow. +- `admin` and `tools/admin-server.mjs` - local content admin. -External product/API/documentation links are intentionally left as external URLs. +## Commands + +```bash +npm run render:home +npm run admin +``` + +For a static preview: + +```bash +python3 -m http.server 8081 --bind 127.0.0.1 +``` diff --git a/admin/admin.css b/admin/admin.css index c5f109a..e152db4 100644 --- a/admin/admin.css +++ b/admin/admin.css @@ -795,6 +795,13 @@ body[data-file-picker-active="true"] .editor { scrollbar-color: rgba(255, 255, 255, 0.25) transparent; } +body[data-admin-mode="seo"] #add-block, +body[data-admin-mode="seo"] .block-meta-card, +body[data-admin-mode="seo"] .structure-card, +body[data-admin-mode="seo"] .json-details { + display: none; +} + .hidden { display: none !important; } @@ -802,7 +809,8 @@ body[data-file-picker-active="true"] .editor { .settings-card, .content-panel, .json-details, -.content-group { +.content-group, +.seo-diagnostics { border-radius: var(--launcher-radius-card); background: rgba(255, 255, 255, 0.045); } @@ -930,6 +938,72 @@ body[data-file-picker-active="true"] .editor { white-space: nowrap; } +.seo-diagnostics { + display: grid; + gap: 1rem; + padding: 1rem; +} + +.seo-metric-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 0.75rem; +} + +.seo-metric { + display: grid; + gap: 0.35rem; + min-width: 0; + border-radius: 1rem; + background: rgba(255, 255, 255, 0.055); + padding: 0.82rem; +} + +.seo-metric span { + overflow: hidden; + color: var(--text-muted); + font-size: 0.68rem; + font-weight: 850; + text-overflow: ellipsis; + text-transform: uppercase; + white-space: nowrap; +} + +.seo-metric strong { + overflow: hidden; + color: var(--text-primary); + font-size: 0.88rem; + font-weight: 850; + line-height: 1.2; + text-overflow: ellipsis; + white-space: nowrap; +} + +.seo-metric[data-status="good"] strong, +.seo-field-meter[data-status="good"] { + color: #bcf4d1; +} + +.seo-metric[data-status="warn"] strong, +.seo-field-meter[data-status="warn"] { + color: #f3d28b; +} + +.seo-metric[data-status="bad"] strong, +.seo-field-meter[data-status="bad"] { + color: #ffb7b7; +} + +.seo-field-meter { + overflow: hidden; + color: var(--text-muted); + font-size: 0.68rem; + font-weight: 720; + text-overflow: ellipsis; + text-transform: none; + white-space: nowrap; +} + .boolean-field { align-content: start; } @@ -1313,7 +1387,8 @@ body[data-file-picker-active="true"] .editor { } input, -textarea { +textarea, +select { width: 100%; border: 0; border-radius: 1rem; @@ -1323,7 +1398,8 @@ textarea { } input:focus, -textarea:focus { +textarea:focus, +select:focus { background: rgba(255, 255, 255, 0.1); box-shadow: none; } @@ -1333,6 +1409,10 @@ textarea { resize: vertical; } +select { + appearance: none; +} + .toggle-row { justify-content: flex-start; gap: 0.65rem; @@ -2473,6 +2553,10 @@ textarea { grid-template-columns: 1fr; } + .seo-metric-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .media-preview-panel { grid-template-columns: 9rem minmax(0, 1fr); grid-template-rows: auto auto; @@ -2500,7 +2584,7 @@ textarea { .nodedc-expanded-nav-group { display: grid; width: 100%; - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(2, minmax(0, 1fr)); overflow: visible; } @@ -2519,7 +2603,8 @@ textarea { } .field-grid, - .group-grid { + .group-grid, + .seo-metric-grid { grid-template-columns: 1fr; } diff --git a/admin/admin.js b/admin/admin.js index 8e55bbf..8c41ab7 100644 --- a/admin/admin.js +++ b/admin/admin.js @@ -34,7 +34,12 @@ function readLastMediaDirectory() { return String(readAdminLayoutState().lastMediaDirectory || "").replace(/^\/+/, ""); } +function readAdminMode() { + return readAdminLayoutState().mode === "seo" ? "seo" : "content"; +} + const state = { + mode: readAdminMode(), page: null, templates: [], selected: null, @@ -69,7 +74,78 @@ const state = { const SECTIONS_REGION_ID = "sections"; const SECTIONS_REGION_LABEL = "Секции"; +const PAGE_SEO_DEFAULTS = { + title: "NODE.DC - платформа для процессов, данных и ИИ-агентов", + description: + "NODE.DC объединяет Hub, Engine, Ops, прикладные модули и сквозного ассистента для задач, workflow, данных, ролей, интеграций и инженерных моделей.", + canonicalUrl: "https://nodedc.dctouch.ru/", + robots: "index,follow,max-image-preview:large", + siteName: "NODE.DC", + locale: "ru_RU", + ogImage: "https://nodedc.dctouch.ru/assets/site/images/69b6acdde3123ef078e2b7f3_og-img.jpg", + imageAlt: "NODE.DC - платформа для процессов, данных и ИИ-агентов", + organizationName: "DCTOUCH", + organizationUrl: "https://dctouch.ru/", + applicationCategory: "BusinessApplication", +}; + +const BLOCK_SEO_DEFAULTS = { + targetCluster: "", + searchIntent: "", + primaryQuery: "", + secondaryQueries: "", + title: "", + description: "", + coverageNotes: "", + indexHint: "section", +}; + +const PAGE_SEO_FIELDS = [ + { path: "seo.title", label: "Title страницы", kind: "text", group: "Сниппет", min: 35, max: 70 }, + { path: "seo.description", label: "Description страницы", kind: "textarea", group: "Сниппет", min: 110, max: 170 }, + { path: "seo.canonicalUrl", label: "Canonical URL", kind: "url", group: "Индексация" }, + { + path: "seo.robots", + label: "Robots meta", + kind: "select", + group: "Индексация", + options: ["index,follow,max-image-preview:large", "noindex,nofollow", "index,follow"], + }, + { path: "seo.siteName", label: "Site name", kind: "text", group: "Open Graph" }, + { path: "seo.locale", label: "Locale", kind: "text", group: "Open Graph" }, + { path: "seo.ogImage", label: "OG image", kind: "url", group: "Open Graph" }, + { path: "seo.imageAlt", label: "OG image alt", kind: "textarea", group: "Open Graph", min: 20, max: 120 }, + { path: "seo.organizationName", label: "Organization", kind: "text", group: "Schema.org" }, + { path: "seo.organizationUrl", label: "Organization URL", kind: "url", group: "Schema.org" }, + { path: "seo.applicationCategory", label: "Application category", kind: "text", group: "Schema.org" }, +]; + +const BLOCK_SEO_FIELDS = [ + { path: "seo.targetCluster", label: "Кластер", kind: "text", group: "Семантика" }, + { path: "seo.searchIntent", label: "Интент", kind: "textarea", group: "Семантика", min: 20, max: 220 }, + { path: "seo.primaryQuery", label: "Основной запрос", kind: "text", group: "Семантика" }, + { path: "seo.secondaryQueries", label: "Смежные запросы", kind: "textarea", group: "Семантика" }, + { path: "seo.title", label: "SEO-заголовок блока", kind: "text", group: "Сниппет блока", min: 35, max: 80 }, + { path: "seo.description", label: "SEO-описание блока", kind: "textarea", group: "Сниппет блока", min: 90, max: 180 }, + { + path: "seo.indexHint", + label: "Роль в индексации", + kind: "select", + group: "Индексация", + options: ["section", "supporting", "conversion", "noindex"], + }, + { path: "seo.coverageNotes", label: "Заметки по охвату", kind: "textarea", group: "Аналитика", min: 20, max: 500 }, +]; + const el = { + modeContent: document.querySelector("#admin-mode-content"), + modeSeo: document.querySelector("#admin-mode-seo"), + sidebarTitle: document.querySelector("#sidebar-title"), + workspaceRole: document.querySelector("#workspace-role"), + editorHeading: document.querySelector("#editor-heading"), + panelKicker: document.querySelector("#content-panel-kicker"), + panelTitle: document.querySelector("#content-panel-title"), + panelNote: document.querySelector("#content-panel-note"), regions: document.querySelector("#regions"), addBlock: document.querySelector("#add-block"), reload: document.querySelector("#reload"), @@ -143,7 +219,7 @@ const STATIC_FALLBACK = { enabled: true, content: { navigation: { - logoSrc: "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg", + logoSrc: "./assets/site/images/69ad964d951f9d17cc5a919e_logo-app.svg", logoAlt: "главная", brandLabel: "NODE.DC", links: [ @@ -152,7 +228,7 @@ const STATIC_FALLBACK = { { enabled: true, label: "Документация", - href: "https://docs.ssscript.app/", + href: "https://nodedc.dctouch.ru/", target: "", linkMode: "href", linkTarget: "_blank", @@ -191,9 +267,9 @@ const STATIC_FALLBACK = { href: "javascript:void(0)", linkTarget: "", targetId: "app-data", - iconSrc: "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg", + iconSrc: "./assets/site/images/69ad964d951f9d17cc5a919e_logo-app.svg", iconAlt: "Иконка NODE.DC", - className: "dock-icon ssscript", + className: "dock-icon nodedc-app", iconClass: "logo", dividerBefore: false, }, @@ -203,7 +279,7 @@ const STATIC_FALLBACK = { href: "javascript:void(0)", linkTarget: "", targetId: "", - iconSrc: "./assets/webflow/images/69a9ae818a76c773dc3cf7bc_trash.avif", + iconSrc: "./assets/site/images/69a9ae818a76c773dc3cf7bc_trash.avif", iconAlt: "Белая иконка корзины.", className: "dock-icon no-bg", iconClass: "dock-app-img trash", @@ -214,11 +290,11 @@ const STATIC_FALLBACK = { }, assets: { webglModelSrc: "./assets/custom/icon.glb", - logoPng: "./assets/custom/logo.png", + logoPng: "./assets/uploads/images/Logo/dclogo_white_alpha-mqus5if2.png", logoPngAlt: "Логотип NODE.DC", - appIconSrc: "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg", + appIconSrc: "./assets/site/images/69ad964d951f9d17cc5a919e_logo-app.svg", appIconAlt: "Иконка NODE.DC", - appWordmarkSrc: "./assets/webflow/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc", + appWordmarkSrc: "./assets/site/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc", appWordmarkAlt: "Логотип NODE.DC", faviconSvg: "./assets/uploads/favicon/icon-adaptive.svg", faviconIco: "./assets/uploads/favicon/favicon.ico", @@ -272,7 +348,7 @@ const STATIC_FALLBACK = { targetId: "", iconSrc: "", iconAlt: "", - className: "dock-icon ssscript", + className: "dock-icon nodedc-app", iconClass: "", dividerBefore: false, }, @@ -322,7 +398,7 @@ const GROUP_COPY = { Слайдер: "Видео-превью и подписи карточек внутри горизонтального слайдера.", Скролл: "Скорость локальной прокрутки внутри блока: меньше значение — спокойнее шаг, больше — быстрее.", "Один клик": "Подблок про быстрое добавление и настройку компонентов.", - MCP: "Подблок про MCP-сервер и контекст Webflow.", + MCP: "Подблок про MCP-сервер и контекст NODE.DC.", "Окно FAQ": "Название окна FAQ и служебные подписи mail-интерфейса.", Отправитель: "Профиль отправителя в FAQ: аватар, имя и подписи письма.", FAQ: "Вопросы и ответы mail-интерфейса. Каждый пункт можно добавить, удалить и переставить.", @@ -354,7 +430,7 @@ const MEDIA_ROOT_FILTERS = [ ["assets", "Assets"], ["assets/uploads", "Uploads"], ["assets/media", "Media"], - ["assets/webflow/images", "Webflow"], + ["assets/site/images", "NODE.DC"], ["assets/custom", "Custom"], ]; const FINDER_TRASH_ICON_SVG = @@ -459,6 +535,276 @@ function setByPath(source, path, nextValue) { target[lastKey] = nextValue; } +function ensurePageSeo() { + if (!state.page) return; + state.page.seo = { + ...PAGE_SEO_DEFAULTS, + ...(state.page.seo || {}), + }; +} + +function ensureBlockSeo(block) { + if (!block || isStaticSelection()) return; + block.seo = { + ...BLOCK_SEO_DEFAULTS, + ...(block.seo || {}), + }; +} + +function ensureSeoModel() { + ensurePageSeo(); + + for (const region of state.page?.regions || []) { + for (const block of region.blocks || []) { + block.seo = { + ...BLOCK_SEO_DEFAULTS, + ...(block.seo || {}), + }; + } + } +} + +function setAdminMode(nextMode) { + const mode = nextMode === "seo" ? "seo" : "content"; + state.mode = mode; + updateAdminLayoutState({ mode }); + if (state.page) { + renderAll(); + } else { + updateAdminModeSurface(); + } +} + +function updateAdminModeSurface() { + const isSeo = state.mode === "seo"; + document.body.dataset.adminMode = state.mode; + + if (el.modeContent) el.modeContent.dataset.active = String(!isSeo); + if (el.modeSeo) el.modeSeo.dataset.active = String(isSeo); + if (el.sidebarTitle) el.sidebarTitle.textContent = isSeo ? "SEO" : "Администрирование"; + if (el.workspaceRole) el.workspaceRole.textContent = isSeo ? "SEO-режим сайта" : "Администратор сайта"; + if (el.editorHeading) el.editorHeading.textContent = isSeo ? "SEO сайта" : "Настройки сайта"; + if (el.panelKicker) el.panelKicker.textContent = isSeo ? "SEO" : "Контент"; + if (el.panelTitle) el.panelTitle.textContent = isSeo ? "Семантика и сниппеты" : "Редактируемые поля"; + if (el.panelNote) { + el.panelNote.textContent = isSeo + ? "Поля готовят страницу и секции к семантической настройке и дальнейшей автоматизации." + : "Поля сгруппированы по смысловым подблокам верстки."; + } +} + +function editorJsonPayload(block) { + if (state.mode === "seo" && isStaticSelection()) { + return state.page?.seo || {}; + } + + return block || {}; +} + +function groupedSeoFields(fields) { + const groups = new Map(); + + for (const seoField of fields) { + const groupName = seoField.group || "SEO"; + if (!groups.has(groupName)) groups.set(groupName, []); + groups.get(groupName).push(seoField); + } + + return groups; +} + +function compactText(value) { + if (value == null) return ""; + if (Array.isArray(value)) return value.map(compactText).join(" "); + if (typeof value === "object") return Object.values(value).map(compactText).join(" "); + + return String(value) + .replace(/<[^>]*>/g, " ") + .replace(/https?:\/\/\S+/g, " ") + .replace(/\s+/g, " ") + .trim(); +} + +function seoLengthStatus(value, min, max) { + const length = String(value || "").trim().length; + if (!min && !max) return { status: "info", text: length ? `${length} симв.` : "пусто" }; + if (!length) return { status: "bad", text: `пусто · цель ${min || 0}-${max || "∞"}` }; + if ((min && length < min) || (max && length > max)) { + return { status: "warn", text: `${length} симв. · цель ${min || 0}-${max || "∞"}` }; + } + return { status: "good", text: `${length} симв.` }; +} + +function createSeoMetric(label, value, status = "info") { + const item = document.createElement("div"); + const caption = document.createElement("span"); + const number = document.createElement("strong"); + + item.className = "seo-metric"; + item.dataset.status = status; + caption.textContent = label; + number.textContent = value; + item.append(caption, number); + return item; +} + +function blockTextStats(block) { + const text = compactText(block?.content || ""); + const words = text ? text.split(/\s+/).filter(Boolean).length : 0; + return { text, words, chars: text.length }; +} + +function renderSeoDiagnostics({ targetModel, fields, isStatic }) { + const diagnostics = document.createElement("section"); + const head = document.createElement("div"); + const title = document.createElement("h3"); + const desc = document.createElement("p"); + const metrics = document.createElement("div"); + + diagnostics.className = "seo-diagnostics"; + head.className = "group-head"; + title.textContent = isStatic ? "Диагностика страницы" : "Диагностика блока"; + desc.className = "group-desc"; + desc.textContent = isStatic + ? "Базовые поля, которые попадают в head, Open Graph, sitemap и structured data." + : "Черновой слой для семантики блока. Позже его сможет заполнять внешний SEO-модуль."; + head.append(title, desc); + metrics.className = "seo-metric-grid"; + + if (isStatic) { + const titleStatus = seoLengthStatus(getByPath(targetModel, "seo.title"), 35, 70); + const descriptionStatus = seoLengthStatus(getByPath(targetModel, "seo.description"), 110, 170); + const canonical = String(getByPath(targetModel, "seo.canonicalUrl") || ""); + const ogImage = String(getByPath(targetModel, "seo.ogImage") || ""); + + metrics.append( + createSeoMetric("Title", titleStatus.text, titleStatus.status), + createSeoMetric("Description", descriptionStatus.text, descriptionStatus.status), + createSeoMetric("Canonical", canonical.startsWith("https://") ? "абсолютный" : "проверить", canonical.startsWith("https://") ? "good" : "warn"), + createSeoMetric("OG image", ogImage ? "задан" : "пусто", ogImage ? "good" : "bad"), + ); + } else { + const stats = blockTextStats(targetModel); + const primaryQuery = String(getByPath(targetModel, "seo.primaryQuery") || "").trim(); + const secondary = String(getByPath(targetModel, "seo.secondaryQueries") || "") + .split(/\n|,/) + .map((item) => item.trim()) + .filter(Boolean); + const titleStatus = seoLengthStatus(getByPath(targetModel, "seo.title"), 35, 80); + + metrics.append( + createSeoMetric("Текст блока", `${stats.words} слов`, stats.words >= 40 ? "good" : "warn"), + createSeoMetric("Основной запрос", primaryQuery ? "задан" : "пусто", primaryQuery ? "good" : "bad"), + createSeoMetric("Смежные запросы", `${secondary.length}`, secondary.length ? "good" : "warn"), + createSeoMetric("SEO-заголовок", titleStatus.text, titleStatus.status), + ); + } + + diagnostics.append(head, metrics); + return diagnostics; +} + +function updateSeoFieldMeter(meter, input, config) { + if (!meter) return; + const lengthStatus = seoLengthStatus(fieldInputValue(input), config.min, config.max); + meter.dataset.status = lengthStatus.status; + meter.textContent = lengthStatus.text; +} + +function renderSeoInput({ targetModel, seoField, grid }) { + const label = document.createElement("label"); + const labelRow = document.createElement("span"); + const labelText = document.createElement("span"); + const kind = document.createElement("span"); + const path = document.createElement("span"); + const isLong = seoField.kind === "textarea"; + const input = seoField.kind === "select" ? document.createElement("select") : isLong ? document.createElement("textarea") : document.createElement("input"); + const value = getByPath(targetModel, seoField.path) ?? ""; + const meter = seoField.min || seoField.max ? document.createElement("span") : null; + + label.className = `field-control seo-field${isLong ? " wide" : ""}`; + labelRow.className = "field-label-row"; + labelText.className = "field-label-text"; + labelText.textContent = seoField.label || seoField.path; + kind.className = "field-kind"; + kind.textContent = seoField.kind || "text"; + path.className = "field-path"; + path.textContent = seoField.path; + labelRow.append(labelText, kind); + + if (seoField.kind === "select") { + const values = new Set([...(seoField.options || []), value].filter(Boolean)); + for (const optionValue of values) { + const option = document.createElement("option"); + option.value = optionValue; + option.textContent = optionValue; + input.append(option); + } + } else { + if (!isLong) { + input.autocomplete = "off"; + input.type = seoField.kind === "url" ? "url" : "text"; + } + } + + input.dataset.seoPath = seoField.path; + input.value = value; + input.placeholder = seoField.placeholder || ""; + updateSeoFieldMeter(meter, input, seoField); + + input.addEventListener(seoField.kind === "select" ? "change" : "input", () => { + setByPath(targetModel, seoField.path, fieldInputValue(input)); + updateSeoFieldMeter(meter, input, seoField); + el.json.value = JSON.stringify(editorJsonPayload(activeBlock()), null, 2); + markDirty("SEO-поля обновлены локально. Нажмите «Сохранить модель» или «Обновить index.html»."); + }); + + label.append(labelRow, input); + if (meter) { + meter.className = "seo-field-meter"; + label.append(meter); + } + label.append(path); + grid.append(label); +} + +function renderSeoFields(block) { + const isStatic = isStaticSelection(); + const targetModel = isStatic ? state.page : block; + const fields = isStatic ? PAGE_SEO_FIELDS : BLOCK_SEO_FIELDS; + + if (isStatic) ensurePageSeo(); + else ensureBlockSeo(block); + + el.contentFields.innerHTML = ""; + el.contentFields.append(renderSeoDiagnostics({ targetModel, fields, isStatic })); + + for (const [groupName, groupFields] of groupedSeoFields(fields)) { + const group = document.createElement("section"); + const head = document.createElement("div"); + const titleWrap = document.createElement("div"); + const title = document.createElement("h3"); + const desc = document.createElement("p"); + const grid = document.createElement("div"); + + group.className = "content-group seo-group"; + head.className = "group-head"; + title.textContent = groupName; + desc.className = "group-desc"; + desc.textContent = isStatic ? "Поля уровня страницы и поискового сниппета." : "Поля уровня секции для будущей семантической карты."; + titleWrap.append(title, desc); + head.append(titleWrap); + grid.className = "group-grid"; + + for (const seoField of groupFields) { + renderSeoInput({ targetModel, seoField, grid }); + } + + group.append(head, grid); + el.contentFields.append(group); + } +} + const LINK_WINDOW_TARGETS = new Set(["_blank", "_self", "_parent", "_top"]); function isWindowTarget(value) { @@ -541,7 +887,7 @@ function createDefaultDockItems(dock = {}, assets = {}) { targetId: dock.appTarget || "app-data", iconSrc: assets.appIconSrc || STATIC_FALLBACK.content.assets.appIconSrc, iconAlt: assets.appIconAlt || STATIC_FALLBACK.content.assets.appIconAlt, - className: "dock-icon ssscript", + className: "dock-icon nodedc-app", iconClass: "logo", dividerBefore: false, }, @@ -551,7 +897,7 @@ function createDefaultDockItems(dock = {}, assets = {}) { href: "javascript:void(0)", linkTarget: "", targetId: "", - iconSrc: "./assets/webflow/images/69a9ae818a76c773dc3cf7bc_trash.avif", + iconSrc: "./assets/site/images/69a9ae818a76c773dc3cf7bc_trash.avif", iconAlt: dock.trashAlt || "Белая иконка корзины.", className: "dock-icon no-bg", iconClass: "dock-app-img trash", @@ -578,7 +924,7 @@ function normalizeDock(dock, assets = {}) { targetId: item.targetId ?? fallback.targetId ?? "", iconSrc: hasOwn("iconSrc") ? item.iconSrc : fallback.iconSrc, iconAlt: hasOwn("iconAlt") ? item.iconAlt : item.alt || fallback.iconAlt, - className: item.className || fallback.className || "dock-icon ssscript", + className: item.className || fallback.className || "dock-icon nodedc-app", iconClass: hasOwn("iconClass") ? item.iconClass : fallback.iconClass || "logo", dividerBefore: Boolean(item.dividerBefore), }; @@ -1241,6 +1587,10 @@ function addBlockFromTemplate(templateKey) { block.id = uniqueBlockId(block.id); block.enabled = true; block.scopeIds = true; + block.seo = { + ...BLOCK_SEO_DEFAULTS, + ...(block.seo || {}), + }; region.blocks.push(block); state.selected = { kind: "block", regionIndex: template.regionIndex, blockIndex: region.blocks.length - 1 }; closeTemplateModal(); @@ -1268,23 +1618,29 @@ function renderEditorError(error) { } function renderEditor() { + updateAdminModeSurface(); + const region = activeRegion(); const block = activeBlock(); const isStatic = isStaticSelection(); + const isSeo = state.mode === "seo"; if (!block) { el.empty.classList.remove("hidden"); el.form.classList.add("hidden"); el.selectedRegion.textContent = "NODE.DC / Выберите блок"; - el.selectedTitle.textContent = "Контентный слой"; + el.selectedTitle.textContent = isSeo ? "SEO-слой" : "Контентный слой"; return; } el.empty.classList.add("hidden"); el.form.classList.remove("hidden"); el.form.dataset.static = String(isStatic); - el.selectedRegion.textContent = `NODE.DC / ${region.label || region.id}`; - el.selectedTitle.textContent = block.adminLabel || block.id; + el.form.dataset.mode = state.mode; + el.selectedRegion.textContent = isSeo + ? `NODE.DC / SEO / ${isStatic ? "Страница" : region.label || region.id}` + : `NODE.DC / ${region.label || region.id}`; + el.selectedTitle.textContent = isSeo ? `SEO: ${isStatic ? "страница" : block.adminLabel || block.id}` : block.adminLabel || block.id; el.id.value = block.id || ""; el.label.value = block.adminLabel || ""; el.template.value = block.template || block.type || ""; @@ -1294,15 +1650,19 @@ function renderEditor() { el.anchor.disabled = isStatic; el.enabled.disabled = isStatic; el.enabled.closest(".toggle-row").hidden = isStatic; - setStructuralControlsDisabled(isStatic); + setStructuralControlsDisabled(isStatic || isSeo); try { - renderContentFields(block); + if (isSeo) { + renderSeoFields(block); + } else { + renderContentFields(block); + } } catch (error) { renderEditorError(error); } - el.json.value = JSON.stringify(block, null, 2); + el.json.value = JSON.stringify(editorJsonPayload(block), null, 2); } function renderAll() { @@ -3703,7 +4063,9 @@ function syncBlockFromJson() { try { const parsed = JSON.parse(el.json.value); - if (isStaticSelection()) { + if (state.mode === "seo" && isStaticSelection()) { + state.page.seo = parsed; + } else if (isStaticSelection()) { state.page.staticElements = parsed; } else { const region = activeRegion(); @@ -3732,6 +4094,7 @@ async function loadPage() { state.templates = await templatesResponse.json(); ensureStaticElements(); ensureSectionsRegion(); + ensureSeoModel(); state.selected = { kind: "static" }; renderAll(); setDirty(false); @@ -3845,6 +4208,9 @@ for (const input of [el.id, el.label, el.anchor, el.enabled]) { input.addEventListener("change", syncBlockFromFields); } +el.modeContent?.addEventListener("click", () => setAdminMode("content")); +el.modeSeo?.addEventListener("click", () => setAdminMode("seo")); + el.json.addEventListener("blur", () => { if (state.filePickerActive || state.mediaUploadActive) { recoverEditorSurface(); diff --git a/admin/index.html b/admin/index.html index 7e7ffd3..fc31835 100644 --- a/admin/index.html +++ b/admin/index.html @@ -18,17 +18,14 @@
@@ -53,14 +50,14 @@ @@ -70,7 +67,7 @@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.
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.
In the deploy panel there's the option for an instant rollback.
Hit that, and you'll get the previous deployment working right away, fix locally, and push again.
Other than @plan, @build and @explore default Agent modes, we're working on a @webflow mode, made specifically of webflow knowlege, how to interact with the project and how to be effective in it.
Built on top of years writing custom code in webflow for animation.
WebGl, Threejs, GSAP and custom functionality, we collected best practices, build pipelines, and a module based systems to ensure everything works in unison.
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 Ssscript™, there'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.
The generated link already contains both a deployed version, that'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.
We're using all major models available, from OpenAI to Claude to Gemini.
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.
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.
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.
It's a multi step project. First, we use Bun to build, compress, minify and set up the project and libraries used.
Then we add to our CDN: ssscript.dev/{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's built to work with the Webflow MCP natively.
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.







































































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.
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.
In the deploy panel there's the option for an instant rollback.
Hit that, and you'll get the previous deployment working right away, fix locally, and push again.
Other than @plan, @build and @explore default Agent modes, we're working on a @webflow mode, made specifically of webflow knowlege, how to interact with the project and how to be effective in it.
Built on top of years writing custom code in webflow for animation.
WebGl, Threejs, GSAP and custom functionality, we collected best practices, build pipelines, and a module based systems to ensure everything works in unison.
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 Ssscript™, there'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.
The generated link already contains both a deployed version, that'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.
We're using all major models available, from OpenAI to Claude to Gemini.
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.
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.
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.
It's a multi step project. First, we use Bun to build, compress, minify and set up the project and libraries used.
Then we add to our CDN: ssscript.dev/{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's built to work with the Webflow MCP natively.
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.







































































NODE.DC включает Hub для входа и управления доступами, Engine для разработки workflow и прикладной логики, Ops для операционной работы, сквозного ассистента и подключаемые модули: 1C Assistant, Tender, Digital Twin, Model Viewer / Engineering Core и отраслевые приложения.
" + "answerHtml": "NODE.DC включает Hub для входа и управления доступами, Engine для разработки workflow и прикладной логики, Ops для операционной работы, сквозного ассистента и подключаемые модули: 1C Assistant, Tender, Digital Twin, Model Viewer / Engineering Core и отраслевые приложения.
", + "enabled": true }, { "question": "Зачем нужен Hub?", - "answerHtml": "Hub выполняет роль лаунчера и административной точки входа. В нем отображается каталог доступных приложений, рабочие пространства, роли, группы пользователей и права доступа к модулям платформы.
" + "answerHtml": "Hub выполняет роль лаунчера и административной точки входа. В нем отображается каталог доступных приложений, рабочие пространства, роли, группы пользователей и права доступа к модулям платформы.
", + "enabled": true }, { "question": "Как связаны Hub, Engine и Ops?", - "answerHtml": "Hub отвечает за вход, роли и доступ к приложениям. Engine используется для сборки workflow, прикладной логики, интеграций и интерфейсов. Ops принимает задачи, отчеты, статусы, результаты работы модулей и действия агентов в операционный контур.
" + "answerHtml": "Hub отвечает за вход, роли и доступ к приложениям. Engine используется для сборки workflow, прикладной логики, интеграций и интерфейсов. Ops принимает задачи, отчеты, статусы, результаты работы модулей и действия агентов в операционный контур.
", + "enabled": true }, { "question": "Что создается в Engine?", - "answerHtml": "В Engine создаются workflow, интеграционные сценарии, обработчики данных, прикладная логика, интерфейсные связки и сервисные контуры. Сборка может выполняться вручную в нодовом редакторе или через ассистента по текстовому заданию.
" + "answerHtml": "В Engine создаются workflow, интеграционные сценарии, обработчики данных, прикладная логика, интерфейсные связки и сервисные контуры. Сборка может выполняться вручную в нодовом редакторе или через ассистента по текстовому заданию.
", + "enabled": true }, { "question": "Что фиксируется в Ops?", - "answerHtml": "В Ops фиксируются задачи, статусы, карточки, отчеты, согласования, рабочие материалы, результаты агентов и данные из подключенных модулей. Слой предназначен для контроля процессов и операционной работы.
" + "answerHtml": "В Ops фиксируются задачи, статусы, карточки, отчеты, согласования, рабочие материалы, результаты агентов и данные из подключенных модулей. Слой предназначен для контроля процессов и операционной работы.
", + "enabled": true }, { "question": "Как работает сквозной ассистент?", - "answerHtml": "Ассистент работает как единый интерфейс к приложениям и данным платформы. В рамках прав доступа ему доступны задачи, процессы, кодовая база, проектные материалы, отчеты, инженерные модели и результаты работы агентов. Ассистент может отвечать на вопросы, декомпозировать задачи, готовить материалы и инициировать действия в связанных слоях.
" + "answerHtml": "Ассистент работает как единый интерфейс к приложениям и данным платформы. В рамках прав доступа ему доступны задачи, процессы, кодовая база, проектные материалы, отчеты, инженерные модели и результаты работы агентов. Ассистент может отвечать на вопросы, декомпозировать задачи, готовить материалы и инициировать действия в связанных слоях.
", + "enabled": true }, { "question": "Как работают прикладные модули?", - "answerHtml": "Прикладные модули подключаются к ролям, задачам, данным, рабочим пространствам и ассистенту. Модуль закрывает не отдельный экран, а рабочий контур: входные данные, обработку, действия, отчеты, согласования и передачу результата в Ops.
" + "answerHtml": "Прикладные модули подключаются к ролям, задачам, данным, рабочим пространствам и ассистенту. Модуль закрывает не отдельный экран, а рабочий контур: входные данные, обработку, действия, отчеты, согласования и передачу результата в Ops.
", + "enabled": true }, { "question": "Какие модули можно подключать?", - "answerHtml": "Базовый набор включает Hub, Engine и Ops. Дополнительно подключаются 1C Assistant, Tender, Digital Twin, Model Viewer / Engineering Core, интеграционные сценарии, API-модули и специализированные приложения для подразделений.
" + "answerHtml": "Базовый набор включает Hub, Engine и Ops. Дополнительно подключаются 1C Assistant, Tender, Digital Twin, Engineering Core, интеграционные сценарии, API-модули и специализированные приложения для подразделений.
", + "enabled": true }, { "question": "Поддерживаются ли инженерные форматы?", - "answerHtml": "Для инженерных и производственных сценариев предусмотрена работа с цифровыми моделями и техническими материалами. Поддерживаются BIM, STEP, STL, 3DGS / Gaussian Splatting, LAS/LAZ-облака точек и другие форматы, связанные с задачами, версиями и проектным контекстом.
" + "answerHtml": "Для инженерных и производственных сценариев предусмотрена работа с цифровыми моделями и техническими материалами. Поддерживаются BIM, STEP, STL, 3DGS / Gaussian Splatting, LAS/LAZ-облака точек и другие форматы, связанные с задачами, версиями и проектным контекстом.
", + "enabled": true }, { "question": "Как настраиваются роли и права доступа?", - "answerHtml": "Права доступа задаются через Hub. Администратор может назначать роли, формировать группы, разделять контуры доступа по подразделениям и выдавать индивидуальные права на приложения, функции и рабочие области.
" + "answerHtml": "Права доступа задаются через Hub. Администратор может назначать роли, формировать группы, разделять контуры доступа по подразделениям и выдавать индивидуальные права на приложения, функции и рабочие области.
", + "enabled": true }, { "question": "Можно ли подключать корпоративные системы?", - "answerHtml": "NODE.DC рассчитан на подключение внешних сервисов, API, внутренних приложений, 1C, баз данных, файловых хранилищ и корпоративных систем. Интеграционные сценарии собираются в Engine и передают результаты в Ops, прикладные модули или пользовательские интерфейсы.
" + "answerHtml": "NODE.DC рассчитан на подключение внешних сервисов, API, внутренних приложений, 1C, баз данных, файловых хранилищ и корпоративных систем. Интеграционные сценарии собираются в Engine и передают результаты в Ops, прикладные модули или пользовательские интерфейсы.
", + "enabled": true }, { "question": "Где размещается NODE.DC?", - "answerHtml": "Доступны облачные, выделенные, гибридные и enterprise-варианты размещения. Итоговая конфигурация зависит от требований к безопасности, составу модулей, интеграциям и политике хранения данных.
" + "answerHtml": "Доступны облачные, выделенные, гибридные и enterprise-варианты размещения. Итоговая конфигурация зависит от требований к безопасности, составу модулей, интеграциям и политике хранения данных.
", + "enabled": true }, { "question": "Как запускается пилотный контур?", - "answerHtml": "Пилотный контур формируется по составу модулей, ролей, интеграций и рабочих сценариев. Обычно подключается Hub, настраиваются базовые роли, выбирается один или несколько процессов, после чего собираются workflow, рабочие представления и отчеты.
" + "answerHtml": "Пилотный контур формируется по составу модулей, ролей, интеграций и рабочих сценариев. Обычно подключается Hub, настраиваются базовые роли, выбирается один или несколько процессов, после чего собираются workflow, рабочие представления и отчеты.
", + "enabled": true }, { "question": "Чем NODE.DC отличается от набора отдельных приложений?", - "answerHtml": "NODE.DC связывает приложения в единую платформенную архитектуру: общий доступ, роли, сквозной ассистент, связанные задачи, данные, workflow и операционный слой. Это снижает разрыв между разработкой, управлением и исполнением процессов.
" + "answerHtml": "NODE.DC связывает приложения в единую платформенную архитектуру: общий доступ, роли, сквозной ассистент, связанные задачи, данные, workflow и операционный слой. Это снижает разрыв между разработкой, управлением и исполнением процессов.
", + "enabled": true } ], "sender": { - "avatarSrc": "./assets/webflow/images/69d2db06ed4081cf9bdacdc4_federic0.avif", + "avatarSrc": "./assets/uploads/images/faq/2025-05-14-23.46.35-mquyvzbg.jpg", "avatarAlt": "Аватар NODE.DC", "name": "NODE.DC", "replyLabel": "Ответить", - "sentLabel": "Отправлено с iPhone" + "sentLabel": "Отправлено с NODE.DC MANUAL CORE" }, "scroll": { - "speed": 0.55 + "speed": 0.7 } }, "editableFields": [ @@ -1006,19 +970,19 @@ "id": "publish-cta", "type": "publishCta", "template": "publish-cta.html", - "adminLabel": "Финальный CTA перед тарифами", + "adminLabel": "Финальный CTA", "anchor": "hero", "content": { "cta": { "heading": { "muted": "Подключить.", - "middle": "Поставить задачу.", - "main": "Опубликовать." + "middle": "Собрать контур. ", + "main": "Запустить." }, - "intro": "Единый путь от разработки до продакшена.", - "detailHtml": "Настройка примерно в 12 кликов: от скачивания приложения до запуска в проекте.", + "intro": "Единый путь от доступа к модулю до рабочего контура предприятия. Hub для входа, Engine для сборки, Ops для управления.", + "detailHtml": "Модульный доступ, документация и рабочие пространства.\nПодключение прикладных модулей и ролей по контурам.\nЗакрытый инвайт для пилотных внедрений.", "href": "index.html#hero", - "buttonLabel": "Встать в лист ожидания" + "buttonLabel": "Запросить инвайт " } }, "editableFields": [ @@ -1641,7 +1605,7 @@ } } ], - "enabled": true + "enabled": false } }, { @@ -1657,16 +1621,16 @@ "template": "screenshot-cards.html", "adminLabel": "Карточки скриншотов", "anchor": null, - "enabled": true, + "enabled": false, "content": { "galleryItems": [ { "id": "one-click-publish-png", "windowTitle": "публикация-в-один-клик.png", - "imageSrc": "./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201.avif", - "imageSrcset": "./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201-p-500.avif 500w, ./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201.avif 1200w", + "imageSrc": "./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201.avif", + "imageSrcset": "./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201-p-500.avif 500w, ./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201.avif 1200w", "imageAlt": "", - "iconSrc": "./assets/webflow/images/69aab66f030013f2c7177d78_mov-file.avif", + "iconSrc": "./assets/site/images/69aab66f030013f2c7177d78_mov-file.avif", "iconAlt": "Иконка MOV-файла.", "folderLabel": "публикация-в-один-клик.png", "enabled": true @@ -1674,10 +1638,10 @@ { "id": "complete-code-editor-webp", "windowTitle": "полноценный-редактор-кода.webp", - "imageSrc": "./assets/webflow/images/69d3fba72116e87a8d145059_Frame%203174.avif", - "imageSrcset": "./assets/webflow/images/69d3fba72116e87a8d145059_Frame%203174-p-500.avif 500w, ./assets/webflow/images/69d3fba72116e87a8d145059_Frame%203174.avif 1200w", + "imageSrc": "./assets/site/images/69d3fba72116e87a8d145059_Frame%203174.avif", + "imageSrcset": "./assets/site/images/69d3fba72116e87a8d145059_Frame%203174-p-500.avif 500w, ./assets/site/images/69d3fba72116e87a8d145059_Frame%203174.avif 1200w", "imageAlt": "", - "iconSrc": "./assets/webflow/images/69aab66f030013f2c7177d78_mov-file.avif", + "iconSrc": "./assets/site/images/69aab66f030013f2c7177d78_mov-file.avif", "iconAlt": "Иконка MOV-файла.", "folderLabel": "полноценный-редактор-кода.webp", "enabled": true @@ -1685,32 +1649,32 @@ { "id": "ai-dock-mode-jpg", "windowTitle": "ИИ-док-режим.jpg", - "imageSrc": "./assets/webflow/images/69d3fac0d22182f930e32ec6_Frame%203175.avif", - "imageSrcset": "./assets/webflow/images/69d3fac0d22182f930e32ec6_Frame%203175-p-500.avif 500w, ./assets/webflow/images/69d3fac0d22182f930e32ec6_Frame%203175.avif 1200w", + "imageSrc": "./assets/site/images/69d3fac0d22182f930e32ec6_Frame%203175.avif", + "imageSrcset": "./assets/site/images/69d3fac0d22182f930e32ec6_Frame%203175-p-500.avif 500w, ./assets/site/images/69d3fac0d22182f930e32ec6_Frame%203175.avif 1200w", "imageAlt": "", - "iconSrc": "./assets/webflow/images/69aab66f030013f2c7177d78_mov-file.avif", + "iconSrc": "./assets/site/images/69aab66f030013f2c7177d78_mov-file.avif", "iconAlt": "Иконка MOV-файла.", "folderLabel": "ИИ-док-режим.jpg", "enabled": true }, { - "id": "deep-webflow-connection-webp", - "windowTitle": "глубокая-интеграция-webflow.webp", - "imageSrc": "./assets/webflow/images/69d3dc83a417451438caec72_Frame%203173.avif", - "imageSrcset": "./assets/webflow/images/69d3dc83a417451438caec72_Frame%203173-p-500.avif 500w, ./assets/webflow/images/69d3dc83a417451438caec72_Frame%203173.avif 1200w", + "id": "platform-integration-webp", + "windowTitle": "глубокая-интеграция-platform-map.webp", + "imageSrc": "./assets/site/images/69d3dc83a417451438caec72_Frame%203173.avif", + "imageSrcset": "./assets/site/images/69d3dc83a417451438caec72_Frame%203173-p-500.avif 500w, ./assets/site/images/69d3dc83a417451438caec72_Frame%203173.avif 1200w", "imageAlt": "", - "iconSrc": "./assets/webflow/images/69aab66f030013f2c7177d78_mov-file.avif", + "iconSrc": "./assets/site/images/69aab66f030013f2c7177d78_mov-file.avif", "iconAlt": "Иконка MOV-файла.", - "folderLabel": "глубокая-интеграция-webflow.webp", + "folderLabel": "глубокая-интеграция-platform-map.webp", "enabled": true }, { "id": "install-setup-and-run", "windowTitle": "установка-настройка-запуск.jpg", - "imageSrc": "./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201.avif", - "imageSrcset": "./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201-p-500.avif 500w, ./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201.avif 1200w", + "imageSrc": "./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201.avif", + "imageSrcset": "./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201-p-500.avif 500w, ./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201.avif 1200w", "imageAlt": "", - "iconSrc": "./assets/webflow/images/69aab66f030013f2c7177d78_mov-file.avif", + "iconSrc": "./assets/site/images/69aab66f030013f2c7177d78_mov-file.avif", "iconAlt": "Иконка MOV-файла.", "folderLabel": "установка-настройка-запуск.jpg", "enabled": true @@ -1777,10 +1741,10 @@ "itemTemplate": { "id": "new-media-item", "windowTitle": "новый-файл.png", - "imageSrc": "./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201.avif", - "imageSrcset": "./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201-p-500.avif 500w, ./assets/webflow/images/69d3dc9256192179afb4cfdc_Frame%201.avif 1200w", + "imageSrc": "./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201.avif", + "imageSrcset": "./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201-p-500.avif 500w, ./assets/site/images/69d3dc9256192179afb4cfdc_Frame%201.avif 1200w", "imageAlt": "", - "iconSrc": "./assets/webflow/images/69aab66f030013f2c7177d78_mov-file.avif", + "iconSrc": "./assets/site/images/69aab66f030013f2c7177d78_mov-file.avif", "iconAlt": "Иконка MOV-файла.", "folderLabel": "новый-файл.png", "enabled": true @@ -1808,10 +1772,10 @@ "messagePlaceholder": "Сообщение (необязательно)", "namePlaceholder": "Ваше имя*", "emailPlaceholder": "Email для регистрации*", - "submitLabel": "Встать в лист ожидания", + "submitLabel": "Подать заявку", "successHeading": "Заявка принята. Спасибо.", "successTextHtml": "Мы скоро свяжемся.Единая точка входа: каталог приложений, рабочие пространства, роли, группы и права доступа.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1832,8 +1796,8 @@ "id": "engine-workflows-1782000000001", "name": "Engine Workflows", "bodyHtml": "Нодовые workflow, обработчики данных, интеграционная логика и сборка прикладных контуров.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1841,8 +1805,8 @@ "id": "ops-cards-1782000000002", "name": "Ops Cards", "bodyHtml": "Операционные карточки, статусы, согласования, отчеты агентов и результаты выполнения задач.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1850,8 +1814,8 @@ "id": "1c-assistant-1782000000003", "name": "1C Assistant", "bodyHtml": "Связка с 1C, разбор документов, поиск данных, сценарии согласований и передача результата в Ops.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1859,8 +1823,8 @@ "id": "tender-agent-1782000000004", "name": "Tender Agent", "bodyHtml": "Тендерные подборки, проверка требований, документы, дедлайны и агентные отчеты по процедурам.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1868,8 +1832,8 @@ "id": "digital-twin-1782000000005", "name": "Digital Twin", "bodyHtml": "Цифровые модели объектов, версии, проектный контекст, инженерные данные и связанные рабочие процессы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1877,8 +1841,8 @@ "id": "model-viewer-1782000000006", "name": "Model Viewer", "bodyHtml": "Просмотр BIM, STEP, STL, 3DGS, облаков точек и инженерных материалов внутри единого контура.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1886,8 +1850,8 @@ "id": "engineering-core-1782000000007", "name": "Engineering Core", "bodyHtml": "Обработка технических форматов, связка моделей с задачами, версиями, отчетами и согласованиями.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1895,8 +1859,8 @@ "id": "mcp-gateway-1782000000008", "name": "MCP Gateway", "bodyHtml": "Контекстный шлюз для агентов: проектные данные, инструменты, кодовая база и внешние сервисы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1904,8 +1868,8 @@ "id": "api-contracts-1782000000009", "name": "API Contracts", "bodyHtml": "Контракты API, схемы данных, webhooks, события, интеграции и контроль совместимости между модулями.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1913,8 +1877,8 @@ "id": "kubernetes-1782000000010", "name": "Kubernetes", "bodyHtml": "Оркестрация сервисов, изоляция окружений, scaling policies, probes, secrets и управляемый rollout.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1922,8 +1886,8 @@ "id": "cloudflare-edge-1782000000011", "name": "Cloudflare Edge", "bodyHtml": "CDN, WAF, R2-хранилище, edge routing, cache policies и защита публичного периметра.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1931,8 +1895,8 @@ "id": "zero-trust-1782000000012", "name": "Zero Trust", "bodyHtml": "Доступ по принципу least privilege: SSO, MFA, device posture, audit trail и сегментация контуров.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1940,8 +1904,8 @@ "id": "security-matrix-1782000000013", "name": "Security Matrix", "bodyHtml": "Ролевая матрица, группы, политики доступа, ограничения функций и контроль административных действий.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1949,8 +1913,8 @@ "id": "rbac-policies-1782000000014", "name": "RBAC Policies", "bodyHtml": "Права на приложения, рабочие области, действия агентов, документы, отчеты и инженерные данные.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1958,8 +1922,8 @@ "id": "audit-log-1782000000015", "name": "Audit Log", "bodyHtml": "Журнал действий пользователей, агентов и сервисов: изменения, статусы, запросы, публикации и доступы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1967,8 +1931,8 @@ "id": "secrets-vault-1782000000016", "name": "Secrets Vault", "bodyHtml": "Хранение токенов, ключей API, webhook-секретов и конфигураций интеграций в защищенном контуре.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1976,8 +1940,8 @@ "id": "postgres-cluster-1782000000017", "name": "Postgres Cluster", "bodyHtml": "Основная транзакционная база для проектов, ролей, задач, статусов, событий и конфигураций платформы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1985,8 +1949,8 @@ "id": "redis-queue-1782000000018", "name": "Redis Queue", "bodyHtml": "Очереди фоновых задач, статусы выполнения, debounce событий, кэширование и быстрые агентные операции.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -1994,8 +1958,8 @@ "id": "vector-index-1782000000019", "name": "Vector Index", "bodyHtml": "Индексация проектных материалов, документации, отчетов и контекста для ассистента и поиска.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2003,8 +1967,8 @@ "id": "local-models-1782000000020", "name": "Local Models", "bodyHtml": "Контур локальных моделей для приватных сценариев, инженерных данных и корпоративных ограничений.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2012,8 +1976,8 @@ "id": "model-routing-1782000000021", "name": "Model Routing", "bodyHtml": "Маршрутизация задач между облачными и локальными моделями по типу запроса, правам и стоимости.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2021,8 +1985,8 @@ "id": "agent-runtime-1782000000022", "name": "Agent Runtime", "bodyHtml": "Запуск ассистентов, выполнение действий, контроль инструментов, журналирование и передача результата в Ops.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2030,8 +1994,8 @@ "id": "observability-1782000000023", "name": "Observability", "bodyHtml": "Метрики, логи, трассировка, health checks, алерты и диагностика сервисов платформы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2039,8 +2003,8 @@ "id": "backups-1782000000024", "name": "Backups", "bodyHtml": "Резервные копии данных, конфигураций, файлов, моделей, журналов и сценариев восстановления.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2048,8 +2012,8 @@ "id": "ci-cd-1782000000025", "name": "CI CD", "bodyHtml": "Сборка, проверки, preview-окружения, controlled rollout, rollback и публикация клиентских модулей.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2057,8 +2021,8 @@ "id": "terraform-1782000000026", "name": "Terraform", "bodyHtml": "Описание инфраструктуры кодом: окружения, сети, хранилища, политики, сервисы и переменные.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2066,8 +2030,8 @@ "id": "object-storage-1782000000027", "name": "Object Storage", "bodyHtml": "Хранилище файлов, изображений, моделей, отчетов, txt-материалов и артефактов рабочих процессов.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2075,8 +2039,8 @@ "id": "bim-pipeline-1782000000028", "name": "BIM Pipeline", "bodyHtml": "Загрузка BIM-моделей, версии, разметка, связи с задачами и публикация в рабочие пространства.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2084,8 +2048,8 @@ "id": "step-import-1782000000029", "name": "STEP Import", "bodyHtml": "Импорт STEP-моделей, технические материалы, карточки проверки и привязка к инженерным задачам.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2093,8 +2057,8 @@ "id": "stl-review-1782000000030", "name": "STL Review", "bodyHtml": "Проверка STL-геометрии, заметки, версии, визуальный контроль и подготовка производственных материалов.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2102,8 +2066,8 @@ "id": "3dgs-assets-1782000000031", "name": "3DGS Assets", "bodyHtml": "Gaussian Splatting сцены, визуальные реконструкции объектов и связь с проектным контекстом.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2111,8 +2075,8 @@ "id": "las-laz-clouds-1782000000032", "name": "LAS LAZ Clouds", "bodyHtml": "Облака точек, съемка, координатные данные, версии и инженерная привязка к задачам.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2120,8 +2084,8 @@ "id": "webhooks-1782000000033", "name": "Webhooks", "bodyHtml": "Событийные сценарии: входящие запросы, уведомления, автоматические действия и передача статусов.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2129,8 +2093,8 @@ "id": "docs-portal-1782000000034", "name": "Docs Portal", "bodyHtml": "Документация, регламенты, инструкции, технические заметки и материалы для команд внедрения.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2138,25 +2102,25 @@ "id": "stack-map-1782000000035", "name": "Stack Map", "bodyHtml": "Карта платформенного стека: Hub, Engine, Ops, агенты, данные, интеграции, безопасность и инфраструктура.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true } ], "accessCard": { "enabled": true, - "iconSrc": "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg", + "iconSrc": "./assets/uploads/images/hero-waitlist/dclogo_white_alpha-mquue8ar.png", "iconAlt": "Иконка NODE.DC", - "wordmarkSrc": "./assets/webflow/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc", + "wordmarkSrc": "./assets/site/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc", "wordmarkAlt": "Логотип NODE.DC", - "release": "Бета-релиз: июль 2026", - "heading": "Ранний доступ", - "description": "Кастомный код, MCP и ИИ-агенты для Webflow в одном рабочем контуре." + "release": "Selfhost платформа ", + "heading": "Запросить DEMO", + "description": "NODE.DC - платформа для задач, процессов, данных, агентов и инженерных модулей." }, "legal": { "enabled": true, - "html": "Политика конфиденциальности • Политика cookieЕдиная точка входа: каталог приложений, рабочие пространства, роли, группы и права доступа.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2880,8 +3034,8 @@ "id": "engine-workflows-1782000000001", "name": "Engine Workflows", "bodyHtml": "Нодовые workflow, обработчики данных, интеграционная логика и сборка прикладных контуров.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2889,8 +3043,8 @@ "id": "ops-cards-1782000000002", "name": "Ops Cards", "bodyHtml": "Операционные карточки, статусы, согласования, отчеты агентов и результаты выполнения задач.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2898,8 +3052,8 @@ "id": "1c-assistant-1782000000003", "name": "1C Assistant", "bodyHtml": "Связка с 1C, разбор документов, поиск данных, сценарии согласований и передача результата в Ops.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2907,8 +3061,8 @@ "id": "tender-agent-1782000000004", "name": "Tender Agent", "bodyHtml": "Тендерные подборки, проверка требований, документы, дедлайны и агентные отчеты по процедурам.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2916,8 +3070,8 @@ "id": "digital-twin-1782000000005", "name": "Digital Twin", "bodyHtml": "Цифровые модели объектов, версии, проектный контекст, инженерные данные и связанные рабочие процессы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2925,8 +3079,8 @@ "id": "model-viewer-1782000000006", "name": "Model Viewer", "bodyHtml": "Просмотр BIM, STEP, STL, 3DGS, облаков точек и инженерных материалов внутри единого контура.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2934,8 +3088,8 @@ "id": "engineering-core-1782000000007", "name": "Engineering Core", "bodyHtml": "Обработка технических форматов, связка моделей с задачами, версиями, отчетами и согласованиями.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2943,8 +3097,8 @@ "id": "mcp-gateway-1782000000008", "name": "MCP Gateway", "bodyHtml": "Контекстный шлюз для агентов: проектные данные, инструменты, кодовая база и внешние сервисы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2952,8 +3106,8 @@ "id": "api-contracts-1782000000009", "name": "API Contracts", "bodyHtml": "Контракты API, схемы данных, webhooks, события, интеграции и контроль совместимости между модулями.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2961,8 +3115,8 @@ "id": "kubernetes-1782000000010", "name": "Kubernetes", "bodyHtml": "Оркестрация сервисов, изоляция окружений, scaling policies, probes, secrets и управляемый rollout.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2970,8 +3124,8 @@ "id": "cloudflare-edge-1782000000011", "name": "Cloudflare Edge", "bodyHtml": "CDN, WAF, R2-хранилище, edge routing, cache policies и защита публичного периметра.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2979,8 +3133,8 @@ "id": "zero-trust-1782000000012", "name": "Zero Trust", "bodyHtml": "Доступ по принципу least privilege: SSO, MFA, device posture, audit trail и сегментация контуров.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2988,8 +3142,8 @@ "id": "security-matrix-1782000000013", "name": "Security Matrix", "bodyHtml": "Ролевая матрица, группы, политики доступа, ограничения функций и контроль административных действий.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -2997,8 +3151,8 @@ "id": "rbac-policies-1782000000014", "name": "RBAC Policies", "bodyHtml": "Права на приложения, рабочие области, действия агентов, документы, отчеты и инженерные данные.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3006,8 +3160,8 @@ "id": "audit-log-1782000000015", "name": "Audit Log", "bodyHtml": "Журнал действий пользователей, агентов и сервисов: изменения, статусы, запросы, публикации и доступы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3015,8 +3169,8 @@ "id": "secrets-vault-1782000000016", "name": "Secrets Vault", "bodyHtml": "Хранение токенов, ключей API, webhook-секретов и конфигураций интеграций в защищенном контуре.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3024,8 +3178,8 @@ "id": "postgres-cluster-1782000000017", "name": "Postgres Cluster", "bodyHtml": "Основная транзакционная база для проектов, ролей, задач, статусов, событий и конфигураций платформы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3033,8 +3187,8 @@ "id": "redis-queue-1782000000018", "name": "Redis Queue", "bodyHtml": "Очереди фоновых задач, статусы выполнения, debounce событий, кэширование и быстрые агентные операции.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3042,8 +3196,8 @@ "id": "vector-index-1782000000019", "name": "Vector Index", "bodyHtml": "Индексация проектных материалов, документации, отчетов и контекста для ассистента и поиска.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3051,8 +3205,8 @@ "id": "local-models-1782000000020", "name": "Local Models", "bodyHtml": "Контур локальных моделей для приватных сценариев, инженерных данных и корпоративных ограничений.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3060,8 +3214,8 @@ "id": "model-routing-1782000000021", "name": "Model Routing", "bodyHtml": "Маршрутизация задач между облачными и локальными моделями по типу запроса, правам и стоимости.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3069,8 +3223,8 @@ "id": "agent-runtime-1782000000022", "name": "Agent Runtime", "bodyHtml": "Запуск ассистентов, выполнение действий, контроль инструментов, журналирование и передача результата в Ops.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3078,8 +3232,8 @@ "id": "observability-1782000000023", "name": "Observability", "bodyHtml": "Метрики, логи, трассировка, health checks, алерты и диагностика сервисов платформы.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3087,8 +3241,8 @@ "id": "backups-1782000000024", "name": "Backups", "bodyHtml": "Резервные копии данных, конфигураций, файлов, моделей, журналов и сценариев восстановления.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3096,8 +3250,8 @@ "id": "ci-cd-1782000000025", "name": "CI CD", "bodyHtml": "Сборка, проверки, preview-окружения, controlled rollout, rollback и публикация клиентских модулей.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3105,8 +3259,8 @@ "id": "terraform-1782000000026", "name": "Terraform", "bodyHtml": "Описание инфраструктуры кодом: окружения, сети, хранилища, политики, сервисы и переменные.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3114,8 +3268,8 @@ "id": "object-storage-1782000000027", "name": "Object Storage", "bodyHtml": "Хранилище файлов, изображений, моделей, отчетов, txt-материалов и артефактов рабочих процессов.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3123,8 +3277,8 @@ "id": "bim-pipeline-1782000000028", "name": "BIM Pipeline", "bodyHtml": "Загрузка BIM-моделей, версии, разметка, связи с задачами и публикация в рабочие пространства.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3132,8 +3286,8 @@ "id": "step-import-1782000000029", "name": "STEP Import", "bodyHtml": "Импорт STEP-моделей, технические материалы, карточки проверки и привязка к инженерным задачам.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3141,8 +3295,8 @@ "id": "stl-review-1782000000030", "name": "STL Review", "bodyHtml": "Проверка STL-геометрии, заметки, версии, визуальный контроль и подготовка производственных материалов.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3150,8 +3304,8 @@ "id": "3dgs-assets-1782000000031", "name": "3DGS Assets", "bodyHtml": "Gaussian Splatting сцены, визуальные реконструкции объектов и связь с проектным контекстом.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3159,8 +3313,8 @@ "id": "las-laz-clouds-1782000000032", "name": "LAS LAZ Clouds", "bodyHtml": "Облака точек, съемка, координатные данные, версии и инженерная привязка к задачам.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3168,8 +3322,8 @@ "id": "webhooks-1782000000033", "name": "Webhooks", "bodyHtml": "Событийные сценарии: входящие запросы, уведомления, автоматические действия и передача статусов.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3177,8 +3331,8 @@ "id": "docs-portal-1782000000034", "name": "Docs Portal", "bodyHtml": "Документация, регламенты, инструкции, технические заметки и материалы для команд внедрения.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true }, @@ -3186,8 +3340,8 @@ "id": "stack-map-1782000000035", "name": "Stack Map", "bodyHtml": "Карта платформенного стека: Hub, Engine, Ops, агенты, данные, интеграции, безопасность и инфраструктура.
", - "iconSrc": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif", - "iconSrcset": "./assets/webflow/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/webflow/images/69a9fb87bc56142371745926_txt-file.avif 1024w", + "iconSrc": "./assets/site/images/69a9fb87bc56142371745926_txt-file.avif", + "iconSrcset": "./assets/site/images/69a9fb87bc56142371745926_txt-file-p-500.avif 500w, ./assets/site/images/69a9fb87bc56142371745926_txt-file.avif 1024w", "iconAlt": "Иконка TXT-файла", "enabled": true } @@ -3196,7 +3350,7 @@ "enabled": true, "iconSrc": "./assets/uploads/images/hero-waitlist/dclogo_white_alpha-mquue8ar.png", "iconAlt": "Иконка NODE.DC", - "wordmarkSrc": "./assets/webflow/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc", + "wordmarkSrc": "./assets/site/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc", "wordmarkAlt": "Логотип NODE.DC", "release": "Selfhost платформа ", "heading": "Запросить DEMO", @@ -3204,7 +3358,7 @@ }, "legal": { "enabled": true, - "html": "Политика конфиденциальности • Политика cookie