Some checks failed
Architecture Governance / architecture (push) Has been cancelled
Sprint G: audited every BootstrapConfig field for a real runtime consumer (docs/DEAD-CONFIG-AUDIT.md). Wired 3 previously-dead editable fields: footer.logoUrl, company.address.street/contacts.phone, catalog.suggestionsEnabled. Remaining dead fields needing a business/design decision tracked in PRODUCT_BACKLOG.md/KNOWN-ISSUES.md, not silently left. Sprint H: 6 new spec files (test count 57 -> 83), covering ProjectEditorFacade (undo/redo, draft persistence, publish gating), AdminAnalyticsFacade (never-fabricate-a-number contract), and regression coverage for this session's carousel/hero/profile-toggle fixes. Sprint I: widget settingsSchema (declared in widget-manifest.json, never validated) now enforced via a new lightweight schema check in ProjectValidator, surfaced through the existing issuesByField pipeline. Same check reused in diagnostics so editor and diagnostics can't disagree. Verification: tsc clean, ng build clean, 83/83 tests pass, barry-cache validate clean (2 pre-existing unrelated warnings only). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
58 lines
1.8 KiB
HTML
58 lines
1.8 KiB
HTML
<footer class="app-footer">
|
|
<div class="app-footer__container page-container">
|
|
<div class="app-footer__top">
|
|
<div class="app-footer__brand">
|
|
<app-logo [srcOverride]="footerLogoUrl()" />
|
|
<p>{{ 'footer.description' | translate }}</p>
|
|
</div>
|
|
|
|
@for (group of footerGroups(); track group.id) {
|
|
<div class="app-footer__group">
|
|
@if (group.title) {
|
|
<h4>{{ group.title }}</h4>
|
|
}
|
|
<ul>
|
|
@for (item of group.items; track item.id) {
|
|
<li>
|
|
@if (item.external) {
|
|
<a [href]="item.route" target="_blank" rel="noopener">{{ item.label | translate }}</a>
|
|
} @else {
|
|
<a [routerLink]="item.route | langRoute">{{ item.label | translate }}</a>
|
|
}
|
|
</li>
|
|
}
|
|
</ul>
|
|
</div>
|
|
}
|
|
|
|
<div class="app-footer__group">
|
|
<h4>{{ 'footer.payment' | translate }}</h4>
|
|
<div class="app-footer__payments">
|
|
@for (icon of paymentIcons(); track $index) {
|
|
<img [src]="icon.src" [alt]="icon.alt" loading="lazy" [width]="icon.width" [height]="icon.height" (error)="onImageError($event)" />
|
|
}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="app-footer__bottom">
|
|
<p>
|
|
@if (copyrightText()) {
|
|
{{ copyrightText() }}
|
|
} @else {
|
|
© {{ currentYear }} {{ brandName }}. {{ 'footer.allRightsReserved' | translate }}
|
|
}
|
|
</p>
|
|
@if (contactEmail) {
|
|
<a [href]="'mailto:' + contactEmail">{{ contactEmail }}</a>
|
|
}
|
|
@if (contactPhone) {
|
|
<a [href]="'tel:' + contactPhone">{{ contactPhone }}</a>
|
|
}
|
|
@if (companyAddress) {
|
|
<span class="app-footer__address">{{ companyAddress }}</span>
|
|
}
|
|
</div>
|
|
</div>
|
|
</footer>
|