Skip to content

[pull] main from expo:main#868

Merged
pull[bot] merged 15 commits into
code:mainfrom
expo:main
May 15, 2026
Merged

[pull] main from expo:main#868
pull[bot] merged 15 commits into
code:mainfrom
expo:main

Conversation

@pull

@pull pull Bot commented May 15, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

tsapeta and others added 15 commits May 15, 2026 11:57
# Why

To prevent high memory usage as recreating `JSContext` and loading whole
bundle on each rerender is pretty expensive.

# How

Refactored rendering to use a shared JSC runtime instead of creating a
new `JSContext` for every widget/live activity render or widget button
interaction.

This adds a shared `WidgetsJSRuntime` that:
- Contains shared `JSContext`
- Loads the ExpoWidgets JS bundle once
- Caches evaluated layout functions by layout string

# Test Plan

Widgets and live activities should work as before (but faster)

# Checklist

- [x] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [x] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [x] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

Resolves ENG-11381

<!--
Please describe the motivation for this PR, and link to relevant GitHub
issues, forums posts, or feature requests.
-->

# How

Link to https://docs.expo.dev/workflow/ios-simulator/#troubleshooting
when opening iOS simulator errors.

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

Unit test.

<!--
Please describe how you tested this change and how a reviewer could
reproduce your test, especially if this PR does not include automated
tests! If possible, please also provide terminal output and/or
screenshots demonstrating your test/reproduction.
-->

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
)

# Why


https://linear.app/expo/issue/ENG-21273/fix-android-crash-in-frameratemonitor

# How

Change `mutableListOf` to `CopyOnWriteArrayList` - the recorders array
is not muted often.

# Test Plan

1. CI - added concurrent access test
2. ObserveTester

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
# Why

The banner gates rendering on a post-hydration `localStorage` read, so
it pops in late and instantly shoves the page down. Same on dismiss in
reverse.


https://github.com/user-attachments/assets/c86e8d44-86ec-48aa-b8bf-6f08962b1770

# How

CSS `grid-template-rows: 0fr → 1fr` transition — pure CSS, no JS
measurement.

- After hydration, render at `grid-rows-[0fr]`, flip to `1fr` on the
next frame (`requestAnimationFrame`) so the browser actually
interpolates.
- Inner `min-h-0 overflow-hidden` so the grid item collapses below
content size; `mb-6` moves inside so the margin animates with the
height.
- Entrance is sequenced: 250ms delay → 350ms height → 250ms opacity
(starts at 600ms). Dismiss is 400ms simultaneous and `onTransitionEnd`
commits the `localStorage` flag once the collapse finishes.
- `motion-reduce:transition-none` for `prefers-reduced-motion`.

# Test Plan

- Hard reload — banner expands smoothly, content fades in after the
height settles.
- Click X — collapses smoothly, stays dismissed across reloads.
- Reduced motion — entrance and dismiss are instant.
- Light/dark themes and `max-md-gutters` / `max-sm-gutters` breakpoints.


https://github.com/user-attachments/assets/fc00b04b-ec42-4dbe-8816-23253661e0c4
## Why

Tailwind v3 leftovers in the docs codebase, plus the Next.js and
styleguide bumps that depend on them. Folds in #45612.

## How

- **Gutters → standard breakpoints.** `max-{sm,md,lg,xl,2xl}-gutters:` →
`max-{sm,md,lg,xl,2xl}:`, `lg-gutters:` → `lg:` across 47 files. Drop
the `max-md-gutters:` ignore from `eslint.config.mjs`. Fix
`max-md-gutters::flex-col` typo in `Authentication/Box.tsx`.
`.diff-code`: `word-break` → `overflow-wrap`. Snapshot updated.
- **Next.js 16.2.3 → 16.2.6.** Static-export build-trace patch
regenerated against new line numbers; patched conditions unchanged.
- **Styleguide bump.** `@expo/styleguide` 14.1.3→14.1.5,
`@expo/styleguide-icons` 4.2.3→4.2.4 (now dual ESM/CJS, no more Jest
mocks under `--experimental-vm-modules`), `@expo/styleguide-search-ui`
9.1.3→9.1.6 (CMD+K flicker fix). Add `transformIgnorePatterns:
['\\.mjs$']` so `next/jest` SWC stops rewriting native ESM. Two
snapshots refreshed for upstream Figma glyph updates.
- **Drop `@custom-variant max-{sm,md,lg,xl,2xl}` compat block** from
`tailwind-compat.css`. 14.1.5 dropped its v3 `screens` block, so v4
registers the standard min/max variants natively.
- **Preserve gutter widths via local `screens` override.** Add `screens:
{ sm: 468, md: 788, lg: 1008, xl: 1328, 2xl: 1572 }` to
`tailwind.config.cjs`. Without it, `max-{breakpoint}:` would resolve to
TW4 defaults (640/768/1024/1280/1536), most noticeably widening
`max-sm:` from 468px to 640px. Same pattern universe uses
(`server/website`, `server/internal`).
- **Fix misplaced `!` in arbitrary values.** `leading-[100!%]` →
`leading-[100%]!`, `text-[90!%]` → `text-[90%]!` (3 files). Leftovers
from the v3→v4 important-syntax flip; TW4 was emitting `line-height:
100!%` / `color: 90!%` and triggering CSS-optimizer warnings.

## Test Plan

- [x] `pnpm lint`, `pnpm format`, `pnpm test` (337/337)
- [x] `pnpm dev`, CMD+K opens without flicker
- [ ] Sidebar, Footer at mobile and tablet
- [ ] Home grid sections behave at the original gutter breakpoints
- [ ] Search dialog mobile layout
- [ ] `.diff-code` long-line wrapping
# Why

There is some left over code on Android:
- DB entries no longer need to extend `Record`
- Some functions are unused on DAO


Additionally the `getStoredEntries` function is only used in the
observe-tester app, and blocks removal of some of the expo-modules-core
annotations from entries. On iOS it fallbacks to `[]` anyway

# How

<!--
How did you build this feature or fix this bug and why?
-->

# Test Plan

1. CI
2. Observe tester

# Checklist

<!--
Please check the appropriate items below if they apply to your diff.
-->

- [ ] I added a `changelog.md` entry and rebuilt the package sources
according to [this short
guide](https://github.com/expo/expo/blob/main/CONTRIBUTING.md#-before-submitting)
- [ ] This diff will work correctly for `npx expo prebuild` & EAS Build
(eg: updated a module plugin).
- [ ] Conforms with the [Documentation Writing Style
Guide](https://github.com/expo/expo/blob/main/guides/Expo%20Documentation%20Writing%20Style%20Guide.md)
jest-expo@56.0.3
expo-widgets@56.0.9
expo-video@56.1.1
@expo/ui@56.0.8
expo-splash-screen@56.0.7
expo-observe@56.0.9
expo-router@56.2.1
expo-modules-jsi@56.0.5
expo-modules-autolinking@56.0.7
expo-modules-core@56.0.9
expo-linking@56.0.8
expo-gl@56.0.4
expo-font@56.0.4
expo-file-system@56.0.5
expo-codemod@56.0.4
expo-brownfield@56.0.10
expo-audio@56.0.7
expo-app-metrics@56.0.9
expo-age-range@56.0.4
expo@56.0.0-preview.12
@expo/require-utils@56.1.1
@expo/metro-file-map@56.0.3
@expo/metro-config@56.0.9
@expo/cli@56.1.5
expo-template-tabs@56.0.12
expo-template-default@56.0.12
expo-template-blank-typescript@56.0.12
expo-template-blank@56.0.12
expo-template-bare-minimum@56.0.12
@expo/log-box@56.0.10
@expo/config@56.0.6
@expo/image-utils@0.9.3
@expo/prebuild-config@56.0.8
@expo/fingerprint@0.18.2
expo-asset@56.0.10
expo-constants@56.0.11
expo-task-manager@56.0.9
expo-build-properties@56.0.9
expo-dev-menu@56.0.10
expo-dev-launcher@56.0.11
patch-project@56.0.11
expo-auth-session@56.0.8
expo-background-task@56.0.9
expo-background-fetch@56.0.9
expo-sharing@56.0.9
expo-processing@56.0.9
expo-notifications@56.0.9
expo-location@56.0.9
expo-insights@56.0.9
expo-image-picker@56.0.9
expo-image-manipulator@56.0.9
expo-dev-client@56.0.11
expo-updates@56.0.12
@pull pull Bot locked and limited conversation to collaborators May 15, 2026
@pull pull Bot added the ⤵️ pull label May 15, 2026
@pull pull Bot merged commit 8ecc922 into code:main May 15, 2026
27 of 32 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

10 participants