From bd02ed592e3def739aaea8ae441389f402ce7b37 Mon Sep 17 00:00:00 2001 From: Szymon Chmal Date: Fri, 4 Sep 2026 08:16:23 +0200 Subject: [PATCH 1/6] docs: reframe Rozenite positioning around React Native and Lynx Rozenite reaches React Native, React Native Web and Lynx, but the landing page, the README and most of the docs still describe a React-Native-only product. This widens the framing everywhere it is now wrong, without overstating how far Lynx support actually goes. Landing page: - hero names both targets, with the rest of the breadth in a chip row rather than a third line of display type - new Rozenite for Lynx section, as the page's only ordered rail - new standalone app section, as its only centred full-width figure - Web and Build-your-own swap tints so the run keeps alternating - BrandMark grows multi-path support and a vendored Lynx mark Docs: - Lynx joins the compatibility matrix, pinned to the rspeedy and @lynx-js/react versions we actually test against - Rozenite for Lynx and for Web move under a Targets group, with redirects for the two URLs that moved - agent docs say "app" and "target" now that agents reach Lynx - Redux DevTools is corrected out of the Lynx-compatible list: its runtime statically imports react-native for trace symbolication - the standalone app is sold on its own merits rather than on React Native DevTools' shortcomings Refs #493 for the missing `rozenite init` Lynx detection, which the getting-started page now points at. --- README.md | 26 +++- packages/cli/README.md | 8 +- packages/cli/package.json | 2 +- packages/rhf-plugin/README.md | 2 +- packages/storage-plugin/README.md | 2 +- packages/web/README.md | 2 +- website/landing/README.md | 32 ++++- .../components/brand-mark/brand-mark.tsx | 73 +++++++--- .../landing/components/section/section.tsx | 8 +- website/landing/landing-page.tsx | 4 + .../build-your-own/build-your-own.tsx | 2 +- website/landing/sections/hero/hero.module.css | 36 ++++- website/landing/sections/hero/hero.tsx | 18 ++- website/landing/sections/lynx/lynx.module.css | 126 ++++++++++++++++++ website/landing/sections/lynx/lynx.tsx | 72 ++++++++++ .../sections/standalone/standalone.module.css | 63 +++++++++ .../sections/standalone/standalone.tsx | 40 ++++++ website/landing/sections/web/web.tsx | 4 +- website/rspress.config.ts | 2 +- website/src/docs/_meta.json | 3 +- .../adding-tools-to-your-application.mdx | 2 +- .../making-your-plugin-agent-enabled.mdx | 14 +- website/src/docs/agent/overview.mdx | 6 +- website/src/docs/agent/sdk.mdx | 4 +- website/src/docs/compatibility.mdx | 15 ++- website/src/docs/getting-started.mdx | 2 + website/src/docs/introduction.md | 5 +- .../src/docs/official-plugins/controls.mdx | 2 +- website/src/docs/official-plugins/overlay.mdx | 2 +- .../official-plugins/performance-monitor.mdx | 2 +- .../official-plugins/react-navigation.mdx | 2 +- .../docs/official-plugins/redux-devtools.mdx | 2 +- website/src/docs/official-plugins/storage.mdx | 2 +- .../docs/official-plugins/tanstack-query.mdx | 2 +- .../src/docs/plugin-development/overview.md | 4 +- .../plugin-development/plugin-development.md | 12 +- website/src/docs/standalone-app.mdx | 10 +- website/src/docs/targets/_meta.json | 4 + .../docs/{ => targets}/rozenite-for-lynx.mdx | 8 +- .../docs/{ => targets}/rozenite-for-web.mdx | 0 website/vercel.json | 19 ++- 41 files changed, 549 insertions(+), 95 deletions(-) create mode 100644 website/landing/sections/lynx/lynx.module.css create mode 100644 website/landing/sections/lynx/lynx.tsx create mode 100644 website/landing/sections/standalone/standalone.module.css create mode 100644 website/landing/sections/standalone/standalone.tsx create mode 100644 website/src/docs/targets/_meta.json rename website/src/docs/{ => targets}/rozenite-for-lynx.mdx (88%) rename website/src/docs/{ => targets}/rozenite-for-web.mdx (100%) diff --git a/README.md b/README.md index 8bf2db83..a930cf43 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,40 @@ ![rozenite-banner](https://www.rozenite.dev/rozenite-banner.jpg) -### React Native DevTools Plugin Framework +### Plug-and-play DevTools panels for React Native and Lynx [![mit licence][license-badge]][license] [![npm downloads][npm-downloads-badge]][npm-downloads] [![Chat][chat-badge]][chat] [![PRs Welcome][prs-welcome-badge]][prs-welcome] -Rozenite brings plug-and-play panels to React Native DevTools. Install plugins, enable them, and start debugging in minutes — no extra windows, servers, or tabs. Works with Expo and bare React Native, across Metro and Re.Pack. +Rozenite brings plug-and-play panels to React Native DevTools. Install plugins, enable them, and start debugging in minutes — no extra windows, servers, or tabs. Works with Expo and bare React Native across Metro and Re.Pack, with React Native Web and [Lynx](https://lynxjs.org) support in the box. ![Plugin slideshow](https://rozenite.dev/plugin-slideshow.webp) ## Features - **Plug-and-Play Panels**: Install plugins and they auto-appear in DevTools — start debugging in minutes. -- **Unified DevTools Experience**: All panels live inside React Native DevTools — no extra windows, servers, or browser tabs. +- **Unified DevTools Experience**: Panels live inside DevTools by default — no extra windows, servers, or browser tabs. - **Real-Time Debugging**: Live updates for network requests, storage and performance as you use your app. - **Works With Your Setup**: Compatible with Expo and bare React Native projects. Supports Metro and Re.Pack based workflows. +- **Beyond React Native**: The same panels, plugins and CLI reach Lynx apps through rspeedy, and React Native Web apps through the browser extension. Both are experimental. - **Production-Safe Controls**: Plugins are automatically disabled in production builds — no plugin code ships to your users. - **Easy to Build Your Own**: When you need something custom, create your own panel with type-safe, isomorphic APIs and great DX. ## Compatibility -| Rozenite | Expo SDK | React Native | Re.Pack | -| -------- | -------- | ------------- | ------- | -| 1.x | 52+ | 0.76+ | 5.2+ | +**React Native** -Bare React Native projects are supported too — match your React Native version to the one shipped by the minimum supported Expo SDK above. See the [Compatibility](https://rozenite.dev/docs/compatibility) page for full details. +| Rozenite | Expo SDK | React Native | Re.Pack | +| ---------------- | -------- | ------------ | ------- | +| 1.13.0, >= 2.0.0 | 52+ | 0.76+ | 5.2+ | + +Bare React Native projects are supported too — match your React Native version to the one shipped by the minimum supported Expo SDK above. + +**Lynx** (experimental) + +| Rozenite | rspeedy | @lynx-js/react | +| -------- | ------- | -------------- | +| >= 2.4.0 | 0.16+ | 0.125+ | + +See the [Compatibility](https://rozenite.dev/docs/compatibility) page for full details. ## Documentation @@ -31,6 +42,7 @@ The documentation is available at [rozenite.dev](https://rozenite.dev). You can - [Quick Start](https://rozenite.dev/docs/getting-started) - [Plugin Directory](https://rozenite.dev/plugin-directory) +- [Rozenite for Lynx](https://rozenite.dev/docs/targets/rozenite-for-lynx) - [Plugin Development](https://rozenite.dev/docs/plugin-development/overview) ## Made with ❤️ at Callstack diff --git a/packages/cli/README.md b/packages/cli/README.md index 70e2edfc..23383f52 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -1,14 +1,14 @@ ![rozenite-banner](https://www.rozenite.dev/rozenite-banner.jpg) -### A command-line interface for creating and managing React Native DevTools plugins. +### A command-line interface for creating and managing Rozenite DevTools plugins. [![mit licence][license-badge]][license] [![npm downloads][npm-downloads-badge]][npm-downloads] [![Chat][chat-badge]][chat] [![PRs Welcome][prs-welcome-badge]][prs-welcome] -The Rozenite CLI is the primary tool for scaffolding, building, and developing React Native DevTools plugins. It provides an intuitive command-line experience with interactive prompts, automated project setup, and development workflows. +The Rozenite CLI is the primary tool for scaffolding, building, and developing Rozenite DevTools plugins. It provides an intuitive command-line experience with interactive prompts, automated project setup, and development workflows. ## Features -- **Plugin Generation**: Create new React Native DevTools plugins with a complete project structure +- **Plugin Generation**: Create new Rozenite DevTools plugins with a complete project structure - **Interactive Setup**: Guided prompts for plugin configuration and metadata - **Build System**: Compile plugins for different targets - **Development Server**: Hot-reload development environment with file watchers @@ -28,7 +28,7 @@ npm install rozenite ### Generate a New Plugin -Create a new React Native DevTools plugin: +Create a new Rozenite DevTools plugin: ```bash npx rozenite generate diff --git a/packages/cli/package.json b/packages/cli/package.json index 23ed5d7b..d719f3dd 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "rozenite", "version": "2.4.0", - "description": "Command-line interface for creating and managing React Native DevTools plugins", + "description": "Command-line interface for creating and managing Rozenite DevTools plugins", "keywords": [ "cli", "devtools", diff --git a/packages/rhf-plugin/README.md b/packages/rhf-plugin/README.md index e4f0999b..709773de 100644 --- a/packages/rhf-plugin/README.md +++ b/packages/rhf-plugin/README.md @@ -58,7 +58,7 @@ If you omit `id`, the hook uses React’s `useId()` for a dev-only identifier. ## Web (React Native for Web) -When you use [Rozenite for Web](https://rozenite.dev/docs/rozenite-for-web) in development, this plugin loads in the browser like on native. It follows the same `control` wiring as in your React Native app, as long as `react-hook-form` is available in the bundle. +When you use [Rozenite for Web](https://rozenite.dev/docs/targets/rozenite-for-web) in development, this plugin loads in the browser like on native. It follows the same `control` wiring as in your React Native app, as long as `react-hook-form` is available in the bundle. ## Notes diff --git a/packages/storage-plugin/README.md b/packages/storage-plugin/README.md index eabbef55..b78bda55 100644 --- a/packages/storage-plugin/README.md +++ b/packages/storage-plugin/README.md @@ -93,7 +93,7 @@ createAsyncStorageAdapter({ ## Web (React Native for Web) -When you use [Rozenite for Web](https://rozenite.dev/docs/rozenite-for-web) in development, this plugin loads in the browser like on native. **AsyncStorage** and **Expo SecureStore** adapters work on web when the underlying libraries do. +When you use [Rozenite for Web](https://rozenite.dev/docs/targets/rozenite-for-web) in development, this plugin loads in the browser like on native. **AsyncStorage** and **Expo SecureStore** adapters work on web when the underlying libraries do. **MMKV** is not available in typical web bundles. In development on web, `createMMKVStorageAdapter` returns an adapter with **empty `storages`** (same behavior as production builds), so you can keep shared setup code without importing `react-native-mmkv` in the web bundle. diff --git a/packages/web/README.md b/packages/web/README.md index 07c96bbb..28b573b9 100644 --- a/packages/web/README.md +++ b/packages/web/README.md @@ -29,7 +29,7 @@ Install the browser extension from the [GitHub releases](https://github.com/call The documentation is available at [rozenite.dev](https://rozenite.dev). You can also use the following links to jump to specific topics: -- [Rozenite for Web](https://rozenite.dev/docs/rozenite-for-web) +- [Rozenite for Web](https://rozenite.dev/docs/targets/rozenite-for-web) - [Quick Start](https://rozenite.dev/docs/getting-started) - [Plugin Directory](https://rozenite.dev/plugin-directory) - [Plugin Development](https://rozenite.dev/docs/plugin-development/overview) diff --git a/website/landing/README.md b/website/landing/README.md index 1516a273..01fc38db 100644 --- a/website/landing/README.md +++ b/website/landing/README.md @@ -43,9 +43,12 @@ Three rules are worth knowing before adding anything: - **Radius.** There are exactly two: `--rz-radius-control` for interactive elements and chips, `--rz-radius-surface` for panels, cards and code blocks. - **Colour blocks.** `Section` takes `tint="block"`, which remaps the token set - locally so its children need no dark-specific styling. The page spends that - once, on Rozenite for Agents. A second inverted section would read as a theme + locally so its children need no dark-specific styling. Nothing spends it + today. Spend it at most once: a second inverted section would read as a theme flip mid-scroll. +- **Tints alternate.** Every section is `subtle` or `default`, strictly + alternating down the page, and the `subtle` ones carry `bordered`. Inserting a + section means retinting its neighbours, not breaking the run. - **The hero owns the first screen.** It is `min-height: calc(100dvh - var(--rz-nav-height))`. If the host navigation changes height, retune that token rather than the section. @@ -54,19 +57,33 @@ Three rules are worth knowing before adding anything: These came out of a design review and are easy to break by accident: -- **Eyebrows are rationed.** Only the three product surfaces carry one: official - plugins, Rozenite for Agents, Rozenite for Web. Not every section needs a - label above its headline. +- **Eyebrows are rationed.** Only the product surfaces carry one: official + plugins, Rozenite for Agents, Rozenite for Lynx, Rozenite for Web. Not every + section needs a label above its headline -- the standalone app is a way of + working rather than a surface, so it has none. `eyebrow` takes a `ReactNode` + so a surface can pair its label with a brand mark or a status chip on that + one line. That is its whole remit; it is not a second headline. - **Section headers stack.** Eyebrow, headline, body, in one column. Rozenite for Agents is the one exception: it pairs its header with the terminal sample on the same line, and takes `className` to drop its stacking margin. - **No layout family repeats.** Hero and Rozenite for Web are the only text-and-visual splits, and they are not adjacent. Everything else uses a - different composition. + different composition: Lynx is the page's only ordered rail, and the + standalone app is the only centred header over a full-width figure. - **Icons come from a library.** `@phosphor-icons/react` for UI glyphs, `simple-icons` for brand marks via `components/brand-mark`. Nothing is drawn by hand. Brand marks render in `currentColor`, never in the brand hex, so a logo cannot smuggle a second accent onto the page. + + The Lynx mark is the one exception to "from a library": `simple-icons` has no + Lynx entry, so its two paths are vendored into `components/brand-mark` from + lynxjs.org's own header -- vendored rather than hotlinked, so the page pulls + nothing from a third-party CDN. It is ByteDance/TikTok's mark, used + nominatively to identify the project Rozenite integrates with. The Lynx + repositories are Apache-2.0, whose section 6 grants no trademark rights, so + this rests on nominative use rather than on the licence. `currentColor` is + part of that: the mark identifies, it does not imply endorsement. Vendor + another mark only on the same terms. - **Grids have no empty cells.** The plugin grid shows `FEATURED_PLUGINS`, six of the fourteen, which divides evenly at three, two and one column. The rest are counted in a line of copy underneath rather than drawn. Keep the featured @@ -103,3 +120,6 @@ ratio. `components/connection-diagram` is for the places where no screenshot is coming. It draws two endpoints and the link between them, which explains an architecture better than a picture of a panel would. Rozenite for Web uses it. + +The standalone app uses `components/screenshot`, because a window is exactly the +thing a screenshot is good at showing and a diagram is not. diff --git a/website/landing/components/brand-mark/brand-mark.tsx b/website/landing/components/brand-mark/brand-mark.tsx index 64a659e4..f3548e2e 100644 --- a/website/landing/components/brand-mark/brand-mark.tsx +++ b/website/landing/components/brand-mark/brand-mark.tsx @@ -1,12 +1,39 @@ import { siGooglechrome, siReact } from 'simple-icons'; -export type BrandSlug = 'googlechrome' | 'react'; +export type BrandSlug = 'googlechrome' | 'react' | 'lynx'; -/** Real brand marks, straight from simple-icons. Never redrawn by hand. */ -const ICONS = { - googlechrome: siGooglechrome, - react: siReact, -} as const; +type BrandIcon = { + paths: readonly string[]; + /** simple-icons is uniformly 24x24; a vendored mark keeps its own box. */ + viewBox?: string; + /** Some marks are authored with even-odd holes and look solid without it. */ + fillRule?: 'evenodd'; +}; + +/** + * Real brand marks, straight from simple-icons. Never redrawn by hand. + * + * Lynx is the exception: it has no simple-icons entry, so the paths below are + * the mark from lynxjs.org's own header, vendored rather than hotlinked so the + * page pulls nothing from a third-party CDN. It is ByteDance/TikTok's mark, + * used nominatively to identify the Lynx project Rozenite integrates with. The + * Lynx repositories are Apache-2.0, whose section 6 grants no trademark rights, + * so this rests on nominative use rather than on the licence -- which is also + * why it renders in `currentColor` below. The mark identifies; it does not + * imply endorsement. + */ +const ICONS: Record = { + googlechrome: { paths: [siGooglechrome.path] }, + react: { paths: [siReact.path] }, + lynx: { + paths: [ + 'M7.56542 6.19594L3.90642 8.7164C3.50877 8.99031 3.23346 9.40191 3.13675 9.86708L2.77902 11.5878C2.76005 11.679 2.71799 11.7642 2.65665 11.8355L0.996306 14.0121C0.772761 14.2722 0.778152 14.9632 1.39044 15.4057C1.62523 15.6103 1.93915 16.0691 2.29622 16.591C3.05224 17.6959 4.00169 19.0836 4.80312 18.9394C5.9372 18.541 7.32544 18.4135 8.39128 18.9394C10.4632 20.7282 9.95449 22.3775 9.22514 24.7421C8.93165 25.6936 8.60243 26.7609 8.39128 27.9997C9.38643 24.3777 11.6242 20.1711 15.6592 18.7437C14.9322 18.1498 13.4486 17.5981 12.1357 17.4653C12.1357 17.4653 16.1691 14.0121 21.1439 12.4254C17.671 4.16205 11.9386 0.213095 11.9386 0.213095C11.6465 -0.148197 11.0566 -0.0296711 10.9349 0.414774C10.8371 1.72112 10.675 2.60942 10.4074 3.44676L8.39128 1.12029C8.18068 0.866399 7.75965 1.013 7.76176 1.33949C8.10312 3.23719 8.05521 4.30239 7.56542 6.19594ZM8.9846 6.02248L8.99663 6.02171C9.02298 6.02002 9.0489 6.01659 9.07424 6.01153L8.9846 6.02248ZM11.7123 1.7617C13.094 4.1491 13.7199 5.5054 13.9322 8.03659C12.4625 7.2017 11.8221 6.98923 10.7413 6.99451C11.3718 5.0773 11.5644 3.92284 11.7123 1.7617Z', + 'M20.5926 19.4929C14.9649 20.7806 11.7681 22.7198 9.32324 28.0001C13.712 20.6367 26.9976 21.9536 26.9976 21.9536C26.7494 20.7508 24.1079 18.4571 22.3706 17.0503C22.3706 17.0503 23.7722 15.3272 26.8706 14.455C26.8706 14.455 20.9135 14.8002 17.4455 16.6727C18.569 17.2656 20.0081 18.2663 20.5926 19.4929Z', + ], + viewBox: '0 0 27 28', + fillRule: 'evenodd', + }, +}; type BrandMarkProps = { slug: BrandSlug; @@ -19,16 +46,24 @@ type BrandMarkProps = { * Rendered in `currentColor` rather than the brand hex, so a mark sits in the * page's palette instead of dragging a second accent into it. */ -export const BrandMark = ({ slug, label, size = 26, className }: BrandMarkProps) => ( - - - -); +export const BrandMark = ({ slug, label, size = 26, className }: BrandMarkProps) => { + const icon = ICONS[slug]; + + return ( + + {icon.paths.map((path) => ( + + ))} + + ); +}; diff --git a/website/landing/components/section/section.tsx b/website/landing/components/section/section.tsx index ba8a0d3e..5a90aa4f 100644 --- a/website/landing/components/section/section.tsx +++ b/website/landing/components/section/section.tsx @@ -40,10 +40,12 @@ export const Section = ({ type SectionHeaderProps = { /** - * Small label above the headline. Rationed on purpose: only the three product - * surfaces (plugins, agents, web) carry one. + * Small label above the headline. Rationed on purpose: only the product + * surfaces (plugins, agents, Lynx, web) carry one. `ReactNode` rather than + * `string` so a surface can pair its label with a brand mark or a status + * chip on the same line -- not so it can grow into a second headline. */ - eyebrow?: string; + eyebrow?: ReactNode; title: ReactNode; body?: ReactNode; /** For sections that place the header inside a layout of their own. */ diff --git a/website/landing/landing-page.tsx b/website/landing/landing-page.tsx index 9dca73f9..9e3164f6 100644 --- a/website/landing/landing-page.tsx +++ b/website/landing/landing-page.tsx @@ -9,7 +9,9 @@ import { Agents } from './sections/agents/agents'; import { BuildYourOwn } from './sections/build-your-own/build-your-own'; import { Closing } from './sections/closing/closing'; import { Hero } from './sections/hero/hero'; +import { Lynx } from './sections/lynx/lynx'; import { Plugins } from './sections/plugins/plugins'; +import { Standalone } from './sections/standalone/standalone'; import { Web } from './sections/web/web'; type LandingPageProps = { @@ -26,8 +28,10 @@ export const LandingPage = ({ footer }: LandingPageProps) => ( + + {footer} diff --git a/website/landing/sections/build-your-own/build-your-own.tsx b/website/landing/sections/build-your-own/build-your-own.tsx index c13f4478..e1c9b7a2 100644 --- a/website/landing/sections/build-your-own/build-your-own.tsx +++ b/website/landing/sections/build-your-own/build-your-own.tsx @@ -31,7 +31,7 @@ client.onMessage('cart-updated', (cart) => { client.send('clear-cart', { reason: 'devtools' });`; export const BuildYourOwn = () => ( -
+
(

- DevTools panels for React Native. + DevTools panels for React Native and Lynx. Runtime tools for agents.

- Rozenite adds debugging panels to React Native DevTools. Agents can read the same runtime - data. + Rozenite adds debugging panels to React Native DevTools — for React Native, web and Lynx + apps. Agents read the same runtime data.

+ {/* The headline names two targets; the rest of the breadth lives here + rather than in a third line of display type. */} +
    + {TARGETS.map((target) => ( +
  • + {target} +
  • + ))} +
+
Get started diff --git a/website/landing/sections/lynx/lynx.module.css b/website/landing/sections/lynx/lynx.module.css new file mode 100644 index 00000000..1bb27770 --- /dev/null +++ b/website/landing/sections/lynx/lynx.module.css @@ -0,0 +1,126 @@ +/* + * A numbered rail. Every other section on the page composes as a grid of peers + * or a text-and-visual split; this one is the only ordered sequence, which is + * what the Lynx setup actually is -- and it puts the easily-missed first step + * where it cannot be skimmed past. + */ + +.label { + display: inline-flex; + align-items: center; + gap: 8px; +} + +.mark { + /* Inherits the eyebrow's accent through `currentColor`. */ + flex-shrink: 0; +} + +.status { + border: 1px solid var(--rz-border-strong); + border-radius: var(--rz-radius-control); + padding: 1px 6px; + color: var(--rz-text-tertiary); + --rz-ls: 0.06em; +} + +.steps { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0; + margin: 0; + padding: 0; + list-style: none; + border-top: 1px solid var(--rz-border); +} + +.step { + display: flex; + flex-direction: column; + gap: 10px; + padding: 28px 32px 32px 0; +} + +/* The rail reads left to right, so the divider belongs between the steps. */ +.step + .step { + padding-left: 32px; + border-left: 1px solid var(--rz-border); +} + +.stepIndex { + font-family: var(--rz-font-mono); + font-size: 0.75rem; + --rz-ls: 0.07em; + color: var(--rz-accent); +} + +.stepTitle { + margin: 0; + font-family: var(--rz-font-display); + font-size: 1.0625rem; + font-weight: 500; + --rz-ls: -0.015em; + --rz-lh: 1.3; +} + +.stepBody { + margin: 0; + font-size: 0.9375rem; + --rz-lh: 1.55; + color: var(--rz-text-secondary); +} + +.bottom { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 20px 40px; + padding-top: 32px; + border-top: 1px solid var(--rz-border); +} + +.setup { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 12px; +} + +.setup > :first-child { + width: min(340px, 100%); +} + +.caveat { + flex: 1 1 30ch; + margin: 0; + font-size: 0.875rem; + --rz-lh: 1.55; + color: var(--rz-text-tertiary); +} + +@media (max-width: 900px) { + .steps { + grid-template-columns: minmax(0, 1fr); + } + + .step { + padding: 24px 0; + } + + .step + .step { + padding-left: 0; + border-left: none; + border-top: 1px solid var(--rz-border); + } +} + +@media (max-width: 560px) { + .setup { + width: 100%; + } + + .setup > * { + width: 100%; + justify-content: space-between; + } +} diff --git a/website/landing/sections/lynx/lynx.tsx b/website/landing/sections/lynx/lynx.tsx new file mode 100644 index 00000000..1c57f801 --- /dev/null +++ b/website/landing/sections/lynx/lynx.tsx @@ -0,0 +1,72 @@ +import { ActionButton } from '../../components/action-button/action-button'; +import { BrandMark } from '../../components/brand-mark/brand-mark'; +import { CommandLine } from '../../components/command-line/command-line'; +import { Reveal } from '../../components/reveal/reveal'; +import { Section, SectionHeader } from '../../components/section/section'; +import styles from './lynx.module.css'; + +type Step = { + title: string; + body: string; +}; + +/** + * Ordered, because the order is the point: the DevTool switch is off by + * default and nothing else in the list works until it is on. + */ +const STEPS: Step[] = [ + { + title: 'Turn on Lynx DevTool', + body: 'Lynx ships its DevTool component switched off. Flip it on in the app, then relaunch — nothing is discoverable until you do.', + }, + { + title: 'Add the plugin', + body: 'One entry in lynx.config.ts. The plugin injects the device runtime for you, in development only, so there is nothing to import in your app.', + }, + { + title: 'Open the printed URL', + body: 'The dev server prints a DevTools URL per card. Plugins resolve from your package.json, exactly as they do on Metro.', + }, +]; + +export const Lynx = () => ( +
+ + + Rozenite for Lynx + Experimental + + } + title="Same panels, same CLI, now on Lynx" + body="Rozenite discovers Lynx apps over DebugRouter and bridges them to the Chrome DevTools Protocol, so the DevTools frontend React Native uses connects to a Lynx card unmodified." + /> + + +
    + {STEPS.map((step, index) => ( +
  1. + {String(index + 1).padStart(2, '0')} +

    {step.title}

    +

    {step.body}

    +
  2. + ))} +
+ +
+
+ + + Lynx setup guide + +
+ +

+ Plugins that move state work today — controls, feature flags, React Hook Form and TanStack + Query. Ones built on React Native APIs do not yet. +

+
+
+
+); diff --git a/website/landing/sections/standalone/standalone.module.css b/website/landing/sections/standalone/standalone.module.css new file mode 100644 index 00000000..accdde18 --- /dev/null +++ b/website/landing/sections/standalone/standalone.module.css @@ -0,0 +1,63 @@ +/* + * Centred header over one full-width figure. Every other section either splits + * text and visual side by side or lays peers out in a grid, so this is the one + * place the page centres -- fitting for a section about a single window. + */ + +.header { + max-width: 62ch; + margin-inline: auto; + text-align: center; +} + +.title { + margin: 0; + font-family: var(--rz-font-display); + font-weight: 500; + font-size: clamp(2rem, 1.4rem + 2.4vw, 3rem); + --rz-lh: 1.08; + --rz-ls: -0.028em; + text-wrap: balance; +} + +.body { + margin: 20px auto 0; + max-width: 58ch; + font-size: clamp(1rem, 0.97rem + 0.16vw, 1.0625rem); + --rz-lh: 1.6; + color: var(--rz-text-secondary); +} + +.code { + font-family: var(--rz-font-mono); + font-size: 0.9em; + color: var(--rz-text); +} + +.actions { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + gap: 12px; + margin-top: 32px; +} + +.command { + width: min(320px, 100%); +} + +.shot { + margin-top: 56px; +} + +@media (max-width: 560px) { + .actions > * { + width: 100%; + justify-content: space-between; + } + + .shot { + margin-top: 36px; + } +} diff --git a/website/landing/sections/standalone/standalone.tsx b/website/landing/sections/standalone/standalone.tsx new file mode 100644 index 00000000..a14c677f --- /dev/null +++ b/website/landing/sections/standalone/standalone.tsx @@ -0,0 +1,40 @@ +import { ActionButton } from '../../components/action-button/action-button'; +import { CommandLine } from '../../components/command-line/command-line'; +import { Reveal } from '../../components/reveal/reveal'; +import { ScreenshotSlot } from '../../components/screenshot/screenshot'; +import { Section } from '../../components/section/section'; +import styles from './standalone.module.css'; + +/** + * No eyebrow. The rationed labels belong to the product surfaces; the + * standalone app is a way of working, not another target. + */ +export const Standalone = () => ( +
+ +
+

Rozenite on its own

+

+ If Rozenite panels are where you spend your debugging time, run just those.{' '} + rozenite open connects straight to the device, so + your panels stay put across app reloads — and they work the same way whichever target you + are debugging. +

+ +
+ + + Standalone app guide + +
+
+
+ + + + +
+); diff --git a/website/landing/sections/web/web.tsx b/website/landing/sections/web/web.tsx index e3ff0a95..964523fd 100644 --- a/website/landing/sections/web/web.tsx +++ b/website/landing/sections/web/web.tsx @@ -32,7 +32,7 @@ const POINTS: Point[] = [ ]; export const Web = () => ( -
+
(
- + Web setup guide
diff --git a/website/rspress.config.ts b/website/rspress.config.ts index fe4401cc..c0ab029e 100644 --- a/website/rspress.config.ts +++ b/website/rspress.config.ts @@ -8,7 +8,7 @@ export default withCallstackPreset( context: __dirname, docs: { description: - 'Build powerful debugging tools and custom panels for React Native DevTools with type-safe, isomorphic communication', + 'Plug-and-play DevTools panels for React Native and Lynx, with type-safe plugin APIs and runtime tools for agents.', icon: '/logo.svg', logoDark: '/logo-dark.svg', logoLight: '/logo-light.svg', diff --git a/website/src/docs/_meta.json b/website/src/docs/_meta.json index 200bd02b..85dedbf3 100644 --- a/website/src/docs/_meta.json +++ b/website/src/docs/_meta.json @@ -3,9 +3,8 @@ { "type": "file", "name": "prior-art", "label": "Prior Art" }, { "type": "file", "name": "getting-started", "label": "Getting started" }, { "type": "file", "name": "compatibility", "label": "Compatibility" }, + { "type": "dir", "name": "targets", "label": "Targets" }, { "type": "dir", "name": "agent", "label": "Rozenite for Agents" }, - { "type": "file", "name": "rozenite-for-web", "label": "Rozenite for Web" }, - { "type": "file", "name": "rozenite-for-lynx", "label": "Rozenite for Lynx" }, { "type": "file", "name": "standalone-app", "label": "Standalone App" }, { "type": "dir", diff --git a/website/src/docs/agent/adding-tools-to-your-application.mdx b/website/src/docs/agent/adding-tools-to-your-application.mdx index c98d0039..88c0811c 100644 --- a/website/src/docs/agent/adding-tools-to-your-application.mdx +++ b/website/src/docs/agent/adding-tools-to-your-application.mdx @@ -2,7 +2,7 @@ import { PackageManagerTabs } from '@rspress/core/theme'; # Adding tools to your application -You can expose custom agent tools directly from your React Native app. These tools appear under the **app** domain so coding agents (e.g. CLI, Cursor, Codex) can discover and call them via Rozenite for Agents. +You can expose custom agent tools directly from your app. These tools appear under the **app** domain so coding agents (e.g. CLI, Cursor, Codex) can discover and call them via Rozenite for Agents. Use this when you want agents to perform app-specific actions—for example, triggering a debug flow, returning build metadata, or driving in-app behavior during automated testing. diff --git a/website/src/docs/agent/making-your-plugin-agent-enabled.mdx b/website/src/docs/agent/making-your-plugin-agent-enabled.mdx index bd41458c..82692d45 100644 --- a/website/src/docs/agent/making-your-plugin-agent-enabled.mdx +++ b/website/src/docs/agent/making-your-plugin-agent-enabled.mdx @@ -8,8 +8,8 @@ This page describes what you need to expose tools from your plugin package. ## Prerequisites -- You have a Rozenite plugin with a **React Native side** (code that runs inside the app). See [Plugin Development](/docs/plugin-development/overview) if you are new to plugins. -- Your plugin is already integrated so its React Native entry runs when the app is in development. +- You have a Rozenite plugin with an **app side** (code that runs inside the app, from its `react-native.ts` entry point). See [Plugin Development](/docs/plugin-development/overview) if you are new to plugins. +- Your plugin is already integrated so its app entry runs when the app is in development. ## Add the agent bridge dependency @@ -21,7 +21,7 @@ The bridge provides the same message protocol and tool lifecycle as in-app tools ## Use the plugin agent tool hook -From your plugin’s React Native code, call `useRozenitePluginAgentTool` with: +From your plugin’s app-side code, call `useRozenitePluginAgentTool` with: - **pluginId** – Your plugin’s public ID (e.g. `@rozenite/react-navigation-plugin`). This becomes the **domain** agents use to list and call your tools. - **tool** – An `AgentTool`: `name`, `description`, and `inputSchema` (JSON Schema–style). @@ -59,7 +59,7 @@ export function MyPluginAgentTools() { } ``` -Mount `MyPluginAgentTools` from your plugin’s React Native entry (e.g. next to your DevTools panel registration) so it runs when the app is connected. Agents will see a domain equal to `PLUGIN_ID` and a tool named `echo` (qualified as `@my-org/my-rozenite-plugin.echo`). +Mount `MyPluginAgentTools` from your plugin’s app entry (e.g. next to your DevTools panel registration) so it runs when the app is connected. Agents will see a domain equal to `PLUGIN_ID` and a tool named `echo` (qualified as `@my-org/my-rozenite-plugin.echo`). ### Example: plugin-specific tool @@ -111,7 +111,7 @@ The pattern used by Rozenite's official plugins is: 1. Put the **public tool contract** in a non-React module such as `src/shared/agent-tools.ts`. 2. Define each tool with `defineAgentToolContract(...)` from `@rozenite/agent-shared`. -3. Reuse those shared definitions both in your React Native registration hook and in `sdk.ts`. +3. Reuse those shared definitions both in your app-side registration hook and in `sdk.ts`. 4. In `sdk.ts`, call `defineAgentToolDescriptors(pluginId, toolDefinitions)` and export the resulting descriptor object. That split keeps one source of truth for: @@ -272,7 +272,7 @@ Rozenite derives a short, stable domain name from your `pluginId` alone (for exa ## Summary 1. Add **@rozenite/agent-bridge** to your plugin. -2. In your plugin’s React Native code, call **useRozenitePluginAgentTool** with a stable **pluginId**, a **tool** (name, description, inputSchema), and a **handler**. +2. In your plugin’s app-side code, call **useRozenitePluginAgentTool** with a stable **pluginId**, a **tool** (name, description, inputSchema), and a **handler**. 3. Mount the component that registers these tools so it runs when the plugin is active. 4. Agents will see your plugin as a domain and can list and call your tools via `rozenite agent tools|call ...`. @@ -280,4 +280,4 @@ Rozenite derives a short, stable domain name from your `pluginId` alone (for exa - [Adding tools to your application](/docs/agent/adding-tools-to-your-application) – expose app-owned tools under the `app` domain. - [Rozenite for Agents](/docs/agent/overview) – how agents use domains and tools. -- [Plugin Development](/docs/plugin-development/overview) for general plugin structure and React Native integration. +- [Plugin Development](/docs/plugin-development/overview) for general plugin structure and app-side integration. diff --git a/website/src/docs/agent/overview.mdx b/website/src/docs/agent/overview.mdx index a2a2c19f..1b0ac251 100644 --- a/website/src/docs/agent/overview.mdx +++ b/website/src/docs/agent/overview.mdx @@ -1,6 +1,6 @@ # Rozenite for Agents -Rozenite for Agents is the agent-facing way to interact with React Native DevTools and Rozenite plugins. It gives coding agents a reliable interface for inspecting a running React Native app through Rozenite, including logs, network activity, React profiling data, and plugin-specific tooling. +Rozenite for Agents is the agent-facing way to interact with your running app and its Rozenite plugins. It gives coding agents a reliable interface for inspecting a running app through Rozenite, including logs, network activity, React profiling data, and plugin-specific tooling. You can access this workflow through the `rozenite agent` CLI or, if you need direct programmatic access, through [`@rozenite/agent-sdk`](/docs/agent/sdk). For most users, the CLI is still the recommended starting point. @@ -24,13 +24,13 @@ Make sure: - Rozenite is installed and configured for the app - your app is running in development mode - Metro is running -- at least one React Native target is connected +- at least one target is connected If you have more than one simulator, emulator, or device connected, you will need to choose which one to inspect. Rozenite for Agents requires a project with Rozenite already installed and configured. The agent skills teach your coding agent how to use that setup effectively. -Rozenite for Agents is designed for AI and coding agents first. The underlying CLI can be called directly with `npx rozenite`, but the intended use is for an agent to drive it while debugging or implementing changes in a React Native app. +Rozenite for Agents is designed for AI and coding agents first. The underlying CLI can be called directly with `npx rozenite`, but the intended use is for an agent to drive it while debugging or implementing changes in your app. :::warning React Native DevTools will disconnect Rozenite for Agents acts as a debugger connection to the running app. Because of a current React Native limitation, starting an agent session will disconnect React Native DevTools if it is already attached. diff --git a/website/src/docs/agent/sdk.mdx b/website/src/docs/agent/sdk.mdx index 0e29bc27..a9226cf4 100644 --- a/website/src/docs/agent/sdk.mdx +++ b/website/src/docs/agent/sdk.mdx @@ -19,7 +19,7 @@ Make sure: - Node.js 20 or newer - your app is running in development mode - Metro is running and reachable -- at least one React Native target is connected +- at least one target is connected ## Install @@ -252,4 +252,4 @@ async function reconnectToSession(sessionId: string) { - [Rozenite for Agents](/docs/agent/overview) – how agents use domains and tools - [Adding tools to your application](/docs/agent/adding-tools-to-your-application) – expose app-owned tools under the `app` domain -- [Plugin Development](/docs/plugin-development/overview) – general plugin structure and React Native integration +- [Plugin Development](/docs/plugin-development/overview) – general plugin structure and app-side integration diff --git a/website/src/docs/compatibility.mdx b/website/src/docs/compatibility.mdx index 2a5bbb08..2c7560c7 100644 --- a/website/src/docs/compatibility.mdx +++ b/website/src/docs/compatibility.mdx @@ -2,6 +2,8 @@ ## Supported versions +### React Native + | Rozenite | Expo SDK | React Native | Re.Pack | | ---------------- | -------- | ------------ | ------- | | 1.13.0, >= 2.0.0 | 52+ | 0.76+ | 5.2+ | @@ -11,17 +13,28 @@ Expo SDK pins a specific React Native version. If you're on bare React Native (no Expo), match your React Native version to the one shipped by the minimum supported Expo SDK above. +### Lynx + +| Rozenite | rspeedy | @lynx-js/react | +| -------- | ------- | -------------- | +| >= 2.4.0 | 0.16+ | 0.125+ | + +Lynx support is experimental. These are the versions it is developed and tested +against; it has not been exercised across the full range of LynxSDK releases. + ## Bundlers - **Metro** — supported via `@rozenite/metro`, using whichever Metro version ships with your React Native version. No separate Metro version requirement beyond the React Native minimum above. - **Re.Pack** — supported via `@rozenite/repack` for Re.Pack 5.2 and above. +- **rspeedy / Rsbuild** — supported via `@rozenite/lynx` for rspeedy 0.16 and above. ## Platforms - iOS and Android, via React Native DevTools -- Web, via [Rozenite for Web](/docs/rozenite-for-web) (experimental) +- Lynx, via [Rozenite for Lynx](/docs/targets/rozenite-for-lynx) (experimental) +- Web, via [Rozenite for Web](/docs/targets/rozenite-for-web) (experimental) - Plugins declare which of these integrations they support in `rozenite.config.ts`; see [Plugin Development](/docs/plugin-development/plugin-development). ## Notes diff --git a/website/src/docs/getting-started.mdx b/website/src/docs/getting-started.mdx index d07da15d..b2e212b7 100644 --- a/website/src/docs/getting-started.mdx +++ b/website/src/docs/getting-started.mdx @@ -6,6 +6,8 @@ import { PackageManagerTabs } from '@rspress/core/theme'; Rozenite assumes you're comfortable with a React Native project. If you're new to React Native, start with the [React Native documentation](https://reactnative.dev/) first. +On Lynx, follow [Rozenite for Lynx](/docs/targets/rozenite-for-lynx) instead — `rozenite init` doesn't detect rspeedy projects yet ([#493](https://github.com/callstackincubator/rozenite/issues/493)). + ## Install Run the `rozenite init` command in your project. It detects your bundler, installs the right package, and updates your config for you. diff --git a/website/src/docs/introduction.md b/website/src/docs/introduction.md index f2c20736..568eae37 100644 --- a/website/src/docs/introduction.md +++ b/website/src/docs/introduction.md @@ -1,6 +1,6 @@ # Introduction -Rozenite adds plug-and-play debugging panels to React Native DevTools. Install official plugins, open DevTools, and start debugging in minutes — no extra windows or servers. +Rozenite adds plug-and-play debugging panels to React Native DevTools — for React Native, web and Lynx apps. Install official plugins, open DevTools, and start debugging in minutes — no extra windows or servers. ![](/rozenite-loaded.png) @@ -31,6 +31,7 @@ Rozenite is a rare mineral first described in 1960 on Ornak Mountain in the West - **Developers who want built‑in tooling**: add network, performance, storage and state panels without building anything. - **Teams using coding agents**: let agents inspect logs, network activity, and React profiling data through Rozenite for Agents. - **Teams that need custom insights**: create tailored panels for your product, internal observability, or business logic. +- **Teams on Lynx**: the same panels, plugins and CLI, over [Rozenite for Lynx](/docs/targets/rozenite-for-lynx) (experimental). ## Build your own @@ -38,4 +39,4 @@ Rozenite includes a type‑safe, batteries‑included development experience for ## Next steps -Ready to try it? Start with the [Getting Started guide](/docs/getting-started), explore the [Rozenite for Agents overview](/docs/agent/overview), or browse the [Plugin Directory](/plugin-directory). When you need something custom, see the [Plugin Development overview](/docs/plugin-development/overview). +Ready to try it? Start with the [Getting Started guide](/docs/getting-started), explore the [Rozenite for Agents overview](/docs/agent/overview), see which [targets](/docs/targets/rozenite-for-lynx) Rozenite reaches, or browse the [Plugin Directory](/plugin-directory). When you need something custom, see the [Plugin Development overview](/docs/plugin-development/overview). diff --git a/website/src/docs/official-plugins/controls.mdx b/website/src/docs/official-plugins/controls.mdx index 4939b744..de364b82 100644 --- a/website/src/docs/official-plugins/controls.mdx +++ b/website/src/docs/official-plugins/controls.mdx @@ -90,7 +90,7 @@ function App() { ## Web (React Native for Web) -With [Rozenite for Web](/docs/rozenite-for-web), this plugin is available when you debug your React Native web app. +With [Rozenite for Web](/docs/targets/rozenite-for-web), this plugin is available when you debug your React Native web app. ## Usage diff --git a/website/src/docs/official-plugins/overlay.mdx b/website/src/docs/official-plugins/overlay.mdx index 36c85bca..5770a9c7 100644 --- a/website/src/docs/official-plugins/overlay.mdx +++ b/website/src/docs/official-plugins/overlay.mdx @@ -28,7 +28,7 @@ function App() { ## Web (React Native for Web) -With [Rozenite for Web](/docs/rozenite-for-web), this plugin is also available when debugging your React Native web app. +With [Rozenite for Web](/docs/targets/rozenite-for-web), this plugin is also available when debugging your React Native web app. ## Usage diff --git a/website/src/docs/official-plugins/performance-monitor.mdx b/website/src/docs/official-plugins/performance-monitor.mdx index 68f7eb43..6bf1a449 100644 --- a/website/src/docs/official-plugins/performance-monitor.mdx +++ b/website/src/docs/official-plugins/performance-monitor.mdx @@ -24,7 +24,7 @@ function App() { ## Web (React Native for Web) -With [Rozenite for Web](/docs/rozenite-for-web), this plugin is also available when debugging your React Native web app. +With [Rozenite for Web](/docs/targets/rozenite-for-web), this plugin is also available when debugging your React Native web app. ## Usage diff --git a/website/src/docs/official-plugins/react-navigation.mdx b/website/src/docs/official-plugins/react-navigation.mdx index 9114121d..0c3950ca 100644 --- a/website/src/docs/official-plugins/react-navigation.mdx +++ b/website/src/docs/official-plugins/react-navigation.mdx @@ -49,7 +49,7 @@ function App() { ## Web (React Native for Web) -With [Rozenite for Web](/docs/rozenite-for-web), this plugin is also available when debugging your React Native web app. +With [Rozenite for Web](/docs/targets/rozenite-for-web), this plugin is also available when debugging your React Native web app. ## Usage diff --git a/website/src/docs/official-plugins/redux-devtools.mdx b/website/src/docs/official-plugins/redux-devtools.mdx index 7346cf0b..090dcc47 100644 --- a/website/src/docs/official-plugins/redux-devtools.mdx +++ b/website/src/docs/official-plugins/redux-devtools.mdx @@ -67,7 +67,7 @@ export default store; ## Web (React Native for Web) -With [Rozenite for Web](/docs/rozenite-for-web), this plugin is also available when debugging your React Native web app. +With [Rozenite for Web](/docs/targets/rozenite-for-web), this plugin is also available when debugging your React Native web app. ## Usage diff --git a/website/src/docs/official-plugins/storage.mdx b/website/src/docs/official-plugins/storage.mdx index 51a5d98e..7db0e7a9 100644 --- a/website/src/docs/official-plugins/storage.mdx +++ b/website/src/docs/official-plugins/storage.mdx @@ -45,7 +45,7 @@ function App() { ## Web (React Native for Web) -With [Rozenite for Web](/docs/rozenite-for-web), this plugin is also available when debugging your React Native web app — showing entries from whichever Async Storage / Expo Secure Store adapters you configure for the browser. +With [Rozenite for Web](/docs/targets/rozenite-for-web), this plugin is also available when debugging your React Native web app — showing entries from whichever Async Storage / Expo Secure Store adapters you configure for the browser. ## Adapters diff --git a/website/src/docs/official-plugins/tanstack-query.mdx b/website/src/docs/official-plugins/tanstack-query.mdx index 18ad537c..da94524a 100644 --- a/website/src/docs/official-plugins/tanstack-query.mdx +++ b/website/src/docs/official-plugins/tanstack-query.mdx @@ -40,7 +40,7 @@ function App() { ## Web (React Native for Web) -With [Rozenite for Web](/docs/rozenite-for-web), this plugin is also available when debugging your React Native web app. +With [Rozenite for Web](/docs/targets/rozenite-for-web), this plugin is also available when debugging your React Native web app. ## Usage diff --git a/website/src/docs/plugin-development/overview.md b/website/src/docs/plugin-development/overview.md index a7db8767..5ee391ad 100644 --- a/website/src/docs/plugin-development/overview.md +++ b/website/src/docs/plugin-development/overview.md @@ -6,7 +6,7 @@ Plugins add new panels to React Native DevTools through Rozenite — custom debu A plugin has two parts that talk to each other over a type-safe, event-based bridge: -1. **React Native side** — code that runs in your app. +1. **App side** — code that runs in your app. Its entry point is `react-native.ts`, on every target Rozenite supports. 2. **DevTools side** — the panel UI shown in DevTools. Changes on either side are reflected on the other in real time, and both sides can send data or commands. @@ -17,7 +17,7 @@ Changes on either side are reflected on the other in real time, and both sides c my-plugin/ ├── src/ │ └── hello-world.tsx # Your DevTools panels -├── react-native.ts # React Native entry point +├── react-native.ts # App-side entry point ├── rozenite.config.ts # Plugin configuration ├── vite.config.ts # Build configuration ├── package.json # Dependencies and scripts diff --git a/website/src/docs/plugin-development/plugin-development.md b/website/src/docs/plugin-development/plugin-development.md index 6024bb4b..a20a6eaa 100644 --- a/website/src/docs/plugin-development/plugin-development.md +++ b/website/src/docs/plugin-development/plugin-development.md @@ -40,7 +40,7 @@ Your generated plugin has this structure: my-plugin/ ├── src/ │ └── hello-world.tsx # Your DevTools panels -├── react-native.ts # React Native entry point +├── react-native.ts # App-side entry point ├── rozenite.config.ts # Plugin configuration ├── vite.config.ts # Build configuration ├── package.json # Dependencies and scripts @@ -49,7 +49,7 @@ my-plugin/ ## Step 3: Creating Panels -Panels are React components that appear in the DevTools interface, defined in your `rozenite.config.ts` file. Your React Native side can use any React Native API or library, so a panel can integrate as deeply with the runtime as you need. +Panels are React components that appear in the DevTools interface, defined in your `rozenite.config.ts` file. Your app side can use any API or library available in the app, so a panel can integrate as deeply with the runtime as you need. ### Type-safe communication @@ -250,9 +250,9 @@ export default function MyPanel() { } ``` -## Step 4: React Native Integration +## Step 4: App-Side Integration -Add React Native functionality by creating a `react-native.ts` file. You can use React Native APIs and libraries to enhance your plugin: +Add app-side functionality by creating a `react-native.ts` file. The filename is the same on every target Rozenite supports. On React Native you can reach for React Native APIs and libraries: ```typescript title="react-native.ts" import { DevToolsPluginClient } from '@rozenite/plugin-bridge'; @@ -381,7 +381,7 @@ rozenite build This creates optimized bundles: - DevTools panels (minified and optimized) -- React Native entry point (if `react-native.ts` exists) +- App-side entry point (if `react-native.ts` exists) - Ready for distribution ### Build Output @@ -389,7 +389,7 @@ This creates optimized bundles: The build creates a `dist/` directory with: - `*.js` - Individual DevTools panel files (one file per panel, names reflect your config) -- `react-native.js` - React Native integration (if applicable) +- `react-native.js` - app-side integration (if applicable) - `rozenite.json` - Plugin manifest with metadata and configuration - Source maps for debugging diff --git a/website/src/docs/standalone-app.mdx b/website/src/docs/standalone-app.mdx index afae53b1..c7b892f2 100644 --- a/website/src/docs/standalone-app.mdx +++ b/website/src/docs/standalone-app.mdx @@ -6,7 +6,7 @@ import { PackageManagerTabs } from '@rspress/core/theme'; The standalone app is an experiment in alternative DevTools workflows. It may change in future releases. ::: -The standalone Rozenite app runs your plugin panels in their own window instead of inside React Native DevTools. This is useful if you primarily work with Rozenite plugins and want to keep your plugin state intact when your app reloads — instead of losing everything when React Native DevTools tears down its panel on a Fast Refresh or crash. +The standalone Rozenite app runs your plugin panels in their own window instead of inside React Native DevTools. It connects straight to the device, so it gives you the plugins you installed and nothing else. ## Before you start @@ -18,9 +18,13 @@ If you skip this step, `rozenite open` tells you to install it when you run the ## Why use it -React Native DevTools reloads its Rozenite panel whenever your app's JS VM reloads (on a Fast Refresh that touches native code, a crash, or a manual reload). That wipes out any panel state — you're back to the default view every time. +The standalone app is for two situations. -The standalone app keeps your plugins connected through those reloads. Since it connects directly to the device instead of going through React Native DevTools, your plugin panels stay open and preserve their state. This is helpful if you spend most of your debugging time in Rozenite and don't need the full React Native DevTools feature set. +**You mostly use Rozenite.** If your debugging happens in Rozenite panels rather than in React Native DevTools' built-in tools, the standalone app gives you those panels and nothing else — one window, the plugins you installed, no tab to hunt for. + +**You're on another target.** The app connects straight to the device rather than going through React Native DevTools, so it works the same way whichever target you're debugging. + +Connecting directly has a useful side effect: your panels aren't torn down when the app's JS VM reloads, so panel state survives a Fast Refresh, a crash or a manual reload. ## Launching it diff --git a/website/src/docs/targets/_meta.json b/website/src/docs/targets/_meta.json new file mode 100644 index 00000000..e21199a6 --- /dev/null +++ b/website/src/docs/targets/_meta.json @@ -0,0 +1,4 @@ +[ + { "type": "file", "name": "rozenite-for-lynx", "label": "Rozenite for Lynx" }, + { "type": "file", "name": "rozenite-for-web", "label": "Rozenite for Web" } +] diff --git a/website/src/docs/rozenite-for-lynx.mdx b/website/src/docs/targets/rozenite-for-lynx.mdx similarity index 88% rename from website/src/docs/rozenite-for-lynx.mdx rename to website/src/docs/targets/rozenite-for-lynx.mdx index 2d932421..ec380274 100644 --- a/website/src/docs/rozenite-for-lynx.mdx +++ b/website/src/docs/targets/rozenite-for-lynx.mdx @@ -3,7 +3,7 @@ import { PackageManagerTabs } from '@rspress/core/theme'; # Rozenite for Lynx :::warning Experimental -Rozenite for Lynx is experimental. It has been verified against LynxExplorer on the iOS Simulator, the Android emulator, and a physical Android phone over USB. A physical iPhone should work the same way, over DebugRouter's usbmux transport, but that path hasn't been tested yet. It has not been verified across the full range of LynxSDK versions, and the API may change in future releases. +Rozenite for Lynx is experimental. It is developed and tested against rspeedy 0.16 and `@lynx-js/react` 0.125, and has not been verified across the full range of LynxSDK versions. The API may change in future releases. ::: Rozenite for Lynx lets you debug a [Lynx](https://lynxjs.org) app with the same DevTools panels, the same plugin catalogue and the same `rozenite` CLI you use for React Native. @@ -44,7 +44,7 @@ in development: it is inert in production builds (pass `enabled` explicitly if you want to control that yourself), and it never runs at all during `rspeedy build`. -Rozenite plugins are discovered from your project's `package.json` exactly as they are for React Native — install a plugin as a dependency and it shows up. +Rozenite plugins are discovered from your project's `package.json` exactly as they are for React Native — install a plugin as a dependency and it shows up. Not every plugin supports Lynx yet; see [What doesn't work yet](#what-doesnt-work-yet). ## Open DevTools @@ -81,5 +81,5 @@ Note that `enableDesktop` is an iOS Simulator concern only. An Android emulator ## What doesn't work yet -- Plugins whose device half is written against React Native APIs don't work on Lynx: network activity, storage, file system, performance monitor, require profiler and Expo Atlas. Plugins that only move state around do work — Redux DevTools, TanStack Query, React Hook Form, feature flags and controls. -- Only apps DebugRouter can reach are discovered: Android over adb, physical iPhones over USB, and the iOS Simulator over localhost. +- Plugins whose device half is written against React Native APIs don't work on Lynx: network activity, storage, file system, performance monitor, require profiler, Redux DevTools and Expo Atlas. Plugins that only move state around do work — TanStack Query, React Hook Form, feature flags and controls. +- Every plugin declares the targets it supports in its `rozenite.config.ts`, so the list above is the one the plugins themselves agree on. diff --git a/website/src/docs/rozenite-for-web.mdx b/website/src/docs/targets/rozenite-for-web.mdx similarity index 100% rename from website/src/docs/rozenite-for-web.mdx rename to website/src/docs/targets/rozenite-for-web.mdx diff --git a/website/vercel.json b/website/vercel.json index f97a6117..84c0dab0 100644 --- a/website/vercel.json +++ b/website/vercel.json @@ -4,7 +4,24 @@ "cleanUrls": true, "framework": null, "installCommand": "pnpm install", - "rewrites": [{ "source": "/(.*)", "destination": "/404.html" }], + "redirects": [ + { + "source": "/docs/rozenite-for-lynx", + "destination": "/docs/targets/rozenite-for-lynx", + "permanent": true + }, + { + "source": "/docs/rozenite-for-web", + "destination": "/docs/targets/rozenite-for-web", + "permanent": true + } + ], + "rewrites": [ + { + "source": "/(.*)", + "destination": "/404.html" + } + ], "outputDirectory": "build", "trailingSlash": false, "git": { From 08e6c529576154899093ab8ac7acd9a504515f7b Mon Sep 17 00:00:00 2001 From: Szymon Chmal Date: Fri, 4 Sep 2026 08:33:09 +0200 Subject: [PATCH 2/6] docs(website): ship the standalone app capture in a frame The section shipped with a ScreenshotSlot placeholder. The real capture is a raw window grab: it carries macOS traffic lights but no border or shadow, and a dark app screen sitting flush on the page reads as a hole rather than a window. So the section frames it -- hairline, `--rz-radius-surface` with `overflow: hidden` so the capture's square corners take the frame's radius, and a low diffuse shadow with its own dark-mode values, since a light-mode shadow vanishes against a dark ground. Nothing draws chrome the capture already has. Held to 80% of the measure. At full bleed it competed with the hero's screenshot, and holding it back keeps it nearer its native 1280px so it stays crisp on a 2x display. Full width below 560px. --- website/landing/README.md | 23 ++++++++- .../sections/standalone/standalone.module.css | 44 ++++++++++++++++-- .../sections/standalone/standalone.tsx | 14 ++++-- website/src/public/standalone-rozenite.png | Bin 0 -> 171821 bytes 4 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 website/src/public/standalone-rozenite.png diff --git a/website/landing/README.md b/website/landing/README.md index 01fc38db..2e550f91 100644 --- a/website/landing/README.md +++ b/website/landing/README.md @@ -121,5 +121,24 @@ ratio. It draws two endpoints and the link between them, which explains an architecture better than a picture of a panel would. Rozenite for Web uses it. -The standalone app uses `components/screenshot`, because a window is exactly the -thing a screenshot is good at showing and a diagram is not. +Nothing uses `components/screenshot` right now -- the standalone app's capture +landed, which is what the slot is for. Keep it around for the next section that +is drafted before its screenshot exists. + +## Framing a real capture + +The two captures on the page are framed differently on purpose, and the rule is +about what the image already contains rather than about consistency: + +- The hero's `landing-rozenite.png` arrives with its own frame baked in, so the + page adds nothing around it. +- The standalone app's `standalone-rozenite.png` is a raw window capture. It has + macOS traffic lights but no border or shadow, and a dark app screen sitting + flush on the page reads as a hole rather than a window. So the section wraps + it in a hairline, `--rz-radius-surface` with `overflow: hidden` so the + capture's square corners take the frame's radius, and a low, diffuse shadow -- + the page's only elevated surface, with its own dark-mode values because a + light-mode shadow vanishes against a dark ground. + +Never draw chrome the capture already has. If a future capture arrives without +traffic lights, that is a reason to recapture it, not to fake a title bar. diff --git a/website/landing/sections/standalone/standalone.module.css b/website/landing/sections/standalone/standalone.module.css index accdde18..43171d5e 100644 --- a/website/landing/sections/standalone/standalone.module.css +++ b/website/landing/sections/standalone/standalone.module.css @@ -47,8 +47,45 @@ width: min(320px, 100%); } -.shot { - margin-top: 56px; +/* + * The capture is of the real window, so it already carries macOS traffic + * lights. It has no border or shadow of its own, though, and a dark app screen + * sitting flush on the page edge reads as a hole rather than a window -- hence + * the hairline and the lift below. Nothing here draws chrome the capture + * already has. + * + * `--rz-radius-surface` because this is a frame, and `overflow: hidden` so the + * capture's own square corners take the frame's radius. + */ +.frame { + /* 80% of the measure. The capture is a window, not a hero shot -- at full + bleed it competed with the hero's, and holding it back also keeps it + nearer its native 1280px so it stays crisp on a 2x display. */ + width: 80%; + margin: 56px auto 0; + border: 1px solid var(--rz-border); + border-radius: var(--rz-radius-surface); + overflow: hidden; + /* The page has no shadow token; this is its only elevated surface. Kept + soft and low so it reads as a window resting on the page, not a card + floating above it. */ + box-shadow: + 0 1px 2px rgba(23, 22, 26, 0.04), + 0 12px 32px -12px rgba(23, 22, 26, 0.18); + background-color: var(--rz-surface); +} + +:global(html.dark) .frame, +:global([data-theme='dark']) .frame { + box-shadow: + 0 1px 2px rgba(0, 0, 0, 0.3), + 0 16px 40px -16px rgba(0, 0, 0, 0.55); +} + +.image { + display: block; + width: 100%; + height: auto; } @media (max-width: 560px) { @@ -57,7 +94,8 @@ justify-content: space-between; } - .shot { + .frame { + width: 100%; margin-top: 36px; } } diff --git a/website/landing/sections/standalone/standalone.tsx b/website/landing/sections/standalone/standalone.tsx index a14c677f..7569818e 100644 --- a/website/landing/sections/standalone/standalone.tsx +++ b/website/landing/sections/standalone/standalone.tsx @@ -1,7 +1,6 @@ import { ActionButton } from '../../components/action-button/action-button'; import { CommandLine } from '../../components/command-line/command-line'; import { Reveal } from '../../components/reveal/reveal'; -import { ScreenshotSlot } from '../../components/screenshot/screenshot'; import { Section } from '../../components/section/section'; import styles from './standalone.module.css'; @@ -31,10 +30,15 @@ export const Standalone = () => ( - +
+ The Rozenite standalone app in its own window, showing the File System panel browsing an iOS app's Library directory with a PNG previewed. +
); diff --git a/website/src/public/standalone-rozenite.png b/website/src/public/standalone-rozenite.png new file mode 100644 index 0000000000000000000000000000000000000000..9ce39f29e1327f0d62eddb353fb80e404eb13f1a GIT binary patch literal 171821 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�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 X)Drmk{n6EY1|aZs^>bP0l+XkKHB>cY literal 0 HcmV?d00001 From 30739d7ed875bd34e1042f162a7feb91846ea427 Mon Sep 17 00:00:00 2001 From: Szymon Chmal Date: Fri, 4 Sep 2026 08:41:56 +0200 Subject: [PATCH 3/6] feat(website): make the animated Rozenite mark the hero visual Replaces the DevTools screenshot in the hero with `RozeniteLoader` from @rozenite/ui -- a Bayer-dithered light field masked to the Rozenite silhouette. Three details that are easy to get wrong: - It is imported from the workspace source through a single module in `landing/components`. @rozenite/ui exports only its barrel and declares no `sideEffects: false`, so importing through the package entry point would pull Base UI, TanStack Table and Virtuoso into a static docs bundle for one canvas. The website is never published, only bundled, so it reads the source directly and @rozenite/ui stays untouched. - The component is a loading spinner by origin, defaulting to `role="status"` with a "Loading" label. Here it is decorative, so it passes `label=""` rather than announcing that a settled page is loading. - Canvas cannot read CSS, so `fillStyle = 'var(--rz-accent)'` is silently ignored and paints black. `useTokenColor` resolves the token and re-resolves it when the theme flips. `landing-rozenite.png` is now imported by nothing and so emitted by no build. It is left in the tree in case the hero ever wants a product shot back. --- website/landing/README.md | 63 +++++++--- .../rozenite-loader/rozenite-loader.tsx | 21 ++++ .../use-token-color/use-token-color.tsx | 51 ++++++++ website/landing/sections/hero/hero.module.css | 8 +- website/landing/sections/hero/hero.tsx | 109 ++++++++++-------- 5 files changed, 185 insertions(+), 67 deletions(-) create mode 100644 website/landing/components/rozenite-loader/rozenite-loader.tsx create mode 100644 website/landing/components/use-token-color/use-token-color.tsx diff --git a/website/landing/README.md b/website/landing/README.md index 2e550f91..168812e2 100644 --- a/website/landing/README.md +++ b/website/landing/README.md @@ -91,7 +91,7 @@ These came out of a design review and are easy to break by accident: ## Motion -Two effects, and adding a third needs an argument. +Three effects, and adding a fourth needs an argument. `components/reveal` is a fade and lift as a block enters the viewport, so a section's header lands before its content. It is built on CSS scroll-driven @@ -101,8 +101,9 @@ state, and the animation only attaches inside `prefers-reduced-motion: no-preference`. `components/connection-diagram` runs two dots along the link between its -endpoints. This is the one looping animation on the page, and it is there -because the subject is traffic and a still line cannot show a direction. Same +endpoints. It is there because the subject is traffic and a still line cannot +show a direction. The hero's animated mark is the only other loop -- see +[The animated mark](#the-animated-mark) -- and a third would need an argument. Same progressive-enhancement shape: without `prefers-reduced-motion: no-preference` the dots simply sit on the line. @@ -127,18 +128,52 @@ is drafted before its screenshot exists. ## Framing a real capture -The two captures on the page are framed differently on purpose, and the rule is -about what the image already contains rather than about consistency: +The page has one product capture, and how it is framed follows from what the +image already contains rather than from a house style. -- The hero's `landing-rozenite.png` arrives with its own frame baked in, so the - page adds nothing around it. -- The standalone app's `standalone-rozenite.png` is a raw window capture. It has - macOS traffic lights but no border or shadow, and a dark app screen sitting - flush on the page reads as a hole rather than a window. So the section wraps - it in a hairline, `--rz-radius-surface` with `overflow: hidden` so the - capture's square corners take the frame's radius, and a low, diffuse shadow -- - the page's only elevated surface, with its own dark-mode values because a - light-mode shadow vanishes against a dark ground. +`standalone-rozenite.png` is a raw window grab. It has macOS traffic lights but +no border or shadow, and a dark app screen sitting flush on the page reads as a +hole rather than a window. So the section wraps it in a hairline, +`--rz-radius-surface` with `overflow: hidden` so the capture's square corners +take the frame's radius, and a low, diffuse shadow -- the page's only elevated +surface, with its own dark-mode values because a light-mode shadow vanishes +against a dark ground. It is held to 80% of the measure, which also keeps it +near its native 1280px so it stays reasonably crisp on a 2x display. Never draw chrome the capture already has. If a future capture arrives without traffic lights, that is a reason to recapture it, not to fake a title bar. + +`website/landing-rozenite.png` is the hero's old DevTools screenshot. Nothing +imports it since the hero became the animated mark, so it is emitted by no +build; it is kept only in case the hero ever wants a product shot back. + +## The animated mark + +The hero visual is `RozeniteLoader` from `@rozenite/ui` -- a Bayer-dithered +light field masked to the Rozenite silhouette. + +Three things about it are deliberate and easy to undo by accident: + +- **It is imported from the workspace source**, through + `components/rozenite-loader`, which is the only file in `landing/` that + reaches outside the website. `@rozenite/ui` exports only its barrel and + declares no `sideEffects: false`, so going through the package entry point + would pull Base UI, TanStack Table and Virtuoso into a static docs bundle for + one canvas. The website is never published, only bundled, so it can read the + source directly and leave `@rozenite/ui` untouched. Keep the deep path in that + one module. +- **It is decorative, so it passes `label=""`.** The component is a loading + spinner by origin and defaults to `role="status"` with a "Loading" label; + announcing that on a page which is not loading would be a lie. +- **Its colour comes from `useTokenColor`, not a constant.** Canvas cannot read + CSS, so `fillStyle = 'var(--rz-accent)'` is silently ignored and paints black. + The hook resolves the token and re-resolves it when the theme flips. + +`cols` is the grain: higher means more, smaller cells. Past roughly 60 the +silhouette stops reading as the logo and turns into haze, so treat that as the +ceiling rather than a dial to keep turning. + +This is the page's second looping animation, after `connection-diagram`. Like +that one it is pure progressive enhancement -- it draws a single static frame +under `prefers-reduced-motion`, and pauses itself when the tab is hidden or the +canvas scrolls out of view. diff --git a/website/landing/components/rozenite-loader/rozenite-loader.tsx b/website/landing/components/rozenite-loader/rozenite-loader.tsx new file mode 100644 index 00000000..e4b05eb4 --- /dev/null +++ b/website/landing/components/rozenite-loader/rozenite-loader.tsx @@ -0,0 +1,21 @@ +/* + * The one file in `landing/` that reaches outside the website. + * + * `@rozenite/ui` exports only its barrel, and declares no `sideEffects: false`, + * so importing the loader through the package entry point would pull Base UI, + * TanStack Table, Virtuoso and lucide-react into a static docs bundle for the + * sake of one canvas. The loader itself depends on nothing but React. + * + * The website is never published -- it is only ever bundled -- so it can import + * the workspace source directly and skip the package's export map entirely. + * That keeps `@rozenite/ui` unchanged and keeps a single source of truth for + * the animation. + * + * The deep path lives here and nowhere else: sections import from this module, + * so if the package ever grows a `./rozenite-loader` subpath export, this file + * is the only one that changes. + */ +export { + RozeniteLoader, + type RozeniteLoaderProps, +} from '../../../../packages/ui/src/rozenite-loader/rozenite-loader'; diff --git a/website/landing/components/use-token-color/use-token-color.tsx b/website/landing/components/use-token-color/use-token-color.tsx new file mode 100644 index 00000000..ecbc5681 --- /dev/null +++ b/website/landing/components/use-token-color/use-token-color.tsx @@ -0,0 +1,51 @@ +import { useEffect, useState, type RefObject } from 'react'; + +/** + * Resolves a `--rz-*` token to the concrete colour it currently holds. + * + * Canvas cannot read CSS: `ctx.fillStyle = 'var(--rz-accent)'` is invalid and + * is silently ignored, leaving whatever was set before it. So anything drawing + * to a canvas has to be handed a real colour, and be handed a new one when the + * theme flips. + * + * Returns `fallback` until the first measurement, which matters during SSG -- + * Rspress renders these components on the server, where there is no computed + * style to read. + */ +export const useTokenColor = ( + ref: RefObject, + token: string, + fallback: string, +): string => { + const [color, setColor] = useState(fallback); + + useEffect(() => { + const element = ref.current; + + if (!element) { + return; + } + + const read = () => { + const value = getComputedStyle(element).getPropertyValue(token).trim(); + + if (value) { + setColor(value); + } + }; + + read(); + + // Both are in play: Rspress toggles `html.dark`, and the token file also + // honours `[data-theme]`. + const observer = new MutationObserver(read); + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['class', 'data-theme'], + }); + + return () => observer.disconnect(); + }, [ref, token]); + + return color; +}; diff --git a/website/landing/sections/hero/hero.module.css b/website/landing/sections/hero/hero.module.css index d6b1ec81..5e3de725 100644 --- a/website/landing/sections/hero/hero.module.css +++ b/website/landing/sections/hero/hero.module.css @@ -146,11 +146,9 @@ html.dark .wash, .visual { min-width: 0; -} - -.screenshot { - width: 100%; - height: auto; + display: flex; + align-items: center; + justify-content: center; } @media (max-width: 1024px) { diff --git a/website/landing/sections/hero/hero.tsx b/website/landing/sections/hero/hero.tsx index 34dbdde3..71bb8185 100644 --- a/website/landing/sections/hero/hero.tsx +++ b/website/landing/sections/hero/hero.tsx @@ -1,60 +1,73 @@ +import { useRef } from 'react'; import { GridFour } from '@phosphor-icons/react'; -import landingRozenite from '../../../landing-rozenite.png'; import { ActionButton } from '../../components/action-button/action-button'; import { CommandLine } from '../../components/command-line/command-line'; +import { RozeniteLoader } from '../../components/rozenite-loader/rozenite-loader'; +import { useTokenColor } from '../../components/use-token-color/use-token-color'; import styles from './hero.module.css'; const TARGETS = ['React Native', 'Expo', 'Re.Pack', 'React Native Web', 'Lynx']; -export const Hero = () => ( -
-
+ ); +}; From 6c78a08dd143675b509f6185a101491c8d8f0967 Mon Sep 17 00:00:00 2001 From: Szymon Chmal Date: Fri, 4 Sep 2026 08:45:08 +0200 Subject: [PATCH 4/6] refactor(website): centre the hero on the animated mark The hero was a text-and-visual split: wordmark and copy on the left, a product shot on the right. With the mark as the visual it was carrying two Rozenite logos above the fold, and the split had nothing left to hold apart. Now it is one centred column -- mark, headline, lead, targets, actions, install -- and the static wordmark is gone, since the site navigation already carries one. The headline gets the full measure, so each of its two claims lands on one line at desktop width. The mark is sized in JS because the canvas takes its size as a number rather than from CSS. At the desktop size it pushed "Get started" past the fold on an 812px phone, so a narrow pair kicks in under 720px, with the grain scaled to match -- too fine for the height and the silhouette stops reading as the logo. --- website/landing/README.md | 29 +++-- website/landing/sections/hero/hero.module.css | 64 +++------- website/landing/sections/hero/hero.tsx | 113 +++++++++++------- 3 files changed, 108 insertions(+), 98 deletions(-) diff --git a/website/landing/README.md b/website/landing/README.md index 168812e2..d491bde8 100644 --- a/website/landing/README.md +++ b/website/landing/README.md @@ -51,7 +51,9 @@ Three rules are worth knowing before adding anything: section means retinting its neighbours, not breaking the run. - **The hero owns the first screen.** It is `min-height: calc(100dvh - var(--rz-nav-height))`. If the host navigation changes height, retune that - token rather than the section. + token rather than the section. Everything down to the install command has to + fit above the fold at 1440x900 and on a 812px-tall phone -- the mark is sized + in JS partly to keep that true, so check both after changing it. ## Conventions the page holds to @@ -66,10 +68,12 @@ These came out of a design review and are easy to break by accident: - **Section headers stack.** Eyebrow, headline, body, in one column. Rozenite for Agents is the one exception: it pairs its header with the terminal sample on the same line, and takes `className` to drop its stacking margin. -- **No layout family repeats.** Hero and Rozenite for Web are the only - text-and-visual splits, and they are not adjacent. Everything else uses a - different composition: Lynx is the page's only ordered rail, and the - standalone app is the only centred header over a full-width figure. +- **No layout family repeats.** Rozenite for Web is the only text-and-visual + split. Everything else uses a different composition: the hero is a centred + stack, Lynx is the page's only ordered rail, and the standalone app is the + only centred header over a full-width figure. The hero and the standalone app + both centre, but they are the two ends of the page and hold nothing else in + common -- one is type over a mark, the other is a caption over a screenshot. - **Icons come from a library.** `@phosphor-icons/react` for UI glyphs, `simple-icons` for brand marks via `components/brand-mark`. Nothing is drawn by hand. Brand marks render in `currentColor`, never in the brand hex, so a @@ -150,7 +154,10 @@ build; it is kept only in case the hero ever wants a product shot back. ## The animated mark The hero visual is `RozeniteLoader` from `@rozenite/ui` -- a Bayer-dithered -light field masked to the Rozenite silhouette. +light field masked to the Rozenite silhouette. It leads the hero's centred +stack, and it replaced the static wordmark that used to sit there: the site +navigation already carries one, and two Rozenite logos above the fold was one +too many. Three things about it are deliberate and easy to undo by accident: @@ -169,9 +176,13 @@ Three things about it are deliberate and easy to undo by accident: CSS, so `fillStyle = 'var(--rz-accent)'` is silently ignored and paints black. The hook resolves the token and re-resolves it when the theme flips. -`cols` is the grain: higher means more, smaller cells. Past roughly 60 the -silhouette stops reading as the logo and turns into haze, so treat that as the -ceiling rather than a dial to keep turning. +`cols` is the grain: higher means more, smaller cells, and it has to be tuned +against `size` rather than set once. Too fine for the height and the silhouette +stops reading as the logo and turns into haze; the pairs in `hero.tsx` are the +two that were checked. Both live in JS because the canvas takes its size as a +number, so this cannot be a media query in the stylesheet -- which is also why +the narrow pair exists at all: at the full size the mark pushed "Get started" +past the fold on a phone. This is the page's second looping animation, after `connection-diagram`. Like that one it is pure progressive enhancement -- it draws a single static frame diff --git a/website/landing/sections/hero/hero.module.css b/website/landing/sections/hero/hero.module.css index 5e3de725..5c364135 100644 --- a/website/landing/sections/hero/hero.module.css +++ b/website/landing/sections/hero/hero.module.css @@ -33,49 +33,22 @@ html.dark .wash, radial-gradient(ellipse 50vw 32vw at 4% 40%, rgba(140, 74, 255, 0.14) 0%, transparent 60%); } +/* + * One centred column: the mark leads, everything else stacks under it. The + * hero used to be a text-and-visual split, which meant a wordmark on the left + * and a product shot on the right; the animated mark does the work of both, so + * the split had nothing left to hold apart. + */ .container { position: relative; width: 100%; max-width: var(--rz-max-width); margin-inline: auto; padding-inline: var(--rz-gutter); - display: grid; - grid-template-columns: minmax(0, 1.02fr) minmax(0, 1fr); - gap: 48px; - align-items: center; -} - -.copy { display: flex; flex-direction: column; - align-items: flex-start; -} - -.logo { - width: 172.5px; - height: 32px; - margin-bottom: 24px; -} - -.logoLight, -.logoDark { - display: block; - width: 100%; - height: 100%; -} - -.logoDark { - display: none; -} - -:global(html.dark) .logoLight, -:global([data-theme='dark']) .logoLight { - display: none; -} - -:global(html.dark) .logoDark, -:global([data-theme='dark']) .logoDark { - display: block; + align-items: center; + text-align: center; } .title { @@ -102,8 +75,8 @@ html.dark .wash, } .lead { - margin: 24px 0 0; - max-width: 46ch; + margin: 24px auto 0; + max-width: 56ch; font-size: clamp(1rem, 0.95rem + 0.28vw, 1.125rem); --rz-lh: 1.6; color: var(--rz-text-secondary); @@ -114,6 +87,7 @@ html.dark .wash, .targets { display: flex; flex-wrap: wrap; + justify-content: center; gap: 8px; margin: 20px 0 0; padding: 0; @@ -135,6 +109,7 @@ html.dark .wash, .actions { display: flex; flex-wrap: wrap; + justify-content: center; gap: 12px; margin-top: 32px; } @@ -142,23 +117,18 @@ html.dark .wash, .install { width: min(400px, 100%); margin-top: 16px; + text-align: left; } .visual { - min-width: 0; display: flex; - align-items: center; justify-content: center; + margin-bottom: 28px; } -@media (max-width: 1024px) { - .container { - grid-template-columns: minmax(0, 1fr); - gap: 44px; - } - - .copy { - max-width: 680px; +@media (max-width: 720px) { + .visual { + margin-bottom: 20px; } } diff --git a/website/landing/sections/hero/hero.tsx b/website/landing/sections/hero/hero.tsx index 71bb8185..08eac175 100644 --- a/website/landing/sections/hero/hero.tsx +++ b/website/landing/sections/hero/hero.tsx @@ -1,4 +1,4 @@ -import { useRef } from 'react'; +import { useEffect, useRef, useState } from 'react'; import { GridFour } from '@phosphor-icons/react'; import { ActionButton } from '../../components/action-button/action-button'; @@ -9,8 +9,38 @@ import styles from './hero.module.css'; const TARGETS = ['React Native', 'Expo', 'Re.Pack', 'React Native Web', 'Lynx']; +/** Height in px, then grid cells across. Grain has to shrink with the mark, or + * the silhouette stops reading as the logo and turns into haze. */ +const MARK_WIDE = { size: 260, cols: 30 }; +const MARK_NARROW = { size: 176, cols: 22 }; + +/** + * The canvas takes its size as a number, so this cannot be a media query in + * the stylesheet. At the full size the mark pushes "Get started" past the fold + * on a phone, which is the one thing the hero must not do. + * + * Starts wide so server-rendered markup matches the desktop first paint, and + * settles on the real value in an effect. + */ +const useMarkSize = () => { + const [mark, setMark] = useState(MARK_WIDE); + + useEffect(() => { + const query = window.matchMedia('(max-width: 720px)'); + const apply = () => setMark(query.matches ? MARK_NARROW : MARK_WIDE); + + apply(); + query.addEventListener('change', apply); + + return () => query.removeEventListener('change', apply); + }, []); + + return mark; +}; + export const Hero = () => { const visualRef = useRef(null); + const mark = useMarkSize(); // The dark value, because the site renders dark by default -- so the first // painted frame is already the right colour rather than flashing the light // accent on the way through. @@ -20,53 +50,52 @@ export const Hero = () => {
); From 0bc9c6e5e2cfcf9ce0794ab9e7d7b2e492c1cf20 Mon Sep 17 00:00:00 2001 From: Szymon Chmal Date: Fri, 4 Sep 2026 08:47:35 +0200 Subject: [PATCH 5/6] style(website): take the hero mark to a fine grain Roughly doubles the cell density: 30 to 56 cols at the desktop size, 22 to 38 at the narrow one. 56 is about as fine as this size survives. The loader insets every cell by `max(0.6, s * 0.09)` device px, so once cells approach 2 device px that fixed floor is most of the cell, the squares fall below a pixel and the mark washes out -- 88 cols does exactly that on a 1x display. The floor is in device pixels, so the same `cols` reads twice as solid at 2x as at 1x; both were checked. Noted in the landing README so the next person does not rediscover it by turning the dial. --- website/landing/README.md | 16 +++++++++++++--- website/landing/sections/hero/hero.tsx | 4 ++-- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/website/landing/README.md b/website/landing/README.md index d491bde8..90085db9 100644 --- a/website/landing/README.md +++ b/website/landing/README.md @@ -177,9 +177,19 @@ Three things about it are deliberate and easy to undo by accident: The hook resolves the token and re-resolves it when the theme flips. `cols` is the grain: higher means more, smaller cells, and it has to be tuned -against `size` rather than set once. Too fine for the height and the silhouette -stops reading as the logo and turns into haze; the pairs in `hero.tsx` are the -two that were checked. Both live in JS because the canvas takes its size as a +against `size` rather than set once. The pairs in `hero.tsx` are the two that +were checked. + +There is a hard ceiling on how fine it can go, and it is worth knowing before +turning the dial. The loader lays out cells of `s = width / cols` device pixels +and insets each one by `gap = max(0.6, s * 0.09)`. Once `s` drops near 2 device +px that fixed 0.6 floor is most of the cell, so the squares fall below a pixel +and the whole mark washes out to a smudge -- at `cols: 88` and `size: 260` it +does exactly that on a 1x display. Because the floor is in device pixels, the +same `cols` also looks twice as solid on a 2x screen as on a 1x one, so check +both. `cols: 56` is about as fine as this size survives on a 1x display. Going +finer than that means changing the `gap` formula in `@rozenite/ui`, not the +props. Both live in JS because the canvas takes its size as a number, so this cannot be a media query in the stylesheet -- which is also why the narrow pair exists at all: at the full size the mark pushed "Get started" past the fold on a phone. diff --git a/website/landing/sections/hero/hero.tsx b/website/landing/sections/hero/hero.tsx index 08eac175..a59e645b 100644 --- a/website/landing/sections/hero/hero.tsx +++ b/website/landing/sections/hero/hero.tsx @@ -11,8 +11,8 @@ const TARGETS = ['React Native', 'Expo', 'Re.Pack', 'React Native Web', 'Lynx']; /** Height in px, then grid cells across. Grain has to shrink with the mark, or * the silhouette stops reading as the logo and turns into haze. */ -const MARK_WIDE = { size: 260, cols: 30 }; -const MARK_NARROW = { size: 176, cols: 22 }; +const MARK_WIDE = { size: 260, cols: 50 }; +const MARK_NARROW = { size: 176, cols: 40 }; /** * The canvas takes its size as a number, so this cannot be a media query in From 25364a4f3ea3a6ef445fab3a55afa2c5844dac36 Mon Sep 17 00:00:00 2001 From: Szymon Chmal Date: Fri, 4 Sep 2026 10:15:07 +0200 Subject: [PATCH 6/6] docs(website): cut implementation notes out of the landing README The landing README documents the page's design conventions. The animated mark section documented a component's props instead, and every claim in it was already a comment on the code it described -- the workspace import in `components/rozenite-loader`, `label=""` and `useTokenColor` in `hero.tsx`, the size/grain pairing on the constants themselves. A second copy only drifts, and it already had: it named a `cols` value the code no longer used. It also stated a density ceiling measured on a 1x display as though it were general, when the floor it described is in device pixels and so sits twice as high on a 2x screen. Drops the section, keeps the one page-level fact in `## Motion` where the other two loops are already counted, and trims the same duplication out of the capture and brand-mark notes -- both now point at the file that carries the reasoning. The 1x/2x caveat moves to the constants it constrains. --- website/landing/README.md | 84 +++++--------------------- website/landing/sections/hero/hero.tsx | 8 ++- 2 files changed, 20 insertions(+), 72 deletions(-) diff --git a/website/landing/README.md b/website/landing/README.md index 90085db9..4e9a106c 100644 --- a/website/landing/README.md +++ b/website/landing/README.md @@ -52,8 +52,8 @@ Three rules are worth knowing before adding anything: - **The hero owns the first screen.** It is `min-height: calc(100dvh - var(--rz-nav-height))`. If the host navigation changes height, retune that token rather than the section. Everything down to the install command has to - fit above the fold at 1440x900 and on a 812px-tall phone -- the mark is sized - in JS partly to keep that true, so check both after changing it. + fit above the fold, on a laptop and on a phone. Check both after changing + anything in it. ## Conventions the page holds to @@ -79,15 +79,9 @@ These came out of a design review and are easy to break by accident: by hand. Brand marks render in `currentColor`, never in the brand hex, so a logo cannot smuggle a second accent onto the page. - The Lynx mark is the one exception to "from a library": `simple-icons` has no - Lynx entry, so its two paths are vendored into `components/brand-mark` from - lynxjs.org's own header -- vendored rather than hotlinked, so the page pulls - nothing from a third-party CDN. It is ByteDance/TikTok's mark, used - nominatively to identify the project Rozenite integrates with. The Lynx - repositories are Apache-2.0, whose section 6 grants no trademark rights, so - this rests on nominative use rather than on the licence. `currentColor` is - part of that: the mark identifies, it does not imply endorsement. Vendor - another mark only on the same terms. + The Lynx mark is the one exception: `simple-icons` has no Lynx entry, so its + paths are vendored into `components/brand-mark`, which carries the provenance + and the licensing reasoning. Vendor another mark only on the same terms. - **Grids have no empty cells.** The plugin grid shows `FEATURED_PLUGINS`, six of the fourteen, which divides evenly at three, two and one column. The rest are counted in a line of copy underneath rather than drawn. Keep the featured @@ -106,10 +100,12 @@ state, and the animation only attaches inside `components/connection-diagram` runs two dots along the link between its endpoints. It is there because the subject is traffic and a still line cannot -show a direction. The hero's animated mark is the only other loop -- see -[The animated mark](#the-animated-mark) -- and a third would need an argument. Same -progressive-enhancement shape: without `prefers-reduced-motion: no-preference` -the dots simply sit on the line. +show a direction. Same progressive-enhancement shape: without +`prefers-reduced-motion: no-preference` the dots simply sit on the line. + +The hero's animated mark is the third. It is a canvas rather than CSS, so its +rules live in `sections/hero/hero.tsx`; like the other two it degrades to a +single static frame under `prefers-reduced-motion`. Everything else is hover, focus and `:active` feedback. @@ -135,14 +131,10 @@ is drafted before its screenshot exists. The page has one product capture, and how it is framed follows from what the image already contains rather than from a house style. -`standalone-rozenite.png` is a raw window grab. It has macOS traffic lights but +`standalone-rozenite.png` is a raw window grab: it has macOS traffic lights but no border or shadow, and a dark app screen sitting flush on the page reads as a -hole rather than a window. So the section wraps it in a hairline, -`--rz-radius-surface` with `overflow: hidden` so the capture's square corners -take the frame's radius, and a low, diffuse shadow -- the page's only elevated -surface, with its own dark-mode values because a light-mode shadow vanishes -against a dark ground. It is held to 80% of the measure, which also keeps it -near its native 1280px so it stays reasonably crisp on a 2x display. +hole rather than a window. So the section frames it, and that frame is the +page's only elevated surface. See `sections/standalone/standalone.module.css`. Never draw chrome the capture already has. If a future capture arrives without traffic lights, that is a reason to recapture it, not to fake a title bar. @@ -150,51 +142,3 @@ traffic lights, that is a reason to recapture it, not to fake a title bar. `website/landing-rozenite.png` is the hero's old DevTools screenshot. Nothing imports it since the hero became the animated mark, so it is emitted by no build; it is kept only in case the hero ever wants a product shot back. - -## The animated mark - -The hero visual is `RozeniteLoader` from `@rozenite/ui` -- a Bayer-dithered -light field masked to the Rozenite silhouette. It leads the hero's centred -stack, and it replaced the static wordmark that used to sit there: the site -navigation already carries one, and two Rozenite logos above the fold was one -too many. - -Three things about it are deliberate and easy to undo by accident: - -- **It is imported from the workspace source**, through - `components/rozenite-loader`, which is the only file in `landing/` that - reaches outside the website. `@rozenite/ui` exports only its barrel and - declares no `sideEffects: false`, so going through the package entry point - would pull Base UI, TanStack Table and Virtuoso into a static docs bundle for - one canvas. The website is never published, only bundled, so it can read the - source directly and leave `@rozenite/ui` untouched. Keep the deep path in that - one module. -- **It is decorative, so it passes `label=""`.** The component is a loading - spinner by origin and defaults to `role="status"` with a "Loading" label; - announcing that on a page which is not loading would be a lie. -- **Its colour comes from `useTokenColor`, not a constant.** Canvas cannot read - CSS, so `fillStyle = 'var(--rz-accent)'` is silently ignored and paints black. - The hook resolves the token and re-resolves it when the theme flips. - -`cols` is the grain: higher means more, smaller cells, and it has to be tuned -against `size` rather than set once. The pairs in `hero.tsx` are the two that -were checked. - -There is a hard ceiling on how fine it can go, and it is worth knowing before -turning the dial. The loader lays out cells of `s = width / cols` device pixels -and insets each one by `gap = max(0.6, s * 0.09)`. Once `s` drops near 2 device -px that fixed 0.6 floor is most of the cell, so the squares fall below a pixel -and the whole mark washes out to a smudge -- at `cols: 88` and `size: 260` it -does exactly that on a 1x display. Because the floor is in device pixels, the -same `cols` also looks twice as solid on a 2x screen as on a 1x one, so check -both. `cols: 56` is about as fine as this size survives on a 1x display. Going -finer than that means changing the `gap` formula in `@rozenite/ui`, not the -props. Both live in JS because the canvas takes its size as a -number, so this cannot be a media query in the stylesheet -- which is also why -the narrow pair exists at all: at the full size the mark pushed "Get started" -past the fold on a phone. - -This is the page's second looping animation, after `connection-diagram`. Like -that one it is pure progressive enhancement -- it draws a single static frame -under `prefers-reduced-motion`, and pauses itself when the tab is hidden or the -canvas scrolls out of view. diff --git a/website/landing/sections/hero/hero.tsx b/website/landing/sections/hero/hero.tsx index a59e645b..21bc55c7 100644 --- a/website/landing/sections/hero/hero.tsx +++ b/website/landing/sections/hero/hero.tsx @@ -9,8 +9,12 @@ import styles from './hero.module.css'; const TARGETS = ['React Native', 'Expo', 'Re.Pack', 'React Native Web', 'Lynx']; -/** Height in px, then grid cells across. Grain has to shrink with the mark, or - * the silhouette stops reading as the logo and turns into haze. */ +/** + * Height in px, then grid cells across. Grain has to shrink with the mark, or + * the silhouette stops reading as the logo and turns into haze -- and it goes + * to haze sooner on a 1x display than a 2x one, because the loader insets each + * cell by a fixed minimum in device pixels. Check both before raising `cols`. + */ const MARK_WIDE = { size: 260, cols: 50 }; const MARK_NARROW = { size: 176, cols: 40 };