2026-07-05 04:07:25 +04:00
|
|
|
|
<footer class="app-footer">
|
|
|
|
|
|
<div class="app-footer__container page-container">
|
|
|
|
|
|
<div class="app-footer__top">
|
|
|
|
|
|
<div class="app-footer__brand">
|
feat: dead-config sweep, test suite foundation, widget settingsSchema validation
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>
2026-08-05 20:47:13 +04:00
|
|
|
|
<app-logo [srcOverride]="footerLogoUrl()" />
|
2026-07-05 04:07:25 +04:00
|
|
|
|
<p>{{ 'footer.description' | translate }}</p>
|
2026-07-02 02:22:00 +04:00
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-07-05 04:07:25 +04:00
|
|
|
|
@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>
|
2026-07-10 13:52:01 +04:00
|
|
|
|
@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>
|
|
|
|
|
|
}
|
2026-07-05 04:07:25 +04:00
|
|
|
|
</li>
|
2026-07-05 03:37:35 +04:00
|
|
|
|
}
|
2026-07-05 04:07:25 +04:00
|
|
|
|
</ul>
|
2026-07-02 02:22:00 +04:00
|
|
|
|
</div>
|
2026-07-05 04:07:25 +04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
<div class="app-footer__group">
|
|
|
|
|
|
<h4>{{ 'footer.payment' | translate }}</h4>
|
|
|
|
|
|
<div class="app-footer__payments">
|
2026-07-17 17:52:43 +04:00
|
|
|
|
@for (icon of paymentIcons(); track $index) {
|
2026-07-26 12:01:26 +04:00
|
|
|
|
<img [src]="icon.src" [alt]="icon.alt" loading="lazy" [width]="icon.width" [height]="icon.height" (error)="onImageError($event)" />
|
2026-07-05 04:17:31 +04:00
|
|
|
|
}
|
2026-01-18 18:57:06 +04:00
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
2026-07-05 04:07:25 +04:00
|
|
|
|
<div class="app-footer__bottom">
|
2026-07-05 04:17:31 +04:00
|
|
|
|
<p>
|
|
|
|
|
|
@if (copyrightText()) {
|
|
|
|
|
|
{{ copyrightText() }}
|
|
|
|
|
|
} @else {
|
|
|
|
|
|
© {{ currentYear }} {{ brandName }}. {{ 'footer.allRightsReserved' | translate }}
|
|
|
|
|
|
}
|
|
|
|
|
|
</p>
|
2026-07-05 04:07:25 +04:00
|
|
|
|
@if (contactEmail) {
|
|
|
|
|
|
<a [href]="'mailto:' + contactEmail">{{ contactEmail }}</a>
|
|
|
|
|
|
}
|
feat: dead-config sweep, test suite foundation, widget settingsSchema validation
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>
2026-08-05 20:47:13 +04:00
|
|
|
|
@if (contactPhone) {
|
|
|
|
|
|
<a [href]="'tel:' + contactPhone">{{ contactPhone }}</a>
|
|
|
|
|
|
}
|
|
|
|
|
|
@if (companyAddress) {
|
|
|
|
|
|
<span class="app-footer__address">{{ companyAddress }}</span>
|
|
|
|
|
|
}
|
2026-01-18 18:57:06 +04:00
|
|
|
|
</div>
|
2026-07-05 04:07:25 +04:00
|
|
|
|
</div>
|
|
|
|
|
|
</footer>
|