Update admin file manager

This commit is contained in:
dcconstructions 2026-06-27 16:55:22 +03:00
parent d871a9d974
commit 66d59eba0a
44 changed files with 3580 additions and 46 deletions

View File

@ -708,6 +708,17 @@ body[data-file-picker-active="true"] .editor {
background: rgba(255, 255, 255, 0.13);
}
.trash-can-icon {
display: block;
width: 1rem;
height: 1rem;
fill: none;
stroke: currentColor;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 1.65;
}
.danger-action-btn {
background: transparent;
color: rgba(255, 255, 255, 0.82);
@ -1281,6 +1292,12 @@ body[data-file-picker-active="true"] .editor {
opacity: 0.78;
}
.collection-icon-btn .trash-can-icon {
width: 0.95rem;
height: 0.95rem;
opacity: 0.82;
}
.collection-drag-handle:active {
cursor: grabbing;
}
@ -1754,6 +1771,640 @@ textarea {
color: rgba(8, 8, 10, 1);
}
.media-modal-layer {
z-index: 230;
}
.media-modal {
width: min(82rem, calc(100vw - 2.8rem));
height: min(52rem, calc(100vh - 2.8rem));
grid-template-rows: auto auto minmax(0, 1fr) auto;
}
.media-modal-head {
padding-bottom: 0.85rem;
}
.media-modal-actions {
position: absolute;
top: 1.05rem;
right: 1.05rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.media-site-size {
display: inline-flex;
min-height: 2.8rem;
align-items: center;
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: var(--launcher-radius-circle);
background: rgba(255, 255, 255, 0.045);
color: var(--text-muted);
padding: 0 0.9rem;
font-size: 0.68rem;
font-weight: 850;
letter-spacing: 0.04em;
text-transform: uppercase;
white-space: nowrap;
}
.media-header-action {
position: static;
}
.media-header-action svg,
.media-delete-btn svg {
width: 1.05rem;
height: 1.05rem;
fill: none;
stroke: currentColor;
stroke-linecap: round;
stroke-linejoin: round;
stroke-width: 1.65;
}
.media-trash-toggle[data-active="true"] {
border-color: rgba(255, 255, 255, 0.92);
background: rgba(255, 255, 255, 0.92);
color: rgba(8, 8, 10, 0.96);
}
.media-toolbar {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: minmax(15rem, 1fr) auto auto auto;
gap: 0.7rem;
align-items: end;
padding: 0 1.25rem 1rem;
}
.media-search {
display: grid;
gap: 0.38rem;
color: var(--text-muted);
font-size: 0.68rem;
font-weight: 850;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.media-search input {
min-height: var(--nodedc-shell-control-height);
border-radius: var(--launcher-radius-circle);
padding-inline: 1rem;
}
.media-filter-row {
display: inline-flex;
max-width: 24rem;
align-items: center;
gap: 0.25rem;
overflow-x: auto;
border-radius: var(--launcher-radius-circle);
background: rgba(255, 255, 255, 0.055);
padding: 0.24rem;
scrollbar-width: none;
}
.media-filter-row::-webkit-scrollbar {
display: none;
}
.media-filter-button {
display: inline-flex;
min-height: 2.3rem;
align-items: center;
justify-content: center;
border-radius: var(--launcher-radius-circle);
background: transparent;
color: var(--text-muted);
padding: 0 0.78rem;
font-size: 0.72rem;
font-weight: 850;
white-space: nowrap;
}
.media-filter-button:disabled {
opacity: 0.45;
pointer-events: none;
}
.media-filter-button:hover {
background: rgba(255, 255, 255, 0.07);
color: var(--text-primary);
}
.media-filter-button[data-active="true"] {
background: rgba(255, 255, 255, 0.92);
color: rgba(8, 8, 10, 0.96);
}
.media-upload-btn {
white-space: nowrap;
}
.media-browser {
position: relative;
z-index: 1;
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(19rem, 0.32fr);
gap: 1rem;
min-height: 0;
padding: 0 1.25rem 1rem;
}
.media-browser[data-drag-active="true"]::after {
position: absolute;
inset: 0 1.25rem 1rem;
display: grid;
place-items: center;
border: 1px dashed rgba(255, 255, 255, 0.38);
border-radius: var(--launcher-radius-card);
background: rgba(8, 8, 10, 0.72);
color: var(--text-primary);
content: "Отпустите файл, чтобы загрузить";
font-size: 1rem;
font-weight: 850;
pointer-events: none;
}
.media-main,
.media-preview-panel {
min-width: 0;
min-height: 0;
border-radius: var(--launcher-radius-card);
background: rgba(255, 255, 255, 0.04);
}
.media-main {
position: relative;
display: grid;
grid-template-rows: auto minmax(0, 1fr);
overflow: hidden;
}
.media-breadcrumbs {
display: flex;
min-width: 0;
align-items: center;
gap: 0.25rem;
overflow-x: auto;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
padding: 0.62rem 0.78rem;
scrollbar-width: none;
}
.media-breadcrumbs::-webkit-scrollbar {
display: none;
}
.media-breadcrumb-button {
display: inline-flex;
min-height: 2rem;
align-items: center;
border-radius: var(--launcher-radius-circle);
background: rgba(255, 255, 255, 0.06);
color: var(--text-muted);
padding: 0 0.68rem;
font-size: 0.7rem;
font-weight: 850;
white-space: nowrap;
}
.media-breadcrumb-button::after {
margin-left: 0.5rem;
color: rgba(255, 255, 255, 0.28);
content: "";
}
.media-breadcrumb-button[data-active="true"] {
background: rgba(255, 255, 255, 0.92);
color: rgba(8, 8, 10, 0.96);
}
.media-breadcrumb-button[data-active="true"]::after {
content: "";
margin: 0;
}
.media-columns {
display: flex;
min-height: 0;
overflow: auto;
padding: 0.72rem;
scroll-padding-inline: 0.72rem;
}
.media-column {
display: grid;
grid-template-rows: auto minmax(0, 1fr);
width: clamp(14rem, 24vw, 19rem);
min-width: clamp(14rem, 24vw, 19rem);
min-height: 0;
overflow: hidden;
border-right: 1px solid rgba(255, 255, 255, 0.06);
padding-right: 0.62rem;
margin-right: 0.62rem;
}
.media-column:last-child {
border-right: 0;
margin-right: 0;
}
.media-column-head {
display: flex;
min-width: 0;
align-items: center;
justify-content: space-between;
gap: 0.65rem;
padding: 0.18rem 0.1rem 0.58rem;
}
.media-column-title {
overflow: hidden;
color: var(--text-primary);
font-size: 0.78rem;
font-weight: 850;
text-overflow: ellipsis;
white-space: nowrap;
}
.media-column-count {
display: inline-grid;
min-width: 1.65rem;
height: 1.65rem;
place-items: center;
border-radius: 999px;
background: rgba(255, 255, 255, 0.07);
color: var(--text-muted);
font-size: 0.68rem;
font-weight: 850;
}
.media-column-list {
display: grid;
align-content: start;
gap: 0.22rem;
min-height: 0;
overflow: auto;
padding-right: 0.12rem;
padding-bottom: 0.45rem;
scroll-padding-block: 0.5rem;
scrollbar-width: thin;
}
.media-column-list[data-drop-active="true"] {
border-radius: var(--launcher-radius-control);
outline: 1px solid rgba(255, 255, 255, 0.34);
outline-offset: -1px;
}
.media-column-empty {
color: var(--text-muted);
font-size: 0.76rem;
font-weight: 720;
padding: 0.8rem 0.25rem;
}
.media-empty {
position: absolute;
inset: 0;
display: grid;
place-items: center;
color: var(--text-muted);
font-size: 0.92rem;
font-weight: 720;
}
.media-entry {
display: grid;
grid-template-columns: 3rem minmax(0, 1fr) auto auto;
min-width: 0;
min-height: 3.35rem;
align-items: center;
gap: 0.58rem;
border: 0;
border-radius: var(--launcher-radius-control);
background: rgba(255, 255, 255, 0.038);
padding: 0.28rem 0.5rem 0.28rem 0.28rem;
color: var(--text-secondary);
text-align: left;
}
.media-entry:hover {
background: rgba(255, 255, 255, 0.075);
color: var(--text-primary);
}
.media-entry[data-active="true"] {
background: rgba(255, 255, 255, 0.14);
color: var(--text-primary);
}
.media-entry[data-dragging="true"] {
opacity: 0.48;
}
.media-entry[data-drop-active="true"] {
background: rgba(255, 255, 255, 0.16);
outline: 1px solid rgba(255, 255, 255, 0.38);
outline-offset: -1px;
}
.media-entry-icon {
display: grid;
width: 3rem;
height: 3rem;
place-items: center;
border-radius: 0.82rem;
background: rgba(255, 255, 255, 0.07);
color: rgba(255, 255, 255, 0.52);
font-size: 0.64rem;
font-weight: 850;
overflow: hidden;
}
.media-entry[data-type="directory"] .media-entry-icon {
background: rgba(255, 255, 255, 0.12);
color: rgba(255, 255, 255, 0.76);
}
.media-entry-icon.is-preview {
background: rgba(255, 255, 255, 0.1);
}
.media-entry-icon.is-preview img,
.media-entry-icon.is-preview video {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
.media-entry-copy {
display: grid;
min-width: 0;
gap: 0.1rem;
}
.media-entry-name,
.media-entry-meta {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.media-entry-name {
color: var(--text-primary);
font-size: 0.78rem;
font-weight: 820;
}
.media-entry-meta {
color: var(--text-muted);
font-size: 0.64rem;
font-weight: 680;
}
.media-entry-status {
position: static;
flex: 0 0 auto;
}
.media-entry-arrow {
color: var(--text-muted);
font-size: 1.25rem;
line-height: 1;
}
.media-preview img,
.media-preview video {
display: block;
width: 100%;
height: 100%;
object-fit: contain;
}
.media-preview video {
object-fit: cover;
}
.media-status-dot,
.media-usage-dot {
display: block;
width: 0.58rem;
height: 0.58rem;
border-radius: 50%;
background: rgba(255, 255, 255, 0.36);
box-shadow: 0 0 0 0.22rem rgba(255, 255, 255, 0.06);
}
.media-status-dot {
position: absolute;
top: 0.48rem;
right: 0.48rem;
}
.media-status-dot.media-entry-status {
position: static;
top: auto;
right: auto;
}
.media-status-dot[data-status="rendered"],
.media-usage-pill[data-status="rendered"] .media-usage-dot {
background: #58d77a;
box-shadow: 0 0 0 0.22rem rgba(88, 215, 122, 0.16);
}
.media-status-dot[data-status="referenced"],
.media-usage-pill[data-status="referenced"] .media-usage-dot {
background: #ffd36a;
box-shadow: 0 0 0 0.22rem rgba(255, 211, 106, 0.16);
}
.media-status-dot[data-status="unused"],
.media-usage-pill[data-status="unused"] .media-usage-dot {
background: rgba(255, 255, 255, 0.34);
}
.media-status-dot[data-status="trash"],
.media-usage-pill[data-status="trash"] .media-usage-dot {
background: #8aa4ff;
box-shadow: 0 0 0 0.22rem rgba(138, 164, 255, 0.16);
}
.media-preview-name,
.media-preview-path,
.media-preview-meta {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.media-preview-panel {
position: relative;
display: grid;
grid-template-rows: auto auto auto 1fr;
align-content: stretch;
gap: 0.9rem;
padding: 0.8rem;
padding-bottom: calc(var(--nodedc-shell-control-height) + 1rem);
}
.media-preview {
display: grid;
aspect-ratio: 1.25;
width: 100%;
place-items: center;
overflow: hidden;
border-radius: var(--launcher-radius-control);
background: rgba(255, 255, 255, 0.05);
color: var(--text-muted);
font-size: 0.86rem;
font-weight: 850;
}
.media-preview-copy {
display: grid;
gap: 0.22rem;
min-width: 0;
}
.media-preview-name {
color: var(--text-primary);
font-size: 0.92rem;
font-weight: 850;
}
.media-preview-path,
.media-preview-meta {
color: var(--text-muted);
font-size: 0.72rem;
font-weight: 680;
}
.media-usage-pill {
display: inline-flex;
width: fit-content;
max-width: 100%;
align-items: center;
gap: 0.48rem;
border-radius: var(--launcher-radius-circle);
background: rgba(255, 255, 255, 0.07);
color: var(--text-secondary);
padding: 0.48rem 0.68rem;
font-size: 0.72rem;
font-weight: 850;
}
.media-preview-actions {
display: flex;
align-items: end;
gap: 0.55rem;
align-self: end;
flex-wrap: wrap;
padding-right: calc(var(--admin-control-ring) + 0.65rem);
}
.media-delete-btn {
position: absolute;
right: 0.8rem;
bottom: 0.8rem;
display: inline-grid;
width: var(--admin-control-ring);
min-width: var(--admin-control-ring);
height: var(--admin-control-ring);
place-items: center;
border: 1px solid rgba(255, 255, 255, 0.22);
border-radius: var(--launcher-radius-circle);
background: transparent;
color: rgba(255, 255, 255, 0.8);
padding: 0;
line-height: 1;
}
.media-delete-btn:hover {
border-color: rgba(255, 255, 255, 0.3);
background: rgba(255, 255, 255, 0.07);
color: var(--text-primary);
}
.media-delete-btn:disabled {
display: none;
}
.media-context-menu {
position: fixed;
z-index: 320;
display: grid;
min-width: 12rem;
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: var(--launcher-radius-control);
background: rgba(34, 34, 38, 0.94);
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.42);
padding: 0.35rem;
backdrop-filter: blur(22px) saturate(1.15);
-webkit-backdrop-filter: blur(22px) saturate(1.15);
}
.media-context-menu.hidden {
display: none;
}
.media-context-menu button {
display: flex;
min-height: 2.25rem;
align-items: center;
border-radius: calc(var(--launcher-radius-control) - 0.18rem);
background: transparent;
color: var(--text-secondary);
padding: 0 0.72rem;
font-size: 0.76rem;
font-weight: 780;
text-align: left;
}
.media-context-menu button:hover {
background: rgba(255, 255, 255, 0.09);
color: var(--text-primary);
}
.media-context-menu button:disabled {
opacity: 0.38;
pointer-events: none;
}
.media-action-modal-layer {
z-index: 300;
}
.media-action-modal {
width: min(28rem, calc(100vw - 2.8rem));
}
.media-action-head {
padding-right: 1.25rem;
}
.media-action-body {
padding: 0 1.25rem 1.25rem;
}
.media-action-foot {
justify-content: flex-end;
}
.media-modal-foot {
justify-content: space-between;
}
@media (max-width: 1100px) {
body {
overflow: auto;
@ -1808,6 +2459,29 @@ textarea {
.template-list {
grid-template-columns: 1fr;
}
.media-toolbar {
grid-template-columns: 1fr;
align-items: stretch;
}
.media-filter-row {
max-width: 100%;
}
.media-browser {
grid-template-columns: 1fr;
}
.media-preview-panel {
grid-template-columns: 9rem minmax(0, 1fr);
grid-template-rows: auto auto;
}
.media-preview-actions,
.media-usage-pill {
grid-column: 2;
}
}
@media (max-width: 720px) {
@ -1875,6 +2549,26 @@ textarea {
.service-media-preview {
display: none;
}
.media-modal {
width: 100vw;
height: 100vh;
max-height: 100vh;
border-radius: 0;
}
.media-columns {
padding: 0.55rem;
}
.media-preview-panel {
grid-template-columns: 1fr;
}
.media-preview-actions,
.media-usage-pill {
grid-column: auto;
}
}
@media (max-width: 480px) {

File diff suppressed because it is too large Load Diff

View File

@ -145,7 +145,13 @@
<span aria-hidden="true"></span>
</button>
<button id="delete-block" class="icon-action-btn danger-action-btn" type="button" title="Удалить блок" aria-label="Удалить блок">
<span aria-hidden="true"></span>
<svg class="trash-can-icon" viewBox="0 0 24 24" aria-hidden="true" focusable="false">
<path d="M3.75 6.75h16.5" />
<path d="M8.25 6.75V4.9c0-.64.51-1.15 1.15-1.15h5.2c.64 0 1.15.51 1.15 1.15v1.85" />
<path d="M6.25 6.75l.7 12.15c.06.78.7 1.35 1.47 1.35h7.16c.77 0 1.41-.57 1.47-1.35l.7-12.15" />
<path d="M10 10.75v5.5" />
<path d="M14 10.75v5.5" />
</svg>
</button>
</div>
</div>
@ -205,6 +211,98 @@
</footer>
</article>
</div>
<div id="media-modal" class="template-modal-layer media-modal-layer hidden" role="dialog" aria-modal="true" aria-labelledby="media-modal-title">
<article class="template-modal media-modal">
<header class="template-modal-head media-modal-head">
<div>
<div class="section-kicker">Медиатека</div>
<h2 id="media-modal-title">Выбрать файл</h2>
<p id="media-modal-subtitle">Существующие файлы на сервере и загрузки для текущего поля.</p>
</div>
<div class="media-modal-actions">
<span id="media-site-size" class="media-site-size">Сайт: считаем...</span>
<button id="media-trash-toggle" class="admin-panel-close media-header-action media-trash-toggle" type="button" aria-label="Недавно удалённые" title="Недавно удалённые">
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M3.75 6.75h16.5" />
<path d="M8.25 6.75V4.9c0-.64.51-1.15 1.15-1.15h5.2c.64 0 1.15.51 1.15 1.15v1.85" />
<path d="M6.25 6.75l.7 12.15c.06.78.7 1.35 1.47 1.35h7.16c.77 0 1.41-.57 1.47-1.35l.7-12.15" />
<path d="M10 10.75v5.5" />
<path d="M14 10.75v5.5" />
</svg>
</button>
<button id="media-modal-close" class="admin-panel-close modal-close-button media-header-action" type="button" aria-label="Закрыть">×</button>
</div>
</header>
<div class="media-toolbar">
<label class="media-search">
<span>Поиск</span>
<input id="media-search" type="search" autocomplete="off" placeholder="Имя, папка, путь" />
</label>
<div id="media-kind-filters" class="media-filter-row media-kind-row" aria-label="Тип файла"></div>
<div id="media-root-filters" class="media-filter-row media-root-row" aria-label="Корень файлов"></div>
<button id="media-upload" class="primary-btn media-upload-btn" type="button">+ Загрузить</button>
</div>
<div id="media-drop-zone" class="media-browser media-browser-columns">
<section class="media-main">
<div id="media-breadcrumbs" class="media-breadcrumbs"></div>
<div id="media-list" class="media-columns"></div>
<div id="media-empty" class="media-empty hidden">Папка пуста.</div>
</section>
<aside class="media-preview-panel">
<div id="media-preview" class="media-preview">
<span>FILE</span>
</div>
<div class="media-preview-copy">
<div id="media-preview-name" class="media-preview-name">Выберите файл</div>
<div id="media-preview-path" class="media-preview-path"></div>
<div id="media-preview-meta" class="media-preview-meta"></div>
</div>
<div id="media-preview-usage" class="media-usage-pill" data-status="idle">
<span class="media-usage-dot"></span>
<span>Нет выбора</span>
</div>
<div class="media-preview-actions">
<button id="media-select" class="primary-btn" type="button" disabled>Выбрать</button>
<button id="media-delete" class="danger-btn media-delete-btn" type="button" aria-label="Удалить файл" title="Удалить файл" disabled>
<svg viewBox="0 0 24 24" aria-hidden="true">
<path d="M3.75 6.75h16.5" />
<path d="M8.25 6.75V4.9c0-.64.51-1.15 1.15-1.15h5.2c.64 0 1.15.51 1.15 1.15v1.85" />
<path d="M6.25 6.75l.7 12.15c.06.78.7 1.35 1.47 1.35h7.16c.77 0 1.41-.57 1.47-1.35l.7-12.15" />
<path d="M10 10.75v5.5" />
<path d="M14 10.75v5.5" />
</svg>
</button>
</div>
</aside>
</div>
<footer class="template-modal-foot media-modal-foot">
<button id="media-refresh" class="ghost-btn" type="button">Обновить список</button>
<button id="media-modal-cancel" class="ghost-btn" type="button">Отмена</button>
</footer>
</article>
</div>
<div id="media-context-menu" class="media-context-menu hidden" role="menu"></div>
<div id="media-action-modal" class="template-modal-layer media-action-modal-layer hidden" role="dialog" aria-modal="true" aria-labelledby="media-action-title">
<article class="template-modal media-action-modal">
<header class="template-modal-head media-action-head">
<div>
<div class="section-kicker">Файл-менеджер</div>
<h2 id="media-action-title">Действие</h2>
<p id="media-action-body">Введите имя.</p>
</div>
</header>
<div class="media-action-body">
<label class="field-control">
<span id="media-action-label">Имя</span>
<input id="media-action-input" type="text" autocomplete="off" />
</label>
</div>
<footer class="template-modal-foot media-action-foot">
<button id="media-action-cancel" class="ghost-btn" type="button">Отмена</button>
<button id="media-action-confirm" class="primary-btn" type="button">Подтвердить</button>
</footer>
</article>
</div>
<script src="./admin.js" type="module"></script>
</body>
</html>

View File

@ -4,3 +4,4 @@
.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}}
[data-module=notification-w][data-notification-stack-ready]{height:auto;max-height:calc(100svh - 3.2rem);overflow:visible;scrollbar-width:none;overscroll-behavior:contain}[data-module=notification-w][data-notification-stack-ready]::-webkit-scrollbar{display:none}[data-module=notification-w][data-notification-stack-ready]:not(:hover):not([data-notification-expanded=true]){height:var(--notification-collapsed-height,6.6rem);max-height:var(--notification-collapsed-height,6.6rem)}[data-module=notification-w][data-notification-stack-ready]:is(:hover,[data-notification-expanded=true]){overflow-x:visible;overflow-y:auto;padding-bottom:.2rem}[data-module=notification-w][data-notification-stack-ready]>[data-module=notification]{position:relative;z-index:var(--notification-z,1);transform:translateY(var(--notification-stack-y,0));transition:transform .3s cubic-bezier(.22,1,.36,1)}[data-module=notification-w][data-notification-stack-ready]:is(:hover,[data-notification-expanded=true])>[data-module=notification]{transform:translateY(0)}
.dock-icon.ssscript{overflow:hidden;background-color:transparent;background-image:none}.dock-icon.ssscript>img{display:block;width:100%;height:100%;max-width:none;object-fit:cover;border-radius:inherit}

View File

@ -4,3 +4,4 @@
.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}}
[data-module=notification-w][data-notification-stack-ready]{height:auto;max-height:calc(100svh - 3.2rem);overflow:visible;scrollbar-width:none;overscroll-behavior:contain}[data-module=notification-w][data-notification-stack-ready]::-webkit-scrollbar{display:none}[data-module=notification-w][data-notification-stack-ready]:not(:hover):not([data-notification-expanded=true]){height:var(--notification-collapsed-height,6.6rem);max-height:var(--notification-collapsed-height,6.6rem)}[data-module=notification-w][data-notification-stack-ready]:is(:hover,[data-notification-expanded=true]){overflow-x:visible;overflow-y:auto;padding-bottom:.2rem}[data-module=notification-w][data-notification-stack-ready]>[data-module=notification]{position:relative;z-index:var(--notification-z,1);transform:translateY(var(--notification-stack-y,0));transition:transform .3s cubic-bezier(.22,1,.36,1)}[data-module=notification-w][data-notification-stack-ready]:is(:hover,[data-notification-expanded=true])>[data-module=notification]{transform:translateY(0)}
.dock-icon.ssscript{overflow:hidden;background-color:transparent;background-image:none}.dock-icon.ssscript>img{display:block;width:100%;height:100%;max-width:none;object-fit:cover;border-radius:inherit}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 522 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

@ -83,16 +83,52 @@
"items": [
{
"enabled": true,
"title": "NODE.DC",
"href": "https://id.nodedc.ru/",
"title": "HUB",
"href": "https://hub.nodedc.ru/",
"linkTarget": "",
"targetId": "app-data",
"iconSrc": "./assets/uploads/images/static-elements/dclogo_white_alpha-mqus5if2.png",
"iconSrc": "./assets/uploads/images/static-elements/icon_hub-mqwd0sn0.png",
"iconAlt": "Иконка NODE.DC",
"className": "dock-icon ssscript",
"iconClass": "logo",
"dividerBefore": false
},
{
"enabled": true,
"title": "ENGINE",
"href": "https://engine.nodedc.ru/",
"linkTarget": "",
"targetId": "",
"iconSrc": "./assets/uploads/images/static-elements/icon_engine-mqwd2fut.png",
"iconAlt": "Иконка приложения",
"className": "dock-icon ssscript",
"iconClass": "logo",
"dividerBefore": false
},
{
"enabled": true,
"title": "OPS",
"href": "https://ops.nodedc.ru/",
"linkTarget": "",
"targetId": "",
"iconSrc": "./assets/uploads/images/static-elements/icon_ops-mqwdtmpk.png",
"iconAlt": "Иконка приложения",
"className": "dock-icon ssscript",
"iconClass": "logo",
"dividerBefore": false
},
{
"enabled": true,
"title": "BIM",
"href": "https://bim.nodedc.tech/",
"linkTarget": "",
"targetId": "",
"iconSrc": "./assets/uploads/images/static-elements/icon_bim-mqwedhun.png",
"iconAlt": "Иконка приложения",
"className": "dock-icon ssscript",
"iconClass": "logo",
"dividerBefore": false
},
{
"enabled": true,
"title": "Корзина",
@ -109,9 +145,9 @@
},
"assets": {
"webglModelSrc": "./assets/custom/icon.glb",
"logoPng": "./assets/uploads/images/static-elements/2025-05-14-23.46.35-mqvznn10.jpg",
"logoPng": "./assets/uploads/images/Logo/2025-05-14-23.46.35-mqvznn10.jpg",
"logoPngAlt": "Логотип NODE.DC",
"appIconSrc": "./assets/uploads/images/static-elements/dclogo_white_alpha-mqus5if2.png",
"appIconSrc": "./assets/uploads/images/Logo/dclogo_white_alpha-mqus5if2.png",
"appIconAlt": "Иконка NODE.DC",
"appWordmarkSrc": "./assets/webflow/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc",
"appWordmarkAlt": "Логотип NODE.DC"
@ -226,10 +262,10 @@
"href": "javascript:void(0)",
"linkTarget": "",
"targetId": "",
"iconSrc": "./assets/webflow/images/69ad964d951f9d17cc5a919e_logo-app.svg",
"iconAlt": "Иконка приложения",
"iconSrc": "",
"iconAlt": "",
"className": "dock-icon ssscript",
"iconClass": "logo",
"iconClass": "",
"dividerBefore": false
},
"itemFields": [
@ -406,7 +442,7 @@
"legalHtml": "<a href=\"https://docs.google.com/document/d/1vME2w8ZB88HoH-JyvkkiL7exrcMfWhkERfFRlnIeZFA/edit?usp=sharing\" target=\"_blank\">Политика конфиденциальности</a> • <a href=\"https://docs.google.com/document/d/1vME2w8ZB88HoH-JyvkkiL7exrcMfWhkERfFRlnIeZFA/edit?usp=sharing\" target=\"_blank\">Политика cookie</a><br/>© — Все права защищены<br/>2026",
"accessCard": {
"enabled": true,
"iconSrc": "./assets/uploads/images/hero-waitlist/dclogo_white_alpha-mquue8ar.png",
"iconSrc": "./assets/uploads/images/Logo/dclogo_white_alpha-mqus5if2.png",
"iconAlt": "Иконка NODE.DC",
"wordmarkSrc": "./assets/webflow/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc",
"wordmarkAlt": "Логотип NODE.DC",
@ -784,7 +820,7 @@
"anchor": "features",
"content": {
"windowTitle": "NDC_HUB.mp4",
"videoSrc": "./assets/uploads/media/feature-video/ndc_hub_base-mqv741eh.mp4",
"videoSrc": "./assets/uploads/media/ai-modes/ndc_hub_base-mqv6lm07.mp4",
"heading": {
"muted": "HUB",
"main": "точка входа в платформу "
@ -1066,7 +1102,7 @@
"anchor": "features",
"content": {
"windowTitle": "ENGINE_HUB.mp4",
"videoSrc": "./assets/uploads/media/feature-video-copy/ndc_engine_base-mqv82irv.mp4",
"videoSrc": "./assets/uploads/media/ai-modes/ndc_engine_base-mqv6lvyr.mp4",
"heading": {
"muted": "ENGINE",
"main": "Слой разработки"
@ -1350,7 +1386,7 @@
"anchor": "features",
"content": {
"windowTitle": "OPS_HUB.mp4",
"videoSrc": "./assets/uploads/media/feature-video-copy-copy/ndc_ops_blur-mqv99k3r.mp4",
"videoSrc": "./assets/uploads/media/ai-modes/ndc_ops_blur-mqv6ss6k.mp4",
"heading": {
"muted": "OPS",
"main": "Операционный слой"
@ -3193,7 +3229,7 @@
"content": {
"target": "demo-video",
"to": "features",
"iconSrc": "./assets/webflow/images/69aab66f030013f2c7177d78_mov-file.avif",
"iconSrc": "./assets/uploads/media/ai-modes/ndc_hub_base-mqv6lm07.mp4",
"iconAlt": "Иконка MOV-файла.",
"label": "демо-видео.txt"
},
@ -3245,7 +3281,7 @@
"enabled": true,
"content": {
"footer": {
"appIconSrc": "./assets/uploads/images/footer/dclogo_white_alpha-mquumh7v.png",
"appIconSrc": "./assets/uploads/images/Logo/dclogo_white_alpha-mqus5if2.png",
"appIconAlt": "Иконка NODE.DC",
"wordmarkSrc": "./assets/webflow/images/69ad96a28b06b7552a339137_logtype.svg?v=node-dc",
"wordmarkAlt": "Логотип NODE.DC",

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff