@found-in-space/skykit 0.2.0-alpha.1 → 0.2.0-dev.20260527.0

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 (42) hide show
  1. package/README.md +143 -6
  2. package/examples/custom-object-layer/custom-object-layer.js +1 -24
  3. package/examples/xr-free-roam/index.html +62 -4
  4. package/examples/xr-free-roam/xr-free-roam.css +249 -18
  5. package/examples/xr-free-roam/xr-free-roam.js +644 -217
  6. package/package.json +31 -5
  7. package/src/__tests__/skykit-anchored-images.test.js +32 -4
  8. package/src/__tests__/skykit-browser.test.js +217 -0
  9. package/src/__tests__/skykit-data.test.js +131 -0
  10. package/src/__tests__/skykit-parallax.test.js +4 -4
  11. package/src/__tests__/skykit-touch-os.test.js +71 -0
  12. package/src/__tests__/skykit-xr.test.js +123 -2
  13. package/src/__tests__/skykit.test.js +138 -1
  14. package/src/anchored-images.js +14 -15
  15. package/src/browser-addons.d.ts +16 -0
  16. package/src/browser-addons.js +155 -0
  17. package/src/browser-constellations.d.ts +13 -0
  18. package/src/browser-constellations.js +387 -0
  19. package/src/browser-journey.d.ts +8 -0
  20. package/src/browser-journey.js +240 -0
  21. package/src/browser.d.ts +98 -0
  22. package/src/browser.js +215 -13
  23. package/src/data.d.ts +133 -0
  24. package/src/data.js +447 -0
  25. package/src/embed.d.ts +5 -0
  26. package/src/embed.js +52 -2
  27. package/src/hr-diagram.js +23 -5
  28. package/src/index.d.ts +32 -7
  29. package/src/plugins.js +87 -43
  30. package/src/story.d.ts +57 -0
  31. package/src/story.js +396 -0
  32. package/src/three-shim.d.ts +32 -0
  33. package/src/touch-os.d.ts +70 -0
  34. package/src/touch-os.js +275 -0
  35. package/src/utils.js +96 -6
  36. package/src/viewer-entry.d.ts +10 -0
  37. package/src/viewer-entry.js +4 -0
  38. package/src/viewer.js +110 -12
  39. package/src/xr/plugins.js +224 -13
  40. package/src/xr/session.js +60 -14
  41. package/src/xr.d.ts +22 -0
  42. package/src/xr.js +1 -0
package/src/browser.d.ts CHANGED
@@ -7,13 +7,18 @@ import type { ThreeStarField } from '@found-in-space/three-star-field';
7
7
  import type * as THREE from 'three';
8
8
 
9
9
  import type {
10
+ Object3dLayerOptions,
10
11
  SkykitAnimationLoop,
11
12
  SkykitAnimationLoopOptions,
12
13
  SkykitDragLookOptions,
14
+ SkykitLookAtInput,
13
15
  SkykitKeyboardNavigationOptions,
14
16
  SkykitPluginInput,
17
+ SkykitPluginTeardown,
18
+ SkykitThreePart,
15
19
  SkykitViewState,
16
20
  SkykitViewer,
21
+ Vector3Like,
17
22
  } from './index.js';
18
23
 
19
24
  export type SkykitBrowserHost = string | {
@@ -25,6 +30,78 @@ export type SkykitBrowserHost = string | {
25
30
  };
26
31
 
27
32
  export type SkykitBrowserStatusTarget = string | { textContent?: string | null };
33
+ export type SkykitBrowserMouseMode = 'grab' | 'look' | 'strafe' | 'none';
34
+ export type SkykitConstellationArtMode = 'off' | 'lazy' | 'preload';
35
+
36
+ export interface SkykitBrowserAddonContext {
37
+ id?: string;
38
+ host: SkykitBrowserHost | Element;
39
+ browser: SkykitBrowser;
40
+ viewer: SkykitViewer;
41
+ THREE: typeof THREE;
42
+ skykit: Record<string, unknown>;
43
+ }
44
+
45
+ export interface SkykitBrowserAddon {
46
+ id?: string;
47
+ install(
48
+ context: SkykitBrowserAddonContext
49
+ ): void | Promise<void> | SkykitPluginTeardown | Promise<SkykitPluginTeardown | void>;
50
+ }
51
+
52
+ export type SkykitBrowserInstallInput = SkykitPluginInput | SkykitBrowserAddon;
53
+
54
+ export interface SkykitBrowserGlobal {
55
+ browserAddons: SkykitBrowserAddon[];
56
+ registerBrowserAddon(addon: SkykitBrowserAddon): SkykitPluginTeardown;
57
+ whenReady(target?: string | Element): Promise<SkykitBrowser>;
58
+ getBrowsers(): SkykitBrowser[];
59
+ }
60
+
61
+ export interface SkykitBrowserJourneyFacade {
62
+ transitionTo(viewOrScene: unknown, options?: Record<string, unknown>): Promise<PromiseSettledResult<unknown>[]>;
63
+ applyScene(sceneSpec: unknown): Promise<unknown>;
64
+ load(input: string | Record<string, unknown>, options?: Record<string, unknown>): Promise<SkykitBrowserJourneyInstance>;
65
+ getSnapshot(): unknown | Promise<unknown>;
66
+ }
67
+
68
+ export interface SkykitBrowserJourneyInstance {
69
+ goTo(sceneId: string): Promise<unknown>;
70
+ next(): Promise<unknown>;
71
+ previous(): Promise<unknown>;
72
+ play(payload?: unknown): number;
73
+ pause(): number;
74
+ seek(timeSecs: number): number;
75
+ getSnapshot(): unknown;
76
+ dispose(): void;
77
+ }
78
+
79
+ export interface SkykitBrowserConstellationsOptions {
80
+ skyculture?: string;
81
+ manifest?: Record<string, unknown>;
82
+ manifestUrl?: string;
83
+ assetBaseUrl?: string;
84
+ art?: SkykitConstellationArtMode | string;
85
+ visible?: boolean;
86
+ priority?: number;
87
+ boundaryRadius?: number;
88
+ boundaryColor?: THREE.ColorRepresentation;
89
+ boundaryOpacity?: number;
90
+ renderOrder?: number;
91
+ artOpacity?: number;
92
+ artMaxAngleDeg?: number;
93
+ skipTextureErrors?: boolean;
94
+ }
95
+
96
+ export interface SkykitBrowserConstellationsFacade {
97
+ load(options?: SkykitBrowserConstellationsOptions): Promise<SkykitBrowserConstellationsFacade>;
98
+ show(): boolean | Promise<boolean>;
99
+ hide(): boolean | Promise<boolean>;
100
+ toggle(force?: boolean): boolean | Promise<boolean>;
101
+ setArt(mode: SkykitConstellationArtMode | string): SkykitConstellationArtMode | Promise<SkykitConstellationArtMode>;
102
+ getSnapshot(): unknown | Promise<unknown>;
103
+ dispose?(): void;
104
+ }
28
105
 
29
106
  export interface SkykitBrowserOptions {
30
107
  host?: SkykitBrowserHost;
@@ -38,8 +115,10 @@ export interface SkykitBrowserOptions {
38
115
  session?: StarOctreeSessionOptions;
39
116
  keyboard?: false | SkykitKeyboardNavigationOptions;
40
117
  grab?: false | SkykitDragLookOptions;
118
+ mouseMode?: SkykitBrowserMouseMode;
41
119
  plugins?: Iterable<SkykitPluginInput>;
42
120
  view?: Partial<SkykitViewState>;
121
+ lookAt?: SkykitLookAtInput;
43
122
  loop?: SkykitAnimationLoopOptions;
44
123
  limitingMagnitude?: number;
45
124
  exposure?: number;
@@ -64,9 +143,28 @@ export interface SkykitBrowser {
64
143
  provider: StarOctreeProviderService;
65
144
  starField: ThreeStarField;
66
145
  loop: SkykitAnimationLoop;
146
+ capabilities: Set<string>;
147
+ journey: SkykitBrowserJourneyFacade;
148
+ constellations: SkykitBrowserConstellationsFacade;
149
+ install(input: SkykitBrowserInstallInput): Promise<SkykitPluginTeardown>;
150
+ addObject(
151
+ object3d: THREE.Object3D,
152
+ options?: SkykitBrowserObjectOptions
153
+ ): SkykitBrowserObjectHandle;
67
154
  resize(): void;
68
155
  dispose(): Promise<void>;
69
156
  }
70
157
 
158
+ export interface SkykitBrowserObjectOptions extends Omit<Object3dLayerOptions, 'object3d'> {
159
+ positionPc?: Vector3Like;
160
+ }
161
+
162
+ export interface SkykitBrowserObjectHandle {
163
+ object3d: THREE.Object3D;
164
+ part: SkykitThreePart;
165
+ remove: SkykitPluginTeardown;
166
+ dispose: SkykitPluginTeardown;
167
+ }
168
+
71
169
  export declare function createSkykitBrowser(host: SkykitBrowserHost): Promise<SkykitBrowser>;
72
170
  export declare function createSkykitBrowser(options?: SkykitBrowserOptions): Promise<SkykitBrowser>;
package/src/browser.js CHANGED
@@ -8,12 +8,18 @@ import { createObserverShellStrategy } from '@found-in-space/star-trees';
8
8
  import { createThreeStarField } from '@found-in-space/three-star-field';
9
9
 
10
10
  import { createSkykitAnimationLoop } from './animation-loop.js';
11
+ import { SKYKIT_ACTIONS, SKYKIT_CONTROLS } from './actions.js';
11
12
  import {
12
13
  createKeyboardNavigationPlugin,
14
+ createObject3dPlugin,
15
+ createMouseLookPlugin,
16
+ createSkykitJourneyPlugin,
17
+ createSkykitNavigationPlugin,
13
18
  createSkyGrabPlugin,
14
19
  createSkykitStatusPlugin,
15
20
  createStreamingStarsPlugin,
16
21
  } from './plugins.js';
22
+ import { createObject3dLayer } from './layers.js';
17
23
  import { createSkykitViewer } from './viewer.js';
18
24
 
19
25
  const DEFAULT_LIMITING_MAGNITUDE = 6.5;
@@ -63,6 +69,7 @@ export async function createSkykitBrowser(input = {}) {
63
69
  observerPc: { x: 0, y: 0, z: 0 },
64
70
  coordinateUnitsPerParsec: positive(options.coordinateUnitsPerParsec, DEFAULT_UNITS_PER_PARSEC),
65
71
  limitingMagnitude,
72
+ ...(options.lookAt ? { lookAt: options.lookAt } : {}),
66
73
  ...(options.view ?? {}),
67
74
  },
68
75
  plugins: [
@@ -81,41 +88,57 @@ export async function createSkykitBrowser(input = {}) {
81
88
  ...(options.keyboard ?? {}),
82
89
  }),
83
90
  ]),
84
- ...(options.grab === false ? [] : [
85
- createSkyGrabPlugin({
86
- target: host,
87
- sensitivityRadiansPerPixel: 0.00075,
88
- ...(options.grab ?? {}),
89
- }),
90
- ]),
91
+ ...createPointerPlugins(options, host),
91
92
  ...(statusTarget ? [createStatusPlugin(statusTarget)] : []),
92
93
  ...(options.plugins ?? []),
93
94
  ],
94
95
  });
95
96
 
96
97
  const loop = createSkykitAnimationLoop(viewer, options.loop);
98
+ const capabilities = new Set();
99
+ /** @type {Array<() => void | Promise<void>>} */
100
+ const browserDisposables = [];
97
101
  let disposed = false;
102
+ /** @type {import('./browser.d.ts').SkykitBrowser} */
103
+ const browser = {
104
+ viewer,
105
+ renderer,
106
+ camera,
107
+ provider,
108
+ starField,
109
+ loop,
110
+ capabilities,
111
+ install,
112
+ addObject,
113
+ resize,
114
+ dispose,
115
+ };
116
+ browser.journey = createLazyJourneyFacade(browser);
117
+ browser.constellations = createLazyConstellationsFacade(browser, host);
98
118
 
99
- const resize = () => {
119
+ function resize() {
100
120
  viewer.resize({
101
121
  devicePixelRatio: Math.min(
102
122
  window.devicePixelRatio || 1,
103
123
  positive(options.maxDevicePixelRatio, DEFAULT_MAX_DEVICE_PIXEL_RATIO),
104
124
  ),
105
125
  });
106
- };
107
- const dispose = async () => {
126
+ }
127
+ async function dispose() {
108
128
  if (disposed) return;
109
129
  disposed = true;
110
130
  window.removeEventListener('resize', resize);
111
131
  window.removeEventListener('pagehide', disposeSoon);
112
132
  window.removeEventListener('beforeunload', disposeSoon);
133
+ for (const disposable of browserDisposables.splice(0).reverse()) {
134
+ await disposable();
135
+ }
113
136
  loop.dispose();
114
137
  await viewer.dispose();
115
138
  if (!options.provider) await provider.dispose?.();
116
139
  if (!options.renderer) renderer.dispose?.();
117
- };
118
- const disposeSoon = () => { void dispose(); };
140
+ }
141
+ function disposeSoon() { void dispose(); }
119
142
 
120
143
  if (options.autoResize !== false) window.addEventListener('resize', resize);
121
144
  if (options.autoDispose !== false) {
@@ -125,7 +148,173 @@ export async function createSkykitBrowser(input = {}) {
125
148
  resize();
126
149
  if (options.autoStart !== false) loop.start();
127
150
 
128
- return { viewer, renderer, camera, provider, starField, loop, resize, dispose };
151
+ return browser;
152
+
153
+ /**
154
+ * @param {import('./browser.d.ts').SkykitBrowserInstallInput} input
155
+ * @returns {Promise<import('./index.d.ts').SkykitPluginTeardown>}
156
+ */
157
+ async function install(input) {
158
+ if (!input) return () => {};
159
+ const teardown = isBrowserAddon(input)
160
+ ? await input.install(createBrowserAddonContext(input))
161
+ : await viewer.addPlugin(/** @type {import('./index.d.ts').SkykitPluginInput} */ (input));
162
+ if (typeof teardown !== 'function') return () => {};
163
+ browserDisposables.push(teardown);
164
+ return () => {
165
+ const index = browserDisposables.indexOf(teardown);
166
+ if (index >= 0) browserDisposables.splice(index, 1);
167
+ void teardown();
168
+ };
169
+ }
170
+
171
+ /**
172
+ * @param {import('./browser.d.ts').SkykitBrowserAddon} addon
173
+ * @returns {import('./browser.d.ts').SkykitBrowserAddonContext}
174
+ */
175
+ function createBrowserAddonContext(addon) {
176
+ return {
177
+ id: addon.id,
178
+ host,
179
+ browser,
180
+ viewer,
181
+ THREE,
182
+ skykit: {
183
+ SKYKIT_ACTIONS,
184
+ SKYKIT_CONTROLS,
185
+ createObject3dPlugin,
186
+ createSkykitJourneyPlugin,
187
+ createSkykitNavigationPlugin,
188
+ },
189
+ };
190
+ }
191
+
192
+ /**
193
+ * @param {THREE.Object3D} object3d
194
+ * @param {import('./browser.d.ts').SkykitBrowserObjectOptions} [objectOptions]
195
+ * @returns {import('./browser.d.ts').SkykitBrowserObjectHandle}
196
+ */
197
+ function addObject(object3d, objectOptions = {}) {
198
+ if (!object3d) {
199
+ throw new TypeError('SkykitBrowser.addObject() requires a THREE.Object3D.');
200
+ }
201
+ const { positionPc, ...layerOptions } = objectOptions;
202
+ if (positionPc) {
203
+ setObjectPositionPc(
204
+ object3d,
205
+ positionPc,
206
+ viewer.getViewState().coordinateUnitsPerParsec,
207
+ );
208
+ }
209
+ const part = createObject3dLayer({
210
+ ...layerOptions,
211
+ object3d,
212
+ anchorMode: layerOptions.anchorMode ?? 'world-space',
213
+ });
214
+ const remove = viewer.addPart(part);
215
+ return {
216
+ object3d,
217
+ part,
218
+ remove,
219
+ dispose: remove,
220
+ };
221
+ }
222
+ }
223
+
224
+ /** @param {unknown} input */
225
+ function isBrowserAddon(input) {
226
+ return Boolean(input && typeof input === 'object' && typeof /** @type {{ install?: unknown }} */ (input).install === 'function');
227
+ }
228
+
229
+ /**
230
+ * @param {import('./browser.d.ts').SkykitBrowser} browser
231
+ * @returns {import('./browser.d.ts').SkykitBrowserJourneyFacade}
232
+ */
233
+ function createLazyJourneyFacade(browser) {
234
+ /** @type {Promise<import('./browser.d.ts').SkykitBrowserJourneyFacade> | null} */
235
+ let loaded = null;
236
+ const loadCapability = () => {
237
+ loaded ??= import('./browser-journey.js')
238
+ .then((module) => module.installSkykitJourneyBrowserCapability({ browser }));
239
+ return loaded;
240
+ };
241
+ return {
242
+ async transitionTo(viewOrScene, options) {
243
+ return (await loadCapability()).transitionTo(viewOrScene, options);
244
+ },
245
+ async applyScene(sceneSpec) {
246
+ return (await loadCapability()).applyScene(sceneSpec);
247
+ },
248
+ async load(input, options) {
249
+ return (await loadCapability()).load(input, options);
250
+ },
251
+ async getSnapshot() {
252
+ return (await loadCapability()).getSnapshot();
253
+ },
254
+ };
255
+ }
256
+
257
+ /**
258
+ * @param {import('./browser.d.ts').SkykitBrowser} browser
259
+ * @param {Element | import('./browser.d.ts').SkykitBrowserHost} host
260
+ * @returns {import('./browser.d.ts').SkykitBrowserConstellationsFacade}
261
+ */
262
+ function createLazyConstellationsFacade(browser, host) {
263
+ /** @type {Promise<import('./browser.d.ts').SkykitBrowserConstellationsFacade> | null} */
264
+ let loaded = null;
265
+ const loadCapability = (options = {}) => {
266
+ loaded ??= import('./browser-constellations.js')
267
+ .then((module) => module.installSkykitConstellationsBrowserCapability({
268
+ browser,
269
+ host,
270
+ options,
271
+ }));
272
+ return loaded;
273
+ };
274
+ return {
275
+ async load(options) {
276
+ return loadCapability(options);
277
+ },
278
+ async show() {
279
+ return (await loadCapability()).show();
280
+ },
281
+ async hide() {
282
+ return (await loadCapability()).hide();
283
+ },
284
+ async toggle(force) {
285
+ return (await loadCapability()).toggle(force);
286
+ },
287
+ async setArt(mode) {
288
+ return (await loadCapability()).setArt(mode);
289
+ },
290
+ async getSnapshot() {
291
+ return (await loadCapability()).getSnapshot();
292
+ },
293
+ };
294
+ }
295
+
296
+ function createPointerPlugins(options, host) {
297
+ const mouseMode = normalizeMouseMode(options.mouseMode);
298
+ if (options.grab === false || mouseMode === 'none') return [];
299
+ const pointerOptions = {
300
+ target: host,
301
+ sensitivityRadiansPerPixel: 0.00075,
302
+ ...(options.grab ?? {}),
303
+ };
304
+ return [
305
+ mouseMode === 'look' || mouseMode === 'strafe'
306
+ ? createMouseLookPlugin(pointerOptions)
307
+ : createSkyGrabPlugin(pointerOptions),
308
+ ];
309
+ }
310
+
311
+ function normalizeMouseMode(value) {
312
+ const mode = String(value ?? 'grab').trim().toLowerCase();
313
+ if (mode === 'look' || mode === 'mouse-look' || mode === 'mouselook' || mode === 'game' || mode === 'strafe') {
314
+ return mode === 'strafe' ? 'strafe' : 'look';
315
+ }
316
+ if (mode === 'none' || mode === 'off' || mode === 'false') return 'none';
317
+ return 'grab';
129
318
  }
130
319
 
131
320
  function createStatusPlugin(target) {
@@ -165,3 +354,16 @@ function positive(value, fallback) {
165
354
  const number = Number(value);
166
355
  return Number.isFinite(number) && number > 0 ? number : fallback;
167
356
  }
357
+
358
+ /**
359
+ * @param {THREE.Object3D} object3d
360
+ * @param {{ x: number; y: number; z: number }} positionPc
361
+ * @param {number} unitsPerParsec
362
+ */
363
+ function setObjectPositionPc(object3d, positionPc, unitsPerParsec) {
364
+ object3d.position?.set?.(
365
+ positionPc.x * unitsPerParsec,
366
+ positionPc.y * unitsPerParsec,
367
+ positionPc.z * unitsPerParsec,
368
+ );
369
+ }
package/src/data.d.ts ADDED
@@ -0,0 +1,133 @@
1
+ import type { MetaSidecarEntry, MetaSidecarProviderService } from '@found-in-space/meta-sidecar-provider';
2
+ import type {
3
+ StarOctreeCellStreamOptions,
4
+ StarOctreeProviderService,
5
+ StarOctreeProviderServiceOptions,
6
+ } from '@found-in-space/star-octree-provider';
7
+ import type {
8
+ StarObjectRef,
9
+ StarTreePointPc,
10
+ } from '@found-in-space/star-trees';
11
+
12
+ export {
13
+ OCTREE_DEFAULT,
14
+ createStarOctreeProviderService,
15
+ } from '@found-in-space/star-octree-provider';
16
+ export {
17
+ createObserverShellStrategy,
18
+ createSphereVolumeStrategy,
19
+ createStarCellKey,
20
+ decodeTemperatureK,
21
+ temperatureToRgb,
22
+ } from '@found-in-space/star-trees';
23
+ export {
24
+ createMetaSidecarProviderService,
25
+ deriveMetaSidecarUrlFromRenderUrl,
26
+ metaSidecarEntryDisplayFields,
27
+ } from '@found-in-space/meta-sidecar-provider';
28
+
29
+ export interface SkykitStarRow {
30
+ ref: StarObjectRef | null;
31
+ cellKey: string;
32
+ level: number;
33
+ mortonCode: string;
34
+ ordinal: number;
35
+ positionPc: StarTreePointPc;
36
+ xPc: number;
37
+ yPc: number;
38
+ zPc: number;
39
+ distancePc: number;
40
+ magAbs: number | null;
41
+ absoluteMagnitude: number | null;
42
+ apparentMagnitude: number | null;
43
+ teffLog8: number | null;
44
+ temperatureK: number | null;
45
+ }
46
+
47
+ export interface SkykitRowsFromCellsOptions {
48
+ observerPc?: StarTreePointPc;
49
+ limitingMagnitude?: number;
50
+ filterVisible?: boolean;
51
+ }
52
+
53
+ export interface SkykitStarDataOptions extends Omit<StarOctreeCellStreamOptions, 'view' | 'strategy'> {
54
+ provider?: StarOctreeProviderService;
55
+ providerId?: string;
56
+ octreeUrl?: string;
57
+ persistentCache?: StarOctreeProviderServiceOptions['persistentCache'];
58
+ limits?: StarOctreeProviderServiceOptions['limits'];
59
+ observerPc?: StarTreePointPc;
60
+ centerPc?: StarTreePointPc;
61
+ radiusPc?: number;
62
+ limitingMagnitude?: number;
63
+ maxStars?: number;
64
+ filterVisible?: boolean;
65
+ sortBy?:
66
+ | 'apparentMagnitude'
67
+ | 'distancePc'
68
+ | 'magAbs'
69
+ | 'absoluteMagnitude'
70
+ | null
71
+ | false
72
+ | ((left: SkykitStarRow, right: SkykitStarRow) => number);
73
+ view?: StarOctreeCellStreamOptions['view'];
74
+ strategy?: StarOctreeCellStreamOptions['strategy'];
75
+ }
76
+
77
+ export type SkykitStarLabelInput = SkykitStarRow | StarObjectRef;
78
+
79
+ export interface SkykitStarLabelOptions {
80
+ metaProvider?: MetaSidecarProviderService;
81
+ metaProviderId?: string;
82
+ metaUrl?: string;
83
+ parentDatasetId?: string;
84
+ datasetId?: string;
85
+ persistentCache?: 'on' | 'off';
86
+ metaLimits?: {
87
+ shardPrefetchBytes?: number;
88
+ };
89
+ provider?: StarOctreeProviderService;
90
+ octreeUrl?: string;
91
+ }
92
+
93
+ export interface SkykitStarLabel {
94
+ star: SkykitStarLabelInput;
95
+ ref: StarObjectRef | null;
96
+ entry: MetaSidecarEntry | null;
97
+ fields: {
98
+ properName: string;
99
+ bayer: string;
100
+ hd: string;
101
+ hip: string;
102
+ gaia: string;
103
+ primaryLabel: string;
104
+ };
105
+ label: string;
106
+ }
107
+
108
+ export declare function createStarStream(
109
+ options?: SkykitStarDataOptions
110
+ ): AsyncIterable<SkykitStarRow[]>;
111
+
112
+ export declare function loadStarRows(
113
+ options?: SkykitStarDataOptions
114
+ ): Promise<SkykitStarRow[]>;
115
+
116
+ export declare function streamStarRows(
117
+ options?: SkykitStarDataOptions
118
+ ): AsyncIterable<SkykitStarRow[]>;
119
+
120
+ export declare function rowsFromStarCells(
121
+ cells: Iterable<import('@found-in-space/star-trees').StarCellData>,
122
+ options?: SkykitRowsFromCellsOptions
123
+ ): SkykitStarRow[];
124
+
125
+ export declare function loadStarLabels(
126
+ input: Iterable<SkykitStarLabelInput> | SkykitStarDataOptions,
127
+ options?: SkykitStarLabelOptions
128
+ ): Promise<SkykitStarLabel[]>;
129
+
130
+ export declare function formatStarLabel(
131
+ entry?: MetaSidecarEntry | null,
132
+ fallback?: string
133
+ ): string;