Everything on board
--
- {capabilities.map(([label, value]) => (
-
- {label} -
- {value} -
From a93bc12b06ffdeed7aa1023ea886592d80d665a3 Mon Sep 17 00:00:00 2001 From: Owusu1946 <59415541+Owusu1946@users.noreply.github.com> Date: Thu, 8 Oct 2026 10:28:45 +0000 Subject: [PATCH 1/5] chore(release): version public packages at 0.8.1 --- .changeset/stack-aware-agent-skills.md | 8 -------- packages/cli/CHANGELOG.md | 9 +++++++++ packages/cli/package.json | 2 +- packages/expojet/CHANGELOG.md | 7 +++++++ packages/expojet/package.json | 2 +- 5 files changed, 18 insertions(+), 10 deletions(-) delete mode 100644 .changeset/stack-aware-agent-skills.md 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/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 41a80b1..4ae4883 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # create-expojet +## 0.8.1 + +### Patch Changes + +- 7c084ed: 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. + ## 0.8.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index a379566..231e1a2 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "create-expojet", - "version": "0.8.0", + "version": "0.8.1", "description": "A production-ready Expo stack in one command.", "license": "MIT", "publishConfig": { diff --git a/packages/expojet/CHANGELOG.md b/packages/expojet/CHANGELOG.md index 61c53b2..1c2e7df 100644 --- a/packages/expojet/CHANGELOG.md +++ b/packages/expojet/CHANGELOG.md @@ -1,5 +1,12 @@ # expojet +## 0.8.1 + +### Patch Changes + +- Updated dependencies [7c084ed] + - create-expojet@0.8.1 + ## 0.8.0 ### Minor Changes diff --git a/packages/expojet/package.json b/packages/expojet/package.json index 549f5d9..1982d3e 100644 --- a/packages/expojet/package.json +++ b/packages/expojet/package.json @@ -1,6 +1,6 @@ { "name": "expojet", - "version": "0.8.0", + "version": "0.8.1", "description": "A production-ready Expo stack in one command.", "license": "MIT", "publishConfig": { From 84f5b6486e65ef429aa11d90cff992241b696157 Mon Sep 17 00:00:00 2001 From: Owusu1946 <59415541+Owusu1946@users.noreply.github.com> Date: Thu, 8 Oct 2026 10:28:47 +0000 Subject: [PATCH 2/5] docs(release): announce agent skills in v0.8.1 --- apps/docs/src/lib/releases.ts | 11 +++++++++++ packages/brand/src/index.ts | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/docs/src/lib/releases.ts b/apps/docs/src/lib/releases.ts index d7322dc..e95ce82 100644 --- a/apps/docs/src/lib/releases.ts +++ b/apps/docs/src/lib/releases.ts @@ -4,6 +4,17 @@ import { releaseVersion } from "@expojet/brand"; export const releases = [ { version: releaseVersion, + date: "October 8, 2026", + summary: "Optional, stack-aware agent skills for your coding tools.", + changes: [ + "Choose recommended skills or customize individual Expo and selected backend skills after setup; installation is optional and skipped by default.", + "Install skills later with expojet skills install, with coding-agent selection and project or global scope.", + "Preview pinned sources and destinations, preserve existing edits, and retry partial installations safely.", + "Record skill provenance separately without changing your app manifest or generated application files.", + ], + }, + { + version: "0.8.0", date: "October 2, 2026", summary: "Optional SDK 58 beta support and more reliable project generation.", changes: [ diff --git a/packages/brand/src/index.ts b/packages/brand/src/index.ts index e3487c9..1a60cb7 100644 --- a/packages/brand/src/index.ts +++ b/packages/brand/src/index.ts @@ -2,7 +2,7 @@ export const productName = "Expojet"; export const commandName = "expojet"; export const createPackageName = "create-expojet"; /** Current released CLI/template version shown in public product surfaces. */ -export const releaseVersion = "0.8.0"; +export const releaseVersion = "0.8.1"; export const manifestFileName = "expojet.jsonc"; export const skillsLockFileName = "expojet-skills.lock.json"; export const tagline = "A production-ready Expo stack in one command."; From 757965658f36f5d96661266deafe4f0b4b6c79a1 Mon Sep 17 00:00:00 2001 From: Owusu1946 <59415541+Owusu1946@users.noreply.github.com> Date: Thu, 8 Oct 2026 10:32:50 +0000 Subject: [PATCH 3/5] chore(release): refresh manifest version baselines for 0.8.1 --- architecture.baseline.json | 128 ++++++++++++++++++------------------- 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/architecture.baseline.json b/architecture.baseline.json index 88fbb4d..eb7f2e3 100644 --- a/architecture.baseline.json +++ b/architecture.baseline.json @@ -5,259 +5,259 @@ "results": { "default/standalone": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "default/monorepo": { "fileCount": 64, - "treeHash": "eb78a4a6b5e94bec" + "treeHash": "7bbd2b083b470594" }, "default/monorepo-web": { "fileCount": 74, - "treeHash": "6e441ebb6f7bc19b" + "treeHash": "054166ea93c5b627" }, "sdk/57": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "sdk/58": { "fileCount": 45, - "treeHash": "89c73ccc8df1677c" + "treeHash": "472365d84f770158" }, "nav/router-tabs": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "nav/router-drawer": { "fileCount": 45, - "treeHash": "0b470e44c15501c0" + "treeHash": "cf0c9bad31d993ac" }, "nav/router-both": { "fileCount": 47, - "treeHash": "6f9aef586ab81536" + "treeHash": "d41996d6b1d296bd" }, "nav/router-stack": { "fileCount": 45, - "treeHash": "93cfb44495e82472" + "treeHash": "62a4ef07d8666542" }, "nav/reactnav-tabs": { "fileCount": 45, - "treeHash": "e46dcfea068ff2b5" + "treeHash": "dc6ceb44eab9a369" }, "nav/reactnav-drawer": { "fileCount": 46, - "treeHash": "70f530542a8adde3" + "treeHash": "98f17f039ea75443" }, "nav/reactnav-both": { "fileCount": 47, - "treeHash": "666422921c5fd61f" + "treeHash": "46e1bee928109eed" }, "nav/reactnav-stack": { "fileCount": 46, - "treeHash": "072f79fd48699a93" + "treeHash": "bd6a718b9f65af17" }, "nav/reactnav-both-glass": { "fileCount": 47, - "treeHash": "666422921c5fd61f" + "treeHash": "46e1bee928109eed" }, "structure/monorepo-nav-both": { "fileCount": 66, - "treeHash": "1e5a70753f2a3ceb" + "treeHash": "3f751456151eb8a0" }, "structure/monorepo-web-nav-both": { "fileCount": 76, - "treeHash": "3889a45bbb44fce1" + "treeHash": "49a18b3dbad8c885" }, "style/uniwind": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "style/nativewind": { "fileCount": 46, - "treeHash": "b40c3ca2546ce67d" + "treeHash": "f73946be0fd08fb7" }, "style/unistyles": { "fileCount": 44, - "treeHash": "6645d19bae1dda6f" + "treeHash": "4d5fa29b3e7faefc" }, "style/stylesheet": { "fileCount": 44, - "treeHash": "7c4e6aa13d917812" + "treeHash": "2c5258711b5a453d" }, "style/uniwind-monorepo": { "fileCount": 64, - "treeHash": "eb78a4a6b5e94bec" + "treeHash": "7bbd2b083b470594" }, "style/nativewind-monorepo": { "fileCount": 65, - "treeHash": "6fe6626b0d5bcb2b" + "treeHash": "5c1632c09ddb9ccb" }, "style/unistyles-monorepo": { "fileCount": 63, - "treeHash": "b14a5d09b9608b1c" + "treeHash": "4599f1aeeaf51d5b" }, "style/stylesheet-monorepo": { "fileCount": 62, - "treeHash": "6a44fa9aec46b6bb" + "treeHash": "f5b44f9015834470" }, "icons/lucide": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "icons/hugeicons": { "fileCount": 45, - "treeHash": "8fb2202a6fd5f556" + "treeHash": "2e25cc3a748a4fda" }, "icons/expo": { "fileCount": 45, - "treeHash": "d7f85ece8e21fd5f" + "treeHash": "77340f5947d48243" }, "state/none": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "state/zustand": { "fileCount": 47, - "treeHash": "45bc6b4cadb7f115" + "treeHash": "d6e8cb070ce407ae" }, "state/mobx": { "fileCount": 48, - "treeHash": "1b5e884bff26d568" + "treeHash": "be75ea3e34327226" }, "analytics/none": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "analytics/posthog": { "fileCount": 48, - "treeHash": "bc52c6fa5124e4b8" + "treeHash": "cc0b97befacfc102" }, "analytics/aptabase": { "fileCount": 48, - "treeHash": "b572651302d23a06" + "treeHash": "e3ac0963d1ff39b0" }, "monitoring/none": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "monitoring/sentry": { "fileCount": 45, - "treeHash": "04fef45246e568ee" + "treeHash": "92faee9918e7575c" }, "backend/convex-standalone": { "fileCount": 49, - "treeHash": "4a8fa1681dfe7c6e" + "treeHash": "cdcceea4487d591e" }, "backend/convex-monorepo": { "fileCount": 59, - "treeHash": "37fc1c2ced9b2939" + "treeHash": "2757a46ecf60ae15" }, "backend/hono": { "fileCount": 64, - "treeHash": "eb78a4a6b5e94bec" + "treeHash": "7bbd2b083b470594" }, "backend/express": { "fileCount": 64, - "treeHash": "58065b1ea473b06c" + "treeHash": "887b01941bb2d417" }, "backend/nestjs": { "fileCount": 68, - "treeHash": "3dc987775a7718ef" + "treeHash": "c6c9e814aa6aee3a" }, "db/neon-drizzle": { "fileCount": 68, - "treeHash": "784915d941cf9169" + "treeHash": "83e112d91a487830" }, "db/postgres-drizzle": { "fileCount": 69, - "treeHash": "d51d9572974cffa5" + "treeHash": "bce1372f666119ec" }, "db/postgres-prisma": { "fileCount": 67, - "treeHash": "8aa1da18df16284a" + "treeHash": "dfde6b25550965ca" }, "db/sqlite-drizzle": { "fileCount": 68, - "treeHash": "35eb5db557fae6bf" + "treeHash": "df9fa90a0bfaa52f" }, "db/supabase-drizzle": { "fileCount": 68, - "treeHash": "a62088747f7839a4" + "treeHash": "163289993cf10d8c" }, "db/supabase-prisma": { "fileCount": 66, - "treeHash": "0a608b6ff8533fa4" + "treeHash": "738f7eef9400e0b5" }, "auth/clerk": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "auth/clerk-socials": { "fileCount": 47, - "treeHash": "17cb2a967a6a4c93" + "treeHash": "f6ee1156a65ba047" }, "auth/none": { "fileCount": 43, - "treeHash": "3a205113a9145cc6" + "treeHash": "dd968bee213ad70b" }, "auth/supabase": { "fileCount": 64, - "treeHash": "48a775ead3e42ff5" + "treeHash": "add69579736d33cd" }, "auth/firebase": { "fileCount": 45, - "treeHash": "99eb2a071b9261da" + "treeHash": "e10443e1a0b09c9b" }, "auth/better-auth": { "fileCount": 69, - "treeHash": "eda4518c124040f4" + "treeHash": "acc64971e345fb30" }, "pm/pnpm": { "fileCount": 45, - "treeHash": "40800d122abe5e42" + "treeHash": "47ae3aef2e1dd69e" }, "pm/npm": { "fileCount": 45, - "treeHash": "d6d93cbab87904f6" + "treeHash": "947117c9ef3c0ffe" }, "pm/bun": { "fileCount": 45, - "treeHash": "462840c3dad2547b" + "treeHash": "c9038da41fe4d314" }, "pm/yarn": { "fileCount": 45, - "treeHash": "14a4805da76de206" + "treeHash": "004063372bb7ddcb" }, "pm/yarn-sdk58": { "fileCount": 45, - "treeHash": "169ef0e5c11ecd9e" + "treeHash": "51f926d9c54e61db" }, "feature/eas-off": { "fileCount": 44, - "treeHash": "86971e52d973f4d4" + "treeHash": "6aa2758500aad410" }, "feature/dark-off": { "fileCount": 45, - "treeHash": "958b3b20c9168bcf" + "treeHash": "5a1b59cae3cacad7" }, "feature/haptics-off": { "fileCount": 45, - "treeHash": "b52ec7d65ec5fa57" + "treeHash": "4c44e38aa51b7d46" }, "feature/onboarding-off": { "fileCount": 45, - "treeHash": "06743bb0fdd5055c" + "treeHash": "b0816054cc91a995" }, "feature/glass-off": { "fileCount": 44, - "treeHash": "b5980f434991457b" + "treeHash": "76b5725f826780a9" }, "feature/all-off": { "fileCount": 43, - "treeHash": "7d1e6715edc8c0dc" + "treeHash": "7ddb8d74d371f7e0" }, "kitchen-sink/monorepo-web": { "fileCount": 87, - "treeHash": "8c1d6322c7a642d3" + "treeHash": "78c5189b3a65816d" } } } From ff1d291a0b065394f189aae0c1b00e8af08e65ad Mon Sep 17 00:00:00 2001 From: Owusu1946 <59415541+Owusu1946@users.noreply.github.com> Date: Thu, 8 Oct 2026 10:42:13 +0000 Subject: [PATCH 4/5] fix(docs): defer homepage overhaul from the 0.8.1 release --- apps/docs/public/flight/stars.svg | 8 - apps/docs/src/app/(home)/home.css | 855 +++++++++------------ apps/docs/src/app/(home)/page.tsx | 189 +---- apps/docs/src/components/copy-command.tsx | 17 +- apps/docs/src/components/flight-jet.tsx | 85 -- apps/docs/src/components/flight-scene.css | 300 -------- apps/docs/src/components/flight-scene.tsx | 267 ------- apps/docs/src/components/home-crew.tsx | 91 --- apps/docs/src/components/home-launch.tsx | 229 ------ apps/docs/src/components/site-header.tsx | 3 +- apps/docs/src/components/site-menu.tsx | 5 +- apps/docs/src/hooks/use-flight-progress.ts | 84 -- 12 files changed, 390 insertions(+), 1743 deletions(-) delete mode 100644 apps/docs/public/flight/stars.svg delete mode 100644 apps/docs/src/components/flight-jet.tsx delete mode 100644 apps/docs/src/components/flight-scene.css delete mode 100644 apps/docs/src/components/flight-scene.tsx delete mode 100644 apps/docs/src/components/home-crew.tsx delete mode 100644 apps/docs/src/components/home-launch.tsx delete mode 100644 apps/docs/src/hooks/use-flight-progress.ts 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.
-