diff --git a/backend/src/main/resources/templates/invoice.html b/backend/src/main/resources/templates/invoice.html
index f0ff3b5..620b3f3 100644
--- a/backend/src/main/resources/templates/invoice.html
+++ b/backend/src/main/resources/templates/invoice.html
@@ -277,8 +277,8 @@
3D Fab Switzerland
- Sede Ticino, Svizzera
- Sede Bienne, Svizzera
+ Via G. pioda 29a - 6710 Biasca, Svizzera
+ Lyss-Strasse 71 - 2560 Nidau, Svizzera
|
www.3d-fab.ch
diff --git a/frontend/src/app/features/home/home.component.html b/frontend/src/app/features/home/home.component.html
index ba263cf..ed3ffee 100644
--- a/frontend/src/app/features/home/home.component.html
+++ b/frontend/src/app/features/home/home.component.html
@@ -63,28 +63,28 @@
-
+
{{ 'HOME.CAP_1_TITLE' | translate }}
{{ 'HOME.CAP_1_TEXT' | translate }}
-
+
{{ 'HOME.CAP_2_TITLE' | translate }}
{{ 'HOME.CAP_2_TEXT' | translate }}
-
+
{{ 'HOME.CAP_3_TITLE' | translate }}
{{ 'HOME.CAP_3_TEXT' | translate }}
-
+
{{ 'HOME.CAP_4_TITLE' | translate }}
{{ 'HOME.CAP_4_TEXT' | translate }}
@@ -110,6 +110,11 @@
{{ 'HOME.BTN_REQ_SOLUTION' | translate }}
+
+
+
+
+
{{ 'HOME.CARD_SHOP_1_TITLE' | translate }}
@@ -134,12 +139,36 @@
{{ 'HOME.SEC_ABOUT_TEXT' | translate }}
- {{ 'HOME.BTN_CONTACT' | translate }}
+
+ {{ 'HOME.SEC_ABOUT_TITLE' | translate }}
+ {{ 'HOME.BTN_CONTACT' | translate }}
+
diff --git a/frontend/src/app/features/home/home.component.scss b/frontend/src/app/features/home/home.component.scss
index 147d469..fe2049c 100644
--- a/frontend/src/app/features/home/home.component.scss
+++ b/frontend/src/app/features/home/home.component.scss
@@ -1,14 +1,16 @@
@use '../../../styles/patterns';
.home-page {
- background: var(--color-bg);
+ --home-bg: #faf9f6;
+ --color-bg-card: #f7f7f7;
+ background: var(--home-bg);
}
.hero {
position: relative;
padding: 6rem 0 5rem;
overflow: hidden;
- background: var(--color-bg);
+ background: var(--home-bg);
// Enhanced Grid Pattern
&::after {
content: '';
@@ -43,7 +45,7 @@
position: relative;
z-index: 1;
}
-
+
.hero-copy { animation: fadeUp 0.8s ease both; }
.hero-panel { animation: fadeUp 0.8s ease 0.15s both; }
@@ -194,7 +196,7 @@
.capabilities-bg {
display: none;
}
-
+
.section { padding: 5.5rem 0; position: relative; }
.section-head { margin-bottom: var(--space-8); }
.section-title { font-size: clamp(2rem, 1.8vw + 1.2rem, 2.8rem); margin-bottom: var(--space-3); }
@@ -222,7 +224,7 @@
gap: var(--space-4);
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
-
+
.card-image-placeholder {
width: 100%;
height: 160px;
@@ -234,20 +236,23 @@
align-items: center;
justify-content: center;
color: var(--color-neutral-400);
+ overflow: hidden;
+ }
+
+ .card-image-placeholder img {
+ width: 100%;
+ height: 100%;
+ display: block;
+ object-fit: cover;
}
.shop {
- background: var(--color-neutral-50);
+ background: var(--home-bg);
position: relative;
- // Triangular/Isogrid Pattern
- &::before {
- content: '';
- position: absolute;
- inset: 0;
- @include patterns.pattern-triangular(var(--color-neutral-900), 40px);
- opacity: 0.03;
- pointer-events: none;
- }
+ }
+ .shop .split { align-items: start; }
+ .shop-copy {
+ max-width: 760px;
}
.split {
display: grid;
@@ -266,25 +271,61 @@
flex-wrap: wrap;
gap: var(--space-3);
}
+ .shop-gallery {
+ display: flex;
+ gap: var(--space-4);
+ overflow-x: auto;
+ scroll-snap-type: x mandatory;
+ padding-bottom: var(--space-2);
+ scrollbar-width: thin;
+ width: min(100%, 440px);
+ justify-self: end;
+ aspect-ratio: 16 / 11;
+ }
+
+ .shop-gallery-item {
+ flex: 0 0 100%;
+ margin: 0;
+ border-radius: var(--radius-lg);
+ overflow: hidden;
+ border: 1px solid var(--color-border);
+ background: var(--color-neutral-100);
+ box-shadow: var(--shadow-sm);
+ scroll-snap-align: start;
+ aspect-ratio: 16 / 10;
+ }
+
+ .shop-gallery-item img {
+ width: 100%;
+ height: 100%;
+ display: block;
+ object-fit: cover;
+ }
+
.shop-cards {
display: grid;
gap: var(--space-4);
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
}
+ .shop-cards h3 {
+ margin-top: 0;
+ margin-bottom: var(--space-2);
+ }
+
+ .shop-cards p {
+ margin: 0;
+ }
+
.about {
- background: var(--color-neutral-50);
+ background: transparent;
border-top: 1px solid var(--color-border);
position: relative;
- // Gyroid Pattern
- &::before {
- content: '';
- position: absolute;
- inset: 0;
- @include patterns.pattern-gyroid(var(--color-neutral-900), 40px);
- opacity: 0.03;
- pointer-events: none;
- }
+ }
+ .about-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: var(--space-3);
}
.about-grid {
display: grid;
@@ -293,20 +334,61 @@
}
.about-media {
position: relative;
+ display: flex;
+ justify-content: flex-end;
}
-
+
.about-feature-image {
width: 100%;
- height: 100%;
- min-height: 320px;
- object-fit: cover;
+ max-width: 620px;
+ aspect-ratio: 16 / 10;
border-radius: var(--radius-lg);
background: var(--color-neutral-100);
border: 1px solid var(--color-border);
- display: flex;
+ position: relative;
+ overflow: hidden;
+ contain: layout paint;
+ }
+
+ .about-feature-photo {
+ position: absolute;
+ inset: 0;
+ width: 100%;
+ height: 100%;
+ display: block;
+ object-fit: cover;
+ }
+
+ .founder-nav {
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 2.25rem;
+ height: 2.25rem;
+ border-radius: 999px;
+ border: 1px solid rgba(255, 255, 255, 0.6);
+ background: rgba(17, 24, 39, 0.45);
+ color: #fff;
+ display: inline-flex;
align-items: center;
justify-content: center;
- color: var(--color-text-muted);
+ font-size: 1.5rem;
+ line-height: 1;
+ cursor: pointer;
+ z-index: 1;
+ transition: background-color 0.2s ease;
+ }
+
+ .founder-nav:hover {
+ background: rgba(17, 24, 39, 0.7);
+ }
+
+ .founder-nav-prev { left: 0.75rem; }
+ .founder-nav-next { right: 0.75rem; }
+
+ .founder-nav:focus-visible {
+ outline: 2px solid var(--color-brand);
+ outline-offset: 2px;
}
.media-tile p {
margin: 0;
@@ -322,12 +404,38 @@
.calculator-grid { grid-template-columns: 1.1fr 0.9fr; }
.calculator-grid { grid-template-columns: 1.1fr 0.9fr; }
.split { grid-template-columns: 1.1fr 0.9fr; }
+ .shop-copy { grid-column: 1; }
+ .shop-gallery { grid-column: 2; }
+ .shop-cards {
+ grid-column: 1 / -1;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
.about-grid { grid-template-columns: 1.1fr 0.9fr; }
}
@media (max-width: 640px) {
.hero-actions { flex-direction: column; align-items: stretch; }
.quote-meta { grid-template-columns: 1fr; }
+ .shop-gallery {
+ width: min(100%, 320px);
+ justify-self: start;
+ }
+ .shop-gallery-item {
+ aspect-ratio: 16 / 11;
+ }
+ .shop-cards { grid-template-columns: 1fr; }
+ .about-media {
+ justify-content: flex-start;
+ }
+ .about-feature-image {
+ max-width: min(100%, 360px);
+ aspect-ratio: 16 / 11;
+ }
+ .founder-nav {
+ width: 2rem;
+ height: 2rem;
+ font-size: 1.25rem;
+ }
}
@keyframes fadeUp {
diff --git a/frontend/src/app/features/home/home.component.ts b/frontend/src/app/features/home/home.component.ts
index 2aec96c..1163e0e 100644
--- a/frontend/src/app/features/home/home.component.ts
+++ b/frontend/src/app/features/home/home.component.ts
@@ -12,4 +12,38 @@ import { AppCardComponent } from '../../shared/components/app-card/app-card.comp
templateUrl: './home.component.html',
styleUrls: ['./home.component.scss']
})
-export class HomeComponent {}
+export class HomeComponent {
+ readonly shopGalleryImages = [
+ {
+ src: 'assets/images/home/supporto-bici.jpg',
+ alt: 'Prodotto tecnico stampato in 3D'
+ }
+ ];
+
+ readonly founderImages = [
+ {
+ src: 'assets/images/home/da-cambiare.jpg',
+ alt: 'Founder - da cambiare'
+ },
+ {
+ src: 'assets/images/home/vino.JPG',
+ alt: 'Founder - vino'
+ }
+ ];
+
+ founderImageIndex = 0;
+
+ prevFounderImage(): void {
+ this.founderImageIndex =
+ this.founderImageIndex === 0
+ ? this.founderImages.length - 1
+ : this.founderImageIndex - 1;
+ }
+
+ nextFounderImage(): void {
+ this.founderImageIndex =
+ this.founderImageIndex === this.founderImages.length - 1
+ ? 0
+ : this.founderImageIndex + 1;
+ }
+}
diff --git a/frontend/src/assets/i18n/it.json b/frontend/src/assets/i18n/it.json
index 17b0de1..1e86599 100644
--- a/frontend/src/assets/i18n/it.json
+++ b/frontend/src/assets/i18n/it.json
@@ -21,7 +21,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, OBJ",
+ "SEC_CALC_LIST_1": "Formati supportati: STL, 3MF, STEP",
"CARD_CALC_EYEBROW": "Calcolo automatico",
"CARD_CALC_TITLE": "Prezzo e tempi in un click",
"CARD_CALC_TAG": "Senza registrazione",
diff --git a/frontend/src/assets/images/home/cad.jpg b/frontend/src/assets/images/home/cad.jpg
new file mode 100644
index 0000000..1c5dfe2
Binary files /dev/null and b/frontend/src/assets/images/home/cad.jpg differ
diff --git a/frontend/src/assets/images/home/da-cambiare.jpg b/frontend/src/assets/images/home/da-cambiare.jpg
new file mode 100644
index 0000000..b0eb618
Binary files /dev/null and b/frontend/src/assets/images/home/da-cambiare.jpg differ
diff --git a/frontend/src/assets/images/home/original-vs-3dprinted.jpg b/frontend/src/assets/images/home/original-vs-3dprinted.jpg
new file mode 100644
index 0000000..a1230e0
Binary files /dev/null and b/frontend/src/assets/images/home/original-vs-3dprinted.jpg differ
diff --git a/frontend/src/assets/images/home/prototipi.jpg b/frontend/src/assets/images/home/prototipi.jpg
new file mode 100644
index 0000000..3efc5d7
Binary files /dev/null and b/frontend/src/assets/images/home/prototipi.jpg differ
diff --git a/frontend/src/assets/images/home/serie.jpg b/frontend/src/assets/images/home/serie.jpg
new file mode 100644
index 0000000..668b3b6
Binary files /dev/null and b/frontend/src/assets/images/home/serie.jpg differ
diff --git a/frontend/src/assets/images/home/supporto-bici.jpg b/frontend/src/assets/images/home/supporto-bici.jpg
new file mode 100644
index 0000000..71ba26e
Binary files /dev/null and b/frontend/src/assets/images/home/supporto-bici.jpg differ
diff --git a/frontend/src/assets/images/home/vino.JPG b/frontend/src/assets/images/home/vino.JPG
new file mode 100644
index 0000000..eec2da5
Binary files /dev/null and b/frontend/src/assets/images/home/vino.JPG differ
diff --git a/frontend/src/styles/_patterns.scss b/frontend/src/styles/_patterns.scss
index 519a103..928ad2e 100644
--- a/frontend/src/styles/_patterns.scss
+++ b/frontend/src/styles/_patterns.scss
@@ -25,14 +25,13 @@
}
// 3. Hexagonal (Honeycomb Infill)
-// Best structural integrity to weight ratio.
+// Flat top-view hex lattice (no 3D depth effect).
@mixin pattern-honeycomb($color, $size: 32px) {
- background-image:
- radial-gradient(circle, transparent 65%, $color 66%, $color 70%, transparent 71%);
- background-size: $size $size;
- // This creates a "Dot/Ring" pattern that resembles printed layers or nozzle paths
- // A true CSS honeycomb is complex and brittle across browsers.
- // Using this "Nozzle Path" aesthetic instead which feels organic.
+ background-color: transparent;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='52' height='45' viewBox='0 0 52 45'%3E%3Cg fill='none' stroke='%23000' stroke-width='1.25'%3E%3Cpath d='M13 0H39L52 22.5L39 45H13L0 22.5Z'/%3E%3Cpath d='M39 -22.5H65L78 0L65 22.5H39L26 0Z'/%3E%3Cpath d='M39 22.5H65L78 45L65 67.5H39L26 45Z'/%3E%3C/g%3E%3C/svg%3E");
+ background-size: $size calc(#{$size} * 0.8653846);
+ background-position: 0 0;
+ background-repeat: repeat;
}
// 4. Diagonal (Rectilinear 45deg)
diff --git a/frontend/src/styles/theme.scss b/frontend/src/styles/theme.scss
index ec16db9..046496c 100644
--- a/frontend/src/styles/theme.scss
+++ b/frontend/src/styles/theme.scss
@@ -1,9 +1,9 @@
/* src/styles/theme.scss */
-@use 'tokens';
+@use './tokens';
:root {
/* Semantic Colors - Theming Layer */
- --color-bg: #ffffff;
+ --color-bg: #faf9f6;
--color-bg-card: #ffffff;
--color-text: var(--color-neutral-900);
--color-text-muted: var(--color-secondary-500);
|