Everything on board
--
- {capabilities.map(([label, value]) => (
-
- {label} -
- {value} -
diff --git a/.changeset/reviewed-cli-dependencies.md b/.changeset/reviewed-cli-dependencies.md deleted file mode 100644 index 6d1b092..0000000 --- a/.changeset/reviewed-cli-dependencies.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"create-expojet": patch ---- - -Pin the CLI's direct runtime dependencies to the versions already resolved in the reviewed workspace lockfile, instead of resolving the latest versions at installation time. This does not pin every transitive or generated-app dependency. diff --git a/.changeset/stack-aware-agent-skills.md b/.changeset/stack-aware-agent-skills.md deleted file mode 100644 index 919d0a9..0000000 --- a/.changeset/stack-aware-agent-skills.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"create-expojet": minor ---- - -Add optional stack-aware coding-agent skills installation after project creation -and through `expojet skills install`. Select individual applicable skills, coding -agents, and project/global scope; preview pinned sources, preserve existing edits, -and retry partial failures without changing the app manifest. diff --git a/apps/docs/public/flight/stars.svg b/apps/docs/public/flight/stars.svg deleted file mode 100644 index bb2428b..0000000 --- a/apps/docs/public/flight/stars.svg +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/apps/docs/src/app/(home)/home.css b/apps/docs/src/app/(home)/home.css index 4e6acb2..44cdc3c 100644 --- a/apps/docs/src/app/(home)/home.css +++ b/apps/docs/src/app/(home)/home.css @@ -1,609 +1,454 @@ -/* The landing page is one dark flight scene, so it keeps these colours in both themes. */ .site-home { - --expo-blue: #9baeff; - --home-bg: #0b0e1c; - --home-fg: #f7f3ec; - --home-muted: #c6cbd8; - --home-dim: #8d95aa; - --home-border: rgb(255 255 255 / 14%); - --home-panel: rgb(255 255 255 / 6%); - --scene-warm: #ffd9ae; - --scene-accent: #ff7a3d; + --expo-blue: #315efb; + --home-bg: #fafaf8; + --home-fg: #20221f; + --home-muted: #636760; + --home-border: #e0e2dc; + --home-panel: #f0f1ec; min-height: 100dvh; - background: #02030a; + background: var(--home-bg); color: var(--home-fg); } -.home-main { - font-family: var(--font-body), var(--font-sans), sans-serif; -} -.home-main :is(h1, h2, h3) { - font-family: var(--font-display), var(--font-sans), sans-serif; +.dark .site-home { + --expo-blue: #9baeff; + --home-bg: #131512; + --home-fg: #eef0e9; + --home-muted: #a5ada0; + --home-border: #34392f; + --home-panel: #1d211a; } .home-main { - position: relative; - z-index: 1; - padding: 0 clamp(16px, 7vw, 101px); -} -.site-home :is(a, button):focus-visible { - outline: 2px solid var(--expo-blue); - outline-offset: 4px; + max-width: 1280px; + margin: auto; + padding: 56px 48px 64px; } - -/* 01 Runway */ .home-hero { - display: flex; - min-height: calc(100svh - 60px); - flex-direction: column; + display: grid; + grid-template-columns: 1.15fr 1fr; + gap: 72px; align-items: center; - gap: 20px; - padding-top: clamp(32px, 9svh, 75px); - text-align: center; } -.home-hero h1 { +.home-hero-content h1 { margin: 0; - font-size: clamp(64px, min(15vw, 23svh), 216px); - font-weight: 800; - line-height: 0.88; - letter-spacing: -0.045em; + font-size: clamp(48px, 5.4vw, 76px); + font-weight: 650; + line-height: 1.05; + letter-spacing: -0.065em; } -.home-hero > p { - max-width: 21em; - margin: 0; - font-size: clamp(17px, 2.4svh, 21px); - line-height: 1.43; +.home-hero-content h1 span { + color: var(--expo-blue); } -.home-hero-accent { - display: block; - color: var(--scene-warm); +.home-hero-content > p { + max-width: 440px; + color: var(--home-muted); + font-size: 17px; + line-height: 1.7; + margin: 24px 0 30px; } - -/* Copyable commands */ .home-command { - width: min(560px, 100%); - border-radius: 12px; -} -.home-command-wide { - width: min(820px, 100%); + border: 1px solid var(--home-border); + border-radius: 10px; + background: var(--home-panel); } -:is(.home-command, .launch-command) .site-copy-command { +.home-command .site-copy-command { display: flex; gap: 12px; align-items: center; justify-content: space-between; width: 100%; - min-height: 58px; - padding: 8px 8px 8px 18px; + padding: 18px; cursor: pointer; text-align: left; } -:is(.home-command, .launch-command) code { - font: 15px / 1.5 var(--font-mono); - overflow-wrap: break-word; -} -.site-copy-word { - white-space: nowrap; -} -.home-command code::before { - content: "$"; - margin-right: 12px; - color: var(--scene-accent); +.home-command code { + font: 12px var(--font-mono); + overflow-wrap: anywhere; } -:is(.home-command, .launch-command) .site-copy-command > :last-child { +.home-command .site-copy-command > span { display: flex; - flex: none; align-items: center; gap: 6px; - padding: 10px 12px; - border-radius: 8px; - background: rgb(255 255 255 / 10%); - font: 500 11px var(--font-mono); - letter-spacing: 0.12em; - text-transform: uppercase; -} -:is(.home-command, .launch-command) .site-copy-command:hover > :last-child { - background: rgb(255 255 255 / 16%); + font-size: 12px; + color: var(--expo-blue); } - -/* Frosted glass: the scene stays visible but blurred enough to keep text readable. */ -.home-command, -.home-glass { - border: 1px solid var(--home-border); - background: - linear-gradient(160deg, rgb(255 255 255 / 10%), rgb(255 255 255 / 2%) 45%), rgb(8 10 22 / 55%); - box-shadow: - inset 0 1px 0 rgb(255 255 255 / 14%), - 0 24px 60px rgb(2 3 10 / 40%); - backdrop-filter: blur(20px) saturate(160%); +.home-actions { + display: flex; + align-items: center; + gap: 24px; + margin-top: 20px; } -@supports not (backdrop-filter: blur(1px)) { - .home-command, - .home-glass { - background: rgb(8 10 22 / 92%); - } +.home-actions a { + display: inline-flex; + align-items: center; + gap: 10px; + font-size: 14px; + font-weight: 600; } -@media (prefers-reduced-transparency: reduce) { - .home-command, - .home-glass { - background: rgb(8 10 22 / 92%); - backdrop-filter: none; - } +.home-primary { + padding: 14px 20px; + border-radius: 9px; + background: #315efb; + color: white; } - -/* 02 to 05: a left column that keeps the right half of the sky for the jet. */ -.home-stage { - display: flex; - width: min(620px, 100%); - min-height: 125svh; - flex-direction: column; - align-items: flex-start; - gap: 22px; - padding-top: 75px; +.home-primary:hover { + background: #2449ce; } -.home-stage[data-flight-stage="3"] { - min-height: 140svh; +.home-secondary { + color: var(--home-muted); } -.home-stage[data-flight-stage="4"] { - min-height: 100svh; +.site-home :is(a, button):focus-visible { + outline: 2px solid var(--expo-blue); + outline-offset: 4px; } -.home-eyebrow { - margin: 0; - font: 500 12px var(--font-mono); - letter-spacing: 0.14em; - text-transform: uppercase; +.stack-demo { + border: 1px solid var(--home-border); + border-radius: 16px; + padding: 28px; + background: var(--home-bg); + box-shadow: 0 20px 60px #00000006; } -.home-eyebrow-stage { - margin-right: 10px; - color: var(--scene-accent); +.demo-caption { + display: flex; + justify-content: space-between; + font-size: 12px; + font-weight: 650; + color: var(--home-muted); } -.home-stage h2 { - margin: 0; - font-size: clamp(40px, 4.2vw, 60px); - font-weight: 700; - line-height: 1.02; +.stack-demo h2 { + font-size: 21px; letter-spacing: -0.035em; + font-weight: 600; + margin: 24px 0 8px; } -.home-stage > p { - max-width: 556px; - margin: 0; +.stack-demo > p { color: var(--home-muted); - font-size: 17px; - line-height: 1.6; + font-size: 13px; } - -/* 02 Takeoff roll */ -.launch-board { - width: 100%; - border-radius: 18px; -} -.launch-switches { - display: grid; - gap: 16px; - padding: 24px; -} -.launch-row { +.demo-choices { display: flex; + gap: 8px; + margin: 20px 0 28px; min-inline-size: 0; - align-items: center; - gap: 12px; - margin: 0; padding: 0; border: 0; } -.launch-row legend, -.launch-caption { - color: var(--home-dim); - font: 500 11px var(--font-mono); - letter-spacing: 0.12em; - text-transform: uppercase; -} -.launch-row legend { - float: left; - flex: none; - width: 104px; +.demo-sr-only { + position: absolute; + width: 1px; + height: 1px; padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; } -.launch-row > div { - display: flex; - flex-wrap: wrap; - gap: 8px; -} -.launch-row button { - display: inline-flex; - min-height: 34px; - align-items: center; - gap: 8px; - padding: 0 12px; +.demo-choices button { + padding: 10px 14px; border: 1px solid var(--home-border); - border-radius: 9px; - background: rgb(255 255 255 / 4%); - color: var(--home-muted); + border-radius: 7px; cursor: pointer; - font-size: 14px; - font-weight: 500; -} -.launch-row button:hover:not(:disabled) { - color: var(--home-fg); + font-size: 12px; + min-height: 44px; } -.launch-row button[aria-pressed="true"] { - border-color: var(--scene-accent); - background: rgb(255 122 61 / 16%); - color: var(--home-fg); -} -.launch-row button[aria-pressed="true"]::before { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--scene-accent); - content: ""; +.demo-choices button[aria-pressed="true"] { + background: var(--home-panel); + border-color: var(--expo-blue); + color: var(--expo-blue); } -.launch-row button:disabled { - cursor: not-allowed; - opacity: 0.4; +.demo-output { + border-top: 1px solid var(--home-border); + padding-top: 20px; } -.launch-output { - display: grid; - gap: 14px; - padding: 20px 24px 24px; - border-top: 1px solid rgb(255 255 255 / 8%); -} -.launch-caption { +.demo-root { display: flex; - justify-content: space-between; - margin: 0; -} -.launch-caption span:last-child { - color: var(--scene-accent); + align-items: center; + gap: 8px; + margin: 22px 0 14px; + font: 14px var(--font-mono); } -.launch-command { - border: 1px solid rgb(255 255 255 / 8%); - border-radius: 10px; - background: rgb(0 0 0 / 45%); +.demo-root svg, +.demo-tree-row svg { + color: var(--expo-blue); + flex: 0 0 auto; } -.launch-command code { - font-size: 13.5px; +.demo-root-slash { + color: var(--expo-blue); } -.launch-note { +.demo-file-tree, +.demo-file-tree ul { margin: 0; - color: var(--home-dim); - font-size: 14px; - line-height: 1.5; + padding: 0; + list-style: none; } -.launch-note a { - color: var(--home-fg); - text-decoration: underline; - text-underline-offset: 3px; +.demo-file-tree { + border-left: 1px solid var(--home-border); } - -/* 03 Liftoff */ -.launch-terminal { - width: 100%; - overflow: hidden; - border-radius: 18px; +.demo-file-tree ul { + padding-left: 18px; } -.launch-terminal-bar { +.demo-file-tree li + li { + margin-top: 2px; +} +.demo-tree-row { display: flex; align-items: center; - gap: 8px; - padding: 13px 18px; - border-bottom: 1px solid rgb(255 255 255 / 8%); - color: var(--home-dim); - font: 11px var(--font-mono); - letter-spacing: 0.1em; -} -.launch-dot { - width: 10px; - height: 10px; - border-radius: 50%; - background: rgb(255 255 255 / 18%); + gap: 9px; + min-height: 34px; + padding: 5px 8px; + font-size: 11px; } -.launch-dot:last-of-type { - margin-right: 8px; +.demo-tree-row code { + font: 11px var(--font-mono); } -.launch-terminal pre { - margin: 0; - padding: 22px 24px 24px; +.demo-tree-row > span:last-child { + margin-left: auto; color: var(--home-muted); - font: 13.5px / 1.75 var(--font-mono); - white-space: pre-wrap; - overflow-wrap: anywhere; + text-align: right; } -.launch-prompt, -.launch-step, -.launch-ok { - color: var(--scene-accent); +.demo-tree-nested { + padding-left: 8px; +} +.demo-selected { + border-radius: 5px; + background: color-mix(in srgb, var(--expo-blue) 7%, transparent); } -.launch-dim { - color: var(--home-dim); +.demo-selected code { + color: var(--expo-blue); } -.launch-icon { - display: inline-block; - color: var(--scene-warm); - vertical-align: -2px; +.demo-file-tree > li:last-child { + margin-top: 2px; } -.launch-terminal strong { +.site-home .site-header { + background: var(--home-bg); color: var(--home-fg); - font-weight: 500; + border-color: var(--home-border); + padding-inline: max(24px, calc((100vw - 1184px) / 2)); } - -/* 04 Climb */ -.home-tiles { - display: grid; - width: 100%; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 16px; - align-items: start; +.site-home .site-header-links a, +.site-home .site-header-github { + color: var(--home-muted); } -.home-tiles > div { - display: grid; - gap: 16px; +.site-home .site-header-search { + width: 36px; + padding: 0; + justify-content: center; + background: transparent; + border-color: var(--home-border); + color: var(--home-muted); } -.home-tiles > div:last-child { - padding-top: 44px; +.site-home .site-header-search > span { + display: none; } -.home-tile { - display: grid; - align-content: start; - gap: 12px; - padding: 22px; - border-radius: 18px; +.site-home .site-theme-toggle { + --toggle-border: var(--home-border); + --toggle-background: var(--home-panel); + --toggle-color: var(--home-muted); + --toggle-active: var(--home-bg); + --toggle-active-color: var(--home-fg); } -.home-tile .home-eyebrow { - color: var(--scene-accent); - font-size: 11px; +.site-home .site-community { + margin-top: 90px; + border-top: 1px solid var(--home-border); + padding-top: 32px; } -.home-tile h3 { - margin: 0; - font-size: 21px; - font-weight: 700; - line-height: 1.15; - letter-spacing: -0.02em; +.site-home .site-community-heading h2 { + font-size: 28px; + font-weight: 600; } -.home-tile p { - margin: 0; +.community-context { + font-size: 12px; color: var(--home-muted); - font-size: 15px; - line-height: 1.5; -} -.home-capabilities { - display: grid; - gap: 6px; - margin: 0; -} -.home-capabilities div { - display: grid; - grid-template-columns: 62px minmax(0, 1fr); - gap: 12px; - line-height: 20px; + margin-top: 12px; } -.home-capabilities dt { - color: var(--home-dim); - font: 500 10.5px / 20px var(--font-mono); - letter-spacing: 0.1em; - text-transform: uppercase; -} -.home-capabilities dd { - margin: 0; - color: var(--home-muted); - font-size: 13.5px; +.site-home .site-metrics { + grid-template-columns: repeat(3, 1fr); + margin-block: 24px 0; + border: 1px solid var(--home-border); + border-radius: 12px 12px 0 0; + background: var(--home-bg); + overflow: hidden; } -.home-endpoints { - display: flex; - flex-wrap: wrap; +.site-home .site-metric { + min-height: 0; + padding: 14px 16px 12px; + flex-direction: column-reverse; + justify-content: flex-end; gap: 6px; - margin: 0; - padding: 0; - list-style: none; + border-radius: 0; } -.home-endpoints a { - display: block; - padding: 5px 8px; - border: 1px solid var(--home-border); - border-radius: 6px; - font: 12px var(--font-mono); +.site-home .site-metric + .site-metric { + border-left: 1px solid var(--home-border); } -.home-endpoints a:hover { - border-color: var(--home-muted); +.site-home .site-metric:hover { + background: var(--home-panel); } -.home-code { - margin: 0; - overflow-x: auto; - padding: 12px 14px; - border: 1px solid rgb(255 255 255 / 8%); - border-radius: 10px; - background: rgb(0 0 0 / 45%); - font: 12.5px / 20px var(--font-mono); +.site-home .site-metric strong { + font-size: 30px; + font-weight: 600; } - -/* 05 Orbit */ -.home-people { - display: grid; - gap: 12px; +.site-home .site-metric:hover strong { + color: var(--expo-blue); } -.home-people h3 { - margin: 0; - color: var(--home-dim); - font: 500 11px var(--font-mono); - letter-spacing: 0.12em; - text-transform: uppercase; +.site-home .site-metric-label { + color: var(--home-muted); + font-size: 12px; } -.home-people p { - margin: 0; +.site-home .site-metric-label svg { + display: inline-flex; + width: 14px; + height: 14px; color: var(--home-muted); - font-size: 15px; } -.home-people-link { - color: var(--home-fg); - text-decoration: underline; - text-underline-offset: 3px; +.site-home .metric-label-short { + display: none; } -.home-contributors { +.site-home .metric-value-short { + display: none; +} +.site-home .site-metric:hover .site-metric-label svg { + color: var(--expo-blue); +} +.site-home .community-activity { display: flex; - flex-wrap: wrap; + align-items: center; gap: 8px; margin: 0; - padding: 0; - list-style: none; -} -.home-contributors a { - display: block; - border-radius: 50%; - transition: transform 0.15s; -} -.home-contributors a:hover { - transform: translateY(-2px); -} -.home-contributors img { - display: block; border: 1px solid var(--home-border); + border-top: 0; + border-radius: 0 0 12px 12px; + padding: 10px 16px; + background: var(--home-panel); +} +.activity-dot { + flex: none; + width: 7px; + height: 7px; border-radius: 50%; + background: #22c55e; + box-shadow: 0 0 0 3px color-mix(in srgb, #22c55e 18%, transparent); + animation: activity-pulse 2.4s ease-in-out infinite; +} +@keyframes activity-pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.45; + } } @media (prefers-reduced-motion: reduce) { - .home-contributors a { - transition: none; + .activity-dot { + animation: none; } } -.home-crew, -.home-stats { - display: flex; - flex-wrap: wrap; - margin: 0; - padding: 0; - list-style: none; +.site-home .site-people { + margin-top: 28px; + padding-top: 24px; + border-top: 1px solid var(--home-border); } -.home-crew { - gap: 14px 28px; -} -.home-crew a { - display: flex; - align-items: center; - gap: 12px; - font-size: 17px; - font-weight: 500; -} -.home-crew img { - border: 1px solid var(--home-border); - border-radius: 50%; -} -.home-stats { - width: 100%; - gap: 16px 40px; - padding-block: 20px; - border-block: 1px solid rgb(255 255 255 / 8%); -} -.home-stats a { - display: grid; - gap: 6px; -} -.home-stat-value { - font: - 700 34px / 1 var(--font-display), - sans-serif; - letter-spacing: -0.03em; -} -.home-stat-label { - color: var(--home-dim); - font: 500 10.5px var(--font-mono); - letter-spacing: 0.12em; - text-transform: uppercase; -} -.home-stats a:hover .home-stat-value { - color: var(--scene-warm); -} -.home-release { - margin: 0; - color: var(--home-muted); - font-size: 15px; - line-height: 1.5; -} -.home-release a { - margin-right: 6px; - color: var(--home-fg); - font: 500 13px var(--font-mono); -} - -/* Go for launch */ -.home-close { - display: flex; - min-height: 100svh; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 24px; - padding-block: 96px; - text-align: center; -} -.home-close .home-eyebrow { - color: var(--scene-accent); -} -.home-close h2 { - margin: 0; - font-size: clamp(56px, 9.2vw, 132px); - font-weight: 800; - line-height: 0.9; - letter-spacing: -0.045em; -} -.home-close > p { - margin: 0; - color: var(--home-muted); - font-size: 17px; +.site-home .site-person-list, +.site-home .site-person-list a { + border: 0; } -.home-actions { +.site-home .site-person-list { display: flex; flex-wrap: wrap; - justify-content: center; - gap: 12px; -} -.home-actions a { - padding: 15px 22px; - border: 1px solid var(--home-border); - border-radius: 100px; - font-size: 15px; - font-weight: 500; - line-height: 16px; + gap: 8px 20px; } -.home-primary { - border-color: transparent; - background: var(--home-fg); - color: #02030a; +.site-home .site-person-list a { + font-size: 12px; } -.home-primary:hover { - background: white; +.site-home .site-person-list svg { + display: none; } -.home-secondary:hover { - border-color: var(--home-muted); +.site-home .site-avatar-list a { + box-shadow: none; } - @media (max-width: 850px) { - /* The page ends here, so leave room to scroll the buttons clear of the jet's band. */ - .home-close { - padding-bottom: 38svh; + .home-main { + padding: 48px 24px; + } + .home-hero { + grid-template-columns: 1fr; + gap: 40px; } - .home-tiles { - grid-template-columns: minmax(0, 1fr); + .home-hero-content { + max-width: 580px; } - .home-tiles > div:last-child { - padding-top: 0; + .site-home .site-community { + margin-top: 48px; } } @media (max-width: 650px) { - .home-command code, - .launch-command code { - font-size: 12px; + .stack-demo { + padding: 20px; + } + .site-home .site-metrics { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + .site-home .site-metric { + min-height: 0; + padding: 10px 8px 9px; + gap: 4px; + } + .site-home .site-metric:nth-child(n + 3) { + border-top: 0; } - .launch-switches { - padding: 18px; + .site-home .site-metric:last-child { + grid-column: auto; } - .launch-row { + .site-home .site-metric strong { + font-size: clamp(17px, 5.5vw, 22px); + letter-spacing: -0.04em; + white-space: nowrap; + } + .site-home .site-metric-label { + font-size: 10px; + gap: 5px; + } + .site-home .site-metric-label svg { + display: inline-flex; + width: 12px; + height: 12px; + } + .site-home .metric-label-full:has(+ .metric-label-short) { + display: none; + } + .site-home .metric-label-short { + display: inline; + } + .site-home .metric-value-full { + display: none; + } + .site-home .metric-value-short { + display: inline; + } + .site-home .site-person-list { flex-direction: column; - align-items: flex-start; - gap: 8px; + flex-wrap: nowrap; + gap: 0; + } + .site-home .site-person-list a { + flex-direction: row; + align-items: center; + gap: 12px; + padding: 10px 0; + border-bottom: 1px solid var(--home-border); + font-size: 13px; + text-align: left; + } + .site-home .site-person-list a:last-child { + border-bottom: 0; } - .launch-output { - padding: 18px; + .home-actions { + gap: 18px; } - .launch-terminal pre { - padding: 18px; - font-size: 12px; +} +@media (max-width: 340px) { + .site-home .site-metric-label svg { + display: none; } } @@ -616,9 +461,7 @@ align-items: center; gap: 22px; padding: 0 max(24px, calc((100vw - 1184px) / 2)); - border-bottom: 0; - background: linear-gradient(rgb(2 3 10 / 60%), rgb(2 3 10 / 0%)); - color: var(--home-fg); + border-bottom: 1px solid var(--home-border); } .site-home .site-header-brand, .site-home .site-header-links, @@ -660,6 +503,7 @@ } .site-home .site-header-search, .site-home .site-header-github, +.site-home .site-theme-toggle, .site-home .site-header-menu summary { border: 1px solid var(--home-border); background: var(--home-panel); @@ -698,12 +542,37 @@ border-color: transparent; background: transparent; } +.site-home .site-theme-toggle { + --toggle-border: var(--home-border); + --toggle-background: var(--home-panel); + --toggle-active: var(--home-bg); + --toggle-color: var(--home-muted); + --toggle-active-color: var(--home-fg); + display: inline-flex; + width: 62px; + height: 34px; + flex: none; + align-items: center; + gap: 1px; + padding: 2px; + border-radius: 18px; + cursor: pointer; +} +.site-home .site-theme-toggle-icon { + display: grid; + width: 27px; + height: 27px; + flex: none; + place-items: center; + border-radius: 50%; +} +.site-home .site-theme-toggle-icon[data-active="true"] { + background: var(--toggle-active); + color: var(--toggle-active-color); +} .site-home .site-header-menu { display: none; } -.site-home .site-menu-button { - color: var(--home-muted); -} .site-home :is(.site-header a, .site-header button, .site-header summary):focus-visible { outline: 2px solid var(--expo-blue); outline-offset: 3px; diff --git a/apps/docs/src/app/(home)/page.tsx b/apps/docs/src/app/(home)/page.tsx index 6998af3..105f4a8 100644 --- a/apps/docs/src/app/(home)/page.tsx +++ b/apps/docs/src/app/(home)/page.tsx @@ -1,190 +1,49 @@ -import { commandName } from "@expojet/brand"; -import { Bricolage_Grotesque, Geist } from "next/font/google"; +import { ArrowRight01Icon, ArrowUpRight01Icon } from "@hugeicons/core-free-icons"; +import { HugeiconsIcon } from "@hugeicons/react"; import Link from "next/link"; import { CopyCommand } from "@/components/copy-command"; -import { FlightScene } from "@/components/flight-scene"; -import { HomeCrew } from "@/components/home-crew"; -import { - LaunchCommand, - LaunchProvider, - LaunchRecord, - LaunchSwitchboard, - LaunchTerminal, -} from "@/components/home-launch"; +import { Community } from "@/components/site-community"; import { SiteHeader } from "@/components/site-header"; +import { StackDemo } from "@/components/stack-demo"; import { getCommunityData } from "@/lib/community"; -import "@/components/flight-scene.css"; +import "@/components/site-community.css"; import "./home.css"; -// The landing page's own type, from the Variant D design. Docs keep the site fonts. -const display = Bricolage_Grotesque({ - subsets: ["latin"], - variable: "--font-display", - display: "swap", -}); -const body = Geist({ subsets: ["latin"], variable: "--font-body", display: "swap" }); - -const capabilities = [ - ["Nav", "Expo Router, React Navigation"], - ["Auth", "Clerk, Supabase, Firebase, Better Auth"], - ["Style", "Uniwind, NativeWind, Unistyles, StyleSheet"], - ["Backend", "Hono, Express, NestJS, Convex"], - ["Data", "Neon, PostgreSQL, SQLite, Supabase"], - ["ORM", "Drizzle, Prisma"], -] as const; - -// Names printed by `doctor` for a freshly generated project. -const doctorChecks = [ - "Node.js", - "Expojet manifest", - "Expo SDK pack", - "Package manager lockfile", - "Mobile secret boundary", -]; - -function Eyebrow({ stage, children }: { stage?: string; children: string }) { - return ( -
- {stage ? {stage} : null} - {children} -
- ); -} - export default async function HomePage() { const community = await getCommunityData(); return ( -- Every great app has a launch day.{" "} - This is yours. + Generate an Expo app with your navigation, styling, auth, and backend already + connected.
- Flip the switches. The command below rewrites itself, and so does the rest of this - page. -
-- Your project is generated in a staging directory and committed only after validation - succeeds. A launch either completes or never leaves the runway. -
-- Everything you need is already on board. Your stack is on record, the checks are built - in, and your agent gets clean context. -
-- Point any coding agent at the docs. Plain text and Markdown, no proprietary - integration. -
-
-
- $ npx {commandName} doctor
- {doctorChecks.map((check) => (
-
- {"\n"}
- ✓
- {check}
-
- ))}
-
-
- A small crew. An open codebase. Room for your ideas.
-Name your mission and run it.
-