@treasuryspatial/viewer-ui-kit 0.1.41 → 0.1.56

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 (90) hide show
  1. package/dist/AdminLayout.js +1 -1
  2. package/dist/AdminShell.d.ts +6 -1
  3. package/dist/AdminShell.d.ts.map +1 -1
  4. package/dist/AdminShell.js +45 -3
  5. package/dist/ChooserActionCard.d.ts +10 -0
  6. package/dist/ChooserActionCard.d.ts.map +1 -0
  7. package/dist/ChooserActionCard.js +39 -0
  8. package/dist/ComposerRightRail.d.ts +3 -1
  9. package/dist/ComposerRightRail.d.ts.map +1 -1
  10. package/dist/ComposerRightRail.js +11 -43
  11. package/dist/ConfiguratorShell.js +1 -1
  12. package/dist/LandingShell.d.ts +2 -1
  13. package/dist/LandingShell.d.ts.map +1 -1
  14. package/dist/LandingShell.js +162 -32
  15. package/dist/LoginForm.js +2 -2
  16. package/dist/LoginShell.d.ts +2 -1
  17. package/dist/LoginShell.d.ts.map +1 -1
  18. package/dist/LoginShell.js +38 -15
  19. package/dist/ManifestTopBar.d.ts +7 -1
  20. package/dist/ManifestTopBar.d.ts.map +1 -1
  21. package/dist/ManifestTopBar.js +249 -38
  22. package/dist/MetricsPanel.d.ts +1 -1
  23. package/dist/MetricsPanel.d.ts.map +1 -1
  24. package/dist/MetricsPanel.js +19 -29
  25. package/dist/MetricsPanelContent.d.ts +38 -17
  26. package/dist/MetricsPanelContent.d.ts.map +1 -1
  27. package/dist/MetricsPanelContent.js +84 -90
  28. package/dist/ModeBar.d.ts +6 -2
  29. package/dist/ModeBar.d.ts.map +1 -1
  30. package/dist/ModeBar.js +49 -82
  31. package/dist/ModuleSelectorPanel.d.ts +2 -1
  32. package/dist/ModuleSelectorPanel.d.ts.map +1 -1
  33. package/dist/ModuleSelectorPanel.js +47 -49
  34. package/dist/PanelSkin.d.ts.map +1 -1
  35. package/dist/PanelSkin.js +1598 -312
  36. package/dist/PanelSystem.d.ts +45 -0
  37. package/dist/PanelSystem.d.ts.map +1 -0
  38. package/dist/PanelSystem.js +450 -0
  39. package/dist/PanelTabs.d.ts.map +1 -1
  40. package/dist/PanelTabs.js +8 -34
  41. package/dist/PanelToggleDock.d.ts +10 -0
  42. package/dist/PanelToggleDock.d.ts.map +1 -0
  43. package/dist/PanelToggleDock.js +40 -0
  44. package/dist/PromptPackChooserPanel.d.ts +12 -11
  45. package/dist/PromptPackChooserPanel.d.ts.map +1 -1
  46. package/dist/PromptPackChooserPanel.js +103 -63
  47. package/dist/SceneInspectorPanel.d.ts +42 -0
  48. package/dist/SceneInspectorPanel.d.ts.map +1 -0
  49. package/dist/SceneInspectorPanel.js +135 -0
  50. package/dist/ScienceDataPanelContent.d.ts +16 -0
  51. package/dist/ScienceDataPanelContent.d.ts.map +1 -0
  52. package/dist/ScienceDataPanelContent.js +31 -0
  53. package/dist/ScienceMetricsPanelContent.d.ts +53 -0
  54. package/dist/ScienceMetricsPanelContent.d.ts.map +1 -0
  55. package/dist/ScienceMetricsPanelContent.js +415 -0
  56. package/dist/SpatialHud.d.ts +18 -0
  57. package/dist/SpatialHud.d.ts.map +1 -0
  58. package/dist/SpatialHud.js +120 -0
  59. package/dist/StreetviewModeSurface.d.ts +40 -0
  60. package/dist/StreetviewModeSurface.d.ts.map +1 -0
  61. package/dist/StreetviewModeSurface.js +358 -0
  62. package/dist/SurfaceSwitcher.d.ts +11 -0
  63. package/dist/SurfaceSwitcher.d.ts.map +1 -0
  64. package/dist/SurfaceSwitcher.js +46 -0
  65. package/dist/TopBar.d.ts +2 -0
  66. package/dist/TopBar.d.ts.map +1 -1
  67. package/dist/TopBar.js +3 -1
  68. package/dist/UnknownModeSurface.d.ts +6 -0
  69. package/dist/UnknownModeSurface.d.ts.map +1 -0
  70. package/dist/UnknownModeSurface.js +41 -0
  71. package/dist/index.d.ts +19 -0
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +12 -0
  74. package/dist/landingTokens.d.ts +7 -0
  75. package/dist/landingTokens.d.ts.map +1 -0
  76. package/dist/landingTokens.js +6 -0
  77. package/dist/layout.d.ts +27 -27
  78. package/dist/layout.d.ts.map +1 -1
  79. package/dist/layout.js +33 -27
  80. package/dist/mapMetrics.d.ts +88 -0
  81. package/dist/mapMetrics.d.ts.map +1 -0
  82. package/dist/mapMetrics.js +1 -0
  83. package/dist/panelPrimitives.d.ts +11 -0
  84. package/dist/panelPrimitives.d.ts.map +1 -0
  85. package/dist/panelPrimitives.js +41 -0
  86. package/dist/topbarLogoPolicy.d.ts +14 -0
  87. package/dist/topbarLogoPolicy.d.ts.map +1 -0
  88. package/dist/topbarLogoPolicy.js +41 -0
  89. package/dist/tsconfig.tsbuildinfo +1 -1
  90. package/package.json +18 -5
@@ -0,0 +1,358 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { forwardRef, useImperativeHandle, useRef, } from 'react';
4
+ import styled from 'styled-components';
5
+ const Root = styled.div `
6
+ position: absolute;
7
+ inset: 0;
8
+ background:
9
+ radial-gradient(circle at 50% 0%, rgba(15, 23, 42, 0.06), transparent 38%),
10
+ linear-gradient(180deg, #f8fafc 0%, #eef2f7 100%);
11
+ `;
12
+ const ShellStage = styled.div `
13
+ position: absolute;
14
+ inset: 16px;
15
+ border-radius: 24px;
16
+ overflow: hidden;
17
+ border: 1px solid rgba(15, 23, 42, 0.08);
18
+ background: rgba(255, 255, 255, 0.72);
19
+ box-shadow: 0 22px 48px rgba(15, 23, 42, 0.08);
20
+ `;
21
+ const BlankCanvas = styled.div `
22
+ width: 100%;
23
+ height: 100%;
24
+ position: relative;
25
+ overflow: hidden;
26
+ background:
27
+ linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(241, 245, 249, 0.88)),
28
+ repeating-linear-gradient(
29
+ 90deg,
30
+ rgba(148, 163, 184, 0.06) 0,
31
+ rgba(148, 163, 184, 0.06) 1px,
32
+ transparent 1px,
33
+ transparent 120px
34
+ );
35
+ `;
36
+ const Figure = styled.figure `
37
+ width: 100%;
38
+ height: 100%;
39
+ position: relative;
40
+ margin: 0;
41
+ overflow: hidden;
42
+ background: #ffffff;
43
+ `;
44
+ const PanoramaViewport = styled.div `
45
+ width: 100%;
46
+ height: 100%;
47
+ position: relative;
48
+ overflow: hidden;
49
+ background: #ffffff;
50
+ `;
51
+ const PanoramaFrame = styled.iframe `
52
+ width: 100%;
53
+ height: 100%;
54
+ border: 0;
55
+ display: block;
56
+ background: #ffffff;
57
+ `;
58
+ const ImageCaption = styled.figcaption `
59
+ position: absolute;
60
+ left: 20px;
61
+ top: 20px;
62
+ z-index: 3;
63
+ max-width: min(560px, calc(100% - 40px));
64
+ font-size: 11px;
65
+ line-height: 1.45;
66
+ color: rgba(15, 23, 42, 0.72);
67
+ background: rgba(255, 255, 255, 0.9);
68
+ border: 1px solid rgba(15, 23, 42, 0.08);
69
+ border-radius: 14px;
70
+ padding: 8px 10px;
71
+ box-shadow: 0 10px 26px rgba(15, 23, 42, 0.08);
72
+ `;
73
+ const FooterDock = styled.div `
74
+ position: absolute;
75
+ left: 18px;
76
+ right: 18px;
77
+ bottom: 18px;
78
+ z-index: 4;
79
+ pointer-events: none;
80
+ `;
81
+ const FooterCard = styled.div `
82
+ pointer-events: auto;
83
+ display: block;
84
+ padding: 10px;
85
+ border-radius: 16px;
86
+ border: 1px solid rgba(15, 23, 42, 0.08);
87
+ background: rgba(255, 255, 255, 0.9);
88
+ box-shadow: 0 18px 36px rgba(15, 23, 42, 0.1);
89
+ backdrop-filter: blur(12px);
90
+ `;
91
+ const CaptureNotice = styled.div `
92
+ margin-top: 8px;
93
+ padding: 8px 10px;
94
+ border-radius: 12px;
95
+ border: 1px solid rgba(15, 23, 42, 0.08);
96
+ background: rgba(248, 250, 252, 0.92);
97
+ color: rgba(51, 65, 85, 0.88);
98
+ font-size: 11px;
99
+ line-height: 1.4;
100
+ letter-spacing: 0.01em;
101
+ text-transform: none;
102
+ `;
103
+ const FooterSearch = styled.form `
104
+ position: relative;
105
+ display: flex;
106
+ align-items: center;
107
+ gap: 8px;
108
+ width: 100%;
109
+ padding: 0 10px;
110
+ border-radius: 999px;
111
+ border: 1px solid rgba(15, 23, 42, 0.08);
112
+ background: rgba(248, 250, 252, 0.96);
113
+ `;
114
+ const SearchInput = styled.input `
115
+ flex: 1 1 auto;
116
+ min-width: 0;
117
+ height: 32px;
118
+ border: 0;
119
+ background: transparent;
120
+ color: #475569;
121
+ caret-color: #475569;
122
+ font-size: 12px;
123
+ line-height: 32px;
124
+ padding: 0 4px;
125
+ outline: none;
126
+
127
+ &::placeholder {
128
+ color: rgba(100, 116, 139, 0.72);
129
+ opacity: 1;
130
+ text-transform: lowercase;
131
+ }
132
+ `;
133
+ const SearchButton = styled.button `
134
+ height: 32px;
135
+ min-width: 36px;
136
+ border: 0;
137
+ background: transparent;
138
+ color: #475569;
139
+ font-size: 11px;
140
+ letter-spacing: 0.08em;
141
+ text-transform: lowercase;
142
+ padding: 0 10px;
143
+ cursor: pointer;
144
+ border-left: 1px solid rgba(15, 23, 42, 0.08);
145
+
146
+ &:disabled {
147
+ opacity: 0.42;
148
+ cursor: not-allowed;
149
+ }
150
+ `;
151
+ const SuggestionMenu = styled.div `
152
+ position: absolute;
153
+ left: 0;
154
+ right: 0;
155
+ bottom: calc(100% + 8px);
156
+ z-index: 8;
157
+ overflow: hidden;
158
+ border-radius: 16px;
159
+ border: 1px solid rgba(15, 23, 42, 0.1);
160
+ background: rgba(255, 255, 255, 0.96);
161
+ box-shadow: 0 18px 40px rgba(15, 23, 42, 0.14);
162
+ `;
163
+ const SuggestionItem = styled.button `
164
+ display: grid;
165
+ width: 100%;
166
+ gap: 2px;
167
+ border: 0;
168
+ padding: 10px 14px;
169
+ text-align: left;
170
+ background: transparent;
171
+ color: #0f172a;
172
+ cursor: pointer;
173
+
174
+ &[data-active='true'],
175
+ &:hover {
176
+ background: rgba(15, 23, 42, 0.06);
177
+ }
178
+ `;
179
+ const SuggestionLabel = styled.span `
180
+ font-size: 12px;
181
+ line-height: 1.25;
182
+ color: #0f172a;
183
+ `;
184
+ const SuggestionMeta = styled.span `
185
+ font-size: 10px;
186
+ line-height: 1.3;
187
+ color: rgba(71, 85, 105, 0.76);
188
+ `;
189
+ const ErrorNotice = styled.div `
190
+ position: absolute;
191
+ left: 20px;
192
+ top: 20px;
193
+ z-index: 3;
194
+ max-width: min(560px, calc(100% - 40px));
195
+ font-size: 12px;
196
+ line-height: 1.45;
197
+ color: #7c2d12;
198
+ background: rgba(255, 247, 237, 0.96);
199
+ border: 1px solid rgba(249, 115, 22, 0.28);
200
+ border-radius: 14px;
201
+ padding: 10px 12px;
202
+ box-shadow: 0 10px 26px rgba(15, 23, 42, 0.08);
203
+ `;
204
+ const DISPLAY_MEDIA_ERROR_MESSAGE = 'Street View capture now uses a live browser-tab screenshot. Choose this Composer tab in the share prompt and try again.';
205
+ const stopStream = (stream) => {
206
+ stream?.getTracks().forEach((track) => track.stop());
207
+ };
208
+ const waitForVideoFrame = async (video) => {
209
+ const videoWithFrameCallback = video;
210
+ if (typeof videoWithFrameCallback.requestVideoFrameCallback === 'function') {
211
+ await new Promise((resolve) => {
212
+ videoWithFrameCallback.requestVideoFrameCallback?.(() => resolve());
213
+ });
214
+ return;
215
+ }
216
+ await new Promise((resolve) => {
217
+ requestAnimationFrame(() => {
218
+ requestAnimationFrame(() => resolve());
219
+ });
220
+ });
221
+ };
222
+ const captureDisplayMediaViewport = async (bounds) => {
223
+ if (typeof navigator === 'undefined' || !navigator.mediaDevices?.getDisplayMedia) {
224
+ throw new Error('Street View live capture requires browser tab capture support, but this browser does not provide getDisplayMedia().');
225
+ }
226
+ if (bounds.width < 2 || bounds.height < 2) {
227
+ throw new Error('Street View viewport is not ready to capture yet.');
228
+ }
229
+ let stream = null;
230
+ const video = document.createElement('video');
231
+ video.muted = true;
232
+ video.playsInline = true;
233
+ video.autoplay = true;
234
+ try {
235
+ stream = await navigator.mediaDevices.getDisplayMedia({
236
+ video: {
237
+ displaySurface: 'browser',
238
+ preferCurrentTab: true,
239
+ selfBrowserSurface: 'include',
240
+ surfaceSwitching: 'exclude',
241
+ monitorTypeSurfaces: 'exclude',
242
+ },
243
+ audio: false,
244
+ preferCurrentTab: true,
245
+ selfBrowserSurface: 'include',
246
+ surfaceSwitching: 'exclude',
247
+ monitorTypeSurfaces: 'exclude',
248
+ });
249
+ video.srcObject = stream;
250
+ await video.play();
251
+ await waitForVideoFrame(video);
252
+ const viewportWidth = window.visualViewport?.width ?? window.innerWidth;
253
+ const viewportHeight = window.visualViewport?.height ?? window.innerHeight;
254
+ const scaleX = viewportWidth > 0 ? video.videoWidth / viewportWidth : 1;
255
+ const scaleY = viewportHeight > 0 ? video.videoHeight / viewportHeight : 1;
256
+ const sourceX = Math.max(0, Math.floor(bounds.left * scaleX));
257
+ const sourceY = Math.max(0, Math.floor(bounds.top * scaleY));
258
+ const sourceWidth = Math.min(video.videoWidth - sourceX, Math.max(1, Math.ceil(bounds.width * scaleX)));
259
+ const sourceHeight = Math.min(video.videoHeight - sourceY, Math.max(1, Math.ceil(bounds.height * scaleY)));
260
+ if (sourceWidth < 1 || sourceHeight < 1) {
261
+ throw new Error('Street View viewport capture resolved to an empty frame.');
262
+ }
263
+ const canvas = document.createElement('canvas');
264
+ canvas.width = sourceWidth;
265
+ canvas.height = sourceHeight;
266
+ const context = canvas.getContext('2d');
267
+ if (!context) {
268
+ throw new Error('Street View viewport capture could not initialize a 2D canvas.');
269
+ }
270
+ context.drawImage(video, sourceX, sourceY, sourceWidth, sourceHeight, 0, 0, sourceWidth, sourceHeight);
271
+ return canvas.toDataURL('image/png');
272
+ }
273
+ catch (error) {
274
+ if (error instanceof DOMException) {
275
+ if (error.name === 'AbortError' ||
276
+ error.name === 'InvalidStateError' ||
277
+ error.name === 'NotAllowedError' ||
278
+ error.name === 'NotReadableError') {
279
+ throw new Error(DISPLAY_MEDIA_ERROR_MESSAGE);
280
+ }
281
+ }
282
+ if (error instanceof Error) {
283
+ throw error;
284
+ }
285
+ throw new Error('Street View live capture failed.');
286
+ }
287
+ finally {
288
+ video.pause();
289
+ video.srcObject = null;
290
+ stopStream(stream);
291
+ }
292
+ };
293
+ const StreetviewModeSurface = forwardRef(function StreetviewModeSurface({ panoramaUrl, imageAlt = 'streetview image', imageCaption, locationQuery = '', searchPlaceholder = 'search a street, place, or address', loading = false, error, searchSuggestions = [], suggestionsOpen = false, suggestionsPending = false, activeSuggestionIndex = -1, onLocationQueryChange, onLocationSearch, onSuggestionSelect, onSuggestionActiveIndexChange, onSuggestionsOpenChange, }, ref) {
294
+ const panoramaViewportRef = useRef(null);
295
+ useImperativeHandle(ref, () => ({
296
+ capturePngDataUrl: async () => {
297
+ if (!panoramaUrl) {
298
+ throw new Error('Street View panorama is not ready. Search for a location first.');
299
+ }
300
+ const viewport = panoramaViewportRef.current;
301
+ if (!viewport) {
302
+ throw new Error('Street View viewport is not mounted.');
303
+ }
304
+ return captureDisplayMediaViewport(viewport.getBoundingClientRect());
305
+ },
306
+ }), [panoramaUrl]);
307
+ const handleSubmit = (event) => {
308
+ event.preventDefault();
309
+ const trimmed = locationQuery.trim();
310
+ if (!trimmed || loading)
311
+ return;
312
+ const activeSuggestion = searchSuggestions[activeSuggestionIndex];
313
+ if (suggestionsOpen && activeSuggestion) {
314
+ onSuggestionSelect?.(activeSuggestion);
315
+ return;
316
+ }
317
+ void onLocationSearch?.(trimmed);
318
+ };
319
+ const handleKeyDown = (event) => {
320
+ if (!searchSuggestions.length) {
321
+ if (event.key === 'Escape') {
322
+ onSuggestionsOpenChange?.(false);
323
+ }
324
+ return;
325
+ }
326
+ if (event.key === 'ArrowDown') {
327
+ event.preventDefault();
328
+ onSuggestionsOpenChange?.(true);
329
+ onSuggestionActiveIndexChange?.((activeSuggestionIndex + 1) % searchSuggestions.length);
330
+ return;
331
+ }
332
+ if (event.key === 'ArrowUp') {
333
+ event.preventDefault();
334
+ onSuggestionsOpenChange?.(true);
335
+ onSuggestionActiveIndexChange?.(activeSuggestionIndex <= 0 ? searchSuggestions.length - 1 : activeSuggestionIndex - 1);
336
+ return;
337
+ }
338
+ if (event.key === 'Enter' && suggestionsOpen && activeSuggestionIndex >= 0) {
339
+ const activeSuggestion = searchSuggestions[activeSuggestionIndex];
340
+ if (activeSuggestion) {
341
+ event.preventDefault();
342
+ onSuggestionSelect?.(activeSuggestion);
343
+ }
344
+ return;
345
+ }
346
+ if (event.key === 'Escape') {
347
+ event.preventDefault();
348
+ onSuggestionsOpenChange?.(false);
349
+ }
350
+ };
351
+ const canSearch = Boolean(locationQuery.trim()) && !loading;
352
+ return (_jsx(Root, { children: _jsxs(ShellStage, { children: [panoramaUrl ? (_jsxs(Figure, { children: [_jsx(PanoramaViewport, { ref: panoramaViewportRef, children: _jsx(PanoramaFrame, { src: panoramaUrl, title: imageAlt, allow: "accelerometer; gyroscope; fullscreen", allowFullScreen: true, loading: "eager", referrerPolicy: "no-referrer-when-downgrade" }) }), imageCaption ? _jsx(ImageCaption, { children: imageCaption }) : null] })) : (_jsx(BlankCanvas, { "aria-label": "streetview shell stage" })), error ? _jsx(ErrorNotice, { children: error }) : null, _jsx(FooterDock, { children: _jsxs(FooterCard, { children: [_jsxs(FooterSearch, { onSubmit: handleSubmit, children: [_jsx(SearchInput, { value: locationQuery, placeholder: searchPlaceholder, onChange: (event) => onLocationQueryChange?.(event.target.value), onFocus: () => {
353
+ if (searchSuggestions.length) {
354
+ onSuggestionsOpenChange?.(true);
355
+ }
356
+ }, onKeyDown: handleKeyDown }), _jsx(SearchButton, { type: "submit", disabled: !canSearch, children: loading ? '...' : 'go' }), suggestionsOpen && (searchSuggestions.length > 0 || suggestionsPending) ? (_jsxs(SuggestionMenu, { onMouseDown: (event) => event.preventDefault(), onPointerDown: (event) => event.stopPropagation(), onClick: (event) => event.stopPropagation(), children: [searchSuggestions.map((suggestion, index) => (_jsxs(SuggestionItem, { type: "button", "data-active": index === activeSuggestionIndex ? 'true' : 'false', onMouseEnter: () => onSuggestionActiveIndexChange?.(index), onMouseDown: (event) => event.preventDefault(), onClick: () => onSuggestionSelect?.(suggestion), children: [_jsx(SuggestionLabel, { children: suggestion.label }), suggestion.secondaryLabel ? _jsx(SuggestionMeta, { children: suggestion.secondaryLabel }) : null] }, suggestion.id))), suggestionsPending ? (_jsx(SuggestionItem, { type: "button", disabled: true, children: _jsx(SuggestionLabel, { children: "searching..." }) })) : null] })) : null] }), _jsx(CaptureNotice, { children: "render capture uses the live Street View viewport only. when prompted, choose this Composer tab to share." })] }) })] }) }));
357
+ });
358
+ export default StreetviewModeSurface;
@@ -0,0 +1,11 @@
1
+ export type SurfaceSwitcherItem = {
2
+ id: string;
3
+ label: string;
4
+ href: string;
5
+ active?: boolean;
6
+ };
7
+ export type SurfaceSwitcherProps = {
8
+ items: SurfaceSwitcherItem[];
9
+ };
10
+ export default function SurfaceSwitcher({ items }: SurfaceSwitcherProps): import("react/jsx-runtime").JSX.Element | null;
11
+ //# sourceMappingURL=SurfaceSwitcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SurfaceSwitcher.d.ts","sourceRoot":"","sources":["../src/SurfaceSwitcher.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,mBAAmB,EAAE,CAAC;CAC9B,CAAC;AA4CF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,oBAAoB,kDAWtE"}
@@ -0,0 +1,46 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import Link from 'next/link';
4
+ import styled from 'styled-components';
5
+ const Switcher = styled.div `
6
+ display: inline-flex;
7
+ align-items: center;
8
+ gap: 4px;
9
+ padding: 4px;
10
+ border-radius: 999px;
11
+ border: 1px solid var(--viewer-ui-color-panel-border, var(--brand-panel-border));
12
+ background: var(--viewer-ui-color-bg-base, var(--brand-panel));
13
+ `;
14
+ const SwitchLink = styled(Link) `
15
+ display: inline-flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ min-height: 32px;
19
+ padding: 0 14px;
20
+ border-radius: 999px;
21
+ text-decoration: none;
22
+ font-size: 10px;
23
+ font-weight: 700;
24
+ letter-spacing: 0.14em;
25
+ text-transform: var(--viewer-ui-shell-text-case, lowercase);
26
+ white-space: nowrap;
27
+ color: ${(props) => props.$active
28
+ ? 'var(--viewer-ui-shell-pill-active-fg, var(--brand-primary))'
29
+ : 'var(--viewer-ui-shell-pill-inactive-fg, var(--viewer-ui-color-text-muted, var(--brand-text-secondary)))'};
30
+ background: ${(props) => props.$active
31
+ ? 'var(--viewer-ui-shell-pill-active-bg, color-mix(in srgb, var(--brand-primary) 14%, var(--viewer-ui-color-bg-base, #f6f3eb) 86%))'
32
+ : 'var(--viewer-ui-shell-pill-inactive-bg, transparent)'};
33
+ border: 1px solid
34
+ ${(props) => props.$active
35
+ ? 'var(--viewer-ui-shell-pill-active-border, var(--brand-primary))'
36
+ : 'var(--viewer-ui-shell-pill-inactive-border, var(--viewer-ui-color-panel-border, var(--brand-panel-border)))'};
37
+
38
+ &:hover {
39
+ color: var(--viewer-ui-color-text-strong, var(--brand-text-primary));
40
+ }
41
+ `;
42
+ export default function SurfaceSwitcher({ items }) {
43
+ if (!items.length)
44
+ return null;
45
+ return (_jsx(Switcher, { children: items.map((item) => (_jsx(SwitchLink, { href: item.href, "$active": Boolean(item.active), children: item.label }, item.id))) }));
46
+ }
package/dist/TopBar.d.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import type { ReactNode } from 'react';
2
+ export declare const TOP_BAR_COMPACT_HEIGHT_PX = 50;
3
+ export declare const TOP_BAR_STANDARD_HEIGHT_PX = 72;
2
4
  export type TopBarProps = {
3
5
  compact?: boolean;
4
6
  hidden?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"TopBar.d.ts","sourceRoot":"","sources":["../src/TopBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AA8DvC,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,OAAe,EACf,MAAc,EACd,KAAK,EACL,MAAM,EACN,OAAO,EACP,aAAa,EACb,SAAS,GACV,EAAE,WAAW,2CAWb"}
1
+ {"version":3,"file":"TopBar.d.ts","sourceRoot":"","sources":["../src/TopBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAC5C,eAAO,MAAM,0BAA0B,KAAK,CAAC;AA6D7C,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,aAAa,CAAC,EAAE,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAC7B,OAAe,EACf,MAAc,EACd,KAAK,EACL,MAAM,EACN,OAAO,EACP,aAAa,EACb,SAAS,GACV,EAAE,WAAW,2CAWb"}
package/dist/TopBar.js CHANGED
@@ -1,13 +1,15 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import styled from 'styled-components';
4
+ export const TOP_BAR_COMPACT_HEIGHT_PX = 50;
5
+ export const TOP_BAR_STANDARD_HEIGHT_PX = 72;
4
6
  const Root = styled.nav `
5
7
  position: fixed;
6
8
  top: 0;
7
9
  left: 0;
8
10
  right: 0;
9
11
  z-index: 50;
10
- height: ${(props) => (props.$compact ? '50px' : '72px')};
12
+ height: ${(props) => (props.$compact ? `${TOP_BAR_COMPACT_HEIGHT_PX}px` : `${TOP_BAR_STANDARD_HEIGHT_PX}px`)};
11
13
  background: var(--viewer-ui-color-bg-base, var(--brand-panel, #f6f3eb));
12
14
  border-bottom: 1px solid var(--viewer-ui-color-panel-border, var(--brand-panel-border, rgba(47, 74, 60, 0.35)));
13
15
  color: var(--viewer-ui-color-text-strong, var(--brand-text-primary, #1f2937));
@@ -0,0 +1,6 @@
1
+ type UnknownModeSurfaceProps = {
2
+ modeLabel: string;
3
+ };
4
+ export default function UnknownModeSurface({ modeLabel }: UnknownModeSurfaceProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=UnknownModeSurface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnknownModeSurface.d.ts","sourceRoot":"","sources":["../src/UnknownModeSurface.tsx"],"names":[],"mappings":"AAIA,KAAK,uBAAuB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AA0CF,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,uBAAuB,2CAahF"}
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import styled from 'styled-components';
4
+ const Root = styled.div `
5
+ position: absolute;
6
+ inset: 0;
7
+ background: #f8fafc;
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: center;
11
+ padding: 32px;
12
+ `;
13
+ const Card = styled.div `
14
+ width: min(100%, 720px);
15
+ border-radius: 24px;
16
+ border: 1px solid rgba(185, 28, 28, 0.22);
17
+ background: rgba(255, 255, 255, 0.96);
18
+ box-shadow: 0 20px 48px rgba(15, 23, 42, 0.08);
19
+ padding: 28px 30px;
20
+ color: #7f1d1d;
21
+ `;
22
+ const Eyebrow = styled.div `
23
+ font-size: 10px;
24
+ letter-spacing: 0.18em;
25
+ text-transform: uppercase;
26
+ opacity: 0.72;
27
+ `;
28
+ const Title = styled.h3 `
29
+ margin: 10px 0 0;
30
+ font-size: 24px;
31
+ line-height: 1.12;
32
+ color: #7f1d1d;
33
+ `;
34
+ const Body = styled.p `
35
+ margin: 12px 0 0;
36
+ font-size: 14px;
37
+ line-height: 1.7;
38
+ `;
39
+ export default function UnknownModeSurface({ modeLabel }) {
40
+ return (_jsx(Root, { children: _jsxs(Card, { children: [_jsx(Eyebrow, { children: "unsupported mode contract" }), _jsxs(Title, { children: [modeLabel, " has no native runtime surface."] }), _jsx(Body, { children: "This is a hard runtime failure, not a compatibility fallback. Wire a real mode surface instead of falling back to the retired mode placeholder." })] }) }));
41
+ }
package/dist/index.d.ts CHANGED
@@ -1,11 +1,21 @@
1
1
  export * from './layout.js';
2
+ export * from './PanelSystem.js';
2
3
  export { default as PanelTabs } from './PanelTabs.js';
3
4
  export type { PanelTab } from './PanelTabs.js';
5
+ export { panelBodyTextCss, panelEyebrowCss, panelPillButtonCss, panelPillRowCss, panelSectionTitleCss, panelSubheadingCss, panelTitleCss, panelValueTextCss, } from './panelPrimitives.js';
4
6
  export { default as MetricsPanel } from './MetricsPanel.js';
5
7
  export { default as ComposerRightRail } from './ComposerRightRail.js';
6
8
  export type { ComposerRightRailTab } from './ComposerRightRail.js';
7
9
  export type { RenderInputSummary } from './MetricsPanel.js';
8
10
  export { default as MetricsPanelContent } from './MetricsPanelContent.js';
11
+ export { default as ScienceDataPanelContent } from './ScienceDataPanelContent.js';
12
+ export { default as ScienceMetricsPanelContent } from './ScienceMetricsPanelContent.js';
13
+ export type { ScienceMetricsRenderState } from './ScienceMetricsPanelContent.js';
14
+ export type { MapCostMetrics, MapDeliveryMetrics, MapEcoMetrics, MapMarketMetrics, MapMetricsPayload, MapMaterialsMetrics, MapModelMetrics, MapPlanningMetrics, MapSiteMetrics, } from './mapMetrics.js';
15
+ export { default as SpatialHud } from './SpatialHud.js';
16
+ export type { SpatialHudProps } from './SpatialHud.js';
17
+ export { default as SceneInspectorPanel } from './SceneInspectorPanel.js';
18
+ export type { SceneInspectorPanelProps } from './SceneInspectorPanel.js';
9
19
  export { default as AdminShell } from './AdminShell.js';
10
20
  export type { AdminTab } from './AdminShell.js';
11
21
  export { AdminPage, AdminSection, AdminSectionTitle, AdminMutedText } from './AdminLayout.js';
@@ -14,13 +24,17 @@ export { default as ConfiguratorShell } from './ConfiguratorShell.js';
14
24
  export { default as ComposerShell } from './ComposerShell.js';
15
25
  export { default as ModuleSelectorPanel } from './ModuleSelectorPanel.js';
16
26
  export type { ModuleSelectorEntry } from './ModuleSelectorPanel.js';
27
+ export { default as ChooserActionCard } from './ChooserActionCard.js';
17
28
  export { default as PromptPackChooserPanel } from './PromptPackChooserPanel.js';
18
29
  export type { PromptPackChooserMode, PromptPackChooserCatalogEntry } from './PromptPackChooserPanel.js';
19
30
  export { default as KitPill } from './KitPill.js';
20
31
  export { default as TopBar } from './TopBar.js';
32
+ export { TOP_BAR_COMPACT_HEIGHT_PX, TOP_BAR_STANDARD_HEIGHT_PX } from './TopBar.js';
21
33
  export type { TopBarProps } from './TopBar.js';
22
34
  export { default as ManifestTopBar } from './ManifestTopBar.js';
23
35
  export type { ManifestTopBarProps } from './ManifestTopBar.js';
36
+ export { default as SurfaceSwitcher } from './SurfaceSwitcher.js';
37
+ export type { SurfaceSwitcherItem, SurfaceSwitcherProps } from './SurfaceSwitcher.js';
24
38
  export { default as LoginShell } from './LoginShell.js';
25
39
  export type { LoginShellProps } from './LoginShell.js';
26
40
  export { default as LoginForm } from './LoginForm.js';
@@ -28,6 +42,11 @@ export type { LoginFormProps } from './LoginForm.js';
28
42
  export { default as LandingShell } from './LandingShell.js';
29
43
  export type { LandingShellProps } from './LandingShell.js';
30
44
  export { default as CustomModeSurface } from './CustomModeSurface.js';
45
+ export { default as StreetviewModeSurface } from './StreetviewModeSurface.js';
46
+ export type { StreetviewModeSurfaceHandle, StreetviewModeSurfaceProps } from './StreetviewModeSurface.js';
47
+ export { default as UnknownModeSurface } from './UnknownModeSurface.js';
31
48
  export { default as ModeBar, MODE_BAR_HEIGHT_PX } from './ModeBar.js';
32
49
  export type { ModeBarProps, ModeTab } from './ModeBar.js';
50
+ export { default as PanelToggleDock } from './PanelToggleDock.js';
51
+ export type { PanelToggleDockProps } from './PanelToggleDock.js';
33
52
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAChF,YAAY,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACb,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AACxF,YAAY,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AACjF,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9F,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAChF,YAAY,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACxG,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAC9E,YAAY,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC1G,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js CHANGED
@@ -1,20 +1,32 @@
1
1
  export * from './layout.js';
2
+ export * from './PanelSystem.js';
2
3
  export { default as PanelTabs } from './PanelTabs.js';
4
+ export { panelBodyTextCss, panelEyebrowCss, panelPillButtonCss, panelPillRowCss, panelSectionTitleCss, panelSubheadingCss, panelTitleCss, panelValueTextCss, } from './panelPrimitives.js';
3
5
  export { default as MetricsPanel } from './MetricsPanel.js';
4
6
  export { default as ComposerRightRail } from './ComposerRightRail.js';
5
7
  export { default as MetricsPanelContent } from './MetricsPanelContent.js';
8
+ export { default as ScienceDataPanelContent } from './ScienceDataPanelContent.js';
9
+ export { default as ScienceMetricsPanelContent } from './ScienceMetricsPanelContent.js';
10
+ export { default as SpatialHud } from './SpatialHud.js';
11
+ export { default as SceneInspectorPanel } from './SceneInspectorPanel.js';
6
12
  export { default as AdminShell } from './AdminShell.js';
7
13
  export { AdminPage, AdminSection, AdminSectionTitle, AdminMutedText } from './AdminLayout.js';
8
14
  export { PanelSkin } from './PanelSkin.js';
9
15
  export { default as ConfiguratorShell } from './ConfiguratorShell.js';
10
16
  export { default as ComposerShell } from './ComposerShell.js';
11
17
  export { default as ModuleSelectorPanel } from './ModuleSelectorPanel.js';
18
+ export { default as ChooserActionCard } from './ChooserActionCard.js';
12
19
  export { default as PromptPackChooserPanel } from './PromptPackChooserPanel.js';
13
20
  export { default as KitPill } from './KitPill.js';
14
21
  export { default as TopBar } from './TopBar.js';
22
+ export { TOP_BAR_COMPACT_HEIGHT_PX, TOP_BAR_STANDARD_HEIGHT_PX } from './TopBar.js';
15
23
  export { default as ManifestTopBar } from './ManifestTopBar.js';
24
+ export { default as SurfaceSwitcher } from './SurfaceSwitcher.js';
16
25
  export { default as LoginShell } from './LoginShell.js';
17
26
  export { default as LoginForm } from './LoginForm.js';
18
27
  export { default as LandingShell } from './LandingShell.js';
19
28
  export { default as CustomModeSurface } from './CustomModeSurface.js';
29
+ export { default as StreetviewModeSurface } from './StreetviewModeSurface.js';
30
+ export { default as UnknownModeSurface } from './UnknownModeSurface.js';
20
31
  export { default as ModeBar, MODE_BAR_HEIGHT_PX } from './ModeBar.js';
32
+ export { default as PanelToggleDock } from './PanelToggleDock.js';
@@ -0,0 +1,7 @@
1
+ export declare const LANDING_LOGO_SIZE = "clamp(32px, 1vw + 28px, 40px)";
2
+ export declare const LANDING_TITLE_SIZE = "clamp(28px, 1.15vw + 24px, 42px)";
3
+ export declare const LANDING_SECTION_TITLE_SIZE = "clamp(32px, 3vw, 61px)";
4
+ export declare const LANDING_SECTION_STRAP_SIZE = "clamp(16px, 0.55vw + 14px, 20px)";
5
+ export declare const LANDING_BODY_FONT_SIZE = "clamp(16px, 0.55vw + 14px, 20px)";
6
+ export declare const LANDING_BODY_MAX_WIDTH = "720px";
7
+ //# sourceMappingURL=landingTokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"landingTokens.d.ts","sourceRoot":"","sources":["../src/landingTokens.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,kCAAkC,CAAC;AACjE,eAAO,MAAM,kBAAkB,qCAAqC,CAAC;AACrE,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AACnE,eAAO,MAAM,0BAA0B,qCAAqC,CAAC;AAC7E,eAAO,MAAM,sBAAsB,qCAAqC,CAAC;AACzE,eAAO,MAAM,sBAAsB,UAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ export const LANDING_LOGO_SIZE = 'clamp(32px, 1vw + 28px, 40px)';
2
+ export const LANDING_TITLE_SIZE = 'clamp(28px, 1.15vw + 24px, 42px)';
3
+ export const LANDING_SECTION_TITLE_SIZE = 'clamp(32px, 3vw, 61px)';
4
+ export const LANDING_SECTION_STRAP_SIZE = 'clamp(16px, 0.55vw + 14px, 20px)';
5
+ export const LANDING_BODY_FONT_SIZE = 'clamp(16px, 0.55vw + 14px, 20px)';
6
+ export const LANDING_BODY_MAX_WIDTH = '720px';