|
95 | 95 | </button> |
96 | 96 | </div> |
97 | 97 |
|
98 | | - <div class="cta-buttons"> |
99 | | - {#if $auth.loading} |
100 | | - <span class="btn-outlined btn-placeholder">...</span> |
101 | | - {:else if $auth.user} |
102 | | - <a href="/dashboard" class="btn-outlined"> |
103 | | - <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
104 | | - <rect x="3" y="3" width="7" height="7" /><rect x="14" y="3" width="7" height="7" /> |
105 | | - <rect x="14" y="14" width="7" height="7" /><rect x="3" y="14" width="7" height="7" /> |
106 | | - </svg> |
107 | | - Dashboard |
108 | | - </a> |
109 | | - {:else} |
110 | | - <a href="/api/auth/login" class="btn-outlined"> |
111 | | - <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> |
112 | | - <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" /> |
113 | | - </svg> |
114 | | - Sign in |
115 | | - </a> |
116 | | - {/if} |
117 | | - <a href="/docs" class="btn-outlined"> |
| 98 | + <div class="cta-buttons"> |
| 99 | + {#if $auth.user} |
| 100 | + <a href="/dashboard" class="btn-outlined"> |
118 | 101 | <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
119 | | - <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/> |
| 102 | + <rect x="3" y="3" width="7" height="7" /><rect x="14" y="3" width="7" height="7" /> |
| 103 | + <rect x="14" y="14" width="7" height="7" /><rect x="3" y="14" width="7" height="7" /> |
120 | 104 | </svg> |
121 | | - Docs |
122 | | - </a> |
123 | | - <a href="https://github.com/openbootdotdev/openboot" class="btn-outlined" target="_blank" rel="noopener"> |
124 | | - <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> |
125 | | - <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" /> |
126 | | - </svg> |
127 | | - View on GitHub |
128 | | - {#if starCount > 0} |
129 | | - <span class="star-badge">{starCount}</span> |
130 | | - {/if} |
| 105 | + Dashboard |
131 | 106 | </a> |
132 | | - </div> |
| 107 | + {/if} |
| 108 | + <a href="/docs" class="btn-outlined"> |
| 109 | + <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
| 110 | + <path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/><polyline points="10 9 9 9 8 9"/> |
| 111 | + </svg> |
| 112 | + Docs |
| 113 | + </a> |
| 114 | + <a href="https://github.com/openbootdotdev/openboot" class="btn-outlined" target="_blank" rel="noopener"> |
| 115 | + <svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"> |
| 116 | + <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" /> |
| 117 | + </svg> |
| 118 | + GitHub |
| 119 | + {#if starCount > 0} |
| 120 | + <span class="star-badge">{starCount}</span> |
| 121 | + {/if} |
| 122 | + </a> |
| 123 | + </div> |
133 | 124 |
|
134 | 125 | <p class="privacy-note">No analytics. No telemetry. Your data stays on your machine.</p> |
135 | 126 | </div> |
136 | 127 |
|
137 | | - <div class="hero-right"> |
138 | | - <div class="terminal-window"> |
139 | | - <div class="terminal-titlebar"> |
140 | | - <div class="terminal-dots"> |
141 | | - <span class="dot dot-red"></span> |
142 | | - <span class="dot dot-yellow"></span> |
143 | | - <span class="dot dot-green"></span> |
144 | | - </div> |
145 | | - <span class="terminal-title">openboot</span> |
146 | | - <div class="terminal-dots-spacer"></div> |
147 | | - </div> |
148 | | - <div class="terminal-body"><pre class="terminal-content"><span class="t-accent"> ⚡ OpenBoot</span> <span class="t-muted">— Developer Environment Setup</span> |
149 | | - |
150 | | - <span class="t-border">┌─</span> <span class="t-label">Formulae</span> <span class="t-border">─────────────────────────────────┐</span> |
151 | | - <span class="t-border">│</span> <span class="t-check">✓</span> <span class="t-text">ripgrep</span> <span class="t-check">✓</span> <span class="t-text">fd</span> <span class="t-check">✓</span> <span class="t-text">bat</span> <span class="t-border">│</span> |
152 | | - <span class="t-border">│</span> <span class="t-check">✓</span> <span class="t-text">fzf</span> <span class="t-check">✓</span> <span class="t-text">lazygit</span> <span class="t-check">✓</span> <span class="t-text">gh</span> <span class="t-border">│</span> |
153 | | - <span class="t-border">│</span> <span class="t-check">✓</span> <span class="t-text">jq</span> <span class="t-check">✓</span> <span class="t-text">htop</span> <span class="t-check">✓</span> <span class="t-text">tmux</span> <span class="t-border">│</span> |
154 | | - <span class="t-border">└────────────────────────────────────────────┘</span> |
155 | | - |
156 | | - <span class="t-border">┌─</span> <span class="t-label">Casks</span> <span class="t-border">────────────────────────────────────┐</span> |
157 | | - <span class="t-border">│</span> <span class="t-unchecked">◻</span> <span class="t-text">VS Code</span> <span class="t-check">✓</span> <span class="t-text">Chrome</span> <span class="t-check">✓</span> <span class="t-text">OrbStack</span> <span class="t-border">│</span> |
158 | | - <span class="t-border">│</span> <span class="t-check">✓</span> <span class="t-text">Warp</span> <span class="t-check">✓</span> <span class="t-text">Raycast</span> <span class="t-unchecked">◻</span> <span class="t-text">Figma</span> <span class="t-border">│</span> |
159 | | - <span class="t-border">└────────────────────────────────────────────┘</span> |
160 | | - |
161 | | - <span class="t-help">← → tab · space toggle · enter confirm</span></pre> |
| 128 | + <div class="hero-right"> |
| 129 | + <div class="demo-window"> |
| 130 | + <div class="demo-titlebar"> |
| 131 | + <div class="terminal-dots"> |
| 132 | + <span class="dot dot-red"></span> |
| 133 | + <span class="dot dot-yellow"></span> |
| 134 | + <span class="dot dot-green"></span> |
162 | 135 | </div> |
| 136 | + <span class="terminal-title">openboot</span> |
| 137 | + <div class="terminal-dots-spacer"></div> |
163 | 138 | </div> |
| 139 | + <img src="/demo.svg" alt="OpenBoot demo — installing dev tools in one command" class="demo-svg" loading="eager" /> |
| 140 | + </div> |
| 141 | + </div> |
| 142 | + </div> |
| 143 | + </section> |
| 144 | + |
| 145 | + <section class="how-it-works"> |
| 146 | + <div class="section-header"> |
| 147 | + <h2 class="section-title">How It Works</h2> |
| 148 | + <p class="section-subtitle">From zero to coding in 4 steps</p> |
| 149 | + </div> |
| 150 | + <div class="steps-grid"> |
| 151 | + <div class="step"> |
| 152 | + <div class="step-number">1</div> |
| 153 | + <h3>Run one command</h3> |
| 154 | + <p>Paste the curl command in Terminal. OpenBoot downloads and launches automatically.</p> |
| 155 | + </div> |
| 156 | + <div class="step"> |
| 157 | + <div class="step-number">2</div> |
| 158 | + <h3>Pick your tools</h3> |
| 159 | + <p>Choose a preset or use the interactive TUI to toggle exactly what you want.</p> |
| 160 | + </div> |
| 161 | + <div class="step"> |
| 162 | + <div class="step-number">3</div> |
| 163 | + <h3>Grab a coffee</h3> |
| 164 | + <p>OpenBoot installs Homebrew, CLI tools, apps, dotfiles, and configures macOS for you.</p> |
| 165 | + </div> |
| 166 | + <div class="step"> |
| 167 | + <div class="step-number">4</div> |
| 168 | + <h3>Start building</h3> |
| 169 | + <p>Your dev environment is ready. Share your config with teammates so they can do the same.</p> |
164 | 170 | </div> |
165 | 171 | </div> |
166 | 172 | </section> |
|
205 | 211 | <section class="beyond-section"> |
206 | 212 | <div class="section-header"> |
207 | 213 | <h2 class="section-title">For Teams & Power Users</h2> |
208 | | - <p class="section-subtitle">Snapshot your existing setup or build a custom config for your entire team</p> |
| 214 | + <p class="section-subtitle">Go beyond presets</p> |
209 | 215 | </div> |
210 | 216 |
|
211 | 217 | <div class="beyond-grid"> |
|
215 | 221 | <p class="beyond-card-desc"> |
216 | 222 | Scan your existing machine -- Homebrew packages, macOS preferences, shell & git config, and dev tools -- then upload it as a shareable configuration. |
217 | 223 | </p> |
218 | | - <p class="beyond-card-hint">Perfect for team leads who want to share their proven setup as a baseline.</p> |
219 | | - <div class="snapshot-detects"> |
220 | | - <span class="detect-tag">Homebrew formulae & casks</span> |
221 | | - <span class="detect-tag">macOS preferences</span> |
222 | | - <span class="detect-tag">Shell config</span> |
223 | | - <span class="detect-tag">Git config</span> |
224 | | - <span class="detect-tag">Dev tools</span> |
225 | | - </div> |
226 | | - <div class="beyond-command"> |
| 224 | + <div class="beyond-command"> |
227 | 225 | <div class="beyond-command-prompt">$</div> |
228 | 226 | <code>curl -fsSL openboot.dev/install.sh | bash -s -- snapshot</code> |
229 | 227 | <button class="copy-btn" onclick={() => copyCommand('curl -fsSL https://openboot.dev/install.sh | bash -s -- snapshot', 'snapshot')}> |
|
511 | 509 | background: var(--bg-tertiary); |
512 | 510 | } |
513 | 511 |
|
514 | | - .btn-placeholder { |
515 | | - cursor: default; |
516 | | - opacity: 0.5; |
517 | | - } |
518 | | -
|
519 | 512 | .star-badge { |
520 | 513 | display: inline-flex; |
521 | 514 | align-items: center; |
|
542 | 535 | opacity: 0.7; |
543 | 536 | } |
544 | 537 |
|
545 | | - /* ── Terminal Mockup ──────────────────────────────── */ |
| 538 | + /* ── Demo Window ─────────────────────────────────── */ |
546 | 539 |
|
547 | 540 | .hero-right { |
548 | 541 | display: flex; |
549 | 542 | justify-content: center; |
550 | 543 | align-items: center; |
551 | 544 | } |
552 | 545 |
|
553 | | - .terminal-window { |
| 546 | + .demo-window { |
554 | 547 | width: 100%; |
555 | 548 | max-width: 520px; |
556 | 549 | border-radius: 12px; |
|
562 | 555 | 0 0 60px rgba(34, 197, 94, 0.06); |
563 | 556 | } |
564 | 557 |
|
565 | | - .terminal-titlebar { |
| 558 | + .demo-titlebar { |
566 | 559 | display: flex; |
567 | 560 | align-items: center; |
568 | 561 | justify-content: space-between; |
|
597 | 590 | width: 52px; |
598 | 591 | } |
599 | 592 |
|
600 | | - .terminal-body { |
601 | | - padding: 20px; |
602 | | - overflow-x: auto; |
| 593 | + .demo-svg { |
| 594 | + width: 100%; |
| 595 | + display: block; |
| 596 | + } |
| 597 | +
|
| 598 | + /* ── How It Works ────────────────────────────────── */ |
| 599 | +
|
| 600 | + .how-it-works { |
| 601 | + margin-bottom: 80px; |
| 602 | + } |
| 603 | +
|
| 604 | + .steps-grid { |
| 605 | + display: grid; |
| 606 | + grid-template-columns: repeat(4, 1fr); |
| 607 | + gap: 24px; |
| 608 | + } |
| 609 | +
|
| 610 | + .step { |
| 611 | + text-align: center; |
| 612 | + padding: 28px 20px; |
| 613 | + background: var(--bg-secondary); |
| 614 | + border: 1px solid var(--border); |
| 615 | + border-radius: 16px; |
| 616 | + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| 617 | + } |
| 618 | +
|
| 619 | + .step:hover { |
| 620 | + border-color: var(--border-hover); |
| 621 | + transform: translateY(-4px); |
| 622 | + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15); |
603 | 623 | } |
604 | 624 |
|
605 | | - .terminal-content { |
| 625 | + .step-number { |
| 626 | + width: 36px; |
| 627 | + height: 36px; |
| 628 | + border-radius: 50%; |
| 629 | + background: var(--accent); |
| 630 | + color: #000; |
606 | 631 | font-family: 'JetBrains Mono', monospace; |
607 | | - font-size: 0.72rem; |
608 | | - line-height: 1.65; |
609 | | - margin: 0; |
610 | | - white-space: pre; |
611 | | - color: #c0caf5; |
| 632 | + font-weight: 700; |
| 633 | + font-size: 0.9rem; |
| 634 | + display: flex; |
| 635 | + align-items: center; |
| 636 | + justify-content: center; |
| 637 | + margin: 0 auto 16px; |
| 638 | + } |
| 639 | +
|
| 640 | + .step h3 { |
| 641 | + font-size: 1rem; |
| 642 | + font-weight: 600; |
| 643 | + margin-bottom: 8px; |
| 644 | + letter-spacing: -0.01em; |
612 | 645 | } |
613 | 646 |
|
614 | | - /* Terminal text colors — always dark theme */ |
615 | | - .t-accent { color: #22c55e; font-weight: 700; } |
616 | | - .t-muted { color: #565f89; } |
617 | | - .t-border { color: #3b3f52; } |
618 | | - .t-label { color: #7aa2f7; font-weight: 600; } |
619 | | - .t-check { color: #22c55e; } |
620 | | - .t-unchecked { color: #565f89; } |
621 | | - .t-text { color: #c0caf5; } |
622 | | - .t-help { color: #565f89; font-size: 0.68rem; } |
| 647 | + .step p { |
| 648 | + color: var(--text-secondary); |
| 649 | + font-size: 0.85rem; |
| 650 | + line-height: 1.5; |
| 651 | + margin: 0; |
| 652 | + } |
623 | 653 |
|
624 | 654 | /* ── Presets Section ──────────────────────────────── */ |
625 | 655 |
|
|
854 | 884 | margin: 0; |
855 | 885 | } |
856 | 886 |
|
857 | | - .beyond-card-hint { |
858 | | - color: var(--text-muted); |
859 | | - font-size: 0.8rem; |
860 | | - font-style: italic; |
861 | | - margin: 0; |
862 | | - } |
863 | | -
|
864 | | - .snapshot-detects { |
865 | | - display: flex; |
866 | | - flex-wrap: wrap; |
867 | | - gap: 6px; |
868 | | - margin-top: 4px; |
869 | | - } |
870 | | -
|
871 | | - .detect-tag { |
872 | | - font-family: 'JetBrains Mono', monospace; |
873 | | - font-size: 0.68rem; |
874 | | - padding: 4px 10px; |
875 | | - background: var(--bg-tertiary); |
876 | | - border: 1px solid var(--border); |
877 | | - border-radius: 20px; |
878 | | - color: var(--text-secondary); |
879 | | - transition: border-color 0.2s; |
880 | | - } |
881 | | -
|
882 | | - .beyond-card:hover .detect-tag { |
883 | | - border-color: var(--border-hover); |
884 | | - } |
885 | | -
|
886 | 887 | .beyond-command { |
887 | 888 | background: var(--code-bg); |
888 | 889 | border: 1px solid var(--border); |
|
1009 | 1010 | order: -1; |
1010 | 1011 | } |
1011 | 1012 |
|
1012 | | - .terminal-window { |
| 1013 | + .demo-window { |
1013 | 1014 | max-width: 480px; |
1014 | 1015 | } |
1015 | 1016 |
|
| 1017 | + .steps-grid { |
| 1018 | + grid-template-columns: repeat(2, 1fr); |
| 1019 | + } |
| 1020 | +
|
1016 | 1021 | .hero h1 { |
1017 | 1022 | font-size: 2.2rem; |
1018 | 1023 | } |
|
1065 | 1070 | font-size: 0.7rem; |
1066 | 1071 | } |
1067 | 1072 |
|
1068 | | - .terminal-window { |
| 1073 | + .demo-window { |
1069 | 1074 | max-width: 100%; |
1070 | 1075 | } |
1071 | 1076 |
|
1072 | | - .terminal-content { |
1073 | | - font-size: 0.6rem; |
| 1077 | + .steps-grid { |
| 1078 | + grid-template-columns: 1fr; |
1074 | 1079 | } |
1075 | 1080 |
|
1076 | 1081 | .install-command code { |
|
0 commit comments