@oxyhq/bloom 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/docs/media-flight.mdx +24 -14
  2. package/lib/commonjs/media-flight/MediaSurface.js +21 -2
  3. package/lib/commonjs/media-flight/MediaSurface.js.map +1 -1
  4. package/lib/commonjs/media-flight/expo-video-module.js +32 -0
  5. package/lib/commonjs/media-flight/expo-video-module.js.map +1 -1
  6. package/lib/commonjs/media-flight/index.js +6 -0
  7. package/lib/commonjs/media-flight/index.js.map +1 -1
  8. package/lib/module/media-flight/MediaSurface.js +21 -2
  9. package/lib/module/media-flight/MediaSurface.js.map +1 -1
  10. package/lib/module/media-flight/expo-video-module.js +31 -0
  11. package/lib/module/media-flight/expo-video-module.js.map +1 -1
  12. package/lib/module/media-flight/index.js +1 -1
  13. package/lib/module/media-flight/index.js.map +1 -1
  14. package/lib/typescript/commonjs/media-flight/MediaSurface.d.ts.map +1 -1
  15. package/lib/typescript/commonjs/media-flight/expo-video-module.d.ts +22 -0
  16. package/lib/typescript/commonjs/media-flight/expo-video-module.d.ts.map +1 -1
  17. package/lib/typescript/commonjs/media-flight/index.d.ts +1 -1
  18. package/lib/typescript/commonjs/media-flight/index.d.ts.map +1 -1
  19. package/lib/typescript/module/media-flight/MediaSurface.d.ts.map +1 -1
  20. package/lib/typescript/module/media-flight/expo-video-module.d.ts +22 -0
  21. package/lib/typescript/module/media-flight/expo-video-module.d.ts.map +1 -1
  22. package/lib/typescript/module/media-flight/index.d.ts +1 -1
  23. package/lib/typescript/module/media-flight/index.d.ts.map +1 -1
  24. package/package.json +1 -1
  25. package/src/media-flight/MediaSurface.tsx +19 -1
  26. package/src/media-flight/expo-video-module.ts +31 -0
  27. package/src/media-flight/index.ts +1 -0
@@ -78,26 +78,36 @@ resolving to the flying surface having visible pixels:
78
78
  | already rendered by the page (in the image cache) | **1–5** |
79
79
  | never requested before (same file, cache-busted) | **510–900** |
80
80
 
81
- So a **warm** poster makes the commit a frame, and a **cold** one opens a
82
- half-second hole exactly where the origin has just disappeared. Measured in a
83
- consuming app the hole was ~350 ms, framed by "the feed row stopped painting"
84
- and "the flight had not started".
81
+ So a **warm** poster makes the commit a frame, and a **cold** one would open a
82
+ half-second hole exactly where the origin has just disappeared.
85
83
 
86
- **The fix is not to make `flyTo` wait.** Waiting would move that half second in
87
- front of the user's tap, which is worse in the place people actually feel it.
88
- The fix is to make sure the origin has already painted the exact URI the flight
89
- will carry.
84
+ **The remedy is not to make `flyTo` wait.** Waiting would move that half second
85
+ in front of the user's tap, which is worse in the place people actually feel it.
86
+ The remedy is to make sure the origin has already painted the exact URI the
87
+ flight will carry.
90
88
 
91
- <Callout variant="warning" title="expo-video does not fetch your poster">
89
+ <Callout variant="warning" title="expo-video will not fetch your poster for you">
92
90
  On web, expo-video's `VideoView` renders `<video src=…>` with **no `poster`
93
- attribute**. So a feed that shows video and passes a poster to the video view
94
- never actually requests that URLand the flight is then the first thing that
95
- asks for it, at the worst possible moment. Render the still yourself under the
96
- video (`MediaPoster` is exported for exactly this), or prefetch it.
91
+ attribute**, so passing a poster to the video view does not cause that URL to be
92
+ requested. Something else has to paint it render the still yourself under the
93
+ video (`MediaPoster` is exported for exactly this, and Mention does it with
94
+ `expo-image` at `cachePolicy="memory-disk"`), or prefetch it. Do that and it is
95
+ warm by the time anything flies.
97
96
  </Callout>
98
97
 
99
98
  One-minute check: in the Network panel, does the poster request appear **when
100
- you tap**? If so, this is what you are looking at.
99
+ you tap**, or was it already there?
100
+
101
+ <Callout variant="info" title="A poster is invisible to `requestVideoFrameCallback`">
102
+ If you measure continuity by counting decoded video frames, **a flight covered
103
+ by its poster reads as a gap** — `requestVideoFrameCallback` fires only for
104
+ decoded VIDEO, and a poster is an `<img>` that never triggers it. A ~350 ms
105
+ "hole" measured that way in a consuming app turned out to be exactly this: a CDP
106
+ screencast over the same transition showed 25 frames in 844 ms, luminance gliding
107
+ 218 → 99, **zero black frames**, with the frame at t=360 ms — inside the supposed
108
+ hole — showing video filling the viewport. Measure what the screen shows, not
109
+ what one API reports.
110
+ </Callout>
101
111
 
102
112
  `scripts/verify-media-flight.mjs` gates Bloom's half — that a warm surface
103
113
  presents within a frame or two, with no re-fetch and no fade. Its control flies
@@ -121,8 +121,19 @@ const MediaSurface = exports.MediaSurface = /*#__PURE__*/(0, _react.memo)(functi
121
121
  player: content.player,
122
122
  contentFit: contentFit,
123
123
  surfaceType: mountedSurfaceType,
124
- nativeControls: nativeControls,
125
- style: _reactNative.StyleSheet.absoluteFill,
124
+ nativeControls: nativeControls
125
+ // `absoluteFill` ALONE does not size this, and the reason is a CSS
126
+ // rule rather than a bug: expo-video renders a DOM `<video>`, which is
127
+ // a REPLACED element, and `position:absolute; inset:0` with
128
+ // `width/height:auto` resolves a replaced element to its INTRINSIC
129
+ // size — 300x150, the `<video>` default — instead of stretching it.
130
+ // Measured: inside a 320x200 box the element computed
131
+ // `left/right/top/bottom: 0px` and `width: 300px; height: 150px`, so
132
+ // it sat at the default while the box animated around it and then
133
+ // jumped when metadata arrived. The poster escapes this only because
134
+ // expo-image sizes its own element.
135
+ ,
136
+ style: [_reactNative.StyleSheet.absoluteFill, styles.fillReplaced],
126
137
  accessibilityLabel: accessibilityLabel,
127
138
  onFirstFrameRender: reportLive
128
139
  }) : null]
@@ -176,6 +187,14 @@ function EmptyMediaSurface({
176
187
  });
177
188
  }
178
189
  const styles = _reactNative.StyleSheet.create({
190
+ /**
191
+ * Explicit size for a REPLACED element. Redundant for a `<div>` and
192
+ * load-bearing for a `<video>` — see the note at the call site.
193
+ */
194
+ fillReplaced: {
195
+ width: '100%',
196
+ height: '100%'
197
+ },
179
198
  box: {
180
199
  // What makes the box's corner radius actually clip a video, and the other
181
200
  // half of why the Android surface has to be a `textureView`.
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","_reactNative","_expoImage","_reactNativeReanimated","_interopRequireDefault","_store","_expoVideoModule","_jsxRuntime","e","__esModule","default","webDraggableProps","Platform","OS","draggable","MediaSurface","exports","memo","content","style","contentFit","surfaceType","nativeControls","accessibilityLabel","pointerEvents","flightId","mountedSurfaceType","useState","reportLive","useCallback","undefined","handOffFlight","still","kind","poster","uri","expoVideo","loadExpoVideo","warnExpoVideoUnavailable","jsxs","View","styles","box","children","jsx","Image","source","StyleSheet","absoluteFill","transition","onLoad","VideoView","player","onFirstFrameRender","displayName","MediaPoster","EmptyMediaSurface","empty","create","overflow","backgroundColor"],"sourceRoot":"../../../src","sources":["media-flight/MediaSurface.tsx"],"mappings":";;;;;;;;AAeA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,YAAA,GAAAD,OAAA;AAQA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAC,sBAAA,CAAAJ,OAAA;AAEA,IAAAK,MAAA,GAAAL,OAAA;AAEA,IAAAM,gBAAA,GAAAN,OAAA;AAI6B,IAAAO,WAAA,GAAAP,OAAA;AAAA,SAAAI,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAjC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAqBA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA,MAAMG,iBAAiB,GAAGC,qBAAQ,CAACC,EAAE,KAAK,KAAK,GAAG;EAAEC,SAAS,EAAE;AAAM,CAAC,GAAG,CAAC,CAAC;AA0C3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,YAAY,GAAAC,OAAA,CAAAD,YAAA,gBAAG,IAAAE,WAAI,EAAC,SAASF,YAAYA,CAAC;EACrDG,OAAO;EACPC,KAAK;EACLC,UAAU,GAAG,SAAS;EACtBC,WAAW,GAAG,aAAa;EAC3BC,cAAc,GAAG,KAAK;EACtBC,kBAAkB;EAClBC,aAAa;EACbC;AACiB,CAAC,EAAE;EACpB;EACA;EACA;EACA,MAAM,CAACC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAACN,WAAW,CAAC;;EAElD;EACA;EACA;EACA;EACA,MAAMO,UAAU,GAAG,IAAAC,kBAAW,EAAC,MAAM;IACnC,IAAIJ,QAAQ,KAAKK,SAAS,EAAE,IAAAC,oBAAa,EAACN,QAAQ,CAAC;EACrD,CAAC,EAAE,CAACA,QAAQ,CAAC,CAAC;EAEd,MAAMO,KAAK,GAAGd,OAAO,CAACe,IAAI,KAAK,OAAO,GAAGf,OAAO,CAACgB,MAAM,GAAGhB,OAAO,CAACiB,GAAG;EACrE;EACA;EACA,MAAMC,SAAS,GAAGlB,OAAO,CAACe,IAAI,KAAK,OAAO,GAAG,IAAAI,8BAAa,EAAC,CAAC,GAAG,IAAI;EACnE,IAAInB,OAAO,CAACe,IAAI,KAAK,OAAO,IAAIG,SAAS,KAAK,IAAI,EAAE;IAClD;IACA;IACA;IACA;IACA,IAAAE,yCAAwB,EAAC,CAAC;EAC5B;EAEA,oBACE,IAAA/B,WAAA,CAAAgC,IAAA,EAACpC,sBAAA,CAAAO,OAAQ,CAAC8B,IAAI;IAACrB,KAAK,EAAE,CAACsB,MAAM,CAACC,GAAG,EAAEvB,KAAK,CAAE;IAACK,aAAa,EAAEA,aAAc;IAAAmB,QAAA,GACrEX,KAAK,KAAKF,SAAS,GAAG,IAAI;IAAA;IACzB;IACA;IACA;IACA;IACA;IACA;IACA,IAAAvB,WAAA,CAAAqC,GAAA,EAAC1C,UAAA,CAAA2C,KAAK;MACJC,MAAM,EAAE;QAAEX,GAAG,EAAEH;MAAM,CAAE;MACvBZ,UAAU,EAAEA,UAAW;MACvBD,KAAK,EAAE4B,uBAAU,CAACC,YAAa;MAC/BC,UAAU,EAAE,CAAE;MACd1B,kBAAkB,EAAEA;MACpB;MACA;MACA;MAAA;MACA2B,MAAM,EAAEhC,OAAO,CAACe,IAAI,KAAK,OAAO,GAAGH,SAAS,GAAGF,UAAW;MAAA,GACtDjB;IAAiB,CACtB,CACF,EACAO,OAAO,CAACe,IAAI,KAAK,OAAO,IAAIG,SAAS,KAAK,IAAI,gBAC7C,IAAA7B,WAAA,CAAAqC,GAAA,EAACR,SAAS,CAACe,SAAS;MAClBC,MAAM,EAAElC,OAAO,CAACkC,MAAO;MACvBhC,UAAU,EAAEA,UAAW;MACvBC,WAAW,EAAEK,kBAAmB;MAChCJ,cAAc,EAAEA,cAAe;MAC/BH,KAAK,EAAE4B,uBAAU,CAACC,YAAa;MAC/BzB,kBAAkB,EAAEA,kBAAmB;MACvC8B,kBAAkB,EAAEzB;IAAW,CAChC,CAAC,GACA,IAAI;EAAA,CACK,CAAC;AAEpB,CAAC,CAAC;AAEFb,YAAY,CAACuC,WAAW,GAAG,cAAc;;AAEzC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,WAAWA,CAAC;EAC1BrC,OAAO;EACPC,KAAK;EACLC,UAAU,GAAG,OAAO;EACpBG;AAMF,CAAC,EAAE;EACD,MAAMY,GAAG,GAAGjB,OAAO,CAACe,IAAI,KAAK,OAAO,GAAGf,OAAO,CAACgB,MAAM,GAAGhB,OAAO,CAACiB,GAAG;EACnE,IAAIA,GAAG,KAAKL,SAAS,EAAE,oBAAO,IAAAvB,WAAA,CAAAqC,GAAA,EAACY,iBAAiB;IAACrC,KAAK,EAAEA;EAAM,CAAE,CAAC;EACjE,oBACE,IAAAZ,WAAA,CAAAqC,GAAA,EAAC1C,UAAA,CAAA2C,KAAK;IACJC,MAAM,EAAE;MAAEX;IAAI,CAAE;IAChBf,UAAU,EAAEA,UAAW;IACvBD,KAAK,EAAEA,KAAM;IACb8B,UAAU,EAAE,CAAE;IACd1B,kBAAkB,EAAEA,kBAAmB;IAAA,GACnCZ;EAAiB,CACtB,CAAC;AAEN;;AAEA;AACA;AACA;AACA;AACO,SAAS6C,iBAAiBA,CAAC;EAAErC;AAAoC,CAAC,EAAE;EACzE,oBAAO,IAAAZ,WAAA,CAAAqC,GAAA,EAAC3C,YAAA,CAAAuC,IAAI;IAACrB,KAAK,EAAE,CAACsB,MAAM,CAACgB,KAAK,EAAEtC,KAAK,CAAE;IAACK,aAAa,EAAC;EAAM,CAAE,CAAC;AACpE;AAEA,MAAMiB,MAAM,GAAGM,uBAAU,CAACW,MAAM,CAAC;EAC/BhB,GAAG,EAAE;IACH;IACA;IACAiB,QAAQ,EAAE;EACZ,CAAC;EACDF,KAAK,EAAE;IACLG,eAAe,EAAE;EACnB;AACF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","_reactNative","_expoImage","_reactNativeReanimated","_interopRequireDefault","_store","_expoVideoModule","_jsxRuntime","e","__esModule","default","webDraggableProps","Platform","OS","draggable","MediaSurface","exports","memo","content","style","contentFit","surfaceType","nativeControls","accessibilityLabel","pointerEvents","flightId","mountedSurfaceType","useState","reportLive","useCallback","undefined","handOffFlight","still","kind","poster","uri","expoVideo","loadExpoVideo","warnExpoVideoUnavailable","jsxs","View","styles","box","children","jsx","Image","source","StyleSheet","absoluteFill","transition","onLoad","VideoView","player","fillReplaced","onFirstFrameRender","displayName","MediaPoster","EmptyMediaSurface","empty","create","width","height","overflow","backgroundColor"],"sourceRoot":"../../../src","sources":["media-flight/MediaSurface.tsx"],"mappings":"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","ignoreList":[]}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.loadExpoVideo = loadExpoVideo;
7
+ exports.provideExpoVideo = provideExpoVideo;
7
8
  exports.resetExpoVideoModule = resetExpoVideoModule;
8
9
  exports.warnExpoVideoUnavailable = warnExpoVideoUnavailable;
9
10
  /**
@@ -83,12 +84,42 @@ exports.warnExpoVideoUnavailable = warnExpoVideoUnavailable;
83
84
 
84
85
  /** `undefined` until the first load attempt, then the module or `null`. */
85
86
  let videoModule;
87
+ /** Set by {@link provideExpoVideo}; wins over the `require` below. */
88
+ let providedModule;
86
89
  /** Why the load failed, quoted verbatim in the dev warning. */
87
90
  let unavailableReason = '';
88
91
  let hasWarned = false;
89
92
 
93
+ /**
94
+ * Hand Bloom the expo-video module explicitly.
95
+ *
96
+ * REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
97
+ * bundle `typeof require` is `undefined`, so the optional-peer `require` below
98
+ * cannot run and video silently degrades to its poster **even when expo-video
99
+ * is installed**. Metro has a real `require` and is unaffected, which is why
100
+ * this went unnoticed — the app that uses this is Metro-built.
101
+ *
102
+ * There is no bundler-agnostic sync alternative: `import()` is async and this is
103
+ * called during render, so making it async would mean the surface renders
104
+ * without video for a frame and then upgrades. Handing the module over is
105
+ * explicit, synchronous, and costs the consumer one line at startup:
106
+ *
107
+ * ```ts
108
+ * import * as ExpoVideo from 'expo-video';
109
+ * provideExpoVideo(ExpoVideo);
110
+ * ```
111
+ *
112
+ * Pass `null` to clear it.
113
+ */
114
+ function provideExpoVideo(module) {
115
+ providedModule = module;
116
+ // Drop any cached `require` result so the next load reflects this decision.
117
+ videoModule = undefined;
118
+ }
119
+
90
120
  /** The expo-video module, or `null` when the optional peer is not installed. */
91
121
  function loadExpoVideo() {
122
+ if (providedModule !== undefined && providedModule !== null) return providedModule;
92
123
  if (videoModule !== undefined) return videoModule;
93
124
  videoModule = null;
94
125
 
@@ -142,6 +173,7 @@ function warnExpoVideoUnavailable() {
142
173
  /** Test seam — drops the cached module handle so a suite can load it again. */
143
174
  function resetExpoVideoModule() {
144
175
  videoModule = undefined;
176
+ providedModule = undefined;
145
177
  unavailableReason = '';
146
178
  hasWarned = false;
147
179
  }
@@ -1 +1 @@
1
- {"version":3,"names":["videoModule","unavailableReason","hasWarned","loadExpoVideo","undefined","require","loaded","resolved","isComponentBearing","default","VideoView","error","Error","message","String","candidate","view","warnExpoVideoUnavailable","process","env","NODE_ENV","console","warn","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/expo-video-module.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAkBA;;AAKA;AACA,IAAIA,WAA6C;AACjD;AACA,IAAIC,iBAAiB,GAAG,EAAE;AAC1B,IAAIC,SAAS,GAAG,KAAK;;AAErB;AACO,SAASC,aAAaA,CAAA,EAAyB;EACpD,IAAIH,WAAW,KAAKI,SAAS,EAAE,OAAOJ,WAAW;EACjDA,WAAW,GAAG,IAAI;;EAElB;EACA;EACA;EACA;EACA,IAAI,OAAOK,OAAO,KAAK,WAAW,EAAE;IAClCJ,iBAAiB,GAAG,uCAAuC;IAC3D,OAAOD,WAAW;EACpB;EAEA,IAAI;IACF,MAAMM,MAAM,GAAGD,OAAO,CAAC,YAAY,CAGtB;IACb;IACA;IACA;IACA,MAAME,QAAQ,GAAGC,kBAAkB,CAACF,MAAM,CAAC,GAAGA,MAAM,GAAGA,MAAM,EAAEG,OAAO;IAEtE,IAAID,kBAAkB,CAACD,QAAQ,CAAC,EAAE;MAChCP,WAAW,GAAG;QAAEU,SAAS,EAAEH,QAAQ,CAACG;MAA+C,CAAC;IACtF,CAAC,MAAM;MACLT,iBAAiB,GAAG,kDAAkD;IACxE;EACF,CAAC,CAAC,OAAOU,KAAK,EAAE;IACdV,iBAAiB,GAAGU,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAACE,OAAO,GAAGC,MAAM,CAACH,KAAK,CAAC;EAC5E;EAEA,OAAOX,WAAW;AACpB;AAEA,SAASQ,kBAAkBA,CACzBO,SAA8E,EACU;EACxF,MAAMC,IAAI,GAAGD,SAAS,EAAEL,SAAS;EACjC,IAAI,OAAOM,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI;EAC3C,OAAO,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,IAAI,UAAU,IAAIA,IAAI;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,wBAAwBA,CAAA,EAAS;EAC/C,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,IAAIlB,SAAS,EAAE;EACxDA,SAAS,GAAG,IAAI;EAChB;EACA;EACA;EACAmB,OAAO,CAACC,IAAI,CACV,2EAA2E,GACzE,2EAA2E,GAC3E,6DAA6D,GAC7D,8DAA8D,GAC9D,WAAWrB,iBAAiB,EAChC,CAAC;AACH;;AAEA;AACO,SAASsB,oBAAoBA,CAAA,EAAS;EAC3CvB,WAAW,GAAGI,SAAS;EACvBH,iBAAiB,GAAG,EAAE;EACtBC,SAAS,GAAG,KAAK;AACnB","ignoreList":[]}
1
+ {"version":3,"names":["videoModule","providedModule","unavailableReason","hasWarned","provideExpoVideo","module","undefined","loadExpoVideo","require","loaded","resolved","isComponentBearing","default","VideoView","error","Error","message","String","candidate","view","warnExpoVideoUnavailable","process","env","NODE_ENV","console","warn","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/expo-video-module.ts"],"mappings":";;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAkBA;;AAKA;AACA,IAAIA,WAA6C;AACjD;AACA,IAAIC,cAAgD;AACpD;AACA,IAAIC,iBAAiB,GAAG,EAAE;AAC1B,IAAIC,SAAS,GAAG,KAAK;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,gBAAgBA,CAACC,MAA4B,EAAQ;EACnEJ,cAAc,GAAGI,MAAM;EACvB;EACAL,WAAW,GAAGM,SAAS;AACzB;;AAEA;AACO,SAASC,aAAaA,CAAA,EAAyB;EACpD,IAAIN,cAAc,KAAKK,SAAS,IAAIL,cAAc,KAAK,IAAI,EAAE,OAAOA,cAAc;EAClF,IAAID,WAAW,KAAKM,SAAS,EAAE,OAAON,WAAW;EACjDA,WAAW,GAAG,IAAI;;EAElB;EACA;EACA;EACA;EACA,IAAI,OAAOQ,OAAO,KAAK,WAAW,EAAE;IAClCN,iBAAiB,GAAG,uCAAuC;IAC3D,OAAOF,WAAW;EACpB;EAEA,IAAI;IACF,MAAMS,MAAM,GAAGD,OAAO,CAAC,YAAY,CAGtB;IACb;IACA;IACA;IACA,MAAME,QAAQ,GAAGC,kBAAkB,CAACF,MAAM,CAAC,GAAGA,MAAM,GAAGA,MAAM,EAAEG,OAAO;IAEtE,IAAID,kBAAkB,CAACD,QAAQ,CAAC,EAAE;MAChCV,WAAW,GAAG;QAAEa,SAAS,EAAEH,QAAQ,CAACG;MAA+C,CAAC;IACtF,CAAC,MAAM;MACLX,iBAAiB,GAAG,kDAAkD;IACxE;EACF,CAAC,CAAC,OAAOY,KAAK,EAAE;IACdZ,iBAAiB,GAAGY,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAACE,OAAO,GAAGC,MAAM,CAACH,KAAK,CAAC;EAC5E;EAEA,OAAOd,WAAW;AACpB;AAEA,SAASW,kBAAkBA,CACzBO,SAA8E,EACU;EACxF,MAAMC,IAAI,GAAGD,SAAS,EAAEL,SAAS;EACjC,IAAI,OAAOM,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI;EAC3C,OAAO,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,IAAI,UAAU,IAAIA,IAAI;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,wBAAwBA,CAAA,EAAS;EAC/C,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,IAAIpB,SAAS,EAAE;EACxDA,SAAS,GAAG,IAAI;EAChB;EACA;EACA;EACAqB,OAAO,CAACC,IAAI,CACV,2EAA2E,GACzE,2EAA2E,GAC3E,6DAA6D,GAC7D,8DAA8D,GAC9D,WAAWvB,iBAAiB,EAChC,CAAC;AACH;;AAEA;AACO,SAASwB,oBAAoBA,CAAA,EAAS;EAC3C1B,WAAW,GAAGM,SAAS;EACvBL,cAAc,GAAGK,SAAS;EAC1BJ,iBAAiB,GAAG,EAAE;EACtBC,SAAS,GAAG,KAAK;AACnB","ignoreList":[]}
@@ -63,6 +63,12 @@ Object.defineProperty(exports, "loadExpoVideo", {
63
63
  return _expoVideoModule.loadExpoVideo;
64
64
  }
65
65
  });
66
+ Object.defineProperty(exports, "provideExpoVideo", {
67
+ enumerable: true,
68
+ get: function () {
69
+ return _expoVideoModule.provideExpoVideo;
70
+ }
71
+ });
66
72
  Object.defineProperty(exports, "releaseFlight", {
67
73
  enumerable: true,
68
74
  get: function () {
@@ -1 +1 @@
1
- {"version":3,"names":["_MediaFlightLayer","require","_MediaSurface","_useMediaFlight","_store","_constants","_expoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAQA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,gBAAA,GAAAL,OAAA","ignoreList":[]}
1
+ {"version":3,"names":["_MediaFlightLayer","require","_MediaSurface","_useMediaFlight","_store","_constants","_expoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,eAAA,GAAAF,OAAA;AACA,IAAAG,MAAA,GAAAH,OAAA;AAQA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,gBAAA,GAAAL,OAAA","ignoreList":[]}
@@ -113,8 +113,19 @@ export const MediaSurface = /*#__PURE__*/memo(function MediaSurface({
113
113
  player: content.player,
114
114
  contentFit: contentFit,
115
115
  surfaceType: mountedSurfaceType,
116
- nativeControls: nativeControls,
117
- style: StyleSheet.absoluteFill,
116
+ nativeControls: nativeControls
117
+ // `absoluteFill` ALONE does not size this, and the reason is a CSS
118
+ // rule rather than a bug: expo-video renders a DOM `<video>`, which is
119
+ // a REPLACED element, and `position:absolute; inset:0` with
120
+ // `width/height:auto` resolves a replaced element to its INTRINSIC
121
+ // size — 300x150, the `<video>` default — instead of stretching it.
122
+ // Measured: inside a 320x200 box the element computed
123
+ // `left/right/top/bottom: 0px` and `width: 300px; height: 150px`, so
124
+ // it sat at the default while the box animated around it and then
125
+ // jumped when metadata arrived. The poster escapes this only because
126
+ // expo-image sizes its own element.
127
+ ,
128
+ style: [StyleSheet.absoluteFill, styles.fillReplaced],
118
129
  accessibilityLabel: accessibilityLabel,
119
130
  onFirstFrameRender: reportLive
120
131
  }) : null]
@@ -168,6 +179,14 @@ export function EmptyMediaSurface({
168
179
  });
169
180
  }
170
181
  const styles = StyleSheet.create({
182
+ /**
183
+ * Explicit size for a REPLACED element. Redundant for a `<div>` and
184
+ * load-bearing for a `<video>` — see the note at the call site.
185
+ */
186
+ fillReplaced: {
187
+ width: '100%',
188
+ height: '100%'
189
+ },
171
190
  box: {
172
191
  // What makes the box's corner radius actually clip a video, and the other
173
192
  // half of why the Android surface has to be a `textureView`.
@@ -1 +1 @@
1
- {"version":3,"names":["memo","useCallback","useState","Platform","StyleSheet","View","Image","Animated","handOffFlight","loadExpoVideo","warnExpoVideoUnavailable","jsx","_jsx","jsxs","_jsxs","webDraggableProps","OS","draggable","MediaSurface","content","style","contentFit","surfaceType","nativeControls","accessibilityLabel","pointerEvents","flightId","mountedSurfaceType","reportLive","undefined","still","kind","poster","uri","expoVideo","styles","box","children","source","absoluteFill","transition","onLoad","VideoView","player","onFirstFrameRender","displayName","MediaPoster","EmptyMediaSurface","empty","create","overflow","backgroundColor"],"sourceRoot":"../../../src","sources":["media-flight/MediaSurface.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["memo","useCallback","useState","Platform","StyleSheet","View","Image","Animated","handOffFlight","loadExpoVideo","warnExpoVideoUnavailable","jsx","_jsx","jsxs","_jsxs","webDraggableProps","OS","draggable","MediaSurface","content","style","contentFit","surfaceType","nativeControls","accessibilityLabel","pointerEvents","flightId","mountedSurfaceType","reportLive","undefined","still","kind","poster","uri","expoVideo","styles","box","children","source","absoluteFill","transition","onLoad","VideoView","player","fillReplaced","onFirstFrameRender","displayName","MediaPoster","EmptyMediaSurface","empty","create","width","height","overflow","backgroundColor"],"sourceRoot":"../../../src","sources":["media-flight/MediaSurface.tsx"],"mappings":"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","ignoreList":[]}
@@ -77,12 +77,42 @@
77
77
 
78
78
  /** `undefined` until the first load attempt, then the module or `null`. */
79
79
  let videoModule;
80
+ /** Set by {@link provideExpoVideo}; wins over the `require` below. */
81
+ let providedModule;
80
82
  /** Why the load failed, quoted verbatim in the dev warning. */
81
83
  let unavailableReason = '';
82
84
  let hasWarned = false;
83
85
 
86
+ /**
87
+ * Hand Bloom the expo-video module explicitly.
88
+ *
89
+ * REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
90
+ * bundle `typeof require` is `undefined`, so the optional-peer `require` below
91
+ * cannot run and video silently degrades to its poster **even when expo-video
92
+ * is installed**. Metro has a real `require` and is unaffected, which is why
93
+ * this went unnoticed — the app that uses this is Metro-built.
94
+ *
95
+ * There is no bundler-agnostic sync alternative: `import()` is async and this is
96
+ * called during render, so making it async would mean the surface renders
97
+ * without video for a frame and then upgrades. Handing the module over is
98
+ * explicit, synchronous, and costs the consumer one line at startup:
99
+ *
100
+ * ```ts
101
+ * import * as ExpoVideo from 'expo-video';
102
+ * provideExpoVideo(ExpoVideo);
103
+ * ```
104
+ *
105
+ * Pass `null` to clear it.
106
+ */
107
+ export function provideExpoVideo(module) {
108
+ providedModule = module;
109
+ // Drop any cached `require` result so the next load reflects this decision.
110
+ videoModule = undefined;
111
+ }
112
+
84
113
  /** The expo-video module, or `null` when the optional peer is not installed. */
85
114
  export function loadExpoVideo() {
115
+ if (providedModule !== undefined && providedModule !== null) return providedModule;
86
116
  if (videoModule !== undefined) return videoModule;
87
117
  videoModule = null;
88
118
 
@@ -136,6 +166,7 @@ export function warnExpoVideoUnavailable() {
136
166
  /** Test seam — drops the cached module handle so a suite can load it again. */
137
167
  export function resetExpoVideoModule() {
138
168
  videoModule = undefined;
169
+ providedModule = undefined;
139
170
  unavailableReason = '';
140
171
  hasWarned = false;
141
172
  }
@@ -1 +1 @@
1
- {"version":3,"names":["videoModule","unavailableReason","hasWarned","loadExpoVideo","undefined","require","loaded","resolved","isComponentBearing","default","VideoView","error","Error","message","String","candidate","view","warnExpoVideoUnavailable","process","env","NODE_ENV","console","warn","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/expo-video-module.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAkBA;;AAKA;AACA,IAAIA,WAA6C;AACjD;AACA,IAAIC,iBAAiB,GAAG,EAAE;AAC1B,IAAIC,SAAS,GAAG,KAAK;;AAErB;AACA,OAAO,SAASC,aAAaA,CAAA,EAAyB;EACpD,IAAIH,WAAW,KAAKI,SAAS,EAAE,OAAOJ,WAAW;EACjDA,WAAW,GAAG,IAAI;;EAElB;EACA;EACA;EACA;EACA,IAAI,OAAOK,OAAO,KAAK,WAAW,EAAE;IAClCJ,iBAAiB,GAAG,uCAAuC;IAC3D,OAAOD,WAAW;EACpB;EAEA,IAAI;IACF,MAAMM,MAAM,GAAGD,OAAO,CAAC,YAAY,CAGtB;IACb;IACA;IACA;IACA,MAAME,QAAQ,GAAGC,kBAAkB,CAACF,MAAM,CAAC,GAAGA,MAAM,GAAGA,MAAM,EAAEG,OAAO;IAEtE,IAAID,kBAAkB,CAACD,QAAQ,CAAC,EAAE;MAChCP,WAAW,GAAG;QAAEU,SAAS,EAAEH,QAAQ,CAACG;MAA+C,CAAC;IACtF,CAAC,MAAM;MACLT,iBAAiB,GAAG,kDAAkD;IACxE;EACF,CAAC,CAAC,OAAOU,KAAK,EAAE;IACdV,iBAAiB,GAAGU,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAACE,OAAO,GAAGC,MAAM,CAACH,KAAK,CAAC;EAC5E;EAEA,OAAOX,WAAW;AACpB;AAEA,SAASQ,kBAAkBA,CACzBO,SAA8E,EACU;EACxF,MAAMC,IAAI,GAAGD,SAAS,EAAEL,SAAS;EACjC,IAAI,OAAOM,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI;EAC3C,OAAO,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,IAAI,UAAU,IAAIA,IAAI;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CAAA,EAAS;EAC/C,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,IAAIlB,SAAS,EAAE;EACxDA,SAAS,GAAG,IAAI;EAChB;EACA;EACA;EACAmB,OAAO,CAACC,IAAI,CACV,2EAA2E,GACzE,2EAA2E,GAC3E,6DAA6D,GAC7D,8DAA8D,GAC9D,WAAWrB,iBAAiB,EAChC,CAAC;AACH;;AAEA;AACA,OAAO,SAASsB,oBAAoBA,CAAA,EAAS;EAC3CvB,WAAW,GAAGI,SAAS;EACvBH,iBAAiB,GAAG,EAAE;EACtBC,SAAS,GAAG,KAAK;AACnB","ignoreList":[]}
1
+ {"version":3,"names":["videoModule","providedModule","unavailableReason","hasWarned","provideExpoVideo","module","undefined","loadExpoVideo","require","loaded","resolved","isComponentBearing","default","VideoView","error","Error","message","String","candidate","view","warnExpoVideoUnavailable","process","env","NODE_ENV","console","warn","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/expo-video-module.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAOA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;;AAkBA;;AAKA;AACA,IAAIA,WAA6C;AACjD;AACA,IAAIC,cAAgD;AACpD;AACA,IAAIC,iBAAiB,GAAG,EAAE;AAC1B,IAAIC,SAAS,GAAG,KAAK;;AAErB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAACC,MAA4B,EAAQ;EACnEJ,cAAc,GAAGI,MAAM;EACvB;EACAL,WAAW,GAAGM,SAAS;AACzB;;AAEA;AACA,OAAO,SAASC,aAAaA,CAAA,EAAyB;EACpD,IAAIN,cAAc,KAAKK,SAAS,IAAIL,cAAc,KAAK,IAAI,EAAE,OAAOA,cAAc;EAClF,IAAID,WAAW,KAAKM,SAAS,EAAE,OAAON,WAAW;EACjDA,WAAW,GAAG,IAAI;;EAElB;EACA;EACA;EACA;EACA,IAAI,OAAOQ,OAAO,KAAK,WAAW,EAAE;IAClCN,iBAAiB,GAAG,uCAAuC;IAC3D,OAAOF,WAAW;EACpB;EAEA,IAAI;IACF,MAAMS,MAAM,GAAGD,OAAO,CAAC,YAAY,CAGtB;IACb;IACA;IACA;IACA,MAAME,QAAQ,GAAGC,kBAAkB,CAACF,MAAM,CAAC,GAAGA,MAAM,GAAGA,MAAM,EAAEG,OAAO;IAEtE,IAAID,kBAAkB,CAACD,QAAQ,CAAC,EAAE;MAChCV,WAAW,GAAG;QAAEa,SAAS,EAAEH,QAAQ,CAACG;MAA+C,CAAC;IACtF,CAAC,MAAM;MACLX,iBAAiB,GAAG,kDAAkD;IACxE;EACF,CAAC,CAAC,OAAOY,KAAK,EAAE;IACdZ,iBAAiB,GAAGY,KAAK,YAAYC,KAAK,GAAGD,KAAK,CAACE,OAAO,GAAGC,MAAM,CAACH,KAAK,CAAC;EAC5E;EAEA,OAAOd,WAAW;AACpB;AAEA,SAASW,kBAAkBA,CACzBO,SAA8E,EACU;EACxF,MAAMC,IAAI,GAAGD,SAAS,EAAEL,SAAS;EACjC,IAAI,OAAOM,IAAI,KAAK,UAAU,EAAE,OAAO,IAAI;EAC3C,OAAO,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,KAAK,IAAI,IAAI,UAAU,IAAIA,IAAI;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,wBAAwBA,CAAA,EAAS;EAC/C,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,IAAIpB,SAAS,EAAE;EACxDA,SAAS,GAAG,IAAI;EAChB;EACA;EACA;EACAqB,OAAO,CAACC,IAAI,CACV,2EAA2E,GACzE,2EAA2E,GAC3E,6DAA6D,GAC7D,8DAA8D,GAC9D,WAAWvB,iBAAiB,EAChC,CAAC;AACH;;AAEA;AACA,OAAO,SAASwB,oBAAoBA,CAAA,EAAS;EAC3C1B,WAAW,GAAGM,SAAS;EACvBL,cAAc,GAAGK,SAAS;EAC1BJ,iBAAiB,GAAG,EAAE;EACtBC,SAAS,GAAG,KAAK;AACnB","ignoreList":[]}
@@ -5,5 +5,5 @@ export { MediaSurface, MediaPoster, EmptyMediaSurface } from "./MediaSurface.js"
5
5
  export { useMediaFlight } from "./use-media-flight.js";
6
6
  export { DEFAULT_FLIGHT_CORNER_RADIUS, flightProgress, handOffFlight, hasFlight, releaseFlight, resetMediaFlight } from "./store.js";
7
7
  export { SURFACE_MOUNT_TIMEOUT_MS } from "./constants.js";
8
- export { loadExpoVideo, warnExpoVideoUnavailable, resetExpoVideoModule } from "./expo-video-module.js";
8
+ export { loadExpoVideo, warnExpoVideoUnavailable, provideExpoVideo, resetExpoVideoModule } from "./expo-video-module.js";
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["MediaFlightLayer","MediaSurface","MediaPoster","EmptyMediaSurface","useMediaFlight","DEFAULT_FLIGHT_CORNER_RADIUS","flightProgress","handOffFlight","hasFlight","releaseFlight","resetMediaFlight","SURFACE_MOUNT_TIMEOUT_MS","loadExpoVideo","warnExpoVideoUnavailable","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/index.ts"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,YAAY,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,mBAAgB;AAC7E,SAASC,cAAc,QAAQ,uBAAoB;AACnD,SACEC,4BAA4B,EAC5BC,cAAc,EACdC,aAAa,EACbC,SAAS,EACTC,aAAa,EACbC,gBAAgB,QACX,YAAS;AAChB,SAASC,wBAAwB,QAAQ,gBAAa;AACtD,SACEC,aAAa,EACbC,wBAAwB,EACxBC,oBAAoB,QAMf,wBAAqB","ignoreList":[]}
1
+ {"version":3,"names":["MediaFlightLayer","MediaSurface","MediaPoster","EmptyMediaSurface","useMediaFlight","DEFAULT_FLIGHT_CORNER_RADIUS","flightProgress","handOffFlight","hasFlight","releaseFlight","resetMediaFlight","SURFACE_MOUNT_TIMEOUT_MS","loadExpoVideo","warnExpoVideoUnavailable","provideExpoVideo","resetExpoVideoModule"],"sourceRoot":"../../../src","sources":["media-flight/index.ts"],"mappings":";;AAAA,SAASA,gBAAgB,QAAQ,uBAAoB;AACrD,SAASC,YAAY,EAAEC,WAAW,EAAEC,iBAAiB,QAAQ,mBAAgB;AAC7E,SAASC,cAAc,QAAQ,uBAAoB;AACnD,SACEC,4BAA4B,EAC5BC,cAAc,EACdC,aAAa,EACbC,SAAS,EACTC,aAAa,EACbC,gBAAgB,QACX,YAAS;AAChB,SAASC,wBAAwB,QAAQ,gBAAa;AACtD,SACEC,aAAa,EACbC,wBAAwB,EACxBC,gBAAgB,EAChBC,oBAAoB,QAMf,wBAAqB","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"MediaSurface.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/MediaSurface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,mBAAmB,CAAC;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,yDAsEvB,CAAC;AAIH;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,UAAoB,EACpB,kBAAkB,GACnB,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,2CAaA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,2CAExE"}
1
+ {"version":3,"file":"MediaSurface.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/MediaSurface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,mBAAmB,CAAC;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,yDAgFvB,CAAC;AAIH;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,UAAoB,EACpB,kBAAkB,GACnB,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,2CAaA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,2CAExE"}
@@ -89,6 +89,28 @@ export interface VideoViewLikeProps {
89
89
  export interface ExpoVideoLike {
90
90
  VideoView: ComponentType<VideoViewLikeProps>;
91
91
  }
92
+ /**
93
+ * Hand Bloom the expo-video module explicitly.
94
+ *
95
+ * REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
96
+ * bundle `typeof require` is `undefined`, so the optional-peer `require` below
97
+ * cannot run and video silently degrades to its poster **even when expo-video
98
+ * is installed**. Metro has a real `require` and is unaffected, which is why
99
+ * this went unnoticed — the app that uses this is Metro-built.
100
+ *
101
+ * There is no bundler-agnostic sync alternative: `import()` is async and this is
102
+ * called during render, so making it async would mean the surface renders
103
+ * without video for a frame and then upgrades. Handing the module over is
104
+ * explicit, synchronous, and costs the consumer one line at startup:
105
+ *
106
+ * ```ts
107
+ * import * as ExpoVideo from 'expo-video';
108
+ * provideExpoVideo(ExpoVideo);
109
+ * ```
110
+ *
111
+ * Pass `null` to clear it.
112
+ */
113
+ export declare function provideExpoVideo(module: ExpoVideoLike | null): void;
92
114
  /** The expo-video module, or `null` when the optional peer is not installed. */
93
115
  export declare function loadExpoVideo(): ExpoVideoLike | null;
94
116
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"expo-video-module.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/expo-video-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE7D,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CAC9C;AAQD,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,aAAa,GAAG,IAAI,CAiCpD;AAUD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAa/C;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
1
+ {"version":3,"file":"expo-video-module.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/expo-video-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE7D,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CAC9C;AAUD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAInE;AAED,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,aAAa,GAAG,IAAI,CAkCpD;AAUD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAa/C;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
@@ -3,7 +3,7 @@ export { MediaSurface, MediaPoster, EmptyMediaSurface } from './MediaSurface';
3
3
  export { useMediaFlight } from './use-media-flight';
4
4
  export { DEFAULT_FLIGHT_CORNER_RADIUS, flightProgress, handOffFlight, hasFlight, releaseFlight, resetMediaFlight, } from './store';
5
5
  export { SURFACE_MOUNT_TIMEOUT_MS } from './constants';
6
- export { loadExpoVideo, warnExpoVideoUnavailable, resetExpoVideoModule, type ExpoVideoLike, type VideoPlayerLike, type VideoSurfaceContentFit, type VideoSurfaceType, type VideoViewLikeProps, } from './expo-video-module';
6
+ export { loadExpoVideo, warnExpoVideoUnavailable, provideExpoVideo, resetExpoVideoModule, type ExpoVideoLike, type VideoPlayerLike, type VideoSurfaceContentFit, type VideoSurfaceType, type VideoViewLikeProps, } from './expo-video-module';
7
7
  export type { MediaFlight, MediaFlightAnchorNode, MediaFlightController, MediaFlightOptions, MediaSurfaceContent, MediaSurfaceImage, MediaSurfaceVideo, MeasuredRect, } from './types';
8
8
  export type { MediaSurfaceProps } from './MediaSurface';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"MediaSurface.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/MediaSurface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,mBAAmB,CAAC;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,yDAsEvB,CAAC;AAIH;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,UAAoB,EACpB,kBAAkB,GACnB,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,2CAaA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,2CAExE"}
1
+ {"version":3,"file":"MediaSurface.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/MediaSurface.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAEtB,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,SAAS,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC;AASjE,MAAM,WAAW,iBAAiB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,mBAAmB,CAAC;IAC7B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,kFAAkF;IAClF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,yDAgFvB,CAAC;AAIH;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,UAAoB,EACpB,kBAAkB,GACnB,EAAE;IACD,OAAO,EAAE,mBAAmB,CAAC;IAC7B,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,2CAaA;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,gBAAgB,CAAA;CAAE,2CAExE"}
@@ -89,6 +89,28 @@ export interface VideoViewLikeProps {
89
89
  export interface ExpoVideoLike {
90
90
  VideoView: ComponentType<VideoViewLikeProps>;
91
91
  }
92
+ /**
93
+ * Hand Bloom the expo-video module explicitly.
94
+ *
95
+ * REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
96
+ * bundle `typeof require` is `undefined`, so the optional-peer `require` below
97
+ * cannot run and video silently degrades to its poster **even when expo-video
98
+ * is installed**. Metro has a real `require` and is unaffected, which is why
99
+ * this went unnoticed — the app that uses this is Metro-built.
100
+ *
101
+ * There is no bundler-agnostic sync alternative: `import()` is async and this is
102
+ * called during render, so making it async would mean the surface renders
103
+ * without video for a frame and then upgrades. Handing the module over is
104
+ * explicit, synchronous, and costs the consumer one line at startup:
105
+ *
106
+ * ```ts
107
+ * import * as ExpoVideo from 'expo-video';
108
+ * provideExpoVideo(ExpoVideo);
109
+ * ```
110
+ *
111
+ * Pass `null` to clear it.
112
+ */
113
+ export declare function provideExpoVideo(module: ExpoVideoLike | null): void;
92
114
  /** The expo-video module, or `null` when the optional peer is not installed. */
93
115
  export declare function loadExpoVideo(): ExpoVideoLike | null;
94
116
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"expo-video-module.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/expo-video-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE7D,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CAC9C;AAQD,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,aAAa,GAAG,IAAI,CAiCpD;AAUD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAa/C;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C"}
1
+ {"version":3,"file":"expo-video-module.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/expo-video-module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AASzD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,IAAI,CAAC;CACf;AAED,oFAAoF;AACpF,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;AAElE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE7D,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC1D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;CACjC;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;CAC9C;AAUD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAInE;AAED,gFAAgF;AAChF,wBAAgB,aAAa,IAAI,aAAa,GAAG,IAAI,CAkCpD;AAUD;;;;;GAKG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAa/C;AAED,+EAA+E;AAC/E,wBAAgB,oBAAoB,IAAI,IAAI,CAK3C"}
@@ -3,7 +3,7 @@ export { MediaSurface, MediaPoster, EmptyMediaSurface } from './MediaSurface';
3
3
  export { useMediaFlight } from './use-media-flight';
4
4
  export { DEFAULT_FLIGHT_CORNER_RADIUS, flightProgress, handOffFlight, hasFlight, releaseFlight, resetMediaFlight, } from './store';
5
5
  export { SURFACE_MOUNT_TIMEOUT_MS } from './constants';
6
- export { loadExpoVideo, warnExpoVideoUnavailable, resetExpoVideoModule, type ExpoVideoLike, type VideoPlayerLike, type VideoSurfaceContentFit, type VideoSurfaceType, type VideoViewLikeProps, } from './expo-video-module';
6
+ export { loadExpoVideo, warnExpoVideoUnavailable, provideExpoVideo, resetExpoVideoModule, type ExpoVideoLike, type VideoPlayerLike, type VideoSurfaceContentFit, type VideoSurfaceType, type VideoViewLikeProps, } from './expo-video-module';
7
7
  export type { MediaFlight, MediaFlightAnchorNode, MediaFlightController, MediaFlightOptions, MediaSurfaceContent, MediaSurfaceImage, MediaSurfaceVideo, MeasuredRect, } from './types';
8
8
  export type { MediaSurfaceProps } from './MediaSurface';
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/media-flight/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,4BAA4B,EAC5B,cAAc,EACd,aAAa,EACb,SAAS,EACT,aAAa,EACb,gBAAgB,GACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,WAAW,EACX,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oxyhq/bloom",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "packageManager": "bun@1.3.14",
5
5
  "description": "Bloom UI — Oxy ecosystem component library for React Native + Expo + Web",
6
6
  "main": "lib/commonjs/index.js",
@@ -166,7 +166,17 @@ export const MediaSurface = memo(function MediaSurface({
166
166
  contentFit={contentFit}
167
167
  surfaceType={mountedSurfaceType}
168
168
  nativeControls={nativeControls}
169
- style={StyleSheet.absoluteFill}
169
+ // `absoluteFill` ALONE does not size this, and the reason is a CSS
170
+ // rule rather than a bug: expo-video renders a DOM `<video>`, which is
171
+ // a REPLACED element, and `position:absolute; inset:0` with
172
+ // `width/height:auto` resolves a replaced element to its INTRINSIC
173
+ // size — 300x150, the `<video>` default — instead of stretching it.
174
+ // Measured: inside a 320x200 box the element computed
175
+ // `left/right/top/bottom: 0px` and `width: 300px; height: 150px`, so
176
+ // it sat at the default while the box animated around it and then
177
+ // jumped when metadata arrived. The poster escapes this only because
178
+ // expo-image sizes its own element.
179
+ style={[StyleSheet.absoluteFill, styles.fillReplaced]}
170
180
  accessibilityLabel={accessibilityLabel}
171
181
  onFirstFrameRender={reportLive}
172
182
  />
@@ -222,6 +232,14 @@ export function EmptyMediaSurface({ style }: { style?: MediaPosterStyle }) {
222
232
  }
223
233
 
224
234
  const styles = StyleSheet.create({
235
+ /**
236
+ * Explicit size for a REPLACED element. Redundant for a `<div>` and
237
+ * load-bearing for a `<video>` — see the note at the call site.
238
+ */
239
+ fillReplaced: {
240
+ width: '100%',
241
+ height: '100%',
242
+ },
225
243
  box: {
226
244
  // What makes the box's corner radius actually clip a video, and the other
227
245
  // half of why the Android surface has to be a `textureView`.
@@ -104,12 +104,42 @@ export interface ExpoVideoLike {
104
104
 
105
105
  /** `undefined` until the first load attempt, then the module or `null`. */
106
106
  let videoModule: ExpoVideoLike | null | undefined;
107
+ /** Set by {@link provideExpoVideo}; wins over the `require` below. */
108
+ let providedModule: ExpoVideoLike | null | undefined;
107
109
  /** Why the load failed, quoted verbatim in the dev warning. */
108
110
  let unavailableReason = '';
109
111
  let hasWarned = false;
110
112
 
113
+ /**
114
+ * Hand Bloom the expo-video module explicitly.
115
+ *
116
+ * REQUIRED ON ANY ESM WEB BUNDLER, and measured rather than assumed: in a Vite
117
+ * bundle `typeof require` is `undefined`, so the optional-peer `require` below
118
+ * cannot run and video silently degrades to its poster **even when expo-video
119
+ * is installed**. Metro has a real `require` and is unaffected, which is why
120
+ * this went unnoticed — the app that uses this is Metro-built.
121
+ *
122
+ * There is no bundler-agnostic sync alternative: `import()` is async and this is
123
+ * called during render, so making it async would mean the surface renders
124
+ * without video for a frame and then upgrades. Handing the module over is
125
+ * explicit, synchronous, and costs the consumer one line at startup:
126
+ *
127
+ * ```ts
128
+ * import * as ExpoVideo from 'expo-video';
129
+ * provideExpoVideo(ExpoVideo);
130
+ * ```
131
+ *
132
+ * Pass `null` to clear it.
133
+ */
134
+ export function provideExpoVideo(module: ExpoVideoLike | null): void {
135
+ providedModule = module;
136
+ // Drop any cached `require` result so the next load reflects this decision.
137
+ videoModule = undefined;
138
+ }
139
+
111
140
  /** The expo-video module, or `null` when the optional peer is not installed. */
112
141
  export function loadExpoVideo(): ExpoVideoLike | null {
142
+ if (providedModule !== undefined && providedModule !== null) return providedModule;
113
143
  if (videoModule !== undefined) return videoModule;
114
144
  videoModule = null;
115
145
 
@@ -176,6 +206,7 @@ export function warnExpoVideoUnavailable(): void {
176
206
  /** Test seam — drops the cached module handle so a suite can load it again. */
177
207
  export function resetExpoVideoModule(): void {
178
208
  videoModule = undefined;
209
+ providedModule = undefined;
179
210
  unavailableReason = '';
180
211
  hasWarned = false;
181
212
  }
@@ -13,6 +13,7 @@ export { SURFACE_MOUNT_TIMEOUT_MS } from './constants';
13
13
  export {
14
14
  loadExpoVideo,
15
15
  warnExpoVideoUnavailable,
16
+ provideExpoVideo,
16
17
  resetExpoVideoModule,
17
18
  type ExpoVideoLike,
18
19
  type VideoPlayerLike,