1212import pandas as pd
1313import geopandas as gpd
1414
15- DEFAULT_KEPLER_GL_CDN_VERSION = "3"
15+ DEFAULT_KEPLER_GL_CDN_VERSION = "3.3.0-alpha.4"
16+
17+ REACT_VERSION = "19.1.0"
18+ REACT_DOM_VERSION = "19.1.0"
19+ REDUX_VERSION = "5.0.1"
20+ REACT_REDUX_VERSION = "9.3.0"
21+ STYLED_COMPONENTS_VERSION = "6.1.19"
22+ ES_MODULE_SHIMS_VERSION = "2.8.1"
1623
1724
1825def _dataset_to_csv (data ) -> Optional [str ]:
@@ -191,19 +198,73 @@ def export_map_html(
191198 <!--Kepler css-->
192199 <link href="https://unpkg.com/kepler.gl@{ kepler_gl_version } /umd/keplergl.min.css" rel="stylesheet">
193200
194- <!--MapBox css-->
195- <link href="https://api.tiles.mapbox.com/mapbox-gl-js/v1.1.1/mapbox-gl.css" rel="stylesheet">
196- <link href="https://unpkg.com/maplibre-gl@^3/dist/maplibre-gl.css" rel="stylesheet">
201+ <!--MapLibre css-->
202+ <link href="https://unpkg.com/maplibre-gl@^4/dist/maplibre-gl.css" rel="stylesheet">
203+
204+ <!--
205+ React >= 19 no longer ships UMD builds, so we load React and the other
206+ peer dependencies as ES modules from esm.sh via an import map, then
207+ expose them as window globals that the kepler.gl UMD bundle expects.
197208
198- <!-- Load React/Redux -->
199- <script src="https://unpkg.com/react@18.3.1/umd/react.production.min.js" crossorigin></script>
200- <script src="https://unpkg.com/react-dom@18.3.1/umd/react-dom.production.min.js" crossorigin></script>
201- <script src="https://unpkg.com/redux@4.2.1/dist/redux.js" crossorigin></script>
202- <script src="https://unpkg.com/react-redux@8.1.2/dist/react-redux.min.js" crossorigin></script>
203- <script src="https://unpkg.com/styled-components@6.1.8/dist/styled-components.min.js" crossorigin></script>
209+ es-module-shims runs in "shim mode" so the page also works when opened
210+ as a local file:// (native import maps are blocked under file://).
211+ -->
212+ <script>
213+ window.esmsInitOptions = {{shimMode: true, version: '{ ES_MODULE_SHIMS_VERSION } '}};
214+ </script>
215+ <script async src="https://ga.jspm.io/npm:es-module-shims@{ ES_MODULE_SHIMS_VERSION } /dist/es-module-shims.js" crossorigin="anonymous"></script>
216+
217+ <script type="importmap-shim">
218+ {{
219+ "imports": {{
220+ "react": "https://esm.sh/react@{ REACT_VERSION } ",
221+ "react/jsx-runtime": "https://esm.sh/react@{ REACT_VERSION } /jsx-runtime",
222+ "react-dom": "https://esm.sh/react-dom@{ REACT_DOM_VERSION } ?external=react",
223+ "react-dom/client": "https://esm.sh/react-dom@{ REACT_DOM_VERSION } /client?external=react",
224+ "redux": "https://esm.sh/redux@{ REDUX_VERSION } ",
225+ "react-redux": "https://esm.sh/react-redux@{ REACT_REDUX_VERSION } ?external=react,react-dom,redux",
226+ "styled-components": "https://esm.sh/styled-components@{ STYLED_COMPONENTS_VERSION } ?external=react,react-dom"
227+ }}
228+ }}
229+ </script>
204230
205- <!-- Load Kepler.gl -->
206- <script src="https://unpkg.com/kepler.gl@{ kepler_gl_version } /umd/keplergl.min.js" crossorigin></script>
231+ <!--
232+ Expose the ES modules as globals for the kepler.gl UMD bundle, then
233+ dynamically load that bundle and run the bootstrap scripts once ready.
234+ -->
235+ <script type="module-shim">
236+ import * as React from 'react';
237+ import * as ReactDOM from 'react-dom';
238+ import * as ReactDOMClient from 'react-dom/client';
239+ import * as Redux from 'redux';
240+ import * as ReactRedux from 'react-redux';
241+ import * as StyledComponents from 'styled-components';
242+
243+ window.React = React.default || React;
244+ window.ReactDOM = Object.assign({{}}, ReactDOM.default || ReactDOM, ReactDOMClient);
245+ window.Redux = Redux.default || Redux;
246+ window.ReactRedux = ReactRedux.default || ReactRedux;
247+ window.styled = Object.assign(StyledComponents.default, StyledComponents);
248+
249+ function loadScript(src) {{
250+ return new Promise(function(resolve, reject) {{
251+ var s = document.createElement('script');
252+ s.src = src; s.crossOrigin = 'anonymous';
253+ s.onload = resolve; s.onerror = reject;
254+ document.head.appendChild(s);
255+ }});
256+ }}
257+
258+ loadScript('https://unpkg.com/kepler.gl@{ kepler_gl_version } /umd/keplergl.min.js')
259+ .then(function() {{
260+ document.querySelectorAll('script[type="text/kepler-bootstrap"]').forEach(function(node) {{
261+ var s = document.createElement('script');
262+ s.text = node.textContent;
263+ document.body.appendChild(s);
264+ }});
265+ }})
266+ .catch(function(err) {{ console.error('kepler.gl: failed to load UMD bundle', err); }});
267+ </script>
207268
208269 <style type="text/css">
209270 body {{margin: 0; padding: 0; overflow: hidden;}}
@@ -216,7 +277,7 @@ def export_map_html(
216277 <body>
217278 <div id="app"></div>
218279
219- <script>
280+ <script type="text/kepler-bootstrap" >
220281 /** STORE **/
221282 const reducers = (function createReducers(redux, keplerGl) {{
222283 return redux.combineReducers({{
@@ -245,7 +306,6 @@ def export_map_html(
245306 /** COMPONENTS **/
246307 var KeplerElement = (function makeKeplerElement(react, keplerGl, mapboxToken) {{
247308 return function App() {{
248- var rootElm = react.useRef(null);
249309 var _useState = react.useState({{
250310 width: window.innerWidth,
251311 height: window.innerHeight
@@ -283,14 +343,13 @@ def export_map_html(
283343 /** END COMPONENTS **/
284344
285345 /** Render **/
286- (function render(react, reactDOM, app) {{
287- const container = document.getElementById('app');
288- const root = reactDOM.createRoot(container);
346+ (function render(reactDOM, app) {{
347+ const root = reactDOM.createRoot(document.getElementById('app'));
289348 root.render(app);
290- }}(React, ReactDOM, app));
349+ }}(ReactDOM, app));
291350 </script>
292351
293- <script>
352+ <script type="text/kepler-bootstrap" >
294353 (function customize(keplerGl, store) {{
295354 var datasets = [];
296355{ dataset_js }
0 commit comments