@if (imageUrl(); as imageUrl) {
@@ -62,6 +70,7 @@
{{ "SHOP.DETAILS" | translate }}
diff --git a/frontend/src/app/features/shop/components/product-card/product-card.component.ts b/frontend/src/app/features/shop/components/product-card/product-card.component.ts
index 81e1b65..7b73182 100644
--- a/frontend/src/app/features/shop/components/product-card/product-card.component.ts
+++ b/frontend/src/app/features/shop/components/product-card/product-card.component.ts
@@ -74,4 +74,16 @@ export class ProductCardComponent {
shopReturnUrl: this.router.url,
};
}
+
+ rememberCatalogScroll(): void {
+ if (typeof window === 'undefined') {
+ return;
+ }
+
+ const nextState = {
+ ...(history.state ?? {}),
+ shopRestoreScrollY: Math.max(0, Math.round(window.scrollY)),
+ };
+ history.replaceState(nextState, '');
+ }
}
diff --git a/frontend/src/app/features/shop/product-detail.component.ts b/frontend/src/app/features/shop/product-detail.component.ts
index 0ee935b..0f023c3 100644
--- a/frontend/src/app/features/shop/product-detail.component.ts
+++ b/frontend/src/app/features/shop/product-detail.component.ts
@@ -1,4 +1,4 @@
-import { CommonModule, isPlatformBrowser } from '@angular/common';
+import { CommonModule, Location, isPlatformBrowser } from '@angular/common';
import {
afterNextRender,
Component,
@@ -59,6 +59,7 @@ export class ProductDetailComponent {
/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
private readonly destroyRef = inject(DestroyRef);
private readonly injector = inject(Injector);
+ private readonly location = inject(Location);
private readonly router = inject(Router);
private readonly translate = inject(TranslateService);
private readonly seoService = inject(SeoService);
@@ -489,6 +490,11 @@ export class ProductDetailComponent {
: null;
if (returnUrl && this.shopRouteService.isCatalogUrl(returnUrl)) {
+ if (this.isBrowser && window.history.length > 1) {
+ this.location.back();
+ return;
+ }
+
void this.router.navigateByUrl(returnUrl);
return;
}
diff --git a/frontend/src/app/features/shop/shop-page.component.scss b/frontend/src/app/features/shop/shop-page.component.scss
index 2182f7b..4ee4b32 100644
--- a/frontend/src/app/features/shop/shop-page.component.scss
+++ b/frontend/src/app/features/shop/shop-page.component.scss
@@ -332,6 +332,10 @@
}
@media (max-width: 760px) {
+ .cart-card {
+ display: none;
+ }
+
.product-grid {
grid-template-columns: 1fr;
}
diff --git a/frontend/src/app/features/shop/shop-page.component.ts b/frontend/src/app/features/shop/shop-page.component.ts
index d8e4e32..5fac9b2 100644
--- a/frontend/src/app/features/shop/shop-page.component.ts
+++ b/frontend/src/app/features/shop/shop-page.component.ts
@@ -141,6 +141,7 @@ export class ShopPageComponent {
this.selectedCategory.set(result.catalog.category ?? null);
this.products.set(result.catalog.products);
this.applySeo(result.catalog.category ?? null);
+ this.restoreCatalogScrollIfNeeded();
});
}
@@ -353,4 +354,24 @@ export class ShopPageComponent {
ogDescription: description,
});
}
+
+ private restoreCatalogScrollIfNeeded(): void {
+ if (typeof window === 'undefined') {
+ return;
+ }
+
+ const scrollY = Number(history.state?.shopRestoreScrollY);
+ if (!Number.isFinite(scrollY) || scrollY < 0) {
+ return;
+ }
+
+ const { shopRestoreScrollY: _ignored, ...nextState } = history.state ?? {};
+ const restore = () => window.scrollTo({ left: 0, top: scrollY });
+
+ history.replaceState(nextState, '');
+ window.requestAnimationFrame(() => {
+ restore();
+ window.setTimeout(restore, 60);
+ });
+ }
}
diff --git a/frontend/src/app/shared/components/app-dropzone/app-dropzone.component.ts b/frontend/src/app/shared/components/app-dropzone/app-dropzone.component.ts
index a04f704..79decb9 100644
--- a/frontend/src/app/shared/components/app-dropzone/app-dropzone.component.ts
+++ b/frontend/src/app/shared/components/app-dropzone/app-dropzone.component.ts
@@ -12,7 +12,7 @@ import { TranslateModule } from '@ngx-translate/core';
export class AppDropzoneComponent {
label = input('DROPZONE.DEFAULT_LABEL');
subtext = input('DROPZONE.DEFAULT_SUBTEXT');
- accept = input('.stl,.3mf,.step,.stp');
+ accept = input('.stl,.3mf');
multiple = input(true);
filesDropped = output();
diff --git a/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.html b/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.html
new file mode 100644
index 0000000..07820ab
--- /dev/null
+++ b/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.html
@@ -0,0 +1,17 @@
+
+ @for (letter of resolvedLetters(); track letter.key) {
+
![]()
+ }
+
diff --git a/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.scss b/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.scss
new file mode 100644
index 0000000..218bdb2
--- /dev/null
+++ b/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.scss
@@ -0,0 +1,221 @@
+:host {
+ display: block;
+ width: 100%;
+}
+
+.brand-animation {
+ --three-anchor-x: -9.4rem;
+ --bee-anchor-x: 10.2rem;
+ --word-scale: var(--brand-animation-scale, 1);
+ --word-spacing-factor: var(--brand-animation-word-spacing, 1);
+ --loader-pull-scale-x: 0.9;
+ --loader-pull-scale-y: 1.08;
+ --loader-release-scale-x: 1.04;
+ --loader-release-scale-y: 0.97;
+ --loader-overshoot-left: 0.58rem;
+ --loader-overshoot-right: -0.54rem;
+ position: relative;
+ width: min(100%, var(--brand-animation-width, 26rem));
+ height: var(--brand-animation-height, 8rem);
+ margin-inline: auto;
+}
+
+.brand-animation__letter {
+ --word-x: 0rem;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: var(--brand-animation-letter-width, clamp(2.7rem, 6vw, 4rem));
+ height: auto;
+ transform: translate(-50%, -50%);
+ transform-origin: center center;
+ will-change: transform;
+}
+
+.brand-animation[data-variant='site-intro'] .brand-animation__letter {
+ animation: site-intro-preview var(--brand-animation-site-intro-duration, 1s) linear 1 forwards;
+}
+
+.brand-animation[data-variant='calculator-loader'] .brand-animation__letter {
+ animation: calculator-loader-loop
+ var(--brand-animation-loader-loop-duration, 2.5s)
+ infinite;
+}
+
+.brand-animation[data-variant='calculator-loader']
+ .brand-animation__letter[data-letter='3'] {
+ --loader-overshoot-left: 0.18rem;
+ --loader-overshoot-right: -0.3rem;
+}
+
+.brand-animation[data-variant='calculator-loader']
+ .brand-animation__letter[data-letter='d'] {
+ --loader-overshoot-left: 0.42rem;
+ --loader-overshoot-right: -0.4rem;
+}
+
+.brand-animation[data-variant='calculator-loader']
+ .brand-animation__letter[data-letter='F'] {
+ --loader-overshoot-left: 0.66rem;
+ --loader-overshoot-right: -0.62rem;
+}
+
+.brand-animation[data-variant='calculator-loader']
+ .brand-animation__letter[data-letter='A'] {
+ --loader-overshoot-left: 0.52rem;
+ --loader-overshoot-right: -0.46rem;
+}
+
+.brand-animation[data-variant='calculator-loader']
+ .brand-animation__letter[data-letter='B'] {
+ --loader-overshoot-left: 0.28rem;
+ --loader-overshoot-right: -0.16rem;
+}
+
+@keyframes site-intro-preview {
+ 0% {
+ transform: translate(-50%, -50%) translateX(0) scale(0.92);
+ }
+
+ 20% {
+ transform: translate(-50%, -50%) translateX(0) scale(0.92);
+ }
+
+ 80% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
+ )
+ scale(1);
+ }
+
+ 100% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
+ )
+ scale(1);
+ }
+}
+
+@keyframes calculator-loader-loop {
+ 0%,
+ 16% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
+ )
+ scale(1);
+ }
+
+ 16% {
+ animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);
+ }
+
+ 27% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(
+ var(--three-anchor-x) * var(--word-scale) * var(--word-spacing-factor)
+ )
+ )
+ scaleX(var(--loader-pull-scale-x))
+ scaleY(var(--loader-pull-scale-y));
+ }
+
+ 27% {
+ animation-timing-function: cubic-bezier(0.18, 1.15, 0.32, 1);
+ }
+
+ 39% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(
+ (var(--word-x) * var(--word-scale) * var(--word-spacing-factor)) +
+ var(--loader-overshoot-left)
+ )
+ )
+ scaleX(var(--loader-release-scale-x))
+ scaleY(var(--loader-release-scale-y));
+ }
+
+ 39% {
+ animation-timing-function: cubic-bezier(0.2, 0.85, 0.26, 1);
+ }
+
+ 50%,
+ 60% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
+ )
+ scale(1);
+ }
+
+ 60% {
+ animation-timing-function: cubic-bezier(0.3, 0, 0.7, 1);
+ }
+
+ 71% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(
+ var(--bee-anchor-x) * var(--word-scale) * var(--word-spacing-factor)
+ )
+ )
+ scaleX(var(--loader-pull-scale-x))
+ scaleY(var(--loader-pull-scale-y));
+ }
+
+ 71% {
+ animation-timing-function: cubic-bezier(0.18, 1.15, 0.32, 1);
+ }
+
+ 83% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(
+ (var(--word-x) * var(--word-scale) * var(--word-spacing-factor)) +
+ var(--loader-overshoot-right)
+ )
+ )
+ scaleX(var(--loader-release-scale-x))
+ scaleY(var(--loader-release-scale-y));
+ }
+
+ 83% {
+ animation-timing-function: cubic-bezier(0.2, 0.85, 0.26, 1);
+ }
+
+ 92%,
+ 100% {
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
+ )
+ scale(1);
+ }
+}
+
+@media (max-width: 640px) {
+ .brand-animation {
+ width: min(100%, var(--brand-animation-width-mobile, 19rem));
+ height: var(--brand-animation-height-mobile, 6rem);
+ --word-scale: var(--brand-animation-scale-mobile, 0.74);
+ }
+
+ .brand-animation__letter {
+ width: var(--brand-animation-letter-width-mobile, 2.8rem);
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .brand-animation__letter {
+ animation: none !important;
+ transform: translate(-50%, -50%)
+ translateX(
+ calc(var(--word-x) * var(--word-scale) * var(--word-spacing-factor))
+ )
+ scale(1);
+ }
+}
diff --git a/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.ts b/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.ts
new file mode 100644
index 0000000..94112c9
--- /dev/null
+++ b/frontend/src/app/shared/components/brand-animation-logo/brand-animation-logo.component.ts
@@ -0,0 +1,70 @@
+import { Component, computed, input } from '@angular/core';
+
+export type BrandAnimationVariant = 'site-intro' | 'calculator-loader';
+
+interface AnimationLetter {
+ key: string;
+ darkSrc: string;
+ yellowSrc: string;
+ wordX: string;
+}
+
+interface ResolvedAnimationLetter {
+ key: string;
+ src: string;
+ wordX: string;
+}
+
+const LETTERS: readonly AnimationLetter[] = [
+ {
+ key: '3',
+ darkSrc: '/assets/images/animation/31200.svg',
+ yellowSrc: '/assets/images/animation/3g1200.svg',
+ wordX: '-9.4rem',
+ },
+ {
+ key: 'd',
+ darkSrc: '/assets/images/animation/d1200.svg',
+ yellowSrc: '/assets/images/animation/Dg1200.svg',
+ wordX: '-4.9rem',
+ },
+ {
+ key: 'F',
+ darkSrc: '/assets/images/animation/F1200.svg',
+ yellowSrc: '/assets/images/animation/Fg1200.svg',
+ wordX: '1rem',
+ },
+ {
+ key: 'A',
+ darkSrc: '/assets/images/animation/A1200.svg',
+ yellowSrc: '/assets/images/animation/Ag1200.svg',
+ wordX: '5.6rem',
+ },
+ {
+ key: 'B',
+ darkSrc: '/assets/images/animation/B1200.svg',
+ yellowSrc: '/assets/images/animation/Bg1200.svg',
+ wordX: '10.2rem',
+ },
+] as const;
+
+@Component({
+ selector: 'app-brand-animation-logo',
+ standalone: true,
+ templateUrl: './brand-animation-logo.component.html',
+ styleUrl: './brand-animation-logo.component.scss',
+})
+export class BrandAnimationLogoComponent {
+ readonly variant = input('site-intro');
+ readonly decorative = input(true);
+ readonly ariaLabel = input('3D fab animated logo');
+
+ readonly resolvedLetters = computed(() =>
+ LETTERS.map((letter) => ({
+ key: letter.key,
+ src:
+ this.variant() === 'site-intro' ? letter.yellowSrc : letter.darkSrc,
+ wordX: letter.wordX,
+ })),
+ );
+}
diff --git a/frontend/src/assets/i18n/de.json b/frontend/src/assets/i18n/de.json
index 38792a7..2e207c1 100644
--- a/frontend/src/assets/i18n/de.json
+++ b/frontend/src/assets/i18n/de.json
@@ -107,14 +107,14 @@
},
"CALC": {
"TITLE": "3D-Angebot berechnen",
- "SUBTITLE": "Laden Sie Ihre 3D-Datei (STL, 3MF, STEP) hoch, stellen Sie Qualität und Farbe ein und berechnen Sie sofort Preis und Lieferzeit.",
+ "SUBTITLE": "Laden Sie Ihre 3D-Datei (STL, 3MF) hoch, stellen Sie Qualität und Farbe ein und berechnen Sie sofort Preis und Lieferzeit.",
"CTA_START": "Jetzt starten",
"BUSINESS": "Unternehmen",
"PRIVATE": "Privat",
"MODE_EASY": "Basis",
"MODE_ADVANCED": "Erweitert",
"UPLOAD_LABEL": "Ziehen Sie Ihre 3D-Datei hierher",
- "UPLOAD_SUB": "Wir unterstützen STL, 3MF, STEP bis 50MB",
+ "UPLOAD_SUB": "Wir unterstützen STL, 3MF bis 50MB",
"MATERIAL": "Material",
"QUALITY": "Qualität",
"QUANTITY": "Menge",
@@ -141,11 +141,12 @@
"BENEFITS_2": "Ausgewählte Materialien und Qualitätskontrolle",
"BENEFITS_3": "CAD-Beratung, falls die Datei Änderungen benötigt",
"ERR_FILE_REQUIRED": "Die Datei ist erforderlich.",
- "STEP_WARNING": "Die 3D-Ansicht ist mit STEP- und 3MF-Dateien nicht kompatibel",
+ "STEP_WARNING": "Die 3D-Vorschau ist nur für STL-Dateien verfügbar.",
"REMOVE_FILE": "Datei entfernen",
"FALLBACK_MATERIAL": "PLA (Fallback)",
"FALLBACK_QUALITY_STANDARD": "Standard",
"ERR_FILE_TOO_LARGE": "Einige Dateien überschreiten das 200MB-Limit und wurden nicht hinzugefügt.",
+ "ERR_INVALID_FILE_TYPE": "Sie können nur Dateien vom Typ .stl oder .3mf hochladen.",
"PRINT_SPEED": "Druckgeschwindigkeit",
"COLOR": "Farbe",
"ANALYZING_TITLE": "Analyse läuft...",
@@ -624,7 +625,7 @@
"BTN_CONTACT": "Mit uns sprechen",
"SEC_CALC_TITLE": "Korrekte Preisberechnung in wenigen Sekunden",
"SEC_CALC_SUBTITLE": "Keine Registrierung erforderlich. Die Schätzung basiert auf echtem Slicing.",
- "SEC_CALC_LIST_1": "Unterstützte Formate: STL, 3MF, STEP",
+ "SEC_CALC_LIST_1": "Unterstützte Formate: STL, 3MF",
"CARD_CALC_EYEBROW": "Automatische Berechnung",
"CARD_CALC_TITLE": "Preis und Lieferzeit mit einem Klick",
"CARD_CALC_TAG": "Ohne Registrierung",
@@ -674,7 +675,7 @@
},
"DROPZONE": {
"DEFAULT_LABEL": "Dateien hierher ziehen oder klicken zum Hochladen",
- "DEFAULT_SUBTEXT": "Unterstützt .STL, .3MF, .STEP"
+ "DEFAULT_SUBTEXT": "Unterstützt .STL, .3MF"
},
"COLOR": {
"AVAILABLE_COLORS": "Verfügbare Farben",
diff --git a/frontend/src/assets/i18n/en.json b/frontend/src/assets/i18n/en.json
index b447eac..ad023ec 100644
--- a/frontend/src/assets/i18n/en.json
+++ b/frontend/src/assets/i18n/en.json
@@ -107,14 +107,14 @@
},
"CALC": {
"TITLE": "3D Print Calculator",
- "SUBTITLE": "Upload your 3D file (STL, 3MF, STEP...) and get an instant estimate of costs and print time.",
+ "SUBTITLE": "Upload your 3D file (STL, 3MF) and get an instant estimate of costs and print time.",
"CTA_START": "Start Now",
"BUSINESS": "Business",
"PRIVATE": "Private",
"MODE_EASY": "Quick",
"MODE_ADVANCED": "Advanced",
"UPLOAD_LABEL": "Drag your 3D file here",
- "UPLOAD_SUB": "Supports STL, 3MF, STEP up to 50MB",
+ "UPLOAD_SUB": "Supports STL, 3MF up to 50MB",
"MATERIAL": "Material",
"QUALITY": "Quality",
"QUANTITY": "Quantity",
@@ -141,11 +141,12 @@
"BENEFITS_2": "Selected materials and quality control",
"BENEFITS_3": "CAD consultation if file needs modifications",
"ERR_FILE_REQUIRED": "File is required.",
- "STEP_WARNING": "3D preview is not available for STEP files, but the calculator works perfectly. You can proceed with the quotation.",
+ "STEP_WARNING": "3D preview is available only for STL files.",
"REMOVE_FILE": "Remove file",
"FALLBACK_MATERIAL": "PLA (fallback)",
"FALLBACK_QUALITY_STANDARD": "Standard",
"ERR_FILE_TOO_LARGE": "Some files exceed the 200MB limit and were not added.",
+ "ERR_INVALID_FILE_TYPE": "You can upload only .stl or .3mf files.",
"PRINT_SPEED": "Print speed",
"COLOR": "Color",
"ANALYZING_TITLE": "Analysis in progress...",
@@ -624,7 +625,7 @@
"BTN_CONTACT": "Talk to us",
"SEC_CALC_TITLE": "Accurate pricing in a few seconds",
"SEC_CALC_SUBTITLE": "No registration required. The estimate is calculated through real slicing.",
- "SEC_CALC_LIST_1": "Supported formats: STL, 3MF, STEP",
+ "SEC_CALC_LIST_1": "Supported formats: STL, 3MF",
"CARD_CALC_EYEBROW": "Automatic calculation",
"CARD_CALC_TITLE": "Price and lead time in one click",
"CARD_CALC_TAG": "No registration",
@@ -674,7 +675,7 @@
},
"DROPZONE": {
"DEFAULT_LABEL": "Drop files here or click to upload",
- "DEFAULT_SUBTEXT": "Supports .stl, .3mf, .step"
+ "DEFAULT_SUBTEXT": "Supports .stl, .3mf"
},
"COLOR": {
"AVAILABLE_COLORS": "Available colors",
diff --git a/frontend/src/assets/i18n/fr.json b/frontend/src/assets/i18n/fr.json
index 49b9d4e..7d3d95e 100644
--- a/frontend/src/assets/i18n/fr.json
+++ b/frontend/src/assets/i18n/fr.json
@@ -96,7 +96,7 @@
"BTN_CONTACT": "Parlez avec nous",
"SEC_CALC_TITLE": "Prix correct en quelques secondes",
"SEC_CALC_SUBTITLE": "Aucune inscription requise. L'estimation est effectuée via un vrai slicing.",
- "SEC_CALC_LIST_1": "Formats pris en charge : STL, 3MF, STEP",
+ "SEC_CALC_LIST_1": "Formats pris en charge : STL, 3MF",
"CARD_CALC_EYEBROW": "Calcul automatique",
"CARD_CALC_TITLE": "Prix et délais en un clic",
"CARD_CALC_TAG": "Sans inscription",
@@ -139,14 +139,14 @@
},
"CALC": {
"TITLE": "Calculer un devis 3D",
- "SUBTITLE": "Chargez votre fichier 3D (STL, 3MF, STEP), réglez la qualité et la couleur puis calculez immédiatement prix et délais.",
+ "SUBTITLE": "Chargez votre fichier 3D (STL, 3MF), réglez la qualité et la couleur puis calculez immédiatement prix et délais.",
"CTA_START": "Commencer maintenant",
"BUSINESS": "Entreprises",
"PRIVATE": "Particuliers",
"MODE_EASY": "Base",
"MODE_ADVANCED": "Avancée",
"UPLOAD_LABEL": "Glissez votre fichier 3D ici",
- "UPLOAD_SUB": "Nous prenons en charge STL, 3MF, STEP jusqu'à 50MB",
+ "UPLOAD_SUB": "Nous prenons en charge STL, 3MF jusqu'à 50MB",
"MATERIAL": "Matériau",
"QUALITY": "Qualité",
"PRINT_SPEED": "Vitesse d'impression",
@@ -185,11 +185,12 @@
"NOTES_PLACEHOLDER": "Instructions spécifiques...",
"SETUP_NOTE": "* Inclut {{cost}} comme coût de setup",
"SHIPPING_NOTE": "* Frais d'expédition exclus, calculés à l'étape suivante",
- "STEP_WARNING": "La visualisation 3D n'est pas compatible avec les fichiers STEP et 3MF",
+ "STEP_WARNING": "La prévisualisation 3D est disponible uniquement pour les fichiers STL.",
"REMOVE_FILE": "Supprimer le fichier",
"FALLBACK_MATERIAL": "PLA (fallback)",
"FALLBACK_QUALITY_STANDARD": "Standard",
"ERR_FILE_TOO_LARGE": "Certains fichiers dépassent la limite de 200MB et n'ont pas été ajoutés.",
+ "ERR_INVALID_FILE_TYPE": "Vous pouvez téléverser uniquement des fichiers .stl ou .3mf.",
"ERROR_ZERO_PRICE": "Un problème est survenu pendant le calcul. Essayez un autre format ou contactez-nous directement via Demander une consultation.",
"ZERO_RESULT_TITLE": "Résultat invalide",
"ZERO_RESULT_HELP": "Le calcul a renvoyé des valeurs nulles invalides. Essayez un autre format de fichier ou contactez-nous directement via Demander une consultation."
@@ -680,7 +681,7 @@
},
"DROPZONE": {
"DEFAULT_LABEL": "Glissez les fichiers ici ou cliquez pour téléverser",
- "DEFAULT_SUBTEXT": "Prend en charge .STL, .3MF, .STEP"
+ "DEFAULT_SUBTEXT": "Prend en charge .STL, .3MF"
},
"COLOR": {
"AVAILABLE_COLORS": "Couleurs disponibles",
diff --git a/frontend/src/assets/i18n/it.json b/frontend/src/assets/i18n/it.json
index 371531a..f1296cd 100644
--- a/frontend/src/assets/i18n/it.json
+++ b/frontend/src/assets/i18n/it.json
@@ -96,7 +96,7 @@
"BTN_CONTACT": "Parla con noi",
"SEC_CALC_TITLE": "Prezzo corretto in pochi secondi",
"SEC_CALC_SUBTITLE": "Nessuna registrazione necessaria. La stima è effettuata tramite vero slicing.",
- "SEC_CALC_LIST_1": "Formati supportati: STL, 3MF, STEP",
+ "SEC_CALC_LIST_1": "Formati supportati: STL, 3MF",
"CARD_CALC_EYEBROW": "Calcolo automatico",
"CARD_CALC_TITLE": "Prezzo e tempi in un click",
"CARD_CALC_TAG": "Senza registrazione",
@@ -139,14 +139,14 @@
},
"CALC": {
"TITLE": "Calcola Preventivo 3D",
- "SUBTITLE": "Carica il tuo file 3D (STL, 3MF, STEP), imposta la qualità, il colore e calcola immediatamente prezzo e tempi.",
+ "SUBTITLE": "Carica il tuo file 3D (STL, 3MF), imposta la qualità, il colore e calcola immediatamente prezzo e tempi.",
"CTA_START": "Inizia Ora",
"BUSINESS": "Aziende",
"PRIVATE": "Privati",
"MODE_EASY": "Base",
"MODE_ADVANCED": "Avanzata",
"UPLOAD_LABEL": "Trascina il tuo file 3D qui",
- "UPLOAD_SUB": "Supportiamo STL, 3MF, STEP fino a 50MB",
+ "UPLOAD_SUB": "Supportiamo STL, 3MF fino a 50MB",
"MATERIAL": "Materiale",
"QUALITY": "Qualità",
"PRINT_SPEED": "Velocità di Stampa",
@@ -185,11 +185,12 @@
"NOTES_PLACEHOLDER": "Istruzioni specifiche...",
"SETUP_NOTE": "* Include {{cost}} come costo di setup",
"SHIPPING_NOTE": "* Costi di spedizione esclusi, calcolati al passaggio successivo",
- "STEP_WARNING": "La visualizzazione 3D non è compatibile con i file step e 3mf",
+ "STEP_WARNING": "La visualizzazione 3D è disponibile solo per i file STL",
"REMOVE_FILE": "Rimuovi file",
"FALLBACK_MATERIAL": "PLA (fallback)",
"FALLBACK_QUALITY_STANDARD": "Standard",
"ERR_FILE_TOO_LARGE": "Alcuni file superano il limite di 200MB e non sono stati aggiunti.",
+ "ERR_INVALID_FILE_TYPE": "Puoi caricare solo file .stl o .3mf.",
"ERROR_ZERO_PRICE": "Qualcosa è andato storto nel calcolo. Prova un altro formato o contattaci direttamente con Richiedi Consulenza.",
"ZERO_RESULT_TITLE": "Risultato non valido",
"ZERO_RESULT_HELP": "Il calcolo ha restituito valori non validi (0). Prova con un altro formato file oppure contattaci direttamente con Richiedi Consulenza."
@@ -680,7 +681,7 @@
},
"DROPZONE": {
"DEFAULT_LABEL": "Trascina i file qui o clicca per caricare",
- "DEFAULT_SUBTEXT": "Supporta .STL, .3MF, .STEP"
+ "DEFAULT_SUBTEXT": "Supporta .STL, .3MF"
},
"COLOR": {
"AVAILABLE_COLORS": "Colori disponibili",
diff --git a/frontend/src/assets/images/Fav-icon-192x192.png b/frontend/src/assets/images/Fav-icon-192x192.png
new file mode 100644
index 0000000..0e74c58
Binary files /dev/null and b/frontend/src/assets/images/Fav-icon-192x192.png differ
diff --git a/frontend/src/assets/images/Fav-icon-512x512.png b/frontend/src/assets/images/Fav-icon-512x512.png
new file mode 100644
index 0000000..a8e2196
Binary files /dev/null and b/frontend/src/assets/images/Fav-icon-512x512.png differ
diff --git a/frontend/src/assets/images/Fav-icon-browser-192x192.png b/frontend/src/assets/images/Fav-icon-browser-192x192.png
new file mode 100644
index 0000000..ffccd8b
Binary files /dev/null and b/frontend/src/assets/images/Fav-icon-browser-192x192.png differ
diff --git a/frontend/src/assets/images/Fav-icon.png b/frontend/src/assets/images/Fav-icon.png
deleted file mode 100644
index ff6550e..0000000
Binary files a/frontend/src/assets/images/Fav-icon.png and /dev/null differ
diff --git a/frontend/src/assets/images/animation/31200.svg b/frontend/src/assets/images/animation/31200.svg
new file mode 100644
index 0000000..520d6a8
--- /dev/null
+++ b/frontend/src/assets/images/animation/31200.svg
@@ -0,0 +1,207 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/animation/3g1200.svg b/frontend/src/assets/images/animation/3g1200.svg
new file mode 100644
index 0000000..a0ebb46
--- /dev/null
+++ b/frontend/src/assets/images/animation/3g1200.svg
@@ -0,0 +1,214 @@
+
+
diff --git a/frontend/src/assets/images/animation/A1200.svg b/frontend/src/assets/images/animation/A1200.svg
new file mode 100644
index 0000000..4596526
--- /dev/null
+++ b/frontend/src/assets/images/animation/A1200.svg
@@ -0,0 +1,225 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/animation/Ag1200.svg b/frontend/src/assets/images/animation/Ag1200.svg
new file mode 100644
index 0000000..d752b33
--- /dev/null
+++ b/frontend/src/assets/images/animation/Ag1200.svg
@@ -0,0 +1,236 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/animation/B1200.svg b/frontend/src/assets/images/animation/B1200.svg
new file mode 100644
index 0000000..3d05a26
--- /dev/null
+++ b/frontend/src/assets/images/animation/B1200.svg
@@ -0,0 +1,232 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/animation/Bg1200.svg b/frontend/src/assets/images/animation/Bg1200.svg
new file mode 100644
index 0000000..1212b4a
--- /dev/null
+++ b/frontend/src/assets/images/animation/Bg1200.svg
@@ -0,0 +1,243 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/animation/Dg1200.svg b/frontend/src/assets/images/animation/Dg1200.svg
new file mode 100644
index 0000000..1e13051
--- /dev/null
+++ b/frontend/src/assets/images/animation/Dg1200.svg
@@ -0,0 +1,252 @@
+
+
diff --git a/frontend/src/assets/images/animation/F1200.svg b/frontend/src/assets/images/animation/F1200.svg
new file mode 100644
index 0000000..e7eaa00
--- /dev/null
+++ b/frontend/src/assets/images/animation/F1200.svg
@@ -0,0 +1,170 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/animation/Fg1200.svg b/frontend/src/assets/images/animation/Fg1200.svg
new file mode 100644
index 0000000..43e1197
--- /dev/null
+++ b/frontend/src/assets/images/animation/Fg1200.svg
@@ -0,0 +1,181 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/animation/d1200.svg b/frontend/src/assets/images/animation/d1200.svg
new file mode 100644
index 0000000..58177de
--- /dev/null
+++ b/frontend/src/assets/images/animation/d1200.svg
@@ -0,0 +1,241 @@
+
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/home/cad.jpg b/frontend/src/assets/images/home/cad.jpg
deleted file mode 100644
index 1c5dfe2..0000000
Binary files a/frontend/src/assets/images/home/cad.jpg and /dev/null differ
diff --git a/frontend/src/assets/images/home/da-cambiare.jpg b/frontend/src/assets/images/home/da-cambiare.jpg
deleted file mode 100644
index b0eb618..0000000
Binary files a/frontend/src/assets/images/home/da-cambiare.jpg and /dev/null differ
diff --git a/frontend/src/assets/images/home/original-vs-3dprinted.jpg b/frontend/src/assets/images/home/original-vs-3dprinted.jpg
deleted file mode 100644
index a1230e0..0000000
Binary files a/frontend/src/assets/images/home/original-vs-3dprinted.jpg and /dev/null differ
diff --git a/frontend/src/assets/images/home/prototipi.jpg b/frontend/src/assets/images/home/prototipi.jpg
deleted file mode 100644
index 3efc5d7..0000000
Binary files a/frontend/src/assets/images/home/prototipi.jpg and /dev/null differ
diff --git a/frontend/src/assets/images/home/serie.jpg b/frontend/src/assets/images/home/serie.jpg
deleted file mode 100644
index 668b3b6..0000000
Binary files a/frontend/src/assets/images/home/serie.jpg and /dev/null differ
diff --git a/frontend/src/assets/images/home/supporto-bici.jpg b/frontend/src/assets/images/home/supporto-bici.jpg
deleted file mode 100644
index 71ba26e..0000000
Binary files a/frontend/src/assets/images/home/supporto-bici.jpg and /dev/null differ
diff --git a/frontend/src/assets/images/home/vino.JPG b/frontend/src/assets/images/home/vino.JPG
deleted file mode 100644
index eec2da5..0000000
Binary files a/frontend/src/assets/images/home/vino.JPG and /dev/null differ
diff --git a/frontend/src/index.html b/frontend/src/index.html
index d2aabc3..ba17b06 100644
--- a/frontend/src/index.html
+++ b/frontend/src/index.html
@@ -10,7 +10,26 @@
-
+
+
+
+
+
+