cleanup: remove tenant variant logic and enforce config-driven UI
This commit is contained in:
@@ -1,19 +1,16 @@
|
||||
import { Component, ChangeDetectionStrategy, inject } from '@angular/core';
|
||||
import { Location } from '@angular/common';
|
||||
import { TranslateService } from '../../i18n/translate.service';
|
||||
import { UiRuntimeFacade } from '../../facades/runtime/ui-runtime.facade';
|
||||
|
||||
@Component({
|
||||
selector: 'app-back-button',
|
||||
template: `
|
||||
@if (!isMarketplaceNovo) {
|
||||
<button class="dexar-back-btn" (click)="goBack()" [attr.aria-label]="i18n.t('itemDetail.back')">
|
||||
<svg width="37" height="24" viewBox="0 0 37 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M4.73 11.46c-.97-.52-.97-1.4 0-1.92L20.39 1.21c1.48-.79 3.89-.19 3.89.95v3.74h6.94c1.28 0 2.31.59 2.31 1.31v6.56c0 .73-1.03 1.31-2.31 1.31h-6.94v3.74c0 1.15-2.42 1.74-3.89.96L4.73 11.46Z"
|
||||
fill="#497671" fill-opacity="0.75" stroke="white" stroke-opacity="0.6" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
}
|
||||
<button class="dexar-back-btn" (click)="goBack()" [attr.aria-label]="i18n.t('itemDetail.back')">
|
||||
<svg width="37" height="24" viewBox="0 0 37 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M4.73 11.46c-.97-.52-.97-1.4 0-1.92L20.39 1.21c1.48-.79 3.89-.19 3.89.95v3.74h6.94c1.28 0 2.31.59 2.31 1.31v6.56c0 .73-1.03 1.31-2.31 1.31h-6.94v3.74c0 1.15-2.42 1.74-3.89.96L4.73 11.46Z"
|
||||
fill="#497671" fill-opacity="0.75" stroke="white" stroke-opacity="0.6" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
</button>
|
||||
`,
|
||||
styles: [`
|
||||
.dexar-back-btn {
|
||||
@@ -62,13 +59,8 @@ import { UiRuntimeFacade } from '../../facades/runtime/ui-runtime.facade';
|
||||
changeDetection: ChangeDetectionStrategy.OnPush
|
||||
})
|
||||
export class BackButtonComponent {
|
||||
private readonly uiRuntime = inject(UiRuntimeFacade);
|
||||
i18n = inject(TranslateService);
|
||||
|
||||
get isMarketplaceNovo(): boolean {
|
||||
return this.uiRuntime.isMarketplaceVariant('novo');
|
||||
}
|
||||
|
||||
constructor(private location: Location) {}
|
||||
|
||||
goBack(): void {
|
||||
|
||||
@@ -1,123 +1,41 @@
|
||||
<!-- novo VERSION - Modern Clean Footer -->
|
||||
@if (isMarketplaceNovo) {
|
||||
|
||||
<footer class="novo-footer">
|
||||
<div class="novo-footer-container">
|
||||
<div class="novo-footer-top">
|
||||
<div class="novo-footer-col">
|
||||
<h4>{{ brandName }}</h4>
|
||||
<p class="novo-footer-desc">{{ 'footer.description' | translate }}</p>
|
||||
</div>
|
||||
|
||||
@for (group of footerGroups(); track group.id) {
|
||||
<div class="novo-footer-col">
|
||||
@if (group.title) {
|
||||
<h4>{{ group.title }}</h4>
|
||||
}
|
||||
<ul class="novo-footer-links">
|
||||
@for (item of group.items; track item.id) {
|
||||
<li>
|
||||
<a [routerLink]="item.route | langRoute">{{ item.label | translate }}</a>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
<footer class="app-footer">
|
||||
<div class="app-footer__container page-container">
|
||||
<div class="app-footer__top">
|
||||
<div class="app-footer__brand">
|
||||
<app-logo />
|
||||
<p>{{ 'footer.description' | translate }}</p>
|
||||
</div>
|
||||
|
||||
<div class="novo-footer-bottom">
|
||||
<div class="novo-copyright">
|
||||
<p>© {{ currentYear }} {{ brandName }}</p>
|
||||
@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>
|
||||
<a [routerLink]="item.route | langRoute">{{ item.label | translate }}</a>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
<div class="novo-payment-icons">
|
||||
<img src="/assets/images/mir-logo.svg" alt="МИР" loading="lazy" width="40" height="28" />
|
||||
}
|
||||
|
||||
<div class="app-footer__group">
|
||||
<h4>{{ 'footer.payment' | translate }}</h4>
|
||||
<div class="app-footer__payments">
|
||||
<img src="/assets/images/mir-logo.svg" alt="MIR" loading="lazy" width="40" height="28" />
|
||||
<img src="/assets/images/visa-logo.svg" alt="Visa" loading="lazy" width="40" height="28" />
|
||||
<img src="/assets/images/mastercard-logo.svg" alt="Mastercard" loading="lazy" width="40" height="28" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
} @else if (isMarketplaceLavero) {
|
||||
<!-- LAVERO VERSION -->
|
||||
<footer class="lavero-footer">
|
||||
<div class="lavero-footer-container">
|
||||
<div class="lavero-footer-top">
|
||||
<div class="lavero-footer-col lavero-footer-brand">
|
||||
<div class="lavero-footer-logo">
|
||||
<app-logo />
|
||||
</div>
|
||||
<p class="lavero-footer-desc">{{ 'footer.description' | translate }}</p>
|
||||
</div>
|
||||
|
||||
@for (group of footerGroups(); track group.id) {
|
||||
<div class="lavero-footer-col">
|
||||
@if (group.title) {
|
||||
<h4>{{ group.title }}</h4>
|
||||
}
|
||||
<ul class="lavero-footer-links">
|
||||
@for (item of group.items; track item.id) {
|
||||
<li>
|
||||
<a [routerLink]="item.route | langRoute">{{ item.label | translate }}</a>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
|
||||
<div class="lavero-footer-bottom">
|
||||
<div class="lavero-copyright">
|
||||
<p>© {{ currentYear }} {{ brandName }}</p>
|
||||
</div>
|
||||
<div class="lavero-payment-icons">
|
||||
<img src="/assets/images/mir-logo.svg" alt="МИР" loading="lazy" width="40" height="28" />
|
||||
<img src="/assets/images/visa-logo.svg" alt="Visa" loading="lazy" width="40" height="28" />
|
||||
<img src="/assets/images/mastercard-logo.svg" alt="Mastercard" loading="lazy" width="40" height="28" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-footer__bottom">
|
||||
<p>© {{ currentYear }} {{ brandName }}. {{ 'footer.allRightsReserved' | translate }}</p>
|
||||
@if (contactEmail) {
|
||||
<a [href]="'mailto:' + contactEmail">{{ contactEmail }}</a>
|
||||
}
|
||||
</div>
|
||||
</footer>
|
||||
} @else {
|
||||
<!-- DEXAR VERSION - Redesigned -->
|
||||
<footer class="dexar-footer">
|
||||
<div class="dexar-footer-bg">
|
||||
<div class="dexar-footer-container">
|
||||
<div class="dexar-footer-top">
|
||||
<div class="dexar-footer-logo">
|
||||
<app-logo />
|
||||
</div>
|
||||
|
||||
<div class="dexar-footer-columns">
|
||||
@for (group of footerGroups(); track group.id) {
|
||||
<div class="dexar-footer-col">
|
||||
@if (group.title) {
|
||||
<h4>{{ group.title }}</h4>
|
||||
}
|
||||
<ul>
|
||||
@for (item of group.items; track item.id) {
|
||||
<li>
|
||||
<a [routerLink]="item.route | langRoute">{{ item.label | translate }}</a>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
|
||||
<div class="dexar-footer-col">
|
||||
<h4>{{ 'footer.payment' | translate }}</h4>
|
||||
<div class="dexar-payment-logos">
|
||||
<img src="/assets/images/mir-logo.svg" alt="МИР" loading="lazy" width="48" height="32" />
|
||||
<img src="/assets/images/visa-logo.svg" alt="Visa" loading="lazy" width="48" height="32" />
|
||||
<img src="/assets/images/mastercard-logo.svg" alt="Mastercard" loading="lazy" width="48" height="32" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="dexar-footer-bottom">
|
||||
<p>© {{ currentYear }} {{ brandName }}. {{ 'footer.allRightsReserved' | translate }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
}
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
@@ -1,560 +1,108 @@
|
||||
:host {
|
||||
:host {
|
||||
display: block;
|
||||
width: 100%;
|
||||
margin-top: auto;
|
||||
}
|
||||
|
||||
.app-footer {
|
||||
background: var(--text-primary, #1e3c38);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.app-footer__container {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
// ========== LAVERO FOOTER STYLES ==========
|
||||
.lavero-footer {
|
||||
background: linear-gradient(135deg, #1a1208 0%, #2d1a00 100%);
|
||||
color: white;
|
||||
margin-top: auto;
|
||||
padding: 3rem 0 0;
|
||||
border-top: 3px solid var(--primary-color, #FD7300);
|
||||
}
|
||||
|
||||
.lavero-footer-container {
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
padding: 0 2rem;
|
||||
}
|
||||
|
||||
.lavero-footer-top {
|
||||
.app-footer__top {
|
||||
display: grid;
|
||||
grid-template-columns: 2fr 1fr 1fr 1fr;
|
||||
gap: 3rem;
|
||||
padding-bottom: 3rem;
|
||||
border-bottom: 1px solid rgba(253, 115, 0, 0.2);
|
||||
}
|
||||
|
||||
.lavero-footer-brand {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.lavero-footer-logo {
|
||||
width: 140px;
|
||||
height: 48px;
|
||||
|
||||
app-logo {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.lavero-footer-col {
|
||||
h4 {
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
margin-bottom: 1.25rem;
|
||||
color: var(--primary-color, #FD7300);
|
||||
}
|
||||
|
||||
.lavero-footer-desc {
|
||||
color: rgba(255, 255, 255, 0.65);
|
||||
line-height: 1.6;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
}
|
||||
|
||||
.lavero-footer-links {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
li {
|
||||
margin-bottom: 0.75rem;
|
||||
|
||||
a {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
text-decoration: none;
|
||||
font-size: 0.9rem;
|
||||
transition: color 0.2s, transform 0.2s;
|
||||
display: inline-block;
|
||||
|
||||
&:hover {
|
||||
color: var(--primary-color, #FD7300);
|
||||
transform: translateX(4px);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.lavero-footer-bottom {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 1.5rem 0;
|
||||
}
|
||||
|
||||
.lavero-copyright {
|
||||
p {
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
font-size: 0.85rem;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.lavero-payment-icons {
|
||||
display: flex;
|
||||
gap: 0.75rem;
|
||||
align-items: center;
|
||||
|
||||
img {
|
||||
height: 26px;
|
||||
width: auto;
|
||||
background: white;
|
||||
padding: 0.25rem 0.5rem;
|
||||
border-radius: 5px;
|
||||
opacity: 0.85;
|
||||
transition: opacity 0.2s;
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 968px) {
|
||||
.lavero-footer-top {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.lavero-footer {
|
||||
padding: 2rem 0 0;
|
||||
}
|
||||
|
||||
.lavero-footer-container {
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
.lavero-footer-top {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 1.5rem;
|
||||
padding-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.lavero-footer-bottom {
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
padding: 1rem 0;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
background-color: #1a1a1a;
|
||||
color: #ffffff;
|
||||
margin-top: auto;
|
||||
padding: 3rem 0 1rem;
|
||||
border-top: 1px solid #333;
|
||||
|
||||
.footer-container {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 0 2rem;
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
||||
gap: 2rem;
|
||||
}
|
||||
|
||||
.footer-section {
|
||||
h3 {
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
margin-bottom: 1rem;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
li {
|
||||
margin-bottom: 0.5rem;
|
||||
|
||||
a {
|
||||
color: #b0b0b0;
|
||||
text-decoration: none;
|
||||
transition: color 0.2s ease;
|
||||
font-size: 0.95rem;
|
||||
|
||||
&:hover {
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.payment-systems {
|
||||
.payment-logos {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
|
||||
.payment-logo {
|
||||
height: 40px;
|
||||
width: auto;
|
||||
background: white;
|
||||
padding: 0.5rem;
|
||||
border-radius: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.footer-bottom {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 2rem 2rem 0;
|
||||
margin-top: 2rem;
|
||||
border-top: 1px solid #333;
|
||||
text-align: center;
|
||||
|
||||
p {
|
||||
color: #808080;
|
||||
font-size: 0.9rem;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
padding: 2rem 0 1rem;
|
||||
|
||||
.footer-container {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 1.5rem;
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
.footer-section {
|
||||
h3 {
|
||||
font-size: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ========== novo FOOTER STYLES ==========
|
||||
.novo-footer {
|
||||
background: var(--text-primary);
|
||||
color: white;
|
||||
margin-top: auto;
|
||||
padding: 3rem 0 0;
|
||||
}
|
||||
|
||||
.novo-footer-container {
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
padding: 0 2rem;
|
||||
}
|
||||
|
||||
.novo-footer-top {
|
||||
display: grid;
|
||||
grid-template-columns: 2fr 1fr 1fr 1fr;
|
||||
gap: 3rem;
|
||||
padding-bottom: 3rem;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.novo-footer-col {
|
||||
h4 {
|
||||
font-size: 1.1rem;
|
||||
font-weight: 600;
|
||||
margin-bottom: 1.25rem;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.novo-footer-desc {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
line-height: 1.6;
|
||||
font-size: 0.95rem;
|
||||
}
|
||||
}
|
||||
|
||||
.novo-footer-links {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
li {
|
||||
margin-bottom: 0.75rem;
|
||||
|
||||
a {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
text-decoration: none;
|
||||
font-size: 0.95rem;
|
||||
transition: all 0.3s;
|
||||
display: inline-block;
|
||||
|
||||
&:hover {
|
||||
color: white;
|
||||
transform: translateX(4px);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.novo-footer-bottom {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 1.5rem 0;
|
||||
}
|
||||
|
||||
.novo-copyright {
|
||||
p {
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
font-size: 0.9rem;
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.novo-payment-icons {
|
||||
display: flex;
|
||||
gap: 0.75rem;
|
||||
align-items: center;
|
||||
|
||||
img {
|
||||
height: 28px;
|
||||
width: auto;
|
||||
background: white;
|
||||
padding: 0.25rem 0.5rem;
|
||||
border-radius: 6px;
|
||||
opacity: 0.9;
|
||||
transition: opacity 0.3s;
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 968px) {
|
||||
.novo-footer-top {
|
||||
grid-template-columns: 1fr 1fr;
|
||||
gap: 2rem;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.novo-footer {
|
||||
padding: 2rem 0 0;
|
||||
}
|
||||
|
||||
.novo-footer-container {
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
.novo-footer-top {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 2rem;
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
|
||||
.novo-footer-bottom {
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
padding: 1rem 0;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
// ========== DEXAR FOOTER STYLES ==========
|
||||
.dexar-footer {
|
||||
margin-top: auto;
|
||||
}
|
||||
|
||||
.dexar-footer-bg {
|
||||
background-image: url('/assets/images/footer_bg.webp');
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: rgba(30, 60, 56, 0.85);
|
||||
}
|
||||
}
|
||||
|
||||
.dexar-footer-container {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
max-width: 1440px;
|
||||
margin: 0 auto;
|
||||
padding: 48px 40px 24px;
|
||||
}
|
||||
|
||||
.dexar-footer-top {
|
||||
display: flex;
|
||||
gap: 48px;
|
||||
padding-bottom: 32px;
|
||||
grid-template-columns: 2fr repeat(3, minmax(160px, 1fr));
|
||||
gap: 1.5rem;
|
||||
padding-bottom: 1.5rem;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.15);
|
||||
}
|
||||
|
||||
.dexar-footer-logo {
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
padding-top: 4px;
|
||||
|
||||
.dexar-footer-logo-desktop {
|
||||
display: block;
|
||||
height: 40px;
|
||||
width: auto;
|
||||
filter: brightness(0) invert(1);
|
||||
}
|
||||
|
||||
.dexar-footer-logo-mobile {
|
||||
display: none;
|
||||
height: 32px;
|
||||
width: auto;
|
||||
filter: brightness(0) invert(1);
|
||||
}
|
||||
}
|
||||
|
||||
.dexar-footer-columns {
|
||||
flex: 1;
|
||||
.app-footer__brand {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 32px;
|
||||
gap: 0.75rem;
|
||||
|
||||
p {
|
||||
margin: 0;
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
line-height: 1.5;
|
||||
}
|
||||
}
|
||||
|
||||
.dexar-footer-col {
|
||||
.app-footer__group {
|
||||
h4 {
|
||||
font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
color: #ffffff;
|
||||
margin: 0 0 16px 0;
|
||||
margin: 0 0 0.75rem;
|
||||
font-size: 0.95rem;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
|
||||
li {
|
||||
margin-bottom: 10px;
|
||||
|
||||
a {
|
||||
font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||||
font-size: 13px;
|
||||
font-weight: 400;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
text-decoration: none;
|
||||
transition: color 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
}
|
||||
padding: 0;
|
||||
display: grid;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
.dexar-payment-logos {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
|
||||
img {
|
||||
height: 28px;
|
||||
max-height: 28px;
|
||||
width: auto;
|
||||
max-width: 60px;
|
||||
background: rgba(255, 255, 255, 0.9);
|
||||
padding: 4px 8px;
|
||||
border-radius: 4px;
|
||||
transition: opacity 0.2s;
|
||||
object-fit: contain;
|
||||
a {
|
||||
color: rgba(255, 255, 255, 0.8);
|
||||
text-decoration: none;
|
||||
|
||||
&:hover {
|
||||
opacity: 0.85;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dexar-footer-bottom {
|
||||
padding: 20px 0 0;
|
||||
text-align: center;
|
||||
.app-footer__payments {
|
||||
display: flex;
|
||||
gap: 0.5rem;
|
||||
flex-wrap: wrap;
|
||||
|
||||
img {
|
||||
border-radius: 4px;
|
||||
background: #fff;
|
||||
padding: 2px 6px;
|
||||
}
|
||||
}
|
||||
|
||||
.app-footer__bottom {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 0.5rem;
|
||||
|
||||
p {
|
||||
font-family: "DM Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||||
font-size: 12px;
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
margin: 0;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
|
||||
a {
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
text-decoration: none;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
}
|
||||
|
||||
// Responsive
|
||||
@media (max-width: 992px) {
|
||||
.dexar-footer-container {
|
||||
padding: 40px 32px 20px;
|
||||
@media (max-width: 960px) {
|
||||
.app-footer__top {
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 640px) {
|
||||
.app-footer__top {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.dexar-footer-top {
|
||||
.app-footer__bottom {
|
||||
flex-direction: column;
|
||||
gap: 32px;
|
||||
}
|
||||
|
||||
.dexar-footer-columns {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
.dexar-footer-bg {
|
||||
background-image: url('/assets/images/footer_bg_mobile.webp');
|
||||
}
|
||||
|
||||
.dexar-footer-container {
|
||||
padding: 32px 20px 16px;
|
||||
}
|
||||
|
||||
.dexar-footer-logo {
|
||||
.dexar-footer-logo-desktop {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.dexar-footer-logo-mobile {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.dexar-footer-columns {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 24px;
|
||||
}
|
||||
|
||||
.dexar-footer-col h4 {
|
||||
font-size: 14px;
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.dexar-footer-col ul li a {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
.dexar-footer-container {
|
||||
padding: 24px 16px 12px;
|
||||
}
|
||||
|
||||
.dexar-footer-columns {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 16px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,14 +58,6 @@ export class FooterComponent {
|
||||
return this.uiRuntime.contactEmail();
|
||||
}
|
||||
|
||||
get isMarketplaceNovo(): boolean {
|
||||
return this.uiRuntime.isMarketplaceVariant('novo');
|
||||
}
|
||||
|
||||
get isMarketplaceLavero(): boolean {
|
||||
return this.uiRuntime.isMarketplaceVariant('lavero');
|
||||
}
|
||||
|
||||
private resolveFooterGroups(bootstrap: BootstrapConfig): FooterResolvedGroup[] {
|
||||
const footer = bootstrap.navigation?.footer ?? [];
|
||||
const lang = this.languageService.currentLanguage();
|
||||
|
||||
@@ -1,60 +1,3 @@
|
||||
<!-- novo VERSION - Modern Minimalist Header -->
|
||||
@if (isMarketplaceNovo) {
|
||||
<header class="novo-header">
|
||||
<div class="novo-header-container">
|
||||
<div class="novo-left">
|
||||
<a [attr.href]="homeUrl" class="novo-logo" (click)="navigateHome($event)">
|
||||
<app-logo />
|
||||
<!-- <span class="novo-brand">{{ brandName }}</span> -->
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<nav class="novo-nav" [class.novo-nav-open]="menuOpen">
|
||||
<div class="novo-nav-links">
|
||||
<a [routerLink]="'/' | langRoute" routerLinkActive="novo-active" [routerLinkActiveOptions]="{exact: true}" (click)="closeMenu()" class="novo-link">
|
||||
{{ 'header.home' | translate }}
|
||||
</a>
|
||||
<a [routerLink]="'/search' | langRoute" routerLinkActive="novo-active" (click)="closeMenu()" class="novo-link">
|
||||
{{ 'header.search' | translate }}
|
||||
</a>
|
||||
<!-- TODO(CMS): Render backend-configured header content links here. -->
|
||||
</div>
|
||||
|
||||
<div class="novo-mobile-controls">
|
||||
<app-region-selector />
|
||||
<app-language-selector />
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="novo-right">
|
||||
<app-region-selector />
|
||||
<app-language-selector />
|
||||
|
||||
<a [routerLink]="'/cart' | langRoute" routerLinkActive="novo-cart-active" class="novo-cart" (click)="closeMenu()" [attr.aria-label]="'header.cart' | translate">
|
||||
<span class="novo-cart-icon">
|
||||
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
|
||||
<circle cx="9" cy="21" r="1"></circle>
|
||||
<circle cx="20" cy="21" r="1"></circle>
|
||||
<path d="M1 1h4l2.68 13.39a2 2 0 0 0 2 1.61h9.72a2 2 0 0 0 2-1.61L23 6H6"></path>
|
||||
</svg>
|
||||
@if (cartItemCount() > 0) {
|
||||
<span class="novo-cart-badge">{{ cartItemCount() }}</span>
|
||||
}
|
||||
</span>
|
||||
@if (cartItemCount() > 0) {
|
||||
<span class="novo-cart-total">{{ formatCartTotal(cartTotal()) }}</span>
|
||||
}
|
||||
</a>
|
||||
|
||||
<button class="menu-toggle novo-menu-toggle" (click)="toggleMenu()" [class.active]="menuOpen" [class.novo-active]="menuOpen" [attr.aria-label]="menuOpen ? 'Close menu' : 'Open menu'" [attr.aria-expanded]="menuOpen">
|
||||
<span></span>
|
||||
<span></span>
|
||||
<span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
} @else {
|
||||
<!-- DEXAR VERSION - Redesigned 2026 -->
|
||||
<header class="dexar-header">
|
||||
<div class="dexar-header-container">
|
||||
@@ -171,4 +114,3 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@@ -39,10 +39,6 @@ export class HeaderComponent {
|
||||
return this.uiRuntime.logoUrl();
|
||||
}
|
||||
|
||||
get isMarketplaceNovo(): boolean {
|
||||
return this.uiRuntime.isMarketplaceVariant('novo');
|
||||
}
|
||||
|
||||
get homeUrl(): string {
|
||||
return `/${this.langService.currentLanguage()}`;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<div class="carousel-container" [class.novo-theme]="isMarketplaceNovo">
|
||||
<div class="carousel-container">
|
||||
@if (loading()) {
|
||||
<div class="carousel-loading">
|
||||
<div class="spinner"></div>
|
||||
|
||||
@@ -10,7 +10,6 @@ import { getDiscountedPrice, getMainImage, getBadgeClass, getTranslatedField } f
|
||||
import { LanguageService } from '../../services/language.service';
|
||||
import { LangRoutePipe } from '../../pipes/lang-route.pipe';
|
||||
import { TranslatePipe } from '../../i18n/translate.pipe';
|
||||
import { UiRuntimeFacade } from '../../facades/runtime/ui-runtime.facade';
|
||||
import { ProductFacade } from '../../facades/platform/product.facade';
|
||||
|
||||
@Component({
|
||||
@@ -23,7 +22,6 @@ import { ProductFacade } from '../../facades/platform/product.facade';
|
||||
export class ItemsCarouselComponent implements OnInit {
|
||||
products = signal<Item[]>([]);
|
||||
loading = signal(true);
|
||||
private readonly uiRuntime = inject(UiRuntimeFacade);
|
||||
private readonly productFacade = inject(ProductFacade);
|
||||
|
||||
responsiveOptions: { breakpoint: string; numVisible: number; numScroll: number }[] | undefined;
|
||||
@@ -103,7 +101,6 @@ export class ItemsCarouselComponent implements OnInit {
|
||||
readonly getBadgeClass = getBadgeClass;
|
||||
|
||||
private langService = inject(LanguageService);
|
||||
get isMarketplaceNovo(): boolean { return this.uiRuntime.isMarketplaceVariant('novo'); }
|
||||
itemName(product: Item): string { return getTranslatedField(product, 'name', this.langService.currentLanguage()); }
|
||||
|
||||
addToCart(event: Event, item: Item): void {
|
||||
|
||||
Reference in New Issue
Block a user