CodeAntidote commited on
Commit
a464f1c
Β·
verified Β·
1 Parent(s): 1c8b4a1

Add animated 3D house printing sequence

Browse files
Files changed (1) hide show
  1. 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. PrintHome compares whether the <b>whole project</b> becomes faster, cheaper, and more profitable.</p>
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
- <svg class="hero-house" viewBox="0 0 1000 520" role="img" aria-label="Stylized 3D printed house">
649
- <defs>
650
- <linearGradient id="wallg" x1="0" x2="1"><stop stop-color="#e8edf4"/><stop offset=".52" stop-color="#ffffff"/><stop offset="1" stop-color="#dce4ee"/></linearGradient>
651
- <linearGradient id="roofg" x1="0" x2="1"><stop stop-color="#bbbcc0"/><stop offset="1" stop-color="#e6e6e9"/></linearGradient>
652
- <filter id="sh"><feDropShadow dx="0" dy="18" stdDeviation="16" flood-opacity=".14"/></filter>
653
- </defs>
654
- <ellipse cx="500" cy="442" rx="330" ry="30" fill="#000" opacity=".055"/>
655
- <g filter="url(#sh)">
656
- <path d="M245 252 502 94 760 252 699 284 502 167 304 285Z" fill="url(#roofg)" stroke="#b6b7bc" stroke-width="2"/>
657
- <path d="M300 282 501 165 704 282v145H300z" fill="url(#wallg)" stroke="#c4cbd4" stroke-width="2"/>
658
- <path d="M300 318h404M300 339h404M300 360h404M300 381h404M300 402h404" stroke="#aebed0" stroke-width="5" opacity=".55"/>
659
- <rect x="464" y="315" width="76" height="112" rx="4" fill="#cfe4f5" stroke="#9eb5c8" stroke-width="2"/>
660
- <rect x="354" y="312" width="67" height="66" rx="5" fill="#d9ebf9" stroke="#b0c7d9" stroke-width="2"/>
661
- <rect x="579" y="312" width="67" height="66" rx="5" fill="#d9ebf9" stroke="#b0c7d9" stroke-width="2"/>
662
- </g>
663
- <g opacity=".9">
664
- <rect x="472" y="208" width="59" height="46" rx="9" fill="#2f3338"/>
665
- <path d="M487 254h30l-7 25h-16z" fill="#c81e1e"/>
666
- <path d="M501 279v20" stroke="#c81e1e" stroke-width="5"/>
667
- </g>
668
- </svg>
669
- <div class="hero-float hf1">Wall print <b>7 days</b></div>
670
- <div class="hero-float hf2">Whole project <b>192 days</b></div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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