feat: Page Editor UX Phase 1 - live preview, hover mapping, visual layout picker

- PreviewHighlightService + appHighlightSource directive: shared hover/focus bridge between editor fields and the schematic live preview.
- BuilderLivePreviewComponent: in-page schematic homepage render (header/hero/blocks/footer) reading the same bootstrap the sections mutate, highlighting the area matching the active field.
- VisualLayoutPickerComponent: card-based layout picker (ControlValueAccessor, same shape as app-select) replacing the raw layout <select> in homepage-section.
- app-form-field gains optional usedBy/usedByLabel inputs for the "Where is this used?" helper text, wired into aria-describedby.
- Wired homepage/branding/theme sections with highlight sources + usedBy hints; live preview panel shown in project-editor-page for those three sections.
- All new copy added as translation keys (en/ru/hy).
This commit is contained in:
sdarbinyan
2026-07-27 10:00:42 +04:00
parent 96c1527d1b
commit 42f11dd8c0
24 changed files with 735 additions and 45 deletions

View File

@@ -868,6 +868,18 @@ export const en: Translations = {
homepageEmptyTitle: 'No homepage configured',
homepageEmptyDesc: 'Your marketplace does not have a homepage set up yet. Contact support to get one created.',
homepageBlocksHint: 'These are the blocks customers see on your homepage, top to bottom. Drag the handle to reorder.',
livePreviewTitle: 'Live preview',
livePreviewHint: 'Hover a field to see what it changes.',
livePreviewEmpty: 'Nothing to preview yet.',
livePreviewButtonLabel: 'Shop now',
usedByLabel: 'Used by:',
usedByHeader: 'Header',
usedByFooter: 'Footer',
usedBySeo: 'Search results',
usedByButtons: 'Buttons',
usedByLinks: 'Links',
usedByBadges: 'Badges',
usedByPageBackground: 'Page background',
addBlockHint: 'Add a block to your homepage:',
dragToReorder: 'Drag to reorder',
blockRemoveConfirm: 'Remove this block from the homepage?',

View File

@@ -868,6 +868,18 @@ export const hy: Translations = {
homepageEmptyTitle: 'Գլխավոր էջը կարգավորված չէ',
homepageEmptyDesc: 'Ձեր խանութն դեռ չունի կարգավորված գլխավոր էջ։ Ստեղծելու համար դիմեք աջակցության թիմին։',
homepageBlocksHint: 'Սրանք են բլոկները, որոնք գնորդները տեսնում են գլխավոր էջում վերևից ներքև։ Քաշեք բռնակից՝ կարգը փոխելու համար։',
livePreviewTitle: 'Կենդանի նախադիտում',
livePreviewHint: 'Անցկացրեք դաշտի վրա՝ տեսնելու համար, թե ինչ է այն փոխում։',
livePreviewEmpty: 'Դեռ ցուցադրելու բան չկա։',
livePreviewButtonLabel: 'Գնումներ',
usedByLabel: 'Օգտագործվում է՝',
usedByHeader: 'Վերնագիր',
usedByFooter: 'Ստորագիր',
usedBySeo: 'Որոնման արդյունքներ',
usedByButtons: 'Կոճակներ',
usedByLinks: 'Հղումներ',
usedByBadges: 'Կրծքանշաններ',
usedByPageBackground: 'Էջի ֆոն',
addBlockHint: 'Ավելացնել բլոկ գլխավոր էջում.',
dragToReorder: 'Քաշեք՝ կարգը փոխելու համար',
blockRemoveConfirm: 'Հեռացնե՞լ այս բլոկը գլխավոր էջից։',

View File

@@ -868,6 +868,18 @@ export const ru: Translations = {
homepageEmptyTitle: 'Главная страница не настроена',
homepageEmptyDesc: 'В вашем магазине пока не настроена главная страница. Обратитесь в поддержку, чтобы её создать.',
homepageBlocksHint: 'Это блоки, которые покупатели видят на главной странице сверху вниз. Перетаскивайте за ручку, чтобы изменить порядок.',
livePreviewTitle: 'Живой предпросмотр',
livePreviewHint: 'Наведите курсор на поле, чтобы увидеть, что оно меняет.',
livePreviewEmpty: 'Пока нечего показать.',
livePreviewButtonLabel: 'В магазин',
usedByLabel: 'Используется в:',
usedByHeader: 'Шапка сайта',
usedByFooter: 'Подвал сайта',
usedBySeo: 'Результаты поиска',
usedByButtons: 'Кнопки',
usedByLinks: 'Ссылки',
usedByBadges: 'Значки',
usedByPageBackground: 'Фон страницы',
addBlockHint: 'Добавить блок на главную страницу:',
dragToReorder: 'Перетащите, чтобы изменить порядок',
blockRemoveConfirm: 'Удалить этот блок с главной страницы?',

View File

@@ -869,6 +869,18 @@ export interface Translations {
homepageBlocksHint: string;
addBlockHint: string;
dragToReorder: string;
livePreviewTitle: string;
livePreviewHint: string;
livePreviewEmpty: string;
livePreviewButtonLabel: string;
usedByLabel: string;
usedByHeader: string;
usedByFooter: string;
usedBySeo: string;
usedByButtons: string;
usedByLinks: string;
usedByBadges: string;
usedByPageBackground: string;
blockRemoveConfirm: string;
blockHero: string;
blockHeroDesc: string;