Add animated 3D house printing sequence
Browse files- index.html +278 -24
index.html
CHANGED
|
@@ -180,6 +180,181 @@ a{color:inherit;text-decoration:none}
|
|
| 180 |
.hero-float b{color:var(--ink);font-size:13px}
|
| 181 |
.hf1{left:4%;bottom:20%}.hf2{right:5%;top:16%}
|
| 182 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 183 |
/* βββββ Shared βββββ */
|
| 184 |
section{scroll-margin-top:110px}
|
| 185 |
.section{
|
|
@@ -638,36 +813,115 @@ section{scroll-margin-top:110px}
|
|
| 638 |
<section class="hero shell" id="overview">
|
| 639 |
<div class="hero-eyebrow">3D construction feasibility</div>
|
| 640 |
<h1>Will it actually cost less?</h1>
|
| 641 |
-
<p class="hero-copy">3D printing can make walls faster.
|
| 642 |
<div class="hero-links">
|
| 643 |
<button class="text-link" data-scroll="#configure">Analyze a project</button>
|
| 644 |
<button class="text-link" data-scroll="#story">See how it works</button>
|
| 645 |
</div>
|
| 646 |
|
| 647 |
<div class="house-stage">
|
| 648 |
-
<
|
| 649 |
-
<
|
| 650 |
-
<
|
| 651 |
-
|
| 652 |
-
|
| 653 |
-
|
| 654 |
-
|
| 655 |
-
|
| 656 |
-
|
| 657 |
-
|
| 658 |
-
|
| 659 |
-
|
| 660 |
-
|
| 661 |
-
|
| 662 |
-
|
| 663 |
-
|
| 664 |
-
|
| 665 |
-
|
| 666 |
-
|
| 667 |
-
|
| 668 |
-
|
| 669 |
-
|
| 670 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 671 |
</div>
|
| 672 |
</section>
|
| 673 |
|
|
|
|
| 180 |
.hero-float b{color:var(--ink);font-size:13px}
|
| 181 |
.hf1{left:4%;bottom:20%}.hf2{right:5%;top:16%}
|
| 182 |
|
| 183 |
+
|
| 184 |
+
/* βββββ Motion 3D printed house βββββ */
|
| 185 |
+
.motion-house-wrap{
|
| 186 |
+
position:relative;
|
| 187 |
+
width:100%;
|
| 188 |
+
height:100%;
|
| 189 |
+
display:grid;
|
| 190 |
+
place-items:center;
|
| 191 |
+
perspective:1200px;
|
| 192 |
+
}
|
| 193 |
+
.motion-house-svg{
|
| 194 |
+
width:100%;
|
| 195 |
+
height:100%;
|
| 196 |
+
overflow:visible;
|
| 197 |
+
filter:drop-shadow(0 30px 28px rgba(0,0,0,.10));
|
| 198 |
+
}
|
| 199 |
+
.mh-base{
|
| 200 |
+
opacity:1;
|
| 201 |
+
}
|
| 202 |
+
.mh-layer{
|
| 203 |
+
fill:none;
|
| 204 |
+
stroke:#c81e1e;
|
| 205 |
+
stroke-width:6;
|
| 206 |
+
stroke-linecap:round;
|
| 207 |
+
stroke-linejoin:round;
|
| 208 |
+
stroke-dasharray:850;
|
| 209 |
+
stroke-dashoffset:850;
|
| 210 |
+
opacity:.2;
|
| 211 |
+
animation:mh-print 8s ease-in-out infinite;
|
| 212 |
+
}
|
| 213 |
+
.mh-l2{animation-delay:.18s}
|
| 214 |
+
.mh-l3{animation-delay:.36s}
|
| 215 |
+
.mh-l4{animation-delay:.54s}
|
| 216 |
+
.mh-l5{animation-delay:.72s}
|
| 217 |
+
.mh-l6{animation-delay:.90s}
|
| 218 |
+
.mh-l7{animation-delay:1.08s}
|
| 219 |
+
.mh-l8{animation-delay:1.26s}
|
| 220 |
+
@keyframes mh-print{
|
| 221 |
+
0%,8%{stroke-dashoffset:850;opacity:.12}
|
| 222 |
+
40%,72%{stroke-dashoffset:0;opacity:1}
|
| 223 |
+
88%,100%{stroke-dashoffset:0;opacity:.28}
|
| 224 |
+
}
|
| 225 |
+
.mh-side-layer{
|
| 226 |
+
fill:none;
|
| 227 |
+
stroke:#9f1717;
|
| 228 |
+
stroke-width:5;
|
| 229 |
+
stroke-linecap:round;
|
| 230 |
+
stroke-dasharray:500;
|
| 231 |
+
stroke-dashoffset:500;
|
| 232 |
+
opacity:.14;
|
| 233 |
+
animation:mh-sideprint 8s ease-in-out infinite;
|
| 234 |
+
}
|
| 235 |
+
.mh-s2{animation-delay:.22s}
|
| 236 |
+
.mh-s3{animation-delay:.44s}
|
| 237 |
+
.mh-s4{animation-delay:.66s}
|
| 238 |
+
.mh-s5{animation-delay:.88s}
|
| 239 |
+
@keyframes mh-sideprint{
|
| 240 |
+
0%,12%{stroke-dashoffset:500;opacity:.08}
|
| 241 |
+
46%,72%{stroke-dashoffset:0;opacity:.9}
|
| 242 |
+
88%,100%{stroke-dashoffset:0;opacity:.24}
|
| 243 |
+
}
|
| 244 |
+
.mh-nozzle{
|
| 245 |
+
transform-box:fill-box;
|
| 246 |
+
transform-origin:center;
|
| 247 |
+
animation:mh-nozzle 8s cubic-bezier(.45,.05,.55,.95) infinite;
|
| 248 |
+
}
|
| 249 |
+
@keyframes mh-nozzle{
|
| 250 |
+
0%{transform:translate(-155px,54px)}
|
| 251 |
+
10%{transform:translate(145px,54px)}
|
| 252 |
+
20%{transform:translate(-155px,37px)}
|
| 253 |
+
30%{transform:translate(145px,37px)}
|
| 254 |
+
40%{transform:translate(-155px,20px)}
|
| 255 |
+
50%{transform:translate(145px,20px)}
|
| 256 |
+
60%{transform:translate(-155px,3px)}
|
| 257 |
+
70%{transform:translate(145px,3px)}
|
| 258 |
+
78%,100%{transform:translate(0,-80px)}
|
| 259 |
+
}
|
| 260 |
+
.mh-gantry{
|
| 261 |
+
transform-box:fill-box;
|
| 262 |
+
transform-origin:center;
|
| 263 |
+
animation:mh-gantry 8s ease-in-out infinite;
|
| 264 |
+
}
|
| 265 |
+
@keyframes mh-gantry{
|
| 266 |
+
0%,70%{opacity:1;transform:translateY(0)}
|
| 267 |
+
80%,100%{opacity:0;transform:translateY(-35px)}
|
| 268 |
+
}
|
| 269 |
+
.mh-roof{
|
| 270 |
+
opacity:0;
|
| 271 |
+
transform:translateY(-26px);
|
| 272 |
+
transform-box:fill-box;
|
| 273 |
+
transform-origin:center;
|
| 274 |
+
animation:mh-roof 8s ease-in-out infinite;
|
| 275 |
+
}
|
| 276 |
+
@keyframes mh-roof{
|
| 277 |
+
0%,60%{opacity:0;transform:translateY(-26px)}
|
| 278 |
+
72%,90%{opacity:1;transform:translateY(0)}
|
| 279 |
+
100%{opacity:.9;transform:translateY(0)}
|
| 280 |
+
}
|
| 281 |
+
.mh-openings{
|
| 282 |
+
opacity:0;
|
| 283 |
+
animation:mh-openings 8s ease-in-out infinite;
|
| 284 |
+
}
|
| 285 |
+
@keyframes mh-openings{
|
| 286 |
+
0%,68%{opacity:0}
|
| 287 |
+
78%,96%{opacity:1}
|
| 288 |
+
100%{opacity:.9}
|
| 289 |
+
}
|
| 290 |
+
.mh-mep{
|
| 291 |
+
opacity:0;
|
| 292 |
+
stroke-dasharray:220;
|
| 293 |
+
stroke-dashoffset:220;
|
| 294 |
+
animation:mh-mep 8s ease-in-out infinite;
|
| 295 |
+
}
|
| 296 |
+
@keyframes mh-mep{
|
| 297 |
+
0%,70%{opacity:0;stroke-dashoffset:220}
|
| 298 |
+
80%,96%{opacity:1;stroke-dashoffset:0}
|
| 299 |
+
100%{opacity:.85;stroke-dashoffset:0}
|
| 300 |
+
}
|
| 301 |
+
.mh-glow{
|
| 302 |
+
opacity:.0;
|
| 303 |
+
animation:mh-glow 8s ease-in-out infinite;
|
| 304 |
+
}
|
| 305 |
+
@keyframes mh-glow{
|
| 306 |
+
0%,73%{opacity:0}
|
| 307 |
+
86%,96%{opacity:.75}
|
| 308 |
+
100%{opacity:.25}
|
| 309 |
+
}
|
| 310 |
+
.mh-status{
|
| 311 |
+
position:absolute;
|
| 312 |
+
left:50%;
|
| 313 |
+
bottom:5%;
|
| 314 |
+
transform:translateX(-50%);
|
| 315 |
+
display:inline-flex;
|
| 316 |
+
align-items:center;
|
| 317 |
+
gap:8px;
|
| 318 |
+
padding:8px 12px;
|
| 319 |
+
border-radius:999px;
|
| 320 |
+
background:rgba(255,255,255,.88);
|
| 321 |
+
backdrop-filter:blur(16px);
|
| 322 |
+
-webkit-backdrop-filter:blur(16px);
|
| 323 |
+
border:1px solid rgba(0,0,0,.08);
|
| 324 |
+
font-size:10px;
|
| 325 |
+
color:#6e6e73;
|
| 326 |
+
white-space:nowrap;
|
| 327 |
+
}
|
| 328 |
+
.mh-status-dot{
|
| 329 |
+
width:7px;height:7px;border-radius:50%;
|
| 330 |
+
background:#c81e1e;
|
| 331 |
+
box-shadow:0 0 0 5px rgba(200,30,30,.08);
|
| 332 |
+
animation:mh-pulse 1.2s ease-in-out infinite;
|
| 333 |
+
}
|
| 334 |
+
@keyframes mh-pulse{
|
| 335 |
+
0%,100%{transform:scale(.85);opacity:.65}
|
| 336 |
+
50%{transform:scale(1.15);opacity:1}
|
| 337 |
+
}
|
| 338 |
+
.mh-status-text::after{
|
| 339 |
+
content:"Printing wall layers";
|
| 340 |
+
animation:mh-statuscopy 8s steps(1,end) infinite;
|
| 341 |
+
}
|
| 342 |
+
@keyframes mh-statuscopy{
|
| 343 |
+
0%,59%{content:"Printing wall layers"}
|
| 344 |
+
60%,74%{content:"Setting roof structure"}
|
| 345 |
+
75%,87%{content:"Adding MEP + openings"}
|
| 346 |
+
88%,100%{content:"House complete"}
|
| 347 |
+
}
|
| 348 |
+
@media(prefers-reduced-motion:reduce){
|
| 349 |
+
.mh-layer,.mh-side-layer,.mh-nozzle,.mh-gantry,.mh-roof,.mh-openings,.mh-mep,.mh-glow,.mh-status-dot,.mh-status-text::after{
|
| 350 |
+
animation:none!important;
|
| 351 |
+
}
|
| 352 |
+
.mh-layer,.mh-side-layer{stroke-dashoffset:0!important;opacity:1!important}
|
| 353 |
+
.mh-roof,.mh-openings,.mh-mep{opacity:1!important;transform:none!important;stroke-dashoffset:0!important}
|
| 354 |
+
.mh-gantry{opacity:.35!important}
|
| 355 |
+
.mh-status-text::after{content:"Finished house"!important}
|
| 356 |
+
}
|
| 357 |
+
|
| 358 |
/* βββββ Shared βββββ */
|
| 359 |
section{scroll-margin-top:110px}
|
| 360 |
.section{
|
|
|
|
| 813 |
<section class="hero shell" id="overview">
|
| 814 |
<div class="hero-eyebrow">3D construction feasibility</div>
|
| 815 |
<h1>Will it actually cost less?</h1>
|
| 816 |
+
<p class="hero-copy">3D printing can make walls faster. Watch the house build itself, then see whether the <b>whole project</b> becomes faster, cheaper, and more profitable.</p>
|
| 817 |
<div class="hero-links">
|
| 818 |
<button class="text-link" data-scroll="#configure">Analyze a project</button>
|
| 819 |
<button class="text-link" data-scroll="#story">See how it works</button>
|
| 820 |
</div>
|
| 821 |
|
| 822 |
<div class="house-stage">
|
| 823 |
+
<div class="motion-house-wrap" aria-label="Animated 3D printer building a house">
|
| 824 |
+
<svg class="motion-house-svg" viewBox="0 0 1000 560" role="img" aria-label="3D printed house being built layer by layer">
|
| 825 |
+
<defs>
|
| 826 |
+
<linearGradient id="mhRoof" x1="0" x2="1">
|
| 827 |
+
<stop offset="0" stop-color="#b8bbc1"/>
|
| 828 |
+
<stop offset="1" stop-color="#ececef"/>
|
| 829 |
+
</linearGradient>
|
| 830 |
+
<linearGradient id="mhGlass" x1="0" x2="1">
|
| 831 |
+
<stop offset="0" stop-color="#b9dcf4"/>
|
| 832 |
+
<stop offset="1" stop-color="#eaf7ff"/>
|
| 833 |
+
</linearGradient>
|
| 834 |
+
<linearGradient id="mhWall" x1="0" x2="1">
|
| 835 |
+
<stop offset="0" stop-color="#f1f1f3"/>
|
| 836 |
+
<stop offset=".52" stop-color="#ffffff"/>
|
| 837 |
+
<stop offset="1" stop-color="#e6e7ea"/>
|
| 838 |
+
</linearGradient>
|
| 839 |
+
<filter id="mhShadow">
|
| 840 |
+
<feDropShadow dx="0" dy="18" stdDeviation="18" flood-opacity=".13"/>
|
| 841 |
+
</filter>
|
| 842 |
+
<filter id="mhSoftGlow">
|
| 843 |
+
<feGaussianBlur stdDeviation="14"/>
|
| 844 |
+
</filter>
|
| 845 |
+
</defs>
|
| 846 |
+
|
| 847 |
+
<ellipse cx="500" cy="492" rx="320" ry="32" fill="#000" opacity=".055"/>
|
| 848 |
+
|
| 849 |
+
<!-- slab -->
|
| 850 |
+
<g class="mh-base" filter="url(#mhShadow)">
|
| 851 |
+
<path d="M205 420 480 505 790 414 514 339Z" fill="#d4d6da" stroke="#b8bbc1" stroke-width="2"/>
|
| 852 |
+
<path d="M220 410 481 489 770 406" fill="none" stroke="#bfc2c7" stroke-width="4"/>
|
| 853 |
+
</g>
|
| 854 |
+
|
| 855 |
+
<!-- faint wall masses for 3D perspective -->
|
| 856 |
+
<g opacity=".22">
|
| 857 |
+
<path d="M267 239 497 135 704 226 704 405 491 472 267 404Z" fill="url(#mhWall)" stroke="#bfc5cc" stroke-width="2"/>
|
| 858 |
+
<path d="M704 226 786 270 786 378 704 405Z" fill="#d9dde3" stroke="#b8bec5" stroke-width="2"/>
|
| 859 |
+
</g>
|
| 860 |
+
|
| 861 |
+
<!-- front red printed layers -->
|
| 862 |
+
<path class="mh-layer mh-l1" d="M273 398 491 465 704 398"/>
|
| 863 |
+
<path class="mh-layer mh-l2" d="M273 377 491 444 704 377"/>
|
| 864 |
+
<path class="mh-layer mh-l3" d="M273 356 491 423 704 356"/>
|
| 865 |
+
<path class="mh-layer mh-l4" d="M273 335 491 402 704 335"/>
|
| 866 |
+
<path class="mh-layer mh-l5" d="M273 314 491 381 704 314"/>
|
| 867 |
+
<path class="mh-layer mh-l6" d="M273 293 491 360 704 293"/>
|
| 868 |
+
<path class="mh-layer mh-l7" d="M273 272 491 339 704 272"/>
|
| 869 |
+
<path class="mh-layer mh-l8" d="M273 251 491 318 704 251"/>
|
| 870 |
+
|
| 871 |
+
<!-- side printed layers -->
|
| 872 |
+
<path class="mh-side-layer mh-s1" d="M704 398 783 373"/>
|
| 873 |
+
<path class="mh-side-layer mh-s2" d="M704 369 783 344"/>
|
| 874 |
+
<path class="mh-side-layer mh-s3" d="M704 340 783 315"/>
|
| 875 |
+
<path class="mh-side-layer mh-s4" d="M704 311 783 286"/>
|
| 876 |
+
<path class="mh-side-layer mh-s5" d="M704 282 783 257"/>
|
| 877 |
+
|
| 878 |
+
<!-- printer gantry -->
|
| 879 |
+
<g class="mh-gantry">
|
| 880 |
+
<path d="M205 168V460M803 168V435M205 180H803" stroke="#62656b" stroke-width="10" stroke-linecap="round"/>
|
| 881 |
+
<path d="M244 222H761" stroke="#8d9096" stroke-width="8" stroke-linecap="round"/>
|
| 882 |
+
<g class="mh-nozzle">
|
| 883 |
+
<rect x="474" y="196" width="54" height="48" rx="8" fill="#2f3237"/>
|
| 884 |
+
<path d="M488 244h26l-7 25h-12z" fill="#c81e1e"/>
|
| 885 |
+
<path d="M501 269v23" stroke="#c81e1e" stroke-width="6" stroke-linecap="round"/>
|
| 886 |
+
<circle cx="501" cy="295" r="4" fill="#c81e1e"/>
|
| 887 |
+
</g>
|
| 888 |
+
</g>
|
| 889 |
+
|
| 890 |
+
<!-- roof -->
|
| 891 |
+
<g class="mh-roof" filter="url(#mhShadow)">
|
| 892 |
+
<path d="M243 244 493 116 735 228 704 255 492 158 273 270Z" fill="url(#mhRoof)" stroke="#aaaeb4" stroke-width="2"/>
|
| 893 |
+
<path d="M735 228 805 263 780 284 704 255Z" fill="#aeb2b8" stroke="#999ea4" stroke-width="2"/>
|
| 894 |
+
</g>
|
| 895 |
+
|
| 896 |
+
<!-- door and windows -->
|
| 897 |
+
<g class="mh-openings">
|
| 898 |
+
<rect x="454" y="344" width="78" height="118" rx="5" fill="url(#mhGlass)" stroke="#8aaac0" stroke-width="2"/>
|
| 899 |
+
<rect x="330" y="320" width="72" height="70" rx="5" fill="url(#mhGlass)" stroke="#9ab4c6" stroke-width="2"/>
|
| 900 |
+
<rect x="582" y="320" width="72" height="70" rx="5" fill="url(#mhGlass)" stroke="#9ab4c6" stroke-width="2"/>
|
| 901 |
+
<rect x="726" y="300" width="38" height="58" rx="4" fill="#c9e5f7" stroke="#9eb8ca" stroke-width="2"/>
|
| 902 |
+
</g>
|
| 903 |
+
|
| 904 |
+
<!-- plumbing / electrical traces -->
|
| 905 |
+
<g class="mh-mep" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
| 906 |
+
<path d="M313 401v-74h55" stroke="#0071e3" stroke-width="5"/>
|
| 907 |
+
<path d="M671 399v-92h-66" stroke="#ff7a00" stroke-width="5"/>
|
| 908 |
+
<path d="M494 429v-109" stroke="#16803c" stroke-width="5"/>
|
| 909 |
+
<circle cx="368" cy="327" r="6" fill="#0071e3" stroke="none"/>
|
| 910 |
+
<circle cx="605" cy="307" r="6" fill="#ff7a00" stroke="none"/>
|
| 911 |
+
</g>
|
| 912 |
+
|
| 913 |
+
<!-- completion glow -->
|
| 914 |
+
<ellipse class="mh-glow" cx="505" cy="330" rx="270" ry="170" fill="#70b9ff" opacity=".14" filter="url(#mhSoftGlow)"/>
|
| 915 |
+
</svg>
|
| 916 |
+
|
| 917 |
+
<div class="mh-status">
|
| 918 |
+
<span class="mh-status-dot"></span>
|
| 919 |
+
<span class="mh-status-text"></span>
|
| 920 |
+
</div>
|
| 921 |
+
|
| 922 |
+
<div class="hero-float hf1">Wall print <b>7 days</b></div>
|
| 923 |
+
<div class="hero-float hf2">Whole project <b>192 days</b></div>
|
| 924 |
+
</div>
|
| 925 |
</div>
|
| 926 |
</section>
|
| 927 |
|