Appearance
Landing Operating Standard
Обновлено: 2026-03-17
Назначение
Это канонический документ по продуктовой и технической модели landing.
Он фиксирует:
- public vs workspace границу;
- definition vs instance модель;
- publish/runtime contract;
- shell canon;
- access model;
- i18n model;
- owner operating rules.
Документ синхронизирован с текущим кодом в репозитории landing.
Scope
- Репозиторий:
/home/admin/workspace/landing - Prod:
https://landing.designcorp.eu - Dev:
https://dev.landing.designcorp.eu - GitHub board:
Project #10
Runtime Layout
- Dev runtime runs from
/home/admin/workspace/landingvialanding-dev.service. - Prod runtime runs only from
/opt/designcorp/landing/prod/currentvialanding-prod.service. - Prod releases are created under
/opt/designcorp/landing/prod/releases/<timestamp>-<sha>. - GitHub
maindeploy must create a temporarymainworktree from/home/admin/workspace/landingand remove it after deploy. - Permanent extra checkouts such as
/home/admin/workspace/landing-mainare not part of the canonical steady-state layout.
1. Product Model
landing — это не просто builder-страница, а полный контур:
Section Builder
- definition-driven authoring;
- draft -> publish to library;
- section defaults, bindings, settings, variants.
Landing Builder
- instance-driven page editing;
- block-level overrides;
- draft -> publish snapshot.
Templates
- immutable page snapshots;
- стартовая точка для
create-project.
Runtime
- published pages rendered from snapshots;
- canonical URL strategy;
- lead capture and project-level webhook/email delivery.
Owner Workspace
- admin / builder / section-builder / templates / leads / integrations / domains / media.
2. Public vs Workspace Model
Это две разные entry-модели.
Public
/{locale}/{locale}/{projectSlug}/{locale}/{projectSlug}/{pageSlug}- canonical host resolution:
- verified custom domain
- verified managed project subdomain
- fallback root-host route
Workspace
/{locale}/admin/{locale}/builder/{pageId}/{locale}/section-builder/{locale}/templates/{locale}/workspace
Правило:
- public routes индексируются и ведут в продукт;
- workspace routes — owner-only operational surfaces.
3. Definition vs Instance Contract
Это главный контракт всей системы.
Section Definition
- живёт в library;
- имеет version lifecycle;
- редактируется в
Section Builder; - publish создаёт новую published definition version.
Section Instance
- живёт внутри проекта/страницы;
- редактируется в
Landing Builder; - может иметь block-level overrides;
- pinned to
definitionVersionId.
Жёсткое правило:
- instance override не меняет library;
- новая published definition version не переписывает старые page instances автоматически.
4. Publish / Runtime Model
Project Draft
- changes happen in draft;
- autosave / ops + CAS;
- preview route reads current draft snapshot model.
Publish
- publish creates immutable page snapshot;
- snapshot becomes active runtime source;
- rollback activates previous snapshot version.
Runtime
- public runtime renders only from published snapshot;
- template preview and draft preview should stay as close as possible to runtime output;
- SEO and canonical metadata derive from the same public URL contract.
5. Workspace Shell Canon
Все owner surfaces должны идти через один WorkspaceShell contract.
Shell parts
Topbar
- route context
- actions
- environment/status
Left Rail
- navigation, library, outline, selected-node summary
Canvas / Content
- primary work surface
Right Inspector
- relevant editor controls only
Canonical rule
admin, builder, section-builder, templates, leads, domains, media должны ощущаться как один продукт, а не набор разных интерфейсов.
6. Section Builder Model
Section Builder — это definition-driven component tree editor.
Он не должен становиться:
- Figma-like free canvas;
- arbitrary CSS editor;
- pixel-perfect freeform tool.
Он должен оставаться:
- primitive-driven;
- schema-driven;
- token-driven.
Текущий authoring lifecycle:
New SectionEmptyилиPreset- Draft definition
- Node editing
- Autosave draft
Publish to Library
7. Landing Builder Model
Landing Builder редактирует page instances.
Current contract:
- section-level and block-level selection;
- instance overrides for mapped blocks;
- publish affects only page snapshot, not library definitions.
Target rule:
- любой поддержанный runtime block выбирается и редактируется как instance object;
- inspector behaves predictably for
Content / Media,Layout,Style.
8. Access Model
Owner access is a product rule, not a visual rule.
Protected surfaces
/{locale}/admin/{locale}/builder/{pageId}/{locale}/section-builder/{locale}/templates/{locale}/workspace- owner APIs:
/api/admin/**/api/pages/**/api/section-definitions/**/api/templates/**/api/constructor/bootstrap/api/media/**except public media content
Current session contract
- cookie:
landing_admin_session - roles:
ownermanager
- fallback integration access:
x-admin-token
Login path:
/{locale}/admin/login
Workspace entry:
/{locale}/workspace
9. I18n Model
Public/runtime
Supported locales:
ruenplua
Workspace
Current shipping scope:
ruen
Rule:
- workspace strings must be dictionary-driven;
- no critical owner flow may depend on hardcoded English copy.
10. Owner Operating Rules
Daily product path
- login
- choose template / create project
- open builder
- edit page instance blocks
- publish
- open live URL
- inspect leads / integrations / domains
Section authoring path
- open section-builder
- create or select definition
- edit defaults/settings/bindings
- publish to library
- use new section in landing builder
11. Dev Baseline Rules
stitch-prototype/home is the canonical clean baseline for:
- builder regression
- preview/runtime parity checks
- owner manual walkthroughs
12. Release Gate
Canonical release gate:
bash
cd /home/admin/workspace/landing
set -a && . ./.env.local && set +a
BASE_URL=https://dev.landing.designcorp.eu LOCALE=ru pnpm test:smoke:release-gateGate is go only if:
lint= passbuild= passeditor-stability= passtemplate-lifecycle= passintegrations= passoutbox= passruntime-parity= passlaunch= passowner-access= pass
If dev is polluted by smoke data, use baseline reset instead of manual database cleanup.