Update NODEDC admin content and modules

This commit is contained in:
dcconstructions 2026-06-27 11:01:11 +03:00
parent 69e2b05fc2
commit bc0da49506
24 changed files with 1320 additions and 1049 deletions

View File

@ -1214,12 +1214,19 @@ body[data-file-picker-active="true"] .editor {
} }
.collection-drag-handle { .collection-drag-handle {
letter-spacing: -0.12em;
cursor: grab; cursor: grab;
touch-action: none; touch-action: none;
user-select: none; user-select: none;
} }
.collection-drag-handle svg {
display: block;
width: 0.75rem;
height: 1.125rem;
fill: currentColor;
opacity: 0.78;
}
.collection-drag-handle:active { .collection-drag-handle:active {
cursor: grabbing; cursor: grabbing;
} }

View File

@ -93,7 +93,7 @@ const STATIC_FALLBACK = {
{ {
enabled: true, enabled: true,
title: "NODE.DC", title: "NODE.DC",
href: "#hero", href: "javascript:void(0)",
linkTarget: "", linkTarget: "",
targetId: "app-data", targetId: "app-data",
iconSrc: "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg", iconSrc: "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg",
@ -105,7 +105,7 @@ const STATIC_FALLBACK = {
{ {
enabled: true, enabled: true,
title: "Корзина", title: "Корзина",
href: "", href: "javascript:void(0)",
linkTarget: "", linkTarget: "",
targetId: "", targetId: "",
iconSrc: "./assets/webflow/images/69a9ae818a76c773dc3cf7bc_trash.avif", iconSrc: "./assets/webflow/images/69a9ae818a76c773dc3cf7bc_trash.avif",
@ -166,7 +166,7 @@ const STATIC_FALLBACK = {
{ {
enabled: true, enabled: true,
title: "Новое приложение", title: "Новое приложение",
href: "#hero", href: "javascript:void(0)",
linkTarget: "", linkTarget: "",
targetId: "", targetId: "",
iconSrc: "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg", iconSrc: "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg",
@ -207,7 +207,7 @@ const GROUP_COPY = {
"Верхний информационный блок": "Верхняя пара: длинный текст и крупный заголовок над медиаслайдером.", "Верхний информационный блок": "Верхняя пара: длинный текст и крупный заголовок над медиаслайдером.",
"Нижний информационный блок": "Нижняя зеркальная пара: крупный заголовок и длинный текст под медиаслайдером.", "Нижний информационный блок": "Нижняя зеркальная пара: крупный заголовок и длинный текст под медиаслайдером.",
"Тезисы первого экрана": "Четыре смысловых тезиса вокруг формы раннего доступа.", "Тезисы первого экрана": "Четыре смысловых тезиса вокруг формы раннего доступа.",
"Карточка доступа": "Логотипы, тексты и видимость центрального окна приложения.", "Карточка доступа": "Единый компонент окна заявки: редактируется здесь и повторяется в нижнем блоке запроса DEMO.",
Форма: "Плейсхолдеры, кнопки, success/failure состояния формы.", Форма: "Плейсхолдеры, кнопки, success/failure состояния формы.",
"Юридический блок": "Политики, права и нижний текст формы.", "Юридический блок": "Политики, права и нижний текст формы.",
"Видео-окно": "Окно демо-видео и подключенный медиа-файл.", "Видео-окно": "Окно демо-видео и подключенный медиа-файл.",
@ -220,11 +220,16 @@ const GROUP_COPY = {
Отправитель: "Профиль отправителя в FAQ: аватар, имя и подписи письма.", Отправитель: "Профиль отправителя в FAQ: аватар, имя и подписи письма.",
FAQ: "Вопросы и ответы mail-интерфейса. Каждый пункт можно добавить, удалить и переставить.", FAQ: "Вопросы и ответы mail-интерфейса. Каждый пункт можно добавить, удалить и переставить.",
CTA: "Финальный призыв к действию: заголовок, пояснение, кнопка и ссылка.", CTA: "Финальный призыв к действию: заголовок, пояснение, кнопка и ссылка.",
Тарифы: "Верхняя часть тарифной таблицы: заголовки, планы, цены, кнопки и примечания.", "Центральный текст": "Отдельный центрированный текстовый блок: надзаголовок, крупная строка и три подписи.",
Тарифы: "Окно тарифной таблицы: планы, цены, кнопки и примечания.",
"Строки тарифов": "Повторяемые строки тарифной таблицы и значения по каждому плану.", "Строки тарифов": "Повторяемые строки тарифной таблицы и значения по каждому плану.",
"Медиа-галерея": "Окна с изображениями, подписи файлов и связанные иконки.", "Медиа-галерея": "Окна с изображениями, подписи файлов и связанные иконки.",
"Карточки скриншотов": "Скриншоты в виде окон и файлов: каждый элемент можно скрыть, переставить, дублировать или удалить.",
"TXT-файлы": "Список файлов листа ожидания: название окна, подпись и текст внутри файла.", "TXT-файлы": "Список файлов листа ожидания: название окна, подпись и текст внутри файла.",
Футер: "Нижняя навигация, контактные ссылки, политики и брендовый блок.", Футер: "Брендовый блок, копирайт и базовые ассеты футера.",
"Навигация футера": "Ссылки навигационной колонки футера. Каждый пункт можно скрыть, переставить, дублировать или удалить.",
"Контактные ссылки": "Ссылки контактной колонки футера. Каждый пункт можно скрыть, переставить, дублировать или удалить.",
Политики: "Нижняя строка политик и условия отображения.",
Контент: "Остальные typed-поля выбранного блока.", Контент: "Остальные typed-поля выбранного блока.",
}; };
@ -335,7 +340,7 @@ function inferFieldGroup(path) {
if (path.startsWith("content.cards.")) return "Тезисы первого экрана"; if (path.startsWith("content.cards.")) return "Тезисы первого экрана";
if (path.startsWith("content.app.") || path.startsWith("content.accessCard.")) return "Карточка доступа"; if (path.startsWith("content.app.") || path.startsWith("content.accessCard.")) return "Карточка доступа";
if (path.startsWith("content.form.")) return "Форма"; if (path.startsWith("content.form.")) return "Форма";
if (path === "content.legalHtml") return "Юридический блок"; if (path === "content.legalHtml" || path.startsWith("content.legal.")) return "Юридический блок";
if (path === "content.windowTitle" || path === "content.videoSrc") return "Видео-окно"; if (path === "content.windowTitle" || path === "content.videoSrc") return "Видео-окно";
if (path.startsWith("content.features.")) return "Пункты"; if (path.startsWith("content.features.")) return "Пункты";
if (path.startsWith("content.scroll.")) return "Скролл"; if (path.startsWith("content.scroll.")) return "Скролл";
@ -347,8 +352,11 @@ function inferFieldGroup(path) {
if (path.startsWith("content.cta.")) return "CTA"; if (path.startsWith("content.cta.")) return "CTA";
if (path.startsWith("content.plans.") || path.startsWith("content.pricing.")) return "Тарифы"; if (path.startsWith("content.plans.") || path.startsWith("content.pricing.")) return "Тарифы";
if (path.startsWith("content.pricingCells.")) return "Строки тарифов"; if (path.startsWith("content.pricingCells.")) return "Строки тарифов";
if (path.startsWith("content.galleryItems.")) return "Медиа-галерея"; if (path === "content.galleryItems" || path.startsWith("content.galleryItems.")) return "Карточки скриншотов";
if (path.startsWith("content.files.")) return "TXT-файлы"; if (path === "content.filesEnabled" || path.startsWith("content.files.")) return "TXT-файлы";
if (path === "content.footer.policyEnabled" || path === "content.footer.policyHtml") return "Политики";
if (path.startsWith("content.footer.navLinks.")) return "Навигация футера";
if (path.startsWith("content.footer.contactLinks.")) return "Контактные ссылки";
if (path.startsWith("content.footer.")) return "Футер"; if (path.startsWith("content.footer.")) return "Футер";
if (path.startsWith("content.heading.") || path === "content.introHtml") return "Заголовок"; if (path.startsWith("content.heading.") || path === "content.introHtml") return "Заголовок";
return "Контент"; return "Контент";
@ -359,7 +367,7 @@ function createDefaultDockItems(dock = {}, assets = {}) {
{ {
enabled: true, enabled: true,
title: "NODE.DC", title: "NODE.DC",
href: "#hero", href: "javascript:void(0)",
linkTarget: "", linkTarget: "",
targetId: dock.appTarget || "app-data", targetId: dock.appTarget || "app-data",
iconSrc: assets.appIconSrc || STATIC_FALLBACK.content.assets.appIconSrc, iconSrc: assets.appIconSrc || STATIC_FALLBACK.content.assets.appIconSrc,
@ -371,7 +379,7 @@ function createDefaultDockItems(dock = {}, assets = {}) {
{ {
enabled: true, enabled: true,
title: "Корзина", title: "Корзина",
href: "", href: "javascript:void(0)",
linkTarget: "", linkTarget: "",
targetId: "", targetId: "",
iconSrc: "./assets/webflow/images/69a9ae818a76c773dc3cf7bc_trash.avif", iconSrc: "./assets/webflow/images/69a9ae818a76c773dc3cf7bc_trash.avif",
@ -575,6 +583,7 @@ function blockIcon(block) {
const type = block.type || ""; const type = block.type || "";
if (id === "static-elements") return "SE"; if (id === "static-elements") return "SE";
if (id.includes("gallery") || id.includes("screenshot")) return "SC";
if (id.includes("hero")) return "H"; if (id.includes("hero")) return "H";
if (id.includes("feature") || id.includes("video")) return "V"; if (id.includes("feature") || id.includes("video")) return "V";
if (id.includes("component")) return "C"; if (id.includes("component")) return "C";
@ -1797,13 +1806,13 @@ function renderCollectionField({ block, editableField, grid }) {
dragHandle.type = "button"; dragHandle.type = "button";
dragHandle.title = "Перетащить элемент"; dragHandle.title = "Перетащить элемент";
dragHandle.setAttribute("aria-label", "Перетащить элемент"); dragHandle.setAttribute("aria-label", "Перетащить элемент");
dragHandle.textContent = "⋮⋮"; dragHandle.innerHTML =
'<svg viewBox="0 0 12 18" aria-hidden="true" focusable="false"><circle cx="4" cy="4" r="1.25"></circle><circle cx="8" cy="4" r="1.25"></circle><circle cx="4" cy="9" r="1.25"></circle><circle cx="8" cy="9" r="1.25"></circle><circle cx="4" cy="14" r="1.25"></circle><circle cx="8" cy="14" r="1.25"></circle></svg>';
dragHandle.addEventListener("click", (event) => { dragHandle.addEventListener("click", (event) => {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
}); });
dragHandle.addEventListener("pointerdown", (event) => startCollectionPointerDrag(event, details, items, index, rerender)); dragHandle.addEventListener("pointerdown", (event) => startCollectionPointerDrag(event, details, items, index, rerender));
controls.append(dragHandle);
if (hasVisibilityToggle) { if (hasVisibilityToggle) {
if (!Object.prototype.hasOwnProperty.call(item, "enabled")) item.enabled = true; if (!Object.prototype.hasOwnProperty.call(item, "enabled")) item.enabled = true;
@ -1865,6 +1874,7 @@ function renderCollectionField({ block, editableField, grid }) {
}); });
controls.append(button); controls.append(button);
}); });
controls.append(dragHandle);
summary.append(summaryTitle, controls); summary.append(summaryTitle, controls);
body.className = "collection-item-body"; body.className = "collection-item-body";

View File

@ -1,3 +1,5 @@
*{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img{pointer-events:none}.text-scrollable{scrollbar-width:none;-ms-overflow-style:none}.text-scrollable::-webkit-scrollbar{display:none}.circle .x-icon{opacity:0}.circle:hover .x-icon{opacity:1}[data-css=fade-tb]{mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);-webkit-mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);mask-size:100% 100%;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;-webkit-mask-repeat:no-repeat}.current .mail-item{background-color:#3d3d3dc9}[data-module=""]{outline:10px solid red}[data-module=btn]>div>div>div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=btn]:hover>div>div>div>div{transform:translateY(-1.3em)}[data-module=link]{transition:opacity .1s ease-in-out}[data-module=link] div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=link]:hover{opacity:.6!important}[data-module=link]:hover div>div{transform:translateY(-.65em)}[data-module=apple-icon]:focus [data-txt]{position:relative}[data-module=apple-icon]:focus [data-txt]:before{content:"";position:absolute;z-index:-1;background-color:#0059d0;border-radius:.3em;width:120%;height:120%;top:-10%;left:-10%}[data-module=notification-w]{--notification-height:98%}[data-module=notification-w]>div:nth-child(2){transform:translateY(calc(-1*var(--notification-height)));z-index:2}[data-module=notification-w]>div:nth-child(3){transform:translateY(calc(-2*var(--notification-height)));z-index:3}[data-module=notification-w]:hover{--notification-height:98%}[data-module=notification-w]:hover>div:nth-child(2){z-index:2;transform:translateY(0)}[data-module=notification-w]:hover>div:nth-child(3){z-index:3;transform:translateY(0)}[data-module=notification]{transition:transform .3s cubic-bezier(.22,1,.36,1)} *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img{pointer-events:none}.text-scrollable{scrollbar-width:none;-ms-overflow-style:none}.text-scrollable::-webkit-scrollbar{display:none}.circle .x-icon{opacity:0}.circle:hover .x-icon{opacity:1}[data-css=fade-tb]{mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);-webkit-mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);mask-size:100% 100%;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;-webkit-mask-repeat:no-repeat}.current .mail-item{background-color:#3d3d3dc9}[data-module=""]{outline:10px solid red}[data-module=btn]>div>div>div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=btn]:hover>div>div>div>div{transform:translateY(-1.3em)}[data-module=link]{transition:opacity .1s ease-in-out}[data-module=link] div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=link]:hover{opacity:.6!important}[data-module=link]:hover div>div{transform:translateY(-.65em)}[data-module=apple-icon]:focus [data-txt]{position:relative}[data-module=apple-icon]:focus [data-txt]:before{content:"";position:absolute;z-index:-1;background-color:#0059d0;border-radius:.3em;width:120%;height:120%;top:-10%;left:-10%}[data-module=notification-w]{--notification-height:98%}[data-module=notification-w]>div:nth-child(2){transform:translateY(calc(-1*var(--notification-height)));z-index:2}[data-module=notification-w]>div:nth-child(3){transform:translateY(calc(-2*var(--notification-height)));z-index:3}[data-module=notification-w]:hover{--notification-height:98%}[data-module=notification-w]:hover>div:nth-child(2){z-index:2;transform:translateY(0)}[data-module=notification-w]:hover>div:nth-child(3){z-index:3;transform:translateY(0)}[data-module=notification]{transition:transform .3s cubic-bezier(.22,1,.36,1)}
.app-item.video[data-adaptive-video-window]{--nodedc-video-source-aspect:1.777778;--nodedc-video-height:620px;--nodedc-video-max-height:72svh;--nodedc-video-max-width:70vw;--nodedc-video-render-height:min(var(--nodedc-video-height),var(--nodedc-video-max-height));aspect-ratio:auto;width:min(var(--nodedc-video-max-width),calc(var(--nodedc-video-render-height)*var(--nodedc-video-source-aspect)));height:auto}.app-item.video[data-adaptive-video-window] .video-size[data-adaptive-video]{aspect-ratio:var(--nodedc-video-source-aspect);display:block;width:100%;height:auto;max-height:var(--nodedc-video-render-height)}.app-item.video[data-adaptive-video-window] .video-size[data-adaptive-video]>video.video{display:block;width:100%;height:100%;object-fit:cover}.video-screen [data-media-handle]{display:block;width:100%;height:100%}.video-screen [data-media-handle]>img,.video-screen [data-media-handle]>video{display:block;width:100%;height:100%;object-fit:cover}@media screen and (max-width:767px){.app-item.video[data-adaptive-video-window]{--nodedc-video-max-height:58svh;--nodedc-video-max-width:95vw}} .app-item.video[data-adaptive-video-window]{--nodedc-video-source-aspect:1.777778;--nodedc-video-height:620px;--nodedc-video-max-height:72svh;--nodedc-video-max-width:70vw;--nodedc-video-render-height:min(var(--nodedc-video-height),var(--nodedc-video-max-height));aspect-ratio:auto;width:min(var(--nodedc-video-max-width),calc(var(--nodedc-video-render-height)*var(--nodedc-video-source-aspect)));height:auto}.app-item.video[data-adaptive-video-window] .video-size[data-adaptive-video]{aspect-ratio:var(--nodedc-video-source-aspect);display:block;width:100%;height:auto;max-height:var(--nodedc-video-render-height)}.app-item.video[data-adaptive-video-window] .video-size[data-adaptive-video]>video.video{display:block;width:100%;height:100%;object-fit:cover}.video-screen [data-media-handle]{display:block;width:100%;height:100%}.video-screen [data-media-handle]>img,.video-screen [data-media-handle]>video{display:block;width:100%;height:100%;object-fit:cover}@media screen and (max-width:767px){.app-item.video[data-adaptive-video-window]{--nodedc-video-max-height:58svh;--nodedc-video-max-width:95vw}}
.project-video-detail .project-video-detail-copy{position:relative;z-index:2}.project-video-detail .project-video-detail-copy-bottom{margin-top:2.5rem}.project-video-detail .project-video-detail-copy-bottom .main-h{margin-bottom:0}@media screen and (max-width:767px){.project-video-detail .project-video-detail-hgroup{flex-flow:row;gap:1.25rem}.project-video-detail .project-video-detail-hgroup.flip{flex-flow:row-reverse}.project-video-detail .project-video-detail-hgroup .main-h.h1{font-size:2.35rem}.project-video-detail .project-video-detail-hgroup .h-txt{max-width:22ch}.project-video-detail .project-video-detail-copy-bottom{margin-top:2rem}}@media screen and (max-width:479px){.project-video-detail .project-video-detail-copy{width:86%}.project-video-detail .project-video-detail-hgroup{gap:1rem}.project-video-detail .project-video-detail-hgroup .main-h.h1{font-size:2rem}.project-video-detail .project-video-detail-hgroup .h-txt{max-width:17ch;font-size:.86rem;line-height:1.28em}} .project-video-detail .project-video-detail-copy{position:relative;z-index:2}.project-video-detail .project-video-detail-copy-bottom{margin-top:2.5rem}.project-video-detail .project-video-detail-copy-bottom .main-h{margin-bottom:0}@media screen and (max-width:767px){.project-video-detail .project-video-detail-hgroup{flex-flow:row;gap:1.25rem}.project-video-detail .project-video-detail-hgroup.flip{flex-flow:row-reverse}.project-video-detail .project-video-detail-hgroup .main-h.h1{font-size:2.35rem}.project-video-detail .project-video-detail-hgroup .h-txt{max-width:22ch}.project-video-detail .project-video-detail-copy-bottom{margin-top:2rem}}@media screen and (max-width:479px){.project-video-detail .project-video-detail-copy{width:86%}.project-video-detail .project-video-detail-hgroup{gap:1rem}.project-video-detail .project-video-detail-hgroup .main-h.h1{font-size:2rem}.project-video-detail .project-video-detail-hgroup .h-txt{max-width:17ch;font-size:.86rem;line-height:1.28em}}
.project-composition .project-composition-copy{position:relative;z-index:2}.project-composition .project-composition-copy-bottom{margin-top:2.5rem}.project-composition .project-composition-copy-bottom .main-h{margin-bottom:0}@media screen and (max-width:767px){.project-composition .project-composition-hgroup{flex-flow:row;gap:1.25rem}.project-composition .project-composition-hgroup.flip{flex-flow:row-reverse}.project-composition .project-composition-hgroup .main-h.h2{font-size:2.35rem}.project-composition .project-composition-hgroup .h-txt{max-width:22ch}.project-composition .project-composition-copy-bottom{margin-top:2rem}}@media screen and (max-width:479px){.project-composition .project-composition-copy{width:86%}.project-composition .project-composition-hgroup{gap:1rem}.project-composition .project-composition-hgroup .main-h.h2{font-size:2rem}.project-composition .project-composition-hgroup .h-txt{max-width:17ch;font-size:.86rem;line-height:1.28em}}
.pricing-table-section .pricing-table-shell{padding-top:12svh;padding-bottom:12svh}@media screen and (max-width:767px){.pricing-table-section .pricing-table-shell{padding-top:8svh;padding-bottom:8svh}}

View File

@ -1,3 +1,5 @@
*{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img{pointer-events:none}.text-scrollable{scrollbar-width:none;-ms-overflow-style:none}.text-scrollable::-webkit-scrollbar{display:none}.circle .x-icon{opacity:0}.circle:hover .x-icon{opacity:1}[data-css=fade-tb]{mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);-webkit-mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);mask-size:100% 100%;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;-webkit-mask-repeat:no-repeat}.current .mail-item{background-color:#3d3d3dc9}[data-module=""]{outline:10px solid red}[data-module=btn]>div>div>div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=btn]:hover>div>div>div>div{transform:translateY(-1.3em)}[data-module=link]{transition:opacity .1s ease-in-out}[data-module=link] div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=link]:hover{opacity:.6!important}[data-module=link]:hover div>div{transform:translateY(-.65em)}[data-module=apple-icon]:focus [data-txt]{position:relative}[data-module=apple-icon]:focus [data-txt]:before{content:"";position:absolute;z-index:-1;background-color:#0059d0;border-radius:.3em;width:120%;height:120%;top:-10%;left:-10%}[data-module=notification-w]{--notification-height:98%}[data-module=notification-w]>div:nth-child(2){transform:translateY(calc(-1*var(--notification-height)));z-index:2}[data-module=notification-w]>div:nth-child(3){transform:translateY(calc(-2*var(--notification-height)));z-index:3}[data-module=notification-w]:hover{--notification-height:98%}[data-module=notification-w]:hover>div:nth-child(2){z-index:2;transform:translateY(0)}[data-module=notification-w]:hover>div:nth-child(3){z-index:3;transform:translateY(0)}[data-module=notification]{transition:transform .3s cubic-bezier(.22,1,.36,1)}[data-start=closed]{pointer-events:none;visibility:hidden}[data-module=app]:not([data-start=closed]){transform:scale(0)translateY(200%)}[data-module=folder-wrap]>*{transform:scale(0)}[data-module=list] a{opacity:0}[data-success],[data-failure]{display:none}[data-module=alpha]{opacity:0} *{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}img{pointer-events:none}.text-scrollable{scrollbar-width:none;-ms-overflow-style:none}.text-scrollable::-webkit-scrollbar{display:none}.circle .x-icon{opacity:0}.circle:hover .x-icon{opacity:1}[data-css=fade-tb]{mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);-webkit-mask-image:linear-gradient(#0000 0%,#000 15% 85%,#0000 100%);mask-size:100% 100%;mask-repeat:no-repeat;-webkit-mask-size:100% 100%;-webkit-mask-repeat:no-repeat}.current .mail-item{background-color:#3d3d3dc9}[data-module=""]{outline:10px solid red}[data-module=btn]>div>div>div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=btn]:hover>div>div>div>div{transform:translateY(-1.3em)}[data-module=link]{transition:opacity .1s ease-in-out}[data-module=link] div>div{text-shadow:0 1.3em #fff;transition:transform .3s ease-in-out}[data-module=link]:hover{opacity:.6!important}[data-module=link]:hover div>div{transform:translateY(-.65em)}[data-module=apple-icon]:focus [data-txt]{position:relative}[data-module=apple-icon]:focus [data-txt]:before{content:"";position:absolute;z-index:-1;background-color:#0059d0;border-radius:.3em;width:120%;height:120%;top:-10%;left:-10%}[data-module=notification-w]{--notification-height:98%}[data-module=notification-w]>div:nth-child(2){transform:translateY(calc(-1*var(--notification-height)));z-index:2}[data-module=notification-w]>div:nth-child(3){transform:translateY(calc(-2*var(--notification-height)));z-index:3}[data-module=notification-w]:hover{--notification-height:98%}[data-module=notification-w]:hover>div:nth-child(2){z-index:2;transform:translateY(0)}[data-module=notification-w]:hover>div:nth-child(3){z-index:3;transform:translateY(0)}[data-module=notification]{transition:transform .3s cubic-bezier(.22,1,.36,1)}[data-start=closed]{pointer-events:none;visibility:hidden}[data-module=app]:not([data-start=closed]){transform:scale(0)translateY(200%)}[data-module=folder-wrap]>*{transform:scale(0)}[data-module=list] a{opacity:0}[data-success],[data-failure]{display:none}[data-module=alpha]{opacity:0}
.app-item.video[data-adaptive-video-window]{--nodedc-video-source-aspect:1.777778;--nodedc-video-height:620px;--nodedc-video-max-height:72svh;--nodedc-video-max-width:70vw;--nodedc-video-render-height:min(var(--nodedc-video-height),var(--nodedc-video-max-height));aspect-ratio:auto;width:min(var(--nodedc-video-max-width),calc(var(--nodedc-video-render-height)*var(--nodedc-video-source-aspect)));height:auto}.app-item.video[data-adaptive-video-window] .video-size[data-adaptive-video]{aspect-ratio:var(--nodedc-video-source-aspect);display:block;width:100%;height:auto;max-height:var(--nodedc-video-render-height)}.app-item.video[data-adaptive-video-window] .video-size[data-adaptive-video]>video.video{display:block;width:100%;height:100%;object-fit:cover}.video-screen [data-media-handle]{display:block;width:100%;height:100%}.video-screen [data-media-handle]>img,.video-screen [data-media-handle]>video{display:block;width:100%;height:100%;object-fit:cover}@media screen and (max-width:767px){.app-item.video[data-adaptive-video-window]{--nodedc-video-max-height:58svh;--nodedc-video-max-width:95vw}} .app-item.video[data-adaptive-video-window]{--nodedc-video-source-aspect:1.777778;--nodedc-video-height:620px;--nodedc-video-max-height:72svh;--nodedc-video-max-width:70vw;--nodedc-video-render-height:min(var(--nodedc-video-height),var(--nodedc-video-max-height));aspect-ratio:auto;width:min(var(--nodedc-video-max-width),calc(var(--nodedc-video-render-height)*var(--nodedc-video-source-aspect)));height:auto}.app-item.video[data-adaptive-video-window] .video-size[data-adaptive-video]{aspect-ratio:var(--nodedc-video-source-aspect);display:block;width:100%;height:auto;max-height:var(--nodedc-video-render-height)}.app-item.video[data-adaptive-video-window] .video-size[data-adaptive-video]>video.video{display:block;width:100%;height:100%;object-fit:cover}.video-screen [data-media-handle]{display:block;width:100%;height:100%}.video-screen [data-media-handle]>img,.video-screen [data-media-handle]>video{display:block;width:100%;height:100%;object-fit:cover}@media screen and (max-width:767px){.app-item.video[data-adaptive-video-window]{--nodedc-video-max-height:58svh;--nodedc-video-max-width:95vw}}
.project-video-detail .project-video-detail-copy{position:relative;z-index:2}.project-video-detail .project-video-detail-copy-bottom{margin-top:2.5rem}.project-video-detail .project-video-detail-copy-bottom .main-h{margin-bottom:0}@media screen and (max-width:767px){.project-video-detail .project-video-detail-hgroup{flex-flow:row;gap:1.25rem}.project-video-detail .project-video-detail-hgroup.flip{flex-flow:row-reverse}.project-video-detail .project-video-detail-hgroup .main-h.h1{font-size:2.35rem}.project-video-detail .project-video-detail-hgroup .h-txt{max-width:22ch}.project-video-detail .project-video-detail-copy-bottom{margin-top:2rem}}@media screen and (max-width:479px){.project-video-detail .project-video-detail-copy{width:86%}.project-video-detail .project-video-detail-hgroup{gap:1rem}.project-video-detail .project-video-detail-hgroup .main-h.h1{font-size:2rem}.project-video-detail .project-video-detail-hgroup .h-txt{max-width:17ch;font-size:.86rem;line-height:1.28em}} .project-video-detail .project-video-detail-copy{position:relative;z-index:2}.project-video-detail .project-video-detail-copy-bottom{margin-top:2.5rem}.project-video-detail .project-video-detail-copy-bottom .main-h{margin-bottom:0}@media screen and (max-width:767px){.project-video-detail .project-video-detail-hgroup{flex-flow:row;gap:1.25rem}.project-video-detail .project-video-detail-hgroup.flip{flex-flow:row-reverse}.project-video-detail .project-video-detail-hgroup .main-h.h1{font-size:2.35rem}.project-video-detail .project-video-detail-hgroup .h-txt{max-width:22ch}.project-video-detail .project-video-detail-copy-bottom{margin-top:2rem}}@media screen and (max-width:479px){.project-video-detail .project-video-detail-copy{width:86%}.project-video-detail .project-video-detail-hgroup{gap:1rem}.project-video-detail .project-video-detail-hgroup .main-h.h1{font-size:2rem}.project-video-detail .project-video-detail-hgroup .h-txt{max-width:17ch;font-size:.86rem;line-height:1.28em}}
.project-composition .project-composition-copy{position:relative;z-index:2}.project-composition .project-composition-copy-bottom{margin-top:2.5rem}.project-composition .project-composition-copy-bottom .main-h{margin-bottom:0}@media screen and (max-width:767px){.project-composition .project-composition-hgroup{flex-flow:row;gap:1.25rem}.project-composition .project-composition-hgroup.flip{flex-flow:row-reverse}.project-composition .project-composition-hgroup .main-h.h2{font-size:2.35rem}.project-composition .project-composition-hgroup .h-txt{max-width:22ch}.project-composition .project-composition-copy-bottom{margin-top:2rem}}@media screen and (max-width:479px){.project-composition .project-composition-copy{width:86%}.project-composition .project-composition-hgroup{gap:1rem}.project-composition .project-composition-hgroup .main-h.h2{font-size:2rem}.project-composition .project-composition-hgroup .h-txt{max-width:17ch;font-size:.86rem;line-height:1.28em}}
.pricing-table-section .pricing-table-shell{padding-top:12svh;padding-bottom:12svh}@media screen and (max-width:767px){.pricing-table-section .pricing-table-shell{padding-top:8svh;padding-bottom:8svh}}

File diff suppressed because one or more lines are too long

View File

@ -10,6 +10,8 @@
const DEFAULT_SCROLL_SPEED = 0.55; const DEFAULT_SCROLL_SPEED = 0.55;
const ADAPTIVE_VIDEO_BOUND_FLAG = "__nodedcAdaptiveVideoBound"; const ADAPTIVE_VIDEO_BOUND_FLAG = "__nodedcAdaptiveVideoBound";
const MEDIA_HANDLE_BOUND_FLAG = "__nodedcMediaHandleBound"; const MEDIA_HANDLE_BOUND_FLAG = "__nodedcMediaHandleBound";
const DOCK_LINK_BOUND_FLAG = "__nodedcDockLinkBound";
const ORDERED_SLIDER_BOUND_FLAG = "__nodedcOrderedSliderBound";
const IMAGE_EXTENSIONS = new Set(["avif", "gif", "jpeg", "jpg", "png", "svg", "webp"]); const IMAGE_EXTENSIONS = new Set(["avif", "gif", "jpeg", "jpg", "png", "svg", "webp"]);
const VIDEO_EXTENSIONS = new Set(["m4v", "mov", "mp4", "webm"]); const VIDEO_EXTENSIONS = new Set(["m4v", "mov", "mp4", "webm"]);
@ -226,11 +228,62 @@
} }
function bindInteractiveScroll() { function bindInteractiveScroll() {
bindGlobalSliderWheel();
document.querySelectorAll('[data-module="slider"]').forEach(bindSliderWheel);
document.querySelectorAll('[data-module="mail-list"]').forEach(bindMailListWheel); document.querySelectorAll('[data-module="mail-list"]').forEach(bindMailListWheel);
} }
function bindOrderedSlider(surface) {
if (!surface || surface[ORDERED_SLIDER_BOUND_FLAG]) return;
const slider = surface.__nodedcSlider;
if (!slider) return;
surface[ORDERED_SLIDER_BOUND_FLAG] = true;
const items = Array.from(surface.children);
const startOffset = items.length > 1 ? -1 : 0;
slider.config.infinite = true;
slider.target = startOffset;
slider.current = startOffset;
slider.speed = 0;
items.forEach((item) => {
item.classList.remove("current");
});
slider.resize?.();
slider.update?.();
}
function bindOrderedSliders() {
document.querySelectorAll('[data-module="slider"][data-admin-order="true"]').forEach(bindOrderedSlider);
}
function bindDockLink(link) {
if (!link || link[DOCK_LINK_BOUND_FLAG]) return;
link[DOCK_LINK_BOUND_FLAG] = true;
link.addEventListener(
"click",
(event) => {
const href = String(link.getAttribute("href") || "").trim();
const targetId = String(link.dataset.target || "").trim();
const hasAppTarget = Boolean(targetId && document.getElementById(targetId));
const isInertHref = !href || href === "#" || href === "#hero" || href.toLowerCase().startsWith("javascript:");
if (!hasAppTarget && !isInertHref) return;
event.preventDefault();
window.requestAnimationFrame(() => link.blur());
if (!hasAppTarget) event.stopPropagation();
},
{ capture: true },
);
}
function bindDockLinks() {
document.querySelectorAll('[data-module="dock"] a[data-app]').forEach(bindDockLink);
}
function mediaExtension(src) { function mediaExtension(src) {
const cleanSrc = String(src || "").split(/[?#]/)[0]; const cleanSrc = String(src || "").split(/[?#]/)[0];
const match = /\.([a-z0-9]+)$/i.exec(cleanSrc); const match = /\.([a-z0-9]+)$/i.exec(cleanSrc);
@ -313,6 +366,8 @@
() => { () => {
hydrateMediaHandles(); hydrateMediaHandles();
bindInteractiveScroll(); bindInteractiveScroll();
bindOrderedSliders();
bindDockLinks();
bindAdaptiveVideos(); bindAdaptiveVideos();
}, },
{ once: true }, { once: true },
@ -320,16 +375,22 @@
} else { } else {
hydrateMediaHandles(); hydrateMediaHandles();
bindInteractiveScroll(); bindInteractiveScroll();
bindOrderedSliders();
bindDockLinks();
bindAdaptiveVideos(); bindAdaptiveVideos();
} }
window.addEventListener("load", () => { window.addEventListener("load", () => {
hydrateMediaHandles(); hydrateMediaHandles();
bindInteractiveScroll(); bindInteractiveScroll();
bindOrderedSliders();
bindDockLinks();
bindAdaptiveVideos(); bindAdaptiveVideos();
window.setTimeout(() => { window.setTimeout(() => {
hydrateMediaHandles(); hydrateMediaHandles();
bindInteractiveScroll(); bindInteractiveScroll();
bindOrderedSliders();
bindDockLinks();
bindAdaptiveVideos(); bindAdaptiveVideos();
}, 500); }, 500);
}); });

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<section id="{{attr:anchor}}" class="s central-text-block"><div class="c center ve"><hgroup data-module="hg" class="ce"><div data-module="text-wave" class="hg-par darker-70">{{text:content.eyebrow}}</div><h2 class="main-h h1 xl"><span class="darker-40">{{text:content.heading.muted}}</span><span class="darker-70">{{text:content.heading.middle}}</span><span>{{text:content.heading.main}}</span></h2><div class="div-block-11"><div class="h-txt">{{html:content.introHtml}}</div><div class="h-txt">{{html:content.tokenBillingHtml}}</div><div class="h-txt darker-40">{{html:content.founderLimitHtml}}</div></div></hgroup></div></section>

View File

@ -1 +1 @@
<footer class="s footer"><div class="c footer-col"><div class="div-block-9"><div class="div-block-2"><img data-module="mouse-follow" loading="lazy" alt="{{attr:content.footer.appIconAlt}}" src="{{attr:content.footer.appIconSrc}}" class="logo app footer"/><img loading="lazy" src="{{attr:content.footer.wordmarkSrc}}" alt="{{attr:content.footer.wordmarkAlt}}" class="logo-size"/></div><div class="footer-notice mt">{{html:content.footer.copyrightHtml}}</div></div><div class="footer-cols"><div class="div-block-3"><h2 class="footer-list-he">{{text:content.footer.navTitle}}</h2><ul data-group="hero" data-module="list" role="list" class="w-list-unstyled">{{#each content.footer.navLinks}}<li><a data-module="link" href="{{attr:href}}" target="{{attr:target}}" class="ft-link w-inline-block"><div class="clip-12"><div>{{text:label}}</div></div></a></li>{{/each}}</ul></div><div class="div-block-3"><h2 data-module="text-wave" class="footer-list-he">{{text:content.footer.contactTitle}}</h2><ul data-group="hero" data-module="list" role="list" class="w-list-unstyled">{{#each content.footer.contactLinks}}<li><a data-module="link" href="{{attr:href}}" target="{{attr:target}}" class="ft-link w-inline-block"><div class="clip-12"><div>{{text:label}}</div></div></a></li>{{/each}}</ul></div></div></div><div class="c footer-col"><div class="footer-notice mt">{{html:content.footer.policyHtml}}</div></div></footer> <footer class="s footer"><div class="c footer-col"><div class="div-block-9"><div class="div-block-2"><img data-module="mouse-follow" loading="lazy" alt="{{attr:content.footer.appIconAlt}}" src="{{attr:content.footer.appIconSrc}}" class="logo app footer"/><img loading="lazy" src="{{attr:content.footer.wordmarkSrc}}" alt="{{attr:content.footer.wordmarkAlt}}" class="logo-size"/></div><div class="footer-notice mt">{{html:content.footer.copyrightHtml}}</div></div><div class="footer-cols"><div class="div-block-3"><h2 class="footer-list-he">{{text:content.footer.navTitle}}</h2><ul data-group="hero" data-module="list" role="list" class="w-list-unstyled">{{#each content.footer.navLinks}}{{#if enabled}}<li><a data-module="link" href="{{attr:href}}" target="{{attr:target}}" class="ft-link w-inline-block"><div class="clip-12"><div>{{text:label}}</div></div></a></li>{{/if}}{{/each}}</ul></div><div class="div-block-3"><h2 data-module="text-wave" class="footer-list-he">{{text:content.footer.contactTitle}}</h2><ul data-group="hero" data-module="list" role="list" class="w-list-unstyled">{{#each content.footer.contactLinks}}{{#if enabled}}<li><a data-module="link" href="{{attr:href}}" target="{{attr:target}}" class="ft-link w-inline-block"><div class="clip-12"><div>{{text:label}}</div></div></a></li>{{/if}}{{/each}}</ul></div></div></div>{{#if content.footer.policyEnabled}}<div class="c footer-col"><div class="footer-notice mt">{{html:content.footer.policyHtml}}</div></div>{{/if}}</footer>

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
<section class="s"> <section class="s project-composition">
<div class="c _w-60"> <div class="c _w-60 project-composition-copy project-composition-copy-top">
<hgroup data-module="hg" class="ho"> <hgroup data-module="hg" class="ho project-composition-hgroup">
<h2 class="main-h h2"> <h2 class="main-h h2">
<span class="darker-40">{{text:content.heading.muted}}</span> <span class="darker-40">{{text:content.heading.muted}}</span>
<span>{{text:content.heading.main}}</span> <span>{{text:content.heading.main}}</span>
@ -10,7 +10,7 @@
</div> </div>
<div class="c full"> <div class="c full">
<div class="w-dyn-list"> <div class="w-dyn-list">
<div data-module="slider" data-scroll-speed="{{attr:content.scroll.speed}}" role="list" class="slider w-dyn-items"> <div data-module="slider" data-admin-order="true" data-scroll-speed="{{attr:content.scroll.speed}}" role="list" class="slider w-dyn-items">
{{#each content.sliderItems}} {{#each content.sliderItems}}
{{#if enabled}} {{#if enabled}}
<div role="listitem" class="slide-w w-dyn-item"> <div role="listitem" class="slide-w w-dyn-item">
@ -28,6 +28,15 @@
</div> </div>
</div> </div>
</div> </div>
<div class="c _w-60 project-composition-copy project-composition-copy-bottom">
<hgroup data-module="hg" class="ho flip project-composition-hgroup">
<h2 class="main-h h2">
<span class="darker-40">{{text:content.bottomInfo.heading.muted}}</span>
<span>{{text:content.bottomInfo.heading.main}}</span>
</h2>
<div class="h-txt">{{html:content.bottomInfo.introHtml}}</div>
</hgroup>
</div>
<div class="webgl-target-w"> <div class="webgl-target-w">
<div data-scale="1, 0.6" data-module="webgl-target" class="webgl-target"></div> <div data-scale="1, 0.6" data-module="webgl-target" class="webgl-target"></div>
</div> </div>

View File

@ -11,7 +11,7 @@
</div> </div>
<div class="c full"> <div class="c full">
<div class="w-dyn-list"> <div class="w-dyn-list">
<div data-module="slider" data-scroll-speed="{{attr:content.scroll.speed}}" role="list" class="slider w-dyn-items"> <div data-module="slider" data-admin-order="true" data-scroll-speed="{{attr:content.scroll.speed}}" role="list" class="slider w-dyn-items">
{{#each content.sliderItems}} {{#each content.sliderItems}}
{{#if enabled}} {{#if enabled}}
<div role="listitem" class="slide-w w-dyn-item"> <div role="listitem" class="slide-w w-dyn-item">

View File

@ -0,0 +1 @@
<section id="{{attr:anchor}}" class="s h-screen">{{#if content.accessCard.enabled}}<div class="app-w"><div id="app-data" data-module="app" class="app-item data"><div data-draggable-area="" class="app-head preview"><div class="app-head-trigs"><button data-close="" aria-label="закрыть окно" class="circle opaque"><div class="x-icon"><div class="line full x-icon rot"></div><div class="line full x-icon"></div></div></button><div class="circle opaque"></div><div class="circle opaque"></div></div></div><div class="flex-v"><div class="flex-v _w-full"><img src="{{attr:content.accessCard.iconSrc}}" loading="lazy" data-module="mouse-follow" alt="{{attr:content.accessCard.iconAlt}}" class="logo app"/><div class="logo-lockup-w"><img src="{{attr:content.accessCard.wordmarkSrc}}" loading="eager" alt="{{attr:content.accessCard.wordmarkAlt}}" class="logo-size"/><div class="notice-txt sm">{{text:content.accessCard.release}}</div></div></div><h3 data-module="text-wave" class="data-he">{{text:content.accessCard.heading}}</h3><h2 class="data-he h2">{{text:content.accessCard.description}}</h2><div class="form-element"><div data-module="form" class="form-w w-form"><form id="wf-form-sign-up" name="wf-form-sign-up" data-name="sign-up" method="get" data-form="" class="form" data-wf-page-id="69b2dc3d81980aaf43601640" data-wf-element-id="4c5736fb-5001-9c71-eaa8-239119d387ce"><textarea placeholder="{{attr:content.form.messagePlaceholder}}" maxlength="5000" id="Message" name="Message" data-name="Message" class="form-field taller w-input"></textarea><input class="form-field w-input" maxlength="256" name="name" data-name="Имя" placeholder="{{attr:content.form.namePlaceholder}}" type="text" id="Name" required=""/><div class="form-item"><input class="form-field w-input" maxlength="256" name="Email" data-name="Email" placeholder="{{attr:content.form.emailPlaceholder}}" type="email" id="Email" required=""/><button data-module="btn" class="form-btn"><div data-module="alpha" class="btn-bg"><div class="clip-12"><div>{{text:content.form.submitLabel}}</div></div></div></button></div></form><div data-success="" class="form-success"><h2 class="data-he sm">{{text:content.form.successHeading}}</h2><h2 class="data-he h2 xs">{{html:content.form.successTextHtml}}</h2><a data-module="btn" href="beta-apply.html" class="form-btn static w-inline-block"><div class="btn-bg gray"><div class="clip-12"><div>{{text:content.form.betaCtaLabel}}</div></div></div></a><h2 class="data-he h2 xs">{{html:content.form.founderIntroHtml}}</h2><a data-module="btn" href="founders.html" class="form-btn static w-inline-block"><div class="btn-bg"><div class="clip-12"><div>{{html:content.form.founderCtaHtml}}</div></div></div></a><link rel="prefetch" href="founders.html"/><div data-url="https://web.ssscript.app/api/founders-spots-remaining" data-module="founders-spots" class="pricing-sm darker-70 is--right">{{text:content.form.spotsLabel}}</div></div></div><div data-failure="" class="form-fail"><h2 class="data-he sm">{{text:content.form.failureHeading}}</h2><h2 class="data-he h2 xs">{{html:content.form.failureTextHtml}}</h2></div></div>{{#if content.legal.enabled}}<div class="notice-txt">{{html:content.legal.html}}</div>{{/if}}</div></div></div>{{/if}}{{#if content.filesEnabled}}<div class="waitlist-coll"><div class="folder-w txts w-dyn-list"><div role="list" class="folder-w txts-windows w-dyn-items">{{#each content.files}}{{#if enabled}}<div role="listitem" class="app-item-dot w-dyn-item"><div id="{{attr:id}}" data-module="app" data-start="closed" class="app-item txt"><div data-draggable-area="" class="app-head"><div class="app-head-trigs"><button data-close="" class="circle red"></button><div class="circle yellow"></div><div class="circle green"></div></div><div class="app-name-w"><img src="{{attr:iconSrc}}" loading="lazy" sizes="(max-width: 1024px) 100vw, 1024px" srcset="{{attr:iconSrcset}}" alt="{{attr:iconAlt}}" class="app-icon"/><div class="app-name-txt">{{text:name}}</div></div></div><div class="text-editable"><div data-module="editable-text" class="txt-text-block editable">{{html:bodyHtml}}</div></div></div></div>{{/if}}{{/each}}</div></div><div class="collection-list-wrapper-3 w-dyn-list"><div data-form="duplicate" role="list" class="folders txts w-dyn-items">{{#each content.files}}{{#if enabled}}<div role="listitem" class="collection-item-2 w-dyn-item"><div tabindex="0" data-target="{{attr:id}}" data-module="apple-icon" class="folder"><img class="image" src="{{attr:iconSrc}}" alt="{{attr:iconAlt}}" sizes="(max-width: 1024px) 100vw, 1024px" data-icon="" loading="eager" srcset="{{attr:iconSrcset}}"/><div data-txt="" class="text-ho"><div class="folder-title">{{text:name}}</div><div class="folder-title lower">.txt</div></div></div></div>{{/if}}{{/each}}</div></div></div>{{/if}}</section>

View File

@ -0,0 +1 @@
<div class="s component-lib"></div><div class="s color-flip"><div class="webgl-target-w"><div data-module="color-flip" class="webgl-target short"></div></div><div class="light-c"><div class="w-dyn-list"><div data-module="features" role="list" class="folder-w abs w-dyn-items">{{#each content.galleryItems}}{{#if enabled}}<div data-spread="" role="listitem" class="collection-item w-dyn-item"><div id="{{attr:id}}" data-module="app" class="app-item img"><div data-draggable-area="" class="app-head preview"><div class="app-head-trigs"><button data-close="" aria-label="закрыть" class="circle opaque"><div class="x-icon"><div class="line full x-icon rot"></div><div class="line full x-icon"></div></div></button><div class="circle opaque"></div></div><div class="app-name-w"><div class="app-name-txt preview">{{text:windowTitle}}</div></div></div><div class="inner-block"><div class="abs flex"><img src="{{attr:imageSrc}}" loading="eager" alt="{{attr:imageAlt}}" sizes="100vw" srcset="{{attr:imageSrcset}}" class="img"/></div></div></div><div tabindex="0" data-target="{{attr:id}}" data-module="apple-icon" class="folder"><img src="{{attr:iconSrc}}" loading="eager" data-icon="" alt="{{attr:iconAlt}}" class="image"/><div class="folder-title-w"><div class="dot highlight purple"></div><div data-txt="" class="folder-title">{{text:folderLabel}}</div></div></div></div>{{/if}}{{/each}}</div></div></div><div class="webgl-target-w bl"><div data-scale="1" data-module="webgl-target" class="webgl-target"></div></div></div><div class="s component-lib"><div class="webgl-target-w"><div data-flip-reverse="true" data-module="color-flip" class="webgl-target short"></div></div></div>

View File

@ -1 +1 @@
<header id="hero" class="s h-screen"><div class="s-cont shorter"><div class="h-full between"><hgroup id="w-node-_42aec6af-ef19-ac2b-f604-ecf49ea735c6-43601640" data-module="hg" data-group="hero" class="hgroup main"><h1 class="main-h"><span class="darker-70">{{text:content.heading.muted}}</span><span>{{text:content.heading.main}}</span></h1><div class="h-txt">{{html:content.introHtml}}</div></hgroup><hgroup id="w-node-ddd50e0c-bdcb-417b-7dc2-7db828a06f46-43601640" data-module="hg" data-group="hero" class="to-left"><h2 class="main-h sm"><span class="darker-70">{{text:content.cards.0.muted}}</span><span>{{text:content.cards.0.main}}</span></h2><div class="h-txt">{{html:content.cards.0.bodyHtml}}</div></hgroup></div><div class="h-full between lower"><hgroup data-module="hg" data-group="hero"><h2 class="main-h sm"><span class="darker-70">{{text:content.cards.1.muted}}</span><span>{{text:content.cards.1.main}}</span></h2><div class="h-txt">{{html:content.cards.1.bodyHtml}}</div></hgroup><hgroup id="w-node-f82ddc17-0624-f069-9963-dda808a65750-43601640" data-module="hg" data-group="hero" class="to-right"><h2 class="main-h sm"><span class="darker-70">{{text:content.cards.2.muted}}</span><span>{{text:content.cards.2.main}}</span></h2><div class="h-txt">{{html:content.cards.2.bodyHtml}}</div></hgroup></div></div>{{#if content.accessCard.enabled}}<div class="app-w"><div id="app-data" data-module="app" class="app-item data"><div data-draggable-area="" class="app-head preview"><div class="app-head-trigs"><button data-close="" arial-label="закрыть окно" class="circle opaque"><div class="x-icon"><div class="line full x-icon rot"></div><div class="line full x-icon"></div></div></button><div class="circle opaque"></div><div class="circle opaque"></div></div></div><div class="flex-v"><div class="flex-v _w-full"><img src="{{attr:content.accessCard.iconSrc}}" loading="lazy" data-module="mouse-follow" alt="{{attr:content.accessCard.iconAlt}}" class="logo app"/><div class="logo-lockup-w"><img src="{{attr:content.accessCard.wordmarkSrc}}" loading="eager" alt="{{attr:content.accessCard.wordmarkAlt}}" class="logo-size"/><div class="notice-txt sm">{{text:content.accessCard.release}}</div></div></div><h3 data-module="text-wave" class="data-he">{{text:content.accessCard.heading}}</h3><h2 class="data-he h2">{{text:content.accessCard.description}}</h2><div class="form-element"><div data-module="form" class="form-w w-form"><form id="wf-form-sign-up" name="wf-form-sign-up" data-name="sign-up" method="get" data-form="" class="form" data-wf-page-id="69b2dc3d81980aaf43601640" data-wf-element-id="4c5736fb-5001-9c71-eaa8-239119d387ce"><textarea placeholder="{{attr:content.form.messagePlaceholder}}" maxlength="5000" id="Message" name="Message" data-name="Message" class="form-field taller w-input"></textarea><input class="form-field w-input" maxlength="256" name="name" data-name="Имя" placeholder="{{attr:content.form.namePlaceholder}}" type="text" id="Name" required=""/><div class="form-item"><input class="form-field w-input" maxlength="256" name="Email" data-name="Email" placeholder="{{attr:content.form.emailPlaceholder}}" type="email" id="Email" required=""/><button data-module="btn" class="form-btn"><div data-module="alpha" class="btn-bg"><div class="clip-12"><div>{{text:content.form.submitLabel}}</div></div></div></button></div></form><div data-success="" class="form-success"><h2 class="data-he sm">{{text:content.form.successHeading}}</h2><h2 class="data-he h2 xs">{{html:content.form.successTextHtml}}</h2><a data-module="btn" href="beta-apply.html" class="form-btn static w-inline-block"><div class="btn-bg gray"><div class="clip-12"><div>{{text:content.form.betaCtaLabel}}</div></div></div></a><h2 class="data-he h2 xs">{{html:content.form.founderIntroHtml}}</h2><a data-module="btn" href="founders.html" class="form-btn static w-inline-block"><div class="btn-bg"><div class="clip-12"><div>{{html:content.form.founderCtaHtml}}</div></div></div></a><link rel="prefetch" href="founders.html"/><div data-url="https://web.ssscript.app/api/founders-spots-remaining" data-module="founders-spots" class="pricing-sm darker-70 is--right">{{text:content.form.spotsLabel}}</div></div></div><div data-failure="" class="form-fail"><h2 class="data-he sm">{{text:content.form.failureHeading}}</h2><h2 class="data-he h2 xs">{{html:content.form.failureTextHtml}}</h2></div></div><div class="notice-txt">{{html:content.legalHtml}}</div></div></div></div>{{/if}}</header> <header id="hero" class="s h-screen"><div class="s-cont shorter"><div class="h-full between"><hgroup id="w-node-_42aec6af-ef19-ac2b-f604-ecf49ea735c6-43601640" data-module="hg" data-group="hero" class="hgroup main"><h1 class="main-h"><span class="darker-70">{{text:content.heading.muted}}</span><span>{{text:content.heading.main}}</span></h1><div class="h-txt">{{html:content.introHtml}}</div></hgroup><hgroup id="w-node-ddd50e0c-bdcb-417b-7dc2-7db828a06f46-43601640" data-module="hg" data-group="hero" class="to-left"><h2 class="main-h sm"><span class="darker-70">{{text:content.cards.0.muted}}</span><span>{{text:content.cards.0.main}}</span></h2><div class="h-txt">{{html:content.cards.0.bodyHtml}}</div></hgroup></div><div class="h-full between lower"><hgroup data-module="hg" data-group="hero"><h2 class="main-h sm"><span class="darker-70">{{text:content.cards.1.muted}}</span><span>{{text:content.cards.1.main}}</span></h2><div class="h-txt">{{html:content.cards.1.bodyHtml}}</div></hgroup><hgroup id="w-node-f82ddc17-0624-f069-9963-dda808a65750-43601640" data-module="hg" data-group="hero" class="to-right"><h2 class="main-h sm"><span class="darker-70">{{text:content.cards.2.muted}}</span><span>{{text:content.cards.2.main}}</span></h2><div class="h-txt">{{html:content.cards.2.bodyHtml}}</div></hgroup></div></div>{{#if content.accessCard.enabled}}<div class="app-w"><div id="app-data" data-module="app" class="app-item data"><div data-draggable-area="" class="app-head preview"><div class="app-head-trigs"><button data-close="" aria-label="закрыть окно" class="circle opaque"><div class="x-icon"><div class="line full x-icon rot"></div><div class="line full x-icon"></div></div></button><div class="circle opaque"></div><div class="circle opaque"></div></div></div><div class="flex-v"><div class="flex-v _w-full"><img src="{{attr:content.accessCard.iconSrc}}" loading="lazy" data-module="mouse-follow" alt="{{attr:content.accessCard.iconAlt}}" class="logo app"/><div class="logo-lockup-w"><img src="{{attr:content.accessCard.wordmarkSrc}}" loading="eager" alt="{{attr:content.accessCard.wordmarkAlt}}" class="logo-size"/><div class="notice-txt sm">{{text:content.accessCard.release}}</div></div></div><h3 data-module="text-wave" class="data-he">{{text:content.accessCard.heading}}</h3><h2 class="data-he h2">{{text:content.accessCard.description}}</h2><div class="form-element"><div data-module="form" class="form-w w-form"><form id="wf-form-sign-up" name="wf-form-sign-up" data-name="sign-up" method="get" data-form="" class="form" data-wf-page-id="69b2dc3d81980aaf43601640" data-wf-element-id="4c5736fb-5001-9c71-eaa8-239119d387ce"><textarea placeholder="{{attr:content.form.messagePlaceholder}}" maxlength="5000" id="Message" name="Message" data-name="Message" class="form-field taller w-input"></textarea><input class="form-field w-input" maxlength="256" name="name" data-name="Имя" placeholder="{{attr:content.form.namePlaceholder}}" type="text" id="Name" required=""/><div class="form-item"><input class="form-field w-input" maxlength="256" name="Email" data-name="Email" placeholder="{{attr:content.form.emailPlaceholder}}" type="email" id="Email" required=""/><button data-module="btn" class="form-btn"><div data-module="alpha" class="btn-bg"><div class="clip-12"><div>{{text:content.form.submitLabel}}</div></div></div></button></div></form><div data-success="" class="form-success"><h2 class="data-he sm">{{text:content.form.successHeading}}</h2><h2 class="data-he h2 xs">{{html:content.form.successTextHtml}}</h2><a data-module="btn" href="beta-apply.html" class="form-btn static w-inline-block"><div class="btn-bg gray"><div class="clip-12"><div>{{text:content.form.betaCtaLabel}}</div></div></div></a><h2 class="data-he h2 xs">{{html:content.form.founderIntroHtml}}</h2><a data-module="btn" href="founders.html" class="form-btn static w-inline-block"><div class="btn-bg"><div class="clip-12"><div>{{html:content.form.founderCtaHtml}}</div></div></div></a><link rel="prefetch" href="founders.html"/><div data-url="https://web.ssscript.app/api/founders-spots-remaining" data-module="founders-spots" class="pricing-sm darker-70 is--right">{{text:content.form.spotsLabel}}</div></div></div><div data-failure="" class="form-fail"><h2 class="data-he sm">{{text:content.form.failureHeading}}</h2><h2 class="data-he h2 xs">{{html:content.form.failureTextHtml}}</h2></div></div><div class="notice-txt">{{html:content.legalHtml}}</div></div></div></div>{{/if}}</header>

View File

@ -1 +0,0 @@
<section id="{{attr:anchor}}" class="s h-screen">{{#if content.accessCard.enabled}}<div class="app-w"><div id="app-data" data-module="app" class="app-item data"><div data-draggable-area="" class="app-head preview"><div class="app-head-trigs"><button data-close="" aria-label="закрыть" class="circle opaque"><div class="x-icon"><div class="line full x-icon rot"></div><div class="line full x-icon"></div></div></button><div class="circle opaque"></div><div class="circle opaque"></div></div></div><div class="flex-v"><div class="flex-v _w-full"><img src="{{attr:content.accessCard.iconSrc}}" loading="eager" data-module="mouse-follow" alt="{{attr:content.accessCard.iconAlt}}" class="logo app"/><div class="logo-lockup-w"><img src="{{attr:content.accessCard.wordmarkSrc}}" loading="eager" alt="{{attr:content.accessCard.wordmarkAlt}}" class="logo-size"/><div class="notice-txt sm">{{text:content.accessCard.release}}</div></div></div><h1 data-module="text-wave" class="data-he">{{text:content.accessCard.heading}}</h1><h2 class="data-he h2">{{text:content.accessCard.description}}</h2><div class="form-element"><div data-module="form" class="form-w w-form"><form id="wf-form-sign-up" name="wf-form-sign-up" data-name="sign-up" method="get" data-form="" class="form" data-wf-page-id="69b2dc3d81980aaf43601640" data-wf-element-id="3167f865-849c-497b-197f-50d61e82127f"><textarea placeholder="{{attr:content.form.messagePlaceholder}}" maxlength="5000" id="Message" name="Message" data-name="Message" class="form-field taller w-input"></textarea><input class="form-field w-input" maxlength="256" name="name" data-name="Имя" placeholder="{{attr:content.form.namePlaceholder}}" type="text" id="Name" required=""/><div class="form-item"><input class="form-field w-input" maxlength="256" name="Email" data-name="Email" placeholder="{{attr:content.form.emailPlaceholder}}" type="email" id="Email" required=""/><button data-module="btn" class="form-btn"><div data-module="alpha" class="btn-bg"><div class="clip-12"><div>{{text:content.form.submitLabel}}</div></div></div></button></div></form><div data-success="" class="form-success"><h2 class="data-he sm">{{text:content.form.successHeading}}</h2><h2 class="data-he h2 xs">{{html:content.form.successTextHtml}}</h2><a data-module="btn" href="{{attr:content.form.betaHref}}" class="form-btn static w-inline-block"><div data-module="alpha" class="btn-bg gray"><div class="clip-12"><div>{{text:content.form.betaCtaLabel}}</div></div></div></a></div></div></div><div class="notice-txt">{{html:content.legalHtml}}</div></div></div></div>{{/if}}<div class="waitlist-coll"><div class="folder-w txts w-dyn-list"><div role="list" class="folder-w txts-windows w-dyn-items">{{#each content.files}}<div role="listitem" class="app-item-dot w-dyn-item"><div id="{{attr:id}}" data-module="app" data-start="closed" class="app-item txt"><div data-draggable-area="" class="app-head"><div class="app-head-trigs"><button data-close="" class="circle red"></button><div class="circle yellow"></div><div class="circle green"></div></div><div class="app-name-w"><img src="{{attr:iconSrc}}" loading="lazy" sizes="(max-width: 1024px) 100vw, 1024px" srcset="{{attr:iconSrcset}}" alt="{{attr:iconAlt}}" class="app-icon"/><div class="app-name-txt">{{text:name}}</div></div></div><div class="text-editable"><div data-module="editable-text" class="txt-text-block editable">{{html:bodyHtml}}</div></div></div></div>{{/each}}</div></div><div class="collection-list-wrapper-3 w-dyn-list"><div data-form="duplicate" role="list" class="folders txts w-dyn-items">{{#each content.files}}<div role="listitem" class="collection-item-2 w-dyn-item"><div tabindex="0" data-target="{{attr:id}}" data-module="apple-icon" class="folder"><img class="image" src="{{attr:iconSrc}}" alt="{{attr:iconAlt}}" sizes="(max-width: 1024px) 100vw, 1024px" data-icon="" loading="eager" srcset="{{attr:iconSrcset}}"/><div data-txt="" class="text-ho"><div class="folder-title">{{text:name}}</div><div class="folder-title lower">.txt</div></div></div></div>{{/each}}</div></div></div></section>

File diff suppressed because one or more lines are too long

View File

@ -133,10 +133,10 @@ const blocks = [
}, },
{ {
region: "cViz", region: "cViz",
id: "waitlist-files", id: "request-demo-txt-files",
type: "staticHtml", type: "staticHtml",
template: "waitlist-files.html", template: "request-demo-txt-files.html",
adminLabel: "Форма ожидания и txt-файлы", adminLabel: "Запрос DEMO и TXT-файлы",
anchor: "waitlist", anchor: "waitlist",
html: html.slice(waitlistFilesStart, demoVideoFolderStart), html: html.slice(waitlistFilesStart, demoVideoFolderStart),
}, },
@ -173,6 +173,8 @@ function inferFieldGroup(path) {
if (path.startsWith("content.app.")) return "Карточка раннего доступа"; if (path.startsWith("content.app.")) return "Карточка раннего доступа";
if (path.startsWith("content.form.")) return "Форма"; if (path.startsWith("content.form.")) return "Форма";
if (path === "content.legalHtml") return "Юридический блок"; if (path === "content.legalHtml") return "Юридический блок";
if (path.startsWith("content.legal.")) return "Юридический блок";
if (path === "content.filesEnabled" || path.startsWith("content.files.")) return "TXT-файлы";
if (path === "content.windowTitle" || path === "content.videoSrc") return "Видео-окно"; if (path === "content.windowTitle" || path === "content.videoSrc") return "Видео-окно";
if (path.startsWith("content.features.")) return "Пункты"; if (path.startsWith("content.features.")) return "Пункты";
if (path.startsWith("content.sliderItems.")) return "Слайдер"; if (path.startsWith("content.sliderItems.")) return "Слайдер";
@ -448,12 +450,22 @@ const typedBlockDefinitions = {
main: "режимы ИИ.", main: "режимы ИИ.",
}, },
introHtml: 'Разные <span class="darker-70">режимы</span> и <span class="darker-70">модели</span> для разных задач.', introHtml: 'Разные <span class="darker-70">режимы</span> и <span class="darker-70">модели</span> для разных задач.',
bottomInfo: {
heading: {
muted: "Гибкие",
main: "режимы ИИ.",
},
introHtml: 'Разные <span class="darker-70">режимы</span> и <span class="darker-70">модели</span> для разных задач.',
},
sliderItems: demoSliderItems, sliderItems: demoSliderItems,
}, },
editableFields: [ editableFields: [
field("content.heading.muted", "Заголовок: приглушённая строка"), field("content.heading.muted", "Приглушённая строка", "text", "text", "Верхний информационный блок"),
field("content.heading.main", "Заголовок: основная строка"), field("content.heading.main", "Основная строка", "text", "text", "Верхний информационный блок"),
field("content.introHtml", "Вводный текст", "html"), field("content.introHtml", "Вводный текст", "html", "html", "Верхний информационный блок"),
field("content.bottomInfo.heading.muted", "Приглушённая строка", "text", "text", "Нижний информационный блок"),
field("content.bottomInfo.heading.main", "Основная строка", "text", "text", "Нижний информационный блок"),
field("content.bottomInfo.introHtml", "Вводный текст", "html", "html", "Нижний информационный блок"),
...sliderEditableFields(), ...sliderEditableFields(),
], ],
}, },

View File

@ -43,6 +43,31 @@ function isTruthy(value) {
return Boolean(value); return Boolean(value);
} }
function cloneValue(value) {
return value == null ? value : JSON.parse(JSON.stringify(value));
}
function allBlocks(model) {
return (model.regions ?? []).flatMap((region) => region.blocks ?? []);
}
function applySharedDemoRequest(model) {
const blocks = allBlocks(model);
const source = blocks.find((block) => block.id === "hero-waitlist");
if (!source?.content) return;
for (const block of blocks) {
if (block.id === source.id || block.type !== "waitlistFiles") continue;
block.content ??= {};
block.content.accessCard = cloneValue(source.content.accessCard);
block.content.form = cloneValue(source.content.form);
block.content.legal ??= { enabled: true, html: "" };
block.content.legal.html = source.content.legalHtml ?? block.content.legal.html ?? "";
}
}
function escapeHtml(value) { function escapeHtml(value) {
return String(value) return String(value)
.replaceAll("&", "&amp;") .replaceAll("&", "&amp;")
@ -206,6 +231,8 @@ async function renderSections() {
return output.join(""); return output.join("");
} }
applySharedDemoRequest(page);
let output = renderTemplate(shell, { id: page.slug, ...page }); let output = renderTemplate(shell, { id: page.slug, ...page });
if (output.includes(REGION_TOKEN.sections)) { if (output.includes(REGION_TOKEN.sections)) {