Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
735 lines (689 loc) · 78 KB
/
Copy pathindex.html
File metadata and controls
735 lines (689 loc) · 78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>BoundlessCAD — Remote exocad design for dental labs</title>
<meta name="description" content="Remote exocad design studio for dental labs and digital clinics: crowns, bridges, custom abutments, full-arch implant prostheses, night guards and surgical guides. Production-ready files in 24–48 h. First case free.">
<meta property="og:title" content="BoundlessCAD — Remote exocad design for dental labs">
<meta property="og:description" content="Crowns, custom abutments and full-arch implant designs, returned production-ready in 24–48 h. Your first case is designed free.">
<meta property="og:image" content="https://boundlesscaddesign-dev.github.io/og.png">
<link rel="canonical" href="https://boundlesscaddesign-dev.github.io/">
<link rel="alternate" hreflang="en" href="https://boundlesscaddesign-dev.github.io/">
<link rel="alternate" hreflang="es" href="https://boundlesscaddesign-dev.github.io/es/">
<link rel="alternate" hreflang="x-default" href="https://boundlesscaddesign-dev.github.io/">
<meta property="og:url" content="https://boundlesscaddesign-dev.github.io/">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "ProfessionalService", "name": "BoundlessCAD", "url": "https://boundlesscaddesign-dev.github.io/", "description": "Remote exocad design studio for dental labs: crowns, bridges, custom abutments, full-arch implant prostheses, night guards and surgical guides.", "email": "boundlesscad.design@gmail.com", "areaServed": "Worldwide", "inLanguage": "en", "image": "https://boundlesscaddesign-dev.github.io/og.png", "makesOffer": [{"@type": "Offer", "name": "Crown / bridge unit design", "price": "6.40", "priceCurrency": "USD"}, {"@type": "Offer", "name": "Implant crown or custom abutment design", "price": "9.10", "priceCurrency": "USD"}, {"@type": "Offer", "name": "Full-arch implant prosthesis design (per arch)", "price": "88", "priceCurrency": "USD"}, {"@type": "Offer", "name": "Night guard / splint design", "price": "12", "priceCurrency": "USD"}, {"@type": "Offer", "name": "Surgical guide design (from)", "price": "86.50", "priceCurrency": "USD"}]}</script>
<script type="application/ld+json">{"@context": "https://schema.org", "@type": "FAQPage", "inLanguage": "en", "mainEntity": [{"@type": "Question", "name": "Which files do you need?", "acceptedAnswer": {"@type": "Answer", "text": "Intraoral or model scans as STL or PLY, or a complete exocad project, plus the prescription: tooth numbers, restoration type, material and shade. For implant cases, tell us the implant system and scan body."}}, {"@type": "Question", "name": "What do we receive back?", "acceptedAnswer": {"@type": "Answer", "text": "Production-ready STL files and the exocad project, so your team can still adjust anything in-house."}}, {"@type": "Question", "name": "How fast is the turnaround?", "acceptedAnswer": {"@type": "Answer", "text": "24–48 hours for standard crowns and bridges. Full-arch and guide cases are scheduled on agreement."}}, {"@type": "Question", "name": "Do you follow our lab's design rules?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Send your parameters once — cement gap, minimum thickness, connector sizes, preferred libraries — and we apply them to every case."}}, {"@type": "Question", "name": "How does payment work?", "acceptedAnswer": {"@type": "Answer", "text": "Your first case is free. After that we invoice per unit with prepayment, in USDT, USDC or BTC."}}, {"@type": "Question", "name": "Can we check a scan before sending it?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. Our free STL Check finds holes, broken edges, flipped triangles, loose debris and wrong units in any STL or PLY file. It runs in your browser, so the file is never uploaded: boundlesscaddesign-dev.github.io/check/"}}, {"@type": "Question", "name": "Is patient data safe?", "acceptedAnswer": {"@type": "Answer", "text": "We only need anonymized files under a case code, never patient names, and all work is white-label."}}]}</script>
<link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="icon" href="/favicon-32.png" sizes="32x32"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="manifest" href="/site.webmanifest">
<meta name="theme-color" content="#0b1826">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&family=Instrument+Serif:ital@0;1&display=swap" rel="stylesheet">
<style>
:root{
--bg:#0b1826;--bg2:#0f2033;--panel:#12263a;--teal:#7FD1C7;--teal2:#4fb8ab;--mint:#b9f0e8;--gold:#f2c98a;
--txt:#e9f1f5;--muted:#93a8b8;--line:rgba(255,255,255,.08);--cream:#F5F3EE;--ink:#12263A;--r:18px;
--ease:cubic-bezier(.2,.7,.2,1);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:Manrope,system-ui,-apple-system,Segoe UI,sans-serif;background:var(--bg);color:var(--txt);line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden}
a{color:inherit;text-decoration:none}
img{display:block;max-width:100%}
.wrap{max-width:1180px;margin:0 auto;padding:0 22px}
.serif{font-family:"Instrument Serif",Georgia,serif;font-weight:400;font-style:italic;letter-spacing:-.5px}
.eyebrow{display:inline-flex;align-items:center;gap:10px;color:var(--teal);font-size:12px;font-weight:700;letter-spacing:2.6px;text-transform:uppercase}
.eyebrow::before{content:"";width:26px;height:1.5px;background:currentColor;opacity:.7}
/* ---------- scroll progress + cursor glow ---------- */
#progress{position:fixed;top:0;left:0;height:3px;width:0;background:linear-gradient(90deg,var(--teal),var(--mint),var(--gold));z-index:100;box-shadow:0 0 12px var(--teal)}
#glow{position:fixed;width:520px;height:520px;border-radius:50%;pointer-events:none;z-index:0;background:radial-gradient(circle,rgba(127,209,199,.10),transparent 60%);transform:translate(-50%,-50%);transition:opacity .4s;mix-blend-mode:screen}
/* ---------- header ---------- */
header{position:fixed;top:0;left:0;right:0;z-index:60;transition:background .4s,backdrop-filter .4s,box-shadow .4s}
header.scrolled{background:rgba(11,24,38,.78);backdrop-filter:blur(14px) saturate(1.3);box-shadow:0 1px 0 var(--line)}
.nav{display:flex;align-items:center;justify-content:space-between;height:74px}
.logo{display:flex;align-items:center;gap:11px;font-weight:800;font-size:20px;letter-spacing:-.4px}
.logo b{color:var(--teal)}
.logo svg .ring{transform-origin:32px 32px;animation:spin 9s linear infinite}
.nav ul{display:flex;gap:24px;list-style:none}
.nav ul{margin:0 24px}
@media (max-width:1520px){.nav ul li.xg{display:none}}
.nav ul a{white-space:nowrap}
@media (max-width:1180px){.nav ul li.xf{display:none}}
.nav ul a{color:var(--muted);font-size:14.5px;font-weight:600;position:relative;transition:color .25s}
.nav ul a::after{content:"";position:absolute;left:0;bottom:-6px;height:2px;width:100%;background:var(--teal);transform:scaleX(0);transform-origin:right;transition:transform .35s var(--ease)}
.nav ul a:hover{color:#fff}.nav ul a:hover::after{transform:scaleX(1);transform-origin:left}
.btn{position:relative;display:inline-flex;align-items:center;gap:9px;background:var(--teal);color:#06231f;font-weight:800;padding:13px 24px;border-radius:999px;font-size:15px;overflow:hidden;transition:transform .3s var(--ease),box-shadow .3s;box-shadow:0 8px 30px -8px rgba(127,209,199,.6);isolation:isolate;white-space:nowrap}
.btn::before{content:"";position:absolute;inset:0;background:linear-gradient(110deg,transparent 30%,rgba(255,255,255,.65) 50%,transparent 70%);transform:translateX(-120%);transition:transform .8s var(--ease);z-index:-1}
.btn:hover{transform:translateY(-2px);box-shadow:0 14px 40px -8px rgba(127,209,199,.8)}
.btn:hover::before{transform:translateX(120%)}
.btn .arr{transition:transform .3s var(--ease)}.btn:hover .arr{transform:translateX(4px)}
.btn.ghost{background:transparent;color:#fff;border:1.5px solid rgba(255,255,255,.22);box-shadow:none}
.btn.ghost:hover{border-color:var(--teal);color:var(--teal)}
/* ---------- hero ---------- */
.hero{position:relative;min-height:100vh;display:flex;align-items:center;padding:120px 0 90px;overflow:hidden}
#net{position:absolute;inset:0;width:100%;height:100%;z-index:0}
.blob{position:absolute;border-radius:50%;filter:blur(80px);opacity:.45;z-index:0;animation:float 18s ease-in-out infinite}
.blob.a{width:520px;height:520px;background:#1c5f63;top:-140px;right:-120px}
.blob.b{width:420px;height:420px;background:#1b3a66;bottom:-160px;left:-120px;animation-delay:-6s}
.blob.c{width:260px;height:260px;background:#7FD1C7;top:40%;left:45%;opacity:.16;animation-delay:-11s}
.hero .grid{position:relative;z-index:2;display:grid;grid-template-columns:1.18fr .82fr;gap:56px;align-items:center}
.hero h1{font-size:clamp(36px,4.6vw,64px);line-height:1.02;letter-spacing:-2.4px;font-weight:800;margin:18px 0 22px}
.hero h1 .line{display:block;overflow:hidden}
.hero h1 .line span{display:inline-block;transform:translateY(110%);animation:rise 1s var(--ease) forwards}
.hero h1 .line:nth-child(2) span{animation-delay:.12s}.hero h1 .line:nth-child(3) span{animation-delay:.24s}
.grad{background:linear-gradient(100deg,var(--teal) 0%,var(--mint) 40%,var(--gold) 70%,var(--teal) 100%);background-size:250% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:shine 6s linear infinite}
.hero p.lead{color:#b6c7d3;font-size:18.5px;max-width:540px;opacity:0;animation:fade 1s .55s var(--ease) forwards}
.hero .ctas{display:flex;gap:14px;margin-top:34px;flex-wrap:wrap;opacity:0;animation:fade 1s .75s var(--ease) forwards}
.stats{display:flex;gap:34px;margin-top:48px;flex-wrap:wrap;opacity:0;animation:fade 1s .95s var(--ease) forwards}
.stat b{display:block;font-size:34px;font-weight:800;letter-spacing:-1px;color:#fff}
.stat span{color:var(--muted);font-size:13.5px}
.stage{position:relative;perspective:1200px;opacity:0;animation:fade 1.2s .4s var(--ease) forwards}
.orbit{position:absolute;inset:-8%;border:1px dashed rgba(127,209,199,.25);border-radius:50%;animation:spin 40s linear infinite}
.orbit.o2{inset:4%;border-style:solid;border-color:rgba(127,209,199,.12);animation-duration:26s;animation-direction:reverse}
.orbit i{position:absolute;top:50%;left:-6px;width:12px;height:12px;border-radius:50%;background:var(--teal);box-shadow:0 0 18px var(--teal)}
.orbit.o2 i{left:auto;right:-5px;top:20%;width:9px;height:9px;background:var(--gold);box-shadow:0 0 16px var(--gold)}
.card3d{position:relative;border-radius:24px;overflow:hidden;transform-style:preserve-3d;transition:transform .2s ease-out;box-shadow:0 50px 90px -30px rgba(0,0,0,.7),0 0 0 1px rgba(255,255,255,.07);animation:bob 7s ease-in-out infinite}
.card3d img{width:100%}
.card3d .shine{position:absolute;inset:0;background:radial-gradient(circle at var(--mx,50%) var(--my,30%),rgba(255,255,255,.22),transparent 45%);mix-blend-mode:overlay;pointer-events:none}
.badge{position:absolute;z-index:3;background:rgba(15,32,51,.82);backdrop-filter:blur(10px);border:1px solid var(--line);border-radius:14px;padding:12px 16px;font-size:13px;box-shadow:0 20px 40px -18px rgba(0,0,0,.7);animation:bob 6s ease-in-out infinite}
.badge b{display:block;color:var(--teal);font-size:12px;letter-spacing:1.5px;text-transform:uppercase}
.badge.b1{left:-34px;bottom:14%;animation-delay:-2s}
.badge.b2{right:-22px;top:8%;animation-delay:-4s}
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:#44e38f;margin-right:7px;box-shadow:0 0 0 0 rgba(68,227,143,.7);animation:pulse 2s infinite}
.scrolldown{position:absolute;left:50%;bottom:26px;transform:translateX(-50%);z-index:2;width:26px;height:42px;border:2px solid rgba(255,255,255,.25);border-radius:14px}
.scrolldown::after{content:"";position:absolute;left:50%;top:8px;width:4px;height:8px;margin-left:-2px;border-radius:2px;background:var(--teal);animation:wheel 1.8s infinite}
/* ---------- marquee ---------- */
.marquee{border-block:1px solid var(--line);background:var(--bg2);overflow:hidden;padding:18px 0;position:relative;z-index:2}
.track{display:flex;gap:46px;width:max-content;animation:scroll 38s linear infinite}
.track span{font-size:clamp(18px,2.2vw,26px);font-weight:700;color:#cfe0ea;white-space:nowrap;display:flex;align-items:center;gap:46px}
.track span::after{content:"✦";color:var(--teal);font-size:.7em}
.marquee:hover .track{animation-play-state:paused}
/* ---------- sections ---------- */
section{position:relative;padding:110px 0;z-index:1}
h2{font-size:clamp(30px,4.2vw,54px);line-height:1.06;letter-spacing:-1.6px;font-weight:800;margin:16px 0 18px}
.sub{color:var(--muted);max-width:640px;font-size:17px}
.light{background:var(--cream);color:var(--ink)}
.light h2{color:var(--ink)}.light .sub{color:#5B6B78}.light .eyebrow{color:var(--teal2)}
/* reveal */
.rv{opacity:0;transform:translateY(40px);transition:opacity 1s var(--ease),transform 1s var(--ease)}
.rv.in{opacity:1;transform:none}
.rv.d1{transition-delay:.08s}.rv.d2{transition-delay:.16s}.rv.d3{transition-delay:.24s}.rv.d4{transition-delay:.32s}.rv.d5{transition-delay:.4s}
/* steps */
.steps{position:relative;display:grid;grid-template-columns:repeat(4,1fr);gap:22px;margin-top:60px}
.steps .rail{position:absolute;top:34px;left:6%;right:6%;height:2px;background:rgba(18,38,58,.1);overflow:hidden}
.steps .rail i{display:block;height:100%;width:100%;background:linear-gradient(90deg,var(--teal2),var(--teal));transform:scaleX(0);transform-origin:left;transition:transform 1.8s var(--ease)}
.steps.in .rail i{transform:scaleX(1)}
.step{position:relative;background:#fff;border:1px solid #e6e2da;border-radius:var(--r);padding:28px 24px 26px;transition:transform .4s var(--ease),box-shadow .4s}
.step:hover{transform:translateY(-8px);box-shadow:0 30px 50px -28px rgba(18,38,58,.45)}
.step .n{width:48px;height:48px;border-radius:14px;display:grid;place-items:center;background:var(--ink);color:var(--teal);font-weight:800;font-size:17px;margin-bottom:18px;position:relative;z-index:1}
.step h3{font-size:18.5px;margin-bottom:8px}
.step p{color:#5B6B78;font-size:14.8px}
/* pricing */
.prices{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;margin-top:56px}
.price{position:relative;border-radius:var(--r);padding:30px 28px;background:linear-gradient(180deg,rgba(255,255,255,.045),rgba(255,255,255,.015));border:1px solid var(--line);overflow:hidden;transition:transform .45s var(--ease),border-color .45s}
.price::before{content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1px;background:conic-gradient(from var(--a,0deg),transparent 0 70%,var(--teal) 80%,transparent 90%);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .4s}
.price:hover{transform:translateY(-8px);border-color:transparent}
.price:hover::before{opacity:1;animation:angle 2.6s linear infinite}
.price .ic{width:46px;height:46px;border-radius:12px;background:rgba(127,209,199,.12);display:grid;place-items:center;margin-bottom:20px;color:var(--teal)}
.price h3{font-size:18px;margin-bottom:6px}
.price p{color:var(--muted);font-size:14.5px;min-height:44px}
.price .amt{margin-top:18px;font-size:42px;font-weight:800;letter-spacing:-1.5px}
.price .amt small{font-size:14px;color:var(--muted);font-weight:600;letter-spacing:0}
.price.hot{background:linear-gradient(160deg,#1d5a5a,#123047);border-color:rgba(127,209,199,.4)}
.price.hot .amt{color:var(--teal)}
.ribbon{position:absolute;top:18px;right:-34px;transform:rotate(45deg);background:var(--gold);color:#3a2605;font-size:11px;font-weight:800;letter-spacing:1px;padding:5px 40px}
.note{margin-top:26px;color:var(--muted);font-size:14.5px}
/* gallery */
.cases{columns:3 300px;column-gap:18px;margin-top:56px}
.b3d{margin-top:40px!important}
.case{break-inside:avoid;margin-bottom:18px;position:relative;border-radius:16px;overflow:hidden;cursor:zoom-in;background:#0e1d2d;border:1px solid var(--line);transform:translateZ(0)}
.case img{width:100%;transition:transform 1.1s var(--ease),filter .6s}
.case .ov{position:relative;padding:14px 18px 16px;background:#0e1d2d;border-top:1px solid var(--line)}
.case .k{color:var(--teal);font-size:11px;font-weight:800;letter-spacing:2px}
.case h4{font-size:16px;margin-top:4px}
.case .more{color:var(--muted);font-size:13px;max-height:0;opacity:0;overflow:hidden;transition:max-height .5s var(--ease),opacity .4s,margin .4s}
.case:hover img{transform:scale(1.07);filter:saturate(1.2) brightness(1.05)}
.case:hover .more{opacity:1;max-height:60px;margin-top:6px}
.filters{display:flex;gap:10px;flex-wrap:wrap;margin-top:34px}
.chip{border:1px solid var(--line);background:rgba(255,255,255,.03);color:var(--muted);padding:9px 18px;border-radius:999px;font:inherit;font-size:14px;font-weight:700;cursor:pointer;transition:all .3s}
.chip.on,.chip:hover{background:var(--teal);color:#06231f;border-color:var(--teal)}
.case.hide{display:none}
/* why */
.why{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-top:56px}
.why .item{background:#fff;border:1px solid #e6e2da;border-radius:var(--r);padding:30px 26px;position:relative;overflow:hidden;transition:transform .4s var(--ease)}
.why .item::after{content:"";position:absolute;left:0;top:0;height:4px;width:100%;background:linear-gradient(90deg,var(--teal2),var(--teal));transform:scaleX(0);transform-origin:left;transition:transform .6s var(--ease)}
.why .item:hover{transform:translateY(-6px)}.why .item:hover::after{transform:scaleX(1)}
.why .big{font-size:44px;font-weight:800;letter-spacing:-1.5px;color:var(--ink)}
.why h3{font-size:18px;margin:4px 0 8px}
.why p{color:#5B6B78;font-size:14.8px}
/* faq */
.faq{max-width:860px;margin-top:44px}
.qa{border-bottom:1px solid var(--line)}
.qa button{width:100%;text-align:left;background:none;border:0;color:#fff;font:inherit;font-size:18px;font-weight:700;padding:24px 44px 24px 0;cursor:pointer;position:relative}
.qa button::after,.qa button::before{content:"";position:absolute;right:8px;top:50%;width:16px;height:2px;background:var(--teal);transition:transform .4s var(--ease)}
.qa button::before{transform:rotate(90deg)}
.qa.open button::before{transform:rotate(0)}
.qa .a{display:grid;grid-template-rows:0fr;transition:grid-template-rows .5s var(--ease)}
.qa.open .a{grid-template-rows:1fr}
.qa .a>div{overflow:hidden;color:var(--muted);font-size:15.5px}
.qa .a p{padding-bottom:24px}
/* cta */
.cta{position:relative;border-radius:30px;padding:70px 60px;overflow:hidden;display:grid;grid-template-columns:1.3fr 1fr;gap:40px;align-items:center;background:linear-gradient(135deg,#123047,#0d2236);border:1px solid rgba(127,209,199,.25)}
.cta::before{content:"";position:absolute;width:600px;height:600px;right:-200px;top:-260px;background:radial-gradient(circle,rgba(127,209,199,.35),transparent 60%);animation:float 14s ease-in-out infinite}
.cta>*{position:relative}
.contact a{display:flex;align-items:center;gap:14px;background:rgba(255,255,255,.05);border:1px solid var(--line);border-radius:16px;padding:16px 20px;margin-bottom:12px;transition:transform .35s var(--ease),border-color .35s,background .35s}
.contact a:hover{transform:translateX(6px);border-color:var(--teal);background:rgba(127,209,199,.08)}
.contact .ic{width:42px;height:42px;border-radius:12px;background:var(--teal);color:#06231f;display:grid;place-items:center;flex:none}
.contact small{display:block;color:var(--teal);font-weight:800;font-size:11px;letter-spacing:1.8px;text-transform:uppercase}
.contact span{font-weight:700;word-break:break-all}
footer{padding:40px 0 50px;color:var(--muted);font-size:13.5px;border-top:1px solid var(--line);margin-top:40px}
footer .wrap{display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap}
/* lightbox */
.lb{position:fixed;inset:0;z-index:90;display:grid;place-items:center;padding:24px;background:rgba(5,12,20,.9);backdrop-filter:blur(8px);opacity:0;pointer-events:none;transition:opacity .4s}
.lb.on{opacity:1;pointer-events:auto}
.lb img{max-width:min(1200px,100%);max-height:90vh;border-radius:14px;transform:scale(.92);transition:transform .5s var(--ease);box-shadow:0 40px 80px rgba(0,0,0,.6)}
.lb.on img{transform:none}
.lb .x{position:absolute;top:18px;right:22px;width:46px;height:46px;border-radius:50%;border:1px solid var(--line);background:rgba(255,255,255,.06);color:#fff;font-size:22px;cursor:pointer}
.lb .nv{position:absolute;top:50%;transform:translateY(-50%);width:50px;height:50px;border-radius:50%;border:1px solid var(--line);background:rgba(255,255,255,.06);color:#fff;font-size:22px;cursor:pointer}
.lb .prev{left:18px}.lb .next{right:18px}
/* floating whatsapp */
.fab{position:fixed;right:22px;bottom:22px;z-index:70;width:58px;height:58px;border-radius:50%;background:#25D366;display:grid;place-items:center;box-shadow:0 12px 30px -6px rgba(37,211,102,.6);transition:transform .3s var(--ease)}
.fab::before{content:"";position:absolute;inset:0;border-radius:50%;border:2px solid #25D366;animation:ring 2.4s infinite}
.fab:hover{transform:scale(1.08) rotate(-6deg)}
/* keyframes */
@keyframes spin{to{transform:rotate(360deg)}}
@keyframes rise{to{transform:none}}
@keyframes fade{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:none}}
@keyframes shine{to{background-position:-250% 0}}
@keyframes float{0%,100%{transform:translate(0,0) scale(1)}33%{transform:translate(30px,-40px) scale(1.08)}66%{transform:translate(-25px,20px) scale(.95)}}
@keyframes bob{0%,100%{translate:0 0}50%{translate:0 -12px}}
@keyframes pulse{70%{box-shadow:0 0 0 10px rgba(68,227,143,0)}100%{box-shadow:0 0 0 0 rgba(68,227,143,0)}}
@keyframes wheel{0%{opacity:0;transform:translateY(0)}30%{opacity:1}100%{opacity:0;transform:translateY(14px)}}
@keyframes scroll{to{transform:translateX(-50%)}}
@keyframes ring{0%{transform:scale(1);opacity:.8}100%{transform:scale(1.6);opacity:0}}
@property --a{syntax:"<angle>";inherits:false;initial-value:0deg}
@keyframes angle{to{--a:360deg}}
@media (max-width:980px){.hero .grid,.cta{grid-template-columns:1fr}.stage{max-width:560px;margin:10px auto 0}.steps,.why{grid-template-columns:1fr 1fr}.steps .rail{display:none}.prices{grid-template-columns:1fr 1fr}.nav ul{display:none}.cta{padding:44px 26px}.badge.b1{left:-6px}.badge.b2{right:-6px}}
@media (max-width:600px){.steps,.why,.prices{grid-template-columns:1fr}section{padding:76px 0}.hero{padding-top:104px}.stats{gap:22px}.stat b{font-size:28px}header .btn{padding:10px 16px;font-size:13px}.logo{font-size:18px}.scrolldown{display:none}#glow{display:none}}
@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}.rv{opacity:1;transform:none}.hero h1 .line span{transform:none}.hero p.lead,.hero .ctas,.stats,.stage{opacity:1}}
.b3d{display:flex;align-items:center;gap:16px;margin:0 0 26px;padding:16px 20px;border-radius:16px;background:linear-gradient(135deg,rgba(127,209,199,.14),rgba(127,209,199,.04));border:1px solid rgba(127,209,199,.3);transition:transform .3s var(--ease),border-color .3s}
.b3d[hidden]{display:none}
.b3d:hover{transform:translateY(-3px);border-color:var(--teal)}
.b3d .cube{flex:none;width:44px;height:44px;border-radius:12px;display:grid;place-items:center;background:var(--teal);color:#06241f}
.b3d .cube svg{animation:b3dspin 5s ease-in-out infinite}
@keyframes b3dspin{50%{transform:rotateY(180deg)}}
.b3d small{display:block;color:var(--muted);font-size:13.5px}
.b3d .go{margin-left:auto;color:var(--teal);font-weight:800;white-space:nowrap}
@media (max-width:640px){.b3d{flex-wrap:wrap}.b3d .go{margin-left:0}}
.lang{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-weight:800;letter-spacing:.5px;color:var(--muted);padding:8px 12px;border-radius:999px;border:1px solid var(--line);transition:.25s}
.navr{display:flex;align-items:center;gap:10px}
@media (max-width:640px){.navr .btn{display:none}}
.lang:hover{color:#fff;border-color:var(--teal)}
.lang b{color:var(--teal)}
.ovn{position:relative;overflow:hidden}
.ovn .tlh{margin-top:34px;display:grid;grid-template-columns:1fr auto 1fr auto 1fr;align-items:center;gap:14px}
.ovn .stp{background:var(--panel);border:1px solid var(--line);border-radius:20px;padding:22px;text-align:center}
.ovn .stp .e{font-size:30px}.ovn .stp b{display:block;font-size:26px;color:#fff;margin:6px 0 2px;letter-spacing:-.5px}.ovn .stp span{color:var(--muted);font-size:14px}
.ovn .ar{color:var(--teal);font-size:26px;font-weight:800}
.ovn .fine{margin-top:16px;color:var(--muted);font-size:13px}
.plink{display:inline-flex;margin-top:18px;color:var(--teal);font-weight:800;border-bottom:1px solid rgba(127,209,199,.4)}
@media (max-width:760px){.ovn .tlh{grid-template-columns:1fr}.ovn .ar{transform:rotate(90deg);justify-self:center}}
/* ---------- v2: trust strip ---------- */
.trust{background:var(--bg);border-bottom:1px solid var(--line);padding:22px 0;position:relative;z-index:2}
.trust ul{list-style:none;display:flex;flex-wrap:wrap;justify-content:center;gap:14px 34px}
.trust li{display:flex;align-items:center;gap:10px;color:#cfe0ea;font-size:14px;font-weight:700}
.trust li svg{flex:none;color:var(--teal)}
/* ---------- v2: quality control ---------- */
.qc{display:grid;grid-template-columns:.95fr 1.05fr;gap:56px;align-items:center;margin-top:50px}
.qc-fig{position:relative;background:radial-gradient(circle at 50% 40%,#16324a,#0d1c2c 70%);border:1px solid var(--line);border-radius:28px;padding:26px 26px 52px;box-shadow:0 40px 80px -40px rgba(0,0,0,.8)}
.qc-fig svg{width:100%;height:auto;display:block}
.qc-fig .pin{cursor:default}
.qc-fig .pin circle{transition:r .3s var(--ease)}
.qc-fig .cap{position:absolute;left:22px;bottom:18px;font-size:12px;color:var(--muted);letter-spacing:.5px}
.qc-list{list-style:none;display:grid;gap:12px;counter-reset:q}
.qc-list li{counter-increment:q;display:grid;grid-template-columns:40px 1fr;gap:14px;align-items:start;padding:16px 18px;border-radius:16px;background:rgba(255,255,255,.03);border:1px solid var(--line);transition:border-color .3s,background .3s,transform .3s var(--ease)}
.qc-list li::before{content:counter(q);width:32px;height:32px;border-radius:50%;display:grid;place-items:center;font-weight:800;font-size:14px;color:#06231f;background:var(--teal)}
.qc-list li:hover,.qc-list li.on{border-color:rgba(127,209,199,.5);background:rgba(127,209,199,.06);transform:translateX(4px)}
.qc-list b{display:block;color:#fff;font-size:16px;margin-bottom:2px}
.qc-list span{color:#b6c7d3;font-size:14.5px}
.qc-note{margin-top:18px;color:var(--muted);font-size:14px}
/* ---------- v2: comparison ---------- */
.cmp{margin-top:50px;border-radius:24px;overflow:hidden;border:1px solid #e6e2da;background:#fff;box-shadow:0 30px 60px -40px rgba(18,38,58,.35)}
.cmp table{width:100%;border-collapse:collapse;font-size:15.5px}
.cmp th,.cmp td{padding:18px 22px;text-align:left;border-bottom:1px solid #eeeae3;vertical-align:top}
.cmp tr:last-child td{border-bottom:0}
.cmp thead th{font-size:12.5px;letter-spacing:1.6px;text-transform:uppercase;color:#5B6B78;background:#faf8f4}
.cmp thead th.us{color:#06231f;background:linear-gradient(135deg,var(--teal),var(--mint))}
.cmp td:first-child{font-weight:800;color:var(--ink);width:24%}
.cmp td.them{color:#6b7a86}
.cmp td.us{color:var(--ink);font-weight:700;background:rgba(127,209,199,.10)}
.cmp td.us::before{content:"✓";color:var(--teal2);font-weight:800;margin-right:8px}
.cmp-cta{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:14px;margin-top:22px}
.cmp-cta p{color:#5B6B78;font-size:14.5px;max-width:620px}
/* ---------- v2: mobile sticky CTA ---------- */
.mbar{display:none}
@media (max-width:760px){
.mbar{display:flex;gap:10px;position:fixed;left:12px;right:12px;bottom:12px;z-index:70;padding:10px;border-radius:18px;background:rgba(11,24,38,.9);backdrop-filter:blur(14px);border:1px solid rgba(127,209,199,.25);box-shadow:0 20px 40px -10px rgba(0,0,0,.6);transform:translateY(140%);transition:transform .45s var(--ease)}
.mbar.on{transform:none}
.mbar a{flex:1;justify-content:center;padding:12px 10px;font-size:14px}
.fab{bottom:92px!important}
footer{padding-bottom:100px}
}
@media (max-width:980px){.qc{grid-template-columns:1fr}.qc-fig{max-width:520px;margin:0 auto}}
@media (max-width:640px){.cmp th,.cmp td{padding:13px 12px;font-size:13.5px}.cmp td:first-child{width:30%}.trust ul{justify-content:flex-start}}
/* STL Check feature */
.newpill{display:inline-flex;align-items:center;gap:10px;margin-bottom:16px;padding:6px 14px 6px 6px;border-radius:999px;background:rgba(127,209,199,.1);border:1px solid rgba(127,209,199,.35);color:var(--mint);font-size:13.5px;font-weight:700;opacity:0;animation:fade .9s .05s var(--ease) forwards;transition:background .25s,border-color .25s}
.newpill b{background:var(--teal);color:#06241f;border-radius:999px;padding:3px 9px;font-size:11px;letter-spacing:1px}
.newpill:hover{background:rgba(127,209,199,.18);border-color:var(--teal)}
#stlcheck{position:relative;padding:90px 0;overflow:hidden;background:radial-gradient(ellipse at 80% 30%,rgba(32,201,187,.16),transparent 55%),linear-gradient(180deg,#0b1826,#0f2033)}
#stlcheck .g{display:grid;grid-template-columns:1fr 1.15fr;gap:54px;align-items:center}
#stlcheck h2{font-size:clamp(32px,4.4vw,54px);line-height:1.04;letter-spacing:-1.4px;margin:14px 0 16px}
#stlcheck .lead2{color:#b6c7d3;font-size:17.5px;max-width:520px}
.sc-list{list-style:none;margin:22px 0 26px;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:10px 18px}
.sc-list li{display:flex;gap:10px;align-items:flex-start;font-size:15px;font-weight:600;color:#dce7ee}
.sc-list li::before{content:"";flex:none;width:18px;height:18px;margin-top:2px;border-radius:50%;background:var(--teal) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2306241f' stroke-width='3.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5 12l5 5 9-10'/%3E%3C/svg%3E") center/12px no-repeat}
.sc-badges{display:flex;flex-wrap:wrap;gap:8px;margin-top:18px}
.sc-badges span{font-size:12.5px;font-weight:700;color:var(--muted);border:1px solid var(--line);border-radius:999px;padding:6px 11px}
.sc-drop{position:relative;display:block;border-radius:26px;overflow:hidden;border:1px solid rgba(127,209,199,.35);box-shadow:0 40px 90px -40px rgba(32,201,187,.55);cursor:pointer;transition:transform .35s var(--ease),box-shadow .35s}
.sc-drop img{display:block;width:100%;height:auto;transition:filter .35s}
.sc-drop .ov{position:absolute;inset:0;display:flex;align-items:flex-end;justify-content:center;padding:18px;background:linear-gradient(180deg,rgba(11,24,38,0) 45%,rgba(11,24,38,.7));transition:background .3s}
.sc-drop .zone{display:flex;flex-direction:row;align-items:center;gap:14px;padding:14px 22px;text-align:left;border-radius:20px;border:2px dashed rgba(185,240,232,.75);background:rgba(11,24,38,.72);backdrop-filter:blur(6px);text-align:center;color:#fff;transition:.3s}
.sc-drop .zone b{font-size:19px}.sc-drop .zone small{color:#b6c7d3;font-size:13px}
.sc-drop:hover,.sc-drop.over{transform:translateY(-4px);box-shadow:0 50px 100px -40px rgba(32,201,187,.75)}
.sc-drop:hover .zone,.sc-drop.over .zone{border-color:var(--teal);background:rgba(11,24,38,.86)}
.sc-drop.over img{filter:blur(2px)}
@media (max-width:980px){#stlcheck .g{grid-template-columns:1fr;gap:34px}#stlcheck{padding:70px 0}}
@media (max-width:560px){.sc-list{grid-template-columns:1fr}.newpill{font-size:12.5px}}
/* ===== 2026 motion layer ===== */
.hero .stage{width:100%}
body::after{content:"";position:fixed;inset:0;pointer-events:none;z-index:90;opacity:.055;mix-blend-mode:overlay;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
.aurora{position:absolute;inset:-20%;z-index:0;pointer-events:none;background:conic-gradient(from var(--ar,0deg) at 60% 45%,rgba(32,201,187,.0),rgba(32,201,187,.22),rgba(27,58,102,.0),rgba(242,201,138,.14),rgba(32,201,187,.0));filter:blur(70px);animation:aur 22s linear infinite;opacity:.9}
@property --ar{syntax:'<angle>';inherits:false;initial-value:0deg}
@keyframes aur{to{--ar:360deg}}
.h3d{position:relative;aspect-ratio:1/1.02;border-radius:32px;overflow:hidden;background:radial-gradient(circle at 50% 38%,rgba(127,209,199,.18),rgba(15,32,51,.0) 60%),linear-gradient(160deg,rgba(18,50,74,.55),rgba(11,24,38,.25));border:1px solid rgba(127,209,199,.18);box-shadow:0 60px 120px -40px rgba(0,0,0,.75),inset 0 1px 0 rgba(255,255,255,.06)}
.h3d canvas{position:absolute;inset:0;width:100%;height:100%;display:block;cursor:grab}
.h3d .fallback{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .4s}
.h3d.nogl .fallback{opacity:1}
.h3d .hudl{position:absolute;left:16px;right:16px;bottom:14px;display:flex;justify-content:space-between;gap:8px;font:600 11.5px/1.3 ui-monospace,SFMono-Regular,Menlo,monospace;color:#9fd9d0;letter-spacing:.5px;pointer-events:none}
.h3d .hudl span{background:rgba(11,24,38,.62);border:1px solid rgba(127,209,199,.2);border-radius:8px;padding:6px 9px;backdrop-filter:blur(6px)}
.h3d .tag{position:absolute;top:14px;left:16px;font:800 11px/1 Manrope,sans-serif;letter-spacing:2px;color:#b9f0e8;background:rgba(127,209,199,.12);border:1px solid rgba(127,209,199,.3);border-radius:999px;padding:7px 11px;pointer-events:none}
.h3d .tag i{display:inline-block;width:7px;height:7px;border-radius:50%;background:#44e38f;margin-right:7px;box-shadow:0 0 10px #44e38f;animation:pulse 2s infinite}
.hero h1 .grad{background:linear-gradient(100deg,#7FD1C7 0%,#b9f0e8 25%,#f2c98a 50%,#7FD1C7 75%,#b9f0e8 100%);background-size:220% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:rise 1s var(--ease) forwards,shimmer 6s linear 1.2s infinite}
@keyframes shimmer{to{background-position:-220% 0}}
/* bento */
#tools{position:relative;padding:110px 0;background:linear-gradient(180deg,#0b1826,#0f2033)}
#tools .hd{display:flex;justify-content:space-between;align-items:end;gap:24px;flex-wrap:wrap;margin-bottom:34px}
#tools h2{font-size:clamp(34px,4.6vw,60px);line-height:1.02;letter-spacing:-1.8px;margin-top:12px;max-width:760px}
#tools .hd p{color:#b6c7d3;max-width:380px;font-size:16px}
.bento{display:grid;grid-template-columns:repeat(4,1fr);grid-auto-rows:220px;gap:16px}
.bx{--x:50%;--y:50%;position:relative;border-radius:26px;padding:24px;background:linear-gradient(180deg,rgba(255,255,255,.035),rgba(255,255,255,.01)),#0f2236;border:1px solid rgba(255,255,255,.07);overflow:hidden;isolation:isolate;display:flex;flex-direction:column;justify-content:flex-end;transition:transform .5s var(--ease),border-color .3s;color:inherit}
.bx::before{content:"";position:absolute;inset:0;z-index:-1;background:radial-gradient(420px circle at var(--x) var(--y),rgba(127,209,199,.16),transparent 45%);opacity:0;transition:opacity .3s}
.bx::after{content:"";position:absolute;inset:0;border-radius:inherit;padding:1px;background:radial-gradient(300px circle at var(--x) var(--y),rgba(127,209,199,.75),transparent 55%);-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s;pointer-events:none}
.bx:hover::before,.bx:hover::after{opacity:1}
.bx:hover{transform:translateY(-4px)}
.bx .k{font:800 11px/1 Manrope,sans-serif;letter-spacing:2px;text-transform:uppercase;color:var(--teal);margin-bottom:8px}
.bx h3{font-size:22px;letter-spacing:-.5px;line-height:1.15}
.bx p{color:#a9bccb;font-size:14px;margin-top:6px;max-width:420px}
.bx .go{margin-top:12px;font-weight:800;font-size:14px;color:#e9f1f5;display:inline-flex;gap:8px;align-items:center}
.bx .go::after{content:"→";transition:transform .3s var(--ease)}
.bx:hover .go::after{transform:translateX(5px)}
.bx.big{grid-column:span 2;grid-row:span 2}
.bx.wide{grid-column:span 2}
.bx .art{position:absolute;inset:0;z-index:-2}
.bx .art img{width:100%;height:100%;object-fit:cover;opacity:.75;transform:scale(1.04);transition:transform 1.2s var(--ease),opacity .4s}
.bx:hover .art img{transform:scale(1.1);opacity:.9}
.bx.wide .art img{object-position:30% 50%;opacity:.4}.bx.wide:hover .art img{opacity:.55}
.bx.big .art img{object-position:50% 40%}
.bx .art::after{content:"";position:absolute;inset:0;background:linear-gradient(180deg,rgba(11,24,38,0) 30%,rgba(11,24,38,.92) 85%)}
.bx .new{position:absolute;top:18px;left:18px;font:800 11px/1 Manrope,sans-serif;letter-spacing:1.5px;color:#06241f;background:var(--gold);border-radius:999px;padding:6px 10px}
.bx .ico{position:absolute;top:22px;right:22px;width:46px;height:46px;border-radius:14px;display:grid;place-items:center;background:rgba(127,209,199,.1);border:1px solid rgba(127,209,199,.25);transition:transform .6s var(--ease)}
.bx:hover .ico{transform:rotate(-8deg) scale(1.08)}
.bx .meter{position:absolute;top:24px;left:24px;right:84px;height:8px;border-radius:9px;background:rgba(255,255,255,.07);overflow:hidden}
.bx .meter i{display:block;height:100%;width:0;border-radius:9px;background:linear-gradient(90deg,#ff6b6b,#f5c451,#44e38f);transition:width 1.6s var(--ease)}
.bx.in .meter i{width:86%}
@media (max-width:980px){.bento{grid-template-columns:1fr 1fr;grid-auto-rows:200px}.bx.big{grid-column:span 2;grid-row:span 2}}
@media (max-width:600px){.bento{grid-template-columns:1fr;grid-auto-rows:auto}.bx{min-height:190px}.bx.big,.bx.wide{grid-column:auto;grid-row:auto}.bx.big{min-height:360px}#tools{padding:80px 0}}
/* magnetic + scramble */
.btn{will-change:transform}
.scr{font-variant-numeric:tabular-nums}
.marquee .track{transition:transform .2s linear}
</style>
</head>
<body>
<div id="progress"></div><div id="glow"></div>
<header id="hdr"><div class="wrap nav">
<a class="logo" href="#top" aria-label="BoundlessCAD home">
<svg width="34" height="34" viewBox="0 0 64 64" aria-hidden="true"><circle class="ring" cx="32" cy="32" r="27" fill="none" stroke="#7FD1C7" stroke-width="4" stroke-linecap="round" stroke-dasharray="118 52"/><path d="M24 22c-3 0-5 3-5 6 0 5 2 7 3 11 1 4 2 7 3.5 7s2.5-3 3.2-6.5c.6-1.8 1.4-2.5 3.3-2.5s2.7.7 3.3 2.5c.7 3.5 1.7 6.5 3.2 6.5S43 43 44 39c1-4 3-6 3-11 0-3-2-6-5-6-2.5 0-4 1.6-9 1.6S26.5 22 24 22z" fill="#fff"/></svg>
<span>Boundless<b>CAD</b></span></a>
<ul><li><a href="#pricing">Pricing</a></li><li><a href="plans/">Plans</a></li><li><a href="check/">Free STL Check</a></li><li><a href="margin/">Margin game</a></li><li><a href="#work">Our work</a></li><li id="nav3d" hidden><a href="cases/">3D cases</a></li><li class="xf"><a href="#faq">FAQ</a></li><li class="xg"><a href="guide/">Guide</a></li></ul>
<div class="navr"><a class="lang" href="es/" hreflang="es"><b>ES</b> Español</a><a class="btn" href="send/">Free first case <span class="arr">→</span></a></div>
</div></header>
<section class="hero" id="top">
<div class="aurora"></div><canvas id="net"></canvas>
<div class="blob a"></div><div class="blob b"></div><div class="blob c"></div>
<div class="wrap grid">
<div>
<a class="newpill" href="margin/"><b>NEW</b>Margin Master: how accurate is your margin line? →</a><br>
<div class="eyebrow" style="opacity:0;animation:fade .9s .1s var(--ease) forwards">Remote exocad design studio</div>
<h1><span class="line"><span>Production-ready</span></span><span class="line"><span>dental designs in</span></span><span class="line"><span class="grad">24–48 hours.</span></span></h1>
<p class="lead">Crowns, bridges, custom abutments, full-arch implant prostheses, night guards and surgical guides — designed in exocad for your material, your mill and your printer.</p>
<div class="ctas"><a class="btn" href="send/">Send your first case free <span class="arr">→</span></a><a class="btn ghost" href="#work">See our work</a></div>
<div class="stats">
<div class="stat"><b data-count="5" data-suffix="+">5+</b><span>years of production design</span></div>
<div class="stat"><b data-count="50" data-prefix="20–">20–50</b><span>units designed per day</span></div>
<div class="stat"><b data-count="48" data-prefix="24–" data-suffix="h">24–48h</b><span>standard turnaround</span></div>
</div>
</div>
<div class="stage">
<div class="orbit"><i></i></div><div class="orbit o2"><i></i></div>
<div class="h3d" id="tilt"><img class="fallback" src="img/case01_full.jpg" alt="Full-arch rehabilitation on eight implants per arch, designed in exocad"><canvas id="h3d" aria-label="Interactive 3D crown on a prepared tooth"></canvas><div class="tag"><i></i>LIVE 3D · DRAG TO ROTATE</div><div class="hudl"><span id="hudA">MARGIN · LOCKED</span><span id="hudB">STL IN · STL OUT</span></div></div>
<div class="badge b1"><b>First case</b>Designed free</div>
<div class="badge b2"><span class="dot"></span>Taking new cases</div>
</div>
</div>
<a href="#services" class="scrolldown" aria-label="Scroll down"></a>
</section>
<div class="marquee" id="services" aria-label="Services"><div class="track" id="track"></div></div>
<section id="stlcheck" aria-labelledby="sc-h"><div class="wrap g">
<div>
<div class="eyebrow rv">Free tool · only at BoundlessCAD</div>
<h2 id="sc-h" class="rv d1">Check your scan <span class="serif grad">before you send it.</span></h2>
<p class="lead2 rv d2">Drop any STL or PLY into STL Check. In seconds you see what will slow a design down, marked on a 3D model, with a score and a report you can send to the clinic.</p>
<ul class="sc-list rv d2"><li>Holes inside the scan</li><li>Broken (non-manifold) edges</li><li>Flipped triangles and normals</li><li>Loose scan debris</li><li>Wrong units (m, cm, inch)</li><li>Downloadable report card</li></ul>
<div class="ctas rv d3" style="opacity:1"><a class="btn" href="check/">Open STL Check <span class="arr">→</span></a><a class="btn ghost" href="check/?sample=1">Try a sample arch</a></div>
<div class="sc-badges rv d3"><span>Runs in your browser</span><span>Your file is never uploaded</span><span>No sign-up</span><span>Free</span></div>
</div>
<label class="sc-drop rv d2" id="scDrop">
<img src="img/stl-check.jpg" width="1136" height="640" loading="lazy" alt="STL Check showing a dental arch with two holes and a loose debris piece marked in 3D, and a score of 84 out of 100">
<span class="ov"><span class="zone"><svg width="40" height="40" viewBox="0 0 48 48" fill="none" stroke="#7FD1C7" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round"><path d="M24 31V9m0 0-8 8m8-8 8 8"/><path d="M8 29v7a4 4 0 0 0 4 4h24a4 4 0 0 0 4-4v-7"/></svg><span style="display:flex;flex-direction:column;gap:2px"><b>Drop your scan here</b><small>or click to choose · STL or PLY</small></span></span></span>
<input type="file" id="scFile" accept=".stl,.ply" hidden>
</label>
</div></section>
<section id="tools" aria-labelledby="tl-h"><div class="wrap">
<div class="hd"><div><div class="eyebrow rv">Free tools for labs</div><h2 id="tl-h" class="rv d1">Built by designers, <span class="serif grad">free for every lab.</span></h2></div><p class="rv d2">Small tools we made for our own workflow. No sign-up, nothing uploaded, use them as often as you like.</p></div>
<div class="bento">
<a class="bx big rv d1" href="margin/"><div class="art"><img src="img/margin.jpg" loading="lazy" alt="Margin Master: a premolar preparation with a traced margin line"></div><span class="new">NEW GAME</span><div class="k">Margin Master</div><h3>How accurate is your margin line?</h3><p>Trace the margin on three preps. We measure your line in microns. Share the score card and challenge your lab.</p><span class="go">Play now</span></a>
<a class="bx wide rv d2" href="check/"><div class="art"><img src="img/stl-check.jpg" loading="lazy" alt="STL Check marking holes and debris on a dental arch scan"></div><div class="k">STL Check</div><h3>Is your scan ready for design?</h3><p>Holes, broken edges, debris and wrong units, found in seconds.</p><span class="go">Check a scan</span></a>
<a class="bx rv d3" href="cases/"><div class="ico"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#7FD1C7" stroke-width="2"><path d="M12 2 3 7v10l9 5 9-5V7z"/><path d="m3 7 9 5 9-5M12 12v10"/></svg></div><div class="k">3D library</div><h3>Open our designs in 3D</h3><span class="go">Rotate a case</span></a>
<a class="bx rv d4" href="for/"><div class="meter"><i></i></div><div class="ico"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#7FD1C7" stroke-width="2"><rect x="4" y="3" width="16" height="18" rx="2"/><path d="M8 7h8M8 11h2M12 11h2M16 11h0M8 15h2M12 15h2M8 19h8"/></svg></div><div class="k">Calculator</div><h3>Hiring vs. outsourcing</h3><span class="go">See your numbers</span></a>
</div>
</div></section>
<div class="trust" aria-label="Standards"><div class="wrap"><ul><li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2 3 7v10l9 5 9-5V7z"/><path d="m3 7 9 5 9-5M12 12v10"/></svg>Designed in exocad DentalCAD</li><li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><path d="M14 2v6h6"/></svg>STL · PLY · OBJ · exocad projects</li><li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6"/></svg>Your parameters & libraries</li><li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="11" width="18" height="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>Case codes only, no patient names</li><li><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.8A9 9 0 1 1 11.2 3a7 7 0 0 0 9.8 9.8z"/></svg>Overnight option for crowns</li></ul></div></div>
<section id="how" class="light"><div class="wrap">
<div class="eyebrow rv">How we work</div>
<h2 class="rv d1">Send your scan. <span class="serif">Get a design you can mill.</span></h2>
<p class="sub rv d2">A workflow built for busy labs: no software to install, no staff to train, no minimum volume.</p>
<div class="steps" id="steps"><div class="rail"><i></i></div>
<div class="step rv d1"><div class="n">01</div><h3>Send your case</h3><p>Email your scans (STL / PLY or an exocad project) with the prescription, or share a download link.</p></div>
<div class="step rv d2"><div class="n">02</div><h3>We design in exocad</h3><p>Anatomy, contacts, occlusion and connectors — set to your material, cement gap and CAM setup.</p></div>
<div class="step rv d3"><div class="n">03</div><h3>You review</h3><p>Screenshots or an exocad webview file. Revisions are included until you approve.</p></div>
<div class="step rv d4"><div class="n">04</div><h3>Ready to produce</h3><p>Final STL plus the exocad project, ready for your mill, printer or milling centre.</p></div>
</div>
</div></section>
<section id="overnight" class="ovn"><div class="wrap">
<div class="eyebrow rv">Overnight design</div>
<h2 class="rv d1">Scan tonight. <span class="serif">Mill at 8 am.</span></h2>
<p class="sub rv d2">Our studio works while your lab sleeps. Send crowns or bridges in the evening and start the day with finished designs.</p>
<div class="tlh rv d3"><div class="stp"><div class="e">🌆</div><b>18:00</b><span>You send the scans</span></div><div class="ar">→</div><div class="stp"><div class="e">🦷</div><b>Overnight</b><span>We design in exocad</span></div><div class="ar">→</div><div class="stp"><div class="e">☀️</div><b>08:00</b><span>Design in your inbox</span></div></div>
<p class="fine rv">Your local time. Overnight service for crowns and bridges received by 18:00; full-arch and guide cases are scheduled per case. Standard turnaround 24–48 h.</p>
</div></section>
<section id="pricing"><div class="wrap">
<div class="eyebrow rv">Pricing</div>
<h2 class="rv d1">Simple, per-unit pricing. <span class="serif">No surprises.</span></h2>
<p class="sub rv d2">You pay only for what you send. Volume pricing for labs sending 100+ units a month.</p>
<div class="prices">
<div class="price rv d1"><div class="ic">◆</div><h3>Crowns & bridges</h3><p>Crowns, copings, inlays, onlays, veneers and bridge units.</p><div class="amt">$<span data-count="6.40" data-dec="2">6.40</span> <small>/ unit</small></div></div>
<div class="price rv d2"><div class="ic">⬡</div><h3>Implant work</h3><p>Implant crowns, screw-retained units and custom abutments.</p><div class="amt">$<span data-count="9.10" data-dec="2">9.10</span> <small>/ unit</small></div></div>
<div class="price rv d3"><div class="ic">◠</div><h3>Full-arch implant</h3><p>All-on-4 / All-on-6 prostheses and full-arch bridges.</p><div class="amt">$<span data-count="88">88</span> <small>/ arch</small></div></div>
<div class="price rv d1"><div class="ic">☾</div><h3>Night guards & splints</h3><p>Bite splints and night guards, ready to print or mill.</p><div class="amt">$<span data-count="12">12</span> <small>/ unit</small></div></div>
<div class="price rv d2"><div class="ic">⌖</div><h3>Surgical guides</h3><p>Tooth-supported and full-arch guides, quoted per case.</p><div class="amt"><small>from</small> $<span data-count="86.50" data-dec="2">86.50</span></div></div>
<div class="price hot rv d3"><div class="ribbon">OFFER</div><div class="ic">★</div><h3>Your first case</h3><p>Judge our margins and morphology on a real job before you commit.</p><div class="amt">Free</div></div>
</div>
<p class="note rv">Every case is handled under a case code — never a patient name.</p>
<div style="text-align:center"><a class="plink" href="plans/">Monthly Design Seat plans from $5.16 per unit →</a></div>
</div></section>
<section id="work" style="background:var(--bg2)"><div class="wrap">
<div class="eyebrow rv">Our work</div>
<h2 class="rv d1">Recent cases, <span class="serif">designed in exocad DentalCAD.</span></h2>
<p class="sub rv d2">A selection from our portfolio, shown without patient data. Tap any case to open the full case sheet.</p>
<div class="filters rv d3" id="filters"><button class="chip on" data-f="all">All</button><button class="chip" data-f="full">Full-arch implant</button><button class="chip" data-f="bridge">Bridges</button><button class="chip" data-f="single">Crowns & abutments</button></div>
<a class="b3d" id="b3d" href="cases/" hidden><span class="cube"><svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2 3 7v10l9 5 9-5V7z"/><path d="m3 7 9 5 9-5M12 12v10"/></svg></span><span><b>New: open our designs in 3D</b><small>Rotate, zoom and check margins, contacts and occlusion in your browser.</small></span><span class="go">Open 3D library →</span></a>
<div class="cases" id="cases"></div>
</div></section>
<section id="why" class="light"><div class="wrap">
<div class="eyebrow rv">Why labs work with us</div>
<h2 class="rv d1">Extra design capacity, <span class="serif">without hiring.</span></h2>
<div class="why">
<div class="item rv d1"><div class="big">$0</div><h3>First case free</h3><p>See our work on your own case before you decide anything.</p></div>
<div class="item rv d2"><div class="big">48h</div><h3>Fast turnaround</h3><p>Standard cases in 24–48 hours; complex full-arch work on agreement.</p></div>
<div class="item rv d3"><div class="big">∞</div><h3>Revisions included</h3><p>We adjust until you approve — and follow your own design parameters.</p></div>
<div class="item rv d4"><div class="big">100%</div><h3>White-label</h3><p>Anonymous case codes. Your clients never hear from us.</p></div>
</div>
</div></section>
<section id="quality"><div class="wrap">
<div class="eyebrow rv">Quality control</div>
<h2 class="rv d1">Every design is checked <span class="serif">before it reaches your mill.</span></h2>
<p class="sub rv d2">Our studio is led by a dentist. Every case goes through the same clinical checklist, so what looks right on screen also fits in the mouth.</p>
<div class="qc">
<div class="qc-fig rv d2"><svg viewBox="0 0 460 400" role="img" aria-label="Crown on a prepared tooth with six quality checkpoints">
<defs>
<linearGradient id="gCr" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#e9fbf7"/><stop offset="1" stop-color="#8fd6cb"/></linearGradient>
<linearGradient id="gDie" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#d9b98a"/><stop offset="1" stop-color="#9c7a4c"/></linearGradient>
<linearGradient id="gN" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#3c5a70"/><stop offset="1" stop-color="#23394b"/></linearGradient>
</defs>
<g opacity=".9">
<path d="M20 330 C 60 300, 90 300, 105 250 L 118 150 C 122 120 140 108 160 112 L 170 330 Z" fill="url(#gN)"/>
<path d="M440 330 C 400 300, 370 300, 355 250 L 342 150 C 338 120 320 108 300 112 L 290 330 Z" fill="url(#gN)"/>
</g>
<path d="M150 360 L 162 250 C 164 232 175 222 190 220 L 270 220 C 285 222 296 232 298 250 L 310 360 Z" fill="url(#gDie)"/>
<path d="M150 360 L 310 360" stroke="#7a5d37" stroke-width="2"/>
<path d="M146 262 C 140 205 142 150 158 118 C 170 96 186 92 200 104 C 210 114 220 114 230 104 C 240 94 250 94 260 104 C 270 114 280 112 290 102 C 304 90 318 100 318 124 C 324 160 322 210 314 262 C 300 270 285 272 262 270 L 198 270 C 175 272 158 270 146 262 Z" fill="url(#gCr)" stroke="#bff1ea" stroke-width="1.5"/>
<path d="M176 250 C 190 210 200 170 200 140 M 284 250 C 270 210 260 170 260 140" stroke="#6fbfb3" stroke-width="1.2" stroke-dasharray="4 5" fill="none" opacity=".8"/>
<path d="M150 262 C 170 274 290 274 310 262" stroke="#f2c98a" stroke-width="3" fill="none"/>
<path d="M198 60 C 215 78 245 78 262 60" stroke="#93a8b8" stroke-width="2" stroke-dasharray="3 5" fill="none"/>
<g class="pin" data-q="1"><line x1="310" y1="263" x2="385" y2="300" stroke="#f2c98a" stroke-width="1.5"/><circle cx="392" cy="304" r="14" fill="#f2c98a"/><text x="392" y="309" text-anchor="middle" font-size="14" font-weight="800" fill="#0b1826">1</text></g>
<g class="pin" data-q="2"><line x1="145" y1="175" x2="70" y2="150" stroke="#7FD1C7" stroke-width="1.5"/><circle cx="62" cy="147" r="14" fill="#7FD1C7"/><text x="62" y="152" text-anchor="middle" font-size="14" font-weight="800" fill="#0b1826">2</text></g>
<g class="pin" data-q="3"><line x1="230" y1="100" x2="230" y2="40" stroke="#7FD1C7" stroke-width="1.5"/><circle cx="230" cy="30" r="14" fill="#7FD1C7"/><text x="230" y="35" text-anchor="middle" font-size="14" font-weight="800" fill="#0b1826">3</text></g>
<g class="pin" data-q="4"><line x1="300" y1="180" x2="385" y2="150" stroke="#7FD1C7" stroke-width="1.5"/><circle cx="392" cy="147" r="14" fill="#7FD1C7"/><text x="392" y="152" text-anchor="middle" font-size="14" font-weight="800" fill="#0b1826">4</text></g>
<g class="pin" data-q="5"><line x1="160" y1="255" x2="72" y2="300" stroke="#7FD1C7" stroke-width="1.5"/><circle cx="64" cy="304" r="14" fill="#7FD1C7"/><text x="64" y="309" text-anchor="middle" font-size="14" font-weight="800" fill="#0b1826">5</text></g>
<g class="pin" data-q="6"><line x1="230" y1="300" x2="230" y2="385" stroke="#7FD1C7" stroke-width="1.5" stroke-dasharray="3 4"/><circle cx="230" cy="385" r="12" fill="#12263a" stroke="#7FD1C7" stroke-width="2"/><text x="230" y="390" text-anchor="middle" font-size="13" font-weight="800" fill="#7FD1C7">6</text></g>
</svg><div class="cap">Checkpoints on every crown and bridge</div></div>
<div class="rv d3"><ol class="qc-list" id="qcl"><li data-q="1"><div><b>Margin line</b><span>Continuous, following the preparation, with no over- or under-extension.</span></div></li><li data-q="2"><div><b>Proximal contacts</b><span>Tight enough to hold floss, loose enough to seat without adjustment.</span></div></li><li data-q="3"><div><b>Occlusion</b><span>Static and dynamic contacts checked against the antagonist.</span></div></li><li data-q="4"><div><b>Minimum thickness</b><span>Set to the minimum values for the material you mill.</span></div></li><li data-q="5"><div><b>Emergence profile</b><span>Natural, cleansable contours, especially on implant crowns.</span></div></li><li data-q="6"><div><b>Insertion path & connectors</b><span>One path without undercuts; connector sizes to the material.</span></div></li></ol><p class="qc-note">Something is not right? Revisions are included until you approve the design.</p></div>
</div>
</div></section>
<section id="compare" class="light"><div class="wrap">
<div class="eyebrow rv">The numbers behind it</div>
<h2 class="rv d1">Hiring a designer <span class="serif">vs. BoundlessCAD</span></h2>
<div class="cmp rv d2"><table><thead><tr><th></th><th>Hiring a designer</th><th class="us">BoundlessCAD</th></tr></thead><tbody>
<tr><td>Getting started</td><td class="them">Weeks of recruiting and training</td><td class="us">First case back in 24–48 h</td></tr><tr><td>Fixed costs</td><td class="them">Salary, exocad licence, workstation</td><td class="us">Pay per unit, or a monthly Design Seat</td></tr><tr><td>Busy weeks</td><td class="them">Overtime or late cases</td><td class="us">Capacity grows with your volume</td></tr><tr><td>Night hours</td><td class="them">Nobody designing</td><td class="us">Crowns sent by 18:00 are ready by 08:00</td></tr><tr><td>Holidays & sick days</td><td class="them">Work stops</td><td class="us">A team of designers keeps working</td></tr><tr><td>Bad scan files</td><td class="them">Found halfway through the design</td><td class="us">Free STL Check before you send</td></tr><tr><td>Risk to try</td><td class="them">An employment contract</td><td class="us">First case free</td></tr>
</tbody></table></div>
<div class="cmp-cta rv d3"><p>Want the numbers for your own lab? The calculator uses public salary data for your country, and you can change every value.</p><a class="btn" href="for/">Calculate your savings <span class="arr">→</span></a></div>
</div></section>
<section id="faq"><div class="wrap">
<div class="eyebrow rv">FAQ</div>
<h2 class="rv d1">Questions labs ask us</h2>
<div class="faq" id="faqs"></div>
</div></section>
<section id="contact" style="padding-top:20px"><div class="wrap">
<div class="cta rv">
<div><div class="eyebrow">Let's start</div><h2>Send us your next case. <span class="serif grad">The first one is on us.</span></h2><p style="color:#b6c7d3">Email the scans, the prescription and your material. We return the design within 24–48 hours — you only continue if you like the result.</p></div>
<div class="contact">
<a href="mailto:boundlesscad.design@gmail.com?subject=Free%20test%20case"><div class="ic"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="m3 7 9 6 9-6"/></svg></div><div><small>Email</small><span>boundlesscad.design@gmail.com</span></div></a>
<a href="https://wa.me/989124390969" target="_blank" rel="noopener"><div class="ic"><svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2a10 10 0 0 0-8.6 15.1L2 22l5-1.3A10 10 0 1 0 12 2zm0 18.2c-1.5 0-3-.4-4.3-1.2l-.3-.2-3 .8.8-2.9-.2-.3A8.2 8.2 0 1 1 12 20.2zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8-.2-.1-.4-.1-.6.1l-.8 1c-.1.2-.3.2-.5.1a6.7 6.7 0 0 1-3.3-2.9c-.2-.4.2-.4.7-1.3.1-.2 0-.3 0-.4l-.8-1.8c-.2-.5-.4-.4-.6-.4h-.5c-.2 0-.4.1-.6.3-.2.2-.8.8-.8 2s.8 2.3.9 2.5c.1.2 1.6 2.5 4 3.5 1.5.6 2.1.7 2.8.6.5-.1 1.5-.6 1.7-1.2.2-.6.2-1.1.2-1.2-.1-.1-.3-.2-.5-.3z"/></svg></div><div><small>WhatsApp</small><span>Message us directly</span></div></a>
</div>
</div>
</div>
<footer><div class="wrap"><span><a href="plans/" style="color:var(--teal)">Plans</a> · <a href="partner/" style="color:var(--teal)">For milling centres</a> · <a href="check/" style="color:var(--teal)">Free STL Check</a> · <a href="services/" style="color:var(--teal)">More services</a> · <a href="review/" style="color:var(--teal)">Free design review</a> · <a href="refer/" style="color:var(--teal)">Refer a lab</a> · © 2026 BoundlessCAD · Remote exocad design for dental labs and digital clinics</span><span><a href="guide/" style="color:var(--teal)">Guide: outsourcing exocad design</a> · exocad and DentalCAD are trademarks of exocad GmbH.</span></div></footer>
</section>
<a class="fab" href="https://wa.me/989124390969" target="_blank" rel="noopener" aria-label="WhatsApp"><svg width="28" height="28" viewBox="0 0 24 24" fill="#fff"><path d="M12 2a10 10 0 0 0-8.6 15.1L2 22l5-1.3A10 10 0 1 0 12 2zm4.5 12.1c-.2-.1-1.5-.7-1.7-.8-.2-.1-.4-.1-.6.1l-.8 1c-.1.2-.3.2-.5.1a6.7 6.7 0 0 1-3.3-2.9c-.2-.4.2-.4.7-1.3.1-.2 0-.3 0-.4l-.8-1.8c-.2-.5-.4-.4-.6-.4h-.5c-.2 0-.4.1-.6.3-.2.2-.8.8-.8 2s.8 2.3.9 2.5c.1.2 1.6 2.5 4 3.5 1.5.6 2.1.7 2.8.6.5-.1 1.5-.6 1.7-1.2.2-.6.2-1.1.2-1.2-.1-.1-.3-.2-.5-.3z"/></svg></a>
<div class="lb" id="lb" role="dialog" aria-modal="true"><button class="x" aria-label="Close">×</button><button class="nv prev" aria-label="Previous">‹</button><img id="lbimg" alt=""><button class="nv next" aria-label="Next">›</button></div>
<script>
const reduce=matchMedia('(prefers-reduced-motion: reduce)').matches;
/* marquee */
const svc=["Crowns","Bridges","Custom abutments","All-on-4 / All-on-6","Implant crowns","Inlays & onlays","Veneers","Night guards","Surgical guides","Screw-retained bridges"];
document.getElementById('track').innerHTML=[...svc,...svc].map(s=>`<span>${s}</span>`).join('');
/* cases */
const cases=[
["Full-arch rehabilitation on eight implants per arch","full","Dual-arch, 8 abutments per jaw, one set-up."],
["Full-arch implant prostheses on four implants","full","Aesthetics and occlusion in a single session."],
["Full-arch implant design from pre-op anatomy","full","Pre-op scans used for tooth position and lip support."],
["Full-mouth bridge rehabilitation","bridge","Maxillary full-arch bridge plus two mandibular bridges."],
["12-unit maxillary full-arch bridge","bridge","16–26 on six abutments, even contacts."],
["Anterior aesthetic restoration, 14–24","bridge","Proportions, incisal line and embrasures."],
["Full-arch prostheses on six implants per arch","full","Set-up, occlusion and screw channels planned together."],
["Dual-arch implant bridges, six abutments each","full","Smile line and vertical dimension settled first."],
["Full-arch rehabilitation, symmetric implant layout","full","Screw access kept palatal and lingual."],
["Mandibular full arch on four implants","full","Stable occlusal plane against the opposing scan."],
["Posterior implant bridges on abutments","single","Abutment interfaces and emergence designed with the bridges."],
["Single implant crown with custom abutment","single","Emergence profile supports the gingiva."],
["Segmented maxillary bridges, 15 to 25","bridge","Eleven units in three bridges that read as one smile."],
["Canine crown with cut-back for layering","single","Full contour plus a cut-back for ceramic layering."]];
const g=document.getElementById('cases');let visible=[];
cases.forEach((c,i)=>{const n=String(i+1).padStart(2,'0');const d=document.createElement('div');d.className='case rv';d.dataset.cat=c[1];d.dataset.i=i;
d.innerHTML=`<img loading="lazy" src="img/case${n}.jpg" alt="${c[0]}"><div class="ov"><div class="k">CASE ${n}</div><h4>${c[0]}</h4><div class="more">${c[2]}</div></div>`;
d.onclick=()=>openLb(i);g.appendChild(d)});
document.querySelectorAll('.chip').forEach(ch=>ch.onclick=()=>{document.querySelectorAll('.chip').forEach(x=>x.classList.remove('on'));ch.classList.add('on');const f=ch.dataset.f;
document.querySelectorAll('.case').forEach(el=>{const show=f==='all'||el.dataset.cat===f;el.classList.toggle('hide',!show);if(show){el.classList.remove('in');requestAnimationFrame(()=>requestAnimationFrame(()=>el.classList.add('in')))}})});
/* lightbox */
const lb=document.getElementById('lb'),lbimg=document.getElementById('lbimg');let cur=0;
function list(){return [...document.querySelectorAll('.case:not(.hide)')].map(e=>+e.dataset.i)}
function show(i){cur=i;lbimg.src=`img/case${String(i+1).padStart(2,'0')}_full.jpg`;lbimg.alt=cases[i][0]}
function openLb(i){show(i);lb.classList.add('on')}
function step(dir){const l=list();const p=l.indexOf(cur);show(l[(p+dir+l.length)%l.length])}
lb.querySelector('.x').onclick=()=>lb.classList.remove('on');
lb.querySelector('.prev').onclick=e=>{e.stopPropagation();step(-1)};
lb.querySelector('.next').onclick=e=>{e.stopPropagation();step(1)};
lb.onclick=e=>{if(e.target===lb)lb.classList.remove('on')};
addEventListener('keydown',e=>{if(!lb.classList.contains('on'))return;if(e.key==='Escape')lb.classList.remove('on');if(e.key==='ArrowRight')step(1);if(e.key==='ArrowLeft')step(-1)});
/* faq */
const faqs=[
["Which files do you need?","Intraoral or model scans as STL or PLY, or a complete exocad project, plus the prescription: tooth numbers, restoration type, material and shade. For implant cases, tell us the implant system and scan body."],
["What do we receive back?","Production-ready STL files and the exocad project, so your team can still adjust anything in-house."],
["How fast is the turnaround?","24–48 hours for standard crowns and bridges. Full-arch and guide cases are scheduled on agreement."],
["Do you follow our lab's design rules?","Yes. Send your parameters once — cement gap, minimum thickness, connector sizes, preferred libraries — and we apply them to every case."],
["How does payment work?","Your first case is free. After that we invoice per unit with prepayment, in USDT, USDC or BTC."],
["Can we check a scan before sending it?","Yes. Our free STL Check finds holes, broken edges, flipped triangles, loose debris and wrong units in any STL or PLY file. It runs in your browser, so the file is never uploaded: boundlesscaddesign-dev.github.io/check/"],
["Is patient data safe?","We only need anonymized files under a case code, never patient names, and all work is white-label."]];
document.getElementById('faqs').innerHTML=faqs.map((f,i)=>`<div class="qa rv d${(i%4)+1}"><button aria-expanded="false">${f[0]}</button><div class="a"><div><p>${f[1]}</p></div></div></div>`).join('');
document.querySelectorAll('.qa button').forEach(b=>b.onclick=()=>{const q=b.parentElement;const o=q.classList.toggle('open');b.setAttribute('aria-expanded',o)});
/* reveal + counters */
function countUp(el){const t=parseFloat(el.dataset.count),dec=+(el.dataset.dec||0),pre=el.dataset.prefix||'',suf=el.dataset.suffix||'';if(reduce){el.textContent=pre+t.toFixed(dec)+suf;return}
const s=performance.now(),D=1600;(function f(n){const p=Math.min((n-s)/D,1),e=1-Math.pow(1-p,4);el.textContent=pre+(t*e).toFixed(dec)+suf;if(p<1)requestAnimationFrame(f)})(s)}
const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');e.target.querySelectorAll('[data-count]').forEach(countUp);io.unobserve(e.target)}}),{threshold:.14,rootMargin:'0px 0px -40px 0px'});
document.querySelectorAll('.rv,#steps').forEach(el=>io.observe(el));
setTimeout(()=>document.querySelectorAll('.stats [data-count]').forEach(countUp),900);
/* header, progress, glow */
const hdr=document.getElementById('hdr'),pr=document.getElementById('progress'),glow=document.getElementById('glow');
addEventListener('scroll',()=>{const y=scrollY,h=document.documentElement.scrollHeight-innerHeight;hdr.classList.toggle('scrolled',y>30);pr.style.width=(y/h*100)+'%'},{passive:true});
addEventListener('pointermove',e=>{glow.style.left=e.clientX+'px';glow.style.top=e.clientY+'px'},{passive:true});
/* 3D tilt */
const tilt=document.getElementById('tilt');
if(false&&!reduce&&matchMedia('(hover:hover)').matches){tilt.addEventListener('pointermove',e=>{const r=tilt.getBoundingClientRect(),x=(e.clientX-r.left)/r.width,y=(e.clientY-r.top)/r.height;tilt.style.transform=`rotateY(${(x-.5)*16}deg) rotateX(${(.5-y)*14}deg) scale(1.02)`;tilt.style.setProperty('--mx',x*100+'%');tilt.style.setProperty('--my',y*100+'%')});tilt.addEventListener('pointerleave',()=>tilt.style.transform='')}
/* hero particle network */
(function(){const c=document.getElementById('net');if(reduce||!c)return;const x=c.getContext('2d');let W,H,P=[],m={x:-999,y:-999};const dpr=Math.min(devicePixelRatio||1,2);
function size(){W=c.offsetWidth;H=c.offsetHeight;c.width=W*dpr;c.height=H*dpr;x.setTransform(dpr,0,0,dpr,0,0);const n=Math.round(Math.min(90,W*H/16000));P=Array.from({length:n},()=>({x:Math.random()*W,y:Math.random()*H,vx:(Math.random()-.5)*.35,vy:(Math.random()-.5)*.35,r:Math.random()*1.6+.6}))}
size();addEventListener('resize',size);c.parentElement.addEventListener('pointermove',e=>{const r=c.getBoundingClientRect();m.x=e.clientX-r.left;m.y=e.clientY-r.top});c.parentElement.addEventListener('pointerleave',()=>{m.x=m.y=-999});
let vis=true;new IntersectionObserver(e=>vis=e[0].isIntersecting).observe(c);
(function loop(){requestAnimationFrame(loop);if(!vis)return;x.clearRect(0,0,W,H);
for(const p of P){p.x+=p.vx;p.y+=p.vy;if(p.x<0||p.x>W)p.vx*=-1;if(p.y<0||p.y>H)p.vy*=-1;const dx=p.x-m.x,dy=p.y-m.y,d=Math.hypot(dx,dy);if(d<120){p.x+=dx/d*.8;p.y+=dy/d*.8}
x.beginPath();x.arc(p.x,p.y,p.r,0,6.283);x.fillStyle='rgba(127,209,199,.7)';x.fill()}
for(let i=0;i<P.length;i++)for(let j=i+1;j<P.length;j++){const a=P[i],b=P[j],d=Math.hypot(a.x-b.x,a.y-b.y);if(d<130){x.strokeStyle=`rgba(127,209,199,${.16*(1-d/130)})`;x.lineWidth=1;x.beginPath();x.moveTo(a.x,a.y);x.lineTo(b.x,b.y);x.stroke()}}})()})();
</script>
<script>fetch('cases/cases.json',{cache:'no-cache'}).then(r=>r.json()).then(l=>{if(Array.isArray(l)&&l.length){document.getElementById('b3d').hidden=false;document.getElementById('nav3d').hidden=false}}).catch(()=>{})</script>
<div class="mbar" id="mbar"><a class="btn" href="send/">Free first case <span class="arr">→</span></a><a class="btn ghost" href="https://wa.me/989124390969" target="_blank" rel="noopener">WhatsApp</a></div>
<script>
(function(){var m=document.getElementById('mbar'),h=document.querySelector('.hero');if(!m||!h)return;function u(){m.classList.toggle('on',scrollY>h.offsetHeight*.7&&(innerHeight+scrollY)<document.body.scrollHeight-160)}addEventListener('scroll',u,{passive:true});u();
var L=document.querySelectorAll('#qcl li'),P=document.querySelectorAll('.qc-fig .pin');function hi(q){L.forEach(function(l){l.classList.toggle('on',l.dataset.q==q)});P.forEach(function(p){var c=p.querySelector('circle');c.setAttribute('r',p.dataset.q==q?(q==6?15:18):(p.dataset.q==6?12:14))})}
L.forEach(function(l){l.addEventListener('mouseenter',function(){hi(l.dataset.q)})});P.forEach(function(p){p.addEventListener('mouseenter',function(){hi(p.dataset.q)})});
var i=0,run=setInterval(function(){i=i%6+1;hi(i)},2200);document.getElementById('qcl').addEventListener('mouseenter',function(){clearInterval(run)});})();
</script>
<script>
(()=>{const d=document.getElementById('scDrop'),f=document.getElementById('scFile');if(!d)return;
const go=async file=>{if(!file)return;const z=d.querySelector('.zone b');z.textContent='Opening STL Check…';
try{const buf=await file.arrayBuffer();const db=await new Promise((res,rej)=>{const r=indexedDB.open('bcad-check',1);r.onupgradeneeded=()=>r.result.createObjectStore('f');r.onsuccess=()=>res(r.result);r.onerror=rej});
await new Promise((res,rej)=>{const t=db.transaction('f','readwrite');t.objectStore('f').put({name:file.name,buf},'file');t.oncomplete=res;t.onerror=rej});location.href='check/?home=1'}
catch(e){location.href='check/'}};
['dragenter','dragover'].forEach(e=>d.addEventListener(e,v=>{v.preventDefault();d.classList.add('over')}));
['dragleave','drop'].forEach(e=>d.addEventListener(e,v=>{v.preventDefault();d.classList.remove('over')}));
d.addEventListener('drop',v=>go(v.dataTransfer.files[0]));f.addEventListener('change',()=>go(f.files[0]));})();
</script>
<script>
(()=>{const reduce=matchMedia('(prefers-reduced-motion: reduce)').matches,fine=matchMedia('(hover:hover) and (pointer:fine)').matches;
/* spotlight cards */
document.querySelectorAll('.bx,.price,.item,.step').forEach(el=>el.addEventListener('pointermove',e=>{const r=el.getBoundingClientRect();el.style.setProperty('--x',(e.clientX-r.left)+'px');el.style.setProperty('--y',(e.clientY-r.top)+'px')}));
/* magnetic buttons */
if(fine&&!reduce)document.querySelectorAll('.btn').forEach(b=>{b.addEventListener('pointermove',e=>{const r=b.getBoundingClientRect();b.style.transform=`translate(${(e.clientX-r.left-r.width/2)*.18}px,${(e.clientY-r.top-r.height/2)*.28}px)`});b.addEventListener('pointerleave',()=>b.style.transform='')});
/* scramble eyebrows */
const CH='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789·/+';
function scr(el){const T=el.textContent;let f=0;const N=T.length;const id=setInterval(()=>{f++;el.textContent=T.split('').map((c,i)=>c===' '?' ':(i<f*1.4?c:CH[Math.random()*CH.length|0])).join('');if(f*1.4>=N){clearInterval(id);el.textContent=T}},28)}
if(!reduce){const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){scr(e.target);io.unobserve(e.target)}}),{threshold:.6});document.querySelectorAll('section .eyebrow').forEach(e=>io.observe(e));}
/* velocity marquee skew */
const tr=document.getElementById('track');let ly=scrollY,v=0;if(tr&&!reduce)(function f(){const y=scrollY;v+=((y-ly)-v)*.12;ly=y;tr.style.transform=`skewX(${Math.max(-12,Math.min(12,-v*.35))}deg)`;requestAnimationFrame(f)})();
/* bento reveal for meter */
const io2=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting)e.target.classList.add('in')}),{threshold:.3});document.querySelectorAll('.bx').forEach(e=>io2.observe(e));
})();
</script>
<script type="importmap">{"imports":{"three":"./cases/lib/three.module.min.js"}}</script>
<script type="module">
import * as THREE from 'three';
import {RoomEnvironment} from './cases/lib/RoomEnvironment.js';
const box=document.getElementById('tilt'),cv=document.getElementById('h3d');
const reduce=matchMedia('(prefers-reduced-motion: reduce)').matches;
let ren;try{ren=new THREE.WebGLRenderer({canvas:cv,antialias:true,alpha:true});}catch(e){box.classList.add('nogl');throw e;}
ren.setPixelRatio(Math.min(2,devicePixelRatio));ren.toneMapping=THREE.ACESFilmicToneMapping;ren.outputColorSpace=THREE.SRGBColorSpace;
const scene=new THREE.Scene();const pm=new THREE.PMREMGenerator(ren);scene.environment=pm.fromScene(new RoomEnvironment(),0.04).texture;
const cam=new THREE.PerspectiveCamera(30,1,0.1,200);cam.position.set(0,9,42);cam.lookAt(0,2.2,0);
const rim=new THREE.PointLight(0x7FD1C7,90,60);rim.position.set(-9,6,-6);scene.add(rim);
const gold=new THREE.PointLight(0xf2c98a,60,60);gold.position.set(10,-2,6);scene.add(gold);
scene.add(new THREE.DirectionalLight(0xffffff,.9).translateX(6).translateY(12).translateZ(10));
const TAU=Math.PI*2,NT=160;
const R=(t,a,b,n)=>{const c=Math.abs(Math.cos(t)),s=Math.abs(Math.sin(t));return 1/Math.pow(Math.pow(c/a,n)+Math.pow(s/b,n),1/n)};
const A=4.9,B=4.5,N=2.6;
function lathe(rows,col,opts={}){const NR=rows[0].length,pos=[],idx=[];for(let j=0;j<NT;j++){for(let i=0;i<NR;i++){const [x,y,z]=rows[j][i];pos.push(x,y,z)}}
for(let j=0;j<NT;j++){const jn=(j+1)%NT;for(let i=0;i<NR-1;i++){const a=j*NR+i,b=jn*NR+i,c=jn*NR+i+1,d=j*NR+i+1;idx.push(a,d,b,b,d,c)}}
const g=new THREE.BufferGeometry();g.setAttribute('position',new THREE.Float32BufferAttribute(pos,3));g.setIndex(idx);g.computeVertexNormals();return g}
/* prep die */
const prepRows=[];for(let j=0;j<NT;j++){const t=j/NT*TAU,c=Math.cos(t),s=Math.sin(t),r0=R(t,A,B,N),row=[];
const prof=[[r0*.86,-5],[r0*.93,-2.4],[r0,0],[r0-.25,.06],[r0-.6,.35],[r0-.75,.8],[r0-1.05,3.2],[r0-1.5,3.9],[r0-2.4,4.15],[0,4.3]];
for(const [r,y] of prof)row.push([r*c,y,r*s]);prepRows.push(row)}
const prep=new THREE.Mesh(lathe(prepRows),new THREE.MeshStandardMaterial({color:0xcaa77a,roughness:.55,metalness:.05}));
/* crown */
const cusp=(x,z)=>{const P=[[1.9,1.7],[-1.9,1.6],[1.8,-1.8],[-2,-1.7]];let h=0;for(const [a,b] of P)h+=1.05*Math.exp(-((x-a)**2+(z-b)**2)/2.6);h-=.55*Math.exp(-(x*x+z*z)/1.4);return h};
const crRows=[];const NS=26;for(let j=0;j<NT;j++){const t=j/NT*TAU,c=Math.cos(t),s=Math.sin(t),r0=R(t,A,B,N),row=[];
for(let i=0;i<NS;i++){const u=i/(NS-1);let r,y;
if(u<.55){const v=u/.55;r=r0*(1+.09*Math.sin(v*Math.PI*.95));y=v*4.6;}
else{const v=(u-.55)/.45;r=r0*(1+.09*Math.sin(Math.PI*.95))*(1-v)*Math.cos(v*.4);const x=r*c,z=r*s;y=4.6+.9*Math.sin(v*Math.PI/2)+cusp(x,z)*(.4+.6*v);}
row.push([r*c,y,r*s])}crRows.push(row)}
const crown=new THREE.Mesh(lathe(crRows),new THREE.MeshPhysicalMaterial({color:0xf3eee4,roughness:.28,clearcoat:1,clearcoatRoughness:.25,sheen:.4,sheenColor:new THREE.Color(0x7FD1C7)}));
const wire=new THREE.LineSegments(new THREE.WireframeGeometry(crown.geometry),new THREE.LineBasicMaterial({color:0x7FD1C7,transparent:true,opacity:0}));
const crownG=new THREE.Group();crownG.add(crown,wire);
/* margin ring */
const mp=[];for(let k=0;k<200;k++){const t=k/200*TAU,r0=R(t,A,B,N)+.03;mp.push(new THREE.Vector3(r0*Math.cos(t),.02,r0*Math.sin(t)))}
const ring=new THREE.Mesh(new THREE.TubeGeometry(new THREE.CatmullRomCurve3(mp,true),300,.07,8,true),new THREE.MeshBasicMaterial({color:0x7FD1C7,transparent:true,opacity:.9}));
const all=new THREE.Group();all.add(prep,crownG,ring);all.position.y=-2.4;scene.add(all);
/* particles */
const pg=new THREE.BufferGeometry(),pp=[];for(let i=0;i<260;i++){const r=9+Math.random()*7,a=Math.random()*TAU,y=(Math.random()-.5)*14;pp.push(Math.cos(a)*r,y,Math.sin(a)*r)}
pg.setAttribute('position',new THREE.Float32BufferAttribute(pp,3));const dots=new THREE.Points(pg,new THREE.PointsMaterial({color:0x7FD1C7,size:.07,transparent:true,opacity:.7}));scene.add(dots);
function size(){const w=cv.clientWidth,h=cv.clientHeight;if(!w)return;ren.setSize(w,h,false);cam.aspect=w/h;cam.updateProjectionMatrix()}new ResizeObserver(size).observe(cv);size();
let tx=0,ty=0,rx=0,ry=0,drag=null,spin=0;
box.addEventListener('pointermove',e=>{const r=box.getBoundingClientRect();tx=((e.clientX-r.left)/r.width-.5);ty=((e.clientY-r.top)/r.height-.5);if(drag){spin+=(e.clientX-drag)*.012;drag=e.clientX}});
box.addEventListener('pointerdown',e=>{drag=e.clientX;cv.style.cursor='grabbing'});addEventListener('pointerup',()=>{drag=null;cv.style.cursor='grab'});
box.addEventListener('pointerleave',()=>{tx=ty=0});
const hero=document.querySelector('.hero'),hA=document.getElementById('hudA'),hB=document.getElementById('hudB');let vis=true;new IntersectionObserver(e=>vis=e[0].isIntersecting).observe(box);
const clock=new THREE.Clock();let lastState=-1;
(function loop(){requestAnimationFrame(loop);if(!vis)return;const t=clock.getElapsedTime();
const p=Math.min(1,Math.max(0,scrollY/(hero.offsetHeight*.55)));
const cyc=reduce?0:(Math.sin(t*.55)*.5+.5);const lift=Math.max(p,cyc*.85);
crownG.position.y=lift*4.2;crownG.rotation.y=lift*.6;
wire.material.opacity=.35*lift;crown.material.opacity=1;
ring.material.opacity=.35+.65*lift;ring.scale.setScalar(1+.015*Math.sin(t*4));
rx+=(ty*.35-rx)*.06;ry+=(tx*.8-ry)*.06;
all.rotation.y=(reduce?0:t*.25)+spin+ry;all.rotation.x=.18+rx;
dots.rotation.y=-t*.03;
const st=lift>.5?1:0;if(st!==lastState){lastState=st;hA.textContent=st?'MARGIN · 360° TRACED':'MARGIN · LOCKED';hB.textContent=st?'DESIGN MODE · EXOCAD':'STL IN · STL OUT';}
ren.render(scene,cam)})();
</script>
</body>
</html>