feat(builder): implement professional content management experience

Content dashboard with real published/draft/SEO-health/completion metrics and a recommended-next-action; static pages editor rebuilt as visual page cards (icon/status/SEO badge/last edited) with legal pages surfaced first; full-page editor grouped into Content/SEO/Sharing/Advanced tabs, raw HTML moved behind an Advanced disclosure; hero image now supports alt text and caption; content-health-widget is a reusable checklist+completion component.
This commit is contained in:
sdarbinyan
2026-07-18 11:02:26 +04:00
parent 04b36bab9b
commit b31c75214d
24 changed files with 1350 additions and 263 deletions

View File

@@ -937,6 +937,55 @@ export const en: Translations = {
previewMobile: 'Mobile',
previewToggle: 'Preview',
},
contentManagement: {
publishedPages: 'Published pages',
draftPages: 'Draft pages',
missingLegalPages: 'Missing legal pages',
seoHealth: 'SEO health',
lastEdited: 'Last edited',
lastEditedNever: 'Never',
completionLabel: 'Completion',
recommendedNext: 'Recommended next step',
recommendAddTitles: 'Some pages are missing a title in at least one language.',
recommendFixSeo: 'A page has an SEO field that needs fixing (canonical/OG image URL or robots value).',
recommendPublish: 'A required legal page is still a draft — publish it so customers can see it.',
recommendNone: 'Nice work — your content is in good shape.',
openAction: 'Open',
backToPages: 'Back to pages',
groupContent: 'Content',
groupSeo: 'SEO',
groupSharing: 'Sharing',
groupAdvanced: 'Advanced',
groupAdvancedHtml: 'Raw HTML (advanced)',
seoExplainDesc: 'This is what shows up in search results — a clear title and description help customers find this page.',
seoTitleHelp: 'The headline shown in search results. Keep it short and descriptive.',
seoDescriptionHelp: 'A short summary shown under the title in search results.',
seoCanonicalHelp: 'The official web address for this page, used to avoid duplicate-content issues.',
seoRobotsHelp: 'Controls whether search engines are allowed to list this page.',
sharingExplain: 'This is how the page looks when shared on social media (Facebook, Twitter/X, and others).',
mediaSelect: 'Choose image',
mediaReplace: 'Replace',
mediaRemove: 'Remove',
mediaAlt: 'Alt text',
mediaCaption: 'Caption',
emptyStateGuideTitle: 'Start building your storefront pages',
emptyStateGuideBody: 'Legal pages like About, Privacy, and Terms build trust with customers. We recommend publishing About, Contacts, Privacy, and Terms first, then adding Cookies, Delivery, Returns, and FAQ.',
seoStatusGood: 'SEO good',
seoStatusPartial: 'SEO partial',
seoStatusWarning: 'SEO issue',
seoStatusMissing: 'SEO missing',
needsAttention: 'Needs attention',
legal: {
about: { label: 'About', why: 'Tells customers who you are and builds trust before they buy.' },
contacts: { label: 'Contacts', why: 'Gives customers a way to reach you with questions or issues.' },
privacy: { label: 'Privacy', why: 'Explains how customer data is handled — often legally required.' },
terms: { label: 'Terms', why: 'Sets the rules for using your store — protects you and your customers.' },
cookies: { label: 'Cookies', why: 'Discloses cookie usage, required in many regions.' },
delivery: { label: 'Delivery', why: 'Sets clear shipping expectations and reduces support requests.' },
returns: { label: 'Returns', why: 'Explains your refund policy and builds purchase confidence.' },
faq: { label: 'FAQ', why: 'Answers common questions before customers have to ask.' },
},
},
widgets: {
unavailable: 'Widget unavailable',
},

View File

@@ -937,6 +937,55 @@ export const hy: Translations = {
previewMobile: 'Հեռախոս',
previewToggle: 'Նախադիտում',
},
contentManagement: {
publishedPages: 'Հրապարակված էջեր',
draftPages: 'Սևագրեր',
missingLegalPages: 'Բացակայող իրավական էջեր',
seoHealth: 'SEO վիճակ',
lastEdited: 'Վերջին փոփոխություն',
lastEditedNever: 'Երբեք',
completionLabel: 'Ավարտվածություն',
recommendedNext: 'Հաջորդ առաջարկվող քայլը',
recommendAddTitles: 'Որոշ էջեր չունեն վերնագիր առնվազն մեկ լեզվով։',
recommendFixSeo: 'Մի էջ ունի ուղղման կարիք ունեցող SEO դաշտ (canonical/OG պատկեր կամ robots)։',
recommendPublish: 'Պարտադիր իրավական էջը դեռ սևագիր է․ հրապարակեք այն։',
recommendNone: 'Հիանալի է․ բովանդակությունը լավ վիճակում է։',
openAction: 'Բացել',
backToPages: 'Վերադառնալ էջերին',
groupContent: 'Բովանդակություն',
groupSeo: 'SEO',
groupSharing: 'Տարածում',
groupAdvanced: 'Լրացուցիչ',
groupAdvancedHtml: 'Հում HTML (լրացուցիչ)',
seoExplainDesc: 'Սա այն է, ինչ երևում է որոնման արդյունքներում․ հստակ վերնագիրն ու նկարագրությունը օգնում են հաճախորդներին գտնել այս էջը։',
seoTitleHelp: 'Վերնագիրը, որ երևում է որոնման արդյունքներում։ Պահեք կարճ և հստակ։',
seoDescriptionHelp: 'Կարճ նկարագրություն՝ վերնագրի տակ, որոնման արդյունքներում։',
seoCanonicalHelp: 'Էջի պաշտոնական հասցեն՝ կրկնվող բովանդակության խնդիրներից խուսափելու համար։',
seoRobotsHelp: 'Կարգավորում է՝ արդյոք որոնողական համակարգերին թույլատրվում է ցուցադրել այս էջը։',
sharingExplain: 'Այսպես է էջը երևում սոցիալական ցանցերում կիսվելիս (Facebook, Twitter/X և այլն)։',
mediaSelect: 'Ընտրել պատկեր',
mediaReplace: 'Փոխարինել',
mediaRemove: 'Հեռացնել',
mediaAlt: 'Alt տեքստ',
mediaCaption: 'Ենթագիր',
emptyStateGuideTitle: 'Սկսեք ստեղծել ձեր խանութի էջերը',
emptyStateGuideBody: 'Իրավական էջերը՝ ինչպիսիք են Մեր մասին, Գաղտնիություն և Պայմաններ, մեծացնում են հաճախորդների վստահությունը։ Խորհուրդ ենք տալիս նախ հրապարակել Մեր մասին, Կապ, Գաղտնիություն և Պայմաններ, ապա ավելացնել Cookies, Առաքում, Վերադարձներ և ՀՏՀ։',
seoStatusGood: 'SEO լավ է',
seoStatusPartial: 'SEO մասնակի',
seoStatusWarning: 'SEO խնդիր',
seoStatusMissing: 'SEO բացակայում է',
needsAttention: 'Ուշադրություն է պահանջում',
legal: {
about: { label: 'Մեր մասին', why: 'Ասում է հաճախորդներին, թե ով եք դուք, և վստահություն է ստեղծում գնումից առաջ։' },
contacts: { label: 'Կապ', why: 'Հաճախորդներին հնարավորություն է տալիս կապվել հարցերով։' },
privacy: { label: 'Գաղտնիություն', why: 'Բացատրում է, թե ինչպես են մշակվում տվյալները․ հաճախ պահանջվում է օրենքով։' },
terms: { label: 'Պայմաններ', why: 'Սահմանում է խանութից օգտվելու կանոնները՝ պաշտպանելով և՛ ձեզ, և՛ հաճախորդներին։' },
cookies: { label: 'Cookies', why: 'Բացահայտում է cookie-ների օգտագործումը՝ պահանջվում է շատ երկրներում։' },
delivery: { label: 'Առաքում', why: 'Սահմանում է հստակ առաքման ակնկալիքներ և նվազեցնում աջակցության հարցումները։' },
returns: { label: 'Վերադարձներ', why: 'Բացատրում է վերադարձի քաղաքականությունը և մեծացնում գնման վստահությունը։' },
faq: { label: 'ՀՏՀ', why: 'Պատասխանում է հաճախակի հարցերին նախապես։' },
},
},
widgets: {
unavailable: 'Վիջեթը հասանելի չէ',
},

View File

@@ -937,6 +937,55 @@ export const ru: Translations = {
previewMobile: 'Телефон',
previewToggle: 'Превью',
},
contentManagement: {
publishedPages: 'Опубликованные страницы',
draftPages: 'Черновики',
missingLegalPages: 'Отсутствующие юридические страницы',
seoHealth: 'SEO-здоровье',
lastEdited: 'Последнее изменение',
lastEditedNever: 'Никогда',
completionLabel: 'Готовность',
recommendedNext: 'Рекомендуемый следующий шаг',
recommendAddTitles: 'У некоторых страниц отсутствует заголовок хотя бы на одном языке.',
recommendFixSeo: 'На одной из страниц есть SEO-поле, которое нужно исправить (canonical/OG-изображение или robots).',
recommendPublish: 'Обязательная юридическая страница всё ещё черновик — опубликуйте её.',
recommendNone: 'Отлично — контент в хорошем состоянии.',
openAction: 'Открыть',
backToPages: 'Назад к страницам',
groupContent: 'Контент',
groupSeo: 'SEO',
groupSharing: 'Публикация в соцсетях',
groupAdvanced: 'Дополнительно',
groupAdvancedHtml: 'Исходный HTML (дополнительно)',
seoExplainDesc: 'Это то, что видно в результатах поиска — понятный заголовок и описание помогают клиентам найти страницу.',
seoTitleHelp: 'Заголовок, отображаемый в результатах поиска. Делайте его коротким и понятным.',
seoDescriptionHelp: 'Краткое описание под заголовком в результатах поиска.',
seoCanonicalHelp: 'Официальный адрес страницы — помогает избежать дублирования контента.',
seoRobotsHelp: 'Определяет, могут ли поисковые системы показывать эту страницу.',
sharingExplain: 'Так страница выглядит при публикации в соцсетях (Facebook, Twitter/X и другие).',
mediaSelect: 'Выбрать изображение',
mediaReplace: 'Заменить',
mediaRemove: 'Удалить',
mediaAlt: 'Альтернативный текст',
mediaCaption: 'Подпись',
emptyStateGuideTitle: 'Начните создавать страницы магазина',
emptyStateGuideBody: 'Юридические страницы, такие как О нас, Конфиденциальность и Условия, повышают доверие клиентов. Рекомендуем сначала опубликовать О нас, Контакты, Конфиденциальность и Условия, затем добавить Cookies, Доставку, Возвраты и FAQ.',
seoStatusGood: 'SEO в порядке',
seoStatusPartial: 'SEO частично',
seoStatusWarning: 'Проблема SEO',
seoStatusMissing: 'SEO отсутствует',
needsAttention: 'Требует внимания',
legal: {
about: { label: 'О нас', why: 'Рассказывает клиентам, кто вы, и повышает доверие перед покупкой.' },
contacts: { label: 'Контакты', why: 'Даёт клиентам способ связаться с вами по вопросам.' },
privacy: { label: 'Конфиденциальность', why: 'Объясняет, как обрабатываются данные клиентов — часто обязательно по закону.' },
terms: { label: 'Условия', why: 'Устанавливает правила использования магазина — защищает вас и клиентов.' },
cookies: { label: 'Cookies', why: 'Раскрывает использование cookie — требуется во многих регионах.' },
delivery: { label: 'Доставка', why: 'Задаёт понятные ожидания по доставке и снижает число обращений в поддержку.' },
returns: { label: 'Возвраты', why: 'Объясняет политику возврата и повышает уверенность в покупке.' },
faq: { label: 'Вопросы и ответы', why: 'Отвечает на частые вопросы заранее.' },
},
},
widgets: {
unavailable: 'Виджет недоступен',
},

View File

@@ -935,6 +935,55 @@ export interface Translations {
previewMobile: string;
previewToggle: string;
};
contentManagement: {
publishedPages: string;
draftPages: string;
missingLegalPages: string;
seoHealth: string;
lastEdited: string;
lastEditedNever: string;
completionLabel: string;
recommendedNext: string;
recommendAddTitles: string;
recommendFixSeo: string;
recommendPublish: string;
recommendNone: string;
openAction: string;
backToPages: string;
groupContent: string;
groupSeo: string;
groupSharing: string;
groupAdvanced: string;
groupAdvancedHtml: string;
seoExplainDesc: string;
seoTitleHelp: string;
seoDescriptionHelp: string;
seoCanonicalHelp: string;
seoRobotsHelp: string;
sharingExplain: string;
mediaSelect: string;
mediaReplace: string;
mediaRemove: string;
mediaAlt: string;
mediaCaption: string;
emptyStateGuideTitle: string;
emptyStateGuideBody: string;
seoStatusGood: string;
seoStatusPartial: string;
seoStatusWarning: string;
seoStatusMissing: string;
needsAttention: string;
legal: {
about: { label: string; why: string };
contacts: { label: string; why: string };
privacy: { label: string; why: string };
terms: { label: string; why: string };
cookies: { label: string; why: string };
delivery: { label: string; why: string };
returns: { label: string; why: string };
faq: { label: string; why: string };
};
};
widgets: {
unavailable: string;
};