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

@@ -0,0 +1,31 @@
<section class="content-dashboard">
<div class="content-dashboard__metrics">
<app-dashboard-metric labelKey="contentManagement.publishedPages" [value]="health().published.toString()" />
<app-dashboard-metric labelKey="contentManagement.draftPages" [value]="health().draft.toString()" />
<app-dashboard-metric labelKey="contentManagement.missingLegalPages" [value]="health().missingRequiredLegal.length.toString()" />
<app-dashboard-metric labelKey="contentManagement.seoHealth" [value]="seoHealthValue()" />
<app-dashboard-metric labelKey="contentManagement.lastEdited" [value]="lastEditedValue()" />
</div>
<div class="content-dashboard__row">
<app-card padding="md" class="content-dashboard__health">
<app-content-health-widget
titleKey="contentManagement.completionLabel"
[items]="legalItems()"
[completionPercent]="health().completionPercent"
/>
</app-card>
<app-card padding="md" class="content-dashboard__recommend">
<h4>{{ 'contentManagement.recommendedNext' | translate }}</h4>
<p>{{ health().recommendation.labelKey | translate }}</p>
<div class="content-dashboard__recommend-actions">
@if (health().recommendation.pageId) {
<app-button variant="primary" size="sm" (click)="goRecommended()">{{ 'contentManagement.openAction' | translate }}</app-button>
} @else if (health().recommendation.kind === 'createLegal') {
<app-button variant="primary" size="sm" (click)="createPage.emit()">{{ 'builder.createPage' | translate }}</app-button>
}
</div>
</app-card>
</div>
</section>