@sqlrooms/kepler 0.29.0-rc.7 → 0.29.0-rc.8

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 (46) hide show
  1. package/LICENSE.md +2 -1
  2. package/README.md +121 -4
  3. package/dist/KeplerSlice.d.ts +55 -2
  4. package/dist/KeplerSlice.d.ts.map +1 -1
  5. package/dist/KeplerSlice.js +92 -15
  6. package/dist/KeplerSlice.js.map +1 -1
  7. package/dist/components/CustomFilterManager.d.ts.map +1 -1
  8. package/dist/components/CustomFilterManager.js +16 -4
  9. package/dist/components/CustomFilterManager.js.map +1 -1
  10. package/dist/components/CustomLayerManager.d.ts.map +1 -1
  11. package/dist/components/CustomLayerManager.js +23 -110
  12. package/dist/components/CustomLayerManager.js.map +1 -1
  13. package/dist/components/CustomMapLegendPanel.d.ts +1 -1
  14. package/dist/components/CustomMapLegendPanel.d.ts.map +1 -1
  15. package/dist/components/CustomMapLegendPanel.js +14 -6
  16. package/dist/components/CustomMapLegendPanel.js.map +1 -1
  17. package/dist/components/CustomSourceDataSelector.d.ts +18 -0
  18. package/dist/components/CustomSourceDataSelector.d.ts.map +1 -0
  19. package/dist/components/CustomSourceDataSelector.js +130 -0
  20. package/dist/components/CustomSourceDataSelector.js.map +1 -0
  21. package/dist/components/KeplerInjector.d.ts.map +1 -1
  22. package/dist/components/KeplerInjector.js +3 -1
  23. package/dist/components/KeplerInjector.js.map +1 -1
  24. package/dist/components/KeplerMapContainer.d.ts.map +1 -1
  25. package/dist/components/KeplerMapContainer.js +9 -2
  26. package/dist/components/KeplerMapContainer.js.map +1 -1
  27. package/dist/components/KeplerProvider.d.ts.map +1 -1
  28. package/dist/components/KeplerProvider.js +3 -1
  29. package/dist/components/KeplerProvider.js.map +1 -1
  30. package/dist/components/KeplerTableSourceSelector.d.ts +20 -0
  31. package/dist/components/KeplerTableSourceSelector.d.ts.map +1 -0
  32. package/dist/components/KeplerTableSourceSelector.js +21 -0
  33. package/dist/components/KeplerTableSourceSelector.js.map +1 -0
  34. package/dist/index.d.ts +6 -1
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +2 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/keplerTableSelection.d.ts +142 -0
  39. package/dist/keplerTableSelection.d.ts.map +1 -0
  40. package/dist/keplerTableSelection.js +231 -0
  41. package/dist/keplerTableSelection.js.map +1 -0
  42. package/dist/styles/theme.d.ts +12 -0
  43. package/dist/styles/theme.d.ts.map +1 -1
  44. package/dist/styles/theme.js +12 -0
  45. package/dist/styles/theme.js.map +1 -1
  46. package/package.json +13 -7
@@ -1 +1 @@
1
- {"version":3,"file":"KeplerInjector.js","sourceRoot":"","sources":["../../src/components/KeplerInjector.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AddDataButtonFactory,\n ContainerFactory,\n injector as createInjector,\n DndContextFactory,\n Factory,\n FilterPanelHeaderFactory,\n flattenDeps,\n MapControlTooltipFactory,\n MapDrawPanelFactory,\n MapLegendFactory,\n MapLegendPanelFactory,\n PanelTitleFactory,\n typeCheckRecipe,\n type InjectorType,\n} from '@kepler.gl/components';\nimport React, {PropsWithChildren} from 'react';\nimport {CustomDndContextFactory} from './CustomDndContext';\nimport {CustomFilterPanelHeaderFactory} from './CustomFilterPanelHeader';\nimport {CustomMapControlTooltipFactory} from './CustomMapControlTooltipFactory';\nimport {CustomMapDrawPanelFactory} from './CustomMapDrawPanel';\nimport {CustomMapLegendFactory} from './CustomMapLegend';\nimport {CustomMapLegendPanelFactory} from './CustomMapLegendPanel';\n\nexport const CustomAddDataButtonFactory = () => {\n return () => null;\n};\n\nexport const CustomPanelTitleFactory = () => {\n const PanelTitle: React.FC<PropsWithChildren> = ({children}) => (\n <div className=\"flex items-center justify-end\">{children}</div>\n );\n\n return PanelTitle;\n};\n\nexport type KeplerFactory<TReturn = unknown> = (..._args: any[]) => TReturn;\nexport type KeplerFactoryRecipe = [KeplerFactory, KeplerFactory];\nexport type KeplerFactoryRecipeMode = 'append' | 'replace';\n\nconst defaultRecipes: KeplerFactoryRecipe[] = [\n [AddDataButtonFactory, CustomAddDataButtonFactory],\n [PanelTitleFactory, CustomPanelTitleFactory],\n [DndContextFactory, CustomDndContextFactory],\n [FilterPanelHeaderFactory, CustomFilterPanelHeaderFactory],\n [MapLegendPanelFactory, CustomMapLegendPanelFactory],\n [MapLegendFactory, CustomMapLegendFactory],\n [MapControlTooltipFactory, CustomMapControlTooltipFactory],\n [MapDrawPanelFactory, CustomMapDrawPanelFactory],\n];\n\nlet customRecipes: KeplerFactoryRecipe[] = [];\nlet injector = createKeplerInjector();\n\nfunction createBaseInjector() {\n const allDependencies = flattenDeps(\n [],\n ContainerFactory as unknown as Factory,\n );\n return allDependencies.reduce(\n (current, factory) => current.provide(factory, factory),\n createInjector(),\n );\n}\n\n/**\n * Applies factory replacement recipes on top of a fresh Kepler injector while\n * preserving explicit replacement targets.\n *\n * Kepler's default `provideRecipesToInjector` pre-provides all replacement\n * dependencies as identity mappings (`dep -> dep`) before applying each recipe.\n * That can unintentionally override factories that were already replaced by\n * earlier recipes, and emits noisy \"already injected\" warnings.\n *\n * This helper keeps the same high-level flow (process recipes in order and then\n * eagerly resolve the configured factories), but skips identity-providing any\n * dependency that is itself an explicit replacement target in the current\n * recipe set. As a result:\n * - earlier explicit replacements are not overwritten by later dependency setup\n * - replacement ordering remains deterministic\n * - configured factories are still warmed via `get(factoryToReplace)`\n */\nfunction provideRecipesToInjectorSafely(\n recipes: KeplerFactoryRecipe[],\n baseInjector: InjectorType,\n) {\n const replacementTargets = new Set(\n recipes\n .filter((recipe) =>\n typeCheckRecipe(recipe as unknown as [Factory, Factory]),\n )\n .map((recipe) => recipe[0]),\n );\n\n const provided = new Map();\n\n const injectorWithRecipes = recipes.reduce((currentInjector, recipe) => {\n if (!typeCheckRecipe(recipe as unknown as [Factory, Factory])) {\n return currentInjector;\n }\n\n const [factoryToReplace, replacementFactory] = recipe;\n const customDependencies = flattenDeps(\n [],\n replacementFactory as unknown as Factory,\n );\n\n const injectorWithDependencies = customDependencies.reduce(\n (dependencyInjector, dependencyFactory) => {\n // If a dependency has an explicit replacement recipe, skip self-injecting it.\n // This avoids overriding previous replacements and warning noise.\n if (\n replacementTargets.has(dependencyFactory as unknown as KeplerFactory)\n ) {\n return dependencyInjector;\n }\n return dependencyInjector.provide(dependencyFactory, dependencyFactory);\n },\n currentInjector,\n );\n\n provided.set(factoryToReplace, replacementFactory);\n return injectorWithDependencies.provide(\n factoryToReplace,\n replacementFactory,\n );\n }, baseInjector);\n\n provided.forEach((_, factoryToReplace) => {\n injectorWithRecipes.get(factoryToReplace);\n });\n\n return injectorWithRecipes;\n}\n\nfunction createKeplerInjector(recipes: KeplerFactoryRecipe[] = []) {\n return provideRecipesToInjectorSafely(\n [...defaultRecipes, ...recipes],\n createBaseInjector(),\n );\n}\n\nexport function configureKeplerInjector(\n recipes: KeplerFactoryRecipe[],\n options: {mode?: KeplerFactoryRecipeMode} = {},\n) {\n const mode = options.mode ?? 'append';\n customRecipes =\n mode === 'replace' ? [...recipes] : [...customRecipes, ...recipes];\n injector = createKeplerInjector(customRecipes);\n}\n\nexport function resetKeplerInjectorRecipes() {\n customRecipes = [];\n injector = createKeplerInjector();\n}\n\nexport function getKeplerInjector() {\n return injector;\n}\n\n// Cache resolved components per injector so we keep a stable component\n// reference across re-renders. Invalidated when injector is replaced (configure/reset).\nconst injectorToFactoryCache = new WeakMap<\n object,\n Map<KeplerFactory, React.ComponentType<Record<string, unknown>>>\n>();\n\n// Cache wrapper components per factory so callers always get a stable component type.\nconst factoryToWrapperCache = new Map<\n KeplerFactory,\n React.ComponentType<Record<string, unknown>>\n>();\n\nexport function getKeplerFactory<TFactory extends KeplerFactory>(\n factory: TFactory,\n): ReturnType<TFactory> {\n let Wrapped = factoryToWrapperCache.get(factory);\n if (Wrapped === undefined) {\n const WrappedComponent = function KeplerFactoryWrapper(\n props: Record<string, unknown>,\n ) {\n // Resolve at top level of render (not inside useMemo) so injector.get()\n // running the factory chain does not run hooks inside a hook.\n const injectorInstance = getKeplerInjector();\n let byFactory = injectorToFactoryCache.get(injectorInstance as object);\n if (byFactory === undefined) {\n byFactory = new Map();\n injectorToFactoryCache.set(injectorInstance as object, byFactory);\n }\n let Component = byFactory.get(factory);\n if (Component === undefined) {\n Component = injectorInstance.get(\n factory as unknown as Factory,\n ) as React.ComponentType<Record<string, unknown>>;\n byFactory.set(factory, Component);\n }\n // eslint-disable-next-line react-hooks/static-components -- Kepler factory components resolved at render by design\n return <Component {...props} />;\n };\n\n const factoryName = factory.name || 'Anonymous';\n WrappedComponent.displayName = `KeplerFactory(${factoryName})`;\n Wrapped = WrappedComponent;\n factoryToWrapperCache.set(factory, WrappedComponent);\n }\n return Wrapped as unknown as ReturnType<TFactory>;\n}\n\n/**\n * Stable access to Kepler factories. Prefer calling `get()` at module scope\n * (or in a constant initializer) so the returned component type is reused.\n */\nexport const KeplerInjector = {\n get<TFactory extends KeplerFactory>(factory: TFactory) {\n return getKeplerFactory(factory);\n },\n};\n"]}
1
+ {"version":3,"file":"KeplerInjector.js","sourceRoot":"","sources":["../../src/components/KeplerInjector.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n AddDataButtonFactory,\n ContainerFactory,\n injector as createInjector,\n DndContextFactory,\n Factory,\n FilterPanelHeaderFactory,\n flattenDeps,\n MapControlTooltipFactory,\n MapDrawPanelFactory,\n MapLegendFactory,\n MapLegendPanelFactory,\n PanelTitleFactory,\n SourceDataSelectorFactory,\n typeCheckRecipe,\n type InjectorType,\n} from '@kepler.gl/components';\nimport React, {PropsWithChildren} from 'react';\nimport {CustomDndContextFactory} from './CustomDndContext';\nimport {CustomFilterPanelHeaderFactory} from './CustomFilterPanelHeader';\nimport {CustomMapControlTooltipFactory} from './CustomMapControlTooltipFactory';\nimport {CustomMapDrawPanelFactory} from './CustomMapDrawPanel';\nimport {CustomMapLegendFactory} from './CustomMapLegend';\nimport {CustomMapLegendPanelFactory} from './CustomMapLegendPanel';\nimport {CustomSourceDataSelectorFactory} from './CustomSourceDataSelector';\n\nexport const CustomAddDataButtonFactory = () => {\n return () => null;\n};\n\nexport const CustomPanelTitleFactory = () => {\n const PanelTitle: React.FC<PropsWithChildren> = ({children}) => (\n <div className=\"flex items-center justify-end\">{children}</div>\n );\n\n return PanelTitle;\n};\n\nexport type KeplerFactory<TReturn = unknown> = (..._args: any[]) => TReturn;\nexport type KeplerFactoryRecipe = [KeplerFactory, KeplerFactory];\nexport type KeplerFactoryRecipeMode = 'append' | 'replace';\n\nconst defaultRecipes: KeplerFactoryRecipe[] = [\n [AddDataButtonFactory, CustomAddDataButtonFactory],\n [PanelTitleFactory, CustomPanelTitleFactory],\n [DndContextFactory, CustomDndContextFactory],\n [FilterPanelHeaderFactory, CustomFilterPanelHeaderFactory],\n [MapLegendPanelFactory, CustomMapLegendPanelFactory],\n [MapLegendFactory, CustomMapLegendFactory],\n [MapControlTooltipFactory, CustomMapControlTooltipFactory],\n [MapDrawPanelFactory, CustomMapDrawPanelFactory],\n [SourceDataSelectorFactory, CustomSourceDataSelectorFactory],\n];\n\nlet customRecipes: KeplerFactoryRecipe[] = [];\nlet injector = createKeplerInjector();\n\nfunction createBaseInjector() {\n const allDependencies = flattenDeps(\n [],\n ContainerFactory as unknown as Factory,\n );\n return allDependencies.reduce(\n (current, factory) => current.provide(factory, factory),\n createInjector(),\n );\n}\n\n/**\n * Applies factory replacement recipes on top of a fresh Kepler injector while\n * preserving explicit replacement targets.\n *\n * Kepler's default `provideRecipesToInjector` pre-provides all replacement\n * dependencies as identity mappings (`dep -> dep`) before applying each recipe.\n * That can unintentionally override factories that were already replaced by\n * earlier recipes, and emits noisy \"already injected\" warnings.\n *\n * This helper keeps the same high-level flow (process recipes in order and then\n * eagerly resolve the configured factories), but skips identity-providing any\n * dependency that is itself an explicit replacement target in the current\n * recipe set. As a result:\n * - earlier explicit replacements are not overwritten by later dependency setup\n * - replacement ordering remains deterministic\n * - configured factories are still warmed via `get(factoryToReplace)`\n */\nfunction provideRecipesToInjectorSafely(\n recipes: KeplerFactoryRecipe[],\n baseInjector: InjectorType,\n) {\n const replacementTargets = new Set(\n recipes\n .filter((recipe) =>\n typeCheckRecipe(recipe as unknown as [Factory, Factory]),\n )\n .map((recipe) => recipe[0]),\n );\n\n const provided = new Map();\n\n const injectorWithRecipes = recipes.reduce((currentInjector, recipe) => {\n if (!typeCheckRecipe(recipe as unknown as [Factory, Factory])) {\n return currentInjector;\n }\n\n const [factoryToReplace, replacementFactory] = recipe;\n const customDependencies = flattenDeps(\n [],\n replacementFactory as unknown as Factory,\n );\n\n const injectorWithDependencies = customDependencies.reduce(\n (dependencyInjector, dependencyFactory) => {\n // If a dependency has an explicit replacement recipe, skip self-injecting it.\n // This avoids overriding previous replacements and warning noise.\n if (\n replacementTargets.has(dependencyFactory as unknown as KeplerFactory)\n ) {\n return dependencyInjector;\n }\n return dependencyInjector.provide(dependencyFactory, dependencyFactory);\n },\n currentInjector,\n );\n\n provided.set(factoryToReplace, replacementFactory);\n return injectorWithDependencies.provide(\n factoryToReplace,\n replacementFactory,\n );\n }, baseInjector);\n\n provided.forEach((_, factoryToReplace) => {\n injectorWithRecipes.get(factoryToReplace);\n });\n\n return injectorWithRecipes;\n}\n\nfunction createKeplerInjector(recipes: KeplerFactoryRecipe[] = []) {\n return provideRecipesToInjectorSafely(\n [...defaultRecipes, ...recipes],\n createBaseInjector(),\n );\n}\n\nexport function configureKeplerInjector(\n recipes: KeplerFactoryRecipe[],\n options: {mode?: KeplerFactoryRecipeMode} = {},\n) {\n const mode = options.mode ?? 'append';\n customRecipes =\n mode === 'replace' ? [...recipes] : [...customRecipes, ...recipes];\n injector = createKeplerInjector(customRecipes);\n}\n\nexport function resetKeplerInjectorRecipes() {\n customRecipes = [];\n injector = createKeplerInjector();\n}\n\nexport function getKeplerInjector() {\n return injector;\n}\n\n// Cache resolved components per injector so we keep a stable component\n// reference across re-renders. Invalidated when injector is replaced (configure/reset).\nconst injectorToFactoryCache = new WeakMap<\n object,\n Map<KeplerFactory, React.ComponentType<Record<string, unknown>>>\n>();\n\n// Cache wrapper components per factory so callers always get a stable component type.\nconst factoryToWrapperCache = new Map<\n KeplerFactory,\n React.ComponentType<Record<string, unknown>>\n>();\n\nexport function getKeplerFactory<TFactory extends KeplerFactory>(\n factory: TFactory,\n): ReturnType<TFactory> {\n let Wrapped = factoryToWrapperCache.get(factory);\n if (Wrapped === undefined) {\n const WrappedComponent = function KeplerFactoryWrapper(\n props: Record<string, unknown>,\n ) {\n // Resolve at top level of render (not inside useMemo) so injector.get()\n // running the factory chain does not run hooks inside a hook.\n const injectorInstance = getKeplerInjector();\n let byFactory = injectorToFactoryCache.get(injectorInstance as object);\n if (byFactory === undefined) {\n byFactory = new Map();\n injectorToFactoryCache.set(injectorInstance as object, byFactory);\n }\n let Component = byFactory.get(factory);\n if (Component === undefined) {\n Component = injectorInstance.get(\n factory as unknown as Factory,\n ) as React.ComponentType<Record<string, unknown>>;\n byFactory.set(factory, Component);\n }\n // eslint-disable-next-line react-hooks/static-components -- Kepler factory components resolved at render by design\n return <Component {...props} />;\n };\n\n const factoryName = factory.name || 'Anonymous';\n WrappedComponent.displayName = `KeplerFactory(${factoryName})`;\n Wrapped = WrappedComponent;\n factoryToWrapperCache.set(factory, WrappedComponent);\n }\n return Wrapped as unknown as ReturnType<TFactory>;\n}\n\n/**\n * Stable access to Kepler factories. Prefer calling `get()` at module scope\n * (or in a constant initializer) so the returned component type is reused.\n */\nexport const KeplerInjector = {\n get<TFactory extends KeplerFactory>(factory: TFactory) {\n return getKeplerFactory(factory);\n },\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"KeplerMapContainer.d.ts","sourceRoot":"","sources":["../../src/components/KeplerMapContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAuC,MAAM,OAAO,CAAC;AAsO/D,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;CACf,CAMA,CAAC"}
1
+ {"version":3,"file":"KeplerMapContainer.d.ts","sourceRoot":"","sources":["../../src/components/KeplerMapContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAC,EAAE,EAAuC,MAAM,OAAO,CAAC;AAgP/D,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;CACf,CAMA,CAAC"}
@@ -49,9 +49,10 @@ const KeplerGl = ({ mapId }) => {
49
49
  const [containerNode, setContainerNode] = useState(null);
50
50
  const theme = useTheme();
51
51
  const basicKeplerProps = useStoreWithKepler((state) => state.kepler.basicKeplerProps);
52
+ const modalPortalTarget = useStoreWithKepler((state) => state.kepler.modalPortalTarget);
52
53
  const { keplerActions, keplerState } = useKeplerStateActions({ mapId });
53
54
  const interactionConfig = keplerState?.visState?.interactionConfig;
54
- // Capture the current container DOM node outside of render logic
55
+ // Capture container DOM node outside of render for portal use
55
56
  useEffect(() => {
56
57
  setContainerNode(containerRef.current);
57
58
  }, [containerRef]);
@@ -111,8 +112,14 @@ const KeplerGl = ({ mapId }) => {
111
112
  },
112
113
  };
113
114
  }, [hasFilters, hasAnimatableLayers, mergedKeplerProps, theme]);
115
+ const modalPortalNode = useMemo(() => {
116
+ if (modalPortalTarget === 'body') {
117
+ return typeof document !== 'undefined' ? document.body : null;
118
+ }
119
+ return containerNode;
120
+ }, [modalPortalTarget, containerNode]);
114
121
  const modalContainerFields = keplerState?.visState
115
- ? modalContainerSelector(mergedKeplerProps, containerNode)
122
+ ? modalContainerSelector(mergedKeplerProps, modalPortalNode)
116
123
  : null;
117
124
  const mapboxApiAccessToken = mapFields?.mapStyle?.mapboxApiAccessToken ||
118
125
  basicKeplerProps?.mapboxApiAccessToken;
@@ -1 +1 @@
1
- {"version":3,"file":"KeplerMapContainer.js","sourceRoot":"","sources":["../../src/components/KeplerMapContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {FC, useMemo, useRef, useEffect, useState} from 'react';\n\nimport {\n MapContainerFactory,\n BottomWidgetFactory,\n GeocoderPanelFactory,\n mapFieldsSelector,\n bottomWidgetSelector,\n geoCoderPanelSelector,\n modalContainerSelector,\n MapViewStateContextProvider,\n RootContext,\n ModalContainerFactory,\n} from '@kepler.gl/components';\nimport {useDimensions, getAnimatableVisibleLayers} from '@kepler.gl/utils';\nimport styled, {useTheme} from 'styled-components';\n\nimport {getKeplerFactory} from './KeplerInjector';\nimport {KeplerProvider} from './KeplerProvider';\nimport {useKeplerStateActions} from '../hooks/useKeplerStateActions';\nimport {useStoreWithKepler} from '../KeplerSlice';\nimport {SplitMapIndexContext} from './SplitMapIndexContext';\n\nconst MapContainer = getKeplerFactory(MapContainerFactory);\nconst BottomWidget = getKeplerFactory(BottomWidgetFactory);\nconst GeoCoderPanel = getKeplerFactory(GeocoderPanelFactory);\nconst ModalContainer = getKeplerFactory(ModalContainerFactory);\n\nconst DEFAULT_DIMENSIONS = {\n width: 0,\n height: 0,\n};\nconst KEPLER_PROPS = {\n mapboxApiUrl: 'https://api.mapbox.com',\n appName: 'kepler.gl',\n sidePanelWidth: 0,\n};\n// overide kepler default style\nconst CustomWidgetcontainer = styled.div`\n .bottom-widget--inner {\n margin-top: 0;\n }\n\n .map-popover {\n z-index: 50;\n }\n\n /* Remove top margin from Trip layer timeline */\n .kepler-gl .bottom-widget--container .animation-control-container,\n .bottom-widget--container .animation-control-container {\n margin-top: 0 !important;\n }\n`;\n\nconst SplitMapsContainer = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n position: relative;\n`;\n\ntype KeplerGLProps = Parameters<typeof geoCoderPanelSelector>[0];\n\nconst KeplerGl: FC<{\n mapId: string;\n}> = ({mapId}) => {\n const bottomWidgetRef = useRef(null);\n const [containerRef, size] = useDimensions<HTMLDivElement>();\n const [containerNode, setContainerNode] = useState<HTMLElement | null>(null);\n const theme = useTheme();\n const basicKeplerProps = useStoreWithKepler(\n (state) => state.kepler.basicKeplerProps,\n );\n\n const {keplerActions, keplerState} = useKeplerStateActions({mapId});\n const interactionConfig = keplerState?.visState?.interactionConfig;\n\n // Capture the current container DOM node outside of render logic\n useEffect(() => {\n setContainerNode(containerRef.current);\n }, [containerRef]);\n\n // Update export image settings when size changes\n useEffect(() => {\n if (size?.width && size?.height) {\n keplerActions.uiStateActions.setExportImageSetting({\n mapW: size.width,\n mapH: size.height,\n });\n }\n }, [size?.width, size?.height, keplerActions.uiStateActions]);\n\n const mergedKeplerProps = useMemo(() => {\n return {\n ...KEPLER_PROPS,\n ...keplerState,\n ...keplerActions,\n id: mapId,\n } as KeplerGLProps;\n }, [keplerState, keplerActions, mapId]);\n const geoCoderPanelFields = keplerState?.visState\n ? geoCoderPanelSelector(\n mergedKeplerProps,\n // dont need height\n size || DEFAULT_DIMENSIONS,\n )\n : null;\n\n const splitMaps = keplerState?.visState?.splitMaps;\n const isSplit = splitMaps && splitMaps.length > 1;\n\n const mapFields = useMemo(\n () => (keplerState?.visState ? mapFieldsSelector(mergedKeplerProps) : null),\n [keplerState, mergedKeplerProps],\n );\n const mapFieldsSplit = useMemo(\n () =>\n isSplit && keplerState?.visState\n ? splitMaps.map((_, index) =>\n mapFieldsSelector(mergedKeplerProps, index),\n )\n : null,\n [keplerState, mergedKeplerProps, isSplit, splitMaps],\n );\n\n // Check if there are filters or animatable layers (e.g., Trip layers)\n const hasFilters = Boolean(keplerState?.visState.filters?.length);\n const hasAnimatableLayers = useMemo(() => {\n const layers = keplerState?.visState?.layers || [];\n return getAnimatableVisibleLayers(layers).length > 0;\n }, [keplerState?.visState?.layers]);\n\n const bottomWidgetFields = useMemo(() => {\n if (!hasFilters && !hasAnimatableLayers) return null;\n const fields = bottomWidgetSelector(mergedKeplerProps, theme);\n // The legend is rendered as a draggable, portaled overlay so the\n // BottomWidget should not shrink to reserve space for it. Mask\n // mapLegend.active so the upstream spaceForLegendWidth stays 0.\n return {\n ...fields,\n uiState: {\n ...fields.uiState,\n mapControls: {\n ...fields.uiState.mapControls,\n mapLegend: {\n ...fields.uiState.mapControls?.mapLegend,\n show: fields.uiState.mapControls?.mapLegend?.show ?? false,\n active: false,\n },\n },\n },\n };\n }, [hasFilters, hasAnimatableLayers, mergedKeplerProps, theme]);\n\n const modalContainerFields = keplerState?.visState\n ? modalContainerSelector(mergedKeplerProps, containerNode)\n : null;\n\n const mapboxApiAccessToken =\n mapFields?.mapStyle?.mapboxApiAccessToken ||\n basicKeplerProps?.mapboxApiAccessToken;\n return (\n <RootContext.Provider value={containerRef}>\n <CustomWidgetcontainer\n ref={containerRef}\n className=\"kepler-gl relative flex h-full w-full flex-col justify-between\"\n >\n {isSplit && mapFieldsSplit ? (\n <SplitMapsContainer>\n <MapViewStateContextProvider\n mapState={\n (mapFieldsSplit[0]?.mapState ??\n mapFields?.mapState) as NonNullable<\n typeof mapFields\n >['mapState']\n }\n >\n {mapFieldsSplit.map((fields, index) => (\n <SplitMapIndexContext.Provider key={index} value={index}>\n <MapContainer\n index={index}\n primary={index === 1}\n containerId={index}\n {...fields}\n mapboxApiAccessToken={mapboxApiAccessToken || ''}\n />\n </SplitMapIndexContext.Provider>\n ))}\n </MapViewStateContextProvider>\n </SplitMapsContainer>\n ) : mapFields?.mapState ? (\n <MapViewStateContextProvider mapState={mapFields.mapState}>\n <MapContainer\n primary={true}\n containerId={0}\n key={0}\n index={0}\n {...mapFields}\n mapboxApiAccessToken={mapboxApiAccessToken || ''}\n />\n </MapViewStateContextProvider>\n ) : null}\n {geoCoderPanelFields && interactionConfig?.geocoder?.enabled ? (\n <GeoCoderPanel\n {...geoCoderPanelFields}\n index={0}\n unsyncedViewports={false}\n mapboxApiAccessToken={mapboxApiAccessToken || ''}\n />\n ) : null}\n {size && bottomWidgetFields ? (\n <BottomWidget\n rootRef={bottomWidgetRef}\n {...bottomWidgetFields}\n theme={theme}\n containerW={size?.width}\n />\n ) : null}\n {size && size.width && size.height && modalContainerFields ? (\n <ModalContainer\n {...modalContainerFields}\n containerW={size?.width}\n containerH={size?.height}\n />\n ) : null}\n </CustomWidgetcontainer>\n </RootContext.Provider>\n );\n};\n\nexport const KeplerMapContainer: FC<{\n mapId: string;\n}> = ({mapId}) => {\n return (\n <KeplerProvider mapId={mapId}>\n <KeplerGl mapId={mapId} />\n </KeplerProvider>\n );\n};\n"]}
1
+ {"version":3,"file":"KeplerMapContainer.js","sourceRoot":"","sources":["../../src/components/KeplerMapContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {FC, useMemo, useRef, useEffect, useState} from 'react';\n\nimport {\n MapContainerFactory,\n BottomWidgetFactory,\n GeocoderPanelFactory,\n mapFieldsSelector,\n bottomWidgetSelector,\n geoCoderPanelSelector,\n modalContainerSelector,\n MapViewStateContextProvider,\n RootContext,\n ModalContainerFactory,\n} from '@kepler.gl/components';\nimport {useDimensions, getAnimatableVisibleLayers} from '@kepler.gl/utils';\nimport styled, {useTheme} from 'styled-components';\n\nimport {getKeplerFactory} from './KeplerInjector';\nimport {KeplerProvider} from './KeplerProvider';\nimport {useKeplerStateActions} from '../hooks/useKeplerStateActions';\nimport {useStoreWithKepler} from '../KeplerSlice';\nimport {SplitMapIndexContext} from './SplitMapIndexContext';\n\nconst MapContainer = getKeplerFactory(MapContainerFactory);\nconst BottomWidget = getKeplerFactory(BottomWidgetFactory);\nconst GeoCoderPanel = getKeplerFactory(GeocoderPanelFactory);\nconst ModalContainer = getKeplerFactory(ModalContainerFactory);\n\nconst DEFAULT_DIMENSIONS = {\n width: 0,\n height: 0,\n};\nconst KEPLER_PROPS = {\n mapboxApiUrl: 'https://api.mapbox.com',\n appName: 'kepler.gl',\n sidePanelWidth: 0,\n};\n// overide kepler default style\nconst CustomWidgetcontainer = styled.div`\n .bottom-widget--inner {\n margin-top: 0;\n }\n\n .map-popover {\n z-index: 50;\n }\n\n /* Remove top margin from Trip layer timeline */\n .kepler-gl .bottom-widget--container .animation-control-container,\n .bottom-widget--container .animation-control-container {\n margin-top: 0 !important;\n }\n`;\n\nconst SplitMapsContainer = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n position: relative;\n`;\n\ntype KeplerGLProps = Parameters<typeof geoCoderPanelSelector>[0];\n\nconst KeplerGl: FC<{\n mapId: string;\n}> = ({mapId}) => {\n const bottomWidgetRef = useRef(null);\n const [containerRef, size] = useDimensions<HTMLDivElement>();\n const [containerNode, setContainerNode] = useState<HTMLElement | null>(null);\n const theme = useTheme();\n const basicKeplerProps = useStoreWithKepler(\n (state) => state.kepler.basicKeplerProps,\n );\n const modalPortalTarget = useStoreWithKepler(\n (state) => state.kepler.modalPortalTarget,\n );\n\n const {keplerActions, keplerState} = useKeplerStateActions({mapId});\n const interactionConfig = keplerState?.visState?.interactionConfig;\n\n // Capture container DOM node outside of render for portal use\n useEffect(() => {\n setContainerNode(containerRef.current);\n }, [containerRef]);\n\n // Update export image settings when size changes\n useEffect(() => {\n if (size?.width && size?.height) {\n keplerActions.uiStateActions.setExportImageSetting({\n mapW: size.width,\n mapH: size.height,\n });\n }\n }, [size?.width, size?.height, keplerActions.uiStateActions]);\n\n const mergedKeplerProps = useMemo(() => {\n return {\n ...KEPLER_PROPS,\n ...keplerState,\n ...keplerActions,\n id: mapId,\n } as KeplerGLProps;\n }, [keplerState, keplerActions, mapId]);\n const geoCoderPanelFields = keplerState?.visState\n ? geoCoderPanelSelector(\n mergedKeplerProps,\n // dont need height\n size || DEFAULT_DIMENSIONS,\n )\n : null;\n\n const splitMaps = keplerState?.visState?.splitMaps;\n const isSplit = splitMaps && splitMaps.length > 1;\n\n const mapFields = useMemo(\n () => (keplerState?.visState ? mapFieldsSelector(mergedKeplerProps) : null),\n [keplerState, mergedKeplerProps],\n );\n const mapFieldsSplit = useMemo(\n () =>\n isSplit && keplerState?.visState\n ? splitMaps.map((_, index) =>\n mapFieldsSelector(mergedKeplerProps, index),\n )\n : null,\n [keplerState, mergedKeplerProps, isSplit, splitMaps],\n );\n\n // Check if there are filters or animatable layers (e.g., Trip layers)\n const hasFilters = Boolean(keplerState?.visState.filters?.length);\n const hasAnimatableLayers = useMemo(() => {\n const layers = keplerState?.visState?.layers || [];\n return getAnimatableVisibleLayers(layers).length > 0;\n }, [keplerState?.visState?.layers]);\n\n const bottomWidgetFields = useMemo(() => {\n if (!hasFilters && !hasAnimatableLayers) return null;\n const fields = bottomWidgetSelector(mergedKeplerProps, theme);\n // The legend is rendered as a draggable, portaled overlay so the\n // BottomWidget should not shrink to reserve space for it. Mask\n // mapLegend.active so the upstream spaceForLegendWidth stays 0.\n return {\n ...fields,\n uiState: {\n ...fields.uiState,\n mapControls: {\n ...fields.uiState.mapControls,\n mapLegend: {\n ...fields.uiState.mapControls?.mapLegend,\n show: fields.uiState.mapControls?.mapLegend?.show ?? false,\n active: false,\n },\n },\n },\n };\n }, [hasFilters, hasAnimatableLayers, mergedKeplerProps, theme]);\n\n const modalPortalNode = useMemo(() => {\n if (modalPortalTarget === 'body') {\n return typeof document !== 'undefined' ? document.body : null;\n }\n return containerNode;\n }, [modalPortalTarget, containerNode]);\n\n const modalContainerFields = keplerState?.visState\n ? modalContainerSelector(mergedKeplerProps, modalPortalNode)\n : null;\n\n const mapboxApiAccessToken =\n mapFields?.mapStyle?.mapboxApiAccessToken ||\n basicKeplerProps?.mapboxApiAccessToken;\n return (\n <RootContext.Provider value={containerRef}>\n <CustomWidgetcontainer\n ref={containerRef}\n className=\"kepler-gl relative flex h-full w-full flex-col justify-between\"\n >\n {isSplit && mapFieldsSplit ? (\n <SplitMapsContainer>\n <MapViewStateContextProvider\n mapState={\n (mapFieldsSplit[0]?.mapState ??\n mapFields?.mapState) as NonNullable<\n typeof mapFields\n >['mapState']\n }\n >\n {mapFieldsSplit.map((fields, index) => (\n <SplitMapIndexContext.Provider key={index} value={index}>\n <MapContainer\n index={index}\n primary={index === 1}\n containerId={index}\n {...fields}\n mapboxApiAccessToken={mapboxApiAccessToken || ''}\n />\n </SplitMapIndexContext.Provider>\n ))}\n </MapViewStateContextProvider>\n </SplitMapsContainer>\n ) : mapFields?.mapState ? (\n <MapViewStateContextProvider mapState={mapFields.mapState}>\n <MapContainer\n primary={true}\n containerId={0}\n key={0}\n index={0}\n {...mapFields}\n mapboxApiAccessToken={mapboxApiAccessToken || ''}\n />\n </MapViewStateContextProvider>\n ) : null}\n {geoCoderPanelFields && interactionConfig?.geocoder?.enabled ? (\n <GeoCoderPanel\n {...geoCoderPanelFields}\n index={0}\n unsyncedViewports={false}\n mapboxApiAccessToken={mapboxApiAccessToken || ''}\n />\n ) : null}\n {size && bottomWidgetFields ? (\n <BottomWidget\n rootRef={bottomWidgetRef}\n {...bottomWidgetFields}\n theme={theme}\n containerW={size?.width}\n />\n ) : null}\n {size && size.width && size.height && modalContainerFields ? (\n <ModalContainer\n {...modalContainerFields}\n containerW={size?.width}\n containerH={size?.height}\n />\n ) : null}\n </CustomWidgetcontainer>\n </RootContext.Provider>\n );\n};\n\nexport const KeplerMapContainer: FC<{\n mapId: string;\n}> = ({mapId}) => {\n return (\n <KeplerProvider mapId={mapId}>\n <KeplerGl mapId={mapId} />\n </KeplerProvider>\n );\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"KeplerProvider.d.ts","sourceRoot":"","sources":["../../src/components/KeplerProvider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,iBAAiB,EAAU,MAAM,OAAO,CAAC;AASjD,KAAK,mBAAmB,GAAG,iBAAiB,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAGH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CA+BxD,CAAC"}
1
+ {"version":3,"file":"KeplerProvider.d.ts","sourceRoot":"","sources":["../../src/components/KeplerProvider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAC,iBAAiB,EAAU,MAAM,OAAO,CAAC;AASjD,KAAK,mBAAmB,GAAG,iBAAiB,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAGH,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAiCxD,CAAC"}
@@ -10,6 +10,8 @@ import { Provider } from 'react-redux';
10
10
  // Provide intl, theme, context, and redux store to the kepler
11
11
  export const KeplerProvider = ({ children, mapId, }) => {
12
12
  const reduxProviderStore = useStoreWithKepler((state) => state.kepler.__reduxProviderStore);
13
+ const keplerTheme = useStoreWithKepler((state) => state.kepler.keplerTheme);
14
+ const resolvedTheme = useMemo(() => keplerTheme ?? darkTheme, [keplerTheme]);
13
15
  const keplerContext = useMemo(() => ({
14
16
  selector: (state) => state[mapId],
15
17
  id: mapId,
@@ -17,6 +19,6 @@ export const KeplerProvider = ({ children, mapId, }) => {
17
19
  if (!reduxProviderStore) {
18
20
  return null;
19
21
  }
20
- return (_jsx(IntlProvider, { locale: "en", messages: messages['en'], children: _jsx(Provider, { store: reduxProviderStore, children: _jsx(StyleSheetManager, { shouldForwardProp: shouldForwardProp, children: _jsx(ThemeProvider, { theme: darkTheme, children: _jsx(KeplerGlContext.Provider, { value: keplerContext, children: _jsx(_Fragment, { children: children }) }) }) }) }) }));
22
+ return (_jsx(IntlProvider, { locale: "en", messages: messages['en'], children: _jsx(Provider, { store: reduxProviderStore, children: _jsx(StyleSheetManager, { shouldForwardProp: shouldForwardProp, children: _jsx(ThemeProvider, { theme: resolvedTheme, children: _jsx(KeplerGlContext.Provider, { value: keplerContext, children: _jsx(_Fragment, { children: children }) }) }) }) }) }));
21
23
  };
22
24
  //# sourceMappingURL=KeplerProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KeplerProvider.js","sourceRoot":"","sources":["../../src/components/KeplerProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAoB,OAAO,EAAC,MAAM,OAAO,CAAC;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAC;AACxC,OAAO,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAqB,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAC,eAAe,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAMrC,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAkC,CAAC,EAC5D,QAAQ,EACR,KAAK,GACN,EAAE,EAAE;IACH,MAAM,kBAAkB,GAAG,kBAAkB,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAC7C,CAAC;IAEF,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,CAAC,KAAyB,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACrD,EAAE,EAAE,KAAK;KACV,CAAC,EACF,CAAC,KAAK,CAAC,CACR,CAAC;IACF,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,KAAC,YAAY,IAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,YAChD,KAAC,QAAQ,IAAC,KAAK,EAAE,kBAAkB,YACjC,KAAC,iBAAiB,IAAC,iBAAiB,EAAE,iBAAiB,YACrD,KAAC,aAAa,IAAC,KAAK,EAAE,SAAS,YAC7B,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa,YAC5C,4BAAG,QAAQ,GAAI,GACU,GACb,GACE,GACX,GACE,CAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {messages} from '@kepler.gl/localization';\nimport {PropsWithChildren, useMemo} from 'react';\nimport {IntlProvider} from 'react-intl';\nimport {ThemeProvider, StyleSheetManager} from 'styled-components';\nimport {KeplerGlReduxState, useStoreWithKepler} from '../KeplerSlice';\n\nimport {KeplerGlContext, shouldForwardProp} from '@kepler.gl/components';\nimport {darkTheme} from '../styles/theme';\nimport {Provider} from 'react-redux';\n\ntype KeplerProviderProps = PropsWithChildren<{\n mapId: string;\n}>;\n\n// Provide intl, theme, context, and redux store to the kepler\nexport const KeplerProvider: React.FC<KeplerProviderProps> = ({\n children,\n mapId,\n}) => {\n const reduxProviderStore = useStoreWithKepler(\n (state) => state.kepler.__reduxProviderStore,\n );\n\n const keplerContext = useMemo(\n () => ({\n selector: (state: KeplerGlReduxState) => state[mapId],\n id: mapId,\n }),\n [mapId],\n );\n if (!reduxProviderStore) {\n return null;\n }\n return (\n <IntlProvider locale=\"en\" messages={messages['en']}>\n <Provider store={reduxProviderStore}>\n <StyleSheetManager shouldForwardProp={shouldForwardProp}>\n <ThemeProvider theme={darkTheme}>\n <KeplerGlContext.Provider value={keplerContext}>\n <>{children}</>\n </KeplerGlContext.Provider>\n </ThemeProvider>\n </StyleSheetManager>\n </Provider>\n </IntlProvider>\n );\n};\n"]}
1
+ {"version":3,"file":"KeplerProvider.js","sourceRoot":"","sources":["../../src/components/KeplerProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAoB,OAAO,EAAC,MAAM,OAAO,CAAC;AACjD,OAAO,EAAC,YAAY,EAAC,MAAM,YAAY,CAAC;AACxC,OAAO,EAAC,aAAa,EAAE,iBAAiB,EAAC,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAqB,kBAAkB,EAAC,MAAM,gBAAgB,CAAC;AAEtE,OAAO,EAAC,eAAe,EAAE,iBAAiB,EAAC,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAC,QAAQ,EAAC,MAAM,aAAa,CAAC;AAMrC,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GAAkC,CAAC,EAC5D,QAAQ,EACR,KAAK,GACN,EAAE,EAAE;IACH,MAAM,kBAAkB,GAAG,kBAAkB,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAC7C,CAAC;IACF,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,WAAW,IAAI,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAE7E,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,CAAC;QACL,QAAQ,EAAE,CAAC,KAAyB,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACrD,EAAE,EAAE,KAAK;KACV,CAAC,EACF,CAAC,KAAK,CAAC,CACR,CAAC;IACF,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,CACL,KAAC,YAAY,IAAC,MAAM,EAAC,IAAI,EAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,YAChD,KAAC,QAAQ,IAAC,KAAK,EAAE,kBAAkB,YACjC,KAAC,iBAAiB,IAAC,iBAAiB,EAAE,iBAAiB,YACrD,KAAC,aAAa,IAAC,KAAK,EAAE,aAAa,YACjC,KAAC,eAAe,CAAC,QAAQ,IAAC,KAAK,EAAE,aAAa,YAC5C,4BAAG,QAAQ,GAAI,GACU,GACb,GACE,GACX,GACE,CAChB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import {messages} from '@kepler.gl/localization';\nimport {PropsWithChildren, useMemo} from 'react';\nimport {IntlProvider} from 'react-intl';\nimport {ThemeProvider, StyleSheetManager} from 'styled-components';\nimport {KeplerGlReduxState, useStoreWithKepler} from '../KeplerSlice';\n\nimport {KeplerGlContext, shouldForwardProp} from '@kepler.gl/components';\nimport {darkTheme} from '../styles/theme';\nimport {Provider} from 'react-redux';\n\ntype KeplerProviderProps = PropsWithChildren<{\n mapId: string;\n}>;\n\n// Provide intl, theme, context, and redux store to the kepler\nexport const KeplerProvider: React.FC<KeplerProviderProps> = ({\n children,\n mapId,\n}) => {\n const reduxProviderStore = useStoreWithKepler(\n (state) => state.kepler.__reduxProviderStore,\n );\n const keplerTheme = useStoreWithKepler((state) => state.kepler.keplerTheme);\n const resolvedTheme = useMemo(() => keplerTheme ?? darkTheme, [keplerTheme]);\n\n const keplerContext = useMemo(\n () => ({\n selector: (state: KeplerGlReduxState) => state[mapId],\n id: mapId,\n }),\n [mapId],\n );\n if (!reduxProviderStore) {\n return null;\n }\n return (\n <IntlProvider locale=\"en\" messages={messages['en']}>\n <Provider store={reduxProviderStore}>\n <StyleSheetManager shouldForwardProp={shouldForwardProp}>\n <ThemeProvider theme={resolvedTheme}>\n <KeplerGlContext.Provider value={keplerContext}>\n <>{children}</>\n </KeplerGlContext.Provider>\n </ThemeProvider>\n </StyleSheetManager>\n </Provider>\n </IntlProvider>\n );\n};\n"]}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ import type { KeplerTableSourceOption } from '../keplerTableSelection';
3
+ export type KeplerTableSourceSelectorProps = {
4
+ disabled?: boolean;
5
+ emptyMessage?: string;
6
+ options: KeplerTableSourceOption[];
7
+ popoverAlign?: 'start' | 'center' | 'end';
8
+ popoverClassName?: string;
9
+ searchPlaceholder?: string;
10
+ selectedValue?: string;
11
+ triggerClassName?: string;
12
+ onSelect: (option: KeplerTableSourceOption) => void;
13
+ renderTrigger?: (props: {
14
+ disabled: boolean;
15
+ open: boolean;
16
+ selectedOption?: KeplerTableSourceOption;
17
+ }) => React.ReactNode;
18
+ };
19
+ export declare const KeplerTableSourceSelector: React.FC<KeplerTableSourceSelectorProps>;
20
+ //# sourceMappingURL=KeplerTableSourceSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeplerTableSourceSelector.d.ts","sourceRoot":"","sources":["../../src/components/KeplerTableSourceSelector.tsx"],"names":[],"mappings":"AAcA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAC/C,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,yBAAyB,CAAC;AAErE,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC1C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,uBAAuB,KAAK,IAAI,CAAC;IACpD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE;QACtB,QAAQ,EAAE,OAAO,CAAC;QAClB,IAAI,EAAE,OAAO,CAAC;QACd,cAAc,CAAC,EAAE,uBAAuB,CAAC;KAC1C,KAAK,KAAK,CAAC,SAAS,CAAC;CACvB,CAAC;AAmBF,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,EAAE,CAC9C,8BAA8B,CAqF/B,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, cn, Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, Popover, PopoverContent, PopoverTrigger, } from '@sqlrooms/ui';
3
+ import { Check, ChevronsUpDown } from 'lucide-react';
4
+ import { useMemo, useState } from 'react';
5
+ const DefaultTrigger = ({ disabled, selectedOption }) => (_jsxs(Button, { type: "button", variant: "outline", className: "h-8 w-full justify-between px-2 text-xs", disabled: disabled, children: [_jsx("span", { className: "min-w-0 truncate", children: selectedOption?.label ?? 'Select data source' }), _jsx(ChevronsUpDown, { className: "ml-2 h-3.5 w-3.5 shrink-0 opacity-60" })] }));
6
+ export const KeplerTableSourceSelector = ({ disabled = false, emptyMessage = 'No tables found.', options, popoverAlign = 'start', popoverClassName, searchPlaceholder = 'Search tables...', selectedValue, triggerClassName, onSelect, renderTrigger, }) => {
7
+ const [open, setOpen] = useState(false);
8
+ const selectedOption = useMemo(() => options.find((option) => option.value === selectedValue), [options, selectedValue]);
9
+ const handleSelect = (option) => {
10
+ onSelect(option);
11
+ setOpen(false);
12
+ };
13
+ return (_jsxs(Popover, { open: open, onOpenChange: (nextOpen) => {
14
+ if (!disabled) {
15
+ setOpen(nextOpen);
16
+ }
17
+ }, modal: false, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsx("div", { className: triggerClassName, children: renderTrigger ? (renderTrigger({ disabled, open, selectedOption })) : (_jsx(DefaultTrigger, { disabled: disabled, selectedOption: selectedOption })) }) }), _jsx(PopoverContent, { align: popoverAlign, className: cn('w-[320px] p-0 text-xs', popoverClassName), children: _jsxs(Command, { children: [_jsx(CommandInput, { placeholder: searchPlaceholder, className: "text-xs" }), _jsxs(CommandList, { children: [_jsx(CommandEmpty, { className: "text-xs", children: emptyMessage }), _jsx(CommandGroup, { children: options.map((option) => (_jsxs(CommandItem, { value: `${option.label} ${option.value}`, className: "text-xs", onSelect: () => handleSelect(option), children: [_jsx(Check, { className: cn('mr-1 h-3.5 w-3.5 shrink-0', option.value === selectedValue
18
+ ? 'opacity-100'
19
+ : 'opacity-0') }), _jsx("span", { className: "h-3 w-3 shrink-0", style: { backgroundColor: `rgb(${option.color.join(',')})` } }), _jsx("span", { className: "min-w-0 flex-1 truncate font-semibold", children: option.label })] }, option.value))) })] })] }) })] }));
20
+ };
21
+ //# sourceMappingURL=KeplerTableSourceSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeplerTableSourceSelector.js","sourceRoot":"","sources":["../../src/components/KeplerTableSourceSelector.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Button,\n cn,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@sqlrooms/ui';\nimport {Check, ChevronsUpDown} from 'lucide-react';\nimport React, {useMemo, useState} from 'react';\nimport type {KeplerTableSourceOption} from '../keplerTableSelection';\n\nexport type KeplerTableSourceSelectorProps = {\n disabled?: boolean;\n emptyMessage?: string;\n options: KeplerTableSourceOption[];\n popoverAlign?: 'start' | 'center' | 'end';\n popoverClassName?: string;\n searchPlaceholder?: string;\n selectedValue?: string;\n triggerClassName?: string;\n onSelect: (option: KeplerTableSourceOption) => void;\n renderTrigger?: (props: {\n disabled: boolean;\n open: boolean;\n selectedOption?: KeplerTableSourceOption;\n }) => React.ReactNode;\n};\n\nconst DefaultTrigger: React.FC<{\n disabled: boolean;\n selectedOption?: KeplerTableSourceOption;\n}> = ({disabled, selectedOption}) => (\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"h-8 w-full justify-between px-2 text-xs\"\n disabled={disabled}\n >\n <span className=\"min-w-0 truncate\">\n {selectedOption?.label ?? 'Select data source'}\n </span>\n <ChevronsUpDown className=\"ml-2 h-3.5 w-3.5 shrink-0 opacity-60\" />\n </Button>\n);\n\nexport const KeplerTableSourceSelector: React.FC<\n KeplerTableSourceSelectorProps\n> = ({\n disabled = false,\n emptyMessage = 'No tables found.',\n options,\n popoverAlign = 'start',\n popoverClassName,\n searchPlaceholder = 'Search tables...',\n selectedValue,\n triggerClassName,\n onSelect,\n renderTrigger,\n}) => {\n const [open, setOpen] = useState(false);\n const selectedOption = useMemo(\n () => options.find((option) => option.value === selectedValue),\n [options, selectedValue],\n );\n\n const handleSelect = (option: KeplerTableSourceOption) => {\n onSelect(option);\n setOpen(false);\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={(nextOpen) => {\n if (!disabled) {\n setOpen(nextOpen);\n }\n }}\n modal={false}\n >\n <PopoverTrigger asChild>\n <div className={triggerClassName}>\n {renderTrigger ? (\n renderTrigger({disabled, open, selectedOption})\n ) : (\n <DefaultTrigger\n disabled={disabled}\n selectedOption={selectedOption}\n />\n )}\n </div>\n </PopoverTrigger>\n <PopoverContent\n align={popoverAlign}\n className={cn('w-[320px] p-0 text-xs', popoverClassName)}\n >\n <Command>\n <CommandInput placeholder={searchPlaceholder} className=\"text-xs\" />\n <CommandList>\n <CommandEmpty className=\"text-xs\">{emptyMessage}</CommandEmpty>\n <CommandGroup>\n {options.map((option) => (\n <CommandItem\n key={option.value}\n value={`${option.label} ${option.value}`}\n className=\"text-xs\"\n onSelect={() => handleSelect(option)}\n >\n <Check\n className={cn(\n 'mr-1 h-3.5 w-3.5 shrink-0',\n option.value === selectedValue\n ? 'opacity-100'\n : 'opacity-0',\n )}\n />\n <span\n className=\"h-3 w-3 shrink-0\"\n style={{backgroundColor: `rgb(${option.color.join(',')})`}}\n />\n <span className=\"min-w-0 flex-1 truncate font-semibold\">\n {option.label}\n </span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n};\n"]}
package/dist/index.d.ts CHANGED
@@ -3,7 +3,9 @@
3
3
  * @packageDocumentation
4
4
  */
5
5
  export { createDefaultKeplerConfig, createKeplerSlice, useStoreWithKepler, } from './KeplerSlice';
6
- export type { CreateInitialMapKeplerStateContext, CreateKeplerSliceOptions, KeplerSliceState, } from './KeplerSlice';
6
+ export type { AddTableToMapFn, AddTableToMapLoadOptions, AddTableToMapParams, CreateInitialMapKeplerStateContext, CreateKeplerSliceOptions, KeplerModalPortalTarget, KeplerSliceState, } from './KeplerSlice';
7
+ export { buildKeplerTableLayerOptions, findKeplerTableForDatasetId, getKeplerDatasetIdForTable, getKeplerTableLabel, shouldIncludeKeplerTable, } from './keplerTableSelection';
8
+ export type { KeplerDbSchemaReference, KeplerTableLayerOption, KeplerTableSelectionOptions, } from './keplerTableSelection';
7
9
  export { FileDropInput } from './components/FileDropInput';
8
10
  export { KeplerAddDataDialog } from './components/KeplerAddDataDialog';
9
11
  export type { AddDataMethods, KeplerAddDataDialogProps, } from './components/KeplerAddDataDialog';
@@ -28,4 +30,7 @@ export { CustomMapControlTooltipFactory } from './components/CustomMapControlToo
28
30
  export { CustomMapLegendFactory } from './components/CustomMapLegend';
29
31
  export { CustomMapLegendPanelFactory } from './components/CustomMapLegendPanel';
30
32
  export { CustomAddDataButtonFactory, CustomPanelTitleFactory, } from './components/KeplerInjector';
33
+ export { createKeplerTheme, darkTheme } from './styles/theme';
34
+ export type { KeplerThemeOverrides } from './styles/theme';
35
+ export type { KeplerGLBasicProps } from './KeplerSlice';
31
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,kCAAkC,EAClC,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,YAAY,EACV,cAAc,EACd,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAC3E,YAAY,EAAC,WAAW,EAAC,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,qBAAqB,EAAC,MAAM,+BAA+B,CAAC;AAIpE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAC,mCAAmC,EAAC,MAAM,yBAAyB,CAAC;AAEjF,OAAO,EAAC,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAC,8BAA8B,EAAC,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAC,8BAA8B,EAAC,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAC,sBAAsB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,kCAAkC,EAClC,wBAAwB,EACxB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,uBAAuB,EACvB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,YAAY,EACV,cAAc,EACd,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAC3E,YAAY,EAAC,WAAW,EAAC,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAC7D,YAAY,EAAC,oBAAoB,EAAC,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,qBAAqB,EAAC,MAAM,+BAA+B,CAAC;AAIpE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAC,mCAAmC,EAAC,MAAM,yBAAyB,CAAC;AAEjF,OAAO,EAAC,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAC,8BAA8B,EAAC,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAC,8BAA8B,EAAC,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAC,sBAAsB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAC,iBAAiB,EAAE,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAC5D,YAAY,EAAC,oBAAoB,EAAC,MAAM,gBAAgB,CAAC;AACzD,YAAY,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  * @packageDocumentation
4
4
  */
5
5
  export { createDefaultKeplerConfig, createKeplerSlice, useStoreWithKepler, } from './KeplerSlice';
6
+ export { buildKeplerTableLayerOptions, findKeplerTableForDatasetId, getKeplerDatasetIdForTable, getKeplerTableLabel, shouldIncludeKeplerTable, } from './keplerTableSelection';
6
7
  export { FileDropInput } from './components/FileDropInput';
7
8
  export { KeplerAddDataDialog } from './components/KeplerAddDataDialog';
8
9
  export { KeplerAddTileSetDialog } from './components/KeplerAddTileSetDialog';
@@ -24,4 +25,5 @@ export { CustomMapControlTooltipFactory } from './components/CustomMapControlToo
24
25
  export { CustomMapLegendFactory } from './components/CustomMapLegend';
25
26
  export { CustomMapLegendPanelFactory } from './components/CustomMapLegendPanel';
26
27
  export { CustomAddDataButtonFactory, CustomPanelTitleFactory, } from './components/KeplerInjector';
28
+ export { createKeplerTheme, darkTheme } from './styles/theme';
27
29
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAOvB,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AAKrE,OAAO,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,qBAAqB,EAAC,MAAM,+BAA+B,CAAC;AAEpE,yCAAyC;AACzC,2EAA2E;AAC3E,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAC,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAC,8BAA8B,EAAC,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAC,8BAA8B,EAAC,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAC,sBAAsB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {\n createDefaultKeplerConfig,\n createKeplerSlice,\n useStoreWithKepler,\n} from './KeplerSlice';\nexport type {\n CreateInitialMapKeplerStateContext,\n CreateKeplerSliceOptions,\n KeplerSliceState,\n} from './KeplerSlice';\n\nexport {FileDropInput} from './components/FileDropInput';\nexport {KeplerAddDataDialog} from './components/KeplerAddDataDialog';\nexport type {\n AddDataMethods,\n KeplerAddDataDialogProps,\n} from './components/KeplerAddDataDialog';\nexport {KeplerAddTileSetDialog} from './components/KeplerAddTileSetDialog';\nexport type {LoadTileSet} from './components/KeplerAddTileSetDialog';\nexport {KeplerImageExport} from './components/KeplerImageExport';\nexport {\n configureKeplerInjector,\n getKeplerFactory,\n getKeplerInjector,\n KeplerInjector,\n resetKeplerInjectorRecipes,\n} from './components/KeplerInjector';\nexport type {\n KeplerFactoryRecipe,\n KeplerFactoryRecipeMode,\n} from './components/KeplerInjector';\nexport {KeplerMapContainer} from './components/KeplerMapContainer';\nexport {SplitMapIndexContext} from './components/SplitMapIndexContext';\nexport {KeplerPlotContainer} from './components/KeplerPlotContainer';\nexport {KeplerProvider} from './components/KeplerProvider';\nexport {KeplerS3Browser} from './components/KeplerS3Browser';\nexport type {KeplerS3BrowserProps} from './components/KeplerS3Browser';\nexport {KeplerSidePanels} from './components/KeplerSidePanels';\nexport {useKeplerStateActions} from './hooks/useKeplerStateActions';\n\n// Re-export from @sqlrooms/kepler-config\n// Values also export their corresponding types automatically (Zod pattern)\nexport {\n KeplerMapSchema,\n KeplerSliceConfig,\n migrateKeplerTabsToArtifacts,\n} from '@sqlrooms/kepler-config';\nexport type {KeplerTabsArtifactsMigrationOptions} from '@sqlrooms/kepler-config';\n\nexport {CustomDndContextFactory} from './components/CustomDndContext';\nexport {CustomFilterPanelHeaderFactory} from './components/CustomFilterPanelHeader';\nexport {CustomMapControlTooltipFactory} from './components/CustomMapControlTooltipFactory';\nexport {CustomMapLegendFactory} from './components/CustomMapLegend';\nexport {CustomMapLegendPanelFactory} from './components/CustomMapLegendPanel';\nexport {\n CustomAddDataButtonFactory,\n CustomPanelTitleFactory,\n} from './components/KeplerInjector';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAUvB,OAAO,EACL,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAOhC,OAAO,EAAC,aAAa,EAAC,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AAKrE,OAAO,EAAC,sBAAsB,EAAC,MAAM,qCAAqC,CAAC;AAE3E,OAAO,EAAC,iBAAiB,EAAC,MAAM,gCAAgC,CAAC;AACjE,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,0BAA0B,GAC3B,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAAC,kBAAkB,EAAC,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAC,oBAAoB,EAAC,MAAM,mCAAmC,CAAC;AACvE,OAAO,EAAC,mBAAmB,EAAC,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAC,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAE7D,OAAO,EAAC,gBAAgB,EAAC,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAC,qBAAqB,EAAC,MAAM,+BAA+B,CAAC;AAEpE,yCAAyC;AACzC,2EAA2E;AAC3E,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAC,uBAAuB,EAAC,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAC,8BAA8B,EAAC,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAC,8BAA8B,EAAC,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAC,sBAAsB,EAAC,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAC,iBAAiB,EAAE,SAAS,EAAC,MAAM,gBAAgB,CAAC","sourcesContent":["/**\n * {@include ../README.md}\n * @packageDocumentation\n */\n\nexport {\n createDefaultKeplerConfig,\n createKeplerSlice,\n useStoreWithKepler,\n} from './KeplerSlice';\nexport type {\n AddTableToMapFn,\n AddTableToMapLoadOptions,\n AddTableToMapParams,\n CreateInitialMapKeplerStateContext,\n CreateKeplerSliceOptions,\n KeplerModalPortalTarget,\n KeplerSliceState,\n} from './KeplerSlice';\nexport {\n buildKeplerTableLayerOptions,\n findKeplerTableForDatasetId,\n getKeplerDatasetIdForTable,\n getKeplerTableLabel,\n shouldIncludeKeplerTable,\n} from './keplerTableSelection';\nexport type {\n KeplerDbSchemaReference,\n KeplerTableLayerOption,\n KeplerTableSelectionOptions,\n} from './keplerTableSelection';\n\nexport {FileDropInput} from './components/FileDropInput';\nexport {KeplerAddDataDialog} from './components/KeplerAddDataDialog';\nexport type {\n AddDataMethods,\n KeplerAddDataDialogProps,\n} from './components/KeplerAddDataDialog';\nexport {KeplerAddTileSetDialog} from './components/KeplerAddTileSetDialog';\nexport type {LoadTileSet} from './components/KeplerAddTileSetDialog';\nexport {KeplerImageExport} from './components/KeplerImageExport';\nexport {\n configureKeplerInjector,\n getKeplerFactory,\n getKeplerInjector,\n KeplerInjector,\n resetKeplerInjectorRecipes,\n} from './components/KeplerInjector';\nexport type {\n KeplerFactoryRecipe,\n KeplerFactoryRecipeMode,\n} from './components/KeplerInjector';\nexport {KeplerMapContainer} from './components/KeplerMapContainer';\nexport {SplitMapIndexContext} from './components/SplitMapIndexContext';\nexport {KeplerPlotContainer} from './components/KeplerPlotContainer';\nexport {KeplerProvider} from './components/KeplerProvider';\nexport {KeplerS3Browser} from './components/KeplerS3Browser';\nexport type {KeplerS3BrowserProps} from './components/KeplerS3Browser';\nexport {KeplerSidePanels} from './components/KeplerSidePanels';\nexport {useKeplerStateActions} from './hooks/useKeplerStateActions';\n\n// Re-export from @sqlrooms/kepler-config\n// Values also export their corresponding types automatically (Zod pattern)\nexport {\n KeplerMapSchema,\n KeplerSliceConfig,\n migrateKeplerTabsToArtifacts,\n} from '@sqlrooms/kepler-config';\nexport type {KeplerTabsArtifactsMigrationOptions} from '@sqlrooms/kepler-config';\n\nexport {CustomDndContextFactory} from './components/CustomDndContext';\nexport {CustomFilterPanelHeaderFactory} from './components/CustomFilterPanelHeader';\nexport {CustomMapControlTooltipFactory} from './components/CustomMapControlTooltipFactory';\nexport {CustomMapLegendFactory} from './components/CustomMapLegend';\nexport {CustomMapLegendPanelFactory} from './components/CustomMapLegendPanel';\nexport {\n CustomAddDataButtonFactory,\n CustomPanelTitleFactory,\n} from './components/KeplerInjector';\n\nexport {createKeplerTheme, darkTheme} from './styles/theme';\nexport type {KeplerThemeOverrides} from './styles/theme';\nexport type {KeplerGLBasicProps} from './KeplerSlice';\n"]}
@@ -0,0 +1,142 @@
1
+ import type { DataTable } from '@sqlrooms/duckdb-core';
2
+ import type { RGBColor } from '@kepler.gl/types';
3
+ /**
4
+ * A database/schema pair that can be referred to by bare table name in Kepler
5
+ * dataset ids.
6
+ */
7
+ export type KeplerDbSchemaReference = {
8
+ database?: string;
9
+ schema?: string;
10
+ };
11
+ /**
12
+ * One selectable entry in Kepler's Add Layer table-source dropdown.
13
+ */
14
+ export type KeplerTableLayerOption = {
15
+ label: string;
16
+ value: string;
17
+ };
18
+ /**
19
+ * Minimal loaded Kepler dataset shape needed to build table source options.
20
+ */
21
+ export type KeplerSourceDataset = {
22
+ id: string;
23
+ label?: string;
24
+ color?: RGBColor;
25
+ };
26
+ /**
27
+ * One option in a Kepler table source picker.
28
+ */
29
+ export type KeplerTableSourceOption = {
30
+ value: string;
31
+ label: string;
32
+ color: RGBColor;
33
+ isLoaded: boolean;
34
+ };
35
+ /**
36
+ * Inputs for building source picker options from loaded Kepler datasets plus
37
+ * the DuckDB table catalog.
38
+ */
39
+ export type BuildKeplerTableSourceOptionsParams = {
40
+ dbTables: DataTable[];
41
+ datasets?: Record<string, KeplerSourceDataset | undefined>;
42
+ /**
43
+ * Set false when the picker should only show datasets already loaded into
44
+ * Kepler, such as filter data-source selectors.
45
+ */
46
+ includeUnloadedTables?: boolean;
47
+ loadedDatasetIds?: string[];
48
+ tableSelection?: KeplerTableSelectionOptions;
49
+ };
50
+ /**
51
+ * Policy hooks for deciding which DuckDB tables are exposed to Kepler and how
52
+ * they are represented in saved Kepler layer config.
53
+ */
54
+ export type KeplerTableSelectionOptions = {
55
+ /**
56
+ * Return false to hide a DuckDB table from the Add Layer menu and to skip
57
+ * loading matching saved dataset ids during sync.
58
+ *
59
+ * Defaults to including every visible DuckDB table.
60
+ */
61
+ includeTable?: (table: DataTable) => boolean;
62
+ /**
63
+ * Database/schema whose tables may use bare dataset ids, such as `places`.
64
+ *
65
+ * Tables outside this database/schema use qualified SQL table references for their
66
+ * dataset ids. The Kepler slice defaults this to its current DuckDB
67
+ * database/schema; host apps can supply their own stable resolver when their
68
+ * persistence model needs a different comparison point.
69
+ */
70
+ defaultDbSchema?: KeplerDbSchemaReference | (() => KeplerDbSchemaReference | undefined);
71
+ /**
72
+ * Override how new Kepler dataset ids are generated for DuckDB tables.
73
+ *
74
+ * Use this only when the default bare-or-qualified policy does not match the
75
+ * host app's persistence model.
76
+ */
77
+ getDatasetIdForTable?: (table: DataTable) => string;
78
+ /**
79
+ * Override the display label shown for a DuckDB table in Kepler's Add Layer
80
+ * table-source dropdown.
81
+ *
82
+ * This only changes presentation; dataset ids still come from
83
+ * `getDatasetIdForTable` or the default bare-or-qualified policy.
84
+ */
85
+ getTableLabel?: (table: DataTable) => string;
86
+ /**
87
+ * Override how saved Kepler dataset ids are resolved back to DuckDB tables.
88
+ *
89
+ * The default resolver matches qualified table references first, then bare ids
90
+ * within `defaultDbSchema`. Return the matching table independent of
91
+ * `includeTable`; the shared helpers apply `includeTable` after matching so
92
+ * excluded tables are handled consistently.
93
+ */
94
+ findTableForDatasetId?: (tables: DataTable[], datasetId: string) => DataTable | undefined;
95
+ };
96
+ /**
97
+ * Return whether a DuckDB table should be exposed as a Kepler layer source.
98
+ *
99
+ * This is the shared gate used by Add Layer table options and by host UIs that
100
+ * offer their own "add table to map" actions.
101
+ */
102
+ export declare function shouldIncludeKeplerTable(table: DataTable, options?: KeplerTableSelectionOptions): boolean;
103
+ /**
104
+ * Choose the dataset id that should be written into new Kepler layer config.
105
+ *
106
+ * By default, tables in `defaultDbSchema` use bare ids (`places`) and all
107
+ * other tables use qualified SQL references. Hosts can override this with
108
+ * `getDatasetIdForTable`.
109
+ */
110
+ export declare function getKeplerDatasetIdForTable(table: DataTable, options?: KeplerTableSelectionOptions): string;
111
+ /**
112
+ * Build a human-facing table label from raw catalog parts.
113
+ *
114
+ * Labels omit `defaultDbSchema` and do not include SQL identifier quotes.
115
+ * They are display-only; option values still carry the stable dataset id.
116
+ */
117
+ export declare function getKeplerTableLabel(table: DataTable, options?: KeplerTableSelectionOptions): string;
118
+ /**
119
+ * Resolve a saved Kepler dataset id back to the DuckDB table it should load.
120
+ *
121
+ * The default resolver accepts qualified table references and bare ids inside
122
+ * `defaultDbSchema`. Tables rejected by `includeTable` are ignored.
123
+ */
124
+ export declare function findKeplerTableForDatasetId(tables: DataTable[], datasetId: string, options?: KeplerTableSelectionOptions): DataTable | undefined;
125
+ /**
126
+ * Build source picker options from loaded Kepler datasets plus unloaded DuckDB
127
+ * tables that are allowed by the table-selection policy.
128
+ *
129
+ * Loaded Kepler datasets keep their existing dataset ids so selecting them does
130
+ * not duplicate data. Unloaded tables use `getKeplerDatasetIdForTable`.
131
+ */
132
+ export declare function buildKeplerTableSourceOptions({ dbTables, datasets, includeUnloadedTables, loadedDatasetIds, tableSelection, }: BuildKeplerTableSourceOptionsParams): KeplerTableSourceOption[];
133
+ /**
134
+ * Build Add Layer dropdown options from DuckDB tables plus datasets that are
135
+ * already loaded into Kepler.
136
+ *
137
+ * `includeTable` controls which DuckDB tables are exposed. Already-loaded
138
+ * dataset ids are included unless they resolve to an excluded table or duplicate
139
+ * an exposed table option.
140
+ */
141
+ export declare function buildKeplerTableLayerOptions(dbTables: DataTable[], keplerDatasetIds: string[], options?: KeplerTableSelectionOptions): KeplerTableLayerOption[];
142
+ //# sourceMappingURL=keplerTableSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keplerTableSelection.d.ts","sourceRoot":"","sources":["../src/keplerTableSelection.ts"],"names":[],"mappings":"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"}