|
3 | 3 | import ThemeToggle from '$lib/components/ThemeToggle.svelte'; |
4 | 4 | import { auth } from '$lib/stores/auth'; |
5 | 5 |
|
6 | | - interface PublicConfig { |
7 | | - id: string; |
8 | | - name: string; |
9 | | - slug: string; |
10 | | - base_preset: string; |
11 | | - username: string; |
12 | | - avatar_url: string | null; |
13 | | - install_count: number; |
14 | | - cliCount: number; |
15 | | - appsCount: number; |
16 | | - npmCount: number; |
17 | | - totalCount: number; |
18 | | - } |
19 | | -
|
20 | | - let { data }: { data: { publicConfigs: PublicConfig[] } } = $props(); |
21 | | -
|
22 | 6 | let copied = $state(''); |
23 | 7 | let starCount = $state(0); |
24 | 8 |
|
|
128 | 112 | <span class="terminal-title">openboot</span> |
129 | 113 | <div class="terminal-dots-spacer"></div> |
130 | 114 | </div> |
131 | | - <img src="/demo.svg" alt="OpenBoot demo — installing dev tools in one command" class="demo-svg" loading="eager" /> |
| 115 | + <img src="/demo.gif" alt="OpenBoot demo — installing dev tools in one command" class="demo-svg" loading="eager" /> |
132 | 116 | </div> |
133 | 117 | </div> |
134 | 118 | </div> |
|
203 | 187 | </div> |
204 | 188 | </section> |
205 | 189 |
|
206 | | - {#if data.publicConfigs && data.publicConfigs.length > 0} |
207 | | - <section class="explore-section"> |
208 | | - <div class="section-header"> |
209 | | - <h2 class="section-title">Explore Configs</h2> |
210 | | - <p class="section-subtitle">See what others are building with</p> |
211 | | - </div> |
212 | | - <div class="explore-grid"> |
213 | | - {#each data.publicConfigs as config} |
214 | | - <a href="/{config.username}/{config.slug}" class="explore-card"> |
215 | | - <div class="explore-card-header"> |
216 | | - {#if config.avatar_url} |
217 | | - <img src={config.avatar_url} alt={config.username} class="explore-avatar" /> |
218 | | - {:else} |
219 | | - <div class="explore-avatar-placeholder">{config.username.charAt(0).toUpperCase()}</div> |
220 | | - {/if} |
221 | | - <div class="explore-user-info"> |
222 | | - <span class="explore-username">@{config.username}</span> |
223 | | - <span class="explore-preset-badge">{config.base_preset}</span> |
224 | | - </div> |
225 | | - </div> |
226 | | - <h3 class="explore-config-name">{config.name}</h3> |
227 | | - <div class="explore-stats"> |
228 | | - {#if config.cliCount > 0} |
229 | | - <span class="explore-stat"> |
230 | | - <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
231 | | - <polyline points="4 17 10 11 4 5"></polyline> |
232 | | - <line x1="12" y1="19" x2="20" y2="19"></line> |
233 | | - </svg> |
234 | | - {config.cliCount} |
235 | | - </span> |
236 | | - {/if} |
237 | | - {#if config.appsCount > 0} |
238 | | - <span class="explore-stat"> |
239 | | - <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
240 | | - <rect x="2" y="3" width="20" height="14" rx="2" ry="2"></rect> |
241 | | - <line x1="8" y1="21" x2="16" y2="21"></line> |
242 | | - <line x1="12" y1="17" x2="12" y2="21"></line> |
243 | | - </svg> |
244 | | - {config.appsCount} |
245 | | - </span> |
246 | | - {/if} |
247 | | - {#if config.npmCount > 0} |
248 | | - <span class="explore-stat"> |
249 | | - <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
250 | | - <line x1="16.5" y1="9.4" x2="7.5" y2="4.21"></line> |
251 | | - <path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path> |
252 | | - <polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline> |
253 | | - <line x1="12" y1="22.08" x2="12" y2="12"></line> |
254 | | - </svg> |
255 | | - {config.npmCount} |
256 | | - </span> |
257 | | - {/if} |
258 | | - <span class="explore-stat-installs"> |
259 | | - <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"> |
260 | | - <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path> |
261 | | - <polyline points="7 10 12 15 17 10"></polyline> |
262 | | - <line x1="12" y1="15" x2="12" y2="3"></line> |
263 | | - </svg> |
264 | | - {config.install_count} |
265 | | - </span> |
266 | | - </div> |
267 | | - <div class="explore-view-link"> |
268 | | - View → |
269 | | - </div> |
270 | | - </a> |
271 | | - {/each} |
272 | | - </div> |
273 | | - <div class="explore-cta"> |
274 | | - <a href="/login?return_to=/dashboard" class="explore-cta-button"> |
275 | | - <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> |
276 | | - <path d="M12 20h9"/><path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"/> |
277 | | - </svg> |
278 | | - Create your own setup |
279 | | - </a> |
280 | | - </div> |
281 | | - </section> |
282 | | - {/if} |
283 | 190 |
|
284 | 191 | </div> |
285 | 192 | </main> |
|
565 | 472 | max-width: 520px; |
566 | 473 | border-radius: 12px; |
567 | 474 | overflow: hidden; |
568 | | - background: #1a1b26; |
| 475 | + background: #1e1e2e; |
569 | 476 | box-shadow: |
570 | 477 | 0 0 0 1px rgba(255, 255, 255, 0.06), |
571 | 478 | 0 8px 40px rgba(0, 0, 0, 0.5), |
|
577 | 484 | align-items: center; |
578 | 485 | justify-content: space-between; |
579 | 486 | padding: 12px 16px; |
580 | | - background: #1a1b26; |
| 487 | + background: #1e1e2e; |
581 | 488 | } |
582 | 489 |
|
583 | 490 | .terminal-dots { |
|
609 | 516 | .demo-svg { |
610 | 517 | width: 100%; |
611 | 518 | display: block; |
612 | | - background: #1a1b26; |
| 519 | + background: #1e1e2e; |
613 | 520 | } |
614 | 521 |
|
615 | 522 | /* ── Hero Actions (Dual CTA Cards) ──────────────── */ |
|
800 | 707 | font-size: 0.78rem; |
801 | 708 | } |
802 | 709 |
|
803 | | - /* ── Explore Section ─────────────────────────────── */ |
804 | | -
|
805 | | - .explore-section { |
806 | | - margin-top: 80px; |
807 | | - margin-bottom: 40px; |
808 | | - } |
809 | | -
|
810 | | - .explore-grid { |
811 | | - display: grid; |
812 | | - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); |
813 | | - gap: 20px; |
814 | | - margin-bottom: 32px; |
815 | | - } |
816 | | -
|
817 | | - .explore-card { |
818 | | - background: var(--bg-secondary); |
819 | | - border: 1px solid var(--border); |
820 | | - border-radius: 16px; |
821 | | - padding: 20px; |
822 | | - text-decoration: none; |
823 | | - transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
824 | | - display: flex; |
825 | | - flex-direction: column; |
826 | | - gap: 14px; |
827 | | - } |
828 | | -
|
829 | | - .explore-card:hover { |
830 | | - border-color: var(--accent); |
831 | | - transform: translateY(-4px); |
832 | | - box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2); |
833 | | - } |
834 | | -
|
835 | | - .explore-card-header { |
836 | | - display: flex; |
837 | | - align-items: center; |
838 | | - gap: 10px; |
839 | | - } |
840 | | -
|
841 | | - .explore-avatar { |
842 | | - width: 32px; |
843 | | - height: 32px; |
844 | | - border-radius: 50%; |
845 | | - border: 2px solid var(--border); |
846 | | - object-fit: cover; |
847 | | - } |
848 | | -
|
849 | | - .explore-avatar-placeholder { |
850 | | - width: 32px; |
851 | | - height: 32px; |
852 | | - border-radius: 50%; |
853 | | - border: 2px solid var(--border); |
854 | | - background: var(--accent); |
855 | | - color: #000; |
856 | | - display: flex; |
857 | | - align-items: center; |
858 | | - justify-content: center; |
859 | | - font-weight: 700; |
860 | | - font-size: 0.9rem; |
861 | | - } |
862 | | -
|
863 | | - .explore-user-info { |
864 | | - display: flex; |
865 | | - flex-direction: column; |
866 | | - gap: 2px; |
867 | | - flex: 1; |
868 | | - } |
869 | | -
|
870 | | - .explore-username { |
871 | | - font-size: 0.85rem; |
872 | | - color: var(--text-secondary); |
873 | | - font-weight: 500; |
874 | | - } |
875 | | -
|
876 | | - .explore-preset-badge { |
877 | | - font-family: 'JetBrains Mono', monospace; |
878 | | - font-size: 0.7rem; |
879 | | - color: var(--accent); |
880 | | - text-transform: uppercase; |
881 | | - letter-spacing: 0.05em; |
882 | | - } |
883 | | -
|
884 | | - .explore-config-name { |
885 | | - font-size: 1.1rem; |
886 | | - font-weight: 700; |
887 | | - color: var(--text-primary); |
888 | | - margin: 0; |
889 | | - line-height: 1.3; |
890 | | - } |
891 | | -
|
892 | | - .explore-stats { |
893 | | - display: flex; |
894 | | - align-items: center; |
895 | | - gap: 12px; |
896 | | - flex-wrap: wrap; |
897 | | - } |
898 | | -
|
899 | | - .explore-stat { |
900 | | - display: flex; |
901 | | - align-items: center; |
902 | | - gap: 4px; |
903 | | - font-size: 0.8rem; |
904 | | - color: var(--text-secondary); |
905 | | - font-family: 'JetBrains Mono', monospace; |
906 | | - } |
907 | | -
|
908 | | - .explore-stat svg { |
909 | | - color: var(--accent); |
910 | | - } |
911 | | -
|
912 | | - .explore-stat-installs { |
913 | | - display: flex; |
914 | | - align-items: center; |
915 | | - gap: 4px; |
916 | | - font-size: 0.8rem; |
917 | | - color: var(--text-muted); |
918 | | - font-family: 'JetBrains Mono', monospace; |
919 | | - margin-left: auto; |
920 | | - } |
921 | | -
|
922 | | - .explore-stat-installs svg { |
923 | | - color: var(--text-muted); |
924 | | - } |
925 | | -
|
926 | | - .explore-view-link { |
927 | | - font-size: 0.85rem; |
928 | | - color: var(--accent); |
929 | | - font-weight: 500; |
930 | | - margin-top: auto; |
931 | | - padding-top: 8px; |
932 | | - border-top: 1px solid var(--border); |
933 | | - } |
934 | | -
|
935 | | - .explore-cta { |
936 | | - text-align: center; |
937 | | - } |
938 | | -
|
939 | | - .explore-cta-button { |
940 | | - display: inline-flex; |
941 | | - align-items: center; |
942 | | - gap: 10px; |
943 | | - padding: 14px 32px; |
944 | | - background: var(--accent); |
945 | | - color: #000; |
946 | | - border: none; |
947 | | - border-radius: 10px; |
948 | | - font-size: 1rem; |
949 | | - font-weight: 600; |
950 | | - text-decoration: none; |
951 | | - cursor: pointer; |
952 | | - transition: all 0.2s; |
953 | | - } |
954 | | -
|
955 | | - .explore-cta-button:hover { |
956 | | - background: var(--accent-hover); |
957 | | - transform: translateY(-2px); |
958 | | - box-shadow: 0 8px 24px rgba(34, 197, 94, 0.3); |
959 | | - } |
960 | | -
|
961 | 710 | /* ── Responsive ───────────────────────────────────── */ |
962 | 711 |
|
963 | 712 | @media (max-width: 960px) { |
|
1041 | 790 | gap: 4px; |
1042 | 791 | } |
1043 | 792 |
|
1044 | | - .explore-grid { |
1045 | | - grid-template-columns: 1fr; |
1046 | | - } |
1047 | 793 | } |
1048 | 794 | </style> |
0 commit comments