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 @@ - -Stars - - - - - - 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 ( -
- +
- -
-
-

Launch.

+
+
+
+

+ Your stack. +
+ Ready to build. +

- Every great app has a launch day.{" "} - This is yours. + Generate an Expo app with your navigation, styling, auth, and backend already + connected.

-
- -
- Takeoff roll -

Run the checklist.

-

- Flip the switches. The command below rewrites itself, and so does the rest of this - page. -

- -
- -
- Liftoff -

- One command. -
- Wheels up. -

-

- Your project is generated in a staging directory and committed only after validation - succeeds. A launch either completes or never leaves the runway. -

- -
- -
- Climb -

Keep climbing.

-

- Everything you need is already on board. Your stack is on record, the checks are built - in, and your agent gets clean context. -

-
-
-
- Manifest -

Everything on board

-
- {capabilities.map(([label, value]) => ( -
-
{label}
-
{value}
-
- ))} -
-
-
- Flight recorder -

Your stack, on record.

- -
-
-
-
- Autopilot -

Hand the controls to your agent.

-

- Point any coding agent at the docs. Plain text and Markdown, no proprietary - integration. -

- -
-
- Systems check -

Checks that never touch your code.

-
-                    
-                      $ npx {commandName} doctor
-                      {doctorChecks.map((check) => (
-                        
-                          {"\n"}
-                          ✓ 
-                          {check}
-                        
-                      ))}
-                    
-                  
-
-
-
-
- -
- Orbit -

Built in the open.

-

A small crew. An open codebase. Room for your ideas.

- -
- -
- Go for launch -

Your turn.

-

Name your mission and run it.

-
- Build your stack + Build your stack{" "} +
-
-
- +
+ + + +
); } diff --git a/apps/docs/src/components/copy-command.tsx b/apps/docs/src/components/copy-command.tsx index ea1117c..71abb2e 100644 --- a/apps/docs/src/components/copy-command.tsx +++ b/apps/docs/src/components/copy-command.tsx @@ -3,7 +3,6 @@ import { createPackageName } from "@expojet/brand"; import { Copy01Icon, Tick02Icon } from "@hugeicons/core-free-icons"; import { HugeiconsIcon } from "@hugeicons/react"; -import { Fragment } from "react"; import { useCopyFeedback } from "@/hooks/use-copy-feedback"; const defaultCommand = `npx ${createPackageName}@latest my-app`; @@ -16,24 +15,10 @@ export function CopyCommand({ label?: string; }) { const { status, copy } = useCopyFeedback(value, 1600); - // Each word is unbreakable so long commands wrap at spaces, not after the `-` of a flag. - let offset = 0; - const words = value.split(" ").map((word) => { - const start = offset; - offset += word.length + 1; - return { word, start }; - }); return ( - ))} - - - ); -} - -export function LaunchSwitchboard() { - const { launch, setLaunch } = use(LaunchContext); - return ( -
-
- ({ value: manager, label: manager }))} - value={launch.packageManager} - onSelect={(packageManager) => setLaunch({ ...launch, packageManager })} - isDisabled={(manager) => !supportsPackageManager(launch.sdk, manager)} - /> - - setLaunch({ - ...launch, - sdk, - // Matches the Stack Builder: the SDK 58 beta pack has no Yarn support. - packageManager: supportsPackageManager(sdk, launch.packageManager) - ? launch.packageManager - : "pnpm", - }) - } - /> - setLaunch({ ...launch, auth })} - /> - setLaunch({ ...launch, style })} - /> -
-
-

- Your command - All systems go -

-
- -
-

- Four of the switches. Navigation, backend, database and the rest are in the{" "} - full builder. -

-
-
- ); -} - -/** Lines the CLI prints for this command, abridged where the output is machine specific. */ -export function LaunchTerminal() { - const { launch } = use(LaunchContext); - const { packageManager, sdk, auth, style } = launch; - return ( -
- -
-        
-          $ 
-          {commandFor(launch)}
-          {"\n"}
-          ◇ Files generated atomically{"\n"}
-          ◇ Git repository initialized{"\n"}
-          ◇ Dependencies installed with {packageManager}
-          {"\n"}
-          ✓ Project generated atomically{"\n"}
-          
-            {"  "}Structure: standalone{"\n"}
-            {"  "}Package manager: {packageManager}
-            {"\n"}
-            {"  "}…{"\n"}
-            {"  "}Authentication: {auth}
-            {"\n"}
-            {"  "}Styling: {style}
-            {"\n"}
-            {"  "}…{"\n"}
-            {"  "}Foundation: Expo SDK {sdk}, Expo Router, strict TypeScript, tests{"\n"}
-          
-          
-            └{" "}
-            
-          {"\n"}
-          $ cd {projectName} && {packageManager} run dev
-        
-      
-
- ); -} - -/** The opening of the manifest this command writes, abridged. */ -export function LaunchRecord() { - const { packageManager, sdk, auth, style } = use(LaunchContext).launch; - return ( -
-      
-        {`// ${manifestFileName}`}
-        {"\n{\n"}
-        {"  …\n"}
-        {`  "sdk": ${sdk},\n  "structure": "standalone",\n  "packageManager": "${packageManager}",\n  "adapters": {\n    "auth": "${auth}",\n    "style": "${style}",\n`}
-        {"    …\n"}
-        {"  }\n}"}
-      
-    
- ); -} - -export function LaunchCommand() { - return ( -
- -
- ); -} diff --git a/apps/docs/src/components/site-header.tsx b/apps/docs/src/components/site-header.tsx index 5c23a91..d198a0e 100644 --- a/apps/docs/src/components/site-header.tsx +++ b/apps/docs/src/components/site-header.tsx @@ -29,8 +29,7 @@ export function SiteHeader({ active }: { active: "home" | "builder" }) {
- {/* The home page is one dark flight scene, so it has no theme to switch. */} - {active === "home" ? null : } +
- {active === "home" ? null : } + void) { - const report = useEffectEvent(onProgress); - - useEffect(() => { - const reduceMotion = window.matchMedia("(prefers-reduced-motion: reduce)"); - let markers: Marker[] = []; - let frame = 0; - - const measure = () => { - const elements = [...document.querySelectorAll("[data-flight-stage]")]; - const tops = elements.map((element) => element.getBoundingClientRect().top + window.scrollY); - const origin = Math.min(...tops); - // The last stages may sit too close to the end of the page to reach the top. - const maxScroll = document.documentElement.scrollHeight - window.innerHeight; - markers = elements - .map((element, index) => ({ - stage: Number(element.dataset.flightStage), - offset: Math.min((tops[index] ?? origin) - origin, maxScroll), - })) - .sort((left, right) => left.offset - right.offset); - }; - - const stageAt = (scroll: number) => { - const first = markers[0]; - if (!first) return 0; - if (reduceMotion.matches) { - // Step early, before the next section's content scrolls up to where the jet was. - const lead = scroll + window.innerHeight * 0.75; - return markers.findLast((marker) => marker.offset <= lead)?.stage ?? first.stage; - } - let from = first; - for (const to of markers) { - if (scroll < to.offset) { - const span = to.offset - from.offset; - const t = span > 0 ? Math.max(0, (scroll - from.offset) / span) : 1; - return from.stage + (to.stage - from.stage) * t; - } - from = to; - } - return from.stage; - }; - - const update = () => { - frame = 0; - report(stageAt(window.scrollY)); - }; - const schedule = () => { - if (!frame) frame = requestAnimationFrame(update); - }; - const remeasure = () => { - measure(); - schedule(); - }; - - // Content height changes (fonts, images, live data) move the markers. - const observer = new ResizeObserver(remeasure); - observer.observe(document.body); - window.addEventListener("scroll", schedule, { passive: true }); - window.addEventListener("resize", remeasure); - reduceMotion.addEventListener("change", schedule); - remeasure(); - - return () => { - cancelAnimationFrame(frame); - observer.disconnect(); - window.removeEventListener("scroll", schedule); - window.removeEventListener("resize", remeasure); - reduceMotion.removeEventListener("change", schedule); - }; - }, []); -} From 0307ddb9b574755d0ce009cb49ea002dd000be49 Mon Sep 17 00:00:00 2001 From: Owusu1946 <59415541+Owusu1946@users.noreply.github.com> Date: Thu, 8 Oct 2026 10:42:17 +0000 Subject: [PATCH 5/5] chore(release): include reviewed dependency pins in 0.8.1 notes --- .changeset/reviewed-cli-dependencies.md | 5 ----- apps/docs/src/lib/releases.ts | 1 + packages/cli/CHANGELOG.md | 1 + 3 files changed, 2 insertions(+), 5 deletions(-) delete mode 100644 .changeset/reviewed-cli-dependencies.md 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/apps/docs/src/lib/releases.ts b/apps/docs/src/lib/releases.ts index e95ce82..50793f5 100644 --- a/apps/docs/src/lib/releases.ts +++ b/apps/docs/src/lib/releases.ts @@ -7,6 +7,7 @@ export const releases = [ date: "October 8, 2026", summary: "Optional, stack-aware agent skills for your coding tools.", changes: [ + "Pinned direct CLI runtime dependencies to reviewed versions and clarified team setup and EAS deployment responsibilities.", "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.", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 4ae4883..df9e3d2 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -4,6 +4,7 @@ ### Patch Changes +- Pin direct CLI runtime dependencies to the versions already resolved in the reviewed lockfile. Transitive and generated-app dependencies are not pinned by this change. - 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,